<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository macports-base.
</pre>
<p><a href="https://github.com/macports/macports-base/commit/d74a2d4a54d60a81228f206682faa2207d695741">https://github.com/macports/macports-base/commit/d74a2d4a54d60a81228f206682faa2207d695741</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit d74a2d4a54d60a81228f206682faa2207d695741
</span>Author: Clemens Lang <cal@macports.org>
AuthorDate: Sat Jun 6 16:48:14 2020 +0200
<span style='display:block; white-space:pre;color:#404040;'> vendor: Bundle signify(1)
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> signify(1) is a tool originally developed for OpenBSD that uses modern
</span><span style='display:block; white-space:pre;color:#404040;'> EdDSA signatures on the ed25519 elliptic curve. Bundling this tool gives
</span><span style='display:block; white-space:pre;color:#404040;'> us a good way forward away from our single RSA 4096 public key that has
</span><span style='display:block; white-space:pre;color:#404040;'> now been in use since 2011 for all packages, all base updates and all
</span><span style='display:block; white-space:pre;color:#404040;'> ports trees.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Shipping signify allows us to use (a) modern cryptography, (b) avoid
</span><span style='display:block; white-space:pre;color:#404040;'> using the same key for everything and (c) eventually phase out the
</span><span style='display:block; white-space:pre;color:#404040;'> RSA-RIPEMD160 signatures.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> The vendor/signify-osx directory is a clone of
</span><span style='display:block; white-space:pre;color:#404040;'> https://github.com/jpouellet/signify-osx/, udpated with the latest
</span><span style='display:block; white-space:pre;color:#404040;'> OpenBSD upstream signify source code from CVS using the 'make up' target
</span><span style='display:block; white-space:pre;color:#404040;'> of the signify-osx Makefile.
</span>---
.gitignore | 1 +
vendor/Makefile.in | 30 +-
vendor/signify-osx/.gitignore | 5 +
vendor/signify-osx/LICENSE | 13 +
vendor/signify-osx/Makefile | 136 +++
vendor/signify-osx/README.md | 61 ++
vendor/signify-osx/freezero.c | 12 +
vendor/signify-osx/hashaliases.c | 69 ++
vendor/signify-osx/keys/libressl.pub | 2 +
vendor/signify-osx/keys/openbsd-55-base.pub | 2 +
vendor/signify-osx/keys/openbsd-55-fw.pub | 2 +
vendor/signify-osx/keys/openbsd-55-pkg.pub | 2 +
vendor/signify-osx/keys/openbsd-56-base.pub | 2 +
vendor/signify-osx/keys/openbsd-56-fw.pub | 2 +
vendor/signify-osx/keys/openbsd-56-pkg.pub | 2 +
vendor/signify-osx/keys/openbsd-57-base.pub | 2 +
vendor/signify-osx/keys/openbsd-57-fw.pub | 2 +
vendor/signify-osx/keys/openbsd-57-pkg.pub | 2 +
vendor/signify-osx/keys/openbsd-58-base.pub | 2 +
vendor/signify-osx/keys/openbsd-58-fw.pub | 2 +
vendor/signify-osx/keys/openbsd-58-pkg.pub | 2 +
vendor/signify-osx/keys/openbsd-59-base.pub | 2 +
vendor/signify-osx/keys/openbsd-59-fw.pub | 2 +
vendor/signify-osx/keys/openbsd-59-pkg.pub | 2 +
vendor/signify-osx/keys/openbsd-60-base.pub | 2 +
vendor/signify-osx/keys/openbsd-60-fw.pub | 2 +
vendor/signify-osx/keys/openbsd-60-pkg.pub | 2 +
vendor/signify-osx/keys/openbsd-61-base.pub | 2 +
vendor/signify-osx/keys/openbsd-61-fw.pub | 2 +
vendor/signify-osx/keys/openbsd-61-pkg.pub | 2 +
vendor/signify-osx/keys/openbsd-61-syspatch.pub | 2 +
vendor/signify-osx/keys/openbsd-62-base.pub | 2 +
vendor/signify-osx/keys/openbsd-62-fw.pub | 2 +
vendor/signify-osx/keys/openbsd-62-pkg.pub | 2 +
vendor/signify-osx/keys/openbsd-62-syspatch.pub | 2 +
vendor/signify-osx/keys/openbsd-63-base.pub | 2 +
vendor/signify-osx/keys/openbsd-63-fw.pub | 2 +
vendor/signify-osx/keys/openbsd-63-pkg.pub | 2 +
vendor/signify-osx/keys/openbsd-63-syspatch.pub | 2 +
vendor/signify-osx/keys/openbsd-64-base.pub | 2 +
vendor/signify-osx/keys/openbsd-64-fw.pub | 2 +
vendor/signify-osx/keys/openbsd-64-pkg.pub | 2 +
vendor/signify-osx/keys/openbsd-64-syspatch.pub | 2 +
vendor/signify-osx/keys/openbsd-65-base.pub | 2 +
vendor/signify-osx/keys/openbsd-65-fw.pub | 2 +
vendor/signify-osx/keys/openbsd-65-pkg.pub | 2 +
vendor/signify-osx/keys/openbsd-65-syspatch.pub | 2 +
vendor/signify-osx/missing.h | 4 +
vendor/signify-osx/regress.sh | 28 +
.../src/etc/signify/openbsd-70-base.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-70-fw.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-70-pkg.pub | 2 +
.../src/etc/signify/openbsd-70-syspatch.pub | 2 +
.../src/etc/signify/openbsd-71-base.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-71-fw.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-71-pkg.pub | 2 +
.../src/etc/signify/openbsd-71-syspatch.pub | 2 +
.../src/etc/signify/openbsd-72-base.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-72-fw.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-72-pkg.pub | 2 +
.../src/etc/signify/openbsd-72-syspatch.pub | 2 +
.../src/etc/signify/openbsd-73-base.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-73-fw.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-73-pkg.pub | 2 +
.../src/etc/signify/openbsd-73-syspatch.pub | 2 +
.../src/etc/signify/openbsd-74-base.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-74-fw.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-74-pkg.pub | 2 +
.../src/etc/signify/openbsd-74-syspatch.pub | 2 +
.../src/etc/signify/openbsd-75-base.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-75-fw.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-75-pkg.pub | 2 +
.../src/etc/signify/openbsd-75-syspatch.pub | 2 +
.../src/etc/signify/openbsd-76-base.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-76-fw.pub | 2 +
.../signify-osx/src/etc/signify/openbsd-76-pkg.pub | 2 +
.../src/etc/signify/openbsd-76-syspatch.pub | 2 +
vendor/signify-osx/src/include/blf.h | 79 ++
vendor/signify-osx/src/include/sha2.h | 156 ++++
vendor/signify-osx/src/lib/libc/crypt/blowfish.c | 688 +++++++++++++++
vendor/signify-osx/src/lib/libc/hash/helper.c | 117 +++
vendor/signify-osx/src/lib/libc/hash/sha2.c | 975 +++++++++++++++++++++
vendor/signify-osx/src/lib/libc/hash/sha256hl.c | 117 +++
.../signify-osx/src/lib/libc/hash/sha512_256hl.c | 117 +++
vendor/signify-osx/src/lib/libc/hash/sha512hl.c | 117 +++
vendor/signify-osx/src/lib/libc/net/base64.c | 307 +++++++
.../src/lib/libc/string/explicit_bzero.c | 20 +
vendor/signify-osx/src/lib/libutil/bcrypt_pbkdf.c | 175 ++++
vendor/signify-osx/src/lib/libutil/ohash.c | 327 +++++++
vendor/signify-osx/src/lib/libutil/ohash.h | 74 ++
vendor/signify-osx/src/lib/libutil/util.h | 129 +++
.../lib/libc/explicit_bzero/explicit_bzero.c | 225 +++++
.../src/regress/usr.bin/signify/forgery.txt | 1 +
.../src/regress/usr.bin/signify/forgery.txt.sig | 2 +
.../src/regress/usr.bin/signify/orders.txt | 1 +
.../src/regress/usr.bin/signify/orders.txt.sig | 2 +
.../src/regress/usr.bin/signify/regresskey.pub | 2 +
.../src/regress/usr.bin/signify/regresskey.sec | 2 +
.../src/regress/usr.bin/signify/signify.sh | 37 +
.../signify-osx/src/usr.bin/signify/crypto_api.c | 29 +
.../signify-osx/src/usr.bin/signify/crypto_api.h | 39 +
vendor/signify-osx/src/usr.bin/signify/fe25519.c | 335 +++++++
vendor/signify-osx/src/usr.bin/signify/fe25519.h | 70 ++
vendor/signify-osx/src/usr.bin/signify/ge25519.h | 43 +
.../src/usr.bin/signify/ge25519_base.data | 858 ++++++++++++++++++
.../signify-osx/src/usr.bin/signify/mod_ed25519.c | 143 +++
.../signify-osx/src/usr.bin/signify/mod_ge25519.c | 327 +++++++
vendor/signify-osx/src/usr.bin/signify/sc25519.c | 306 +++++++
vendor/signify-osx/src/usr.bin/signify/sc25519.h | 80 ++
vendor/signify-osx/src/usr.bin/signify/signify.1 | 206 +++++
vendor/signify-osx/src/usr.bin/signify/signify.c | 918 +++++++++++++++++++
vendor/signify-osx/src/usr.bin/signify/signify.h | 33 +
vendor/signify-osx/src/usr.bin/signify/zsig.c | 319 +++++++
113 files changed, 7861 insertions(+), 8 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/.gitignore b/.gitignore
</span><span style='display:block; white-space:pre;color:#808080;'>index 061a9cbb9..90a51b1ac 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/.gitignore
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/.gitignore
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -62,5 +62,6 @@ vendor/tcl8.*/unix/**/*Uuid.h
</span> Makefile
pkgIndex.tcl
!vendor/tcllib*/**/pkgIndex.tcl
<span style='display:block; white-space:pre;background:#e0ffe0;'>+!vendor/signify-osx/Makefile
</span>
/dist/
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/Makefile.in b/vendor/Makefile.in
</span><span style='display:block; white-space:pre;color:#808080;'>index d3c691f87..4556beeba 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/vendor/Makefile.in
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/Makefile.in
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,14 +1,16 @@
</span> TCL_SUBDIR= @VENDOR_TCL_SUBDIR@
TCLX_SUBDIR= @VENDOR_TCLX_SUBDIR@
TCLLIB_SUBDIR= @VENDOR_TCLLIB_SUBDIR@
<span style='display:block; white-space:pre;background:#e0ffe0;'>+SIGNIFY_SUBDIR= signify-osx
</span>
PREFIX= @prefix@
DESTROOT= @abs_top_builddir@/vendor/vendor-destroot
<span style='display:block; white-space:pre;background:#e0ffe0;'>+CC= @CC@
</span>
.PHONY: all clean distclean install destroot test
<span style='display:block; white-space:pre;background:#ffe0e0;'>-.PHONY: destroot-tcl destroot-tclx destroot-tcllib
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-.PHONY: install-tcl install-tclx install-tcllib
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-.PHONY: %-tcl %-tclx %-tcllib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.PHONY: destroot-tcl destroot-tclx destroot-tcllib destroot-signify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.PHONY: install-tcl install-tclx install-tcllib install-signify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.PHONY: %-tcl %-tclx %-tcllib %-signify
</span>
# for make all, run destroot (where destroot will depend on all of each
# subpackage)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -32,7 +34,11 @@ all-tclx: all-tcl
</span> # tcllib requires a working tclsh
all-tcllib: all-tcl
<span style='display:block; white-space:pre;background:#ffe0e0;'>-destroot: destroot-tcl destroot-tclx destroot-tcllib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+%-signify:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @echo ===\> making $(@:%-signify=%) in ${DIRPRFX}${SIGNIFY_SUBDIR}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @umask 0022; $(MAKE) -C ${SIGNIFY_SUBDIR} $(@:%-signify=%) CC=${CC}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+destroot: destroot-tcl destroot-tclx destroot-tcllib destroot-signify
</span> destroot-tcl: all-tcl
@echo ===\> staging to destroot in ${DIRPRFX}@VENDOR_TCL_SUBDIR@
@umask 0022; $(MAKE) -C @VENDOR_TCL_SUBDIR@ DESTDIR=${DESTROOT} @VENDOR_TCL_INSTALL@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -46,7 +52,11 @@ destroot-tcllib: all-tcllib
</span> @umask 0022; $(MAKE) -C @VENDOR_TCLLIB_SUBDIR@ DESTDIR=${DESTROOT} TCLSH_PROG=@INTREE_TCLSH@ @VENDOR_TCLLIB_INSTALL@
@chmod -R ugo+rX ${DESTROOT}${PREFIX}/libexec/macports/lib/tcllib*
<span style='display:block; white-space:pre;background:#ffe0e0;'>-install: install-tcl install-tclx install-tcllib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+destroot-signify:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @echo ===\> staging to destroot in ${DIRPRFX}${SIGNIFY_SUBDIR}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @umask 0022; $(MAKE) -C ${SIGNIFY_SUBDIR} install PREFIX=${DESTROOT}${PREFIX}/libexec/macports CC=${CC}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+install: install-tcl install-tclx install-tcllib install-signify
</span>
TCL_PACKAGE_PATH=@TCL_PACKAGE_PATH@
TCL_PREFIX=@TCL_PREFIX@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -83,16 +93,20 @@ install-tcllib:
</span> @umask 0022; $(MAKE) -C @VENDOR_TCLLIB_SUBDIR@ TCLSH_PROG=@INTREE_TCLSH@ @VENDOR_TCLLIB_INSTALL@
@chmod -R ugo+rX $(DESTDIR)${PREFIX}/libexec/macports/lib/tcllib*
<span style='display:block; white-space:pre;background:#e0ffe0;'>+install-signify:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @echo ===\> making $(@:%-signify=%) in ${DIRPRFX}${SIGNIFY_SUBDIR}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @umask 0022; $(MAKE) -C ${SIGNIFY_SUBDIR} install PREFIX=$(DESTDIR)${PREFIX}/libexec/macports CC=${CC}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> test:
<span style='display:block; white-space:pre;background:#ffe0e0;'>-clean: clean-tcl clean-tcllib clean-tclx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+clean: clean-tcl clean-tcllib clean-tclx clean-signify
</span> rm -rf ${DESTROOT}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-distclean: distclean-tcl distclean-tcllib distclean-tclx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+distclean: distclean-tcl distclean-tcllib distclean-tclx distclean-signify
</span> rm -f Makefile
rm -rf vendor-destroot
rm -f tclsh
<span style='display:block; white-space:pre;background:#ffe0e0;'>-codesign:: tcl/unix/libtcl8.6.dylib tcl/unix/tclsh tclx/libtclx8.6.dylib tcl/unix/pkgs/itcl4.2.3/libitcl4.2.3.dylib tcl/unix/pkgs/tdbc1.1.5/libtdbc1.1.5.dylib tcl/unix/pkgs/tdbcpostgres1.1.5/libtdbcpostgres1.1.5.dylib tcl/unix/pkgs/thread2.8.8/libthread2.8.8.dylib tcl/unix/pkgs/tdbcmysql1.1.5/libtdbcmysql1.1.5.dylib tcl/unix/pkgs/tdbcodbc1.1.5/libtdbcodbc1.1.5.dylib tcl/unix/pkgs/sqlite3.40.0/libsqlite3.40.0.dylib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+codesign:: signify-osx/signify tcl/unix/libtcl8.6.dylib tcl/unix/tclsh tclx/libtclx8.6.dylib tcl/unix/pkgs/itcl4.2.4/libitcl4.2.4.dylib tcl/unix/pkgs/tdbc1.1.7/libtdbc1.1.7.dylib tcl/unix/pkgs/tdbcpostgres1.1.7/libtdbcpostgres1.1.7.dylib tcl/unix/pkgs/thread2.8.9/libthread2.8.9.dylib tcl/unix/pkgs/tdbcmysql1.1.7/libtdbcmysql1.1.7.dylib tcl/unix/pkgs/tdbcodbc1.1.7/libtdbcodbc1.1.7.dylib tcl/unix/pkgs/sqlite3.44.2/libsqlite3.44.2.dylib
</span> ../src/codesign.sh $?
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/.gitignore b/vendor/signify-osx/.gitignore
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..c7264803a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/.gitignore
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/explicit_bzero
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/signify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/signify.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/test-results/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/**/CVS/
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/LICENSE b/vendor/signify-osx/LICENSE
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..2ae8018c1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/LICENSE
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,13 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Copyright (c) 2014-2018 Jean-Philippe Ouellet <jpo@vt.edu>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/Makefile b/vendor/signify-osx/Makefile
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..7fd03a220
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/Makefile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,136 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PREFIX= /usr/local
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+BINDIR= ${PREFIX}/bin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+MANDIR= ${PREFIX}/share/man
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CVSROOT= anoncvs@anoncvs.openbsd.org:/cvs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#CVSROOT= anoncvs@anoncvs3.usa.openbsd.org:/cvs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+### sources from upstream
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SRCS+= src/lib/libc/crypt/blowfish.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SRCS+= src/lib/libc/hash/sha2.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SRCS+= src/lib/libc/net/base64.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SRCS+= src/lib/libc/string/explicit_bzero.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SRCS+= src/lib/libutil/bcrypt_pbkdf.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SRCS+= src/lib/libutil/ohash.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SRCS+= src/usr.bin/signify/crypto_api.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SRCS+= src/usr.bin/signify/fe25519.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SRCS+= src/usr.bin/signify/mod_ed25519.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SRCS+= src/usr.bin/signify/mod_ge25519.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SRCS+= src/usr.bin/signify/signify.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SRCS+= src/usr.bin/signify/sc25519.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SRCS+= src/usr.bin/signify/zsig.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+INCL+= src/include/blf.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+INCL+= src/include/sha2.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+INCL+= src/lib/libutil/ohash.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+INCL+= src/lib/libutil/util.h # only for bcrypt_pbkdf decl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+INCL+= src/usr.bin/signify/crypto_api.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+INCL+= src/usr.bin/signify/fe25519.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+INCL+= src/usr.bin/signify/ge25519.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+INCL+= src/usr.bin/signify/ge25519_base.data
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+INCL+= src/usr.bin/signify/sc25519.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+INCL+= src/usr.bin/signify/signify.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+MAN= src/usr.bin/signify/signify.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+FETCH_ONLY+= src/etc/signify # keys
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+FETCH_ONLY+= src/lib/libc/hash/helper.c # src of generated files
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+FETCH_ONLY+= src/regress/lib/libc/explicit_bzero
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+FETCH_ONLY+= src/regress/usr.bin/signify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+FROM_CVS+= ${SRCS} ${INCL} ${MAN} ${FETCH_ONLY}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+### local files
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+HASH_HELPERS+= src/lib/libc/hash/sha256hl.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+HASH_HELPERS+= src/lib/libc/hash/sha512hl.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+HASH_HELPERS+= src/lib/libc/hash/sha512_256hl.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+LOCAL_SRCS+= ${HASH_HELPERS}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+LOCAL_SRCS+= hashaliases.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+LOCAL_SRCS+= freezero.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+### build cfg
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CFLAGS+= -Isrc/include
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CFLAGS+= -Isrc/lib/libutil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CFLAGS+= -include missing.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CFLAGS+= '-DDEF_WEAK(a)=__asm__("")'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CFLAGS+= '-DMAKE_CLONE(a,b)=__asm__("")'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CFLAGS+= '-Dpledge(a,b)=(0)'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CFLAGS+= -Wall -Wextra
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CFLAGS+= -Wno-pointer-sign
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CFLAGS+= -Wno-sign-compare
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CFLAGS+= -Wno-unused-parameter
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+### targets
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.PHONY: fetch hash-helpers clean install check test up check-updates ls
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+signify: ${LOCAL_SRCS} ${SRCS} ${INCL}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ${CC} ${CFLAGS} -o $@ ${SRCS} ${LOCAL_SRCS}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cp src/usr.bin/signify/signify.1 .
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+hash-helpers: ${HASH_HELPERS}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+src/lib/libc/hash/sha256hl.c: src/lib/libc/hash/helper.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sed -e 's/hashinc/sha2.h/g' \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ -e 's/HASH/SHA256/g' \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ -e 's/SHA[0-9][0-9][0-9]_CTX/SHA2_CTX/g' $< > $@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+src/lib/libc/hash/sha512hl.c: src/lib/libc/hash/helper.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sed -e 's/hashinc/sha2.h/g' \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ -e 's/HASH/SHA512/g' \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ -e 's/SHA[0-9][0-9][0-9]_CTX/SHA2_CTX/g' $< > $@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+src/lib/libc/hash/sha512_256hl.c: src/lib/libc/hash/helper.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sed -e 's/hashinc/sha2.h/g' \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ -e 's/HASH/SHA512_256/g' \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ -e 's/SHA512_256_CTX/SHA2_CTX/g' $< > $@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+src/lib/libc/hash/helper.c:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $(error Missing source files... Maybe you want to `make fetch`?)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+fetch:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Fetch the sources via CVS.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cvs -qd ${CVSROOT} get -P ${FROM_CVS}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Don't keep CVS Root files around. All they do is cause false-positives
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # for change detection when fetching from different CVS mirrors.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ find src -name Root -exec rm {} +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+install: signify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ install -d ${BINDIR} ${MANDIR}/man1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ install -Ss -m 755 signify ${BINDIR}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ install -S -m 644 signify.1 ${MANDIR}/man1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+### regression test targets
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+REGRESS_BZ_SRCS= src/lib/libc/string/explicit_bzero.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+REGRESS_BZ_SRCS+= src/regress/lib/libc/explicit_bzero/explicit_bzero.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+explicit_bzero: ${REGRESS_BZ_SRCS}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ${CC} ${CFLAGS} -o $@ ${REGRESS_BZ_SRCS}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+check: test
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test: signify explicit_bzero
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @sh ./regress.sh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+### syncing with upstream
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+up: check-updates
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+check-updates:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @(cd src && CVS_RSH=ssh cvs -qnd ${CVSROOT} up 2>&1 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ | (grep -v '^? ' || echo 'Up to date!'))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+### misc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ls:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @echo $(FROM_CVS:src/%=%)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+clean:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rm -rf signify signify.1 test-results explicit_bzero
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/README.md b/vendor/signify-osx/README.md
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..c1632b48f
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/README.md
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,61 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+## macOS port of OpenBSD's [signify(1)](https://man.openbsd.org/signify.1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This macOS port of OpenBSD's `signify` utility intentionally tracks upstream
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+OpenBSD sources directly, keeping only the smallest portability layer possible,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+with the explicit #1 goal of making it as easy to audit as possible.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The latest version was tested on macOS 10.14.2 with Apple LLVM 9.1.0.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Older versions were previously tested as far back as OS X 10.6.8 with GCC 4.2.1.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Some of the OpenBSD-specific functions used by signify that previously required
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+portability shims were introduced in macOS 10.12(.1), and the corresponding
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+portability shims have been removed to keep the code as lean and easily
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+auditable as possible. If you need support for a newer signify on an older
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+macOS, feel free to open an issue.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Man page at https://man.openbsd.org/signify.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+`src/` is the result of `make fetch` (cvs get) and `make hash-helpers` (sed) as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+of the time of the last commit.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+If you don't trust me (or github) to not have modified anything in there to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+insert a backdoor (why should you?), but you trust the upstream OpenBSD version,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+then simply `rm -r src` it and audit the rest of the files that constitute
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+this "port". It's only ~200 lines, you can do it :)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+### Easy (non-paranoid, 3rd party-trusting) installation
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+If you prefer [MacPorts](https://www.macports.org/):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$ sudo port install signify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+If you prefer [Homebrew](http://brew.sh/):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$ brew install signify-osx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+### Building it yourself
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+I've included a copy of the upstream signify source in this repo for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+convenience, but you should probably fetch it yourself. Doing so requires a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+working `cvs`, which does not come with new OS X systems by default, so
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+either install that first (with macports or homebrew or whatever), or just
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+use the src shipped in this repo (as I know it works).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+To get the latest upstream source:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+rm -r src
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+make fetch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+and then the usual `make`, `make install`.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+### Testing
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+To run the regression tests, `make test`.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+### Keeping -current
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+To check for upstream updates, `make check-updates`. (requires working CVS)
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/freezero.c b/vendor/signify-osx/freezero.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..79f374f6e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/freezero.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,12 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "missing.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+freezero(void *ptr, size_t sz)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (ptr == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(ptr, sz);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(ptr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/hashaliases.c b/vendor/signify-osx/hashaliases.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..44d40f12b
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/hashaliases.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,69 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OS X compilers seem to have trouble resolving MAKE_CLONE()es,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * so just make explicit wrapper functions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sha2.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MAKE_CLONE(SHA224Transform, SHA256Transform); */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA224Transform(u_int32_t state[8], const u_int8_t data[SHA256_BLOCK_LENGTH])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256Transform(state, data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MAKE_CLONE(SHA224Update, SHA256Update); */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA224Update(SHA2_CTX *context, const u_int8_t *data, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256Update(context, data, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MAKE_CLONE(SHA224Pad, SHA256Pad); */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA224Pad(SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256Pad(context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MAKE_CLONE(SHA384Transform, SHA512Transform); */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA384Transform(u_int64_t state[8], const u_int8_t data[SHA512_BLOCK_LENGTH])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Transform(state, data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MAKE_CLONE(SHA384Update, SHA512Update); */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA384Update(SHA2_CTX *context, const u_int8_t *data, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Update(context, data, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MAKE_CLONE(SHA384Pad, SHA512Pad); */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA384Pad(SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Pad(context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MAKE_CLONE(SHA512_256Transform, SHA512Transform); */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512_256Transform(u_int64_t state[8], const u_int8_t data[SHA512_BLOCK_LENGTH])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Transform(state, data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MAKE_CLONE(SHA512_256Update, SHA512Update); */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512_256Update(SHA2_CTX *context, const u_int8_t *data, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Update(context, data, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MAKE_CLONE(SHA512_256Pad, SHA512Pad); */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512_256Pad(SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Pad(context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/libressl.pub b/vendor/signify-osx/keys/libressl.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..1debbf768
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/libressl.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: LibreSSL Portable public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQg/nutTVqCUVUw8OhyHt9n51IC8mdQRd1b93dOyVrwtIXmMI+dtGFe
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-55-base.pub b/vendor/signify-osx/keys/openbsd-55-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..3f951ddc6
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-55-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 5.5 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRGy8gxk9N9314J0gh9U02lA7s8i6ITajJiNgxQOndvXvM5ZPX+nQ9h
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-55-fw.pub b/vendor/signify-osx/keys/openbsd-55-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..23bdb920d
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-55-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 5.5 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWTdVOhdk5qyNktv0iGV6OpaVfogGxTYc1bbkaUhFlExmclYvpJR/opO
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-55-pkg.pub b/vendor/signify-osx/keys/openbsd-55-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..f06e4ee94
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-55-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 5.5 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQQC1M9dhm/tja/ktitJs/QVI1kGTQr7W7jtUmdZ4uTp+4yZJ6RRHb5
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-56-base.pub b/vendor/signify-osx/keys/openbsd-56-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..cda5573b2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-56-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 5.6 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWR0EANmo9nqhpPbPUZDIBcRtrVcRwQxZ8UKGWY8Ui4RHi229KFL84wV
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-56-fw.pub b/vendor/signify-osx/keys/openbsd-56-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..d817594d8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-56-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 5.6 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWT4e3jpYgSeLYs62aDsUkcvHR7+so5S/Fz/++B859j61rfNVcQTRxMw
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-56-pkg.pub b/vendor/signify-osx/keys/openbsd-56-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..5d504009e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-56-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 5.6 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWSPEf7Vpp2j0PTDG+eLs5L700nlqBFzEcSmHuv3ypVUEOYwso+UucXb
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-57-base.pub b/vendor/signify-osx/keys/openbsd-57-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..d5e3e4802
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-57-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 5.7 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWSvUZXnw9gUb70PdeSNnpSmodCyIPJEGN1wWr+6Time1eP7KiWJ5eAM
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-57-fw.pub b/vendor/signify-osx/keys/openbsd-57-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..7ec9752df
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-57-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 5.7 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWSuRBL44FVkb2QuvtlwOJmzS9UJtbKZd7GEYcol8HPXu4On/Ct1LoZr
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-57-pkg.pub b/vendor/signify-osx/keys/openbsd-57-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..c18b25301
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-57-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 5.7 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWTJ1iHLn/zcvJJSbxJIEU9ChlfAlU16XoLLxmxciliOFWfTLyOv0vQs
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-58-base.pub b/vendor/signify-osx/keys/openbsd-58-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..7ae2b3538
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-58-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 5.8 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQNNZXtC/MqP3Eiu+6FBz/qrxiWQwDhd+9Yljzp62UP4KzFmmvzVk60
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-58-fw.pub b/vendor/signify-osx/keys/openbsd-58-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..f9bb97f58
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-58-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 5.8 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWTpkvg4fhJCDx9yL4bUCou/vtAecPVTfcaaGESQeBruwX/qHToMvWh6
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-58-pkg.pub b/vendor/signify-osx/keys/openbsd-58-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..b99600731
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-58-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 5.8 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRlkI2aFHvL/XGqD+lFerD/xUi/jnAXKwdFQwZDekYwDrEPSpSWgpI9
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-59-base.pub b/vendor/signify-osx/keys/openbsd-59-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..0fed7032d
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-59-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 5.9 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQJVNompF3pwfIqbg+5sxfpxmZMa3tTBaW4qbUhWje/H/M7glrA6oVn
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-59-fw.pub b/vendor/signify-osx/keys/openbsd-59-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..7406203d4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-59-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 5.9 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWSdmaNkytzh6BApmPSNSDLNg26ZaXlY8g/879UvLdo3rjbsby76Eda1
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-59-pkg.pub b/vendor/signify-osx/keys/openbsd-59-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..691db3d52
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-59-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 5.9 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWSLRYDCTJeWLIScncqwGuXK6JVXDcIyRT0q+0m30MXXG4W2xWS4NZBP
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-60-base.pub b/vendor/signify-osx/keys/openbsd-60-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..2356a4b61
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-60-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 6.0 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWSho3oKSqgLQy+NpIhFXZJDtkE65tzlmtC24mStf8DoJd2OPMgna4u8
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-60-fw.pub b/vendor/signify-osx/keys/openbsd-60-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..47462ce4a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-60-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.0 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRWf7GJKFvJTWEMIaw9wld0DujiqL1mlrC6HisE6i78C+2SRArV1Iyo
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-60-pkg.pub b/vendor/signify-osx/keys/openbsd-60-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..cd766d03a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-60-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.0 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQHIajRlT2mX7tmRgb6oN6mfJu3AgQ/TU38acrWABO8lz90dR3rNmey
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-61-base.pub b/vendor/signify-osx/keys/openbsd-61-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..d596134b5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-61-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 6.1 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQEQa33SgQSEsMwwVV1+GjzdcQfRNV2Bgo48Ztd2KiZ9bAodz9c+Maa
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-61-fw.pub b/vendor/signify-osx/keys/openbsd-61-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..781d1861c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-61-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.1 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWS91POk0QZXfsqi4aI7MotYz8CPzoHjYg4a1IDi56cftacjsq+ZL/KY
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-61-pkg.pub b/vendor/signify-osx/keys/openbsd-61-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..15c641606
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-61-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.1 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQbTjGFHEvnOckqY7u9iABhXAkEpF/6TQ3Mr6bMrWbT1wOM/HnbV9ov
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-61-syspatch.pub b/vendor/signify-osx/keys/openbsd-61-syspatch.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..57d88b234
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-61-syspatch.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.1 syspatch public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRsegDPFjQlnQlptsqnIv0Q+5dSCCkeiAvZUXtrEwXQZkEhTvlPn++D
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-62-base.pub b/vendor/signify-osx/keys/openbsd-62-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..890430110
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-62-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 6.2 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRVWzAMgtyg7g27STK1h1xA6RIwtjex6Vr5Y9q5SC5q5+b0GN4lLhfu
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-62-fw.pub b/vendor/signify-osx/keys/openbsd-62-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..cfee294bd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-62-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.2 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWSbA8C2TPUQLi48EqHtg7Rx7KGDt6E/2d8OeJinGZPbpoqGRxA0N2oW
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-62-pkg.pub b/vendor/signify-osx/keys/openbsd-62-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..dc1461f18
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-62-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.2 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRvEq+UPCq0VGI9ar7VMy+HYKDrOb4WS5JLhdUBiX3qvJgPQjyZSTxI
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-62-syspatch.pub b/vendor/signify-osx/keys/openbsd-62-syspatch.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..35061cad3
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-62-syspatch.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.2 syspatch public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRsbjD1ABhtm6joukOFHqdPYZFoICJUpM257ko69FpP/roGOts+TfXg
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-63-base.pub b/vendor/signify-osx/keys/openbsd-63-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..1cd3ecb9e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-63-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 6.3 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRxzbLwAd76ZZxHU7wuIFUOVGwl6SjNNzanKWTql8w+hui7WLE/72mW
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-63-fw.pub b/vendor/signify-osx/keys/openbsd-63-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..2ecaef2e8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-63-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.3 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWT3tdmiAc+DH/CJOxPFT10kUM90/UcLTgSEUEKzhKm9QEhy+UD4CWPy
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-63-pkg.pub b/vendor/signify-osx/keys/openbsd-63-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..e8684f473
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-63-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.3 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWT58k1AWz/zZO9DHcPHXiHhDNP6hdwGjxNkyMoc/sh4O5NI8Zz1R1lD
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-63-syspatch.pub b/vendor/signify-osx/keys/openbsd-63-syspatch.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..c6ec2f89d
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-63-syspatch.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.3 syspatch public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQvqeEfNMQnoKyOt9UpVE6U7+zKfUSnbNrOHn3Zxijq7z+TyCl759+T
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-64-base.pub b/vendor/signify-osx/keys/openbsd-64-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..56b0f3743
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-64-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 6.4 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQq6XmS4eDAcQW4KsT5Ka0KwTQp2JMOP9V/DR4HTVOL5Bc0D7LeuPwA
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-64-fw.pub b/vendor/signify-osx/keys/openbsd-64-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..55158e52f
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-64-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.4 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRoBbjnosJ/39llpve1XaNIrrQND4knG+jSBeIUYU8x4WNkxz6a2K97
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-64-pkg.pub b/vendor/signify-osx/keys/openbsd-64-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..3d08d77ee
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-64-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.4 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRF5TTY+LoN/51QD5kM2hKDtMTzycQBBPmPYhyQEb1+4pff/H6fh/kA
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-64-syspatch.pub b/vendor/signify-osx/keys/openbsd-64-syspatch.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..12ef8f720
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-64-syspatch.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.4 syspatch public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRdGS4hkk0yvnoe8SWXt1Mm8i85MTCSNjQ7wqlNWwufHL4J7azwUqCz
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-65-base.pub b/vendor/signify-osx/keys/openbsd-65-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..9ccf3340c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-65-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 6.5 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWSZaRmt1LEQT9CtPygf9CvONu8kYPTlVEJdysNoUR62/NkeWgdkc3zY
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-65-fw.pub b/vendor/signify-osx/keys/openbsd-65-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..9d953465d
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-65-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.5 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQYdGVtTv5IvpH2c+TLQAC4iV7RjoGZ/v75q8MCuC9Mca7nFVCXRefy
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-65-pkg.pub b/vendor/signify-osx/keys/openbsd-65-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..745b4f23a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-65-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.5 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWS5D4+188RI6jULDOFzga0Cm1zrXYUAHT6xu0mLrZidbn6xrMB5aZeR
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/keys/openbsd-65-syspatch.pub b/vendor/signify-osx/keys/openbsd-65-syspatch.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..dc695f0e3
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/keys/openbsd-65-syspatch.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 6.5 syspatch public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWT8U2yd3Aq5DnetILjmSoCQxmyt3VqfGS7GBh19oh4Xre4ywc31PEpw
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/missing.h b/vendor/signify-osx/missing.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..492515311
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/missing.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,4 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void explicit_bzero(void *, size_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void freezero(void *, size_t);
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/regress.sh b/vendor/signify-osx/regress.sh
</span>new file mode 100755
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..bbe304529
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/regress.sh
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,28 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#!/bin/sh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set -e
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+fail() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ echo "Failed at $*!" 1>&2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+./explicit_bzero || fail explicit_bzero
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+t="$PWD/test-results"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+s="$PWD/src/regress/usr.bin/signify"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+rm -rf "$t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+mkdir "$t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# We don't have native sha* like OpenBSD, so emulate them:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+function fixsha { sed 's/^SHA\([0-9]*\)(\(.*\))= /SHA\1 (\2) = /'; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+function sha256 { openssl dgst -sha256 "$@" | fixsha; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+function sha512 { openssl dgst -sha512 "$@" | fixsha; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Use the signify we just compiled, not some other one.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+alias signify="$PWD/signify"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+( cd "$t" && . "$s/signify.sh" "$s" ) || fail signify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+echo 'All tests passed!'
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-70-base.pub b/vendor/signify-osx/src/etc/signify/openbsd-70-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..4e791314d
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-70-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 7.0 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWR3KL+gSr4QZ5mOvKhcOOgGe61ogHp5PyBOj2RrmyCpqchk9A7NVPzh
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-70-fw.pub b/vendor/signify-osx/src/etc/signify/openbsd-70-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..d0f39e758
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-70-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.0 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWS8nd7vy+I+fRHtnpxVBeX+P+9rBqJMPvSU6z8LYyAv5p73WcdFXs3B
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-70-pkg.pub b/vendor/signify-osx/src/etc/signify/openbsd-70-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..e3ad1bdea
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-70-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.0 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWR3iauEtA8/bLN/zfIQhOc5ramL/fARX72S6xw8BwAUebxik7KioCvL
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-70-syspatch.pub b/vendor/signify-osx/src/etc/signify/openbsd-70-syspatch.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..cfa725d0f
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-70-syspatch.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.0 syspatch public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWSD33kMDKsQH8j0Q8FzfYk+vsgTKiP8Q5DcrkQQtrZoWg48yxUQgLxU
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-71-base.pub b/vendor/signify-osx/src/etc/signify/openbsd-71-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..596bb2cb6
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-71-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 7.1 public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWR2eHwZTOEiTWog354iy3StRj18VbZl87O9uZpa1M2jGLXEkco6vDT5
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-71-fw.pub b/vendor/signify-osx/src/etc/signify/openbsd-71-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..e8522f41b
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-71-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.1 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQCAJ4gBK3pbcm/Q5XYxu+hIY3Zvx9kwGv2uJphEN7kNl1DD4QRue6v
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-71-pkg.pub b/vendor/signify-osx/src/etc/signify/openbsd-71-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..d610537b7
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-71-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.1 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQgLTtHQtisyH9qc9imxVFsf+P24M75F1aNio5qJCfG/bO6gATAzC9V
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-71-syspatch.pub b/vendor/signify-osx/src/etc/signify/openbsd-71-syspatch.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..f5c8547a6
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-71-syspatch.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.1 syspatch public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWTVqN+z9ta+Z6Ri7W7Vlf+XgXE30rGXld8kO78L1GmE61U5Xvbr/zHM
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-72-base.pub b/vendor/signify-osx/src/etc/signify/openbsd-72-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..6e7d2e250
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-72-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 7.2 public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQTKNnK3CZZ8Lid7/kWPO1WxjEsTeuxiXbJSSg6RDir9OJmV+t7GrOo
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-72-fw.pub b/vendor/signify-osx/src/etc/signify/openbsd-72-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..8d0a660c6
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-72-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.2 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRvwsB/ZxwZxiQBgNVhuCnEacKE1MhrcDX25jFccqaj0pxsY9oIPJq4
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-72-pkg.pub b/vendor/signify-osx/src/etc/signify/openbsd-72-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..2f0ed51f8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-72-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.2 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWSyNc+EwQQo5bZ5XtDpnk0FUl8NrIl+Ocq4FV/5VTvP9rOgHzKEnBx0
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-72-syspatch.pub b/vendor/signify-osx/src/etc/signify/openbsd-72-syspatch.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..12cba1d81
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-72-syspatch.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.2 syspatch public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQuBB7PRAc2Zy+C7VAynLuan8WDVtQ9R4xLpl8yjf1zxfqEBRRJ+66w
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-73-base.pub b/vendor/signify-osx/src/etc/signify/openbsd-73-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..4b711d5e1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-73-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 7.3 public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQS90bYzZ4XFms5z9OodrFABHMQnW6htU+4Tmp88NuQiTEezMm2cQ3K
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-73-fw.pub b/vendor/signify-osx/src/etc/signify/openbsd-73-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..ddd1ef062
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-73-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.3 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRSJW95RokBEZUxBFvPCEdtQPg2WMExzMIcjnXzVpIwUpyZZmfXun5a
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-73-pkg.pub b/vendor/signify-osx/src/etc/signify/openbsd-73-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..1e779b13c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-73-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.3 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWTJxSCZzSPKGp8unIp/yxG2lvCXJg5lFVvbOBQUvKEnGHFAO8RPg3mr
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-73-syspatch.pub b/vendor/signify-osx/src/etc/signify/openbsd-73-syspatch.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..0d3930261
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-73-syspatch.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.3 syspatch public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWShXqVD7hfbBpWb1B5EGr1DUX8kkjkTueCsa243lLNocuuVU+2eWMn5
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-74-base.pub b/vendor/signify-osx/src/etc/signify/openbsd-74-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..01f52c671
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-74-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 7.4 public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRoyQmAD08ajTqgzK3UcWaVlwaJMckH9/CshU8Md5pN1GoIrcBdTF+c
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-74-fw.pub b/vendor/signify-osx/src/etc/signify/openbsd-74-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..e4a119a4c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-74-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.4 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWTRA9KXRuZKunpXYK0ed5OxbE0K7rYWpDnTu+M8wZdqzRroFqed0U6I
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-74-pkg.pub b/vendor/signify-osx/src/etc/signify/openbsd-74-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..fd6421363
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-74-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.4 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWR/h7gubZ9M/O46RNy3PzLTPevOCK24LGCPca41IHMwSH4YuVA+jnWO
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-74-syspatch.pub b/vendor/signify-osx/src/etc/signify/openbsd-74-syspatch.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..77725154c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-74-syspatch.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.4 syspatch public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQqty2voy8V8afR9/v2RzuNr7r4y9cKwljABN7Tytd7JcPdBjnXg0Ue
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-75-base.pub b/vendor/signify-osx/src/etc/signify/openbsd-75-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..77054fe2c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-75-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 7.5 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRGj1pRpprAfgeF/rgld4ubduChLvTkigA1Zj7WLDsVA4qfYSWOEI8q
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-75-fw.pub b/vendor/signify-osx/src/etc/signify/openbsd-75-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..e90549df1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-75-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.5 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQ6EsXr4NMYvyLICug3dLHfmbpXlVasF1jbt3GVNQsosgB5+PgaufBu
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-75-pkg.pub b/vendor/signify-osx/src/etc/signify/openbsd-75-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..5ec5dd8e3
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-75-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.5 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWS/sEFDvf+rjUmS1WROzxH05pB1kB7JRRq76DUGUhCE0Ks8AdpjP5pD
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-75-syspatch.pub b/vendor/signify-osx/src/etc/signify/openbsd-75-syspatch.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..0a8683fdb
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-75-syspatch.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.5 syspatch public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRAAZC5WcFgn+8b5msDR+yDVCx4ziLaSQI2sy7e4GFY42nFW9p7mP2t
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-76-base.pub b/vendor/signify-osx/src/etc/signify/openbsd-76-base.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..36753fe28
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-76-base.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: openbsd 7.6 base public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWTkuwn4mbq8ouJbfO4VfNH8+FdiZUosz2qIR0V0C9bm6CnVEt7CGkV0
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-76-fw.pub b/vendor/signify-osx/src/etc/signify/openbsd-76-fw.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..1ebb7a52f
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-76-fw.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.6 firmware public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWTjkGqNGXmQxWRiGhZYwI3lUuv1LNutoO7ERDCfFwLB/Lkp1aCsS4QP
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-76-pkg.pub b/vendor/signify-osx/src/etc/signify/openbsd-76-pkg.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..fde5c4f1e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-76-pkg.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.6 packages public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWQnLSfWlibGntNj6cqS87rZEmqv1VWMbGSskBTuNKxiSg5hgBpTvzJz
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/etc/signify/openbsd-76-syspatch.pub b/vendor/signify-osx/src/etc/signify/openbsd-76-syspatch.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..b3279d442
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/etc/signify/openbsd-76-syspatch.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: OpenBSD 7.6 syspatch public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRzQWJ4ipcCDeYWQNJJ2gBVTP8KZTxaD0aELC/SNplE3ynVDEHWaPQR
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/include/blf.h b/vendor/signify-osx/src/include/blf.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..87d390cd7
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/include/blf.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,79 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: blf.h,v 1.8 2021/11/29 01:04:45 djm Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Blowfish - a fast block cipher designed by Bruce Schneier
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Redistribution and use in source and binary forms, with or without
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * modification, are permitted provided that the following conditions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * are met:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 1. Redistributions of source code must retain the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * notice, this list of conditions and the following disclaimer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 2. Redistributions in binary form must reproduce the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * notice, this list of conditions and the following disclaimer in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * documentation and/or other materials provided with the distribution.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 3. The name of the author may not be used to endorse or promote products
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * derived from this software without specific prior written permission.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef _BLF_H_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define _BLF_H_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Schneier specifies a maximum key length of 56 bytes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This ensures that every key bit affects every cipher
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * bit. However, the subkeys can hold up to 72 bytes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Warning: For normal blowfish encryption only 56 bytes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * of the key affect all cipherbits.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BLF_N 16 /* Number of Subkeys */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BLF_MAXKEYLEN ((BLF_N-2)*4) /* 448 bits */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BLF_MAXUTILIZED ((BLF_N+2)*4) /* 576 bits */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Blowfish context */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct BlowfishContext {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t S[4][256]; /* S-Boxes */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t P[BLF_N + 2]; /* Subkeys */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} blf_ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Raw access to customized Blowfish
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * blf_key is just:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Blowfish_initstate( state )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Blowfish_expand0state( state, key, keylen )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void Blowfish_encipher(blf_ctx *, u_int32_t *, u_int32_t *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void Blowfish_decipher(blf_ctx *, u_int32_t *, u_int32_t *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void Blowfish_initstate(blf_ctx *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void Blowfish_expand0state(blf_ctx *, const u_int8_t *, u_int16_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void Blowfish_expandstate
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+(blf_ctx *, const u_int8_t *, u_int16_t, const u_int8_t *, u_int16_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Standard Blowfish */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void blf_key(blf_ctx *, const u_int8_t *, u_int16_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void blf_enc(blf_ctx *, u_int32_t *, u_int16_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void blf_dec(blf_ctx *, u_int32_t *, u_int16_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void blf_ecb_encrypt(blf_ctx *, u_int8_t *, u_int32_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void blf_ecb_decrypt(blf_ctx *, u_int8_t *, u_int32_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void blf_cbc_encrypt(blf_ctx *, u_int8_t *, u_int8_t *, u_int32_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void blf_cbc_decrypt(blf_ctx *, u_int8_t *, u_int8_t *, u_int32_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Converts u_int8_t to u_int32_t */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+u_int32_t Blowfish_stream2word(const u_int8_t *, u_int16_t , u_int16_t *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/include/sha2.h b/vendor/signify-osx/src/include/sha2.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..52ddb3f79
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/include/sha2.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,156 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: sha2.h,v 1.10 2016/09/03 17:00:29 tedu Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * FILE: sha2.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * AUTHOR: Aaron D. Gifford <me@aarongifford.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2000-2001, Aaron D. Gifford
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Redistribution and use in source and binary forms, with or without
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * modification, are permitted provided that the following conditions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * are met:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 1. Redistributions of source code must retain the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * notice, this list of conditions and the following disclaimer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 2. Redistributions in binary form must reproduce the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * notice, this list of conditions and the following disclaimer in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * documentation and/or other materials provided with the distribution.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 3. Neither the name of the copyright holder nor the names of contributors
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * may be used to endorse or promote products derived from this software
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * without specific prior written permission.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * $From: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef _SHA2_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define _SHA2_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*** SHA-256/384/512 Various Length Definitions ***********************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA224_BLOCK_LENGTH 64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA224_DIGEST_LENGTH 28
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA224_DIGEST_STRING_LENGTH (SHA224_DIGEST_LENGTH * 2 + 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA256_BLOCK_LENGTH 64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA256_DIGEST_LENGTH 32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA384_BLOCK_LENGTH 128
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA384_DIGEST_LENGTH 48
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA384_DIGEST_STRING_LENGTH (SHA384_DIGEST_LENGTH * 2 + 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA512_BLOCK_LENGTH 128
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA512_DIGEST_LENGTH 64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA512_256_BLOCK_LENGTH 128
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA512_256_DIGEST_LENGTH 32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA512_256_DIGEST_STRING_LENGTH (SHA512_256_DIGEST_LENGTH * 2 + 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*** SHA-224/256/384/512 Context Structure *******************************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct _SHA2_CTX {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ union {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t st32[8];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int64_t st64[8];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int64_t bitcount[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int8_t buffer[SHA512_BLOCK_LENGTH];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} SHA2_CTX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+__BEGIN_DECLS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA224Init(SHA2_CTX *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA224Transform(u_int32_t state[8], const u_int8_t [SHA224_BLOCK_LENGTH]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA224Update(SHA2_CTX *, const u_int8_t *, size_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__string__,2,3)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA224Pad(SHA2_CTX *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA224Final(u_int8_t [SHA224_DIGEST_LENGTH], SHA2_CTX *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,1,SHA224_DIGEST_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA224End(SHA2_CTX *, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA224_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA224File(const char *, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA224_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA224FileChunk(const char *, char *, off_t, off_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA224_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA224Data(const u_int8_t *, size_t, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__string__,1,2)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,3,SHA224_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA256Init(SHA2_CTX *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA256Transform(u_int32_t state[8], const u_int8_t [SHA256_BLOCK_LENGTH]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA256Update(SHA2_CTX *, const u_int8_t *, size_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__string__,2,3)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA256Pad(SHA2_CTX *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA256Final(u_int8_t [SHA256_DIGEST_LENGTH], SHA2_CTX *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,1,SHA256_DIGEST_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA256End(SHA2_CTX *, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA256_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA256File(const char *, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA256_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA256FileChunk(const char *, char *, off_t, off_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA256_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA256Data(const u_int8_t *, size_t, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__string__,1,2)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,3,SHA256_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA384Init(SHA2_CTX *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA384Transform(u_int64_t state[8], const u_int8_t [SHA384_BLOCK_LENGTH]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA384Update(SHA2_CTX *, const u_int8_t *, size_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__string__,2,3)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA384Pad(SHA2_CTX *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA384Final(u_int8_t [SHA384_DIGEST_LENGTH], SHA2_CTX *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,1,SHA384_DIGEST_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA384End(SHA2_CTX *, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA384_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA384File(const char *, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA384_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA384FileChunk(const char *, char *, off_t, off_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA384_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA384Data(const u_int8_t *, size_t, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__string__,1,2)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,3,SHA384_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA512Init(SHA2_CTX *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA512Transform(u_int64_t state[8], const u_int8_t [SHA512_BLOCK_LENGTH]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA512Update(SHA2_CTX *, const u_int8_t *, size_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__string__,2,3)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA512Pad(SHA2_CTX *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA512Final(u_int8_t [SHA512_DIGEST_LENGTH], SHA2_CTX *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,1,SHA512_DIGEST_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA512End(SHA2_CTX *, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA512_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA512File(const char *, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA512_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA512FileChunk(const char *, char *, off_t, off_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA512_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA512Data(const u_int8_t *, size_t, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__string__,1,2)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,3,SHA512_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA512_256Init(SHA2_CTX *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA512_256Transform(u_int64_t state[8], const u_int8_t [SHA512_256_BLOCK_LENGTH]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA512_256Update(SHA2_CTX *, const u_int8_t *, size_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__string__,2,3)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA512_256Pad(SHA2_CTX *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void SHA512_256Final(u_int8_t [SHA512_256_DIGEST_LENGTH], SHA2_CTX *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,1,SHA512_256_DIGEST_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA512_256End(SHA2_CTX *, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA512_256_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA512_256File(const char *, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA512_256_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA512_256FileChunk(const char *, char *, off_t, off_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,2,SHA512_256_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *SHA512_256Data(const u_int8_t *, size_t, char *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__string__,1,2)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((__bounded__(__minbytes__,3,SHA512_256_DIGEST_STRING_LENGTH)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+__END_DECLS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* _SHA2_H */
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/lib/libc/crypt/blowfish.c b/vendor/signify-osx/src/lib/libc/crypt/blowfish.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..05ad00d7a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/lib/libc/crypt/blowfish.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,688 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: blowfish.c,v 1.21 2022/08/28 11:11:25 jsg Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Blowfish block cipher for OpenBSD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Implementation advice by David Mazieres <dm@lcs.mit.edu>.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Redistribution and use in source and binary forms, with or without
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * modification, are permitted provided that the following conditions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * are met:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 1. Redistributions of source code must retain the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * notice, this list of conditions and the following disclaimer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 2. Redistributions in binary form must reproduce the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * notice, this list of conditions and the following disclaimer in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * documentation and/or other materials provided with the distribution.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 3. The name of the author may not be used to endorse or promote products
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * derived from this software without specific prior written permission.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This code is derived from section 14.3 and the given source
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * in section V of Applied Cryptography, second edition.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Blowfish is an unpatented fast block cipher designed by
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Bruce Schneier.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdio.h> /* used for debugging */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <blf.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Function for Feistel Networks */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define F(s, x) ((((s)[ (((x)>>24)&0xFF)] \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ + (s)[0x100 + (((x)>>16)&0xFF)]) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ + (s)[0x300 + ( (x) &0xFF)])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Blowfish_encipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t Xl;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t Xr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t *s = c->S[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t *p = c->P;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Xl = *xl;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Xr = *xr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Xl ^= p[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *xl = Xr ^ p[17];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *xr = Xl;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(Blowfish_encipher);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Blowfish_decipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t Xl;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t Xr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t *s = c->S[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t *p = c->P;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Xl = *xl;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Xr = *xr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Xl ^= p[17];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *xl = Xr ^ p[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *xr = Xl;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(Blowfish_decipher);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Blowfish_initstate(blf_ctx *c)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* P-box and S-box tables initialized with digits of Pi */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static const blf_ctx initstate =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ { {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x9216d5d9, 0x8979fb1b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *c = initstate;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(Blowfish_initstate);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+u_int32_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Blowfish_stream2word(const u_int8_t *data, u_int16_t databytes,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int16_t *current)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int8_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int16_t j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t temp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ temp = 0x00000000;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j = *current;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < 4; i++, j++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (j >= databytes)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ temp = (temp << 8) | data[j];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *current = j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return temp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(Blowfish_stream2word);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Blowfish_expand0state(blf_ctx *c, const u_int8_t *key, u_int16_t keybytes)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int16_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int16_t j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int16_t k;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t temp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t datal;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t datar;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < BLF_N + 2; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Extract 4 int8 to 1 int32 from keystream */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ temp = Blowfish_stream2word(key, keybytes, &j);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c->P[i] = c->P[i] ^ temp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ datal = 0x00000000;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ datar = 0x00000000;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < BLF_N + 2; i += 2) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_encipher(c, &datal, &datar);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c->P[i] = datal;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c->P[i + 1] = datar;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < 4; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (k = 0; k < 256; k += 2) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_encipher(c, &datal, &datar);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c->S[i][k] = datal;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c->S[i][k + 1] = datar;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(Blowfish_expand0state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Blowfish_expandstate(blf_ctx *c, const u_int8_t *data, u_int16_t databytes,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const u_int8_t *key, u_int16_t keybytes)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int16_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int16_t j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int16_t k;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t temp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t datal;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t datar;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < BLF_N + 2; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Extract 4 int8 to 1 int32 from keystream */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ temp = Blowfish_stream2word(key, keybytes, &j);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c->P[i] = c->P[i] ^ temp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ datal = 0x00000000;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ datar = 0x00000000;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < BLF_N + 2; i += 2) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ datal ^= Blowfish_stream2word(data, databytes, &j);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ datar ^= Blowfish_stream2word(data, databytes, &j);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_encipher(c, &datal, &datar);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c->P[i] = datal;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c->P[i + 1] = datar;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < 4; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (k = 0; k < 256; k += 2) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ datal ^= Blowfish_stream2word(data, databytes, &j);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ datar ^= Blowfish_stream2word(data, databytes, &j);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_encipher(c, &datal, &datar);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c->S[i][k] = datal;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c->S[i][k + 1] = datar;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(Blowfish_expandstate);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+blf_key(blf_ctx *c, const u_int8_t *k, u_int16_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Initialize S-boxes and subkeys with Pi */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_initstate(c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Transform S-boxes and subkeys with key */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_expand0state(c, k, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(blf_key);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+blf_enc(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t *d;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int16_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ d = data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < blocks; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_encipher(c, d, d + 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ d += 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(blf_enc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+blf_dec(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t *d;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int16_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ d = data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < blocks; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_decipher(c, d, d + 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ d += 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(blf_dec);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+blf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t l, r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < len; i += 8) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_encipher(c, &l, &r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[0] = l >> 24 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[1] = l >> 16 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[2] = l >> 8 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[3] = l & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[4] = r >> 24 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[5] = r >> 16 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[6] = r >> 8 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[7] = r & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data += 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(blf_ecb_encrypt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+blf_ecb_decrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t l, r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < len; i += 8) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_decipher(c, &l, &r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[0] = l >> 24 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[1] = l >> 16 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[2] = l >> 8 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[3] = l & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[4] = r >> 24 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[5] = r >> 16 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[6] = r >> 8 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[7] = r & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data += 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(blf_ecb_decrypt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+blf_cbc_encrypt(blf_ctx *c, u_int8_t *iv, u_int8_t *data, u_int32_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t l, r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t i, j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < len; i += 8) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (j = 0; j < 8; j++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[j] ^= iv[j];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_encipher(c, &l, &r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[0] = l >> 24 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[1] = l >> 16 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[2] = l >> 8 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[3] = l & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[4] = r >> 24 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[5] = r >> 16 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[6] = r >> 8 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[7] = r & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ iv = data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data += 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(blf_cbc_encrypt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+blf_cbc_decrypt(blf_ctx *c, u_int8_t *iva, u_int8_t *data, u_int32_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t l, r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int8_t *iv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t i, j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ iv = data + len - 16;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data = data + len - 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = len - 8; i >= 8; i -= 8) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_decipher(c, &l, &r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[0] = l >> 24 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[1] = l >> 16 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[2] = l >> 8 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[3] = l & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[4] = r >> 24 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[5] = r >> 16 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[6] = r >> 8 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[7] = r & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (j = 0; j < 8; j++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[j] ^= iv[j];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ iv -= 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data -= 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_decipher(c, &l, &r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[0] = l >> 24 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[1] = l >> 16 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[2] = l >> 8 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[3] = l & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[4] = r >> 24 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[5] = r >> 16 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[6] = r >> 8 & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[7] = r & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (j = 0; j < 8; j++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[j] ^= iva[j];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(blf_cbc_decrypt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+report(u_int32_t data[], u_int16_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int16_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < len; i += 2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("Block %0hd: %08lx %08lx.\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ i / 2, data[i], data[i + 1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+main(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ blf_ctx c;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char key[] = "AAAAA";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char key2[] = "abcdefghijklmnopqrstuvwxyz";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t data[10];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t data2[] =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {0x424c4f57l, 0x46495348l};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int16_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* First test */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < 10; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data[i] = i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ blf_key(&c, (u_int8_t *) key, 5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ blf_enc(&c, data, 5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ blf_dec(&c, data, 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ blf_dec(&c, data + 2, 4);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("Should read as 0 - 9.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ report(data, 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Second test */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ blf_key(&c, (u_int8_t *) key2, strlen(key2));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ blf_enc(&c, data2, 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("\nShould read as: 0x324ed0fe 0xf413a203.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ report(data2, 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ blf_dec(&c, data2, 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ report(data2, 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/lib/libc/hash/helper.c b/vendor/signify-osx/src/lib/libc/hash/helper.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..f36d385e5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/lib/libc/hash/helper.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,117 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: helper.c,v 1.18 2019/06/28 13:32:41 deraadt Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2000 Poul-Henning Kamp <phk@FreeBSD.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * If we meet some day, and you think this stuff is worth it, you
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * can buy me a beer in return. Poul-Henning Kamp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/stat.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <errno.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <hashinc>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+HASHEnd(HASH_CTX *ctx, char *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int8_t digest[HASH_DIGEST_LENGTH];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static const char hex[] = "0123456789abcdef";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (buf == NULL && (buf = malloc(HASH_DIGEST_STRING_LENGTH)) == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ HASHFinal(digest, ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < HASH_DIGEST_LENGTH; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf[i + i] = hex[digest[i] >> 4];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf[i + i + 1] = hex[digest[i] & 0x0f];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf[i + i] = '\0';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(digest, sizeof(digest));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (buf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(HASHEnd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+HASHFileChunk(const char *filename, char *buf, off_t off, off_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct stat sb;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_char buffer[BUFSIZ];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ HASH_CTX ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int fd, save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ssize_t nr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ HASHInit(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((fd = open(filename, O_RDONLY)) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fstat(fd, &sb) == -1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ save_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ len = sb.st_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (off > 0 && lseek(fd, off, SEEK_SET) == -1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ save_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while ((nr = read(fd, buffer, MINIMUM(sizeof(buffer), len))) > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ HASHUpdate(&ctx, buffer, nr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len > 0 && (len -= nr) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ save_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (nr == -1 ? NULL : HASHEnd(&ctx, buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(HASHFileChunk);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+HASHFile(const char *filename, char *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (HASHFileChunk(filename, buf, 0, 0));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(HASHFile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+HASHData(const u_char *data, size_t len, char *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ HASH_CTX ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ HASHInit(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ HASHUpdate(&ctx, data, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (HASHEnd(&ctx, buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(HASHData);
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/lib/libc/hash/sha2.c b/vendor/signify-osx/src/lib/libc/hash/sha2.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..a756ec79b
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/lib/libc/hash/sha2.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,975 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: sha2.c,v 1.28 2019/07/23 12:35:22 dtucker Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * FILE: sha2.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * AUTHOR: Aaron D. Gifford <me@aarongifford.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2000-2001, Aaron D. Gifford
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Redistribution and use in source and binary forms, with or without
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * modification, are permitted provided that the following conditions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * are met:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 1. Redistributions of source code must retain the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * notice, this list of conditions and the following disclaimer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 2. Redistributions in binary form must reproduce the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * notice, this list of conditions and the following disclaimer in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * documentation and/or other materials provided with the distribution.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 3. Neither the name of the copyright holder nor the names of contributors
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * may be used to endorse or promote products derived from this software
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * without specific prior written permission.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * $From: sha2.c,v 1.1 2001/11/08 00:01:51 adg Exp adg $
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sha2.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * UNROLLED TRANSFORM LOOP NOTE:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * loop version for the hash transform rounds (defined using macros
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * later in this file). Either define on the command line, for example:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * cc -DSHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * or define below:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * #define SHA2_UNROLL_TRANSFORM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef SHA2_SMALL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if defined(__amd64__) || defined(__i386__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA2_UNROLL_TRANSFORM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*** SHA-224/256/384/512 Machine Architecture Definitions *****************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * BYTE_ORDER NOTE:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Please make sure that your system defines BYTE_ORDER. If your
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * architecture is little-endian, make sure it also defines
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * equivalent.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * If your system does not define the above, then you can do so by
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * hand like this:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * #define LITTLE_ENDIAN 1234
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * #define BIG_ENDIAN 4321
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * And for little-endian machines, add:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * #define BYTE_ORDER LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Or for big-endian machines:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * #define BYTE_ORDER BIG_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The FreeBSD machine this was written on defines BYTE_ORDER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * appropriately by including <sys/types.h> (which in turn includes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * <machine/endian.h> where the appropriate definitions are actually
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * made).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*** SHA-224/256/384/512 Various Length Definitions ***********************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* NOTE: Most of these are in sha2.h */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA224_SHORT_BLOCK_LENGTH (SHA224_BLOCK_LENGTH - 8)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA256_SHORT_BLOCK_LENGTH (SHA256_BLOCK_LENGTH - 8)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA384_SHORT_BLOCK_LENGTH (SHA384_BLOCK_LENGTH - 16)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SHA512_SHORT_BLOCK_LENGTH (SHA512_BLOCK_LENGTH - 16)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*** ENDIAN SPECIFIC COPY MACROS **************************************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BE_8_TO_32(dst, cp) do { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (dst) = (u_int32_t)(cp)[3] | ((u_int32_t)(cp)[2] << 8) | \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ((u_int32_t)(cp)[1] << 16) | ((u_int32_t)(cp)[0] << 24); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} while(0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BE_8_TO_64(dst, cp) do { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (dst) = (u_int64_t)(cp)[7] | ((u_int64_t)(cp)[6] << 8) | \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ((u_int64_t)(cp)[5] << 16) | ((u_int64_t)(cp)[4] << 24) | \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ((u_int64_t)(cp)[3] << 32) | ((u_int64_t)(cp)[2] << 40) | \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ((u_int64_t)(cp)[1] << 48) | ((u_int64_t)(cp)[0] << 56); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} while (0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BE_64_TO_8(cp, src) do { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (cp)[0] = (src) >> 56; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (cp)[1] = (src) >> 48; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (cp)[2] = (src) >> 40; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (cp)[3] = (src) >> 32; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (cp)[4] = (src) >> 24; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (cp)[5] = (src) >> 16; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (cp)[6] = (src) >> 8; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (cp)[7] = (src); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} while (0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BE_32_TO_8(cp, src) do { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (cp)[0] = (src) >> 24; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (cp)[1] = (src) >> 16; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (cp)[2] = (src) >> 8; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (cp)[3] = (src); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} while (0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Macro for incrementally adding the unsigned 64-bit integer n to the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * unsigned 128-bit integer (represented using a two-element array of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 64-bit words):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ADDINC128(w,n) do { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (w)[0] += (u_int64_t)(n); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((w)[0] < (n)) { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (w)[1]++; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} while (0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*** THE SIX LOGICAL FUNCTIONS ****************************************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Bit shifting and rotation (used by the six SHA-XYZ logical functions:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * NOTE: The naming of R and S appears backwards here (R is a SHIFT and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * S is a ROTATION) because the SHA-224/256/384/512 description document
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * same "backwards" definition.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Shift-right (used in SHA-224, SHA-256, SHA-384, and SHA-512): */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define R(b,x) ((x) >> (b))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* 32-bit Rotate-right (used in SHA-224 and SHA-256): */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define S32(b,x) (((x) >> (b)) | ((x) << (32 - (b))))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define S64(b,x) (((x) >> (b)) | ((x) << (64 - (b))))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Two of six logical functions used in SHA-224, SHA-256, SHA-384, and SHA-512: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Four of six logical functions used in SHA-224 and SHA-256: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define Sigma0_256(x) (S32(2, (x)) ^ S32(13, (x)) ^ S32(22, (x)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define Sigma1_256(x) (S32(6, (x)) ^ S32(11, (x)) ^ S32(25, (x)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sigma0_256(x) (S32(7, (x)) ^ S32(18, (x)) ^ R(3 , (x)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sigma1_256(x) (S32(17, (x)) ^ S32(19, (x)) ^ R(10, (x)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Four of six logical functions used in SHA-384 and SHA-512: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sigma0_512(x) (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7, (x)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R( 6, (x)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Hash constant words K for SHA-224 and SHA-256: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const u_int32_t K256[64] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Initial hash value H for SHA-256: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const u_int32_t sha256_initial_hash_value[8] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x6a09e667UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xbb67ae85UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3c6ef372UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa54ff53aUL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x510e527fUL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x9b05688cUL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1f83d9abUL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5be0cd19UL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Hash constant words K for SHA-384 and SHA-512: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const u_int64_t K512[80] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Initial hash value H for SHA-512 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const u_int64_t sha512_initial_hash_value[8] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x6a09e667f3bcc908ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xbb67ae8584caa73bULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3c6ef372fe94f82bULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa54ff53a5f1d36f1ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x510e527fade682d1ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x9b05688c2b3e6c1fULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x1f83d9abfb41bd6bULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5be0cd19137e2179ULL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if !defined(SHA2_SMALL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Initial hash value H for SHA-224: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const u_int32_t sha224_initial_hash_value[8] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xc1059ed8UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x367cd507UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x3070dd17UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xf70e5939UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xffc00b31UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x68581511UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x64f98fa7UL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xbefa4fa4UL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Initial hash value H for SHA-384 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const u_int64_t sha384_initial_hash_value[8] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xcbbb9d5dc1059ed8ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x629a292a367cd507ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x9159015a3070dd17ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x152fecd8f70e5939ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x67332667ffc00b31ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x8eb44a8768581511ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xdb0c2e0d64f98fa7ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x47b5481dbefa4fa4ULL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Initial hash value H for SHA-512-256 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const u_int64_t sha512_256_initial_hash_value[8] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x22312194fc2bf72cULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x9f555fa3c84c64c2ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x2393b86b6f53b151ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x963877195940eabdULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x96283ee2a88effe3ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xbe5e1e2553863992ULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x2b0199fc2c85b8aaULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x0eb72ddc81c52ca2ULL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*** SHA-224: *********************************************************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA224Init(SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(context->state.st32, sha224_initial_hash_value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sizeof(sha224_initial_hash_value));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(context->buffer, 0, sizeof(context->buffer));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->bitcount[0] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA224Init);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+MAKE_CLONE(SHA224Transform, SHA256Transform);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+MAKE_CLONE(SHA224Update, SHA256Update);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+MAKE_CLONE(SHA224Pad, SHA256Pad);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA224Transform);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA224Update);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA224Pad);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA224Final(u_int8_t digest[SHA224_DIGEST_LENGTH], SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA224Pad(context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if BYTE_ORDER == LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Convert TO host byte order */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < 7; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BE_32_TO_8(digest + i * 4, context->state.st32[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(digest, context->state.st32, SHA224_DIGEST_LENGTH);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(context, sizeof(*context));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA224Final);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* !defined(SHA2_SMALL) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*** SHA-256: *********************************************************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA256Init(SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(context->state.st32, sha256_initial_hash_value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sizeof(sha256_initial_hash_value));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(context->buffer, 0, sizeof(context->buffer));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->bitcount[0] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA256Init);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef SHA2_UNROLL_TRANSFORM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Unrolled SHA-256 round macros: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) do { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BE_8_TO_32(W256[j], data); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data += 4; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ T1 = (h) + Sigma1_256((e)) + Ch((e), (f), (g)) + K256[j] + W256[j]; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (d) += T1; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (h) = T1 + Sigma0_256((a)) + Maj((a), (b), (c)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j++; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} while(0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ROUND256(a,b,c,d,e,f,g,h) do { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s0 = W256[(j+1)&0x0f]; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s0 = sigma0_256(s0); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s1 = W256[(j+14)&0x0f]; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s1 = sigma1_256(s1); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ T1 = (h) + Sigma1_256((e)) + Ch((e), (f), (g)) + K256[j] + \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (d) += T1; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (h) = T1 + Sigma0_256((a)) + Maj((a), (b), (c)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j++; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} while(0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA256Transform(u_int32_t state[8], const u_int8_t data[SHA256_BLOCK_LENGTH])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t a, b, c, d, e, f, g, h, s0, s1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t T1, W256[16];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Initialize registers with the prev. intermediate value */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a = state[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ b = state[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c = state[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ d = state[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ e = state[4];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ f = state[5];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ g = state[6];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h = state[7];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Rounds 0 to 15 (unrolled): */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } while (j < 16);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Now for the remaining rounds up to 63: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256(a,b,c,d,e,f,g,h);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256(h,a,b,c,d,e,f,g);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256(g,h,a,b,c,d,e,f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256(f,g,h,a,b,c,d,e);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256(e,f,g,h,a,b,c,d);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256(d,e,f,g,h,a,b,c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256(c,d,e,f,g,h,a,b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND256(b,c,d,e,f,g,h,a);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } while (j < 64);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Compute the current intermediate hash value */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[0] += a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[1] += b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[2] += c;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[3] += d;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[4] += e;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[5] += f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[6] += g;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[7] += h;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Clean up */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a = b = c = d = e = f = g = h = T1 = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else /* SHA2_UNROLL_TRANSFORM */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA256Transform(u_int32_t state[8], const u_int8_t data[SHA256_BLOCK_LENGTH])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t a, b, c, d, e, f, g, h, s0, s1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int32_t T1, T2, W256[16];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Initialize registers with the prev. intermediate value */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a = state[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ b = state[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c = state[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ d = state[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ e = state[4];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ f = state[5];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ g = state[6];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h = state[7];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BE_8_TO_32(W256[j], data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data += 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Apply the SHA-256 compression function to update a..h */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ T2 = Sigma0_256(a) + Maj(a, b, c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h = g;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ g = f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ f = e;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ e = d + T1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ d = c;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c = b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ b = a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a = T1 + T2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } while (j < 16);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Part of the message block expansion: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s0 = W256[(j+1)&0x0f];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s0 = sigma0_256(s0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s1 = W256[(j+14)&0x0f];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s1 = sigma1_256(s1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Apply the SHA-256 compression function to update a..h */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ T2 = Sigma0_256(a) + Maj(a, b, c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h = g;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ g = f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ f = e;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ e = d + T1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ d = c;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c = b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ b = a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a = T1 + T2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } while (j < 64);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Compute the current intermediate hash value */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[0] += a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[1] += b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[2] += c;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[3] += d;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[4] += e;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[5] += f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[6] += g;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[7] += h;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Clean up */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a = b = c = d = e = f = g = h = T1 = T2 = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* SHA2_UNROLL_TRANSFORM */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA256Transform);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA256Update(SHA2_CTX *context, const u_int8_t *data, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int64_t freespace, usedspace;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Calling with no data is valid (we do nothing) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usedspace = (context->bitcount[0] >> 3) % SHA256_BLOCK_LENGTH;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (usedspace > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Calculate how much free space is available in the buffer */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ freespace = SHA256_BLOCK_LENGTH - usedspace;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len >= freespace) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Fill the buffer completely and process it */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(&context->buffer[usedspace], data, freespace);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->bitcount[0] += freespace << 3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ len -= freespace;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data += freespace;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256Transform(context->state.st32, context->buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* The buffer is not yet full */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(&context->buffer[usedspace], data, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->bitcount[0] += (u_int64_t)len << 3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Clean up: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usedspace = freespace = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (len >= SHA256_BLOCK_LENGTH) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Process as many complete blocks as we can */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256Transform(context->state.st32, data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->bitcount[0] += SHA256_BLOCK_LENGTH << 3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ len -= SHA256_BLOCK_LENGTH;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data += SHA256_BLOCK_LENGTH;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* There's left-overs, so save 'em */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(context->buffer, data, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->bitcount[0] += len << 3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Clean up: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usedspace = freespace = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA256Update);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA256Pad(SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int usedspace;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usedspace = (context->bitcount[0] >> 3) % SHA256_BLOCK_LENGTH;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (usedspace > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Begin padding with a 1 bit: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->buffer[usedspace++] = 0x80;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (usedspace <= SHA256_SHORT_BLOCK_LENGTH) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Set-up for the last transform: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(&context->buffer[usedspace], 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256_SHORT_BLOCK_LENGTH - usedspace);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (usedspace < SHA256_BLOCK_LENGTH) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(&context->buffer[usedspace], 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256_BLOCK_LENGTH - usedspace);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Do second-to-last transform: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256Transform(context->state.st32, context->buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Prepare for last transform: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(context->buffer, 0, SHA256_SHORT_BLOCK_LENGTH);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Set-up for the last transform: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(context->buffer, 0, SHA256_SHORT_BLOCK_LENGTH);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Begin padding with a 1 bit: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *context->buffer = 0x80;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Store the length of input data (in bits) in big endian format: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BE_64_TO_8(&context->buffer[SHA256_SHORT_BLOCK_LENGTH],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->bitcount[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Final transform: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256Transform(context->state.st32, context->buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Clean up: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usedspace = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA256Pad);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA256Final(u_int8_t digest[SHA256_DIGEST_LENGTH], SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256Pad(context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if BYTE_ORDER == LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Convert TO host byte order */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < 8; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BE_32_TO_8(digest + i * 4, context->state.st32[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(digest, context->state.st32, SHA256_DIGEST_LENGTH);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(context, sizeof(*context));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA256Final);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*** SHA-512: *********************************************************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512Init(SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(context->state.st64, sha512_initial_hash_value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sizeof(sha512_initial_hash_value));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(context->buffer, 0, sizeof(context->buffer));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->bitcount[0] = context->bitcount[1] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512Init);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef SHA2_UNROLL_TRANSFORM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Unrolled SHA-512 round macros: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) do { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BE_8_TO_64(W512[j], data); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data += 8; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ T1 = (h) + Sigma1_512((e)) + Ch((e), (f), (g)) + K512[j] + W512[j]; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (d) += T1; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (h) = T1 + Sigma0_512((a)) + Maj((a), (b), (c)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j++; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} while(0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ROUND512(a,b,c,d,e,f,g,h) do { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s0 = W512[(j+1)&0x0f]; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s0 = sigma0_512(s0); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s1 = W512[(j+14)&0x0f]; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s1 = sigma1_512(s1); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ T1 = (h) + Sigma1_512((e)) + Ch((e), (f), (g)) + K512[j] + \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (d) += T1; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (h) = T1 + Sigma0_512((a)) + Maj((a), (b), (c)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j++; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} while(0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512Transform(u_int64_t state[8], const u_int8_t data[SHA512_BLOCK_LENGTH])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int64_t a, b, c, d, e, f, g, h, s0, s1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int64_t T1, W512[16];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Initialize registers with the prev. intermediate value */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a = state[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ b = state[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c = state[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ d = state[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ e = state[4];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ f = state[5];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ g = state[6];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h = state[7];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Rounds 0 to 15 (unrolled): */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } while (j < 16);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Now for the remaining rounds up to 79: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512(a,b,c,d,e,f,g,h);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512(h,a,b,c,d,e,f,g);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512(g,h,a,b,c,d,e,f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512(f,g,h,a,b,c,d,e);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512(e,f,g,h,a,b,c,d);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512(d,e,f,g,h,a,b,c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512(c,d,e,f,g,h,a,b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ROUND512(b,c,d,e,f,g,h,a);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } while (j < 80);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Compute the current intermediate hash value */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[0] += a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[1] += b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[2] += c;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[3] += d;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[4] += e;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[5] += f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[6] += g;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[7] += h;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Clean up */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a = b = c = d = e = f = g = h = T1 = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else /* SHA2_UNROLL_TRANSFORM */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512Transform(u_int64_t state[8], const u_int8_t data[SHA512_BLOCK_LENGTH])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int64_t a, b, c, d, e, f, g, h, s0, s1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int64_t T1, T2, W512[16];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Initialize registers with the prev. intermediate value */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a = state[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ b = state[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c = state[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ d = state[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ e = state[4];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ f = state[5];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ g = state[6];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h = state[7];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BE_8_TO_64(W512[j], data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data += 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Apply the SHA-512 compression function to update a..h */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ T2 = Sigma0_512(a) + Maj(a, b, c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h = g;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ g = f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ f = e;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ e = d + T1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ d = c;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c = b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ b = a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a = T1 + T2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } while (j < 16);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Part of the message block expansion: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s0 = W512[(j+1)&0x0f];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s0 = sigma0_512(s0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s1 = W512[(j+14)&0x0f];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s1 = sigma1_512(s1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Apply the SHA-512 compression function to update a..h */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ T2 = Sigma0_512(a) + Maj(a, b, c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h = g;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ g = f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ f = e;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ e = d + T1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ d = c;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c = b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ b = a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a = T1 + T2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } while (j < 80);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Compute the current intermediate hash value */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[0] += a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[1] += b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[2] += c;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[3] += d;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[4] += e;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[5] += f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[6] += g;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state[7] += h;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Clean up */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a = b = c = d = e = f = g = h = T1 = T2 = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* SHA2_UNROLL_TRANSFORM */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512Transform);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512Update(SHA2_CTX *context, const u_int8_t *data, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t freespace, usedspace;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Calling with no data is valid (we do nothing) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (usedspace > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Calculate how much free space is available in the buffer */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ freespace = SHA512_BLOCK_LENGTH - usedspace;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len >= freespace) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Fill the buffer completely and process it */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(&context->buffer[usedspace], data, freespace);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ADDINC128(context->bitcount, freespace << 3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ len -= freespace;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data += freespace;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Transform(context->state.st64, context->buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* The buffer is not yet full */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(&context->buffer[usedspace], data, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ADDINC128(context->bitcount, len << 3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Clean up: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usedspace = freespace = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (len >= SHA512_BLOCK_LENGTH) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Process as many complete blocks as we can */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Transform(context->state.st64, data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ len -= SHA512_BLOCK_LENGTH;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data += SHA512_BLOCK_LENGTH;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* There's left-overs, so save 'em */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(context->buffer, data, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ADDINC128(context->bitcount, len << 3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Clean up: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usedspace = freespace = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512Update);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512Pad(SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int usedspace;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (usedspace > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Begin padding with a 1 bit: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->buffer[usedspace++] = 0x80;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (usedspace <= SHA512_SHORT_BLOCK_LENGTH) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Set-up for the last transform: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(&context->buffer[usedspace], 0, SHA512_SHORT_BLOCK_LENGTH - usedspace);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (usedspace < SHA512_BLOCK_LENGTH) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(&context->buffer[usedspace], 0, SHA512_BLOCK_LENGTH - usedspace);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Do second-to-last transform: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Transform(context->state.st64, context->buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* And set-up for the last transform: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(context->buffer, 0, SHA512_BLOCK_LENGTH - 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Prepare for final transform: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(context->buffer, 0, SHA512_SHORT_BLOCK_LENGTH);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Begin padding with a 1 bit: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *context->buffer = 0x80;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Store the length of input data (in bits) in big endian format: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BE_64_TO_8(&context->buffer[SHA512_SHORT_BLOCK_LENGTH],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->bitcount[1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BE_64_TO_8(&context->buffer[SHA512_SHORT_BLOCK_LENGTH + 8],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->bitcount[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Final transform: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Transform(context->state.st64, context->buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Clean up: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usedspace = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512Pad);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512Final(u_int8_t digest[SHA512_DIGEST_LENGTH], SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Pad(context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if BYTE_ORDER == LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Convert TO host byte order */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < 8; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BE_64_TO_8(digest + i * 8, context->state.st64[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(digest, context->state.st64, SHA512_DIGEST_LENGTH);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(context, sizeof(*context));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512Final);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if !defined(SHA2_SMALL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*** SHA-384: *********************************************************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA384Init(SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(context->state.st64, sha384_initial_hash_value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sizeof(sha384_initial_hash_value));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(context->buffer, 0, sizeof(context->buffer));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->bitcount[0] = context->bitcount[1] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA384Init);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+MAKE_CLONE(SHA384Transform, SHA512Transform);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+MAKE_CLONE(SHA384Update, SHA512Update);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+MAKE_CLONE(SHA384Pad, SHA512Pad);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA384Transform);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA384Update);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA384Pad);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA384Final(u_int8_t digest[SHA384_DIGEST_LENGTH], SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA384Pad(context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if BYTE_ORDER == LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Convert TO host byte order */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < 6; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BE_64_TO_8(digest + i * 8, context->state.st64[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(digest, context->state.st64, SHA384_DIGEST_LENGTH);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Zero out state data */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(context, sizeof(*context));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA384Final);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*** SHA-512/256: *********************************************************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512_256Init(SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(context->state.st64, sha512_256_initial_hash_value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sizeof(sha512_256_initial_hash_value));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(context->buffer, 0, sizeof(context->buffer));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ context->bitcount[0] = context->bitcount[1] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512_256Init);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+MAKE_CLONE(SHA512_256Transform, SHA512Transform);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+MAKE_CLONE(SHA512_256Update, SHA512Update);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+MAKE_CLONE(SHA512_256Pad, SHA512Pad);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512_256Transform);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512_256Update);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512_256Pad);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512_256Final(u_int8_t digest[SHA512_256_DIGEST_LENGTH], SHA2_CTX *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512_256Pad(context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if BYTE_ORDER == LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Convert TO host byte order */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < 4; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BE_64_TO_8(digest + i * 8, context->state.st64[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(digest, context->state.st64, SHA512_256_DIGEST_LENGTH);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Zero out state data */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(context, sizeof(*context));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512_256Final);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* !defined(SHA2_SMALL) */
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/lib/libc/hash/sha256hl.c b/vendor/signify-osx/src/lib/libc/hash/sha256hl.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..f6549d068
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/lib/libc/hash/sha256hl.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,117 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: helper.c,v 1.18 2019/06/28 13:32:41 deraadt Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2000 Poul-Henning Kamp <phk@FreeBSD.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * If we meet some day, and you think this stuff is worth it, you
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * can buy me a beer in return. Poul-Henning Kamp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/stat.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <errno.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sha2.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA256End(SHA2_CTX *ctx, char *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int8_t digest[SHA256_DIGEST_LENGTH];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static const char hex[] = "0123456789abcdef";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (buf == NULL && (buf = malloc(SHA256_DIGEST_STRING_LENGTH)) == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256Final(digest, ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < SHA256_DIGEST_LENGTH; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf[i + i] = hex[digest[i] >> 4];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf[i + i + 1] = hex[digest[i] & 0x0f];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf[i + i] = '\0';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(digest, sizeof(digest));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (buf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA256End);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA256FileChunk(const char *filename, char *buf, off_t off, off_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct stat sb;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_char buffer[BUFSIZ];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA2_CTX ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int fd, save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ssize_t nr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256Init(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((fd = open(filename, O_RDONLY)) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fstat(fd, &sb) == -1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ save_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ len = sb.st_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (off > 0 && lseek(fd, off, SEEK_SET) == -1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ save_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while ((nr = read(fd, buffer, MINIMUM(sizeof(buffer), len))) > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256Update(&ctx, buffer, nr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len > 0 && (len -= nr) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ save_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (nr == -1 ? NULL : SHA256End(&ctx, buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA256FileChunk);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA256File(const char *filename, char *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (SHA256FileChunk(filename, buf, 0, 0));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA256File);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA256Data(const u_char *data, size_t len, char *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA2_CTX ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256Init(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA256Update(&ctx, data, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (SHA256End(&ctx, buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA256Data);
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/lib/libc/hash/sha512_256hl.c b/vendor/signify-osx/src/lib/libc/hash/sha512_256hl.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..df9eace0b
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/lib/libc/hash/sha512_256hl.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,117 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: helper.c,v 1.18 2019/06/28 13:32:41 deraadt Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2000 Poul-Henning Kamp <phk@FreeBSD.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * If we meet some day, and you think this stuff is worth it, you
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * can buy me a beer in return. Poul-Henning Kamp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/stat.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <errno.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sha2.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512_256End(SHA2_CTX *ctx, char *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int8_t digest[SHA512_256_DIGEST_LENGTH];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static const char hex[] = "0123456789abcdef";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (buf == NULL && (buf = malloc(SHA512_256_DIGEST_STRING_LENGTH)) == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512_256Final(digest, ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < SHA512_256_DIGEST_LENGTH; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf[i + i] = hex[digest[i] >> 4];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf[i + i + 1] = hex[digest[i] & 0x0f];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf[i + i] = '\0';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(digest, sizeof(digest));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (buf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512_256End);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512_256FileChunk(const char *filename, char *buf, off_t off, off_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct stat sb;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_char buffer[BUFSIZ];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA2_CTX ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int fd, save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ssize_t nr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512_256Init(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((fd = open(filename, O_RDONLY)) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fstat(fd, &sb) == -1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ save_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ len = sb.st_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (off > 0 && lseek(fd, off, SEEK_SET) == -1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ save_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while ((nr = read(fd, buffer, MINIMUM(sizeof(buffer), len))) > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512_256Update(&ctx, buffer, nr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len > 0 && (len -= nr) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ save_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (nr == -1 ? NULL : SHA512_256End(&ctx, buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512_256FileChunk);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512_256File(const char *filename, char *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (SHA512_256FileChunk(filename, buf, 0, 0));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512_256File);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512_256Data(const u_char *data, size_t len, char *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA2_CTX ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512_256Init(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512_256Update(&ctx, data, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (SHA512_256End(&ctx, buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512_256Data);
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/lib/libc/hash/sha512hl.c b/vendor/signify-osx/src/lib/libc/hash/sha512hl.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..68f6a2dbc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/lib/libc/hash/sha512hl.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,117 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: helper.c,v 1.18 2019/06/28 13:32:41 deraadt Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2000 Poul-Henning Kamp <phk@FreeBSD.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * If we meet some day, and you think this stuff is worth it, you
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * can buy me a beer in return. Poul-Henning Kamp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/stat.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <errno.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sha2.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512End(SHA2_CTX *ctx, char *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_int8_t digest[SHA512_DIGEST_LENGTH];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static const char hex[] = "0123456789abcdef";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (buf == NULL && (buf = malloc(SHA512_DIGEST_STRING_LENGTH)) == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Final(digest, ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < SHA512_DIGEST_LENGTH; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf[i + i] = hex[digest[i] >> 4];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf[i + i + 1] = hex[digest[i] & 0x0f];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf[i + i] = '\0';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(digest, sizeof(digest));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (buf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512End);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512FileChunk(const char *filename, char *buf, off_t off, off_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct stat sb;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ u_char buffer[BUFSIZ];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA2_CTX ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int fd, save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ssize_t nr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Init(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((fd = open(filename, O_RDONLY)) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fstat(fd, &sb) == -1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ save_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ len = sb.st_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (off > 0 && lseek(fd, off, SEEK_SET) == -1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ save_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while ((nr = read(fd, buffer, MINIMUM(sizeof(buffer), len))) > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Update(&ctx, buffer, nr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len > 0 && (len -= nr) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ save_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (nr == -1 ? NULL : SHA512End(&ctx, buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512FileChunk);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512File(const char *filename, char *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (SHA512FileChunk(filename, buf, 0, 0));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512File);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+SHA512Data(const u_char *data, size_t len, char *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA2_CTX ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Init(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Update(&ctx, data, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (SHA512End(&ctx, buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(SHA512Data);
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/lib/libc/net/base64.c b/vendor/signify-osx/src/lib/libc/net/base64.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..f36c11a21
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/lib/libc/net/base64.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,307 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: base64.c,v 1.15 2021/10/25 14:41:09 jca Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 1996 by Internet Software Consortium.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Portions Copyright (c) 1995 by International Business Machines, Inc.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * International Business Machines, Inc. (hereinafter called IBM) grants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * permission under its copyrights to use, copy, modify, and distribute this
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Software with or without fee, provided that the above copyright notice and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * all paragraphs of this notice appear in all copies, and that the name of IBM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * not be used in connection with the marketing of any product incorporating
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the Software or modifications thereof, without specific, written prior
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * permission.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * To the extent it has a right to do so, IBM grants an immunity from suit
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * under its patents, if any, for the use, sale or manufacture of products to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the extent that such products are used for performing Domain Name System
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * dynamic updates in TCP/IP networks by means of the Software. No immunity is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * granted for any product per se or for any other function of any product.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/socket.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <netinet/in.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <arpa/inet.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <ctype.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <resolv.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const char Base64[] =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const char Pad64 = '=';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ The following encoding technique is taken from RFC 1521 by Borenstein
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ and Freed. It is reproduced here in a slightly edited form for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ convenience.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ A 65-character subset of US-ASCII is used, enabling 6 bits to be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ represented per printable character. (The extra 65th character, "=",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ is used to signify a special processing function.)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ The encoding process represents 24-bit groups of input bits as output
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ strings of 4 encoded characters. Proceeding from left to right, a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 24-bit input group is formed by concatenating 3 8-bit input groups.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ These 24 bits are then treated as 4 concatenated 6-bit groups, each
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ of which is translated into a single digit in the base64 alphabet.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Each 6-bit group is used as an index into an array of 64 printable
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ characters. The character referenced by the index is placed in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ output string.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Table 1: The Base64 Alphabet
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Value Encoding Value Encoding Value Encoding Value Encoding
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0 A 17 R 34 i 51 z
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 B 18 S 35 j 52 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 2 C 19 T 36 k 53 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 3 D 20 U 37 l 54 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 4 E 21 V 38 m 55 3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 5 F 22 W 39 n 56 4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 6 G 23 X 40 o 57 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 7 H 24 Y 41 p 58 6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 8 I 25 Z 42 q 59 7
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 9 J 26 a 43 r 60 8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 10 K 27 b 44 s 61 9
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 11 L 28 c 45 t 62 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 12 M 29 d 46 u 63 /
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 13 N 30 e 47 v
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 14 O 31 f 48 w (pad) =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 15 P 32 g 49 x
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 16 Q 33 h 50 y
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Special processing is performed if fewer than 24 bits are available
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ at the end of the data being encoded. A full encoding quantum is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ always completed at the end of a quantity. When fewer than 24 input
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bits are available in an input group, zero bits are added (on the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ right) to form an integral number of 6-bit groups. Padding at the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ end of the data is performed using the '=' character.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Since all base64 input is an integral number of octets, only the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ -------------------------------------------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ following cases can arise:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (1) the final quantum of encoding input is an integral
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ multiple of 24 bits; here, the final unit of encoded
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ output will be an integral multiple of 4 characters
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ with no "=" padding,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (2) the final quantum of encoding input is exactly 8 bits;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ here, the final unit of encoded output will be two
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ characters followed by two "=" padding characters, or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (3) the final quantum of encoding input is exactly 16 bits;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ here, the final unit of encoded output will be three
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ characters followed by one "=" padding character.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+b64_ntop(unsigned char const *src, size_t srclength, char *target,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t targsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t datalength = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char input[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char output[4];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (2 < srclength) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ input[0] = *src++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ input[1] = *src++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ input[2] = *src++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ srclength -= 3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ output[0] = input[0] >> 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ output[3] = input[2] & 0x3f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (datalength + 4 > targsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[datalength++] = Base64[output[0]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[datalength++] = Base64[output[1]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[datalength++] = Base64[output[2]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[datalength++] = Base64[output[3]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Now we worry about padding. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (0 != srclength) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Get what's left. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ input[0] = input[1] = input[2] = '\0';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < srclength; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ input[i] = *src++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ output[0] = input[0] >> 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (datalength + 4 > targsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[datalength++] = Base64[output[0]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[datalength++] = Base64[output[1]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (srclength == 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[datalength++] = Pad64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[datalength++] = Base64[output[2]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[datalength++] = Pad64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (datalength >= targsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[datalength] = '\0'; /* Returned value doesn't count \0. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (datalength);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* skips all whitespace anywhere.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ converts characters, four at a time, starting at (or after)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src from base - 64 numbers into three 8 bit bytes in the target area.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ it returns the number of data bytes stored at the target, or -1 on error.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+b64_pton(char const *src, unsigned char *target, size_t targsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int tarindex, state, ch;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char nextbyte;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *pos;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tarindex = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while ((ch = (unsigned char)*src++) != '\0') {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (isspace(ch)) /* Skip whitespace anywhere. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (ch == Pad64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pos = strchr(Base64, ch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pos == 0) /* A non-base64 character. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ switch (state) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 0:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (target) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (tarindex >= targsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[tarindex] = (pos - Base64) << 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 1:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (target) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (tarindex >= targsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[tarindex] |= (pos - Base64) >> 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ nextbyte = ((pos - Base64) & 0x0f) << 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (tarindex + 1 < targsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[tarindex+1] = nextbyte;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else if (nextbyte)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tarindex++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state = 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 2:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (target) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (tarindex >= targsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[tarindex] |= (pos - Base64) >> 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ nextbyte = ((pos - Base64) & 0x03) << 6;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (tarindex + 1 < targsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[tarindex+1] = nextbyte;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else if (nextbyte)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tarindex++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state = 3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 3:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (target) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (tarindex >= targsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[tarindex] |= (pos - Base64);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tarindex++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * We are done decoding Base-64 chars. Let's see if we ended
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * on a byte boundary, and/or with erroneous trailing characters.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (ch == Pad64) { /* We got a pad char. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ch = (unsigned char)*src++; /* Skip it, get next. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ switch (state) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 0: /* Invalid = in first position */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 1: /* Invalid = in second position */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 2: /* Valid, means one byte of info */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Skip any number of spaces. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (; ch != '\0'; ch = (unsigned char)*src++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!isspace(ch))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Make sure there is another trailing = sign. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (ch != Pad64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ch = (unsigned char)*src++; /* Skip the = */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Fall through to "single trailing =" case. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* FALLTHROUGH */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 3: /* Valid, means two bytes of info */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * We know this char is an =. Is there anything but
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * whitespace after it?
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (; ch != '\0'; ch = (unsigned char)*src++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!isspace(ch))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Now make sure for cases 2 and 3 that the "extra"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * bits that slopped past the last full byte were
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * zeros. If we don't check them, they become a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * subliminal channel.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (target && tarindex < targsize &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target[tarindex] != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * We ended by seeing the end of the string. Make sure we
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * have no partial bytes lying around.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (state != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (tarindex);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/lib/libc/string/explicit_bzero.c b/vendor/signify-osx/src/lib/libc/string/explicit_bzero.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..003ea7cc4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/lib/libc/string/explicit_bzero.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,20 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: explicit_bzero.c,v 1.4 2015/08/31 02:53:57 guenther Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Public domain.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Written by Matthew Dempsky.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+__attribute__((weak)) void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+__explicit_bzero_hook(void *buf, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+explicit_bzero(void *buf, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(buf, 0, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __explicit_bzero_hook(buf, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEF_WEAK(explicit_bzero);
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/lib/libutil/bcrypt_pbkdf.c b/vendor/signify-osx/src/lib/libutil/bcrypt_pbkdf.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..950dda891
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/lib/libutil/bcrypt_pbkdf.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,175 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: bcrypt_pbkdf.c,v 1.17 2022/12/27 17:10:08 jmc Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdint.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <blf.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sha2.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <util.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define MINIMUM(a,b) (((a) < (b)) ? (a) : (b))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * pkcs #5 pbkdf2 implementation using the "bcrypt" hash
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The bcrypt hash function is derived from the bcrypt password hashing
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * function with the following modifications:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 1. The input password and salt are preprocessed with SHA512.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 2. The output length is expanded to 256 bits.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 3. Subsequently the magic string to be encrypted is lengthened and modified
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * to "OxychromaticBlowfishSwatDynamite"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 4. The hash function is defined to perform 64 rounds of initial state
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * expansion. (More rounds are performed by iterating the hash.)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Note that this implementation pulls the SHA512 operations into the caller
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * as a performance optimization.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * One modification from official pbkdf2. Instead of outputting key material
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * linearly, we mix it. pbkdf2 has a known weakness where if one uses it to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * generate (e.g.) 512 bits of key material for use as two 256 bit keys, an
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * attacker can merely run once through the outer loop, but the user
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * always runs it twice. Shuffling output bytes requires computing the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * entirety of the key material to assemble any subkey. This is something a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * wise caller could do; we just do it for you.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BCRYPT_WORDS 8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BCRYPT_HASHSIZE (BCRYPT_WORDS * 4)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+bcrypt_hash(uint8_t *sha2pass, uint8_t *sha2salt, uint8_t *out)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ blf_ctx state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t ciphertext[BCRYPT_HASHSIZE] =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "OxychromaticBlowfishSwatDynamite";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint32_t cdata[BCRYPT_WORDS];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint16_t j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t shalen = SHA512_DIGEST_LENGTH;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* key expansion */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_initstate(&state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_expandstate(&state, sha2salt, shalen, sha2pass, shalen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < 64; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_expand0state(&state, sha2salt, shalen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Blowfish_expand0state(&state, sha2pass, shalen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* encryption */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ j = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < BCRYPT_WORDS; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cdata[i] = Blowfish_stream2word(ciphertext, sizeof(ciphertext),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ &j);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < 64; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ blf_enc(&state, cdata, BCRYPT_WORDS / 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* copy out */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < BCRYPT_WORDS; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out[4 * i + 3] = (cdata[i] >> 24) & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out[4 * i + 2] = (cdata[i] >> 16) & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out[4 * i + 1] = (cdata[i] >> 8) & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out[4 * i + 0] = cdata[i] & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* zap */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(ciphertext, sizeof(ciphertext));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(cdata, sizeof(cdata));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(&state, sizeof(state));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+bcrypt_pbkdf(const char *pass, size_t passlen, const uint8_t *salt, size_t saltlen,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *key, size_t keylen, unsigned int rounds)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA2_CTX ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t sha2pass[SHA512_DIGEST_LENGTH];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t sha2salt[SHA512_DIGEST_LENGTH];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t out[BCRYPT_HASHSIZE];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t tmpout[BCRYPT_HASHSIZE];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t countsalt[4];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t i, j, amt, stride;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint32_t count;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t origkeylen = keylen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* nothing crazy */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (rounds < 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ goto bad;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (passlen == 0 || saltlen == 0 || keylen == 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ keylen > sizeof(out) * sizeof(out))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ goto bad;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stride = (keylen + sizeof(out) - 1) / sizeof(out);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ amt = (keylen + stride - 1) / stride;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* collapse password */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Init(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Update(&ctx, pass, passlen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Final(sha2pass, &ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* generate key, sizeof(out) at a time */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (count = 1; keylen > 0; count++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ countsalt[0] = (count >> 24) & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ countsalt[1] = (count >> 16) & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ countsalt[2] = (count >> 8) & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ countsalt[3] = count & 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* first round, salt is salt */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Init(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Update(&ctx, salt, saltlen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Update(&ctx, countsalt, sizeof(countsalt));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Final(sha2salt, &ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bcrypt_hash(sha2pass, sha2salt, tmpout);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(out, tmpout, sizeof(out));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 1; i < rounds; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* subsequent rounds, salt is previous output */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Init(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Update(&ctx, tmpout, sizeof(tmpout));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Final(sha2salt, &ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bcrypt_hash(sha2pass, sha2salt, tmpout);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (j = 0; j < sizeof(out); j++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out[j] ^= tmpout[j];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * pbkdf2 deviation: output the key material non-linearly.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ amt = MINIMUM(amt, keylen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < amt; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t dest = i * stride + (count - 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (dest >= origkeylen)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ key[dest] = out[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ keylen -= i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* zap */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(&ctx, sizeof(ctx));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(out, sizeof(out));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(tmpout, sizeof(tmpout));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+bad:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* overwrite with random in case caller doesn't check return code */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ arc4random_buf(key, keylen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/lib/libutil/ohash.c b/vendor/signify-osx/src/lib/libutil/ohash.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..74ca4fafd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/lib/libutil/ohash.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,327 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: ohash.c,v 1.1 2014/06/02 18:52:03 deraadt Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stddef.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdint.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <limits.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "ohash.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct _ohash_record {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint32_t hv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define DELETED ((const char *)h)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define NONE (h->size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Don't bother changing the hash table if the change is small enough. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define MINSIZE (1UL << 4)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define MINDELETED 4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void ohash_resize(struct ohash *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* This handles the common case of variable length keys, where the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * key is stored at the end of the record.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_create_entry(struct ohash_info *i, const char *start, const char **end)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!*end)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *end = start + strlen(start);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ p = (i->alloc)(i->key_offset + (*end - start) + 1, i->data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (p) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(p+i->key_offset, start, *end-start);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ p[i->key_offset + (*end - start)] = '\0';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (void *)p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* hash_delete only frees the hash structure. Use hash_first/hash_next
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * to free entries as well. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_delete(struct ohash *h)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (h->info.free)(h->t, h->info.data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef NDEBUG
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_resize(struct ohash *h)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct _ohash_record *n;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t ns;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int i, incr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (4 * h->deleted < h->total) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (h->size >= (UINT_MAX >> 1U))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ns = UINT_MAX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ns = h->size << 1U;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else if (3 * h->deleted > 2 * h->total)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ns = h->size >> 1U;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ns = h->size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (ns < MINSIZE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ns = MINSIZE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef STATS_HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ STAT_HASH_EXPAND++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ STAT_HASH_SIZE += ns - h->size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ n = (h->info.calloc)(ns, sizeof(struct _ohash_record), h->info.data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!n)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (j = 0; j < h->size; j++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (h->t[j].p != NULL && h->t[j].p != DELETED) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ i = h->t[j].hv % ns;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ incr = ((h->t[j].hv % (ns - 2)) & ~1) + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (n[i].p != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ i += incr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (i >= ns)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ i -= ns;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ n[i].hv = h->t[j].hv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ n[i].p = h->t[j].p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (h->info.free)(h->t, h->info.data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t = n;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->size = ns;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->total -= h->deleted;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->deleted = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_remove(struct ohash *h, unsigned int i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void *result = (void *)h->t[i].p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (result == NULL || result == DELETED)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef STATS_HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ STAT_HASH_ENTRIES--;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t[i].p = DELETED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->deleted++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (h->deleted >= MINDELETED && 4 * h->deleted > h->total)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ohash_resize(h);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_find(struct ohash *h, unsigned int i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (h->t[i].p == DELETED)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (void *)h->t[i].p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_insert(struct ohash *h, unsigned int i, void *p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef STATS_HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ STAT_HASH_ENTRIES++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (h->t[i].p == DELETED) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->deleted--;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t[i].p = p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t[i].p = p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Arbitrary resize boundary. Tweak if not efficient enough. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (++h->total * 4 > h->size * 3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ohash_resize(h);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+unsigned int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_entries(struct ohash *h)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return h->total - h->deleted;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_first(struct ohash *h, unsigned int *pos)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *pos = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return ohash_next(h, pos);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_next(struct ohash *h, unsigned int *pos)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (; *pos < h->size; (*pos)++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (h->t[*pos].p != DELETED && h->t[*pos].p != NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (void *)h->t[(*pos)++].p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_init(struct ohash *h, unsigned int size, struct ohash_info *info)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->size = 1UL << size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (h->size < MINSIZE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->size = MINSIZE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef STATS_HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ STAT_HASH_CREATION++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ STAT_HASH_SIZE += h->size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Copy info so that caller may free it. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->info.key_offset = info->key_offset;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->info.calloc = info->calloc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->info.free = info->free;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->info.alloc = info->alloc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->info.data = info->data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t = (h->info.calloc)(h->size, sizeof(struct _ohash_record),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->info.data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->total = h->deleted = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+uint32_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_interval(const char *s, const char **e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint32_t k;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!*e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *e = s + strlen(s);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (s == *e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ k = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ k = *s++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (s != *e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ k = ((k << 2) | (k >> 30)) ^ *s++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return k;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+unsigned int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_lookup_interval(struct ohash *h, const char *start, const char *end,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint32_t hv)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int i, incr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int empty;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef STATS_HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ STAT_HASH_LOOKUP++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ empty = NONE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ i = hv % h->size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ incr = ((hv % (h->size-2)) & ~1) + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (h->t[i].p != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef STATS_HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ STAT_HASH_LENGTH++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (h->t[i].p == DELETED) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (empty == NONE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ empty = i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else if (h->t[i].hv == hv &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ strncmp(h->t[i].p+h->info.key_offset, start,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ end - start) == 0 &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (h->t[i].p+h->info.key_offset)[end-start] == '\0') {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (empty != NONE) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t[empty].hv = hv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t[empty].p = h->t[i].p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t[i].p = DELETED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return empty;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef STATS_HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ STAT_HASH_POSITIVE++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ i += incr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (i >= h->size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ i -= h->size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Found an empty position. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (empty != NONE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ i = empty;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t[i].hv = hv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+unsigned int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_lookup_memory(struct ohash *h, const char *k, size_t size, uint32_t hv)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int i, incr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int empty;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef STATS_HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ STAT_HASH_LOOKUP++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ empty = NONE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ i = hv % h->size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ incr = ((hv % (h->size-2)) & ~1) + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (h->t[i].p != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef STATS_HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ STAT_HASH_LENGTH++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (h->t[i].p == DELETED) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (empty == NONE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ empty = i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else if (h->t[i].hv == hv &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcmp(h->t[i].p+h->info.key_offset, k, size) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (empty != NONE) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t[empty].hv = hv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t[empty].p = h->t[i].p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t[i].p = DELETED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return empty;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef STATS_HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ STAT_HASH_POSITIVE++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } return i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ i += incr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (i >= h->size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ i -= h->size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Found an empty position. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (empty != NONE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ i = empty;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->t[i].hv = hv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+unsigned int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_qlookup(struct ohash *h, const char *s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *e = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return ohash_qlookupi(h, s, &e);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+unsigned int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ohash_qlookupi(struct ohash *h, const char *s, const char **e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint32_t hv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ hv = ohash_interval(s, e);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return ohash_lookup_interval(h, s, *e, hv);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/lib/libutil/ohash.h b/vendor/signify-osx/src/lib/libutil/ohash.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..c5f81ec0e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/lib/libutil/ohash.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,74 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: ohash.h,v 1.2 2014/06/02 18:52:03 deraadt Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef OHASH_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define OHASH_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Open hashing support.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Open hashing was chosen because it is much lighter than other hash
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * techniques, and more efficient in most cases.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* user-visible data structure */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct ohash_info {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ptrdiff_t key_offset;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void *data; /* user data */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void *(*calloc)(size_t, size_t, void *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void (*free)(void *, void *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void *(*alloc)(size_t, void *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct _ohash_record;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* private structure. It's there just so you can do a sizeof */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct ohash {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct _ohash_record *t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct ohash_info info;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int total;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int deleted;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* For this to be tweakable, we use small primitives, and leave part of the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * logic to the client application. e.g., hashing is left to the client
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * application. We also provide a simple table entry lookup that yields
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * a hashing table index (opaque) to be used in find/insert/remove.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The keys are stored at a known position in the client data.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+__BEGIN_DECLS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void ohash_init(struct ohash *, unsigned, struct ohash_info *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void ohash_delete(struct ohash *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+unsigned int ohash_lookup_interval(struct ohash *, const char *,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *, uint32_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+unsigned int ohash_lookup_memory(struct ohash *, const char *,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t, uint32_t)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__ ((__bounded__(__string__,2,3)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *ohash_find(struct ohash *, unsigned int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *ohash_remove(struct ohash *, unsigned int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *ohash_insert(struct ohash *, unsigned int, void *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *ohash_first(struct ohash *, unsigned int *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *ohash_next(struct ohash *, unsigned int *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+unsigned int ohash_entries(struct ohash *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *ohash_create_entry(struct ohash_info *, const char *, const char **);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+uint32_t ohash_interval(const char *, const char **);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+unsigned int ohash_qlookupi(struct ohash *, const char *, const char **);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+unsigned int ohash_qlookup(struct ohash *, const char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+__END_DECLS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/lib/libutil/util.h b/vendor/signify-osx/src/lib/libutil/util.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..bfc702fbc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/lib/libutil/util.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,129 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: util.h,v 1.38 2022/05/11 17:23:56 millert Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $NetBSD: util.h,v 1.2 1996/05/16 07:00:22 thorpej Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 1995
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The Regents of the University of California. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Portions Copyright (c) 1996, Jason Downs. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Redistribution and use in source and binary forms, with or without
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * modification, are permitted provided that the following conditions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * are met:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 1. Redistributions of source code must retain the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * notice, this list of conditions and the following disclaimer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 2. Redistributions in binary form must reproduce the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * notice, this list of conditions and the following disclaimer in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * documentation and/or other materials provided with the distribution.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 3. Neither the name of the University nor the names of its contributors
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * may be used to endorse or promote products derived from this software
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * without specific prior written permission.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef _UTIL_H_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define _UTIL_H_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * fparseln() specific operation flags.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define FPARSELN_UNESCESC 0x01
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define FPARSELN_UNESCCONT 0x02
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define FPARSELN_UNESCCOMM 0x04
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define FPARSELN_UNESCREST 0x08
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define FPARSELN_UNESCALL 0x0f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * opendev() specific operation flags.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define OPENDEV_PART 0x01 /* Try to open the raw partition. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define OPENDEV_BLCK 0x04 /* Open block, not character device. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * uu_lock(3) specific flags.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define UU_LOCK_INUSE (1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define UU_LOCK_OK (0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define UU_LOCK_OPEN_ERR (-1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define UU_LOCK_READ_ERR (-2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define UU_LOCK_CREAT_ERR (-3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define UU_LOCK_WRITE_ERR (-4)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define UU_LOCK_LINK_ERR (-5)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define UU_LOCK_TRY_ERR (-6)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define UU_LOCK_OWNER_ERR (-7)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * fmt_scaled(3) specific flags.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define FMT_SCALED_STRSIZE 7 /* minus sign, 4 digits, suffix, null byte */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * stub struct definitions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct __sFILE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct login_cap;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct passwd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct termios;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct utmp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct winsize;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+__BEGIN_DECLS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *fparseln(struct __sFILE *, size_t *, size_t *, const char[3], int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void login(struct utmp *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int login_tty(int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int logout(const char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void logwtmp(const char *, const char *, const char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int opendev(const char *, int, int, char **);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int pidfile(const char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void pw_setdir(const char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *pw_file(const char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int pw_lock(int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int pw_mkdb(char *, int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int pw_abort(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void pw_init(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void pw_edit(int, const char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void pw_prompt(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void pw_copy(int, int, const struct passwd *, const struct passwd *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int pw_scan(char *, struct passwd *, int *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+__dead void pw_error(const char *, int, int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int getptmfd(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int openpty(int *, int *, char *, const struct termios *,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const struct winsize *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int fdopenpty(int, int *, int *, char *, const struct termios *,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const struct winsize *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int opendisk(const char *, int, char *, size_t, int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+pid_t forkpty(int *, char *, const struct termios *, const struct winsize *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+pid_t fdforkpty(int, int *, char *, const struct termios *,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const struct winsize *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int getmaxpartitions(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int getrawpartition(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void login_fbtab(const char *, uid_t, gid_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int login_check_expire(struct __sFILE *, struct passwd *, char *, int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *readlabelfs(char *, int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+const char *uu_lockerr(int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int uu_lock(const char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int uu_lock_txfr(const char *, pid_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int uu_unlock(const char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int fmt_scaled(long long, char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int scan_scaled(char *, long long *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int isduid(const char *, int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int pkcs5_pbkdf2(const char *, size_t, const uint8_t *, size_t,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *, size_t, unsigned int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int bcrypt_pbkdf(const char *, size_t, const uint8_t *, size_t,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *, size_t, unsigned int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+__END_DECLS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* !_UTIL_H_ */
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/regress/lib/libc/explicit_bzero/explicit_bzero.c b/vendor/signify-osx/src/regress/lib/libc/explicit_bzero/explicit_bzero.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..496bafb20
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/regress/lib/libc/explicit_bzero/explicit_bzero.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,225 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: explicit_bzero.c,v 1.9 2022/02/10 08:39:32 tb Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2014 Google Inc.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <assert.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <errno.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <signal.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ASSERT_EQ(a, b) assert((a) == (b))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ASSERT_NE(a, b) assert((a) != (b))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ASSERT_GE(a, b) assert((a) >= (b))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if defined(__has_feature)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __has_feature(address_sanitizer)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __SANITIZE_ADDRESS__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef __SANITIZE_ADDRESS__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ATTRIBUTE_NO_SANITIZE_ADDRESS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* 128 bits of random data. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const char secret[16] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xa0, 0x6c, 0x0c, 0x81, 0xba, 0xd8, 0x5b, 0x0c,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xb0, 0xd6, 0xd4, 0xe3, 0xeb, 0x52, 0x5f, 0x96,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+enum {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SECRETCOUNT = 64,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SECRETBYTES = SECRETCOUNT * sizeof(secret)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * As of glibc 2.34, when _GNU_SOURCE is defined, SIGSTKSZ is no longer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * constant on Linux. SIGSTKSZ is redefined to sysconf (_SC_SIGSTKSZ).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static char *altstack;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ALTSTACK_SIZE (SIGSTKSZ + SECRETBYTES)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+setup_stack(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ altstack = calloc(1, ALTSTACK_SIZE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_NE(NULL, altstack);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const stack_t sigstk = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .ss_sp = altstack,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .ss_size = ALTSTACK_SIZE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(0, sigaltstack(&sigstk, NULL));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+cleanup_stack(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(altstack);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+assert_on_stack(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stack_t cursigstk;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(0, sigaltstack(NULL, &cursigstk));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(SS_ONSTACK, cursigstk.ss_flags & (SS_DISABLE|SS_ONSTACK));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+call_on_stack(void (*fn)(int))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This is a bit more complicated than strictly necessary, but
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * it ensures we don't have any flaky test failures due to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * inherited signal masks/actions/etc.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * On systems where SA_ONSTACK is not supported, this could
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * alternatively be implemented using makecontext() or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * pthread_attr_setstack().
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const struct sigaction sigact = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .sa_handler = fn,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .sa_flags = SA_ONSTACK,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct sigaction oldsigact;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sigset_t sigset, oldsigset;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* First, block all signals. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(0, sigemptyset(&sigset));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(0, sigfillset(&sigset));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(0, sigprocmask(SIG_BLOCK, &sigset, &oldsigset));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Next setup the signal handler for SIGUSR1. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(0, sigaction(SIGUSR1, &sigact, &oldsigact));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Raise SIGUSR1 and momentarily unblock it to run the handler. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(0, raise(SIGUSR1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(0, sigdelset(&sigset, SIGUSR1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(-1, sigsuspend(&sigset));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(EINTR, errno);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Restore the original signal action, stack, and mask. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(0, sigaction(SIGUSR1, &oldsigact, NULL));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(0, sigprocmask(SIG_SETMASK, &oldsigset, NULL));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+populate_secret(char *buf, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i, fds[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(0, pipe(fds));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < SECRETCOUNT; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(sizeof(secret), write(fds[1], secret, sizeof(secret)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(0, close(fds[1]));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(len, read(fds[0], buf, len));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(0, close(fds[0]));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+count_secrets(const char *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int res = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < SECRETCOUNT; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (memcmp(buf + i * sizeof(secret), secret,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sizeof(secret)) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ res += 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (res);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ATTRIBUTE_NO_SANITIZE_ADDRESS static char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test_without_bzero(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char buf[SECRETBYTES];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert_on_stack();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ populate_secret(buf, sizeof(buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *res = memmem(altstack, ALTSTACK_SIZE, buf, sizeof(buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_NE(NULL, res);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (res);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ATTRIBUTE_NO_SANITIZE_ADDRESS static char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test_with_bzero(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char buf[SECRETBYTES];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert_on_stack();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ populate_secret(buf, sizeof(buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *res = memmem(altstack, ALTSTACK_SIZE, buf, sizeof(buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_NE(NULL, res);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(buf, sizeof(buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (res);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+do_test_without_bzero(int signo)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *buf = test_without_bzero();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_GE(count_secrets(buf), 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+do_test_with_bzero(int signo)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *buf = test_with_bzero();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASSERT_EQ(count_secrets(buf), 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+main(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ setup_stack();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Solaris and OS X clobber the signal stack after returning to the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * normal stack, so we need to inspect altstack while we're still
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * running on it. Unfortunately, this means we risk clobbering the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * buffer ourselves.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * To minimize this risk, test_with{,out}_bzero() are responsible for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * locating the offset of their buf variable within altstack, and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * and returning that address. Then we can simply memcmp() repeatedly
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * to count how many instances of secret we found.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * First, test that if we *don't* call explicit_bzero, that we
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * *are* able to find at least one instance of the secret data still
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * on the stack. This sanity checks that call_on_stack() and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * populate_secret() work as intended.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(altstack, 0, ALTSTACK_SIZE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ call_on_stack(do_test_without_bzero);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Now test with a call to explicit_bzero() and check that we
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * *don't* find any instances of the secret data.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(altstack, 0, ALTSTACK_SIZE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ call_on_stack(do_test_with_bzero);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cleanup_stack();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/regress/usr.bin/signify/forgery.txt b/vendor/signify-osx/src/regress/usr.bin/signify/forgery.txt
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..aad8350f1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/regress/usr.bin/signify/forgery.txt
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Attack at dusk!
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/regress/usr.bin/signify/forgery.txt.sig b/vendor/signify-osx/src/regress/usr.bin/signify/forgery.txt.sig
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..fd9a9751e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/regress/usr.bin/signify/forgery.txt.sig
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: signify signature
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWTAeKJJ1MTF3UpxzBCu6NaM6HPJNTj5CZ+M5XNJKNeEHBLQSsstzHGbSo8rPYNgw3Z98pN7WKiIwBIyRrKuIdKBRA6qlaci6wI=
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/regress/usr.bin/signify/orders.txt b/vendor/signify-osx/src/regress/usr.bin/signify/orders.txt
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..97341e73c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/regress/usr.bin/signify/orders.txt
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Attack at dawn!
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/regress/usr.bin/signify/orders.txt.sig b/vendor/signify-osx/src/regress/usr.bin/signify/orders.txt.sig
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..90f02d242
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/regress/usr.bin/signify/orders.txt.sig
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: signature from signify secret key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWTAeKJJ1MTF3UpxzBCu6NaM6HPJNTj5CZ+M5XNJKNeEHBLQSsstzHGbSo8rPYNgw3Z98pN7WKiIwBIyRrKuIdKBRA6qlaci6wI=
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/regress/usr.bin/signify/regresskey.pub b/vendor/signify-osx/src/regress/usr.bin/signify/regresskey.pub
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..5b82d0118
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/regress/usr.bin/signify/regresskey.pub
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: signify public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWTAeKJJ1MTF3YCo0ivtKH8kuiFWJuLpNoUmpDd6iTFYhn6/tRu5qKJe
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/regress/usr.bin/signify/regresskey.sec b/vendor/signify-osx/src/regress/usr.bin/signify/regresskey.sec
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..7cf243a6d
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/regress/usr.bin/signify/regresskey.sec
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+untrusted comment: signify secret key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+RWRCSwAAAAASS6/J8yiU/PaMmMhlV4zqjMh4FlqOsG3AeKJJ1MTF3UpTLTAaUkS15G97BU/C+X2UCcR2fNfG68/1NpK0bh0pgKjSK+0ofyS6IVYm4uk2hSakN3qJMViGfr+1G7mool4=
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/regress/usr.bin/signify/signify.sh b/vendor/signify-osx/src/regress/usr.bin/signify/signify.sh
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..13d8319a1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/regress/usr.bin/signify/signify.sh
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,37 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#!/bin/sh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# $OpenBSD: signify.sh,v 1.10 2020/04/03 12:01:56 bluhm Exp $
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+srcdir=$1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+pubkey="$srcdir/regresskey.pub"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+seckey="$srcdir/regresskey.sec"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+orders="$srcdir/orders.txt"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+forgery="$srcdir/forgery.txt"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set -e
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+cat $seckey | signify -S -s - -x test.sig -m $orders
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff -u "$orders.sig" test.sig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+signify -V -q -p $pubkey -m $orders
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+signify -V -q -p $pubkey -m $forgery 2> /dev/null && exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+signify -S -s $seckey -x confirmorders.sig -e -m $orders
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+signify -V -q -p $pubkey -e -m confirmorders
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff -u $orders confirmorders
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+sha256 $pubkey $seckey > HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+sha512 $orders $forgery >> HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+signify -S -e -s $seckey -m HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+rm HASH
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+signify -C -q -p $pubkey -x HASH.sig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+tar zcPf archive.tgz $srcdir/*.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+signify -zS -s $seckey -m archive.tgz -x signed.tgz
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# check it's still valid gzip
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+gunzip -t signed.tgz
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# verify it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+signify -zV -p $pubkey <signed.tgz|signify -zV -p $pubkey|gunzip -t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+true
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/crypto_api.c b/vendor/signify-osx/src/usr.bin/signify/crypto_api.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..36b734837
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/crypto_api.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,29 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: crypto_api.c,v 1.1 2014/01/08 03:59:46 tedu Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Public domain. Author: Ted Unangst <tedu@openbsd.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * API compatible reimplementation of functions from nacl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sha2.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "crypto_api.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+crypto_hash_sha512(unsigned char *out, const unsigned char *in,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long inlen)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA2_CTX ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Init(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Update(&ctx, in, inlen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Final(out, &ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+crypto_verify_32(const unsigned char *x, const unsigned char *y)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return timingsafe_bcmp(x, y, 32) ? -1 : 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/crypto_api.h b/vendor/signify-osx/src/usr.bin/signify/crypto_api.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..540a7c21b
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/crypto_api.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,39 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: crypto_api.h,v 1.2 2018/01/16 21:42:40 naddy Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Assembled from generated headers and source files by Markus Friedl.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Placed in the public domain.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef crypto_api_h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define crypto_api_h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdint.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef int32_t crypto_int32;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef uint32_t crypto_uint32;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define randombytes(buf, buf_len) arc4random_buf((buf), (buf_len))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int crypto_hashblocks_sha512(unsigned char *, const unsigned char *,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define crypto_hash_sha512_BYTES 64U
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int crypto_hash_sha512(unsigned char *, const unsigned char *,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int crypto_verify_32(const unsigned char *, const unsigned char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define crypto_sign_ed25519_SECRETKEYBYTES 64U
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define crypto_sign_ed25519_PUBLICKEYBYTES 32U
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define crypto_sign_ed25519_BYTES 64U
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int crypto_sign_ed25519(unsigned char *, unsigned long long *,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const unsigned char *, unsigned long long, const unsigned char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int crypto_sign_ed25519_open(unsigned char *, unsigned long long *,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const unsigned char *, unsigned long long, const unsigned char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int crypto_sign_ed25519_keypair(unsigned char *, unsigned char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* crypto_api_h */
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/fe25519.c b/vendor/signify-osx/src/usr.bin/signify/fe25519.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..5a6b77d26
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/fe25519.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,335 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: fe25519.c,v 1.1 2014/07/22 00:41:19 deraadt Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Peter Schwabe, Bo-Yin Yang.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copied from supercop-20130419/crypto_sign/ed25519/ref/fe25519.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define WINDOWSIZE 1 /* Should be 1,2, or 4 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define WINDOWMASK ((1<<WINDOWSIZE)-1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "fe25519.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static crypto_uint32 equal(crypto_uint32 a,crypto_uint32 b) /* 16-bit inputs */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 x = a ^ b; /* 0: yes; 1..65535: no */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ x -= 1; /* 4294967295: yes; 0..65534: no */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ x >>= 31; /* 1: yes; 0: no */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static crypto_uint32 ge(crypto_uint32 a,crypto_uint32 b) /* 16-bit inputs */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int x = a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ x -= (unsigned int) b; /* 0..65535: yes; 4294901761..4294967295: no */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ x >>= 31; /* 0: yes; 1: no */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ x ^= 1; /* 1: yes; 0: no */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static crypto_uint32 times19(crypto_uint32 a)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (a << 4) + (a << 1) + a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static crypto_uint32 times38(crypto_uint32 a)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (a << 5) + (a << 2) + (a << 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void reduce_add_sub(fe25519 *r)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i,rep;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(rep=0;rep<4;rep++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t = r->v[31] >> 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[31] &= 127;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t = times19(t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[0] += t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<31;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t = r->v[i] >> 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[i+1] += t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[i] &= 255;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void reduce_mul(fe25519 *r)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i,rep;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(rep=0;rep<2;rep++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t = r->v[31] >> 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[31] &= 127;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t = times19(t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[0] += t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<31;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t = r->v[i] >> 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[i+1] += t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[i] &= 255;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* reduction modulo 2^255-19 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_freeze(fe25519 *r)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 m = equal(r->v[31],127);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=30;i>0;i--)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ m &= equal(r->v[i],255);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ m &= ge(r->v[0],237);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ m = -m;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[31] -= m&127;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=30;i>0;i--)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[i] -= m&255;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[0] -= m&237;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_unpack(fe25519 *r, const unsigned char x[32])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++) r->v[i] = x[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[31] &= 127;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Assumes input x being reduced below 2^255 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_pack(unsigned char r[32], const fe25519 *x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 y = *x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_freeze(&y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[i] = y.v[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int fe25519_iszero(const fe25519 *x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 t = *x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_freeze(&t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r = equal(t.v[0],0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=1;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r &= equal(t.v[i],0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int fe25519_iseq_vartime(const fe25519 *x, const fe25519 *y)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 t1 = *x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 t2 = *y;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_freeze(&t1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_freeze(&t2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(t1.v[i] != t2.v[i]) return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_cmov(fe25519 *r, const fe25519 *x, unsigned char b)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 mask = b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ mask = -mask;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++) r->v[i] ^= mask & (x->v[i] ^ r->v[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+unsigned char fe25519_getparity(const fe25519 *x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 t = *x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_freeze(&t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return t.v[0] & 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_setone(fe25519 *r)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[0] = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=1;i<32;i++) r->v[i]=0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_setzero(fe25519 *r)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++) r->v[i]=0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_neg(fe25519 *r, const fe25519 *x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++) t.v[i]=x->v[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_setzero(r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(r, r, &t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_add(fe25519 *r, const fe25519 *x, const fe25519 *y)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++) r->v[i] = x->v[i] + y->v[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reduce_add_sub(r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_sub(fe25519 *r, const fe25519 *x, const fe25519 *y)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 t[32];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t[0] = x->v[0] + 0x1da;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t[31] = x->v[31] + 0xfe;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=1;i<31;i++) t[i] = x->v[i] + 0x1fe;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++) r->v[i] = t[i] - y->v[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reduce_add_sub(r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_mul(fe25519 *r, const fe25519 *x, const fe25519 *y)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i,j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 t[63];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<63;i++)t[i] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(j=0;j<32;j++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t[i+j] += x->v[i] * y->v[j];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=32;i<63;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[i-32] = t[i-32] + times38(t[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[31] = t[31]; /* result now in r[0]...r[31] */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reduce_mul(r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_square(fe25519 *r, const fe25519 *x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(r, x, x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_invert(fe25519 *r, const fe25519 *x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z9;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z11;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z2_5_0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z2_10_0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z2_20_0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z2_50_0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z2_100_0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 t0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 t1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2 */ fe25519_square(&z2,x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 4 */ fe25519_square(&t1,&z2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 8 */ fe25519_square(&t0,&t1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 9 */ fe25519_mul(&z9,&t0,x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 11 */ fe25519_mul(&z11,&z9,&z2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 22 */ fe25519_square(&t0,&z11);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^5 - 2^0 = 31 */ fe25519_mul(&z2_5_0,&t0,&z9);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^6 - 2^1 */ fe25519_square(&t0,&z2_5_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^7 - 2^2 */ fe25519_square(&t1,&t0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^8 - 2^3 */ fe25519_square(&t0,&t1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^9 - 2^4 */ fe25519_square(&t1,&t0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^10 - 2^5 */ fe25519_square(&t0,&t1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^10 - 2^0 */ fe25519_mul(&z2_10_0,&t0,&z2_5_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^11 - 2^1 */ fe25519_square(&t0,&z2_10_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^12 - 2^2 */ fe25519_square(&t1,&t0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^20 - 2^10 */ for (i = 2;i < 10;i += 2) { fe25519_square(&t0,&t1); fe25519_square(&t1,&t0); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^20 - 2^0 */ fe25519_mul(&z2_20_0,&t1,&z2_10_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^21 - 2^1 */ fe25519_square(&t0,&z2_20_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^22 - 2^2 */ fe25519_square(&t1,&t0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^40 - 2^20 */ for (i = 2;i < 20;i += 2) { fe25519_square(&t0,&t1); fe25519_square(&t1,&t0); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^40 - 2^0 */ fe25519_mul(&t0,&t1,&z2_20_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^41 - 2^1 */ fe25519_square(&t1,&t0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^42 - 2^2 */ fe25519_square(&t0,&t1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^50 - 2^10 */ for (i = 2;i < 10;i += 2) { fe25519_square(&t1,&t0); fe25519_square(&t0,&t1); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^50 - 2^0 */ fe25519_mul(&z2_50_0,&t0,&z2_10_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^51 - 2^1 */ fe25519_square(&t0,&z2_50_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^52 - 2^2 */ fe25519_square(&t1,&t0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^100 - 2^50 */ for (i = 2;i < 50;i += 2) { fe25519_square(&t0,&t1); fe25519_square(&t1,&t0); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^100 - 2^0 */ fe25519_mul(&z2_100_0,&t1,&z2_50_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^101 - 2^1 */ fe25519_square(&t1,&z2_100_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^102 - 2^2 */ fe25519_square(&t0,&t1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^200 - 2^100 */ for (i = 2;i < 100;i += 2) { fe25519_square(&t1,&t0); fe25519_square(&t0,&t1); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^200 - 2^0 */ fe25519_mul(&t1,&t0,&z2_100_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^201 - 2^1 */ fe25519_square(&t0,&t1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^202 - 2^2 */ fe25519_square(&t1,&t0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^250 - 2^50 */ for (i = 2;i < 50;i += 2) { fe25519_square(&t0,&t1); fe25519_square(&t1,&t0); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^250 - 2^0 */ fe25519_mul(&t0,&t1,&z2_50_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^251 - 2^1 */ fe25519_square(&t1,&t0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^252 - 2^2 */ fe25519_square(&t0,&t1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^253 - 2^3 */ fe25519_square(&t1,&t0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^254 - 2^4 */ fe25519_square(&t0,&t1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^255 - 2^5 */ fe25519_square(&t1,&t0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^255 - 21 */ fe25519_mul(r,&t1,&z11);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_pow2523(fe25519 *r, const fe25519 *x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z9;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z11;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z2_5_0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z2_10_0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z2_20_0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z2_50_0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z2_100_0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2 */ fe25519_square(&z2,x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 4 */ fe25519_square(&t,&z2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 8 */ fe25519_square(&t,&t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 9 */ fe25519_mul(&z9,&t,x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 11 */ fe25519_mul(&z11,&z9,&z2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 22 */ fe25519_square(&t,&z11);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^5 - 2^0 = 31 */ fe25519_mul(&z2_5_0,&t,&z9);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^6 - 2^1 */ fe25519_square(&t,&z2_5_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^10 - 2^5 */ for (i = 1;i < 5;i++) { fe25519_square(&t,&t); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^10 - 2^0 */ fe25519_mul(&z2_10_0,&t,&z2_5_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^11 - 2^1 */ fe25519_square(&t,&z2_10_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^20 - 2^10 */ for (i = 1;i < 10;i++) { fe25519_square(&t,&t); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^20 - 2^0 */ fe25519_mul(&z2_20_0,&t,&z2_10_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^21 - 2^1 */ fe25519_square(&t,&z2_20_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^40 - 2^20 */ for (i = 1;i < 20;i++) { fe25519_square(&t,&t); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^40 - 2^0 */ fe25519_mul(&t,&t,&z2_20_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^41 - 2^1 */ fe25519_square(&t,&t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^50 - 2^10 */ for (i = 1;i < 10;i++) { fe25519_square(&t,&t); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^50 - 2^0 */ fe25519_mul(&z2_50_0,&t,&z2_10_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^51 - 2^1 */ fe25519_square(&t,&z2_50_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^100 - 2^50 */ for (i = 1;i < 50;i++) { fe25519_square(&t,&t); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^100 - 2^0 */ fe25519_mul(&z2_100_0,&t,&z2_50_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^101 - 2^1 */ fe25519_square(&t,&z2_100_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^200 - 2^100 */ for (i = 1;i < 100;i++) { fe25519_square(&t,&t); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^200 - 2^0 */ fe25519_mul(&t,&t,&z2_100_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^201 - 2^1 */ fe25519_square(&t,&t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^250 - 2^50 */ for (i = 1;i < 50;i++) { fe25519_square(&t,&t); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^250 - 2^0 */ fe25519_mul(&t,&t,&z2_50_0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^251 - 2^1 */ fe25519_square(&t,&t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^252 - 2^2 */ fe25519_square(&t,&t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2^252 - 3 */ fe25519_mul(r,&t,x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/fe25519.h b/vendor/signify-osx/src/usr.bin/signify/fe25519.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..b2852aa1c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/fe25519.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,70 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: fe25519.h,v 1.1 2014/07/22 00:41:19 deraadt Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Peter Schwabe, Bo-Yin Yang.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copied from supercop-20130419/crypto_sign/ed25519/ref/fe25519.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef FE25519_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define FE25519_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "crypto_api.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519 crypto_sign_ed25519_ref_fe25519
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_freeze crypto_sign_ed25519_ref_fe25519_freeze
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_unpack crypto_sign_ed25519_ref_fe25519_unpack
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_pack crypto_sign_ed25519_ref_fe25519_pack
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_iszero crypto_sign_ed25519_ref_fe25519_iszero
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_iseq_vartime crypto_sign_ed25519_ref_fe25519_iseq_vartime
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_cmov crypto_sign_ed25519_ref_fe25519_cmov
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_setone crypto_sign_ed25519_ref_fe25519_setone
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_setzero crypto_sign_ed25519_ref_fe25519_setzero
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_neg crypto_sign_ed25519_ref_fe25519_neg
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_getparity crypto_sign_ed25519_ref_fe25519_getparity
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_add crypto_sign_ed25519_ref_fe25519_add
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_sub crypto_sign_ed25519_ref_fe25519_sub
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_mul crypto_sign_ed25519_ref_fe25519_mul
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_square crypto_sign_ed25519_ref_fe25519_square
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_invert crypto_sign_ed25519_ref_fe25519_invert
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fe25519_pow2523 crypto_sign_ed25519_ref_fe25519_pow2523
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 v[32];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+fe25519;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_freeze(fe25519 *r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_unpack(fe25519 *r, const unsigned char x[32]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_pack(unsigned char r[32], const fe25519 *x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int fe25519_iszero(const fe25519 *x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int fe25519_iseq_vartime(const fe25519 *x, const fe25519 *y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_cmov(fe25519 *r, const fe25519 *x, unsigned char b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_setone(fe25519 *r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_setzero(fe25519 *r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_neg(fe25519 *r, const fe25519 *x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+unsigned char fe25519_getparity(const fe25519 *x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_add(fe25519 *r, const fe25519 *x, const fe25519 *y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_sub(fe25519 *r, const fe25519 *x, const fe25519 *y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_mul(fe25519 *r, const fe25519 *x, const fe25519 *y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_square(fe25519 *r, const fe25519 *x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_invert(fe25519 *r, const fe25519 *x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void fe25519_pow2523(fe25519 *r, const fe25519 *x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/ge25519.h b/vendor/signify-osx/src/usr.bin/signify/ge25519.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..165844ec5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/ge25519.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,43 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: ge25519.h,v 1.2 2015/02/16 18:26:26 miod Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Peter Schwabe, Bo-Yin Yang.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copied from supercop-20130419/crypto_sign/ed25519/ref/ge25519.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef GE25519_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define GE25519_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "fe25519.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "sc25519.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ge25519 crypto_sign_ed25519_ref_ge25519
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ge25519_base crypto_sign_ed25519_ref_ge25519_base
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ge25519_unpackneg_vartime crypto_sign_ed25519_ref_unpackneg_vartime
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ge25519_pack crypto_sign_ed25519_ref_pack
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ge25519_isneutral_vartime crypto_sign_ed25519_ref_isneutral_vartime
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ge25519_double_scalarmult_vartime crypto_sign_ed25519_ref_double_scalarmult_vartime
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ge25519_scalarmult_base crypto_sign_ed25519_ref_scalarmult_base
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 y;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} ge25519;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern const ge25519 ge25519_base;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int ge25519_unpackneg_vartime(ge25519 *r, const unsigned char p[32]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void ge25519_pack(unsigned char r[32], const ge25519 *p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int ge25519_isneutral_vartime(const ge25519 *p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void ge25519_double_scalarmult_vartime(ge25519 *r, const ge25519 *p1, const sc25519 *s1, const ge25519 *p2, const sc25519 *s2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void ge25519_scalarmult_base(ge25519 *r, const sc25519 *s);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/ge25519_base.data b/vendor/signify-osx/src/usr.bin/signify/ge25519_base.data
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..8f6a62bd5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/ge25519_base.data
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,858 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: ge25519_base.data,v 1.1 2014/07/22 00:41:19 deraadt Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Peter Schwabe, Bo-Yin Yang.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copied from supercop-20130419/crypto_sign/ed25519/ref/ge25519_base.data
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x1a, 0xd5, 0x25, 0x8f, 0x60, 0x2d, 0x56, 0xc9, 0xb2, 0xa7, 0x25, 0x95, 0x60, 0xc7, 0x2c, 0x69, 0x5c, 0xdc, 0xd6, 0xfd, 0x31, 0xe2, 0xa4, 0xc0, 0xfe, 0x53, 0x6e, 0xcd, 0xd3, 0x36, 0x69, 0x21}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x58, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x0e, 0xce, 0x43, 0x28, 0x4e, 0xa1, 0xc5, 0x83, 0x5f, 0xa4, 0xd7, 0x15, 0x45, 0x8e, 0x0d, 0x08, 0xac, 0xe7, 0x33, 0x18, 0x7d, 0x3b, 0x04, 0x3d, 0x6c, 0x04, 0x5a, 0x9f, 0x4c, 0x38, 0xab, 0x36}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc9, 0xa3, 0xf8, 0x6a, 0xae, 0x46, 0x5f, 0x0e, 0x56, 0x51, 0x38, 0x64, 0x51, 0x0f, 0x39, 0x97, 0x56, 0x1f, 0xa2, 0xc9, 0xe8, 0x5e, 0xa2, 0x1d, 0xc2, 0x29, 0x23, 0x09, 0xf3, 0xcd, 0x60, 0x22}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x5c, 0xe2, 0xf8, 0xd3, 0x5f, 0x48, 0x62, 0xac, 0x86, 0x48, 0x62, 0x81, 0x19, 0x98, 0x43, 0x63, 0x3a, 0xc8, 0xda, 0x3e, 0x74, 0xae, 0xf4, 0x1f, 0x49, 0x8f, 0x92, 0x22, 0x4a, 0x9c, 0xae, 0x67}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xd4, 0xb4, 0xf5, 0x78, 0x48, 0x68, 0xc3, 0x02, 0x04, 0x03, 0x24, 0x67, 0x17, 0xec, 0x16, 0x9f, 0xf7, 0x9e, 0x26, 0x60, 0x8e, 0xa1, 0x26, 0xa1, 0xab, 0x69, 0xee, 0x77, 0xd1, 0xb1, 0x67, 0x12}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x70, 0xf8, 0xc9, 0xc4, 0x57, 0xa6, 0x3a, 0x49, 0x47, 0x15, 0xce, 0x93, 0xc1, 0x9e, 0x73, 0x1a, 0xf9, 0x20, 0x35, 0x7a, 0xb8, 0xd4, 0x25, 0x83, 0x46, 0xf1, 0xcf, 0x56, 0xdb, 0xa8, 0x3d, 0x20}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x2f, 0x11, 0x32, 0xca, 0x61, 0xab, 0x38, 0xdf, 0xf0, 0x0f, 0x2f, 0xea, 0x32, 0x28, 0xf2, 0x4c, 0x6c, 0x71, 0xd5, 0x80, 0x85, 0xb8, 0x0e, 0x47, 0xe1, 0x95, 0x15, 0xcb, 0x27, 0xe8, 0xd0, 0x47}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xc8, 0x84, 0xa5, 0x08, 0xbc, 0xfd, 0x87, 0x3b, 0x99, 0x8b, 0x69, 0x80, 0x7b, 0xc6, 0x3a, 0xeb, 0x93, 0xcf, 0x4e, 0xf8, 0x5c, 0x2d, 0x86, 0x42, 0xb6, 0x71, 0xd7, 0x97, 0x5f, 0xe1, 0x42, 0x67}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xb4, 0xb9, 0x37, 0xfc, 0xa9, 0x5b, 0x2f, 0x1e, 0x93, 0xe4, 0x1e, 0x62, 0xfc, 0x3c, 0x78, 0x81, 0x8f, 0xf3, 0x8a, 0x66, 0x09, 0x6f, 0xad, 0x6e, 0x79, 0x73, 0xe5, 0xc9, 0x00, 0x06, 0xd3, 0x21}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xf8, 0xf9, 0x28, 0x6c, 0x6d, 0x59, 0xb2, 0x59, 0x74, 0x23, 0xbf, 0xe7, 0x33, 0x8d, 0x57, 0x09, 0x91, 0x9c, 0x24, 0x08, 0x15, 0x2b, 0xe2, 0xb8, 0xee, 0x3a, 0xe5, 0x27, 0x06, 0x86, 0xa4, 0x23}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xeb, 0x27, 0x67, 0xc1, 0x37, 0xab, 0x7a, 0xd8, 0x27, 0x9c, 0x07, 0x8e, 0xff, 0x11, 0x6a, 0xb0, 0x78, 0x6e, 0xad, 0x3a, 0x2e, 0x0f, 0x98, 0x9f, 0x72, 0xc3, 0x7f, 0x82, 0xf2, 0x96, 0x96, 0x70}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x81, 0x6b, 0x88, 0xe8, 0x1e, 0xc7, 0x77, 0x96, 0x0e, 0xa1, 0xa9, 0x52, 0xe0, 0xd8, 0x0e, 0x61, 0x9e, 0x79, 0x2d, 0x95, 0x9c, 0x8d, 0x96, 0xe0, 0x06, 0x40, 0x5d, 0x87, 0x28, 0x5f, 0x98, 0x70}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf1, 0x79, 0x7b, 0xed, 0x4f, 0x44, 0xb2, 0xe7, 0x08, 0x0d, 0xc2, 0x08, 0x12, 0xd2, 0x9f, 0xdf, 0xcd, 0x93, 0x20, 0x8a, 0xcf, 0x33, 0xca, 0x6d, 0x89, 0xb9, 0x77, 0xc8, 0x93, 0x1b, 0x4e, 0x60}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x26, 0x4f, 0x7e, 0x97, 0xf6, 0x40, 0xdd, 0x4f, 0xfc, 0x52, 0x78, 0xf9, 0x90, 0x31, 0x03, 0xe6, 0x7d, 0x56, 0x39, 0x0b, 0x1d, 0x56, 0x82, 0x85, 0xf9, 0x1a, 0x42, 0x17, 0x69, 0x6c, 0xcf, 0x39}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x69, 0xd2, 0x06, 0x3a, 0x4f, 0x39, 0x2d, 0xf9, 0x38, 0x40, 0x8c, 0x4c, 0xe7, 0x05, 0x12, 0xb4, 0x78, 0x8b, 0xf8, 0xc0, 0xec, 0x93, 0xde, 0x7a, 0x6b, 0xce, 0x2c, 0xe1, 0x0e, 0xa9, 0x34, 0x44}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x0b, 0xa4, 0x3c, 0xb0, 0x0f, 0x7a, 0x51, 0xf1, 0x78, 0xd6, 0xd9, 0x6a, 0xfd, 0x46, 0xe8, 0xb8, 0xa8, 0x79, 0x1d, 0x87, 0xf9, 0x90, 0xf2, 0x9c, 0x13, 0x29, 0xf8, 0x0b, 0x20, 0x64, 0xfa, 0x05}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x26, 0x09, 0xda, 0x17, 0xaf, 0x95, 0xd6, 0xfb, 0x6a, 0x19, 0x0d, 0x6e, 0x5e, 0x12, 0xf1, 0x99, 0x4c, 0xaa, 0xa8, 0x6f, 0x79, 0x86, 0xf4, 0x72, 0x28, 0x00, 0x26, 0xf9, 0xea, 0x9e, 0x19, 0x3d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x87, 0xdd, 0xcf, 0xf0, 0x5b, 0x49, 0xa2, 0x5d, 0x40, 0x7a, 0x23, 0x26, 0xa4, 0x7a, 0x83, 0x8a, 0xb7, 0x8b, 0xd2, 0x1a, 0xbf, 0xea, 0x02, 0x24, 0x08, 0x5f, 0x7b, 0xa9, 0xb1, 0xbe, 0x9d, 0x37}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xfc, 0x86, 0x4b, 0x08, 0xee, 0xe7, 0xa0, 0xfd, 0x21, 0x45, 0x09, 0x34, 0xc1, 0x61, 0x32, 0x23, 0xfc, 0x9b, 0x55, 0x48, 0x53, 0x99, 0xf7, 0x63, 0xd0, 0x99, 0xce, 0x01, 0xe0, 0x9f, 0xeb, 0x28}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x47, 0xfc, 0xab, 0x5a, 0x17, 0xf0, 0x85, 0x56, 0x3a, 0x30, 0x86, 0x20, 0x28, 0x4b, 0x8e, 0x44, 0x74, 0x3a, 0x6e, 0x02, 0xf1, 0x32, 0x8f, 0x9f, 0x3f, 0x08, 0x35, 0xe9, 0xca, 0x16, 0x5f, 0x6e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x1c, 0x59, 0x1c, 0x65, 0x5d, 0x34, 0xa4, 0x09, 0xcd, 0x13, 0x9c, 0x70, 0x7d, 0xb1, 0x2a, 0xc5, 0x88, 0xaf, 0x0b, 0x60, 0xc7, 0x9f, 0x34, 0x8d, 0xd6, 0xb7, 0x7f, 0xea, 0x78, 0x65, 0x8d, 0x77}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x56, 0xa5, 0xc2, 0x0c, 0xdd, 0xbc, 0xb8, 0x20, 0x6d, 0x57, 0x61, 0xb5, 0xfb, 0x78, 0xb5, 0xd4, 0x49, 0x54, 0x90, 0x26, 0xc1, 0xcb, 0xe9, 0xe6, 0xbf, 0xec, 0x1d, 0x4e, 0xed, 0x07, 0x7e, 0x5e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc7, 0xf6, 0x6c, 0x56, 0x31, 0x20, 0x14, 0x0e, 0xa8, 0xd9, 0x27, 0xc1, 0x9a, 0x3d, 0x1b, 0x7d, 0x0e, 0x26, 0xd3, 0x81, 0xaa, 0xeb, 0xf5, 0x6b, 0x79, 0x02, 0xf1, 0x51, 0x5c, 0x75, 0x55, 0x0f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x0a, 0x34, 0xcd, 0x82, 0x3c, 0x33, 0x09, 0x54, 0xd2, 0x61, 0x39, 0x30, 0x9b, 0xfd, 0xef, 0x21, 0x26, 0xd4, 0x70, 0xfa, 0xee, 0xf9, 0x31, 0x33, 0x73, 0x84, 0xd0, 0xb3, 0x81, 0xbf, 0xec, 0x2e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe8, 0x93, 0x8b, 0x00, 0x64, 0xf7, 0x9c, 0xb8, 0x74, 0xe0, 0xe6, 0x49, 0x48, 0x4d, 0x4d, 0x48, 0xb6, 0x19, 0xa1, 0x40, 0xb7, 0xd9, 0x32, 0x41, 0x7c, 0x82, 0x37, 0xa1, 0x2d, 0xdc, 0xd2, 0x54}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x68, 0x2b, 0x4a, 0x5b, 0xd5, 0xc7, 0x51, 0x91, 0x1d, 0xe1, 0x2a, 0x4b, 0xc4, 0x47, 0xf1, 0xbc, 0x7a, 0xb3, 0xcb, 0xc8, 0xb6, 0x7c, 0xac, 0x90, 0x05, 0xfd, 0xf3, 0xf9, 0x52, 0x3a, 0x11, 0x6b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x3d, 0xc1, 0x27, 0xf3, 0x59, 0x43, 0x95, 0x90, 0xc5, 0x96, 0x79, 0xf5, 0xf4, 0x95, 0x65, 0x29, 0x06, 0x9c, 0x51, 0x05, 0x18, 0xda, 0xb8, 0x2e, 0x79, 0x7e, 0x69, 0x59, 0x71, 0x01, 0xeb, 0x1a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x15, 0x06, 0x49, 0xb6, 0x8a, 0x3c, 0xea, 0x2f, 0x34, 0x20, 0x14, 0xc3, 0xaa, 0xd6, 0xaf, 0x2c, 0x3e, 0xbd, 0x65, 0x20, 0xe2, 0x4d, 0x4b, 0x3b, 0xeb, 0x9f, 0x4a, 0xc3, 0xad, 0xa4, 0x3b, 0x60}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xbc, 0x58, 0xe6, 0xc0, 0x95, 0x2a, 0x2a, 0x81, 0x9a, 0x7a, 0xf3, 0xd2, 0x06, 0xbe, 0x48, 0xbc, 0x0c, 0xc5, 0x46, 0xe0, 0x6a, 0xd4, 0xac, 0x0f, 0xd9, 0xcc, 0x82, 0x34, 0x2c, 0xaf, 0xdb, 0x1f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xf7, 0x17, 0x13, 0xbd, 0xfb, 0xbc, 0xd2, 0xec, 0x45, 0xb3, 0x15, 0x31, 0xe9, 0xaf, 0x82, 0x84, 0x3d, 0x28, 0xc6, 0xfc, 0x11, 0xf5, 0x41, 0xb5, 0x8b, 0xd3, 0x12, 0x76, 0x52, 0xe7, 0x1a, 0x3c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x4e, 0x36, 0x11, 0x07, 0xa2, 0x15, 0x20, 0x51, 0xc4, 0x2a, 0xc3, 0x62, 0x8b, 0x5e, 0x7f, 0xa6, 0x0f, 0xf9, 0x45, 0x85, 0x6c, 0x11, 0x86, 0xb7, 0x7e, 0xe5, 0xd7, 0xf9, 0xc3, 0x91, 0x1c, 0x05}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xea, 0xd6, 0xde, 0x29, 0x3a, 0x00, 0xb9, 0x02, 0x59, 0xcb, 0x26, 0xc4, 0xba, 0x99, 0xb1, 0x97, 0x2f, 0x8e, 0x00, 0x92, 0x26, 0x4f, 0x52, 0xeb, 0x47, 0x1b, 0x89, 0x8b, 0x24, 0xc0, 0x13, 0x7d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xd5, 0x20, 0x5b, 0x80, 0xa6, 0x80, 0x20, 0x95, 0xc3, 0xe9, 0x9f, 0x8e, 0x87, 0x9e, 0x1e, 0x9e, 0x7a, 0xc7, 0xcc, 0x75, 0x6c, 0xa5, 0xf1, 0x91, 0x1a, 0xa8, 0x01, 0x2c, 0xab, 0x76, 0xa9, 0x59}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xde, 0xc9, 0xb1, 0x31, 0x10, 0x16, 0xaa, 0x35, 0x14, 0x6a, 0xd4, 0xb5, 0x34, 0x82, 0x71, 0xd2, 0x4a, 0x5d, 0x9a, 0x1f, 0x53, 0x26, 0x3c, 0xe5, 0x8e, 0x8d, 0x33, 0x7f, 0xff, 0xa9, 0xd5, 0x17}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x89, 0xaf, 0xf6, 0xa4, 0x64, 0xd5, 0x10, 0xe0, 0x1d, 0xad, 0xef, 0x44, 0xbd, 0xda, 0x83, 0xac, 0x7a, 0xa8, 0xf0, 0x1c, 0x07, 0xf9, 0xc3, 0x43, 0x6c, 0x3f, 0xb7, 0xd3, 0x87, 0x22, 0x02, 0x73}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x64, 0x1d, 0x49, 0x13, 0x2f, 0x71, 0xec, 0x69, 0x87, 0xd0, 0x42, 0xee, 0x13, 0xec, 0xe3, 0xed, 0x56, 0x7b, 0xbf, 0xbd, 0x8c, 0x2f, 0x7d, 0x7b, 0x9d, 0x28, 0xec, 0x8e, 0x76, 0x2f, 0x6f, 0x08}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x22, 0xf5, 0x5f, 0x4d, 0x15, 0xef, 0xfc, 0x4e, 0x57, 0x03, 0x36, 0x89, 0xf0, 0xeb, 0x5b, 0x91, 0xd6, 0xe2, 0xca, 0x01, 0xa5, 0xee, 0x52, 0xec, 0xa0, 0x3c, 0x8f, 0x33, 0x90, 0x5a, 0x94, 0x72}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x8a, 0x4b, 0xe7, 0x38, 0xbc, 0xda, 0xc2, 0xb0, 0x85, 0xe1, 0x4a, 0xfe, 0x2d, 0x44, 0x84, 0xcb, 0x20, 0x6b, 0x2d, 0xbf, 0x11, 0x9c, 0xd7, 0xbe, 0xd3, 0x3e, 0x5f, 0xbf, 0x68, 0xbc, 0xa8, 0x07}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x89, 0x28, 0x22, 0x6a, 0x78, 0xaa, 0x29, 0x03, 0xc8, 0x74, 0x95, 0x03, 0x3e, 0xdc, 0xbd, 0x07, 0x13, 0xa8, 0xa2, 0x20, 0x2d, 0xb3, 0x18, 0x70, 0x42, 0xfd, 0x7a, 0xc4, 0xd7, 0x49, 0x72}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x02, 0xff, 0x32, 0x2b, 0x5c, 0x93, 0x54, 0x32, 0xe8, 0x57, 0x54, 0x1a, 0x8b, 0x33, 0x60, 0x65, 0xd3, 0x67, 0xa4, 0xc1, 0x26, 0xc4, 0xa4, 0x34, 0x1f, 0x9b, 0xa7, 0xa9, 0xf4, 0xd9, 0x4f, 0x5b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x46, 0x8d, 0xb0, 0x33, 0x54, 0x26, 0x5b, 0x68, 0xdf, 0xbb, 0xc5, 0xec, 0xc2, 0xf9, 0x3c, 0x5a, 0x37, 0xc1, 0x8e, 0x27, 0x47, 0xaa, 0x49, 0x5a, 0xf8, 0xfb, 0x68, 0x04, 0x23, 0xd1, 0xeb, 0x40}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x65, 0xa5, 0x11, 0x84, 0x8a, 0x67, 0x9d, 0x9e, 0xd1, 0x44, 0x68, 0x7a, 0x34, 0xe1, 0x9f, 0xa3, 0x54, 0xcd, 0x07, 0xca, 0x79, 0x1f, 0x54, 0x2f, 0x13, 0x70, 0x4e, 0xee, 0xa2, 0xfa, 0xe7, 0x5d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x36, 0xec, 0x54, 0xf8, 0xce, 0xe4, 0x85, 0xdf, 0xf6, 0x6f, 0x1d, 0x90, 0x08, 0xbc, 0xe8, 0xc0, 0x92, 0x2d, 0x43, 0x6b, 0x92, 0xa9, 0x8e, 0xab, 0x0a, 0x2e, 0x1c, 0x1e, 0x64, 0x23, 0x9f, 0x2c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xa7, 0xd6, 0x2e, 0xd5, 0xcc, 0xd4, 0xcb, 0x5a, 0x3b, 0xa7, 0xf9, 0x46, 0x03, 0x1d, 0xad, 0x2b, 0x34, 0x31, 0x90, 0x00, 0x46, 0x08, 0x82, 0x14, 0xc4, 0xe0, 0x9c, 0xf0, 0xe3, 0x55, 0x43, 0x31}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x60, 0xd6, 0xdd, 0x78, 0xe6, 0xd4, 0x22, 0x42, 0x1f, 0x00, 0xf9, 0xb1, 0x6a, 0x63, 0xe2, 0x92, 0x59, 0xd1, 0x1a, 0xb7, 0x00, 0x54, 0x29, 0xc9, 0xc1, 0xf6, 0x6f, 0x7a, 0xc5, 0x3c, 0x5f, 0x65}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x27, 0x4f, 0xd0, 0x72, 0xb1, 0x11, 0x14, 0x27, 0x15, 0x94, 0x48, 0x81, 0x7e, 0x74, 0xd8, 0x32, 0xd5, 0xd1, 0x11, 0x28, 0x60, 0x63, 0x36, 0x32, 0x37, 0xb5, 0x13, 0x1c, 0xa0, 0x37, 0xe3, 0x74}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf1, 0x25, 0x4e, 0x11, 0x96, 0x67, 0xe6, 0x1c, 0xc2, 0xb2, 0x53, 0xe2, 0xda, 0x85, 0xee, 0xb2, 0x9f, 0x59, 0xf3, 0xba, 0xbd, 0xfa, 0xcf, 0x6e, 0xf9, 0xda, 0xa4, 0xb3, 0x02, 0x8f, 0x64, 0x08}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x34, 0x94, 0xf2, 0x64, 0x54, 0x47, 0x37, 0x07, 0x40, 0x8a, 0x20, 0xba, 0x4a, 0x55, 0xd7, 0x3f, 0x47, 0xba, 0x25, 0x23, 0x14, 0xb0, 0x2c, 0xe8, 0x55, 0xa8, 0xa6, 0xef, 0x51, 0xbd, 0x6f, 0x6a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x71, 0xd6, 0x16, 0x76, 0xb2, 0x06, 0xea, 0x79, 0xf5, 0xc4, 0xc3, 0x52, 0x7e, 0x61, 0xd1, 0xe1, 0xad, 0x70, 0x78, 0x1d, 0x16, 0x11, 0xf8, 0x7c, 0x2b, 0xfc, 0x55, 0x9f, 0x52, 0xf8, 0xf5, 0x16}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x34, 0x96, 0x9a, 0xf6, 0xc5, 0xe0, 0x14, 0x03, 0x24, 0x0e, 0x4c, 0xad, 0x9e, 0x9a, 0x70, 0x23, 0x96, 0xb2, 0xf1, 0x2e, 0x9d, 0xc3, 0x32, 0x9b, 0x54, 0xa5, 0x73, 0xde, 0x88, 0xb1, 0x3e, 0x24}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf6, 0xe2, 0x4c, 0x1f, 0x5b, 0xb2, 0xaf, 0x82, 0xa5, 0xcf, 0x81, 0x10, 0x04, 0xef, 0xdb, 0xa2, 0xcc, 0x24, 0xb2, 0x7e, 0x0b, 0x7a, 0xeb, 0x01, 0xd8, 0x52, 0xf4, 0x51, 0x89, 0x29, 0x79, 0x37}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x74, 0xde, 0x12, 0xf3, 0x68, 0xb7, 0x66, 0xc3, 0xee, 0x68, 0xdc, 0x81, 0xb5, 0x55, 0x99, 0xab, 0xd9, 0x28, 0x63, 0x6d, 0x8b, 0x40, 0x69, 0x75, 0x6c, 0xcd, 0x5c, 0x2a, 0x7e, 0x32, 0x7b, 0x29}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x02, 0xcc, 0x22, 0x74, 0x4d, 0x19, 0x07, 0xc0, 0xda, 0xb5, 0x76, 0x51, 0x2a, 0xaa, 0xa6, 0x0a, 0x5f, 0x26, 0xd4, 0xbc, 0xaf, 0x48, 0x88, 0x7f, 0x02, 0xbc, 0xf2, 0xe1, 0xcf, 0xe9, 0xdd, 0x15}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xed, 0xb5, 0x9a, 0x8c, 0x9a, 0xdd, 0x27, 0xf4, 0x7f, 0x47, 0xd9, 0x52, 0xa7, 0xcd, 0x65, 0xa5, 0x31, 0x22, 0xed, 0xa6, 0x63, 0x5b, 0x80, 0x4a, 0xad, 0x4d, 0xed, 0xbf, 0xee, 0x49, 0xb3, 0x06}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf8, 0x64, 0x8b, 0x60, 0x90, 0xe9, 0xde, 0x44, 0x77, 0xb9, 0x07, 0x36, 0x32, 0xc2, 0x50, 0xf5, 0x65, 0xdf, 0x48, 0x4c, 0x37, 0xaa, 0x68, 0xab, 0x9a, 0x1f, 0x3e, 0xff, 0x89, 0x92, 0xa0, 0x07}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x7d, 0x4f, 0x9c, 0x19, 0xc0, 0x4a, 0x31, 0xec, 0xf9, 0xaa, 0xeb, 0xb2, 0x16, 0x9c, 0xa3, 0x66, 0x5f, 0xd1, 0xd4, 0xed, 0xb8, 0x92, 0x1c, 0xab, 0xda, 0xea, 0xd9, 0x57, 0xdf, 0x4c, 0x2a, 0x48}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x4b, 0xb0, 0x4e, 0x6e, 0x11, 0x3b, 0x51, 0xbd, 0x6a, 0xfd, 0xe4, 0x25, 0xa5, 0x5f, 0x11, 0x3f, 0x98, 0x92, 0x51, 0x14, 0xc6, 0x5f, 0x3c, 0x0b, 0xa8, 0xf7, 0xc2, 0x81, 0x43, 0xde, 0x91, 0x73}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x3c, 0x8f, 0x9f, 0x33, 0x2a, 0x1f, 0x43, 0x33, 0x8f, 0x68, 0xff, 0x1f, 0x3d, 0x73, 0x6b, 0xbf, 0x68, 0xcc, 0x7d, 0x13, 0x6c, 0x24, 0x4b, 0xcc, 0x4d, 0x24, 0x0d, 0xfe, 0xde, 0x86, 0xad, 0x3b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x79, 0x51, 0x81, 0x01, 0xdc, 0x73, 0x53, 0xe0, 0x6e, 0x9b, 0xea, 0x68, 0x3f, 0x5c, 0x14, 0x84, 0x53, 0x8d, 0x4b, 0xc0, 0x9f, 0x9f, 0x89, 0x2b, 0x8c, 0xba, 0x86, 0xfa, 0xf2, 0xcd, 0xe3, 0x2d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x06, 0xf9, 0x29, 0x5a, 0xdb, 0x3d, 0x84, 0x52, 0xab, 0xcc, 0x6b, 0x60, 0x9d, 0xb7, 0x4a, 0x0e, 0x36, 0x63, 0x91, 0xad, 0xa0, 0x95, 0xb0, 0x97, 0x89, 0x4e, 0xcf, 0x7d, 0x3c, 0xe5, 0x7c, 0x28}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x2e, 0x69, 0x98, 0xfd, 0xc6, 0xbd, 0xcc, 0xca, 0xdf, 0x9a, 0x44, 0x7e, 0x9d, 0xca, 0x89, 0x6d, 0xbf, 0x27, 0xc2, 0xf8, 0xcd, 0x46, 0x00, 0x2b, 0xb5, 0x58, 0x4e, 0xb7, 0x89, 0x09, 0xe9, 0x2d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x54, 0xbe, 0x75, 0xcb, 0x05, 0xb0, 0x54, 0xb7, 0xe7, 0x26, 0x86, 0x4a, 0xfc, 0x19, 0xcf, 0x27, 0x46, 0xd4, 0x22, 0x96, 0x5a, 0x11, 0xe8, 0xd5, 0x1b, 0xed, 0x71, 0xc5, 0x5d, 0xc8, 0xaf, 0x45}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x40, 0x7b, 0x77, 0x57, 0x49, 0x9e, 0x80, 0x39, 0x23, 0xee, 0x81, 0x0b, 0x22, 0xcf, 0xdb, 0x7a, 0x2f, 0x14, 0xb8, 0x57, 0x8f, 0xa1, 0x39, 0x1e, 0x77, 0xfc, 0x0b, 0xa6, 0xbf, 0x8a, 0x0c, 0x6c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x77, 0x3a, 0xd4, 0xd8, 0x27, 0xcf, 0xe8, 0xa1, 0x72, 0x9d, 0xca, 0xdd, 0x0d, 0x96, 0xda, 0x79, 0xed, 0x56, 0x42, 0x15, 0x60, 0xc7, 0x1c, 0x6b, 0x26, 0x30, 0xf6, 0x6a, 0x95, 0x67, 0xf3, 0x0a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc5, 0x08, 0xa4, 0x2b, 0x2f, 0xbd, 0x31, 0x81, 0x2a, 0xa6, 0xb6, 0xe4, 0x00, 0x91, 0xda, 0x3d, 0xb2, 0xb0, 0x96, 0xce, 0x8a, 0xd2, 0x8d, 0x70, 0xb3, 0xd3, 0x34, 0x01, 0x90, 0x8d, 0x10, 0x21}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x33, 0x0d, 0xe7, 0xba, 0x4f, 0x07, 0xdf, 0x8d, 0xea, 0x7d, 0xa0, 0xc5, 0xd6, 0xb1, 0xb0, 0xe5, 0x57, 0x1b, 0x5b, 0xf5, 0x45, 0x13, 0x14, 0x64, 0x5a, 0xeb, 0x5c, 0xfc, 0x54, 0x01, 0x76, 0x2b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x02, 0x0c, 0xc2, 0xaf, 0x96, 0x36, 0xfe, 0x4a, 0xe2, 0x54, 0x20, 0x6a, 0xeb, 0xb2, 0x9f, 0x62, 0xd7, 0xce, 0xa2, 0x3f, 0x20, 0x11, 0x34, 0x37, 0xe0, 0x42, 0xed, 0x6f, 0xf9, 0x1a, 0xc8, 0x7d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd8, 0xb9, 0x11, 0xe8, 0x36, 0x3f, 0x42, 0xc1, 0xca, 0xdc, 0xd3, 0xf1, 0xc8, 0x23, 0x3d, 0x4f, 0x51, 0x7b, 0x9d, 0x8d, 0xd8, 0xe4, 0xa0, 0xaa, 0xf3, 0x04, 0xd6, 0x11, 0x93, 0xc8, 0x35, 0x45}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x61, 0x36, 0xd6, 0x08, 0x90, 0xbf, 0xa7, 0x7a, 0x97, 0x6c, 0x0f, 0x84, 0xd5, 0x33, 0x2d, 0x37, 0xc9, 0x6a, 0x80, 0x90, 0x3d, 0x0a, 0xa2, 0xaa, 0xe1, 0xb8, 0x84, 0xba, 0x61, 0x36, 0xdd, 0x69}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x6b, 0xdb, 0x5b, 0x9c, 0xc6, 0x92, 0xbc, 0x23, 0xaf, 0xc5, 0xb8, 0x75, 0xf8, 0x42, 0xfa, 0xd6, 0xb6, 0x84, 0x94, 0x63, 0x98, 0x93, 0x48, 0x78, 0x38, 0xcd, 0xbb, 0x18, 0x34, 0xc3, 0xdb, 0x67}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x96, 0xf3, 0x3a, 0x09, 0x56, 0xb0, 0x6f, 0x7c, 0x51, 0x1e, 0x1b, 0x39, 0x48, 0xea, 0xc9, 0x0c, 0x25, 0xa2, 0x7a, 0xca, 0xe7, 0x92, 0xfc, 0x59, 0x30, 0xa3, 0x89, 0x85, 0xdf, 0x6f, 0x43, 0x38}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x79, 0x84, 0x44, 0x19, 0xbd, 0xe9, 0x54, 0xc4, 0xc0, 0x6e, 0x2a, 0xa8, 0xa8, 0x9b, 0x43, 0xd5, 0x71, 0x22, 0x5f, 0xdc, 0x01, 0xfa, 0xdf, 0xb3, 0xb8, 0x47, 0x4b, 0x0a, 0xa5, 0x44, 0xea, 0x29}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x05, 0x90, 0x50, 0xaf, 0x63, 0x5f, 0x9d, 0x9e, 0xe1, 0x9d, 0x38, 0x97, 0x1f, 0x6c, 0xac, 0x30, 0x46, 0xb2, 0x6a, 0x19, 0xd1, 0x4b, 0xdb, 0xbb, 0x8c, 0xda, 0x2e, 0xab, 0xc8, 0x5a, 0x77, 0x6c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x2b, 0xbe, 0xaf, 0xa1, 0x6d, 0x2f, 0x0b, 0xb1, 0x8f, 0xe3, 0xe0, 0x38, 0xcd, 0x0b, 0x41, 0x1b, 0x4a, 0x15, 0x07, 0xf3, 0x6f, 0xdc, 0xb8, 0xe9, 0xde, 0xb2, 0xa3, 0x40, 0x01, 0xa6, 0x45, 0x1e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x76, 0x0a, 0xda, 0x8d, 0x2c, 0x07, 0x3f, 0x89, 0x7d, 0x04, 0xad, 0x43, 0x50, 0x6e, 0xd2, 0x47, 0xcb, 0x8a, 0xe6, 0x85, 0x1a, 0x24, 0xf3, 0xd2, 0x60, 0xfd, 0xdf, 0x73, 0xa4, 0x0d, 0x73, 0x0e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xfd, 0x67, 0x6b, 0x71, 0x9b, 0x81, 0x53, 0x39, 0x39, 0xf4, 0xb8, 0xd5, 0xc3, 0x30, 0x9b, 0x3b, 0x7c, 0xa3, 0xf0, 0xd0, 0x84, 0x21, 0xd6, 0xbf, 0xb7, 0x4c, 0x87, 0x13, 0x45, 0x2d, 0xa7, 0x55}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x5d, 0x04, 0xb3, 0x40, 0x28, 0x95, 0x2d, 0x30, 0x83, 0xec, 0x5e, 0xe4, 0xff, 0x75, 0xfe, 0x79, 0x26, 0x9d, 0x1d, 0x36, 0xcd, 0x0a, 0x15, 0xd2, 0x24, 0x14, 0x77, 0x71, 0xd7, 0x8a, 0x1b, 0x04}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x5d, 0x93, 0xc9, 0xbe, 0xaa, 0x90, 0xcd, 0x9b, 0xfb, 0x73, 0x7e, 0xb0, 0x64, 0x98, 0x57, 0x44, 0x42, 0x41, 0xb1, 0xaf, 0xea, 0xc1, 0xc3, 0x22, 0xff, 0x60, 0x46, 0xcb, 0x61, 0x81, 0x70, 0x61}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x0d, 0x82, 0xb9, 0xfe, 0x21, 0xcd, 0xc4, 0xf5, 0x98, 0x0c, 0x4e, 0x72, 0xee, 0x87, 0x49, 0xf8, 0xa1, 0x95, 0xdf, 0x8f, 0x2d, 0xbd, 0x21, 0x06, 0x7c, 0x15, 0xe8, 0x12, 0x6d, 0x93, 0xd6, 0x38}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x91, 0xf7, 0x51, 0xd9, 0xef, 0x7d, 0x42, 0x01, 0x13, 0xe9, 0xb8, 0x7f, 0xa6, 0x49, 0x17, 0x64, 0x21, 0x80, 0x83, 0x2c, 0x63, 0x4c, 0x60, 0x09, 0x59, 0x91, 0x92, 0x77, 0x39, 0x51, 0xf4, 0x48}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x60, 0xd5, 0x22, 0x83, 0x08, 0x2f, 0xff, 0x99, 0x3e, 0x69, 0x6d, 0x88, 0xda, 0xe7, 0x5b, 0x52, 0x26, 0x31, 0x2a, 0xe5, 0x89, 0xde, 0x68, 0x90, 0xb6, 0x22, 0x5a, 0xbd, 0xd3, 0x85, 0x53, 0x31}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd8, 0xce, 0xdc, 0xf9, 0x3c, 0x4b, 0xa2, 0x1d, 0x2c, 0x2f, 0x36, 0xbe, 0x7a, 0xfc, 0xcd, 0xbc, 0xdc, 0xf9, 0x30, 0xbd, 0xff, 0x05, 0xc7, 0xe4, 0x8e, 0x17, 0x62, 0xf8, 0x4d, 0xa0, 0x56, 0x79}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x82, 0xe7, 0xf6, 0xba, 0x53, 0x84, 0x0a, 0xa3, 0x34, 0xff, 0x3c, 0xa3, 0x6a, 0xa1, 0x37, 0xea, 0xdd, 0xb6, 0x95, 0xb3, 0x78, 0x19, 0x76, 0x1e, 0x55, 0x2f, 0x77, 0x2e, 0x7f, 0xc1, 0xea, 0x5e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x83, 0xe1, 0x6e, 0xa9, 0x07, 0x33, 0x3e, 0x83, 0xff, 0xcb, 0x1c, 0x9f, 0xb1, 0xa3, 0xb4, 0xc9, 0xe1, 0x07, 0x97, 0xff, 0xf8, 0x23, 0x8f, 0xce, 0x40, 0xfd, 0x2e, 0x5e, 0xdb, 0x16, 0x43, 0x2d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xba, 0x38, 0x02, 0xf7, 0x81, 0x43, 0x83, 0xa3, 0x20, 0x4f, 0x01, 0x3b, 0x8a, 0x04, 0x38, 0x31, 0xc6, 0x0f, 0xc8, 0xdf, 0xd7, 0xfa, 0x2f, 0x88, 0x3f, 0xfc, 0x0c, 0x76, 0xc4, 0xa6, 0x45, 0x72}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xbb, 0x0c, 0xbc, 0x6a, 0xa4, 0x97, 0x17, 0x93, 0x2d, 0x6f, 0xde, 0x72, 0x10, 0x1c, 0x08, 0x2c, 0x0f, 0x80, 0x32, 0x68, 0x27, 0xd4, 0xab, 0xdd, 0xc5, 0x58, 0x61, 0x13, 0x6d, 0x11, 0x1e, 0x4d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x1a, 0xb9, 0xc9, 0x10, 0xfb, 0x1e, 0x4e, 0xf4, 0x84, 0x4b, 0x8a, 0x5e, 0x7b, 0x4b, 0xe8, 0x43, 0x8c, 0x8f, 0x00, 0xb5, 0x54, 0x13, 0xc5, 0x5c, 0xb6, 0x35, 0x4e, 0x9d, 0xe4, 0x5b, 0x41, 0x6d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x15, 0x7d, 0x12, 0x48, 0x82, 0x14, 0x42, 0xcd, 0x32, 0xd4, 0x4b, 0xc1, 0x72, 0x61, 0x2a, 0x8c, 0xec, 0xe2, 0xf8, 0x24, 0x45, 0x94, 0xe3, 0xbe, 0xdd, 0x67, 0xa8, 0x77, 0x5a, 0xae, 0x5b, 0x4b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xcb, 0x77, 0x9a, 0x20, 0xde, 0xb8, 0x23, 0xd9, 0xa0, 0x0f, 0x8c, 0x7b, 0xa5, 0xcb, 0xae, 0xb6, 0xec, 0x42, 0x67, 0x0e, 0x58, 0xa4, 0x75, 0x98, 0x21, 0x71, 0x84, 0xb3, 0xe0, 0x76, 0x94, 0x73}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xdf, 0xfc, 0x69, 0x28, 0x23, 0x3f, 0x5b, 0xf8, 0x3b, 0x24, 0x37, 0xf3, 0x1d, 0xd5, 0x22, 0x6b, 0xd0, 0x98, 0xa8, 0x6c, 0xcf, 0xff, 0x06, 0xe1, 0x13, 0xdf, 0xb9, 0xc1, 0x0c, 0xa9, 0xbf, 0x33}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xd9, 0x81, 0xda, 0xb2, 0x4f, 0x82, 0x9d, 0x43, 0x81, 0x09, 0xf1, 0xd2, 0x01, 0xef, 0xac, 0xf4, 0x2d, 0x7d, 0x01, 0x09, 0xf1, 0xff, 0xa5, 0x9f, 0xe5, 0xca, 0x27, 0x63, 0xdb, 0x20, 0xb1, 0x53}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x67, 0x02, 0xe8, 0xad, 0xa9, 0x34, 0xd4, 0xf0, 0x15, 0x81, 0xaa, 0xc7, 0x4d, 0x87, 0x94, 0xea, 0x75, 0xe7, 0x4c, 0x94, 0x04, 0x0e, 0x69, 0x87, 0xe7, 0x51, 0x91, 0x10, 0x03, 0xc7, 0xbe, 0x56}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x32, 0xfb, 0x86, 0xec, 0x33, 0x6b, 0x2e, 0x51, 0x2b, 0xc8, 0xfa, 0x6c, 0x70, 0x47, 0x7e, 0xce, 0x05, 0x0c, 0x71, 0xf3, 0xb4, 0x56, 0xa6, 0xdc, 0xcc, 0x78, 0x07, 0x75, 0xd0, 0xdd, 0xb2, 0x6a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xc6, 0xef, 0xb9, 0xc0, 0x2b, 0x22, 0x08, 0x1e, 0x71, 0x70, 0xb3, 0x35, 0x9c, 0x7a, 0x01, 0x92, 0x44, 0x9a, 0xf6, 0xb0, 0x58, 0x95, 0xc1, 0x9b, 0x02, 0xed, 0x2d, 0x7c, 0x34, 0x29, 0x49, 0x44}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x45, 0x62, 0x1d, 0x2e, 0xff, 0x2a, 0x1c, 0x21, 0xa4, 0x25, 0x7b, 0x0d, 0x8c, 0x15, 0x39, 0xfc, 0x8f, 0x7c, 0xa5, 0x7d, 0x1e, 0x25, 0xa3, 0x45, 0xd6, 0xab, 0xbd, 0xcb, 0xc5, 0x5e, 0x78, 0x77}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd0, 0xd3, 0x42, 0xed, 0x1d, 0x00, 0x3c, 0x15, 0x2c, 0x9c, 0x77, 0x81, 0xd2, 0x73, 0xd1, 0x06, 0xd5, 0xc4, 0x7f, 0x94, 0xbb, 0x92, 0x2d, 0x2c, 0x4b, 0x45, 0x4b, 0xe9, 0x2a, 0x89, 0x6b, 0x2b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xd2, 0x0c, 0x88, 0xc5, 0x48, 0x4d, 0xea, 0x0d, 0x4a, 0xc9, 0x52, 0x6a, 0x61, 0x79, 0xe9, 0x76, 0xf3, 0x85, 0x52, 0x5c, 0x1b, 0x2c, 0xe1, 0xd6, 0xc4, 0x0f, 0x18, 0x0e, 0x4e, 0xf6, 0x1c, 0x7f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xb4, 0x04, 0x2e, 0x42, 0xcb, 0x1f, 0x2b, 0x11, 0x51, 0x7b, 0x08, 0xac, 0xaa, 0x3e, 0x9e, 0x52, 0x60, 0xb7, 0xc2, 0x61, 0x57, 0x8c, 0x84, 0xd5, 0x18, 0xa6, 0x19, 0xfc, 0xb7, 0x75, 0x91, 0x1b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe8, 0x68, 0xca, 0x44, 0xc8, 0x38, 0x38, 0xcc, 0x53, 0x0a, 0x32, 0x35, 0xcc, 0x52, 0xcb, 0x0e, 0xf7, 0xc5, 0xe7, 0xec, 0x3d, 0x85, 0xcc, 0x58, 0xe2, 0x17, 0x47, 0xff, 0x9f, 0xa5, 0x30, 0x17}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe3, 0xae, 0xc8, 0xc1, 0x71, 0x75, 0x31, 0x00, 0x37, 0x41, 0x5c, 0x0e, 0x39, 0xda, 0x73, 0xa0, 0xc7, 0x97, 0x36, 0x6c, 0x5b, 0xf2, 0xee, 0x64, 0x0a, 0x3d, 0x89, 0x1e, 0x1d, 0x49, 0x8c, 0x37}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x4c, 0xe6, 0xb0, 0xc1, 0xa5, 0x2a, 0x82, 0x09, 0x08, 0xad, 0x79, 0x9c, 0x56, 0xf6, 0xf9, 0xc1, 0xd7, 0x7c, 0x39, 0x7f, 0x93, 0xca, 0x11, 0x55, 0xbf, 0x07, 0x1b, 0x82, 0x29, 0x69, 0x95, 0x5c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x87, 0xee, 0xa6, 0x56, 0x9e, 0xc2, 0x9a, 0x56, 0x24, 0x42, 0x85, 0x4d, 0x98, 0x31, 0x1e, 0x60, 0x4d, 0x87, 0x85, 0x04, 0xae, 0x46, 0x12, 0xf9, 0x8e, 0x7f, 0xe4, 0x7f, 0xf6, 0x1c, 0x37, 0x01}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x73, 0x4c, 0xb6, 0xc5, 0xc4, 0xe9, 0x6c, 0x85, 0x48, 0x4a, 0x5a, 0xac, 0xd9, 0x1f, 0x43, 0xf8, 0x62, 0x5b, 0xee, 0x98, 0x2a, 0x33, 0x8e, 0x79, 0xce, 0x61, 0x06, 0x35, 0xd8, 0xd7, 0xca, 0x71}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x72, 0xd3, 0xae, 0xa6, 0xca, 0x8f, 0xcd, 0xcc, 0x78, 0x8e, 0x19, 0x4d, 0xa7, 0xd2, 0x27, 0xe9, 0xa4, 0x3c, 0x16, 0x5b, 0x84, 0x80, 0xf9, 0xd0, 0xcc, 0x6a, 0x1e, 0xca, 0x1e, 0x67, 0xbd, 0x63}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x7b, 0x6e, 0x2a, 0xd2, 0x87, 0x48, 0xff, 0xa1, 0xca, 0xe9, 0x15, 0x85, 0xdc, 0xdb, 0x2c, 0x39, 0x12, 0x91, 0xa9, 0x20, 0xaa, 0x4f, 0x29, 0xf4, 0x15, 0x7a, 0xd2, 0xf5, 0x32, 0xcc, 0x60, 0x04}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe5, 0x10, 0x47, 0x3b, 0xfa, 0x90, 0xfc, 0x30, 0xb5, 0xea, 0x6f, 0x56, 0x8f, 0xfb, 0x0e, 0xa7, 0x3b, 0xc8, 0xb2, 0xff, 0x02, 0x7a, 0x33, 0x94, 0x93, 0x2a, 0x03, 0xe0, 0x96, 0x3a, 0x6c, 0x0f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x5a, 0x63, 0x67, 0xe1, 0x9b, 0x47, 0x78, 0x9f, 0x38, 0x79, 0xac, 0x97, 0x66, 0x1d, 0x5e, 0x51, 0xee, 0x24, 0x42, 0xe8, 0x58, 0x4b, 0x8a, 0x03, 0x75, 0x86, 0x37, 0x86, 0xe2, 0x97, 0x4e, 0x3d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x3f, 0x75, 0x8e, 0xb4, 0xff, 0xd8, 0xdd, 0xd6, 0x37, 0x57, 0x9d, 0x6d, 0x3b, 0xbd, 0xd5, 0x60, 0x88, 0x65, 0x9a, 0xb9, 0x4a, 0x68, 0x84, 0xa2, 0x67, 0xdd, 0x17, 0x25, 0x97, 0x04, 0x8b, 0x5e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xbb, 0x40, 0x5e, 0xbc, 0x16, 0x92, 0x05, 0xc4, 0xc0, 0x4e, 0x72, 0x90, 0x0e, 0xab, 0xcf, 0x8a, 0xed, 0xef, 0xb9, 0x2d, 0x3b, 0xf8, 0x43, 0x5b, 0xba, 0x2d, 0xeb, 0x2f, 0x52, 0xd2, 0xd1, 0x5a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x40, 0xb4, 0xab, 0xe6, 0xad, 0x9f, 0x46, 0x69, 0x4a, 0xb3, 0x8e, 0xaa, 0xea, 0x9c, 0x8a, 0x20, 0x16, 0x5d, 0x8c, 0x13, 0xbd, 0xf6, 0x1d, 0xc5, 0x24, 0xbd, 0x90, 0x2a, 0x1c, 0xc7, 0x13, 0x3b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x54, 0xdc, 0x16, 0x0d, 0x18, 0xbe, 0x35, 0x64, 0x61, 0x52, 0x02, 0x80, 0xaf, 0x05, 0xf7, 0xa6, 0x42, 0xd3, 0x8f, 0x2e, 0x79, 0x26, 0xa8, 0xbb, 0xb2, 0x17, 0x48, 0xb2, 0x7a, 0x0a, 0x89, 0x14}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x20, 0xa8, 0x88, 0xe3, 0x91, 0xc0, 0x6e, 0xbb, 0x8a, 0x27, 0x82, 0x51, 0x83, 0xb2, 0x28, 0xa9, 0x83, 0xeb, 0xa6, 0xa9, 0x4d, 0x17, 0x59, 0x22, 0x54, 0x00, 0x50, 0x45, 0xcb, 0x48, 0x4b, 0x18}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x33, 0x7c, 0xe7, 0x26, 0xba, 0x4d, 0x32, 0xfe, 0x53, 0xf4, 0xfa, 0x83, 0xe3, 0xa5, 0x79, 0x66, 0x73, 0xef, 0x80, 0x23, 0x68, 0xc2, 0x60, 0xdd, 0xa9, 0x33, 0xdc, 0x03, 0x7a, 0xe0, 0xe0, 0x3e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x34, 0x5c, 0x13, 0xfb, 0xc0, 0xe3, 0x78, 0x2b, 0x54, 0x58, 0x22, 0x9b, 0x76, 0x81, 0x7f, 0x93, 0x9c, 0x25, 0x3c, 0xd2, 0xe9, 0x96, 0x21, 0x26, 0x08, 0xf5, 0xed, 0x95, 0x11, 0xae, 0x04, 0x5a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xb9, 0xe8, 0xc5, 0x12, 0x97, 0x1f, 0x83, 0xfe, 0x3e, 0x94, 0x99, 0xd4, 0x2d, 0xf9, 0x52, 0x59, 0x5c, 0x82, 0xa6, 0xf0, 0x75, 0x7e, 0xe8, 0xec, 0xcc, 0xac, 0x18, 0x21, 0x09, 0x67, 0x66, 0x67}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xb3, 0x40, 0x29, 0xd1, 0xcb, 0x1b, 0x08, 0x9e, 0x9c, 0xb7, 0x53, 0xb9, 0x3b, 0x71, 0x08, 0x95, 0x12, 0x1a, 0x58, 0xaf, 0x7e, 0x82, 0x52, 0x43, 0x4f, 0x11, 0x39, 0xf4, 0x93, 0x1a, 0x26, 0x05}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x6e, 0x44, 0xa3, 0xf9, 0x64, 0xaf, 0xe7, 0x6d, 0x7d, 0xdf, 0x1e, 0xac, 0x04, 0xea, 0x3b, 0x5f, 0x9b, 0xe8, 0x24, 0x9d, 0x0e, 0xe5, 0x2e, 0x3e, 0xdf, 0xa9, 0xf7, 0xd4, 0x50, 0x71, 0xf0, 0x78}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x3e, 0xa8, 0x38, 0xc2, 0x57, 0x56, 0x42, 0x9a, 0xb1, 0xe2, 0xf8, 0x45, 0xaa, 0x11, 0x48, 0x5f, 0x17, 0xc4, 0x54, 0x27, 0xdc, 0x5d, 0xaa, 0xdd, 0x41, 0xbc, 0xdf, 0x81, 0xb9, 0x53, 0xee, 0x52}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc3, 0xf1, 0xa7, 0x6d, 0xb3, 0x5f, 0x92, 0x6f, 0xcc, 0x91, 0xb8, 0x95, 0x05, 0xdf, 0x3c, 0x64, 0x57, 0x39, 0x61, 0x51, 0xad, 0x8c, 0x38, 0x7b, 0xc8, 0xde, 0x00, 0x34, 0xbe, 0xa1, 0xb0, 0x7e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x25, 0x24, 0x1d, 0x8a, 0x67, 0x20, 0xee, 0x42, 0xeb, 0x38, 0xed, 0x0b, 0x8b, 0xcd, 0x46, 0x9d, 0x5e, 0x6b, 0x1e, 0x24, 0x9d, 0x12, 0x05, 0x1a, 0xcc, 0x05, 0x4e, 0x92, 0x38, 0xe1, 0x1f, 0x50}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x4e, 0xee, 0x1c, 0x91, 0xe6, 0x11, 0xbd, 0x8e, 0x55, 0x1a, 0x18, 0x75, 0x66, 0xaf, 0x4d, 0x7b, 0x0f, 0xae, 0x6d, 0x85, 0xca, 0x82, 0x58, 0x21, 0x9c, 0x18, 0xe0, 0xed, 0xec, 0x22, 0x80, 0x2f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x68, 0x3b, 0x0a, 0x39, 0x1d, 0x6a, 0x15, 0x57, 0xfc, 0xf0, 0x63, 0x54, 0xdb, 0x39, 0xdb, 0xe8, 0x5c, 0x64, 0xff, 0xa0, 0x09, 0x4f, 0x3b, 0xb7, 0x32, 0x60, 0x99, 0x94, 0xfd, 0x94, 0x82, 0x2d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x24, 0xf6, 0x5a, 0x44, 0xf1, 0x55, 0x2c, 0xdb, 0xea, 0x7c, 0x84, 0x7c, 0x01, 0xac, 0xe3, 0xfd, 0xc9, 0x27, 0xc1, 0x5a, 0xb9, 0xde, 0x4f, 0x5a, 0x90, 0xdd, 0xc6, 0x67, 0xaa, 0x6f, 0x8a, 0x3a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x78, 0x52, 0x87, 0xc9, 0x97, 0x63, 0xb1, 0xdd, 0x54, 0x5f, 0xc1, 0xf8, 0xf1, 0x06, 0xa6, 0xa8, 0xa3, 0x88, 0x82, 0xd4, 0xcb, 0xa6, 0x19, 0xdd, 0xd1, 0x11, 0x87, 0x08, 0x17, 0x4c, 0x37, 0x2a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xa1, 0x0c, 0xf3, 0x08, 0x43, 0xd9, 0x24, 0x1e, 0x83, 0xa7, 0xdf, 0x91, 0xca, 0xbd, 0x69, 0x47, 0x8d, 0x1b, 0xe2, 0xb9, 0x4e, 0xb5, 0xe1, 0x76, 0xb3, 0x1c, 0x93, 0x03, 0xce, 0x5f, 0xb3, 0x5a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x1d, 0xda, 0xe4, 0x61, 0x03, 0x50, 0xa9, 0x8b, 0x68, 0x18, 0xef, 0xb2, 0x1c, 0x84, 0x3b, 0xa2, 0x44, 0x95, 0xa3, 0x04, 0x3b, 0xd6, 0x99, 0x00, 0xaf, 0x76, 0x42, 0x67, 0x02, 0x7d, 0x85, 0x56}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xce, 0x72, 0x0e, 0x29, 0x84, 0xb2, 0x7d, 0xd2, 0x45, 0xbe, 0x57, 0x06, 0xed, 0x7f, 0xcf, 0xed, 0xcd, 0xef, 0x19, 0xd6, 0xbc, 0x15, 0x79, 0x64, 0xd2, 0x18, 0xe3, 0x20, 0x67, 0x3a, 0x54, 0x0b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x52, 0xfd, 0x04, 0xc5, 0xfb, 0x99, 0xe7, 0xe8, 0xfb, 0x8c, 0xe1, 0x42, 0x03, 0xef, 0x9d, 0xd9, 0x9e, 0x4d, 0xf7, 0x80, 0xcf, 0x2e, 0xcc, 0x9b, 0x45, 0xc9, 0x7b, 0x7a, 0xbc, 0x37, 0xa8, 0x52}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x96, 0x11, 0x41, 0x8a, 0x47, 0x91, 0xfe, 0xb6, 0xda, 0x7a, 0x54, 0x63, 0xd1, 0x14, 0x35, 0x05, 0x86, 0x8c, 0xa9, 0x36, 0x3f, 0xf2, 0x85, 0x54, 0x4e, 0x92, 0xd8, 0x85, 0x01, 0x46, 0xd6, 0x50}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x53, 0xcd, 0xf3, 0x86, 0x40, 0xe6, 0x39, 0x42, 0x95, 0xd6, 0xcb, 0x45, 0x1a, 0x20, 0xc8, 0x45, 0x4b, 0x32, 0x69, 0x04, 0xb1, 0xaf, 0x20, 0x46, 0xc7, 0x6b, 0x23, 0x5b, 0x69, 0xee, 0x30, 0x3f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x70, 0x83, 0x47, 0xc0, 0xdb, 0x55, 0x08, 0xa8, 0x7b, 0x18, 0x6d, 0xf5, 0x04, 0x5a, 0x20, 0x0c, 0x4a, 0x8c, 0x60, 0xae, 0xae, 0x0f, 0x64, 0x55, 0x55, 0x2e, 0xd5, 0x1d, 0x53, 0x31, 0x42, 0x41}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xca, 0xfc, 0x88, 0x6b, 0x96, 0x78, 0x0a, 0x8b, 0x83, 0xdc, 0xbc, 0xaf, 0x40, 0xb6, 0x8d, 0x7f, 0xef, 0xb4, 0xd1, 0x3f, 0xcc, 0xa2, 0x74, 0xc9, 0xc2, 0x92, 0x55, 0x00, 0xab, 0xdb, 0xbf, 0x4f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x93, 0x1c, 0x06, 0x2d, 0x66, 0x65, 0x02, 0xa4, 0x97, 0x18, 0xfd, 0x00, 0xe7, 0xab, 0x03, 0xec, 0xce, 0xc1, 0xbf, 0x37, 0xf8, 0x13, 0x53, 0xa5, 0xe5, 0x0c, 0x3a, 0xa8, 0x55, 0xb9, 0xff, 0x68}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe4, 0xe6, 0x6d, 0x30, 0x7d, 0x30, 0x35, 0xc2, 0x78, 0x87, 0xf9, 0xfc, 0x6b, 0x5a, 0xc3, 0xb7, 0x65, 0xd8, 0x2e, 0xc7, 0xa5, 0x0c, 0xc6, 0xdc, 0x12, 0xaa, 0xd6, 0x4f, 0xc5, 0x38, 0xbc, 0x0e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe2, 0x3c, 0x76, 0x86, 0x38, 0xf2, 0x7b, 0x2c, 0x16, 0x78, 0x8d, 0xf5, 0xa4, 0x15, 0xda, 0xdb, 0x26, 0x85, 0xa0, 0x56, 0xdd, 0x1d, 0xe3, 0xb3, 0xfd, 0x40, 0xef, 0xf2, 0xd9, 0xa1, 0xb3, 0x04}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xdb, 0x49, 0x0e, 0xe6, 0x58, 0x10, 0x7a, 0x52, 0xda, 0xb5, 0x7d, 0x37, 0x6a, 0x3e, 0xa1, 0x78, 0xce, 0xc7, 0x1c, 0x24, 0x23, 0xdb, 0x7d, 0xfb, 0x8c, 0x8d, 0xdc, 0x30, 0x67, 0x69, 0x75, 0x3b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xa9, 0xea, 0x6d, 0x16, 0x16, 0x60, 0xf4, 0x60, 0x87, 0x19, 0x44, 0x8c, 0x4a, 0x8b, 0x3e, 0xfb, 0x16, 0x00, 0x00, 0x54, 0xa6, 0x9e, 0x9f, 0xef, 0xcf, 0xd9, 0xd2, 0x4c, 0x74, 0x31, 0xd0, 0x34}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xa4, 0xeb, 0x04, 0xa4, 0x8c, 0x8f, 0x71, 0x27, 0x95, 0x85, 0x5d, 0x55, 0x4b, 0xb1, 0x26, 0x26, 0xc8, 0xae, 0x6a, 0x7d, 0xa2, 0x21, 0xca, 0xce, 0x38, 0xab, 0x0f, 0xd0, 0xd5, 0x2b, 0x6b, 0x00}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe5, 0x67, 0x0c, 0xf1, 0x3a, 0x9a, 0xea, 0x09, 0x39, 0xef, 0xd1, 0x30, 0xbc, 0x33, 0xba, 0xb1, 0x6a, 0xc5, 0x27, 0x08, 0x7f, 0x54, 0x80, 0x3d, 0xab, 0xf6, 0x15, 0x7a, 0xc2, 0x40, 0x73, 0x72}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x84, 0x56, 0x82, 0xb6, 0x12, 0x70, 0x7f, 0xf7, 0xf0, 0xbd, 0x5b, 0xa9, 0xd5, 0xc5, 0x5f, 0x59, 0xbf, 0x7f, 0xb3, 0x55, 0x22, 0x02, 0xc9, 0x44, 0x55, 0x87, 0x8f, 0x96, 0x98, 0x64, 0x6d, 0x15}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xb0, 0x8b, 0xaa, 0x1e, 0xec, 0xc7, 0xa5, 0x8f, 0x1f, 0x92, 0x04, 0xc6, 0x05, 0xf6, 0xdf, 0xa1, 0xcc, 0x1f, 0x81, 0xf5, 0x0e, 0x9c, 0x57, 0xdc, 0xe3, 0xbb, 0x06, 0x87, 0x1e, 0xfe, 0x23, 0x6c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd8, 0x2b, 0x5b, 0x16, 0xea, 0x20, 0xf1, 0xd3, 0x68, 0x8f, 0xae, 0x5b, 0xd0, 0xa9, 0x1a, 0x19, 0xa8, 0x36, 0xfb, 0x2b, 0x57, 0x88, 0x7d, 0x90, 0xd5, 0xa6, 0xf3, 0xdc, 0x38, 0x89, 0x4e, 0x1f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xcc, 0x19, 0xda, 0x9b, 0x3b, 0x43, 0x48, 0x21, 0x2e, 0x23, 0x4d, 0x3d, 0xae, 0xf8, 0x8c, 0xfc, 0xdd, 0xa6, 0x74, 0x37, 0x65, 0xca, 0xee, 0x1a, 0x19, 0x8e, 0x9f, 0x64, 0x6f, 0x0c, 0x8b, 0x5a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x25, 0xb9, 0xc2, 0xf0, 0x72, 0xb8, 0x15, 0x16, 0xcc, 0x8d, 0x3c, 0x6f, 0x25, 0xed, 0xf4, 0x46, 0x2e, 0x0c, 0x60, 0x0f, 0xe2, 0x84, 0x34, 0x55, 0x89, 0x59, 0x34, 0x1b, 0xf5, 0x8d, 0xfe, 0x08}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf8, 0xab, 0x93, 0xbc, 0x44, 0xba, 0x1b, 0x75, 0x4b, 0x49, 0x6f, 0xd0, 0x54, 0x2e, 0x63, 0xba, 0xb5, 0xea, 0xed, 0x32, 0x14, 0xc9, 0x94, 0xd8, 0xc5, 0xce, 0xf4, 0x10, 0x68, 0xe0, 0x38, 0x27}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x74, 0x1c, 0x14, 0x9b, 0xd4, 0x64, 0x61, 0x71, 0x5a, 0xb6, 0x21, 0x33, 0x4f, 0xf7, 0x8e, 0xba, 0xa5, 0x48, 0x9a, 0xc7, 0xfa, 0x9a, 0xf0, 0xb4, 0x62, 0xad, 0xf2, 0x5e, 0xcc, 0x03, 0x24, 0x1a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf5, 0x76, 0xfd, 0xe4, 0xaf, 0xb9, 0x03, 0x59, 0xce, 0x63, 0xd2, 0x3b, 0x1f, 0xcd, 0x21, 0x0c, 0xad, 0x44, 0xa5, 0x97, 0xac, 0x80, 0x11, 0x02, 0x9b, 0x0c, 0xe5, 0x8b, 0xcd, 0xfb, 0x79, 0x77}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x15, 0xbe, 0x9a, 0x0d, 0xba, 0x38, 0x72, 0x20, 0x8a, 0xf5, 0xbe, 0x59, 0x93, 0x79, 0xb7, 0xf6, 0x6a, 0x0c, 0x38, 0x27, 0x1a, 0x60, 0xf4, 0x86, 0x3b, 0xab, 0x5a, 0x00, 0xa0, 0xce, 0x21, 0x7d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x6c, 0xba, 0x14, 0xc5, 0xea, 0x12, 0x9e, 0x2e, 0x82, 0x63, 0xce, 0x9b, 0x4a, 0xe7, 0x1d, 0xec, 0xf1, 0x2e, 0x51, 0x1c, 0xf4, 0xd0, 0x69, 0x15, 0x42, 0x9d, 0xa3, 0x3f, 0x0e, 0xbf, 0xe9, 0x5c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe4, 0x0d, 0xf4, 0xbd, 0xee, 0x31, 0x10, 0xed, 0xcb, 0x12, 0x86, 0xad, 0xd4, 0x2f, 0x90, 0x37, 0x32, 0xc3, 0x0b, 0x73, 0xec, 0x97, 0x85, 0xa4, 0x01, 0x1c, 0x76, 0x35, 0xfe, 0x75, 0xdd, 0x71}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x11, 0xa4, 0x88, 0x9f, 0x3e, 0x53, 0x69, 0x3b, 0x1b, 0xe0, 0xf7, 0xba, 0x9b, 0xad, 0x4e, 0x81, 0x5f, 0xb5, 0x5c, 0xae, 0xbe, 0x67, 0x86, 0x37, 0x34, 0x8e, 0x07, 0x32, 0x45, 0x4a, 0x67, 0x39}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x90, 0x70, 0x58, 0x20, 0x03, 0x1e, 0x67, 0xb2, 0xc8, 0x9b, 0x58, 0xc5, 0xb1, 0xeb, 0x2d, 0x4a, 0xde, 0x82, 0x8c, 0xf2, 0xd2, 0x14, 0xb8, 0x70, 0x61, 0x4e, 0x73, 0xd6, 0x0b, 0x6b, 0x0d, 0x30}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x81, 0xfc, 0x55, 0x5c, 0xbf, 0xa7, 0xc4, 0xbd, 0xe2, 0xf0, 0x4b, 0x8f, 0xe9, 0x7d, 0x99, 0xfa, 0xd3, 0xab, 0xbc, 0xc7, 0x83, 0x2b, 0x04, 0x7f, 0x0c, 0x19, 0x43, 0x03, 0x3d, 0x07, 0xca, 0x40}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xf9, 0xc8, 0xbe, 0x8c, 0x16, 0x81, 0x39, 0x96, 0xf6, 0x17, 0x58, 0xc8, 0x30, 0x58, 0xfb, 0xc2, 0x03, 0x45, 0xd2, 0x52, 0x76, 0xe0, 0x6a, 0x26, 0x28, 0x5c, 0x88, 0x59, 0x6a, 0x5a, 0x54, 0x42}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x07, 0xb5, 0x2e, 0x2c, 0x67, 0x15, 0x9b, 0xfb, 0x83, 0x69, 0x1e, 0x0f, 0xda, 0xd6, 0x29, 0xb1, 0x60, 0xe0, 0xb2, 0xba, 0x69, 0xa2, 0x9e, 0xbd, 0xbd, 0xe0, 0x1c, 0xbd, 0xcd, 0x06, 0x64, 0x70}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x41, 0xfa, 0x8c, 0xe1, 0x89, 0x8f, 0x27, 0xc8, 0x25, 0x8f, 0x6f, 0x5f, 0x55, 0xf8, 0xde, 0x95, 0x6d, 0x2f, 0x75, 0x16, 0x2b, 0x4e, 0x44, 0xfd, 0x86, 0x6e, 0xe9, 0x70, 0x39, 0x76, 0x97, 0x7e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x17, 0x62, 0x6b, 0x14, 0xa1, 0x7c, 0xd0, 0x79, 0x6e, 0xd8, 0x8a, 0xa5, 0x6d, 0x8c, 0x93, 0xd2, 0x3f, 0xec, 0x44, 0x8d, 0x6e, 0x91, 0x01, 0x8c, 0x8f, 0xee, 0x01, 0x8f, 0xc0, 0xb4, 0x85, 0x0e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x02, 0x3a, 0x70, 0x41, 0xe4, 0x11, 0x57, 0x23, 0xac, 0xe6, 0xfc, 0x54, 0x7e, 0xcd, 0xd7, 0x22, 0xcb, 0x76, 0x9f, 0x20, 0xce, 0xa0, 0x73, 0x76, 0x51, 0x3b, 0xa4, 0xf8, 0xe3, 0x62, 0x12, 0x6c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x7f, 0x00, 0x9c, 0x26, 0x0d, 0x6f, 0x48, 0x7f, 0x3a, 0x01, 0xed, 0xc5, 0x96, 0xb0, 0x1f, 0x4f, 0xa8, 0x02, 0x62, 0x27, 0x8a, 0x50, 0x8d, 0x9a, 0x8b, 0x52, 0x0f, 0x1e, 0xcf, 0x41, 0x38, 0x19}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xf5, 0x6c, 0xd4, 0x2f, 0x0f, 0x69, 0x0f, 0x87, 0x3f, 0x61, 0x65, 0x1e, 0x35, 0x34, 0x85, 0xba, 0x02, 0x30, 0xac, 0x25, 0x3d, 0xe2, 0x62, 0xf1, 0xcc, 0xe9, 0x1b, 0xc2, 0xef, 0x6a, 0x42, 0x57}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x34, 0x1f, 0x2e, 0xac, 0xd1, 0xc7, 0x04, 0x52, 0x32, 0x66, 0xb2, 0x33, 0x73, 0x21, 0x34, 0x54, 0xf7, 0x71, 0xed, 0x06, 0xb0, 0xff, 0xa6, 0x59, 0x6f, 0x8a, 0x4e, 0xfb, 0x02, 0xb0, 0x45, 0x6b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xf5, 0x48, 0x0b, 0x03, 0xc5, 0x22, 0x7d, 0x80, 0x08, 0x53, 0xfe, 0x32, 0xb1, 0xa1, 0x8a, 0x74, 0x6f, 0xbd, 0x3f, 0x85, 0xf4, 0xcf, 0xf5, 0x60, 0xaf, 0x41, 0x7e, 0x3e, 0x46, 0xa3, 0x5a, 0x20}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xaa, 0x35, 0x87, 0x44, 0x63, 0x66, 0x97, 0xf8, 0x6e, 0x55, 0x0c, 0x04, 0x3e, 0x35, 0x50, 0xbf, 0x93, 0x69, 0xd2, 0x8b, 0x05, 0x55, 0x99, 0xbe, 0xe2, 0x53, 0x61, 0xec, 0xe8, 0x08, 0x0b, 0x32}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xb3, 0x10, 0x45, 0x02, 0x69, 0x59, 0x2e, 0x97, 0xd9, 0x64, 0xf8, 0xdb, 0x25, 0x80, 0xdc, 0xc4, 0xd5, 0x62, 0x3c, 0xed, 0x65, 0x91, 0xad, 0xd1, 0x57, 0x81, 0x94, 0xaa, 0xa1, 0x29, 0xfc, 0x68}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xdd, 0xb5, 0x7d, 0xab, 0x5a, 0x21, 0x41, 0x53, 0xbb, 0x17, 0x79, 0x0d, 0xd1, 0xa8, 0x0c, 0x0c, 0x20, 0x88, 0x09, 0xe9, 0x84, 0xe8, 0x25, 0x11, 0x67, 0x7a, 0x8b, 0x1a, 0xe4, 0x5d, 0xe1, 0x5d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x37, 0xea, 0xfe, 0x65, 0x3b, 0x25, 0xe8, 0xe1, 0xc2, 0xc5, 0x02, 0xa4, 0xbe, 0x98, 0x0a, 0x2b, 0x61, 0xc1, 0x9b, 0xe2, 0xd5, 0x92, 0xe6, 0x9e, 0x7d, 0x1f, 0xca, 0x43, 0x88, 0x8b, 0x2c, 0x59}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe0, 0xb5, 0x00, 0x1d, 0x2a, 0x6f, 0xaf, 0x79, 0x86, 0x2f, 0xa6, 0x5a, 0x93, 0xd1, 0xfe, 0xae, 0x3a, 0xee, 0xdb, 0x7c, 0x61, 0xbe, 0x7c, 0x01, 0xf9, 0xfe, 0x52, 0xdc, 0xd8, 0x52, 0xa3, 0x42}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x22, 0xaf, 0x13, 0x37, 0xbd, 0x37, 0x71, 0xac, 0x04, 0x46, 0x63, 0xac, 0xa4, 0x77, 0xed, 0x25, 0x38, 0xe0, 0x15, 0xa8, 0x64, 0x00, 0x0d, 0xce, 0x51, 0x01, 0xa9, 0xbc, 0x0f, 0x03, 0x1c, 0x04}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x89, 0xf9, 0x80, 0x07, 0xcf, 0x3f, 0xb3, 0xe9, 0xe7, 0x45, 0x44, 0x3d, 0x2a, 0x7c, 0xe9, 0xe4, 0x16, 0x5c, 0x5e, 0x65, 0x1c, 0xc7, 0x7d, 0xc6, 0x7a, 0xfb, 0x43, 0xee, 0x25, 0x76, 0x46, 0x72}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x02, 0xa2, 0xed, 0xf4, 0x8f, 0x6b, 0x0b, 0x3e, 0xeb, 0x35, 0x1a, 0xd5, 0x7e, 0xdb, 0x78, 0x00, 0x96, 0x8a, 0xa0, 0xb4, 0xcf, 0x60, 0x4b, 0xd4, 0xd5, 0xf9, 0x2d, 0xbf, 0x88, 0xbd, 0x22, 0x62}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x13, 0x53, 0xe4, 0x82, 0x57, 0xfa, 0x1e, 0x8f, 0x06, 0x2b, 0x90, 0xba, 0x08, 0xb6, 0x10, 0x54, 0x4f, 0x7c, 0x1b, 0x26, 0xed, 0xda, 0x6b, 0xdd, 0x25, 0xd0, 0x4e, 0xea, 0x42, 0xbb, 0x25, 0x03}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x51, 0x16, 0x50, 0x7c, 0xd5, 0x5d, 0xf6, 0x99, 0xe8, 0x77, 0x72, 0x4e, 0xfa, 0x62, 0xcb, 0x76, 0x75, 0x0c, 0xe2, 0x71, 0x98, 0x92, 0xd5, 0xfa, 0x45, 0xdf, 0x5c, 0x6f, 0x1e, 0x9e, 0x28, 0x69}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x0d, 0xac, 0x66, 0x6d, 0xc3, 0x8b, 0xba, 0x16, 0xb5, 0xe2, 0xa0, 0x0d, 0x0c, 0xbd, 0xa4, 0x8e, 0x18, 0x6c, 0xf2, 0xdc, 0xf9, 0xdc, 0x4a, 0x86, 0x25, 0x95, 0x14, 0xcb, 0xd8, 0x1a, 0x04, 0x0f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x97, 0xa5, 0xdb, 0x8b, 0x2d, 0xaa, 0x42, 0x11, 0x09, 0xf2, 0x93, 0xbb, 0xd9, 0x06, 0x84, 0x4e, 0x11, 0xa8, 0xa0, 0x25, 0x2b, 0xa6, 0x5f, 0xae, 0xc4, 0xb4, 0x4c, 0xc8, 0xab, 0xc7, 0x3b, 0x02}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xee, 0xc9, 0x29, 0x0f, 0xdf, 0x11, 0x85, 0xed, 0xce, 0x0d, 0x62, 0x2c, 0x8f, 0x4b, 0xf9, 0x04, 0xe9, 0x06, 0x72, 0x1d, 0x37, 0x20, 0x50, 0xc9, 0x14, 0xeb, 0xec, 0x39, 0xa7, 0x97, 0x2b, 0x4d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x69, 0xd1, 0x39, 0xbd, 0xfb, 0x33, 0xbe, 0xc4, 0xf0, 0x5c, 0xef, 0xf0, 0x56, 0x68, 0xfc, 0x97, 0x47, 0xc8, 0x72, 0xb6, 0x53, 0xa4, 0x0a, 0x98, 0xa5, 0xb4, 0x37, 0x71, 0xcf, 0x66, 0x50, 0x6d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x17, 0xa4, 0x19, 0x52, 0x11, 0x47, 0xb3, 0x5c, 0x5b, 0xa9, 0x2e, 0x22, 0xb4, 0x00, 0x52, 0xf9, 0x57, 0x18, 0xb8, 0xbe, 0x5a, 0xe3, 0xab, 0x83, 0xc8, 0x87, 0x0a, 0x2a, 0xd8, 0x8c, 0xbb, 0x54}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xa9, 0x62, 0x93, 0x85, 0xbe, 0xe8, 0x73, 0x4a, 0x0e, 0xb0, 0xb5, 0x2d, 0x94, 0x50, 0xaa, 0xd3, 0xb2, 0xea, 0x9d, 0x62, 0x76, 0x3b, 0x07, 0x34, 0x4e, 0x2d, 0x70, 0xc8, 0x9a, 0x15, 0x66, 0x6b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc5, 0x96, 0xca, 0xc8, 0x22, 0x1a, 0xee, 0x5f, 0xe7, 0x31, 0x60, 0x22, 0x83, 0x08, 0x63, 0xce, 0xb9, 0x32, 0x44, 0x58, 0x5d, 0x3a, 0x9b, 0xe4, 0x04, 0xd5, 0xef, 0x38, 0xef, 0x4b, 0xdd, 0x19}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x4d, 0xc2, 0x17, 0x75, 0xa1, 0x68, 0xcd, 0xc3, 0xc6, 0x03, 0x44, 0xe3, 0x78, 0x09, 0x91, 0x47, 0x3f, 0x0f, 0xe4, 0x92, 0x58, 0xfa, 0x7d, 0x1f, 0x20, 0x94, 0x58, 0x5e, 0xbc, 0x19, 0x02, 0x6f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x20, 0xd6, 0xd8, 0x91, 0x54, 0xa7, 0xf3, 0x20, 0x4b, 0x34, 0x06, 0xfa, 0x30, 0xc8, 0x6f, 0x14, 0x10, 0x65, 0x74, 0x13, 0x4e, 0xf0, 0x69, 0x26, 0xce, 0xcf, 0x90, 0xf4, 0xd0, 0xc5, 0xc8, 0x64}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x26, 0xa2, 0x50, 0x02, 0x24, 0x72, 0xf1, 0xf0, 0x4e, 0x2d, 0x93, 0xd5, 0x08, 0xe7, 0xae, 0x38, 0xf7, 0x18, 0xa5, 0x32, 0x34, 0xc2, 0xf0, 0xa6, 0xec, 0xb9, 0x61, 0x7b, 0x64, 0x99, 0xac, 0x71}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x25, 0xcf, 0x74, 0x55, 0x1b, 0xaa, 0xa9, 0x38, 0x41, 0x40, 0xd5, 0x95, 0x95, 0xab, 0x1c, 0x5e, 0xbc, 0x41, 0x7e, 0x14, 0x30, 0xbe, 0x13, 0x89, 0xf4, 0xe5, 0xeb, 0x28, 0xc0, 0xc2, 0x96, 0x3a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x2b, 0x77, 0x45, 0xec, 0x67, 0x76, 0x32, 0x4c, 0xb9, 0xdf, 0x25, 0x32, 0x6b, 0xcb, 0xe7, 0x14, 0x61, 0x43, 0xee, 0xba, 0x9b, 0x71, 0xef, 0xd2, 0x48, 0x65, 0xbb, 0x1b, 0x8a, 0x13, 0x1b, 0x22}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x84, 0xad, 0x0c, 0x18, 0x38, 0x5a, 0xba, 0xd0, 0x98, 0x59, 0xbf, 0x37, 0xb0, 0x4f, 0x97, 0x60, 0x20, 0xb3, 0x9b, 0x97, 0xf6, 0x08, 0x6c, 0xa4, 0xff, 0xfb, 0xb7, 0xfa, 0x95, 0xb2, 0x51, 0x79}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x28, 0x5c, 0x3f, 0xdb, 0x6b, 0x18, 0x3b, 0x5c, 0xd1, 0x04, 0x28, 0xde, 0x85, 0x52, 0x31, 0xb5, 0xbb, 0xf6, 0xa9, 0xed, 0xbe, 0x28, 0x4f, 0xb3, 0x7e, 0x05, 0x6a, 0xdb, 0x95, 0x0d, 0x1b, 0x1c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xd5, 0xc5, 0xc3, 0x9a, 0x0a, 0xd0, 0x31, 0x3e, 0x07, 0x36, 0x8e, 0xc0, 0x8a, 0x62, 0xb1, 0xca, 0xd6, 0x0e, 0x1e, 0x9d, 0xef, 0xab, 0x98, 0x4d, 0xbb, 0x6c, 0x05, 0xe0, 0xe4, 0x5d, 0xbd, 0x57}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xcc, 0x21, 0x27, 0xce, 0xfd, 0xa9, 0x94, 0x8e, 0xe1, 0xab, 0x49, 0xe0, 0x46, 0x26, 0xa1, 0xa8, 0x8c, 0xa1, 0x99, 0x1d, 0xb4, 0x27, 0x6d, 0x2d, 0xc8, 0x39, 0x30, 0x5e, 0x37, 0x52, 0xc4, 0x6e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xa9, 0x85, 0xf4, 0xe7, 0xb0, 0x15, 0x33, 0x84, 0x1b, 0x14, 0x1a, 0x02, 0xd9, 0x3b, 0xad, 0x0f, 0x43, 0x6c, 0xea, 0x3e, 0x0f, 0x7e, 0xda, 0xdd, 0x6b, 0x4c, 0x7f, 0x6e, 0xd4, 0x6b, 0xbf, 0x0f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x47, 0x9f, 0x7c, 0x56, 0x7c, 0x43, 0x91, 0x1c, 0xbb, 0x4e, 0x72, 0x3e, 0x64, 0xab, 0xa0, 0xa0, 0xdf, 0xb4, 0xd8, 0x87, 0x3a, 0xbd, 0xa8, 0x48, 0xc9, 0xb8, 0xef, 0x2e, 0xad, 0x6f, 0x84, 0x4f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x2d, 0x2d, 0xf0, 0x1b, 0x7e, 0x2a, 0x6c, 0xf8, 0xa9, 0x6a, 0xe1, 0xf0, 0x99, 0xa1, 0x67, 0x9a, 0xd4, 0x13, 0xca, 0xca, 0xba, 0x27, 0x92, 0xaa, 0xa1, 0x5d, 0x50, 0xde, 0xcc, 0x40, 0x26, 0x0a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x9f, 0x3e, 0xf2, 0xb2, 0x90, 0xce, 0xdb, 0x64, 0x3e, 0x03, 0xdd, 0x37, 0x36, 0x54, 0x70, 0x76, 0x24, 0xb5, 0x69, 0x03, 0xfc, 0xa0, 0x2b, 0x74, 0xb2, 0x05, 0x0e, 0xcc, 0xd8, 0x1f, 0x6a, 0x1f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x19, 0x5e, 0x60, 0x69, 0x58, 0x86, 0xa0, 0x31, 0xbd, 0x32, 0xe9, 0x2c, 0x5c, 0xd2, 0x85, 0xba, 0x40, 0x64, 0xa8, 0x74, 0xf8, 0x0e, 0x1c, 0xb3, 0xa9, 0x69, 0xe8, 0x1e, 0x40, 0x64, 0x99, 0x77}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x6c, 0x32, 0x4f, 0xfd, 0xbb, 0x5c, 0xbb, 0x8d, 0x64, 0x66, 0x4a, 0x71, 0x1f, 0x79, 0xa3, 0xad, 0x8d, 0xf9, 0xd4, 0xec, 0xcf, 0x67, 0x70, 0xfa, 0x05, 0x4a, 0x0f, 0x6e, 0xaf, 0x87, 0x0a, 0x6f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc6, 0x36, 0x6e, 0x6c, 0x8c, 0x24, 0x09, 0x60, 0xbe, 0x26, 0xd2, 0x4c, 0x5e, 0x17, 0xca, 0x5f, 0x1d, 0xcc, 0x87, 0xe8, 0x42, 0x6a, 0xcb, 0xcb, 0x7d, 0x92, 0x05, 0x35, 0x81, 0x13, 0x60, 0x6b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xf4, 0x15, 0xcd, 0x0f, 0x0a, 0xaf, 0x4e, 0x6b, 0x51, 0xfd, 0x14, 0xc4, 0x2e, 0x13, 0x86, 0x74, 0x44, 0xcb, 0x66, 0x6b, 0xb6, 0x9d, 0x74, 0x56, 0x32, 0xac, 0x8d, 0x8e, 0x8c, 0x8c, 0x8c, 0x39}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xca, 0x59, 0x74, 0x1a, 0x11, 0xef, 0x6d, 0xf7, 0x39, 0x5c, 0x3b, 0x1f, 0xfa, 0xe3, 0x40, 0x41, 0x23, 0x9e, 0xf6, 0xd1, 0x21, 0xa2, 0xbf, 0xad, 0x65, 0x42, 0x6b, 0x59, 0x8a, 0xe8, 0xc5, 0x7f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x64, 0x05, 0x7a, 0x84, 0x4a, 0x13, 0xc3, 0xf6, 0xb0, 0x6e, 0x9a, 0x6b, 0x53, 0x6b, 0x32, 0xda, 0xd9, 0x74, 0x75, 0xc4, 0xba, 0x64, 0x3d, 0x3b, 0x08, 0xdd, 0x10, 0x46, 0xef, 0xc7, 0x90, 0x1f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x7b, 0x2f, 0x3a, 0xce, 0xc8, 0xa1, 0x79, 0x3c, 0x30, 0x12, 0x44, 0x28, 0xf6, 0xbc, 0xff, 0xfd, 0xf4, 0xc0, 0x97, 0xb0, 0xcc, 0xc3, 0x13, 0x7a, 0xb9, 0x9a, 0x16, 0xe4, 0xcb, 0x4c, 0x34, 0x63}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x07, 0x4e, 0xd3, 0x2d, 0x09, 0x33, 0x0e, 0xd2, 0x0d, 0xbe, 0x3e, 0xe7, 0xe4, 0xaa, 0xb7, 0x00, 0x8b, 0xe8, 0xad, 0xaa, 0x7a, 0x8d, 0x34, 0x28, 0xa9, 0x81, 0x94, 0xc5, 0xe7, 0x42, 0xac, 0x47}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x24, 0x89, 0x7a, 0x8f, 0xb5, 0x9b, 0xf0, 0xc2, 0x03, 0x64, 0xd0, 0x1e, 0xf5, 0xa4, 0xb2, 0xf3, 0x74, 0xe9, 0x1a, 0x16, 0xfd, 0xcb, 0x15, 0xea, 0xeb, 0x10, 0x6c, 0x35, 0xd1, 0xc1, 0xa6, 0x28}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xcc, 0xd5, 0x39, 0xfc, 0xa5, 0xa4, 0xad, 0x32, 0x15, 0xce, 0x19, 0xe8, 0x34, 0x2b, 0x1c, 0x60, 0x91, 0xfc, 0x05, 0xa9, 0xb3, 0xdc, 0x80, 0x29, 0xc4, 0x20, 0x79, 0x06, 0x39, 0xc0, 0xe2, 0x22}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xbb, 0xa8, 0xe1, 0x89, 0x70, 0x57, 0x18, 0x54, 0x3c, 0xf6, 0x0d, 0x82, 0x12, 0x05, 0x87, 0x96, 0x06, 0x39, 0xe3, 0xf8, 0xb3, 0x95, 0xe5, 0xd7, 0x26, 0xbf, 0x09, 0x5a, 0x94, 0xf9, 0x1c, 0x63}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x2b, 0x8c, 0x2d, 0x9a, 0x8b, 0x84, 0xf2, 0x56, 0xfb, 0xad, 0x2e, 0x7f, 0xb7, 0xfc, 0x30, 0xe1, 0x35, 0x89, 0xba, 0x4d, 0xa8, 0x6d, 0xce, 0x8c, 0x8b, 0x30, 0xe0, 0xda, 0x29, 0x18, 0x11, 0x17}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x19, 0xa6, 0x5a, 0x65, 0x93, 0xc3, 0xb5, 0x31, 0x22, 0x4f, 0xf3, 0xf6, 0x0f, 0xeb, 0x28, 0xc3, 0x7c, 0xeb, 0xce, 0x86, 0xec, 0x67, 0x76, 0x6e, 0x35, 0x45, 0x7b, 0xd8, 0x6b, 0x92, 0x01, 0x65}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x3d, 0xd5, 0x9a, 0x64, 0x73, 0x36, 0xb1, 0xd6, 0x86, 0x98, 0x42, 0x3f, 0x8a, 0xf1, 0xc7, 0xf5, 0x42, 0xa8, 0x9c, 0x52, 0xa8, 0xdc, 0xf9, 0x24, 0x3f, 0x4a, 0xa1, 0xa4, 0x5b, 0xe8, 0x62, 0x1a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc5, 0xbd, 0xc8, 0x14, 0xd5, 0x0d, 0xeb, 0xe1, 0xa5, 0xe6, 0x83, 0x11, 0x09, 0x00, 0x1d, 0x55, 0x83, 0x51, 0x7e, 0x75, 0x00, 0x81, 0xb9, 0xcb, 0xd8, 0xc5, 0xe5, 0xa1, 0xd9, 0x17, 0x6d, 0x1f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xea, 0xf9, 0xe4, 0xe9, 0xe1, 0x52, 0x3f, 0x51, 0x19, 0x0d, 0xdd, 0xd9, 0x9d, 0x93, 0x31, 0x87, 0x23, 0x09, 0xd5, 0x83, 0xeb, 0x92, 0x09, 0x76, 0x6e, 0xe3, 0xf8, 0xc0, 0xa2, 0x66, 0xb5, 0x36}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x3a, 0xbb, 0x39, 0xed, 0x32, 0x02, 0xe7, 0x43, 0x7a, 0x38, 0x14, 0x84, 0xe3, 0x44, 0xd2, 0x5e, 0x94, 0xdd, 0x78, 0x89, 0x55, 0x4c, 0x73, 0x9e, 0xe1, 0xe4, 0x3e, 0x43, 0xd0, 0x4a, 0xde, 0x1b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xb2, 0xe7, 0x8f, 0xe3, 0xa3, 0xc5, 0xcb, 0x72, 0xee, 0x79, 0x41, 0xf8, 0xdf, 0xee, 0x65, 0xc5, 0x45, 0x77, 0x27, 0x3c, 0xbd, 0x58, 0xd3, 0x75, 0xe2, 0x04, 0x4b, 0xbb, 0x65, 0xf3, 0xc8, 0x0f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x24, 0x7b, 0x93, 0x34, 0xb5, 0xe2, 0x74, 0x48, 0xcd, 0xa0, 0x0b, 0x92, 0x97, 0x66, 0x39, 0xf4, 0xb0, 0xe2, 0x5d, 0x39, 0x6a, 0x5b, 0x45, 0x17, 0x78, 0x1e, 0xdb, 0x91, 0x81, 0x1c, 0xf9, 0x16}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x16, 0xdf, 0xd1, 0x5a, 0xd5, 0xe9, 0x4e, 0x58, 0x95, 0x93, 0x5f, 0x51, 0x09, 0xc3, 0x2a, 0xc9, 0xd4, 0x55, 0x48, 0x79, 0xa4, 0xa3, 0xb2, 0xc3, 0x62, 0xaa, 0x8c, 0xe8, 0xad, 0x47, 0x39, 0x1b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x46, 0xda, 0x9e, 0x51, 0x3a, 0xe6, 0xd1, 0xa6, 0xbb, 0x4d, 0x7b, 0x08, 0xbe, 0x8c, 0xd5, 0xf3, 0x3f, 0xfd, 0xf7, 0x44, 0x80, 0x2d, 0x53, 0x4b, 0xd0, 0x87, 0x68, 0xc1, 0xb5, 0xd8, 0xf7, 0x07}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xf4, 0x10, 0x46, 0xbe, 0xb7, 0xd2, 0xd1, 0xce, 0x5e, 0x76, 0xa2, 0xd7, 0x03, 0xdc, 0xe4, 0x81, 0x5a, 0xf6, 0x3c, 0xde, 0xae, 0x7a, 0x9d, 0x21, 0x34, 0xa5, 0xf6, 0xa9, 0x73, 0xe2, 0x8d, 0x60}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xfa, 0x44, 0x71, 0xf6, 0x41, 0xd8, 0xc6, 0x58, 0x13, 0x37, 0xeb, 0x84, 0x0f, 0x96, 0xc7, 0xdc, 0xc8, 0xa9, 0x7a, 0x83, 0xb2, 0x2f, 0x31, 0xb1, 0x1a, 0xd8, 0x98, 0x3f, 0x11, 0xd0, 0x31, 0x3b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x81, 0xd5, 0x34, 0x16, 0x01, 0xa3, 0x93, 0xea, 0x52, 0x94, 0xec, 0x93, 0xb7, 0x81, 0x11, 0x2d, 0x58, 0xf9, 0xb5, 0x0a, 0xaa, 0x4f, 0xf6, 0x2e, 0x3f, 0x36, 0xbf, 0x33, 0x5a, 0xe7, 0xd1, 0x08}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x1a, 0xcf, 0x42, 0xae, 0xcc, 0xb5, 0x77, 0x39, 0xc4, 0x5b, 0x5b, 0xd0, 0x26, 0x59, 0x27, 0xd0, 0x55, 0x71, 0x12, 0x9d, 0x88, 0x3d, 0x9c, 0xea, 0x41, 0x6a, 0xf0, 0x50, 0x93, 0x93, 0xdd, 0x47}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x6f, 0xc9, 0x51, 0x6d, 0x1c, 0xaa, 0xf5, 0xa5, 0x90, 0x3f, 0x14, 0xe2, 0x6e, 0x8e, 0x64, 0xfd, 0xac, 0xe0, 0x4e, 0x22, 0xe5, 0xc1, 0xbc, 0x29, 0x0a, 0x6a, 0x9e, 0xa1, 0x60, 0xcb, 0x2f, 0x0b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xdc, 0x39, 0x32, 0xf3, 0xa1, 0x44, 0xe9, 0xc5, 0xc3, 0x78, 0xfb, 0x95, 0x47, 0x34, 0x35, 0x34, 0xe8, 0x25, 0xde, 0x93, 0xc6, 0xb4, 0x76, 0x6d, 0x86, 0x13, 0xc6, 0xe9, 0x68, 0xb5, 0x01, 0x63}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x1f, 0x9a, 0x52, 0x64, 0x97, 0xd9, 0x1c, 0x08, 0x51, 0x6f, 0x26, 0x9d, 0xaa, 0x93, 0x33, 0x43, 0xfa, 0x77, 0xe9, 0x62, 0x9b, 0x5d, 0x18, 0x75, 0xeb, 0x78, 0xf7, 0x87, 0x8f, 0x41, 0xb4, 0x4d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x13, 0xa8, 0x82, 0x3e, 0xe9, 0x13, 0xad, 0xeb, 0x01, 0xca, 0xcf, 0xda, 0xcd, 0xf7, 0x6c, 0xc7, 0x7a, 0xdc, 0x1e, 0x6e, 0xc8, 0x4e, 0x55, 0x62, 0x80, 0xea, 0x78, 0x0c, 0x86, 0xb9, 0x40, 0x51}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x27, 0xae, 0xd3, 0x0d, 0x4c, 0x8f, 0x34, 0xea, 0x7d, 0x3c, 0xe5, 0x8a, 0xcf, 0x5b, 0x92, 0xd8, 0x30, 0x16, 0xb4, 0xa3, 0x75, 0xff, 0xeb, 0x27, 0xc8, 0x5c, 0x6c, 0xc2, 0xee, 0x6c, 0x21, 0x0b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc3, 0xba, 0x12, 0x53, 0x2a, 0xaa, 0x77, 0xad, 0x19, 0x78, 0x55, 0x8a, 0x2e, 0x60, 0x87, 0xc2, 0x6e, 0x91, 0x38, 0x91, 0x3f, 0x7a, 0xc5, 0x24, 0x8f, 0x51, 0xc5, 0xde, 0xb0, 0x53, 0x30, 0x56}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x02, 0xfe, 0x54, 0x12, 0x18, 0xca, 0x7d, 0xa5, 0x68, 0x43, 0xa3, 0x6d, 0x14, 0x2a, 0x6a, 0xa5, 0x8e, 0x32, 0xe7, 0x63, 0x4f, 0xe3, 0xc6, 0x44, 0x3e, 0xab, 0x63, 0xca, 0x17, 0x86, 0x74, 0x3f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x1e, 0x64, 0xc1, 0x7d, 0x52, 0xdc, 0x13, 0x5a, 0xa1, 0x9c, 0x4e, 0xee, 0x99, 0x28, 0xbb, 0x4c, 0xee, 0xac, 0xa9, 0x1b, 0x89, 0xa2, 0x38, 0x39, 0x7b, 0xc4, 0x0f, 0x42, 0xe6, 0x89, 0xed, 0x0f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xf3, 0x3c, 0x8c, 0x80, 0x83, 0x10, 0x8a, 0x37, 0x50, 0x9c, 0xb4, 0xdf, 0x3f, 0x8c, 0xf7, 0x23, 0x07, 0xd6, 0xff, 0xa0, 0x82, 0x6c, 0x75, 0x3b, 0xe4, 0xb5, 0xbb, 0xe4, 0xe6, 0x50, 0xf0, 0x08}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x62, 0xee, 0x75, 0x48, 0x92, 0x33, 0xf2, 0xf4, 0xad, 0x15, 0x7a, 0xa1, 0x01, 0x46, 0xa9, 0x32, 0x06, 0x88, 0xb6, 0x36, 0x47, 0x35, 0xb9, 0xb4, 0x42, 0x85, 0x76, 0xf0, 0x48, 0x00, 0x90, 0x38}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x51, 0x15, 0x9d, 0xc3, 0x95, 0xd1, 0x39, 0xbb, 0x64, 0x9d, 0x15, 0x81, 0xc1, 0x68, 0xd0, 0xb6, 0xa4, 0x2c, 0x7d, 0x5e, 0x02, 0x39, 0x00, 0xe0, 0x3b, 0xa4, 0xcc, 0xca, 0x1d, 0x81, 0x24, 0x10}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe7, 0x29, 0xf9, 0x37, 0xd9, 0x46, 0x5a, 0xcd, 0x70, 0xfe, 0x4d, 0x5b, 0xbf, 0xa5, 0xcf, 0x91, 0xf4, 0xef, 0xee, 0x8a, 0x29, 0xd0, 0xe7, 0xc4, 0x25, 0x92, 0x8a, 0xff, 0x36, 0xfc, 0xe4, 0x49}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xbd, 0x00, 0xb9, 0x04, 0x7d, 0x35, 0xfc, 0xeb, 0xd0, 0x0b, 0x05, 0x32, 0x52, 0x7a, 0x89, 0x24, 0x75, 0x50, 0xe1, 0x63, 0x02, 0x82, 0x8e, 0xe7, 0x85, 0x0c, 0xf2, 0x56, 0x44, 0x37, 0x83, 0x25}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8f, 0xa1, 0xce, 0xcb, 0x60, 0xda, 0x12, 0x02, 0x1e, 0x29, 0x39, 0x2a, 0x03, 0xb7, 0xeb, 0x77, 0x40, 0xea, 0xc9, 0x2b, 0x2c, 0xd5, 0x7d, 0x7e, 0x2c, 0xc7, 0x5a, 0xfd, 0xff, 0xc4, 0xd1, 0x62}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x1d, 0x88, 0x98, 0x5b, 0x4e, 0xfc, 0x41, 0x24, 0x05, 0xe6, 0x50, 0x2b, 0xae, 0x96, 0x51, 0xd9, 0x6b, 0x72, 0xb2, 0x33, 0x42, 0x98, 0x68, 0xbb, 0x10, 0x5a, 0x7a, 0x8c, 0x9d, 0x07, 0xb4, 0x05}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x2f, 0x61, 0x9f, 0xd7, 0xa8, 0x3f, 0x83, 0x8c, 0x10, 0x69, 0x90, 0xe6, 0xcf, 0xd2, 0x63, 0xa3, 0xe4, 0x54, 0x7e, 0xe5, 0x69, 0x13, 0x1c, 0x90, 0x57, 0xaa, 0xe9, 0x53, 0x22, 0x43, 0x29, 0x23}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe5, 0x1c, 0xf8, 0x0a, 0xfd, 0x2d, 0x7e, 0xf5, 0xf5, 0x70, 0x7d, 0x41, 0x6b, 0x11, 0xfe, 0xbe, 0x99, 0xd1, 0x55, 0x29, 0x31, 0xbf, 0xc0, 0x97, 0x6c, 0xd5, 0x35, 0xcc, 0x5e, 0x8b, 0xd9, 0x69}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8e, 0x4e, 0x9f, 0x25, 0xf8, 0x81, 0x54, 0x2d, 0x0e, 0xd5, 0x54, 0x81, 0x9b, 0xa6, 0x92, 0xce, 0x4b, 0xe9, 0x8f, 0x24, 0x3b, 0xca, 0xe0, 0x44, 0xab, 0x36, 0xfe, 0xfb, 0x87, 0xd4, 0x26, 0x3e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x0f, 0x93, 0x9c, 0x11, 0xe7, 0xdb, 0xf1, 0xf0, 0x85, 0x43, 0x28, 0x15, 0x37, 0xdd, 0xde, 0x27, 0xdf, 0xad, 0x3e, 0x49, 0x4f, 0xe0, 0x5b, 0xf6, 0x80, 0x59, 0x15, 0x3c, 0x85, 0xb7, 0x3e, 0x12}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf5, 0xff, 0xcc, 0xf0, 0xb4, 0x12, 0x03, 0x5f, 0xc9, 0x84, 0xcb, 0x1d, 0x17, 0xe0, 0xbc, 0xcc, 0x03, 0x62, 0xa9, 0x8b, 0x94, 0xa6, 0xaa, 0x18, 0xcb, 0x27, 0x8d, 0x49, 0xa6, 0x17, 0x15, 0x07}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd9, 0xb6, 0xd4, 0x9d, 0xd4, 0x6a, 0xaf, 0x70, 0x07, 0x2c, 0x10, 0x9e, 0xbd, 0x11, 0xad, 0xe4, 0x26, 0x33, 0x70, 0x92, 0x78, 0x1c, 0x74, 0x9f, 0x75, 0x60, 0x56, 0xf4, 0x39, 0xa8, 0xa8, 0x62}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x3b, 0xbf, 0x55, 0x35, 0x61, 0x8b, 0x44, 0x97, 0xe8, 0x3a, 0x55, 0xc1, 0xc8, 0x3b, 0xfd, 0x95, 0x29, 0x11, 0x60, 0x96, 0x1e, 0xcb, 0x11, 0x9d, 0xc2, 0x03, 0x8a, 0x1b, 0xc6, 0xd6, 0x45, 0x3d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x7e, 0x0e, 0x50, 0xb2, 0xcc, 0x0d, 0x6b, 0xa6, 0x71, 0x5b, 0x42, 0xed, 0xbd, 0xaf, 0xac, 0xf0, 0xfc, 0x12, 0xa2, 0x3f, 0x4e, 0xda, 0xe8, 0x11, 0xf3, 0x23, 0xe1, 0x04, 0x62, 0x03, 0x1c, 0x4e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc8, 0xb1, 0x1b, 0x6f, 0x73, 0x61, 0x3d, 0x27, 0x0d, 0x7d, 0x7a, 0x25, 0x5f, 0x73, 0x0e, 0x2f, 0x93, 0xf6, 0x24, 0xd8, 0x4f, 0x90, 0xac, 0xa2, 0x62, 0x0a, 0xf0, 0x61, 0xd9, 0x08, 0x59, 0x6a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x6f, 0x2d, 0x55, 0xf8, 0x2f, 0x8e, 0xf0, 0x18, 0x3b, 0xea, 0xdd, 0x26, 0x72, 0xd1, 0xf5, 0xfe, 0xe5, 0xb8, 0xe6, 0xd3, 0x10, 0x48, 0x46, 0x49, 0x3a, 0x9f, 0x5e, 0x45, 0x6b, 0x90, 0xe8, 0x7f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xd3, 0x76, 0x69, 0x33, 0x7b, 0xb9, 0x40, 0x70, 0xee, 0xa6, 0x29, 0x6b, 0xdd, 0xd0, 0x5d, 0x8d, 0xc1, 0x3e, 0x4a, 0xea, 0x37, 0xb1, 0x03, 0x02, 0x03, 0x35, 0xf1, 0x28, 0x9d, 0xff, 0x00, 0x13}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x7a, 0xdb, 0x12, 0xd2, 0x8a, 0x82, 0x03, 0x1b, 0x1e, 0xaf, 0xf9, 0x4b, 0x9c, 0xbe, 0xae, 0x7c, 0xe4, 0x94, 0x2a, 0x23, 0xb3, 0x62, 0x86, 0xe7, 0xfd, 0x23, 0xaa, 0x99, 0xbd, 0x2b, 0x11, 0x6c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8d, 0xa6, 0xd5, 0xac, 0x9d, 0xcc, 0x68, 0x75, 0x7f, 0xc3, 0x4d, 0x4b, 0xdd, 0x6c, 0xbb, 0x11, 0x5a, 0x60, 0xe5, 0xbd, 0x7d, 0x27, 0x8b, 0xda, 0xb4, 0x95, 0xf6, 0x03, 0x27, 0xa4, 0x92, 0x3f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x22, 0xd6, 0xb5, 0x17, 0x84, 0xbf, 0x12, 0xcc, 0x23, 0x14, 0x4a, 0xdf, 0x14, 0x31, 0xbc, 0xa1, 0xac, 0x6e, 0xab, 0xfa, 0x57, 0x11, 0x53, 0xb3, 0x27, 0xe6, 0xf9, 0x47, 0x33, 0x44, 0x34, 0x1e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x79, 0xfc, 0xa6, 0xb4, 0x0b, 0x35, 0x20, 0xc9, 0x4d, 0x22, 0x84, 0xc4, 0xa9, 0x20, 0xec, 0x89, 0x94, 0xba, 0x66, 0x56, 0x48, 0xb9, 0x87, 0x7f, 0xca, 0x1e, 0x06, 0xed, 0xa5, 0x55, 0x59, 0x29}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x56, 0xe1, 0xf5, 0xf1, 0xd5, 0xab, 0xa8, 0x2b, 0xae, 0x89, 0xf3, 0xcf, 0x56, 0x9f, 0xf2, 0x4b, 0x31, 0xbc, 0x18, 0xa9, 0x06, 0x5b, 0xbe, 0xb4, 0x61, 0xf8, 0xb2, 0x06, 0x9c, 0x81, 0xab, 0x4c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x1f, 0x68, 0x76, 0x01, 0x16, 0x38, 0x2b, 0x0f, 0x77, 0x97, 0x92, 0x67, 0x4e, 0x86, 0x6a, 0x8b, 0xe5, 0xe8, 0x0c, 0xf7, 0x36, 0x39, 0xb5, 0x33, 0xe6, 0xcf, 0x5e, 0xbd, 0x18, 0xfb, 0x10, 0x1f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x83, 0xf0, 0x0d, 0x63, 0xef, 0x53, 0x6b, 0xb5, 0x6b, 0xf9, 0x83, 0xcf, 0xde, 0x04, 0x22, 0x9b, 0x2c, 0x0a, 0xe0, 0xa5, 0xd8, 0xc7, 0x9c, 0xa5, 0xa3, 0xf6, 0x6f, 0xcf, 0x90, 0x6b, 0x68, 0x7c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x33, 0x15, 0xd7, 0x7f, 0x1a, 0xd5, 0x21, 0x58, 0xc4, 0x18, 0xa5, 0xf0, 0xcc, 0x73, 0xa8, 0xfd, 0xfa, 0x18, 0xd1, 0x03, 0x91, 0x8d, 0x52, 0xd2, 0xa3, 0xa4, 0xd3, 0xb1, 0xea, 0x1d, 0x0f, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xcc, 0x48, 0x83, 0x90, 0xe5, 0xfd, 0x3f, 0x84, 0xaa, 0xf9, 0x8b, 0x82, 0x59, 0x24, 0x34, 0x68, 0x4f, 0x1c, 0x23, 0xd9, 0xcc, 0x71, 0xe1, 0x7f, 0x8c, 0xaf, 0xf1, 0xee, 0x00, 0xb6, 0xa0, 0x77}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf5, 0x1a, 0x61, 0xf7, 0x37, 0x9d, 0x00, 0xf4, 0xf2, 0x69, 0x6f, 0x4b, 0x01, 0x85, 0x19, 0x45, 0x4d, 0x7f, 0x02, 0x7c, 0x6a, 0x05, 0x47, 0x6c, 0x1f, 0x81, 0x20, 0xd4, 0xe8, 0x50, 0x27, 0x72}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x2c, 0x3a, 0xe5, 0xad, 0xf4, 0xdd, 0x2d, 0xf7, 0x5c, 0x44, 0xb5, 0x5b, 0x21, 0xa3, 0x89, 0x5f, 0x96, 0x45, 0xca, 0x4d, 0xa4, 0x21, 0x99, 0x70, 0xda, 0xc4, 0xc4, 0xa0, 0xe5, 0xf4, 0xec, 0x0a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x07, 0x68, 0x21, 0x65, 0xe9, 0x08, 0xa0, 0x0b, 0x6a, 0x4a, 0xba, 0xb5, 0x80, 0xaf, 0xd0, 0x1b, 0xc5, 0xf5, 0x4b, 0x73, 0x50, 0x60, 0x2d, 0x71, 0x69, 0x61, 0x0e, 0xc0, 0x20, 0x40, 0x30, 0x19}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd0, 0x75, 0x57, 0x3b, 0xeb, 0x5c, 0x14, 0x56, 0x50, 0xc9, 0x4f, 0xb8, 0xb8, 0x1e, 0xa3, 0xf4, 0xab, 0xf5, 0xa9, 0x20, 0x15, 0x94, 0x82, 0xda, 0x96, 0x1c, 0x9b, 0x59, 0x8c, 0xff, 0xf4, 0x51}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc1, 0x3a, 0x86, 0xd7, 0xb0, 0x06, 0x84, 0x7f, 0x1b, 0xbd, 0xd4, 0x07, 0x78, 0x80, 0x2e, 0xb1, 0xb4, 0xee, 0x52, 0x38, 0xee, 0x9a, 0xf9, 0xf6, 0xf3, 0x41, 0x6e, 0xd4, 0x88, 0x95, 0xac, 0x35}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x41, 0x97, 0xbf, 0x71, 0x6a, 0x9b, 0x72, 0xec, 0xf3, 0xf8, 0x6b, 0xe6, 0x0e, 0x6c, 0x69, 0xa5, 0x2f, 0x68, 0x52, 0xd8, 0x61, 0x81, 0xc0, 0x63, 0x3f, 0xa6, 0x3c, 0x13, 0x90, 0xe6, 0x8d, 0x56}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe8, 0x39, 0x30, 0x77, 0x23, 0xb1, 0xfd, 0x1b, 0x3d, 0x3e, 0x74, 0x4d, 0x7f, 0xae, 0x5b, 0x3a, 0xb4, 0x65, 0x0e, 0x3a, 0x43, 0xdc, 0xdc, 0x41, 0x47, 0xe6, 0xe8, 0x92, 0x09, 0x22, 0x48, 0x4c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x85, 0x57, 0x9f, 0xb5, 0xc8, 0x06, 0xb2, 0x9f, 0x47, 0x3f, 0xf0, 0xfa, 0xe6, 0xa9, 0xb1, 0x9b, 0x6f, 0x96, 0x7d, 0xf9, 0xa4, 0x65, 0x09, 0x75, 0x32, 0xa6, 0x6c, 0x7f, 0x47, 0x4b, 0x2f, 0x4f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x34, 0xe9, 0x59, 0x93, 0x9d, 0x26, 0x80, 0x54, 0xf2, 0xcc, 0x3c, 0xc2, 0x25, 0x85, 0xe3, 0x6a, 0xc1, 0x62, 0x04, 0xa7, 0x08, 0x32, 0x6d, 0xa1, 0x39, 0x84, 0x8a, 0x3b, 0x87, 0x5f, 0x11, 0x13}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xda, 0x03, 0x34, 0x66, 0xc4, 0x0c, 0x73, 0x6e, 0xbc, 0x24, 0xb5, 0xf9, 0x70, 0x81, 0x52, 0xe9, 0xf4, 0x7c, 0x23, 0xdd, 0x9f, 0xb8, 0x46, 0xef, 0x1d, 0x22, 0x55, 0x7d, 0x71, 0xc4, 0x42, 0x33}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc5, 0x37, 0x69, 0x5b, 0xa8, 0xc6, 0x9d, 0xa4, 0xfc, 0x61, 0x6e, 0x68, 0x46, 0xea, 0xd7, 0x1c, 0x67, 0xd2, 0x7d, 0xfa, 0xf1, 0xcc, 0x54, 0x8d, 0x36, 0x35, 0xc9, 0x00, 0xdf, 0x6c, 0x67, 0x50}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x9a, 0x4d, 0x42, 0x29, 0x5d, 0xa4, 0x6b, 0x6f, 0xa8, 0x8a, 0x4d, 0x91, 0x7b, 0xd2, 0xdf, 0x36, 0xef, 0x01, 0x22, 0xc5, 0xcc, 0x8d, 0xeb, 0x58, 0x3d, 0xb3, 0x50, 0xfc, 0x8b, 0x97, 0x96, 0x33}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x93, 0x33, 0x07, 0xc8, 0x4a, 0xca, 0xd0, 0xb1, 0xab, 0xbd, 0xdd, 0xa7, 0x7c, 0xac, 0x3e, 0x45, 0xcb, 0xcc, 0x07, 0x91, 0xbf, 0x35, 0x9d, 0xcb, 0x7d, 0x12, 0x3c, 0x11, 0x59, 0x13, 0xcf, 0x5c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x45, 0xb8, 0x41, 0xd7, 0xab, 0x07, 0x15, 0x00, 0x8e, 0xce, 0xdf, 0xb2, 0x43, 0x5c, 0x01, 0xdc, 0xf4, 0x01, 0x51, 0x95, 0x10, 0x5a, 0xf6, 0x24, 0x24, 0xa0, 0x19, 0x3a, 0x09, 0x2a, 0xaa, 0x3f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xdc, 0x8e, 0xeb, 0xc6, 0xbf, 0xdd, 0x11, 0x7b, 0xe7, 0x47, 0xe6, 0xce, 0xe7, 0xb6, 0xc5, 0xe8, 0x8a, 0xdc, 0x4b, 0x57, 0x15, 0x3b, 0x66, 0xca, 0x89, 0xa3, 0xfd, 0xac, 0x0d, 0xe1, 0x1d, 0x7a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x89, 0xef, 0xbf, 0x03, 0x75, 0xd0, 0x29, 0x50, 0xcb, 0x7d, 0xd6, 0xbe, 0xad, 0x5f, 0x7b, 0x00, 0x32, 0xaa, 0x98, 0xed, 0x3f, 0x8f, 0x92, 0xcb, 0x81, 0x56, 0x01, 0x63, 0x64, 0xa3, 0x38, 0x39}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8b, 0xa4, 0xd6, 0x50, 0xb4, 0xaa, 0x5d, 0x64, 0x64, 0x76, 0x2e, 0xa1, 0xa6, 0xb3, 0xb8, 0x7c, 0x7a, 0x56, 0xf5, 0x5c, 0x4e, 0x84, 0x5c, 0xfb, 0xdd, 0xca, 0x48, 0x8b, 0x48, 0xb9, 0xba, 0x34}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xc5, 0xe3, 0xe8, 0xae, 0x17, 0x27, 0xe3, 0x64, 0x60, 0x71, 0x47, 0x29, 0x02, 0x0f, 0x92, 0x5d, 0x10, 0x93, 0xc8, 0x0e, 0xa1, 0xed, 0xba, 0xa9, 0x96, 0x1c, 0xc5, 0x76, 0x30, 0xcd, 0xf9, 0x30}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x95, 0xb0, 0xbd, 0x8c, 0xbc, 0xa7, 0x4f, 0x7e, 0xfd, 0x4e, 0x3a, 0xbf, 0x5f, 0x04, 0x79, 0x80, 0x2b, 0x5a, 0x9f, 0x4f, 0x68, 0x21, 0x19, 0x71, 0xc6, 0x20, 0x01, 0x42, 0xaa, 0xdf, 0xae, 0x2c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x90, 0x6e, 0x7e, 0x4b, 0x71, 0x93, 0xc0, 0x72, 0xed, 0xeb, 0x71, 0x24, 0x97, 0x26, 0x9c, 0xfe, 0xcb, 0x3e, 0x59, 0x19, 0xa8, 0x0f, 0x75, 0x7d, 0xbe, 0x18, 0xe6, 0x96, 0x1e, 0x95, 0x70, 0x60}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x89, 0x66, 0x3e, 0x1d, 0x4c, 0x5f, 0xfe, 0xc0, 0x04, 0x43, 0xd6, 0x44, 0x19, 0xb5, 0xad, 0xc7, 0x22, 0xdc, 0x71, 0x28, 0x64, 0xde, 0x41, 0x38, 0x27, 0x8f, 0x2c, 0x6b, 0x08, 0xb8, 0xb8, 0x7b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x3d, 0x70, 0x27, 0x9d, 0xd9, 0xaf, 0xb1, 0x27, 0xaf, 0xe3, 0x5d, 0x1e, 0x3a, 0x30, 0x54, 0x61, 0x60, 0xe8, 0xc3, 0x26, 0x3a, 0xbc, 0x7e, 0xf5, 0x81, 0xdd, 0x64, 0x01, 0x04, 0xeb, 0xc0, 0x1e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xda, 0x2c, 0xa4, 0xd1, 0xa1, 0xc3, 0x5c, 0x6e, 0x32, 0x07, 0x1f, 0xb8, 0x0e, 0x19, 0x9e, 0x99, 0x29, 0x33, 0x9a, 0xae, 0x7a, 0xed, 0x68, 0x42, 0x69, 0x7c, 0x07, 0xb3, 0x38, 0x2c, 0xf6, 0x3d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x64, 0xaa, 0xb5, 0x88, 0x79, 0x65, 0x38, 0x8c, 0x94, 0xd6, 0x62, 0x37, 0x7d, 0x64, 0xcd, 0x3a, 0xeb, 0xff, 0xe8, 0x81, 0x09, 0xc7, 0x6a, 0x50, 0x09, 0x0d, 0x28, 0x03, 0x0d, 0x9a, 0x93, 0x0a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x42, 0xa3, 0xf1, 0xc5, 0xb4, 0x0f, 0xd8, 0xc8, 0x8d, 0x15, 0x31, 0xbd, 0xf8, 0x07, 0x8b, 0xcd, 0x08, 0x8a, 0xfb, 0x18, 0x07, 0xfe, 0x8e, 0x52, 0x86, 0xef, 0xbe, 0xec, 0x49, 0x52, 0x99, 0x08}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x0f, 0xa9, 0xd5, 0x01, 0xaa, 0x48, 0x4f, 0x28, 0x66, 0x32, 0x1a, 0xba, 0x7c, 0xea, 0x11, 0x80, 0x17, 0x18, 0x9b, 0x56, 0x88, 0x25, 0x06, 0x69, 0x12, 0x2c, 0xea, 0x56, 0x69, 0x41, 0x24, 0x19}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xde, 0x21, 0xf0, 0xda, 0x8a, 0xfb, 0xb1, 0xb8, 0xcd, 0xc8, 0x6a, 0x82, 0x19, 0x73, 0xdb, 0xc7, 0xcf, 0x88, 0xeb, 0x96, 0xee, 0x6f, 0xfb, 0x06, 0xd2, 0xcd, 0x7d, 0x7b, 0x12, 0x28, 0x8e, 0x0c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x93, 0x44, 0x97, 0xce, 0x28, 0xff, 0x3a, 0x40, 0xc4, 0xf5, 0xf6, 0x9b, 0xf4, 0x6b, 0x07, 0x84, 0xfb, 0x98, 0xd8, 0xec, 0x8c, 0x03, 0x57, 0xec, 0x49, 0xed, 0x63, 0xb6, 0xaa, 0xff, 0x98, 0x28}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x3d, 0x16, 0x35, 0xf3, 0x46, 0xbc, 0xb3, 0xf4, 0xc6, 0xb6, 0x4f, 0xfa, 0xf4, 0xa0, 0x13, 0xe6, 0x57, 0x45, 0x93, 0xb9, 0xbc, 0xd6, 0x59, 0xe7, 0x77, 0x94, 0x6c, 0xab, 0x96, 0x3b, 0x4f, 0x09}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x5a, 0xf7, 0x6b, 0x01, 0x12, 0x4f, 0x51, 0xc1, 0x70, 0x84, 0x94, 0x47, 0xb2, 0x01, 0x6c, 0x71, 0xd7, 0xcc, 0x17, 0x66, 0x0f, 0x59, 0x5d, 0x5d, 0x10, 0x01, 0x57, 0x11, 0xf5, 0xdd, 0xe2, 0x34}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x26, 0xd9, 0x1f, 0x5c, 0x58, 0xac, 0x8b, 0x03, 0xd2, 0xc3, 0x85, 0x0f, 0x3a, 0xc3, 0x7f, 0x6d, 0x8e, 0x86, 0xcd, 0x52, 0x74, 0x8f, 0x55, 0x77, 0x17, 0xb7, 0x8e, 0xb7, 0x88, 0xea, 0xda, 0x1b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xb6, 0xea, 0x0e, 0x40, 0x93, 0x20, 0x79, 0x35, 0x6a, 0x61, 0x84, 0x5a, 0x07, 0x6d, 0xf9, 0x77, 0x6f, 0xed, 0x69, 0x1c, 0x0d, 0x25, 0x76, 0xcc, 0xf0, 0xdb, 0xbb, 0xc5, 0xad, 0xe2, 0x26, 0x57}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xcf, 0xe8, 0x0e, 0x6b, 0x96, 0x7d, 0xed, 0x27, 0xd1, 0x3c, 0xa9, 0xd9, 0x50, 0xa9, 0x98, 0x84, 0x5e, 0x86, 0xef, 0xd6, 0xf0, 0xf8, 0x0e, 0x89, 0x05, 0x2f, 0xd9, 0x5f, 0x15, 0x5f, 0x73, 0x79}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xc8, 0x5c, 0x16, 0xfe, 0xed, 0x9f, 0x26, 0x56, 0xf6, 0x4b, 0x9f, 0xa7, 0x0a, 0x85, 0xfe, 0xa5, 0x8c, 0x87, 0xdd, 0x98, 0xce, 0x4e, 0xc3, 0x58, 0x55, 0xb2, 0x7b, 0x3d, 0xd8, 0x6b, 0xb5, 0x4c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x65, 0x38, 0xa0, 0x15, 0xfa, 0xa7, 0xb4, 0x8f, 0xeb, 0xc4, 0x86, 0x9b, 0x30, 0xa5, 0x5e, 0x4d, 0xea, 0x8a, 0x9a, 0x9f, 0x1a, 0xd8, 0x5b, 0x53, 0x14, 0x19, 0x25, 0x63, 0xb4, 0x6f, 0x1f, 0x5d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xac, 0x8f, 0xbc, 0x1e, 0x7d, 0x8b, 0x5a, 0x0b, 0x8d, 0xaf, 0x76, 0x2e, 0x71, 0xe3, 0x3b, 0x6f, 0x53, 0x2f, 0x3e, 0x90, 0x95, 0xd4, 0x35, 0x14, 0x4f, 0x8c, 0x3c, 0xce, 0x57, 0x1c, 0x76, 0x49}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xa8, 0x50, 0xe1, 0x61, 0x6b, 0x57, 0x35, 0xeb, 0x44, 0x0b, 0x0c, 0x6e, 0xf9, 0x25, 0x80, 0x74, 0xf2, 0x8f, 0x6f, 0x7a, 0x3e, 0x7f, 0x2d, 0xf3, 0x4e, 0x09, 0x65, 0x10, 0x5e, 0x03, 0x25, 0x32}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xa9, 0x60, 0xdc, 0x0f, 0x64, 0xe5, 0x1d, 0xe2, 0x8d, 0x4f, 0x79, 0x2f, 0x0e, 0x24, 0x02, 0x00, 0x05, 0x77, 0x43, 0x25, 0x3d, 0x6a, 0xc7, 0xb7, 0xbf, 0x04, 0x08, 0x65, 0xf4, 0x39, 0x4b, 0x65}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x96, 0x19, 0x12, 0x6b, 0x6a, 0xb7, 0xe3, 0xdc, 0x45, 0x9b, 0xdb, 0xb4, 0xa8, 0xae, 0xdc, 0xa8, 0x14, 0x44, 0x65, 0x62, 0xce, 0x34, 0x9a, 0x84, 0x18, 0x12, 0x01, 0xf1, 0xe2, 0x7b, 0xce, 0x50}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x41, 0x21, 0x30, 0x53, 0x1b, 0x47, 0x01, 0xb7, 0x18, 0xd8, 0x82, 0x57, 0xbd, 0xa3, 0x60, 0xf0, 0x32, 0xf6, 0x5b, 0xf0, 0x30, 0x88, 0x91, 0x59, 0xfd, 0x90, 0xa2, 0xb9, 0x55, 0x93, 0x21, 0x34}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x97, 0x67, 0x9e, 0xeb, 0x6a, 0xf9, 0x6e, 0xd6, 0x73, 0xe8, 0x6b, 0x29, 0xec, 0x63, 0x82, 0x00, 0xa8, 0x99, 0x1c, 0x1d, 0x30, 0xc8, 0x90, 0x52, 0x90, 0xb6, 0x6a, 0x80, 0x4e, 0xff, 0x4b, 0x51}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x0f, 0x7d, 0x63, 0x8c, 0x6e, 0x5c, 0xde, 0x30, 0xdf, 0x65, 0xfa, 0x2e, 0xb0, 0xa3, 0x25, 0x05, 0x54, 0xbd, 0x25, 0xba, 0x06, 0xae, 0xdf, 0x8b, 0xd9, 0x1b, 0xea, 0x38, 0xb3, 0x05, 0x16, 0x09}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc7, 0x8c, 0xbf, 0x64, 0x28, 0xad, 0xf8, 0xa5, 0x5a, 0x6f, 0xc9, 0xba, 0xd5, 0x7f, 0xd5, 0xd6, 0xbd, 0x66, 0x2f, 0x3d, 0xaa, 0x54, 0xf6, 0xba, 0x32, 0x22, 0x9a, 0x1e, 0x52, 0x05, 0xf4, 0x1d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xaa, 0x1f, 0xbb, 0xeb, 0xfe, 0xe4, 0x87, 0xfc, 0xb1, 0x2c, 0xb7, 0x88, 0xf4, 0xc6, 0xb9, 0xf5, 0x24, 0x46, 0xf2, 0xa5, 0x9f, 0x8f, 0x8a, 0x93, 0x70, 0x69, 0xd4, 0x56, 0xec, 0xfd, 0x06, 0x46}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x4e, 0x66, 0xcf, 0x4e, 0x34, 0xce, 0x0c, 0xd9, 0xa6, 0x50, 0xd6, 0x5e, 0x95, 0xaf, 0xe9, 0x58, 0xfa, 0xee, 0x9b, 0xb8, 0xa5, 0x0f, 0x35, 0xe0, 0x43, 0x82, 0x6d, 0x65, 0xe6, 0xd9, 0x00, 0x0f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x7b, 0x75, 0x3a, 0xfc, 0x64, 0xd3, 0x29, 0x7e, 0xdd, 0x49, 0x9a, 0x59, 0x53, 0xbf, 0xb4, 0xa7, 0x52, 0xb3, 0x05, 0xab, 0xc3, 0xaf, 0x16, 0x1a, 0x85, 0x42, 0x32, 0xa2, 0x86, 0xfa, 0x39, 0x43}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x0e, 0x4b, 0xa3, 0x63, 0x8a, 0xfe, 0xa5, 0x58, 0xf1, 0x13, 0xbd, 0x9d, 0xaa, 0x7f, 0x76, 0x40, 0x70, 0x81, 0x10, 0x75, 0x99, 0xbb, 0xbe, 0x0b, 0x16, 0xe9, 0xba, 0x62, 0x34, 0xcc, 0x07, 0x6d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xc3, 0xf1, 0xc6, 0x93, 0x65, 0xee, 0x0b, 0xbc, 0xea, 0x14, 0xf0, 0xc1, 0xf8, 0x84, 0x89, 0xc2, 0xc9, 0xd7, 0xea, 0x34, 0xca, 0xa7, 0xc4, 0x99, 0xd5, 0x50, 0x69, 0xcb, 0xd6, 0x21, 0x63, 0x7c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x99, 0xeb, 0x7c, 0x31, 0x73, 0x64, 0x67, 0x7f, 0x0c, 0x66, 0xaa, 0x8c, 0x69, 0x91, 0xe2, 0x26, 0xd3, 0x23, 0xe2, 0x76, 0x5d, 0x32, 0x52, 0xdf, 0x5d, 0xc5, 0x8f, 0xb7, 0x7c, 0x84, 0xb3, 0x70}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xeb, 0x01, 0xc7, 0x36, 0x97, 0x4e, 0xb6, 0xab, 0x5f, 0x0d, 0x2c, 0xba, 0x67, 0x64, 0x55, 0xde, 0xbc, 0xff, 0xa6, 0xec, 0x04, 0xd3, 0x8d, 0x39, 0x56, 0x5e, 0xee, 0xf8, 0xe4, 0x2e, 0x33, 0x62}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x65, 0xef, 0xb8, 0x9f, 0xc8, 0x4b, 0xa7, 0xfd, 0x21, 0x49, 0x9b, 0x92, 0x35, 0x82, 0xd6, 0x0a, 0x9b, 0xf2, 0x79, 0xf1, 0x47, 0x2f, 0x6a, 0x7e, 0x9f, 0xcf, 0x18, 0x02, 0x3c, 0xfb, 0x1b, 0x3e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x2f, 0x8b, 0xc8, 0x40, 0x51, 0xd1, 0xac, 0x1a, 0x0b, 0xe4, 0xa9, 0xa2, 0x42, 0x21, 0x19, 0x2f, 0x7b, 0x97, 0xbf, 0xf7, 0x57, 0x6d, 0x3f, 0x3d, 0x4f, 0x0f, 0xe2, 0xb2, 0x81, 0x00, 0x9e, 0x7b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8c, 0x85, 0x2b, 0xc4, 0xfc, 0xf1, 0xab, 0xe8, 0x79, 0x22, 0xc4, 0x84, 0x17, 0x3a, 0xfa, 0x86, 0xa6, 0x7d, 0xf9, 0xf3, 0x6f, 0x03, 0x57, 0x20, 0x4d, 0x79, 0xf9, 0x6e, 0x71, 0x54, 0x38, 0x09}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x40, 0x29, 0x74, 0xa8, 0x2f, 0x5e, 0xf9, 0x79, 0xa4, 0xf3, 0x3e, 0xb9, 0xfd, 0x33, 0x31, 0xac, 0x9a, 0x69, 0x88, 0x1e, 0x77, 0x21, 0x2d, 0xf3, 0x91, 0x52, 0x26, 0x15, 0xb2, 0xa6, 0xcf, 0x7e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc6, 0x20, 0x47, 0x6c, 0xa4, 0x7d, 0xcb, 0x63, 0xea, 0x5b, 0x03, 0xdf, 0x3e, 0x88, 0x81, 0x6d, 0xce, 0x07, 0x42, 0x18, 0x60, 0x7e, 0x7b, 0x55, 0xfe, 0x6a, 0xf3, 0xda, 0x5c, 0x8b, 0x95, 0x10}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x62, 0xe4, 0x0d, 0x03, 0xb4, 0xd7, 0xcd, 0xfa, 0xbd, 0x46, 0xdf, 0x93, 0x71, 0x10, 0x2c, 0xa8, 0x3b, 0xb6, 0x09, 0x05, 0x70, 0x84, 0x43, 0x29, 0xa8, 0x59, 0xf5, 0x8e, 0x10, 0xe4, 0xd7, 0x20}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x57, 0x82, 0x1c, 0xab, 0xbf, 0x62, 0x70, 0xe8, 0xc4, 0xcf, 0xf0, 0x28, 0x6e, 0x16, 0x3c, 0x08, 0x78, 0x89, 0x85, 0x46, 0x0f, 0xf6, 0x7f, 0xcf, 0xcb, 0x7e, 0xb8, 0x25, 0xe9, 0x5a, 0xfa, 0x03}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xfb, 0x95, 0x92, 0x63, 0x50, 0xfc, 0x62, 0xf0, 0xa4, 0x5e, 0x8c, 0x18, 0xc2, 0x17, 0x24, 0xb7, 0x78, 0xc2, 0xa9, 0xe7, 0x6a, 0x32, 0xd6, 0x29, 0x85, 0xaf, 0xcb, 0x8d, 0x91, 0x13, 0xda, 0x6b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x36, 0x0a, 0xc2, 0xb6, 0x4b, 0xa5, 0x5d, 0x07, 0x17, 0x41, 0x31, 0x5f, 0x62, 0x46, 0xf8, 0x92, 0xf9, 0x66, 0x48, 0x73, 0xa6, 0x97, 0x0d, 0x7d, 0x88, 0xee, 0x62, 0xb1, 0x03, 0xa8, 0x3f, 0x2c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x4a, 0xb1, 0x70, 0x8a, 0xa9, 0xe8, 0x63, 0x79, 0x00, 0xe2, 0x25, 0x16, 0xca, 0x4b, 0x0f, 0xa4, 0x66, 0xad, 0x19, 0x9f, 0x88, 0x67, 0x0c, 0x8b, 0xc2, 0x4a, 0x5b, 0x2b, 0x6d, 0x95, 0xaf, 0x19}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8b, 0x9d, 0xb6, 0xcc, 0x60, 0xb4, 0x72, 0x4f, 0x17, 0x69, 0x5a, 0x4a, 0x68, 0x34, 0xab, 0xa1, 0x45, 0x32, 0x3c, 0x83, 0x87, 0x72, 0x30, 0x54, 0x77, 0x68, 0xae, 0xfb, 0xb5, 0x8b, 0x22, 0x5e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xf1, 0xb9, 0x87, 0x35, 0xc5, 0xbb, 0xb9, 0xcf, 0xf5, 0xd6, 0xcd, 0xd5, 0x0c, 0x7c, 0x0e, 0xe6, 0x90, 0x34, 0xfb, 0x51, 0x42, 0x1e, 0x6d, 0xac, 0x9a, 0x46, 0xc4, 0x97, 0x29, 0x32, 0xbf, 0x45}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x66, 0x9e, 0xc6, 0x24, 0xc0, 0xed, 0xa5, 0x5d, 0x88, 0xd4, 0xf0, 0x73, 0x97, 0x7b, 0xea, 0x7f, 0x42, 0xff, 0x21, 0xa0, 0x9b, 0x2f, 0x9a, 0xfd, 0x53, 0x57, 0x07, 0x84, 0x48, 0x88, 0x9d, 0x52}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xc6, 0x96, 0x48, 0x34, 0x2a, 0x06, 0xaf, 0x94, 0x3d, 0xf4, 0x1a, 0xcf, 0xf2, 0xc0, 0x21, 0xc2, 0x42, 0x5e, 0xc8, 0x2f, 0x35, 0xa2, 0x3e, 0x29, 0xfa, 0x0c, 0x84, 0xe5, 0x89, 0x72, 0x7c, 0x06}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x32, 0x65, 0x03, 0xe5, 0x89, 0xa6, 0x6e, 0xb3, 0x5b, 0x8e, 0xca, 0xeb, 0xfe, 0x22, 0x56, 0x8b, 0x5d, 0x14, 0x4b, 0x4d, 0xf9, 0xbe, 0xb5, 0xf5, 0xe6, 0x5c, 0x7b, 0x8b, 0xf4, 0x13, 0x11, 0x34}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x07, 0xc6, 0x22, 0x15, 0xe2, 0x9c, 0x60, 0xa2, 0x19, 0xd9, 0x27, 0xae, 0x37, 0x4e, 0xa6, 0xc9, 0x80, 0xa6, 0x91, 0x8f, 0x12, 0x49, 0xe5, 0x00, 0x18, 0x47, 0xd1, 0xd7, 0x28, 0x22, 0x63, 0x39}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe8, 0xe2, 0x00, 0x7e, 0xf2, 0x9e, 0x1e, 0x99, 0x39, 0x95, 0x04, 0xbd, 0x1e, 0x67, 0x7b, 0xb2, 0x26, 0xac, 0xe6, 0xaa, 0xe2, 0x46, 0xd5, 0xe4, 0xe8, 0x86, 0xbd, 0xab, 0x7c, 0x55, 0x59, 0x6f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x24, 0x64, 0x6e, 0x9b, 0x35, 0x71, 0x78, 0xce, 0x33, 0x03, 0x21, 0x33, 0x36, 0xf1, 0x73, 0x9b, 0xb9, 0x15, 0x8b, 0x2c, 0x69, 0xcf, 0x4d, 0xed, 0x4f, 0x4d, 0x57, 0x14, 0x13, 0x82, 0xa4, 0x4d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x65, 0x6e, 0x0a, 0xa4, 0x59, 0x07, 0x17, 0xf2, 0x6b, 0x4a, 0x1f, 0x6e, 0xf6, 0xb5, 0xbc, 0x62, 0xe4, 0xb6, 0xda, 0xa2, 0x93, 0xbc, 0x29, 0x05, 0xd2, 0xd2, 0x73, 0x46, 0x03, 0x16, 0x40, 0x31}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x4c, 0x73, 0x6d, 0x15, 0xbd, 0xa1, 0x4d, 0x5c, 0x13, 0x0b, 0x24, 0x06, 0x98, 0x78, 0x1c, 0x5b, 0xeb, 0x1f, 0x18, 0x54, 0x43, 0xd9, 0x55, 0x66, 0xda, 0x29, 0x21, 0xe8, 0xb8, 0x3c, 0x42, 0x22}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xb4, 0xcd, 0x08, 0x6f, 0x15, 0x23, 0x1a, 0x0b, 0x22, 0xed, 0xd1, 0xf1, 0xa7, 0xc7, 0x73, 0x45, 0xf3, 0x9e, 0xce, 0x76, 0xb7, 0xf6, 0x39, 0xb6, 0x8e, 0x79, 0xbe, 0xe9, 0x9b, 0xcf, 0x7d, 0x62}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x92, 0x5b, 0xfc, 0x72, 0xfd, 0xba, 0xf1, 0xfd, 0xa6, 0x7c, 0x95, 0xe3, 0x61, 0x3f, 0xe9, 0x03, 0xd4, 0x2b, 0xd4, 0x20, 0xd9, 0xdb, 0x4d, 0x32, 0x3e, 0xf5, 0x11, 0x64, 0xe3, 0xb4, 0xbe, 0x32}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x86, 0x17, 0x90, 0xe7, 0xc9, 0x1f, 0x10, 0xa5, 0x6a, 0x2d, 0x39, 0xd0, 0x3b, 0xc4, 0xa6, 0xe9, 0x59, 0x13, 0xda, 0x1a, 0xe6, 0xa0, 0xb9, 0x3c, 0x50, 0xb8, 0x40, 0x7c, 0x15, 0x36, 0x5a, 0x42}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xb4, 0x0b, 0x32, 0xab, 0xdc, 0x04, 0x51, 0x55, 0x21, 0x1e, 0x0b, 0x75, 0x99, 0x89, 0x73, 0x35, 0x3a, 0x91, 0x2b, 0xfe, 0xe7, 0x49, 0xea, 0x76, 0xc1, 0xf9, 0x46, 0xb9, 0x53, 0x02, 0x23, 0x04}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xfc, 0x5a, 0x1e, 0x1d, 0x74, 0x58, 0x95, 0xa6, 0x8f, 0x7b, 0x97, 0x3e, 0x17, 0x3b, 0x79, 0x2d, 0xa6, 0x57, 0xef, 0x45, 0x02, 0x0b, 0x4d, 0x6e, 0x9e, 0x93, 0x8d, 0x2f, 0xd9, 0x9d, 0xdb, 0x04}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xc0, 0xd7, 0x56, 0x97, 0x58, 0x91, 0xde, 0x09, 0x4f, 0x9f, 0xbe, 0x63, 0xb0, 0x83, 0x86, 0x43, 0x5d, 0xbc, 0xe0, 0xf3, 0xc0, 0x75, 0xbf, 0x8b, 0x8e, 0xaa, 0xf7, 0x8b, 0x64, 0x6e, 0xb0, 0x63}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x16, 0xae, 0x8b, 0xe0, 0x9b, 0x24, 0x68, 0x5c, 0x44, 0xc2, 0xd0, 0x08, 0xb7, 0x7b, 0x62, 0xfd, 0x7f, 0xd8, 0xd4, 0xb7, 0x50, 0xfd, 0x2c, 0x1b, 0xbf, 0x41, 0x95, 0xd9, 0x8e, 0xd8, 0x17, 0x1b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x86, 0x55, 0x37, 0x8e, 0xc3, 0x38, 0x48, 0x14, 0xb5, 0x97, 0xd2, 0xa7, 0x54, 0x45, 0xf1, 0x35, 0x44, 0x38, 0x9e, 0xf1, 0x1b, 0xb6, 0x34, 0x00, 0x3c, 0x96, 0xee, 0x29, 0x00, 0xea, 0x2c, 0x0b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xea, 0xda, 0x99, 0x9e, 0x19, 0x83, 0x66, 0x6d, 0xe9, 0x76, 0x87, 0x50, 0xd1, 0xfd, 0x3c, 0x60, 0x87, 0xc6, 0x41, 0xd9, 0x8e, 0xdb, 0x5e, 0xde, 0xaa, 0x9a, 0xd3, 0x28, 0xda, 0x95, 0xea, 0x47}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd0, 0x80, 0xba, 0x19, 0xae, 0x1d, 0xa9, 0x79, 0xf6, 0x3f, 0xac, 0x5d, 0x6f, 0x96, 0x1f, 0x2a, 0xce, 0x29, 0xb2, 0xff, 0x37, 0xf1, 0x94, 0x8f, 0x0c, 0xb5, 0x28, 0xba, 0x9a, 0x21, 0xf6, 0x66}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x02, 0xfb, 0x54, 0xb8, 0x05, 0xf3, 0x81, 0x52, 0x69, 0x34, 0x46, 0x9d, 0x86, 0x76, 0x8f, 0xd7, 0xf8, 0x6a, 0x66, 0xff, 0xe6, 0xa7, 0x90, 0xf7, 0x5e, 0xcd, 0x6a, 0x9b, 0x55, 0xfc, 0x9d, 0x48}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xbd, 0xaa, 0x13, 0xe6, 0xcd, 0x45, 0x4a, 0xa4, 0x59, 0x0a, 0x64, 0xb1, 0x98, 0xd6, 0x34, 0x13, 0x04, 0xe6, 0x97, 0x94, 0x06, 0xcb, 0xd4, 0x4e, 0xbb, 0x96, 0xcd, 0xd1, 0x57, 0xd1, 0xe3, 0x06}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x7a, 0x6c, 0x45, 0x27, 0xc4, 0x93, 0x7f, 0x7d, 0x7c, 0x62, 0x50, 0x38, 0x3a, 0x6b, 0xb5, 0x88, 0xc6, 0xd9, 0xf1, 0x78, 0x19, 0xb9, 0x39, 0x93, 0x3d, 0xc9, 0xe0, 0x9c, 0x3c, 0xce, 0xf5, 0x72}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x24, 0xea, 0x23, 0x7d, 0x56, 0x2c, 0xe2, 0x59, 0x0e, 0x85, 0x60, 0x04, 0x88, 0x5a, 0x74, 0x1e, 0x4b, 0xef, 0x13, 0xda, 0x4c, 0xff, 0x83, 0x45, 0x85, 0x3f, 0x08, 0x95, 0x2c, 0x20, 0x13, 0x1f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x48, 0x5f, 0x27, 0x90, 0x5c, 0x02, 0x42, 0xad, 0x78, 0x47, 0x5c, 0xb5, 0x7e, 0x08, 0x85, 0x00, 0xfa, 0x7f, 0xfd, 0xfd, 0xe7, 0x09, 0x11, 0xf2, 0x7e, 0x1b, 0x38, 0x6c, 0x35, 0x6d, 0x33, 0x66}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x93, 0x03, 0x36, 0x81, 0xac, 0xe4, 0x20, 0x09, 0x35, 0x4c, 0x45, 0xb2, 0x1e, 0x4c, 0x14, 0x21, 0xe6, 0xe9, 0x8a, 0x7b, 0x8d, 0xfe, 0x1e, 0xc6, 0x3e, 0xc1, 0x35, 0xfa, 0xe7, 0x70, 0x4e, 0x1d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x61, 0x2e, 0xc2, 0xdd, 0x95, 0x57, 0xd1, 0xab, 0x80, 0xe8, 0x63, 0x17, 0xb5, 0x48, 0xe4, 0x8a, 0x11, 0x9e, 0x72, 0xbe, 0x85, 0x8d, 0x51, 0x0a, 0xf2, 0x9f, 0xe0, 0x1c, 0xa9, 0x07, 0x28, 0x7b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xbb, 0x71, 0x14, 0x5e, 0x26, 0x8c, 0x3d, 0xc8, 0xe9, 0x7c, 0xd3, 0xd6, 0xd1, 0x2f, 0x07, 0x6d, 0xe6, 0xdf, 0xfb, 0x79, 0xd6, 0x99, 0x59, 0x96, 0x48, 0x40, 0x0f, 0x3a, 0x7b, 0xb2, 0xa0, 0x72}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x4e, 0x3b, 0x69, 0xc8, 0x43, 0x75, 0x51, 0x6c, 0x79, 0x56, 0xe4, 0xcb, 0xf7, 0xa6, 0x51, 0xc2, 0x2c, 0x42, 0x0b, 0xd4, 0x82, 0x20, 0x1c, 0x01, 0x08, 0x66, 0xd7, 0xbf, 0x04, 0x56, 0xfc, 0x02}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x24, 0xe8, 0xb7, 0x60, 0xae, 0x47, 0x80, 0xfc, 0xe5, 0x23, 0xe7, 0xc2, 0xc9, 0x85, 0xe6, 0x98, 0xa0, 0x29, 0x4e, 0xe1, 0x84, 0x39, 0x2d, 0x95, 0x2c, 0xf3, 0x45, 0x3c, 0xff, 0xaf, 0x27, 0x4c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x6b, 0xa6, 0xf5, 0x4b, 0x11, 0xbd, 0xba, 0x5b, 0x9e, 0xc4, 0xa4, 0x51, 0x1e, 0xbe, 0xd0, 0x90, 0x3a, 0x9c, 0xc2, 0x26, 0xb6, 0x1e, 0xf1, 0x95, 0x7d, 0xc8, 0x6d, 0x52, 0xe6, 0x99, 0x2c, 0x5f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x85, 0xe0, 0x24, 0x32, 0xb4, 0xd1, 0xef, 0xfc, 0x69, 0xa2, 0xbf, 0x8f, 0x72, 0x2c, 0x95, 0xf6, 0xe4, 0x6e, 0x7d, 0x90, 0xf7, 0x57, 0x81, 0xa0, 0xf7, 0xda, 0xef, 0x33, 0x07, 0xe3, 0x6b, 0x78}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x36, 0x27, 0x3e, 0xc6, 0x12, 0x07, 0xab, 0x4e, 0xbe, 0x69, 0x9d, 0xb3, 0xbe, 0x08, 0x7c, 0x2a, 0x47, 0x08, 0xfd, 0xd4, 0xcd, 0x0e, 0x27, 0x34, 0x5b, 0x98, 0x34, 0x2f, 0x77, 0x5f, 0x3a, 0x65}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x13, 0xaa, 0x2e, 0x4c, 0xf0, 0x22, 0xb8, 0x6c, 0xb3, 0x19, 0x4d, 0xeb, 0x6b, 0xd0, 0xa4, 0xc6, 0x9c, 0xdd, 0xc8, 0x5b, 0x81, 0x57, 0x89, 0xdf, 0x33, 0xa9, 0x68, 0x49, 0x80, 0xe4, 0xfe, 0x21}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x00, 0x17, 0x90, 0x30, 0xe9, 0xd3, 0x60, 0x30, 0x31, 0xc2, 0x72, 0x89, 0x7a, 0x36, 0xa5, 0xbd, 0x39, 0x83, 0x85, 0x50, 0xa1, 0x5d, 0x6c, 0x41, 0x1d, 0xb5, 0x2c, 0x07, 0x40, 0x77, 0x0b, 0x50}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x64, 0x34, 0xec, 0xc0, 0x9e, 0x44, 0x41, 0xaf, 0xa0, 0x36, 0x05, 0x6d, 0xea, 0x30, 0x25, 0x46, 0x35, 0x24, 0x9d, 0x86, 0xbd, 0x95, 0xf1, 0x6a, 0x46, 0xd7, 0x94, 0x54, 0xf9, 0x3b, 0xbd, 0x5d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x77, 0x5b, 0xe2, 0x37, 0xc7, 0xe1, 0x7c, 0x13, 0x8c, 0x9f, 0x7b, 0x7b, 0x2a, 0xce, 0x42, 0xa3, 0xb9, 0x2a, 0x99, 0xa8, 0xc0, 0xd8, 0x3c, 0x86, 0xb0, 0xfb, 0xe9, 0x76, 0x77, 0xf7, 0xf5, 0x56}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xdf, 0xb3, 0x46, 0x11, 0x6e, 0x13, 0xb7, 0x28, 0x4e, 0x56, 0xdd, 0xf1, 0xac, 0xad, 0x58, 0xc3, 0xf8, 0x88, 0x94, 0x5e, 0x06, 0x98, 0xa1, 0xe4, 0x6a, 0xfb, 0x0a, 0x49, 0x5d, 0x8a, 0xfe, 0x77}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x46, 0x02, 0xf5, 0xa5, 0xaf, 0xc5, 0x75, 0x6d, 0xba, 0x45, 0x35, 0x0a, 0xfe, 0xc9, 0xac, 0x22, 0x91, 0x8d, 0x21, 0x95, 0x33, 0x03, 0xc0, 0x8a, 0x16, 0xf3, 0x39, 0xe0, 0x01, 0x0f, 0x53, 0x3c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x34, 0x75, 0x37, 0x1f, 0x34, 0x4e, 0xa9, 0x1d, 0x68, 0x67, 0xf8, 0x49, 0x98, 0x96, 0xfc, 0x4c, 0x65, 0x97, 0xf7, 0x02, 0x4a, 0x52, 0x6c, 0x01, 0xbd, 0x48, 0xbb, 0x1b, 0xed, 0xa4, 0xe2, 0x53}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x59, 0xd5, 0x9b, 0x5a, 0xa2, 0x90, 0xd3, 0xb8, 0x37, 0x4c, 0x55, 0x82, 0x28, 0x08, 0x0f, 0x7f, 0xaa, 0x81, 0x65, 0xe0, 0x0c, 0x52, 0xc9, 0xa3, 0x32, 0x27, 0x64, 0xda, 0xfd, 0x34, 0x23, 0x5a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xb5, 0xb0, 0x0c, 0x4d, 0xb3, 0x7b, 0x23, 0xc8, 0x1f, 0x8a, 0x39, 0x66, 0xe6, 0xba, 0x4c, 0x10, 0x37, 0xca, 0x9c, 0x7c, 0x05, 0x9e, 0xff, 0xc0, 0xf8, 0x8e, 0xb1, 0x8f, 0x6f, 0x67, 0x18, 0x26}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x4b, 0x41, 0x13, 0x54, 0x23, 0x1a, 0xa4, 0x4e, 0xa9, 0x8b, 0x1e, 0x4b, 0xfc, 0x15, 0x24, 0xbb, 0x7e, 0xcb, 0xb6, 0x1e, 0x1b, 0xf5, 0xf2, 0xc8, 0x56, 0xec, 0x32, 0xa2, 0x60, 0x5b, 0xa0, 0x2a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xa4, 0x29, 0x47, 0x86, 0x2e, 0x92, 0x4f, 0x11, 0x4f, 0xf3, 0xb2, 0x5c, 0xd5, 0x3e, 0xa6, 0xb9, 0xc8, 0xe2, 0x33, 0x11, 0x1f, 0x01, 0x8f, 0xb0, 0x9b, 0xc7, 0xa5, 0xff, 0x83, 0x0f, 0x1e, 0x28}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x1d, 0x29, 0x7a, 0xa1, 0xec, 0x8e, 0xb5, 0xad, 0xea, 0x02, 0x68, 0x60, 0x74, 0x29, 0x1c, 0xa5, 0xcf, 0xc8, 0x3b, 0x7d, 0x8b, 0x2b, 0x7c, 0xad, 0xa4, 0x40, 0x17, 0x51, 0x59, 0x7c, 0x2e, 0x5d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x0a, 0x6c, 0x4f, 0xbc, 0x3e, 0x32, 0xe7, 0x4a, 0x1a, 0x13, 0xc1, 0x49, 0x38, 0xbf, 0xf7, 0xc2, 0xd3, 0x8f, 0x6b, 0xad, 0x52, 0xf7, 0xcf, 0xbc, 0x27, 0xcb, 0x40, 0x67, 0x76, 0xcd, 0x6d, 0x56}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe5, 0xb0, 0x27, 0xad, 0xbe, 0x9b, 0xf2, 0xb5, 0x63, 0xde, 0x3a, 0x23, 0x95, 0xb7, 0x0a, 0x7e, 0xf3, 0x9e, 0x45, 0x6f, 0x19, 0x39, 0x75, 0x8f, 0x39, 0x3d, 0x0f, 0xc0, 0x9f, 0xf1, 0xe9, 0x51}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x88, 0xaa, 0x14, 0x24, 0x86, 0x94, 0x11, 0x12, 0x3e, 0x1a, 0xb5, 0xcc, 0xbb, 0xe0, 0x9c, 0xd5, 0x9c, 0x6d, 0xba, 0x58, 0x72, 0x8d, 0xfb, 0x22, 0x7b, 0x9f, 0x7c, 0x94, 0x30, 0xb3, 0x51, 0x21}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf6, 0x74, 0x3d, 0xf2, 0xaf, 0xd0, 0x1e, 0x03, 0x7c, 0x23, 0x6b, 0xc9, 0xfc, 0x25, 0x70, 0x90, 0xdc, 0x9a, 0xa4, 0xfb, 0x49, 0xfc, 0x3d, 0x0a, 0x35, 0x38, 0x6f, 0xe4, 0x7e, 0x50, 0x01, 0x2a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd6, 0xe3, 0x96, 0x61, 0x3a, 0xfd, 0xef, 0x9b, 0x1f, 0x90, 0xa4, 0x24, 0x14, 0x5b, 0xc8, 0xde, 0x50, 0xb1, 0x1d, 0xaf, 0xe8, 0x55, 0x8a, 0x87, 0x0d, 0xfe, 0xaa, 0x3b, 0x82, 0x2c, 0x8d, 0x7b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x85, 0x0c, 0xaf, 0xf8, 0x83, 0x44, 0x49, 0xd9, 0x45, 0xcf, 0xf7, 0x48, 0xd9, 0x53, 0xb4, 0xf1, 0x65, 0xa0, 0xe1, 0xc3, 0xb3, 0x15, 0xed, 0x89, 0x9b, 0x4f, 0x62, 0xb3, 0x57, 0xa5, 0x45, 0x1c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x8f, 0x12, 0xea, 0xaf, 0xd1, 0x1f, 0x79, 0x10, 0x0b, 0xf6, 0xa3, 0x7b, 0xea, 0xac, 0x8b, 0x57, 0x32, 0x62, 0xe7, 0x06, 0x12, 0x51, 0xa0, 0x3b, 0x43, 0x5e, 0xa4, 0x20, 0x78, 0x31, 0xce, 0x0d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x84, 0x7c, 0xc2, 0xa6, 0x91, 0x23, 0xce, 0xbd, 0xdc, 0xf9, 0xce, 0xd5, 0x75, 0x30, 0x22, 0xe6, 0xf9, 0x43, 0x62, 0x0d, 0xf7, 0x75, 0x9d, 0x7f, 0x8c, 0xff, 0x7d, 0xe4, 0x72, 0xac, 0x9f, 0x1c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x88, 0xc1, 0x99, 0xd0, 0x3c, 0x1c, 0x5d, 0xb4, 0xef, 0x13, 0x0f, 0x90, 0xb9, 0x36, 0x2f, 0x95, 0x95, 0xc6, 0xdc, 0xde, 0x0a, 0x51, 0xe2, 0x8d, 0xf3, 0xbc, 0x51, 0xec, 0xdf, 0xb1, 0xa2, 0x5f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x2e, 0x68, 0xa1, 0x23, 0x7d, 0x9b, 0x40, 0x69, 0x85, 0x7b, 0x42, 0xbf, 0x90, 0x4b, 0xd6, 0x40, 0x2f, 0xd7, 0x52, 0x52, 0xb2, 0x21, 0xde, 0x64, 0xbd, 0x88, 0xc3, 0x6d, 0xa5, 0xfa, 0x81, 0x3f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xfb, 0xfd, 0x47, 0x7b, 0x8a, 0x66, 0x9e, 0x79, 0x2e, 0x64, 0x82, 0xef, 0xf7, 0x21, 0xec, 0xf6, 0xd8, 0x86, 0x09, 0x31, 0x7c, 0xdd, 0x03, 0x6a, 0x58, 0xa0, 0x77, 0xb7, 0x9b, 0x8c, 0x87, 0x1f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x55, 0x47, 0xe4, 0xa8, 0x3d, 0x55, 0x21, 0x34, 0xab, 0x1d, 0xae, 0xe0, 0xf4, 0xea, 0xdb, 0xc5, 0xb9, 0x58, 0xbf, 0xc4, 0x2a, 0x89, 0x31, 0x1a, 0xf4, 0x2d, 0xe1, 0xca, 0x37, 0x99, 0x47, 0x59}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xc7, 0xca, 0x63, 0xc1, 0x49, 0xa9, 0x35, 0x45, 0x55, 0x7e, 0xda, 0x64, 0x32, 0x07, 0x50, 0xf7, 0x32, 0xac, 0xde, 0x75, 0x58, 0x9b, 0x11, 0xb2, 0x3a, 0x1f, 0xf5, 0xf7, 0x79, 0x04, 0xe6, 0x08}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x46, 0xfa, 0x22, 0x4b, 0xfa, 0xe1, 0xfe, 0x96, 0xfc, 0x67, 0xba, 0x67, 0x97, 0xc4, 0xe7, 0x1b, 0x86, 0x90, 0x5f, 0xee, 0xf4, 0x5b, 0x11, 0xb2, 0xcd, 0xad, 0xee, 0xc2, 0x48, 0x6c, 0x2b, 0x1b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe3, 0x39, 0x62, 0xb4, 0x4f, 0x31, 0x04, 0xc9, 0xda, 0xd5, 0x73, 0x51, 0x57, 0xc5, 0xb8, 0xf3, 0xa3, 0x43, 0x70, 0xe4, 0x61, 0x81, 0x84, 0xe2, 0xbb, 0xbf, 0x4f, 0x9e, 0xa4, 0x5e, 0x74, 0x06}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x29, 0xac, 0xff, 0x27, 0xe0, 0x59, 0xbe, 0x39, 0x9c, 0x0d, 0x83, 0xd7, 0x10, 0x0b, 0x15, 0xb7, 0xe1, 0xc2, 0x2c, 0x30, 0x73, 0x80, 0x3a, 0x7d, 0x5d, 0xab, 0x58, 0x6b, 0xc1, 0xf0, 0xf4, 0x22}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xfe, 0x7f, 0xfb, 0x35, 0x7d, 0xc6, 0x01, 0x23, 0x28, 0xc4, 0x02, 0xac, 0x1f, 0x42, 0xb4, 0x9d, 0xfc, 0x00, 0x94, 0xa5, 0xee, 0xca, 0xda, 0x97, 0x09, 0x41, 0x77, 0x87, 0x5d, 0x7b, 0x87, 0x78}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf5, 0xfb, 0x90, 0x2d, 0x81, 0x19, 0x9e, 0x2f, 0x6d, 0x85, 0x88, 0x8c, 0x40, 0x5c, 0x77, 0x41, 0x4d, 0x01, 0x19, 0x76, 0x60, 0xe8, 0x4c, 0x48, 0xe4, 0x33, 0x83, 0x32, 0x6c, 0xb4, 0x41, 0x03}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xff, 0x10, 0xc2, 0x09, 0x4f, 0x6e, 0xf4, 0xd2, 0xdf, 0x7e, 0xca, 0x7b, 0x1c, 0x1d, 0xba, 0xa3, 0xb6, 0xda, 0x67, 0x33, 0xd4, 0x87, 0x36, 0x4b, 0x11, 0x20, 0x05, 0xa6, 0x29, 0xc1, 0x87, 0x17}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf6, 0x96, 0xca, 0x2f, 0xda, 0x38, 0xa7, 0x1b, 0xfc, 0xca, 0x7d, 0xfe, 0x08, 0x89, 0xe2, 0x47, 0x2b, 0x6a, 0x5d, 0x4b, 0xfa, 0xa1, 0xb4, 0xde, 0xb6, 0xc2, 0x31, 0x51, 0xf5, 0xe0, 0xa4, 0x0b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x5c, 0xe5, 0xc6, 0x04, 0x8e, 0x2b, 0x57, 0xbe, 0x38, 0x85, 0x23, 0xcb, 0xb7, 0xbe, 0x4f, 0xa9, 0xd3, 0x6e, 0x12, 0xaa, 0xd5, 0xb2, 0x2e, 0x93, 0x29, 0x9a, 0x4a, 0x88, 0x18, 0x43, 0xf5, 0x01}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x50, 0xfc, 0xdb, 0xa2, 0x59, 0x21, 0x8d, 0xbd, 0x7e, 0x33, 0xae, 0x2f, 0x87, 0x1a, 0xd0, 0x97, 0xc7, 0x0d, 0x4d, 0x63, 0x01, 0xef, 0x05, 0x84, 0xec, 0x40, 0xdd, 0xa8, 0x0a, 0x4f, 0x70, 0x0b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x41, 0x69, 0x01, 0x67, 0x5c, 0xd3, 0x8a, 0xc5, 0xcf, 0x3f, 0xd1, 0x57, 0xd1, 0x67, 0x3e, 0x01, 0x39, 0xb5, 0xcb, 0x81, 0x56, 0x96, 0x26, 0xb6, 0xc2, 0xe7, 0x5c, 0xfb, 0x63, 0x97, 0x58, 0x06}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x0c, 0x0e, 0xf3, 0xba, 0xf0, 0xe5, 0xba, 0xb2, 0x57, 0x77, 0xc6, 0x20, 0x9b, 0x89, 0x24, 0xbe, 0xf2, 0x9c, 0x8a, 0xba, 0x69, 0xc1, 0xf1, 0xb0, 0x4f, 0x2a, 0x05, 0x9a, 0xee, 0x10, 0x7e, 0x36}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x3f, 0x26, 0xe9, 0x40, 0xe9, 0x03, 0xad, 0x06, 0x69, 0x91, 0xe0, 0xd1, 0x89, 0x60, 0x84, 0x79, 0xde, 0x27, 0x6d, 0xe6, 0x76, 0xbd, 0xea, 0xe6, 0xae, 0x48, 0xc3, 0x67, 0xc0, 0x57, 0xcd, 0x2f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x7f, 0xc1, 0xdc, 0xb9, 0xc7, 0xbc, 0x86, 0x3d, 0x55, 0x4b, 0x28, 0x7a, 0xfb, 0x4d, 0xc7, 0xf8, 0xbc, 0x67, 0x2a, 0x60, 0x4d, 0x8f, 0x07, 0x0b, 0x1a, 0x17, 0xbf, 0xfa, 0xac, 0xa7, 0x3d, 0x1a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x91, 0x3f, 0xed, 0x5e, 0x18, 0x78, 0x3f, 0x23, 0x2c, 0x0d, 0x8c, 0x44, 0x00, 0xe8, 0xfb, 0xe9, 0x8e, 0xd6, 0xd1, 0x36, 0x58, 0x57, 0x9e, 0xae, 0x4b, 0x5c, 0x0b, 0x07, 0xbc, 0x6b, 0x55, 0x2b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x6f, 0x4d, 0x17, 0xd7, 0xe1, 0x84, 0xd9, 0x78, 0xb1, 0x90, 0xfd, 0x2e, 0xb3, 0xb5, 0x19, 0x3f, 0x1b, 0xfa, 0xc0, 0x68, 0xb3, 0xdd, 0x00, 0x2e, 0x89, 0xbd, 0x7e, 0x80, 0x32, 0x13, 0xa0, 0x7b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x1a, 0x6f, 0x40, 0xaf, 0x44, 0x44, 0xb0, 0x43, 0x8f, 0x0d, 0xd0, 0x1e, 0xc4, 0x0b, 0x19, 0x5d, 0x8e, 0xfe, 0xc1, 0xf3, 0xc5, 0x5c, 0x91, 0xf8, 0x04, 0x4e, 0xbe, 0x90, 0xb4, 0x47, 0x5c, 0x3f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xb0, 0x3b, 0x2c, 0xf3, 0xfe, 0x32, 0x71, 0x07, 0x3f, 0xaa, 0xba, 0x45, 0x60, 0xa8, 0x8d, 0xea, 0x54, 0xcb, 0x39, 0x10, 0xb4, 0xf2, 0x8b, 0xd2, 0x14, 0x82, 0x42, 0x07, 0x8e, 0xe9, 0x7c, 0x53}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xb0, 0xae, 0xc1, 0x8d, 0xc9, 0x8f, 0xb9, 0x7a, 0x77, 0xef, 0xba, 0x79, 0xa0, 0x3c, 0xa8, 0xf5, 0x6a, 0xe2, 0x3f, 0x5d, 0x00, 0xe3, 0x4b, 0x45, 0x24, 0x7b, 0x43, 0x78, 0x55, 0x1d, 0x2b, 0x1e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0xb8, 0xd6, 0x16, 0x67, 0xa0, 0x15, 0xb9, 0xe1, 0x58, 0xa4, 0xa7, 0x31, 0x37, 0x77, 0x2f, 0x8b, 0x12, 0x9f, 0xf4, 0x3f, 0xc7, 0x36, 0x66, 0xd2, 0xa8, 0x56, 0xf7, 0x7f, 0x74, 0xc6, 0x41}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x5d, 0xf8, 0xb4, 0xa8, 0x30, 0xdd, 0xcc, 0x38, 0xa5, 0xd3, 0xca, 0xd8, 0xd1, 0xf8, 0xb2, 0x31, 0x91, 0xd4, 0x72, 0x05, 0x57, 0x4a, 0x3b, 0x82, 0x4a, 0xc6, 0x68, 0x20, 0xe2, 0x18, 0x41, 0x61}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x19, 0xd4, 0x8d, 0x47, 0x29, 0x12, 0x65, 0xb0, 0x11, 0x78, 0x47, 0xb5, 0xcb, 0xa3, 0xa5, 0xfa, 0x05, 0x85, 0x54, 0xa9, 0x33, 0x97, 0x8d, 0x2b, 0xc2, 0xfe, 0x99, 0x35, 0x28, 0xe5, 0xeb, 0x63}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xb1, 0x3f, 0x3f, 0xef, 0xd8, 0xf4, 0xfc, 0xb3, 0xa0, 0x60, 0x50, 0x06, 0x2b, 0x29, 0x52, 0x70, 0x15, 0x0b, 0x24, 0x24, 0xf8, 0x5f, 0x79, 0x18, 0xcc, 0xff, 0x89, 0x99, 0x84, 0xa1, 0xae, 0x13}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x44, 0x1f, 0xb8, 0xc2, 0x01, 0xc1, 0x30, 0x19, 0x55, 0x05, 0x60, 0x10, 0xa4, 0x6c, 0x2d, 0x67, 0x70, 0xe5, 0x25, 0x1b, 0xf2, 0xbf, 0xdd, 0xfb, 0x70, 0x2b, 0xa1, 0x8c, 0x9c, 0x94, 0x84, 0x08}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe7, 0xc4, 0x43, 0x4d, 0xc9, 0x2b, 0x69, 0x5d, 0x1d, 0x3c, 0xaf, 0xbb, 0x43, 0x38, 0x4e, 0x98, 0x3d, 0xed, 0x0d, 0x21, 0x03, 0xfd, 0xf0, 0x99, 0x47, 0x04, 0xb0, 0x98, 0x69, 0x55, 0x72, 0x0f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x5e, 0xdf, 0x15, 0x53, 0x3b, 0x86, 0x80, 0xb0, 0xf1, 0x70, 0x68, 0x8f, 0x66, 0x7c, 0x0e, 0x49, 0x1a, 0xd8, 0x6b, 0xfe, 0x4e, 0xef, 0xca, 0x47, 0xd4, 0x03, 0xc1, 0x37, 0x50, 0x9c, 0xc1, 0x16}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xcd, 0x24, 0xc6, 0x3e, 0x0c, 0x82, 0x9b, 0x91, 0x2b, 0x61, 0x4a, 0xb2, 0x0f, 0x88, 0x55, 0x5f, 0x5a, 0x57, 0xff, 0xe5, 0x74, 0x0b, 0x13, 0x43, 0x00, 0xd8, 0x6b, 0xcf, 0xd2, 0x15, 0x03, 0x2c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xdc, 0xff, 0x15, 0x61, 0x2f, 0x4a, 0x2f, 0x62, 0xf2, 0x04, 0x2f, 0xb5, 0x0c, 0xb7, 0x1e, 0x3f, 0x74, 0x1a, 0x0f, 0xd7, 0xea, 0xcd, 0xd9, 0x7d, 0xf6, 0x12, 0x0e, 0x2f, 0xdb, 0x5a, 0x3b, 0x16}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x1b, 0x37, 0x47, 0xe3, 0xf5, 0x9e, 0xea, 0x2c, 0x2a, 0xe7, 0x82, 0x36, 0xf4, 0x1f, 0x81, 0x47, 0x92, 0x4b, 0x69, 0x0e, 0x11, 0x8c, 0x5d, 0x53, 0x5b, 0x81, 0x27, 0x08, 0xbc, 0xa0, 0xae, 0x25}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x69, 0x32, 0xa1, 0x05, 0x11, 0x42, 0x00, 0xd2, 0x59, 0xac, 0x4d, 0x62, 0x8b, 0x13, 0xe2, 0x50, 0x5d, 0xa0, 0x9d, 0x9b, 0xfd, 0xbb, 0x12, 0x41, 0x75, 0x41, 0x9e, 0xcc, 0xdc, 0xc7, 0xdc, 0x5d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd9, 0xe3, 0x38, 0x06, 0x46, 0x70, 0x82, 0x5e, 0x28, 0x49, 0x79, 0xff, 0x25, 0xd2, 0x4e, 0x29, 0x8d, 0x06, 0xb0, 0x23, 0xae, 0x9b, 0x66, 0xe4, 0x7d, 0xc0, 0x70, 0x91, 0xa3, 0xfc, 0xec, 0x4e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x62, 0x12, 0x37, 0x6a, 0x30, 0xf6, 0x1e, 0xfb, 0x14, 0x5c, 0x0d, 0x0e, 0xb7, 0x81, 0x6a, 0xe7, 0x08, 0x05, 0xac, 0xaa, 0x38, 0x46, 0xe2, 0x73, 0xea, 0x4b, 0x07, 0x81, 0x43, 0x7c, 0x9e, 0x5e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xfc, 0xf9, 0x21, 0x4f, 0x2e, 0x76, 0x9b, 0x1f, 0x28, 0x60, 0x77, 0x43, 0x32, 0x9d, 0xbe, 0x17, 0x30, 0x2a, 0xc6, 0x18, 0x92, 0x66, 0x62, 0x30, 0x98, 0x40, 0x11, 0xa6, 0x7f, 0x18, 0x84, 0x28}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x3f, 0xab, 0xd3, 0xf4, 0x8a, 0x76, 0xa1, 0x3c, 0xca, 0x2d, 0x49, 0xc3, 0xea, 0x08, 0x0b, 0x85, 0x17, 0x2a, 0xc3, 0x6c, 0x08, 0xfd, 0x57, 0x9f, 0x3d, 0x5f, 0xdf, 0x67, 0x68, 0x42, 0x00, 0x32}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x51, 0x60, 0x1b, 0x06, 0x4f, 0x8a, 0x21, 0xba, 0x38, 0xa8, 0xba, 0xd6, 0x40, 0xf6, 0xe9, 0x9b, 0x76, 0x4d, 0x56, 0x21, 0x5b, 0x0a, 0x9b, 0x2e, 0x4f, 0x3d, 0x81, 0x32, 0x08, 0x9f, 0x97, 0x5b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe5, 0x44, 0xec, 0x06, 0x9d, 0x90, 0x79, 0x9f, 0xd3, 0xe0, 0x79, 0xaf, 0x8f, 0x10, 0xfd, 0xdd, 0x04, 0xae, 0x27, 0x97, 0x46, 0x33, 0x79, 0xea, 0xb8, 0x4e, 0xca, 0x5a, 0x59, 0x57, 0xe1, 0x0e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x1a, 0xda, 0xf3, 0xa5, 0x41, 0x43, 0x28, 0xfc, 0x7e, 0xe7, 0x71, 0xea, 0xc6, 0x3b, 0x59, 0xcc, 0x2e, 0xd3, 0x40, 0xec, 0xb3, 0x13, 0x6f, 0x44, 0xcd, 0x13, 0xb2, 0x37, 0xf2, 0x6e, 0xd9, 0x1c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe3, 0xdb, 0x60, 0xcd, 0x5c, 0x4a, 0x18, 0x0f, 0xef, 0x73, 0x36, 0x71, 0x8c, 0xf6, 0x11, 0xb4, 0xd8, 0xce, 0x17, 0x5e, 0x4f, 0x26, 0x77, 0x97, 0x5f, 0xcb, 0xef, 0x91, 0xeb, 0x6a, 0x62, 0x7a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x18, 0x4a, 0xa2, 0x97, 0x08, 0x81, 0x2d, 0x83, 0xc4, 0xcc, 0xf0, 0x83, 0x7e, 0xec, 0x0d, 0x95, 0x4c, 0x5b, 0xfb, 0xfa, 0x98, 0x80, 0x4a, 0x66, 0x56, 0x0c, 0x51, 0xb3, 0xf2, 0x04, 0x5d, 0x27}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x3b, 0xb9, 0xb8, 0x06, 0x5a, 0x2e, 0xfe, 0xc3, 0x82, 0x37, 0x9c, 0xa3, 0x11, 0x1f, 0x9c, 0xa6, 0xda, 0x63, 0x48, 0x9b, 0xad, 0xde, 0x2d, 0xa6, 0xbc, 0x6e, 0x32, 0xda, 0x27, 0x65, 0xdd, 0x57}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x84, 0x4f, 0x37, 0x31, 0x7d, 0x2e, 0xbc, 0xad, 0x87, 0x07, 0x2a, 0x6b, 0x37, 0xfc, 0x5f, 0xeb, 0x4e, 0x75, 0x35, 0xa6, 0xde, 0xab, 0x0a, 0x19, 0x3a, 0xb7, 0xb1, 0xef, 0x92, 0x6a, 0x3b, 0x3c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x3b, 0xb2, 0x94, 0x6d, 0x39, 0x60, 0xac, 0xee, 0xe7, 0x81, 0x1a, 0x3b, 0x76, 0x87, 0x5c, 0x05, 0x94, 0x2a, 0x45, 0xb9, 0x80, 0xe9, 0x22, 0xb1, 0x07, 0xcb, 0x40, 0x9e, 0x70, 0x49, 0x6d, 0x12}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xfd, 0x18, 0x78, 0x84, 0xa8, 0x4c, 0x7d, 0x6e, 0x59, 0xa6, 0xe5, 0x74, 0xf1, 0x19, 0xa6, 0x84, 0x2e, 0x51, 0xc1, 0x29, 0x13, 0xf2, 0x14, 0x6b, 0x5d, 0x53, 0x51, 0xf7, 0xef, 0xbf, 0x01, 0x22}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xa4, 0x4b, 0x62, 0x4c, 0xe6, 0xfd, 0x72, 0x07, 0xf2, 0x81, 0xfc, 0xf2, 0xbd, 0x12, 0x7c, 0x68, 0x76, 0x2a, 0xba, 0xf5, 0x65, 0xb1, 0x1f, 0x17, 0x0a, 0x38, 0xb0, 0xbf, 0xc0, 0xf8, 0xf4, 0x2a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x55, 0x60, 0x55, 0x5b, 0xe4, 0x1d, 0x71, 0x4c, 0x9d, 0x5b, 0x9f, 0x70, 0xa6, 0x85, 0x9a, 0x2c, 0xa0, 0xe2, 0x32, 0x48, 0xce, 0x9e, 0x2a, 0xa5, 0x07, 0x3b, 0xc7, 0x6c, 0x86, 0x77, 0xde, 0x3c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf7, 0x18, 0x7a, 0x96, 0x7e, 0x43, 0x57, 0xa9, 0x55, 0xfc, 0x4e, 0xb6, 0x72, 0x00, 0xf2, 0xe4, 0xd7, 0x52, 0xd3, 0xd3, 0xb6, 0x85, 0xf6, 0x71, 0xc7, 0x44, 0x3f, 0x7f, 0xd7, 0xb3, 0xf2, 0x79}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x46, 0xca, 0xa7, 0x55, 0x7b, 0x79, 0xf3, 0xca, 0x5a, 0x65, 0xf6, 0xed, 0x50, 0x14, 0x7b, 0xe4, 0xc4, 0x2a, 0x65, 0x9e, 0xe2, 0xf9, 0xca, 0xa7, 0x22, 0x26, 0x53, 0xcb, 0x21, 0x5b, 0xa7, 0x31}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x90, 0xd7, 0xc5, 0x26, 0x08, 0xbd, 0xb0, 0x53, 0x63, 0x58, 0xc3, 0x31, 0x5e, 0x75, 0x46, 0x15, 0x91, 0xa6, 0xf8, 0x2f, 0x1a, 0x08, 0x65, 0x88, 0x2f, 0x98, 0x04, 0xf1, 0x7c, 0x6e, 0x00, 0x77}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x81, 0x21, 0x61, 0x09, 0xf6, 0x4e, 0xf1, 0x92, 0xee, 0x63, 0x61, 0x73, 0x87, 0xc7, 0x54, 0x0e, 0x42, 0x4b, 0xc9, 0x47, 0xd1, 0xb8, 0x7e, 0x91, 0x75, 0x37, 0x99, 0x28, 0xb8, 0xdd, 0x7f, 0x50}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x89, 0x8f, 0xc0, 0xbe, 0x5d, 0xd6, 0x9f, 0xa0, 0xf0, 0x9d, 0x81, 0xce, 0x3a, 0x7b, 0x98, 0x58, 0xbb, 0xd7, 0x78, 0xc8, 0x3f, 0x13, 0xf1, 0x74, 0x19, 0xdf, 0xf8, 0x98, 0x89, 0x5d, 0xfa, 0x5f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x9e, 0x35, 0x85, 0x94, 0x47, 0x1f, 0x90, 0x15, 0x26, 0xd0, 0x84, 0xed, 0x8a, 0x80, 0xf7, 0x63, 0x42, 0x86, 0x27, 0xd7, 0xf4, 0x75, 0x58, 0xdc, 0x9c, 0xc0, 0x22, 0x7e, 0x20, 0x35, 0xfd, 0x1f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x68, 0x0e, 0x6f, 0x97, 0xba, 0x70, 0xbb, 0xa3, 0x0e, 0xe5, 0x0b, 0x12, 0xf4, 0xa2, 0xdc, 0x47, 0xf8, 0xe6, 0xd0, 0x23, 0x6c, 0x33, 0xa8, 0x99, 0x46, 0x6e, 0x0f, 0x44, 0xba, 0x76, 0x48, 0x0f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xa3, 0x2a, 0x61, 0x37, 0xe2, 0x59, 0x12, 0x0e, 0x27, 0xba, 0x64, 0x43, 0xae, 0xc0, 0x42, 0x69, 0x79, 0xa4, 0x1e, 0x29, 0x8b, 0x15, 0xeb, 0xf8, 0xaf, 0xd4, 0xa2, 0x68, 0x33, 0xb5, 0x7a, 0x24}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x2c, 0x19, 0x33, 0xdd, 0x1b, 0xab, 0xec, 0x01, 0xb0, 0x23, 0xf8, 0x42, 0x2b, 0x06, 0x88, 0xea, 0x3d, 0x2d, 0x00, 0x2a, 0x78, 0x45, 0x4d, 0x38, 0xed, 0x2e, 0x2e, 0x44, 0x49, 0xed, 0xcb, 0x33}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xa0, 0x68, 0xe8, 0x41, 0x8f, 0x91, 0xf8, 0x11, 0x13, 0x90, 0x2e, 0xa7, 0xab, 0x30, 0xef, 0xad, 0xa0, 0x61, 0x00, 0x88, 0xef, 0xdb, 0xce, 0x5b, 0x5c, 0xbb, 0x62, 0xc8, 0x56, 0xf9, 0x00, 0x73}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x3f, 0x60, 0xc1, 0x82, 0x2d, 0xa3, 0x28, 0x58, 0x24, 0x9e, 0x9f, 0xe3, 0x70, 0xcc, 0x09, 0x4e, 0x1a, 0x3f, 0x11, 0x11, 0x15, 0x07, 0x3c, 0xa4, 0x41, 0xe0, 0x65, 0xa3, 0x0a, 0x41, 0x6d, 0x11}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x31, 0x40, 0x01, 0x52, 0x56, 0x94, 0x5b, 0x28, 0x8a, 0xaa, 0x52, 0xee, 0xd8, 0x0a, 0x05, 0x8d, 0xcd, 0xb5, 0xaa, 0x2e, 0x38, 0xaa, 0xb7, 0x87, 0xf7, 0x2b, 0xfb, 0x04, 0xcb, 0x84, 0x3d, 0x54}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x20, 0xef, 0x59, 0xde, 0xa4, 0x2b, 0x93, 0x6e, 0x2e, 0xec, 0x42, 0x9a, 0xd4, 0x2d, 0xf4, 0x46, 0x58, 0x27, 0x2b, 0x18, 0x8f, 0x83, 0x3d, 0x69, 0x9e, 0xd4, 0x3e, 0xb6, 0xc5, 0xfd, 0x58, 0x03}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x33, 0x89, 0xc9, 0x63, 0x62, 0x1c, 0x17, 0xb4, 0x60, 0xc4, 0x26, 0x68, 0x09, 0xc3, 0x2e, 0x37, 0x0f, 0x7b, 0xb4, 0x9c, 0xb6, 0xf9, 0xfb, 0xd4, 0x51, 0x78, 0xc8, 0x63, 0xea, 0x77, 0x47, 0x07}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x32, 0xb4, 0x18, 0x47, 0x79, 0xcb, 0xd4, 0x5a, 0x07, 0x14, 0x0f, 0xa0, 0xd5, 0xac, 0xd0, 0x41, 0x40, 0xab, 0x61, 0x23, 0xe5, 0x2a, 0x2a, 0x6f, 0xf7, 0xa8, 0xd4, 0x76, 0xef, 0xe7, 0x45, 0x6c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xa1, 0x5e, 0x60, 0x4f, 0xfb, 0xe1, 0x70, 0x6a, 0x1f, 0x55, 0x4f, 0x09, 0xb4, 0x95, 0x33, 0x36, 0xc6, 0x81, 0x01, 0x18, 0x06, 0x25, 0x27, 0xa4, 0xb4, 0x24, 0xa4, 0x86, 0x03, 0x4c, 0xac, 0x02}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x77, 0x38, 0xde, 0xd7, 0x60, 0x48, 0x07, 0xf0, 0x74, 0xa8, 0xff, 0x54, 0xe5, 0x30, 0x43, 0xff, 0x77, 0xfb, 0x21, 0x07, 0xff, 0xb2, 0x07, 0x6b, 0xe4, 0xe5, 0x30, 0xfc, 0x19, 0x6c, 0xa3, 0x01}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x13, 0xc5, 0x2c, 0xac, 0xd3, 0x83, 0x82, 0x7c, 0x29, 0xf7, 0x05, 0xa5, 0x00, 0xb6, 0x1f, 0x86, 0x55, 0xf4, 0xd6, 0x2f, 0x0c, 0x99, 0xd0, 0x65, 0x9b, 0x6b, 0x46, 0x0d, 0x43, 0xf8, 0x16, 0x28}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x1e, 0x7f, 0xb4, 0x74, 0x7e, 0xb1, 0x89, 0x4f, 0x18, 0x5a, 0xab, 0x64, 0x06, 0xdf, 0x45, 0x87, 0xe0, 0x6a, 0xc6, 0xf0, 0x0e, 0xc9, 0x24, 0x35, 0x38, 0xea, 0x30, 0x54, 0xb4, 0xc4, 0x52, 0x54}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe9, 0x9f, 0xdc, 0x3f, 0xc1, 0x89, 0x44, 0x74, 0x27, 0xe4, 0xc1, 0x90, 0xff, 0x4a, 0xa7, 0x3c, 0xee, 0xcd, 0xf4, 0x1d, 0x25, 0x94, 0x7f, 0x63, 0x16, 0x48, 0xbc, 0x64, 0xfe, 0x95, 0xc4, 0x0c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8b, 0x19, 0x75, 0x6e, 0x03, 0x06, 0x5e, 0x6a, 0x6f, 0x1a, 0x8c, 0xe3, 0xd3, 0x28, 0xf2, 0xe0, 0xb9, 0x7a, 0x43, 0x69, 0xe6, 0xd3, 0xc0, 0xfe, 0x7e, 0x97, 0xab, 0x6c, 0x7b, 0x8e, 0x13, 0x42}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd4, 0xca, 0x70, 0x3d, 0xab, 0xfb, 0x5f, 0x5e, 0x00, 0x0c, 0xcc, 0x77, 0x22, 0xf8, 0x78, 0x55, 0xae, 0x62, 0x35, 0xfb, 0x9a, 0xc6, 0x03, 0xe4, 0x0c, 0xee, 0xab, 0xc7, 0xc0, 0x89, 0x87, 0x54}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x32, 0xad, 0xae, 0x85, 0x58, 0x43, 0xb8, 0xb1, 0xe6, 0x3e, 0x00, 0x9c, 0x78, 0x88, 0x56, 0xdb, 0x9c, 0xfc, 0x79, 0xf6, 0xf9, 0x41, 0x5f, 0xb7, 0xbc, 0x11, 0xf9, 0x20, 0x36, 0x1c, 0x53, 0x2b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x5a, 0x20, 0x5b, 0xa1, 0xa5, 0x44, 0x91, 0x24, 0x02, 0x63, 0x12, 0x64, 0xb8, 0x55, 0xf6, 0xde, 0x2c, 0xdb, 0x47, 0xb8, 0xc6, 0x0a, 0xc3, 0x00, 0x78, 0x93, 0xd8, 0xf5, 0xf5, 0x18, 0x28, 0x0a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xd6, 0x1b, 0x9a, 0x6c, 0xe5, 0x46, 0xea, 0x70, 0x96, 0x8d, 0x4e, 0x2a, 0x52, 0x21, 0x26, 0x4b, 0xb1, 0xbb, 0x0f, 0x7c, 0xa9, 0x9b, 0x04, 0xbb, 0x51, 0x08, 0xf1, 0x9a, 0xa4, 0x76, 0x7c, 0x18}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xfa, 0x94, 0xf7, 0x40, 0xd0, 0xd7, 0xeb, 0xa9, 0x82, 0x36, 0xd5, 0x15, 0xb9, 0x33, 0x7a, 0xbf, 0x8a, 0xf2, 0x63, 0xaa, 0x37, 0xf5, 0x59, 0xac, 0xbd, 0xbb, 0x32, 0x36, 0xbe, 0x73, 0x99, 0x38}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x2c, 0xb3, 0xda, 0x7a, 0xd8, 0x3d, 0x99, 0xca, 0xd2, 0xf4, 0xda, 0x99, 0x8e, 0x4f, 0x98, 0xb7, 0xf4, 0xae, 0x3e, 0x9f, 0x8e, 0x35, 0x60, 0xa4, 0x33, 0x75, 0xa4, 0x04, 0x93, 0xb1, 0x6b, 0x4d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x97, 0x9d, 0xa8, 0xcd, 0x97, 0x7b, 0x9d, 0xb9, 0xe7, 0xa5, 0xef, 0xfd, 0xa8, 0x42, 0x6b, 0xc3, 0x62, 0x64, 0x7d, 0xa5, 0x1b, 0xc9, 0x9e, 0xd2, 0x45, 0xb9, 0xee, 0x03, 0xb0, 0xbf, 0xc0, 0x68}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xed, 0xb7, 0x84, 0x2c, 0xf6, 0xd3, 0xa1, 0x6b, 0x24, 0x6d, 0x87, 0x56, 0x97, 0x59, 0x79, 0x62, 0x9f, 0xac, 0xed, 0xf3, 0xc9, 0x89, 0x21, 0x2e, 0x04, 0xb3, 0xcc, 0x2f, 0xbe, 0xd6, 0x0a, 0x4b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x39, 0x61, 0x05, 0xed, 0x25, 0x89, 0x8b, 0x5d, 0x1b, 0xcb, 0x0c, 0x55, 0xf4, 0x6a, 0x00, 0x8a, 0x46, 0xe8, 0x1e, 0xc6, 0x83, 0xc8, 0x5a, 0x76, 0xdb, 0xcc, 0x19, 0x7a, 0xcc, 0x67, 0x46, 0x0b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x53, 0xcf, 0xc2, 0xa1, 0xad, 0x6a, 0xf3, 0xcd, 0x8f, 0xc9, 0xde, 0x1c, 0xf8, 0x6c, 0x8f, 0xf8, 0x76, 0x42, 0xe7, 0xfe, 0xb2, 0x72, 0x21, 0x0a, 0x66, 0x74, 0x8f, 0xb7, 0xeb, 0xe4, 0x6f, 0x01}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x22, 0x8c, 0x6b, 0xbe, 0xfc, 0x4d, 0x70, 0x62, 0x6e, 0x52, 0x77, 0x99, 0x88, 0x7e, 0x7b, 0x57, 0x7a, 0x0d, 0xfe, 0xdc, 0x72, 0x92, 0xf1, 0x68, 0x1d, 0x97, 0xd7, 0x7c, 0x8d, 0x53, 0x10, 0x37}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x53, 0x88, 0x77, 0x02, 0xca, 0x27, 0xa8, 0xe5, 0x45, 0xe2, 0xa8, 0x48, 0x2a, 0xab, 0x18, 0xca, 0xea, 0x2d, 0x2a, 0x54, 0x17, 0x37, 0x32, 0x09, 0xdc, 0xe0, 0x4a, 0xb7, 0x7d, 0x82, 0x10, 0x7d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x8a, 0x64, 0x1e, 0x14, 0x0a, 0x57, 0xd4, 0xda, 0x5c, 0x96, 0x9b, 0x01, 0x4c, 0x67, 0xbf, 0x8b, 0x30, 0xfe, 0x08, 0xdb, 0x0d, 0xd5, 0xa8, 0xd7, 0x09, 0x11, 0x85, 0xa2, 0xd3, 0x45, 0xfb, 0x7e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xda, 0x8c, 0xc2, 0xd0, 0xac, 0x18, 0xe8, 0x52, 0x36, 0xd4, 0x21, 0xa3, 0xdd, 0x57, 0x22, 0x79, 0xb7, 0xf8, 0x71, 0x9d, 0xc6, 0x91, 0x70, 0x86, 0x56, 0xbf, 0xa1, 0x11, 0x8b, 0x19, 0xe1, 0x0f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x18, 0x32, 0x98, 0x2c, 0x8f, 0x91, 0xae, 0x12, 0xf0, 0x8c, 0xea, 0xf3, 0x3c, 0xb9, 0x5d, 0xe4, 0x69, 0xed, 0xb2, 0x47, 0x18, 0xbd, 0xce, 0x16, 0x52, 0x5c, 0x23, 0xe2, 0xa5, 0x25, 0x52, 0x5d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xb9, 0xb1, 0xe7, 0x5d, 0x4e, 0xbc, 0xee, 0xbb, 0x40, 0x81, 0x77, 0x82, 0x19, 0xab, 0xb5, 0xc6, 0xee, 0xab, 0x5b, 0x6b, 0x63, 0x92, 0x8a, 0x34, 0x8d, 0xcd, 0xee, 0x4f, 0x49, 0xe5, 0xc9, 0x7e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x21, 0xac, 0x8b, 0x22, 0xcd, 0xc3, 0x9a, 0xe9, 0x5e, 0x78, 0xbd, 0xde, 0xba, 0xad, 0xab, 0xbf, 0x75, 0x41, 0x09, 0xc5, 0x58, 0xa4, 0x7d, 0x92, 0xb0, 0x7f, 0xf2, 0xa1, 0xd1, 0xc0, 0xb3, 0x6d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x62, 0x4f, 0xd0, 0x75, 0x77, 0xba, 0x76, 0x77, 0xd7, 0xb8, 0xd8, 0x92, 0x6f, 0x98, 0x34, 0x3d, 0xd6, 0x4e, 0x1c, 0x0f, 0xf0, 0x8f, 0x2e, 0xf1, 0xb3, 0xbd, 0xb1, 0xb9, 0xec, 0x99, 0xb4, 0x07}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x60, 0x57, 0x2e, 0x9a, 0x72, 0x1d, 0x6b, 0x6e, 0x58, 0x33, 0x24, 0x8c, 0x48, 0x39, 0x46, 0x8e, 0x89, 0x6a, 0x88, 0x51, 0x23, 0x62, 0xb5, 0x32, 0x09, 0x36, 0xe3, 0x57, 0xf5, 0x98, 0xde, 0x6f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8b, 0x2c, 0x00, 0x48, 0x4a, 0xf9, 0x5b, 0x87, 0x69, 0x52, 0xe5, 0x5b, 0xd1, 0xb1, 0xe5, 0x25, 0x25, 0xe0, 0x9c, 0xc2, 0x13, 0x44, 0xe8, 0xb9, 0x0a, 0x70, 0xad, 0xbd, 0x0f, 0x51, 0x94, 0x69}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xa2, 0xdc, 0xab, 0xa9, 0x25, 0x2d, 0xac, 0x5f, 0x03, 0x33, 0x08, 0xe7, 0x7e, 0xfe, 0x95, 0x36, 0x3c, 0x5b, 0x3a, 0xd3, 0x05, 0x82, 0x1c, 0x95, 0x2d, 0xd8, 0x77, 0x7e, 0x02, 0xd9, 0x5b, 0x70}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc2, 0xfe, 0x1b, 0x0c, 0x67, 0xcd, 0xd6, 0xe0, 0x51, 0x8e, 0x2c, 0xe0, 0x79, 0x88, 0xf0, 0xcf, 0x41, 0x4a, 0xad, 0x23, 0xd4, 0x46, 0xca, 0x94, 0xa1, 0xc3, 0xeb, 0x28, 0x06, 0xfa, 0x17, 0x14}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x7b, 0xaa, 0x70, 0x0a, 0x4b, 0xfb, 0xf5, 0xbf, 0x80, 0xc5, 0xcf, 0x08, 0x7a, 0xdd, 0xa1, 0xf4, 0x9d, 0x54, 0x50, 0x53, 0x23, 0x77, 0x23, 0xf5, 0x34, 0xa5, 0x22, 0xd1, 0x0d, 0x96, 0x2e, 0x47}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xcc, 0xb7, 0x32, 0x89, 0x57, 0xd0, 0x98, 0x75, 0xe4, 0x37, 0x99, 0xa9, 0xe8, 0xba, 0xed, 0xba, 0xeb, 0xc7, 0x4f, 0x15, 0x76, 0x07, 0x0c, 0x4c, 0xef, 0x9f, 0x52, 0xfc, 0x04, 0x5d, 0x58, 0x10}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xce, 0x82, 0xf0, 0x8f, 0x79, 0x02, 0xa8, 0xd1, 0xda, 0x14, 0x09, 0x48, 0xee, 0x8a, 0x40, 0x98, 0x76, 0x60, 0x54, 0x5a, 0xde, 0x03, 0x24, 0xf5, 0xe6, 0x2f, 0xe1, 0x03, 0xbf, 0x68, 0x82, 0x7f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x64, 0xe9, 0x28, 0xc7, 0xa4, 0xcf, 0x2a, 0xf9, 0x90, 0x64, 0x72, 0x2c, 0x8b, 0xeb, 0xec, 0xa0, 0xf2, 0x7d, 0x35, 0xb5, 0x90, 0x4d, 0x7f, 0x5b, 0x4a, 0x49, 0xe4, 0xb8, 0x3b, 0xc8, 0xa1, 0x2f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x8b, 0xc5, 0xcc, 0x3d, 0x69, 0xa6, 0xa1, 0x18, 0x44, 0xbc, 0x4d, 0x77, 0x37, 0xc7, 0x86, 0xec, 0x0c, 0xc9, 0xd6, 0x44, 0xa9, 0x23, 0x27, 0xb9, 0x03, 0x34, 0xa7, 0x0a, 0xd5, 0xc7, 0x34, 0x37}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf9, 0x7e, 0x3e, 0x66, 0xee, 0xf9, 0x99, 0x28, 0xff, 0xad, 0x11, 0xd8, 0xe2, 0x66, 0xc5, 0xcd, 0x0f, 0x0d, 0x0b, 0x6a, 0xfc, 0x7c, 0x24, 0xa8, 0x4f, 0xa8, 0x5e, 0x80, 0x45, 0x8b, 0x6c, 0x41}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xef, 0x1e, 0xec, 0xf7, 0x8d, 0x77, 0xf2, 0xea, 0xdb, 0x60, 0x03, 0x21, 0xc0, 0xff, 0x5e, 0x67, 0xc3, 0x71, 0x0b, 0x21, 0xb4, 0x41, 0xa0, 0x68, 0x38, 0xc6, 0x01, 0xa3, 0xd3, 0x51, 0x3c, 0x3c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x92, 0xf8, 0xd6, 0x4b, 0xef, 0x42, 0x13, 0xb2, 0x4a, 0xc4, 0x2e, 0x72, 0x3f, 0xc9, 0x11, 0xbd, 0x74, 0x02, 0x0e, 0xf5, 0x13, 0x9d, 0x83, 0x1a, 0x1b, 0xd5, 0x54, 0xde, 0xc4, 0x1e, 0x16, 0x6c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x27, 0x52, 0xe4, 0x63, 0xaa, 0x94, 0xe6, 0xc3, 0x28, 0x9c, 0xc6, 0x56, 0xac, 0xfa, 0xb6, 0xbd, 0xe2, 0xcc, 0x76, 0xc6, 0x27, 0x27, 0xa2, 0x8e, 0x78, 0x2b, 0x84, 0x72, 0x10, 0xbd, 0x4e, 0x2a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xea, 0xa7, 0x23, 0xef, 0x04, 0x61, 0x80, 0x50, 0xc9, 0x6e, 0xa5, 0x96, 0xd1, 0xd1, 0xc8, 0xc3, 0x18, 0xd7, 0x2d, 0xfd, 0x26, 0xbd, 0xcb, 0x7b, 0x92, 0x51, 0x0e, 0x4a, 0x65, 0x57, 0xb8, 0x49}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xab, 0x55, 0x36, 0xc3, 0xec, 0x63, 0x55, 0x11, 0x55, 0xf6, 0xa5, 0xc7, 0x01, 0x5f, 0xfe, 0x79, 0xd8, 0x0a, 0xf7, 0x03, 0xd8, 0x98, 0x99, 0xf5, 0xd0, 0x00, 0x54, 0x6b, 0x66, 0x28, 0xf5, 0x25}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x7a, 0x8d, 0xa1, 0x5d, 0x70, 0x5d, 0x51, 0x27, 0xee, 0x30, 0x65, 0x56, 0x95, 0x46, 0xde, 0xbd, 0x03, 0x75, 0xb4, 0x57, 0x59, 0x89, 0xeb, 0x02, 0x9e, 0xcc, 0x89, 0x19, 0xa7, 0xcb, 0x17, 0x67}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x6a, 0xeb, 0xfc, 0x9a, 0x9a, 0x10, 0xce, 0xdb, 0x3a, 0x1c, 0x3c, 0x6a, 0x9d, 0xea, 0x46, 0xbc, 0x45, 0x49, 0xac, 0xe3, 0x41, 0x12, 0x7c, 0xf0, 0xf7, 0x4f, 0xf9, 0xf7, 0xff, 0x2c, 0x89, 0x04}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x30, 0x31, 0x54, 0x1a, 0x46, 0xca, 0xe6, 0xc6, 0xcb, 0xe2, 0xc3, 0xc1, 0x8b, 0x75, 0x81, 0xbe, 0xee, 0xf8, 0xa3, 0x11, 0x1c, 0x25, 0xa3, 0xa7, 0x35, 0x51, 0x55, 0xe2, 0x25, 0xaa, 0xe2, 0x3a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xb4, 0x48, 0x10, 0x9f, 0x8a, 0x09, 0x76, 0xfa, 0xf0, 0x7a, 0xb0, 0x70, 0xf7, 0x83, 0x80, 0x52, 0x84, 0x2b, 0x26, 0xa2, 0xc4, 0x5d, 0x4f, 0xba, 0xb1, 0xc8, 0x40, 0x0d, 0x78, 0x97, 0xc4, 0x60}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xd4, 0xb1, 0x6c, 0x08, 0xc7, 0x40, 0x38, 0x73, 0x5f, 0x0b, 0xf3, 0x76, 0x5d, 0xb2, 0xa5, 0x2f, 0x57, 0x57, 0x07, 0xed, 0x08, 0xa2, 0x6c, 0x4f, 0x08, 0x02, 0xb5, 0x0e, 0xee, 0x44, 0xfa, 0x22}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x0f, 0x00, 0x3f, 0xa6, 0x04, 0x19, 0x56, 0x65, 0x31, 0x7f, 0x8b, 0xeb, 0x0d, 0xe1, 0x47, 0x89, 0x97, 0x16, 0x53, 0xfa, 0x81, 0xa7, 0xaa, 0xb2, 0xbf, 0x67, 0xeb, 0x72, 0x60, 0x81, 0x0d, 0x48}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x7e, 0x13, 0x33, 0xcd, 0xa8, 0x84, 0x56, 0x1e, 0x67, 0xaf, 0x6b, 0x43, 0xac, 0x17, 0xaf, 0x16, 0xc0, 0x52, 0x99, 0x49, 0x5b, 0x87, 0x73, 0x7e, 0xb5, 0x43, 0xda, 0x6b, 0x1d, 0x0f, 0x2d, 0x55}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe9, 0x58, 0x1f, 0xff, 0x84, 0x3f, 0x93, 0x1c, 0xcb, 0xe1, 0x30, 0x69, 0xa5, 0x75, 0x19, 0x7e, 0x14, 0x5f, 0xf8, 0xfc, 0x09, 0xdd, 0xa8, 0x78, 0x9d, 0xca, 0x59, 0x8b, 0xd1, 0x30, 0x01, 0x13}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xff, 0x76, 0x03, 0xc5, 0x4b, 0x89, 0x99, 0x70, 0x00, 0x59, 0x70, 0x9c, 0xd5, 0xd9, 0x11, 0x89, 0x5a, 0x46, 0xfe, 0xef, 0xdc, 0xd9, 0x55, 0x2b, 0x45, 0xa7, 0xb0, 0x2d, 0xfb, 0x24, 0xc2, 0x29}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x38, 0x06, 0xf8, 0x0b, 0xac, 0x82, 0xc4, 0x97, 0x2b, 0x90, 0xe0, 0xf7, 0xa8, 0xab, 0x6c, 0x08, 0x80, 0x66, 0x90, 0x46, 0xf7, 0x26, 0x2d, 0xf8, 0xf1, 0xc4, 0x6b, 0x4a, 0x82, 0x98, 0x8e, 0x37}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8e, 0xb4, 0xee, 0xb8, 0xd4, 0x3f, 0xb2, 0x1b, 0xe0, 0x0a, 0x3d, 0x75, 0x34, 0x28, 0xa2, 0x8e, 0xc4, 0x92, 0x7b, 0xfe, 0x60, 0x6e, 0x6d, 0xb8, 0x31, 0x1d, 0x62, 0x0d, 0x78, 0x14, 0x42, 0x11}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x5e, 0xa8, 0xd8, 0x04, 0x9b, 0x73, 0xc9, 0xc9, 0xdc, 0x0d, 0x73, 0xbf, 0x0a, 0x0a, 0x73, 0xff, 0x18, 0x1f, 0x9c, 0x51, 0xaa, 0xc6, 0xf1, 0x83, 0x25, 0xfd, 0xab, 0xa3, 0x11, 0xd3, 0x01, 0x24}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x4d, 0xe3, 0x7e, 0x38, 0x62, 0x5e, 0x64, 0xbb, 0x2b, 0x53, 0xb5, 0x03, 0x68, 0xc4, 0xf2, 0x2b, 0x5a, 0x03, 0x32, 0x99, 0x4a, 0x41, 0x9a, 0xe1, 0x1a, 0xae, 0x8c, 0x48, 0xf3, 0x24, 0x32, 0x65}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe8, 0xdd, 0xad, 0x3a, 0x8c, 0xea, 0xf4, 0xb3, 0xb2, 0xe5, 0x73, 0xf2, 0xed, 0x8b, 0xbf, 0xed, 0xb1, 0x0c, 0x0c, 0xfb, 0x2b, 0xf1, 0x01, 0x48, 0xe8, 0x26, 0x03, 0x8e, 0x27, 0x4d, 0x96, 0x72}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc8, 0x09, 0x3b, 0x60, 0xc9, 0x26, 0x4d, 0x7c, 0xf2, 0x9c, 0xd4, 0xa1, 0x3b, 0x26, 0xc2, 0x04, 0x33, 0x44, 0x76, 0x3c, 0x02, 0xbb, 0x11, 0x42, 0x0c, 0x22, 0xb7, 0xc6, 0xe1, 0xac, 0xb4, 0x0e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x6f, 0x85, 0xe7, 0xef, 0xde, 0x67, 0x30, 0xfc, 0xbf, 0x5a, 0xe0, 0x7b, 0x7a, 0x2a, 0x54, 0x6b, 0x5d, 0x62, 0x85, 0xa1, 0xf8, 0x16, 0x88, 0xec, 0x61, 0xb9, 0x96, 0xb5, 0xef, 0x2d, 0x43, 0x4d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x7c, 0x31, 0x33, 0xcc, 0xe4, 0xcf, 0x6c, 0xff, 0x80, 0x47, 0x77, 0xd1, 0xd8, 0xe9, 0x69, 0x97, 0x98, 0x7f, 0x20, 0x57, 0x1d, 0x1d, 0x4f, 0x08, 0x27, 0xc8, 0x35, 0x57, 0x40, 0xc6, 0x21, 0x0c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd2, 0x8e, 0x9b, 0xfa, 0x42, 0x8e, 0xdf, 0x8f, 0xc7, 0x86, 0xf9, 0xa4, 0xca, 0x70, 0x00, 0x9d, 0x21, 0xbf, 0xec, 0x57, 0x62, 0x30, 0x58, 0x8c, 0x0d, 0x35, 0xdb, 0x5d, 0x8b, 0x6a, 0xa0, 0x5a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc1, 0x58, 0x7c, 0x0d, 0x20, 0xdd, 0x11, 0x26, 0x5f, 0x89, 0x3b, 0x97, 0x58, 0xf8, 0x8b, 0xe3, 0xdf, 0x32, 0xe2, 0xfc, 0xd8, 0x67, 0xf2, 0xa5, 0x37, 0x1e, 0x6d, 0xec, 0x7c, 0x27, 0x20, 0x79}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd0, 0xe9, 0xc0, 0xfa, 0x95, 0x45, 0x23, 0x96, 0xf1, 0x2c, 0x79, 0x25, 0x14, 0xce, 0x40, 0x14, 0x44, 0x2c, 0x36, 0x50, 0xd9, 0x63, 0x56, 0xb7, 0x56, 0x3b, 0x9e, 0xa7, 0xef, 0x89, 0xbb, 0x0e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xce, 0x7f, 0xdc, 0x0a, 0xcc, 0x82, 0x1c, 0x0a, 0x78, 0x71, 0xe8, 0x74, 0x8d, 0x01, 0x30, 0x0f, 0xa7, 0x11, 0x4c, 0xdf, 0x38, 0xd7, 0xa7, 0x0d, 0xf8, 0x48, 0x52, 0x00, 0x80, 0x7b, 0x5f, 0x0e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x25, 0x83, 0xe6, 0x94, 0x7b, 0x81, 0xb2, 0x91, 0xae, 0x0e, 0x05, 0xc9, 0xa3, 0x68, 0x2d, 0xd9, 0x88, 0x25, 0x19, 0x2a, 0x61, 0x61, 0x21, 0x97, 0x15, 0xa1, 0x35, 0xa5, 0x46, 0xc8, 0xa2, 0x0e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x1b, 0x03, 0x0d, 0x8b, 0x5a, 0x1b, 0x97, 0x4b, 0xf2, 0x16, 0x31, 0x3d, 0x1f, 0x33, 0xa0, 0x50, 0x3a, 0x18, 0xbe, 0x13, 0xa1, 0x76, 0xc1, 0xba, 0x1b, 0xf1, 0x05, 0x7b, 0x33, 0xa8, 0x82, 0x3b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xba, 0x36, 0x7b, 0x6d, 0xa9, 0xea, 0x14, 0x12, 0xc5, 0xfa, 0x91, 0x00, 0xba, 0x9b, 0x99, 0xcc, 0x56, 0x02, 0xe9, 0xa0, 0x26, 0x40, 0x66, 0x8c, 0xc4, 0xf8, 0x85, 0x33, 0x68, 0xe7, 0x03, 0x20}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x50, 0x5b, 0xff, 0xa9, 0xb2, 0xf1, 0xf1, 0x78, 0xcf, 0x14, 0xa4, 0xa9, 0xfc, 0x09, 0x46, 0x94, 0x54, 0x65, 0x0d, 0x9c, 0x5f, 0x72, 0x21, 0xe2, 0x97, 0xa5, 0x2d, 0x81, 0xce, 0x4a, 0x5f, 0x79}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x3d, 0x5f, 0x5c, 0xd2, 0xbc, 0x7d, 0x77, 0x0e, 0x2a, 0x6d, 0x22, 0x45, 0x84, 0x06, 0xc4, 0xdd, 0xc6, 0xa6, 0xc6, 0xd7, 0x49, 0xad, 0x6d, 0x87, 0x91, 0x0e, 0x3a, 0x67, 0x1d, 0x2c, 0x1d, 0x56}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xfe, 0x7a, 0x74, 0xcf, 0xd4, 0xd2, 0xe5, 0x19, 0xde, 0xd0, 0xdb, 0x70, 0x23, 0x69, 0xe6, 0x6d, 0xec, 0xec, 0xcc, 0x09, 0x33, 0x6a, 0x77, 0xdc, 0x6b, 0x22, 0x76, 0x5d, 0x92, 0x09, 0xac, 0x2d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x23, 0x15, 0x17, 0xeb, 0xd3, 0xdb, 0x12, 0x5e, 0x01, 0xf0, 0x91, 0xab, 0x2c, 0x41, 0xce, 0xac, 0xed, 0x1b, 0x4b, 0x2d, 0xbc, 0xdb, 0x17, 0x66, 0x89, 0x46, 0xad, 0x4b, 0x1e, 0x6f, 0x0b, 0x14}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x11, 0xce, 0xbf, 0xb6, 0x77, 0x2d, 0x48, 0x22, 0x18, 0x4f, 0xa3, 0x5d, 0x4a, 0xb0, 0x70, 0x12, 0x3e, 0x54, 0xd7, 0xd8, 0x0e, 0x2b, 0x27, 0xdc, 0x53, 0xff, 0xca, 0x8c, 0x59, 0xb3, 0x4e, 0x44}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x07, 0x76, 0x61, 0x0f, 0x66, 0xb2, 0x21, 0x39, 0x7e, 0xc0, 0xec, 0x45, 0x28, 0x82, 0xa1, 0x29, 0x32, 0x44, 0x35, 0x13, 0x5e, 0x61, 0x5e, 0x54, 0xcb, 0x7c, 0xef, 0xf6, 0x41, 0xcf, 0x9f, 0x0a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xdd, 0xf9, 0xda, 0x84, 0xc3, 0xe6, 0x8a, 0x9f, 0x24, 0xd2, 0x96, 0x5d, 0x39, 0x6f, 0x58, 0x8c, 0xc1, 0x56, 0x93, 0xab, 0xb5, 0x79, 0x3b, 0xd2, 0xa8, 0x73, 0x16, 0xed, 0xfa, 0xb4, 0x2f, 0x73}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x8b, 0xb1, 0x95, 0xe5, 0x92, 0x50, 0x35, 0x11, 0x76, 0xac, 0xf4, 0x4d, 0x24, 0xc3, 0x32, 0xe6, 0xeb, 0xfe, 0x2c, 0x87, 0xc4, 0xf1, 0x56, 0xc4, 0x75, 0x24, 0x7a, 0x56, 0x85, 0x5a, 0x3a, 0x13}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x0d, 0x16, 0xac, 0x3c, 0x4a, 0x58, 0x86, 0x3a, 0x46, 0x7f, 0x6c, 0xa3, 0x52, 0x6e, 0x37, 0xe4, 0x96, 0x9c, 0xe9, 0x5c, 0x66, 0x41, 0x67, 0xe4, 0xfb, 0x79, 0x0c, 0x05, 0xf6, 0x64, 0xd5, 0x7c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x28, 0xc1, 0xe1, 0x54, 0x73, 0xf2, 0xbf, 0x76, 0x74, 0x19, 0x19, 0x1b, 0xe4, 0xb9, 0xa8, 0x46, 0x65, 0x73, 0xf3, 0x77, 0x9b, 0x29, 0x74, 0x5b, 0xc6, 0x89, 0x6c, 0x2c, 0x7c, 0xf8, 0xb3, 0x0f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf7, 0xd5, 0xe9, 0x74, 0x5d, 0xb8, 0x25, 0x16, 0xb5, 0x30, 0xbc, 0x84, 0xc5, 0xf0, 0xad, 0xca, 0x12, 0x28, 0xbc, 0x9d, 0xd4, 0xfa, 0x82, 0xe6, 0xe3, 0xbf, 0xa2, 0x15, 0x2c, 0xd4, 0x34, 0x10}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x61, 0xb1, 0x46, 0xba, 0x0e, 0x31, 0xa5, 0x67, 0x6c, 0x7f, 0xd6, 0xd9, 0x27, 0x85, 0x0f, 0x79, 0x14, 0xc8, 0x6c, 0x2f, 0x5f, 0x5b, 0x9c, 0x35, 0x3d, 0x38, 0x86, 0x77, 0x65, 0x55, 0x6a, 0x7b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xd3, 0xb0, 0x3a, 0x66, 0x60, 0x1b, 0x43, 0xf1, 0x26, 0x58, 0x99, 0x09, 0x8f, 0x2d, 0xa3, 0x14, 0x71, 0x85, 0xdb, 0xed, 0xf6, 0x26, 0xd5, 0x61, 0x9a, 0x73, 0xac, 0x0e, 0xea, 0xac, 0xb7, 0x0c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x5e, 0xf4, 0xe5, 0x17, 0x0e, 0x10, 0x9f, 0xe7, 0x43, 0x5f, 0x67, 0x5c, 0xac, 0x4b, 0xe5, 0x14, 0x41, 0xd2, 0xbf, 0x48, 0xf5, 0x14, 0xb0, 0x71, 0xc6, 0x61, 0xc1, 0xb2, 0x70, 0x58, 0xd2, 0x5a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x2d, 0xba, 0x16, 0x07, 0x92, 0x94, 0xdc, 0xbd, 0x50, 0x2b, 0xc9, 0x7f, 0x42, 0x00, 0xba, 0x61, 0xed, 0xf8, 0x43, 0xed, 0xf5, 0xf9, 0x40, 0x60, 0xb2, 0xb0, 0x82, 0xcb, 0xed, 0x75, 0xc7, 0x65}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x80, 0xba, 0x0d, 0x09, 0x40, 0xa7, 0x39, 0xa6, 0x67, 0x34, 0x7e, 0x66, 0xbe, 0x56, 0xfb, 0x53, 0x78, 0xc4, 0x46, 0xe8, 0xed, 0x68, 0x6c, 0x7f, 0xce, 0xe8, 0x9f, 0xce, 0xa2, 0x64, 0x58, 0x53}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe8, 0xc1, 0xa9, 0xc2, 0x7b, 0x59, 0x21, 0x33, 0xe2, 0x43, 0x73, 0x2b, 0xac, 0x2d, 0xc1, 0x89, 0x3b, 0x15, 0xe2, 0xd5, 0xc0, 0x97, 0x8a, 0xfd, 0x6f, 0x36, 0x33, 0xb7, 0xb9, 0xc3, 0x88, 0x09}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd0, 0xb6, 0x56, 0x30, 0x5c, 0xae, 0xb3, 0x75, 0x44, 0xa4, 0x83, 0x51, 0x6e, 0x01, 0x65, 0xef, 0x45, 0x76, 0xe6, 0xf5, 0xa2, 0x0d, 0xd4, 0x16, 0x3b, 0x58, 0x2f, 0xf2, 0x2f, 0x36, 0x18, 0x3f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xfd, 0x2f, 0xe0, 0x9b, 0x1e, 0x8c, 0xc5, 0x18, 0xa9, 0xca, 0xd4, 0x2b, 0x35, 0xb6, 0x95, 0x0a, 0x9f, 0x7e, 0xfb, 0xc4, 0xef, 0x88, 0x7b, 0x23, 0x43, 0xec, 0x2f, 0x0d, 0x0f, 0x7a, 0xfc, 0x5c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x8d, 0xd2, 0xda, 0xc7, 0x44, 0xd6, 0x7a, 0xdb, 0x26, 0x7d, 0x1d, 0xb8, 0xe1, 0xde, 0x9d, 0x7a, 0x7d, 0x17, 0x7e, 0x1c, 0x37, 0x04, 0x8d, 0x2d, 0x7c, 0x5e, 0x18, 0x38, 0x1e, 0xaf, 0xc7, 0x1b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x33, 0x48, 0x31, 0x00, 0x59, 0xf6, 0xf2, 0xca, 0x0f, 0x27, 0x1b, 0x63, 0x12, 0x7e, 0x02, 0x1d, 0x49, 0xc0, 0x5d, 0x79, 0x87, 0xef, 0x5e, 0x7a, 0x2f, 0x1f, 0x66, 0x55, 0xd8, 0x09, 0xd9, 0x61}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x54, 0x83, 0x02, 0x18, 0x82, 0x93, 0x99, 0x07, 0xd0, 0xa7, 0xda, 0xd8, 0x75, 0x89, 0xfa, 0xf2, 0xd9, 0xa3, 0xb8, 0x6b, 0x5a, 0x35, 0x28, 0xd2, 0x6b, 0x59, 0xc2, 0xf8, 0x45, 0xe2, 0xbc, 0x06}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x65, 0xc0, 0xa3, 0x88, 0x51, 0x95, 0xfc, 0x96, 0x94, 0x78, 0xe8, 0x0d, 0x8b, 0x41, 0xc9, 0xc2, 0x58, 0x48, 0x75, 0x10, 0x2f, 0xcd, 0x2a, 0xc9, 0xa0, 0x6d, 0x0f, 0xdd, 0x9c, 0x98, 0x26, 0x3d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x2f, 0x66, 0x29, 0x1b, 0x04, 0x89, 0xbd, 0x7e, 0xee, 0x6e, 0xdd, 0xb7, 0x0e, 0xef, 0xb0, 0x0c, 0xb4, 0xfc, 0x7f, 0xc2, 0xc9, 0x3a, 0x3c, 0x64, 0xef, 0x45, 0x44, 0xaf, 0x8a, 0x90, 0x65, 0x76}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xa1, 0x4c, 0x70, 0x4b, 0x0e, 0xa0, 0x83, 0x70, 0x13, 0xa4, 0xaf, 0xb8, 0x38, 0x19, 0x22, 0x65, 0x09, 0xb4, 0x02, 0x4f, 0x06, 0xf8, 0x17, 0xce, 0x46, 0x45, 0xda, 0x50, 0x7c, 0x8a, 0xd1, 0x4e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xf7, 0xd4, 0x16, 0x6c, 0x4e, 0x95, 0x9d, 0x5d, 0x0f, 0x91, 0x2b, 0x52, 0xfe, 0x5c, 0x34, 0xe5, 0x30, 0xe6, 0xa4, 0x3b, 0xf3, 0xf3, 0x34, 0x08, 0xa9, 0x4a, 0xa0, 0xb5, 0x6e, 0xb3, 0x09, 0x0a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x26, 0xd9, 0x5e, 0xa3, 0x0f, 0xeb, 0xa2, 0xf3, 0x20, 0x3b, 0x37, 0xd4, 0xe4, 0x9e, 0xce, 0x06, 0x3d, 0x53, 0xed, 0xae, 0x2b, 0xeb, 0xb6, 0x24, 0x0a, 0x11, 0xa3, 0x0f, 0xd6, 0x7f, 0xa4, 0x3a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xdb, 0x9f, 0x2c, 0xfc, 0xd6, 0xb2, 0x1e, 0x2e, 0x52, 0x7a, 0x06, 0x87, 0x2d, 0x86, 0x72, 0x2b, 0x6d, 0x90, 0x77, 0x46, 0x43, 0xb5, 0x7a, 0xf8, 0x60, 0x7d, 0x91, 0x60, 0x5b, 0x9d, 0x9e, 0x07}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x97, 0x87, 0xc7, 0x04, 0x1c, 0x38, 0x01, 0x39, 0x58, 0xc7, 0x85, 0xa3, 0xfc, 0x64, 0x00, 0x64, 0x25, 0xa2, 0xbf, 0x50, 0x94, 0xca, 0x26, 0x31, 0x45, 0x0a, 0x24, 0xd2, 0x51, 0x29, 0x51, 0x16}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x4d, 0x4a, 0xd7, 0x98, 0x71, 0x57, 0xac, 0x7d, 0x8b, 0x37, 0xbd, 0x63, 0xff, 0x87, 0xb1, 0x49, 0x95, 0x20, 0x7c, 0xcf, 0x7c, 0x59, 0xc4, 0x91, 0x9c, 0xef, 0xd0, 0xdb, 0x60, 0x09, 0x9d, 0x46}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xcb, 0x78, 0x94, 0x90, 0xe4, 0x45, 0xb3, 0xf6, 0xd9, 0xf6, 0x57, 0x74, 0xd5, 0xf8, 0x83, 0x4f, 0x39, 0xc9, 0xbd, 0x88, 0xc2, 0x57, 0x21, 0x1f, 0x24, 0x32, 0x68, 0xf8, 0xc7, 0x21, 0x5f, 0x0b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x2a, 0x36, 0x68, 0xfc, 0x5f, 0xb6, 0x4f, 0xa5, 0xe3, 0x9d, 0x24, 0x2f, 0xc0, 0x93, 0x61, 0xcf, 0xf8, 0x0a, 0xed, 0xe1, 0xdb, 0x27, 0xec, 0x0e, 0x14, 0x32, 0x5f, 0x8e, 0xa1, 0x62, 0x41, 0x16}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x95, 0x21, 0x01, 0xce, 0x95, 0x5b, 0x0e, 0x57, 0xc7, 0xb9, 0x62, 0xb5, 0x28, 0xca, 0x11, 0xec, 0xb4, 0x46, 0x06, 0x73, 0x26, 0xff, 0xfb, 0x66, 0x7d, 0xee, 0x5f, 0xb2, 0x56, 0xfd, 0x2a, 0x08}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x92, 0x67, 0x77, 0x56, 0xa1, 0xff, 0xc4, 0xc5, 0x95, 0xf0, 0xe3, 0x3a, 0x0a, 0xca, 0x94, 0x4d, 0x9e, 0x7e, 0x3d, 0xb9, 0x6e, 0xb6, 0xb0, 0xce, 0xa4, 0x30, 0x89, 0x99, 0xe9, 0xad, 0x11, 0x59}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf6, 0x48, 0x95, 0xa1, 0x6f, 0x5f, 0xb7, 0xa5, 0xbb, 0x30, 0x00, 0x1c, 0xd2, 0x8a, 0xd6, 0x25, 0x26, 0x1b, 0xb2, 0x0d, 0x37, 0x6a, 0x05, 0xf4, 0x9d, 0x3e, 0x17, 0x2a, 0x43, 0xd2, 0x3a, 0x06}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x32, 0x99, 0x93, 0xd1, 0x9a, 0x72, 0xf3, 0xa9, 0x16, 0xbd, 0xb4, 0x4c, 0xdd, 0xf9, 0xd4, 0xb2, 0x64, 0x9a, 0xd3, 0x05, 0xe4, 0xa3, 0x73, 0x1c, 0xcb, 0x7e, 0x57, 0x67, 0xff, 0x04, 0xb3, 0x10}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xb9, 0x4b, 0xa4, 0xad, 0xd0, 0x6d, 0x61, 0x23, 0xb4, 0xaf, 0x34, 0xa9, 0xaa, 0x65, 0xec, 0xd9, 0x69, 0xe3, 0x85, 0xcd, 0xcc, 0xe7, 0xb0, 0x9b, 0x41, 0xc1, 0x1c, 0xf9, 0xa0, 0xfa, 0xb7, 0x13}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x04, 0xfd, 0x88, 0x3c, 0x0c, 0xd0, 0x09, 0x52, 0x51, 0x4f, 0x06, 0x19, 0xcc, 0xc3, 0xbb, 0xde, 0x80, 0xc5, 0x33, 0xbc, 0xf9, 0xf3, 0x17, 0x36, 0xdd, 0xc6, 0xde, 0xe8, 0x9b, 0x5d, 0x79, 0x1b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x65, 0x0a, 0xbe, 0x51, 0x57, 0xad, 0x50, 0x79, 0x08, 0x71, 0x9b, 0x07, 0x95, 0x8f, 0xfb, 0xae, 0x4b, 0x38, 0xba, 0xcf, 0x53, 0x2a, 0x86, 0x1e, 0xc0, 0x50, 0x5c, 0x67, 0x1b, 0xf6, 0x87, 0x6c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x4f, 0x00, 0xb2, 0x66, 0x55, 0xed, 0x4a, 0xed, 0x8d, 0xe1, 0x66, 0x18, 0xb2, 0x14, 0x74, 0x8d, 0xfd, 0x1a, 0x36, 0x0f, 0x26, 0x5c, 0x8b, 0x89, 0xf3, 0xab, 0xf2, 0xf3, 0x24, 0x67, 0xfd, 0x70}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xfd, 0x4e, 0x2a, 0xc1, 0x3a, 0xca, 0x8f, 0x00, 0xd8, 0xec, 0x74, 0x67, 0xef, 0x61, 0xe0, 0x28, 0xd0, 0x96, 0xf4, 0x48, 0xde, 0x81, 0xe3, 0xef, 0xdc, 0xaa, 0x7d, 0xf3, 0xb6, 0x55, 0xa6, 0x65}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xeb, 0xcb, 0xc5, 0x70, 0x91, 0x31, 0x10, 0x93, 0x0d, 0xc8, 0xd0, 0xef, 0x62, 0xe8, 0x6f, 0x82, 0xe3, 0x69, 0x3d, 0x91, 0x7f, 0x31, 0xe1, 0x26, 0x35, 0x3c, 0x4a, 0x2f, 0xab, 0xc4, 0x9a, 0x5e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xab, 0x1b, 0xb5, 0xe5, 0x2b, 0xc3, 0x0e, 0x29, 0xb0, 0xd0, 0x73, 0xe6, 0x4f, 0x64, 0xf2, 0xbc, 0xe4, 0xe4, 0xe1, 0x9a, 0x52, 0x33, 0x2f, 0xbd, 0xcc, 0x03, 0xee, 0x8a, 0xfa, 0x00, 0x5f, 0x50}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xf6, 0xdb, 0x0d, 0x22, 0x3d, 0xb5, 0x14, 0x75, 0x31, 0xf0, 0x81, 0xe2, 0xb9, 0x37, 0xa2, 0xa9, 0x84, 0x11, 0x9a, 0x07, 0xb5, 0x53, 0x89, 0x78, 0xa9, 0x30, 0x27, 0xa1, 0xf1, 0x4e, 0x5c, 0x2e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8b, 0x00, 0x54, 0xfb, 0x4d, 0xdc, 0xcb, 0x17, 0x35, 0x40, 0xff, 0xb7, 0x8c, 0xfe, 0x4a, 0xe4, 0x4e, 0x99, 0x4e, 0xa8, 0x74, 0x54, 0x5d, 0x5c, 0x96, 0xa3, 0x12, 0x55, 0x36, 0x31, 0x17, 0x5c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xce, 0x24, 0xef, 0x7b, 0x86, 0xf2, 0x0f, 0x77, 0xe8, 0x5c, 0x7d, 0x87, 0x38, 0x2d, 0xef, 0xaf, 0xf2, 0x8c, 0x72, 0x2e, 0xeb, 0xb6, 0x55, 0x4b, 0x6e, 0xf1, 0x4e, 0x8a, 0x0e, 0x9a, 0x6c, 0x4c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x25, 0xea, 0x86, 0xc2, 0xd1, 0x4f, 0xb7, 0x3e, 0xa8, 0x5c, 0x8d, 0x66, 0x81, 0x25, 0xed, 0xc5, 0x4c, 0x05, 0xb9, 0xd8, 0xd6, 0x70, 0xbe, 0x73, 0x82, 0xe8, 0xa1, 0xe5, 0x1e, 0x71, 0xd5, 0x26}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x4e, 0x6d, 0xc3, 0xa7, 0x4f, 0x22, 0x45, 0x26, 0xa2, 0x7e, 0x16, 0xf7, 0xf7, 0x63, 0xdc, 0x86, 0x01, 0x2a, 0x71, 0x38, 0x5c, 0x33, 0xc3, 0xce, 0x30, 0xff, 0xf9, 0x2c, 0x91, 0x71, 0x8a, 0x72}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8c, 0x44, 0x09, 0x28, 0xd5, 0x23, 0xc9, 0x8f, 0xf3, 0x84, 0x45, 0xc6, 0x9a, 0x5e, 0xff, 0xd2, 0xc7, 0x57, 0x93, 0xa3, 0xc1, 0x69, 0xdd, 0x62, 0x0f, 0xda, 0x5c, 0x30, 0x59, 0x5d, 0xe9, 0x4c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x92, 0x7e, 0x50, 0x27, 0x72, 0xd7, 0x0c, 0xd6, 0x69, 0x96, 0x81, 0x35, 0x84, 0x94, 0x35, 0x8b, 0x6c, 0xaa, 0x62, 0x86, 0x6e, 0x1c, 0x15, 0xf3, 0x6c, 0xb3, 0xff, 0x65, 0x1b, 0xa2, 0x9b, 0x59}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe2, 0xa9, 0x65, 0x88, 0xc4, 0x50, 0xfa, 0xbb, 0x3b, 0x6e, 0x5f, 0x44, 0x01, 0xca, 0x97, 0xd4, 0xdd, 0xf6, 0xcd, 0x3f, 0x3f, 0xe5, 0x97, 0x67, 0x2b, 0x8c, 0x66, 0x0f, 0x35, 0x9b, 0xf5, 0x07}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xf1, 0x59, 0x27, 0xd8, 0xdb, 0x5a, 0x11, 0x5e, 0x82, 0xf3, 0x38, 0xff, 0x1c, 0xed, 0xfe, 0x3f, 0x64, 0x54, 0x3f, 0x7f, 0xd1, 0x81, 0xed, 0xef, 0x65, 0xc5, 0xcb, 0xfd, 0xe1, 0x80, 0xcd, 0x11}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe0, 0xdb, 0x22, 0x28, 0xe6, 0xff, 0x61, 0x9d, 0x41, 0x14, 0x2d, 0x3b, 0x26, 0x22, 0xdf, 0xf1, 0x34, 0x81, 0xe9, 0x45, 0xee, 0x0f, 0x98, 0x8b, 0xa6, 0x3f, 0xef, 0xf7, 0x43, 0x19, 0xf1, 0x43}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xee, 0xf3, 0x00, 0xa1, 0x50, 0xde, 0xc0, 0xb6, 0x01, 0xe3, 0x8c, 0x3c, 0x4d, 0x31, 0xd2, 0xb0, 0x58, 0xcd, 0xed, 0x10, 0x4a, 0x7a, 0xef, 0x80, 0xa9, 0x19, 0x32, 0xf3, 0xd8, 0x33, 0x8c, 0x06}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xcb, 0x7d, 0x4f, 0xff, 0x30, 0xd8, 0x12, 0x3b, 0x39, 0x1c, 0x06, 0xf9, 0x4c, 0x34, 0x35, 0x71, 0xb5, 0x16, 0x94, 0x67, 0xdf, 0xee, 0x11, 0xde, 0xa4, 0x1d, 0x88, 0x93, 0x35, 0xa9, 0x32, 0x10}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe9, 0xc3, 0xbc, 0x7b, 0x5c, 0xfc, 0xb2, 0xf9, 0xc9, 0x2f, 0xe5, 0xba, 0x3a, 0x0b, 0xab, 0x64, 0x38, 0x6f, 0x5b, 0x4b, 0x93, 0xda, 0x64, 0xec, 0x4d, 0x3d, 0xa0, 0xf5, 0xbb, 0xba, 0x47, 0x48}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x60, 0xbc, 0x45, 0x1f, 0x23, 0xa2, 0x3b, 0x70, 0x76, 0xe6, 0x97, 0x99, 0x4f, 0x77, 0x54, 0x67, 0x30, 0x9a, 0xe7, 0x66, 0xd6, 0xcd, 0x2e, 0x51, 0x24, 0x2c, 0x42, 0x4a, 0x11, 0xfe, 0x6f, 0x7e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x87, 0xc0, 0xb1, 0xf0, 0xa3, 0x6f, 0x0c, 0x93, 0xa9, 0x0a, 0x72, 0xef, 0x5c, 0xbe, 0x65, 0x35, 0xa7, 0x6a, 0x4e, 0x2c, 0xbf, 0x21, 0x23, 0xe8, 0x2f, 0x97, 0xc7, 0x3e, 0xc8, 0x17, 0xac, 0x1e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x7b, 0xef, 0x21, 0xe5, 0x40, 0xcc, 0x1e, 0xdc, 0xd6, 0xbd, 0x97, 0x7a, 0x7c, 0x75, 0x86, 0x7a, 0x25, 0x5a, 0x6e, 0x7c, 0xe5, 0x51, 0x3c, 0x1b, 0x5b, 0x82, 0x9a, 0x07, 0x60, 0xa1, 0x19, 0x04}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x96, 0x88, 0xa6, 0xab, 0x8f, 0xe3, 0x3a, 0x49, 0xf8, 0xfe, 0x34, 0xe7, 0x6a, 0xb2, 0xfe, 0x40, 0x26, 0x74, 0x57, 0x4c, 0xf6, 0xd4, 0x99, 0xce, 0x5d, 0x7b, 0x2f, 0x67, 0xd6, 0x5a, 0xe4, 0x4e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x5c, 0x82, 0xb3, 0xbd, 0x55, 0x25, 0xf6, 0x6a, 0x93, 0xa4, 0x02, 0xc6, 0x7d, 0x5c, 0xb1, 0x2b, 0x5b, 0xff, 0xfb, 0x56, 0xf8, 0x01, 0x41, 0x90, 0xc6, 0xb6, 0xac, 0x4f, 0xfe, 0xa7, 0x41, 0x70}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xdb, 0xfa, 0x9b, 0x2c, 0xd4, 0x23, 0x67, 0x2c, 0x8a, 0x63, 0x6c, 0x07, 0x26, 0x48, 0x4f, 0xc2, 0x03, 0xd2, 0x53, 0x20, 0x28, 0xed, 0x65, 0x71, 0x47, 0xa9, 0x16, 0x16, 0x12, 0xbc, 0x28, 0x33}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x39, 0xc0, 0xfa, 0xfa, 0xcd, 0x33, 0x43, 0xc7, 0x97, 0x76, 0x9b, 0x93, 0x91, 0x72, 0xeb, 0xc5, 0x18, 0x67, 0x4c, 0x11, 0xf0, 0xf4, 0xe5, 0x73, 0xb2, 0x5c, 0x1b, 0xc2, 0x26, 0x3f, 0xbf, 0x2b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x86, 0xe6, 0x8c, 0x1d, 0xdf, 0xca, 0xfc, 0xd5, 0xf8, 0x3a, 0xc3, 0x44, 0x72, 0xe6, 0x78, 0x9d, 0x2b, 0x97, 0xf8, 0x28, 0x45, 0xb4, 0x20, 0xc9, 0x2a, 0x8c, 0x67, 0xaa, 0x11, 0xc5, 0x5b, 0x2f}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x17, 0x0f, 0x86, 0x52, 0xd7, 0x9d, 0xc3, 0x44, 0x51, 0x76, 0x32, 0x65, 0xb4, 0x37, 0x81, 0x99, 0x46, 0x37, 0x62, 0xed, 0xcf, 0x64, 0x9d, 0x72, 0x40, 0x7a, 0x4c, 0x0b, 0x76, 0x2a, 0xfb, 0x56}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x33, 0xa7, 0x90, 0x7c, 0xc3, 0x6f, 0x17, 0xa5, 0xa0, 0x67, 0x72, 0x17, 0xea, 0x7e, 0x63, 0x14, 0x83, 0xde, 0xc1, 0x71, 0x2d, 0x41, 0x32, 0x7a, 0xf3, 0xd1, 0x2b, 0xd8, 0x2a, 0xa6, 0x46, 0x36}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xac, 0xcc, 0x6b, 0x7c, 0xf9, 0xb8, 0x8b, 0x08, 0x5c, 0xd0, 0x7d, 0x8f, 0x73, 0xea, 0x20, 0xda, 0x86, 0xca, 0x00, 0xc7, 0xad, 0x73, 0x4d, 0xe9, 0xe8, 0xa9, 0xda, 0x1f, 0x03, 0x06, 0xdd, 0x24}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x9c, 0xb2, 0x61, 0x0a, 0x98, 0x2a, 0xa5, 0xd7, 0xee, 0xa9, 0xac, 0x65, 0xcb, 0x0a, 0x1e, 0xe2, 0xbe, 0xdc, 0x85, 0x59, 0x0f, 0x9c, 0xa6, 0x57, 0x34, 0xa5, 0x87, 0xeb, 0x7b, 0x1e, 0x0c, 0x3c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x2f, 0xbd, 0x84, 0x63, 0x0d, 0xb5, 0xa0, 0xf0, 0x4b, 0x9e, 0x93, 0xc6, 0x34, 0x9a, 0x34, 0xff, 0x73, 0x19, 0x2f, 0x6e, 0x54, 0x45, 0x2c, 0x92, 0x31, 0x76, 0x34, 0xf1, 0xb2, 0x26, 0xe8, 0x74}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x0a, 0x67, 0x90, 0x6d, 0x0c, 0x4c, 0xcc, 0xc0, 0xe6, 0xbd, 0xa7, 0x5e, 0x55, 0x8c, 0xcd, 0x58, 0x9b, 0x11, 0xa2, 0xbb, 0x4b, 0xb1, 0x43, 0x04, 0x3c, 0x55, 0xed, 0x23, 0xfe, 0xcd, 0xb1, 0x53}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x05, 0xfb, 0x75, 0xf5, 0x01, 0xaf, 0x38, 0x72, 0x58, 0xfc, 0x04, 0x29, 0x34, 0x7a, 0x67, 0xa2, 0x08, 0x50, 0x6e, 0xd0, 0x2b, 0x73, 0xd5, 0xb8, 0xe4, 0x30, 0x96, 0xad, 0x45, 0xdf, 0xa6, 0x5c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x0d, 0x88, 0x1a, 0x90, 0x7e, 0xdc, 0xd8, 0xfe, 0xc1, 0x2f, 0x5d, 0x67, 0xee, 0x67, 0x2f, 0xed, 0x6f, 0x55, 0x43, 0x5f, 0x87, 0x14, 0x35, 0x42, 0xd3, 0x75, 0xae, 0xd5, 0xd3, 0x85, 0x1a, 0x76}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x87, 0xc8, 0xa0, 0x6e, 0xe1, 0xb0, 0xad, 0x6a, 0x4a, 0x34, 0x71, 0xed, 0x7c, 0xd6, 0x44, 0x03, 0x65, 0x4a, 0x5c, 0x5c, 0x04, 0xf5, 0x24, 0x3f, 0xb0, 0x16, 0x5e, 0x8c, 0xb2, 0xd2, 0xc5, 0x20}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x98, 0x83, 0xc2, 0x37, 0xa0, 0x41, 0xa8, 0x48, 0x5c, 0x5f, 0xbf, 0xc8, 0xfa, 0x24, 0xe0, 0x59, 0x2c, 0xbd, 0xf6, 0x81, 0x7e, 0x88, 0xe6, 0xca, 0x04, 0xd8, 0x5d, 0x60, 0xbb, 0x74, 0xa7, 0x0b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x21, 0x13, 0x91, 0xbf, 0x77, 0x7a, 0x33, 0xbc, 0xe9, 0x07, 0x39, 0x0a, 0xdd, 0x7d, 0x06, 0x10, 0x9a, 0xee, 0x47, 0x73, 0x1b, 0x15, 0x5a, 0xfb, 0xcd, 0x4d, 0xd0, 0xd2, 0x3a, 0x01, 0xba, 0x54}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x48, 0xd5, 0x39, 0x4a, 0x0b, 0x20, 0x6a, 0x43, 0xa0, 0x07, 0x82, 0x5e, 0x49, 0x7c, 0xc9, 0x47, 0xf1, 0x7c, 0x37, 0xb9, 0x23, 0xef, 0x6b, 0x46, 0x45, 0x8c, 0x45, 0x76, 0xdf, 0x14, 0x6b, 0x6e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x42, 0xc9, 0xca, 0x29, 0x4c, 0x76, 0x37, 0xda, 0x8a, 0x2d, 0x7c, 0x3a, 0x58, 0xf2, 0x03, 0xb4, 0xb5, 0xb9, 0x1a, 0x13, 0x2d, 0xde, 0x5f, 0x6b, 0x9d, 0xba, 0x52, 0xc9, 0x5d, 0xb3, 0xf3, 0x30}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x4c, 0x6f, 0xfe, 0x6b, 0x0c, 0x62, 0xd7, 0x48, 0x71, 0xef, 0xb1, 0x85, 0x79, 0xc0, 0xed, 0x24, 0xb1, 0x08, 0x93, 0x76, 0x8e, 0xf7, 0x38, 0x8e, 0xeb, 0xfe, 0x80, 0x40, 0xaf, 0x90, 0x64, 0x49}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x4a, 0x88, 0xda, 0xc1, 0x98, 0x44, 0x3c, 0x53, 0x4e, 0xdb, 0x4b, 0xb9, 0x12, 0x5f, 0xcd, 0x08, 0x04, 0xef, 0x75, 0xe7, 0xb1, 0x3a, 0xe5, 0x07, 0xfa, 0xca, 0x65, 0x7b, 0x72, 0x10, 0x64, 0x7f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x3d, 0x81, 0xf0, 0xeb, 0x16, 0xfd, 0x58, 0x33, 0x8d, 0x7c, 0x1a, 0xfb, 0x20, 0x2c, 0x8a, 0xee, 0x90, 0xbb, 0x33, 0x6d, 0x45, 0xe9, 0x8e, 0x99, 0x85, 0xe1, 0x08, 0x1f, 0xc5, 0xf1, 0xb5, 0x46}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe4, 0xe7, 0x43, 0x4b, 0xa0, 0x3f, 0x2b, 0x06, 0xba, 0x17, 0xae, 0x3d, 0xe6, 0xce, 0xbd, 0xb8, 0xed, 0x74, 0x11, 0x35, 0xec, 0x96, 0xfe, 0x31, 0xe3, 0x0e, 0x7a, 0x4e, 0xc9, 0x1d, 0xcb, 0x20}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe0, 0x67, 0xe9, 0x7b, 0xdb, 0x96, 0x5c, 0xb0, 0x32, 0xd0, 0x59, 0x31, 0x90, 0xdc, 0x92, 0x97, 0xac, 0x09, 0x38, 0x31, 0x0f, 0x7e, 0xd6, 0x5d, 0xd0, 0x06, 0xb6, 0x1f, 0xea, 0xf0, 0x5b, 0x07}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x81, 0x9f, 0xc7, 0xde, 0x6b, 0x41, 0x22, 0x35, 0x14, 0x67, 0x77, 0x3e, 0x90, 0x81, 0xb0, 0xd9, 0x85, 0x4c, 0xca, 0x9b, 0x3f, 0x04, 0x59, 0xd6, 0xaa, 0x17, 0xc3, 0x88, 0x34, 0x37, 0xba, 0x43}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x4c, 0xb6, 0x69, 0xc8, 0x81, 0x95, 0x94, 0x33, 0x92, 0x34, 0xe9, 0x3c, 0x84, 0x0d, 0x3d, 0x5a, 0x37, 0x9c, 0x22, 0xa0, 0xaa, 0x65, 0xce, 0xb4, 0xc2, 0x2d, 0x66, 0x67, 0x02, 0xff, 0x74, 0x10}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x22, 0xb0, 0xd5, 0xe6, 0xc7, 0xef, 0xb1, 0xa7, 0x13, 0xda, 0x60, 0xb4, 0x80, 0xc1, 0x42, 0x7d, 0x10, 0x70, 0x97, 0x04, 0x4d, 0xda, 0x23, 0x89, 0xc2, 0x0e, 0x68, 0xcb, 0xde, 0xe0, 0x9b, 0x29}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x33, 0xfe, 0x42, 0x2a, 0x36, 0x2b, 0x2e, 0x36, 0x64, 0x5c, 0x8b, 0xcc, 0x81, 0x6a, 0x15, 0x08, 0xa1, 0x27, 0xe8, 0x57, 0xe5, 0x78, 0x8e, 0xf2, 0x58, 0x19, 0x12, 0x42, 0xae, 0xc4, 0x63, 0x3e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x78, 0x96, 0x9c, 0xa7, 0xca, 0x80, 0xae, 0x02, 0x85, 0xb1, 0x7c, 0x04, 0x5c, 0xc1, 0x5b, 0x26, 0xc1, 0xba, 0xed, 0xa5, 0x59, 0x70, 0x85, 0x8c, 0x8c, 0xe8, 0x87, 0xac, 0x6a, 0x28, 0x99, 0x35}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x9f, 0x04, 0x08, 0x28, 0xbe, 0x87, 0xda, 0x80, 0x28, 0x38, 0xde, 0x9f, 0xcd, 0xe4, 0xe3, 0x62, 0xfb, 0x2e, 0x46, 0x8d, 0x01, 0xb3, 0x06, 0x51, 0xd4, 0x19, 0x3b, 0x11, 0xfa, 0xe2, 0xad, 0x1e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xa0, 0x20, 0x99, 0x69, 0x0a, 0xae, 0xa3, 0x70, 0x4e, 0x64, 0x80, 0xb7, 0x85, 0x9c, 0x87, 0x54, 0x43, 0x43, 0x55, 0x80, 0x6d, 0x8d, 0x7c, 0xa9, 0x64, 0xca, 0x6c, 0x2e, 0x21, 0xd8, 0xc8, 0x6c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x91, 0x4a, 0x07, 0xad, 0x08, 0x75, 0xc1, 0x4f, 0xa4, 0xb2, 0xc3, 0x6f, 0x46, 0x3e, 0xb1, 0xce, 0x52, 0xab, 0x67, 0x09, 0x54, 0x48, 0x6b, 0x6c, 0xd7, 0x1d, 0x71, 0x76, 0xcb, 0xff, 0xdd, 0x31}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x36, 0x88, 0xfa, 0xfd, 0xf0, 0x36, 0x6f, 0x07, 0x74, 0x88, 0x50, 0xd0, 0x95, 0x38, 0x4a, 0x48, 0x2e, 0x07, 0x64, 0x97, 0x11, 0x76, 0x01, 0x1a, 0x27, 0x4d, 0x8e, 0x25, 0x9a, 0x9b, 0x1c, 0x22}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xbe, 0x57, 0xbd, 0x0e, 0x0f, 0xac, 0x5e, 0x76, 0xa3, 0x71, 0xad, 0x2b, 0x10, 0x45, 0x02, 0xec, 0x59, 0xd5, 0x5d, 0xa9, 0x44, 0xcc, 0x25, 0x4c, 0xb3, 0x3c, 0x5b, 0x69, 0x07, 0x55, 0x26, 0x6b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x30, 0x6b, 0xd4, 0xa7, 0x51, 0x29, 0xe3, 0xf9, 0x7a, 0x75, 0x2a, 0x82, 0x2f, 0xd6, 0x1d, 0x99, 0x2b, 0x80, 0xd5, 0x67, 0x1e, 0x15, 0x9d, 0xca, 0xfd, 0xeb, 0xac, 0x97, 0x35, 0x09, 0x7f, 0x3f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x35, 0x0d, 0x34, 0x0a, 0xb8, 0x67, 0x56, 0x29, 0x20, 0xf3, 0x19, 0x5f, 0xe2, 0x83, 0x42, 0x73, 0x53, 0xa8, 0xc5, 0x02, 0x19, 0x33, 0xb4, 0x64, 0xbd, 0xc3, 0x87, 0x8c, 0xd7, 0x76, 0xed, 0x25}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x47, 0x39, 0x37, 0x76, 0x0d, 0x1d, 0x0c, 0xf5, 0x5a, 0x6d, 0x43, 0x88, 0x99, 0x15, 0xb4, 0x52, 0x0f, 0x2a, 0xb3, 0xb0, 0x3f, 0xa6, 0xb3, 0x26, 0xb3, 0xc7, 0x45, 0xf5, 0x92, 0x5f, 0x9b, 0x17}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x9d, 0x23, 0xbd, 0x15, 0xfe, 0x52, 0x52, 0x15, 0x26, 0x79, 0x86, 0xba, 0x06, 0x56, 0x66, 0xbb, 0x8c, 0x2e, 0x10, 0x11, 0xd5, 0x4a, 0x18, 0x52, 0xda, 0x84, 0x44, 0xf0, 0x3e, 0xe9, 0x8c, 0x35}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xad, 0xa0, 0x41, 0xec, 0xc8, 0x4d, 0xb9, 0xd2, 0x6e, 0x96, 0x4e, 0x5b, 0xc5, 0xc2, 0xa0, 0x1b, 0xcf, 0x0c, 0xbf, 0x17, 0x66, 0x57, 0xc1, 0x17, 0x90, 0x45, 0x71, 0xc2, 0xe1, 0x24, 0xeb, 0x27}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x2c, 0xb9, 0x42, 0xa4, 0xaf, 0x3b, 0x42, 0x0e, 0xc2, 0x0f, 0xf2, 0xea, 0x83, 0xaf, 0x9a, 0x13, 0x17, 0xb0, 0xbd, 0x89, 0x17, 0xe3, 0x72, 0xcb, 0x0e, 0x76, 0x7e, 0x41, 0x63, 0x04, 0x88, 0x71}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x75, 0x78, 0x38, 0x86, 0x57, 0xdd, 0x9f, 0xee, 0x54, 0x70, 0x65, 0xbf, 0xf1, 0x2c, 0xe0, 0x39, 0x0d, 0xe3, 0x89, 0xfd, 0x8e, 0x93, 0x4f, 0x43, 0xdc, 0xd5, 0x5b, 0xde, 0xf9, 0x98, 0xe5, 0x7b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe7, 0x3b, 0x65, 0x11, 0xdf, 0xb2, 0xf2, 0x63, 0x94, 0x12, 0x6f, 0x5c, 0x9e, 0x77, 0xc1, 0xb6, 0xd8, 0xab, 0x58, 0x7a, 0x1d, 0x95, 0x73, 0xdd, 0xe7, 0xe3, 0x6f, 0xf2, 0x03, 0x1d, 0xdb, 0x76}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xae, 0x06, 0x4e, 0x2c, 0x52, 0x1b, 0xbc, 0x5a, 0x5a, 0xa5, 0xbe, 0x27, 0xbd, 0xeb, 0xe1, 0x14, 0x17, 0x68, 0x26, 0x07, 0x03, 0xd1, 0x18, 0x0b, 0xdf, 0xf1, 0x06, 0x5c, 0xa6, 0x1b, 0xb9, 0x24}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xc5, 0x66, 0x80, 0x13, 0x0e, 0x48, 0x8c, 0x87, 0x31, 0x84, 0xb4, 0x60, 0xed, 0xc5, 0xec, 0xb6, 0xc5, 0x05, 0x33, 0x5f, 0x2f, 0x7d, 0x40, 0xb6, 0x32, 0x1d, 0x38, 0x74, 0x1b, 0xf1, 0x09, 0x3d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xd4, 0x69, 0x82, 0xbc, 0x8d, 0xf8, 0x34, 0x36, 0x75, 0x55, 0x18, 0x55, 0x58, 0x3c, 0x79, 0xaf, 0x26, 0x80, 0xab, 0x9b, 0x95, 0x00, 0xf1, 0xcb, 0xda, 0xc1, 0x9f, 0xf6, 0x2f, 0xa2, 0xf4, 0x45}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x17, 0xbe, 0xeb, 0x85, 0xed, 0x9e, 0xcd, 0x56, 0xf5, 0x17, 0x45, 0x42, 0xb4, 0x1f, 0x44, 0x4c, 0x05, 0x74, 0x15, 0x47, 0x00, 0xc6, 0x6a, 0x3d, 0x24, 0x09, 0x0d, 0x58, 0xb1, 0x42, 0xd7, 0x04}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8d, 0xbd, 0xa3, 0xc4, 0x06, 0x9b, 0x1f, 0x90, 0x58, 0x60, 0x74, 0xb2, 0x00, 0x3b, 0x3c, 0xd2, 0xda, 0x82, 0xbb, 0x10, 0x90, 0x69, 0x92, 0xa9, 0xb4, 0x30, 0x81, 0xe3, 0x7c, 0xa8, 0x89, 0x45}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x3f, 0xdc, 0x05, 0xcb, 0x41, 0x3c, 0xc8, 0x23, 0x04, 0x2c, 0x38, 0x99, 0xe3, 0x68, 0x55, 0xf9, 0xd3, 0x32, 0xc7, 0xbf, 0xfa, 0xd4, 0x1b, 0x5d, 0xde, 0xdc, 0x10, 0x42, 0xc0, 0x42, 0xd9, 0x75}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x2d, 0xab, 0x35, 0x4e, 0x87, 0xc4, 0x65, 0x97, 0x67, 0x24, 0xa4, 0x47, 0xad, 0x3f, 0x8e, 0xf3, 0xcb, 0x31, 0x17, 0x77, 0xc5, 0xe2, 0xd7, 0x8f, 0x3c, 0xc1, 0xcd, 0x56, 0x48, 0xc1, 0x6c, 0x69}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x14, 0xae, 0x5f, 0x88, 0x7b, 0xa5, 0x90, 0xdf, 0x10, 0xb2, 0x8b, 0x5e, 0x24, 0x17, 0xc3, 0xa3, 0xd4, 0x0f, 0x92, 0x61, 0x1a, 0x19, 0x5a, 0xad, 0x76, 0xbd, 0xd8, 0x1c, 0xdd, 0xe0, 0x12, 0x6d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8e, 0xbd, 0x70, 0x8f, 0x02, 0xa3, 0x24, 0x4d, 0x5a, 0x67, 0xc4, 0xda, 0xf7, 0x20, 0x0f, 0x81, 0x5b, 0x7a, 0x05, 0x24, 0x67, 0x83, 0x0b, 0x2a, 0x80, 0xe7, 0xfd, 0x74, 0x4b, 0x9e, 0x5c, 0x0d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x94, 0xd5, 0x5f, 0x1f, 0xa2, 0xfb, 0xeb, 0xe1, 0x07, 0x34, 0xf8, 0x20, 0xad, 0x81, 0x30, 0x06, 0x2d, 0xa1, 0x81, 0x95, 0x36, 0xcf, 0x11, 0x0b, 0xaf, 0xc1, 0x2b, 0x9a, 0x6c, 0x55, 0xc1, 0x16}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x36, 0x4f, 0xf1, 0x5e, 0x74, 0x35, 0x13, 0x28, 0xd7, 0x11, 0xcf, 0xb8, 0xde, 0x93, 0xb3, 0x05, 0xb8, 0xb5, 0x73, 0xe9, 0xeb, 0xad, 0x19, 0x1e, 0x89, 0x0f, 0x8b, 0x15, 0xd5, 0x8c, 0xe3, 0x23}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x33, 0x79, 0xe7, 0x18, 0xe6, 0x0f, 0x57, 0x93, 0x15, 0xa0, 0xa7, 0xaa, 0xc4, 0xbf, 0x4f, 0x30, 0x74, 0x95, 0x5e, 0x69, 0x4a, 0x5b, 0x45, 0xe4, 0x00, 0xeb, 0x23, 0x74, 0x4c, 0xdf, 0x6b, 0x45}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x97, 0x29, 0x6c, 0xc4, 0x42, 0x0b, 0xdd, 0xc0, 0x29, 0x5c, 0x9b, 0x34, 0x97, 0xd0, 0xc7, 0x79, 0x80, 0x63, 0x74, 0xe4, 0x8e, 0x37, 0xb0, 0x2b, 0x7c, 0xe8, 0x68, 0x6c, 0xc3, 0x82, 0x97, 0x57}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x22, 0xbe, 0x83, 0xb6, 0x4b, 0x80, 0x6b, 0x43, 0x24, 0x5e, 0xef, 0x99, 0x9b, 0xa8, 0xfc, 0x25, 0x8d, 0x3b, 0x03, 0x94, 0x2b, 0x3e, 0xe7, 0x95, 0x76, 0x9b, 0xcc, 0x15, 0xdb, 0x32, 0xe6, 0x66}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x84, 0xf0, 0x4a, 0x13, 0xa6, 0xd6, 0xfa, 0x93, 0x46, 0x07, 0xf6, 0x7e, 0x5c, 0x6d, 0x5e, 0xf6, 0xa6, 0xe7, 0x48, 0xf0, 0x06, 0xea, 0xff, 0x90, 0xc1, 0xcc, 0x4c, 0x19, 0x9c, 0x3c, 0x4e, 0x53}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x2a, 0x50, 0xe3, 0x07, 0x15, 0x59, 0xf2, 0x8b, 0x81, 0xf2, 0xf3, 0xd3, 0x6c, 0x99, 0x8c, 0x70, 0x67, 0xec, 0xcc, 0xee, 0x9e, 0x59, 0x45, 0x59, 0x7d, 0x47, 0x75, 0x69, 0xf5, 0x24, 0x93, 0x5d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x6a, 0x4f, 0x1b, 0xbe, 0x6b, 0x30, 0xcf, 0x75, 0x46, 0xe3, 0x7b, 0x9d, 0xfc, 0xcd, 0xd8, 0x5c, 0x1f, 0xb4, 0xc8, 0xe2, 0x24, 0xec, 0x1a, 0x28, 0x05, 0x32, 0x57, 0xfd, 0x3c, 0x5a, 0x98, 0x10}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xa3, 0xdb, 0xf7, 0x30, 0xd8, 0xc2, 0x9a, 0xe1, 0xd3, 0xce, 0x22, 0xe5, 0x80, 0x1e, 0xd9, 0xe4, 0x1f, 0xab, 0xc0, 0x71, 0x1a, 0x86, 0x0e, 0x27, 0x99, 0x5b, 0xfa, 0x76, 0x99, 0xb0, 0x08, 0x3c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x2a, 0x93, 0xd2, 0x85, 0x1b, 0x6a, 0x5d, 0xa6, 0xee, 0xd1, 0xd1, 0x33, 0xbd, 0x6a, 0x36, 0x73, 0x37, 0x3a, 0x44, 0xb4, 0xec, 0xa9, 0x7a, 0xde, 0x83, 0x40, 0xd7, 0xdf, 0x28, 0xba, 0xa2, 0x30}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xd3, 0xb5, 0x6d, 0x05, 0x3f, 0x9f, 0xf3, 0x15, 0x8d, 0x7c, 0xca, 0xc9, 0xfc, 0x8a, 0x7c, 0x94, 0xb0, 0x63, 0x36, 0x9b, 0x78, 0xd1, 0x91, 0x1f, 0x93, 0xd8, 0x57, 0x43, 0xde, 0x76, 0xa3, 0x43}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x9b, 0x35, 0xe2, 0xa9, 0x3d, 0x32, 0x1e, 0xbb, 0x16, 0x28, 0x70, 0xe9, 0x45, 0x2f, 0x8f, 0x70, 0x7f, 0x08, 0x7e, 0x53, 0xc4, 0x7a, 0xbf, 0xf7, 0xe1, 0xa4, 0x6a, 0xd8, 0xac, 0x64, 0x1b, 0x11}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xb2, 0xeb, 0x47, 0x46, 0x18, 0x3e, 0x1f, 0x99, 0x0c, 0xcc, 0xf1, 0x2c, 0xe0, 0xe7, 0x8f, 0xe0, 0x01, 0x7e, 0x65, 0xb8, 0x0c, 0xd0, 0xfb, 0xc8, 0xb9, 0x90, 0x98, 0x33, 0x61, 0x3b, 0xd8, 0x27}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xa0, 0xbe, 0x72, 0x3a, 0x50, 0x4b, 0x74, 0xab, 0x01, 0xc8, 0x93, 0xc5, 0xe4, 0xc7, 0x08, 0x6c, 0xb4, 0xca, 0xee, 0xeb, 0x8e, 0xd7, 0x4e, 0x26, 0xc6, 0x1d, 0xe2, 0x71, 0xaf, 0x89, 0xa0, 0x2a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x98, 0x0b, 0xe4, 0xde, 0xdb, 0xa8, 0xfa, 0x82, 0x74, 0x06, 0x52, 0x6d, 0x08, 0x52, 0x8a, 0xff, 0x62, 0xc5, 0x6a, 0x44, 0x0f, 0x51, 0x8c, 0x1f, 0x6e, 0xb6, 0xc6, 0x2c, 0x81, 0xd3, 0x76, 0x46}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf4, 0x29, 0x74, 0x2e, 0x80, 0xa7, 0x1a, 0x8f, 0xf6, 0xbd, 0xd6, 0x8e, 0xbf, 0xc1, 0x95, 0x2a, 0xeb, 0xa0, 0x7f, 0x45, 0xa0, 0x50, 0x14, 0x05, 0xb1, 0x57, 0x4c, 0x74, 0xb7, 0xe2, 0x89, 0x7d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x07, 0xee, 0xa7, 0xad, 0xb7, 0x09, 0x0b, 0x49, 0x4e, 0xbf, 0xca, 0xe5, 0x21, 0xe6, 0xe6, 0xaf, 0xd5, 0x67, 0xf3, 0xce, 0x7e, 0x7c, 0x93, 0x7b, 0x5a, 0x10, 0x12, 0x0e, 0x6c, 0x06, 0x11, 0x75}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xd5, 0xfc, 0x86, 0xa3, 0x3b, 0xa3, 0x3e, 0x0a, 0xfb, 0x0b, 0xf7, 0x36, 0xb1, 0x5b, 0xda, 0x70, 0xb7, 0x00, 0xa7, 0xda, 0x88, 0x8f, 0x84, 0xa8, 0xbc, 0x1c, 0x39, 0xb8, 0x65, 0xf3, 0x4d, 0x60}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x96, 0x9d, 0x31, 0xf4, 0xa2, 0xbe, 0x81, 0xb9, 0xa5, 0x59, 0x9e, 0xba, 0x07, 0xbe, 0x74, 0x58, 0xd8, 0xeb, 0xc5, 0x9f, 0x3d, 0xd1, 0xf4, 0xae, 0xce, 0x53, 0xdf, 0x4f, 0xc7, 0x2a, 0x89, 0x4d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x29, 0xd8, 0xf2, 0xaa, 0xe9, 0x0e, 0xf7, 0x2e, 0x5f, 0x9d, 0x8a, 0x5b, 0x09, 0xed, 0xc9, 0x24, 0x22, 0xf4, 0x0f, 0x25, 0x8f, 0x1c, 0x84, 0x6e, 0x34, 0x14, 0x6c, 0xea, 0xb3, 0x86, 0x5d, 0x04}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x07, 0x98, 0x61, 0xe8, 0x6a, 0xd2, 0x81, 0x49, 0x25, 0xd5, 0x5b, 0x18, 0xc7, 0x35, 0x52, 0x51, 0xa4, 0x46, 0xad, 0x18, 0x0d, 0xc9, 0x5f, 0x18, 0x91, 0x3b, 0xb4, 0xc0, 0x60, 0x59, 0x8d, 0x66}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x03, 0x1b, 0x79, 0x53, 0x6e, 0x24, 0xae, 0x57, 0xd9, 0x58, 0x09, 0x85, 0x48, 0xa2, 0xd3, 0xb5, 0xe2, 0x4d, 0x11, 0x82, 0xe6, 0x86, 0x3c, 0xe9, 0xb1, 0x00, 0x19, 0xc2, 0x57, 0xf7, 0x66, 0x7a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x0f, 0xe3, 0x89, 0x03, 0xd7, 0x22, 0x95, 0x9f, 0xca, 0xb4, 0x8d, 0x9e, 0x6d, 0x97, 0xff, 0x8d, 0x21, 0x59, 0x07, 0xef, 0x03, 0x2d, 0x5e, 0xf8, 0x44, 0x46, 0xe7, 0x85, 0x80, 0xc5, 0x89, 0x50}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x8b, 0xd8, 0x53, 0x86, 0x24, 0x86, 0x29, 0x52, 0x01, 0xfa, 0x20, 0xc3, 0x4e, 0x95, 0xcb, 0xad, 0x7b, 0x34, 0x94, 0x30, 0xb7, 0x7a, 0xfa, 0x96, 0x41, 0x60, 0x2b, 0xcb, 0x59, 0xb9, 0xca, 0x50}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xc2, 0x5b, 0x9b, 0x78, 0x23, 0x1b, 0x3a, 0x88, 0x94, 0x5f, 0x0a, 0x9b, 0x98, 0x2b, 0x6e, 0x53, 0x11, 0xf6, 0xff, 0xc6, 0x7d, 0x42, 0xcc, 0x02, 0x80, 0x40, 0x0d, 0x1e, 0xfb, 0xaf, 0x61, 0x07}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xb0, 0xe6, 0x2f, 0x81, 0x70, 0xa1, 0x2e, 0x39, 0x04, 0x7c, 0xc4, 0x2c, 0x87, 0x45, 0x4a, 0x5b, 0x69, 0x97, 0xac, 0x6d, 0x2c, 0x10, 0x42, 0x7c, 0x3b, 0x15, 0x70, 0x60, 0x0e, 0x11, 0x6d, 0x3a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x9b, 0x18, 0x80, 0x5e, 0xdb, 0x05, 0xbd, 0xc6, 0xb7, 0x3c, 0xc2, 0x40, 0x4d, 0x5d, 0xce, 0x97, 0x8a, 0x34, 0x15, 0xab, 0x28, 0x5d, 0x10, 0xf0, 0x37, 0x0c, 0xcc, 0x16, 0xfa, 0x1f, 0x33, 0x0d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x19, 0xf9, 0x35, 0xaa, 0x59, 0x1a, 0x0c, 0x5c, 0x06, 0xfc, 0x6a, 0x0b, 0x97, 0x53, 0x36, 0xfc, 0x2a, 0xa5, 0x5a, 0x9b, 0x30, 0xef, 0x23, 0xaf, 0x39, 0x5d, 0x9a, 0x6b, 0x75, 0x57, 0x48, 0x0b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x26, 0xdc, 0x76, 0x3b, 0xfc, 0xf9, 0x9c, 0x3f, 0x89, 0x0b, 0x62, 0x53, 0xaf, 0x83, 0x01, 0x2e, 0xbc, 0x6a, 0xc6, 0x03, 0x0d, 0x75, 0x2a, 0x0d, 0xe6, 0x94, 0x54, 0xcf, 0xb3, 0xe5, 0x96, 0x25}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xfe, 0x82, 0xb1, 0x74, 0x31, 0x8a, 0xa7, 0x6f, 0x56, 0xbd, 0x8d, 0xf4, 0xe0, 0x94, 0x51, 0x59, 0xde, 0x2c, 0x5a, 0xf4, 0x84, 0x6b, 0x4a, 0x88, 0x93, 0xc0, 0x0c, 0x9a, 0xac, 0xa7, 0xa0, 0x68}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x25, 0x0d, 0xd6, 0xc7, 0x23, 0x47, 0x10, 0xad, 0xc7, 0x08, 0x5c, 0x87, 0x87, 0x93, 0x98, 0x18, 0xb8, 0xd3, 0x9c, 0xac, 0x5a, 0x3d, 0xc5, 0x75, 0xf8, 0x49, 0x32, 0x14, 0xcc, 0x51, 0x96, 0x24}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x65, 0x9c, 0x5d, 0xf0, 0x37, 0x04, 0xf0, 0x34, 0x69, 0x2a, 0xf0, 0xa5, 0x64, 0xca, 0xde, 0x2b, 0x5b, 0x15, 0x10, 0xd2, 0xab, 0x06, 0xdd, 0xc4, 0xb0, 0xb6, 0x5b, 0xc1, 0x17, 0xdf, 0x8f, 0x02}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xbd, 0x59, 0x3d, 0xbf, 0x5c, 0x31, 0x44, 0x2c, 0x32, 0x94, 0x04, 0x60, 0x84, 0x0f, 0xad, 0x00, 0xb6, 0x8f, 0xc9, 0x1d, 0xcc, 0x5c, 0xa2, 0x49, 0x0e, 0x50, 0x91, 0x08, 0x9a, 0x43, 0x55, 0x05}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x5d, 0x93, 0x55, 0xdf, 0x9b, 0x12, 0x19, 0xec, 0x93, 0x85, 0x42, 0x9e, 0x66, 0x0f, 0x9d, 0xaf, 0x99, 0xaf, 0x26, 0x89, 0xbc, 0x61, 0xfd, 0xff, 0xce, 0x4b, 0xf4, 0x33, 0x95, 0xc9, 0x35, 0x58}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x12, 0x55, 0xf9, 0xda, 0xcb, 0x44, 0xa7, 0xdc, 0x57, 0xe2, 0xf9, 0x9a, 0xe6, 0x07, 0x23, 0x60, 0x54, 0xa7, 0x39, 0xa5, 0x9b, 0x84, 0x56, 0x6e, 0xaa, 0x8b, 0x8f, 0xb0, 0x2c, 0x87, 0xaf, 0x67}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x00, 0xa9, 0x4c, 0xb2, 0x12, 0xf8, 0x32, 0xa8, 0x7a, 0x00, 0x4b, 0x49, 0x32, 0xba, 0x1f, 0x5d, 0x44, 0x8e, 0x44, 0x7a, 0xdc, 0x11, 0xfb, 0x39, 0x08, 0x57, 0x87, 0xa5, 0x12, 0x42, 0x93, 0x0e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x17, 0xb4, 0xae, 0x72, 0x59, 0xd0, 0xaa, 0xa8, 0x16, 0x8b, 0x63, 0x11, 0xb3, 0x43, 0x04, 0xda, 0x0c, 0xa8, 0xb7, 0x68, 0xdd, 0x4e, 0x54, 0xe7, 0xaf, 0x5d, 0x5d, 0x05, 0x76, 0x36, 0xec, 0x0d}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x6d, 0x7c, 0x82, 0x32, 0x38, 0x55, 0x57, 0x74, 0x5b, 0x7d, 0xc3, 0xc4, 0xfb, 0x06, 0x29, 0xf0, 0x13, 0x55, 0x54, 0xc6, 0xa7, 0xdc, 0x4c, 0x9f, 0x98, 0x49, 0x20, 0xa8, 0xc3, 0x8d, 0xfa, 0x48}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x87, 0x47, 0x9d, 0xe9, 0x25, 0xd5, 0xe3, 0x47, 0x78, 0xdf, 0x85, 0xa7, 0x85, 0x5e, 0x7a, 0x4c, 0x5f, 0x79, 0x1a, 0xf3, 0xa2, 0xb2, 0x28, 0xa0, 0x9c, 0xdd, 0x30, 0x40, 0xd4, 0x38, 0xbd, 0x28}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xfc, 0xbb, 0xd5, 0x78, 0x6d, 0x1d, 0xd4, 0x99, 0xb4, 0xaa, 0x44, 0x44, 0x7a, 0x1b, 0xd8, 0xfe, 0xb4, 0x99, 0xb9, 0xcc, 0xe7, 0xc4, 0xd3, 0x3a, 0x73, 0x83, 0x41, 0x5c, 0x40, 0xd7, 0x2d, 0x55}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x26, 0xe1, 0x7b, 0x5f, 0xe5, 0xdc, 0x3f, 0x7d, 0xa1, 0xa7, 0x26, 0x44, 0x22, 0x23, 0xc0, 0x8f, 0x7d, 0xf1, 0xb5, 0x11, 0x47, 0x7b, 0x19, 0xd4, 0x75, 0x6f, 0x1e, 0xa5, 0x27, 0xfe, 0xc8, 0x0e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xd3, 0x11, 0x3d, 0xab, 0xef, 0x2c, 0xed, 0xb1, 0x3d, 0x7c, 0x32, 0x81, 0x6b, 0xfe, 0xf8, 0x1c, 0x3c, 0x7b, 0xc0, 0x61, 0xdf, 0xb8, 0x75, 0x76, 0x7f, 0xaa, 0xd8, 0x93, 0xaf, 0x3d, 0xe8, 0x3d}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xfd, 0x5b, 0x4e, 0x8d, 0xb6, 0x7e, 0x82, 0x9b, 0xef, 0xce, 0x04, 0x69, 0x51, 0x52, 0xff, 0xef, 0xa0, 0x52, 0xb5, 0x79, 0x17, 0x5e, 0x2f, 0xde, 0xd6, 0x3c, 0x2d, 0xa0, 0x43, 0xb4, 0x0b, 0x19}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xc0, 0x61, 0x48, 0x48, 0x17, 0xf4, 0x9e, 0x18, 0x51, 0x2d, 0xea, 0x2f, 0xf2, 0xf2, 0xe0, 0xa3, 0x14, 0xb7, 0x8b, 0x3a, 0x30, 0xf5, 0x81, 0xc1, 0x5d, 0x71, 0x39, 0x62, 0x55, 0x1f, 0x60, 0x5a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe5, 0x89, 0x8a, 0x76, 0x6c, 0xdb, 0x4d, 0x0a, 0x5b, 0x72, 0x9d, 0x59, 0x6e, 0x63, 0x63, 0x18, 0x7c, 0xe3, 0xfa, 0xe2, 0xdb, 0xa1, 0x8d, 0xf4, 0xa5, 0xd7, 0x16, 0xb2, 0xd0, 0xb3, 0x3f, 0x39}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xce, 0x60, 0x09, 0x6c, 0xf5, 0x76, 0x17, 0x24, 0x80, 0x3a, 0x96, 0xc7, 0x94, 0x2e, 0xf7, 0x6b, 0xef, 0xb5, 0x05, 0x96, 0xef, 0xd3, 0x7b, 0x51, 0xda, 0x05, 0x44, 0x67, 0xbc, 0x07, 0x21, 0x4e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe9, 0x73, 0x6f, 0x21, 0xb9, 0xde, 0x22, 0x7d, 0xeb, 0x97, 0x31, 0x10, 0xa3, 0xea, 0xe1, 0xc6, 0x37, 0xeb, 0x8f, 0x43, 0x58, 0xde, 0x41, 0x64, 0x0e, 0x3e, 0x07, 0x99, 0x3d, 0xf1, 0xdf, 0x1e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xf8, 0xad, 0x43, 0xc2, 0x17, 0x06, 0xe2, 0xe4, 0xa9, 0x86, 0xcd, 0x18, 0xd7, 0x78, 0xc8, 0x74, 0x66, 0xd2, 0x09, 0x18, 0xa5, 0xf1, 0xca, 0xa6, 0x62, 0x92, 0xc1, 0xcb, 0x00, 0xeb, 0x42, 0x2e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x7b, 0x34, 0x24, 0x4c, 0xcf, 0x38, 0xe5, 0x6c, 0x0a, 0x01, 0x2c, 0x22, 0x0b, 0x24, 0x38, 0xad, 0x24, 0x7e, 0x19, 0xf0, 0x6c, 0xf9, 0x31, 0xf4, 0x35, 0x11, 0xf6, 0x46, 0x33, 0x3a, 0x23, 0x59}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x20, 0x0b, 0xa1, 0x08, 0x19, 0xad, 0x39, 0x54, 0xea, 0x3e, 0x23, 0x09, 0xb6, 0xe2, 0xd2, 0xbc, 0x4d, 0xfc, 0x9c, 0xf0, 0x13, 0x16, 0x22, 0x3f, 0xb9, 0xd2, 0x11, 0x86, 0x90, 0x55, 0xce, 0x3c}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xc4, 0x0b, 0x4b, 0x62, 0x99, 0x37, 0x84, 0x3f, 0x74, 0xa2, 0xf9, 0xce, 0xe2, 0x0b, 0x0f, 0x2a, 0x3d, 0xa3, 0xe3, 0xdb, 0x5a, 0x9d, 0x93, 0xcc, 0xa5, 0xef, 0x82, 0x91, 0x1d, 0xe6, 0x6c, 0x68}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xa3, 0x64, 0x17, 0x9b, 0x8b, 0xc8, 0x3a, 0x61, 0xe6, 0x9d, 0xc6, 0xed, 0x7b, 0x03, 0x52, 0x26, 0x9d, 0x3a, 0xb3, 0x13, 0xcc, 0x8a, 0xfd, 0x2c, 0x1a, 0x1d, 0xed, 0x13, 0xd0, 0x55, 0x57, 0x0e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x1a, 0xea, 0xbf, 0xfd, 0x4a, 0x3c, 0x8e, 0xec, 0x29, 0x7e, 0x77, 0x77, 0x12, 0x99, 0xd7, 0x84, 0xf9, 0x55, 0x7f, 0xf1, 0x8b, 0xb4, 0xd2, 0x95, 0xa3, 0x8d, 0xf0, 0x8a, 0xa7, 0xeb, 0x82, 0x4b}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x2c, 0x28, 0xf4, 0x3a, 0xf6, 0xde, 0x0a, 0xe0, 0x41, 0x44, 0x23, 0xf8, 0x3f, 0x03, 0x64, 0x9f, 0xc3, 0x55, 0x4c, 0xc6, 0xc1, 0x94, 0x1c, 0x24, 0x5d, 0x5f, 0x92, 0x45, 0x96, 0x57, 0x37, 0x14}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xc1, 0xcd, 0x90, 0x66, 0xb9, 0x76, 0xa0, 0x5b, 0xa5, 0x85, 0x75, 0x23, 0xf9, 0x89, 0xa5, 0x82, 0xb2, 0x6f, 0xb1, 0xeb, 0xc4, 0x69, 0x6f, 0x18, 0x5a, 0xed, 0x94, 0x3d, 0x9d, 0xd9, 0x2c, 0x1a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x35, 0xb0, 0xe6, 0x73, 0x06, 0xb7, 0x37, 0xe0, 0xf8, 0xb0, 0x22, 0xe8, 0xd2, 0xed, 0x0b, 0xef, 0xe6, 0xc6, 0x5a, 0x99, 0x9e, 0x1a, 0x9f, 0x04, 0x97, 0xe4, 0x4d, 0x0b, 0xbe, 0xba, 0x44, 0x40}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xc1, 0x56, 0x96, 0x91, 0x5f, 0x1f, 0xbb, 0x54, 0x6f, 0x88, 0x89, 0x0a, 0xb2, 0xd6, 0x41, 0x42, 0x6a, 0x82, 0xee, 0x14, 0xaa, 0x76, 0x30, 0x65, 0x0f, 0x67, 0x39, 0xa6, 0x51, 0x7c, 0x49, 0x24}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x35, 0xa3, 0x78, 0xd1, 0x11, 0x0f, 0x75, 0xd3, 0x70, 0x46, 0xdb, 0x20, 0x51, 0xcb, 0x92, 0x80, 0x54, 0x10, 0x74, 0x36, 0x86, 0xa9, 0xd7, 0xa3, 0x08, 0x78, 0xf1, 0x01, 0x29, 0xf8, 0x80, 0x3b}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xdb, 0xa7, 0x9d, 0x9d, 0xbf, 0xa0, 0xcc, 0xed, 0x53, 0xa2, 0xa2, 0x19, 0x39, 0x48, 0x83, 0x19, 0x37, 0x58, 0xd1, 0x04, 0x28, 0x40, 0xf7, 0x8a, 0xc2, 0x08, 0xb7, 0xa5, 0x42, 0xcf, 0x53, 0x4c}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xa7, 0xbb, 0xf6, 0x8e, 0xad, 0xdd, 0xf7, 0x90, 0xdd, 0x5f, 0x93, 0x89, 0xae, 0x04, 0x37, 0xe6, 0x9a, 0xb7, 0xe8, 0xc0, 0xdf, 0x16, 0x2a, 0xbf, 0xc4, 0x3a, 0x3c, 0x41, 0xd5, 0x89, 0x72, 0x5a}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x1f, 0x96, 0xff, 0x34, 0x2c, 0x13, 0x21, 0xcb, 0x0a, 0x89, 0x85, 0xbe, 0xb3, 0x70, 0x9e, 0x1e, 0xde, 0x97, 0xaf, 0x96, 0x30, 0xf7, 0x48, 0x89, 0x40, 0x8d, 0x07, 0xf1, 0x25, 0xf0, 0x30, 0x58}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x1e, 0xd4, 0x93, 0x57, 0xe2, 0x17, 0xe7, 0x9d, 0xab, 0x3c, 0x55, 0x03, 0x82, 0x2f, 0x2b, 0xdb, 0x56, 0x1e, 0x30, 0x2e, 0x24, 0x47, 0x6e, 0xe6, 0xff, 0x33, 0x24, 0x2c, 0x75, 0x51, 0xd4, 0x67}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x2b, 0x06, 0xd9, 0xa1, 0x5d, 0xe1, 0xf4, 0xd1, 0x1e, 0x3c, 0x9a, 0xc6, 0x29, 0x2b, 0x13, 0x13, 0x78, 0xc0, 0xd8, 0x16, 0x17, 0x2d, 0x9e, 0xa9, 0xc9, 0x79, 0x57, 0xab, 0x24, 0x91, 0x92, 0x19}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x69, 0xfb, 0xa1, 0x9c, 0xa6, 0x75, 0x49, 0x7d, 0x60, 0x73, 0x40, 0x42, 0xc4, 0x13, 0x0a, 0x95, 0x79, 0x1e, 0x04, 0x83, 0x94, 0x99, 0x9b, 0x1e, 0x0c, 0xe8, 0x1f, 0x54, 0xef, 0xcb, 0xc0, 0x52}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x14, 0x89, 0x73, 0xa1, 0x37, 0x87, 0x6a, 0x7a, 0xcf, 0x1d, 0xd9, 0x2e, 0x1a, 0x67, 0xed, 0x74, 0xc0, 0xf0, 0x9c, 0x33, 0xdd, 0xdf, 0x08, 0xbf, 0x7b, 0xd1, 0x66, 0xda, 0xe6, 0xc9, 0x49, 0x08}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xe9, 0xdd, 0x5e, 0x55, 0xb0, 0x0a, 0xde, 0x21, 0x4c, 0x5a, 0x2e, 0xd4, 0x80, 0x3a, 0x57, 0x92, 0x7a, 0xf1, 0xc4, 0x2c, 0x40, 0xaf, 0x2f, 0xc9, 0x92, 0x03, 0xe5, 0x5a, 0xbc, 0xdc, 0xf4, 0x09}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xf3, 0xe1, 0x2b, 0x7c, 0x05, 0x86, 0x80, 0x93, 0x4a, 0xad, 0xb4, 0x8f, 0x7e, 0x99, 0x0c, 0xfd, 0xcd, 0xef, 0xd1, 0xff, 0x2c, 0x69, 0x34, 0x13, 0x41, 0x64, 0xcf, 0x3b, 0xd0, 0x90, 0x09, 0x1e}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x9d, 0x45, 0xd6, 0x80, 0xe6, 0x45, 0xaa, 0xf4, 0x15, 0xaa, 0x5c, 0x34, 0x87, 0x99, 0xa2, 0x8c, 0x26, 0x84, 0x62, 0x7d, 0xb6, 0x29, 0xc0, 0x52, 0xea, 0xf5, 0x81, 0x18, 0x0f, 0x35, 0xa9, 0x0e}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xe7, 0x20, 0x72, 0x7c, 0x6d, 0x94, 0x5f, 0x52, 0x44, 0x54, 0xe3, 0xf1, 0xb2, 0xb0, 0x36, 0x46, 0x0f, 0xae, 0x92, 0xe8, 0x70, 0x9d, 0x6e, 0x79, 0xb1, 0xad, 0x37, 0xa9, 0x5f, 0xc0, 0xde, 0x03}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x15, 0x55, 0x37, 0xc6, 0x1c, 0x27, 0x1c, 0x6d, 0x14, 0x4f, 0xca, 0xa4, 0xc4, 0x88, 0x25, 0x46, 0x39, 0xfc, 0x5a, 0xe5, 0xfe, 0x29, 0x11, 0x69, 0xf5, 0x72, 0x84, 0x4d, 0x78, 0x9f, 0x94, 0x15}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0xec, 0xd3, 0xff, 0x57, 0x0b, 0xb0, 0xb2, 0xdc, 0xf8, 0x4f, 0xe2, 0x12, 0xd5, 0x36, 0xbe, 0x6b, 0x09, 0x43, 0x6d, 0xa3, 0x4d, 0x90, 0x2d, 0xb8, 0x74, 0xe8, 0x71, 0x45, 0x19, 0x8b, 0x0c, 0x6a}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xb8, 0x42, 0x1c, 0x03, 0xad, 0x2c, 0x03, 0x8e, 0xac, 0xd7, 0x98, 0x29, 0x13, 0xc6, 0x02, 0x29, 0xb5, 0xd4, 0xe7, 0xcf, 0xcc, 0x8b, 0x83, 0xec, 0x35, 0xc7, 0x9c, 0x74, 0xb7, 0xad, 0x85, 0x5f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x78, 0x84, 0xe1, 0x56, 0x45, 0x69, 0x68, 0x5a, 0x4f, 0xb8, 0xb1, 0x29, 0xff, 0x33, 0x03, 0x31, 0xb7, 0xcb, 0x96, 0x25, 0xe6, 0xe6, 0x41, 0x98, 0x1a, 0xbb, 0x03, 0x56, 0xf2, 0xb2, 0x91, 0x34}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x2c, 0x6c, 0xf7, 0x66, 0xa4, 0x62, 0x6b, 0x39, 0xb3, 0xba, 0x65, 0xd3, 0x1c, 0xf8, 0x11, 0xaa, 0xbe, 0xdc, 0x80, 0x59, 0x87, 0xf5, 0x7b, 0xe5, 0xe3, 0xb3, 0x3e, 0x39, 0xda, 0xbe, 0x88, 0x09}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x8b, 0xf1, 0xa0, 0xf5, 0xdc, 0x29, 0xb4, 0xe2, 0x07, 0xc6, 0x7a, 0x00, 0xd0, 0x89, 0x17, 0x51, 0xd4, 0xbb, 0xd4, 0x22, 0xea, 0x7e, 0x7d, 0x7c, 0x24, 0xea, 0xf2, 0xe8, 0x22, 0x12, 0x95, 0x06}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xda, 0x7c, 0xa4, 0x0c, 0xf4, 0xba, 0x6e, 0xe1, 0x89, 0xb5, 0x59, 0xca, 0xf1, 0xc0, 0x29, 0x36, 0x09, 0x44, 0xe2, 0x7f, 0xd1, 0x63, 0x15, 0x99, 0xea, 0x25, 0xcf, 0x0c, 0x9d, 0xc0, 0x44, 0x6f}}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{{{0x1d, 0x86, 0x4e, 0xcf, 0xf7, 0x37, 0x10, 0x25, 0x8f, 0x12, 0xfb, 0x19, 0xfb, 0xe0, 0xed, 0x10, 0xc8, 0xe2, 0xf5, 0x75, 0xb1, 0x33, 0xc0, 0x96, 0x0d, 0xfb, 0x15, 0x6c, 0x0d, 0x07, 0x5f, 0x05}} ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x69, 0x3e, 0x47, 0x97, 0x2c, 0xaf, 0x52, 0x7c, 0x78, 0x83, 0xad, 0x1b, 0x39, 0x82, 0x2f, 0x02, 0x6f, 0x47, 0xdb, 0x2a, 0xb0, 0xe1, 0x91, 0x99, 0x55, 0xb8, 0x99, 0x3a, 0xa0, 0x44, 0x11, 0x51}}}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/mod_ed25519.c b/vendor/signify-osx/src/usr.bin/signify/mod_ed25519.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..aac481af7
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/mod_ed25519.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,143 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: mod_ed25519.c,v 1.1 2014/01/08 05:00:01 tedu Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Peter Schwabe, Bo-Yin Yang.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copied from supercop-20130419/crypto_sign/ed25519/ref/ed25519.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "crypto_api.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "ge25519.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void get_hram(unsigned char *hram, const unsigned char *sm, const unsigned char *pk, unsigned char *playground, unsigned long long smlen)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0;i < 32;++i) playground[i] = sm[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 32;i < 64;++i) playground[i] = pk[i-32];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 64;i < smlen;++i) playground[i] = sm[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_hash_sha512(hram,playground,smlen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef VERIFYONLY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int crypto_sign_ed25519_keypair(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char *pk,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char *sk
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519 scsk;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ge25519 gepk;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char extsk[64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ randombytes(sk, 32);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_hash_sha512(extsk, sk, 32);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extsk[0] &= 248;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extsk[31] &= 127;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extsk[31] |= 64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519_from32bytes(&scsk,extsk);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ge25519_scalarmult_base(&gepk, &scsk);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ge25519_pack(pk, &gepk);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sk[32 + i] = pk[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int crypto_sign_ed25519(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char *sm,unsigned long long *smlen,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const unsigned char *m,unsigned long long mlen,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const unsigned char *sk
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519 sck, scs, scsk;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ge25519 ger;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char r[32];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char s[32];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char extsk[64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char hmg[crypto_hash_sha512_BYTES];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char hram[crypto_hash_sha512_BYTES];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_hash_sha512(extsk, sk, 32);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extsk[0] &= 248;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extsk[31] &= 127;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extsk[31] |= 64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *smlen = mlen+64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<mlen;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sm[64 + i] = m[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sm[32 + i] = extsk[32+i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_hash_sha512(hmg, sm+32, mlen+32); /* Generate k as h(extsk[32],...,extsk[63],m) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Computation of R */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519_from64bytes(&sck, hmg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ge25519_scalarmult_base(&ger, &sck);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ge25519_pack(r, &ger);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Computation of s */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sm[i] = r[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ get_hram(hram, sm, sk+32, sm, mlen+64);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519_from64bytes(&scs, hram);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519_from32bytes(&scsk, extsk);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519_mul(&scs, &scs, &scsk);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519_add(&scs, &scs, &sck);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519_to32bytes(s,&scs); /* cat s */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sm[32 + i] = s[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int crypto_sign_ed25519_open(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char *m,unsigned long long *mlen,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const unsigned char *sm,unsigned long long smlen,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const unsigned char *pk
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char t2[32];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ge25519 get1, get2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519 schram, scs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char hram[crypto_hash_sha512_BYTES];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *mlen = (unsigned long long) -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (smlen < 64) return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (ge25519_unpackneg_vartime(&get1, pk)) return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ get_hram(hram,sm,pk,m,smlen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519_from64bytes(&schram, hram);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519_from32bytes(&scs, sm+32);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ge25519_double_scalarmult_vartime(&get2, &get1, &schram, &ge25519_base, &scs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ge25519_pack(t2, &get2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ret = crypto_verify_32(sm, t2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!ret)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<smlen-64;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ m[i] = sm[i + 64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *mlen = smlen-64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<smlen-64;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ m[i] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/mod_ge25519.c b/vendor/signify-osx/src/usr.bin/signify/mod_ge25519.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..16da3226a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/mod_ge25519.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,327 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: mod_ge25519.c,v 1.2 2014/01/08 05:51:35 deraadt Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Peter Schwabe, Bo-Yin Yang.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copied from supercop-20130419/crypto_sign/ed25519/ref/ge25519.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "fe25519.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "sc25519.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "ge25519.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Arithmetic on the twisted Edwards curve -x^2 + y^2 = 1 + dx^2y^2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * with d = -(121665/121666) = 37095705934669439343138083508754565189542113879843219016388785533085940283555
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Base point: (15112221349535400772501151409588531511454012693041857206046113283949847762202,46316835694926478169428394003475163141307993866256225615783033603165251855960);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* d */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const fe25519 ge25519_ecd = {{0xA3, 0x78, 0x59, 0x13, 0xCA, 0x4D, 0xEB, 0x75, 0xAB, 0xD8, 0x41, 0x41, 0x4D, 0x0A, 0x70, 0x00,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x98, 0xE8, 0x79, 0x77, 0x79, 0x40, 0xC7, 0x8C, 0x73, 0xFE, 0x6F, 0x2B, 0xEE, 0x6C, 0x03, 0x52}};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* 2*d */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const fe25519 ge25519_ec2d = {{0x59, 0xF1, 0xB2, 0x26, 0x94, 0x9B, 0xD6, 0xEB, 0x56, 0xB1, 0x83, 0x82, 0x9A, 0x14, 0xE0, 0x00,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x30, 0xD1, 0xF3, 0xEE, 0xF2, 0x80, 0x8E, 0x19, 0xE7, 0xFC, 0xDF, 0x56, 0xDC, 0xD9, 0x06, 0x24}};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* sqrt(-1) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const fe25519 ge25519_sqrtm1 = {{0xB0, 0xA0, 0x0E, 0x4A, 0x27, 0x1B, 0xEE, 0xC4, 0x78, 0xE4, 0x2F, 0xAD, 0x06, 0x18, 0x43, 0x2F,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xA7, 0xD7, 0xFB, 0x3D, 0x99, 0x00, 0x4D, 0x2B, 0x0B, 0xDF, 0xC1, 0x4F, 0x80, 0x24, 0x83, 0x2B}};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ge25519_p3 ge25519
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 y;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} ge25519_p1p1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 y;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 z;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} ge25519_p2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 y;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} ge25519_aff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Packed coordinates of the base point */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+const ge25519 ge25519_base = {{{0x1A, 0xD5, 0x25, 0x8F, 0x60, 0x2D, 0x56, 0xC9, 0xB2, 0xA7, 0x25, 0x95, 0x60, 0xC7, 0x2C, 0x69,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x5C, 0xDC, 0xD6, 0xFD, 0x31, 0xE2, 0xA4, 0xC0, 0xFE, 0x53, 0x6E, 0xCD, 0xD3, 0x36, 0x69, 0x21}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x58, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {{0xA3, 0xDD, 0xB7, 0xA5, 0xB3, 0x8A, 0xDE, 0x6D, 0xF5, 0x52, 0x51, 0x77, 0x80, 0x9F, 0xF0, 0x20,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x7D, 0xE3, 0xAB, 0x64, 0x8E, 0x4E, 0xEA, 0x66, 0x65, 0x76, 0x8B, 0xD7, 0x0F, 0x5F, 0x87, 0x67}}};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef VERIFYONLY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Multiples of the base point in affine representation */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const ge25519_aff ge25519_base_multiples_affine[425] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "ge25519_base.data"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void p1p1_to_p2(ge25519_p2 *r, const ge25519_p1p1 *p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&r->x, &p->x, &p->t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&r->y, &p->y, &p->z);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&r->z, &p->z, &p->t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void p1p1_to_p3(ge25519_p3 *r, const ge25519_p1p1 *p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ p1p1_to_p2((ge25519_p2 *)r, p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&r->t, &p->x, &p->y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef VERIFYONLY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void ge25519_mixadd2(ge25519_p3 *r, const ge25519_aff *q)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 a,b,t1,t2,c,d,e,f,g,h,qt;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&qt, &q->x, &q->y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(&a, &r->y, &r->x); /* A = (Y1-X1)*(Y2-X2) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&b, &r->y, &r->x); /* B = (Y1+X1)*(Y2+X2) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(&t1, &q->y, &q->x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&t2, &q->y, &q->x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&a, &a, &t1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&b, &b, &t2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(&e, &b, &a); /* E = B-A */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&h, &b, &a); /* H = B+A */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&c, &r->t, &qt); /* C = T1*k*T2 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&c, &c, &ge25519_ec2d);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&d, &r->z, &r->z); /* D = Z1*2 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(&f, &d, &c); /* F = D-C */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&g, &d, &c); /* G = D+C */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&r->x, &e, &f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&r->y, &h, &g);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&r->z, &g, &f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&r->t, &e, &h);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void add_p1p1(ge25519_p1p1 *r, const ge25519_p3 *p, const ge25519_p3 *q)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 a, b, c, d, t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(&a, &p->y, &p->x); /* A = (Y1-X1)*(Y2-X2) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(&t, &q->y, &q->x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&a, &a, &t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&b, &p->x, &p->y); /* B = (Y1+X1)*(Y2+X2) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&t, &q->x, &q->y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&b, &b, &t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&c, &p->t, &q->t); /* C = T1*k*T2 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&c, &c, &ge25519_ec2d);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&d, &p->z, &q->z); /* D = Z1*2*Z2 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&d, &d, &d);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(&r->x, &b, &a); /* E = B-A */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(&r->t, &d, &c); /* F = D-C */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&r->z, &d, &c); /* G = D+C */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&r->y, &b, &a); /* H = B+A */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* See http://www.hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html#doubling-dbl-2008-hwcd */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void dbl_p1p1(ge25519_p1p1 *r, const ge25519_p2 *p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 a,b,c,d;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_square(&a, &p->x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_square(&b, &p->y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_square(&c, &p->z);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&c, &c, &c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_neg(&d, &a);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&r->x, &p->x, &p->y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_square(&r->x, &r->x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(&r->x, &r->x, &a);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(&r->x, &r->x, &b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&r->z, &d, &b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(&r->t, &r->z, &c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(&r->y, &d, &b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef VERIFYONLY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Constant-time version of: if(b) r = p */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void cmov_aff(ge25519_aff *r, const ge25519_aff *p, unsigned char b)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_cmov(&r->x, &p->x, b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_cmov(&r->y, &p->y, b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static unsigned char equal(signed char b,signed char c)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char ub = b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char uc = c;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char x = ub ^ uc; /* 0: yes; 1..255: no */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 y = x; /* 0: yes; 1..255: no */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ y -= 1; /* 4294967295: yes; 0..254: no */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ y >>= 31; /* 1: yes; 0: no */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return y;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static unsigned char negative(signed char b)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ x >>= 63; /* 1: yes; 0: no */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void choose_t(ge25519_aff *t, unsigned long long pos, signed char b)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* constant time */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 v;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *t = ge25519_base_multiples_affine[5*pos+0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cmov_aff(t, &ge25519_base_multiples_affine[5*pos+1],equal(b,1) | equal(b,-1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cmov_aff(t, &ge25519_base_multiples_affine[5*pos+2],equal(b,2) | equal(b,-2));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cmov_aff(t, &ge25519_base_multiples_affine[5*pos+3],equal(b,3) | equal(b,-3));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cmov_aff(t, &ge25519_base_multiples_affine[5*pos+4],equal(b,-4));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_neg(&v, &t->x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_cmov(&t->x, &v, negative(b));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void setneutral(ge25519 *r)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_setzero(&r->x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_setone(&r->y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_setone(&r->z);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_setzero(&r->t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* ********************************************************************
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * EXPORTED FUNCTIONS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ******************************************************************** */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* return 0 on success, -1 otherwise */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int ge25519_unpackneg_vartime(ge25519_p3 *r, const unsigned char p[32])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char par;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 t, chk, num, den, den2, den4, den6;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_setone(&r->z);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ par = p[31] >> 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_unpack(&r->y, p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_square(&num, &r->y); /* x = y^2 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&den, &num, &ge25519_ecd); /* den = dy^2 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_sub(&num, &num, &r->z); /* x = y^2-1 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_add(&den, &r->z, &den); /* den = dy^2+1 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Computation of sqrt(num/den) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 1.: computation of num^((p-5)/8)*den^((7p-35)/8) = (num*den^7)^((p-5)/8) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_square(&den2, &den);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_square(&den4, &den2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&den6, &den4, &den2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&t, &den6, &num);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&t, &t, &den);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_pow2523(&t, &t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 2. computation of r->x = t * num * den^3 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&t, &t, &num);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&t, &t, &den);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&t, &t, &den);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&r->x, &t, &den);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 3. Check whether sqrt computation gave correct result, multiply by sqrt(-1) if not: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_square(&chk, &r->x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&chk, &chk, &den);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!fe25519_iseq_vartime(&chk, &num))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&r->x, &r->x, &ge25519_sqrtm1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 4. Now we have one of the two square roots, except if input was not a square */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_square(&chk, &r->x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&chk, &chk, &den);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!fe25519_iseq_vartime(&chk, &num))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* 5. Choose the desired square root according to parity: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(fe25519_getparity(&r->x) != (1-par))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_neg(&r->x, &r->x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&r->t, &r->x, &r->y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void ge25519_pack(unsigned char r[32], const ge25519_p3 *p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519 tx, ty, zi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_invert(&zi, &p->z);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&tx, &p->x, &zi);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&ty, &p->y, &zi);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_pack(r, &ty);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[31] ^= fe25519_getparity(&tx) << 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int ge25519_isneutral_vartime(const ge25519_p3 *p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int ret = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(!fe25519_iszero(&p->x)) ret = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(!fe25519_iseq_vartime(&p->y, &p->z)) ret = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* computes [s1]p1 + [s2]p2 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void ge25519_double_scalarmult_vartime(ge25519_p3 *r, const ge25519_p3 *p1, const sc25519 *s1, const ge25519_p3 *p2, const sc25519 *s2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ge25519_p1p1 tp1p1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ge25519_p3 pre[16];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char b[127];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* precomputation s2 s1 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ setneutral(pre); /* 00 00 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pre[1] = *p1; /* 00 01 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dbl_p1p1(&tp1p1,(ge25519_p2 *)p1); p1p1_to_p3( &pre[2], &tp1p1); /* 00 10 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_p1p1(&tp1p1,&pre[1], &pre[2]); p1p1_to_p3( &pre[3], &tp1p1); /* 00 11 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pre[4] = *p2; /* 01 00 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_p1p1(&tp1p1,&pre[1], &pre[4]); p1p1_to_p3( &pre[5], &tp1p1); /* 01 01 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_p1p1(&tp1p1,&pre[2], &pre[4]); p1p1_to_p3( &pre[6], &tp1p1); /* 01 10 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_p1p1(&tp1p1,&pre[3], &pre[4]); p1p1_to_p3( &pre[7], &tp1p1); /* 01 11 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dbl_p1p1(&tp1p1,(ge25519_p2 *)p2); p1p1_to_p3( &pre[8], &tp1p1); /* 10 00 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_p1p1(&tp1p1,&pre[1], &pre[8]); p1p1_to_p3( &pre[9], &tp1p1); /* 10 01 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dbl_p1p1(&tp1p1,(ge25519_p2 *)&pre[5]); p1p1_to_p3(&pre[10], &tp1p1); /* 10 10 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_p1p1(&tp1p1,&pre[3], &pre[8]); p1p1_to_p3(&pre[11], &tp1p1); /* 10 11 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_p1p1(&tp1p1,&pre[4], &pre[8]); p1p1_to_p3(&pre[12], &tp1p1); /* 11 00 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_p1p1(&tp1p1,&pre[1],&pre[12]); p1p1_to_p3(&pre[13], &tp1p1); /* 11 01 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_p1p1(&tp1p1,&pre[2],&pre[12]); p1p1_to_p3(&pre[14], &tp1p1); /* 11 10 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_p1p1(&tp1p1,&pre[3],&pre[12]); p1p1_to_p3(&pre[15], &tp1p1); /* 11 11 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519_2interleave2(b,s1,s2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* scalar multiplication */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *r = pre[b[126]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=125;i>=0;i--)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dbl_p1p1(&tp1p1, (ge25519_p2 *)r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ p1p1_to_p2((ge25519_p2 *) r, &tp1p1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dbl_p1p1(&tp1p1, (ge25519_p2 *)r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(b[i]!=0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ p1p1_to_p3(r, &tp1p1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_p1p1(&tp1p1, r, &pre[b[i]]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(i != 0) p1p1_to_p2((ge25519_p2 *)r, &tp1p1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else p1p1_to_p3(r, &tp1p1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef VERIFYONLY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void ge25519_scalarmult_base(ge25519_p3 *r, const sc25519 *s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ signed char b[85];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ge25519_aff t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519_window3(b,s);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ choose_t((ge25519_aff *)r, 0, b[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_setone(&r->z);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fe25519_mul(&r->t, &r->x, &r->y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=1;i<85;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ choose_t(&t, (unsigned long long) i, b[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ge25519_mixadd2(r, &t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/sc25519.c b/vendor/signify-osx/src/usr.bin/signify/sc25519.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..0e324eb08
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/sc25519.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,306 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: sc25519.c,v 1.1 2014/07/22 00:41:19 deraadt Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Peter Schwabe, Bo-Yin Yang.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copied from supercop-20130419/crypto_sign/ed25519/ref/sc25519.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "sc25519.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*Arithmetic modulo the group order m = 2^252 + 27742317777372353535851937790883648493 = 7237005577332262213973186563042994240857116359379907606001950938285454250989 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const crypto_uint32 m[32] = {0xED, 0xD3, 0xF5, 0x5C, 0x1A, 0x63, 0x12, 0x58, 0xD6, 0x9C, 0xF7, 0xA2, 0xDE, 0xF9, 0xDE, 0x14,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const crypto_uint32 mu[33] = {0x1B, 0x13, 0x2C, 0x0A, 0xA3, 0xE5, 0x9C, 0xED, 0xA7, 0x29, 0x63, 0x08, 0x5D, 0x21, 0x06, 0x21,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static crypto_uint32 lt(crypto_uint32 a,crypto_uint32 b) /* 16-bit inputs */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int x = a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ x -= (unsigned int) b; /* 0..65535: no; 4294901761..4294967295: yes */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ x >>= 31; /* 0: no; 1: yes */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Reduce coefficients of r before calling reduce_add_sub */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void reduce_add_sub(sc25519 *r)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 pb = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 mask;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned char t[32];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pb += m[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ b = lt(r->v[i],pb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t[i] = r->v[i]-pb+(b<<8);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pb = b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ mask = b - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[i] ^= mask & (r->v[i] ^ t[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Reduce coefficients of x before calling barrett_reduce */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void barrett_reduce(sc25519 *r, const crypto_uint32 x[64])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* See HAC, Alg. 14.42 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i,j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 q2[66];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 *q3 = q2 + 33;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 r1[33];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 r2[33];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 pb = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0;i < 66;++i) q2[i] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0;i < 33;++i) r2[i] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<33;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(j=0;j<33;j++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(i+j >= 31) q2[i+j] += mu[i]*x[j+31];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ carry = q2[31] >> 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ q2[32] += carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ carry = q2[32] >> 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ q2[33] += carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<33;i++)r1[i] = x[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(j=0;j<33;j++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(i+j < 33) r2[i+j] += m[i]*q3[j];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ carry = r2[i] >> 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r2[i+1] += carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r2[i] &= 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pb += r2[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ b = lt(r1[i],pb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[i] = r1[i]-pb+(b<<8);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pb = b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* XXX: Can it really happen that r<0?, See HAC, Alg 14.42, Step 3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * If so: Handle it here!
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reduce_add_sub(r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reduce_add_sub(r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_from32bytes(sc25519 *r, const unsigned char x[32])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 t[64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++) t[i] = x[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=32;i<64;++i) t[i] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ barrett_reduce(r, t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void shortsc25519_from16bytes(shortsc25519 *r, const unsigned char x[16])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<16;i++) r->v[i] = x[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_from64bytes(sc25519 *r, const unsigned char x[64])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 t[64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<64;i++) t[i] = x[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ barrett_reduce(r, t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_from_shortsc(sc25519 *r, const shortsc25519 *x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<16;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[i] = x->v[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<16;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[16+i] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_to32bytes(unsigned char r[32], const sc25519 *x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++) r[i] = x->v[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int sc25519_iszero_vartime(const sc25519 *x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(x->v[i] != 0) return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int sc25519_isshort_vartime(const sc25519 *x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=31;i>15;i--)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(x->v[i] != 0) return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int sc25519_lt_vartime(const sc25519 *x, const sc25519 *y)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=31;i>=0;i--)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(x->v[i] < y->v[i]) return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(x->v[i] > y->v[i]) return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i, carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++) r->v[i] = x->v[i] + y->v[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<31;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ carry = r->v[i] >> 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[i+1] += carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[i] &= 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reduce_add_sub(r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_sub_nored(sc25519 *r, const sc25519 *x, const sc25519 *y)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 b = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t = x->v[i] - y->v[i] - b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r->v[i] = t & 255;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ b = (t >> 8) & 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i,j,carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 t[64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<64;i++)t[i] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<32;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(j=0;j<32;j++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t[i+j] += x->v[i] * y->v[j];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Reduce coefficients */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<63;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ carry = t[i] >> 8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t[i+1] += carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ t[i] &= 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ barrett_reduce(r, t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_mul_shortsc(sc25519 *r, const sc25519 *x, const shortsc25519 *y)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519 t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519_from_shortsc(&t, y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sc25519_mul(r, x, &t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_window3(signed char r[85], const sc25519 *s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<10;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+0] = s->v[3*i+0] & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+1] = (s->v[3*i+0] >> 3) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+2] = (s->v[3*i+0] >> 6) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+2] ^= (s->v[3*i+1] << 2) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+3] = (s->v[3*i+1] >> 1) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+4] = (s->v[3*i+1] >> 4) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+5] = (s->v[3*i+1] >> 7) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+5] ^= (s->v[3*i+2] << 1) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+6] = (s->v[3*i+2] >> 2) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+7] = (s->v[3*i+2] >> 5) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+0] = s->v[3*i+0] & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+1] = (s->v[3*i+0] >> 3) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+2] = (s->v[3*i+0] >> 6) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+2] ^= (s->v[3*i+1] << 2) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+3] = (s->v[3*i+1] >> 1) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+4] = (s->v[3*i+1] >> 4) & 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Making it signed */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ carry = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<84;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[i] += carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[i+1] += r[i] >> 3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[i] &= 7;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ carry = r[i] >> 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[i] -= carry<<3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[84] += carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_window5(signed char r[51], const sc25519 *s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<6;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+0] = s->v[5*i+0] & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+1] = (s->v[5*i+0] >> 5) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+1] ^= (s->v[5*i+1] << 3) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+2] = (s->v[5*i+1] >> 2) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+3] = (s->v[5*i+1] >> 7) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+3] ^= (s->v[5*i+2] << 1) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+4] = (s->v[5*i+2] >> 4) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+4] ^= (s->v[5*i+3] << 4) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+5] = (s->v[5*i+3] >> 1) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+6] = (s->v[5*i+3] >> 6) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+6] ^= (s->v[5*i+4] << 2) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+7] = (s->v[5*i+4] >> 3) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+0] = s->v[5*i+0] & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+1] = (s->v[5*i+0] >> 5) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+1] ^= (s->v[5*i+1] << 3) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[8*i+2] = (s->v[5*i+1] >> 2) & 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Making it signed */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ carry = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<50;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[i] += carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[i+1] += r[i] >> 5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[i] &= 31;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ carry = r[i] >> 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[i] -= carry<<5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[50] += carry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_2interleave2(unsigned char r[127], const sc25519 *s1, const sc25519 *s2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for(i=0;i<31;i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[4*i] = ( s1->v[i] & 3) ^ (( s2->v[i] & 3) << 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[4*i+1] = ((s1->v[i] >> 2) & 3) ^ (((s2->v[i] >> 2) & 3) << 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[4*i+2] = ((s1->v[i] >> 4) & 3) ^ (((s2->v[i] >> 4) & 3) << 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[4*i+3] = ((s1->v[i] >> 6) & 3) ^ (((s2->v[i] >> 6) & 3) << 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[124] = ( s1->v[31] & 3) ^ (( s2->v[31] & 3) << 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[125] = ((s1->v[31] >> 2) & 3) ^ (((s2->v[31] >> 2) & 3) << 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r[126] = ((s1->v[31] >> 4) & 3) ^ (((s2->v[31] >> 4) & 3) << 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/sc25519.h b/vendor/signify-osx/src/usr.bin/signify/sc25519.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..5211fa833
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/sc25519.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,80 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: sc25519.h,v 1.1 2014/07/22 00:41:19 deraadt Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Peter Schwabe, Bo-Yin Yang.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copied from supercop-20130419/crypto_sign/ed25519/ref/sc25519.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef SC25519_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SC25519_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "crypto_api.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519 crypto_sign_ed25519_ref_sc25519
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define shortsc25519 crypto_sign_ed25519_ref_shortsc25519
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_from32bytes crypto_sign_ed25519_ref_sc25519_from32bytes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define shortsc25519_from16bytes crypto_sign_ed25519_ref_shortsc25519_from16bytes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_from64bytes crypto_sign_ed25519_ref_sc25519_from64bytes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_from_shortsc crypto_sign_ed25519_ref_sc25519_from_shortsc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_to32bytes crypto_sign_ed25519_ref_sc25519_to32bytes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_iszero_vartime crypto_sign_ed25519_ref_sc25519_iszero_vartime
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_isshort_vartime crypto_sign_ed25519_ref_sc25519_isshort_vartime
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_lt_vartime crypto_sign_ed25519_ref_sc25519_lt_vartime
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_add crypto_sign_ed25519_ref_sc25519_add
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_sub_nored crypto_sign_ed25519_ref_sc25519_sub_nored
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_mul crypto_sign_ed25519_ref_sc25519_mul
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_mul_shortsc crypto_sign_ed25519_ref_sc25519_mul_shortsc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_window3 crypto_sign_ed25519_ref_sc25519_window3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_window5 crypto_sign_ed25519_ref_sc25519_window5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define sc25519_2interleave2 crypto_sign_ed25519_ref_sc25519_2interleave2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 v[32];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+sc25519;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_uint32 v[16];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+shortsc25519;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_from32bytes(sc25519 *r, const unsigned char x[32]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void shortsc25519_from16bytes(shortsc25519 *r, const unsigned char x[16]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_from64bytes(sc25519 *r, const unsigned char x[64]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_from_shortsc(sc25519 *r, const shortsc25519 *x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_to32bytes(unsigned char r[32], const sc25519 *x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int sc25519_iszero_vartime(const sc25519 *x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int sc25519_isshort_vartime(const sc25519 *x);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int sc25519_lt_vartime(const sc25519 *x, const sc25519 *y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_sub_nored(sc25519 *r, const sc25519 *x, const sc25519 *y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_mul_shortsc(sc25519 *r, const sc25519 *x, const shortsc25519 *y);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Convert s into a representation of the form \sum_{i=0}^{84}r[i]2^3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * with r[i] in {-4,...,3}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_window3(signed char r[85], const sc25519 *s);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Convert s into a representation of the form \sum_{i=0}^{50}r[i]2^5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * with r[i] in {-16,...,15}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_window5(signed char r[51], const sc25519 *s);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void sc25519_2interleave2(unsigned char r[127], const sc25519 *s1, const sc25519 *s2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/signify.1 b/vendor/signify-osx/src/usr.bin/signify/signify.1
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..2d1a29ec3
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/signify.1
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,206 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\" $OpenBSD: signify.1,v 1.59 2024/03/02 23:38:00 benno Exp $
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"Copyright (c) 2013 Marc Espie <espie@openbsd.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.\"OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Dd $Mdocdate: March 2 2024 $
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Dt SIGNIFY 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Os
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Sh NAME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Nm signify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Nd cryptographically sign and verify files
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Sh SYNOPSIS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Nm signify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl C
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Op Fl q
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Op Fl p Ar pubkey
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Op Fl t Ar keytype
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl x Ar sigfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Op Ar
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Nm signify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl G
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Op Fl n
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Op Fl c Ar comment
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl p Ar pubkey
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl s Ar seckey
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Nm signify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl S
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Op Fl enz
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Op Fl x Ar sigfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl s Ar seckey
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl m Ar message
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Nm signify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl V
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Op Fl eqz
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Op Fl p Ar pubkey
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Op Fl t Ar keytype
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Op Fl x Ar sigfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl m Ar message
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Sh DESCRIPTION
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Nm
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+utility creates and verifies cryptographic signatures.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+A signature verifies the integrity of a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Ar message .
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The mode of operation is selected with the following options:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Bl -tag -width Dsssigfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl C
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Verify a signed checksum list, and then verify the checksum for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+each file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+If no files are specified, all of them are checked.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Ar sigfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+should be the signed output of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Xr sha256 1 .
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl G
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Generate a new key pair.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Keynames should follow the convention of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Pa keyname.pub
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Pa keyname.sec
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+for the public and secret keys, respectively.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl S
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Sign the specified message file and create a signature.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl V
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Verify the message and signature match.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.El
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Pp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The other options are as follows:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Bl -tag -width Dsssignature
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl c Ar comment
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Specify the comment to be added during key generation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl e
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+When signing, embed the message after the signature.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+When verifying, extract the message from the signature.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+(This requires that the signature was created using
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl e
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+and creates a new message file as output.)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl m Ar message
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+When signing, the file containing the message to sign.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+When verifying, the file containing the message to verify.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+When verifying with
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl e ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+the file to create.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl n
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+When generating a key pair, do not ask for a passphrase.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Otherwise,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Nm
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+will prompt the user for a passphrase to protect the secret key.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+When signing with
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl z ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+store a zero time stamp in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Xr gzip 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+header.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl p Ar pubkey
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Public key produced by
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl G ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+and used by
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl V
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+to check a signature.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl q
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Quiet mode.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Suppress informational output.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl s Ar seckey
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Secret (private) key produced by
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl G ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+and used by
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Fl S
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+to sign a message.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl t Ar keytype
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+When deducing the correct key to check a signature, make sure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+the actual key matches
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Pa /etc/signify/*-keytype.pub .
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl x Ar sigfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The signature file to create or verify.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The default is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Ar message Ns .sig .
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It Fl z
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Sign and verify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Xr gzip 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+archives, where the signing data
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+is embedded in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Xr gzip 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+header.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.El
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Pp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The key and signature files created by
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Nm
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+have the same format.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The first line of the file is a free form text comment that may be edited,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+so long as it does not exceed a single line.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Signature comments will be generated based on the name of the secret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+key used for signing.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This comment can then be used as a hint for the name of the public key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+when verifying.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The second line of the file is the actual key or signature base64 encoded.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Sh EXIT STATUS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Ex -std signify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+It may fail because of one of the following reasons:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Pp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Bl -bullet -compact
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Some necessary files do not exist.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Entered passphrase is incorrect.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The message file was corrupted and its signature does not match.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.It
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The message file is too large.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.El
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Sh EXAMPLES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Create a new key pair:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Dl $ signify -G -p newkey.pub -s newkey.sec
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Pp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Sign a file, specifying a signature name:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Dl $ signify -S -s key.sec -m message.txt -x msg.sig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Pp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Verify a signature, using the default signature name:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Dl $ signify -V -p key.pub -m generalsorders.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Pp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Verify a release directory containing
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Pa SHA256.sig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+and a full set of release files:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Bd -literal -offset indent -compact
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$ signify -C -p /etc/signify/openbsd-76-base.pub -x SHA256.sig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Ed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Pp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Verify a bsd.rd before an upgrade:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Bd -literal -offset indent -compact
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$ signify -C -p /etc/signify/openbsd-76-base.pub -x SHA256.sig bsd.rd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Ed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Pp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Sign a gzip archive:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Bd -literal -offset indent -compact
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$ signify -Sz -s key-arc.sec -m in.tgz -x out.tgz
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Ed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Pp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Verify a gzip pipeline:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Bd -literal -offset indent -compact
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$ ftp url | signify -Vz -t arc | tar ztf -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Ed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Sh SEE ALSO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Xr gzip 1 ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Xr pkg_add 1 ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Xr sha256 1 ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Xr fw_update 8 ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Xr sysupgrade 8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Sh HISTORY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Nm
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+command first appeared in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Ox 5.5 .
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.Sh AUTHORS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.An -nosplit
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.An Ted Unangst Aq Mt tedu@openbsd.org
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+.An Marc Espie Aq Mt espie@openbsd.org .
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/signify.c b/vendor/signify-osx/src/usr.bin/signify/signify.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..1ab609ae5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/signify.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,918 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: signify.c,v 1.136 2022/08/26 00:24:56 kn Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/stat.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <netinet/in.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <resolv.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <limits.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdint.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stddef.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <ohash.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <err.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <readpassphrase.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <util.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sha2.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "crypto_api.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "signify.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SIGBYTES crypto_sign_ed25519_BYTES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SECRETBYTES crypto_sign_ed25519_SECRETKEYBYTES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define PUBLICBYTES crypto_sign_ed25519_PUBLICKEYBYTES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define PKALG "Ed"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define KDFALG "BK"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define KEYNUMLEN 8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define COMMENTHDR "untrusted comment: "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define COMMENTHDRLEN 19
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define COMMENTMAXLEN 1024
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define VERIFYWITH "verify with "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct enckey {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t pkalg[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t kdfalg[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint32_t kdfrounds;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t salt[16];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t checksum[8];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t keynum[KEYNUMLEN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t seckey[SECRETBYTES];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct pubkey {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t pkalg[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t keynum[KEYNUMLEN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t pubkey[PUBLICBYTES];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct sig {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t pkalg[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t keynum[KEYNUMLEN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t sig[SIGBYTES];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void __dead
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+usage(const char *error)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (error)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fprintf(stderr, "%s\n", error);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fprintf(stderr, "usage:"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef VERIFYONLY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "\t%1$s -C [-q] [-p pubkey] [-t keytype] -x sigfile [file ...]\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "\t%1$s -G [-n] [-c comment] -p pubkey -s seckey\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "\t%1$s -S [-enz] [-x sigfile] -s seckey -m message\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "\t%1$s -V [-eqz] [-p pubkey] [-t keytype] [-x sigfile] -m message\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ getprogname());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ exit(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+xopen(const char *fname, int oflags, mode_t mode)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct stat sb;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int fd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strcmp(fname, "-") == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((oflags & O_WRONLY))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fd = dup(STDOUT_FILENO);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fd = dup(STDIN_FILENO);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fd == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "dup failed");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fd = open(fname, oflags, mode);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fd == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "can't open %s for %s", fname,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (oflags & O_WRONLY) ? "writing" : "reading");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fstat(fd, &sb) == -1 || S_ISDIR(sb.st_mode))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "not a valid file: %s", fname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return fd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+xmalloc(size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void *p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!(p = malloc(len)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "malloc %zu", len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static size_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+parseb64file(const char *filename, char *b64, void *buf, size_t buflen,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *comment)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *commentend, *b64end;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ commentend = strchr(b64, '\n');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!commentend || commentend - b64 <= COMMENTHDRLEN ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcmp(b64, COMMENTHDR, COMMENTHDRLEN) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "invalid comment in %s; must start with '%s'",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ filename, COMMENTHDR);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *commentend = '\0';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (comment) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strlcpy(comment, b64 + COMMENTHDRLEN,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ COMMENTMAXLEN) >= COMMENTMAXLEN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "comment too long");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!(b64end = strchr(commentend + 1, '\n')))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "missing new line after base64 in %s", filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *b64end = '\0';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (b64_pton(commentend + 1, buf, buflen) != buflen)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "unable to parse %s", filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (memcmp(buf, PKALG, 2) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "unsupported file %s", filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *commentend = '\n';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *b64end = '\n';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return b64end - b64 + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+readb64file(const char *filename, void *buf, size_t buflen, char *comment)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char b64[2048];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int rv, fd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fd = xopen(filename, O_RDONLY | O_NOFOLLOW, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((rv = read(fd, b64, sizeof(b64) - 1)) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "read from %s", filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ b64[rv] = '\0';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ parseb64file(filename, b64, buf, buflen, comment);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(b64, sizeof(b64));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static uint8_t *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+readmsg(const char *filename, unsigned long long *msglenp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long msglen = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *msg = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct stat sb;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ssize_t x, space;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int fd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const unsigned long long maxmsgsize = 1UL << 30;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fd = xopen(filename, O_RDONLY | O_NOFOLLOW, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fstat(fd, &sb) == 0 && S_ISREG(sb.st_mode)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (sb.st_size > maxmsgsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "msg too large in %s", filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ space = sb.st_size + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ space = 64 * 1024 - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ msg = xmalloc(space + 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (space == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (msglen * 2 > maxmsgsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "msg too large in %s", filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ space = msglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!(msg = realloc(msg, msglen + space + 1)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "realloc");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((x = read(fd, msg + msglen, space)) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "read from %s", filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (x == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ space -= x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ msglen += x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ msg[msglen] = '\0';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *msglenp = msglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return msg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+writeall(int fd, const void *buf, size_t buflen, const char *filename)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ssize_t x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (buflen != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((x = write(fd, buf, buflen)) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "write to %s", filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buflen -= x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf = (char *)buf + x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef VERIFYONLY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+createheader(const char *comment, const void *buf, size_t buflen)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *header;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char b64[1024];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (b64_ntop(buf, buflen, b64, sizeof(b64)) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "base64 encode failed");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (asprintf(&header, "%s%s\n%s\n", COMMENTHDR, comment, b64) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "asprintf failed");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(b64, sizeof(b64));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return header;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+writekeyfile(const char *filename, const char *comment, const void *buf,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t buflen, int oflags, mode_t mode)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *header;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int fd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fd = xopen(filename, O_CREAT|oflags|O_NOFOLLOW|O_WRONLY, mode);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ header = createheader(comment, buf, buflen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ writeall(fd, header, strlen(header), filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ freezero(header, strlen(header));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+kdf(uint8_t *salt, size_t saltlen, int rounds, int allowstdin, int confirm,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *key, size_t keylen)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char pass[1024];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int rppflags = RPP_ECHO_OFF;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *errstr = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (rounds == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memset(key, 0, keylen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (allowstdin && !isatty(STDIN_FILENO))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rppflags |= RPP_STDIN;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!readpassphrase("passphrase: ", pass, sizeof(pass), rppflags))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "unable to read passphrase");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strlen(pass) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "please provide a password");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (confirm && !(rppflags & RPP_STDIN)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char pass2[1024];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!readpassphrase("confirm passphrase: ", pass2,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sizeof(pass2), rppflags))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errstr = "unable to read passphrase";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!errstr && strcmp(pass, pass2) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errstr = "passwords don't match";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(pass2, sizeof(pass2));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!errstr && bcrypt_pbkdf(pass, strlen(pass), salt, saltlen, key,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ keylen, rounds) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errstr = "bcrypt pbkdf";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(pass, sizeof(pass));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (errstr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "%s", errstr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+signmsg(uint8_t *seckey, uint8_t *msg, unsigned long long msglen,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *sig)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long siglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *sigbuf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sigbuf = xmalloc(msglen + SIGBYTES);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_sign_ed25519(sigbuf, &siglen, msg, msglen, seckey);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(sig, sigbuf, SIGBYTES);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(sigbuf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+generate(const char *pubkeyfile, const char *seckeyfile, int rounds,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *comment)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t digest[SHA512_DIGEST_LENGTH];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct pubkey pubkey;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct enckey enckey;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t xorkey[sizeof(enckey.seckey)];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t keynum[KEYNUMLEN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char commentbuf[COMMENTMAXLEN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA2_CTX ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i, nr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto_sign_ed25519_keypair(pubkey.pubkey, enckey.seckey);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ arc4random_buf(keynum, sizeof(keynum));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Init(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Update(&ctx, enckey.seckey, sizeof(enckey.seckey));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Final(digest, &ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(enckey.pkalg, PKALG, 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(enckey.kdfalg, KDFALG, 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ enckey.kdfrounds = htonl(rounds);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(enckey.keynum, keynum, KEYNUMLEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ arc4random_buf(enckey.salt, sizeof(enckey.salt));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ kdf(enckey.salt, sizeof(enckey.salt), rounds, 1, 1, xorkey, sizeof(xorkey));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(enckey.checksum, digest, sizeof(enckey.checksum));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < sizeof(enckey.seckey); i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ enckey.seckey[i] ^= xorkey[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(digest, sizeof(digest));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(xorkey, sizeof(xorkey));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ nr = snprintf(commentbuf, sizeof(commentbuf), "%s secret key", comment);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (nr < 0 || nr >= sizeof(commentbuf))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "comment too long");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ writekeyfile(seckeyfile, commentbuf, &enckey,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sizeof(enckey), O_EXCL, 0600);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(&enckey, sizeof(enckey));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(pubkey.pkalg, PKALG, 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(pubkey.keynum, keynum, KEYNUMLEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ nr = snprintf(commentbuf, sizeof(commentbuf), "%s public key", comment);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (nr < 0 || nr >= sizeof(commentbuf))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "comment too long");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ writekeyfile(pubkeyfile, commentbuf, &pubkey,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sizeof(pubkey), O_EXCL, 0666);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static const char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+check_keyname_compliance(const char *pubkeyfile, const char *seckeyfile)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *pos;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t len;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* basename may or may not modify input */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pos = strrchr(seckeyfile, '/');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pos != NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ seckeyfile = pos + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ len = strlen(seckeyfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len < 5) /* ?.key */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ goto bad;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strcmp(seckeyfile + len - 4, ".sec") != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ goto bad;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pubkeyfile != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pos = strrchr(pubkeyfile, '/');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pos != NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pubkeyfile = pos + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strlen(pubkeyfile) != len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ goto bad;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strcmp(pubkeyfile + len - 4, ".pub") != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ goto bad;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strncmp(pubkeyfile, seckeyfile, len - 4) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ goto bad;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return seckeyfile;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+bad:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "please use naming scheme of keyname.pub and keyname.sec");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+uint8_t *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+createsig(const char *seckeyfile, const char *msgfile, uint8_t *msg,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long msglen)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct enckey enckey;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t xorkey[sizeof(enckey.seckey)];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct sig sig;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *sighdr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t digest[SHA512_DIGEST_LENGTH];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i, nr, rounds;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA2_CTX ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char comment[COMMENTMAXLEN], sigcomment[COMMENTMAXLEN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ readb64file(seckeyfile, &enckey, sizeof(enckey), comment);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strcmp(seckeyfile, "-") == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ nr = snprintf(sigcomment, sizeof(sigcomment),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "signature from %s", comment);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *keyname = check_keyname_compliance(NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ seckeyfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ nr = snprintf(sigcomment, sizeof(sigcomment),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VERIFYWITH "%.*s.pub", (int)strlen(keyname) - 4, keyname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (nr < 0 || nr >= sizeof(sigcomment))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "comment too long");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (memcmp(enckey.kdfalg, KDFALG, 2) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "unsupported KDF");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rounds = ntohl(enckey.kdfrounds);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ kdf(enckey.salt, sizeof(enckey.salt), rounds, strcmp(msgfile, "-") != 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0, xorkey, sizeof(xorkey));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < sizeof(enckey.seckey); i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ enckey.seckey[i] ^= xorkey[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(xorkey, sizeof(xorkey));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Init(&ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Update(&ctx, enckey.seckey, sizeof(enckey.seckey));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512Final(digest, &ctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (memcmp(enckey.checksum, digest, sizeof(enckey.checksum)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "incorrect passphrase");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(digest, sizeof(digest));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ signmsg(enckey.seckey, msg, msglen, sig.sig);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(sig.keynum, enckey.keynum, KEYNUMLEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explicit_bzero(&enckey, sizeof(enckey));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(sig.pkalg, PKALG, 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sighdr = createheader(sigcomment, &sig, sizeof(sig));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return sighdr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+sign(const char *seckeyfile, const char *msgfile, const char *sigfile,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int embedded)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *msg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *sighdr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int fd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long msglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ msg = readmsg(msgfile, &msglen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sighdr = createsig(seckeyfile, msgfile, msg, msglen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fd = xopen(sigfile, O_CREAT|O_TRUNC|O_NOFOLLOW|O_WRONLY, 0666);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ writeall(fd, sighdr, strlen(sighdr), sigfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(sighdr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (embedded)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ writeall(fd, msg, msglen, sigfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+verifymsg(struct pubkey *pubkey, uint8_t *msg, unsigned long long msglen,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct sig *sig, int quiet)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *sigbuf, *dummybuf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long siglen, dummylen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (memcmp(pubkey->keynum, sig->keynum, KEYNUMLEN) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "verification failed: checked against wrong key");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ siglen = SIGBYTES + msglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sigbuf = xmalloc(siglen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dummybuf = xmalloc(siglen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(sigbuf, sig->sig, SIGBYTES);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(sigbuf + SIGBYTES, msg, msglen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (crypto_sign_ed25519_open(dummybuf, &dummylen, sigbuf, siglen,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pubkey->pubkey) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "signature verification failed");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!quiet)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("Signature Verified\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(sigbuf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(dummybuf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+check_keytype(const char *pubkeyfile, const char *keytype)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t typelen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!(p = strrchr(pubkeyfile, '-')))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ goto bad;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ p++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ typelen = strlen(keytype);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strncmp(p, keytype, typelen) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ goto bad;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strcmp(p + typelen, ".pub") != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ goto bad;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+bad:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "incorrect keytype: %s is not %s", pubkeyfile, keytype);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+readpubkey(const char *pubkeyfile, struct pubkey *pubkey,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *sigcomment, const char *keytype)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *safepath = "/etc/signify";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char keypath[PATH_MAX];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!pubkeyfile) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pubkeyfile = strstr(sigcomment, VERIFYWITH);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pubkeyfile && strchr(pubkeyfile, '/') == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pubkeyfile += strlen(VERIFYWITH);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (keytype)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ check_keytype(pubkeyfile, keytype);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (snprintf(keypath, sizeof(keypath), "%s/%s",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ safepath, pubkeyfile) >= sizeof(keypath))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "name too long %s", pubkeyfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pubkeyfile = keypath;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage("must specify pubkey");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ readb64file(pubkeyfile, pubkey, sizeof(*pubkey), NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+verifysimple(const char *pubkeyfile, const char *msgfile, const char *sigfile,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int quiet, const char *keytype)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char sigcomment[COMMENTMAXLEN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct sig sig;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct pubkey pubkey;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long msglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *msg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ msg = readmsg(msgfile, &msglen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ readb64file(sigfile, &sig, sizeof(sig), sigcomment);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ readpubkey(pubkeyfile, &pubkey, sigcomment, keytype);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ verifymsg(&pubkey, msg, msglen, &sig, quiet);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static uint8_t *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+verifyembedded(const char *pubkeyfile, const char *sigfile,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int quiet, unsigned long long *msglenp, const char *keytype)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char sigcomment[COMMENTMAXLEN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct sig sig;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct pubkey pubkey;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long msglen, siglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *msg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ msg = readmsg(sigfile, &msglen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ siglen = parseb64file(sigfile, msg, &sig, sizeof(sig), sigcomment);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ readpubkey(pubkeyfile, &pubkey, sigcomment, keytype);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ msglen -= siglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memmove(msg, msg + siglen, msglen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ msg[msglen] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ verifymsg(&pubkey, msg, msglen, &sig, quiet);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *msglenp = msglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return msg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+verify(const char *pubkeyfile, const char *msgfile, const char *sigfile,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int embedded, int quiet, const char *keytype)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long msglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *msg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int fd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (embedded) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ msg = verifyembedded(pubkeyfile, sigfile, quiet, &msglen,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ keytype);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fd = xopen(msgfile, O_CREAT|O_TRUNC|O_NOFOLLOW|O_WRONLY, 0666);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ writeall(fd, msg, msglen, msgfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ verifysimple(pubkeyfile, msgfile, sigfile, quiet, keytype);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef VERIFYONLY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define HASHBUFSIZE 224
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct checksum {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char file[PATH_MAX];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char hash[HASHBUFSIZE];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char algo[32];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ecalloc(size_t s1, size_t s2, void *data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void *p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!(p = calloc(s1, s2)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "calloc");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+efree(void *p, void *data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+recodehash(char *hash, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t data[HASHBUFSIZE / 2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i, rv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strlen(hash) == len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((rv = b64_pton(hash, data, sizeof(data))) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "invalid base64 encoding");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < rv; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ snprintf(hash + i * 2, HASHBUFSIZE - i * 2, "%2.2x", data[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+verifychecksum(struct checksum *c, int quiet)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char buf[HASHBUFSIZE];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strcmp(c->algo, "SHA256") == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ recodehash(c->hash, SHA256_DIGEST_STRING_LENGTH-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!SHA256File(c->file, buf))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else if (strcmp(c->algo, "SHA512") == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ recodehash(c->hash, SHA512_DIGEST_STRING_LENGTH-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!SHA512File(c->file, buf))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "can't handle algorithm %s", c->algo);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strcmp(c->hash, buf) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!quiet)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("%s: OK\n", c->file);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+verifychecksums(char *msg, int argc, char **argv, int quiet)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct ohash_info info = { 0, NULL, ecalloc, efree, NULL };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct ohash myh;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct checksum c;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *e, *line, *endline;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int hasfailed = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int i, rv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned int slot;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ohash_init(&myh, 6, &info);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (argc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (i = 0; i < argc; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ slot = ohash_qlookup(&myh, argv[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ e = ohash_find(&myh, slot);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (e == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ohash_insert(&myh, slot, argv[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ line = msg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (line && *line) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((endline = strchr(line, '\n')))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *endline++ = '\0';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if PATH_MAX < 1024 || HASHBUFSIZE < 224
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#error sizes are wrong
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rv = sscanf(line, "%31s (%1023[^)]) = %223s",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ c.algo, c.file, c.hash);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (rv != 3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "unable to parse checksum line %s", line);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ line = endline;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (argc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ slot = ohash_qlookup(&myh, c.file);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ e = ohash_find(&myh, slot);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (e != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (verifychecksum(&c, quiet) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ohash_remove(&myh, slot);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (verifychecksum(&c, quiet) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ slot = ohash_qlookup(&myh, c.file);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ e = ohash_find(&myh, slot);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (e == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!(e = strdup(c.file)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "strdup");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ohash_insert(&myh, slot, e);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for (e = ohash_first(&myh, &slot); e != NULL; e = ohash_next(&myh, &slot)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fprintf(stderr, "%s: FAIL\n", e);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ hasfailed = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (argc == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(e);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ohash_delete(&myh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (hasfailed)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ exit(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+check(const char *pubkeyfile, const char *sigfile, const char *keytype,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int quiet, int argc, char **argv)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long msglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *msg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ msg = verifyembedded(pubkeyfile, sigfile, quiet, &msglen, keytype);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ verifychecksums((char *)msg, argc, argv, quiet);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+verifyzdata(uint8_t *zdata, unsigned long long zdatalen,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *filename, const char *pubkeyfile, const char *keytype)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct sig sig;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char sigcomment[COMMENTMAXLEN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long siglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct pubkey pubkey;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (zdatalen < sizeof(sig))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "signature too short in %s", filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ siglen = parseb64file(filename, zdata, &sig, sizeof(sig),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sigcomment);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ readpubkey(pubkeyfile, &pubkey, sigcomment, keytype);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ zdata += siglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ zdatalen -= siglen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ verifymsg(&pubkey, zdata, zdatalen, &sig, 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return zdata;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+main(int argc, char **argv)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *pubkeyfile = NULL, *msgfile = NULL, *sigfile = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char sigfilebuf[PATH_MAX];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *keytype = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef VERIFYONLY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *seckeyfile = NULL, *comment = "signify";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int none = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int ch;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int embedded = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int quiet = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int gzip = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ enum {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NONE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CHECK,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ GENERATE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SIGN,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VERIFY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } verb = NONE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pledge("stdio rpath wpath cpath tty", NULL) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "pledge");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while ((ch = getopt(argc, argv, "CGSVzc:em:np:qs:t:x:")) != -1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ switch (ch) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef VERIFYONLY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 'C':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (verb)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage(NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ verb = CHECK;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 'G':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (verb)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage(NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ verb = GENERATE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 'S':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (verb)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage(NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ verb = SIGN;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 'c':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ comment = optarg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 'n':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ none = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 's':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ seckeyfile = optarg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 'z':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ gzip = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 'V':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (verb)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage(NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ verb = VERIFY;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 'e':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ embedded = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 'm':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ msgfile = optarg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 'p':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pubkeyfile = optarg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 'q':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ quiet = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 't':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ keytype = optarg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 'x':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sigfile = optarg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage(NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ argc -= optind;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ argv += optind;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (embedded && gzip)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "can't combine -e and -z options");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (setvbuf(stdout, NULL, _IOLBF, 0) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "setvbuf");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef VERIFYONLY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (verb == CHECK) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pledge("stdio rpath", NULL) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "pledge");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!sigfile)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage("must specify sigfile");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ check(pubkeyfile, sigfile, keytype, quiet, argc, argv);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (argc != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage(NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!sigfile && msgfile) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int nr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strcmp(msgfile, "-") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage("must specify sigfile with - message");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ nr = snprintf(sigfilebuf, sizeof(sigfilebuf),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "%s.sig", msgfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (nr < 0 || nr >= sizeof(sigfilebuf))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "path too long");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sigfile = sigfilebuf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ switch (verb) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef VERIFYONLY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case GENERATE:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* no pledge */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!pubkeyfile || !seckeyfile)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage("must specify pubkey and seckey");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ check_keyname_compliance(pubkeyfile, seckeyfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ generate(pubkeyfile, seckeyfile, none ? 0 : 42, comment);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case SIGN:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* no pledge */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (gzip) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!msgfile || !seckeyfile || !sigfile)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage("must specify message sigfile seckey");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ zsign(seckeyfile, msgfile, sigfile, none);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!msgfile || !seckeyfile)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage("must specify message and seckey");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sign(seckeyfile, msgfile, sigfile, embedded);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case VERIFY:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((embedded || gzip) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (msgfile && strcmp(msgfile, "-") != 0)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* will need to create output file */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pledge("stdio rpath wpath cpath", NULL) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "pledge");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pledge("stdio rpath", NULL) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "pledge");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (gzip) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ zverify(pubkeyfile, msgfile, sigfile, keytype);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!msgfile)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage("must specify message");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ verify(pubkeyfile, msgfile, sigfile, embedded,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ quiet, keytype);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pledge("stdio", NULL) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "pledge");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ usage(NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/signify.h b/vendor/signify-osx/src/usr.bin/signify/signify.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..db7df8f07
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/signify.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,33 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: signify.h,v 1.2 2019/03/23 07:10:06 tedu Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2016 Marc Espie <espie@openbsd.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* common interface to signify.c/zsig.c */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef signify_h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define signify_h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern void zverify(const char *, const char *, const char *, const char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern void zsign(const char *, const char *, const char *, int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern void *xmalloc(size_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern void writeall(int, const void *, size_t, const char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern int xopen(const char *, int, mode_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern void *verifyzdata(uint8_t *, unsigned long long,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *, const char *, const char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern uint8_t *createsig(const char *, const char *, uint8_t *,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/vendor/signify-osx/src/usr.bin/signify/zsig.c b/vendor/signify-osx/src/usr.bin/signify/zsig.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 000000000..ca76b5c6c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/vendor/signify-osx/src/usr.bin/signify/zsig.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,319 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* $OpenBSD: zsig.c,v 1.19 2023/04/29 10:08:18 espie Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2016 Marc Espie <espie@openbsd.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef VERIFYONLY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdint.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <err.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sha2.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/stat.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <time.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "signify.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct gzheader {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t flg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint32_t mtime;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t xflg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t os;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *name;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *comment;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *endcomment;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unsigned long long headerlength;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *buffer;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define FTEXT_FLAG 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define FHCRC_FLAG 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define FEXTRA_FLAG 4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define FNAME_FLAG 8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define FCOMMENT_FLAG 16
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define GZHEADERLENGTH 10
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define MYBUFSIZE 65536LU
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static uint8_t fake[10] = { 0x1f, 0x8b, 8, FCOMMENT_FLAG, 0, 0, 0, 0, 0, 3 };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static uint8_t *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+readgz_header(struct gzheader *h, int fd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t sz = 1023;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t pos = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t len = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int state = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ssize_t n;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *buf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf = xmalloc(sz);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len == sz) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sz *= 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buf = realloc(buf, sz);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "realloc");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ n = read(fd, buf+len, sz-len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (n == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "read");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* incomplete info */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (n == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "gzheader truncated");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ len += n;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->comment = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->name = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ switch(state) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 0: /* check header proper */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* need ten bytes */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (len < GZHEADERLENGTH)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->flg = buf[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->mtime = buf[4] | (buf[5] << 8U) | (buf[6] << 16U) |
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (buf[7] << 24U);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->xflg = buf[8];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->os = buf[9];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* magic gzip header */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (buf[0] != 0x1f || buf[1] != 0x8b || buf[2] != 8)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "invalid magic in gzheader");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* XXX special code that only caters to our needs */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (h->flg & ~ (FCOMMENT_FLAG | FNAME_FLAG))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "invalid flags in gzheader");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pos = GZHEADERLENGTH;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*FALLTHRU*/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 1:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (h->flg & FNAME_FLAG) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ p = memchr(buf+pos, 0, len - pos);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pos = (p - buf) + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ state++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*FALLTHRU*/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case 2:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (h->flg & FCOMMENT_FLAG) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ p = memchr(buf+pos, 0, len - pos);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->comment = buf + pos;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->endcomment = p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pos = (p - buf) + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (h->flg & FNAME_FLAG)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->name = buf + GZHEADERLENGTH;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->headerlength = pos;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ h->buffer = buf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return buf + len;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+copy_blocks(int fdout, int fdin, const char *sha, const char *endsha,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t bufsize, uint8_t *bufend)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *buffer;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *residual;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t output[SHA512_256_DIGEST_STRING_LENGTH];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buffer = xmalloc(bufsize);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ residual = (uint8_t *)endsha + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* get the next block */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t n = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* if we have residual data, we use it */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (residual != bufend) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* how much can we copy */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t len = bufend - residual;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ n = len >= bufsize ? bufsize : len;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memcpy(buffer, residual, n);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ residual += n;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* if we're not done yet, try to obtain more until EOF */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (n != bufsize) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ssize_t more = read(fdin, buffer+n, bufsize-n);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (more == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "read");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ n += more;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (more == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (n == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512_256Data(buffer, n, output);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (endsha - sha < SHA512_256_DIGEST_STRING_LENGTH-1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(4, "signature truncated");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (memcmp(output, sha, SHA512_256_DIGEST_STRING_LENGTH-1) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(4, "signature mismatch");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (sha[SHA512_256_DIGEST_STRING_LENGTH-1] != '\n')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(4, "signature mismatch");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha += SHA512_256_DIGEST_STRING_LENGTH;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ writeall(fdout, buffer, n, "stdout");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (n != bufsize)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (endsha != sha)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(4, "file truncated");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+zverify(const char *pubkeyfile, const char *msgfile, const char *sigfile,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *keytype)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct gzheader h;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t bufsize, len;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *bufend;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int fdin, fdout;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* by default, verification will love pipes */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!sigfile)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sigfile = "-";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!msgfile)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ msgfile = "-";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fdin = xopen(sigfile, O_RDONLY | O_NOFOLLOW, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bufend = readgz_header(&h, fdin);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!(h.flg & FCOMMENT_FLAG))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "unsigned gzip archive");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fake[8] = h.xflg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ len = h.endcomment-h.comment;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ p = verifyzdata(h.comment, len, sigfile,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pubkeyfile, keytype);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bufsize = MYBUFSIZE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BEGINS_WITH(x, y) memcmp((x), (y), sizeof(y)-1) == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (BEGINS_WITH(p, "algorithm=SHA512/256") ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BEGINS_WITH(p, "date=") ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BEGINS_WITH(p, "key=") ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sscanf(p, "blocksize=%zu\n", &bufsize) > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (*(p++) != '\n')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (*p != '\n')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "invalid signature");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fdout = xopen(msgfile, O_CREAT|O_TRUNC|O_NOFOLLOW|O_WRONLY, 0666);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ writeall(fdout, fake, sizeof fake, msgfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ writeall(fdout, h.comment, len+1, msgfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *(p++) = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ copy_blocks(fdout, fdin, p, h.endcomment, bufsize, bufend);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(h.buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fdout);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fdin);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+zsign(const char *seckeyfile, const char *msgfile, const char *sigfile,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int skipdate)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t bufsize = MYBUFSIZE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int fdin, fdout;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct gzheader h;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct stat sb;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t space;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *msg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *buffer;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint8_t *sighdr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char date[80];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ time_t clock;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fdin = xopen(msgfile, O_RDONLY, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fstat(fdin, &sb) == -1 || !S_ISREG(sb.st_mode))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "Sorry can only sign regular files");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ readgz_header(&h, fdin);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* we don't care about the header, actually */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(h.buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (lseek(fdin, h.headerlength, SEEK_SET) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "seek in %s", msgfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ space = (sb.st_size / MYBUFSIZE+1) * SHA512_256_DIGEST_STRING_LENGTH +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1024; /* long enough for extra header information */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ msg = xmalloc(space);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ buffer = xmalloc(bufsize);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (skipdate) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clock = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ time(&clock);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ strftime(date, sizeof date, "%Y-%m-%dT%H:%M:%SZ", gmtime(&clock));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ snprintf(msg, space,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "date=%s\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "key=%s\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "algorithm=SHA512/256\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "blocksize=%zu\n\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ date, seckeyfile, bufsize);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ p = strchr(msg, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t n = read(fdin, buffer, bufsize);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (n == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "read from %s", msgfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (n == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SHA512_256Data(buffer, n, p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ p += SHA512_256_DIGEST_STRING_LENGTH;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ p[-1] = '\n';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (msg + space < p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errx(1, "file too long %s", msgfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *p = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fdout = xopen(sigfile, O_CREAT|O_TRUNC|O_NOFOLLOW|O_WRONLY, 0666);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sighdr = createsig(seckeyfile, msgfile, msg, p-msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fake[8] = h.xflg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ writeall(fdout, fake, sizeof fake, sigfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ writeall(fdout, sighdr, strlen(sighdr), sigfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(sighdr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* need the 0 ! */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ writeall(fdout, msg, p - msg + 1, sigfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (lseek(fdin, h.headerlength, SEEK_SET) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "seek in %s", msgfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t n = read(fdin, buffer, bufsize);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (n == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ err(1, "read from %s", msgfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (n == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ writeall(fdout, buffer, n, sigfile);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close(fdout);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span></pre><pre style='margin:0'>
</pre>