diff options
Diffstat (limited to 'tests/openpgp')
230 files changed, 20003 insertions, 0 deletions
diff --git a/tests/openpgp/4gb-packet.asc b/tests/openpgp/4gb-packet.asc Binary files differnew file mode 100644 index 0000000..7e5d6f3 --- /dev/null +++ b/tests/openpgp/4gb-packet.asc diff --git a/tests/openpgp/4gb-packet.scm b/tests/openpgp/4gb-packet.scm new file mode 100755 index 0000000..e1c5ba5 --- /dev/null +++ b/tests/openpgp/4gb-packet.scm @@ -0,0 +1,29 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +;; GnuPG through 2.1.7 would incorrect mark packets whose size is +;; 2^32-1 as invalid and exit with status code 2. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-environment) + +(unless (have-compression-algo? "BZIP2") + (skip "BZIP2 support not compiled in.")) + +(call-check `(,@GPG --list-packets ,(in-srcdir "tests" "openpgp" "4gb-packet.asc"))) diff --git a/tests/openpgp/ChangeLog-2011 b/tests/openpgp/ChangeLog-2011 new file mode 100644 index 0000000..4013a08 --- /dev/null +++ b/tests/openpgp/ChangeLog-2011 @@ -0,0 +1,424 @@ +2011-12-01 Werner Koch <wk@g10code.com> + + NB: ChangeLog files are no longer manually maintained. Starting + on December 1st, 2011 we put change information only in the GIT + commit log, and generate a top-level ChangeLog file from logs at + "make dist". See doc/HACKING for details. + +2011-02-10 Werner Koch <wk@g10code.com> + + * ecc.test: New. + * pinentry.sh: New. + * defs.inc: Do not create a log when running tests with envvar + verbose > 1. Add pinentry-program to gpg-agent.conf. + * Makefile.am (sample_keys): New. + (EXTRA_DIST): Add them. + +2010-10-15 Werner Koch <wk@g10code.com> + + * Makefile.am (clean-local): New. + +2010-10-14 Werner Koch <wk@g10code.com> + + * genkey1024.test: Use the new no-protection option. + + * decrypt-dsa.test: Do not specify an extra keyring. The keyring + has been loaded into pubring.gpg. + * sigs-dsa.test: Ditto. + * encrypt-dsa.test: Ditto. + * signencrypt-dsa.test: Ditto. + + * decrypt.test: Remove passphrase stuff. + * sigs.test: Ditto. + + * privkeys/: New. + + * Makefile.am: Move most stuff to ... + * version.test: Prepare data files etc. + * finish.test: New. + * defs.inc: Set all envvars. + (usrname1, usrname2, username3): Use full mail address. + +2010-06-07 Werner Koch <wk@g10code.com> + + * Makefile.am (TESTS_ENVIRONMENT): New. Start all scripts under + the control of the gpg-agent. + (prepared.stamp): Create gpg-agent.conf. + * defs.inc: Do not create gpg-agent.conf + (GNUPGHOME): Check that it is set properly. + (GPG_AGENT_INFO): Do not change. + +2010-05-12 Werner Koch <wk@g10code.com> + + * armor.test (Version): Add test for bug#1179. + +2010-05-11 Werner Koch <wk@g10code.com> + + * genkey1024.test: Use GPG macro. + + * gpg-agent.conf.tmpl: New. + * defs.inc: Create gpg-agent.conf + (GNUPGHOME): Set and export. + (GPG_AGENT_INFO): Unset. + * Makefile.am (CLEANFILES): Add S.gpg-agent + +2010-05-07 Werner Koch <wk@g10code.com> + + * import.test: Add test case for bug#1223. + * bug1223-good.asc, bug1223-bogus.asc: New. + +2009-12-21 Werner Koch <wk@g10code.com> + + * Makefile.am (required_pgms): New. + (./gpg_dearmor): Depend on them. + +2009-06-05 David Shaw <dshaw@jabberwocky.com> + + * defs.inc: Improved all_cipher_algos and all_hash_algos to work + when there are more than one line of algorithms. From 1.4. + +2009-04-19 Werner Koch <wk@g10code.com> + + * mkdemodirs (GPG): Use --no-options. + +2008-09-29 Werner Koch <wk@g10code.com> + + * clearsig.test: Replace -sat by --clearsign. + +2008-03-19 Werner Koch <wk@g10code.com> + + * import.test, bug894-test.asc: New. + +2007-12-14 Werner Koch <wk@g10code.com> + + * Makefile.am (./gpg_dearmor): Reverted last change because the + real fix is to --no-options. + +2007-11-22 Werner Koch <wk@g10code.com> + + * Makefile.am (./gpg_dearmor): Add --homedir so that we don't + auto create a ~/.gnupg/. From Gentoo. + +2007-10-25 Werner Koch <wk@g10code.com> + + Add missing copyright notices to *.test. + +2007-10-25 David Shaw <dshaw@jabberwocky.com> (wk) + + From 1.4 (July): + + * defs.inc (all_cipher_algos): New function to return all ciphers. + * defs.inc (all_cipher_algos): New function to return all ciphers + we support. This is safer than the previous setup which could + hide that some ciphers weren't being tested. Plus, this + automatically tests any new ciphers libgcrypt supports. + (all_hash_algos): New. + * sigs.test: Use it here, and also test with >=160 bit hashes for + DSA2. + * conventional.test, encrypt.test, encrypt-dsa.test, + * conventional-mdc.test: Use it here. + +2007-05-02 David Shaw <dshaw@jabberwocky.com> + + * conventional.test, encrypt.test, encrypt-dsa.test, + conventional-mdc.test: Fix some broken tests that were only + testing 3DES instead of all available ciphers. + +2007-03-04 David Shaw <dshaw@jabberwocky.com> (wk) + + * verify.test: Use --allow-multiple-messages instead of + --allow-multisig-verification. Two clearsigs in a row counds as a + multiple-message test. + +2006-11-16 Werner Koch <wk@g10code.com> + + * Makefile.am (plain-large): Use gpg.texi instead of FAQ which + won't be found as it is not a source file. Pointed out by Moritz. + +2006-10-04 Werner Koch <wk@g10code.com> + + * signencrypt.test: Need to prepend srcdir to the file name + +2006-09-27 Werner Koch <wk@g10code.com> + + * signencrypt.test: Add a test for bug 537. + * bug537-test.data.asc: New. Taken from the BTS. + +2006-08-21 Werner Koch <wk@g10code.com> + + Copied tests from 1.4 and adjusted paths. + +2006-04-19 David Shaw <dshaw@jabberwocky.com> + + * sigs.test, mds.test: Add tests for SHA-224, SHA-384, and + SHA-512. + +2006-04-11 Werner Koch <wk@g10code.com> + + * armor.test: New. + +2006-03-09 Werner Koch <wk@g10code.com> + + * defs.inc: Removed Basishm by proper redirection. + +2006-03-06 Werner Koch <wk@g10code.com> + + * defs.inc: Print error messages also to stderr. Allow for + verbose environment variable. + (linefeed): New. + (suspend_error, resume_error): New. + * verify.test: More tests. + * multisig.test: Better error printing. + (sig_1ls1ls_valid, sig_ls_valid): Moved to the non-valid group. + +2006-02-14 Werner Koch <wk@gnupg.org> + + * verify.test: New. + +2005-06-21 Werner Koch <wk@g10code.com> + + * conventional.test (algos): Uhh ohh, cut+paste error and not + tested. + +2005-06-02 Werner Koch <wk@g10code.com> + + * conventional.test: have_cipher_algo now requires uppercase + algorithm names. Changed. Noted by John R. Shannon. + +2004-02-09 David Shaw <dshaw@jabberwocky.com> + + * clearsig.test, sigs.test: Properly detect RSA being missing, and + use the proper key for doing an RSA test. + +2003-12-31 David Shaw <dshaw@jabberwocky.com> + + * clearsig.test, conventional-mdc.test, conventional.test, + defs.inc, encrypt-dsa.test, encrypt.test, genkey1024.test, + plain-1.asc, plain-1-pgp.asc, plain-2.asc, plain-3.asc, + pubring.asc, secring.asc, sigs.test: Rework tests to work properly + with a gpg binary that doesn't have all ciphers and all pk algos. + Basically, we test for the ciphers we have, only test signing with + non-160-bit hashes with RSA (we test all hashes as hashes). Test + all key lengths of AES. + +2003-12-05 David Shaw <dshaw@jabberwocky.com> + + * Makefile.am: Reenable tests now that the Elgamal signature keys + are gone. + + * defs.inc, pubring.asc, secring.asc, plain-1.asc, plain-2.asc, + plain-3.asc: Remove the old v3 Elgamal keys and replace with + RSA+Elgamal and RSA s+e. + +2003-12-03 David Shaw <dshaw@jabberwocky.com> + + * options: Remove emulate-md-encode-bug. + +2003-11-27 Werner Koch <wk@gnupg.org> + + * Makefile.am (TESTS): Temporary remove tests using ElG signatures. + +2003-09-04 David Shaw <dshaw@jabberwocky.com> + + * mds.test, sigs.test: Remove TIGER/192 and make SHA-256 optional + (since it might not be compiled in). + +2003-07-10 David Shaw <dshaw@jabberwocky.com> + + * Makefile.am: Add --no-permission-warning to avoid spurious + warning when importing demo keys. + +2003-05-27 Werner Koch <wk@gnupg.org> + + * Makefile.am (CLEANFILES): Add gpg.conf + +2003-05-26 David Shaw <dshaw@jabberwocky.com> + + * defs.inc (pgmname): Make sure there is a valid options + file. (From wk on stable branch) + + * mds.test: Note that missing algorithms are not errors. + +2003-04-23 David Shaw <dshaw@jabberwocky.com> + + * Makefile.am, options.in: Rename options.in to options since it + no longer needs to be a generated file. + + * sigs.test: TODO note to add the new SHAs when we start + generating them. + + * mds.test: Test the new SHAs. + +2002-05-10 Werner Koch <wk@gnupg.org> + + * Makefile.am: Add gpg_dearmor to all targets where it is used. + Noted by Andreas Haumer. + +2002-04-19 Werner Koch <wk@gnupg.org> + + * signencrypt-dsa.test, sigs-dsa.test: Don't check with MD5 as + this is not valid with DSA signatures. + +2001-12-22 Werner Koch <wk@gnupg.org> + + * options.in: Add no-permission-warning. + +2001-12-21 Werner Koch <wk@gnupg.org> + + * Makefile.am (distclean-local): prefix mkdemodirs with srcdir + (DISTCLEANFILES): Add random_seed. + +2001-12-19 Werner Koch <wk@gnupg.org> + + * options.in: Remove load-extension tiger + * Makefile.am (./options): append it if there is such a module. + +2001-10-23 Werner Koch <wk@gnupg.org> + + * defs.inc, Makefile.am: Do not use $srcdir when invoking gpg. + Write the logfile to the current directory. + +2001-09-28 Werner Koch <wk@gnupg.org> + + * defs.inc: Write a log file for each test. + * run-gpg, run-gpgm, run-gpg.patterns: Removed. Replaced in all + tests by a simple macro from defs.inc. + * Makefile.am (CLEANFILES): Remove log files. + (./gpg_dearmor): create it and use it instead of the macro. + This is needed in multisig.test due to IFS tricks. + + * armsignencrypt.test, signencrypt-dsa.test, signencrypt.test, + armencryptp.test, armencrypt.test, encryptp.test, seat.test, + encrypt-dsa.test, encrypt.test: Use --always-trust because the + test are not designed to check the validity. + +2001-09-06 Werner Koch <wk@gnupg.org> + + * genkey1024.test: Simplified by using a parameter file. + +2001-05-30 Werner Koch <wk@gnupg.org> + + * multisig.test (IFS): Reset IFS just before the test. + +2001-04-30 Werner Koch <wk@gnupg.org> + + * multisig.test: Add an set +x to avoid ksh problems + +2001-04-28 Werner Koch <wk@gnupg.org> + + * run-gpg.patterns: a v3 test key expired yesterday, suppress the + messages. + +2001-03-27 Werner Koch <wk@gnupg.org> + + * defs.inc: Removed creation of options file. + * options.in: New. + * Makefile.am: Create options file and fixed import of pubdemo.asc. + + * run-gpg.patterns (gpg): Add some more patterns. + +2001-03-20 Werner Koch <wk@gnupg.org> + + * Makefile.am: Import the pubdemo.asc file + + * sigs.test (hash_algo_list): s/tiger/tiger192/ + +2001-03-19 Werner Koch <wk@gnupg.org> + + * mkdemodirs (GPGDEMO): Add --allow-secret-key-import to all gpg + invocations. Use echon -n instead of an argument with \c. + +2001-02-12 Werner Koch <wk@gnupg.org> + + * multisig.test: new + * Makefile.am (TESTS): Added. + +2000-10-18 Werner Koch <wk@gnupg.org> + + * conventional-mdc.test: Add Rijndael and fix for empty plain texts. + +Thu Feb 10 17:39:44 CET 2000 Werner Koch <wk@gnupg.de> + + * mkdemodirs: Fixed the --clean loop. + +Thu Jan 13 19:31:58 CET 2000 Werner Koch <wk@gnupg.de> + + * defs.inc (chdir): Removed becuase it is unsused an plain old sh + does not like this name. Reported by Alec Habig. + +Tue Oct 26 20:02:23 1999 Werner Koch (wk@gnupg.org) + + * Makefile.am (GPG_DEARMOR): New and use --no-options. + +Tue Aug 31 17:20:44 CEST 1999 Werner Koch <wk@isil.d.shuttle.de> + + * defs.inc: set LC_ALL empty + +Wed Aug 4 10:34:18 CEST 1999 Werner Koch <wk@isil.d.shuttle.de> + + * defs.inc (echo_n): New and used instead of /bin/echo "\c" + +Sun Apr 18 10:11:28 CEST 1999 Werner Koch <wk@isil.d.shuttle.de> + + * mkdemodirs: New + * signdemokey: New. + * Makefile.am (distclean-local): New. + +Wed Mar 17 13:09:03 CET 1999 Werner Koch <wk@isil.d.shuttle.de> + + * mds.test: replaced the "echo -n" + +Mon Mar 8 20:47:17 CET 1999 Werner Koch <wk@isil.d.shuttle.de> + + * pubdemo.asc, secdemo.asc: New. + +Fri Feb 19 15:49:15 CET 1999 Werner Koch <wk@isil.d.shuttle.de> + + * genkey1024.test: Be really quiet. + +1999-01-01 Geoff Keating <geoffk@ozemail.com.au> + + * Makefile.am (CLEANFILES): Also delete trustdb and any leftover + lockfiles. + +Fri Nov 27 15:30:24 CET 1998 Werner Koch <wk@isil.d.shuttle.de> + + * clearsig.test: Some more test cases. + +Sun Oct 25 18:19:35 1998 Werner Koch (wk@isil.d.shuttle.de) + + * mds.test: Check whether TIGER is available. + * sigs.tesr: Ditto. + +Wed Sep 23 12:25:07 1998 Werner Koch (wk@isil.d.shuttle.de) + + * run-gpg.patterns: New (because Solaris fgrep does not like -f -). + +Mon Aug 10 21:33:38 1998 Werner Koch (wk@(none)) + + * genkey1024.test: Ariel fixed this. + +Wed Jul 8 10:43:47 1998 Werner Koch (wk@isil.d.shuttle.de) + + * seat.test: New. + +Mon May 18 15:40:02 1998 Werner Koch (wk@isil.d.shuttle.de) + + * Makefile.am: Now uses mk-tdata to produce random test data. + + * ChangeLog: New. + + + Copyright 1998, 1999, 2000, 2001, 2007 Free Software Foundation, Inc. + + This file is free software; as a special exception the author gives + unlimited permission to copy and/or distribute it, with or without + modifications, as long as this notice is preserved. + + This file is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +Local Variables: +buffer-read-only: t +End: diff --git a/tests/openpgp/Makefile.am b/tests/openpgp/Makefile.am new file mode 100644 index 0000000..59f39e2 --- /dev/null +++ b/tests/openpgp/Makefile.am @@ -0,0 +1,290 @@ +# Makefile.am - For tests/openpgp +# Copyright (C) 1998, 1999, 2000, 2001, 2003, +# 2010 Free Software Foundation, Inc. +# +# This file is part of GnuPG. +# +# GnuPG is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# GnuPG is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see <https://www.gnu.org/licenses/>. +# Process this file with automake to create Makefile.in + + +# Programs required before we can run these tests. +required_pgms = ../../g10/gpg$(EXEEXT) ../../agent/gpg-agent$(EXEEXT) \ + ../../tools/gpg-connect-agent$(EXEEXT) \ + ../gpgscm/gpgscm$(EXEEXT) + +AM_CPPFLAGS = -I$(top_srcdir)/common +include $(top_srcdir)/am/cmacros.am + +AM_CFLAGS = + +noinst_PROGRAMS = fake-pinentry + +fake_pinentry_SOURCES = fake-pinentry.c + +TESTS_ENVIRONMENT = LC_ALL=C \ + EXEEXT=$(EXEEXT) \ + PATH="../gpgscm:$(PATH)" \ + abs_top_srcdir="$(abs_top_srcdir)" \ + objdir="$(abs_top_builddir)" \ + GPGSCM_PATH="$(abs_top_srcdir)/tests/gpgscm" + +XTESTS = \ + version.scm \ + enarmor.scm \ + mds.scm \ + decrypt.scm \ + decrypt-multifile.scm \ + decrypt-dsa.scm \ + decrypt-session-key.scm \ + decrypt-unwrap-verify.scm \ + sigs.scm \ + sigs-dsa.scm \ + encrypt.scm \ + encrypt-multifile.scm \ + encrypt-dsa.scm \ + compression.scm \ + seat.scm \ + clearsig.scm \ + encryptp.scm \ + detach.scm \ + detachm.scm \ + armsigs.scm \ + armencrypt.scm \ + armencryptp.scm \ + signencrypt.scm \ + signencrypt-dsa.scm \ + armsignencrypt.scm \ + armdetach.scm \ + armdetachm.scm \ + genkey1024.scm \ + conventional.scm \ + conventional-mdc.scm \ + multisig.scm \ + verify.scm \ + verify-multifile.scm \ + gpgv.scm \ + gpgv-forged-keyring.scm \ + armor.scm \ + import.scm \ + import-revocation-certificate.scm \ + ecc.scm \ + 4gb-packet.scm \ + tofu.scm \ + trust-pgp-1.scm \ + trust-pgp-2.scm \ + trust-pgp-3.scm \ + gpgtar.scm \ + use-exact-key.scm \ + default-key.scm \ + export.scm \ + ssh-import.scm \ + ssh-export.scm \ + quick-key-manipulation.scm \ + key-selection.scm \ + delete-keys.scm \ + gpgconf.scm \ + issue2015.scm \ + issue2346.scm \ + issue2417.scm \ + issue2419.scm \ + issue2929.scm \ + issue2941.scm + +# Temporary removed tests: +# trust-pgp-4.scm + + +# XXX: Currently, one cannot override automake's 'check' target. As a +# workaround, we avoid defining 'TESTS', thus automake will not emit +# the 'check' target. For extra robustness, we merely define a +# dependency on 'xcheck', so this hack should also work even if +# automake would emit the 'check' target, as adding dependencies to +# targets is okay. +check: xcheck + +.PHONY: xcheck +xcheck: + $(TESTS_ENVIRONMENT) $(abs_top_builddir)/tests/gpgscm/gpgscm \ + $(abs_srcdir)/run-tests.scm $(TESTFLAGS) $(TESTS) + +TEST_FILES = pubring.asc secring.asc plain-1o.asc plain-2o.asc plain-3o.asc \ + plain-1.asc plain-2.asc plain-3.asc plain-1-pgp.asc \ + plain-largeo.asc plain-large.asc \ + pubring.pkr.asc secring.skr.asc secdemo.asc pubdemo.asc \ + bug537-test.data.asc bug894-test.asc \ + bug1223-good.asc bug1223-bogus.asc 4gb-packet.asc \ + tofu/conflicting/1C005AF3.gpg \ + tofu/conflicting/1C005AF3-secret.gpg \ + tofu/conflicting/1C005AF3-1.txt \ + tofu/conflicting/1C005AF3-2.txt \ + tofu/conflicting/1C005AF3-3.txt \ + tofu/conflicting/1C005AF3-4.txt \ + tofu/conflicting/1C005AF3-5.txt \ + tofu/conflicting/B662E42F.gpg \ + tofu/conflicting/B662E42F-secret.gpg \ + tofu/conflicting/B662E42F-1.txt \ + tofu/conflicting/B662E42F-2.txt \ + tofu/conflicting/B662E42F-3.txt \ + tofu/conflicting/B662E42F-4.txt \ + tofu/conflicting/B662E42F-5.txt \ + tofu/conflicting/BE04EB2B.gpg \ + tofu/conflicting/BE04EB2B-secret.gpg \ + tofu/conflicting/BE04EB2B-1.txt \ + tofu/conflicting/BE04EB2B-2.txt \ + tofu/conflicting/BE04EB2B-3.txt \ + tofu/conflicting/BE04EB2B-4.txt \ + tofu/conflicting/BE04EB2B-5.txt \ + tofu/cross-sigs/EC38277E-secret.gpg \ + tofu/cross-sigs/EC38277E-1.gpg \ + tofu/cross-sigs/EC38277E-1.txt \ + tofu/cross-sigs/EC38277E-2.gpg \ + tofu/cross-sigs/EC38277E-2.txt \ + tofu/cross-sigs/EC38277E-3.txt \ + tofu/cross-sigs/871C2247-secret.gpg \ + tofu/cross-sigs/871C2247-1.gpg \ + tofu/cross-sigs/871C2247-1.txt \ + tofu/cross-sigs/871C2247-2.gpg \ + tofu/cross-sigs/871C2247-2.txt \ + tofu/cross-sigs/871C2247-3.gpg \ + tofu/cross-sigs/871C2247-3.txt \ + tofu/cross-sigs/871C2247-4.gpg \ + tofu/cross-sigs/README \ + key-selection/0.asc \ + key-selection/1.asc \ + key-selection/2.asc \ + key-selection/3.asc \ + key-selection/4.asc \ + trust-pgp/scenario1.asc \ + trust-pgp/scenario2.asc \ + trust-pgp/scenario3.asc \ + trust-pgp/scenario4.asc \ + trust-pgp/alice.sec.asc \ + trust-pgp/bobby.sec.asc \ + trust-pgp/carol.sec.asc \ + trust-pgp/david.sec.asc \ + trust-pgp/frank.sec.asc \ + trust-pgp/grace.sec.asc \ + trust-pgp/heidi.sec.asc + +data_files = data-500 data-9000 data-32000 data-80000 plain-large + +priv_keys = privkeys/50B2D4FA4122C212611048BC5FC31BD44393626E.asc \ + privkeys/7E201E28B6FEB2927B321F443205F4724EBE637E.asc \ + privkeys/13FDB8809B17C5547779F9D205C45F47CE0217CE.asc \ + privkeys/343D8AF79796EE107D645A2787A9D9252F924E6F.asc \ + privkeys/8B5ABF3EF9EB8D96B91A0B8C2C4401C91C834C34.asc \ + privkeys/0D6F6AD4C4C803B25470F9104E9F4E6A4CA64255.asc \ + privkeys/FD692BD59D6640A84C8422573D469F84F3B98E53.asc \ + privkeys/76F7E2B35832976B50A27A282D9B87E44577EB66.asc \ + privkeys/A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD.asc \ + privkeys/0DD40284FF992CD24DC4AAC367037E066FCEE26A.asc \ + privkeys/2BC997C0B8691D41D29A4EC81CCBCF08454E4961.asc \ + privkeys/3C9D5ECA70130C2DBB1FC6AC0076BEEEC197716F.asc \ + privkeys/449E644892C951A37525654730DD32C202079926.asc \ + privkeys/58FFE844087634E62440224908BDE44BEA7EB730.asc \ + privkeys/4DF9172D6FF428C97A0E9AA96F03E8BCE3B2F188.asc \ + privkeys/9D7CD8F53F2F14C3E2177D1E9D1D11F39513A4A4.asc \ + privkeys/6E6B7ED0BD4425018FFC54F3921D5467A3AE00EB.asc \ + privkeys/C905D0AB6AE9655C5A35975939997BBF3325D6DD.asc \ + privkeys/B2BAA7144303DF19BB6FDE23781DD3FDD97918D4.asc \ + privkeys/CF60965BF51F67CF80DECE853E0D2D343468571D.asc \ + privkeys/DF00E361D34F80868D06879AC21D7A7D4E4FAD76.asc \ + privkeys/00FE67F28A52A8AA08FFAED20AF832DA916D1985.asc \ + privkeys/1DF48228FEFF3EC2481B106E0ACA8C465C662CC5.asc \ + privkeys/A2832820DC9F40751BDCD375BB0945BA33EC6B4C.asc \ + privkeys/ADE710D74409777B7729A7653373D820F67892E0.asc \ + privkeys/CEFC51AF91F68A2904FBFF62C4F075A4785B803F.asc \ + privkeys/1E28F20E41B54C2D1234D896096495FF57E08D18.asc \ + privkeys/EB33B687EB8581AB64D04852A54453E85F3DF62D.asc \ + privkeys/C6A6390E9388CDBAD71EAEA698233FE5E04F001E.asc \ + privkeys/D69102E0F5AC6B6DB8E4D16DA8E18CF46D88CAE3.asc + +sample_keys = samplekeys/README \ + samplekeys/ecc-sample-1-pub.asc \ + samplekeys/ecc-sample-2-pub.asc \ + samplekeys/ecc-sample-3-pub.asc \ + samplekeys/ecc-sample-1-sec.asc \ + samplekeys/ecc-sample-2-sec.asc \ + samplekeys/ecc-sample-3-sec.asc \ + samplekeys/eddsa-sample-1-pub.asc \ + samplekeys/eddsa-sample-1-sec.asc \ + samplekeys/dda252ebb8ebe1af-1.asc \ + samplekeys/dda252ebb8ebe1af-2.asc \ + samplekeys/whats-new-in-2.1.asc \ + samplekeys/e2e-p256-1-clr.asc \ + samplekeys/e2e-p256-1-prt.asc \ + samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc \ + samplekeys/rsa-rsa-sample-1.asc \ + samplekeys/ed25519-cv25519-sample-1.asc \ + samplekeys/silent-running.asc \ + samplekeys/ssh-dsa.key \ + samplekeys/ssh-ecdsa.key \ + samplekeys/ssh-ed25519.key \ + samplekeys/ssh-rsa.key \ + samplekeys/issue2346.gpg \ + samplekeys/authenticate-only.pub.asc \ + samplekeys/authenticate-only.sec.asc + +sample_msgs = samplemsgs/clearsig-1-key-1.asc \ + samplemsgs/clearsig-2-keys-1.asc \ + samplemsgs/clearsig-2-keys-2.asc \ + samplemsgs/enc-1-key-1.asc \ + samplemsgs/enc-1-key-2.asc \ + samplemsgs/enc-2-keys-1.asc \ + samplemsgs/enc-2-keys-2.asc \ + samplemsgs/enc-2-keys-hh-1.asc \ + samplemsgs/enc-2-keys-hr-1.asc \ + samplemsgs/enc-2-keys-rh-1.asc \ + samplemsgs/encsig-2-2-keys-3.asc \ + samplemsgs/encsig-2-2-keys-4.asc \ + samplemsgs/encsig-2-keys-1.asc \ + samplemsgs/encsig-2-keys-2.asc \ + samplemsgs/encsig-2-keys-3.asc \ + samplemsgs/encsig-2-keys-4.asc \ + samplemsgs/encz0-1-key-1.asc \ + samplemsgs/encz0-1-key-2.asc \ + samplemsgs/issue2419.asc \ + samplemsgs/revoke-2D727CC768697734.asc \ + samplemsgs/sig-1-key-1.asc \ + samplemsgs/sig-1-key-2.asc \ + samplemsgs/sig-2-keys-1.asc \ + samplemsgs/sig-2-keys-2.asc \ + samplemsgs/signed-1-key-1.asc \ + samplemsgs/signed-1-key-2.asc \ + samplemsgs/signed-2-keys-1.asc \ + samplemsgs/signed-2-keys-2.asc + +EXTRA_DIST = defs.scm trust-pgp/common.scm $(XTESTS) $(TEST_FILES) \ + mkdemodirs signdemokey $(priv_keys) $(sample_keys) \ + $(sample_msgs) ChangeLog-2011 run-tests.scm trust-pgp-4.scm \ + setup.scm shell.scm all-tests.scm signed-messages.scm + +CLEANFILES = prepared.stamp x y yy z out err $(data_files) \ + plain-1 plain-2 plain-3 trustdb.gpg *.lock .\#lk* \ + *.log gpg_dearmor gpg.conf gpg-agent.conf S.gpg-agent \ + pubring.gpg pubring.gpg~ pubring.kbx pubring.kbx~ \ + secring.gpg pubring.pkr secring.skr \ + gnupg-test.stop random_seed gpg-agent.log tofu.db \ + passphrases sshcontrol S.gpg-agent.ssh report.xml + +XTESTS += trust-pgp-4.scm + +clean-local: + -rm -rf private-keys-v1.d openpgp-revocs.d tofu.d gpgtar.d + + +# We need to depend on a couple of programs so that the tests don't +# start before all programs are built. +all-local: $(required_pgms) diff --git a/tests/openpgp/Makefile.in b/tests/openpgp/Makefile.in new file mode 100644 index 0000000..a911259 --- /dev/null +++ b/tests/openpgp/Makefile.in @@ -0,0 +1,940 @@ +# Makefile.in generated by automake 1.16.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2020 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile.am - For tests/openpgp +# Copyright (C) 1998, 1999, 2000, 2001, 2003, +# 2010 Free Software Foundation, Inc. +# +# This file is part of GnuPG. +# +# GnuPG is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# GnuPG is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see <https://www.gnu.org/licenses/>. +# Process this file with automake to create Makefile.in + +# cmacros.am - C macro definitions +# Copyright (C) 2004 Free Software Foundation, Inc. +# +# This file is part of GnuPG. +# +# GnuPG is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# GnuPG is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see <https://www.gnu.org/licenses/>. + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@HAVE_DOSISH_SYSTEM_FALSE@am__append_1 = -DGNUPG_BINDIR="\"$(bindir)\"" \ +@HAVE_DOSISH_SYSTEM_FALSE@ -DGNUPG_LIBEXECDIR="\"$(libexecdir)\"" \ +@HAVE_DOSISH_SYSTEM_FALSE@ -DGNUPG_LIBDIR="\"$(libdir)/@PACKAGE@\"" \ +@HAVE_DOSISH_SYSTEM_FALSE@ -DGNUPG_DATADIR="\"$(datadir)/@PACKAGE@\"" \ +@HAVE_DOSISH_SYSTEM_FALSE@ -DGNUPG_SYSCONFDIR="\"$(sysconfdir)/@PACKAGE@\"" \ +@HAVE_DOSISH_SYSTEM_FALSE@ -DGNUPG_LOCALSTATEDIR="\"$(localstatedir)\"" + + +# If a specific protect tool program has been defined, pass its name +# to cc. Note that these macros should not be used directly but via +# the gnupg_module_name function. +@GNUPG_AGENT_PGM_TRUE@am__append_2 = -DGNUPG_DEFAULT_AGENT="\"@GNUPG_AGENT_PGM@\"" +@GNUPG_PINENTRY_PGM_TRUE@am__append_3 = -DGNUPG_DEFAULT_PINENTRY="\"@GNUPG_PINENTRY_PGM@\"" +@GNUPG_SCDAEMON_PGM_TRUE@am__append_4 = -DGNUPG_DEFAULT_SCDAEMON="\"@GNUPG_SCDAEMON_PGM@\"" +@GNUPG_DIRMNGR_PGM_TRUE@am__append_5 = -DGNUPG_DEFAULT_DIRMNGR="\"@GNUPG_DIRMNGR_PGM@\"" +@GNUPG_PROTECT_TOOL_PGM_TRUE@am__append_6 = -DGNUPG_DEFAULT_PROTECT_TOOL="\"@GNUPG_PROTECT_TOOL_PGM@\"" +@GNUPG_DIRMNGR_LDAP_PGM_TRUE@am__append_7 = -DGNUPG_DEFAULT_DIRMNGR_LDAP="\"@GNUPG_DIRMNGR_LDAP_PGM@\"" +noinst_PROGRAMS = fake-pinentry$(EXEEXT) +subdir = tests/openpgp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gpg-error.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/ksba.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/ldap.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libassuan.m4 \ + $(top_srcdir)/m4/libgcrypt.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/npth.m4 $(top_srcdir)/m4/ntbtls.m4 \ + $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/readline.m4 \ + $(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sys_socket_h.m4 \ + $(top_srcdir)/m4/tar-ustar.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_fake_pinentry_OBJECTS = fake-pinentry.$(OBJEXT) +fake_pinentry_OBJECTS = $(am_fake_pinentry_OBJECTS) +fake_pinentry_LDADD = $(LDADD) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/fake-pinentry.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(fake_pinentry_SOURCES) +DIST_SOURCES = $(fake_pinentry_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/am/cmacros.am \ + $(top_srcdir)/build-aux/depcomp \ + $(top_srcdir)/build-aux/mkinstalldirs README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +AWK_HEX_NUMBER_OPTION = @AWK_HEX_NUMBER_OPTION@ +BUILD_FILEVERSION = @BUILD_FILEVERSION@ +BUILD_HOSTNAME = @BUILD_HOSTNAME@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +BUILD_REVISION = @BUILD_REVISION@ +BUILD_TIMESTAMP = @BUILD_TIMESTAMP@ +BUILD_VERSION = @BUILD_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DL_LIBS = @DL_LIBS@ +DNSLIBS = @DNSLIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENCFS = @ENCFS@ +EXEEXT = @EXEEXT@ +FUSERMOUNT = @FUSERMOUNT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GNUPG_AGENT_PGM = @GNUPG_AGENT_PGM@ +GNUPG_DIRMNGR_LDAP_PGM = @GNUPG_DIRMNGR_LDAP_PGM@ +GNUPG_DIRMNGR_PGM = @GNUPG_DIRMNGR_PGM@ +GNUPG_PINENTRY_PGM = @GNUPG_PINENTRY_PGM@ +GNUPG_PROTECT_TOOL_PGM = @GNUPG_PROTECT_TOOL_PGM@ +GNUPG_SCDAEMON_PGM = @GNUPG_SCDAEMON_PGM@ +GPGKEYS_LDAP = @GPGKEYS_LDAP@ +GPGRT_CONFIG = @GPGRT_CONFIG@ +GPG_ERROR_CFLAGS = @GPG_ERROR_CFLAGS@ +GPG_ERROR_CONFIG = @GPG_ERROR_CONFIG@ +GPG_ERROR_LIBS = @GPG_ERROR_LIBS@ +GPG_ERROR_MT_CFLAGS = @GPG_ERROR_MT_CFLAGS@ +GPG_ERROR_MT_LIBS = @GPG_ERROR_MT_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +KSBA_CFLAGS = @KSBA_CFLAGS@ +KSBA_CONFIG = @KSBA_CONFIG@ +KSBA_LIBS = @KSBA_LIBS@ +LBER_LIBS = @LBER_LIBS@ +LDAPLIBS = @LDAPLIBS@ +LDAP_CPPFLAGS = @LDAP_CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBASSUAN_CFLAGS = @LIBASSUAN_CFLAGS@ +LIBASSUAN_CONFIG = @LIBASSUAN_CONFIG@ +LIBASSUAN_LIBS = @LIBASSUAN_LIBS@ +LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ +LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ +LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ +LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ +LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBREADLINE = @LIBREADLINE@ +LIBS = @LIBS@ +LIBUSB_CPPFLAGS = @LIBUSB_CPPFLAGS@ +LIBUSB_LIBS = @LIBUSB_LIBS@ +LIBUTIL_LIBS = @LIBUTIL_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NETLIBS = @NETLIBS@ +NPTH_CFLAGS = @NPTH_CFLAGS@ +NPTH_CONFIG = @NPTH_CONFIG@ +NPTH_LIBS = @NPTH_LIBS@ +NTBTLS_CFLAGS = @NTBTLS_CFLAGS@ +NTBTLS_CONFIG = @NTBTLS_CONFIG@ +NTBTLS_LIBS = @NTBTLS_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_GT = @PACKAGE_GT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +SENDMAIL = @SENDMAIL@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHRED = @SHRED@ +SQLITE3_CFLAGS = @SQLITE3_CFLAGS@ +SQLITE3_LIBS = @SQLITE3_LIBS@ +STRIP = @STRIP@ +SYSROOT = @SYSROOT@ +SYS_SOCKET_H = @SYS_SOCKET_H@ +TAR = @TAR@ +USE_C99_CFLAGS = @USE_C99_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +W32SOCKLIBS = @W32SOCKLIBS@ +WINDRES = @WINDRES@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +YAT2M = @YAT2M@ +ZLIBS = @ZLIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = $(datadir)/locale +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Programs required before we can run these tests. +required_pgms = ../../g10/gpg$(EXEEXT) ../../agent/gpg-agent$(EXEEXT) \ + ../../tools/gpg-connect-agent$(EXEEXT) \ + ../gpgscm/gpgscm$(EXEEXT) + + +# NB: AM_CFLAGS may also be used by tools running on the build +# platform to create source files. +AM_CPPFLAGS = -I$(top_srcdir)/common -DLOCALEDIR=\"$(localedir)\" \ + $(am__append_1) $(am__append_2) $(am__append_3) \ + $(am__append_4) $(am__append_5) $(am__append_6) \ + $(am__append_7) +@HAVE_W32CE_SYSTEM_FALSE@extra_sys_libs = + +# Under Windows we use LockFileEx. WindowsCE provides this only on +# the WindowsMobile 6 platform and thus we need to use the coredll6 +# import library. We also want to use a stacksize of 256k instead of +# the 2MB which is the default with cegcc. 256k is the largest stack +# we use with pth. +@HAVE_W32CE_SYSTEM_TRUE@extra_sys_libs = -lcoredll6 +@HAVE_W32CE_SYSTEM_FALSE@extra_bin_ldflags = +@HAVE_W32CE_SYSTEM_TRUE@extra_bin_ldflags = -Wl,--stack=0x40000 +resource_objs = + +# Convenience macros +libcommon = ../common/libcommon.a +libcommonpth = ../common/libcommonpth.a +libcommontls = ../common/libcommontls.a +libcommontlsnpth = ../common/libcommontlsnpth.a +AM_CFLAGS = +fake_pinentry_SOURCES = fake-pinentry.c +TESTS_ENVIRONMENT = LC_ALL=C \ + EXEEXT=$(EXEEXT) \ + PATH="../gpgscm:$(PATH)" \ + abs_top_srcdir="$(abs_top_srcdir)" \ + objdir="$(abs_top_builddir)" \ + GPGSCM_PATH="$(abs_top_srcdir)/tests/gpgscm" + +XTESTS = version.scm enarmor.scm mds.scm decrypt.scm \ + decrypt-multifile.scm decrypt-dsa.scm decrypt-session-key.scm \ + decrypt-unwrap-verify.scm sigs.scm sigs-dsa.scm encrypt.scm \ + encrypt-multifile.scm encrypt-dsa.scm compression.scm seat.scm \ + clearsig.scm encryptp.scm detach.scm detachm.scm armsigs.scm \ + armencrypt.scm armencryptp.scm signencrypt.scm \ + signencrypt-dsa.scm armsignencrypt.scm armdetach.scm \ + armdetachm.scm genkey1024.scm conventional.scm \ + conventional-mdc.scm multisig.scm verify.scm \ + verify-multifile.scm gpgv.scm gpgv-forged-keyring.scm \ + armor.scm import.scm import-revocation-certificate.scm ecc.scm \ + 4gb-packet.scm tofu.scm trust-pgp-1.scm trust-pgp-2.scm \ + trust-pgp-3.scm gpgtar.scm use-exact-key.scm default-key.scm \ + export.scm ssh-import.scm ssh-export.scm \ + quick-key-manipulation.scm key-selection.scm delete-keys.scm \ + gpgconf.scm issue2015.scm issue2346.scm issue2417.scm \ + issue2419.scm issue2929.scm issue2941.scm trust-pgp-4.scm +TEST_FILES = pubring.asc secring.asc plain-1o.asc plain-2o.asc plain-3o.asc \ + plain-1.asc plain-2.asc plain-3.asc plain-1-pgp.asc \ + plain-largeo.asc plain-large.asc \ + pubring.pkr.asc secring.skr.asc secdemo.asc pubdemo.asc \ + bug537-test.data.asc bug894-test.asc \ + bug1223-good.asc bug1223-bogus.asc 4gb-packet.asc \ + tofu/conflicting/1C005AF3.gpg \ + tofu/conflicting/1C005AF3-secret.gpg \ + tofu/conflicting/1C005AF3-1.txt \ + tofu/conflicting/1C005AF3-2.txt \ + tofu/conflicting/1C005AF3-3.txt \ + tofu/conflicting/1C005AF3-4.txt \ + tofu/conflicting/1C005AF3-5.txt \ + tofu/conflicting/B662E42F.gpg \ + tofu/conflicting/B662E42F-secret.gpg \ + tofu/conflicting/B662E42F-1.txt \ + tofu/conflicting/B662E42F-2.txt \ + tofu/conflicting/B662E42F-3.txt \ + tofu/conflicting/B662E42F-4.txt \ + tofu/conflicting/B662E42F-5.txt \ + tofu/conflicting/BE04EB2B.gpg \ + tofu/conflicting/BE04EB2B-secret.gpg \ + tofu/conflicting/BE04EB2B-1.txt \ + tofu/conflicting/BE04EB2B-2.txt \ + tofu/conflicting/BE04EB2B-3.txt \ + tofu/conflicting/BE04EB2B-4.txt \ + tofu/conflicting/BE04EB2B-5.txt \ + tofu/cross-sigs/EC38277E-secret.gpg \ + tofu/cross-sigs/EC38277E-1.gpg \ + tofu/cross-sigs/EC38277E-1.txt \ + tofu/cross-sigs/EC38277E-2.gpg \ + tofu/cross-sigs/EC38277E-2.txt \ + tofu/cross-sigs/EC38277E-3.txt \ + tofu/cross-sigs/871C2247-secret.gpg \ + tofu/cross-sigs/871C2247-1.gpg \ + tofu/cross-sigs/871C2247-1.txt \ + tofu/cross-sigs/871C2247-2.gpg \ + tofu/cross-sigs/871C2247-2.txt \ + tofu/cross-sigs/871C2247-3.gpg \ + tofu/cross-sigs/871C2247-3.txt \ + tofu/cross-sigs/871C2247-4.gpg \ + tofu/cross-sigs/README \ + key-selection/0.asc \ + key-selection/1.asc \ + key-selection/2.asc \ + key-selection/3.asc \ + key-selection/4.asc \ + trust-pgp/scenario1.asc \ + trust-pgp/scenario2.asc \ + trust-pgp/scenario3.asc \ + trust-pgp/scenario4.asc \ + trust-pgp/alice.sec.asc \ + trust-pgp/bobby.sec.asc \ + trust-pgp/carol.sec.asc \ + trust-pgp/david.sec.asc \ + trust-pgp/frank.sec.asc \ + trust-pgp/grace.sec.asc \ + trust-pgp/heidi.sec.asc + +data_files = data-500 data-9000 data-32000 data-80000 plain-large +priv_keys = privkeys/50B2D4FA4122C212611048BC5FC31BD44393626E.asc \ + privkeys/7E201E28B6FEB2927B321F443205F4724EBE637E.asc \ + privkeys/13FDB8809B17C5547779F9D205C45F47CE0217CE.asc \ + privkeys/343D8AF79796EE107D645A2787A9D9252F924E6F.asc \ + privkeys/8B5ABF3EF9EB8D96B91A0B8C2C4401C91C834C34.asc \ + privkeys/0D6F6AD4C4C803B25470F9104E9F4E6A4CA64255.asc \ + privkeys/FD692BD59D6640A84C8422573D469F84F3B98E53.asc \ + privkeys/76F7E2B35832976B50A27A282D9B87E44577EB66.asc \ + privkeys/A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD.asc \ + privkeys/0DD40284FF992CD24DC4AAC367037E066FCEE26A.asc \ + privkeys/2BC997C0B8691D41D29A4EC81CCBCF08454E4961.asc \ + privkeys/3C9D5ECA70130C2DBB1FC6AC0076BEEEC197716F.asc \ + privkeys/449E644892C951A37525654730DD32C202079926.asc \ + privkeys/58FFE844087634E62440224908BDE44BEA7EB730.asc \ + privkeys/4DF9172D6FF428C97A0E9AA96F03E8BCE3B2F188.asc \ + privkeys/9D7CD8F53F2F14C3E2177D1E9D1D11F39513A4A4.asc \ + privkeys/6E6B7ED0BD4425018FFC54F3921D5467A3AE00EB.asc \ + privkeys/C905D0AB6AE9655C5A35975939997BBF3325D6DD.asc \ + privkeys/B2BAA7144303DF19BB6FDE23781DD3FDD97918D4.asc \ + privkeys/CF60965BF51F67CF80DECE853E0D2D343468571D.asc \ + privkeys/DF00E361D34F80868D06879AC21D7A7D4E4FAD76.asc \ + privkeys/00FE67F28A52A8AA08FFAED20AF832DA916D1985.asc \ + privkeys/1DF48228FEFF3EC2481B106E0ACA8C465C662CC5.asc \ + privkeys/A2832820DC9F40751BDCD375BB0945BA33EC6B4C.asc \ + privkeys/ADE710D74409777B7729A7653373D820F67892E0.asc \ + privkeys/CEFC51AF91F68A2904FBFF62C4F075A4785B803F.asc \ + privkeys/1E28F20E41B54C2D1234D896096495FF57E08D18.asc \ + privkeys/EB33B687EB8581AB64D04852A54453E85F3DF62D.asc \ + privkeys/C6A6390E9388CDBAD71EAEA698233FE5E04F001E.asc \ + privkeys/D69102E0F5AC6B6DB8E4D16DA8E18CF46D88CAE3.asc + +sample_keys = samplekeys/README \ + samplekeys/ecc-sample-1-pub.asc \ + samplekeys/ecc-sample-2-pub.asc \ + samplekeys/ecc-sample-3-pub.asc \ + samplekeys/ecc-sample-1-sec.asc \ + samplekeys/ecc-sample-2-sec.asc \ + samplekeys/ecc-sample-3-sec.asc \ + samplekeys/eddsa-sample-1-pub.asc \ + samplekeys/eddsa-sample-1-sec.asc \ + samplekeys/dda252ebb8ebe1af-1.asc \ + samplekeys/dda252ebb8ebe1af-2.asc \ + samplekeys/whats-new-in-2.1.asc \ + samplekeys/e2e-p256-1-clr.asc \ + samplekeys/e2e-p256-1-prt.asc \ + samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc \ + samplekeys/rsa-rsa-sample-1.asc \ + samplekeys/ed25519-cv25519-sample-1.asc \ + samplekeys/silent-running.asc \ + samplekeys/ssh-dsa.key \ + samplekeys/ssh-ecdsa.key \ + samplekeys/ssh-ed25519.key \ + samplekeys/ssh-rsa.key \ + samplekeys/issue2346.gpg \ + samplekeys/authenticate-only.pub.asc \ + samplekeys/authenticate-only.sec.asc + +sample_msgs = samplemsgs/clearsig-1-key-1.asc \ + samplemsgs/clearsig-2-keys-1.asc \ + samplemsgs/clearsig-2-keys-2.asc \ + samplemsgs/enc-1-key-1.asc \ + samplemsgs/enc-1-key-2.asc \ + samplemsgs/enc-2-keys-1.asc \ + samplemsgs/enc-2-keys-2.asc \ + samplemsgs/enc-2-keys-hh-1.asc \ + samplemsgs/enc-2-keys-hr-1.asc \ + samplemsgs/enc-2-keys-rh-1.asc \ + samplemsgs/encsig-2-2-keys-3.asc \ + samplemsgs/encsig-2-2-keys-4.asc \ + samplemsgs/encsig-2-keys-1.asc \ + samplemsgs/encsig-2-keys-2.asc \ + samplemsgs/encsig-2-keys-3.asc \ + samplemsgs/encsig-2-keys-4.asc \ + samplemsgs/encz0-1-key-1.asc \ + samplemsgs/encz0-1-key-2.asc \ + samplemsgs/issue2419.asc \ + samplemsgs/revoke-2D727CC768697734.asc \ + samplemsgs/sig-1-key-1.asc \ + samplemsgs/sig-1-key-2.asc \ + samplemsgs/sig-2-keys-1.asc \ + samplemsgs/sig-2-keys-2.asc \ + samplemsgs/signed-1-key-1.asc \ + samplemsgs/signed-1-key-2.asc \ + samplemsgs/signed-2-keys-1.asc \ + samplemsgs/signed-2-keys-2.asc + +EXTRA_DIST = defs.scm trust-pgp/common.scm $(XTESTS) $(TEST_FILES) \ + mkdemodirs signdemokey $(priv_keys) $(sample_keys) \ + $(sample_msgs) ChangeLog-2011 run-tests.scm trust-pgp-4.scm \ + setup.scm shell.scm all-tests.scm signed-messages.scm + +CLEANFILES = prepared.stamp x y yy z out err $(data_files) \ + plain-1 plain-2 plain-3 trustdb.gpg *.lock .\#lk* \ + *.log gpg_dearmor gpg.conf gpg-agent.conf S.gpg-agent \ + pubring.gpg pubring.gpg~ pubring.kbx pubring.kbx~ \ + secring.gpg pubring.pkr secring.skr \ + gnupg-test.stop random_seed gpg-agent.log tofu.db \ + passphrases sshcontrol S.gpg-agent.ssh report.xml + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj .rc +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/am/cmacros.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/openpgp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/openpgp/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/am/cmacros.am $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) + +fake-pinentry$(EXEEXT): $(fake_pinentry_OBJECTS) $(fake_pinentry_DEPENDENCIES) $(EXTRA_fake_pinentry_DEPENDENCIES) + @rm -f fake-pinentry$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(fake_pinentry_OBJECTS) $(fake_pinentry_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake-pinentry.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) all-local +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-local clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/fake-pinentry.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/fake-pinentry.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am clean clean-generic clean-local clean-noinstPROGRAMS \ + cscopelist-am ctags ctags-am distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + + +@HAVE_W32_SYSTEM_TRUE@.rc.o: +@HAVE_W32_SYSTEM_TRUE@ $(WINDRES) $(DEFAULT_INCLUDES) $(INCLUDES) "$<" "$@" + +# Temporary removed tests: +# trust-pgp-4.scm + +# XXX: Currently, one cannot override automake's 'check' target. As a +# workaround, we avoid defining 'TESTS', thus automake will not emit +# the 'check' target. For extra robustness, we merely define a +# dependency on 'xcheck', so this hack should also work even if +# automake would emit the 'check' target, as adding dependencies to +# targets is okay. +check: xcheck + +.PHONY: xcheck +xcheck: + $(TESTS_ENVIRONMENT) $(abs_top_builddir)/tests/gpgscm/gpgscm \ + $(abs_srcdir)/run-tests.scm $(TESTFLAGS) $(TESTS) + +clean-local: + -rm -rf private-keys-v1.d openpgp-revocs.d tofu.d gpgtar.d + +# We need to depend on a couple of programs so that the tests don't +# start before all programs are built. +all-local: $(required_pgms) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/openpgp/README b/tests/openpgp/README new file mode 100644 index 0000000..22b7211 --- /dev/null +++ b/tests/openpgp/README @@ -0,0 +1,257 @@ +# Emacs, this is an -*- org -*- file. + +* How to run the test suite +** tldr: How to run all tests fast. + + obj $ make check-all TESTFLAGS=--parallel + +You can use --parallel=N to request N parallel jobs. Hint: Tuck +TESTFLAGS=--parallel in your environment. + +** Running individual test suites or tests + +From your build directory, run + + obj $ make -C tests/openpgp check + +to run all tests or + + obj $ make -C tests/openpgp check TESTS=your-test.scm + +to run a specific test (or any number of tests separated by spaces). + +If you want to debug a test, add verbose=1 to see messages printed by +spawned programs to their standard error stream, verbose=2 to see what +programs are executed, or verbose=3 to see even more program output +and exit codes. + +If you want to run gpg under valgrind add with_valgrind=1. + + +** Inspecting the test environment + +To inspect the environment in which tests are running, or to quickly +create keys for debugging or testing, you can start a shell. There is +one test that doese just that: + + obj $ make -C tests/openpgp check TESTS=shell.scm + PASS: tests/openpgp/setup.scm + Load legacy test environment? [Y/n] y + Drop 'batch' from gpg.conf? [Y/n] y + + Enjoy your test environment. Type 'exit' to exit it, it will be cleaned up after you. + + ... $ gpg -k Alfa + gpg: NOTE: THIS IS A DEVELOPMENT VERSION! + gpg: It is only intended for test purposes and should NOT be + gpg: used in a production environment or with production keys! + gpg: /tmp/gpgscm-20170809T144032-run-tests-PFfybw/trustdb.gpg: trustdb created + pub dsa1024 1999-03-08 [SCA] + A0FF4590BB6122EDEF6E3C542D727CC768697734 + uid [ unknown] Alfa Test (demo key) <alfa@example.net> + uid [ unknown] Alpha Test (demo key) <alpha@example.net> + uid [ unknown] Alice (demo key) + sub elg1024 1999-03-08 [E] + +PATH is adjusted so that you will use the tools from the build tree. +Note that the directory is removed when you exit the shell. + +** Passing options to the test driver + +You can set TESTFLAGS to pass flags to 'run-tests.scm'. For example, +to speed up the test suite when bisecting, do + + obj $ make -C tests/openpgp check TESTFLAGS=--parallel + +See below for the arguments supported by the driver. + +** Calling the test driver directly +This is a bit tricky because one needs to manually set some +environment variables. We should make that easier. See discussion +below. From your build directory, do: + + obj $ srcdir=<path to>/tests/openpgp \ + GPGSCM_PATH=<path to>/tests/gpgscm:<path to>/tests/openpgp \ + $(pwd)/tests/gpgscm/gpgscm [gpgscm args] \ + run-tests.scm [test suite runner args] + +*** Arguments supported by the test suite runner +The test suite runner supports two modes of operation, '--sequential' +and '--parallel'. By default the tests are run in sequential order, +each one in a clean environment. + +You can specify the tests to run as positional arguments relative to +srcdir (e.g. just 'version.scm'). Note that you do not have to +specify setup.scm and finish.scm, they are executed implicitly. + +The test suite runner can be executed in any location that the current +user can write to. It will create temporary files and directories, +but will in general clean up all of them. +*** Discussion of the various environment variables +**** srcdir +Must be set to the source of the openpgp test suite. Used to locate +data files. +**** GPGSCM_PATH +Used to locate the Scheme library as well as code used by the test +suite. +**** BIN_PREFIX +The test suite does not hardcode any paths to tools. If set it is +used to locate the tools to test, otherwise the test suite assumes to +be run from the build directory. +**** GPG_PRESET_PASSPHRASE +This tool is not installed by 'make install', hence we need to +explicitly override its position. In fact, the location of any tool +used by the test suite can be overridden this way. See defs.scm. +**** argv[0] +run-tests.scm depends on being able to re-exec gpgscm. It uses +argv[0] for that. Therefore you must use an absolute path to invoke +gpgscm. +* How to write tests +gpgscm provides a number of functions to aid you in writing tests, as +well as bindings to process management abstractions provided by GnuPG. +For the Scheme environment provided by TinySCHEME, see the TinySCHEME +manual that is included in tests/gpgscm/Manual.txt. + +For a quick start, please have a look at various tests that are +already implemented, e.g. 'encrypt.scm'. +** The test framework +The functions info, error, and skip display their first argument and +flush the output buffers. error and skip will also terminate the +process, signaling that the test failed or should be skipped. + +(for-each-p msg proc list) will display msg, and call proc with each +element of list while displaying the progress appropriately. +for-each-p' is similar, but accepts another callback before the 'list' +argument to format each item. for-each-p can be safely nested, and +the inner progress indicator will be abbreviated using '.'. +** Debugging tests + +Say you are working on a new test called 'your-test.scm', you can run +it on its own using + + obj $ make -C tests/openpgp check TESTS=your-test.scm + +but something isn't working as expected. There are several little +gadgets that might help. The first one is 'trace', a function that +prints the value given to it and evaluates to it. E.g. + + (trace (+ 2 3)) + +prints '5' and evaluates to 5. Also, there is an 'assert' macro that +aborts the execution if its argument does not evaluate to a trueish +value. Feel free to express invariants with it. + +You can also get an interactive repl by dropping + + (interactive-repl (current-environment)) + +anywhere you like. Or, if you want to examine the environment from an +operating system shell, use + + (interactive-shell) + +** Interfacing with gpg + +defs.scm defines several convenience functions. Say you want to parse +the colon output from gpg, there is gpg-with-colons that splits the +result at newlines and colons, so you can use the result like this: + + (define (fpr some-key) + (list-ref (assoc "fpr" (gpg-with-colons + `(--with-fingerprint + --list-secret-keys ,some-key))) + 9)) + +Or if you want to count all non-revoked uids for a given key, do + + (define (count-uids-of-secret-key some-key) + (length (filter (lambda (x) (and (string=? "uid" (car x)) + (string=? "u" (cadr x)))) + (gpg-with-colons + `(--with-fingerprint + --list-secret-keys ,some-key))))) + +** Temporary files +(lettmp <bindings> <body>) will create and delete temporary files that +you can use in <body>. (with-temporary-working-directory <body>) will +create a temporary director, change to that, and clean it up after +executing <body>). + +make-temporary-file will create a temporary file. You can optionally +provide an argument to that function that will serve as tag so you can +distinguish the files for debugging. remove-temporary-file will +delete a file created using make-temporary-file. + +** Monadic transformer and pipe support +Tests often perform sequential transformations on files, or connect +processes using pipes. To aid you in this, the test framework +provides two monadic data structures. + +(Currently, the implementation mashes the 'bind' operation together +with the application of the monad. Also, there is no 'return' +operation. I guess all of that could be implemented on top of +call/cc, but it isn't at the moment.) +*** pipe +The pipe monad constructs pipe lines. It consists of a function +pipe:do that binds the functions together and manages the execution of +the child processes, a family of functions that act as sources, a +function to spawn processes, and a family of functions acting as +sinks. + +Sources are pipe:open, pipe:defer, pipe:echo. To spawn a process use +pipe:spawn, or the convenience function pipe:gpg. To sink the data +use pipe:splice, or pipe:write-to. + +Example: + + (pipe:do + (pipe:echo "3\n1\n2\n") + (pipe:spawn '("/usr/bin/sort")) + (pipe:write-to "sorted" (logior O_WRONLY O_CREAT) #o600)) + +Caveats: Due to the single-threaded nature of gpgscm you cannot use +both a source and sink that is implemented in Scheme. pipe:defer and +pipe:echo are executing in gpgscm, and so does pipe:splice. +*** tr +The transformer monad describes sequential file transformations. + +There is one source function, tr:open. To describe a transformation +using some process, use tr:spawn, tr:gpg, or tr:pipe-do. There are +several sinks, although sink is not quite the right term, because the +data is not consumed, and hence one can use them at any position. The +"sinks" are tr:write-to, tr:call-with-content, tr:assert-identity, and +tr:assert-weak-identity. + +A somewhat contrived example demonstrating many functions is: + + (tr:do + (tr:pipe-do + (pipe:echo "3\n1\n2\n") + (pipe:spawn '("/usr/bin/sort"))) + (tr:write-to "reference") + (tr:call-with-content + (lambda (c) + (echo "currently, c contains" (string-length c) "bytes"))) + (tr:spawn "" '("/usr/bin/gcc" -x c "-E" -o **out** **in**)) + (tr:pipe-do + (pipe:spawn '("/bin/grep" -v "#"))) + (tr:assert-identity "reference")) + +Caveats: As a convenience, gpgscm allows one to specify command line +arguments as Scheme symbols. Scheme symbols, however, are +case-insensitive, and get converted to lower case. Therefore, the -E +argument must be given as a string in the example above. Similarly, +you need to quote numerical values. +** Process management +If you just need to execute a single command, there is (call-with-fds +cmdline infd outfd errfd) which executes cmdline with the given file +descriptors bound to it, and waits for its completion returning the +status code. There is (call cmdline) which is similar, but calls the +command with a closed stdin, connecting stdout and stderr to stderr if +gpgscm is executed with --verbose. (call-check cmdline) raises an +exception if the command does not return 0. + +(call-popen cmdline input) calls a command, writes input to its stdin, +and returns any output from stdout, or raises an exception containing +stderr on failure. +* Sample messages diff --git a/tests/openpgp/all-tests.scm b/tests/openpgp/all-tests.scm new file mode 100644 index 0000000..d687fe4 --- /dev/null +++ b/tests/openpgp/all-tests.scm @@ -0,0 +1,78 @@ +;; Copyright (C) 2017 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(export all-tests + ;; Parse the Makefile.am to find all tests. + + (load (with-path "makefile.scm")) + + (define (expander filename port key) + (parse-makefile port key)) + + (define (parse filename key) + (parse-makefile-expand filename expander key)) + + (define setup + (make-environment-cache + (test::scm + #f + (path-join "tests" "openpgp" "setup.scm") + (in-srcdir "tests" "openpgp" "setup.scm")))) + + (define (qualify path variant) + (string-append "<" variant ">" path)) + + (define (setup* variant) + (make-environment-cache + (test::scm + #f + (qualify (path-join "tests" "openpgp" "setup.scm") variant) + (in-srcdir "tests" "openpgp" "setup.scm") + (string-append "--" variant)))) + + (define setup-use-keyring (setup* "use-keyring")) + (define setup-extended-key-format (setup* "extended-key-format")) + + (define all-tests + (parse-makefile-expand (in-srcdir "tests" "openpgp" "Makefile.am") + (lambda (filename port key) (parse-makefile port key)) + "XTESTS")) + + (define tests + (map (lambda (name) + (test::scm setup + (path-join "tests" "openpgp" name) + (in-srcdir "tests" "openpgp" name))) all-tests)) + + (when *run-all-tests* + (set! tests + (append + tests + (map (lambda (name) + (test::scm setup-use-keyring + (qualify (path-join "tests" "openpgp" name) + "use-keyring") + (in-srcdir "tests" "openpgp" name) + "--use-keyring")) all-tests) + (map (lambda (name) + (test::scm setup-extended-key-format + (qualify (path-join "tests" "openpgp" name) + "extended-key-format") + (in-srcdir "tests" "openpgp" name) + "--extended-key-format")) all-tests)))) + + tests) diff --git a/tests/openpgp/armdetach.scm b/tests/openpgp/armdetach.scm new file mode 100755 index 0000000..105f52d --- /dev/null +++ b/tests/openpgp/armdetach.scm @@ -0,0 +1,32 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking armored detached signatures" + (lambda (source) + (lettmp (tmp) + (call-popen `(,@GPG --yes --passphrase-fd "0" -sab + --output ,tmp ,source ) usrpass1) + (pipe:do + (pipe:open source (logior O_RDONLY O_BINARY)) + (pipe:spawn `(,@GPG --yes --verify ,tmp -))))) + (append plain-files data-files)) diff --git a/tests/openpgp/armdetachm.scm b/tests/openpgp/armdetachm.scm new file mode 100755 index 0000000..27038a0 --- /dev/null +++ b/tests/openpgp/armdetachm.scm @@ -0,0 +1,36 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define files (append plain-files data-files)) + +(info "Checking armored detached signatures of multiple files") +(lettmp (tmp) + (call-popen `(,@GPG --yes --passphrase-fd "0" -sab + --output ,tmp ,@files) usrpass1) + (pipe:do + (pipe:defer (lambda (sink) + (for-each (lambda (file) + (pipe:do + (pipe:open file (logior O_RDONLY O_BINARY)) + (pipe:splice sink))) + files))) + (pipe:spawn `(,@GPG --yes --verify ,tmp -)))) diff --git a/tests/openpgp/armencrypt.scm b/tests/openpgp/armencrypt.scm new file mode 100755 index 0000000..6d6ec4d --- /dev/null +++ b/tests/openpgp/armencrypt.scm @@ -0,0 +1,31 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking armored encryption" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg usrpass1 `(--yes --passphrase-fd "0" -ea --recipient ,usrname2)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + (append plain-files data-files)) diff --git a/tests/openpgp/armencryptp.scm b/tests/openpgp/armencryptp.scm new file mode 100755 index 0000000..4bcc058 --- /dev/null +++ b/tests/openpgp/armencryptp.scm @@ -0,0 +1,32 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking armored encryption and decryption using pipes" + (lambda (source) + (tr:do + (tr:open source) + (tr:pipe-do + (pipe:gpg `(--yes -ea --recipient ,usrname2)) + (pipe:gpg '(--yes --decrypt))) + (tr:assert-identity source))) + (append plain-files data-files)) diff --git a/tests/openpgp/armor.scm b/tests/openpgp/armor.scm new file mode 100755 index 0000000..3c117dd --- /dev/null +++ b/tests/openpgp/armor.scm @@ -0,0 +1,767 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define armored_key_8192 "-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: SKS 1.0.9 + +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 +=oXxa +-----END PGP PUBLIC KEY BLOCK----- +") + +;; Bug solved 2005-04-07: +;; Try importing the attached key file. As the key is exactly 8192 +;; bytes long, radix64_read is called twice - the first time to read +;; the 8192 bytes, and then once again, to handle the pad '=' on the +;; last four character radix64 block '0uI='. gpg bails out with +;; gpg: [don't know]: invalid packet (ctb=2d) +;; On a read for only the = sign, radix64_read returns -1 for EOF. +;; This causes the iobuf code to pop the armor filter and thus the next +;; byte read is the '-' from the END header line, causing an error. +(info "Checking armored_key_8192") +(pipe:do + (pipe:echo armored_key_8192) + (pipe:gpg '(--import))) + +(define nopad_armored_msg "-----BEGIN PGP MESSAGE----- +Version: GnuPG v1.4.11-svn5139 (GNU/Linux) + +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 +jnOKMUrdbDkbYM+ojXZ18/4WPKtaxf6lTLrh3m5CJ1V8slRJp0Jes74aDQf/OXqo +QgqVrI2wnl1klGwn06bhVaymdk0hMkxAfeHBGZIQ4BMMZ3aLuVWjAcBH/HP1tVQ4 +IG7MHRnm81yVNgA6yAuZZIPQwxDWVko7rRm/DnsJcpKfL0nZHoF+bJ6q4Rd6Dey1 +S96L4PDmXseFkVZOH/7dNWyKuvSA/MmthkN14lWJiYJebaXb7oZG3XDC70o7bG6Y +mtGOrOwVthFereg1Ii98ZA4nKgqeu2paMju/t03hQXHY5iqyV9ax0A3B0rdivz4U +VbqCcO7pGNb/Ki3gGc3hfVw9YXnR7E+tra19eE7UM7o+YlunKF1Q5dJaLKY1z3L9 +3UAJmXG/sZcLqrDn9zHfb/YxqbyIkM7VIU2kKztWCCNiNKgLQsIoVzK4sbS2LVDI +grmvZg+Q7EkwxZ1FXeBGJmsiyjKYPU3PI8ZBU1MXjwTjtnQRuBSxh+Ok9glPeE+1 +rUDdlVoogUGgPAvLV3BM43E/Q5VE+X04KvPNKINvvS1nZpGKyyy1MayOfstc7Hsw +W/RgllTEd7VW5jgZKg7YyA8r8cUjMqE7zewrq6MtkoFk6ZVslWxfoADBW3ivwdwe +I4XwNboOgBx77qxf95aHRRdqWZa0JF8zvK5BH6EpBI29hlJU4leax696ACA7QIIM +Rpc+ulkvHsNxsUlrUut9AXoob0MqDJRmZvU4gSVivHjvKLEIlymJw4pLbMWhcrNa +v94TExP21Fy/zYcWiZT2nCX6qZVXTcUcQGIrBTWDbR8bxKll4FNo/2zmelyFmeXt +iH+Zp2EwFAUELsrxx9plNd5WceyU9VnZoeucNFd2QFl7lV9KL8AlQaaMdsYOt27m +8j7iNBID4HtCYM0xLwE/5uqVQPxX6qzPPZc66MSRIi8ZHZPFvVilFVzFyZSrq5Lo +ojQQmAycQGOzx7dwx7vi9SeTrBRY2PK3WVurcLiRxM+2u9vjlxigwimpnK3VU1dh +GDoPghB3O34bfiV5GndcnPDLJxsSGWz2z2WiyCFgCkVp3shHUN5c2PLWDIOf/Ejz +LzNJXFKjO6/6ZGpMmGf6bZCa9MBnvXMNic9/k0lmtbgj8SS+2//gko1EDa/Gpaqo +J2xgEuHLvp9KQABWt9VRI+tNUJQCS/Jq10ZiT1TzhczyJEqbtVDOo0l5A5sMV0PO +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 +=3akT +-----END PGP MESSAGE----- + +") + +(define alpha_seckey "-----BEGIN PGP PRIVATE KEY BLOCK----- +Version: GnuPG v1.4.8 (GNU/Linux) + +lQHhBDbjjp4RBAC2ZbFDX0wmJI8yLDYQdIiZeAuHLmfyHsqXaLGUMZtWiAvn/hNp +ctwahmzKm5oXinHUvUkLOQ0s8rOlu15nhw4azc30rTP1LsIkn5zORNnFdgYC6RKy +hOeim/63+/yGtdnTm49lVfaCqwsEmBCEkXaeWDGq+ie1b89J89T6n/JquwCgoQkj +VeVGG+B/SzJ6+yifdHWQVkcD/RXDyLXX4+WHGP2aet51XlKojWGwsZmc9LPPYhwU +/RcUO7ce1QQb0XFlUVFBhY0JQpM/ty/kNi+aGWFzigbQ+HAWZkUvA8+VIAVneN+p ++SHhGIyLTXKpAYTq46AwvllZ5Cpvf02Cp/+W1aVyA0qnBWMyeIxXmR9HOi6lxxn5 +cjajA/9VZufOXWqCXkBvz4Oy3Q5FbjQQ0/+ty8rDn8OTaiPi41FyUnEi6LO+qyBS +09FjnZj++PkcRcXW99SNxmEJRY7MuNHt5wIvEH2jNEOJ9lszzZFBDbuwsjXHK35+ +lPbGEy69xCP26iEafysKKbRXJhE1C+tk8SnK+Gm62sivmK/5av4CAwKcF1Qep+Pf +ssOqtJhr+klruUBf55onBJi4vkk0gK3m32p/05YB2bbMURGz8R4JxUZfUxjdDk73 +LaNYRbQpQWxwaGEgVGVzdCAoZGVtbyBrZXkpIDxhbHBoYUBleGFtcGxlLm5ldD6I +VQQTEQIAFQUCNuOOngMLCgMDFQMCAxYCAQIXgAAKCRAtcnzHaGl3NDl4AJ4rouHB ++LpCkNi5C59jHEa1kbANzACgmddtrNSj1yPyTCwUwRghPUomECS0EEFsaWNlIChk +ZW1vIGtleSmIVQQTEQIAFQUCNuO2qwMLCgMDFQMCAxYCAQIXgAAKCRAtcnzHaGl3 +NCeMAJ9MeUVrago5Jc6PdwdeN5OMwby37QCghW65cZTQlD1bBlIq/QM8bz9AN4G0 +J0FsZmEgVGVzdCAoZGVtbyBrZXkpIDxhbGZhQGV4YW1wbGUubmV0PohVBBMRAgAV +BQI247hYAwsKAwMVAwIDFgIBAheAAAoJEC1yfMdoaXc0t8IAoJPwa6j+Vm5Vi3Nv +uo8JZri4PJ/DAJ9dqbmaJdB8FdJnHfGh1rXK3y/Jcp0BuAQ2448PEAQAnI3XH1f0 +uyN9fZnw72zsHMw706g7EW29nD4UDQG4OzRZViSrUa5n39eI7QrfTO+1meVvs0y8 +F/PvFst5jH68rPLnGSrXz4sTl1T4cop1FBkquvCAKwPLy0lE7jjtCyItOSwIOo8x +oTfY4JEEXmcqsbm+KHv9yYSF/YK4Cf7bIzcAAwcD/Rnl5jKxoucDA96pD2829TKs +LFQSau+Xiy8bvOSSDdlyABsOkNBSaeKO3eAQEKgDM7dzjVNTnAlpQ0EQ8Y9Z8pxO +WYEQYlaMrnRBC4DZ2IadzEhLlIOz5BVp/jfhrr8oVVBwKZXsrz9PZLz+e4Yn+siU +Uvlei9boD9L2ZgSOHakP/gIDApwXVB6n49+yw6e5k2VJBGTFDkQbxpgi4oslePpT +7Tc2qjAke4zO8JHkgKSokEgnMpMz412q9otFX/3qC5MpPG5P8f4r00Kfy9Am/thk +ri01WTIUqF8L/VZXJxLKVoRAabSXudG0eavfah14fN5/+Bw5i8vSHhc/xmQEKTya +2X8Nt1F5zMrE1LAGVVCL9i/DUygnJYOZzAd1Ct0RJ4kFj7lOBICF2IWWiEYEGBEC +AAYFAjbjjw8ACgkQLXJ8x2hpdzQgqQCgn81AaW8W/lyVwMh/UBeMuVMUb24An2uz +wg7Md81a5RI3F2FG8747t9gX +=VM1e +-----END PGP PRIVATE KEY BLOCK----- +") + +;; Bug 1179 solved 2010-05-12: +;; It occurred for messages of a multiple of the iobuf block size where +;; the last line had no pad character. Due to premature poppng of thea +;; rmor filter gpg swalled the CRC line and passed the '-----END...' +;; line on to the decryption layer. + +(info "Importing alpha_seckey") +(pipe:do + (pipe:echo alpha_seckey) + (pipe:gpg '(--import))) + +(info "Checking for bug #1179") +(tr:do + (tr:pipe-do + (pipe:echo nopad_armored_msg) + (pipe:gpg '(--decrypt)))) diff --git a/tests/openpgp/armsignencrypt.scm b/tests/openpgp/armsignencrypt.scm new file mode 100755 index 0000000..97595f0 --- /dev/null +++ b/tests/openpgp/armsignencrypt.scm @@ -0,0 +1,31 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking armored signing and encryption" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg usrpass1 `(--yes --passphrase-fd "0" -sea --recipient ,usrname2)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + (append plain-files data-files)) diff --git a/tests/openpgp/armsigs.scm b/tests/openpgp/armsigs.scm new file mode 100755 index 0000000..ccab816 --- /dev/null +++ b/tests/openpgp/armsigs.scm @@ -0,0 +1,31 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking armored signatures" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg usrpass1 `(--yes --passphrase-fd "0" -sa --recipient ,usrname2)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + (append plain-files data-files)) diff --git a/tests/openpgp/bug1223-bogus.asc b/tests/openpgp/bug1223-bogus.asc new file mode 100644 index 0000000..469e6b9 --- /dev/null +++ b/tests/openpgp/bug1223-bogus.asc @@ -0,0 +1,21 @@ +Bogus test key for bug 1223 (Designated revoker sigs are not properly merged) +Thanks to Daniel Kahn Gillmor for providing the test keys. + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.10 (GNU/Linux) + +mI0ES+OoSQEEAJUZ/+fC6DXN2X7Wxl4Huud/+i2qP1hcq+Qnbr7hVCKEnn0edYl+ +6xfsKmAMBjl+qTZxPSDSx4r3ciMiIbnvXFtlBAQmji86kqoR6fm9s8BN7LTq7+2/ +c2FHVF67D7zES7WgHc4i7CfiZnwXgkLvi5b1jBt+MTAOrFhdobxoy6/XABEBAAGI +twQfAQIAIQUCS+OsRRcMgAEAAAAAAAAAAAAAAAAAAAAAAAAAAQIHAAAKCRA0t9EL +wQjoOrRXBACBqhigTcj8pJY14AkjV+ZzUbm55kJRDPdU7NQ1PSvczm7HZaL3b8Lr +Psa5c5+caVLjsGWkQycQl7lUIGU84KoUfwACQKVVLkqJz8LkL54lLcwkG70+1NH5 +xoSNcHHVbYtqDLNeCOq5jEIoXuz44wiWVEfF+/B115PvgwZ63pjH1rRGVGVzdCBL +ZXkgRGVtb25zdHJhdGluZyBSZXZva2VyIFRyb3VibGUgKERPIE5PVCBVU0UpIDx0 +ZXN0QGV4YW1wbGUubmV0Poi+BBMBAgAoBQJL46hJAhsDBQkACTqABgsJCAcDAgYV +CAIJCgsEFgIDAQIeAQIXgAAKCRA0t9ELwQjoOgLpA/9/si2QYmietY9a6VlAmMri +mhZeqo6zyn8zrO9RGU7+8jmeb5nVnXw1YmZcw2fiJgI9+tTMkTfomyR6k0EDvcEu +2Mg3USkVnJfrrkPjSL9EajW6VpOUNxlox3ZT1oyEo3OOnVF1gC1reWYfy7Ns9zIB +1leLXbMr86zYdCoXp0Xu4g== +=YV5g +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/bug1223-good.asc b/tests/openpgp/bug1223-good.asc new file mode 100644 index 0000000..5622cb3 --- /dev/null +++ b/tests/openpgp/bug1223-good.asc @@ -0,0 +1,20 @@ +Good test key for bug 1223 (Designated revoker sigs are not properly merged) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.10 (GNU/Linux) + +mI0ES+OoSQEEAJUZ/+fC6DXN2X7Wxl4Huud/+i2qP1hcq+Qnbr7hVCKEnn0edYl+ +6xfsKmAMBjl+qTZxPSDSx4r3ciMiIbnvXFtlBAQmji86kqoR6fm9s8BN7LTq7+2/ +c2FHVF67D7zES7WgHc4i7CfiZnwXgkLvi5b1jBt+MTAOrFhdobxoy6/XABEBAAGI +twQfAQIAIQUCS+OsRRcMgAEO5b6XkoLYC591QPHM0u2U0hc56QIHAAAKCRA0t9EL +wQjoOrRXBACBqhigTcj8pJY14AkjV+ZzUbm55kJRDPdU7NQ1PSvczm7HZaL3b8Lr +Psa5c5+caVLjsGWkQycQl7lUIGU84KoUfwACQKVVLkqJz8LkL54lLcwkG70+1NH5 +xoSNcHHVbYtqDLNeCOq5jEIoXuz44wiWVEfF+/B115PvgwZ63pjH1rRGVGVzdCBL +ZXkgRGVtb25zdHJhdGluZyBSZXZva2VyIFRyb3VibGUgKERPIE5PVCBVU0UpIDx0 +ZXN0QGV4YW1wbGUubmV0Poi+BBMBAgAoBQJL46hJAhsDBQkACTqABgsJCAcDAgYV +CAIJCgsEFgIDAQIeAQIXgAAKCRA0t9ELwQjoOgLpA/9/si2QYmietY9a6VlAmMri +mhZeqo6zyn8zrO9RGU7+8jmeb5nVnXw1YmZcw2fiJgI9+tTMkTfomyR6k0EDvcEu +2Mg3USkVnJfrrkPjSL9EajW6VpOUNxlox3ZT1oyEo3OOnVF1gC1reWYfy7Ns9zIB +1leLXbMr86zYdCoXp0Xu4g== +=xsEd +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/bug537-test.data.asc b/tests/openpgp/bug537-test.data.asc new file mode 100644 index 0000000..b6b02e9 --- /dev/null +++ b/tests/openpgp/bug537-test.data.asc @@ -0,0 +1,960 @@ +This is a binary (gzip compressed) file which exhibits a problem with +the zlib decryptor. See encr-data.c:decrypt_data for a description of +the problem we solved with 1.9.92 (1.4.6). It is not easy to produce +such files, but this one works. The source file is also in the BTS +under the name check-data-410-1.data. The result of the decryption +should yield a file with the SHA-1 hash +4336AE2A528FAE091E73E59E325B588FEE795F9B. + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v1.4.5 (GNU/Linux) + +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 +qgtkR/1FowOQkyE= +=5l5y +-----END PGP MESSAGE----- + diff --git a/tests/openpgp/bug894-test.asc b/tests/openpgp/bug894-test.asc new file mode 100644 index 0000000..11223ea --- /dev/null +++ b/tests/openpgp/bug894-test.asc @@ -0,0 +1,565 @@ +Test key for bug 894. segv when importing certain keys with duplicated +user id. + + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Key Server 0.9.6 + +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 +pjU7TI+1eWg0mAtdAWGWaWFi6/uwUWCQD/G246LSBfQHdZDXFjT61YBvFvEnpb0e +Xx4E6RQJ9icBF8ckjWfEu8ghvwHTAqt1qAuWsAFqKgAfYlnOkZZTwG3v//xIALih +2KfiuRD0qPfJF8ScBHvhl21h/jfy96zJEsFadwaVDZ+pV6hsR0Ii02r2S+UGcLYF +7Nhxv9dGm5sjMzo41QF2RjG8RV5ekogAH8f3ysE3BgyqKmeMhKizKR35GvVL9vjj +Ia4UhGiUWbCbutpFVMxV1saQ8uG62LVituoTEgruz1CFdnQcEP52X5WTya7Xh0uo +ciMF5Sx+9t86j9Aic34MeRaoe42zlfx0p5Hl1KuLkCqBYc3nf3+JAhwEEgECAAYF +AkB2VUgACgkQHh0RbLTmcZQkjA//RtBpVxskkKz5uC0hZKQ1pmlYixXItbBL7qwn +V9VkY/c1te1IQh5FT0aJKuSA95bFhs1UP0wCuHDLmsGCeYb/Ij/EinEU/4+Qn1Nu +LG6PZ1zj+yT6mRJJek2R3cM1XSv/rAYeCP25u19yw/nBI+bSU/r1uZaOJFuy0DVs +urMa73k5Mxr3cRceikzTRR+M3CAh264E4HA1AUDr6CAhYxBjjERfH7hwsJL6JMSc +nbxgbYFq9S6lJWjFd+Asj/c35K1tON43b+dhd0C6kn+8v09bMTJjrqrjy0v///// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////+IRgQSEQIABgUCPhkNSwAKCRAXOrFG37Nm8m+5AJ971mhmPMA/x/OKCp84 +55CgtGndhwCeKztNwbBEIjsZ7oqdqmHchoz4a3SIRgQSEQIABgUCPrZbygAKCRAd +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 +AKCV+pcs+/Vww9F1+M5vQ19tfd8t3g== +=HtIh +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Key Server 0.9.6 + +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 +IM4K+97xXMM= +=STHU +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/clearsig.scm b/tests/openpgp/clearsig.scm new file mode 100755 index 0000000..b1c72c2 --- /dev/null +++ b/tests/openpgp/clearsig.scm @@ -0,0 +1,108 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define (check-signing args input) + (lambda (source sink) + (lettmp (signed) + (call-popen `(,@GPG --output ,signed --yes + ,@args ,source) input) + (call-popen `(,@GPG --output ,sink --yes --verify ,signed) "")))) + +(for-each-p + "Checking signing and verifying plain text messages" + (lambda (source) + ((if (equal? "plain-3" source) + ;; plain-3 does not end in a newline, and gpg will add one. + ;; Therefore, we merely check that the verification is ok. + check-execution + ;; Otherwise, we do check that we recover the original file. + check-identity) + source + (check-signing '(--passphrase-fd "0" --clear-sign) usrpass1))) + (append plain-files '("plain-large"))) + +;; The test vectors are lists of length three, containing +;; - a string to be signed, +;; - a flag indicating whether we verify that the exact message is +;; reconstructed (whitespace at the end is normalized for plain text +;; messages), +;; - and a list of arguments to add to gpg when encoding +;; the string. + +(define :string car) +(define :check-equality cadr) +(define :options caddr) + +(define + vectors + '(;; one with long lines + ("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyx + +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +" #t ()) + + ;; one with only one long line + ("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyx +" #t ()) + + ;; and one with an empty body + ("" #f ()) + + ;; and one with one empty line at the end + ("line 1 +line 2 +line 3 +there is a blank line after this + +" #t ()) + + ;; I think this file will be constructed wrong (gpg 0.9.3) but it + ;; should verify okay anyway. + ("this is a sig test + " #f ()) + + ;; check our special diff mode + ("--- mainproc.c Tue Jun 27 09:28:11 2000 ++++ mainproc.c~ Thu Jun 8 22:50:25 2000 +@@ -1190,16 +1190,13 @@ + md_enable( c->mfx.md, n1->pkt->pkt.signature->digest_algo); + } + /* ask for file and hash it */ +- if( c->sigs_only ) { ++ if( c->sigs_only ) + rc = hash_datafiles( c->mfx.md, NULL, + c->signed_data, c->sigfilename, + n1? (n1->pkt->pkt.onepass_sig->sig_class == 0x01):0 ); +" #t (--not-dash-escaped)))) + +(let ((counter (make-counter))) + (for-each-p' + "Checking signing and verifying test vectors" + (lambda (vec) + (lettmp (tmp) + (with-output-to-file tmp (lambda () (display (:string vec)))) + ((if (:check-equality vec) check-identity check-execution) + tmp + (check-signing `(--passphrase-fd "0" --clear-sign ,@(:options vec)) + usrpass1)))) + (lambda (vec) (counter)) + vectors)) diff --git a/tests/openpgp/compression.scm b/tests/openpgp/compression.scm new file mode 100755 index 0000000..d2e46cc --- /dev/null +++ b/tests/openpgp/compression.scm @@ -0,0 +1,36 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking encryption using a specific compression algorithm" + (lambda (compression) + (for-each-p + "" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg "" `(--yes --encrypt --recipient ,usrname2 + --compress-algo ,compression)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + (append plain-files data-files))) + (force all-compression-algos)) diff --git a/tests/openpgp/conventional-mdc.scm b/tests/openpgp/conventional-mdc.scm new file mode 100755 index 0000000..bb8327a --- /dev/null +++ b/tests/openpgp/conventional-mdc.scm @@ -0,0 +1,50 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define s2k '--s2k-count=65536) +(define passphrase "Hier spricht HAL") + +(for-each-p + "Checking conventional encryption with MDC" + (lambda (algo) + (for-each-p + "" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg passphrase `(--yes --passphrase-fd "0" ,s2k + --force-mdc -c + --cipher-algo ,algo)) + (tr:gpg passphrase `(--yes --passphrase-fd "0" --decrypt ,s2k)) + (tr:assert-identity source))) + '("plain-1" "data-80000"))) + (force all-cipher-algos)) + +(for-each-p + "Checking sign+symencrypt" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg passphrase `(--yes --passphrase-fd "0" ,s2k -cs)) + (tr:gpg passphrase `(--yes --passphrase-fd "0" --decrypt ,s2k)) + (tr:assert-identity source))) + (append plain-files data-files)) diff --git a/tests/openpgp/conventional.scm b/tests/openpgp/conventional.scm new file mode 100755 index 0000000..c480400 --- /dev/null +++ b/tests/openpgp/conventional.scm @@ -0,0 +1,49 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define s2k '--s2k-count=65536) +(define passphrase "Hier spricht HAL") + +(for-each-p + "Checking conventional encryption" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg passphrase `(--yes --passphrase-fd "0" ,s2k -c)) + (tr:gpg passphrase `(--yes --passphrase-fd "0" --decrypt ,s2k)) + (tr:assert-identity source))) + '("plain-2" "data-32000")) + +(for-each-p + "Checking conventional encryption using a specific cipher" + (lambda (algo) + (for-each-p + "" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg passphrase `(--yes --passphrase-fd "0" ,s2k -c + --cipher-algo ,algo)) + (tr:gpg passphrase `(--yes --passphrase-fd "0" --decrypt ,s2k)) + (tr:assert-identity source))) + '("plain-1" "data-80000"))) + (force all-cipher-algos)) diff --git a/tests/openpgp/decrypt-dsa.scm b/tests/openpgp/decrypt-dsa.scm new file mode 100755 index 0000000..9f39732 --- /dev/null +++ b/tests/openpgp/decrypt-dsa.scm @@ -0,0 +1,30 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking decryption of supplied DSA encrypted file" + (lambda (name) + (tr:do + (tr:open (in-srcdir "tests" "openpgp" (string-append name "-pgp.asc"))) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity name))) + (list (car plain-files))) diff --git a/tests/openpgp/decrypt-multifile.scm b/tests/openpgp/decrypt-multifile.scm new file mode 100755 index 0000000..304ca49 --- /dev/null +++ b/tests/openpgp/decrypt-multifile.scm @@ -0,0 +1,47 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(info "Checking decryption of supplied files using --multifile.") + +(define my-wd (getcwd)) +(define encrypted-files (map (lambda (name) + (string-append name ".asc")) + plain-files)) + +(with-temporary-working-directory + ;; First, copy the files so that GnuPG writes the decrypted files here + ;; and not into the source directory. + (for-each (lambda (name) + (file-copy (in-srcdir "tests" "openpgp" name) name)) + encrypted-files) + + ;; Now decrypt all files. + (call-check `(,@gpg --decrypt --multifile ,@encrypted-files)) + + ;; And verify the result. Reference files are in our original + ;; working directory courtesy of setup-legacy-environment. + (for-each-p + "Verifying files:" + (lambda (name) + (unless (file=? (path-join my-wd name) name) + (fail "decrypted file differs"))) + plain-files)) diff --git a/tests/openpgp/decrypt-session-key.scm b/tests/openpgp/decrypt-session-key.scm new file mode 100755 index 0000000..c3294e0 --- /dev/null +++ b/tests/openpgp/decrypt-session-key.scm @@ -0,0 +1,45 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2017 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define (get-session-key filename) + (lettmp (sink) + (let* ((status' (call-popen `(,@gpg --status-fd=1 --decrypt + --show-session-key + --output ,sink ,filename) "")) + (status (map (lambda (l) + (assert (string-prefix? l "[GNUPG:] ")) + (string-splitp (substring l 9 (string-length l)) + char-whitespace? -1)) + (string-split-newlines status')))) + (cadr (assoc "SESSION_KEY" status))))) + +(for-each-p + "Checking decryption of supplied files using the session key." + (lambda (name) + (let* ((source (in-srcdir "tests" "openpgp" (string-append name ".asc"))) + (key (get-session-key source))) + (with-ephemeral-home-directory setup-environment-no-atexit stop-agent + (tr:do + (tr:open source) + (tr:gpg "" `(--yes --decrypt --override-session-key ,key)) + (tr:assert-identity name))))) + plain-files) diff --git a/tests/openpgp/decrypt-unwrap-verify.scm b/tests/openpgp/decrypt-unwrap-verify.scm new file mode 100755 index 0000000..addc2da --- /dev/null +++ b/tests/openpgp/decrypt-unwrap-verify.scm @@ -0,0 +1,41 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2017 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(lettmp (steve's-key) + (call-check `(,@gpg --output ,steve's-key --export "1D777619BE310D79")) + + (for-each-p + "Checking unwrapping the encryption." + (lambda (name) + ;; First, unwrap the encrypted message using Steve's secret key. + (lettmp (unwrapped) + (tr:do + (tr:open (in-srcdir "tests" "openpgp" "samplemsgs" (string-append name ".asc"))) + (tr:gpg "" `(--yes --decrypt --unwrap)) + (tr:write-to unwrapped)) + + ;; Then, verify the signature with a clean working directory + ;; containing only Steve's public key. + (with-ephemeral-home-directory setup-environment-no-atexit stop-agent + (call-check `(,@gpg --import ,steve's-key)) + (call-check `(,@gpg --verify ,unwrapped))))) + '("encsig-2-keys-3" "encsig-2-keys-4"))) diff --git a/tests/openpgp/decrypt.scm b/tests/openpgp/decrypt.scm new file mode 100755 index 0000000..aae4c96 --- /dev/null +++ b/tests/openpgp/decrypt.scm @@ -0,0 +1,30 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking decryption of supplied files" + (lambda (name) + (tr:do + (tr:open (in-srcdir "tests" "openpgp" (string-append name ".asc"))) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity name))) + plain-files) diff --git a/tests/openpgp/default-key.scm b/tests/openpgp/default-key.scm new file mode 100755 index 0000000..3580cad --- /dev/null +++ b/tests/openpgp/default-key.scm @@ -0,0 +1,77 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +;; Import the sample key +;; +;; pub 1024R/8BC90111 2015-12-02 +;; Key fingerprint = E657 FB60 7BB4 F21C 90BB 6651 BC06 7AF2 8BC9 0111 +;; uid [ultimate] Barrett Brown <barrett@example.org> +;; sub 1024R/3E880CFF 2015-12-02 (encryption) +;; sub 1024R/F5F77B83 2015-12-02 (signing) +;; sub 1024R/45117079 2015-12-02 (encryption) +;; sub 1024R/1EA97479 2015-12-02 (signing) + +(info "Importing public key.") +(call-check + `(,(tool 'gpg) --import + ,(in-srcdir "tests" "openpgp" "samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc"))) + +;; By default, the most recent, valid signing subkey (1EA97479). +(for-each-p + "Checking that the most recent, valid signing subkey is used by default" + (lambda (keyid) + (tr:do + (tr:pipe-do + (pipe:defer (lambda (sink) (display "" (fdopen sink "w")))) + (pipe:gpg `(--default-key ,keyid -s)) + (pipe:gpg '(--verify --status-fd=1))) + (tr:call-with-content + (lambda (c) + (unless (string-contains? + c "VALIDSIG 5FBA84ACE02DCB17DA3DFF6BBCA43C441EA97479") + (exit 1)))))) + '("8BC90111" "3E880CFF" "F5F77B83" "45117079" "1EA97479")) + +;; But, if we request a particular signing key, we should get it. +(for-each-p + "Checking that the most recent, valid encryption subkey is used by default" + (lambda (keyid) + (tr:do + (tr:pipe-do + (pipe:defer (lambda (sink) (display "" (fdopen sink "w")))) + ;; We need another recipient, because --encrypt-to-default-key is + ;; not considered a recipient and gpg doesn't encrypt without any + ;; recipients. + ;; + ;; Note: it doesn't matter whether we specify the primary key or + ;; a subkey: the newest encryption subkey will be used. + (pipe:gpg `(--default-key ,keyid --encrypt-to-default-key + -r "439F02CA" -e)) + (pipe:gpg '(--list-packets))) + (tr:call-with-content + (lambda (c) + (unless (any (lambda (line) + (and (string-prefix? line ":pubkey enc packet:") + (string-suffix? line "45117079"))) + (string-split-newlines c)) + (exit 1)))))) + '("8BC90111" "3E880CFF" "F5F77B83" "45117079" "1EA97479")) diff --git a/tests/openpgp/defs.scm b/tests/openpgp/defs.scm new file mode 100644 index 0000000..b864005 --- /dev/null +++ b/tests/openpgp/defs.scm @@ -0,0 +1,509 @@ +;; Common definitions for the OpenPGP test scripts. +;; +;; Copyright (C) 2016, 2017 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +;; +;; Constants. +;; + +(define usrname1 "one@example.com") +(define usrpass1 "def") +(define usrname2 "two@example.com") +(define usrpass2 "") +(define usrname3 "three@example.com") +(define usrpass3 "") + +(define dsa-usrname1 "pgp5") +;; we use the sub key because we do not yet have the logic to derive +;; the first encryption key from a keyblock (I guess) (Well of course +;; we have this by now and the notation below will lookup the primary +;; first and then search for the encryption subkey.) +(define dsa-usrname2 "0xCB879DE9") + +(define keys + (package + (define (new fpr grip uids subkeys) + (package)) + (define (subkey fpr grip) + (package)) + (define alfa (new "A0FF4590BB6122EDEF6E3C542D727CC768697734" + "76F7E2B35832976B50A27A282D9B87E44577EB66" + '("alfa@example.net" "alpha@example.net") + (list + (subkey "3B3FBC948FE59301ED629EFB6AE6D7EE46A871F8" + "A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD")))) + (define one (new "289B0EF1D105E124B6F626020EF77096D74C5F22" + "50B2D4FA4122C212611048BC5FC31BD44393626E" + '("one@example.com") + (list + (subkey "EB467DCA4AD7676A6A62B2ABABAB28A247BE2775" + "7E201E28B6FEB2927B321F443205F4724EBE637E")))) + (define two (new "C1DEBB34EA8B71009EAFA474973D50E1C40FDECF" + "343D8AF79796EE107D645A2787A9D9252F924E6F" + '("two@example.com") + (list + (subkey "CD3D0F5701CBFCACB2A4907305A37887B27907AA" + "8B5ABF3EF9EB8D96B91A0B8C2C4401C91C834C34")))))) + +(define key-file1 "samplekeys/rsa-rsa-sample-1.asc") +(define key-file2 "samplekeys/ed25519-cv25519-sample-1.asc") + +(define plain-files '("plain-1" "plain-2" "plain-3" "plain-large")) +(define data-files '("data-500" "data-9000" "data-32000" "data-80000")) +(define exp-files '()) +(define all-files (append plain-files data-files)) + +(let ((verbose (string->number (getenv "verbose")))) + (if (number? verbose) + (*set-verbose!* verbose))) + +(define (qualify executable) + (string-append executable (getenv "EXEEXT"))) + +(define (getenv' key default) + (let ((value (getenv key))) + (if (string=? "" value) + default + value))) + +(define (percent-decode s) + (define (decode c) + (if (and (> (length c) 2) (char=? #\% (car c))) + (integer->char (string->number (string #\# #\x (cadr c) (caddr c)))) + #f)) + (let loop ((i 0) (c (string->list s)) (r (make-string (string-length s)))) + (if (null? c) + (substring r 0 i) + (let ((decoded (decode c))) + (string-set! r i (if decoded decoded (car c))) + (loop (+ 1 i) (if decoded (cdddr c) (cdr c)) r))))) +(assert (equal? (percent-decode "") "")) +(assert (equal? (percent-decode "%61") "a")) +(assert (equal? (percent-decode "foob%61r") "foobar")) + +(define (percent-encode s) + (define (encode c) + `(#\% ,@(string->list (number->string (char->integer c) 16)))) + (let loop ((acc '()) (cs (reverse (string->list s)))) + (if (null? cs) + (list->string acc) + (case (car cs) + ((#\: #\%) + (loop (append (encode (car cs)) acc) (cdr cs))) + (else + (loop (cons (car cs) acc) (cdr cs))))))) +(assert (equal? (percent-encode "") "")) +(assert (equal? (percent-encode "%61") "%2561")) +(assert (equal? (percent-encode "foob%61r") "foob%2561r")) + +(define tools + '((gpgv "GPGV" "g10/gpgv") + (gpg-connect-agent "GPG_CONNECT_AGENT" "tools/gpg-connect-agent") + (gpgconf "GPGCONF" "tools/gpgconf") + (gpg-preset-passphrase "GPG_PRESET_PASSPHRASE" + "agent/gpg-preset-passphrase") + (gpgtar "GPGTAR" "tools/gpgtar") + (gpg-zip "GPGZIP" "tools/gpg-zip") + (pinentry "PINENTRY" "tests/openpgp/fake-pinentry"))) + +(define bin-prefix (getenv "BIN_PREFIX")) +(define installed? (not (string=? "" bin-prefix))) +(define with-valgrind? (not (string=? (getenv "with_valgrind") ""))) + +(define (tool-hardcoded which) + (let ((t (assoc which tools))) + (getenv' (cadr t) + (qualify (if installed? + (string-append bin-prefix "/" (basename (caddr t))) + (string-append (getenv "objdir") "/" (caddr t))))))) + +;; You can splice VALGRIND into your argument vector to run programs +;; under valgrind. For example, to run valgrind on gpg, you may want +;; to redefine gpg: +;; +;; (set! gpg `(,@valgrind ,@gpg)) +;; +(define valgrind + '("/usr/bin/valgrind" -q --leak-check=no --track-origins=yes + --error-exitcode=154 --exit-on-first-error=yes)) + +(unless installed? + (setenv "GNUPG_BUILDDIR" (getenv "objdir") #t)) + +(define (gpg-conf . args) + (gpg-conf' "" args)) +(define (gpg-conf' input args) + (let ((s (call-popen `(,(tool-hardcoded 'gpgconf) + ,@(if installed? '() + (list '--build-prefix (getenv "objdir"))) + ,@args) input))) + (map (lambda (line) (map percent-decode (string-split line #\:))) + (string-split-newlines s)))) +(define :gc:c:name car) +(define :gc:c:description cadr) +(define :gc:c:pgmname caddr) +(define (:gc:o:name x) (list-ref x 0)) +(define (:gc:o:flags x) (string->number (list-ref x 1))) +(define (:gc:o:level x) (string->number (list-ref x 2))) +(define (:gc:o:description x) (list-ref x 3)) +(define (:gc:o:type x) (string->number (list-ref x 4))) +(define (:gc:o:alternate-type x) (string->number (list-ref x 5))) +(define (:gc:o:argument-name x) (list-ref x 6)) +(define (:gc:o:default-value x) (list-ref x 7)) +(define (:gc:o:default-argument x) (list-ref x 8)) +(define (:gc:o:value x) (if (< (length x) 10) "" (list-ref x 9))) + +(define (gpg-config component key) + (package + (define (value) + (let* ((conf (assoc key (gpg-conf '--list-options component))) + (type (:gc:o:type conf)) + (value (:gc:o:value conf))) + (case type + ((0 2 3) (string->number value)) + ((1 32) (substring value 1 (string-length value)))))) + (define (update value) + (let ((value' (cond + ((string? value) (string-append "\"" value)) + ((number? value) (number->string value)) + (else (throw "Unsupported value" value))))) + (gpg-conf' (string-append key ":0:" (percent-encode value')) + `(--change-options ,component)))) + (define (clear) + (gpg-conf' (string-append key ":16:") + `(--change-options ,component))))) + +(define gpg-components (apply gpg-conf '(--list-components))) + +(define (tool which) + (case which + ((gpg gpg-agent scdaemon gpgsm dirmngr) + (:gc:c:pgmname (assoc (symbol->string which) gpg-components))) + (else + (tool-hardcoded which)))) + +(define (gpg-has-option? option) + (string-contains? (call-popen `(,(tool 'gpg) --dump-options) "") + option)) + +(define have-opt-always-trust + (catch #f + (with-ephemeral-home-directory (lambda ()) (lambda ()) + (call-check `(,(tool 'gpg) --gpgconf-test --always-trust))) + #t)) + +(define GPG `(,(tool 'gpg) --no-permission-warning + ,@(if have-opt-always-trust '(--always-trust) '()))) +(define GPGV `(,(tool 'gpgv))) +(define PINENTRY (tool 'pinentry)) + +(define (tr:gpg input args) + (tr:spawn input `(,@GPG --output **out** ,@args **in**))) + +(define (pipe:gpg args) + (pipe:spawn `(,@GPG --output - ,@args -))) + +(define (gpg-with-colons args) + (let ((s (call-popen `(,@GPG --with-colons ,@args) ""))) + (map (lambda (line) (string-split line #\:)) + (string-split-newlines s)))) + +;; Convenient accessors for the colon output. +(define (:type x) (string->symbol (list-ref x 0))) +(define (:length x) (string->number (list-ref x 2))) +(define (:alg x) (string->number (list-ref x 3))) +(define (:expire x) (list-ref x 6)) +(define (:fpr x) (list-ref x 9)) +(define (:cap x) (list-ref x 11)) + +(define (have-public-key? key) + (catch #f + (pair? (filter (lambda (l) (and (equal? 'fpr (:type l)) + (equal? key::fpr (:fpr l)))) + (gpg-with-colons `(--list-keys ,key::fpr)))))) + +(define (have-secret-key? key) + (catch #f + (pair? (filter (lambda (l) (and (equal? 'fpr (:type l)) + (equal? key::fpr (:fpr l)))) + (gpg-with-colons `(--list-secret-keys ,key::fpr)))))) + +(define (have-secret-key-file? key) + (file-exists? (path-join (getenv "GNUPGHOME") "private-keys-v1.d" + (string-append key::grip ".key")))) + +(define (get-config what) + (string-split (caddar (gpg-with-colons `(--list-config ,what))) #\;)) + +(define all-pubkey-algos (delay (get-config "pubkeyname"))) +(define all-hash-algos (delay (get-config "digestname"))) +(define all-cipher-algos (delay (get-config "ciphername"))) +(define all-compression-algos (delay (get-config "compressname"))) + +(define (have-pubkey-algo? x) + (not (not (member x (force all-pubkey-algos))))) +(define (have-hash-algo? x) + (not (not (member x (force all-hash-algos))))) +(define (have-cipher-algo? x) + (not (not (member x (force all-cipher-algos))))) +(define (have-compression-algo? x) + (not (not (member x (force all-compression-algos))))) + +(define (gpg-pipe args0 args1 errfd) + (lambda (source sink) + (let* ((p (pipe)) + (task0 (spawn-process-fd `(,@GPG ,@args0) + source (:write-end p) errfd)) + (_ (close (:write-end p))) + (task1 (spawn-process-fd `(,@GPG ,@args1) + (:read-end p) sink errfd))) + (close (:read-end p)) + (wait-processes (list GPG GPG) (list task0 task1) #t)))) + +(setenv "GPG_AGENT_INFO" "" #t) +(setenv "GNUPGHOME" (getcwd) #t) +(define GNUPGHOME (getcwd)) + +;; +;; GnuPG helper. +;; + +;; Call GPG to obtain the hash sums. Either specify an input file in +;; ARGS, or an string in INPUT. Returns a list of (<algo> +;; "<hashsum>") lists. +(define (gpg-hash-string args input) + (map + (lambda (line) + (let ((p (string-split line #\:))) + (list (string->number (cadr p)) (caddr p)))) + (string-split-newlines + (call-popen `(,@GPG --with-colons ,@args) input)))) + +;; Dearmor a file. +(define (dearmor source-name sink-name) + (pipe:do + (pipe:open source-name (logior O_RDONLY O_BINARY)) + (pipe:spawn `(,@GPG --dearmor)) + (pipe:write-to sink-name (logior O_WRONLY O_CREAT O_BINARY) #o600))) + +(define (gpg-dump-packets source-name sink-name) + (pipe:do + (pipe:open source-name (logior O_RDONLY O_BINARY)) + (pipe:spawn `(,@GPG --list-packets)) + (pipe:write-to sink-name (logior O_WRONLY O_CREAT O_BINARY) #o600))) + +;; +;; Support for test environment creation and teardown. +;; + +(define (make-test-data filename size) + (call-with-binary-output-file + filename + (lambda (port) + (display (make-random-string size) port)))) + +(define (create-file name . lines) + (catch #f (unlink name)) + (letfd ((fd (open name (logior O_WRONLY O_CREAT O_BINARY) #o600))) + (let ((port (fdopen fd "wb"))) + (for-each (lambda (line) (display line port) (newline port)) + lines)))) + +(define (create-gpghome) + (log "Creating test environment...") + + (srandom (getpid)) + (make-test-data "random_seed" 600) + + (log "Creating configuration files") + + (if (flag "--use-keyring" *args*) + (create-file "pubring.gpg")) + + (create-file "gpg.conf" + "no-greeting" + "no-secmem-warning" + "no-permission-warning" + "batch" + "no-auto-key-retrieve" + "no-auto-key-locate" + "allow-weak-digest-algos" + "allow-weak-key-signatures" + "ignore-mdc-error" + (if have-opt-always-trust + "no-auto-check-trustdb" "#no-auto-check-trustdb") + (string-append "agent-program " + (tool 'gpg-agent) + "|--debug-quick-random\n") + ) + (create-file "gpg-agent.conf" + "allow-preset-passphrase" + "no-grab" + "enable-ssh-support" + (if (flag "--extended-key-format" *args*) + "enable-extended-key-format" "#enable-extended-key-format") + (string-append "pinentry-program " (tool 'pinentry)) + "disable-scdaemon")) + +;; Initialize the test environment, install appropriate configuration +;; and start the agent, without any keys. +(define (setup-environment) + (create-gpghome) + (start-agent)) + +(define (setup-environment-no-atexit) + (create-gpghome) + (start-agent #t)) + +(define (create-sample-files) + (log "Creating sample data files") + (for-each + (lambda (size) + (make-test-data (string-append "data-" (number->string size)) + size)) + '(500 9000 32000 80000)) + + (log "Unpacking samples") + (for-each + (lambda (name) + (dearmor (in-srcdir "tests" "openpgp" (string-append name "o.asc")) name)) + plain-files)) + +(define (create-legacy-gpghome) + (create-sample-files) + + (log "Storing private keys") + (for-each + (lambda (name) + (dearmor (in-srcdir "tests" "openpgp" "privkeys" (string-append name ".asc")) + (string-append "private-keys-v1.d/" name ".key"))) + '("50B2D4FA4122C212611048BC5FC31BD44393626E" + "7E201E28B6FEB2927B321F443205F4724EBE637E" + "13FDB8809B17C5547779F9D205C45F47CE0217CE" + "343D8AF79796EE107D645A2787A9D9252F924E6F" + "8B5ABF3EF9EB8D96B91A0B8C2C4401C91C834C34" + "0D6F6AD4C4C803B25470F9104E9F4E6A4CA64255" + "FD692BD59D6640A84C8422573D469F84F3B98E53" + "76F7E2B35832976B50A27A282D9B87E44577EB66" + "A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD" + "00FE67F28A52A8AA08FFAED20AF832DA916D1985" + "1DF48228FEFF3EC2481B106E0ACA8C465C662CC5" + "A2832820DC9F40751BDCD375BB0945BA33EC6B4C" + "ADE710D74409777B7729A7653373D820F67892E0" + "CEFC51AF91F68A2904FBFF62C4F075A4785B803F" + "1E28F20E41B54C2D1234D896096495FF57E08D18" + "EB33B687EB8581AB64D04852A54453E85F3DF62D" + "C6A6390E9388CDBAD71EAEA698233FE5E04F001E" + "D69102E0F5AC6B6DB8E4D16DA8E18CF46D88CAE3")) + + (log "Importing public demo and test keys") + (for-each + (lambda (file) + (call-check `(,@GPG --yes --import ,(in-srcdir "tests" "openpgp" file)))) + (list "pubdemo.asc" "pubring.asc" key-file1)) + + (pipe:do + (pipe:open (in-srcdir "tests" "openpgp" "pubring.pkr.asc") (logior O_RDONLY O_BINARY)) + (pipe:spawn `(,@GPG --dearmor)) + (pipe:spawn `(,@GPG --yes --import)))) + +(define (preset-passphrases) + (log "Presetting passphrases") + ;; one@example.com + (call-check `(,(tool 'gpg-preset-passphrase) + --preset --passphrase def + "50B2D4FA4122C212611048BC5FC31BD44393626E")) + (call-check `(,(tool 'gpg-preset-passphrase) + --preset --passphrase def + "7E201E28B6FEB2927B321F443205F4724EBE637E")) + ;; alpha@example.net + (call-check `(,(tool 'gpg-preset-passphrase) + --preset --passphrase abc + "76F7E2B35832976B50A27A282D9B87E44577EB66")) + (call-check `(,(tool 'gpg-preset-passphrase) + --preset --passphrase abc + "A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD"))) + +;; Initialize the test environment, install appropriate configuration +;; and start the agent, with the keys from the legacy test suite. +(define (setup-legacy-environment) + (create-gpghome) + (if (member "--unpack-tarball" *args*) + (begin + (call-check `(,(tool 'gpgtar) --extract --directory=. ,(cadr *args*))) + (start-agent)) + (begin + (start-agent) + (create-legacy-gpghome))) + (preset-passphrases)) + +;; Create the socket dir and start the agent. +(define (start-agent . args) + (log "Starting gpg-agent...") + (let ((gnupghome (getenv "GNUPGHOME"))) + (if (null? args) + (atexit (lambda () + (with-home-directory gnupghome (stop-agent)))))) + (catch (log "Warning: Creating socket directory failed:" (car *error*)) + (gpg-conf '--create-socketdir)) + (call-check `(,(tool 'gpg-connect-agent) --verbose + ,(string-append "--agent-program=" (tool 'gpg-agent) + "|--debug-quick-random") + /bye))) + +;; Stop the agent and other daemons and remove the socket dir. +(define (stop-agent) + (log "Stopping gpg-agent...") + (gpg-conf '--kill 'all) + (catch (log "Warning: Removing socket directory failed.") + (gpg-conf '--remove-socketdir))) + +;; Get the trust level for KEYID. Any remaining arguments are simply +;; passed to GPG. +;; +;; This function only supports keys with a single user id. +(define (gettrust keyid . args) + (let ((trust + (list-ref (assoc "pub" (gpg-with-colons + `(,@args + --list-keys ,keyid))) 1))) + (unless (and (= 1 (string-length trust)) + (member (string-ref trust 0) (string->list "oidreqnmfuws-"))) + (fail "Bad trust value:" trust)) + trust)) + +;; Check that KEYID's trust level matches EXPECTED-TRUST. Any +;; remaining arguments are simply passed to GPG. +;; +;; This function only supports keys with a single user id. +(define (checktrust keyid expected-trust . args) + (let ((trust (apply gettrust `(,keyid ,@args)))) + (unless (string=? trust expected-trust) + (fail keyid ": Expected trust to be" expected-trust + "but got" trust)))) + + +;; +;; Enable checking with valgrind if the envvar "with_valgrind" is set +;; +(when with-valgrind? + (set! gpg `(,@valgrind ,@gpg))) + + + +;; end diff --git a/tests/openpgp/delete-keys.scm b/tests/openpgp/delete-keys.scm new file mode 100755 index 0000000..16bde5f --- /dev/null +++ b/tests/openpgp/delete-keys.scm @@ -0,0 +1,109 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(let* ((key keys::alfa) + (subkey (car key::subkeys))) + (assert (have-public-key? key)) + (assert (have-public-key? subkey)) + (assert (have-secret-key? key)) + (assert (have-secret-key-file? key)) + (assert (have-secret-key? subkey)) + (assert (have-secret-key-file? subkey)) + + ;; Firstly, delete the secret key. + (call-check `(,@gpg --delete-secret-keys ,key::fpr)) + (assert (have-public-key? key)) + (assert (have-public-key? subkey)) + (assert (not (have-secret-key? key))) + (assert (not (have-secret-key-file? key))) + (assert (not (have-secret-key? subkey))) + (assert (not (have-secret-key-file? subkey))) + + ;; Now, delete the public key. + (call-check `(,@gpg --delete-keys ,key::fpr)) + (assert (not (have-public-key? key))) + (assert (not (have-public-key? subkey)))) + +;; Do the same for key one, but do the subkeys separately. +(let* ((key keys::one) + (subkey (car key::subkeys))) + (assert (have-public-key? key)) + (assert (have-public-key? subkey)) + (assert (have-secret-key? key)) + (assert (have-secret-key-file? key)) + (assert (have-secret-key-file? key)) + (assert (have-secret-key? subkey)) + (assert (have-secret-key-file? subkey)) + + ;; Firstly, delete the secret subkey. + (call-check `(,@gpg --delete-secret-keys ,subkey::fpr)) + (assert (have-public-key? key)) + (assert (have-public-key? subkey)) + ;; JW: Deleting the secret subkey also deletes the secret key. This + ;; is a deliberate design choice, and currently there is no way to + ;; delete the subkey without using --edit-key. + ;; XXX (assert (have-secret-key? key)) + ;; XXX (assert (have-secret-key-file? key)) + (assert (not (have-secret-key? subkey))) + (assert (not (have-secret-key-file? subkey))) + + ;; Then, delete the secret key. + ;; JW: We already deleted the key. See above. + ;; XXX (call-check `(,@gpg --delete-secret-keys ,key::fpr)) + (assert (have-public-key? key)) + (assert (have-public-key? subkey)) + (assert (not (have-secret-key? key))) + (assert (not (have-secret-key-file? key))) + (assert (not (have-secret-key? subkey))) + (assert (not (have-secret-key-file? subkey))) + + ;; Now, delete the public subkey. + (call-check `(,@gpg --delete-keys ,subkey::fpr)) + ;; JW: Deleting the subkey also deletes the key. This + ;; is a deliberate design choice, and currently there is no way to + ;; delete the subkey without using --edit-key. + ;; XXX (assert (have-public-key? key)) + (assert (not (have-public-key? subkey))) + + ;; Now, delete the public key. + ;; JW: We already deleted the key. See above. + ;; XXX (call-check `(,@gpg --delete-keys ,key::fpr)) + (assert (not (have-public-key? key))) + (assert (not (have-public-key? subkey)))) + +(let* ((key keys::two) + (subkey (car key::subkeys))) + (assert (have-public-key? key)) + (assert (have-public-key? subkey)) + (assert (have-secret-key? key)) + (assert (have-secret-key-file? key)) + (assert (have-secret-key? subkey)) + (assert (have-secret-key-file? subkey)) + + ;; Delete everything at once. + (call-check `(,@gpg --delete-secret-and-public-key ,key::fpr)) + (assert (not (have-public-key? key))) + (assert (not (have-public-key? subkey))) + (assert (not (have-secret-key? key))) + (assert (not (have-secret-key-file? key))) + (assert (not (have-secret-key? subkey))) + (assert (not (have-secret-key-file? subkey)))) diff --git a/tests/openpgp/detach.scm b/tests/openpgp/detach.scm new file mode 100755 index 0000000..12ed167 --- /dev/null +++ b/tests/openpgp/detach.scm @@ -0,0 +1,32 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking detached signatures" + (lambda (source) + (lettmp (tmp) + (call-popen `(,@GPG --yes --passphrase-fd "0" -sb + --output ,tmp ,source ) usrpass1) + (pipe:do + (pipe:open source (logior O_RDONLY O_BINARY)) + (pipe:spawn `(,@GPG --yes --verify ,tmp -))))) + (append plain-files data-files)) diff --git a/tests/openpgp/detachm.scm b/tests/openpgp/detachm.scm new file mode 100755 index 0000000..75faab7 --- /dev/null +++ b/tests/openpgp/detachm.scm @@ -0,0 +1,36 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define files (append plain-files data-files)) + +(info "Checking detached signatures of multiple files") +(lettmp (tmp) + (call-popen `(,@GPG --yes --passphrase-fd "0" -sb + --output ,tmp ,@files) usrpass1) + (pipe:do + (pipe:defer (lambda (sink) + (for-each (lambda (file) + (pipe:do + (pipe:open file (logior O_RDONLY O_BINARY)) + (pipe:splice sink))) + files))) + (pipe:spawn `(,@GPG --yes --verify ,tmp -)))) diff --git a/tests/openpgp/ecc.scm b/tests/openpgp/ecc.scm new file mode 100755 index 0000000..a63ec45 --- /dev/null +++ b/tests/openpgp/ecc.scm @@ -0,0 +1,249 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define keygrips '("8E06A180EFFE4C65B812150CAF19BF30C0689A4C" + "E4403F3FD7A443FAC29FEF288FA0D20AC212851E" + "0B7554421FFB14A06CB9F63FB49A85A58E97ABAC" + "303ACC892C2D786C8A789677C0BE54DA8538F903" + "9FE5C36985351524B6AFA19FDCBC1A3A750B6F5F" + "145A52CC7ED3FD41C5B0A26BE220FEED36AF24DE")) +(define mainkeyids '("BAA59D9C" "0F54719F" "45AF2FFE")) + +(unless (have-pubkey-algo? "ECDH") + (skip "No ECC support due to an old Libgcrypt")) + +(info "Preparing for ECC test") +(for-each + (lambda (grip) + (catch '() (unlink (string-append "private-keys-v1.d/" grip ".key"))) + (call-check `(,(tool 'gpg-preset-passphrase) + --preset --passphrase ecc ,grip))) + keygrips) + +(info "Importing ECC public keys") +(for-each + (lambda (keyid) + (call `(,(tool 'gpg) --delete-key --batch --yes ,keyid))) + mainkeyids) + +(for-each + (lambda (n) + (call-check `(,(tool 'gpg) --import + ,(in-srcdir "tests" "openpgp" (string-append + "samplekeys/ecc-sample-" + (number->string n) + "-pub.asc"))))) + '(1 2 3)) + +;; The following is an opaque ECDSA signature on a message "This is one +;; line\n" (17 byte long) by the primary 256 bit key: +(define msg_opaque_signed_256 "-----BEGIN PGP MESSAGE----- +Version: GnuPG v2.1.0-ecc (GNU/Linux) + +owGbwMvMwCHMvVT3w66lc+cwrlFK4k5N1k3KT6nUK6ko8Zl8MSEkI7NYAYjy81IV +cjLzUrk64lgYhDkY2FiZQNIMXJwCMO31rxgZ+tW/zesUPxWzdKWrtLGW/LkP5rXL +V/Yvnr/EKjBbQuvZSYa/klsum6XFmTze+maVgclT6Rc6hzqqxNy6o6qdTTmLJuvp +AQA= +=GDv4 +-----END PGP MESSAGE----") + +;; The following is an opaque ECDSA signature on a message "This is one +;; line\n" (17 byte long) by the primary 384 bit key: +(define msg_opaque_signed_384 "-----BEGIN PGP MESSAGE----- +Version: PGP Command Line v10.0.0 (Linux) + +qANQR1DIqwE7wsvMwCnM2WDcwR9SOJ/xtFISd25qcXFieqpeSUUJAxCEZGQWKwBR +fl6qQk5mXirXoXJmVgbfYC5xmC5hzsDPjHXqbDLzpXpTBXSZV3L6bAgP3Kq7Ykmo +7Ds1v4UfBS+3CSSon7Pzq79WLjzXXEH54MkjPxnrw+8cfMVnY7Bi18J702Nnsa7a +9lMv/PM0/ao9CZ3KX7Q+Tv1rllTZ5Hj4V1frw431QnHfAA== +=elKT +-----END PGP MESSAGE-----") + +;; The following is an opaque ECDSA signature on a message "This is one +;; line\n" (17 byte long) by the primary 521 bit key: +(define msg_opaque_signed_521 "-----BEGIN PGP MESSAGE----- +Version: PGP Command Line v10.0.0 (Linux) + +qANQR1DIwA8BO8LLzMAlnO3Y8tB1vf4/xtNKSdy5qcXFiempeiUVJQxAEJKRWawA +RPl5qQo5mXmpXIdmMLMy+AaLnoLpEubatpeJY2Lystd7Qt32q2UcvRS5kNPWtDB7 +ryufvcrWtFM7Jx8qXKDxZuqr7b9PGv1Ssk+I8TzB2O9dZC+n/jv+PAdbuu7mLe33 +Gf9pLd3weV3Qno6FOqxGa5ZszQx+uer2xH3/El9x/2pVeO4l15ScsL7qWMTmffmG +Ic1RdzgeCfosMF+l/zVRchcLKzenEQA= +=ATtX +-----END PGP MESSAGE-----") + +(lettmp (z) + (letfd ((fd (open z (logior O_WRONLY O_CREAT O_BINARY) #o600))) + (display "This is one line\n" (fdopen fd "wb"))) + + (for-each-p + "Checking opaque ECDSA signatures" + (lambda (test) + (lettmp (x y) + (call-with-output-file + x (lambda (p) (display (eval test (current-environment)) p))) + (call-check `(,(tool 'gpg) --output ,y --verify ,x)) + (unless (file=? y z) (fail "mismatch")))) + '(msg_opaque_signed_256 msg_opaque_signed_384 msg_opaque_signed_521))) + +;; +;; Import the secret keys so that we now can sign and decrypt. +;; +;; Note that the PGP generated secret keys are not self-signed, thus we +;; need to pass an appropriate option. +;; +(info "Importing ECC secret keys") +(setenv "PINENTRY_USER_DATA" "ecc" #t) +(for-each + (lambda (n) + (call-check `(,(tool 'gpg) --import + ,@(if (> n 1) '(--allow-non-selfsigned-uid) '()) + ,(in-srcdir "tests" "openpgp" (string-append + "samplekeys/ecc-sample-" + (number->string n) + "-sec.asc"))))) + '(1 2 3)) + +;; +;; Check a few sample encrtpted messages. +;; +(info "Checking ECC encryption") + +;; The following block encrypts the text "This is one line\n", 17 bytes, +;; with the subkey 4089AB73. +(define msg_encrypted_256 "-----BEGIN PGP MESSAGE----- +Version: GnuPG v2.1.0-ecc (GNU/Linux) + +hH4Dd863o0CJq3MSAgMEHdIYZQx+rV1cjy7qitIOEICFFzp4cjsRX4r+rDdMcQUs +h7VZmbP1c9C0s9sgCKwubWfkcYUl2ZOju4gy+s4MYTBb4/j8JjnJ9Bqn6LWutTXJ +zwsdP13VIJLnhiNqISdR3/6xWQ0ICRYzwb95nUZ1c1DSVgFpjPgUvi4pgYbTpcDB +jzILKWBfBDT/jck169XE8vgtbcqVQYZ7lZpaY9CzEbC+4dXZmV1gm5MafpTyFWgH +VnyrZB4gad9Lp9e0RKHHcOOE7s/NeLuu +=odUZ +-----END PGP MESSAGE-----") + +;; The following block encrypts the text "This is one line\n", 17 bytes, +;; with the subkey 9A201946: +(define msg_encrypted_384 "-----BEGIN PGP MESSAGE----- +Version: PGP Command Line v10.0.0 (Linux) + +qANQR1DBngOqi5OPmiAZRhIDAwQqIr/00cJyf+QP+VA4QKVkk77KMHdz9OVaR2XK +0VYu0F/HPm89vL2orfm2hrAZxY9G2R0PG4Wk5Lg04UjKca/O72uWtjdPYulFidmo +uB0QpzXFz22ZZinxeVPLPEr19Pow0EwCc95cg4HAgrD0nV9vRcTJ/+juVfvsJhAO +isMKqrFNMvwnK5A1ECeyVXe7oLZl0lUBRhLr59QTtvf85QJjg/m5kaGy8XCJvLv3 +61pZa6KUmw89PjtPak7ebcjnINL01vwmyeg1PAyW/xjeGGvcO+R4P1b4ewyFnJyR +svzIJcP7d4DqYOw7 +=oiTJ +-----END PGP MESSAGE-----") + +;; The following block encrypts the text "This is one line\n", 17 bytes, +;; with the subkey A81C4838: +(define msg_encrypted_521 "-----BEGIN PGP MESSAGE----- +Version: PGP Command Line v10.0.0 (Linux) + +qANQR1DBwAIDB+qqSKgcSDgSBCMEAKpzTUxB4c56C7g09ekD9I+ttC5ER/xzDmXU +OJmFqU5w3FllhFj4TgGxxdH+8fv4W2Ag0IKoJvIY9V1V7oUCClfqAR01QbN7jGH/ +I9GFFnH19AYEgMKgFmh14ZwN1BS6/VHh+H4apaYqapbx8/09EL+DV9zWLX4GRLXQ +VqCR1N2rXE29MJFzGmDOCueQNkUjcbuenoCSKcNT+6xhO27U9IYVCg4BhRUDGfD6 +dhfRzBLxL+bKR9JVAe46+K8NLjRVu/bd4Iounx4UF5dBk8ERy+/8k9XantDoQgo6 +RPqCad4Dg/QqkpbK3y574ds3VFNJmc4dVpsXm7lGV5w0FBxhVNPoWNhhECMlTroX +Rg== +=5GqW +-----END PGP MESSAGE-----") + +(lettmp (z) + (letfd ((fd (open z (logior O_WRONLY O_CREAT O_BINARY) #o600))) + (display "This is one line\n" (fdopen fd "wb"))) + + (for-each-p + "Checking ECDH decryption" + (lambda (test) + (lettmp (x y) + (call-with-output-file + x (lambda (p) (display (eval test (current-environment)) p))) + (call-check `(,@GPG --yes --output ,y --decrypt ,x)) + (unless (file=? y z) (fail "mismatch")))) + '(msg_encrypted_256 msg_encrypted_384 msg_encrypted_521))) + +;; +;; Now check that we can encrypt and decrypt our own messages. +;; +;; Note that we don't need to provide a passphrase because we already +;; preset the passphrase into the gpg-agent. +;; +(for-each-p + "Checking ECC encryption and decryption" + (lambda (source) + (for-each-p + "" + (lambda (keyid) + (tr:do + (tr:open source) + (tr:gpg "" `(--yes --encrypt --recipient ,keyid)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + mainkeyids)) + (append plain-files data-files)) + +;; +;; Now check that we can sign and verify our own messages. +;; +(for-each-p + "Checking ECC signing and verifiction" + (lambda (source) + (for-each-p + "" + (lambda (keyid) + (tr:do + (tr:open source) + (tr:gpg "" `(--yes --sign --local-user ,keyid)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + mainkeyids)) + (append plain-files data-files)) + +;; +;; Let us also try to import the keys only from a secret keyblock. +;; +;; Because PGP does not sign the UID, it is not very useful to work +;; with this key unless we go into the trouble of adding the +;; self-signature. +;; +(info "Importing ECC secret keys directly") +(for-each + (lambda (keyid) + (catch '() (unlink (string-append "private-keys-v1.d/" keyid ".key")))) + keygrips) +(for-each + (lambda (keyid) + (call `(,(tool 'gpg) --delete-key --batch --yes ,keyid))) + mainkeyids) + +(for-each + (lambda (n) + (call-check `(,(tool 'gpg) --import + ,@(if (> n 1) '(--allow-non-selfsigned-uid) '()) + ,(in-srcdir "tests" "openpgp" (string-append + "samplekeys/ecc-sample-" + (number->string n) + "-sec.asc"))))) + '(1 2 3)) diff --git a/tests/openpgp/enarmor.scm b/tests/openpgp/enarmor.scm new file mode 100755 index 0000000..1fe3256 --- /dev/null +++ b/tests/openpgp/enarmor.scm @@ -0,0 +1,31 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking armor encoding and decoding" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg "" `(--enarmor)) + (tr:gpg "" '(--dearmor)) + (tr:assert-identity source))) + (append plain-files data-files)) diff --git a/tests/openpgp/encrypt-dsa.scm b/tests/openpgp/encrypt-dsa.scm new file mode 100755 index 0000000..1658973 --- /dev/null +++ b/tests/openpgp/encrypt-dsa.scm @@ -0,0 +1,46 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking encryption using DSA" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg "" `(--yes --encrypt --recipient ,dsa-usrname2)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + (append plain-files data-files)) + +(for-each-p + "Checking encryption using DSA and a specific cipher algorithm" + (lambda (cipher) + (for-each-p + "" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg "" `(--yes --encrypt --recipient ,dsa-usrname2 + --cipher-algo ,cipher)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + (append plain-files data-files))) + (force all-cipher-algos)) diff --git a/tests/openpgp/encrypt-multifile.scm b/tests/openpgp/encrypt-multifile.scm new file mode 100755 index 0000000..1b69ff5 --- /dev/null +++ b/tests/openpgp/encrypt-multifile.scm @@ -0,0 +1,39 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define files (append plain-files data-files)) + +(info "Checking encryption of supplied files using --multifile.") + +;; Now encrypt all files. +(call-check `(,@gpg --encrypt --recipient ,usrname2 + --multifile ,@files)) + +;; And check if we can decrypt them. +(for-each-p + "Verifying files:" + (lambda (source) + (tr:do + (tr:open (string-append source ".gpg")) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + files) diff --git a/tests/openpgp/encrypt.scm b/tests/openpgp/encrypt.scm new file mode 100755 index 0000000..f59a1f0 --- /dev/null +++ b/tests/openpgp/encrypt.scm @@ -0,0 +1,61 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking encryption" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg "" `(--yes --encrypt --recipient ,usrname2)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + (append plain-files data-files)) + +(for-each-p + "Checking encryption using a specific cipher algorithm" + (lambda (cipher) + (for-each-p + "" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg "" `(--yes --encrypt --recipient ,usrname2 + --cipher-algo ,cipher)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + (append plain-files data-files))) + (force all-cipher-algos)) + + +;; We encrypt to two keys and we have also put the first key into our +;; pubring, so that decryption will work. +(for-each-p + "Checking encryption using a key from file" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg "" `(--yes -v --no-keyring --encrypt + --recipient-file ,(in-srcdir "tests" "openpgp" key-file1) + --hidden-recipient-file ,(in-srcdir "tests" "openpgp" key-file2))) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + plain-files) diff --git a/tests/openpgp/encryptp.scm b/tests/openpgp/encryptp.scm new file mode 100755 index 0000000..0f09a1e --- /dev/null +++ b/tests/openpgp/encryptp.scm @@ -0,0 +1,32 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking encryption and decryption using pipes" + (lambda (source) + (tr:do + (tr:open source) + (tr:pipe-do + (pipe:gpg `(--yes --encrypt --recipient ,usrname2)) + (pipe:gpg '(--yes --decrypt))) + (tr:assert-identity source))) + (append plain-files data-files)) diff --git a/tests/openpgp/export.scm b/tests/openpgp/export.scm new file mode 100755 index 0000000..aa6fa78 --- /dev/null +++ b/tests/openpgp/export.scm @@ -0,0 +1,100 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define (check-for predicate lines message) + (unless (any predicate lines) + (fail message))) + +(define (check-exported-key dump keyid) + (check-for (lambda (l) + (and (string-prefix? l " keyid: ") + (string-suffix? l keyid))) dump + "Keyid not found") + (check-for (lambda (l) (string-prefix? l ":user ID packet:")) dump + "User ID packet not found") + (check-for (lambda (l) + (and (string-prefix? l ":signature packet:") + (string-contains? l "keyid") + (string-suffix? l keyid))) dump + "Signature packet not found")) + +(define (check-exported-public-key packet-dump keyid) + (let ((dump (string-split-newlines packet-dump))) + (check-for (lambda (l) (string-prefix? l ":public key packet:")) dump + "Public key packet not found") + (check-exported-key dump keyid))) + +(define (check-exported-private-key packet-dump keyid) + (let ((dump (string-split-newlines packet-dump))) + (check-for (lambda (l) (string-prefix? l ":secret key packet:")) dump + "Secret key packet not found") + (check-exported-key dump keyid))) + +(lettmp + ;; Prepare two temporary files for communication with the fake + ;; pinentry program. + (logfile ppfile) + + (define (prepare-passphrases . passphrases) + (call-with-output-file ppfile + (lambda (port) + (for-each (lambda (passphrase) + (display passphrase port) + (display #\newline port)) passphrases)))) + + (define CONFIRM "fake-entry being started to CONFIRM the weak phrase") + + (define (assert-passphrases-consumed) + (call-with-input-file ppfile + (lambda (port) + (unless + (eof-object? (peek-char port)) + (fail (string-append + "Expected all passphrases to be consumed, but found: " + (read-all port))))))) + + (setenv "PINENTRY_USER_DATA" + (string-append "--logfile=" logfile " --passphrasefile=" ppfile) #t) + + (for-each-p + "Checking key export" + (lambda (keyid) + (tr:do + (tr:pipe-do + (pipe:gpg `(--export ,keyid)) + (pipe:gpg '(--list-packets))) + (tr:call-with-content check-exported-public-key keyid)) + + (if (string=? "D74C5F22" keyid) + ;; Key D74C5F22 is protected by a passphrase. Prepare this + ;; one. Currently, GnuPG does not ask for an export passphrase + ;; in this case. + (prepare-passphrases usrpass1)) + + (tr:do + (tr:pipe-do + (pipe:gpg `(--export-secret-keys ,keyid)) + (pipe:gpg '(--list-packets))) + (tr:call-with-content check-exported-private-key keyid)) + + (assert-passphrases-consumed)) + '("D74C5F22" "C40FDECF" "ECABF51D"))) diff --git a/tests/openpgp/fake-pinentry.c b/tests/openpgp/fake-pinentry.c new file mode 100644 index 0000000..fb0c6ae --- /dev/null +++ b/tests/openpgp/fake-pinentry.c @@ -0,0 +1,318 @@ +/* Fake pinentry program for the OpenPGP test suite. + * + * Copyright (C) 2016 g10 code GmbH + * + * This file is part of GnuPG. + * + * GnuPG is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * GnuPG is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <https://www.gnu.org/licenses/>. + */ + +#include <errno.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <stdarg.h> +#include <unistd.h> + +static FILE *log_stream; + + +static int +reply (const char *fmt, ...) +{ + int result; + va_list ap; + + if (log_stream) + { + fprintf (log_stream, "> "); + va_start (ap, fmt); + vfprintf (log_stream, fmt, ap); + va_end (ap); + } + va_start (ap, fmt); + result = vprintf (fmt, ap); + va_end (ap); + + fflush (stdout); + return result; +} + + +/* Return the first line from FNAME, removing it from the file. */ +static char * +get_passphrase (const char *fname) +{ + char *passphrase = NULL; + size_t fname_len; + char *fname_new; + FILE *source, *sink; + char linebuf[80]; + + fname_len = strlen (fname); + fname_new = malloc (fname_len + 5); + if (fname_new == NULL) + { + perror ("malloc"); + exit (1); + } + snprintf (fname_new, fname_len + 5, "%s.new", fname); + + source = fopen (fname, "r"); + if (! source) + { + perror (fname); + exit (1); + } + + sink = fopen (fname_new, "w"); + if (! sink) + { + perror (fname_new); + exit (1); + } + + while (fgets (linebuf, sizeof linebuf, source)) + { + linebuf[sizeof linebuf - 1] = 0; + if (passphrase == NULL) + { + passphrase = strdup (linebuf); + if (passphrase == NULL) + { + perror ("strdup"); + exit (1); + } + } + else + fputs (linebuf, sink); + } + + if (ferror (source)) + { + perror (fname); + exit (1); + } + + if (ferror (sink)) + { + perror (fname_new); + exit (1); + } + + fclose (source); + fclose (sink); + if (remove (fname)) + { + fprintf (stderr, "Failed to remove %s: %s", + fname, strerror (errno)); + exit (1); + } + + if (rename (fname_new, fname)) + { + fprintf (stderr, "Failed to rename %s to %s: %s", + fname, fname_new, strerror (errno)); + exit (1); + } + + free (fname_new); + return passphrase; +} + + +#define whitespacep(p) (*(p) == ' ' || *(p) == '\t' \ + || *(p) == '\r' || *(p) == '\n') + +/* rstrip line. */ +static void +rstrip (char *buffer) +{ + char *p; + if (!*buffer) + return; /* This is to avoid p = buffer - 1 */ + for (p = buffer + strlen (buffer) - 1; p >= buffer; p--) + { + if (! whitespacep (p)) + break; + *p = 0; + } +} + + +/* Skip over options in LINE. + + Blanks after the options are also removed. Options are indicated + by two leading dashes followed by a string consisting of non-space + characters. The special option "--" indicates an explicit end of + options; all what follows will not be considered an option. The + first no-option string also indicates the end of option parsing. */ +char * +skip_options (const char *line) +{ + while (whitespacep (line)) + line++; + while (*line == '-' && line[1] == '-') + { + while (*line && !whitespacep (line)) + line++; + while (whitespacep (line)) + line++; + } + return (char*) line; +} + + +/* Return a pointer to the argument of the option with NAME. If such + an option is not given, NULL is returned. */ +char * +option_value (const char *line, const char *name) +{ + char *s; + int n = strlen (name); + + s = strstr (line, name); + if (s && s >= skip_options (line)) + return NULL; + if (s && (s == line || whitespacep (s-1)) + && s[n] && (whitespacep (s+n) || s[n] == '=')) + { + s += n + 1; + s += strspn (s, " "); + if (*s && !whitespacep(s)) + return s; + } + return NULL; +} + +int +main (int argc, char **argv) +{ + char *args; + char *option_user_data = NULL; + int got_environment_user_data; + char *logfile; + char *passphrasefile; + char *passphrase; + + /* We get our options via PINENTRY_USER_DATA. */ + (void) argc, (void) argv; + + setvbuf (stdin, NULL, _IOLBF, BUFSIZ); + setvbuf (stdout, NULL, _IOLBF, BUFSIZ); + + args = getenv ("PINENTRY_USER_DATA"); + got_environment_user_data = !!args; + if (! args) + args = ""; + + restart: + logfile = option_value (args, "--logfile"); + if (logfile) + { + char *p = logfile, more; + while (*p && ! whitespacep (p)) + p++; + more = !! *p; + *p = 0; + args = more ? p+1 : p; + + log_stream = fopen (logfile, "a"); + if (! log_stream) + { + perror (logfile); + return 1; + } + } + + passphrasefile = option_value (args, "--passphrasefile"); + if (passphrasefile) + { + char *p = passphrasefile, more; + while (*p && ! whitespacep (p)) + p++; + more = !! *p; + *p = 0; + args = more ? p+1 : p; + + passphrase = get_passphrase (passphrasefile); + if (! passphrase) + { + reply ("# Passphrasefile '%s' is empty. Terminating.\n", + passphrasefile); + return 1; + } + + rstrip (passphrase); + } + else + { + passphrase = skip_options (args); + if (*passphrase == 0) + passphrase = "no PINENTRY_USER_DATA -- using default passphrase"; + } + + reply ("# fake-pinentry(%u) started. Passphrase='%s'.\n", + (unsigned int)getpid (), passphrase); + reply ("OK - what's up?\n"); + + while (! feof (stdin)) + { + char buffer[1024]; + + if (fgets (buffer, sizeof buffer, stdin) == NULL) + break; + + if (log_stream) + fprintf (log_stream, "< %s", buffer); + + rstrip (buffer); + +#define OPT_USER_DATA "OPTION pinentry-user-data=" + + if (strncmp (buffer, "GETPIN", 6) == 0) + reply ("D %s\n", passphrase); + else if (strncmp (buffer, "BYE", 3) == 0) + { + reply ("OK\n"); + break; + } + else if (strncmp (buffer, OPT_USER_DATA, strlen (OPT_USER_DATA)) == 0) + { + if (got_environment_user_data) + { + reply ("OK - I already got the data from the environment.\n"); + continue; + } + + if (log_stream) + fclose (log_stream); + log_stream = NULL; + free (option_user_data); + option_user_data = args = strdup (buffer + strlen (OPT_USER_DATA)); + goto restart; + } + + reply ("OK\n"); + } + +#undef OPT_USER_DATA + + reply ("# Connection terminated.\n"); + if (log_stream) + fclose (log_stream); + + free (option_user_data); + return 0; +} diff --git a/tests/openpgp/genkey1024.scm b/tests/openpgp/genkey1024.scm new file mode 100755 index 0000000..4edf490 --- /dev/null +++ b/tests/openpgp/genkey1024.scm @@ -0,0 +1,53 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-environment) + +(define (genkey config) + (pipe:do + (pipe:echo config) + (pipe:spawn `(,(tool 'gpg) --quiet --batch --generate-key)))) + +(info "Checking batch key generation") +(genkey "Key-Type: DSA +Key-Length: 1024 +Subkey-Type: ELG +Subkey-Length: 1024 +Name-Real: Harry H. +Name-Comment: test key +Name-Email: hh@@ddorf.de +Expire-Date: 1 +%no-protection +%transient-key +%commit +") + +(if (have-pubkey-algo? "RSA") + (genkey "Key-Type: RSA +Key-Length: 1024 +Key-Usage: sign,encrypt +Name-Real: Harry A. +Name-Comment: RSA test key +Name-Email: hh@@ddorf.de +Expire-Date: 2 +%no-protection +%transient-key +%commit +")) diff --git a/tests/openpgp/gpgconf.scm b/tests/openpgp/gpgconf.scm new file mode 100644 index 0000000..16e435d --- /dev/null +++ b/tests/openpgp/gpgconf.scm @@ -0,0 +1,47 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2017 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-environment) + +(for-each-p' + "Checking reading and writing configuration via gpgconf... " + (lambda (name opt make-value) + (call-with-progress + "" + (lambda (progress) + (do ((i 0 (+ 1 i))) ((> i 12) #t) + (let ((value (make-value i))) + (if value + (begin + (opt::update value) + (assert (equal? value (opt::value)))) + (begin + (opt::clear) + (assert (or (not (opt::value)) (string=? "" (opt::value))))))) + (progress "."))))) + (lambda (name . rest) name) + (list "keyserver" "verbose") + (list (gpg-config 'gpg "keyserver") + (gpg-config 'gpg "verbose")) + (list (lambda (i) (if (even? i) "hkp://foo.bar" "hkps://bar.baz")) + ;; gpgconf: argument for option verbose of type 0 (none) must + ;; be positive + (lambda (i) (+ 1 i)) + (lambda (i) (if (even? i) #f 1)))) diff --git a/tests/openpgp/gpgtar.scm b/tests/openpgp/gpgtar.scm new file mode 100755 index 0000000..906707f --- /dev/null +++ b/tests/openpgp/gpgtar.scm @@ -0,0 +1,94 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(catch (skip "gpgtar not built") + (call-check `(,(tool 'gpgtar) --help))) + +(define testfiles (append plain-files data-files)) +(define gpgargs + (if have-opt-always-trust + "--no-permission-warning --always-trust" + "--no-permission-warning")) + +(define (do-test create-flags inspect-flags extract-flags) + (lettmp (archive) + (call-check `(,(tool 'gpgtar) --gpg ,(tool 'gpg) --gpg-args ,gpgargs + ,@create-flags + --output ,archive + ,@testfiles)) + (tr:do + (tr:pipe-do + (pipe:spawn `(,(tool 'gpgtar) --gpg ,(tool 'gpg) --gpg-args ,gpgargs + --list-archive ,@inspect-flags + ,archive))) + (tr:call-with-content + (lambda (c) + (unless (all (lambda (f) (string-contains? c f)) testfiles) + (fail "some file(s) are missing from archive"))))) + + (with-temporary-working-directory + (call-check `(,(tool 'gpgtar) --gpg ,(tool 'gpg) --gpg-args ,gpgargs + --tar-args --directory=. + ,@extract-flags + ,archive)) + + (for-each + (lambda (f) (unless (call-with-input-file f (lambda (x) #t)) + (fail (string-append "missing file: " f)))) + testfiles)))) + +(info "Checking gpgtar without encryption") +(do-test '(--skip-crypto --encrypt) '(--skip-crypto) + '(--skip-crypto --decrypt)) + +(info "Checking gpgtar without encryption with nicer actions") +(do-test '(--create) '(--skip-crypto) '(--extract)) + +(info "Checking gpgtar with asymmetric encryption") +(do-test `(--encrypt --recipient ,usrname2) '() '(--decrypt)) + +(info "Checking gpgtar with asymmetric encryption and signature") +(do-test `(--encrypt --recipient ,usrname2 --sign --local-user ,usrname3) + '() '(--decrypt)) + +(info "Checking gpgtar with signature") +(do-test `(--sign --local-user ,usrname3) '() '(--decrypt)) + +(lettmp (passphrasefile) + (letfd ((fd (open passphrasefile (logior O_WRONLY O_CREAT O_BINARY) #o600))) + (display "streng geheimes hupsipupsi" (fdopen fd "wb"))) + + (let ((ppflags `(--gpg-args ,(string-append "--passphrase-file=" + passphrasefile)))) + (info "Checking gpgtar with symmetric encryption") + (do-test `(,@ppflags --symmetric) ppflags (cons '--decrypt ppflags)) + + (info "Checking gpgtar with symmetric encryption and chosen cipher") + (do-test `(,@ppflags --symmetric --gpg-args + ,(string-append "--cipher=" + (car (force all-cipher-algos)))) + ppflags (cons '--decrypt ppflags)) + + (info "Checking gpgtar with both symmetric and asymmetric encryption") + (do-test `(,@ppflags --symmetric --encrypt --recipient ,usrname2 + --sign --local-user ,usrname3) + ppflags (cons '--decrypt ppflags)))) diff --git a/tests/openpgp/gpgv-forged-keyring.scm b/tests/openpgp/gpgv-forged-keyring.scm new file mode 100755 index 0000000..886d265 --- /dev/null +++ b/tests/openpgp/gpgv-forged-keyring.scm @@ -0,0 +1,68 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define msg_signed_asc " +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +This is an example text file to demonstrate a problem. + +Using forged-keyring.gpg with signature cache, it looks like it is +signed by the following key: + + Echo Test (demo key) <echo@example.net> + +But actually not. + +It is signed by a key (steve.biko@example.net) distributed as: + + gnupg/tests/openpgp/samplekeys/rsa-rsa-sample-1.asc + +in GnuPG. + +The forged-keyring.gpg file is created by a key in + + gnupg/tests/openpgp/pubdemo.asc + +Replacing the raw key material packet by one of rsa-rsa-sample-1.asc. +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iQEcBAEBCAAGBQJXp+5MAAoJEKpD8dzH/tG3bGMH/1idFLJAaMxkrq+JguvAboiN +tAA44IdAgJvAxtR5w5fgfed7PfsH70+tj54/ZTObt7rZDIlj/YBQ7XeCwd7/O5vx +W0QtjjAxMuAPH80rVv4JIoflxV/deD8YaV9EhPE+6W5G0Z8SYL9B2RzdBVMwJY9+ +OZGJeKnUZ92Zg9jFr+H5gQNSeYdDHVDWYxr/xJUf0jYsZvAIBfB1mcSK1niiiVBv +GAcUC/I8g18a7pCS9Qf9iZflqxX4AXfocAGQqQAiG4744OCNhVa5q6TScqhaGUah +N1Glbw1OJfP1q+QFPMPKoCsTYmZpuugq2b5gV/eH0Abvk2pG4Fo/YTDPHhec7Jk= +=NnY/ +-----END PGP SIGNATURE----- +") + +(for-each-p + "Checking that a signature by bad key should not be verified" + (lambda (armored-file) + (catch '() + (pipe:do + (pipe:echo (eval armored-file (current-environment))) + (pipe:spawn `(,@GPGV --keyring ,(in-srcdir "tests" "openpgp" "forged-keyring.gpg")))) + (fail "verification succeeded but should not"))) + '(msg_signed_asc)) diff --git a/tests/openpgp/gpgv.scm b/tests/openpgp/gpgv.scm new file mode 100755 index 0000000..819d15f --- /dev/null +++ b/tests/openpgp/gpgv.scm @@ -0,0 +1,75 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016-2017 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(load (in-srcdir "tests" "openpgp" "signed-messages.scm")) +(setup-legacy-environment) + +(define keyring (if (file-exists? "pubring.kbx") "pubring.kbx" "pubring.gpg")) + +;; +;; Two simple tests to check that verify fails for bad input data +;; +(for-each-p + "Checking bogus signature" + (lambda (char) + (lettmp (x) + (call-with-binary-output-file + x + (lambda (port) + (display (make-string 64 (integer->char (string->number char))) + port))) + (if (= 0 (call `(,@gpgv --keyring ,keyring ,x data-500))) + (fail "no error code from verify")))) + '("#x2d" "#xca")) + +;; Fixme: We need more tests with manipulated cleartext signatures. + +;; +;; Now run the tests. +;; +(for-each-p + "Checking that a valid signature is verified as such" + (lambda (armored-file) + (pipe:do + (pipe:echo (eval armored-file (current-environment))) + (pipe:spawn `(,@gpgv --keyring ,keyring)))) + '(msg_ols_asc msg_cols_asc msg_sl_asc msg_oolss_asc msg_cls_asc msg_clss_asc)) + +(for-each-p + "Checking that an invalid signature is verified as such" + (lambda (armored-file) + (catch '() + (pipe:do + (pipe:echo (eval armored-file (current-environment))) + (pipe:spawn `(,@gpgv --keyring ,keyring))) + (fail "verification succeeded but should not"))) + '(bad_ls_asc bad_fols_asc bad_olsf_asc bad_ools_asc)) + + +;; Need to import the ed25519 sample key used for the next two tests. +(call-check `(,@gpg --quiet --yes + --import ,(in-srcdir "tests" "openpgp" key-file2))) +(for-each-p + "Checking that a valid Ed25519 signature is verified as such" + (lambda (armored-file) + (pipe:do + (pipe:echo (eval armored-file (current-environment))) + (pipe:spawn `(,@gpgv --keyring ,keyring)))) + '(msg_ed25519_rshort msg_ed25519_sshort)) diff --git a/tests/openpgp/import-revocation-certificate.scm b/tests/openpgp/import-revocation-certificate.scm new file mode 100644 index 0000000..c685dc5 --- /dev/null +++ b/tests/openpgp/import-revocation-certificate.scm @@ -0,0 +1,37 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +;; XXX because of --always-trust, the trustdb is not created. +;; Therefore, we redefine GPG without --always-trust. +(define gpg `(,(tool 'gpg) --no-permission-warning)) + +(info "Checking key revocation.") +(call-check `(,@gpg --import ,(in-srcdir "tests" "openpgp" "samplemsgs" + "revoke-2D727CC768697734.asc"))) +(let loop ((output (gpg-with-colons '(--list-secret-keys "2D727CC768697734")))) + (unless (null? output) + (let ((line (car output)) + (rest (cdr output))) + (when (member (car line) '("sec" "uid" "ssb")) + (unless (equal? (cadr line) "r") + (fail (car line) "not revoked."))) + (loop rest)))) diff --git a/tests/openpgp/import.scm b/tests/openpgp/import.scm new file mode 100755 index 0000000..1f4cb2e --- /dev/null +++ b/tests/openpgp/import.scm @@ -0,0 +1,61 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-environment) + +(info "Checking bug 894: segv importing certain keys.") +(call-check `(,(tool 'gpg) --import ,(in-srcdir "tests" "openpgp" "bug894-test.asc"))) + +(define keyid "0xC108E83A") +(info "Checking bug 1223: designated revoker sigs are not properly merged.") +(call `(,(tool 'gpg) --delete-key --batch --yes ,keyid)) +(call `(,(tool 'gpg) --import ,(in-srcdir "tests" "openpgp" "bug1223-bogus.asc"))) +(call `(,(tool 'gpg) --import ,(in-srcdir "tests" "openpgp" "bug1223-good.asc"))) +(tr:do + (tr:pipe-do + (pipe:gpg `(--list-keys --with-colons ,keyid))) + (tr:call-with-content + (lambda (c) + ;; XXX we do not have a regexp library + (unless (any (lambda (line) + (and (string-prefix? line "rvk:") + (string-contains? line ":0EE5BE979282D80B9F7540F1CCD2ED94D21739E9:"))) + (string-split-newlines c)) + (exit 1))))) + +(define fpr1 "9E669861368BCA0BE42DAF7DDDA252EBB8EBE1AF") +(define fpr2 "A55120427374F3F7AA5F1166DDA252EBB8EBE1AF") +(info "Checking import of two keys with colliding long key ids.") +(call `(,(tool 'gpg) --delete-key --batch --yes ,fpr1 ,fpr2)) +(call `(,(tool 'gpg) --import ,(in-srcdir "tests" "openpgp" "samplekeys/dda252ebb8ebe1af-1.asc"))) +(call `(,(tool 'gpg) --import ,(in-srcdir "tests" "openpgp" "samplekeys/dda252ebb8ebe1af-2.asc"))) +(tr:do + (tr:pipe-do + (pipe:gpg `(--list-keys --with-colons ,fpr1 ,fpr2))) + (tr:call-with-content + (lambda (c) + ;; XXX we do not have a regexp library + (let ((keys (filter + (lambda (line) + (and (string-prefix? line "pub:") + (string-contains? line ":4096:1:DDA252EBB8EBE1AF:"))) + (string-split-newlines c)))) + (unless (= 2 (length keys)) + (fail "Importing keys with long id collision failed")))))) diff --git a/tests/openpgp/issue2015.scm b/tests/openpgp/issue2015.scm new file mode 100755 index 0000000..2f0672d --- /dev/null +++ b/tests/openpgp/issue2015.scm @@ -0,0 +1,31 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-environment) + +(info "Checking passphrase cache (issue2015)...") +(call-check `(,(tool 'gpg-preset-passphrase) + --preset --passphrase some_passphrase some_id)) + +(let ((response (call-popen `(,(tool 'gpg-connect-agent)) + "GET_PASSPHRASE --no-ask some_id X X X"))) + (unless (string=? (string-rtrim char-whitespace? response) + "OK 736F6D655F70617373706872617365") + (fail "Could not retrieve passphrase from cache:" response))) diff --git a/tests/openpgp/issue2346.scm b/tests/openpgp/issue2346.scm new file mode 100755 index 0000000..9c29516 --- /dev/null +++ b/tests/openpgp/issue2346.scm @@ -0,0 +1,28 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-environment) + +(define key (in-srcdir "tests" "openpgp" "samplekeys/issue2346.gpg")) + +(info "Checking import statistics (issue2346)...") +(let ((status (call-popen `(,@GPG --status-fd=1 --import ,key) ""))) + (unless (string-contains? status "IMPORT_RES 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0") + (fail "Unexpected number of keys imported" status))) diff --git a/tests/openpgp/issue2417.scm b/tests/openpgp/issue2417.scm new file mode 100755 index 0000000..32fe47f --- /dev/null +++ b/tests/openpgp/issue2417.scm @@ -0,0 +1,32 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-environment) + +(define keyfile (in-srcdir "tests" "openpgp" "samplekeys" "rsa-rsa-sample-1.asc")) + +(define (touch file-name) + (close (open file-name (logior O_WRONLY O_BINARY O_CREAT) #o600))) + +(info "Checking robustness wrt empty databases in gnupghome (issue2417)...") +(touch "trustdb.gpg") +(touch "pubring.gpg") +(touch "pubring.kbx") +(call-check `(,(tool 'GPG) --import ,keyfile)) diff --git a/tests/openpgp/issue2419.scm b/tests/openpgp/issue2419.scm new file mode 100755 index 0000000..641fb32 --- /dev/null +++ b/tests/openpgp/issue2419.scm @@ -0,0 +1,29 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-environment) + +(info "Checking iobuf_peek corner case (issue2419)...") +(lettmp + (onebyte) + (dearmor (in-srcdir "tests" "openpgp" "samplemsgs/issue2419.asc") onebyte) + (catch (assert (string-contains? (car *error*) "invalid packet")) + (call-popen `(,@GPG --list-packets ,onebyte) "") + (fail "Expected an error but got none"))) diff --git a/tests/openpgp/issue2929.scm b/tests/openpgp/issue2929.scm new file mode 100644 index 0000000..d5c94cf --- /dev/null +++ b/tests/openpgp/issue2929.scm @@ -0,0 +1,32 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2017 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-environment) + +(catch (skip "Tofu not supported") + (call-check `(,@gpg --trust-model=tofu --list-config))) + +;; Redefine GPG without --always-trust and TOFU trust model. +(define gpg `(,(tool 'gpg) --no-permission-warning --trust-model=tofu)) + +(info "Checking TOFU trust model with ultimately trusted keys (issue2929).") +(call-check `(,@gpg --quick-generate-key frob@example.org)) +(call-check `(,@gpg --sign gpg.conf)) +(call-check `(,@gpg --verify gpg.conf.gpg)) diff --git a/tests/openpgp/issue2941.scm b/tests/openpgp/issue2941.scm new file mode 100755 index 0000000..8f625eb --- /dev/null +++ b/tests/openpgp/issue2941.scm @@ -0,0 +1,34 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2017 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define (check-failure options) + (let ((command `(,@gpg ,@options))) + (catch '() + (call-check command) + (error "Expected an error, but got none when executing" command)))) + +(for-each-p + "Checking invocation with invalid file descriptors (issue2941)." + (lambda (option) + (check-failure `(,(string-append "--" option "=23") --sign gpg.conf))) + '("status-fd" "attribute-fd" "logger-fd" + "override-session-key-fd" "passphrase-fd" "command-fd")) diff --git a/tests/openpgp/key-selection.scm b/tests/openpgp/key-selection.scm new file mode 100644 index 0000000..511c2e2 --- /dev/null +++ b/tests/openpgp/key-selection.scm @@ -0,0 +1,83 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +;; This test assumes a fixed time of 2004-01-01. + + ;; Redefine gpg with a fixed time. +(define gpg `(,@gpg --faked-system-time=1072911600)) + +;; We have a number of keys for Mr. Acejlnu Acdipr <acdipr@example.org>. +(define mailbox "acdipr@example.org") + +;; The keys are sorted, from the least relevant to the most relevant +;; key. +(define keys + '(("ED087E9D3394340738E20A244892A3CF8F65EBAC" + "no encryption-capable subkey, created: 2003-11-30, expires: 2006-11-29" + 4) + ("D7388651A1B7466D03B538428178E04B0BAA385B" + "encryption-capable subkey, created: 2000-12-31, expired: 2001-12-31" + 0) + ("DDEF1BEC66C8BAC8D69CED2AEABED840EC98B024" + "encryption-capable subkey, created: 2001-12-31, expires: 2006-12-30" + 1) + ("03FCFEDE014027DD897AD2F23D32670A96A9C2BF" + "encryption-capable subkey, created: 2002-12-31, expires: 2005-12-30" + 2) + ("B95BD6175CB6339244355BA160B8117E6119CED6" + "encryption-capable subkeys, last created: 2003-05-31, expires: 2005-05-30" + 3))) + +;; Accessors for the elements of KEYS. +(define :fpr car) +(define :comment cadr) +(define :number caddr) +(define (:filename key) + (in-srcdir "tests" "openpgp" "key-selection" + (string-append (number->string (:number key)) ".asc"))) + +(define (delete-keys which) + (call-check `(,@gpg --delete-keys ,@(map :fpr which)))) + +(define (import-keys which) + (call-check `(,@gpg --import ,@(map :filename which)))) + +(for-each-p' + "Checking key selection" + (lambda (set) + (import-keys set) + (let ((fpr (list-ref (assoc "fpr" + (gpg-with-colons `(--locate-key ,mailbox))) + 9)) + (expected (:fpr (last set)))) + (unless (equal? fpr expected) + (display "Given keys ") + (apply echo (map :fpr set)) + (echo "This is what --locate-key says:") + (display (call-popen `(,@gpg --locate-key ,mailbox) "")) + (echo "This is the key we expected:") + (display (call-popen `(,@gpg --list-keys ,expected) "")) + (fail "Expected" expected "but got" fpr))) + (delete-keys set)) + (lambda (set) + (length set)) + (filter (lambda (x) (not (null? x))) (powerset keys))) diff --git a/tests/openpgp/key-selection/0.asc b/tests/openpgp/key-selection/0.asc new file mode 100644 index 0000000..d40a98b --- /dev/null +++ b/tests/openpgp/key-selection/0.asc @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBDpPvC8BCACqDbU+2znCURAocNMmcwCSYVl5l4Zbx6jcy9ON7y12Ai7CRSbX +8Nb8kggit02pNFtb1l2NKad7DqR1f/WPqkQjZ6rvFHKEOsupqrUhpQ6dU3H94wuO +g4M2PGsaxKAcw24qIoKkTotecLgUFMhduIq7u8kTnalTOW1o/18moVuoVNkDdO4Y +I7n/dloVNv5Xkm5bS4VBdvUzJ9gvbqkynud/L6pSFeng0vVJQMN3tVbApcNzhLBs +G5Fvf9Rve4V8xTeBYQ+VRO7H9nvaS8YFf07kTwUDS69Vs8qIaLKOQJL3F75CileN +K7fb9OC3J4PNF0CDz+e2KkRRF6Q/xS8KXF9rABEBAAG0I0FjZWpsbnUgQWNkaXBy +IDxhY2RpcHJAZXhhbXBsZS5vcmc+iQFUBBMBCAA+FiEE1ziGUaG3Rm0DtThCgXjg +SwuqOFsFAjpPvC8CGwMFCQHhM4AFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQ +gXjgSwuqOFt7Lgf8DFDVQ4JykT8njX0+JkemSL2UUDH2iVRWkU6tKZPGneEnQGMm +iRfSX0im0pFHWxJ0vZsmUNq33Vr2sbvppT8Ti1rBx4TrdZ7PSEIEi1KTVSx6GKjr +2ObCax2u1p+u+tC35GfhV1Y1pUcSZXc45C1o259ivekRJY/fw9DrvR7154S3ygjp +lkEM4PC33216XMTqUG1sAWw40aDtKaiyp5J8zqLKXXjCnZsTWdj4uxB7E5WPjaEF +ylON/h+Hfw2RMzlYRGTbUu2G/Ma0TiycGJvT78myCpnc5akcKVZu1Wu4VDBqBC1N +dVcTzhJ5T4gwFCWHif3/MYqTVBnZSAVURtI3V7kBDQQ6T7wvAQgAuF5JaVAE9/Vv +K1U+VSAAhWMGSp6fwezgWdj0rn1GBx3DtqQkYXoLRjTrlBf1qOO6NPbBUi1gz8R+ +IQTHsesIXiUSlMige3/HxdSOsbzKipm1SGJedqUz3H03+yfr82NT+QvQmlEGX9k6 +goPY9t3r+O3F6ab4mc5NxFKhj2XvbRyf8I9J+3w6zXBWwsgLHacTCa13zGz6B0NH +dCk/2B6HTJeIJWpHdALQXp0/JcKWksw0Hsihpdu0QploUSPihZostRUKszOkugeu +W0t3fmt6on4fIFWveh9NSVDYIHKVMRU8cl5vRXNNRTsYQOarIvjmoUHv5u+UpZcc +iE/7wILNhQARAQABiQE8BBgBCAAmFiEE1ziGUaG3Rm0DtThCgXjgSwuqOFsFAjpP +vC8CGwwFCQHhM4AACgkQgXjgSwuqOFv9GAgAkACyK3Km4jFBqw7ah2xMxWCkdpgu +DdTi64ra6GyMQk/Lem8DzBO/ER/cavV9lg61qCOy7ecCNs7MhPiWZIod2bcV3JDZ +AglnGgTQ+lSpPXFCk3eoRktRsXesgQ1dE30uR9pypEqZ0BYNZZ2G2hRqAnRgUOOI +7THmf/X5w5KPKLlm3zOlGQomFy6lfOR9Zd5/QoKRNmuD9gNfSE+3vBvr+ISQPIev +Ch2qeC/N0BP5EoVE4SXp8l2oaaVJLi/Yx2J6vfximeeaBPxsKjuA+GJu6IIhegnY +X4kCxWStla+KuN0p0iNUh002pKybISuqyI9vgImH9Nh22Nf7mcRQWflR6A== +=nyjX +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/key-selection/1.asc b/tests/openpgp/key-selection/1.asc new file mode 100644 index 0000000..fea379c --- /dev/null +++ b/tests/openpgp/key-selection/1.asc @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBDww7w4BCADCvhkDDCAAtDpLCUa2ryPqWxlSSVKdyY9ecqjgEswijsZ+2T6O +Xr/50POpLbW9IWvHdvcifXUk1YZg8wLcnVIMwiZsdNSDM3MycoPoNc7pL5MaPGL6 +e9u+8HWX6aowOo5st6Y57HUeaKReH1Peb0avoEUIE9l4xqVx41AYrKViS7Zp5p9A +67thNKMisZ8aYutlhmVQB/uDO7XiKal07vjftf6aZazNBC5ZBOj4G+/TLcKMox8h +AaUJTkqsJcSCZTc7cMVjikmWItgKm6wIceGTpUGSvvZ3TnWUtgq3ivaMQrpyN3RT +tVM5uO2Mh8Uzkq9YWh2V7IT+jGKztrpdPKu3ABEBAAG0I0FjZWpsbnUgQWNkaXBy +IDxhY2RpcHJAZXhhbXBsZS5vcmc+iQFUBBMBCAA+FiEE3e8b7GbIusjWnO0q6r7Y +QOyYsCQFAjww7w4CGwMFCQlmAYAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQ +6r7YQOyYsCT0awf+NENO1grzmRfsyl8ODREmUlnnUAaRiZGQ0h+JkooXiwcm/p5O +DupjRc5OLluDtnjTLMBwNk5ysX6yqSNTni9qCCpm62PaIopG+r8RyFPp4aRjR1Q3 +mbwHkKifLRBxDxeCDKdrqFs7hkVCYOxjyiaEZ2BYogqFDwHFoiE6UwQvwZfpNWex +4Zx8nhoGpcegMMEiGREWCTi0H+zJrYOiVzV2jPQF5lkFkwYMQKNaNQv3L5v2/5AC +Nu6Kej+oYcw/EA+o3OXYLxwa+tijfKqUxtndFsQS/lYSUNszxrcm7dOAx52DCMpC +8MNHmwe3qmofO6G9svqG02bIZTdyJBob5nNBD7kBDQQ8MO8OAQgAttn9ru3Ou6+A +lAqbV7fAbpdeIF5bHy/QZtLxa2dpG8BTOXDcoMp9MUyKjafHbNr+z5unqqTfduXy +oRdJ1D/iXbSpcRkMKRJz4fa+uPNN5SiGzrjxHTcALPG8ctTUvdNrV+Z5VkssU+FW +LQD+s5SQWn848kYTacrDL22JshIpekmz3ztDoNGOZxVj2DwF/QXDeaRhXT9ngB3c +PY8x7e8yIvmAcg8olt9rKTpkGXZHWAyBpyGzBJkxM+wfiNreGMNUkv41G/R4d1Lv +xMlGF05xrBJX9YrV1pRM+EdS4WOs2gvFT3qnBzFAQBZ9nqaLAFVxw0Sl7C+wSQPk +7ZPIKYANFwARAQABiQE8BBgBCAAmFiEE3e8b7GbIusjWnO0q6r7YQOyYsCQFAjww +7w4CGwwFCQlmAYAACgkQ6r7YQOyYsCSDdwf/an06WTTAIwHj8PfXIkywnq3SWfSZ +yuRaFaDan9en8xAfyw2smNnrHnTk86CZWL6yPTij6JZYynv4OxtSafIoT9LxT7uX +VpEtSBpTnnojlHFivfRYMGJ9k/EXGgb941W2DTbvQqzafc2u4K3u8KnFOgzfEj5B +qjYzbt/L2uR2PLOAfYIUYzqTKjdzvSIX2DRvkepHhTwRbCjJrkF/zx0IXFoJeU/k +6tYK6cNNCFTWT0uLJCflAZMtGpf4KDvjlccNts3mZQbEov+Dymj/nZ9JRgjc2heH +Pxi5muPMQ8jAc2i4V8vTybozlZ5O/+JkOOOH0ciLpD3buhgYBY309DIVmA== +=zVE+ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/key-selection/2.asc b/tests/openpgp/key-selection/2.asc new file mode 100644 index 0000000..4b697f7 --- /dev/null +++ b/tests/openpgp/key-selection/2.asc @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBD4SIdsBCACqRRWUd9mwgRzVzaDbVLRdNOdyswPYuBKWlHI6Yx0lpfiQK6/X +rnRoR18lYJ0wBqImd/BJbjNE4bYaMUd+p7HzYIKzv8/DuvZQgovt9VIBn+a3YyCa +hdAaWEz994fjl8U5IGbrrGuV4XXlFATA6S7KX7CgxgiK/jVnRl1NVcTjOSnasU2J +LIbh0lawUe0b3HlwT8uFGg/MK3vHGGIalOJRlgeTBAF7zcaTfqoDiAXbbsfaxT4a +zB1OTRut1VOGBLWCsr09VCAMyz8awQqF81uG6cuv9swo76SuTiMcMMBfdNw3etVa +kLgL4JnsnMGM7c1fx/mfMUIUHYndDVT5LzQjABEBAAG0I0FjZWpsbnUgQWNkaXBy +IDxhY2RpcHJAZXhhbXBsZS5vcmc+iQFUBBMBCAA+FiEEA/z+3gFAJ92JetLyPTJn +Cpapwr8FAj4SIdsCGwMFCQWjmoAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQ +PTJnCpapwr/bGAgAjGWQ3F9RUpeI3ogLLhGMsXmsOxZX1ptNtjL9HiDsrUY5XCS1 +7vZUpRz0/2nscbu7or6Xy8yZtG0vLXwfzeOvHQz/F8tnzruIWBFSAU8WBidxKxmC +AUlQWg6bAp0aTxyyVi/r719J6k/G/ZOhjgXM243Ck9HNnY2a0h0ArKzPo56N8Cks +caXshdWxIh3M9uJKSxBCxfDTtqPcU7LjNApaUOFphpAPT9ypE/Zw9BZNTVN6vILr +I7upnG5PNXybMCDh2XhpXS2E5/rY9Y3/aFKthBws16JMAzBRKMQqWTTC9a8X+4pa +KcNtQih3X9eRzj4JBAh6cl5qXIbz+32EzXA8drkBDQQ+EiHbAQgAz017pYsm9Sf0 +z5HqOQLx1dwCclzVE5RhvI+qplPT5e9sLG+trbOVpGM6fjWAK/yuxaUJibm/44UX +cxsTuR7gpAwc+gvwrF3cG6kmT+g4kZ7/I4EyBMZjM9lhlIk77MCTLXcT9ONr7Pm4 +flQO+vM6ZYRFm7DtSHzP2z2Uu9USqgLJumn+V61xQXYj3E2ORczOV3blPVUoI7gl +aRnVdveEqrucw+miRWq3clykTdbuP39H2nRgY0KXGbOefWh5dRe2okxL5nlhINGL +lOyj9n4jM6fNp9K8jWeg8YJ7tKRsffrrNnIovslNlkXucYAzM2OveP+JxDdtosSK +fzWtUSzrmQARAQABiQE8BBgBCAAmFiEEA/z+3gFAJ92JetLyPTJnCpapwr8FAj4S +IdsCGwwFCQWjmoAACgkQPTJnCpapwr+p6wf/cO8apRVlpRrI2q92j5DJ0IQsBdUv +Srvp3w8UHZad0VkhgT+edbYHN8VS245ckyWoUBB78XEvxayMF1/Mx0N+u1MOM1dY +MrAiwbaQnE99yjifwVzZz6wJuJ94MMzWw38j22ZTbIBHPh/4nzSl84sN+KuEcP4f +C2h7mat4NDO/VRTf7xWuLInS5yGdDOACwROd85ua4YNxo54s5mcd6BVr4upHd1Hj +0TULgmWvqz49N40VY4GF+38OAC7+DSsdamHVNdTb0fT+KaxTQ0K5BCl+7Oe66CqH +RWxaXRUD4YMRh1jdgc+j4D3Sj4xhevu0Kd6+7BWxmxWZKdOCiu9TEDBjrg== +=YqE5 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/key-selection/3.asc b/tests/openpgp/key-selection/3.asc new file mode 100644 index 0000000..ab2ff73 --- /dev/null +++ b/tests/openpgp/key-selection/3.asc @@ -0,0 +1,43 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +vlWlPNIJSTq1Bg== +=rf5l +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/key-selection/4.asc b/tests/openpgp/key-selection/4.asc new file mode 100644 index 0000000..6a0ab9b --- /dev/null +++ b/tests/openpgp/key-selection/4.asc @@ -0,0 +1,18 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBD/KdpABCAD2wlP1kYHldknjyGTnMOUq9r+3/fJR8n4qVt5TRRlDdyfK3ZxM +KWStsmkZuK9dMxo4VSOjVeiXdZlHeQU7RlzVPsCNiJ1Qc2HDgHFdmT7eUgOILA12 +36bueRUwVPGmrBEecs0TpNRQ5CVFbO7mC6cTLhT9nRMd+W+BSuuZ8Zm98ebaVh3I +ml3nPEVhs1UFmIop48RGCt45MZ2mYp77kuAmk8NBJjHy9J4H5UK19r0hla2WY4a3 +Z59hh7kFnNFCM/MhPxd6GwkeXzUF7WSnhzRVIkdv81u2AnIHbo1zD0BUp8Rf64Ns +3iFAeB1VuR6ZJpEypHiHUJtYPmr9okEmg8EDABEBAAG0I0FjZWpsbnUgQWNkaXBy +IDxhY2RpcHJAZXhhbXBsZS5vcmc+iQFUBBMBCAA+FiEE7Qh+nTOUNAc44gokSJKj +z49l66wFAj/KdpACGwMFCQWjmoAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQ +SJKjz49l66xZ7QgA7dBJsQP09LhkYDIu8cJzRU6tqa2Y8dx0iFaCU8nqD/0q6xJf +fs2euwMEPsHWmA1WwGwxZpE/NGEksMSQ8TZSQUwCsURxBIiGww5MBtIGeO3ZzreR +Dn0Qhivbiup8ZPtPfFFomoK7ZtWjtGjZ8I5zyYbjT0eEB7P348dkpOtReWDiqGVd +taMnVau4OTDqTRo6fvAiVb37zoaWETsPWtq/TymgkqO/LEhzClzG8xJgpSl98cQW +BoHz5GDVYeVxPEKAN4DdS7gt0KTUC9ZQUcZP+1wTzFohDd/CeUAl4kTeP0QSJVJ3 +QC/WnHk4Y56q8/nngIY6w/wID/R/Cp+plw6F5w== +=BA1F +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/mds.scm b/tests/openpgp/mds.scm new file mode 100755 index 0000000..50761d0 --- /dev/null +++ b/tests/openpgp/mds.scm @@ -0,0 +1,69 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-environment) + +(define empty-string-hashes + `((1 "D41D8CD98F00B204E9800998ECF8427E" "MD5") + (2 "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709" "SHA1") + (3 "9C1185A5C5E9FC54612808977EE8F548B2258D31" "RIPEMD160") + (11 "D14A028C2A3A2BC9476102BB288234C415A2B01F828EA62AC5B3E42F" "SHA224") + (8 "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855" "SHA256") + (9 "38B060A751AC96384CD9327EB1B1E36A21FDB71114BE07434C0CC7BF63F6E1DA274EDEBFE76F65FBD51AD2F14898B95B" "SHA384") + (10 + "CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E" + "SHA512"))) + +(define abc-hashes + `((1 "C3FCD3D76192E4007DFB496CCA67E13B" "MD5") + (2 "32D10C7B8CF96570CA04CE37F2A19D84240D3A89" "SHA1") + (3 "F71C27109C692C1B56BBDCEB5B9D2865B3708DBC" "RIPEMD160") + (11 "45A5F72C39C5CFF2522EB3429799E49E5F44B356EF926BCF390DCCC2" "SHA224") + (8 "71C480DF93D6AE2F1EFAD1447C66C9525E316218CF51FC8D9ED832F2DAF18B73" "SHA256") + (9 "FEB67349DF3DB6F5924815D6C3DC133F091809213731FE5C7B5F4999E463479FF2877F5F2936FA63BB43784B12F3EBB4" "SHA384") + (10 "4DBFF86CC2CA1BAE1E16468A05CB9881C97F1753BCE3619034898FAA1AABE429955A1BF8EC483D7421FE3C1646613A59ED5441FB0F321389F77F48A879C7B1F1" "SHA512"))) + +;; Symbolic names for the triples above. +(define :algo car) +(define :value cadr) +(define :name caddr) + +;; Test whether HASH matches REF. +(define (test-hash hash ref) + (unless (eq? #f ref) + (if (not (string=? (:value hash) (:value ref))) + (fail "failed")))) + +;; Test whether the hashes computed over S match the REFERENCE set. +(define (test-hashes msg s reference) + (for-each-p' + msg + (lambda (hash) (test-hash hash (assv (:algo hash) reference))) + (lambda (hash) + (let ((ref (assv (:algo hash) reference))) + (if (eq? #f ref) + (string-append "no-ref-for:" (number->string (:algo hash))) + (:name ref)))) + (gpg-hash-string '(--print-mds) s))) + +(test-hashes "Hashing the empty string" + "" empty-string-hashes) +(test-hashes "Hashing the string \"abcdefghijklmnopqrstuvwxyz\"" + "abcdefghijklmnopqrstuvwxyz" abc-hashes) diff --git a/tests/openpgp/mkdemodirs b/tests/openpgp/mkdemodirs new file mode 100755 index 0000000..fd8a741 --- /dev/null +++ b/tests/openpgp/mkdemodirs @@ -0,0 +1,41 @@ +#!/bin/sh + +set -e + +# We need to use --no-options so that a gpg.conf from an older version +# of gpg is not used. +GPG="../../g10/gpg --no-options --batch --quiet + --no-secmem-warning --allow-secret-key-import" + +NAMES='Alpha Bravo Charlie Delta Echo Foxtrot Golf Hotel India + Juliet Kilo Lima Mike November Oscar Papa Quebec Romeo + Sierra Tango Uniform Victor Whisky XRay Yankee Zulu' + +if [ "$1" = "--clean" ]; then + (for i in $NAMES; do + [ -d $i ] && rm -r $i + done) || true + exit 0 +fi + +$GPG --dearmor -o secdemo.gpg --yes ../checks/secdemo.asc +$GPG --dearmor -o pubdemo.gpg --yes ../checks/pubdemo.asc +[ -f ./tdb.tmp ] && rm ./tdb.tmp +GPGDEMO="$GPG --homedir . --trustdb-name ./tdb.tmp --no-default-keyring + --keyring pubdemo.gpg --secret-keyring secdemo.gpg" +echo -n "Creating:" +for name in $NAMES; do + echo -n " $name" + [ -d $name ] && rm -r $name + mkdir $name + $GPGDEMO --export-secret-key -o - $name > $name/Secret.gpg + $GPG --homedir $name --import $name/Secret.gpg + $GPGDEMO --export -o - $name > $name/Public.gpg + $GPG --homedir $name --import $name/Public.gpg + [ -f $name/pubring.gpg~ ] && rm $name/pubring.gpg~ +done +echo "." +[ -f ./tdb.tmp ] && rm ./tdb.tmp +rm pubdemo.gpg secdemo.gpg + + diff --git a/tests/openpgp/multisig.scm b/tests/openpgp/multisig.scm new file mode 100755 index 0000000..75682eb --- /dev/null +++ b/tests/openpgp/multisig.scm @@ -0,0 +1,169 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +;; Check that gpg verifies only signatures where there is no ambiguity +;; in the order of packets. Needs the Demo Keys Lima and Mike. +;; +;; Note: We do not support multiple signatures anymore thus this test is +;; not really needed because verify could do the same. We keep it anyway. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define sig-1ls1ls-valid " +-----BEGIN PGP ARMORED FILE----- + +kA0DAAIRN8q1H7eRA/gBrCdiBXRleHQxOogq9EkgYW0gc29ycnksIEkgY2FuJ3Qg +ZG8gdGhhdAqIPwMFADqIKvQ3yrUft5ED+BEC2joAoJaSaXOZEtSZqQ780HIXG77e +8PB7AJ4wCprmaFTO0fBaTcXDuEOBdAWnOZANAwACETfKtR+3kQP4AawnYgV0ZXh0 +MTqIKvRJIGFtIHNvcnJ5LCBJIGNhbid0IGRvIHRoYXQKiD8DBQA6iCr0N8q1H7eR +A/gRAto6AKCWkmlzmRLUmakO/NByFxu+3vDwewCeMAqa5mhUztHwWk3Fw7hDgXQF +pzk= +=8jSC +-----END PGP ARMORED FILE----- +") +(define sig-ls-valid " +-----BEGIN PGP ARMORED FILE----- + +rCdiBXRleHQxOogrS0kgYW0gc29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqI +K0s3yrUft5ED+BECLQMAn2jZUNOpB4OuurSQkc2TRfg6ek02AJ9+oJS0frQ+yUsT +QDUFTH2PvZRxjw== +=J+lb +-----END PGP ARMORED FILE----- +") +(define sig-sl-valid " +-----BEGIN PGP ARMORED FILE----- + +iD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeDrrq0kJHNk0X4OnpNNgCffqCU +tH60PslLE0A1BUx9j72UcY+sJ2IFdGV4dDE6iCtLSSBhbSBzb3JyeSwgSSBjYW4n +dCBkbyB0aGF0Cg== +=N9MP +-----END PGP ARMORED FILE----- +") +(define sig-11lss-valid-but-is-not " +-----BEGIN PGP ARMORED FILE----- + +kA0DAAIRN8q1H7eRA/gAkA0DAAIRN8q1H7eRA/gBrCdiBXRleHQxOogyXUkgYW0g +c29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqIMl03yrUft5ED+BECwQAAnRXT +mXjVd385oD38W80XuheWKTGcAJ9pZ6/flaKDfw+SLido7xaUHuhp5Yg/AwUAOogy +XTfKtR+3kQP4EQLBAACgnN0IP+NztE0aAc/DZ17yHWR9diwAniN0P01WmbgZJoZB +Q341WRXKS/at +=Ekrs +-----END PGP ARMORED FILE----- +") +(define sig-11lss11lss-valid-but-is-not " +-----BEGIN PGP ARMORED FILE----- + +kA0DAAIRN8q1H7eRA/gAkA0DAAIRN8q1H7eRA/gBrCdiBXRleHQxOogyXUkgYW0g +c29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqIMl03yrUft5ED+BECwQAAnRXT +mXjVd385oD38W80XuheWKTGcAJ9pZ6/flaKDfw+SLido7xaUHuhp5Yg/AwUAOogy +XTfKtR+3kQP4EQLBAACgnN0IP+NztE0aAc/DZ17yHWR9diwAniN0P01WmbgZJoZB +Q341WRXKS/atkA0DAAIRN8q1H7eRA/gAkA0DAAIRN8q1H7eRA/gBrCdiBXRleHQx +OogyXUkgYW0gc29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqIMl03yrUft5ED ++BECwQAAnRXTmXjVd385oD38W80XuheWKTGcAJ9pZ6/flaKDfw+SLido7xaUHuhp +5Yg/AwUAOogyXTfKtR+3kQP4EQLBAACgnN0IP+NztE0aAc/DZ17yHWR9diwAniN0 +P01WmbgZJoZBQ341WRXKS/at +=P1Mu +-----END PGP ARMORED FILE----- +") +(define sig-ssl-valid-but-is-not " +-----BEGIN PGP ARMORED FILE----- + +iD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeDrrq0kJHNk0X4OnpNNgCffqCU +tH60PslLE0A1BUx9j72UcY+IPwMFADqIK0s3yrUft5ED+BECLQMAn2jZUNOpB4Ou +urSQkc2TRfg6ek02AJ9+oJS0frQ+yUsTQDUFTH2PvZRxj6wnYgV0ZXh0MTqIK0tJ +IGFtIHNvcnJ5LCBJIGNhbid0IGRvIHRoYXQK +=Zven +-----END PGP ARMORED FILE----- +") +(define sig-1lsls-invalid " +-----BEGIN PGP ARMORED FILE----- + +kA0DAAIRN8q1H7eRA/gBrCdiBXRleHQxOogq9EkgYW0gc29ycnksIEkgY2FuJ3Qg +ZG8gdGhhdAqIPwMFADqIKvQ3yrUft5ED+BEC2joAoJaSaXOZEtSZqQ780HIXG77e +8PB7AJ4wCprmaFTO0fBaTcXDuEOBdAWnOawnYgV0ZXh0MTqIK0tJIGFtIHNvcnJ5 +LCBJIGNhbid0IGRvIHRoYXQKiD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeD +rrq0kJHNk0X4OnpNNgCffqCUtH60PslLE0A1BUx9j72UcY8= +=nkeu +-----END PGP ARMORED FILE----- +") +(define sig-lsls-invalid " +-----BEGIN PGP ARMORED FILE----- + +rCdiBXRleHQxOogrS0kgYW0gc29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqI +K0s3yrUft5ED+BECLQMAn2jZUNOpB4OuurSQkc2TRfg6ek02AJ9+oJS0frQ+yUsT +QDUFTH2PvZRxj6wnYgV0ZXh0MTqIK0tJIGFtIHNvcnJ5LCBJIGNhbid0IGRvIHRo +YXQKiD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeDrrq0kJHNk0X4OnpNNgCf +fqCUtH60PslLE0A1BUx9j72UcY8= +=BlZH +-----END PGP ARMORED FILE----- +") +(define sig-lss-invalid " +-----BEGIN PGP ARMORED FILE----- + +rCdiBXRleHQxOogrS0kgYW0gc29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqI +K0s3yrUft5ED+BECLQMAn2jZUNOpB4OuurSQkc2TRfg6ek02AJ9+oJS0frQ+yUsT +QDUFTH2PvZRxj4g/AwUAOogrSzfKtR+3kQP4EQItAwCfaNlQ06kHg666tJCRzZNF ++Dp6TTYAn36glLR+tD7JSxNANQVMfY+9lHGP +=jmt6 +-----END PGP ARMORED FILE----- +") +(define sig-slsl-invalid " +-----BEGIN PGP ARMORED FILE----- + +iD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeDrrq0kJHNk0X4OnpNNgCffqCU +tH60PslLE0A1BUx9j72UcY+sJ2IFdGV4dDE6iCtLSSBhbSBzb3JyeSwgSSBjYW4n +dCBkbyB0aGF0Cog/AwUAOogrSzfKtR+3kQP4EQItAwCfaNlQ06kHg666tJCRzZNF ++Dp6TTYAn36glLR+tD7JSxNANQVMfY+9lHGPrCdiBXRleHQxOogrS0kgYW0gc29y +cnksIEkgY2FuJ3QgZG8gdGhhdAo= +=phBF +-----END PGP ARMORED FILE----- +") + +(for-each-p + "Checking that a valid signature is verified as such" + (lambda (armored-file) + (tr:do + (tr:pipe-do + (pipe:echo (eval armored-file (current-environment))) + (pipe:spawn `(,@GPG --dearmor))) + (tr:spawn "" `(,@GPG --verify **in**)))) + '(sig-sl-valid)) + +;; ??? +;; +;; #for i in "$sig-11lss-valid-but-is-not" "$sig-11lss11lss-valid-but-is-not" \ +;; # "$sig-ssl-valid-but-is-not"; do +;; # echo "$i" | $GPG --dearmor >x +;; # $GPG --verify <x 2>/dev/null || error "valid is invalid" +;; #done + +(for-each-p + "Checking that an invalid signature is verified as such" + (lambda (armored-file) + (lettmp (file) + (pipe:do + (pipe:echo (eval armored-file (current-environment))) + (pipe:spawn `(,@GPG --dearmor)) + (pipe:write-to file (logior O_WRONLY O_CREAT O_BINARY) #o600)) + + (if (= 0 (call `(,@GPG --verify ,file))) + (fail "Bad signature verified ok")))) + '(sig-1ls1ls-valid sig-ls-valid sig-1lsls-invalid + sig-lsls-invalid sig-lss-invalid sig-slsl-invalid)) diff --git a/tests/openpgp/plain-1-pgp.asc b/tests/openpgp/plain-1-pgp.asc new file mode 100644 index 0000000..9a83dcf --- /dev/null +++ b/tests/openpgp/plain-1-pgp.asc @@ -0,0 +1,27 @@ +This is an encrypted version of plain-1 for the PGP test key +0xCB879DE9 using 3DES. + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v1.3.5-cvs (GNU/Linux) + +hM4DW3oC8MuHnekQAv0U6qlDAA64QS/oZJErr1J77m5Dh7IFen3mAcwOxvL/POqS +HQWTFcuFT4LH9asSWgRe6DebJGfscMjMqNPAkhEJtKQQ2jEesn2Bon6SMwah7vkD +9Zap7WKHRlnB/Da1/xQC/ispXY7e5tuejnzoNSAOWFpBn354nvkKGaCfMRNuz3R2 +HljH+gXKRa00n2dPmvX9Mr8AI0Q+FoEI2/YW+6aUxmv8b0c2dP6HcL6HUu0Ro2Nl +RJNPfYXP20EL/Xrv8LN0Ksnp3YKTWrz5gQKNr3DH5pn1PjFqAKz4JD6rQBpnlh1c +03gLB1OAJWA6+/QNaEQV451GBZW3ul10R/6621/kk0Isdxn/htlD4Jl/jAvFdlQW +ULBu1HorZZ5X/IMuMRFwSQkx+H8i0zq+LGr8+rLFVTRuXBrgpeTLWs/f35DDblPp +jtPGSs1qql98PfOV1tAr16rGRLAAyNWEgi3yZWUGgq5dfFnRbJX1hrj9waQmq1g0 +mn1oB9Ig708xSZqcfFVFNpvIB7nmbFF/WaMnqfL3XmgTe8whKB/f/XYhg+W2d57h +EmTcAlC1N6IHY8/7YqtnjitavTIUsi0hPldX0tvrjsaZ7ppSma2epRJhx47jIFjw +wXOEByZE+K3pyTSN8KJxParDsqrTWFrL0t8az9W8lWG7YYsxUxk9cwRo5PyEko1M +kAKrbDMb+02Iw35yeuxFY33dl7KqpaWy43ksX/ROxX4S0InQywaQejXyt5A1cJN1 +t+G0aKdRp40MDKtOkZfFGlUSFZIhB0dxKVfSKJE/SIeYZzROTuyCNe/2wwufxgpa +uztUf5ipVnINupiztWGw5c5Wp40ptQ/0K4/35KrZhMoFGR9DtImAPpZocuiFdJDt +uqqapxGfJ876S4hFjRAkHSNRsAySul9zFLnIJ+Smk5xsvQZK4yjDwZfSs9b7WPKg +7NCxl5bF5dIbWRYdRBNjHQ4m3LyYmqKzQqALSYT54/9O35B7rb1fOB2SFIuME0QI +5XQq9QsH/f5rW8U6Ixzw1582B8fO1TMRhCqMyXozmsBJoWdCIQTQiVNyrbgLi+ss +wKiKq4AymLXFMSpI4TOCc+rKiAdMpLbNO8Ndox5hZEGz+mqg84cgC/rkJc/P03KR +uo0+rb5eSfJw9t+uzBXDmFHynayj0CB8wW9iwXknpdlHDo1z +=7Otr +-----END PGP MESSAGE----- diff --git a/tests/openpgp/plain-1.asc b/tests/openpgp/plain-1.asc new file mode 100644 index 0000000..f62fb15 --- /dev/null +++ b/tests/openpgp/plain-1.asc @@ -0,0 +1,26 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v1.3.5-cvs (GNU/Linux) + +hQEOA6urKKJHvid1EAQA0MchGc7vZsjUgxdII4lo/2jRDesMmLDN4U0uOgExvyhD +u1OtQBJF8iHgNdDEf8/R3GWhRE94IpVwLqzKTqfVmyKIFd80/Qe4h37TUPpEf8Ex +f7WaIBk/9OSDNKOkCwZ5OH9xGaorhBwYiTNJlEEGv5zcDte9ZoLO7WhWFfHp3b0E +AJYk/tf3oV4sJSn8AbUa8UC2tAdpNM1Lx+UEuCtxevYRpWeDVDok7/xuaa/wcb39 +lKyhUV+FBUH++k59K4GVqykOz02hmFl97O+4bAldgP6cVTm0Gh7jwMcJANzhLW/O +MR5birB+HPKOotMIfhggzxsAt6ESrviIlknkGqwKXWog0ukB/npOqQdu1GmvJqoC +k6ElA6xZPY5HTF/JLKlLXFfIIKLeuyckKwGDkVNFE7JYPW+dfxcGH9z1KXaNNllY +V4OKGQh3+gMaoJSY2X7PsmjC4fvi3g6rr360ATr5f82Mr8GPa3x21XLdIFZ04vTe +yE3kwdcarkiT1QQLnOXk/yRBxJwiA5loL9crVdC2WyOV3B3DG33/yas8krw4BYWw +DzAgxNtZR4MQXcj83WwoflMo43dYUq3Pk7ZnzKN04O8m9w0gxVxCpXu4ds9emMdJ +WS4eNTPUOnzeWttkfYcd3SarK6COi9iBosFT2QF80FwDSlH3XdEo7rD1j6WJ5GeX +RbHDvIm9g0xB23S7jmtfdqIHndvPKLmwW2B1VC1mbjcDUo6pyUb31GBd1zFVhT69 +ijhiEwBlr8uWxROdwJd/7IVIB/RYHLr5P3M8p08hdEdS1IMQbNEE4Y25fRdcc6g8 +fVEAExbG01K1EJhRLxoHzgnAkxDTV2HSwlqbFvKEzUfE+rMHApmSX2lfMvKgueYz +JpA7nxuf79Wk17bjNvuVQwokhXpzw7FyPPdD7h4Z30LW0ozvSVgs2tigWCAysIKB +3ZIolchqBoj0ddJgbPXrx09r1oCckEmdj1KtZsci9m+CFA8d22uxXBec0HkEHZpr +EHlqEZfNTmqowoDtJ8KT+S8VPsALEyDnrqm3s4i44OwgvsPiKOST1xwk6lIJ5isu +fO76RHTQ2jc8z7+sKyNffVugfjYVRj54/8Gj34QkrVo/42rlvg398tpbAbWuNq8w +PM//M6eVD4IRDYEGrGOk7prd9mgdbWnOWpasirhr41kePu2vsrIUkJWHmOgdMQDH +cSSzI8C5NpafROHAhMsUymcJ5dKksvPubh5IAdgtH+m6yDnNUJT8s6WV1f1RpSsQ +L/n3dhti76l0XtfZ7aST8j46B1JPNDx8+r6Xl9IUbSU= +=xK46 +-----END PGP MESSAGE----- diff --git a/tests/openpgp/plain-1o.asc b/tests/openpgp/plain-1o.asc new file mode 100644 index 0000000..973b293 --- /dev/null +++ b/tests/openpgp/plain-1o.asc @@ -0,0 +1,28 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GNUPG v0.3.4 (GNU/Linux) +Comment: Get GNUPG from ftp://ftp.guug.de/pub/gcrypt/ +Comment: Use "gpgm --dearmor" for unpacking + +PCEtLSBEaWVzIGlzdCBTZWl0ZSAzLCBkb3J0IGlzdCBrZWluZSBTZWl0ZW56YWhsIGFuZ2Vn +ZWJlbiwKICAgICBvYmVuIHJlY2h0cyBpc3Qgd2llZGVyIGRlciBTdGVtcGVsIHZvbiBtZWlu +ZW0gT3BhIHp1IGZpbmRlbiAtLT4KCjxzZWN0MT5OYW1lIDxxPkdyb98tQmFydGxvZmY8Lz4K +CjxwPgpEZXIgTmFtZSA8cS9CYXJ0bG9mZi8gaXN0IHNjaHdlciB6dSBkZXV0ZW4uIE1hbiBo +YXQgdmllbGUgTXV0bWHfdW5nZW4KYW5nZXN0ZWxsdCwgdm9uIGRlbmVuIG1hbiBhYmVyIGJp +c2xhbmcga2VpbmUgZWluemlnZSBhbHMgdW5iZWRpbmd0CnJpY2h0aWcgZXJrbORyZW4ga2Fu +bi4KPGZvbnRpbmZvIHJlbT0ibWl0IExlZXJ6ZWljaGVuIGdlc2NocmllYmVuIj5Vcmt1bmRs +aWNoPC8+IHdpcmQgZGFzCkRvcmYgYmlzIHp1ciBSZWZvcm1hdGlvbiBzdGV0cyA8cS9CYXJ0 +b3JmLyAoYW5ubyAxMjUzKSB1bmQKPHEvQmFyZG9yZi8gKDEzMDYsIDEzMTgsIDEzMjksIDE0 +MjkpIGdlbmFubnQgdW5kIGRhc18gc293b2hsIEtsZWluLQp3aWUgR3Jv32JhcnRsb2ZmLiBF +cnN0IDE1ODYgaW0gQmlzY2hvZnNzdGVpbmVyIEp1cmlzZGlrdGlvbmFsYnVjaApoZWnfdCB1 +bnNlciBEb3JmIDxxL0JhcnR0ZWxvZmYvIHVuZCBzbyBhdWNoIGluIGRlciDkbHRlc3RlbiBu +b2NoCnZvcmhhbmRlbmVuIEtpcmNoZW5yZWNobnVuZyB2b20gSmFocmUgMTY1MS4gTkFjaCBk +ZW0gSmFocmUgMTcwMCB3aXJkCmluIGRlbiBVcmt1bmRlbiBiZWdvbm5lbiwgZGVuIHZvbGxl +biBOYW1lbiA8cS9Hcm/fLUJhcnRsb2ZmLyB1bmQKPHEvS2xlaW4tQmFydGxvZmYvIHp1IHNj +aHJlaWJlbi4KLS0tLS0tLS0tLS0tLS0tLSBbd2VnZW4gZGFzaGVkIGVzY2FwZWQgdGV4dF0K +PHA+Ck5pbW10IG1hbiBhbiwgZGHfIGRpZSB1cmt1bmRsaWNoZSwg5Gx0ZXN0ZSBCZXplaWNo +bnVuZyBCYXJ0b3JmIGRpZQp1cnNwcvxuZ2xpY2hlIGlzdCB1bmQgbmljaHQgZGllIG11bmRh +cnRsaWNoZSBCYXJ0bG9mZiwgc28ga/ZubnRlIGRlcgpOYW1lIGd1dCBnZWRldXRldCB3ZXJk +ZW4gYWxzIERvcmYgYW4gZGVyIDxxL0JvcmRlLyBvZGVyIGFtIFJhbmRlCm9kZXIgYW4gZGVy +IEdyZW56ZSBlbnR3ZWRlciBkZXMgV2FsZGVzCg== +=m1k/ +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/plain-2.asc b/tests/openpgp/plain-2.asc new file mode 100644 index 0000000..5a774a6 --- /dev/null +++ b/tests/openpgp/plain-2.asc @@ -0,0 +1,31 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v1.3.5-cvs (GNU/Linux) + +hQEOA6urKKJHvid1EAP/aYXFOkxPzbBB0SWtyX+yyvZso8i1WJS3pzrHNXcXQSQx +xOAfmlCiuXYrjEzlyDAn7k7RLAhUB/ffI58HnbkQ7btWujrHig/V1tQ0j5igR85M +3y2/msWu2c2pyeZnx29LzeoJ2aMVTbMObszlG+TNOuhCNn4unvbShrkFjNK5fi8E +AIHiavE77ZPfcaUrXp6FJ6OuhbnJQ8y8CVpH++ddgU6xXK1vByMSsYqiOjfq08gV +MzqT1eMVvKhSjl3R6Ktl7j+ErYM4KuIofIZsKc8M3JnoTSrLqWSEBq+DEiaSI58i +SMJfzxfKA84bpJyLIjp4bjRIXveYoX8UjEnSNr3xuDIq0ukBoVe6Bx8lBActcwE+ +kE7EffSBHUmnm8cvwZan+Ms8t9p9aQEzBxV/LfEXZyk36lK35zCH188iJR+tt9zs +rNubkRuOjq9jAcBtrvgjTTO91Ru7z4RCYeMfnX9AauJZFShBNYN46GTIwqMWE9vq +B/IYFH9/L2nufcrDQ6u5WxJo0y2FoPqVS4RKEZ4FlKnlT2Op0X1k9w+1nWTtKwQx +fPsB+YRSKmVbZOXDeKAIVEyGHgR1Hj6pbo/IeHSJ2DJt5OFu6eLQYjxYjM7BPjPD +Gn+lTUvqw5ykYpCcnvpEx25+qHh5HI11Hi0sLKzvB92hhsQ7+lU2D+iAzsMJKdwE +u2bCnrZokzZwDBy6NISQ+hoc6NPPezQM4FLN0BB752fa9DYMQo5nEGfPUM7fv51A +nUdGOmaDVWY54GQxiYzl0JAT41sQSYlVHcWBCGNAm064y+tsHVjDYcf5uze/3Iuw +m/IbRGLBT7x+j2OqMX30yXoeHCg0/M/2c6vIzhdHEsJjTbTr+M4bMii/mB5kSo/7 +x5R14Lr0mwnPNDFHG2egqd5uL8985+5BENm7q0pQHKGM5NxkjVSWCpzRgKcSEq5A +x4Q2HbhEJNP6ZonnZkDmGM52Eq62eaR7t8+k9px35osfiTiClmVrjsTgl5Kvatk0 +oL1aYEwp8OtavoSwidUTk+Xb+cEE09P5bnCFs5Js0e5wdo+/izJ6iBuF+PndTh4i +4ppFmt8/GZ63MKBJu4CZE7QJMVAcmmCrsGRONP2JVgmyaBjrIl5xk9FPXQVY0AJx +gl3/jO/QFHYs+dlrQ3aqg8Mm0eZyLmZEYjoNibD8PW0keYiVfTF7EGl4jS2sAboc +AOzbuABa+30vIjJRWeW5UdTcLyNK7B2qWk6dqpRn9ps3cwCWUiTIcIRgot4PY+3M +8BL4smyZIP1Fmz/woL7gSVIaJHMExHjYPyRlfo+6Vfy3hh3zdiB9e5xA8QRFKgUb +Px5ShU5bBykfvFBJjgKU1XLBKqdklaudf3+v8F3LPIyuO6vTYzOIU9UKAHy9CrA2 +kAZ8kgHBTtAjmKuJjASBCZHPepq0G9SaRDQI5g4DXx0LXPX3y5xkwVI6kd0QmsMF +UU4ij/xjzIPN/AxBgQI8HKk56FnaX0JKoHm7mqWa+1TzbuvJjio4J/IN9XXzVqb1 +YL+mkx607hdW9oJltXLO5eio0pb12v/0YXAQlsrlJJNPCUW5hYFv/vH1rHzR98xx +nx4PXElm8VUuhKDxdVi9Ipo8fL9Amu3PwYonzOck3R2W4wwlmcopVQQ= +=Ng8B +-----END PGP MESSAGE----- diff --git a/tests/openpgp/plain-2o.asc b/tests/openpgp/plain-2o.asc new file mode 100644 index 0000000..562e5f0 --- /dev/null +++ b/tests/openpgp/plain-2o.asc @@ -0,0 +1,36 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GNUPG v0.3.4 (GNU/Linux) +Comment: Get GNUPG from ftp://ftp.guug.de/pub/gcrypt/ +Comment: Use "gpgm --dearmor" for unpacking + +Cgo8c2VjdD5Wb3J3b3J0CjxwPgpEZXIgV2VydCBlaW5lciBPcnRzY2hyb25payBpc3Qgb2Zm +ZW5iYXIgdW5kIGJlZGFyZiBrZWluZXIgRXL2cnRlcnVuZy4KTWl0IEF1c2JydWNoIGRlcyBX +ZWx0a3JpZWdlc18sIGlubWl0dGVuIGRlciBnZXdhbHRpZ2VuIEdlc2NoZWhuaXNzZSwgZvxo +bHRlCmRlciBLbGVydXNfIHVuc2VyZXNfIEVpY2hzX2ZlbGRlc18gZGFzXyBtZWhyIHdpZSBm +cvxoZXIgdW5kIHNvCmVyc3Rhcmt0ZSBkYXNfIFN0cmViZW4sIGVpbmUgc29sY2hlIE9ydHNf +Z2VzY2hpY2h0ZSB6dSBzY2FoZmZlbiwgdW0KdW5zZXJlbiBOYWNoa29tbWVuIHp1IGJlcmlj +aHRlbiwgd2FzXyBhdWNoIGRpZSBrbGVpbnN0ZW4gRPZyZmVyIGluCmRlciBncm/fZW4gWmVp +dCBnZWxlaXN0ZXQsIGVybGVidCB1bmQgZXJsaXR0ZW4gaGFiZW4uCjxwPgpVbmQgc28gYmVn +YW5uIGF1Y2ggaWNoIGltIERlemVtYmVyIDE5MTQsIGRlbiA/Pz8/Pz8/Pz8KU3RvZmYsIHdv +IGltbWVyIGljaCBpaG4gYXVjaCBudXIgc28gc3DkcmxpY2ggZmluZGVuIGtvbm50ZSwgenUK +c2FtbWVsbiwgaWNoIGJlZnJhZ3RlIHp1buRjaHN0IGVtc2lnIGRpZSDkbHRlc3RlbiBMZXV0 +ZSwKZHVyY2hmb3JzY2h0ZSBzb2Rhbm4gZGFzIGdhbnplIFBmYXJyYXJjaGl2LCBkYXMgU2No +dWx6ZW5hcmNoaXYKYmVpZGVyIFBmYXJyZPZyZmVyLCBkYXMgS29tbWlzc2FyaWF0c19hcmNo +aXYgenUgSGVpbGlnZW5zdGFkdCwKZW5kbGljaCBhdWNoIDE5MTYgZGFzIFN0YWF0c19hcmNo +aXYgenUgTWFnZGVidXJnLiBTZWxic3R2ZXJzdORuZGxpY2gKYXJiZWl0ZXRlIGljaCBhdWNo +IGRpZSBlaW5zY2hs5GdpZ2UgTGl0ZXJhdHVyIGR1cmNoLiBHYXIgdmllbGUgWmVpdAp1bmQg +TfxoZSBoYXQgZXNfIGdla29zdGV0IHVtIG5hY2ggbWVociBhbHMgOCBKYWhyZW4gZGllIE9y +dHNjaHJvbmlrIHZvbgpHcm/fYmFydGxvZmYgdW5kIHZvbSBGaWxpYWxkb3JmIFdpbGJpY2gg +Z2Vzb25kZXJ0IHp1IHNjaGFmZmVuLgo8cCB2c3BhY2U9IjJleCI+CjxiZj5Hcm/fYmFydGxv +ZmYsPC8+IGRlbiAyMy4gTeRyeiAxOTIzLgo8cCB2c3BhY2U9IjNleCIgYWxpZ249cmlnaHQ+ +CjxiZi9OaWtvbGF1cyBH9nJpbmcsLyBQZmFycmVyLgo8L3A+Cgo8IS0tIEhpZXIgZm9sZ3Qg +ZWluIFN0ZW1wZWwgdm9uIG1laW5lbSBPcGE6CgkgIFJ1ZC4gS29jaAogICAgIEdyb99iYXJ0 +bG9mZi9FaWNoc2ZlbGQKCUFuZ2VyIDE2MQotLT4KPCEtLSBGSVhNRTogaGllciBrb21tdCBl +aW5lbiBaaWVybGluaWUgLS0+Cgo8cCB2c3BhY2U9ZmlsbD4gPCEtLSBEZXIgUmVzdCBrYW0g +YW0gRW5kZSBkZXIgU2VpdGUgLS0+CjxwIGFsaWduPWNlbnRlcj4gTGl0ZXJhdHVyOiA8L3A+ +CjEpIEpvaC4gV29sZjogUG9saXRpc2NoZSBHZXNjaGljaHRlIGRlcyBFaWNoc2YuIEf2dHQu +IDE3OTIgdW5kCkz2ZmZsZXIgMTkyMS4gMikgSy4gR2VzY2hpY2h0ZSwgV29sZiAxODE2IEf2 +dHQuICAzKSBLbmllYjogR2VzY2guCmRlciBSZWYuIHUuIEdlZ2VucmVmPz8/Cgo8IS0tIEZJ +WE1FOiBEZXIgUmVzdCBmZWhsdCBub2NoIC0tPgoKCgoKCgoKCjwvc2VjdD4K +=9nnj +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/plain-3.asc b/tests/openpgp/plain-3.asc new file mode 100644 index 0000000..b2206ae --- /dev/null +++ b/tests/openpgp/plain-3.asc @@ -0,0 +1,13 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v1.3.5-cvs (GNU/Linux) + +hQEOA6urKKJHvid1EAQAreXx68NPUPpiNhqRyM//Y97N8hX5iAWq3WxXTa8D6Hy9 +81Jy2wI4IeDhHIoWuXMIX2oVL//V1+LyLkrF/tutBVvqct0TUDUWqb4Ydpfk2l5j +FfSybWW1fS4D1e0KVB3Lfj2Y4cCoT/+zyq7jUKQE++qNefPBzeaRWY4qeI6xXF8E +AMj01HPe0ZwIBWqiIYv91Q7rGzEZm0ROPilgSQjUvCdsNQGhZpFGTl6uMSU0lmp8 +SD2EKv3xGeo2nMPy/Xp4JoYAMW+fjJh+wM6uT84nJgCVaeWyR7HAfF1U4rzqz7DF +amPozuwuZiyjoo/wB1irZSl90t5Oa69oMesZtGMvwBN10mMBM0TotT4gjgviv5uY +kLjD7DM79xy0drptNypmcVcjnDunM6bSEhTyq/fahdaULTYcwSOTXVMyesNpmLCb +ziayleyuSaXPxIqWTgSfkab/W2FGWZvbexYaSaWXmDqsyzs81o0= +=JDKF +-----END PGP MESSAGE----- diff --git a/tests/openpgp/plain-3o.asc b/tests/openpgp/plain-3o.asc new file mode 100644 index 0000000..409b9c2 --- /dev/null +++ b/tests/openpgp/plain-3o.asc @@ -0,0 +1,10 @@ +Stored by G10, because diff/patch have problems with +files not having a trailing LF - and this one has none. + +-----BEGIN PGP ARMORED FILE----- +Version: G10 v0.2.6a (Linux) +Comment: This is an alpha version! + +RGllcyBpc3QgZWluZSBlaW5mYWNoZSBaZWlsZSBvaG5lIExGIGFtIEVuZGUu +=ZQ6m +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/plain-large.asc b/tests/openpgp/plain-large.asc new file mode 100644 index 0000000..d81b331 --- /dev/null +++ b/tests/openpgp/plain-large.asc @@ -0,0 +1,1332 @@ +-----BEGIN PGP MESSAGE----- + +hQEOA6urKKJHvid1EAP/TswWtKTVb0L0YDmnLpcOIVjUaMYQh0wSLSCkgbbagOXC +CkbwYuhRiL20TZ9KDKTG0XgzrQhprchurM0/egFXcViMMrSZXAsD1WKiYbh+O0DY +dngxW2V9SwCzt5CB0uvkAaoZWjIPre6zZJmtWDENln51QrQv3kY9rmfZZ3mHP7QD +/2oA5UzEwN+uqVfNA85Qd+PfymAuo6IsNlL1j3M9YdrVBPbZsb4pZVU3I1spRI1H +L+TdJRVkmeE4zVKZrvYNm8suSQ4W2aMMbZJAzF7KYTgU8B0oeuD5DlCgT3zXt/mI +2q6cOOtkld7MXXRPcbW3abEjLKYGXo63gmtk3MWR84I20u0BYRvarcaAVwUU7kQ9 +ex3OsUvBx2ebrU21LfAMAmz+xA2GZfXDhxIcTz8q8+ypSCUZ1ynX+sn+ZyEc1edQ +yDrIA/l3+mzL2Tzh7B5aCH1kDAcozvUtMiHrbOm4eYgwtB6Wdoxk+88qK8NZgyB9 +NOxhupLa9PJZEPzGFwe1WQs7iqIq/xlBaWhJ4MxkAruEVxo/mra9/7eb/MXZ+njK +dXngvq2izKEa6niodvbMq2nqOdkDqj1PD3Vgnlxa454PUhLOE/J0yZ5FOjCCUzV4 +Xwj0Co9Q4cYFAvjyHqR8yrjFm6MTrS+x/w5qIpdGnKZB4INYlRuBpMtJOzp6vbpv +V7gyORqWsgQlOlNflmYLuqHDO7mZxfBEWkir0lS0UtwDcj7fcyFtgQdxi9qxemcj +j5eqbEOvVo76PGkTNQ6U8epaJknK5JNZRmVuKXDxt7g08khq+SHMOUXew0WY/P6v +PW2xZJSYStnaDa5ZDM9yPfvdUVjG6Xcq/8ICl6l+ZoxCTN8ljx3moBX8u7M4go+1 +4WnH8wmrroPVC2vMMPY9kzqQZ86oM9P3nLtE9r7T1H083IzVgngJtDWv34jApCwH +MOESM7j4XY72lEbcXNJkkIUdEJtOVCFqprb7T+Hn8nCZsk2FU7eZqUAh69n9cTYT +QIGVDPcL+lEjmg0VdeFwOgA32nOdAPJdKIP44m1u5oMHdYBH9eXrMirKLrWWmxAP +i2mn195DSO53MVMKZ9PfJfOr4/8rOnYgzlp6LwJTs3L3jebWffi9TW/8Ra7DiqN/ ++NsN6fc8xJoYIjGS7/qip8znBanzeah7t7dOc7NGWjf3iG48JJEqLD0TMJ0STTG/ +rGlFLC7jtcdZSqq1v0QxEixYOKHtAE9/m8Gtj34qg3dgwtS3ODhHn2I9JmNIcg1z ++9+wZU66fjjAvI25+HHy+vdujZV5Dp+6xPhlw4SmKal1fEPIGs+6++vygLiu02BW +EYBF3VjmMakf8elDSzLFT4mgUJNmAgk4PnBnllkgVCKa3weurdDe6q5N4um0bz2L +h+zcvcmewg5aY1qfz1ECKPb5f/mCUxvOlS2ZYcHIYldXssa2hFd4zONjCjgMMLie +rLOqZ7+w87y0k4ImqbZeGQHEYVBCcLnKVPVrvJmTtvZRfj1U0NcVvoDTS/E8f8yb +Uj+TyD9yV6mHXHK0yGFUbM0oiBEbnr80i0YHHVnduIXM5iyqfWY61rDPZeBDT0N8 +ZvqHT2rCyKTh4Ko4fY7xOG0UUk+Vq8/W2Qv6kuWO+ERAiho7yQGarideAPw+pcsn +3GLJhTCJcvQ3fQSUlNmWiAqvEwDKsDCISRZsXzlMNe77/atQcUiYiT4hNRznDxNV +f37dtekiWkYd/Mgy6tM9LkB+ZO1/DImXvJ3Vgo8Kehve/9ybcKd1yaIBEc+zkyPf +XAa1okANnEfnoBedebYbDhdh1qytTkYpa8drqETuuQySUx0VOaokZpEtXKduScJe +uCUFSEYiCVTobFgCTbXQLQk96FCaXOqccQHku1wT2Wr8jMCJcmIzj5Gd6va4lUAL +cZHDnz0WsuAQqiTdjoUn83jq7E7QLQuiIt88qQ41xpluiWdMedL35hFmYIexQSRD +Vg4t/V+tPhWMsa+okGEHwW0IKFsLO+BZpnWut8DB0eNVUmYHVHPFSbWHNu5ekzxp +qSRjgZ2Q5jx39C89y/T8l/pCatRGAgLqhJZ8SA6ZtTWTG5CUoImy3eYSZeifXFkr +jUYqi4pu/PwacIMG7cOuHQfoK1r5K/sxsmxzENMeM4EK6zZP2OGNn4Fn8MwUlOox +dEs3Auiw9rmgayw1Mw/pvuORA0zlKnunteXQ7AjWpMgvaQ/vO9Q7HtGWFX3ou8I3 +ba+RKOw3DHRXNuc+KxfAr9Mfzn3rROvjXpEo0gTaxnzCx8l2sABGm+OJ7Snp3XHY +FfDjJ0AuLShMm9+IiEVLBTOlRgv6qeFH/4vPGv91SpdPkaqaCHGJXzMdKMLWQTfR +LxvMqdxqH149IBMel/lvi9ZcPrhgYJ+Kk4NZITXvRU2WfSFUthnnhZ3HI2ozql97 +un/+rN/JOYz88v10jFnCFll6PA1vyyf25mUruGyX6H3makx4RNRLB2/Bo2tMUW9B +gYiyLicaTt206CXtQ8nKMQZQ6ttnF+b3jXaOkzZQzQBkbhrvZhdouEfnxnX1V2cD +6Ss91wOau2bAp8dq7jibaWnk1KufcfzKq7apANlR1aG5R4N2g38WhirK0OhOGk+j +Fl9kHNx35ZgA4elS2YJnwiZQ1enyJB+wEGbKuVt+HyvSrD1oEWmHfnaKDBVsi0hP +y8mKe8BqaUi/pJI12HQhYwQsNrMMaQcJUsacP/6JM1iEQSivlQQRvDY2eEyMawzG +rQcY3/kFspzK+O8VJl/xVYMHCxctIvEJDJP3PC77nno97QZ4SHlzM97zYCInJype +DLuhQQklaSSNXiXN6AWLXq4ZRutQTQhSDebzEEN20HqItXufFyQS4ME/EoHuJBH5 +8UZiSsQwpaVdvcqp7zCSp2FgJjCazvG2oySlzsybrqlUCkIbPzSXC29U2MTYHpyk +7rZS+c26vVoLsMGmnA10A31royfRyIn67lkv7q7NIpGjrUSXfr9/R/sm/jctoGqa +K5Z7H7HlSElJUmxYaSETN3qp6G3a6KKoTGkR+UkfpV6wkQYXEBxrKS5XpbsIqV/i +1Xtku+BhikjEmwFHiHwi9tgeu5xzr6nKwINYUb7VxGB+P735kAWmlNDHxpWqw0Fs +bA5IvvWzIObQCrtOVBJwN2rE2IhAuYOOChpGdNSNI9Fkb6WEJdXbff4fNdHBoj5w +2yJ0z60yM2RBfLj2zRyqKsmPOZdXcWPgfhdiabNhF0qIym1sW9GFpibKNTZMqGCI +eoSXiWXVvPU+QufG8cLzwXYxkawJpn8REiiE/LK7V8L/MR1XUhPkzNPomMp5YXqD +WxMAq9TgDjbTMvDsRJ2z2ZkblwPMxbQcgSD63O/23A5rkOu8h3tn8bi0fdOr+I/a +ClJAnWpp0al9WI4dVeTia2nFY8Y8YFr8qe+v5I5wHjTNBKZHxHcTZcoDuPAoGaEL +shylMzjdmFMi7FfeqZJju4cRY1p4noO4DDqSMXNXinsS2RPMqGFlJLyaD2Ban6Lk +6wcxoncjPK0sLKV2ksijROn5sbvJ72B4w88vunvO8EDEoVpga+9nl4NFr58jI+ux +1/rllnBh7O/ulcr+WMifu1ehd0lZD5BYGQGHq6Lv0gyG5k+bdUevcJ40I4bmsKxS +GM8+SfJtFzkpMO+5JUPxIi4dpT8ik7gNTpLGO042FH5U4p2rnnmSHEKvURwYdPn9 +MYEgnKUbVGhvgcpWcpkyOmsDrewo3eY6w0uf0/dEq2NXyi8FvCbGtOeIvaZ1KHSD +ogo5K/f8e2xdbm0MI1uVWGziGHNPjiPmX8rZXXAf5ngKu4KzuzLGtTLCWKzRZPzp +at/qtmLURh+56/W4w+7mjfLplwaGyGnpwbbHMBRwyDW8jdi8M6zFA/ZWWK5kLfZP +SCi5K+/Tyd1QJhiEDWzLaME2WBA3HcVsKb84G6F73OB+oOGl31M0pB6ZE0WFqi5U +07o8WGvflataT0U8VrrBGNm4QrV5H6E9xM/IyqwMiYm6UXOxq1lBtqP8AsUF4WD3 +s+qmc08TGsWSshQ20fImv6ifrlFeYJUre/l3HegpehsoKDcG6QJu34dPf6hy+sHc +OA/ao2pjwrdYP4JOwukjVkTd2FWCK5J0GBbadSwGenirHexjXP6KOnVfwOB9zrId +n7DlHsVMH50VnKP1jHF5aTLEvGVP6veRg5fhMcY05cO6PrumS15atRd9MEUffnrn +tv4DS7MV4Y1CONbdEJib001i760tQNrzTFGs6lSyfrQSi37GOVY1MNir81v2sYG+ +cpBbMZQzQPaIM/j/Hvh7NmbIKQCKyyO0aCeiEU5NhzBDG/Ug4AFp0uWXfIbYZNkW +1V2ApFPf8J+ldTNSp3dz4J6nwz7yiDeUI2dEw0Nci58KNdC6L5j0Hv+B4MGvsfHY +gL7KuzSCofSOLB0m6I0S/vCNYe4SZfdSyWeGBQGVFl8crMwMhh07Ie59BeLwk3if +v6kxN03WyaLjNFG78VjCLp1W9pl3E9axDNElRhKnrE1hNs4uwHayYvAK7eGlpWm3 +WoqxHo/SLr7V+CIsNjdwImCUgp+/tVjpGKpAhwPQXALFo7O6y5ReRMwLU5MSR9+b +7agQ8oLdzUNVdOSN5ja04/UOjYBD65oyOSknzTS2XykZQKNUejwaaGqR20Fxgdqv +eRbpgx3D9SQDnB8Ogq4R0VHVKnU5XeH0tuVmGYBRlrhW/Q+CelGH5CQBTJFqpMc5 +02HdyiKW0U9+bnbFe7XQda/oLwgSDarSXz2GHyQhh30Bc4jbTjOJ4+gIAN9oZd0n +ToJuf69qXsgUkMSimeXPgJLdHpsbcuyIrt0BGqWf67GglCwooXzI8LEYO2mTdmbb +VrfeehMQqRefkb9FkjFWGx0nR8mhlnoVdSFtbS2Oq6uJbWPm9esHt4nAmMTHWZeg +tLRRaHfaIXzDq7hmI/k8JGI0wAcdKMZ+WMzDmFiUdywXzhUN3sKdCFr/LbbLc65a +UtYNi214FEFfgBHbLdR3Dm+EIUwsf64rIHM/KjFxrk89URLiKX3GMzI21Blzer1S +8HNu6MdEQcRYKeBUa4RVtjzjs4lTZUChoxeZZl4X4OhPGDEcb4Z8kJDRpmjr9Sem +IUYWlFA5GPI8woIsmnt9djbOxxH1oLrlncJAY5ZkCg28TBA7nHJB4sdq0R+x6bCv +Ng4euxlcBNVa4E1sIrNEvOkIMFhgjWLiM8IsE05OYP7nLAmfsxXCqvPY2dXL/jAK +Zk01s818pkUzlr/U50HKOdP37B9pmlKLH9yIFNLMQe109t74+ltQBHV49YCoYfIu +YRiOsL3arsg4B0xS83NBePMU9gV9PFdCuexH+8rSptTyYrAj/UIGpAz0lp6XbHx9 +p71fLhKKCPzP8VtZuCzbU36k3P11GuqsdkKFo3D1eyJPJz07VLzJm6FU61J3eMva +5rUv3LlLu/UzqnWARiu12l6H7VLFMHKRGhdDUC0tvgS6y10taqG7IGz2zu5oAMM0 ++xqJjtsSaM4VI1/SMvqA25XlX6CBHji+d38En62tb6DgErNyEJvdxYDo4HViI/LW +l/OyQgBTtWcHKapHb8EPBAhVSYqOobydN1DjqUz/dJ71ezvar7nU0v/YfIEbXcy6 +hmWhbhYAiguNuIuWDps/mLsAYMZjPW3IMSrDjuh2XD3wU9xiaqXrLEAVJy0u2zB1 +PlAM8ecNl1GSwpJiSOQ2/8WiKHJDnpO3Rf2z0glP+5h0wqkUPjgQ3w7fOEvuUt/T +R9exMWoO1rZs6qTbnsnc7Eo1z6XP8wlgTw06kXt23MfydLmWYJBnkk9siIwAo83J +uYn6iIqqJ8JvTpzWRnuoj7VyszRnRc3oamnucldkWSyYVo8yhpzsTV0RidQZJspd +iQvfu9MP4BBpAWH260+XgKzyeRlS1GvGcnvWZaNeqzWVJLKdR41O7aR4+Ea3qreJ +ziztxZJQxLva1Q5iZdIrGrWkxX2WBiUxKYfE0U8jj3B5atnknqIz45oXcj8NMP5k +W2PAtzlbDlyjQqvkRIRGyZJYtNvV3RE18Y5cSrgmeju8aiHPnbcXMmQ4GR1Sd6lp +x4UNlIvX0uFHVcd5u5+J4oic3dWVG9OhwPc72ny/kiaOh7LTQ1K4v1QHV10kSONA +FVHsGNALvZ4hB+z4vzK7skhgwGku20atAUfD7QDshYlIWW9J0SulhA20M2dSeM4e +B+5V+RLaBA51Yik6QPZvPG8vi7jU4od3dmvdwS5PD5eqLRWqptB28lBUbO3vdYiL +ac3tXRJHXAQ4ArrxBdgUZ035Psc6zXOACyqDSmixWyAqssa+EUbyzcD8jcT9evZ7 +3PJ2pclmwv+fUS+BbR8/hKA19o0kaqyF0e+NuWdSCAuT3CTUy4lFuA6emIRRBEjS +ag/bbuii8WQJcBclvjmJCWJdQ8L1t+ALrwLPUu9hi7et5RphF978ZATk4TkVATiL +bbTbIuFTpJfqDKEezRFs9HNSr0mnORUm3LpA1NvuT6d348+NNs3k+4rV4cINksq+ +vE1oN0cBPc/0xWclxbwAeu/HFDASEOvuMIHeVkvpdIgHQi1cweramqYsdsUbk4qG +2WHu28AUqL1iEmCk/ub4mh6sP7BN16GePUFaNLi06h9Y6mXIKAcETI5Q3xVNh9mx +66VndnpZTfdASMDiy3F9NFgciAIne7/7mcWtz7bqJ8NCMVAO5aNNUyWCjioNEFEE +JvKjI01QeKt8JagjUOsA9GJ8+1RQE+ycJFZCkrCudAurwx9YzF4wua5IJcoWQ7ys +5enMGuqRsYWVPOIZ6PDOODBKNbkFREb6pt4AXYkmlW845A92U5I1t+5d6b2LKVuO +LRTEZmUPwBWuP9L3XOqi68Cg329aTsc5thAxBIFcngj/4Ree8RoKs2DtcHj+rooW +A0tVMd0rI0YdNolCfPrxEqhhy9MUpkng82VHXXSwoDeRLc1pnRbrLx7ePpjjy+04 +sT3ElJBVYAqTeNeChNEI9LDiY1BE2ou02mXZEttcgPJiJjnCL10lCvrkvviZL0r2 +qOWyWifIxxR80kwdPmJ/dEHLOHSV4Pfao0OFW8balpahwxgQqCxdVvjCPH1asqJp +APJlEaVBOhvGaZMPU1oGVMGWAzyYSEz/3GKBn+vR1wXGtdy6iuXCwy0uldXXRrzZ +KDT+vbV3pxrIL5vYAeZYCmdN3VvgIUUVpC494URjuu6EUwEBWvqhmH2oo6EEEr7b +XDVEdNWyAJ/43fy7jzT/5Dr1CJzo36Uh1C4TNh5xCQgTq0AFuGg4TfO2ZanHYhh8 +ctaUabPO+HqW7fULn1uelTofBeEv8e2Oq0w45XlILnqN+8B5XzJXYyUuW4e9uJ5b +j+wtlpfUE7/AVdG2klL9+rWJ7JZwwQ46J/1qOF1YVeoWT2yXPFUTZOpTageglMbU +JEbegh3jFOeupYgGn/3Zluw/RGQgLKmvuJIBWWooNeex91PpylVE72SOQlncTl8E +i3mIV1HdG1nFJvDodgbansaapuespAxxYy5jJ6SqQ1pJveNBWjlEaVxzJvypTGDG +vEZeT2r1bA/RziiewT6xpdItqRb8fndnI2KXRjIufLoWJYiH4Bem/rq2AR9nYJAa +0dPLBKLYpbk/9zqXNrTzEOrFt/oEveENlQerajnlafsF7UM1hn5ob/YhRuSb0eit +QUC3dNphMAuDzA1pOMfRpAWe1D7IJyXbBGfmTwV8WCjnll8d5pwJSy1FKw8FC+Y2 +3gk49kUKGgC9stPzieEWiij9lSYq9hO1FFk7Pm9PzFfkI7TDl1yQfqIrzRqwn2nS +FbZs+wuUHhW7FK84onSk+49XCTrLHNvtnTACVv4eWzoS+xQIGzCFGdKwC7h1oULK +9+B/jWczJrXj8G79o2Ys3zsj8TlwirJC3Fe8uWJZ2Dp8mmeu3DiNYLLCEGfgJ3ix +A/2MM2Ena8Q4Bdrs3/5t+bEWzSicKgo6QifbcicLapx+A7B/78v8Lo/RIHp6WOwm +l1G5tE2d5CGUY2pzBxOhI6AFFBpf8iPZz33PQxOEbF/O+4pL/drLgMmdOqoLY/Na +Irr/nfPh9+Nv9AAI/44GtEjiLkzo0J2EDZWGeSim+BkOugOQabsH/G9oUNnb/URO +EwQFTHilZrp76g1RvxYoqCKmoT5vTIx5Lw9GEGzc8QWw5RBXqgc/IK6e86DYPQZn ++YwQ7DpZi1lc6MZ4Qlnp5BkidZ8cAhQyVjmnSx10pduna0QOHhaSvUitwMOevuDt +fQaZKSGqHgirylmbG2q2ErlWYXMyGBcO9ujVlTXRFVnYIQIYSLuGQpv19fTVmxnh +VkdO45wo9mpWuP+D7SW8ZrSp0xuCtKXUPTOE/++UB69ZuMeLrlK8N9TCBRKE1P3p +EfJcLBGKok3D2Dhq20HdvhmOyQrjIIsfiigMy+4z++XnO2rJe2akzNEza+jwjZ4L ++mCVbZ/uZS6VqfOuvBEnGbk42ZNTm0N4wolUDQwsmDesbtTZT7cwHFWhITdoDMXJ +zUIuotVSAFcl7Os1cvWtsh2QAbrj7/Ja0RsPdZqg3ImYbcEbGmDpqbpG6jEs9GCl +vVhYVrX3HzEM7d9jUL+jMa0nb5ZjxZxTw7NUjNodxUjtXQp5aO0JXE/y8xW9Sa6V +5R03agLUOI852MeW/FH7KNJMvgzWcVi6cLFvnxmm08O0JOF8OIP+yWAaQnQnT6h5 +3/azWuYyYARrjTKynCVjwYTMb8wZNewPQXNdIQKYjGwoUGOE5zIVuaW6B184VUJC +PPYnny6+pkL1M7XcXaGpamErtptGqUwjaRrGZ2013kpqECOOoEhxAwwd9gahBuDV +OqAjseks16BsY4yuCJn/ttZSuedpRRMCMh1AR3l5dqpbIdZpwxjUkBqySEO5Cubz +JS+CJuC2RJNtcuzEBwAsy3ojJWRJ6VDNaTF0l9rIs2kSQTMOySTuEdB0jy1PhwqR +vCmvf2iAxBQLS2sqXGFf/dAswlFREjKB1pr8FCyNUsY6lMnWNCrH3DWsJt9pNVz6 +fEzqdkNb9FjAWD4WFJ21WJHS2EILkExZ/R/7/Ue3yJMXrHq4T7+JVxqgu4bE5Ldi +JtjBj4Sf24X8VgaaKjG/EgjVYMzCPhs0NQGsMP3S5zlpta+Nb7EsX2n6fx/9mGr1 +bAbcoPF405daKtfIjrq4Te+Rqn7CRGwcvfDvZh+SLg7dt7yiZYb/p3KbJlVHQUiX +u5KzF4p1/ULatP9kCjbMljbv+yD7UrHj6UXgbpEXjXSmoQQQn1Rdtqsa7dd82Ood +xN0y8fMI8bawkEb2yH8y++3mfDGQYChb9yhc3PLbV0f2b+JHQxtqeFYOokfvrWmu +3kPHBd++XmHzjhk+SWTo6PmMkpuBV86jFQuPVraebLfRU3RoHbII1t4fATBuT8qi +of6jOfATV3SF1cIvB+bJSlrVkF9VYDm/F9KkfXxxvDFQ0cuO64ojpiWF4ubYjoYu +OLE0wa32/rqXcREo2w64NBIUe1A5mvEkXIXdMHrbkNV2ECCtU+8V9Ot2bttqcFQ0 +C1KwU3vuqo9oRMKgpyFF5UreXfP1qttqLwivw19sxtLgETYKqrnCuggIz+Gi6wL6 +X4ZbaBVgRqz9VzK5LbIbFFniMaAoJsxVhoJtZ93wCwwudeDVhpJq5HyF3+WA4I1s +diObFM3KF2NaX19Gk9KL3H/DOWrg43HcqODYVEbe0Z4Vfow4VHkxjqBgIysL97Kh +WvrCq8tCkVaHyoirDiG1Y+Tr9qFIDuwc2oce2SekNCB4PKABw9Dr3a9hbTJf5arn +yhetuSR/qADsEyn6yM8SJU/oxyl3Bg6EYNDW6kx2eIqrExt/r9WtLTgXXmS6vR/M +NRrtEQZGbvAvy0zcDbjyBqB9Rrmln72bZakyCiU+EEtvzQQIjsSrjew5Jad7ZYli +ypwvDeOqGZn4HsuLQc6izvtT1TpLQV6K2k14Xr91sWKrZoCHIt9DYOMezTXkINJM +QO/R8K2yJbMQBEKlfVCZQRapcip350fvLcYiEfqKswYtys9LIfRW4XtzbRgwvcsa +W9Cn7rP5xAezjEgqM0RL/zu77ys2Pcm9DQCbN/b/Hwk5+b/Ri1Sj1DQs9rQ0xJxG +QD9UqsWxJi96QeY9+OVaDioD+/rqSlxyJ0IQ5la09Dn+OX/aqWtYUdaq8e8BxqaQ +g/j91+LBXCASc/bL1JdztVG5YAN5YvyGxuSdQoNPUF/1bpt4OaTHlqfTCWkT7Z4k +gnCe4Nh9WsC9HASbZ/US3tI/hJOQwjGiEnkuAKrHQQ9rPrb/teDlzCKZOT6fQgSF +5TOabZbVol57xKXPnXonAo5ukSj6uRuEvyUdFrg9w/0tbtGYEsln2BCR5FS2HW1j +OD+h1Zt3qmK9qyAWDuJoIml9Reb3CfWAJ4e/l8WOMgheiNx56K+Pfv+9PPRcg0nO +BtFT6W9ppJB6HFs7GWzNNdgkjTDYFAf0e5m5pfvYIMty0R53RCt+zJsYvgi+NyTm +DobkPVXVNdO6sWut3rQtzFRBHIiCD2sq0BhQ0/Fmw12wm27fNHA87DoTUTkS9KPv +krQPDCu/FZ6xLnIB7ik5wCFT6uJnQ89PmSj8KE4CV8kuqmvNqucb5BXy15Oy22/G +Cq2PqRpea6uicGutlLucsXlTleZTur5oamFOay5T5QLmM1FghIVtJGWu/A157olG +nGxtGuZBlz6emRmgvwn2H1tmCVgn9hAKgfJX19vNGPNgVS4es3IlhFREHG30r0fT +x4t9xRLm0gxGB2HqdPbYeU09e9OqXEY4iuQB5Buyj9a3HK5R+ug2Ve3Xu+t2IAsk +T+G5isULIEyo4wyQptvRqJnly+o+FHoT9jSfKeQMBXZiaWuSa0THFHmH+yD+9XGk +rKugrw8V1TTQce1fgVc2a19ig1CXHpQqwvbp9KuqoXj34nbNx9tMJu4+6j+JeJt7 +cl9hjs/9Z2XvUX/QKVwal4aPiwaasbP3UubBjhvsA6KHIzftLn+/GV5EvGArHclx +onI5pTNCK5SxqExr9vecsxphs4XX7B8i2LM5tGHI6I38Sec9iBY+mz6s1Vzj/Rc2 +nb0jW/ojG7oeZFCWtu1De6ufUA9nIBHoOJlbG3Co8VWK/3vHQMFgYeEhRlMuyUCn +CUKXMfVTLI0OoeVISEtMdIbkab3aSO4orSW7rW69Ap6CozxOQPsUFTcuE1xpxr4x +HAUgEL0WNuYvvECABfYsUWr3p87DvORbPj5cwArXZdXuL39VBTYuj5PPaeVqje+b +w+l7VNZU6wJiZjY0yidC7qWPXu1XNGU8YgwGQ6g1h6O4vWkHlJ/f2bndaOq59z13 +xOFBjlaHO/j7PHTpaKIwZLtdL3y07uybnZ1wz2WOegH1Ku8H+YnKSp/Qz28OQqYZ +ETEfEnlf2C4iG71G487vX8P84vIXMwcOgDWG1KDR6Fa6U2lR/Hjca9E+256iUU77 +mSaXrVYQ8+6hf4gDY/zqH2LHl/nUf6Q9xA7hPB2MLhZScCcqfFzwbpTh+vdFOJ+C +NMfRqBvzagy3XeLs/tTC01ADyVopvEr1SDY9DsgxY1Yo9CguTCwI3slvY2gBMVd/ +R+84hFBnBiCwgtbkj6b7pMV93Ubaai1E0a3SOlFJNUU/gPAhY5Y7WFRzgYQyOcTr +L6WgfaTI+5ByDvobcsR8qtkzAMov5wpZ5pkfUT3/vlRF6xZGn6h7GT4WsRj6n21i +ibwXruZxWWTyC2kbu40KUrFjhSE0zWFcB0u2VX/zjtk5/L/vr6sgmcrJKJ71v5pt +O3EUKav2fZwqxVd7zxBcXyfyozaOFV8eVZv1WQRippbQZ2iChwN21Y4VgMsXkW8x +Xb0KjzSeQpJkojyWSjbo7nj2lG3XUogbtulyhax8NhDFCWY6ePYNHgJjQwQCpOR3 +M4HuKl/Zn9d5JMAiz3mdP7fa7qTVNOuinRqZqV33gebVwoDfeXxHJ1TU3oiwt61+ +IrhcjO1CeWihCV+4QYJvIgWGXh4su/IWQL3I0+XWzkdTjo+creM7xrUt/RlUPTAS +r531FBzqMGuDYzDUaC8mpWzcO3eh42Hx2uy3/kR/Ug4w5wZZM/m7fZ4I8uKkAgku +TumMqNPZ7lqTYJPcXRoNxUUTi04wH9vLYo52T0rJyJDWZklXMETvdorNXeeb7yhX +HmWuU8hLIya8Mw3d2RHbtisTcESLtzog33voGlFk4Y9FrkJYVbb+/SjVpWY2y8NJ +10iYiB4s0gu+uaFNr6aO1BX+UjV8QmDPTJsMatPqS0xw5+NWIzc5fZWi3YON3n72 +WGlzc4YdcT4ezjQG62GGlJPy/aeEaE/A8Xs3TkSgBSUom5tml5utC3+x8Gc3d3wt +9OW3Uz+sXSxgC7RDiPo3zmsPl1vFyw8msThislDCzzMpjlcwLuoEoz+S2lzXEx3U +FWkod+fhBkbYV9yNhtN8bolRR+ei6iIIFRLZNUKRgUWFqjEKytwCci3A3ejuuqDj +/sfTI6zcWP+C7A6Q6RuomY0oAyFm3LX83zrptUassp7OyQeg4M3NgevlyQiXlzH6 +8KlesrwlwUJofgdOFcjorzeXyD5eMHSzWaT8tzAWNYVzXxVKKf5y1YhjuNOWSGZn +DJQ0eoWo6hYILcioPc9J9Jfw2piztvRNEog6BYm9ryjXIM+xep5sYMshFCRdoqOh +LZt7LPrVTe2VzuoO2BQ9H7sglv5wCv4GtvKF2LiteZMBe7xfmNWbMPNK5cBI8wMP +ZaJVK8cmwIOVWZN5iZTPl4ecpOsP3U6mk7vDyP1jXc3Etp62oEcDI8VbdniNb03z +LJnhJ+H4PN/Mw6HbXpFrCvVf2cco4LKxZN6bqMZw08KRGzk0J7rUmp7+UkNgLZVL +R87IWemfBl/39mFdfSONp7XpXPv6w0/vo9k9b5NA90E9dqr0mvIl0IeatBafEkOI +N/t8b1ydvRXzKSLv09ZwwQOBwaZ9SPfMS6F3PzMfrar/oWoqU6X6dWfpOMNaAVh8 +m/4b3jqil3rMjHi8KS2cL9CH5iedaTlAnAGXPljK8iH2CGtjwlwQnfA7xtT0eAeb +W9IN+ZUHguJhnbdMUhs4NSa8b2kCywtakahYgGByABRlA/19MfpRQjW2OXZ7+Vie +4hievkuM90g6Zh7eq/5Pm+mWiUSnQNX46m4t2GbvZvAKEVEtLAPy8Bd6y08UV8l/ +sulEIzgF6vYPz+/KitgmUvtgIbWTuFHmKbALZnYNaM1Y+MoVP9BkYxCMV3HjcSps +JbAZ/MC3Gqy1kLxPCllDsBEv0U9v4RT1eJQHOqHSDSt+A25frWnirlT1W1uqIeST +Hzu60wYB8HMNwBiChic3YrGOPggheljB1OL7XLfSQAGDmS/ARKQp8QZzEQ3LJNzN +qf/4hV8kZXVh7wfiqBCznAUT7A0JUKOmEuaxgiAc4IBWdZKJ/JcCM3mWt6R02FQZ +hSMyoWPTDPhrlMWrcKxZ8/QvuwDclfkE2WxHuJ3Wfagpj2dYB7yQKkeSLNpxk1C1 +RcNK22xhM3rCK4MzM3WgyzXRSo/olbM47SkDiXDR2HBl0Ry86pwMIJJGRLmUQdrQ +7UmuyvIAUG7RZWJ1Vgo7hyG4RuX+Qcqx+0b19Vfi+vOg5JSwp20CVVVQ+7EpSEkO +1HLnBE8Wwbbl+wztNqYFNESn2uieh3vVqNRU2F2gaMyaNuoD4TJwouI1t/ojumkB +forZuioHEdd34Nn1FBR0fau3EQipBJeQGVI5tjG8GugjOqfsR6ltdq4ob7BBlIGu +YoHW8d8OaDv7t4J1tO6r5hgXdYUecHlGYahHRLzruM3QqnifsxIUZyXr3fabV0VR +ldFLGm5JhLvLEt8ag0Ly2eELv3z6A7AycsGSHOMEYVYSQnDMuv60Lm3onP8bVfUJ ++Q1SYWMMzeeu7PFKHR4k0RSAiUzCLYcYqfju03X/p+WnMgh8WMAFW9KSuQewgzln +XWqB7h622w3KNjwR0mhT8zvjOtjQiM7z2PqlsTnOk5KxfHKo8hNLacavqWRy+DRs +YHzSsntYHX1i1XNVHMFSC5MV3uaSmzb+u8/CUbikEL4YRzRX0Wgf6Pfo5Y9qy5DR +VhW+4/o67YwKjBoUArZ8ws8PzzIJMZP8tYdxD0QRYhqxI9egsNscZy4IpNdBGrD7 +0UsbScYbwJ3PeSMAJ0Sd5rKkM0cmpoQZBcy7XOHalmjqzVCR5Bi851ylX7tQo+yr +CuGCicwudmNrcGUOMAJa06PfNuI7UUqhndveSJq48CE5b1PlEtxrBbd8KUNlwnu/ +HcZ+7wzVpJXivSoLg+N04vjE9KgI6oPl/oLePOSNHqwlbqLi3KD4sRb0D0g47HSH +bvKD7+3ssHlMQkpf976wAoB0XrX79xZtLBzTOOyLlmKyTHXYrNh6zuMdBgL+K1of +WCOcfGmBEBmFVc+RLTbk+/8j1L4M2KzLPm0+7Qt+piZm2h3UjPvgVPxSVy+EG1Ag +YVtazKYwwRs7s1l4bxYaGWUjhlT2Ppjt7fvqJrno7/l1sl01fLqfMcdhRSvviJsR +Sc1Eu9CcBn6yy7x0Eylm5+eFTFOOWM25hvhztc2fz8RSztem5Ug/cltWfjp6grKs +3YtVTaw+eHUK5Hr4HoZiEQN/qmDPJX/FI8rid6UK0mpfM5AXNW5EOTZfR2Lj8SI/ +VlXI7si8lz2Wo1AT62tjVu2NuWsAP+8WkaF0HQSzChN3BFJ6iCOr+Xotyj617p5P +21gAgG22/tS0485BRBrcNJl1PgTqImZxvWhWTBf2/PZiAfW54VkxGLWKKvlbaxeC +hWCg/LzodKD5rgx4NFBSOmzxMqwjP7Kcvpordx1bPR9rT6poMXiyB6s/IINqfyb/ +u4pqvBAQkvSpZSSQqxKg0uSo1pH4DGIGDV7hM+yhX+8ZdWwW7U4EQ3PVVscyDINf +rgUf7vOx+4JdUgxL2m9BoAFgnhM7sKAtOtg2wA+5lwMs9IaufQc29l+dwBH7qDFu +g9FsvRUSvuXziXpOZe4el3raD2NipN3nTTiYyxhVXLQ1e6W9jlubBK7uZE1v+9pS +LbX5Gs7vpmp+bZt0oiPtOFrTd7U/J0nW9qVYC7EAcibstjGZ/K/w0Xd5b6OK18uP +xF0ypQDUMALcQOFKqO5j2ASseKpXOwsrogpfwhjmdcMVPROuL7NpFrZ9gZ7p2jlP ++uJQOjHG6fCWScF5z0Xbn/sxbPwLE7JPcr6BFWCDOw+cnI/VYYbbHK4WYwBo5eII +oKDFt69SuSoZDnHw1sMG1yTs9dqpabmY2ALY99//onr8Jzq7eraG+rp1xJh2j6uc +Lm5NrMhDQ5dMlAyJ1DDyVVuvfyg/WncU3jtRCY3OSK3xrAEqkKN5EVk+w2ytiBlG +pJGeLM21EnCrq8ekGkf/egB+3Uwtdp5oZ2E6XKhJwjsOhqAD4ERZ7UhSLNzBTZEf +hX73Za3V8y+groFf9GD+Pi/4yk0jLFh180QJZDV31QNKc8R1YB6hOv6tWC1TzXNO +9tO4iDT4EVQeRc7NGkqpkkgGFWq5VIwAV8LUCKB+gqJaeZrbeC6/zVXY+rIfdBdX +LsGLCv3X/LQySFU9U/5MwKNo7IGtfSnprGTodQXRxEQVR1Du6huGUeCe8PgXbjUc +id+bcMQpfX/0JbvuLfgYfXytVIJFYp8fIiCQtueLgN9678AVHQS3GzjLfdhFcffd +o2CDl4zm/5pSFPfMqOAdG6JXJO3HMPOlzLAUvQZcXANtV1G3YVldGhXFdOToQ4B7 +rXwqqHriW0K+024FpZGDzrzkZoLsNIJmCTSGil4QMZ5lskge57QbaoP8QdcsIXXN +u92XdPqYlw1Zi3miTZ5V8HJ3VzRUgntR8A+kdFUssv7v5e6O9U1VW2ttzxAGSpJF +jYWqVeGnNMfe+8xPXaDRbJOUKqqBx5tGivxfNbWRcL9hUeHZSV4SaDXBzaEcT3Yd +mZbDKb6C/tqwTWdE1ZyG1sii1Jq3ui/aBy9lj7agyCO70sxsLxdj/uEq3xYaL7yF +87ad7+K9q5U2JTRFNLN4l4ymEXBc1OIexq8ZGJMtb56aZHa83tTbuzqf+lzGDCE0 +z5ZlaffQDxncVPhcVcWODISFtZsRU3xsYxbukMkD0DLKgSaQH0FnnDJTUw1qslde +f9U4EUtflfDuvW/1qIptX31So9h8WpnpV9z31zudxmLsdCQ5MGH3Ke7Wwvmbdf18 +/IT0DZYEtEhOXUbCrnWvV1A8Mt1vcRcsDJ/U9gIkU4QNYxM8O+ZR8ktuQQEnTRkW +1D3XFXPxyV8M9XYggJ/mC0eTHiZJzfMS1qSE0OcRvEXwIFd/Qz3ViTkHXG2CqpSw +2tfVkozG7+WsFJN4sjz7vPAZFI5Ka88C5XwMlZfVDVwTqmLijB/J+aye3tZq5lj2 +a8dK6234ei+xZAFaNsU+s9ApuRVdWqWG69yWr0PuGv5NYRQPrBNM4yHrINc0v7OL +tuhgwZzfrLNVIu16NI6sqEKH5+Vrfeggt32O4ncb9YW6A1WlnVieVBgepC6LuP9e +e86PZSzb/6IHHdB7SjARTIcl4WCHCuySYd3roxRKu1uCq6knwzuudbWrU/jxjHpT +eBtfvu3A+EWSCF4ZCPPp/462aF1a59MrxXvzNt38vpF7jXbPDY/LRkciHk2cPR67 +RVPeeOPniHSUHyJbzefrtsHoD2DVOkMGb/hEl1bSBDnuLCjNGjQBdBOGzRLlqCAd +GqP+ow1BU1rAio7R1aw4uZTU7GqJBbVOWxZULPPogSNvkskxI9DGnuClC+Z8noVZ +FSiXa7weVP3JQ++kgOEoG0lH0dJVD767fvwLOka+1o6c0ymV62yaFb14yChDu41Z +Q8IEXpG/1QACx4nwbo1q9DRZ0Sdo89FH+RWxGgpMsjhlJ61BUi9zs2x0Pago87XX +Ealk30BLlFWKabKX1V6r7m6cpUU2G2eWVAJyZ8GgAga4JqA6hrw6xC+ldu41ppfO +IG+o8W0HsiqawDSb9NwQl9O3aMm8YuRuCtlh8GrA94O4naQXliR+QtkJshlsSSUS +nOxRSKMa/sYPhIc4z9UAsA+9NXnPDkOpGNfSOojydjZXjpqseBPT0DhS5JsuAy0W +JLT+fmRPKkMTbjLLi05fc3JQNYRqNtdZp07K6ZlxMLUNzfsx/k1LuxOqp4QO58O8 +Y2RyK4dF59+5znbOsK9AdPtKcIovgOWhclLVl5miRuxpOgTzjZJU2WSX4NIbuT0j +k6F3kpWNeWNB4XOKK/V81qW4IDq1TRHg7CcVskrR5kaGVWQRkVVmdLzk2w5+luyw +ySOTaTOqRAr5HyNALBV3uSRMdxyPCj+/MVhN5rwy3gxMLh3/4cO20rJSRsb3+ywL +tEtqsKwbeqv7GBQiSsHUdgRy93Cj/Fe2S9f8sg8okXDOudy6XoApNk37gMUFCxFY +jQq4m0N4PpgI3we0rqbHyTaKmBoyomuZSVc3VIrqv2z62Ugd6p1S4/TlcGg7x5GM +gVl2i7/Y6UPDtJDYs4QEDdWXzdfk/L22zISX/pjg4ZiM3MwE6FW7MoKCcVGqodf3 +/fsVQbqcttUMznLdVHKUYo9z098RX2KuMzF6jaB0dp653PyMu4ah5qZSDdFCjcey +//p4dMFeJI2BHjQR+E4n3mxG5LlXknNjlNUPcw6o5Bv+0lHYqtlKu+ydaYT7xCeU +dncRgFoAgMnNiA4QFqY08w9vK4riPp4EckNezntaONLe3gsOKhQiO8Ma6nJ43vLW +xMtqJZFM8OBmQ0wEiyUh7F3HDWIcr3bQyoG4tf5m7yhlOut/7wJiVAbRDLn6hYFb +tXPhXRjaaPPymgbMUSNC6gc9WyIsbvWfrF+z0fqPJ9nmRNg4T/dektzTQg5xt+zR +O6y3CYl+0mLeR1zSBl/2/IGd6OIUNosBq8vvLK/pU92N6DYB41yqr9i/gy3MN5/j +GdlIOEB7Pog4piNY3UiOl73U3nJIbkb2z08tvB+Y9TN+pGNoBwdsPc2SaseIRai7 +traZhaMBbRgzdKJJkOlLfXyBAqCbmwIW9zS1ZnX9SrcNNpd3M5kK7m99zQIjUfBo +nLngbnwfMiPVgWOAPFRBPgRA2Dt/rUOtPsN48ZhIjz1yrm0LJQWeOpXeQZPnL+IR +WW5/kj+pmzGCTLGh0t5YmIj/lq9aI2iiIbmgQQ6W/dZ6+7Jiiy7+fH54O0G+M0ls +5kKZ0ORtBW/54IqUx33G+DaxH+TmHQ9BaLpGCB3T+im7cjCI14ssqyQGcMmFX88C +o5AUwxoEPj/zoQe7Ip3v+W57XhtGZ7W/UBOECNaIh/Lgm4gWzlBRgbJCIgkjoKyx +F0+FnEAsMCLe69SSoQwssyk5i9Y+exGrbdlh7L+AAN687q7ljyr4MNgEP2CMZJZI +szH0xEFXICVaQcHZQnjsd3h3EW/Eu2wQNyXUJAsXaIhUrMx7MVPzAqEPnuTrgZMy +L/D3e5XTPzLP2Z8QQK4PHH+BbmhrZ6pU0kCxAST5lcrlAw+G4HfF83NOx+s+3JHw +0CMA/giL7Z8nWH+QSVUKH59Rr2LQ2NBevecruaaeG4mBkNXrDuDzn12d2gbxu3VZ +JOKFm2LmTCrRA8l4N54znudH/aCNuEBOq8b6nVfQEsvAU1+uM2//YxJJWkq7Doph +v+rP4hkYgJRsMn3eoGpZGUwy14OlIT9TTLia4qLClOV4EVB51nCakDpX3QPg/EXk +C2dwmtb0J/+HIwDAbdzSgbqiwG5vSYUwBJ67zkWkCzYA8ZuyC+CRU1JhD9hGJ5J/ +iVYLqhUcpWqfnydsobuu5UL2z1mwKfMVTXfgeCq2ZgvzKYD4h4kkW3konGJ/uM77 +0WgRQYCkUDacF08vXI2xTfLkSbCngPjjw7lLtABn4gxbM8NhF+Cdo/5lLN3sqZi/ +tpOW+LrQViNc2o3Wf1RMgsZrtbktVgHuUZjfB+GHu9iyrj96Afge0bRTgow+Y5tn +9x4qhI4lOBJdD1rPTnS2Hq1BCwnyOghlUIUdEaK1z18yNw/OAY14CrnYd678hgZr +D6kSyjd3ZqkC3aCpkePXSLobS7DBpHaEgztj1FTUQc6tSgAbLiVk09Jat7MGrpSn +tVfx0DmNSfJa2hkFgsfxEUHehzJaJfrBqInu1nGHreGFTyHP2NJXGIVoqcj+cXy7 +XmBmGqyRR1+yg6R+DEBWVJhOOhUbrMb2FE7guCr2/7FX6ChfU47EYKIBBuZUb+gq +NfUxeRfqXvEJjvDwfu8D7YnpOujblED7KnEQuBgGJtpB6ys4+CFB2kDTdZZos5CB +u7ef0pQ0HVD+taixxhSZeaoz+HUFywG7MkYscE0N/9nOKOuOMd7Sx2hTTGiwpqTa +Wt0SVBpTVSAraRWg5DqZf0/qH4lt5I2AP+wVwB1yIgyiVdVyq15dAjlY9KB04KZl +3oCZbVMMPrPa8Sy+3C8uw9Fx9QXvz2F8hPzm3c2qfGm1FKGRSWt4LogzEC5WJ5e9 +3x4rvjQn0ZDzK320wxnIswa5hqAH4a1I/9XMGifgxXVkCpO+w1StBR0neEfmNHxW +uGrs3RbaeAzzKna1K0NkkUrEZCinkfagn/Mm5ctiEPUVzxg1KIJ8VAsVlvVqP7sh +GIWO+Us+V9SDkjXLZi8JuSXAB4XuVppA9LWB5xhRQN9g1l5aNdNzXKAvfAUO/hrp +QP/ABhW0IB6pZ+g+pLi6ClR+ET8OnuChVv6OaJzi1462Vk6ei9PnCd+9bn7mOBzb +eaXNF+owKa4oBLs0PO4YEzzGTne30xUW3yKF/m1FsCWejc7/SgoxII76hAWRj6B7 +0aJT+sQUhdQwabpIVsbXYIopl2hLlS46ihHlJ+UjZIoRJHGmlrJA7ERGVqSBrtg2 +OClVFl0Kk0jJ8cdeKmF1auK2wKyJ8TiX7nuR+dPsrKyLfC4XiCsG0S1xLVweRK89 +F4TCnP8kj+9inUFEo7Qy/l0wUwNbFr2PqqDWYaJIehM/aE9qEEm5MrwSyRCH11wF +ZBTgZvNqPHrLO9QUXu1g7QsA/lj+Pu6kgZAr43RDQDsfBFSwO5BYwCvvYBL39/G+ +4E4ZFXF9palTevaaLjDNm8QDC5J2A+UI9SnK01o8lNDGnhB97RPq6CBMjyf+iZZH +AetXkTGYhjvDieYu4RYuwLwDOQdTcqL1RAR9f3e9UAZcITYJUHAx3hncq1BktM9x +rcu/WoWAgp1oDQzCwInH7zOMvYZAfmqwpWRVLyxEnPuqJhPKehoNeP0P5i5EgToG +1Nr11IVhqcW0YNp9iOFLtta+Yiz4EUB6KLlibuKct6T+bBtqmoayWaH9KhXq6vOI +EYrd02n1EgkjpFKYFoI8rQxH+7q7AKoYHoPDx0K8fX7EX3DZRY56lcLzSoKWwfDh +JQTLF8oKzumbxuKaTWRw0j23taZ3tjWA4Ol4nBkRwgks9e7Q74HsmZbP+wB9azkN ++SYg+D07no+drkSKUlPIFszZZY7/Yttr15qPREdgRw/UcS9mAKyueyaqfr4Kq63T +w3PCwLH9Ur5Ee9zdisnGkVp0s3moS+Cix/5bJ0qKkMGw6rO74/9FEc/qZWH0vZ7D +UIwikP3c1YBaMqtn4upR0KA9qvNhLmSHcCU8uErqoMeu/vVedy14UkmxslaXI56E +fHvJH/oUw0f7VsLNxiqakKA2g+4xywYyyBkfh2UnylDbzBaZonAH18P66r9POYKo +K5182Twe2YVpnGLlhnG9QIhUyO1G+6LhLuS8jmNHrvuiagYZ8unKFPHvIH2ooVV9 +dF111j6J/WeeJ8Ewf69lXGC5WJgRfsPSRxv9+6wFMkc8JHZtLy9HZJewkjNyiOk9 +xxtjmeSh3FPe3JKtBbm6YuZNqhsqDuc/olKpQxOfzBlnx+FPm3me4z1HxPezvYMZ +irdWXHO+PYaIeaQQAFRVHMo1La/pyT39ajcbZiydV760/u8RajYPZRaAFIXfOHyV +Y9SsaExmqLGGDbDX8RILS+yLGk/ePZixmu2ViQmTGRtHH77JLRwngM4igq+Eh5zw +4WJ2y+idMGAo4HIdD5JlGxs9tu30XUbLcW+2Q+GYxSC4/XLiwb1V6q1PWTU49qev +/TV1lkkDIRI9SZde0ehcQzDHVbPTPnxHQnMHuCXqtFBQ2rbJl0hLLx/lLVJWa1Sr ++zBV2vbVJOiVOF7ewzkExHkdecM0vNNdPHG/DZEcFwxBQnVaKiOaw5nTYrsIbn9T +tD1wAszxj+HubP3OquG2rgxdsWLcF4ilXCftgZHhN0WBbcpbECUhW2YJeLMuX/w5 +jXeuhX5J2boK83XxapNUelfJCfzW3p4qJBcAyIULDugVPOmLPs4WdA9swUE5diM7 +xYZZeB2g68oTj/7PrmfKG4Ha/kHwo0VT+UVV0oQyXobbdxfu3Wb46Cg6mCCd641m +iZ3LYPEphimX+mVVcc8V9kGYt9RXrzVn1GaHdhVvPGGw/lyUUFR7Oq4liMtU41+H +I4Y9dP9i3SMtwz5sQcuW+z8Nevssjr9+ZEWdR56iFIs4ag2Jt/KpzyfiQwXIpHiQ +mPUhTyUDpUZsjSC/J/rkQWlqlR4Qu/eczV3tA8zOajA6Epq6E5DesfG1wJyNcF0v +PKUBva3Wf1xxRbnS4CMU5Xw5z2y+G6qGUan2txGiMJ7zr4LHeO2wGeltKQHzQ2cm +QeJ79WcLyWwuhRr+vU/sbkCNehLL2jij18KN6kLs9WlvOclHSrUMvu3l+XsEPlw2 +b0qW2mIjiPPG7k3B7VMAbYqBS4sbylGjJvYwZF2Bk5I/nPim0Mk8ZnxKb5gOII7h +V2CKAZVNshyEps3l/ZZRGCpaeWnW3TYMoqCNXtc9VecJWOfrdpgL0OciKgA6TLRm +6+z9KYS3aI84841tM3EkiWMlOpatQ2RvuV+oqGa/BcKG6BGMzqvwJfDKQkjLZnBK +kXnoxqH+aLf1k/RzcWdScjJVRRNuYxrPqLPdITsb20M+oeKXjm02hESSRy98OEPm +Zfvky5tttfjPiwm8LQpB1YPUMnwTMxoENFPBqIkYPq/G0YC7Hi632k+i4pwFe2fm +c/2XT5573S+LfBWDGtDgjfL+7EFmODTd3swRKyBn+QJC+ZVA7vQeN1gM+HkAC3ha +LaEPpYYj10WtDLWxiOewz5sDUMv/ohu0DHLgc4T8AEU+TfLulTluUMlA7X7C43RK +q4mc+hQPjgy5j4cSCBWkSCRBk0VXIYwr9db9+Jw/pf6Fu3+zolw9SZg6fs0jHFKW +L6Cypu3jekLgi16HiAgo6dlXNsUfzK+s+nly/qoNooUpEtLTXGVrhTcbRBYXPsJY +85nBZcB5/SG9cY2fPiNo3yPz8z2djpna9KU2HOl4I29j+Ha18USn7Nj+TfnyAMCI +SMvZH23wDTJEsenWhaOPRkz/3aaoKaRpksetjWSv8irqAkdVBbb98feCQt1+fjLj +tZgfwuHf/SARiyIpplbHK1VWiJtdN4PxxV0atnDhaLa7IlZmxBCVKL9xDQFq4RDg +HIZWz9CZchgO6mmLp3T/uR6O+2VeKUuRBIq7x8G8LPhBN6udIbrsUA2JW2WKtwAw +lskOcba4J2yi3gtzOMH3HQkYl/rkMVlMQe2shEZ4M/QFtuenPk1TfUQrZDZWqkKE +PLXtv7a4hNNhYIAkNqE0U+4acp51UE4QInlKXcesJmYeZ/N5p/tnAQlg3TwDhzd2 +N7R3ga5Cfq8G+vF0GCv+sx3nIu1Dvh1GjVBMSf0Fbu5e3o1D6J2xVd6EgEPuhSIo +amQPhm+by64rfwGbzqIYAC40vz4tqWbHQu1vE2QPcqYncju+WcDpyeo8qZ6RbAk4 +blLL26EchBnT7zDvpJ673+lwk/cPsAqCMQ0621n1Cx6glcXwkhwClwIDtr69QP6b +likYCX4JIcnmOJLf6quivSMucE6PzDaFkCOCZ5pg8rvNPHsD/2v7MlPopNH8fedl +hONAWd4FS4YH/wb/+8xhNjS6WSTAOz600nGDLV0koWQfqZlBR7iWSTZUyn9SAofR +SaTcE25YZ0YcC2FV+Jfkqv27Z9jOpVTVKNjNBwbROsqPHvA4X/qSHEu0Fl6/mBhR +G8F7Bo2sX2rN9FCxt/WGU52r5rYQRDFhUIZN5TuR/UUJ9chddsx4EXRgHZ/OuEOl +S0MJTHjxGcioZdjU4zLvwDw0xifWXSk1JHXxGwFvrTS2MFkdQZqqPacpoVLHk/l5 +VkqbrGak1Mya8/G4VokeZdrKsj/4HSgs/OHjnUFGnS+hs2fNtDpBcMR5Mb+RctUU +KhTrh5yxClEqOkVPXbGJCPKfDg42z620ZptPWCDaFjdAKRFQ06V+aHWJaolk2J12 +5iLNbPCDduHSJwU0m+B9sSH6vZboO0vd+/akgyAtMc4hU4nW6mQuwpWhOBybcdmd +k+95w3BhF9UMquZ6F2yGCj3viDgfnuGoX3kbDvpMpf+sQoqwlc6wT7uevAVsoWtC +tcvpRDlwSF0GcWcM88i93OGd0nSlN5cqn2x1AYt8WiafOSwcot6bAB+Ug/9fLHDC +DeGMxUZBRsOXv8n7m5K6MPqqIMiderE+NwfAnYQkHfqdO4H8ZO0lfk1Mq1hRCh0B +iO7VfHaFSAW0gSeiYl30U5nqbyZCkwQ2MI/Y1pGLjaEXFZN378FpGtc7BZbyqxbI +MaiMGjbVCzG1cXfsIdzRz0UtYXZF6ixoUd36PGuzer4m3J/pMTmBUxkEWagTT10A +IMLm1OpGWfq+6wtm+NRXWzNjGpE1cugD6Do4j2UN4RJs/rcaLAYtyCwsHJpRy+KZ +5pveIxd6uoAmvktRhwWdwgFP+TLxB0DwfJUE+5+KfyVfdO4kSnALnFV/xSGUwIV6 +1iv8QS+ZRJNKdTIMsLktW6E3T4fEYtHlmubPPY3QE8VtMjChBK/VIPZt+VXLrTox +NbUWF93R093DPKnxV+W4d+V3eJ1+O08btuAhY9NwzMGjorFyVMNFTXm8Htz0HcUo +yl5ExJcocglCtUhbLv1RkKdCsB0yEV4HnE2qmz5g9qGcl02QBw0RlD0Nl1vz8nKw +F+ahv1SjAkdpEor7Bb3ZATCo7SQkqv/eP6awMDpPBz6Ls1JJ+uNWu+TTLnzHN0M5 +ge8i8vMVaEEk86Fgx5NSahw/2/JOf9iNUv77AyY0wqQzZrb8do8tFo7fbon2g3cQ +r7LBKVgV+IdFt2BXT10HNGjveWPJn/C1dyWJCaZ4lUJKYDseitp3W8EivuDihf6/ +yp1QD2FmzG3RqvuNISzrEuRg7bpsPPazPK/BbuHQBRwDB3SOlBOcnXLe76vV6nEG +KIOOHGTG+aT910CLkMlHQIDGTxJMhEu+aQ9JYSqaXzG47Nj0PdAMYkwazfSy6XIm +n3F+rHQPqVhiy/g7Zk2nthbwwleYjACviAKsPgPh64/dzwoD+SEb+xMZe+YyekAp +95nqbacQDyC/0QPnyrco3spzYy3DnLIeYTvz5J6XHL9Qyc1/vP0pc8VgDncNselu +z0NMpIMp9yskgvepViEpgsu7HwyGEccbnabs2tYqVs1Y1IpHqXO/DEo+NY44z8ES +HLu7YaWmLHcv+vK59d6YdqlPp3CWoKL/SbTC3EejNIWa5OSINGfseRgPBo8atRaT +WBLTVQpTZ7SIngBdCQgZ8UqoKInJwq9ox89cQNSFs/CAreivbHHlJxrUntT/Q8cn +/gARglTvTrGtP7B3WvD5re7iHPWLuKsQf/scLeEikRbCmEqh/eAODR6ZLwvVfx8Y +CJbp6hKFpTOjVKyv6sRFgJfKrXP5/uws3ajEzfFsFovnPcBtbg7H5sRiMSPeFG47 ++IbbDoQvCyggY3//3qLVg9clAZP/cXLTYkew14XUtj6zW/2C6dsXRaXQC8K1W30P +zmKkiftZDtawb3yrFv3owgHm3DlHR3sX8j5I9oM2+iQpDh3Xc+OKV/6/PmhNR1xu +hN7mlA8jCqTOhL9lFi/vElKUvG0KE3xo71etCsKHoiZ6PuXqwgY9j3WAvO8UNoGH +NJA77H1abDhTyn22SN7E6ifpEZR9uMAdjQjfKvR2hW9p/9F19880AmS1Q92tQCTI +j3zWqWFs+elJvScwYIDn7DGOnAdHGzCOv5+QaH3SwxFApEssWsI7wwwr2yKLxJjp +Lhz3lupV3aUbKbD/QAwcZKX4eWnnS++kfLQBtWAcvYjEqKbheiW4oTH1yuVNwIfV +3LW78XD9wY2uynyZPlBBBzVvxD0HCBEbdgHwbuB205wyUQG4jwK3DDFuS5Y40vYI +r8lIqVF77VrPYhzqWWCpXLUpSaQ3lqP/+icDzkW9xW/dvleq7Cq2oPz1w7pttAUI +PT19z8fsPIOnj4hkTe3oDzzoTeiFhlLbHJEoL3lOvvDigfsDp+7gJ8I4xYZWLjr6 +Qcomm776DAUSCc2vR8r5+NznAp6yH9WKMsaFvzEY5+Kf3EyySqU87ifJFM4RnjOZ ++KgYX5/ZBg9yREFl0sMda0Cy9WX69sjW3SZlpTFuMcq/ZBCTQ/WR4Houi5v+l5xD +TNnEd9VZ1pHM0VwlLDBnMk8wYU8kdJnS4I1XTez1Qz/Z6f+SvkQXBYm9XdBmGre8 +Q4MATGhfdZ0I5ZtDWth5t60mUNGy6XZKMlibyngm7xHOTKfpZM608UFPSaB0TxA/ +N0vHZbY/VVDKw6PNIMErSEcv45jNMUIEmSfOPyPRdR7RE1u53Bo8MYsMHrjAkMsx +IOnxVgAgleunkPCouoKBmZBwJKCloOtDKQBMCmGK+KQs6QTM9IrmQRcf4OwOy7uW +FVfUPhGmvBf+mAMaj9q4pIvFFSbyvTcodWbmFYnQtIBJ8NdOc0ZJG/AqeuhYUoYx +JOQOpypVcCUpFblUjwhk0mNdzQ2OJiM8TGYXcTnJs/yusrOW3oc+rFFf16inSg0x +TlN3F7rpRDhdg9pcF32a9HgrP7yak/groPSLaDVnF4SbLg5e4LYuN1U7McWVn4tS +rk31OspgAujwVFioI4BNxx9zy7VB7kxoTgbgZoGLfwd4xcj/+RRD3UkbNfA24qaF +MIk1WR53H78J7FR/InVAzZj6tG9zVScnAunH4Dd5vVIKGK+ImkYuvhHdsmnoTTEp +o5HbP4aAhzEW2BqSqzwKUhOoIkupi/XFL8HvDARFOEgHKAboQ8r649vjryOeBYQN +qDrLl2k8bu3t552V7ao5LGiDhWgvW/Fu4l+09zNFCu4HnDDSq1/lTEHevXyMz0Fm +gPRI6PeppynZbJPyx3gCh+brvlU/HrZM803qAqMYPXRRSdxDzr0QpBtZFYHHEArq +sQuDI6sJdya1TbPFv9DmW1Jms5EzC99l46FM9kqMZiAJigJ2lNIEl5hvpmEWKds3 +SuCaAw4ZqzLLssmQdYn3+DYwJNnZQVvmPYFPG6mnpAmmTxpK2jiVMlPZxNMU/JO3 +6rtiWAJhnqzB0w0zM7wbycH8nBfu/+gueKbbrPoL7c06Zd2SjydsCNSUPm7Uec/i +51Yu9eRB035XFTdg3TuheFNLOBt7yljmB1rhqOsrINkZ8aHcNx0in9LMDtUNbBKQ +ICZ/UIfTLCqxKWx8FlIMfvlXJiSzIIXEDsFvrdTQ9hzowVgnI6ZF8RgeER/ELxwC +LWu4+TPChiPOvCFIyytgYGs1U97IBVrwvpvF/hf60XT/MzBlLk9OVi8JQaya03w2 +n1ee47h+IKQ4GYMyTCqRw9ZBi75yp0so3w1JzKzcPrI6Ut3HAemRHUb89/EldNfF +N3c2FLpiDtP6g+9/MC+zQ9UMosKnz4wevvnVdQytoV/y86sk6LfaY3qPSDxwP7TC +qtCR/bZOIVD1hDOOOJauDd5tVsLq1uEALD6jnD8K9lshlLhJqcsX5BiswB9cqn0V +L6e5Mh3uOFUwQkzZp4WbXdw7Uf0JfzIvOQnsTq7aq6R4Ig6s7uCmp1+twYxStUXn +hliq1aIK3BRgcO+Sresd6n5HVQXRN2fnJ7iQfOREhFQzAyEnejJO/WUxUmleF0kf +3lkhjhL6VWY7Zoqa3PO/MZiGektmy4yM92OtL24if1VGFnVvZPFD88PsM1CsOhXT +PSFYhN1Cf9R+f9FsRjHmrA/5LORN2YhF2yVPhoe7rwldiTtOia2/WNu2QWmgRNDX +1s/Qt4m9HaK/T4dNXbtwhMsHal4lGW+vSVYqKclqo9/Epr6t8wJoGzapYaawaSbf +/qlCOMFFvtss/U4WlwIltpZ934LYH5G5FGFRJOiFm2F8BjvwC8+YfD1DAmyiGYd5 +vDd7OnXaynkvLtNpiApjaXMouBwksZGsllsEEj9AgCVMiV/X0EKNR+Fq54ZU/GxP ++iQgrWFtp+7lL16J3A9WLiVUZxKsRjE+CbMS7tAaOfhAKFRD/i/eWnKeZY59IHOP +6GqJCCS5R1l1VKmFejC6yEY8yBLVjt+TOP/yySvmfftF6y9TIgNrFifI9y6EmlDa +59jhkhUrOMaWKYB7CU6QUD9sJmYrwbE5jdLh/nZ9MnQ/OTvFwup4Do40G6GuCD1z +w39vbw+f3b53rH8EWlAZbBiglziOI66LndQUM8fciavctsgqCp6z3Iik491mIrFh +wtj4A+nHouu6Ef2pAsoP6SWPAMJWE4O0ozpaaGRELAcJl27FELy/qkEI7AL23AFb +D9d9Q53KfmgHtm5phst04Ge2VG0wljIfctj1o9vGpus7z1ADiQF9L5i292pEx6bH +LC56C67sgrQRUBhvB5bVzyFwL0lF8r/2HTKemEwKejY8DiwvGdFkFO0KtXFsZ8vd +0ksvSa4Srp99huacsvlEkyCSq0yVyE4ygPrYNUgbTOCrIyAVcKARc/gt/CaEN2g0 +DzAR3X5e9op4Q83aTf81vUL2UabyRmGUckvaOg03j7X1A0JJVfKrXV7++RagQW73 +YedadPzA0sd9++RjumKzccsopmhm6AhazW/BkJ17lfjM9GDDnjMxjyGeTxjICNXn +w1+OeqWKqUYhnNhMnXrJzMzydF8iZ4frIFiWJTievTKruOa0JBxTgw0Ayb5s/5O9 +0nM7GqvOJ9STaf8UbbVSQO66BPe88WRKmtXaT4Hu5Z2Ctbb1Vq8UoeFJD5kBhOdP +lLTZZBTYn1Jn3mWGl7zbj+pddSqC5ZbjmkH+L34/lfomr2ZB8kdwTNurOx2wF4HF +dohuBHV7Ktu58TDVilg/HYVNMGH6+4OXPR4BY6vvT8lStdEfBix/KHVX0ny7J28I +ITul+r5Zhyo4MoDGL8XF/MXINE5XPt34d67M60aAj3gCJBjwwO4uKqxihU+FWHGK +Z7hxhwmF8Z+Zje6WX48gmfC1/f0egJNm585bCNNSiduYWOfa7qUUjtq4guol4+KD +O4/+6ivqhDHKeR1Ezxa8Y+xWGuCFIT5XeYlejtfLfoeylvHMXshcKrQ/X11OD5E+ +zQgFWPY/EZQA//ohT1474QTCsVzXdyxlgfBU18qJevA5T7sAurkJKWue6WgU3qLM +xPnGjP+Zlh8n29g+sXaODfc9WgwDFUpgH5K+cOYEx6Wds04tK/qIXqtCRoZSftSk +B51ppOV22WFjZKWUvfrRZcdqxp5tGeS5u23xyeXBDlBlKbZKnv6EJuBLSoTmWhFw +qat5vbIr02Tkg3C/8Cs10zBbYphr7/lf20iu5Mw7FF0sHQwxW7/990qNuGpmRlP4 +tjnhe84qU177zeYrk6i0NN87Eo1BKqFlcOtZuYwcbaJqcrkqhNCXdiPG0dDtzOPU +afjuD/8z5CdgOlidX7tgtUR1W3Q80j6aY3nU4cAg/MIQVF3DLbq+fIL6zbZAp8se +4dxxuOHAMzGXC5ytf5Pzb6uT4d7aqgM2y+ize4HWQfPcHjscybhm9i2rsUk1IRnj +wPpJpreTAe3G+POo/bPSKmaCXQf30YLMVsSerK1/lu7mGLx5syPU+xEMvim9cmh9 +7c2c5ZBV/K6aLUBOWHBnlr/jeiFVXfD+FXw8Lq+k/q5uNZuaXuK0ib5PYyJxwUv2 +mm/L6NRure212kXCZh5WT1/HGVtQd3qH2TbDxcCDDM/Wi/OdVGUng56PkeNSc7yG +WZ/Xurr80end3nVJ5rc1lH3Q8OtZSzYw7dOO75C0r6uL/JSin/q5soURYTWLcLgH +4Dn6LJrc2m2tzzVWFw3O892pdtVPIzh4uPn1KOnylSWOJw4pB5mi2rAavonDTPrF +Y/0k/8JYLxdLMh+eHwQVDjvM05doWShZIE5JHRwqw5EAYOV7U9ZwSNvXxvmDvIzp +jVwJuAglqAYnirkJw3IS61/67OXIbDsdTmwZVjF2TbfrqLta+cG5+5RdahOtrrMr +SvtoK9PMe8y9GQTctdUo5+zYWY9d6OePdl857Qj5EzClqfC/5Akhvjc8qwMDHKhP ++icXB38ZhVsXEqSA+gTbemp4lqCQYOcNFw1PvyBH0SOW6Y5F6mo9u3xgVrsglFs+ +MUjZ98tBW/sftDw4wzyOCcvhdlipFCVE+UwZD8BgqOGperO4lY65bhh50u2VuGqH +xDWvrJtwEpl7PqQvJjnZWgMaMXsrDKiC0jWJ4A4arsHYjGTHot4FKZ5TdNIc//w6 +0p0gdAYlKtc6f/HNh6kzu9Ob47khFttUPPhFlmjQ9pLGpbKHBOI9S7Jf7bLRTTwc +9RfJiBi9SbBRiECQ2ZcwyCvgY78Du8NJzB+QaFq5bq81yuzGUM6Htb4zJt97STwX +zJybmYtFpoo1MqwrM39NITAGY7VYj9maCkrJAJvc8XAiJisA7ZGjQiJiwpkdQ+I9 +old/hYmblLb8D30U0EGa1alx3tpIqH4Om1P6N0nANceVc9VljhCJGc1rpvPb9Uzd +kf8LZpk5BNhHqfPs3ClcOL1k7OVWN22MeqRt0S+VkKckteMhp4suRZ4VVQG8TKHd +/eJVng1s8UljrK1f1lIEH+8o3F8G/EyTsZDPAyCKCS/3HMHFCcEJzauXHr6V+S0V +ovFUBQMw92WnPMrJhdunBpOzwBWZT2S6F8cRBXESu3xBJDnn4wRbKfR3uoEzgBRp +W6kxQqINpxSV4TrmMm9SiHQqXZ0+A+iulYzoiCKHU2B8rFGnGIUvfR2pXntQf07i +g5e2scDyYg44sw94b/G6qaDPBW0T8LgyCnD7xm1ZV2y2TH+b+o1NXmH6ewMczkM1 +OpmDPQGg2u5OjHImR2FxzVlcSHvQSWtJ3FkHgN3tTsFCdkdN23TdijoUGBmt2o4W +orypkWbkekeaP3hdEK9OBcmNXx59A1W8gSjPD270Ydj/owQJCNAIoyfjlqCRqKSK +nGDecan9OoJSwYG88MaGV+sgoI3wQd07wAz3NCmUPPZ6NCzegy76BvSxCHx66GPR +i9HdsZYQSSErcPUJT5+s4lq5gTcLPb5beH02Vq4PsKNYkROnrCfKIjn2X42A/itA +q07WB/hG3KcNHDvC+9p1JMBZTojF+AnORXRrXBbIFDdCoeDe3OASjl4C364y1y61 +9EE4igd3TdLPBo5sSCP+NotM3lEn7RbRcXs1vaY84BAa375oodFvyIJ5flBSvlG8 +6iuQfz/hPv0OuDfzalCbo2U4n7Mb2vNdBklwXJGMUTOkR+sCSsVCSgPshypbMXjW +jg2Li3Jsz8cWSvdn9iqA5QnP97PUmrZzEK+249ANXzRCT2AMjFxJDzi6Z8cQX5oj +YKuOvMg6KNz5sr0Y+DkLCzGSDrFIhZtA1fd02aQXFQrWmADUgS+4E6f8Yj27oGPD ++VJNZ03+2wIbX6enZ0wHkw7J3YlnCr2BNdoCV5owh0mcYsghkTjOQ0UN5caW3F5X +S38UT2s3NXt+etxNrYU6bd8WTUJlNzuMqoNCHGdURyA7VQlCXkS0DKPLhBSelz9w +g/VSNNulLW26F3SmmXeHJPDXVN3IkalXOvBrH766pprm9bGvKTLs3ezmIA+nOIGw +bwhBdjgPQqbFmZHmp/8dUXjigUrVz/d0OScYfWebVdbgzi7omczYMCKOs/J8X5tI +kLFakmtUPjsNHfP7JHtctrhu8FoTvkKSusoY1UMUStEn4GS+uXaKwRBgieRhSbAd +xTZFF02fKT1yI3L5IBxsO2cV9pihuTnZQaNCzCekV9gt19oqyGfuTLA0Pw5uJkDw +PrOM/qwVPXqNArrdiUf9Gfdn7/84TCT/3zrUoiCQPYxr+8bmgh/lVY37c5vjr5IL +sPhq98s5Pfoz4ne98VFNmiNDATAJrth1nIadT9nO+Fm3w8mKHXtzj/E2mRm1bl0u +NCLGLIHgvinuBh1rflaYLKiJyBzot9VN0Yuw35dO4TdNvCidtF37NvFlHOsOxKgX +2EvBHmFj3tr23rT3n48s/XlydwohT429OUjtsQL21nOH1z99zLsBgT2cCSmCLhjt +0GiS7YDFgZsQdvNzkfIZ63WlFDRo0qnI7RQc0wUJR8vapuYgi9lj+O0+nXMrUn95 +cj5Yqjw5y1p5sNPER5hJSVMWUxCDhLA8VGb77uWqev3cbe8OX35qRucG2g2qj58z +fNpIgmyTmYdCfjw+0IOla0Cc386J6t4wgJMLdhb3wTPnE6Gv1f2zkRYmprABfXNh +AF+KIpqZuAY3jBq3xKAAxaGLrc5GxD5Kt+31qVPBD+C73cmwTGStcZX9iSGT/vEa +Dj01wT6C704vlSnV6TuwTxhr1dVbFLatLZ6RgfFQvvPgQdgccH4XAKQ3I/a3Vnym +0M3sP+uze3I5call8akDEek7uWZxdQxjCq+L4UjlSwxqZm2MTq4nC5kzoP34EyRz +zNqAFKWBw/OmJdg4Td29Eu/Gq0ONWm7LSSEyF6BwGDlUDs4PP2bH7mEn0OKJ7wME +/wW/skIAWVZzGJxqWYW+gvzhJ34yDSbm4GmBpI/fdvRMyPciLQ2JcqH/eiKW3GI/ +a70sThWscvysL7Ibkzd7eMXnyxzmezCWgmagJcFMOkBaP8gh26nijcMHv4plAGpq +3O1sel3bBbzTb7eeTV8yD4uoMtfnBpCbRwiuZ5WBrs1eWlXbepuq5Qi6ltpthiyj +MFircKJlYw+rqBmDOVClu+eZwtyP3eeSo5+aFKCSJE/hH/pVXo4rlwB+hZXOkxIu +PMATh1PM1w7pu6x/Zg/Bh3QScA3xEO8ZspihYf9pmn7UGCcoc9CQm/9VFjcUDRug +I90hq5dJ6h3Is6pf9YmlesgVxtU13XZsXxoti4WMWBsWzKhuTnlxRKBighX2w4PM +dPwxSIUF6HuujcwatMZsNgQmNHZmZUpnZIaPNXHSTCjzkYEx9OeB2vwHQhJ4GkYl +P6tAt2VQSVIUXTiKqArvSFW2fmOEzxdG2zeRIB4bY7/S5KMhB+TSlUu7hl6trV/w +UwYH4jAwKyC+8niVJRwjN8XSmwAKdcpK4cVZYpyqDtbRz58wbUiu1eT/EePcV8xM +7iHf4+FCz/fJSyj8JCb0vIy3af1AucZCU7Ech5Cu+JfZgBIGcbiKiUHp8hhq/H5s +Bp6zxi+GSFQiDEfmHyHU9A8Nr2M5Je1WhA9DBRnrrx9y7qK72Zfj/rE2hFiEuMtL +Bu2DTgQGCbvyk3Zen2CcCLRxpsycxoaG5p9CkjPZrX0VZdFGORMTS8nmAOl6r9Sl +GYMe04AkndWB9U9D7Z3Xi7AkwFp8z8wceJFW9PeKlxAXqNkKAO/BjMFrTJ8bRliV +Q8tnLBni4Oel0NMWybIEGR0jYctF3z1vyjLksS18qc/HCghoX93Vq9cRalMbOmxm +9IXllsD/UDq0rlLiN+jhPqCmlrQyPrNtriocvjg9Osu5rb8pNhRxG7SOZ4M/2zoz +6212617jB96PaizvkQu8jGDBxZ3xcbOtLH5frHp+h99B/IoPClQLqU5znx4XylD6 +wJgvohEI6pSkFnzPrtLBrS+W7pougwPjEMXwbjUC2OpUo0asnpE38n729jio+iMy +PdZvcE1A4yiz+Fj9TIAEPQaGwC+BvTsvZfB8s9LIxzWnBjjNPDeRWP+v9Rnag/se +HFe3XgngDRjxpKsnGfajORFTnu2eV1R3PEE6KCks9ZQjP08L0moLi+SsgqSv+odJ +dvmoCJ4tElWM6zMG9CDdGc873QwOFTqz+5wVPBG8NS0Me6vrgAqX3ovl1JOoAJTx +u/tHpapOCO3JUM412gqONjOqk/QDjQVRP43CYOVdxpEo0+mnCK21ccSwbPh0ueNu +HikjzLYNLkckCE2u1T0PaVd8xE98tu8xEP7WbHaXGi0hvWnXwu17i/w24Pdqj2rR +P2JmcaXLaEC0qvRLRxD5DdMyc7fPU0PkBoQAT/5eTVgw3Ao9aEM43GKxlnaVdoHG +rDu61oDo4rKiIct8tBg1PAVvqgp0yAVPF04/GPjz8G/Z744ezmWIk9QTLqtHD4CO +cDxAyvSDCN7vJem4A4B+ItiMbvIOm4QSI0PnXdKKZHiPOOqFN7H/XzrgMrSErqrb +an5UvfssyjN1UU8u8CGfGsXr6cj76sco8ilmjZlaNUUL4SaDX3Ncrz+q/w++XoDn +sJrUt6U0UOOwhyukPWTxHcI8k35fB8UcoxCzK+aR1iHe1zLN/Wy2oAmvrV9D3saV +fZPv2a8dHYGwJ2BlVMDut1Qifgf9AtyhjcFzO4pwOky+MjAkwGMLvxgDtBYMvB4a +2A3HIquk0aK0UdcnAS3pUcvzE14Dph6N0npVO6TrDXG+QqJpo4HieDhGeqGXMSdK ++koQfI7Z5eRMTKRISJvJ1rFbpM1LqJkhVQQVNfbsN0OgkCUHCle3jPAvt3Cg07or +aOqiwmSr5Lr4rAXaD/0tl6mml/SClg4fhAJisRjGeIfBC6IubTQ0zkjjGTlLpA+F +rVBWb6NqkdQLEvetGHsEhmKZ3yBd6aHh+TsTmS/gG39Siv3gKeBeFB2I888z8T9P +546ItZenTXrHA4zPFfh6XO4UyE/g1/V+1TaHt1EW+0tU+L7R7iQJp1tt6mBuKCIO +3aTbXjxt6BzQRM2i816IeIz9fP7YGMqGV1ejaTPjm01V2FAjLccJsGMtIanhaxoM +5HhDXFyEZb+F9HvW9mCGpo9QCG385dXrQQQbcaXBWhdsGjMfsKrPjtgCy0506jqD +1EdCKezr/y1D1k57rNJq9NXHb3p+X4o3NVZWkwf+M21a4luoYJmpyWwz/Hiq1JYT +idJg0ZS2p3XbcOXxJuovruAa04ZhLoOf43sYxTOtXHwh05+CqE4WeBRyl0yDmEj8 +LmeqUbSlcQlhxm6nzx+l8aC7cAZ7zKPnFly90h6fVazdXcqejFyQhtBkqsEwVUuN +JNqqmhW7x1cOkTpL+rub/L4X/obwzOaob3j6oDxiw/QczdQG2BQTONVAUFyrve7J +d6WqYMZxeTMNHRgaZnSGtIW4vxEAZygvPoxpTP2AKtBYfmMvfaeqe2EU6L3ckJi1 +Z5L2U4r3FKAxbmAjxKXPHaa0IDU9brg9aX92vSX01ecoSpRr3AOl5PuLIE7ctVkl +IBKguXtnCEX3UWqVjJhgp2Xj5nHt9KjEMHNzK/oEqnaRxhUiIaZQt3EmWMHAsS38 +kq9/dC3tt8+ABCJ9fn9tPqx6/KFHevpBNXA1CyQindLV0g49Q2zZ8kKflioV+VVQ +dcz14Rwvab9rwkM7Y5GHx3zoIc0sGLqz/5RoOikbMCaPlmO5mGwGQ/TC4RUJQOAH +qkAKC9lXjsmHh6/QRX7SO2ROWI0s7LD/0EiMYrimXreRCOtB5aIMpsa63mX/qPXr +PKys1RW30xdYl4ukhOr5MpXR/K5AmHiJoAFo/S05qx25nKZrQlkrX6tJVJW+8AOK +3JP+tIbiHkqZId1RUsJ6gRI4DuIHvLssv5YjVHz3OWxGZ9Hr241hrJCh0fNZH1cR +PSQUVw4dJbxmoZQvP7X1HZJqw9e7Yg0/7ySCpVsnQYFugEggTz/hHP4fda7t69WY +TDDRIocpQqMX9QE19lafYoTiZlV01TOgyOkiNSvRjOb572ixEMYGU+oQyQw+Wh15 +dd/o8u96GTZSigyET8MuTid+0oZm46vOBG+hKEpmP9e3CfwPX7PZbd85FGXk4puk +90cjCcqr6alqSJT+tWaMxAa8w8KkrWvpp79TsfRUhcfJkAJTz0DMSmuyfaUM/Mn4 +1gMVkKKS/8br83OLPqWdMXAIO4E7lbncsYUy2U9xVt2rnjia2piTNzSr1D7bGJzU +9pp9bV4uinLPfu/GPjIHQH1bBd2O1ETQQTGBu1LLfW/L6q1U98YQ3yLB0QGUFfq5 +Jt9v4vb6WiRQVbSa3+dxvvIUi0gbf4JP/B4RQlPILElxi8W2N78TIi7ff8Xani+P +JRh9HE8+XmHTYAWrtWaQp7mh3GAoBxRhJ7KIKxCp7CIKWTgUr31q58717YEwnKcC +CzK1QC+FtiYmYnDQrE6iD9JQ0T53QficVauya8iWMIAY0g2db7qEd0PvfnopYZOk +RU1G2YZn4BNM76MeAqADb0efB5OD6DvsMmrmfj947hxB2rC0cvNs43tMv2E5iTK4 +NGpOF3Xu5ZY9Q0FE5ENaGWLc8TOAPFQ1hzlU97Z/OTDWv0j4ZNWKBNW0/DCjNIk1 +815NXHt2TOibIwaI0qZMG6tmyAAceF21SRDhxVTfzJhNHsK8CYEU/YBNKlNN3J3p +c47OMHm2gpEJRbia0slWsqrErbkeXPNw6paMBdXcxX9qAXKeubqsBNsnLw/6bf0Z +e6ybZVlpnAu2R9EbFLax9YaOG9xIDKrWemmCinD5l2P0D8T19J2rIAow1qEfTfgt +PA1Rk9gwdCla7TOvDjqUuTQ75xXG88FBN1ou6TWxv5Q5c4jcgqC/xgwaIdoyVVQS +2HnLXvriC6RxLGG5Syev9pv8EAcR1g2w9xDltb6MjmmwgW7C45XvkqlV1RdKpNv9 +gHAoqFP/e7NRBpRb2Ard9X733wx85cyJcO2l4qtQ4RYEl1hEOom7XRAJvkKbu32x +ymdap/AbAQHUtGzuy90HgvJ7aCLwbMHPjxGap/J7SjGwYwTdWoeB9DYnliifLAnD +5RYlqt5In5E9N4JqZlszljS1dpugYIUmJytVsWqHvu5h/I+ZBEqa3bKHUYxEbmOA +98MBz8+LIBdI9gs5ATfRUWFAGplUAEjZlxodWgoqtXeVo0d0HaWb7fa3cdC2jxhL +ync4WzJByd1iTW8l9bZUde3RKJk4WGFV8eIHW51hCv+hUaO1lnzcJlygDwpHf+q8 +Se2wcH36Lffiqnrqh45pVPXl9xxzcEld/2I2yybFT54YD0KVHQGj1c6s/mSwAs2R +DskpDeVBedkXUfheeVtko5EuKEhaO4EDrSPCQwHWa0RCb+I4hOQ1tRjCV1nofITU +xLgNv42O0iE/lojBtoHtpDfQLsu4ZIuViXgPsJsHqu+wYx975Tis49DOkmRCTWNs +7J3ByU2KsS9TK3WWI9msEecU//lkg2TwNhS01KQoLFLaUEih4npIPJWBIqZ0qvlD +egeMS2F7sWjFYZhgVo4GsYZT2vwYYX2vSfvFvrw5g1VGlhcmIL9YlHy1cfof6bvd +rJ5AS54LqrqCq6ClVqwVFXHGwno5RkqoyDH120FDAWm8eQqzAXINqhsXasJJg//h +SJbkJum3zPMvS4bCW5Kqs3vHP3uGx+8odCSYHPtkAQgJLFi19cZvX7SMhgO372bV +aOxeZrIa6fLbqjSLu7ouog+VjB+iZRGOkG9facvqtzwyx+BcElxzl2oaBu6FdcbJ +Y/8EIFXhOThAfuFA4N7Hywlu3IgEVvjH2I3aREBkng/qIvF+gkXsUj+3EgDQJctJ +REhJ+sgZxzdUUA8KnbR+oZ5sZxyKD1qHJPfxoSSHxgsEa+8KXgyG3SqmbQjMHucr +PXpNJ1e3jOhkK/lMe0CEDYxOuJBwGcomydK7AoN3DbXyQcj7CM8xwfucplI5uDXK +rWWiMcgaSvn1YkNUrNPCXsyb/xgZJDIewsjGK0Pp5LyL8v85Y0yNWZZeZsvYrlfs +ZjAP+O8OFCEejgLqkQtXuLibbi7OQ5iK2Klb8LasofNSV5hUZdK8t3TNdPsEqJTu +3FFfNbgirEzGychZWbYQ6cNxJj9cSjEFCHCu/bRzUKwmT/aJrPXYmk3wLrMtfE4D +tm3nEfg7FxKSSjY/BFQyrS1i6Oorx7gIHkm+AYeRfP98StB3uFA3pzPi82a/Q5l/ +lhiZovBRiytTv+/5yuNNGCaHFPvGD/W7mdD7jB2lD1xOBtlTujaHwi89vvH2pxoe +8ismAmDXshHfGOM76FgIqTRnKf4OOZxGC5DXjajUy1j00NkWBGOWd/kgOEXEM4ng +FL+ohlIojL5FqmcKCX8IEWGD+cpPQ9Wyu3+P3lBsSGwLukh3pSAK+QHn/V66OFub +lzlmfFQ+lmiRgh4dLPig5xnMeAC2dt3onbaMbrjdkRNEA3rSi5VQ3P7+HgrlWns/ +u97j4FgIigILipJZePd+L3tS166ucr9EsevMnKxvzGCVCYd2RfNjXF0v6HbpljhY +0w05KktXLUBWzSWRUq4YV3IpAuZwEgytfeJUnYTspzZ22LUaWNkcL+7ShcM3XI3n +JcSvNDsXgMRE3TmED8LrWo021NXR2eap9T/uB2yZdw0HWy+mwS+su/CAZpMrS5bp +IfhZn8ylx3AmBVGbq9YFPzEWE4w7JBVacVGA+eDcttE57mdBk37VKoR2VT7zCGIt +UDE1KmCOUQIsx/UNXHQuUciDHnCa7vP0adlPkyUtbRE+7fScOTgayxX4DtnmntTm +l6aIEdvp0SpwYQndPYQd1q8PY86KidGVkGHlbLIyal0wjQ7wE31DtvFxLK/9WGe+ +RJX2N9iILe24FuQPVqX65U61+DX57miNICXHcyKrRPBwAS4hAsnkmfukIFDbky9C +4Rm94ahVm0QypbrdqU/hYQxzEHZWNfb5GbPef9ZWlJImpb2HBU1nhICSkrZrfyQL +bgwGZ0HZ3HjjvJNUMx7PQ/87jkSzw3E9wxv2+jHPaswD04FxNUecVUUO2a7Qxyuj +NI7LNbfIZLgWtpD4a13jr7xfnMh5b4Ir41d4AXv/sF4iu57HHD/F5vYF0vSXEbuv +mwsGzx3jyD+vddFI8DoETK4jXGXknhcAdmu8oRjKXQHmfxy5q+Vxu4uURihrNzXN +npLQzotwdz+iaCyuqZPS0dSFrObcqjKzmZm1de/SYVLXc1+Cau438BeDNJ1bbq9t +vgwScugyZF3yzeQ7PJiTl7G0oAz2AvhHureGgoWJ4z1kOW2INOZoTuZpoze9y8SZ +JM6X9DKvMAMrgJmys0GVZF/R9Tpm/7SVdsWo0Wa7DdmJ9ZngjW8yxlTkdjpr67l0 +Bxrkhjce5m5kmdKqdHfp6nUf5gFCvg4h+X92wbFJVMoKRQxHwF6gGrqq+EYUwIW5 +M1/TSpBWsAn5j2rlCVeSUK5DaQN94ajZPaxIIa2P7xVgOTXIYCzNKSQgO60PZ2Pq +izvSS3vz1vyd3tytoSyR1KOqubFX6vpLCVilI7Oh3OiApy2bu/YpvhS+yX/AkTX9 +piPZtB1+378mrudjSEl8VshaKazAL7cDa7sWrk5bfaKydZqoFOHOSjOqClkGls+P +ynI0sjxc0EBNH2aJ799B3tmttwbxFSH3jycMIbhI0qtOptuggQA0Uo5nih5U0kyi +2GRBX0obSIbNTScYoYt3tmhKxUSu+R/qcUvr8Y2UiW8ooRWmNzBA+koHmkOy0aFW +V3pLiUjGYGO4LQIgTn9cVH/E97IgoeW9dpM0tzQVFvCKh9FchW0GidFjzX0rZEdC +KOlpuV8igHupVMCNcLoQRXwCVEypBa//Dc+np5YfO3ENuDUz2jSzX0TBPJYhwfRj +X5DNV2HvsdM+D5IQInyChvRfP2ZEy8ncUQqeretHQsboYMY+y/YzE1LIHsiNajeI +HMyzGUZB/QAgWI3mgQyK8TdquT2S0vdDhnL8jwO2b4AJiMDbnbg1UkFe3SLr2Sjy +CkBSfP4c55m3OmWKUeknWXdssv/aTHxdqHi81H3lTbtVoccGdafEYeBYgwJYAIf+ +ece8hTgtm9wqGRfPEEwdhHuXOEO2fStJgS+crOQ7rgIuTuPSqGROXFFUbh5ucONv +ZFGCT/oKlYi9+4/kXBbttL6XsuZvz1XjFmZbkEnbzYyCZ1rkbhK9y9gXheLSff7Q +RsBaEjYkY10nl/DO2VO37gTkEN3jpdKlCOVTdMb84UTWn33d9fvPxfcrCTcxDy+M +/P78RCP9egueu3nBkY8f4nvUNg5LJg+x2Leok4N7Hti8nK2Je9c/BheKxAKNsBiV +nMvpBIm9TBg9tty/YmrTsfQKNH3RxrsTv0imG4KKGQ49ZczCwygjhj3VNrEf+A85 +Gw95WFbmo/EgdzfxwUMIA06+kYTWf/DG6Jr4TKbYVCDih6U67witgRMj4yJWrwrz +fcjGk9FeKw4zazI4U8MsRlstHuehpRuQVmJeAFIwQHFFhIPDHwOaGa+Cl4LYKNQi +8IkhVXRCSBq89sPF6cGYBdhDxIcz6n55WTp6619hQwjcTb35JbQ6LvP+W7uC/2aD +jL2N/2XAHX/+PioVwNS2YmuS8k3gg1fIVfXxXNh2skR14o7plRLOVdPbLj0SwSZF +CrLa4n1HLnz+82RwYXlfnbnygDUex8vzgkIIhcjm2zDolxQkbGHIrx13oG9IuG9X +xQWnqStRZjAyELyILCNBmlbJA5iG0trSPQ/CAAiQVHUm6+jw0tiInSc+1Ze+l4La +pNzIo+d62rCjGuAOfdaLwmLTQzq2E983X2wdfpaViBCo7ULuiybFZbfo0SEsY43J +IZenJwKypBWnh0RALivx4syBtO0pu42m+z/tOac2JLGi5HJ5tr/E3vd7V+k9gBEw +SzeEjIrIKBNeR0JdRH/wWCGTZGZZ32QHS7LUGWxTJo7um3gVCN13AXrjAhxrJz1P +OX0A6CnVv8xj81Qu1kmz4Ou4piMxG9Le6PFEThgo1ZqyKR944TbEjjS0krh9MI7J +bTD4EU0sPzqaJRqJThOfEdPy6V8S+/HBD7oymFm9hb7ncBlMGpaMv3eQDdYpmNgS +sVqXuRiDfOSordHeEHEmPzMCgzyWfS6bsevdBU3zi/yCA19l7QoS35hPs2mAM+r4 +Jsil9sgB7agciEAQYySTtFAqdDlCGK1R1b0ghWPeKSaxyMAK6HWhW2qoWmj07Xxv +DJGhH9B9H8lSkeDpFUe+mdeBWThLQyyax4HJcop51xToVZn8muthUgXoSxLg3Y5y +gMYPHJ71mFEk6H6Si1v/0yalpHP/7Ws5F9dBv5hVyeFP1eJHJqEZHg8nTK0kOVtz +5L+bq47sMtyBxZBLO/1rOZyFStKqX4egxhMtSUPoZA7nFGDm92bNu+jGhRavu6Tb +1W4j1/GIubehcB3q3Bk4vAEqOdLj6xeKgevgTsBhJU6NxBYFJ61qFtPdmqiEq5Z2 +3mB7gnFj8Wi/4J3EMVa0NYMM24m/xwebeKtUYIuV6AQz15wnQe9gsl6375ojiTs7 +0rqTC3t7+HagF7Xa3YxerkcO/3M7TxX46UTgEi5RXCfg+0NF6TecAN+4vWNiFxcK +V5VvYEIygzA/gs4bGhW0BhDokt1U32ODtvlE7nDG0yjN0GxuKXxsZ9V/C+9hAzWK +bcpyR0cJw2PAEy32VHJXcgCtSRTCCwfiDbTxl+oSx6G++haLSfaIA0pxmndSQMPU +Jp+xXoZmL87CkrXyTP8Lqy1EfEK1EJ/C/aJlz98Kk6mS6ei/iKuQNqzHyydLUqvR +XG41I/lcbw9V4AumF3b/cPG4HyTxoMKxrn8+AyvrKRQwmFmwZNdmwMfMxXjUK8Yz +1d3d52hm61dq3r0lcOUp+EofEMCNW2LVuJyxl5zOO7SDxmaIKqVwK2/r/fENXhB/ +6Qt6u13eGUrXN7ox5C0J6AThFXVsqOz7TVcd9V50f4QHwTY7a3zUx+uiZUfG6AEh +WtB3R32XKsVnoHfaQO2GNjrIEwvbpE84AEUuoG5+1UslyUL0cQnm5BujLNe3UAZs +0kYVKbCR89aJdH/TpUzIT1a8DxYeMPnT64lkQJdiv4xRXouHL0FBweqFTd0NoiHQ +70CdD3Ojhularkuro9vIGQLvpezXFB/qX4MQfF+ZlOELnKitKeUSX0aGhhElVUk2 +llEy8nS+iK7NuqYOycMqlZW+M306wxBf7u/eiSBJgHRGM8mLnNUqePcHJYjuUAA4 +1nWx6eWts8scqJWOL0Rq8Ct3YNbaDHMda2iQBT2pfrs6B7ATKV8qvWtKptzTJlKX +C1SOh7nvW6pPmEy1pTR0WIYE1HnY6BfsTqlW3ZKETrEsRQI6nIa7fTTxhHJDGJ9q +ZY4mtUEWPrhWPqwZ0guBFUZiOso3Ik25kKf32DmrPkRzemSOxGTz4EhZAztpRH3l +QBGb5V9jx9KZwjVNK7xEq+ZjibOcXg/4I9NdV1y8+rkOs3cWxjFTEY6VKoM6lEog +ART+8g3QCYPh6DaxLa7cb3eufo6o8QqygOaq6jrVOXPpIjZDEiRAekVi7heo+atQ +nG1rNvrXWIczm86d2RqYBOyJQFk5ebiMP+TYy6O9zrafYmSYp5Ur2uB/oCIyzfeY +mvVX1ulbD1KOjBKDBs27RT8qYhjwoO8nD14xxZltoRNzbZYBWfPPYfnNzRWDVbom +22IJEes8c79e45t0W8pBYMfcSzmtxo/qrlK/KGXrJexYJKsHDeHpX883ebTQlvIv +eyTwXPjoXY25DX1UVVUgr5c0+QLeWqFxIZDOPy+gR/aa1I3u90Axfkpm2UzF7NNH +qc7cHpxYWwIJ2wpVfTzd2FCbu2w9jD/MpblkGgbV7tYFTUFipfeFwPwzaVJQEh19 +k4bFSpHKnxvcJtdWR1f0ZtB4/XSfWWg0X0ZEO9P86AtlzlNan1d1802iLmow5Plx +QvZZjdLxknNMh2j/FKkN22PiOLHqlPZC0FVK2uG1isk050cSBxs0oJuYMpoQviC2 +rIPqL/7O72SjumdvYSF4+9zXWdgiAAmcMX6loOOxvFlRYNdtVgyWAq4AhFUTotCM +ZcZ6Y5ECI9+kmftIOZekO4fV5RdJ3g/UuJ/PfNP0npcO+7NeVNopj0ReVKq7R6b2 +j3pCZ4BsLjp9JNWxh7cRUa/dF2idpDCKRituHztuRwpO9jsZTx8KLfMclCUl3jSH +VB1WvF1Io2Wg5xtslImPghWrkXzdrdWnk1q0DBoBNisHgc40QOES1iTDZNal3b7g +LXvFYQ53pgKMAgTU8mAif+CRC99LSTUacB2kiftWuNSMe5MT3CKKEDr7a3XZ1vL6 +Zxh++pTg+d8cFqeLfSpjGQshXzUnqKzLMzis67mSeZ+fgidUmW0vCw/9HX7V1PGR +7m40eDOMM3XewDnYVaUnZybCjDfOyyBEKoknRvXSt9y/hE42dem95WLgwjnPFPuh +hJ0DG13bKaBd0JhQ8zhBmKvQha0cVtBz/fREV4Q2X/si3gU/evIv5oMVHA7cX68c +2YReczEQ1/MxV59aNHMII+wqV/ubD40XnsbySTg27qjhYI8E8gCdLmyizLQocgR8 +wpWXDUzujlcxci7zOwMWGjoeY2S78kcGC4wd9MTjUXd8kZx58R9A7sHcmqXPzJLE +ohOlk+0978gOsD4rEyg7DRMHRMdvu16eGkDAEZDZAlzLbC3bj3RIMyeO5J+fZI4T +uFxpCGrPVoXwWRsqIydetobR4eqIDutuZ2Lqj8EstwUtVMzTdzyWoRM6DOb0T6w6 +yGuJVisqSqiXvOAJjdTHjbIo8SqbEMaqltSc8MSIGbH60nP9UHUsmzBR6VqY7mAE +pjiM9ySySeS2UQe5RenHszNvRWWdohfdCEnX944dzRivs7ugLkkphrt1eXF+QTvg +5hnl19Y1WH88vFSCciogcAZkmxm0HTK60i5PA/s7wh9jVTxufXU+ZO1rFyHn7P75 +lqVQ8JqOS4VnJNWh7v8XmdpwvZBzaZmXJhRt7ClTtZpNrcuNHLKhsihD/Ubnzr5T +KKREycgMluT/oiYV5delctI/IJotAa18hKI8GA2QdAmTRjYPkonDQ5TLr9RVDQ5Z +cDZVnG+J860h+Ld9GeFMP8zWtAtPSEdUnCFAseDutAXS8+tZkZsw86zlms/+M0T/ +yBFNpWvuwIuw7rIYF1Ve5hVZejDRg07MkluvGnlMpSv2PmIN0snPyS5w6Epkd/XI +dlU/bKI1vaQb4wPSuq7Vei3P2/2i7mNc5ADoftszEbjzzSv5qy2NwBauU+d4gwze +xJBuAEtJmAdU75ZuR9WECp/ha+KfG88kG+nbgrPCd63+y1jajEzBVz3BleoMUkNa +qBfo+urwukcBbVT2z13WknKUdytHbqqHW7LkRs+2aRsmAXPsGi113YMsT2uuCRe9 +GvksGOiKCfCwfxxbIVZGc7IIXn4wdbeNOSpUzNHCFIKxTOKEi4XyA3M7s1FLd4qc +H0JONPSGEhIfyHHruqMdvo7lFzg7Am3D/SCt2qnBsdIiUi5LTCfUc3bQiaiUelOt +ikzV7cbOui9Xwv2Sn4xhyIF1G1DQyjELqfRLAPPZlHp5ot8EcViPXC2o9pTv9pgh +HSQwhSAhYphzQVZQ9bNn5TqXBtWBnksjKKhrccs3kVS2Xz6PKczWxR1QA0sO2gOC +Hth5/Ya9McG3SpNnhQ/wh6IWoLllI6JCcZeps1XsRoZdEs7scxtnQX5x7IClqN6B +LxO1MrUK+yho6PI2e/O2z6U/gR7mHaobs+EBQds8R+LrVgYdAJyHwY06KpeMFdUq +PyJd9FYV66OOL9NcjzxsWb3C5RywRhAivQRlfOWTpIr3oi1g6NvGDbDrPfLJpPkV +tSaUZX6HuMPs8up0UO/bghoT/KX4inVoVwycE9gk4XPrqpU0TCfwbAU0oHPOnKD4 +9PgiX2G/Rj0NyKGon6VAgSNQiQPgLKYw4NAAGjb/0O/UlI+8aiUFhQG2wVHbr2Jp +hTbBg385G9hmFrn/FLNHNwf7umQr4yguYBCjS6JVs0/AAmWsWc8ZZTag1mtWdqg0 +Zw0UzT+x/6DlHKCwQPfhylZZie/GKjIfC4/uDtIkA3WNel47yr5ae//MNyihvxI1 +cbvO8dGPCxjy7y6JZFmstsOdvYH79qjYqeKiw2RItPk833xRAjjuXHKnvGV6JYXi +QRCoPAKp4HgXjNxdUrBUyInJ/5HkD+1ZvqqlknHnMnBtTb4M3g+YF4WnrpJmb2wD +2BAo3q7ItTPjwaqVko1YfOIavTh1UbXzl1j1eGaDou1y/VzRJgtbP6/FXr0nxsom +1nw2b4R+B+wE2cbKiqY1MUDAF3j7HkYzTujrTrSke6d/5MzIMKLxdTlgDNjm5Gf5 +Wc+7dmemLnWmgTKKdPLu8ubF2dJj48+4aP2cTrthNmrKVNPjNg/YVjte2ekEEt3q +UsSSWKByCxlswgK8w77Mly/1bpqaIQVbg6I2k3kooTFQ6UA/uAIEEYD+xZzm/5v1 +vrJNQXOUgO366iyO7/FWEcDDEa6rFmtp9KoAShElUAEwzBAwEtCPwrL19tGhhRh0 +pTR/ILIFfmhsr2QJvY80jbADzZV2wNhO/Nm5neKA72CNE9KmP/PhYPtWXj1bONjs +GgsBHMsmb0F6Wq0tlF4xEcYmiiNBiItct4USsSm82G8Q0qan8T2uO+Gmg4J++YOy +i3RWZLVMq80VBqwbxr+4CuXyAhQ/GtaBfFUileZmJUcnyXaEXWHTrwNLR16Rp5N5 +0cN5y7Wf1y7EEZSmqcSt8A+FuxrAUie2cDyqQPMcVK+cKsZn8TUOBMpMV2hvPYoo +M89E0u1ITGX0hUVl/s2fkWKWS+OYIwpAYL2GekLtFinXHZxZ1ebCiajBpV0R1UHx +9LbPYOrUf4DQFelWPe3Bmj8k+CcWdqXOvaAa6u5GJwr9bUPw6QrQZHquPLx030o+ +CYHV6uyG4aSaVNxP9GLTaLzyFgY21ONnLxgkfMheeHBrEYjtrlaaDHNbL9Igec6P +8xoWU4OLf9q6zWTqfpXZzO8bY7DKf5X3IhLzjwjk8y3CXDG2mnhaL7IHz1NmSUWh +VJA0T1sUVxz0A6KfLhsKBN7bzCth9yBQd+c8iJytfFs9KUYNazRzVdYIg6cao7eI +543PANwd4g8GSmQMB1l8U4Lgrz56OdJLg+2Je0e0E8hWy4nhK7Dde1diWjHPXzj2 +X6Wgnba/OBfx6hNTTuWRFPZLIqpWjHsjH0Ew1btb++XBpYqG2ir2V7OvJv7EdnEX +vMSYhF9VX8+9sAyBYfgpv2AY2ONyNnkWHQ/LyWbI4ofh2PyCLghLBGUjbEdyLMKg +05jipQy09/xOWrXgghvjDk+MomDS0bZweNYhbcwJSeva+cHv9MJIIEbUVmiZhTHT +ZnpbftihmEIJHk0hkUM3rgccn5kowfiDXQziWPaSof15KrQsDRETmuChRUDY2ivR +HeTaq+ODRJDV6qiRjNEHzTQC6R7gLG9DKufsmq9o+mMjY8YPFNrW+EKQ1nzuWp+K +4BDgHTSevzvIFVbqnepr9dFqhqeuGvTdMbxBXd6XVhXAN3mM17JFLiLdZMnyQqU6 +52IhoTHpZrfAczpY0DmLy1Nhb3I7WN85YTJ6gIMRpp2w9duXIU1GwN8gOr/Kmma2 +eV5wkugHNVXHDTB/dIrELVDeJzHz1J+Eh7EZgPfNm3lpigGQnAgcR8IcE76/V6ua +TA8aH8JNuzh+QMis82FqDH3ujER9jV42oH5KJgTGgXyMCXUiJzOuB1az5daKPMVD +LzCfdzwaPNljYSYmxSwqqS2Dqrbps7BNc6oZxqUp2GV41eHHjyxM9O8Z+5w1rroY +Ksifz+zVk+RNWl+vLlTPDL1F8xnjigb/9dgyC5jCCVuDGEKORUZ++A4tUfIA6zPv +QiUcUk4mUOiBunrKYhx7SOJVMb5QUQS7i9YwpoCIYDQxZK1e8GTWsBlfX+bSqo26 +izfiDpshTcTtFWCnnORGMqUYkNg5K8BmaeMrZH8e7n8OUbJIoDe3iZmSdo1KjU/c +JQxq+qEL45tS+bb7TGxD4eBYq/Iant2Z5+UXAqwvuhb16Y3tMVIEy1urvT2X34iG +pPH8DH2N8eWQ07B5V4jyf/dcQm3NbynHp88vCKiUmUnQ9moJu1QDYgahXS9avnql +SZy43Sl4CjPq6MSD+0vZ8HKBPsUMQxs9TfvihtVdtdvT/zZHbi4DB4xEinat4LKw +LxRADjAkML8k1HQvqyMU2RjG0pLo2YHvCJ6rGn061hsl84H6iXDkr6CzN4G4ISBq +y9m5eonVnJOuqHEs7CHjhd7tXLKKpUt7cGvKv+Eq29y9GJ6qu4Qp8KdBYgyVeZsk +b1kqPtY9FbupHFLJO95ITwzdVUwQVFo6WWeBLrL7c0rkLurDyZ4kDCxvf3VBYh2J +LRfjFfZSgYqUvCr5yddDHYeyoy6RgKwzFeADRYMidUvGAVD7eAZ2+GU/LiWIxYQZ +S1Kqr1h+zjNTkfQVu09JK8HpwPy6Z9Vo0UAGj0BsNhZgyJr4ZyPfFw6Jlw75VlBo +G8r0W65kcwBDwzAxPqvFj4HYK9gnZQ6vJuPo/QNzC5nAPRjUF7zNDniTZ4pkc8sG +8wIgvCGajWgHKVkHa0z05MmIOcQmloLNodDRuYWFhGet2wYEPk3Avvaro+TDcBnY +yRWSASd6NDEZjTfo4LAP4BhKX8iogSxa8AvX/eIrh7zVj8rZGfvKcREpvrw5cq6F +WWX1Cx53jhCPhaAqqRnG1iLqCCLmXlA8q5PCjheLEWfNyE7LjngHHrSRcE3snoeV +3Aj8vDXCsA1r1aU/BU+GzcGoP3wnJYE+t+RO1KjFrosUEGDWaujXrznvHCYx1g5X +Z3FIu9FJcXtYCjf7Y3hMTajU6Pnl0x7t2GNaDvTL+l1fqy3Qkc5SNTlvvR7I7SG7 +CVj2PiyCxQ5Nz9yzEUwsL/Z0OLSzUBK2KSWJ8uzs3f2psNUTNI1f111TOxDRz2mY +SyOUkUbz91OeW9Ksz31szZslXPDnjjM12IO1GHKdD6bDNF5d48FTUcbkEAwBUh84 +Ou41f5KLMH9Lc2oI9e9yaNXvxQ3aNLnlfvhvjIL9MTH40YhlKL43LalOcpS3zBRE +q38GBUPPhXh86mNKj0+IKBY86zbSSQUfno2TWvVvwXpI5kzqQK+6owja04xt5pNp +mb8iz2WgIzSu6a5tfxovUJneLSPL8xiShgHfibo/c1fR742YgLPZZMXAFwSyoawo +jbn+8q2WDqZd6kO1yLGChLJK/juIkqXo9dHS/gqjVKHbEhN5OCJcwGQ5DcIdJ2ut +DZoB3juOtoiAXr1K9HAB6axsWvpFQzEHvgRh1N1xXtQgPe63P3ASiGr8H+Vx7EeR +/69VTMTt48t6tllk/Xsa5Ps2FWYGtA6Iarg62Kq4iTFbXZmCvmsQU1b4DToohu0k +8F/ZZX1K42JgOfAeMtOZTO8Gdi7dyZyPhpCb4P4Mf7zOKvdxOusIJFVRE9SWubDN +zjDzMMM598k905Xaqwm9hcYgHQVR5jLhPVZA52JW372Qz13VBO+An3LK7gD1m4A1 +AQg54Vym6LisvS09+yZ8PrZBFHkvNnU7ceGdL3v04RBRgnNSFh7tc5P8d9xKZBho +zQVYn7gZ5tIEJGcJnN/h/MBfFl7Ut3NunUWBmS9BWOX3GHj8rXOGSJPG4RyZMCbU +48CxbfXmpWE/5KDpAAO38Qe0bszOqsctTmBE8wgGaJPR6xZvMab2iXq65PROIMBj +flSMRzywv2jEAcMs6tgdzhSO4kK58jZEkSTxcZSjccNFwxQvefOIAp8p9baf0QVw +0q0i1+bOMFjyHA1yPrcfA0lAWa96uFNSBfDMW2Ql7g3G5INz6OJNSlfwG8T1fNdI +VFK51lb4gMu84hPMwTBQk5s/fg9IPl+ZCJUL0mN4MB5GmQZEHVdBscoHmWJ0Fm3T +fgLny7ITZDgkTn5Cp6hAdPnA/0/769jrEUnATv75htUOILmHZJgmJsf1mY+/q0Ml +A7Ur4gs6m6XpD6ZlgZdWpW6GEFh+zhYM4kSZR6mft/uvFxjE7FWrMmm76kGlDN7o +Zwzv/y4dDGGQaedy4eYRMGR4iDctmYImy9hy9Ta4XjljAiv/ywIUEn3V3BB/7qs3 +mTFEO9yUmBvSlyZ2PXVV5sjkI4lAsVvlcXI+dkxq2uG6tXlpfDTDTOJ6d5jq1rrC +QwgjR38m3YtPa9mIn3XLlNZfBw0b4/JFuAbMNhSoO4CyXE/+Hb96Xua4/3/OApnf +1r+8p/1koE1R0aLVdP9jI0pPeuf22mWirP5vWrPIjbCCRDRfyPIsdLWiNL2X9IXQ +0ceomW0u/O963wdPzOVozcDj2Hd/JDEd6spn284s5B4aCaTgmlZUXGLjSoRemFLd +XgvogtSQ+qwG2FhQ5lZ31nV40cr/VjANVTltOl4/Rc5Z5UnxGqCBRvhrN9XmGjmN +SCUNIK8qn+LyhTRBXNsujDFowKEycemRocp9bmqbrtlFVD+7pBrIsXnoLmggLV+a +yhnVYXDrR8DPxGIIYomvKxuHQU2vUEODIVs7bscSQomO/m4DaeHx6Ut1F/IkLUaI +gJuO1wvOYAhbJNfqaDaS3t7lxOIik4rXhCn9lLsWVUF1k5W7OoIfb0hetE5L5DYX +UmcyZDHhvleO3jSo6BVDYudEUBr10Nl3q+RkHr3PYuska6A3JlM6rxtwQGCSKuwP +QKmYXpWCb51AZgIBUQSxH/2TFVVNnGPcvDQwyppRqqUmcr3mML/xJatNBnJT/Eut +Q/7vB9xIvzhnKSO9A0aa/88v1eH4ddkqxyKVJ7TgP9+QxOTsRUrdAgoDJakQRok/ +RExVzTgYLhmVkTmMIBR0Ctt0oMVKPCGZk3PcZqtS/FU/i2p8YvbrjonDehAUK2yS +3Y0EDtuWjEQx6Qbkvu4tDselKRkxepWQqyxgQtdRNVJgA0mQd+ybLTowS1DPML+d +/p0BjxZskDqArA2a/Icl5KX2LGBOlN8M3/fj0x4E4IgNcWX+oceLy69JaRUoNUxS +QOWV1zCTohKUcqLLxO5cObgefvtMVqreslV6MLGCQX8wlp81rlcr9jYErU2Fr3sH +oyXUe1MT5hvXiQEbd9Cp6n0cC/2kCuRuGYjVQU8aWVo/v6ruUNZk65vHaKpodIVd +51ciSxreGtyWZmrW6/gWcoR6D/tY3oM1UN66TaWaKDEIMgc4zDOH3u2H/zrag3ZI +Jdq4/sAciRK/85a3XrVEvCLSCIiSZ6ig2azZ91jU+wdkE5BTQjvqvoJtlRyKlNhm +ytHwXPtKwY32ZQ9XC9EkXGAf9fVRZLq6+ybC+zbWR4I6eW1Z/jmqx2foYH9J3c0Y +CFWGTOvQMf+rRQhbzuRotRG/g6a7vhXmwzE8N4cbmzO4p891oa+ksufV7nhChYb5 +p++4JGC6mc5zas/diY33BHerxBzFYzvmQxWp5KffgzXeln38W39WGKHeRS1mn+MQ +NcEWnoHlSko/eAnURrtVSCsH1I9Ma0HBHfCglQQPY0XZlL4gofwEx5rTXzgiClbm +DTSVy+5o9XUAxm2zLRxyr8U677aJ4MrwIW9TlKOycgdwgv9KEg0Cr6lRHCLajxN/ +vpvLmoyQDIqXOWFGtlyrAnAFvzxExcMK+ZpXJ3Jy73tCs5n/LauU+2mGpzRDRELD +wzta955MJV0b37hTryTZmHiRp5eNeu2M3Dzd0aHQyZpi/KpaRp6EneID3FngMu+A +WpsXyvUp71/ZvhwGRjxl2RD/yPxg9Lw/+jps9ZRngVlbzINoWKqfSKtj4Jau7WHq +6Jh4WyS4pIfWbfG0EFwe8qtfcpIQPjcSWq8ds76JOL8eWDqOQjmO97Lhy3FSyYaz +G1CXHmkWb/t2ZRfXcxKYMWB3IwshpgvT1TLuNJMWEyWEobISJv6GzdJ999GBSrNx +7CfvJwunc+dOj7fJXPYHuFQ9dlLsvdolbfGUSQeWKOfKM+K7hk24n1wwMZ+TdUKr +v1ERiwNFlpLROMYvNTf9LQRr6UaYt/zbZQ6+M1SY3q83/1vnqTIMPoQ15vSaFqwa +qOtL620vAhxIDHsOHx8WSB0G5H0gsD5v7+09zrfU24X9Qhviq63FVoOAfQ6pl+eo +seGa/G0SzigJpTIF1G40dTImiEM8vFlH5vNaAsMN1j32Ri7scbcJhvCu0w/lu5Yr +jIgN1N55zkrNV+mzsAS9Wb8dxgyOqvDIJlfQuRIVkkFjR+Adravexv0m0jJi0t8V +8xv2NJYrXcQkv/sMWo1+Z0JdMH1pTfl69I5w2VB+PzCvYsmfA7k79YYb4KwKQvKD +2pXIjIRLzp7HVA5JLYvwwFIGTntmcdo7EtiL682zC+v+ZyjWnu7XND5e6Trl1xR+ +OL/sRsQGNIvM+cod5Cq7Kt5w8GJMqJzLXuw8uQQ6LxeIulgO9goqcTyDO/SRymoi +lP9e28zWzzxpBiz0xKyytylc+Hyry81N7uiieOyyXbPknrvf2kVDcL4+4DwpSIAF +lbBJ7oMPHagx4VsKX+ZoXE5Pk3Z5adSJrj5hGOQ7JeWoXu26Q2/GUuHlaK4ymHnH +6ZosrtXWDsSYO6Mk+pFKJuHvsKiYMsiWXsUIxWTcDaLOaeeAPuh53BxTGsMRSd9h +J4u0DDimWMJ0/TJVb04+/AQ08B23sbRaoT8kpO2Egvlqc3Jftv8gymWrXD6r6KgC +TzYmeMTb9bOkpLaU0T2waxk8heUkPq6OT2WgYA0oIxXQdpA5yVM7fDJ7GGoQzwsc +dZ1GM2Uyk+AT16dYE2igyf2V2ZevCan6EyiL8JAPtfVtkygAlROt6cacNAO3X/3p +gQ+V2hdra9Z+6HsNUo/k7BtYojieFxxwSGnsQu2+9K0hjuM2p2x/K95W5SkYc/4A +v899WvFJ6nyoqyfQyCKhAfWJjjNIwG7okmJHKGKuIACGdM4/bKjjkccWtRoyNT2L +pvkhzd8abx4nX+kwcXGUr0F9MvUQjsQ+MrhcuGf70j6b6b01AEI8Qi0nAGWrwZnL +nLRmUBx2+DqM+/cJa3UcsJnHRoaNRYftekmOP5hwZFVX+FjofwDBEK3aTuWIozAU +mVO5EqtEq365abn33yDJrX043/p1R+7ySTiwZ+wYsEtxixT4klBm7ZKWy0YKveed +vjEAityVTn0AZrTwhOaLXVV/qoZJ206NmZfu2iriuOMi3auvETej5aKWKJcL8b+N +72Zm0WFssaf2BgceDjAdrShU0sVqca5RiclhOsGeYXA5VClmzRAtuwQseXhhTJhN +MFdLtYYHXkuK6mCVYZgIzlsEtoSGwzlUujAwahV1UDY0violPl3QeYLtcdU2uaOk +rxbVZFBQNbaNQv1Ottc+gSkS2oL0rIbXOr8IGhS9rzbg2mkjWV1V0ndYbMhAtRlZ +W33ioSCi/YjPp2xLAkL6NKH0Sfed/1j9w7kDbJqwpGRjTJ+B9dODHqI3WwuAYu5a +dhs70SF7yWtoMUP+fZQlopbjmTuOLO38qqzfnzUE1jQCeg1yJ8k28VUEEhXA7vjX +7eneELUg97BWua3B8Md3rN2iZHArzff0A4mEYhjJIAK0P6RvT9rorha0k39tX9SA +wccUQR8POsyizgsgprvvPrNLd30I+ZZdp3CzivgzsPDE0C+7MMH5uSlyhex4lySL +D5+EYo9fvjWPpIlczcPA6DI6MLVOtqEsCaxTlICjO6S1tFWBUNWw0fGLvWvH3VsJ +UX/N/2W02fmWcUtPCDh3icoCBb04Dpw6kK5j59w9pmTj03HMxCgfc6S5XJr5Tv9V +lWHwoAZuz+1IzNTctnsW+57ph1snLj20lDZ27UbvvDGYHqbe2Zfrq1Y3zHAh77jS +1OgqKLP+TCAy/6dBe/eEnDPMFLXOOXyPh9u0TfEENjzVPiXgEeTztHmHmsCnNhPk +aRgI25qwbNU/T55tdFb96bsjTFb6VxPv/S5Xio+kggaM1pvP3nzWc/AkvL0WT9Jx +nIv89pe0fXgWZYDMEtHjElgcC7KZAX2ntdQrAgr/MVzna8bhZZ5aTl6kr2imj+5e +NHDn+Jn96DcUBt3spfaSTnYqGgXCp7BIT3ddSJcfizAdZmkYMdQaa/nCRmFrlY5F +QNX6cqA54t1OrilLKFAbAXC1u/U2hP1uB5f+4e0fuYsWbfA9IXdYSKvuOYS+CfhO +tLDtNNVrOvWwPek3zMl5ZXZkZ8fHSjyMRpd6dK328o/1KmUJ8tlzp7wXz6XI0BzR +JvQ+kKHa6J3PpoKjXuL+p2LeEvh4qSNgqzPxBkm0BODA/u/6TmfdU17HAxrOigEg +1HSegOGymxRp3cjLTF7aKGFAKiW7Nf0xdhg/0ar0BkXirUQzDTCEJipFp9jrGgkk +6cMzEFTtl4bpAp3rBfBzNwXj6qGVIBblApPdknIy7VvArzllrIhlt+Lx2br3y2zL +NNqwumrWwqauOB+Zen7wztfYfCr8WQIKmjo0mRT43Z52df1k9kcdSVw01NfHqDeR +C9aJ3peU5hMmybLxW0rjhMUHH1OYjwcI2Zqy0rb8sbCCGG2FvhmXUfVYbeTPYMbE +U4Rny5+iXZwWZ90g4o42mS4c0fjUODAai6QgdoQhq82e6+psBn2PTkMonn/5wiQ0 +BUbuITgewDAKJJY1FUM6ch0lYDb3NmeGUti0iyAe2iTgRwpRvlcnWtGkDeE9y8o4 +7sfGcU0ek2xlfe3gAqMdNh6ikVmscZvDHFWgwuGQahvQhnxuGZDKvCuwKTk5vzTc +mz2ThRzbQkU54eJIbT/ewD197NI2l5tID3DppOGMMEdmxQj/30HDTG231aONUfbe +hqGraFa3Aq7uB4otgLZz0yGUt37XEsPsjBCQ1r8hHZc+Do4Ed9ApskakWEQvLu4a +N5nSh2efhBYS6ehaPyR85d+xJ6X282khzZy7LeEpDLqgnw3LgwkhhnwMk9eqn/bS +6lzycomgsDPwpOKyHh8slv9Y5SvEXjeyH0dnZOoHbbUSsPf+JBnO3xjKxEKX9viI +wjPB4nKSPSQ+dn62la0OiZMVzHbXuvAUt3w0K2Rf7ExO3alPCICTqilY0LzoJt9t +NJvu7DDzQjmyUv0ICuhgmjAcVVhDOZwCKmT5+Om2lhFXLC4Fy5KXEhwCvBY8J/pq +2VMlc/YWiEbJ52P9y9sWPWM22U5G//Gg+bXgrPLc6E37TfpE4TDrB2eqxieSTHxB +QH6idpENHkqzPlzRixad+gGOsIrvUgQu2s+bLkyPNPH1Fshy/jtQX2YbAb6HVlcN +3baj/2Lv5yLctc2wC/9kwnmIP/brNnU6ei/WKSAuV2G7X3szsGsllMeulULe29gL +0XEzey4HjsVYDxWSCjitpxM1VTMl7sUF//btuTCCAeqjBqhW8XLIXsE28V+lIJ0p +rf0/oeLvo6RKG9NVYIQ75L+EBFEcgBrbVgLy9VcWJ0gobubm/6+nO+akZu5m7mzV +zaFBDCzkejtDpnFtxWOsaFgKAw/+PYwsuMCt3epPYVDsUIPAj0ZrRrgqQ1s3UBRR +2Md1jbAk/j3S+S+cL5QCOmYq2nVLV0+LiPY35HgB/N82NMJ//yjSuIB0jlW8z0pl +rabByH+9nylE/NhwrftbFNGOgDj8luByM0DqiyJZaBTvw2+MK6mfbo+mnna4TGJT +ub55DrdDiCFJjkYIotQyMtk4NrxI6RZ+/K+Vr32LVBMZrbJGkKsBVg5krqrjAkh1 +pKurK22HK5ROGSeZVGje3wy1I9UGhywjjOhvDLIY5wEtacAwbvzzFuIzlW07ttIJ +Fcna5goW52gn4GCBVHiynJX21UCSulUiEQH2v+YMUMhgIyKOHQ6sOFYo0QetfJUW +dtwrxdusR5YpPEExe48BaNjASChaWp6xKQaTI2TqGyg1wfDq/It1Nb4bdDEVWtSO +/K8BMHbVYEpplw8W6oBX49+Ah2RJP44SnU3e0U84snp8bQd2pahDbMnIhf800mzD +ilOyP4EduQpjgTnwrlR8IXBPPtYMCJceQDdWhQPz9ccdPgApak/GvgG96qygGl3X +xj8Budyue94ZKLwAFsd5A3sFJiR8JiO+8TCw1aEscEBj0bo/c4WvyosvpZlJMXAh +HF/olybbrTdgaFeYcAmqspvVBhBPe3zqZ6XmiqccjB/IvlVn31tAFWCwmm6jZE/+ +9sg5TgdU8svPnl1vk7k41URuq5cn5dOq0nJTsGMAaLDEIlkaQgNnLMwZlWI2sfa8 +Coa9oxO2TaAOe2bsUQE3hEncd6eQd1B8RepMlW7FLCUTNqgsq66FKP5+8gcwGi3f +R3cK/Lhljohg0BBzxCKXGtcwrrWB9NMb3yDStKs9TmBx4XoJuTrXfQ5hjPYp1e7q +xqsx9cfaWPkyn0o5M59M3p3JCGPyk0qUTQqYU/+svbBQlsLTQIqWd4N7fHk67sDB +gutbX3kucJzTG92f6X5eBaoyvgFcO5+CGO5WHftdotlFFq6hBzmXQVdjGrKvb0jC +KSsXASWDyGP26LQ6ihueRVuQ8gxVjZT+4gBimlmfhlDjuJqyFIxQGFt87KjPnQUW +StyA7TSOEHo5OdJmP+/R0mX+r/zTxur3APlv1nIUTvXSkYoO6O+DGKyvzlFy9KBF +fgCJhj7EW+u71uuLdlVMCEKRcCxmHt84VZ0q8G6fCP7aVvp12c9l2N6PHtLwkQWD +KUAKdSVpfy/u6xPXkTNJpfAkbCeJ1xryrYLvJ33qBsjGikltrih9IMnHmAuT1jbi +ig0pptUr9bay0p3VtWclyyg8FhirrhRPpTzUdCar7oGd6A4zYzD26e1Pv16I6do2 +KtmZsHnGb5UGvZauiskT2DU58kGJBxxRtm9mv9w9CkVsi9ssj508bJ2kViREWKfB +AFCGHuNQgRI5g8jO6zlk/Y5WnT9+O8JWDiEEgqJ2YJ+O3PTbNg3O65Nf0sUvnu5x +dcPNuAlaP3rSZKdUZX01D2wwf0VOALZ2DT4Y5CrEaDOh49RNGpcZvUYHsTjzKlaM +yEQ2gC4uAJFguxg91n6Hu/DVYcAgdq7rA/DQCWk2rlw485bTKUE+gYCrIMRgh93t +zt7sFgEZMi2Wo0ZJw5jPcEUMhY9DnyE7qJSI8mUYkTr69WV+ts3AsvDVmtzGVUz0 +ePzWzeYEf+1Ds7rnCM6tzJ/MGnHNglSTY8OanHBEJ216uQLpon+3znKMe6LBbWUJ +JsVz/r6nYIxK8zZhBOzBridlMDKD2vSx1yX71AdemK4e1Lwap6OQHFMMf4s2X16o +XRmyd+wDLOJ39QP98JQaVzDfBBwwZIH48ehmpEb84uTpcTqMAPMqE4agU4hP0Fb3 +MGttVumYQX6Fe4hDUKtU+MQ/+838I5ghXuZyJN02nTv8XMmTKXMsr6Omfat8JEoe +LHHtEtNaF5Xunu31NAx8NXV8UYA/mMm72rrybb8QLx8i0ZtiGs80GvKo6pTBrfyl +S89bZn/5PuK5SRioBRlibyKebjyXglCqG5MMlUY2n2R9Sb1o/BSQlsBq6WZmWlaB +QY3MGSXbzuko52WTum+r/QkTil2csX2m1WPib74xF+G9QxA5yeC7oqWnBrAk4vWe +pxjrvtZ1qMX5y/9bdKq38dgb4yL35Qup45Aa9HDFkWK1vCIeBD82jCIRaXCBdc1U +EIVcN0uIKWB0Wmlfaed9Ee35mTmtTAAFp7NRoxZNR/1z7TRx9yksDijdacjbicQ6 +ZK6/V0W4J7DDz+5DDxpazBi8SIk/Qh/y+4T0AEbtBX//D/2T6lYWcPa+qIMzuw+7 +UOhT0+dIcJ2BzRmDpkFqC0o/rbWKKoQ3GUubeFxz8rdejk2UcTzQ3jrWEiIpVfi3 +0C7BXkAwavvpjs94u/02LyJu1aSxAADCzgBXQH6g5atyvlF0GsVD0f++ay++MXkO +0H1MHnVmHF9cHgo+J5gZAxlOatIHNiAs7tydrby5b17tav8V5P71FX8wxHA6LZ02 +omQXfXtI1aBQsQ8fFC+0ImJbxKiqEf62gXfGC55/EpSgXAY1+hx9H/eO3AFIZiBI +RhCND596HnrdepnshHoRySIAKgTxgtgQf33nT2kySM+mqBH770CRi7ITNJR0/dxo +5tk3bi/gYX46pG57mMf1WcKhOgfZLuroRG1trP+mbvBhhIXeh1vgKGzeYHzQy/I3 +RSJbP9DoPoS7qsjNa06Ni0ETuCQDCmNBnvtTfxheUHtxrxj+n/tyHG/oNU6MH3Q0 +ZghXLajUnBar+P+RDLG/56nQGug+dPAeFpEIsKCMYB9dkcIn/6/2sPvjaEIoUXHX +ylRAY/79D/8g9HnXzrygPwQQl2wgtRDxC2yjw3SU7W5iqYnuloem6DnZ7bumtrKT +jnQHZmnwXO9PAssM1pTYeqpgEj3HkiNF7hRkk6STD7v+mq5Q2JZ5X7IOgkPhJAD8 +AKtWZSYrOKfBjv1JlzwviRQkHYalfg/0gvDqC7KBJKQKMieHlEy4Lm0KYxr0/p4J +p78wNI4ipRqkVOE16UwVYXogX6le8F4abiY5JL7GvCI3GURMY4FIC2r/wV69RfTR +CPxGvcufKWlL9U47X0iOxlnCNgdR+bAylaAh67tS2pAUZonOrj5C6t0hb55q4BxF +pKyPuky46N0LWOk9fIvcl4Ru8WGmy68IqvS2PFMOeK6F8KhuJPQU4asOyGJx0e1J +CmOvQHxroNu0M0uCAAQv3+lyf1GMMR99+AczVSb3UuPQwpEK9Lp6TrjEs6C6sYdV +OxNF6tzef+tL/byoqJuaE8iiWLqUNJulQhfjZijz7wiSsDW0y2jVF47vQJytmJ8t +iBoNmGO2SlKq9fXW74/qR9TY9SFTCsj2geEhlxn/wZn2JlBFx7QGkVVSlY3HnQkZ +JSr1vASIVWmSzYFXz/FALOrRJ+YLie3h2WlbJlTTsmAV1d3Q4oA7zRU8B/hHu50V +9WnVHCkAIliknJ3e6ooiAnSXe9aVIwTyhz3/bI7MsA2hktcklfWPCa8z3y+9R4r+ +LpBgV3nl/A5TOt1FfyK+w3MqlDpOJV6m0Eif+03R2WecvOafeXnnH9cOkkohh4aA +UONoTZ9qp98oYFS3fNEqUCHtIeO9g5Cwv2qPw9ETU0lRdgGGsrEVmefFh3W7EfGH +nE0hr2evuuKoza+WTV5pO0UkxMXDKQHyJPMd6dCqa6jXIvkQMAHnc2SMceBjckBf +o0nFWaK9aJO9ipEXkSmQtj4OzUlQ6NzVNoCoNLZFl0epNcB0Kq2nKJkaoGqqaFWi +rKZE4oqK16NN4sXqGsP5d4ugZUZMP48mM3rCqKStpgRJgO77cvruUowCp6qPXKqU +GrRQkeS+GftgVmo94iuO8crhfKg+RFW355Z8xqDtudAmbntHrd8I/kiSZejI9Me3 +3r4niYSAfbNSfeD9ahkE5AwY2d+psaLFKbnz+pjoA1AKihdOr10LEwXXNI+x+NYv +CmW/ea5o+Z1q+3NOA8di/UB0ULyI7wIgdrpzpp9vbDoCLmyJ/4JNIG0cx98A6Rpp +pwiCnqLo8qdgZN2EAI4qtzJSAiLpdgT0b6Pl1Mavea37fy04RwuOYhRa/PD1XB26 +NgEai3frSuApK/RDZM+hslQdY0758EAHueqiu/vmDArBgbMNeyHBRS2hmQaVTUtU +xOII8Tx7lPJksXGyilDze3MAj1IRZvpOc3ZV6wvtZtcI5WkDZp4WC9Z1ZKn10BcP +QrOO0B6FoYz2cS8Xdw8S3mXNx7DKeX259kTZfJjSkC7W4HkRBbdvO98uYnv4Gk3o +GzOyRmADN0UK2thNSBVqCP39ExqmiEc4O/ur+GItgNCfNYzikQDuf48RBZW0cecl +m271EprnDzEnGGkcx4og5S263kMnHIVPn1TmMeibsiMIb1GB9QOMM6+EwH/NKql+ +fjDU3xpFIkZzhFo/AW3rxLJuePApS22g3bMXzjcAPNdUTXluqy5xZmZJvaP4KD2V +U9QxgVqNmt2omv+MLR6TCHyed9GFP01NiMDJrN7ZUTgdw3eSTCGDplhdOM2dF6mM +y3kmoLUCQk+mbfTIJ4/6tmrv/TDNR5nKymk2CKJfazaxRmF0TW9nwWe2Cf2UpSX1 +KFkzv5DXWkPg8vb0irGCb5bvm9nQH5MprWp+FgB4v1HcNurtUMBCzGYp6VUm7NgD ++P2pXyuCqkuP8lAQy3RFad23fdD8VX+sza5LgfCYxmxx7rdWY6U04xpiXD0Onxjd +FkwgezuvKGT4eoOvRi0sA3oc9R+Xw6+wSKZ1slbVBo5PcjD3RkCQjGxwhVav29pO +5iOZntS/hAi2Od0FiBecc5ckHuKRm1VB8APrW3cslLkKuusQ/31tVWf33/6mSNkG +C7Tq2cO0n5QO2CKi71trbSlPvkar2YaYAiI23arF2gkT8SJmGzeayy7SYAu6fmwm +M+3Qjy/x/YnFvg3+HUuQYaZ5FYjFlEEFU03yqzgETFGEJHCUbXOQV1AhTiVtoduP +scPyKc5LQZNi7MCUDkbpNRH+vuv+jHoPZhmosNqsb2KIDD9xGx6dDL7Z5n54QsYN +lbOLsPNPxzEs+9/w5Wr2a2IQ/aDUO88BkTMCrVeUMuQqnzES09w10eBhL0s3wz32 +pKrG8jiGJ/gld+WQdaTbNefZMcZ28INO+4KzKSy0TuS9NwjsupCDyW6d5CNd8nkK +Jbh7O4wHQ+0OUmG9Q4lZMwzMlm0ljo3hoIjaDKQ+wtSBajzfW2JpEiuvsV8teFj5 +EsR+fMWMrKmd9atRZ/jh9TWJnBiUkTzfpIUbFabhhwJ+8iz2rA6uDI4VYt3DvyB8 +9ARxQ8NvEfWSupIZNpvy6FS3/v4t5uaNY9r5dvv4BS5RO4zAnQ52jPg8EVFQbGFJ +RO7ueVBhaE5Y44gb5IlkVGtXCYl8Dbd9+dWXVWOrQK3h6+pPMBKjc2FvYejKikVY +Oxxp6/YWykrG3QhCrmKSYxVq35Zijw7Yjgdl+vUwGpMtM3C9DjrQKOx8TpAn9kp8 +9SaXheDE4t2p1i8rG96hXWXj+v4fe+PVwa5QDx1OFSi9HSpAnqmzZNMTFp0JfY4i +4wmcD0hSIPKnFbYTvL1Egrp8k7NstIaztlbPfto+iP+GGKyPQm0Vd1XQQbeCrVS2 +g3zgOddo1oDnXCBn8a7G1J2p+1k8SxogBTqR3RUvkcXH9mm3P8DdtZZzmV/ltR5M +vrd21AqlkPlBjkM0BlrX9WZN02jUfRIez++A6YEpRZHeHe40VXEpdjbP77OReK5e +Sy1kdJ6j+9NiJhw7YTPip9+IiwZiYSWBWcILhAhxAFTIGRfedn7USDuojB6z8xde +iIj8xobTVF442xiw4BM/aaEDKomcVZaTPNUUWmbD5G8zA4qE/1HSLQuBwu0ZI55a +NfQj84bzURU9BUNAwapsPw7xr/6fs9HfKruXx3icx3/tFsCHeWnDwA0rcHXO5lqz +BQhlUbKV9rodukn0IhtoV28LUSdHL+H1lnsS+Msr4R7VJEVOhZz4fHNH84H3CGvz +niYD7IfHzECLnY5dgIS0Bk69NWm5vDQwCCtLizVz0p7lpY5a9A+sL4RSPQzWUapr +MHq8L2mreHwD8KNG+4s/KHhZHUFx6nNTTGdFIzmXf3pT5DqtbHwkudF4HJtp5rpy +qTqFmdOAOw9roEjMhifsIdPmdU/17JefFk3+cxhezzR1YGxb4x74/ntOgCOf5Jws +uULS1d6g2JNFOSf8DV7dWH8p+jEBak1i47xu4VgNlYoC0FSI2NGeOlThK6lhfbIt +9hZPpQ7JmheDV09J8xqmqICWcF9hvrzEOM/irTQYAjwkzJjYVNW5pKX8VisGVY/F +eY3SPHBmTnpN7bmN0Z3D0rr9USDTOooHSZs4z0p/w0lyy+PavI/Nc90OYV4yqbkp +zkbj/w+D+tmRNiLiikgmQkE8hiydmD4KfhrWC63McMbf33yFy7gQnY8zO+K0WTQR +d9ETXQ4IowQvYpwOa7HJn2nTpJS7bgn3VpZ/D6Kgbl/8s9Dk6p1ld+pEA9seOCng +5dTQqBTVJYEXvhR0mQ5HOOSkFUY2VvzMKnWulz6fY8ri3tVLlS2k67IG8ze6OHlb +u+4a9R4dhIiLIVAKBr4ZK/GDKQBVeECVcrbbPIN3k60WW4bJkQd1flPFsFl2fxuM +fWOPsHb0HbnOaiKWGFq4yxY8Ycc0/X5UPfFxQh+2JAwbLnl8MshJ1TwS4JXnYrl/ +NNlIcrM5/PSQcI1UH2QEw48jYFbHCV1a5Hx2/B84WPKXPKeqSH/VpSs5DuhuKiFt +/YHhbYfxtfruLjwbphIY2BEbHoflc2XhaZX4mobzBMwrFtZ+i88bPZP4AO+SqbF4 +dg1KyG5mkXPZv8i2ISQxQWhWMg7EdcUl3E6j3Tg29v3e21YApPkwdIPgXb4ioK71 +zNsQ3stltK7GivxRuSMRHs6TQeoXNVxOtsmUmnI5xaTVNMBwCji6c0VxvMRUhMn2 +ItBnti7v1KGAezlaPKtcQD0t9IPHtMCL6ZguZoj8prudmE+4mN2ZrAuULL81TRfD +Flk2+u0dgvB0Hpwttuf2iPVe9VJVN1tvLQrKu/JFfemtVkveJ5/yHu/oPjRmeweA +a5jdZu1V3ssC3OERp38/lBEu/ZvF6W4x0QOAdCpnbbePCywnSYh76pbtBXCFM5Qc +P5Se3FB+x57MCOGckbSx/wJ04JK67iZE2yBmLD2m7Cs5Abiz6Enx+bXjP92vLG4J +p0nuSVQi9zG5aklePzwNjV4ePTvMCqJ0msZMghBwhc6xjuwIK9VcPzGDpjjLArAN +9jdQ9VNDOlr+k8VAEg5nhBd5HBnnYGhVTaQmoR3t3Etnp30FedqBtcmlS6Zlh9UL +7sAmk0Mc7exKcpEI90Y5luTfM3ZVcjsIGdJjXv04eExjCsEjihVDCHsTLPTp95TJ +7/XlbcaQmNOIsgi1X/Q/nCtpHxosW4C2eTIkQ35OeS7J7RxE/WzYLlcWkThjgZKM +cOsKR2tsTkzfa7/Mnqdl3i+2bOGeK2xpgNQ4paZ2ahQkxeMG58oJhlYMYWCY/Yd4 +GfcihXBHU2CvsJPQzxSGuB2h2duOWnnMHh/H+tMfe775x1xseesA51AI8aS593FU +3ztoktKtUp69It4wC6Bq+tCNUreWIiHHow/eOCJQYXBXN+x0HnCsup365SZMV5qt +3YKnSKUc42XSEpLyif/siUmPEuqBYuJ/PO3HdOK7G9SB3VfPIXmU8SoBHflIBSbM +x7JbesNJ8qLLj4Np7RKW9YVwXM28bsBZZtqdTdL0MEpNcxBRPYb8a6glrC+iO6jz +vcZoPqcXXHBxOLWjlkFPFwV+7uR+YLvENxxQ1T6pD11kipuc7iOGJ0lV5Hyliv6y +C4EegSgYmTb4r4ERUeBoEkoafws6wUQIJLADvhFS7pxsZaWxjbzCEwOakavYY1zs +EEeSaLz+hKsdgL9Bg9hHqe92GH5hXemBRJAiLUncqebj74dvgWOhdWDvKR19W14V +LWRRbXl4adxopi4rVLM3sf8lbodq+OM6pUsz5JsqhnpW0TfJoQfvzgnGUCPze9xb +JNhxUHmni/e77vq5VOqngNCNLzs8SbQRW+bn7+4fWlujOpe1RMrwdqKL2X+jGVA7 +NqAzeB6vzDQSXKkWmxQUyXFZz4Wy7sqM4NvRjtEX5PriaNDJVqpDpYODuvc/C1XF +o4nzHgAHaE/Q5xy/1G/hzzWOheVL5eDfEwZ/L++38rF8A8FIS4XJhEeB+TUrDHRF +vdveTUbywnpsawWXgpq8/bJ5oFAngqFAbA1EHpqdkq3ji7PmrP7ZhTMpjF7QfPCe +3aFmd9W3EeLX7dRgKl1G7vfpN71hZP6GdyJHOQFbtU1uUqRU4pJ1FxQ6zBikvBqj +CGtjoXLdrrxbeeZ1yg5vaVWu+VBMXIEUz6qMlCAyOEiC6Q/xkwWj7/S53ixYPHS5 +bkchzgr9wkqZk/TwT+9a2G9TYUHkuJf0D6DeT6pI7sb5F0mEoQ7yowIg9WfrYaCb +vdzfn6Bj2sSFNQKi9AcdrwEZ9LFOdT+w7FtP8SdfNP5Qc8h3YmxBBmyvwwyJRYjO +zkgsveKhSdoX1QEXDwd1YSc28nDcwoff6LoRFis4DyFTYIZGR71r3dY6ceqUkKya +hnGCYbb7+CdoTS3OihImTkwEH32nsbh0UXNniPED7916aRER/GcHNv6llAxtqvwF +mYux5tV2N2HikGXMe5ewdxKm61Qzj5OHeci6j7ohED5/+v1jF71M38P1KU6BzE79 +Tz+raBLNiKRvE+os2eQdWzbjUZc20CPL/ZfaBfg//teCXjLQen0uMn9xgLv3BEej +vjrv5UG+bkPZpFGj6BD1YSu+SiYZBZil+BjCKao7Lr/YRx0sgMq8j+cxFTNwMlbC +UCyj37Xo0mU3gcUD3z7Aa34TkBvELKsvGT1U1/PZH6RBbu+6cF24LZ2ROiM9dNBa +jo8YR+Og6wtE1Z3n09b86CpUcSU8v0GszWVpSY+8w0JzWLfFs7cqVPWYr7qUqLMD +KrsiofWZwBTX0gbiYBZCNh4zGY/2xXkURgAq93xXVFwAYNZ0pHBxMhS8YpX5dYTM +LSarpgj8iAWKsuWfhIvTeDspSL9o7SqR0RCAQO8B8p2hvQEV0svAyrOq9TIapdoM +0i0oRaJsUIVqZJGbT8Pc8OAa/4d2bJXZzp1cYXwpVNCaLrBzKcg8jNlpbCOUSsrq +unzaKabOL6WG3gnwMviAfXttCFWzmWUkf/6qCbmzEdhudr/sUNxd/d1u8w7aRP3A +QauirSyq9m0N4lXS3TuYYSXeP1eqyHbHKHmYSPUwTtCHijnPCcvhUDwu0KgX5Raq +QAiJvl94Z17IAew4HyKe6wZ19i5zrANFrh4oG9N70/GQpQoz2tN35nDdHpcvglpS +QV5FfmMSj2+ahTdCKIraGT+K6CAE2lMTdhP8FrrCaxiu2sY2KTvTQ8AHGMrk9yr1 +NdbXZX10aZZgUhD5mSjHR5AFmj8FOqZUzTZRIwl7FXOj6twvEwUo02tSdi1u9cTu +iv0A2Fh9peKv2dOkN9WwCf0gODJMFOshKtXs0TFCfPpckbQOSFcEZivJUp5fOZmQ +4J+dsOQ/iiHEhhgSarRa4gpdDsN1Sh+I1UrO7ecxi/B6a6WdRDd4dlsB2FgAzQoZ +pvMg+GIdWJA1HffWR8wauWknLWEdDgTsyx/mszmVofJIHa2lLwrgZ+aU9WhrmVuw +tdV+mJFQIP/CTd/TOdqwGTgpoKnSL1O3TwWkituFNC+oBwTY4+2q1jc9SFxGAER3 +8loPLD07egIUww+kvgi2Pepxqzlp8ajBUTYazDtFmjUHNZ5qent382BDUqTkJdWJ +Zubcs0eqwWlVRvsHtKdGZNuUIUjqafuP1Ut5+3I5zG9KvpjEkQ+YUvct/wFFwiT2 +dqRUSLYROXKtTe/bOlhAqQXPFpc+fSy5zUm4HCcO/ggpqy9iUfhfCHkYs25r+8VT +9xNp98frPv0HG9sG5NYaciDISQK6GehQgh0YoV43cEj0rMnLX23VJC/mHuDDZqBq +razuvJM0KfNwLhHsmC863PrMPpoA1grk2pPtaa1CUukfLpOADUok5pGjChyxtOFM +34dgI3cFaptF9gffE2l6kQWvnf7qJTHJzzbDNbUv8Yr4cVb4Yh07mbrzS3FwCJMd +QjpeS4zax+Ft6DOIk4ZaoPUWurpUNfa42K8q74YpjOcLo5a4HKdKDrUPOIV1V4cN +gYocqp3fd0xpIDjEMt8rwbkKOVrVLjbbpMJWHPepOPp/aI+YoyTdAjpke4nOqfuv +02vTx/iawtbq+fR9Yrfz2mUG+oAbPGZIwTm8IlTaxZdokmpTxP6zZ5ESqQuH1VKV +4LG8qjOQE/PPXzsP1SQNJhq3X6OjD/dHj/vAfcgkbTrWFrpLyYXBxBagWeXcYde+ +6wGAen6DZw2BRBD2qgI9Llf1usdp2j+vYIJeoDqOLgxtd3x81VJKX21VOkSrQVaU +1tC8dXi1QsCdwvo9tv8Xdajd6PQj6g3ZbnKZ/ESzVU0MGDTT/11nu9Ram0IWo6qF +2bUvi4/w5kamHZwr9OLc+zvMMYlKd/A0ks7RDn4f+ppJua2ObSfkXrfaS+yrHepm +XorKkl/PVqLYcM5OUA1GAiFAo4FDkiPnSnrgTmp3Tj5pZGCEMGNZ1dphfPPbUp3+ +EA5tUEniC5i8ra/qzxyl0isd8dltdz+iwCWMQWsk55LjKJlihL4TNF+ScJR2fYHJ +8OEsIaZMdWGUNL1HZcIiJtE/7y9qcdtVYcr55b8Zv2jWIAqsgxZcmiBGfWiw1Lj6 +jJLwo3VYXFG+w03xTsoN/W13dArce4rAzj4OUqDMUdybT8k4fYgGgS1oWk5fItK8 +wia0RsJiRSRXGpgRw5xYuCwObnPkGoId0/mdcdQvSpSv1/gyABtvwn26RLjczZId +7f6SWHduUib5e+L0DZH4b4Zrwpk2tIycvWoLYPvm0Qnn2Ue6tYHsmx6JoNPs9jg1 +X1RB/+PKXfnxpPT2iRg88WW/hmqY3u4OSHLKKtO5pF0uD4iHCUW4csocFaZYkt+R +DxdmSvQ+qy5tvPR4b6lgIRbcI5C8Q3IAqVwXLr15XCLOOKcXLRHcpcJPaXohyDQT +KPNLho+glodcFNxGMb3H0/ELuiB4jKGB0l3Zuf2kiFkoxLykz5Ir7v5ns1lUI3Po +VTTybC1opwBxj61FUc8IMLO/T9MB4uUcyQwiFdvOF5sqigMNjBJUffjGz2Hey+XO +vvHxfa18JZoo0r0H2voE//OXioLqjHjrjiUlaXpBhz1Rl06HAyxOOQmJihDW541c +k/SFj4NVmTl7q5LYQoj6hYBh+8Tw1ROisCJbK60o0Ro56A1k+0Z6RFfVhwXCuPVP +jqNyB3DSGv2j0j2KB9w2paJMlwzCymNk1MI355TasPFbqJ2vUXN7e4KczWqephzw +PycEcTmyHqDK/oN8qH2Fva99PrTv5dva+kzb2N94sDECweDq/T3pwOqGpeHphG1J +G9UPOApdHk4Jb8ajR/Nhz6xocvbwaSAhvhGyd5ybUK4qN54LLFjijj1ECI9b0pOt +L1I2DIZM4yMSBhgjP0RC4QTuWDwPl4hzDfucjTewiO2zC2oSww6ABhdcECkIWGow +hitea+aEqkLQABEgzGgKUQaTpq/6J2G/K0f6YjtIrBP7o133VEelvk1dQeUjnvbI +LEgjoxzEMvGDbkLNePSOuNeWPHp/RSnMv/ZvSiZ711SUEAs3LKVaToVP455yVZrf +lZa2XzXF4q/exr5KSUuhpzMczdAcITGsTOlMYUiH4w2BlitwIMzTIVWgnyogluDm +BfrZq19L58XinWeQ2lLKIzHZ4WynyNwgYx+4IV2kxREjD5SH6cXJCmZ9r9LSo1yi +/nGR2jGN20NEdGx6iqlNrA0vB/4RsSOYcebV+dnJWGjK2NinZyscpdMDXuus5wpy +8TzldzCXU93SKmbiam61qivZYNnMqwbkJ2KvGVuQKek74bDidrmRHHGB91aGZG89 +8jCrzId+VDZJXBuKdhEohc3Zv+E7odt8rdUJcxR5wSz8flQykFgc5zjLEcQbYh0E +Bnj+kGJGaI24HtfhwZLyLV63en2alyDGq7r+NKyQu2ngSdXc2hJvK2fHPpA8x6Zx +Nfk+bxlt5QkF0NMWG6UgZftzo5IYVpXwmT/UZdJAgKKUMMC/i8t0JoAQXucMXqEA ++LjglM4UyvP7/4SKSs8Mev2/Vd+2GWt9sbmcYegISXTzPmRXQINuoTiTCrY2DUpK +KMqkC5n45AcpSEf1tPi8Nn+HnDeruF3BrM0yfylHao1ZE/KIKNPPhoJOjLLtCsFV +X9fx//uM9tmPIVyNUJ+4O8c4HMeke4/RSArSFt/WpO6m265E9vwk7YdURvDi7XgF +s1YrAzQ1mjU6UMArZOarEVI+WEqVFUC5/gbTmoz2ZdUTg8vhnxeeDD5ZoYYpkVss +8FWqzLhnOl62avACsRZ43mBpYBt6iefG47a85xzLXnElCavIRqA/KPi/UHwqiHeA +cr5isBHLTNdU3psSzBv8q2BobJkamSQOcFJFQPUjTEU0qLBdGui6ae2EoFhzh/16 +Y38frte+VeBg2OJN3f/xSIyZyyT1fk+TYkCyx26Y42afKG2uylNQ0oXmg742FfPC +retmmxmvdrySXQHi0pMjrfyZSEO9sfbBii4d0Rjip3N6Bo1dvBMIaDzS/yiyyoO3 +BDnkdNfy0qyJYbYALG/1wqJL5GVPJ8jixxxawkBTKsXXhoZpTuVp/i/Zw6Y/dUFs +lE0+Kgr7tIUuPr2QwXAJcL8H5pJArwkb1W9QWxHB+PUyC/s8cCozm96XlPwGsvo7 +Q0TM/ptdTZJstVgGcLNzBnONK/9eC/7YOBHPpe0xfdCRMjZs7K3+NIvvk0WCH63t +v5Y8FCKdv5qPhsOkbew29xcI1Vr0sV3UjDCcnVMZUBOugddIDsJFUmyKCBvy/xSg +A6YXoFuSwuO9ktTyQ69jTNDXWw9D2rKd62WMjKSpLsQQTo/if709Tjz7lEMkVH8g +XRjKaTBwm9nb0J/pQE/NBzYMNykIW2gWcSfU8/3t0C1tpm1mZwCh69/hyo8zB5O2 +pOsdpXnlsxx8uPT8PexGtO6rFq16SnbFypfJLdeb8rxLNKZRlyukZB0o/rCF3Jvv +FoaSfIxUOVpDCTN21axPmXPoHmyNXmsJOx1KJYY24QrT3L2gsrdpQJbXCi5NjeLE +cV9VMvmZUh70KxEndvb72C8k4FnSpyrVQBa6dN5LKCyrTxx7RSaHFjvNQt9dHcnO +pa5JkTKPt0po02V0pQbq1D2L3Lbfdx7GhUrOfsGVVHIaBo1nNchSHMCJMYl0KxaN +7ffRdxPg+qam1HE6+qvdsBOBHBPK4TMwk/QcuG8q9LvfC+EBEItrg2Ir7oibxytL +8E0G6JH1DInRfTuamQM1SqrlMEFMrlOJllBvVjcaOD32ums+qznl/uX2jukSXvNl +U65759syg/DpX6ltC85yOFtHTMaWIZ3HXkE0kmOEc+4fDy31qBKXrKjhXbE+e0JW +9QP84tjCNnIWZpT9vtG82tnKsvsKVPBd4LEv45/7/BkCGTEEbRJYymhDTqOCmnWR +eBkB0YYuY5Dg25Z4ETe8n5lnDxOraZuvNA2DRbJ5K5G6W/lmRZUJ3r3VgHAak5d6 +SA9pJwpiKTAWwDVaRRjBfJhcs6gr7ozAXJptR+5FEVlusk0tlgm2oI0IZnL/wEuD +c6p0YQFqhfrmgksbWsHxXDZwBstePNCLag9AZW1foeUlVUSfxVRndtNDgm2E+LWO +lXqarbIgUSAA93/+/YSPtopCleksi61yLtVgsP6dh1NglBd5eOE/MjxK7wf/9MPm +/eeSw6+I60gd6LoqHgUVm+mYQuXcgtm1QSdJ0d0uvrgxKUieFGDEEY4wfYIhw1/J +5eBnsGwcyGUrTz86poGv4XIlwe+vyS/PCUVuNSO9x9JLgyWMItF71KuZNlhv5MmO +xVNPEVnJqPu0fLXyuvfqi2LQA7rGBtgsmw00aA7NU7YganvwK3LIJ7SAJYN8I/MY +vmbJIYnDO0ytE3iG+V20K5mlPkokMlgF+gl+zlHF2j2v3Rt/OqnYQzCcmikPhNdm +pi4CJjCn3eRu4MOWsCdVyw3tAtpCDYS3LDuI3iRMRXSzNHoTMkPbEZDc1zehnPkr +FjsBDXphUI9hZzYOqVjG6ztq6jBVDOALui13cyduQRIJwvKmJYazv3ovej7/EA2g +1DnpdJ80AgaYV2d5IFVP10GYX6XcDrtodwpLdAyUd9nYsAWJOa82ySY3j6jnAh1g +8wKzyNtNlXE+YG+hggv0lZ1zkp7q6FbUwkRl1GfUJSm/GGnH6T2c6yaxYuCTE8rf +ZGAfDVOEds051EByBOgH15uOcnsxM/KK7tnH71lNppTqTvgdPCgrxNRNTQHduNL7 +QFWO40pk22mBv4EnGMTHiti04nPQ5qIlGcxT3fvbv5/D/91ncMH8f6XL29FsDLa1 +OPTEDxIwwHVq66gD8EpptWJr+h95juBrwEhzwa7OQgis325knli6HNTLeqRJHP1g +Rgji5Q2bJ1yo7Q2VZ41GHRp7csl5FPAyZCUQFErWDKcZUNDR/sBvfexxjV4q4jDA +hbMEu95LqhTIYZJkkv38hULIp25bx4V6VCRjzkaFeZOHZMwrMvEG6B4remHRf1Jw +5SOIP+njIf7+I0iv569tHlc5gTj8TVf0mR6lW4JRzjRFz7yGELRn9dSZ/AKFW6ZW +Bd11rVLge6plTDNAUIVCvtNcGuQZ3t9cGhTLUgISJa+Hrk7d/yi9ujIFW7/O2HAD +PbfTpGpWJUtiDWKj4rtGFBIPBXwLmo41HVLM8GtJHWJN0aq6CfLItqGsLX18Ww0N +2riPm+xJgaeZ/+XBaNNN2yEG5YRJifUH6RTQoGml0cgVwwmQ8I0CGVlPIZY4b7nW +a9iXUWzYO6+dTcXjDhGIDu69A6PqEZel+Tr8JVdedbphH7PbvDAf7PJADgsjaaQP +cVy6Gn3ry+4N5wtesEdQi3DwplPe3tHkBR5wS8YEUOQue7vrV7VjFqcFvyq05Tzb +/L2yE9cQQBdYrgGGgH4uqBUTXbAboXRRBazUBTiFHJt6iSP+PZ1BKJ0Rh06kLfry +J6IvW5C9HkxU1UBVIxGopEpI9TOzFLNIa7HR7QYKFojaGksQ/vA9l4+r53sqQ34j +ATSqaFBCGMTO+/NmrOzVmS2L7BdXXEgxhaWy43YJWc4H/7VEsnRnbg71g7gJnGpj +vXgvKdkdFSEFT36oB2DO6VF+1gHsrAjKsxjPJkVdK47+pGAqFH2SnPLmLdAk9Ipm +niGI9Jb9eCdTrpRxAy6SMLmjkNnQs0JTQev+b3oVwEmklY4sLeMREJJIqzXup/D9 +ibFYi7NjyHlnsC2sbb52EoqOPPi33qEUMCHTTcN2ilpvW4TV3Ar08zkpd/usmmen +CM6Sd5e53elzs/47gxv/Pa4KmJbTUghRC9bSu+5za+nIZddwfTFPDX6ln8w2ru+a +wKGSz3C/0UQBByXD+hSH/itupWJKkxtLdsBDl0yrky/xNZ0IkRXV9uASDwN2q68D +4ouevHZpk0yjIE++BWTaFPXy0BZW+0qusUAXxjCzEAUaCkPo+D2HTVTrs2GplB21 +ZZAIU5uOvnm17rX9jnYh33gxC47kfycDPpE1ef09Nyf8mH0+5PMzW1q4E/Xg6Ovn +3QFfyO0UQFc+yEu/eV4lOuaVY0iw6kuasUAGNbhf1uc8Hqhnqv2E8Rm987GQHy2s +RulClYBGb4IG23S3mYA16237hFx+7NMF4JdQIdzzVPuD/UewY+yeA8jFRCnem2+8 +PjOVF5uXcEwIZyK7I8NX3ARdMC/pgsm3V2GmQfWPIDWu3QyPvW3PxfFv+NheCi3B +zp65pHr+GANo5fd6otU1bl/pQTsp7G+HuYG8OfNzO/wg8Etn+qO5J4ER0H6M8cs3 +bbYcscaGCFsEpYKO4m55QkcilMMcmChIk9QGvVCt3fRhrmtD8fqOA6XOOuOIhhXv +AVR+0UAHxRom16PnybntrnQ6aNboaJoVd+ATyEvMYCYzQDe6F89sE30QZ/1/vW/O +KMbjcyw8YDKocrCO7kSioE22spxNjx07T2o23ILf8ARe3ZStWY4qZirMCELcbD8G +uJDHkkMOGnXMVeiEkB7xZooWd7+X/4pmkkVjgKLA3N0YiYCMHsQEOiA53nD8Ydoi +r/lZF+LGSSX0/OUw7HpekFzqION/bSZy2bCem8zukZE1rzEtcPVgVyRsN6V6Z8u5 +xaGqgPuSZE0zBBN+A6akyE9PWFA+EDZCfepwtqhb8wIgc2NJN/g3sJqPGJOBt10j +KZU0p5kyZ0CQtR+YT1Nreze3Au6w8MlGoZ2+ljjnEG1SnPbGuEwBMJbKTmc6+h3v +tapAlheiEjVh1IHOSWlIWrKuJeUMQlg7a8twhK6yokSvyhWvmhmlG02/2QS+L9gk +VTcg1JMU6wGX9+865kGbVRFskGVvk1kCoYnbI/Ve8UpiBhbSFTYPaRCq2PHEr7My +Gp5zxjQ2i5F6eDk7OEUtQGFdwNiH9cPdgWRJ2EU1HqlCW95/1NJJGy+3qNJfP4OX +PgQqcN0QYQO61UGJm+Bmv8uT8UY5BuKyqMs0HR2+ar9hJGFfhTprOpseHz1MX/1d +t0CnfPZZbdIw/2n5ovnFSf12QUT6vQZq5uxda6mabsSq1I0ryaXFZGPPvrgkWxt9 +aFwKnu98Ypwwf910QdJ9A+Fw6/M05LNNX7NLeQvdMHOi0sPxKyV27Xd3Z5Gq1WPm +6pF1iu4gn0HVjpwIGLk6EX20HvVOYcGv1R1AHy77F81LZCVsBqvUNeB4ZjtgQhCS +ZhT9S+bos+MNJ8ILwRj19YZ6CdxtlsIEqDB5EQGwsdAbdQhCzxQ1bNCq42o/Yvof +es1E/SMIOIha5+ehueFmFL38xlzLgd9YteFMI4WTiY/60gGaSQvX0qVXkicEBcLC +DunWCz8292AALYKwUyqiaMGAdKM1fiMGJ+jh5IfXxDMccOrVvR/ME+jzpu7ZPklO +1t7ilIgm7JUgdzRjGV8yVFteBwPTdCHOLfmDuYd+N5K8ijTJSwkX7nrs1roQuVHn +QApsd2+xlKR474kYsp4H/H6fCKLwIl6wtNSGpPiyxyQmx5Z5xQZVLnv3KyhVvOpY +u00U53thMICb7W/IezMn+0XfPOWUPGOEFK+sWzTEo2OHukHRvKr06vIDycQYdAdv +mLREFWDjcRRP/dWTDlrJTKQdynJDB3pmH7ros5LMbge7xRk4TFZN6MAv9btEb8EB +5bl+JH9bvSUofVdbg+ZV31F8EseMZH1YcGAP2Q8uWobA0KDIVvHrZ3nFTKgAnx+A +6YnJD4hbP/H6j4EPjWN4KP4MVm/Bqil+1yKz2tBDehStoViYCkWqG/gmemy/PpFU +yZV0TWztBw/lN8oPR6oM7hQaTvwobnJaeE8tQSiwBMOaxQROqYk5JdacmDAPHH2g +wDntg9R97l8SM5Kf+p+cQ9uv8JgHZPcEgHtvHLw57V3MQKSYIWkbSGQznkFZ62k2 +3xuP7I0qqBdhul7D79Aiwj6BXcL9VBLNX65nRiTll1FyTcJ/fUPCd+JCphdgMrWu +mml+akSL93EV6P6WvnbQ7tzXl7+KLicMYH8exDBudNSJk3/QzNMhMP1MuGAuCq4Y +62BjwkspguA8YyViLe8fb0RfAJTahEWntQcfD+3akIECokFmW4iTt70AgzwS+dRA +Yw+kNJYVowUYIHZz0wLAXwHe1ih5hnDke/73VFw8Pwa3HKlyzmo8iHTeGB51jHx3 +4VOAKjUkzyArhpNvE0RB8WwtHudSnmbuF/79sfA6klyjSWi/2xuT9LfVOTJuhFST +DD/itW7WhsEf+bl/lrkfJuQyudwQc4OP9sZND9fnxe6bGbSYZWIGzQ+y0itUrVOb +zloaNGNIyhc6YcsHtHSiMESBpE8MxWs7mJGljVugbxhp96QvER4BtquJVVQV2rX0 +9zVjLabd4QF4zhd/Qivag8H2O6/PlxMBPYC96OfCcNfu7aNiaqgRex03ONbkDy9E +4h80Hh7xV3Rum+3KZmyF3Pi4al8qHyRNdDl0Mra1rFigAxfHhWmYy37AgPouIarg +vk59jQDK83ZX0iEL5Pv6HkG5QG3yX4KT63zRelfMBgCabfVeHMoHr+PNgmELaNmg +6eEzCk4Tq1ynWP5eYP7P5CzO2q318KNYnBa7v9I8hWFpZFvu/2JMSEAF9GhU47JV +m2V/KDfMoiZYTa92e/6WEyMq6PPkH0i8VQ/UEwZTQ62f5KBHzObcQUwXsacVsqR+ +9iRV6xvBtAPWjtvt0aysxLZCef8Izz7sXb1dbn5A8wbcRMBCx1pfJS/gh6Ze3Sif +6Tf7zKha0oAg203V7r4eMMnaMSiW0Kxl/i3RiEpqWhILDBktik3Iuplq1Zj/8ZH7 +yzBn+NdqdzKuf3aY1o2C+0rx5RuuRoET8dDVJ4O0sN3ENSAItRV8QSXsFd9CwLYQ +YmmXyC+0ngMUSf2er3/9i7lQieA3+qnLs0BiSoBTYTkgnDFBQqCbpQzS75NPqv3q +bnWQu7ounPFxNP6Ix76OakfUWm9YdLxgtd0DSJtGPcpYw15KKWntejMpfEnfCrB2 +ahrlhPt/3QLemeB7jfr2dJn+am61JzvBMg8P0yOip9eQlfe+QYr+4fzXJyyBfAub +HxERbJGyTCGuQrsrSfAHiw7NIhrNuolelBNUoRC0wtcSGUy4DmJv+DB9bjsMMpkk +ro5glfviGCOCy0QPZmpVGbH2KPghSpr/whL5yYm1p2BZPlGffi2evhpd4inA+vBP +H0OhZb8n9QivY6cGSgOMGlS84XP6jwGEvMqsNzYZjT+YnClML6TAC87xxu7ax0cg +UZmZj9tmsjTwYMtZLNYkmHZSMS4z17GwhzVFptyravtODDy/XA1kor8yQagEaYCe +Kn2s6B67D28OUZf4RSl7qgNeyGfnRtpYOYJdcdub9I5IIHs9iC/Obstr2TKezws3 +65NjT8ns062LKTV5jZl23ShRoNBwfXDhzKiEASESDH92N29yoMvlYNhAj4ln72Nn +ACYFKFuQBp55Jc6VJ0JkhLLuRcbB6elHCqyg3aR9zCz5KzzM5zyXEJzCPoGOx6el +vm7Qc338Czrex3sCc4UbX+7shadIDU4k80uPO8lysASPmZGDfNIy2GyHVGNaKlyB +EN6nYAEwn7lEKXeOwYZb+q123Q8uccjYqQX80v8l3feNDuSsPfW2OtgmJ12II/jO +eGbkspA63Wi9+PGZqqhSkdL7HoorN1O/5u5WYUWpM5EN4PdukXzISKonC5fp+cJs +NcMdr/e1aM9OYLGckuYiB6ll4I6p8Rh/b1TN8PkNfHpzeXho6U18EUw78zGrD8/5 +hzF8bhAQKreKzHv3QOMS4mOWI8jr2fLKWXiWYRe2B4meHhGxyWboI5BIWTPMXZ4x +ai2ZmW1eXp+heqRWao1arTSHeYVqJJrdFoJ+418KhJi4u6+h4luRKEW4gZGtySP4 +ouJEkow8CWp+xaOieclfqNQgGMK89LJ+fAY+1nT3Tq7H5e4ZmBnEI+3U6rgiIRw9 +exvpqTYbtvbp4Uz+3O2YgVn8zCBErNn6tyuy7s5v2Q0prRsI6lCLTydhmrq4VqIA +l1DAiViT6xrw/88zXXAMY0UygQmb9cHjxEEdnv5XbU9jaPxhW41zdUZ2OGB8LNHO +vBFkg8qLpVfP2b9A5hQ0+i8RZQ14aikWgf0BJUtknr5BZF6j7/rMioD4qz+/WznW +/FnAjUy9peZldcdtsYwzzQuKvqiXTaO3QJRn6O3gn8VHhuGL9nzZIqUBHd3hjNKf +f+mg7wl6S+E5d4pOP/9M8cqET9ymslh7b8KNtHobJXZneyiMCWKOAzj6hdeB1FM7 +Ib64YFVgVU2iUkUdPbvCwLIoAKKF1wIPyb0jxJW5hABMnFtyAP9UFXAaZGyluxeE ++c2BJ9juUD5pvZ41yLpQJbHGTO9JNyn8wSyY2JU55Z+mE5fvgtoMGXbUDjZ2jnb6 +aNta0+uGVAP4ENheEcMng4yqCofH0vnFxda9zpV2F4BH851ueP2k9OyMAE6u7cr7 +0NXeTriLkQJYSJwL5E7gBp2kbXTB1C/4PQGQ0AYgen8PqWESxfcvALMj3u/LlW2X +aN7egISpgqxtHCz+ISFu61VKW4LrM2U4rZqpuEGo8EfBs0PORogf4j0sbXY7KiPP +Gzq1xlt4mphlJZKXVo8eknIIGBlmh4p8r8OOQoTQ8/2Uxjs43Ir7DcYnQ9n7bALX +FH/b5dmGMfDFd4LhZmH26d0wpXcs+7ebbMpesHxTjEMdKU4QA3gR2RldKauOIxvo +2ySbgIybBLMWqZkL8PmdI8X0TReZoOZVzEjICwPvmCUxADV7TKgd2SQeTkdROQG3 +g1JqVLRedwnJImg9gM7I25AhMcXdMvyf2KpXjRZZMwFP3vPhHq+opOc4u3Cplgev +rxuY6Xj2hY6PJlZEcCeoloaPCY4T8XBuo4HYlk6ztYuRctn0sfIAbHZZiyt8u6tk +CnPalyFVi0hZc8n7k8i98BGMwTZnnTLK0k+s+mM4p92WxtT6i4kwK8mc9UFHWJuS +rbrOFR8XV4XcmHJ7IU9mXkpKDxTNEbxfB8BOs+jyC7/QzqeV4IxdNenmWmP05oy5 +/oWqQZl7+VeCmN3f3YCaeA8AdlhiE99dP4k/ZTd/G4BsVG0z3RhPLJZH1/nkPf14 +s0s7c1ZAmfHxxtHKCHvDXCi/2MIMzoiqAZXGxQPYVLcYjm+dfDZ3kT5H7YiRMgjE +07LDVO1IImbmkuHmLZnIw7XB90lJGcSpw2wn8uoAE5bLZd7/R+xkBF+8w7dTbY28 +CeT3zzfnC8/hWTsDGDWbijp3NieneEHBmgwb+TV/d0HtO1/4LUrC3zPjYwyuefrt +VI5dzBGHpfsiCt3emJXH41a+cKxKxeclNMfp9nAFYpKt99O6vqqxItzI+L+LAEtV +K6zejoAb4//0PUJ6NPSen9oaloY63lTCQWhMuUaysTEs5egtZLL9qhaCPjEwfmo6 +zLNzmjq2D1f7+GkNfF4T9V3wVGVQJfbm5HJZC0OikiDsEa6ZLYxVhSHsbiPrK9Bo +GQIpJswdfKh4689GE7t+p0+Tg/zjQ8iomWXVSctSJclyfDjx6Wj24dGudTBBqKSB +q0E02u74dEfdI12M48RRIa0w3Roxfxe3DMmDfGW0TiLIk1CW2G4KHCoQ02mQb5Rv +JV1a0ccuS4ofC23EiYUKrJ3Q5wcjAr6xI15G2Gl0wGMtnLt92s3VBEtbBXVkgqbm +3XaTRdM4mUGBACJpF5E+DbdEraUH8jnvWM2+7KRnbzziGMNl4ec1XcZd1sridmw1 +ewun13IEjlsNO53uQNTXDX7yU62KlieJcr1rNpdT2fGTMl6DTZL74WTEy+9ZR9Zu +1IYnoANlbwXSS23bpUf8gZMLESCX3kH/xUllhZJjRJHxwpmyCpVvE9zeQhI4tHUO +FN9x6Hk5vlZA5UHkv6Xof7QFKmwqVZAChXa82t/Uz6G4waK6idxSLGOq3TcDm1wZ +vZ2FZMB0C3HS6WqW7E8DE1E3wJmzBNFJ2hxXfRsDZYFz9R5ZKbKrUxc+/5pKDm5t +cV1UFiX5lhKzQ9LlWrKGl0G/adBDgdk26778umLyiUa9OvrFCkIl1k8g47RkWPGn +BMPJi2FFQcDJxeldbiLmgRyjfHOH1yf3N1l4nNr95tZScSvqLHZ5xozs0Zdqao0x +6wxZI36AUDFuAE7GyBoOGk+uQP8rUrGF/GlrrZUdn+VPKGtEglEXHYA3Qvirn8p0 +OSPL1fl0EuArZqfmJK+8b/OAS4KT6kDW/OWUW3ZzfWY7pi2MGNpPpIuQqSULoHz7 +wx2Z3IbDtbYkicLd6hokM8wE3qcnWWC6KSbDY1S2ehxfofNlzP5nilTWXKM4Wloh +5AV1ijtg6UnNB1JfiI9HwJ633vOHtvLKmXfITCifkqVreI/OMF/Rf3V9f5h7HgQe +XB20Ez+BMnQhVRFOAMJKvhMs3X3qRE4xap/1JakJYCvzibX0FRs3wUu65ZMxcJlK +GUBdKcGwuVmKC5jqj0AO9puFxOKVE8jVdUJH9BKCDA6aeYULeWCCcfuGtD9IiuON +vZqoTb8dEHPtYGkLBZt/lxZe23UJGzkP+clchifqq4ANsPDk2lWJFNzzrPq0osCx +aIh8lSYpWwMUWx6RU8FCkZtk3bH7dE8BAzgL8oK3QSNbjzzrepNIrQqEryXfNMS9 +RhndZbyvYUDNmkBuAC0ZOwnK+M7JbAeJ5/di7jZisqAMRrpdxQmg1I2MIDl406qo +iyUQXeioYMk2CQk4/93B36vJF0NNIBG0YayjOE7qKGC/zKCiVBNDmSzyjfXwxL5m +fTDvTtphzR5oz6wLmHz9QKkzim1EQy0Mm/480KffYCKKRN6foM4Q7anItJNettNk +EvRYkorSbHNNXKZhSvVQUg0Lc1/fAK/iU2U4LJHCWxbJ0vjRmxd/dup5ek49dQrz +cPZEoFpLchS2ggFpoCGZWTAXF0jqLdpQ1oYu7EkpTU2J1qCjYHRZpbKp7B47P8uD +VcEhfO6uHGRULwIsOiELCGjNgRaIh4E71yNfkvu0qGpbKtZCE+rBicCguh42m5E0 +CvQhOpXiucrFHcaWCS0gM0dFjO8EUiH9jhSUJP6neKB9pNIEj3/98bHvsbt4Qmgw +UDkcm9GtphKOhavY11PyC8e2qceogK3P+ZITbJCw1sEgYPGJMkW3tcHXCJUyrAg9 +20vMl+zRXXooOuTg6hW52UYWWlwl7T+kKhg/0KQxD7yFtXPWc7B1YjSnbKW+KPnS +fiO6B0zTJERdNonWwQef03R3ojwBAnkTYdhyt9h5oZ8ao5FiZVhPsOAQtppUr+jX +5ZO2Unxs11uFhfS3p0XNJDnua1u5m0E8jdFDQ25DUK955r4ausVROdj4Po96KN6I +gHSHoVjZZoeRL7gkPA0bPAB39xO2faP+mFNjzhr9ppGTxG6mnJ1FLPZx5oFtyQfO +tWNESK+nREvMGDUa9usRlFpZAimkL+E9YBgKGKNeSxEIRhj2IQ1rl3+uwQ+Gn2uR +5aHbYQbHxs1dNI62ih2leYi/HFTQcKD1p/YerOMCaPFVrS8CvOOZLne0zuHxnpRo +SmtB+6Kbg/nFN7THtuYWAviv0HTCU1xnYr05T2VQgKD0MeHkgnvY2KFEa3S86IfD +4joT4bv/Wtzw4MvZns1i0ZZNAhv8tAy5qI/9hU3gOmlIvsrNSsLMEdTd4f5m4hfe +OYwLUyusSLRLnhnZU9A/kgpXYHy1pj1YGlqqr3gnooUX0zmSl5PRt+Ap3p/0h+6O +n96nsLO1K8ZjDfRwTjDyP9JM5s5o3SliyWIEe5rxvKfV3ohp2Gpv8FkOgrAw2U6L +8/EW8FTfj54efzvqvKcXtw7GgMzj2lo6yOxwkgMsS6wXH/ho3fLavS2qd2iGtw3J +H95xAe8GYZ3Bu03tBK7YiJdyRM4AuHQDzKnS6UlC+oGqTGZx9KCRN2O/EUh8lw3Y +xE0uKA9zQl7J5Cci4/bULKCCRUceLWKWiypZW78Jt7XLFByjUwGCZSwYhYqkcJLX +B0hzmKPZifRR0jvwKuXgV6CaO3Hdgei5uMkrlaNTBWuMZteW3S3Q6BOqvmw1zuZV +pZYHoz6sN/hB/tpIBm7ctQGiKz7M/1N5gJOkn3qJpadMhZbGOsrs2ezkro/+ImCg +HAG3CjXTMqz6deljuBrgR+Rdin+BE/x5Cm2mWjXaGScGLn7XKqGPoY7v2CWGAOjD +UiasfJRnrnuW3wYglzysCdAv5zfLhPENVqtc+U50QZtJ7FEoyDnRXPP7rhkPboXT +IkGxpsfpQ9/kDjZxDet8a2wGy+EH2omgV5uU8aISt0UKyD95iIGxq99cwVC+jUXH +ApoTjxb8LXvnhBtgVce9IFto5IkhyfM1NBbSe+O/JlIVJBjneWLGpqtqzmeW/DpI +lP9ejvFwjlXroF6xJuRApFtVJKsl7qGj/vZbopaBnFEz2OFUN5K1NpXuhvMBDKzw +HzJUE7r05CCEY8JO/WVKubeX5KH9I5R6yorALSkYJvEX6xHqZF7j4Xf+bWWdf7x9 +jDxYVXc+bvidebBYV1oXOMsBX0gJKO5tkko/ZT+je9HJwHqh4MMrg5wzDFi/n9Lj +nGCQz7DBntww+dmp8inknctL7NVpg/Eh+i3rgiHkIR8WI8z3pc98IXoH2H+55502 +/9U1qLMPYKLDE/mTgMTQ4EW1xgS6rRiXVD6KaTzDNlBCQ4uB943HW4Nw6hEJyw4c +WqA89tlRAsoE7rC663BETkCssUtad3Ztjtaj/Ez2u4jLugCoEDqPimvUBJMQpMUh +c8jcV8wFHRnK81mNLacJZLtZW1zFFBqN9A+nZhFna9wGNHfh3a225JPsLw4b2pUC +1wUgLHqtyk5yBL6O3KjVBCW2bXWuYBGhE5DpcLXJw5CBO23uYezb/DdSwZ1h6oiQ +AcASKA88Jq+JL0pD+Ond87cmQFYoA/BSGYM+S3fo51JssPbej1kqVxRmiocIbMRt +luK3DTvrtMwk0P7K3LYbSfc2J1TRBAawtpITjtqh5JWmVIU8/S4fvdTCXIV3cx0L +LhC9937vVraONWf2v59TjKNTBbGcVoleak2o0bu+koYKU1zNhba2JiJaPw+BsN2I +B4kZyMqEGJ8caJWuElaUh6UTFgZ10KPcfmd4sydFl/yu4l2ThVTHHeU5FYcAwBAq +jyjNDpvHv9Dko+cvbZtJWtKyUlWXLfi83AlNHhvg3lziJClvPjNQLsmAp7s/HHe4 +QCJfFSwc4SsjZTTcrAdoqrpySKtbM5yeVnLwdg36NiyRPazEGJiwRTuTGdltayb8 +31isuKCkQHyCj7JKGSm5buoYzNDc3g2ggrhpnhIdOQ44jgdqhOKvAELKmOyJmffY +Pl6N8mYNozW7zozuBYxSk/1Ug9lCNhWeBD1PFeAxQLkAdlSpbF1GRAt98+iEEQvw +975httcMm7OJb4ZgdbF/CtKE992kjuWmyLGL+zR60dG99z6ZQtoe0jgfpeMHBziT +ZmeN3zAWdZax13oBMyHVzIOUQ9y/gnyCbU0VnD9zEsdEPutB5nm1hR2v6ItNMm46 +lzBS63rbcHAOvx4wrbwd0V86o9NcRz45mZ5vUz9wcf/l8x2/eAF4ow3fIiPkdR4g +n+FQSgWFqbtsIVyme0kmIQKUS1vbx29g8SxpwBwbdw5Yu37e+6765WXztJwytMYb +zNPSpToOKrNAJd9OlfRgCfaMNZDLV/s+QujGds0FnO+VpYpMkgPJNlvHl/ljz+jU +3WDZdbzl5gAZdeL7xLkxX4EAOR1MoRxIXCIKrKbPZZQNipYEHZqiGQ9NJBVjtXW7 +HmeIVYFQuksEsAqvFUcnU4Idlg2hPMYg4+gxKyLRebBEBYJFrZ88EtigmG9+9n34 +jWZMYJP/KaLkjxqicnLN8YmzuEHlag/4tjuU+6ITyDvulublBojs0lDeDZv+k9fJ +E7PQLucOyDN3e86cpYuxkQswq/YbE1s6bRnS0HtTCRpbHJnM7rU5QLwBFQ4t+0ml +mTtDcC5yanGxTxmSNIBqeaDpWqDnm5Jss5HC2kN/5TtLZfu6OzRAaAPhb4lQmz6X +nHFbstigalmdhRZ6rero6QUL3gtoiPeaG4zFDy1gwaOqlwY6kNc2rqN/uG80KKFl +FDVFe3MMErnTmoirqhj/CKZVE79N+btf55/PapwWycVchKhaeA+CDE2XRTg3O75n +Y654aqutAC/EUztvFqZhElwpBZTPJdmM7SDBcmuyneoUcLOJrX3dv6LmA9AezSAw +K0a950w3OWtREJ2ZakwUYQzh6XtCRux+OfDVZGb/rfcgE+HIYA9BhY9ZfixV3NCQ +byI2R2WdMh3+YrZHpafPITiF/bSdDIQbQGONZVTykD3txoFaEEG2jldKH4I+HPa9 +PaT6imx+qf8c+DpyfG6F/fGi0vVmUdJpSlHbXzRNj1RWYPCI5JAPmKNscBE8gGbo +VIPE6UBPAg9sx6Is5PR7z4KdNm6hs8qd+EcR5aJAKOgU3WnVwSgjDT4IltDTvPEI +OuJhZZQc7+w1CqfadkVn7nfQ5ALW45K+9lTYiw+SaQKFkK2IHxLcRG7L2fRB4Fd1 +bBEPHY42fgkblOF6iE5S5p8+iR8z6Hbdp6t4sNykX1+cxkwz2VgQD+mtEwdsCjvC +K53O2HG8Bv2Acn3gPs4mVizl/2kQCN2uWcw+PhPVHctpkNzU/I44qVIb1k1wflBh +LHkYvht/6HxTQvrmjEoSXg7t/HXiGswotTjPgUBguwcRkqiLKZg+XNPUcZNq/Wge +umNBjNMPrWLPJ+vhRDhrbfL20drLaiB5TCZw0p5zjsHzrS6QcWgdMWZMRRQslaCS +CRAtywVo6aFjR9YjpPYCo94j/A2BsRMCDyxpEioQx851SD8I559pprXVu2ZeEuJC +QyfuZP7Fx6wJ/kjwg07XLbWkWuJUIFU2VyvJBa1tm+s513oUtPgDJuxDU4Ma4eQj +AyNQYhR8YOrAUbPWY2r3eWvlgDyRrcWIx+sg3NOBIr9NvzWvri7ZA/jhKP820olF +Kb48N7tToA0phErOyb1pWY/4fBp3dgVhirIyR769ADRma33+03leB1GpJ6gw7uXc +wSXZL21EYBfs/Xh9Mwb6agE7rYlcv7urVaIvefDM60U97WnXFKTLf4an9WXq6Eu8 +23uFDwUYHn5SZL9ow84ViwaPFHeB7qkorOCrbTWASHPR4mSEO46gWGONQoma+3Oc +eJ7I9YH3R0Sgk4YY6B61N/S9XZhlwmAuXCVopLnuP6yqNG9ykNdfIoyyGKSzOus4 +hCyTyvWEax1kPFOXWL7B3SPd3JtZVQ/C9c2ERx2yLQkduIGyDU6ZM0kzPww4c9+j +OQSm4xkiIH+ZGko0WSoMug86ZKHGDwmPLjusIzn78dUmCB5VJkk1LKkKxl1PdePq +ZRQuUM/KSRblL6WZT6V+NaWNLif3+i4sQ84/9I+nWfSmpkWhegRt45aWuPZl7sp0 +9DozOlrMf4Z3HnJDcQGlZy+Ah8MvfA+y6JZvWxWCFLXgS0ihYZBPbGyop55b5ezi +Zkab8UhoFVZjttgGlWXTXjPP5aSysPtGbXRWIBt/tuCJghEnBigkjUH8/oxHn8kL +yMTtae/NRtrmrci4atFRUnXz3dvpjVGwjCTEWeFNVKS6uc1l1Q69vlGjZ6Y7LCX1 +2cmHURU64rqNVQvTiP2d10B2dajpQOaNqw/W/EfKpKfT1NLVooOaxR5YCUxGqwba +NXuqHAxxWFd3C7Dx0mRqUnX9u4GIw4bvL/HtRdt36SjgkZlMfIF5n66KYyrYMUxn +rbhDNlaa9K0b9u+tdUelO34kfFxGrwGroVLHzc6lIPT/tKnIlabCUXQiOOylVnX/ +C7gAKug9pHfkHipprvi1EG6U3oVoNUhCejPmlHWiexvPxSOLV5m4nzt6OvEYK+yR +p0CxVSNLJfmi0XdxpiIBqsJXwsbp6tFfUVaoBwt1hEkecqdxT5YTNLKmFxK4/lMB +J/RzxmzNJLjvPBJoB6SM11bXaqRnlgF1KVA00jUrre1X1uLOFvhjP0raUwwzUNIc +KSXEGAcvxweAbJNuyjdmX400iHuP9+TozxnTqQSbxq5LWtOhnBL4WjFhDtQITvds +cMGhIh/XrsFfIZJ68aKEwEwhG7bXSZt/9+8X62NBlvVwYgTnUnEHFISd3vjcJdjw +gVHGJ/sSlyI+XN0RchUOtoLrpPMuftax4j9Z2t37ckShLb4ffM129AOw2IQvirg3 +ZNkUHPsVo26k0ko+U5dzlCJiK5yAWo2lv8qLieW8fHAGfc9BHQPgAz6bEQEX9iTx +Vv6pt84X1blfq7SQXBaSh/dgCCovWR3o/CZk3fvSSVVFUAqBUMG0K/Yns7f7/+Ch +mzQl7op/wZDTwdukkwk6lOW9kro9bI1b0bcGV9MSAgGHT6dfr5BdkUcswcHrKwi7 +sd6iG+u3ZHLUGIHw58cpD6YHdn04999ZOOhu/5D68BvPmC66ywjUFOE0nTo38DUN +l5gGccZtmYoMs9iv7UM75k3BumqGdWh1zGWJuz89e2oRUVkrHKWc38h1YWZE6+/0 +ffv6D2B52rO+3mEBN9Mysz6wVhZ75sWhC8TQ5shWFbfxcUahK8bBB30lCS1L7rgu +SrUfxjPHO8+sie1gwwssoBhTkTBDaxqkyHks1PfdMM/TBohPAR8WPSYM8idEDkWc +8i3XCiKiMuiuPKEnxW+BxV0BAhSnTqqG1T3sIzBtmS2BuH/SkFxak1oUMwZh7jaK +5weKvfnf1ZuhNBm/6n85JSP3jq1NewPKvX7NHLozz02FS35Mjv725709+bVk7VhO +bJdigzxHUda5wnF54PX8VbR/Q+wRtFnQXAVxaSu1ZpgTPo0R8kpxEkzBy8blg9wp +Y0KcShi3RpeAcGCSP9D+RuPqNzS1ybDOR2D3JT6CLyxJ61i44p+sJKaMx+lGoK+g +m4xu5ppvTPWx2x78JP+JIl28yHI9txo5ozylOHYcoH+xaH97MGIq2E3gh/jIv1Ub +6AB9pZN+qp//VVufQsc/H/A5+BcVImIVipuhKNYPFsVJ9a0nU4pvCM3Nci4ZBXlX +xPJRCX8CoDNUQZBHbaSDFK6SpWRYGh83kp+I3GwwBn+tH0aUdiT4AwUAB1cxMyop +hPb778+ygsvui3lDZTdckDsj89SMftPbFzUONDC0ACYcuzAxKglU/P9P5pvx8Sfx +XGuecS0KaNysh/PL7ETpC5TDK/VV7v7c7FPp2zRiWrrQCyhUgikjYYow12QhsRnw +J4cwD7EDteqwv4IlnHq0dBz6w4hWQF2BPdyqz0lCCBYvVVVR+m87NI2p6vI8K7Kh +WittxBtOq6tcikVZh90Z5fkKDIsc9PxR/XynDST/MQyoL+YszeiJjevXqJDXzD8v +GEzD9lu5NqB9ISxYhbLoMsote4tvm4+NgFE6iPH7FK9vyNGVrmCkQqZcWI8fxyes +EkKExwzSXL4o40zobMqtQlGW3mG8BN7FT3OVqDPtnEO+BjHwFn91qhoyXoc8EIIN +ofSQoDlqLb1IYluE9+oZacWf2nZYPI2kGQRsUIColYHU6MFXqyqoAXEzgnMKiRO4 +ogc1qfhwaV6VuAmkPfoMBKTrw/ftOyMgCul1mC5QXeip+f2j/WIY82DlUoOOIS7b +Rp/jPSiNCADBwSpJObOjEVVX1JF6rBohSJIpM1GdBB4PH81DllOTjaN5yHfWr6yq +RL1p2GZ6usAJdEbsH6c+qsKwmts8BVx6R873Am/YEFP3UFZXI36yqnophBBNV7sS +ediqCuf856JcsXoUL8q9LLg3UMShjuNZa7fAKpyo3Ujjb+QZM8us1u1AYRmFs3rx +W9Wj20p7FJN2SwNl4t2JuBlM/RNbFf/wWbaP5omfOA45xNMf3tTYYJYYJm83jZRv +mR3rHq2wq9t+YUUPpbcTWlZzUcdB0fkz7wwe9+UFtXk6Yih4ewGU6zfIkDL542Wl +PqA9xrG/4DCfucdEg9lnCIwLhUDp2+i2xwz5WRNJpazV4bpAGI/EZLo1RZwgQw/Q +dk+Ewzr+IfSKMTotw5vZpSY5v6fq7R70MCTarED87S/wPDIYwFWsPHUuBues+MGA +N0xzwq975xjL1AgHo7KGuZ4vDv/MtyE7uWVVbW3xKTy1B6eNMMbE01LQh1e9GWDx +/FUk8jTmQRSYL3XwYNDrEMjRZQYyR/CJcV7iBLW+xFROvnuaQo3JIynKtyP8SFrL +HiiIYS0mUsS44y8QYLXmV1NKwhnrU63ThpTPgAt5zC6mjQC2le5FoZEf9rvCRvfK +7Ly2VvUXR6U7bZrbPMrNRJA/YOIBvUlr7QdJJl9nvO344AfjQfxJmVGSQjorsfo2 +oz8npai8YoD4chf1J+ky61k/9zpbDbvfylE+OJVR52VxbIs6LqAKso/nvkHGOfXW +Gq9B/BX7rXcPmeDyOA/HcBnwNdCvFtsjhmtDz08iQiy9K5f1cbgsWmFZelvqkMKe +D8V+XW87wC8jaurGAgTNyQVwx2VhoF8D92DhYsxwHT8yVZEsjygEn1lRP0NqAyYr +MvTjVsS3jzsMkYlj/rh4rULa+Z4qyZ/jUYhic4kfbYELZOjrMTauQBf/TsIRp8qw +BKeNCCdv8EHiw/ziMR+NjuDQGe+x5QxNEGy370FFA3DKhUlyYNTiddLGcyIJM5Tq +RGDNMLArHd3ntvzpdQaLU7H1Bz1FPFeqvDRwv+YuF/2pKTlH85iE6mBhjuG0mwES +E/iXVjA0AKIUNgD78J78H+L2P7POF8rTWrTr72FrejXWLyYW+ZN6tPk0fdBWf4px +BRKj/piK5XtIwc+AYFxf/nTbZYuM/x/uuHXnBESJH58a+cPfOJYiqr8xoOkQ/GIN +e6T7vFYmJZOW9KausvVaYOfWX6/cKBK7lz5+TWjggiO2j4adw4K+iIlkg+R7Y8BR +HMok0oDzqy4ld0jmc/7yrRmOF1pi01I48nCdy+1j6Bo3wmuJQDpcMRpyB75tCYMv +GcPoE88gWD56D1n01jMM9DqY2PN/vu+PUBmZd+hcZ8thAR9FkA89SdUl1SSGIgio +U4W9Eyyx6ZxskMkSfsk113wE0ZH4ge7Gi+aTwHLr6Fjbc/R1i28aSX9+kH07NAs3 +SXoN3sVvJUEBv7CtpGux98Fh2NotdkKqt2o+LQgQw4+tHJsLltVnihRyV3OGgfby +gSQSSQsGdPGplrrUMAYa0Q/YNeYSboefO95fruaEVwONfTrkl83UJp119ne6NzwZ +Q5Zjohq60ycc5u4piuvJzG5XSfa1X0dUFqPM0rCL9hPrAiRTxZaA9KTP2sk9ilh9 +k/Qz7LOX+LxNp5lVoT1m5OZqhlYm3uz8xAGjUZjoRIfMzDdKJq9dyAyb0MrBHXfN +iuM1Ceh8PohJpsCvyt1uGgO7dHHCvhQmhasplLbSSp8/U8mQkmOWVC5+yjKfCX+Q ++UP6VF1oDoBoVbyGvmgDo6xG7beeH0ZIpc3Vrlt93t+5mKqpPx+GVX76fl+F3Vbh +l9xNGMfTXuQuy8O8zFAUCzSFSSyqPIN7wwasJrUACiQRqCdzu8r+LgtOwdpQG0PZ +OhFRdvwNZUV3PaP0cY59dBlTnCeAi56gzRqa3HVBX1NpU+nZmpyHQ4YyDnLmn+wp +ZOdo9hd/a0jJ5/TlO3hxgHoff9BZUsUhXeFSv4pAGZx0tNOfgITFxcPS66+tiuhl +f36VQQx7491uVedhWON47fX+cY3UMmMitpbn7QBr9hhpC2yeJwmmiKjXAUGn0hb2 +TzRTKXHbGPHzMrhkQpkRNBxIBQvyviLV/Q7Vpnz70SESM5FUkKuJPBfO5xFvmZFP +qSU6DGMQmI6QNFN//TfcL85DkvfbpK87IeYgHMi/2RbXa1ZvpY6pCkXtM1pzS/R6 +I0Z/iPYjgEE+wzvHXZDwMr9qLvKiw+gfZeiJQKabatWd4hwEn0agD+2AIVSrid+V +n/IL0rMxbapq6FwkB6f1RBqli9CmTlCUSFHXmLgyQB8BOHMtsfelmtxXKQ== +=3L8L +-----END PGP MESSAGE----- diff --git a/tests/openpgp/plain-largeo.asc b/tests/openpgp/plain-largeo.asc new file mode 100644 index 0000000..2f14bdd --- /dev/null +++ b/tests/openpgp/plain-largeo.asc @@ -0,0 +1,4205 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +IyBIQUNLSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgIC0qLSBvcmcgLSotCiMrVElUTEU6IEEgSGFja2VyJ3Mg +R3VpZGUgdG8gR251UEcKIytURVhUOiBTb21lIG5vdGVzIG9uIEdudVBHIGludGVy +bmFscwojK1NUQVJUVVA6IHNob3dhbGwKIytPUFRJT05TOiBeOnt9CgoqIEhvdyB0 +byBjb250cmlidXRlCgogIFRoZSBmb2xsb3dpbmcgc3R1ZmYgZXhwbGFpbnMgc29t +ZSBiYXNpYyBwcm9jZWR1cmVzIHlvdSBuZWVkIHRvCiAgZm9sbG93IGlmIHlvdSB3 +YW50IHRvIGNvbnRyaWJ1dGUgY29kZSBvciBkb2N1bWVudGF0aW9uLgoKKiogTm8g +bW9yZSBDaGFuZ2VMb2cgZmlsZXMKCkRvIG5vdCBtb2RpZnkgYW55IG9mIHRoZSBD +aGFuZ2VMb2cgZmlsZXMgaW4gR251UEcuICBTdGFydGluZyBvbgpEZWNlbWJlciAx +c3QsIDIwMTEgd2UgcHV0IGNoYW5nZSBpbmZvcm1hdGlvbiBvbmx5IGluIHRoZSBH +SVQgY29tbWl0CmxvZywgYW5kIGdlbmVyYXRlIGEgdG9wLWxldmVsIENoYW5nZUxv +ZyBmaWxlIGZyb20gbG9ncyBhdCAibWFrZSBkaXN0Igp0aW1lLiAgQXMgc3VjaCwg +dGhlcmUgYXJlIHN0cmljdCByZXF1aXJlbWVudHMgb24gdGhlIGZvcm0gb2YgdGhl +CmNvbW1pdCBsb2cgbWVzc2FnZXMuICBUaGUgb2xkIENoYW5nZUxvZyBmaWxlcyBo +YXZlIGFsbCBiZSByZW5hbWVkIHRvCkNoYW5nZUxvZy0yMDExCgoqKiBDb21taXQg +bG9nIHJlcXVpcmVtZW50cwoKWW91ciBjb21taXQgbG9nIHNob3VsZCBhbHdheXMg +c3RhcnQgd2l0aCBhIG9uZS1saW5lIHN1bW1hcnksIHRoZQpzZWNvbmQgbGluZSBz +aG91bGQgYmUgYmxhbmssIGFuZCB0aGUgcmVtYWluaW5nIGxpbmVzIGFyZSB1c3Vh +bGx5CkNoYW5nZUxvZy1zdHlsZSBlbnRyaWVzIGZvciBhbGwgYWZmZWN0ZWQgZmls +ZXMuICBIb3dldmVyLCBpdCdzIGZpbmUKLS0tIGV2ZW4gcmVjb21tZW5kZWQgLS0t +IHRvIHdyaXRlIGEgZmV3IGxpbmVzIG9mIHByb3NlIGRlc2NyaWJpbmcgdGhlCmNo +YW5nZSwgd2hlbiB0aGUgc3VtbWFyeSBhbmQgQ2hhbmdlTG9nIGVudHJpZXMgZG9u +J3QgZ2l2ZSBlbm91Z2ggb2YKdGhlIGJpZyBwaWN0dXJlLiAgT21pdCB0aGUgbGVh +ZGluZyBUQUJzIHRoYXQgeW91IGFyZSBzZWVpbmcgaW4gYQoicmVhbCIgQ2hhbmdl +TG9nIGZpbGUsIGJ1dCBrZWVwIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGF0IDcy +IG9yCnNtYWxsZXIsIHNvIHRoYXQgdGhlIGdlbmVyYXRlZCBDaGFuZ2VMb2cgbGlu +ZXMsIGVhY2ggd2l0aCBpdHMgbGVhZGluZwpUQUIsIHdpbGwgbm90IGV4Y2VlZCA4 +MCBjb2x1bW5zLiAgSWYgeW91IHdhbnQgdG8gYWRkIHRleHQgd2hpY2ggc2hhbGwK +bm90IGJlIGNvcGllZCB0byB0aGUgQ2hhbmdlTG9nLCBzZXBhcmF0ZSBpdCBieSBh +IGxpbmUgY29uc2lzdGluZyBvZgp0d28gZGFzaGVzIGF0IHRoZSBiZWdpbiBvZiBh +IGxpbmUuCgpUaGUgb25lLWxpbmUgc3VtbWFyeSB1c3VhbGx5IHN0YXJ0cyB3aXRo +IGEga2V5d29yZCB0byBpZGVudGlmeSB0aGUKbWFpbmx5IGFmZmVjdGVkIHN1YnN5 +c3RlbS4gIElmIG1vcmUgdGhhbiBvbmUga2V5d29yZCBpcyByZXF1aXJlZCB0aGUK +YXJlIGRlbGltaXRlZCBieSBhIGNvbW1hIChlLmcuID1zY2QsdzMyOj0pLiBDb21t +b25seSBmb3VuZCBrZXl3b3JkcwphcmUKCiAtIGFnZW50ICAgOjogVGhlIGdwZy1h +Z2VudCBjb21wb25lbnQKIC0gc3NoICAgICA6OiBUaGUgc3NoLWFnZW50IHBhcnQg +b2YgdGhlIGFnZW50CiAtIGNvbW1vbiAgOjogQ29kZSBpbiBjb21tb24KIC0gaW9i +dWYgICA6OiBUaGUgSU9CVUYgc3lzdGVtIGluIGNvbW1vbgogLSBncGcgICAgIDo6 +IFRoZSBncGcgb3IgZ3BndiBjb21wb25lbnRzCiAtIGdwZ3NtICAgOjogVGhlIGdw +Z3NtIGNvbXBvbmVudAogLSBzY2QgICAgIDo6IFRoZSBzY2RhZW1vbiBjb21wb25l +bnQKIC0gY2NpZCAgICA6OiBUaGUgQ0NJRCBkcml2ZXIgaW4gc2NkYWVtb24KIC0g +ZGlybW5nciA6OiBUaGUgZGlybW5nciBjb21wb25lbnQKIC0gdzMyICAgICA6OiBX +aW5kb3dzIHJlbGF0ZWQgY29kZQogLSBwbyAgICAgIDo6IFRyYW5zbGF0aW9ucwog +LSBidWlsZCAgIDo6IENoYW5nZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbQogLSBzcGVl +ZG8gIDo6IFNwZWVkbyBidWlsZCBzeXN0ZW0gc3BlY2lmaWMgY2hhbmdlcwogLSBk +b2MgICAgIDo6IERvY3VtZW50YXRpb24gY2hhbmdlcwoKVHlwbyBmaXhlcyBhbmQg +ZG9jdW1lbnRhdGlvbiB1cGRhdGVzIGRvbid0IG5lZWQgYSBDaGFuZ2VMb2cgZW50 +cnk7CnRodXMgeW91IHdvdWxkIHVzZSBhIGNvbW1pdCBtZXNzYWdlIGxpa2UKCiMr +YmVnaW5fZXhhbXBsZQpGaXggdHlwbyBpbiBhIGNvbW1lbnQKCi0tCiMrZW5kX2V4 +YW1wbGUKClRoZSBtYXJrZXIgbGluZSBoZXJlIGlzIGltcG9ydGFudDsgd2l0aG91 +dCBpdCB0aGUgZmlyc3QgbGluZSB3b3VsZAphcHBlYXIgaW4gdGhlIENoYW5nZUxv +Zy4KCklmIHlvdSBleGNlcHRpb25hbGx5IG5lZWQgdG8gaGF2ZSBsb25nZXIgbGlu +ZXMgaW4gYSBjb21taXQgbG9nIHlvdSBtYXkKZG8gdGhpcyBhZnRlciB0aGlzIHNj +aXNzb3IgbGluZToKIytiZWdpbl9leGFtcGxlCiMgLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tID44IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojK2VuZF9leGFtcGxl +CihoYXNoLCBibGFuaywgMjQgZGFzaGVzLCBibGFuaywgc2Npc3NvciwgYmxhbmss +IDI0IGRhc2hlcykuCk5vdGUgdGhhdCBzdWNoIGEgY29tbWVudCB3aWxsIGJlIHJl +bW92ZWQgaWYgdGhlIGdpdCBjb21taXQgb3B0aW9uCj0tLWNsZWFudXA9c2Npc3Nv +cj0gaXMgdXNlZC4KCgoqKiBMaWNlbnNlIHBvbGljeQoKICBHbnVQRyBpcyBsaWNl +bnNlZCB1bmRlciB0aGUgR1BMdjMrIHdpdGggc29tZSBmaWxlcyB1bmRlciBhIG1p +eGVkCiAgTEdQTHYzKy9HUEx2MisgbGljZW5zZS4gIEl0IGlzIHRodXMgaW1wb3J0 +YW50LCB0aGF0IGFsbCBjb250cmlidXRlZAogIGNvZGUgYWxsb3dzIGZvciBhbiB1 +cGRhdGUgb2YgdGhlIGxpY2Vuc2U7IGZvciBleGFtcGxlIHdlIGNhbid0CiAgYWNj +ZXB0IGNvZGUgdW5kZXIgdGhlIEdQTHYyKG9ubHkpLgoKICBHbnVQRyB1c2VkIHRv +IGhhdmUgYSBzdHJpY3QgcG9saWN5IG9mIHJlcXVpcmluZyBjb3B5cmlnaHQKICBh +c3NpZ25tZW50cyB0byB0aGUgRlNGLiAgVG8gYXZvaWQgdGhpcyBtYWpvciBvcmdh +bml6YXRpb25hbCBvdmVyaGVhZAogIGFuZCB0byBhbGxvdyBpbmNsdXNpb24gb2Yg +Y29kZSwgbm90IGNvcHlyaWdodGVkIGJ5IHRoZSBGU0YsIHRoaXMKICBwb2xpY3kg +aGFzIGJlZW4gcmVsYXhlZCBvbiAyMDEzLTAzLTI5LiAgSXQgaXMgbm93IGFsc28g +cG9zc2libGUgdG8KICBjb250cmlidXRlIGNvZGUgYnkgYXNzZXJ0aW5nIHRoYXQg +dGhlIGNvbnRyaWJ1dGlvbiBpcyBpbiBhY2NvcmRhbmNlCiAgdG8gdGhlICJMaWJn +Y3J5cHQgRGV2ZWxvcGVyJ3MgQ2VydGlmaWNhdGUgb2YgT3JpZ2luIiBhcyBmb3Vu +ZCBpbiB0aGUKICBmaWxlICJEQ08iLiAgKEV4Y2VwdCBmb3IgYSBzbGlnaHQgd29y +ZGluZyBjaGFuZ2UsIHRoaXMgRENPIGlzCiAgaWRlbnRpY2FsIHRvIHRoZSBvbmUg +dXNlZCBieSB0aGUgTGludXgga2VybmVsLikKCiAgSWYgeW91IHdhbnQgdG8gY29u +dHJpYnV0ZSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdG8gR251UEcgYW5kIHlvdQog +IGRpZG4ndCBzaWduIGEgY29weXJpZ2h0IGFzc2lnbm1lbnQgd2l0aCB0aGUgRlNG +IGluIHRoZSBwYXN0LCB5b3UKICBuZWVkIHRvIHRha2UgdGhlc2Ugc2ltcGxlIHN0 +ZXBzOgoKICAtIERlY2lkZSB3aGljaCBtYWlsIGFkZHJlc3MgeW91IHdhbnQgdG8g +dXNlLiAgUGxlYXNlIGhhdmUgeW91ciByZWFsCiAgICBuYW1lIGluIHRoZSBhZGRy +ZXNzIGFuZCBub3QgYSBwc2V1ZG9ueW0uICBBbm9ueW1vdXMgY29udHJpYnV0aW9u +cwogICAgY2FuIG9ubHkgYmUgZG9uZSBpZiB5b3UgZmluZCBhIHByb3h5IHdobyBj +ZXJ0aWZpZXMgZm9yIHlvdS4KCiAgLSBJZiB5b3VyIGVtcGxveWVyIG9yIHNjaG9v +bCBtaWdodCBjbGFpbSBvd25lcnNoaXAgb2YgY29kZSB3cml0dGVuCiAgICBieSB5 +b3U7IHlvdSBuZWVkIHRvIHRhbGsgdG8gdGhlbSB0byBtYWtlIHN1cmUgdGhhdCB5 +b3UgaGF2ZSB0aGUKICAgIHJpZ2h0IHRvIGNvbnRyaWJ1dGUgdW5kZXIgdGhlIERD +Ty4KCiAgLSBTZW5kIGFuIE9wZW5QR1Agc2lnbmVkIG1haWwgdG8gdGhlIGdudXBn +LWRldmVsQGdudXBnLm9yZyBtYWlsaW5nCiAgICBsaXN0IGZyb20geW91ciBtYWls +IGFkZHJlc3MuICBJbmNsdWRlIGEgY29weSBvZiB0aGUgRENPIGFzIGZvdW5kCiAg +ICBpbiB0aGUgb2ZmaWNpYWwgbWFzdGVyIGJyYW5jaC4gIEluc2VydCB5b3VyIG5h +bWUgYW5kIGVtYWlsIGFkZHJlc3MKICAgIGludG8gdGhlIERDTyBpbiB0aGUgc2Ft +ZSB3YXkgeW91IHdhbnQgdG8gdXNlIGl0IGxhdGVyLiAgRXhhbXBsZToKCiAgICAg +IFNpZ25lZC1vZmYtYnk6IEpvZSBSLiBIYWNrZXIgPGpvZUBleGFtcGxlLm9yZz4K +CiAgICAoSWYgeW91IHJlYWxseSBuZWVkIGl0LCB5b3UgbWF5IHBlcmZvcm0gc2lt +cGxlIHRyYW5zZm9ybWF0aW9ucyBvZgogICAgdGhlIG1haWwgYWRkcmVzczogUmVw +bGFjaW5nICJAIiBieSAiIGF0ICIgb3IgIi4iIGJ5ICIgZG90ICIuKQoKICAtIFRo +YXQncyBpdC4gIEZyb20gbm93IG9uIHlvdSBvbmx5IG5lZWQgdG8gYWRkIGEgIlNp +Z25lZC1vZmYtYnk6IgogICAgbGluZSB3aXRoIHlvdXIgbmFtZSBhbmQgbWFpbCBh +ZGRyZXNzIHRvIHRoZSBjb21taXQgbWVzc2FnZS4gIEl0IGlzCiAgICByZWNvbW1l +bmRlZCB0byBzZW5kIHRoZSBwYXRjaGVzIHVzaW5nIGEgUEdQL01JTUUgc2lnbmVk +IG1haWwuCgoqKiBDb2Rpbmcgc3RhbmRhcmRzCgogIFBsZWFzZSBmb2xsb3cgdGhl +IEdOVSBjb2Rpbmcgc3RhbmRhcmRzLiAgSWYgeW91IGFyZSBpbiBkb3VidCBjb25z +dWx0CiAgdGhlIGV4aXN0aW5nIGNvZGUgYXMgYW4gZXhhbXBsZS4gIERvIG5vIHJl +LWluZGVudCBjb2RlIHdpdGhvdXQgYQogIG5lZWQuICBJZiB5b3UgcmVhbGx5IG5l +ZWQgdG8gZG8gaXQsIHVzZSBhIHNlcGFyYXRlIGNvbW1pdCBmb3Igc3VjaCBhCiAg +Y2hhbmdlLgoKICAtIE9ubHkgY2VydGFpbiBDOTkgZmVhdHVyZXMgbWF5IGJlIHVz +ZWQgKHNlZSBiZWxvdyk7IGluIGdlbmVyYWwKICAgIHN0aWNrIHRvIEM5MC4KICAt +IFBsZWFzZSBkbyBub3QgdXNlIEMrKyA9Ly89IHN0eWxlIGNvbW1lbnRzLgogIC0g +VHJ5IHRvIGZpdCBsaW5lcyBpbnRvIDgwIGNvbHVtbnMuCiAgLSBJZ25vcmUgc2ln +bmVkL3Vuc2lnbmVkIHBvaW50ZXIgbWlzbWF0Y2hlcwogIC0gTm8gYXJpdGhtZXRp +YyBvbiB2b2lkIHBvaW50ZXJzOyBjYXN0IHRvIGNoYXIqIGZpcnN0LgogIC0gV2Ug +dXNlIG91ciBvd24gcHJpbnRmIHN0eWxlIGZ1bmN0aW9ucyBsaWtlID1lc19wcmlu +dGY9LCBhbmQKICAgID1lc19hc3ByaW50Zj0gd2hpY2ggaW1wbGVtZW50IG1vc3Qg +Qzk5IGZlYXR1cmVzIHdpdGggdGhlIGV4Y2VwdGlvbgogICAgb2YgPXdjaGFyX3Q9 +ICh3aGljaCBzaG91bGQgYW55d2F5IG5vdCBiZSB1c2VkKS4gIFBsZWFzZSBhbHdh +eXMgdXNlCiAgICB0aGVtIGFuZCBkbyBub3QgcmVzb3J0IHRvIHRob3NlIHByb3Zp +ZGVkIGJ5IGxpYmMuICBUaGUgcmF0aW9uYWxlCiAgICBmb3IgdXNpbmcgdGhlbSBp +cyB0aGF0IHdlIGtub3cgdGhhdCB0aGUgZm9ybWF0IHNwZWNpZmllcnMgd29yayBv +bgogICAgYWxsIHBsYXRmb3JtcyBhbmQgdGhhdCB3ZSBkbyBub3QgbmVlZCB0byBj +aGFzZSBwbGF0Zm9ybSBkZXBlbmRlbnQKICAgIGJ1Z3MuCiAgLSBJdCBpcyBjb21t +b24gdG8gaGF2ZSBhIGxhYmVsIG5hbWVkICJsZWF2ZSIgZm9yIGEgZnVuY3Rpb24n +cwogICAgY2xlYW51cCBhbmQgcmV0dXJuIGNvZGUuICBUaGlzIGhlbHBzIHdpdGgg +ZnJlZWluZyBtZW1vcnkgYW5kIGlzIGEKICAgIGNvbnZlbmllbnQgbG9jYXRpb24g +dG8gc2V0IGEgYnJlYWtwb2ludCBmb3IgZGVidWdnaW5nLgogIC0gQWx3YXlzIHVz +ZSB4ZnJlZSgpIGluc3RlYWQgb2YgZnJlZSgpLiAgSWYgaXQgaXMgbm90IGVhc3kg +dG8gc2VlCiAgICB0aGF0IHRoZSBmcmVlZCB2YXJpYWJsZSBpcyBub3QgYW55bW9y +ZSB1c2VkLCBleHBsaWNpdGx5IHNldCB0aGUKICAgIHZhcmlhYmxlIHRvIE5VTEwu +CiAgLSBJbml0IGZ1bmN0aW9uIGxvY2FsIHZhcmlhYmxlcyBvbmx5IGlmIG5lZWRl +ZCBzbyB0aGF0IHRoZSBjb21waWxlcgogICAgY2FuIGRvIGEgYmV0dGVyIGpvYiBp +biBkZXRlY3RpbmcgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgd2hpY2ggbWF5CiAg +ICBpbmRpY2F0ZSBhIHByb2JsZW0gd2l0aCB0aGUgY29kZS4KICAtIE5ldmVyIGlu +aXQgc3RhdGljIG9yIGZpbGUgbG9jYWwgdmFyaWFibGVzIHRvIDAgdG8gbWFrZSBz +dXJlIHRoZXkKICAgIGVuZCB1cCBpbiBCU1MuCiAgLSBVc2UgLS1lbmFibGUtbWFp +bnRhaW5lci1tb2RlIHdpdGggY29uZmlndXJlLgoKKioqIEM5OSBsYW5ndWFnZSBm +ZWF0dXJlcwoKICBJbiBHbnVQRyAyLngsIGJ1dCAqbm90IGluIDEuNCogYW5kIG5v +dCBpbiBtb3N0IGxpYnJhcmllcywgYSBsaW1pdGVkCiAgc2V0IG9mIEM5OSBmZWF0 +dXJlcyBtYXkgYmUgdXNlZDoKCiAgLSBWYXJpYWRpYyBtYWNyb3M6CiAgICA6ICNk +ZWZpbmUgZm9vKGEsLi4uKSAgYmFyKGEsIF9fVkFfQVJHU19fKQoKICAtIFRoZSBw +cmVkZWZpbmVkIG1hY3JvID1fX2Z1bmNfXz06CiAgICA6IGxvZ19kZWJ1ZyAoIiVz +OiBQcm9ibGVtIHdpdGggZm9vXG4iLCBfX2Z1bmNfXyk7CgogIC0gVmFyaWFibGUg +ZGVjbGFyYXRpb24gaW5zaWRlIGEgZm9yKCk6CiAgICA6IGZvciAoaW50IGkgPSAw +OyBpIDwgNTsgKyspCiAgICA6ICAgYmFyIChpKTsKCiAgQWx0aG91Z2ggd2UgdXN1 +YWxseSBtYWtlIHVzZSBvZiB0aGUgPXUxNj0sID11MzI9LCBhbmQgPXU2ND0gdHlw +ZXMsCiAgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbmNsdWRlID08c3RkaW50Lmg+ +PSBhbmQgdXNlID1pbnQxNl90PSwKICA9aW50MzJfdD0sID1pbnQ2NF90PSwgPXVp +bnQxNl90PSwgPXVpbnQzMl90PSwgYW5kID11aW50NjRfdD0uICBCdXQgZG8KICBu +b3QgdXNlID1pbnQ4X3Q9IG9yID11aW50OF90PS4KCioqIENvbW1pdCBsb2cga2V5 +d29yZHMKCiAgLSBHbnVQRy1idWctaWQgOjogVmFsdWVzIGFyZSBjb21tYSBvciBz +cGFjZSBkZWxpbWl0ZWQgYnVnIG51bWJlcnMKICAgICAgICAgICAgICAgICAgICBm +cm9tIGJ1Zy5nbnVwZy5vcmcgcGVydGFpbmluZyB0byB0aGlzIGNvbW1pdC4KICAt +IERlYmlhbi1idWctaWQgOjogU2FtZSBhcyBhYm92ZSBidXQgZnJvbSB0aGUgRGVi +aWFuIGJ1ZyB0cmFja2VyLgogIC0gQ1ZFLWlkIDo6IENWRSBpZCBudW1iZXIgcGVy +dGFpbmluZyB0byB0aGlzIGNvbW1pdC4KICAtIFJlZ3Jlc3Npb24tZHVlLXRvIDo6 +IENvbW1pdCBpZCBvZiB0aGUgcmVncmVzc2lvbiBmaXhlZCBieSB0aGlzIGNvbW1p +dC4KICAtIEZpeGVzLWNvbW1pdCA6OiBDb21taXQgaWQgdGhpcyBjb21taXQgZml4 +ZXMuCiAgLSBSZXBvcnRlZC1ieSA6OiBWYWx1ZSBpcyBhIG5hbWUgb3IgbWFpbCBh +ZGRyZXNzIG9mIGEgYnVnIHJlcG9ydGUuCiAgLSBTdWdnZXN0ZWQtYnkgOjogVmFs +dWUgaXMgYSBuYW1lIG9yIG1haWwgYWRkcmVzcyBvZiBzb21lb25lIGhvdwogICAg +ICAgICAgICAgICAgICAgIHN1Z2dlc3RlZCB0aGlzIGNoYW5nZS4KICAtIENvLWF1 +dGhvcmVkLWJ5IDo6IE5hbWUgb3IgbWFpbCBhZGRyZXNzIG9mIGEgY28tYXV0aG9y +CiAgLSBTb21lLWNvbW1lbnRzLWJ5IDo6IE5hbWUgb3IgbWFpbCBhZGRyZXNzIG9m +IHRoZSBhdXRob3Igb2YKICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25h +bCBjb21tZW50cyAoY29tbWl0IGxvZyBvciBjb2RlKS4KICAtIFByb29mcmVhZC1i +eSA6OiBTb21ldGltZXMgdXNlZCBieSB0cmFuc2xhdGlvbiBjb21taXRzLgogIC0g +U2lnbmVkLW9mZi1ieSA6OiBOYW1lIG9yIG1haWwgYWRkcmVzcyBvZiB0aGUgZGV2 +ZWxvcGVyCgoqIFdpbmRvd3MKKiogSG93IHRvIGJ1aWxkIGFuIGluc3RhbGxlciBm +b3IgV2luZG93cwoKICAgWW91ciBiZXN0IGJldCBpcyB0byB1c2UgYSBkZWNlbnQg +RGViaWFuIFN5c3RlbSBmb3IgZGV2ZWxvcG1lbnQuCiAgIFlvdSBuZWVkIHRvIGlu +c3RhbGwgYSBsb25nIGxpc3Qgb2YgdG9vbHMgZm9yIGJ1aWxkaW5nLiAgVGhpcyBs +aXN0CiAgIHN0aWxsIG5lZWRzIHRvIGJlIGNvbXBpbGVkLiAgSG93ZXZlciwgdGhl +IGJ1aWxkIHByb2Nlc3Mgd2lsbCBzdG9wCiAgIGlmIGEgdG9vbCBpcyBtaXNzaW5n +LiAgR05VIG1ha2UgaXMgcmVxdWlyZWQgKG9uIG5vbiBHTlUgc3lzdGVtcwogICBv +ZnRlbiBpbnN0YWxsZWQgYXMgImdtYWtlIikuICBUaGUgaW5zdGFsbGVyIHJlcXVp +cmVzIGEgY291cGxlIG9mCiAgIGV4dHJhIHNvZnR3YXJlIHRvIGJlIGF2YWlsYWJs +ZSBlaXRoZXIgYXMgdGFyYmFsbHMgb3IgYXMgbG9jYWwgZ2l0CiAgIHJlcG9zaXRv +cmllcy4gIEluIGNhc2UgdGhpcyBmaWxlIGhlcmUgaXMgcGFydCBvZiBhIGdudXBn +LXczMi0yLioueHoKICAgY29tcGxldGUgdGFyYmFsbCBhcyBkaXN0cmlidXRlZCBm +cm9tIHRoZSBzYW1lIHBsYWNlIGFzIGEgYmluYXJ5CiAgIGluc3RhbGxlciwgYWxs +IHN1Y2ggdGFyYmFsbHMgYXJlIGFscmVhZHkgaW5jbHVkZWQuCgogICBDZCB0byB0 +aGUgR251UEcgc291cmNlIGRpcmVjdG9yeSBhbmQgdXNlIG9uZSBvZiBvbmUgb2Yg +dGhlc2UKICAgY29tbWFuZDoKCiAgIC0gSWYgc291cmNlcyBhcmUgaW5jbHVkZWQg +KGdudXBnLXczMi0qLnRhci54eikKCiAgICAgbWFrZSAtZiBidWlsZC1hdXgvc3Bl +ZWRvLm1rIFdIQVQ9dGhpcyBpbnN0YWxsZXIKCiAgIC0gVG8gYnVpbGQgZnJvbSB0 +YXJiYWxscwoKICAgICBtYWtlIC1mIGJ1aWxkLWF1eC9zcGVlZG8ubWsgV0hBVD1y +ZWxlYXNlIFRBUkJBTExTPVRBUkRJUiBpbnN0YWxsZXIKCiAgIC0gVG8gYnVpbGQg +ZnJvbSBsb2NhbCBHSVQgcmVwb3MKCiAgICAgbWFrZSAtZiBidWlsZC1hdXgvc3Bl +ZWRvLm1rIFdIQVQ9Z2l0IFRBUkJBTExTPVRBUkRJUiBpbnN0YWxsZXIKCiAgIE5v +dGUgdGhhdCBhbHNvIHlvdSBuZWVkIHRvIHN1cHBseSB0YXJiYWxscyB3aXRoIHN1 +cHBvcnRpbmcKICAgbGlicmFyaWVzIGV2ZW4gaWYgeW91IGJ1aWxkIGZyb20gZ2l0 +LiAgVGhlIG1ha2VmaWxlIGV4cGVjdHMgb25seQogICB0aGUgY29yZSBHbnVQRyBz +b2Z0d2FyZSB0byBiZSBhdmFpbGFibGUgYXMgbG9jYWwgR0lUIHJlcG9zaXRvcmll +cy4KICAgc3BlZWRvLm1rIGhhcyB0aGUgdmVyc2lvbnMgb2YgdGhlIHRhcmJhbGxz +IGFuZCB0aGUgYnJhbmNoIG5hbWVzIG9mCiAgIHRoZSBnaXQgcmVwb3NpdG9yaWVz +LiAgSW4gY2FzZSBvZiBwcm9ibGVtcywgZG9uJ3QgaGVzaXRhdGUgdG8gYXNrCiAg +IG9uIHRoZSBnbnVwZy1kZXZlbCBtYWlsaW5nIGZvciBoZWxwLgoKKiBEZWJ1ZyBo +aW50cwoKICBTZWUgdGhlIG1hbnVhbCBmb3Igc29tZSBoaW50cy4KCiogU3RhbmRh +cmRzCioqIFJGQ3MKCjE0MjMgIFByaXZhY3kgRW5oYW5jZW1lbnQgZm9yIEludGVy +bmV0IEVsZWN0cm9uaWMgTWFpbDoKICAgICAgUGFydCBJSUk6IEFsZ29yaXRobXMs +IE1vZGVzLCBhbmQgSWRlbnRpZmllcnMuCgoxNDg5ICBSZWdpc3RyYXRpb24gb2Yg +YSBDeXJpbGxpYyBDaGFyYWN0ZXIgU2V0LgoKMTc1MCAgUmFuZG9tbmVzcyBSZWNv +bW1lbmRhdGlvbnMgZm9yIFNlY3VyaXR5LgoKMTk5MSAgUEdQIE1lc3NhZ2UgRXhj +aGFuZ2UgRm9ybWF0cyAob2Jzb2xldGUpCgoyMTQ0ICBUaGUgQ0FTVC0xMjggRW5j +cnlwdGlvbiBBbGdvcml0aG0uCgoyMjc5ICBVVEYtOCwgYSB0cmFuc2Zvcm1hdGlv +biBmb3JtYXQgb2YgSVNPIDEwNjQ2LgoKMjQ0MCAgT3BlblBHUCAob2Jzb2xldGUp +LgoKMzE1NiAgTUlNRSBTZWN1cml0eSB3aXRoIFByZXR0eSBHb29kIFByaXZhY3kg +KFBHUCkuCgo0ODgwICBDdXJyZW50IE9wZW5QR1Agc3BlY2lmaWNhdGlvbi4KCjYz +MzcgIEVsbGlwdGljIEN1cnZlIENyeXB0b2dyYXBoeSAoRUNDKSBpbiBPcGVuUEdQ +CgoqIFZhcmlvdXMgaW5mb3JtYXRpb24KCioqIERpcmVjdG9yeSBMYXlvdXQKCiAg +LSAuLwkgICAgICA6OiBSZWFkbWUsIGNvbmZpZ3VyZQogIC0gLi9hZ2VudCAgIDo6 +IEdwZy1hZ2VudCBhbmQgcmVsYXRlZCB0b29scwogIC0gLi9kb2MgICAgIDo6IERv +Y3VtZW50YXRpb24KICAtIC4vZzEwICAgICA6OiBHcGcgcHJvZ3JhbSBoZXJlIGNh +bGxlZCBncGcyCiAgLSAuL3NtICAgICAgOjogR3Bnc20gcHJvZ3JhbQogIC0gLi9q +bmxpYiAgIDo6IE5vdCB1c2VkIChmb3JtZXJseSB1c2VkIHV0aWxpdHkgZnVuY3Rp +b25zKQogIC0gLi9jb21tb24gIDo6IFV0aWxpdHkgZnVuY3Rpb25zCiAgLSAuL2ti +eCAgICAgOjogS2V5Ym94IGxpYnJhcnkKICAtIC4vc2NkICAgICA6OiBTbWFydGNh +cmQgZGFlbW9uCiAgLSAuL3NjcmlwdHMgOjogU2NyaXB0cyBuZWVkZWQgYnkgY29u +ZmlndXJlIGFuZCBvdGhlcnMKICAtIC4vZGlybW5nciA6OiBUaGUgZGlyZWN0b3J5 +IG1hbmFnZXIKCioqIERldGFpbGVkIFJvYWRtYXAKCiAgVGhpcyBsaXN0IG9mIGZp +bGVzIGlzIG5vdCB1cCB0byBkYXRlIQoKICAtIGcxMC9ncGcuYyA6OiBNYWluIG1v +ZHVsZSB3aXRoIG9wdGlvbiBwYXJzaW5nIGFuZCBhbGwgdGhlIHN0dWZmIHlvdQog +ICAgICAgICAgICAgICAgIGhhdmUgdG8gZG8gb24gc3RhcnR1cC4gIEFsc28gaGFz +IHRoZSBleGl0IGhhbmRsZXIgYW5kCiAgICAgICAgICAgICAgICAgc29tZSBoZWxw +ZXIgZnVuY3Rpb25zLgoKICAtIGcxMC9wYXJzZS1wYWNrZXQuYyA6OgogIC0gZzEw +L2J1aWxkLXBhY2tldC5jIDo6CiAgLSBnMTAvZnJlZS1wYWNrZXQuYyA6OiBQYXJz +aW5nIGFuZCBjcmVhdGluZyBvZiBPcGVuUEdQIG1lc3NhZ2UgcGFja2V0cy4KCiAg +LSBnMTAvZ2V0a2V5LmMgICA6OiBLZXkgc2VsZWN0aW9uIGNvZGUKICAtIGcxMC9w +a2NsaXN0LmMgIDo6IEJ1aWxkIGEgbGlzdCBvZiBwdWJsaWMga2V5cwogIC0gZzEw +L3NrY2xpc3QuYyAgOjogQnVpbGQgYSBsaXN0IG9mIHNlY3JldCBrZXlzCiAgLSBn +MTAva2V5cmluZy5jICA6OiBLZXlyaW5nIGFjY2VzcyBmdW5jdGlvbnMKICAtIGcx +MC9rZXlkYi5oICAgIDo6CgogIC0gZzEwL2tleWlkLmMJICA6OiBIZWxwZXIgZnVu +Y3Rpb25zIHRvIGdldCB0aGUga2V5aWQsIGZpbmdlcnByaW50IGV0Yy4KCiAgLSBn +MTAvdHJ1c3RkYi5jIDo6IFdlYi1vZi1UcnVzdCBjb21wdXRhdGlvbnMKICAtIGcx +MC90cnVzdGRiLmggOjoKICAtIGcxMC90ZGJkdW1wLmMgOjogRXhwb3J0L2ltcG9y +dC9saXN0IHRoZSB0cnVzdGRiLmdwZwogIC0gZzEwL3RkYmlvLmMgICA6OiBJL08g +aGFuZGxpbmcgZm9yIHRoZSB0cnVzdGRiLmdwZwogIC0gZzEwL3RkYmlvLmggICA6 +OgoKICAtIGcxMC9jb21wcmVzcy5jIDo6IEZpbHRlciB0byBoYW5kbGUgY29tcHJl +c3Npb24KICAtIGcxMC9maWx0ZXIuaCAgIDo6IERlY2xhcmF0aW9ucyBmb3IgYWxs +IGZpbHRlciBmdW5jdGlvbnMKICAtIGcxMC9kZWxrZXkuYyAgIDo6IERlbGV0ZSBh +IGtleQogIC0gZzEwL2tibm9kZS5jICAgOjogSGVscGVyIGZvciB0aGUga2Jub2Rl +X3QgbGlua2VkIGxpc3QKICAtIGcxMC9tYWluLmggICAgIDo6IFByb3RvdHlwZXMg +YW5kIHNvbWUgY29uc3RhbnRzCiAgLSBnMTAvbWFpbnByb2MuYyA6OiBNZXNzYWdl +IHByb2Nlc3NpbmcKICAtIGcxMC9hcm1vci5jICAgIDo6IEFzY2lpIGFybW9yIGZp +bHRlcgogIC0gZzEwL21kZmlsdGVyLmMgOjogRmlsdGVyIHRvIGNhbGN1bGF0ZSBo +YXNocwogIC0gZzEwL3RleHRmaWx0ZXIuYyA6OiBGaWx0ZXIgdG8gaGFuZGxlIENS +L0xGIGFuZCB0cmFpbGluZyB3aGl0ZSBzcGFjZQogIC0gZzEwL2NpcGhlci5jICAg +OjogRW4tL0RlY3J5cHRpb24gZmlsdGVyCiAgLSBnMTAvbWlzYy5jICAgICA6OiBV +dGxpdHkgZnVuY3Rpb25zCiAgLSBnMTAvb3B0aW9ucy5oICA6OiBTdHJ1Y3R1cmUg +d2l0aCBhbGwgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zCiAgICAgICAgICAgICAg +ICAgICAgICBhbmQgcmVsYXRlZCBjb25zdGFudHMKICAtIGcxMC9vcGVuZmlsZS5j +IDo6IENyZWF0ZS9PcGVuIEZpbGVzCiAgLSBnMTAva2V5c2VydmVyLmggOjogS2V5 +c2VydmVyIGFjY2VzcyBkaXNwYXRjaGVyLgogIC0gZzEwL3BhY2tldC5oICAgOjog +RGVmaW50aW9uIG9mIE9wZW5QR1Agc3RydWN0dXJlcy4KICAtIGcxMC9wYXNzcGhy +YXNlLmMgOjogUGFzc3BocmFzZSBoYW5kbGluZyBjb2RlCgogIC0gZzEwL3B1Ymtl +eS1lbmMuYyA6OiBQcm9jZXNzIGEgcHVibGljIGtleSBlbmNvZGVkIHBhY2tldC4K +ICAtIGcxMC9zZWNrZXktY2VydC5jIDo6IE5vdCBhbnltb3JlIHVzZWQKICAtIGcx +MC9zZXNrZXkuYyAgICAgOjogTWFrZSBzZXNzc2lvbiBrZXlzIGV0Yy4KICAtIGcx +MC9pbXBvcnQuYyAgICAgOjogSW1wb3J0IGtleXMgaW50byBvdXIga2V5IHN0b3Jh +Z2UuCiAgLSBnMTAvZXhwb3J0LmMgICAgIDo6IEV4cG9ydCBrZXlzIHRvIHRoZSBP +cGVuUEdQIGZvcm1hdC4KICAtIGcxMC9zaWduLmMgICAgICAgOjogQ3JlYXRlIHNp +Z25hdHVyZSBhbmQgb3B0aW9uYWxseSBlbmNyeXB0LgogIC0gZzEwL3BsYWludGV4 +dC5jICA6OiBQcm9jZXNzIHBsYWludGV4dCBwYWNrZXRzLgogIC0gZzEwL2RlY3J5 +cHQtZGF0YS5jIDo6IERlY3J5cHQgYW4gZW5jcnlwdGVkIGRhdGEgcGFja2V0CiAg +LSBnMTAvZW5jcnlwdC5jICAgIDo6IE1haW4gZW5jcnlwdGlvbiBkcml2ZXIKICAt +IGcxMC9yZXZva2UuYyAgICAgOjogQ3JlYXRlIHJlY292YXRpb24gY2VydGlmaWNh +dGVzLgogIC0gZzEwL2tleWxpc3QuYyAgICA6OiBQcmludCBpbmZvcm1hdGlvbiBh +Ym91dCBPcGVuUEdQIGtleXMKICAtIGcxMC9zaWctY2hlY2suYyAgOjogQ2hlY2sg +YSBzaWduYXR1cmUKICAtIGcxMC9oZWxwdGV4dC5jICAgOjogU2hvdyBvbmxpbmUg +aGVscCB0ZXh0cwogIC0gZzEwL3ZlcmlmeS5jICAgICA6OiBWZXJpZnkgc2lnbmVk +IGRhdGEuCiAgLSBnMTAvZGVjcnlwdC5jICAgIDo6IERlY3J5cHQgYW5kIHZlcmlm +eSBkYXRhLgogIC0gZzEwL2tleWVkaXQuYyAgICA6OiBFZGl0IHByb3BlcnRpZXMg +b2YgYSBrZXkuCiAgLSBnMTAvZGVhcm1vci5jICAgIDo6IEFybW9yIHV0aWxpdHku +CiAgLSBnMTAva2V5Z2VuLmMgICAgIDo6IEdlbmVyYXRlIGEga2V5IHBhaXIKCioq +IE1lbW9yeSBhbGxvY2F0aW9uCgpVc2Ugb25seSB0aGUgZnVuY3Rpb25zOgoKIC0g +eG1hbGxvYwogLSB4bWFsbG9jX3NlY3VyZQogLSB4dHJ5bWFsbG9jCiAtIHh0cnlt +YWxsb2Nfc2VjdXJlCiAtIHhjYWxsb2MKIC0geGNhbGxvY19zZWN1cmUKIC0geHRy +eWNhbGxvYwogLSB4dHJ5Y2FsbG9jX3NlY3VyZQogLSB4cmVhbGxvYwogLSB4dHJ5 +cmVhbGxvYwogLSB4c3RyZHVwCiAtIHh0cnlzdHJkdXAKIC0geGZyZWUKCgpUaGUg +KnNlY3VyZSB2ZXJzaW9ucyBhbGxvY2F0ZSBtZW1vcnkgaW4gdGhlIHNlY3VyZSBt +ZW1vcnkuICBUaGF0IGlzLApzd2FwcGluZyBvdXQgb2YgdGhpcyBtZW1vcnkgaXMg +YXZvaWRlZCBhbmQgaXMgZ2V0cyBvdmVyd3JpdHRlbiBvbgpmcmVlLiAgVXNlIHRo +aXMgZm9yIHBhc3NwaHJhc2VzLCBzZXNzaW9uIGtleXMgYW5kIG90aGVyIHNlbnNp +dGl2ZQptYXRlcmlhbC4gIFRoaXMgbWVtb3J5IHNldCBhc2lkZSBmb3Igc2VjdXJl +IG1lbW9yeSBpcyBsaW5pdGVkIHRvIGEgZmV3CmsuICBJbiBnZW5lcmFsIHRoZSBm +dW5jdGlvbiBkb24ndCBwcmludCBhIG1lbWVvcnkgbWVzc2FnZSBhbmQKdGVybWlu +YXRlIHRoZSBwcm9jZXNzIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGF2 +YWlsYWJsZS4gIFRoZQoidHJ5IiB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zIHJl +dHVybiBOVUxMIGluc3RlYWQuCgoqKiBMb2dnaW5nCgogVE9ETwoKKiogT3B0aW9u +IHBhcnNpbmcKCkdudVBHIGRvZXMgbm90IHVzZSBnZXRvcHQgb3IgR05VIGdldG9w +dCBidXQgZnVuY3Rpb25zIG9mIGl0J3Mgb3duLgpTZWUgdXRpbC9hcmdwYXJzZS5j +IGZvciBkZXRhaWxzLiAgVGhlIGFkdmFudGFnZSBvZiB0aGVzZSBmdW5jdGlvbnMg +aXMKdGhhdCBpdCBpcyBtb3JlIGVhc3kgdG8gZGlzcGxheSBhbmQgbWFpbnRhaW4g +dGhlIGhlbHAgdGV4dHMgZm9yIHRoZQpvcHRpb25zLiAgVGhlIHNhbWUgb3B0aW9u +IHRhYmxlIGlzIGFsc28gdXNlZCB0byBwYXJzZSByZXNvdXJjZSBmaWxlcy4KCioq +IFdoYXQgaXMgYW4gSU9CVUYKClRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHVz +ZWQgZm9yIG1vc3QgSS9PIG9mIGdudXBnLiBJdCBpcyBzaW1pbGFyCnRvIFN5c3Rl +bcKgViBTdHJlYW1zIGJ1dCBtdWNoIHNpbXBsZXIuICBCZWNhdXNlIE9wZW5QR1Ag +bWVzc2FnZXMgYXJlCm5lc3RlZCBpbiBkaWZmZXJlbnQgd2F5czsgdGhlIHVzZSBv +ZiBzdWNoIGEgc3lzdGVtIGhhcyBiaWcgYWR2YW50YWdlcy4KSGVyZSBpcyBhbiBl +eGFtcGxlLCBob3cgaXQgd29ya3M6IElmIHRoZSBwYXJzZXIgc2VlcyBhIHBhY2tl +dCBoZWFkZXIKd2l0aCBhIHBhcnRpYWwgbGVuZ3RoLCBpdCBwdXNoZXMgdGhlIGJs +b2NrX2ZpbHRlciBvbnRvIHRoZSBJT0JVRiB0bwpoYW5kbGUgdGhlc2UgcGFydGlh +bCBsZW5ndGggcGFja2V0czogZnJvbSBub3cgb24geW91IGRvbid0IGhhdmUgdG8K +d29ycnkgYWJvdXQgdGhpcy4gIFdoZW4gaXQgc2VlcyBhIGNvbXByZXNzZWQgcGFj +a2V0IGl0IHB1c2hlcyB0aGUKdW5jb21wcmVzcyBmaWx0ZXIgYW5kIHRoZSBuZXh0 +IHJlYWQgYnl0ZSBpcyBvbmUgd2hpY2ggaGFzIGFscmVhZHkgYmVlbgp1bmNvbXBy +ZXNzZWQgYnkgdGhpcyBmaWx0ZXIuIFNhbWUgZ29lcyBmb3IgZW5jaXBoZXJlZCBw +YWNrZXQsCnBsYWludGV4dCBwYWNrZXRzIGFuZCBzbyBvbi4gIFRoZSBmaWxlIGcx +MC9lbmNvZGUuYyBtaWdodCBiZSBhIGdvb2QKc3RhcnRpbmcgcG9pbnQgdG8gc2Vl +IGhvdyBpdCBpcyB1c2VkIC0gYWN0dWFsbHkgdGhpcyBpcyB0aGUgb3RoZXIgd2F5 +Ogpjb25zdHJ1Y3RpbmcgbWVzc2FnZXMgdXNpbmcgcHVzaGVkIGZpbHRlcnMgYnV0 +IGl0IG1heSBiZSBlYXNpZXIgdG8KdW5kZXJzdGFuZC4KCgojIGRvYy9ERVRBSUxT +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +LSotIG9yZyAtKi0KIytUSVRMRTogR251UEcgRGV0YWlscwojIEdsb2JhbGx5IGRp +c2FibGUgc3VwZXJzY3JpcHRzIGFuZCBzdWJzY3JpcHRzOgojK09QVElPTlM6IF46 +e30KIwoKIyBOb3RlOiBUaGlzIGZpbGUgdXNlcyBvcmctbW9kZTsgaXQgc2hvdWxk +IGJlIGVhc3kgdG8gcmVhZCBhcyBwbGFpbgojIHRleHQgYnV0IGJlIGF3YXJlIG9m +IHNvbWUgbWFya3VwIHBlY3VsaWFyaXRpZXM6IFZlcmJhdGltIGNvZGUgaXMKIyBl +bmNsb3NlZCBpbiAjK2JlZ2luLWV4YW1wbGUsICMrZW5kLWV4YW1wbGUgYmxvY2tz +IG9yIG1hcmtlZCBieSBhCiMgY29sb24gYXMgdGhlIGZpcnN0IG5vbi13aGl0ZS1z +cGFjZSBjaGFyYWN0ZXIsIHdvcmRzIGJyYWNrZXRlZCB3aXRoCiMgZXF1YWwgc2ln +bnMgaW5kaWNhdGUgYSBtb25vc3BhY2UgZm9udCwgYW5kIHRoZSB1c3VhbCAvaXRh +bGljcy8sCiMgKmJvbGQqLCBhbmQgX3VuZGVybGluZV8gY29udmVudGlvbnMgYXJl +IHJlY29nbml6ZWQuCgpUaGlzIGlzIHRoZSBERVRBSUxTIGZpbGUgZm9yIEdudVBH +IHdoaWNoIHNwZWNpZmllcyBzb21lIGludGVybmFscyBhbmQKcGFydHMgb2YgdGhl +IGV4dGVybmFsIEFQSSBmb3IgR1BHIGFuZCBHUEdTTS4KCiogRm9ybWF0IG9mIHRo +ZSBjb2xvbiBsaXN0aW5ncwogIFRoZSBmb3JtYXQgaXMgYSBiYXNlZCBvbiBjb2xv +biBzZXBhcmF0ZWQgcmVjb3JkLCBlYWNoIHJlY29kcyBzdGFydHMKICB3aXRoIGEg +dGFnIHN0cmluZyBhbmQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLiAg +SGVyZSBpcyBhbgogIGV4YW1wbGU6CiMrYmVnaW5fZXhhbXBsZQokIGdwZyAtLXdp +dGgtY29sb25zIC0tbGlzdC1rZXlzIFwKICAgICAgLS13aXRoLWZpbmdlcnByaW50 +IC0td2l0aC1maW5nZXJwcmludCB3a0BnbnVwZy5vcmcKcHViOmY6MTAyNDoxNzo2 +QzdFRTFCODYyMUNDMDEzOjg5OTgxNzcxNToxMDU1ODk4MjM1OjptOjo6c2NFU0M6 +CmZwcjo6Ojo6Ojo6OkVDQUY3NTkwRUIzNDQzQjVDN0NGM0FDQjZDN0VFMUI4NjIx +Q0MwMTM6CnVpZDpmOjo6Ojo6OjpXZXJuZXIgS29jaCA8d2tAZzEwY29kZS5jb20+ +Ogp1aWQ6Zjo6Ojo6Ojo6V2VybmVyIEtvY2ggPHdrQGdudXBnLm9yZz46CnN1Yjpm +OjE1MzY6MTY6MDZBRDIyMkNBREY2QTZFMTo5MTk1Mzc0MTY6MTAzNjE3NzQxNjo6 +Ojo6ZToKZnByOjo6Ojo6Ojo6Q0Y4QkNDNEIxOERFMDhGQ0Q4QTE2MTU5MDZBRDIy +MkNBREY2QTZFMToKc3ViOnI6MTUzNjoyMDo1Q0UwODZCNUI1QTE4RkY0Ojg5OTgx +Nzc4ODoxMDI1OTYxNzg4Ojo6Ojplc2M6CmZwcjo6Ojo6Ojo6OkFCMDU5MzU5QTNC +ODFGNDEwRkNGRjk3RjVDRTA4NkI1QjVBMThGRjQ6CiMrZW5kX2V4YW1wbGUKClRo +ZSBkb3VibGUgPS0td2l0aC1maW5nZXJwcmludD0gcHJpbnRzIHRoZSBmaW5nZXJw +cmludCBmb3IgdGhlIHN1YmtleXMKdG9vLiAgT2xkIHZlcnNpb25zIG9mIGdwZyB1 +c2VkIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm1hdCBhbmQgcmVxdWlyZWQKdGhl +IHVzZSBvZiB0aGUgb3B0aW9uID0tLWZpeGVkLWxpc3QtbW9kZT0gdG8gY29uZm9y +bSB0byB0aGUgZm9ybWF0CmRlc2NyaWJlZCBoZXJlLgoKKiogRGVzY3JpcHRpb24g +b2YgdGhlIGZpZWxkcwoqKiogRmllbGQgMSAtIFR5cGUgb2YgcmVjb3JkCgogICAg +LSBwdWIgOjogUHVibGljIGtleQogICAgLSBjcnQgOjogWC41MDkgY2VydGlmaWNh +dGUKICAgIC0gY3JzIDo6IFguNTA5IGNlcnRpZmljYXRlIGFuZCBwcml2YXRlIGtl +eSBhdmFpbGFibGUKICAgIC0gc3ViIDo6IFN1YmtleSAoc2Vjb25kYXJ5IGtleSkK +ICAgIC0gc2VjIDo6IFNlY3JldCBrZXkKICAgIC0gc3NiIDo6IFNlY3JldCBzdWJr +ZXkgKHNlY29uZGFyeSBrZXkpCiAgICAtIHVpZCA6OiBVc2VyIGlkIChvbmx5IGZp +ZWxkIDEwIGlzIHVzZWQpLgogICAgLSB1YXQgOjogVXNlciBhdHRyaWJ1dGUgKHNh +bWUgYXMgdXNlciBpZCBleGNlcHQgZm9yIGZpZWxkIDEwKS4KICAgIC0gc2lnIDo6 +IFNpZ25hdHVyZQogICAgLSByZXYgOjogUmV2b2NhdGlvbiBzaWduYXR1cmUKICAg +IC0gZnByIDo6IEZpbmdlcnByaW50IChmaW5nZXJwcmludCBpcyBpbiBmaWVsZCAx +MCkKICAgIC0gcGtkIDo6IFB1YmxpYyBrZXkgZGF0YSBbKl0KICAgIC0gZ3JwIDo6 +IEtleWdyaXAKICAgIC0gcnZrIDo6IFJldm9jYXRpb24ga2V5CiAgICAtIHRydSA6 +OiBUcnVzdCBkYXRhYmFzZSBpbmZvcm1hdGlvbiBbKl0KICAgIC0gc3BrIDo6IFNp +Z25hdHVyZSBzdWJwYWNrZXQgWypdCiAgICAtIGNmZyA6OiBDb25maWd1cmF0aW9u +IGRhdGEgWypdCgogICAgUmVjb3JkcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayBh +cmUgZGVzY3JpYmVkIGF0IFtbKlNwZWNpYWwlMjBmaWVsZCUyMGZvcm1hdHNdWypT +cGVjaWFsIGZpZWxkc11dLgoKKioqIEZpZWxkIDIgLSBWYWxpZGl0eQoKICAgIFRo +aXMgaXMgYSBsZXR0ZXIgZGVzY3JpYmluZyB0aGUgY29tcHV0ZWQgdmFsaWRpdHkg +b2YgYSBrZXkuCiAgICBDdXJyZW50bHkgdGhpcyBpcyBhIHNpbmdsZSBsZXR0ZXIs +IGJ1dCBiZSBwcmVwYXJlZCB0aGF0IGFkZGl0aW9uYWwKICAgIGluZm9ybWF0aW9u +IG1heSBmb2xsb3cgaW4gc29tZSBmdXR1cmUgdmVyc2lvbnMuIE5vdGUgdGhhdCBH +bnVQRyA8CiAgICAyLjEgZG9lcyBub3Qgc2V0IHRoaXMgZmllbGQgZm9yIHNlY3Jl +dCBrZXkgbGlzdGluZ3MuCgogICAgLSBvIDo6IFVua25vd24gKHRoaXMga2V5IGlz +IG5ldyB0byB0aGUgc3lzdGVtKQogICAgLSBpIDo6IFRoZSBrZXkgaXMgaW52YWxp +ZCAoZS5nLiBkdWUgdG8gYSBtaXNzaW5nIHNlbGYtc2lnbmF0dXJlKQogICAgLSBk +IDo6IFRoZSBrZXkgaGFzIGJlZW4gZGlzYWJsZWQKCSAgIChkZXByZWNhdGVkIC0g +dXNlIHRoZSAnRCcgaW4gZmllbGQgMTIgaW5zdGVhZCkKICAgIC0gciA6OiBUaGUg +a2V5IGhhcyBiZWVuIHJldm9rZWQKICAgIC0gZSA6OiBUaGUga2V5IGhhcyBleHBp +cmVkCiAgICAtIC0gOjogVW5rbm93biB2YWxpZGl0eSAoaS5lLiBubyB2YWx1ZSBh +c3NpZ25lZCkKICAgIC0gcSA6OiBVbmRlZmluZWQgdmFsaWRpdHkuICAnLScgYW5k +ICdxJyBtYXkgc2FmZWx5IGJlIHRyZWF0ZWQgYXMKICAgICAgICAgICB0aGUgc2Ft +ZSB2YWx1ZSBmb3IgbW9zdCBwdXJwb3NlcwogICAgLSBuIDo6IFRoZSBrZXkgaXMg +bm90IHZhbGlkCiAgICAtIG0gOjogVGhlIGtleSBpcyBtYXJnaW5hbCB2YWxpZC4K +ICAgIC0gZiA6OiBUaGUga2V5IGlzIGZ1bGx5IHZhbGlkCiAgICAtIHUgOjogVGhl +IGtleSBpcyB1bHRpbWF0ZWx5IHZhbGlkLiAgVGhpcyBvZnRlbiBtZWFucyB0aGF0 +IHRoZQogICAgICAgICAgIHNlY3JldCBrZXkgaXMgYXZhaWxhYmxlLCBidXQgYW55 +IGtleSBtYXkgYmUgbWFya2VkIGFzCiAgICAgICAgICAgdWx0aW1hdGVseSB2YWxp +ZC4KICAgIC0gdyA6OiBUaGUga2V5IGhhcyBhIHdlbGwga25vd24gcHJpdmF0ZSBw +YXJ0LgogICAgLSBzIDo6IFRoZSBrZXkgaGFzIHNwZWNpYWwgdmFsaWRpdHkuICBU +aGlzIG1lYW5zIHRoYXQgaXQgbWlnaHQgYmUKICAgICAgICAgICBzZWxmLXNpZ25l +ZCBhbmQgZXhwZWN0ZWQgdG8gYmUgdXNlZCBpbiB0aGUgU1RFRUQgc3l0ZW0uCgog +ICAgSWYgdGhlIHZhbGlkaXR5IGluZm9ybWF0aW9uIGlzIGdpdmVuIGZvciBhIFVJ +RCBvciBVQVQgcmVjb3JkLCBpdAogICAgZGVzY3JpYmVzIHRoZSB2YWxpZGl0eSBj +YWxjdWxhdGVkIGJhc2VkIG9uIHRoaXMgdXNlciBJRC4gIElmIGdpdmVuCiAgICBm +b3IgYSBrZXkgcmVjb3JkIGl0IGRlc2NyaWJlcyB0aGUgdmFsaWRpdHkgdGFrZW4g +ZnJvbSB0aGUgYmVzdAogICAgcmF0ZWQgdXNlciBJRC4KCiAgICBGb3IgWC41MDkg +Y2VydGlmaWNhdGVzIGEgJ3UnIGlzIHVzZWQgZm9yIGEgdHJ1c3RlZCByb290CiAg +ICBjZXJ0aWZpY2F0ZSAoaS5lLiBmb3IgdGhlIHRydXN0IGFuY2hvcikgYW5kIGFu +ICdmJyBmb3IgYWxsIG90aGVyCiAgICB2YWxpZCBjZXJ0aWZpY2F0ZXMuCgoqKiog +RmllbGQgMyAtIEtleSBsZW5ndGgKCiAgICBUaGUgbGVuZ3RoIG9mIGtleSBpbiBi +aXRzLgoKKioqIEZpZWxkIDQgLSBQdWJsaWMga2V5IGFsZ29yaXRobQoKICAgIFRo +ZSB2YWx1ZXMgaGVyZSBhcmUgdGhvc2UgZnJvbSB0aGUgT3BlblBHUCBzcGVjcyBv +ciBpZiB0aGV5IGFyZQogICAgZ3JlYXRoZXIgdGhhbiAyNTUgdGhlIGFsZ29yaXRo +bSBpZHMgYXMgdXNlZCBieSBMaWJnY3J5cHQuCgoqKiogRmllbGQgNSAtIEtleUlE +CgogICAgVGhpcyBpcyB0aGUgNjQgYml0IGtleWlkIGFzIHNwZWNpZmllZCBieSBP +cGVuUEdQIGFuZCB0aGUgbGFzdCA2NAogICAgYml0IG9mIHRoZSBTSEEtMSBmaW5n +ZXJwcmludCBvZiBhbiBYLjUwOSBjZXJ0aWZjaWF0ZS4KCioqKiBGaWVsZCA2IC0g +Q3JlYXRpb24gZGF0ZQoKICAgIFRoZSBjcmVhdGlvbiBkYXRlIG9mIHRoZSBrZXkg +aXMgZ2l2ZW4gaW4gVVRDLiAgRm9yIFVJRCBhbmQgVUFUCiAgICByZWNvcmRzLCB0 +aGlzIGlzIHVzZWQgZm9yIHRoZSBzZWxmLXNpZ25hdHVyZSBkYXRlLiAgTm90ZSB0 +aGF0IHRoZQogICAgZGF0ZSBpcyB1c2FsbHkgcHJpbnRlZCBpbiBzZWNvbmRzIHNp +bmNlIGVwb2NoLCBob3dldmVyLCB3ZSBhcmUKICAgIG1pZ3JhdGluZyB0byBhbiBJ +U08gODYwMSBmb3JtYXQgKGUuZy4gIjE5NjYwMjA1VDA5MTUwMCIpLiAgVGhpcyBp +cwogICAgY3VycmVudGx5IG9ubHkgcmVsZXZhbnQgZm9yIFguNTA5LiAgQSBzaW1w +bGUgd2F5IHRvIGRldGVjdCB0aGUgbmV3CiAgICBmb3JtYXQgaXMgdG8gc2NhbiBm +b3IgdGhlICdUJy4gIE5vdGUgdGhhdCBvbGQgdmVyc2lvbnMgb2YgZ3BnCiAgICB3 +aXRob3V0IHVzaW5nIHRoZSA9LS1maXhlZC1saXN0LW1vZGU9IG9wdGlvbiB1c2Vk +IGEgInl5eXktbW0tdHQiCiAgICBmb3JtYXQuCgoqKiogRmllbGQgNyAtIEV4cGly +YXRpb24gZGF0ZQoKICAgIEtleSBvciBVSUQvVUFUIGV4cGlyYXRpb24gZGF0ZSBv +ciBlbXB0eSBpZiBpdCBkb2VzIG5vdCBleHBpcmUuCgoqKiogRmllbGQgOCAtIENl +cnRpZmljYXRlIFMvTiwgVUlEIGhhc2gsIHRydXN0IHNpZ25hdHVyZSBpbmZvCgog +ICAgVXNlZCBmb3Igc2VyaWFsIG51bWJlciBpbiBjcnQgcmVjb3Jkcy4gIEZvciBV +SUQgYW5kIFVBVCByZWNvcmRzLAogICAgdGhpcyBpcyBhIGhhc2ggb2YgdGhlIHVz +ZXIgSUQgY29udGVudHMgdXNlZCB0byByZXByZXNlbnQgdGhhdAogICAgZXhhY3Qg +dXNlciBJRC4gIEZvciB0cnVzdCBzaWduYXR1cmVzLCB0aGlzIGlzIHRoZSB0cnVz +dCBkZXB0aAogICAgc2VwZXJhdGVkIGJ5IHRoZSB0cnVzdCB2YWx1ZSBieSBhIHNw +YWNlLgoKKioqIEZpZWxkIDkgLSAgT3duZXJ0cnVzdAoKICAgIFRoaXMgaXMgb25s +eSB1c2VkIG9uIHByaW1hcnkga2V5cy4gIFRoaXMgaXMgYSBzaW5nbGUgbGV0dGVy +LCBidXQKICAgIGJlIHByZXBhcmVkIHRoYXQgYWRkaXRpb25hbCBpbmZvcm1hdGlv +biBtYXkgZm9sbG93IGluIGZ1dHVyZQogICAgdmVyc2lvbnMuICBGb3IgdHJ1c3Qg +c2lnbmF0dXJlcyB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uLCB0aGlzIGlzCiAg +ICB0aGUgcmVndWxhciBleHByZXNzaW9uIHZhbHVlLCBxdW90ZWQgYXMgaW4gZmll +bGQgMTAuCgoqKiogRmllbGQgMTAgLSBVc2VyLUlECiAgICBUaGUgdmFsdWUgaXMg +cXVvdGVkIGxpa2UgYSBDIHN0cmluZyB0byBhdm9pZCBjb250cm9sIGNoYXJhY3Rl +cnMKICAgICh0aGUgY29sb24gaXMgcXVvdGVkID1ceDNhPSkuICBGb3IgYSAicHVi +IiByZWNvcmQgdGhpcyBmaWVsZCBpcwogICAgbm90IHVzZWQgb24gLS1maXhlZC1s +aXN0LW1vZGUuICBBIFVBVCByZWNvcmQgcHV0cyB0aGUgYXR0cmlidXRlCiAgICBz +dWJwYWNrZXQgY291bnQgaGVyZSwgYSBzcGFjZSwgYW5kIHRoZW4gdGhlIHRvdGFs +IGF0dHJpYnV0ZQogICAgc3VicGFja2V0IHNpemUuICBJbiBncGdzbSB0aGUgaXNz +dWVyIG5hbWUgY29tZXMgaGVyZS4gIEEgRlBSCiAgICByZWNvcmQgc3RvcmVzIHRo +ZSBmaW5nZXJwcmludCBoZXJlLiAgVGhlIGZpbmdlcnByaW50IG9mIGEKICAgIHJl +dm9jYXRpb24ga2V5IGlzIHN0b3JlZCBoZXJlLgoqKiogRmllbGQgMTEgLSBTaWdu +YXR1cmUgY2xhc3MKCiAgICBTaWduYXR1cmUgY2xhc3MgYXMgcGVyIFJGQy00ODgw +LiAgVGhpcyBpcyBhIDIgZGlnaXQgaGV4bnVtYmVyCiAgICBmb2xsb3dlZCBieSBl +aXRoZXIgdGhlIGxldHRlciAneCcgZm9yIGFuIGV4cG9ydGFibGUgc2lnbmF0dXJl +IG9yCiAgICB0aGUgbGV0dGVyICdsJyBmb3IgYSBsb2NhbC1vbmx5IHNpZ25hdHVy +ZS4gIFRoZSBjbGFzcyBieXRlIG9mIGFuCiAgICByZXZvY2F0aW9uIGtleSBpcyBh +bHNvIGdpdmVuIGhlcmUsICd4JyBhbmQgJ2wnIGlzIHVzZWQgdGhlIHNhbWUKICAg +IHdheS4gIFRoaXMgZmllbGQgaWYgbm90IHVzZWQgZm9yIFguNTA5LgoKKioqIEZp +ZWxkIDEyIC0gS2V5IGNhcGFiaWxpdGllcwoKICAgIFRoZSBkZWZpbmVkIGNhcGFi +aWxpdGllcyBhcmU6CgogICAgLSBlIDo6IEVuY3J5cHQKICAgIC0gcyA6OiBTaWdu +CiAgICAtIGMgOjogQ2VydGlmeQogICAgLSBhIDo6IEF1dGhlbnRpY2F0aW9uCiAg +ICAtID8gOjogVW5rbm93biBjYXBhYmlsaXR5CgogICAgQSBrZXkgbWF5IGhhdmUg +YW55IGNvbWJpbmF0aW9uIG9mIHRoZW0gaW4gYW55IG9yZGVyLiAgSW4gYWRkaXRp +b24KICAgIHRvIHRoZXNlIGxldHRlcnMsIHRoZSBwcmltYXJ5IGtleSBoYXMgdXBw +ZXJjYXNlIHZlcnNpb25zIG9mIHRoZQogICAgbGV0dGVycyB0byBkZW5vdGUgdGhl +IF91c2FibGVfIGNhcGFiaWxpdGllcyBvZiB0aGUgZW50aXJlIGtleSwgYW5kCiAg +ICBhIHBvdGVudGlhbCBsZXR0ZXIgJ0QnIHRvIGluZGljYXRlIGEgZGlzYWJsZWQg +a2V5LgoKKioqIEZpZWxkIDEzIC0gSXNzdWVyIGNlcnRpZmljYXRlIGZpbmdlcnBy +aW50IG9yIG90aGVyIGluZm8KCiAgICBVc2VkIGluIEZQUiByZWNvcmRzIGZvciBT +L01JTUUga2V5cyB0byBzdG9yZSB0aGUgZmluZ2VycHJpbnQgb2YKICAgIHRoZSBp +c3N1ZXIgY2VydGlmaWNhdGUuICBUaGlzIGlzIHVzZWZ1bCB0byBidWlsZCB0aGUg +Y2VydGlmaWNhdGUKICAgIHBhdGggYmFzZWQgb24gY2VydGlmaWNhdGVzIHN0b3Jl +ZCBpbiB0aGUgbG9jYWwga2V5IGRhdGFiYXNlIGl0IGlzCiAgICBvbmx5IGZpbGxl +ZCBpZiB0aGUgaXNzdWVyIGNlcnRpZmljYXRlIGlzIGF2YWlsYWJsZS4gVGhlIHJv +b3QgaGFzCiAgICBiZWVuIHJlYWNoZWQgaWYgdGhpcyBpcyB0aGUgc2FtZSBzdHJp +bmcgYXMgdGhlIGZpbmdlcnByaW50LiBUaGUKICAgIGFkdmFudGFnZSBvZiB1c2lu +ZyB0aGlzIHZhbHVlIGlzIHRoYXQgaXQgaXMgZ3VhcmFudGVlZCB0byBoYXZlCiAg +ICBiZWVuIGJlZW4gYnVpbGQgYnkgdGhlIHNhbWUgbG9va3VwIGFsZ29yaXRobSBh +cyBncGdzbSB1c2VzLgoKICAgIEZvciAidWlkIiByZWNvcmRzIHRoaXMgZmllbGQg +bGlzdHMgdGhlIHByZWZlcmVuY2VzIGluIHRoZSBzYW1lIHdheQogICAgZ3BnJ3Mg +LS1lZGl0LWtleSBtZW51IGRvZXMuCgogICAgRm9yICJzaWciIHJlY29yZHMsIHRo +aXMgaXMgdGhlIGZpbmdlcnByaW50IG9mIHRoZSBrZXkgdGhhdCBpc3N1ZWQKICAg +IHRoZSBzaWduYXR1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IGZpbGxlZCBp +biBpZiB0aGUgc2lnbmF0dXJlCiAgICB2ZXJpZmllZCBjb3JyZWN0bHkuICBOb3Rl +IGFsc28gdGhhdCBmb3IgdmFyaW91cyB0ZWNobmljYWwgcmVhc29ucywKICAgIHRo +aXMgZmluZ2VycHJpbnQgaXMgb25seSBhdmFpbGFibGUgaWYgLS1uby1zaWctY2Fj +aGUgaXMgdXNlZC4KCioqKiBGaWVsZCAxNCAtIEZsYWcgZmllbGQKCiAgICBGbGFn +IGZpZWxkIHVzZWQgaW4gdGhlIC0tZWRpdCBtZW51IG91dHB1dAoKKioqIEZpZWxk +IDE1IC0gUy9OIG9mIGEgdG9rZW4KCiAgICBVc2VkIGluIHNlYy9zc2IgdG8gcHJp +bnQgdGhlIHNlcmlhbCBudW1iZXIgb2YgYSB0b2tlbiAoaW50ZXJuYWwKICAgIHBy +b3RlY3QgbW9kZSAxMDAyKSBvciBhICcjJyBpZiB0aGF0IGtleSBpcyBhIHNpbXBs +ZSBzdHViIChpbnRlcm5hbAogICAgcHJvdGVjdCBtb2RlIDEwMDEpLiAgSWYgdGhl +IG9wdGlvbiAtLXdpdGgtc2VjcmV0IGlzIHVzZWQgYW5kIGEKICAgIHNlY3JldCBr +ZXkgaXMgYXZhaWxhYmxlIGZvciB0aGUgcHVibGljIGtleSwgYSAnKycgaW5kaWNh +dGVzIHRoaXMuCgoqKiogRmllbGQgMTYgLSBIYXNoIGFsZ29yaXRobQoKICAgIEZv +ciBzaWcgcmVjb3JkcywgdGhpcyBpcyB0aGUgdXNlZCBoYXNoIGFsZ29yaXRobS4g +IEZvciBleGFtcGxlOgogICAgMiA9IFNIQS0xLCA4ID0gU0hBLTI1Ni4KCioqKiBG +aWVsZCAxNyAtIEN1cnZlIG5hbWUKCiAgICBGb3IgcHViLCBzdWIsIHNlYywgYW5k +IHNzYiByZWNvcmRzIHRoaXMgZmllbGQgaXMgdXNlZCBmb3IgdGhlIEVDQwogICAg +Y3VydmUgbmFtZS4KKioqIEZpZWxkIDE4IC0gVE9GVSBQb2xpY3kKCiAgICBUaGlz +IGlzIHRoZSBUT0ZVIHBvbGljeS4gIEl0IGlzIGVpdGhlciBnb29kLCBiYWQsIHVu +a25vd24sIGFzayBvcgogICAgYXV0by4gIFRoaXMgaXMgb25seSBzaG93cyBmb3Ig +dWlkIHJlY29yZHMuCgoqKiBTcGVjaWFsIGZpZWxkcwoKKioqIFBLRCAtIFB1Ymxp +YyBrZXkgZGF0YQoKICAgIElmIGZpZWxkIDEgaGFzIHRoZSB0YWcgInBrZCIsIGEg +bGlzdGluZyBsb29rcyBsaWtlIHRoaXM6CiMrYmVnaW5fZXhhbXBsZQpwa2Q6MDox +MDI0OkI2NjVCMTQzNUY0QzIgLi4uLiBGRjI2QUJCOgogICAgISAgISAgICEtLSB0 +aGUgdmFsdWUKICAgICEgICEtLS0tLS0gZm9yIGluZm9ybWF0aW9uIG51bWJlciBv +ZiBiaXRzIGluIHRoZSB2YWx1ZQogICAgIS0tLS0tLS0tLSBpbmRleCAoZWcuIERT +QSBnb2VzIGZyb20gMCB0byAzOiBwLHEsZyx5KQojK2VuZF9leGFtcGxlCgoqKiog +VFJVIC0gVHJ1c3QgZGF0YWJhc2UgaW5mb3JtYXRpb24KICAgIEV4YW1wbGUgZm9y +IGEgInRydSIgdHJ1c3QgYmFzZSByZWNvcmQ6CiMrYmVnaW5fZXhhbXBsZQogICAg +dHJ1Om86MDoxMTY2Njk3NjU0OjE6MzoxOjUKIytlbmRfZXhhbXBsZQoKICAgIC0g +RmllbGQgMiA6OiBSZWFzb24gZm9yIHN0YWxlbmVzcyBvZiB0cnVzdC4gIElmIHRo +aXMgZmllbGQgaXMKICAgICAgICAgICAgICAgICBlbXB0eSwgdGhlbiB0aGUgdHJ1 +c3RkYiBpcyBub3Qgc3RhbGUuICBUaGlzIGZpZWxkIG1heQogICAgICAgICAgICAg +ICAgIGhhdmUgbXVsdGlwbGUgZmxhZ3MgaW4gaXQ6CgogICAgICAgICAgICAgICAg +IC0gbyA6OiBUcnVzdGRiIGlzIG9sZAogICAgICAgICAgICAgICAgIC0gdCA6OiBU +cnVzdGRiIHdhcyBidWlsdCB3aXRoIGEgZGlmZmVyZW50IHRydXN0IG1vZGVsCiAg +ICAgICAgICAgICAgICAgICAgICAgIHRoYW4gdGhlIG9uZSB3ZSBhcmUgdXNpbmcg +bm93LgoKICAgIC0gRmllbGQgMyA6OiBUcnVzdCBtb2RlbAoKICAgICAgICAgICAg +ICAgICAtIDAgOjogQ2xhc3NpYyB0cnVzdCBtb2RlbCwgYXMgdXNlZCBpbiBQR1Ag +Mi54LgogICAgICAgICAgICAgICAgIC0gMSA6OiBQR1AgdHJ1c3QgbW9kZWwsIGFz +IHVzZWQgaW4gUEdQIDYgYW5kIGxhdGVyLgogICAgICAgICAgICAgICAgICAgICAg +ICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBjbGFzc2ljIHRydXN0IG1vZGVsLAog +ICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgZm9yIHRoZSBhZGRpdGlvbiBv +ZiB0cnVzdCBzaWduYXR1cmVzLgoKICAgICAgICAgICAgICAgICBHbnVQRyBiZWZv +cmUgdmVyc2lvbiAxLjQgdXNlZCB0aGUgY2xhc3NpYyB0cnVzdCBtb2RlbAogICAg +ICAgICAgICAgICAgIGJ5IGRlZmF1bHQuIEdudVBHIDEuNCBhbmQgbGF0ZXIgdXNl +cyB0aGUgUEdQIHRydXN0CiAgICAgICAgICAgICAgICAgbW9kZWwgYnkgZGVmYXVs +dC4KCiAgICAtIEZpZWxkIDQgOjogRGF0ZSB0cnVzdGRiIHdhcyBjcmVhdGVkIGlu +IHNlY29uZHMgc2luY2UgRXBvY2guCiAgICAtIEZpZWxkIDUgOjogRGF0ZSB0cnVz +dGRiIHdpbGwgZXhwaXJlIGluIHNlY29uZHMgc2luY2UgRXBvY2guCiAgICAtIEZp +ZWxkIDYgOjogTnVtYmVyIG9mIG1hcmdpbmFsbHkgdHJ1c3RlZCB1c2VycyB0byBp +bnRyb2R1Y2UgYSBuZXcKICAgICAgICAgICAgICAgICBrZXkgc2lnbmVyIChncGcn +cyBvcHRpb24gLS1tYXJnaW5hbHMtbmVlZGVkKS4KICAgIC0gRmllbGQgNyA6OiBO +dW1iZXIgb2YgY29tcGxldGVseSB0cnVzdGVkIHVzZXJzIHRvIGludHJvZHVjZSBh +IG5ldwogICAgICAgICAgICAgICAgIGtleSBzaWduZXIuICAoZ3BnJ3Mgb3B0aW9u +IC0tY29tcGxldGVzLW5lZWRlZCkKCiAgICAtIEZpZWxkIDggOjogTWF4aW11bSBk +ZXB0aCBvZiBhIGNlcnRpZmljYXRpb24gY2hhaW4uIChncGcncyBvcHRpb24KICAg +ICAgICAgICAgICAgICAtLW1heC1jZXJ0LWRlcHRoKQoKKioqIFNQSyAtIFNpZ25h +dHVyZSBzdWJwYWNrZXQgcmVjb3JkcwoKICAgIC0gRmllbGQgMiA6OiBTdWJwYWNr +ZXQgbnVtYmVyIGFzIHBlciBSRkMtNDg4MCBhbmQgbGF0ZXIuCiAgICAtIEZpZWxk +IDMgOjogRmxhZ3MgaW4gaGV4LiAgQ3VycmVudGx5IHRoZSBvbmx5IHR3byBiaXRz +IGFzc2lnbmVkCiAgICAgICAgICAgICAgICAgYXJlIDEsIHRvIGluZGljYXRlIHRo +YXQgdGhlIHN1YnBhY2tldCBjYW1lIGZyb20gdGhlCiAgICAgICAgICAgICAgICAg +aGFzaGVkIHBhcnQgb2YgdGhlIHNpZ25hdHVyZSwgYW5kIDIsIHRvIGluZGljYXRl +IHRoZQogICAgICAgICAgICAgICAgIHN1YnBhY2tldCB3YXMgbWFya2VkIGNyaXRp +Y2FsLgogICAgLSBGaWVsZCA0IDo6IExlbmd0aCBvZiB0aGUgc3VicGFja2V0LiAg +Tm90ZSB0aGF0IHRoaXMgaXMgdGhlCiAgICAgICAgICAgICAgICAgbGVuZ3RoIG9m +IHRoZSBzdWJwYWNrZXQsIGFuZCBub3QgdGhlIGxlbmd0aCBvZiBmaWVsZAogICAg +ICAgICAgICAgICAgIDUgYmVsb3cuICBEdWUgdG8gdGhlIG5lZWQgZm9yICUtZW5j +b2RpbmcsIHRoZSBsZW5ndGgKICAgICAgICAgICAgICAgICBvZiBmaWVsZCA1IG1h +eSBiZSB1cCB0byAzeCB0aGlzIHZhbHVlLgogICAgLSBGaWVsZCA1IDo6IFRoZSBz +dWJwYWNrZXQgZGF0YS4gIFByaW50YWJsZSBBU0NJSSBpcyBzaG93biBhcwogICAg +ICAgICAgICAgICAgIEFTQ0lJLCBidXQgb3RoZXIgdmFsdWVzIGFyZSByZW5kZXJl +ZCBhcyAlWFggd2hlcmUgWFgKICAgICAgICAgICAgICAgICBpcyB0aGUgaGV4IHZh +bHVlIGZvciB0aGUgYnl0ZS4KCioqKiBDRkcgLSBDb25maWd1cmF0aW9uIGRhdGEK +CiAgICAtLWxpc3QtY29uZmlnIG91dHB1dHMgaW5mb3JtYXRpb24gYWJvdXQgdGhl +IEdudVBHIGNvbmZpZ3VyYXRpb24KICAgIGZvciB0aGUgYmVuZWZpdCBvZiBmcm9u +dGVuZHMgb3Igb3RoZXIgcHJvZ3JhbXMgdGhhdCBjYWxsIEdudVBHLgogICAgVGhl +cmUgYXJlIHNldmVyYWwgbGlzdC1jb25maWcgaXRlbXMsIGFsbCBjb2xvbiBkZWxp +bWl0ZWQgbGlrZSB0aGUKICAgIHJlc3Qgb2YgdGhlIC0td2l0aC1jb2xvbnMgb3V0 +cHV0LiAgVGhlIGZpcnN0IGZpZWxkIGlzIGFsd2F5cyAiY2ZnIgogICAgdG8gaW5k +aWNhdGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gIFRoZSBzZWNvbmQgZmll +bGQgaXMgb25lIG9mCiAgICAod2l0aCBleGFtcGxlcyk6CgogICAgLSB2ZXJzaW9u +IDo6IFRoZSB0aGlyZCBmaWVsZCBjb250YWlucyB0aGUgdmVyc2lvbiBvZiBHbnVQ +Ry4KCiAgICAgICAgICAgICAgICAgOiBjZmc6dmVyc2lvbjoxLjMuNQoKICAgIC0g +cHVia2V5IDo6IFRoZSB0aGlyZCBmaWVsZCBjb250YWlucyB0aGUgcHVibGljIGtl +eSBhbGdvcml0aG1zCiAgICAgICAgICAgICAgICB0aGlzIHZlcnNpb24gb2YgR251 +UEcgc3VwcG9ydHMsIHNlcGFyYXRlZCBieQogICAgICAgICAgICAgICAgc2VtaWNv +bG9ucy4gIFRoZSBhbGdvcml0aG0gbnVtYmVycyBhcmUgYXMgc3BlY2lmaWVkIGlu +CiAgICAgICAgICAgICAgICBSRkMtNDg4MC4gIE5vdGUgdGhhdCBpbiBjb250cmFz +dCB0byB0aGUgLS1zdGF0dXMtZmQKICAgICAgICAgICAgICAgIGludGVyZmFjZSB0 +aGVzZSBhcmUgX25vdF8gdGhlIExpYmdjcnlwdCBpZGVudGlmaWVycy4KICAgICAg +ICAgICAgICAgIFVzaW5nID1wdWJrZXluYW1lPSBwcmludHMgbmFtZXMgaW5zdGVh +ZCBvZiBudW1iZXJzLgoKICAgICAgICAgICAgICAgICA6IGNmZzpwdWJrZXk6MTsy +OzM7MTY7MTcKCiAgICAtIGNpcGhlciA6OiBUaGUgdGhpcmQgZmllbGQgY29udGFp +bnMgdGhlIHN5bW1ldHJpYyBjaXBoZXJzIHRoaXMKICAgICAgICAgICAgICAgIHZl +cnNpb24gb2YgR251UEcgc3VwcG9ydHMsIHNlcGFyYXRlZCBieSBzZW1pY29sb25z +LgogICAgICAgICAgICAgICAgVGhlIGNpcGhlciBudW1iZXJzIGFyZSBhcyBzcGVj +aWZpZWQgaW4gUkZDLTQ4ODAuCiAgICAgICAgICAgICAgICBVc2luZyA9Y2lwaGVy +bmFtZT0gcHJpbnRzIG5hbWVzIGluc3RlYWQgb2YgbnVtYmVycy4KCiAgICAgICAg +ICAgICAgICAgOiBjZmc6Y2lwaGVyOjI7Mzs0Ozc7ODs5OzEwCgogICAgLSBkaWdl +c3QgOjogVGhlIHRoaXJkIGZpZWxkIGNvbnRhaW5zIHRoZSBkaWdlc3QgKGhhc2gp +IGFsZ29yaXRobXMKICAgICAgICAgICAgICAgIHRoaXMgdmVyc2lvbiBvZiBHbnVQ +RyBzdXBwb3J0cywgc2VwYXJhdGVkIGJ5CiAgICAgICAgICAgICAgICBzZW1pY29s +b25zLiAgVGhlIGRpZ2VzdCBudW1iZXJzIGFyZSBhcyBzcGVjaWZpZWQgaW4KICAg +ICAgICAgICAgICAgIFJGQy00ODgwLiAgVXNpbmcgPWRpZ2VzdG5hbWU9IHByaW50 +cyBuYW1lcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICBudW1iZXJzLgoKICAg +ICAgICAgICAgICAgICA6IGNmZzpkaWdlc3Q6MTsyOzM7ODs5OzEwCgogICAgLSBj +b21wcmVzcyA6OiBUaGUgdGhpcmQgZmllbGQgY29udGFpbnMgdGhlIGNvbXByZXNz +aW9uIGFsZ29yaXRobXMKICAgICAgICAgICAgICAgICAgdGhpcyB2ZXJzaW9uIG9m +IEdudVBHIHN1cHBvcnRzLCBzZXBhcmF0ZWQgYnkKICAgICAgICAgICAgICAgICAg +c2VtaWNvbG9ucy4gIFRoZSBhbGdvcml0aG0gbnVtYmVycyBhcmUgYXMgc3BlY2lm +aWVkCiAgICAgICAgICAgICAgICAgIGluIFJGQy00ODgwLgoKICAgICAgICAgICAg +ICAgICA6IGNmZzpjb21wcmVzczowOzE7MjszCgogICAgLSBncm91cCA6OiBUaGUg +dGhpcmQgZmllbGQgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGdyb3VwLCBhbmQg +dGhlCiAgICAgICAgICAgICAgIGZvdXJ0aCBmaWVsZCBjb250YWlucyB0aGUgdmFs +dWVzIHRoYXQgdGhlIGdyb3VwIGV4cGFuZHMKICAgICAgICAgICAgICAgdG8sIHNl +cGFyYXRlZCBieSBzZW1pY29sb25zLgoKICAgICAgICAgICAgICAgRm9yIGV4YW1w +bGUsIGEgZ3JvdXAgb2Y6CiAgICAgICAgICAgICAgICAgOiBncm91cCBteW5hbWVz +ID0gcGFpZ2UgMHgxMjM0NTY3OCBqb2UgcGF0dGkKICAgICAgICAgICAgICAgd291 +bGQgcmVzdWx0IGluOgogICAgICAgICAgICAgICAgIDogY2ZnOmdyb3VwOm15bmFt +ZXM6cGF0dGk7am9lOzB4MTIzNDU2Nzg7cGFpZ2UKCiAgICAtIGN1cnZlIDo6IFRo +ZSB0aGlyZCBmaWVsZCBjb250YWlucyB0aGUgY3VydmUgbmFtZXMgdGhpcyB2ZXJz +aW9uCiAgICAgICAgICAgICAgIG9mIEdudVBHIHN1cHBvcnRzLCBzZXBhcmF0ZWQg +Ynkgc2VtaWNvbG9ucy4gVXNpbmcKICAgICAgICAgICAgICAgPWN1cnZlb2lkPSBw +cmludHMgT0lEcyBpbnN0ZWFkIG9mIG51bWJlcnMuCgogICAgICAgICAgICAgICAg +IDogY2ZnOmN1cnZlOmVkMjU1MTk7bmlzdHAyNTY7bmlzdHAzODQ7bmlzdHA1MjEK +CgoqIEZvcm1hdCBvZiB0aGUgLS1zdGF0dXMtZmQgb3V0cHV0CgogIEV2ZXJ5IGxp +bmUgaXMgcHJlZml4ZWQgd2l0aCAiW0dOVVBHOl0gIiwgZm9sbG93ZWQgYnkgYSBr +ZXl3b3JkIHdpdGgKICB0aGUgdHlwZSBvZiB0aGUgc3RhdHVzIGxpbmUgYW5kIHNv +bWUgYXJndW1lbnRzIGRlcGVuZGluZyBvbiB0aGUgdHlwZQogIChtYXliZSBub25l +KTsgYW4gYXBwbGljYXRpb24gc2hvdWxkIGFsd2F5cyBiZSBwcmVwYXJlZCB0byBz +ZWUgbW9yZQogIGFyZ3VtZW50cyBpbiBmdXR1cmUgdmVyc2lvbnMuCgoqKiBHZW5l +cmFsIHN0YXR1cyBjb2RlcwoqKiogTkVXU0lHCiAgICBJcyBpc3N1ZWQgcmlnaHQg +YmVmb3JlIGEgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBzdGFydHMuICBUaGlzIGlz +CiAgICB1c2VmdWwgdG8gZGVmaW5lIGEgY29udGV4dCBmb3IgcGFyc2luZyBFUlJP +UiBzdGF0dXMgbWVzc2FnZXMuICBObwogICAgYXJndW1lbnRzIGFyZSBjdXJyZW50 +bHkgZGVmaW5lZC4KCioqKiBHT09EU0lHICA8bG9uZ19rZXlpZF9vcl9mcHI+ICA8 +dXNlcm5hbWU+CiAgICBUaGUgc2lnbmF0dXJlIHdpdGggdGhlIGtleWlkIGlzIGdv +b2QuICBGb3IgZWFjaCBzaWduYXR1cmUgb25seSBvbmUKICAgIG9mIHRoZSBjb2Rl +cyBHT09EU0lHLCBCQURTSUcsIEVYUFNJRywgRVhQS0VZU0lHLCBSRVZLRVlTSUcg +b3IKICAgIEVSUlNJRyB3aWxsIGJlIGVtaXR0ZWQuICBJbiB0aGUgcGFzdCB0aGV5 +IHdlcmUgdXNlZCBhcyBhIG1hcmtlcgogICAgZm9yIGEgbmV3IHNpZ25hdHVyZTsg +bmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgTkVXU0lHIHN0YXR1cwogICAgaW5zdGVh +ZC4gIFRoZSB1c2VybmFtZSBpcyB0aGUgcHJpbWFyeSBvbmUgZW5jb2RlZCBpbiBV +VEYtOCBhbmQgJVhYCiAgICBlc2NhcGVkLiBUaGUgZmluZ2VycHJpbnQgbWF5IGJl +IHVzZWQgaW5zdGVhZCBvZiB0aGUgbG9uZyBrZXlpZCBpZgogICAgaXQgaXMgYXZh +aWxhYmxlLiAgVGhpcyBpcyB0aGUgY2FzZSB3aXRoIENNUyBhbmQgbWlnaHQgZXZl +bnR1YWxseQogICAgYWxzbyBiZSBhdmFpbGFibGUgZm9yIE9wZW5QR1AuCgoqKiog +RVhQU0lHICA8bG9uZ19rZXlpZF9vcl9mcHI+ICA8dXNlcm5hbWU+CiAgICBUaGUg +c2lnbmF0dXJlIHdpdGggdGhlIGtleWlkIGlzIGdvb2QsIGJ1dCB0aGUgc2lnbmF0 +dXJlIGlzCiAgICBleHBpcmVkLiBUaGUgdXNlcm5hbWUgaXMgdGhlIHByaW1hcnkg +b25lIGVuY29kZWQgaW4gVVRGLTggYW5kICVYWAogICAgZXNjYXBlZC4gVGhlIGZp +bmdlcnByaW50IG1heSBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGxvbmcga2V5aWQg +aWYKICAgIGl0IGlzIGF2YWlsYWJsZS4gIFRoaXMgaXMgdGhlIGNhc2Ugd2l0aCBD +TVMgYW5kIG1pZ2h0IGV2ZW50dWFsbHkKICAgIGFsc28gYmUgYXZhaWxhYmxlIGZv +ciBPcGVuUEdQLgoKKioqIEVYUEtFWVNJRyAgPGxvbmdfa2V5aWRfb3JfZnByPiA8 +dXNlcm5hbWU+CiAgICBUaGUgc2lnbmF0dXJlIHdpdGggdGhlIGtleWlkIGlzIGdv +b2QsIGJ1dCB0aGUgc2lnbmF0dXJlIHdhcyBtYWRlCiAgICBieSBhbiBleHBpcmVk +IGtleS4gVGhlIHVzZXJuYW1lIGlzIHRoZSBwcmltYXJ5IG9uZSBlbmNvZGVkIGlu +CiAgICBVVEYtOCBhbmQgJVhYIGVzY2FwZWQuICBUaGUgZmluZ2VycHJpbnQgbWF5 +IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUKICAgIGxvbmcga2V5aWQgaWYgaXQgaXMg +YXZhaWxhYmxlLiAgVGhpcyBpcyB0aGUgY2FzZSB3aXRoIENNUyBhbmQKICAgIG1p +Z2h0IGV2ZW50dWFsbHkgYWxzbyBiZSBhdmFpbGFibGUgZm9yIE9wZW5QR1AuCgoq +KiogUkVWS0VZU0lHICA8bG9uZ19rZXlpZF9vcl9mcHI+ICA8dXNlcm5hbWU+CiAg +ICBUaGUgc2lnbmF0dXJlIHdpdGggdGhlIGtleWlkIGlzIGdvb2QsIGJ1dCB0aGUg +c2lnbmF0dXJlIHdhcyBtYWRlCiAgICBieSBhIHJldm9rZWQga2V5LiBUaGUgdXNl +cm5hbWUgaXMgdGhlIHByaW1hcnkgb25lIGVuY29kZWQgaW4gVVRGLTgKICAgIGFu +ZCAlWFggZXNjYXBlZC4gVGhlIGZpbmdlcnByaW50IG1heSBiZSB1c2VkIGluc3Rl +YWQgb2YgdGhlIGxvbmcKICAgIGtleWlkIGlmIGl0IGlzIGF2YWlsYWJsZS4gIFRo +aXMgaXMgdGhlIGNhc2Ugd2l0aCBDTVMgYW5kIG1pZ2h0CiAgICBldmVudHVhbGx5 +IGFsc28gYmXDsSBhdmFpbGFibGUgZm9yIE9wZW5QR1AuCgoqKiogQkFEU0lHICA8 +bG9uZ19rZXlpZF9vcl9mcHI+ICA8dXNlcm5hbWU+CiAgICBUaGUgc2lnbmF0dXJl +IHdpdGggdGhlIGtleWlkIGhhcyBub3QgYmVlbiB2ZXJpZmllZCBva2F5LiAgVGhl +CiAgICB1c2VybmFtZSBpcyB0aGUgcHJpbWFyeSBvbmUgZW5jb2RlZCBpbiBVVEYt +OCBhbmQgJVhYIGVzY2FwZWQuIFRoZQogICAgZmluZ2VycHJpbnQgbWF5IGJlIHVz +ZWQgaW5zdGVhZCBvZiB0aGUgbG9uZyBrZXlpZCBpZiBpdCBpcwogICAgYXZhaWxh +YmxlLiAgVGhpcyBpcyB0aGUgY2FzZSB3aXRoIENNUyBhbmQgbWlnaHQgZXZlbnR1 +YWxseSBhbHNvIGJlCiAgICBhdmFpbGFibGUgZm9yIE9wZW5QR1AuCgoqKiogRVJS +U0lHICA8a2V5aWQ+ICA8cGthbGdvPiA8aGFzaGFsZ28+IDxzaWdfY2xhc3M+IDx0 +aW1lPiA8cmM+CiAgICBJdCB3YXMgbm90IHBvc3NpYmxlIHRvIGNoZWNrIHRoZSBz +aWduYXR1cmUuICBUaGlzIG1heSBiZSBjYXVzZWQgYnkKICAgIGEgbWlzc2luZyBw +dWJsaWMga2V5IG9yIGFuIHVuc3VwcG9ydGVkIGFsZ29yaXRobS4gIEEgUkMgb2Yg +NAogICAgaW5kaWNhdGVzIHVua25vd24gYWxnb3JpdGhtLCBhIDkgaW5kaWNhdGVz +IGEgbWlzc2luZyBwdWJsaWMKICAgIGtleS4gVGhlIG90aGVyIGZpZWxkcyBnaXZl +IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzaWduYXR1cmUuCiAgICBzaWdf +Y2xhc3MgaXMgYSAyIGJ5dGUgaGV4LXZhbHVlLiAgVGhlIGZpbmdlcnByaW50IG1h +eSBiZSB1c2VkCiAgICBpbnN0ZWFkIG9mIHRoZSBrZXlpZCBpZiBpdCBpcyBhdmFp +bGFibGUuICBUaGlzIGlzIHRoZSBjYXNlIHdpdGgKICAgIGdwZ3NtIGFuZCBtaWdo +dCBldmVudHVhbGx5IGFsc28gYmUgYXZhaWxhYmxlIGZvciBPcGVuUEdQLgoKICAg +IE5vdGUsIHRoYXQgVElNRSBtYXkgZWl0aGVyIGJlIHRoZSBudW1iZXIgb2Ygc2Vj +b25kcyBzaW5jZSBFcG9jaCBvcgogICAgYW4gSVNPIDg2MDEgc3RyaW5nLiAgVGhl +IGxhdHRlciBjYW4gYmUgZGV0ZWN0ZWQgYnkgdGhlIHByZXNlbmNlIG9mCiAgICB0 +aGUgbGV0dGVyICdUJy4KCioqKiBWQUxJRFNJRyA8YXJncz4KCiAgICBUaGUgYXJn +cyBhcmU6CgogICAgLSA8ZmluZ2VycHJpbnRfaW5faGV4PgogICAgLSA8c2lnX2Ny +ZWF0aW9uX2RhdGU+CiAgICAtIDxzaWctdGltZXN0YW1wPgogICAgLSA8ZXhwaXJl +LXRpbWVzdGFtcD4KICAgIC0gPHNpZy12ZXJzaW9uPgogICAgLSA8cmVzZXJ2ZWQ+ +CiAgICAtIDxwdWJrZXktYWxnbz4KICAgIC0gPGhhc2gtYWxnbz4KICAgIC0gPHNp +Zy1jbGFzcz4KICAgIC0gWyA8cHJpbWFyeS1rZXktZnByPiBdCgogICAgVGhpcyBz +dGF0dXMgaW5kaWNhdGVzIHRoYXQgdGhlIHNpZ25hdHVyZSBpcyBjcnlwdG9ncmFw +aGljYWxseQogICAgdmFsaWQuIFRoaXMgaXMgc2ltaWxhciB0byBHT09EU0lHLCBF +WFBTSUcsIEVYUEtFWVNJRywgb3IgUkVWS0VZU0lHCiAgICAoZGVwZW5kaW5nIG9u +IHRoZSBkYXRlIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHNpZ25hdHVyZSBhbmQgc2ln +bmluZwogICAga2V5KSBidXQgaGFzIHRoZSBmaW5nZXJwcmludCBhcyB0aGUgYXJn +dW1lbnQuIE11bHRpcGxlIHN0YXR1cwogICAgbGluZXMgKFZBTElEU0lHIGFuZCB0 +aGUgb3RoZXIgYXBwcm9wcmlhdGUgKlNJRyBzdGF0dXMpIGFyZSBlbWl0dGVkCiAg +ICBmb3IgYSB2YWxpZCBzaWduYXR1cmUuICBBbGwgYXJndW1lbnRzIGhlcmUgYXJl +IG9uIG9uZSBsb25nIGxpbmUuCiAgICBzaWctdGltZXN0YW1wIGlzIHRoZSBzaWdu +YXR1cmUgY3JlYXRpb24gdGltZSBpbiBzZWNvbmRzIGFmdGVyIHRoZQogICAgZXBv +Y2guIGV4cGlyZS10aW1lc3RhbXAgaXMgdGhlIHNpZ25hdHVyZSBleHBpcmF0aW9u +IHRpbWUgaW4KICAgIHNlY29uZHMgYWZ0ZXIgdGhlIGVwb2NoICh6ZXJvIG1lYW5z +ICJkb2VzIG5vdAogICAgZXhwaXJlIikuIHNpZy12ZXJzaW9uLCBwdWJrZXktYWxn +bywgaGFzaC1hbGdvLCBhbmQgc2lnLWNsYXNzIChhCiAgICAyLWJ5dGUgaGV4IHZh +bHVlKSBhcmUgYWxsIHN0cmFpZ2h0IGZyb20gdGhlIHNpZ25hdHVyZSBwYWNrZXQu +CiAgICBQUklNQVJZLUtFWS1GUFIgaXMgdGhlIGZpbmdlcnByaW50IG9mIHRoZSBw +cmltYXJ5IGtleSBvciBpZGVudGljYWwKICAgIHRvIHRoZSBmaXJzdCBhcmd1bWVu +dC4gIFRoaXMgaXMgdXNlZnVsIHRvIGdldCBiYWNrIHRvIHRoZSBwcmltYXJ5CiAg +ICBrZXkgd2l0aG91dCBydW5uaW5nIGdwZyBhZ2FpbiBmb3IgdGhpcyBwdXJwb3Nl +LgoKICAgIFRoZSBwcmltYXJ5LWtleS1mcHIgcGFyYW1ldGVyIGlzIHVzZWQgZm9y +IE9wZW5QR1AgYW5kIG5vdAogICAgYXZhaWxhYmxlIGZvciBDTVMgc2lnbmF0dXJl +cy4gIFRoZSBzaWctdmVyc2lvbiBhcyB3ZWxsIGFzIHRoZSBzaWcKICAgIGNsYXNz +IGlzIG5vdCBkZWZpbmVkIGZvciBDTVMgYW5kIGN1cnJlbnRseSBzZXQgdG8gMCBh +bmQgMDAuCgogICAgTm90ZSwgdGhhdCAqLVRJTUVTVEFNUCBtYXkgZWl0aGVyIGJl +IGEgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UKICAgIEVwb2NoIG9yIGFuIElTTyA4 +NjAxIHN0cmluZyB3aGljaCBjYW4gYmUgZGV0ZWN0ZWQgYnkgdGhlIHByZXNlbmNl +CiAgICBvZiB0aGUgbGV0dGVyICdUJy4KCioqKiBTSUdfSUQgIDxyYWRpeDY0X3N0 +cmluZz4gIDxzaWdfY3JlYXRpb25fZGF0ZT4gIDxzaWctdGltZXN0YW1wPgogICAg +VGhpcyBpcyBlbWl0dGVkIG9ubHkgZm9yIHNpZ25hdHVyZXMgb2YgY2xhc3MgMCBv +ciAxIHdoaWNoIGhhdmUKICAgIGJlZW4gdmVyaWZpZWQgb2theS4gIFRoZSBzdHJp +bmcgaXMgYSBzaWduYXR1cmUgaWQgYW5kIG1heSBiZSB1c2VkCiAgICBpbiBhcHBs +aWNhdGlvbnMgdG8gZGV0ZWN0IHJlcGxheSBhdHRhY2tzIG9mIHNpZ25lZCBtZXNz +YWdlcy4gIE5vdGUKICAgIHRoYXQgb25seSBETFAgYWxnb3JpdGhtcyBnaXZlIHVu +aXF1ZSBpZHMgLSBvdGhlcnMgbWF5IHlpZWxkCiAgICBkdXBsaWNhdGVkIG9uZXMg +d2hlbiB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIGluIHRoZSBzYW1lIHNlY29uZC4K +CiAgICBOb3RlLCB0aGF0IFNJRy1USU1FU1RBTVAgbWF5IGVpdGhlciBiZSBhIG51 +bWJlciBvZiBzZWNvbmRzIHNpbmNlCiAgICBFcG9jaCBvciBhbiBJU08gODYwMSBz +dHJpbmcgd2hpY2ggY2FuIGJlIGRldGVjdGVkIGJ5IHRoZSBwcmVzZW5jZQogICAg +b2YgdGhlIGxldHRlciAnVCcuCgoqKiogRU5DX1RPICA8bG9uZ19rZXlpZD4gIDxr +ZXl0eXBlPiAgPGtleWxlbmd0aD4KICAgIFRoZSBtZXNzYWdlIGlzIGVuY3J5cHRl +ZCB0byB0aGlzIExPTkdfS0VZSUQuICBLRVlUWVBFIGlzIHRoZQogICAgbnVtZXJp +Y2FsIHZhbHVlIG9mIHRoZSBwdWJsaWMga2V5IGFsZ29yaXRobSBvciAwIGlmIGl0 +IGlzIG5vdAogICAga25vd24sIEtFWUxFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRo +ZSBrZXkgb3IgMCBpZiBpdCBpcyBub3Qga25vd24KICAgICh3aGljaCBpcyBjdXJy +ZW50bHkgYWx3YXlzIHRoZSBjYXNlKS4gIEdwZyBwcmludHMgdGhpcyBsaW5lCiAg +ICBhbHdheXM7IEdwZ3NtIG9ubHkgaWYgaXQga25vd3MgdGhlIGNlcnRpZmljYXRl +LgoKKioqIEJFR0lOX0RFQ1JZUFRJT04KICAgIE1hcmsgdGhlIHN0YXJ0IG9mIHRo +ZSBhY3R1YWwgZGVjcnlwdGlvbiBwcm9jZXNzLiAgVGhpcyBpcyBhbHNvCiAgICBl +bWl0dGVkIHdoZW4gaW4gLS1saXN0LW9ubHkgbW9kZS4KKioqIEVORF9ERUNSWVBU +SU9OCiAgICBNYXJrIHRoZSBlbmQgb2YgdGhlIGFjdHVhbCBkZWNyeXB0aW9uIHBy +b2Nlc3MuICBUaGlzIGFyZSBhbHNvCiAgICBlbWl0dGVkIHdoZW4gaW4gLS1saXN0 +LW9ubHkgbW9kZS4KKioqIERFQ1JZUFRJT05fSU5GTyA8bWRjX21ldGhvZD4gPHN5 +bV9hbGdvPgogICAgUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bW1ldHJp +YyBlbmNyeXB0aW9uIGFsZ29yaXRobSBhbmQgdGhlCiAgICBNREMgbWV0aG9kLiAg +VGhpcyB3aWxsIGJlIGVtaXR0ZWQgZXZlbiBpZiB0aGUgZGVjcnlwdGlvbiBmYWls +cy4KCioqKiBERUNSWVBUSU9OX0ZBSUxFRAogICAgVGhlIHN5bW1ldHJpYyBkZWNy +eXB0aW9uIGZhaWxlZCAtIG9uZSByZWFzb24gY291bGQgYmUgYSB3cm9uZwogICAg +cGFzc3BocmFzZSBmb3IgYSBzeW1tZXRyaWNhbCBlbmNyeXB0ZWQgbWVzc2FnZS4K +CioqKiBERUNSWVBUSU9OX09LQVkKICAgIFRoZSBkZWNyeXB0aW9uIHByb2Nlc3Mg +c3VjY2VlZGVkLiAgVGhpcyBtZWFucywgdGhhdCBlaXRoZXIgdGhlCiAgICBjb3Jy +ZWN0IHNlY3JldCBrZXkgaGFzIGJlZW4gdXNlZCBvciB0aGUgY29ycmVjdCBwYXNz +cGhyYXNlIGZvciBhCiAgICBzeW1tZXRyaWMgZW5jcnlwdGVkIG1lc3NhZ2Ugd2Fz +IGdpdmVuLiAgVGhlIHByb2dyYW0gaXRzZWxmIG1heQogICAgcmV0dXJuIGFuIGVy +cm9yY29kZSBiZWNhdXNlIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gdmVyaWZ5 +IGEKICAgIHNpZ25hdHVyZSBmb3Igc29tZSByZWFzb25zLgoKKioqIFNFU1NJT05f +S0VZIDxhbGdvPjo8aGV4ZGlnaXRzPgogICAgVGhlIHNlc3Npb24ga2V5IHVzZWQg +dG8gZGVjcnlwdCB0aGUgbWVzc2FnZS4gIFRoaXMgbWVzc2FnZSB3aWxsCiAgICBv +bmx5IGJlIGVtaXR0ZWQgaWYgdGhlIG9wdGlvbiAtLXNob3ctc2Vzc2lvbi1rZXkg +aXMgdXNlZC4gIFRoZQogICAgZm9ybWF0IGlzIHN1aXRhYmxlIHRvIGJlIHBhc3Nl +ZCBhcyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgogICAgLS1vdmVycmlkZS1zZXNzaW9u +LWtleS4gIEl0IGlzIG5vdCBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlCiAgICBkZWNy +eXB0aW9uIHdpbGwgb3IgaGFzIHN1Y2NlZWRlZC4KCioqKiBCRUdJTl9FTkNSWVBU +SU9OICA8bWRjX21ldGhvZD4gPHN5bV9hbGdvPgogICAgTWFyayB0aGUgc3RhcnQg +b2YgdGhlIGFjdHVhbCBlbmNyeXB0aW9uIHByb2Nlc3MuCgoqKiogRU5EX0VOQ1JZ +UFRJT04KICAgIE1hcmsgdGhlIGVuZCBvZiB0aGUgYWN0dWFsIGVuY3J5cHRpb24g +cHJvY2Vzcy4KCioqKiBGSUxFX1NUQVJUIDx3aGF0PiA8ZmlsZW5hbWU+CiAgICBT +dGFydCBwcm9jZXNzaW5nIGEgZmlsZSA8ZmlsZW5hbWU+LiAgPHdoYXQ+IGluZGlj +YXRlcyB0aGUgcGVyZm9ybWVkCiAgICBvcGVyYXRpb246CiAgICAtIDEgOjogdmVy +aWZ5CiAgICAtIDIgOjogZW5jcnlwdAogICAgLSAzIDo6IGRlY3J5cHQKCioqKiBG +SUxFX0RPTkUKICAgIE1hcmtzIHRoZSBlbmQgb2YgYSBmaWxlIHByb2Nlc3Npbmcg +d2hpY2ggaGFzIGJlZW4gc3RhcnRlZAogICAgYnkgRklMRV9TVEFSVC4KCioqKiBC +RUdJTl9TSUdOSU5HCiAgICBNYXJrIHRoZSBzdGFydCBvZiB0aGUgYWN0dWFsIHNp +Z25pbmcgcHJvY2Vzcy4gVGhpcyBtYXkgYmUgdXNlZCBhcwogICAgYW4gaW5kaWNh +dGlvbiB0aGF0IGFsbCByZXF1ZXN0ZWQgc2VjcmV0IGtleXMgYXJlIHJlYWR5IGZv +ciB1c2UuCgoqKiogQUxSRUFEWV9TSUdORUQgPGxvbmcta2V5aWQ+CiAgICBXYXJu +aW5nOiBUaGlzIGlzIGV4cGVyaW1lbnRhbCBhbmQgbWlnaHQgYmUgcmVtb3ZlZCBh +dCBhbnkgdGltZS4KCioqKiBTSUdfQ1JFQVRFRCA8dHlwZT4gPHBrX2FsZ28+IDxo +YXNoX2FsZ28+IDxjbGFzcz4gPHRpbWVzdGFtcD4gPGtleWZwcj4KICAgIEEgc2ln +bmF0dXJlIGhhcyBiZWVuIGNyZWF0ZWQgdXNpbmcgdGhlc2UgcGFyYW1ldGVycy4K +ICAgIFZhbHVlcyBmb3IgdHlwZSA8dHlwZT4gYXJlOgogICAgICAtIEQgOjogZGV0 +YWNoZWQKICAgICAgLSBDIDo6IGNsZWFydGV4dAogICAgICAtIFMgOjogc3RhbmRh +cmQKICAgIChvbmx5IHRoZSBmaXJzdCBjaGFyYWN0ZXIgc2hvdWxkIGJlIGNoZWNr +ZWQpCgogICAgPGNsYXNzPiBhcmUgMiBoZXggZGlnaXRzIHdpdGggdGhlIE9wZW5Q +R1Agc2lnbmF0dXJlIGNsYXNzLgoKICAgIE5vdGUsIHRoYXQgVElNRVNUQU1QIG1h +eSBlaXRoZXIgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBFcG9jaAogICAg +b3IgYW4gSVNPIDg2MDEgc3RyaW5nIHdoaWNoIGNhbiBiZSBkZXRlY3RlZCBieSB0 +aGUgcHJlc2VuY2Ugb2YgdGhlCiAgICBsZXR0ZXIgJ1QnLgoKKioqIE5PVEFUSU9O +XwogICAgVGhlcmUgYXJlIGFjdHVhbGx5IHR3byByZWxhdGVkIHN0YXR1cyBjb2Rl +cyB0byBjb252ZXkgbm90YXRpb24KICAgIGRhdGE6CgogICAgLSBOT1RBVElPTl9O +QU1FIDxuYW1lPgogICAgLSBOT1RBVElPTl9EQVRBIDxzdHJpbmc+CgogICAgPG5h +bWU+IGFuZCA8c3RyaW5nPiBhcmUgJVhYIGVzY2FwZWQ7IHRoZSBkYXRhIG1heSBi +ZSBzcGxpdCBhbW9uZwogICAgc2V2ZXJhbCBOT1RBVElPTl9EQVRBIGxpbmVzLgoK +KioqIFBPTElDWV9VUkwgPHN0cmluZz4KICAgIE5vdGUgdGhhdCBVUkwgaW4gPHN0 +cmluZz4gaXMgJVhYIGVzY2FwZWQuCgoqKiogUExBSU5URVhUIDxmb3JtYXQ+IDx0 +aW1lc3RhbXA+IDxmaWxlbmFtZT4KICAgIFRoaXMgaW5kaWNhdGVzIHRoZSBmb3Jt +YXQgb2YgdGhlIHBsYWludGV4dCB0aGF0IGlzIGFib3V0IHRvIGJlCiAgICB3cml0 +dGVuLiAgVGhlIGZvcm1hdCBpcyBhIDEgYnl0ZSBoZXggY29kZSB0aGF0IHNob3dz +IHRoZSBmb3JtYXQgb2YKICAgIHRoZSBwbGFpbnRleHQ6IDYyICgnYicpIGlzIGJp +bmFyeSBkYXRhLCA3NCAoJ3QnKSBpcyB0ZXh0IGRhdGEgd2l0aAogICAgbm8gY2hh +cmFjdGVyIHNldCBzcGVjaWZpZWQsIGFuZCA3NSAoJ3UnKSBpcyB0ZXh0IGRhdGEg +ZW5jb2RlZCBpbgogICAgdGhlIFVURi04IGNoYXJhY3RlciBzZXQuICBUaGUgdGlt +ZXN0YW1wIGlzIGluIHNlY29uZHMgc2luY2UgdGhlCiAgICBlcG9jaC4gIElmIGEg +ZmlsZW5hbWUgaXMgYXZhaWxhYmxlIGl0IGdldHMgcHJpbnRlZCBhcyB0aGUgdGhp +cmQKICAgIGFyZ3VtZW50LCBwZXJjZW50LWVzY2FwZWQgYXMgdXN1YWwuCgoqKiog +UExBSU5URVhUX0xFTkdUSCA8bGVuZ3RoPgogICAgVGhpcyBpbmRpY2F0ZXMgdGhl +IGxlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IHRoYXQgaXMgYWJvdXQgdG8gYmUKICAg +IHdyaXR0ZW4uICBOb3RlIHRoYXQgaWYgdGhlIHBsYWludGV4dCBwYWNrZXQgaGFz +IHBhcnRpYWwgbGVuZ3RoCiAgICBlbmNvZGluZyBpdCBpcyBub3QgcG9zc2libGUg +dG8ga25vdyB0aGUgbGVuZ3RoIGFoZWFkIG9mIHRpbWUuICBJbgogICAgdGhhdCBj +YXNlLCB0aGlzIHN0YXR1cyB0YWcgZG9lcyBub3QgYXBwZWFyLgoKKioqIEFUVFJJ +QlVURSA8YXJndW1lbnRzPgogICAgVGhlIGxpc3Qgb3IgYXJnZW1udHMgYXJlOgog +ICAgLSA8ZnByPgogICAgLSA8b2N0ZXRzPgogICAgLSA8dHlwZT4KICAgIC0gPGlu +ZGV4PgogICAgLSA8Y291bnQ+CiAgICAtIDx0aW1lc3RhbXA+CiAgICAtIDxleHBp +cmVkYXRlPgogICAgLSA8ZmxhZ3M+CgogICAgVGhpcyBpcyBvbmUgbG9uZyBsaW5l +IGlzc3VlZCBmb3IgZWFjaCBhdHRyaWJ1dGUgc3VicGFja2V0IHdoZW4gYW4KICAg +IGF0dHJpYnV0ZSBwYWNrZXQgaXMgc2VlbiBkdXJpbmcga2V5IGxpc3RpbmcuICA8 +ZnByPiBpcyB0aGUKICAgIGZpbmdlcnByaW50IG9mIHRoZSBrZXkuICA8b2N0ZXRz +PiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUKICAgIHN1YnBhY2tldC4g +IDx0eXBlPiBpcyB0aGUgYXR0cmlidXRlIHR5cGUgKGUuZy4gMSBmb3IgYW4gaW1h +Z2UpLgogICAgPGluZGV4PiBhbmQgPGNvdW50PiBpbmRpY2F0ZSB0aGF0IHRoaXMg +aXMgdGhlIE4tdGggaW5kZXhlZAogICAgc3VicGFja2V0IG9mIGNvdW50IHRvdGFs +IHN1YnBhY2tldHMgaW4gdGhpcyBhdHRyaWJ1dGUgcGFja2V0LgogICAgPHRpbWVz +dGFtcD4gYW5kIDxleHBpcmVkYXRlPiBhcmUgZnJvbSB0aGUgc2VsZi1zaWduYXR1 +cmUgb24gdGhlCiAgICBhdHRyaWJ1dGUgcGFja2V0LiAgSWYgdGhlIGF0dHJpYnV0 +ZSBwYWNrZXQgZG9lcyBub3QgaGF2ZSBhIHZhbGlkCiAgICBzZWxmLXNpZ25hdHVy +ZSwgdGhlbiB0aGUgdGltZXN0YW1wIGlzIDAuICA8ZmxhZ3M+IGFyZSBhIGJpdHdp +c2UgT1IKICAgIG9mOgogICAgLSAweDAxIDo6IHRoaXMgYXR0cmlidXRlIHBhY2tl +dCBpcyBhIHByaW1hcnkgdWlkCiAgICAtIDB4MDIgOjogdGhpcyBhdHRyaWJ1dGUg +cGFja2V0IGlzIHJldm9rZWQKICAgIC0gMHgwNCA6OiB0aGlzIGF0dHJpYnV0ZSBw +YWNrZXQgaXMgZXhwaXJlZAoKKioqIFNJR19TVUJQQUNLRVQgPHR5cGU+IDxmbGFn +cz4gPGxlbj4gPGRhdGE+CiAgICBUaGlzIGluZGljYXRlcyB0aGF0IGEgc2lnbmF0 +dXJlIHN1YnBhY2tldCB3YXMgc2Vlbi4gIFRoZSBmb3JtYXQgaXMKICAgIHRoZSBz +YW1lIGFzIHRoZSAic3BrIiByZWNvcmQgYWJvdmUuCgoqKiBLZXkgcmVsYXRlZAoq +KiogSU5WX1JFQ1AsIElOVl9TR05SCiAgICBUaGUgdHdvIHNpbWlsYXIgc3RhdHVz +IGNvZGVzOgoKICAgIC0gSU5WX1JFQ1AgPHJlYXNvbj4gPHJlcXVlc3RlZF9yZWNp +cGllbnQ+CiAgICAtIElOVl9TR05SIDxyZWFzb24+IDxyZXF1ZXN0ZWRfc2VuZGVy +PgoKICAgIGFyZSBpc3N1ZWQgZm9yIGVhY2ggdW51c2FibGUgcmVjaXBpZW50L3Nl +bmRlci4gVGhlIHJlYXNvbnMgY29kZXMKICAgIGN1cnJlbnRseSBpbiB1c2UgYXJl +OgoKICAgICAgIC0gIDAgOjogTm8gc3BlY2lmaWMgcmVhc29uIGdpdmVuCiAgICAg +ICAtICAxIDo6IE5vdCBGb3VuZAogICAgICAgLSAgMiA6OiBBbWJpZ2lvdXMgc3Bl +Y2lmaWNhdGlvbgogICAgICAgLSAgMyA6OiBXcm9uZyBrZXkgdXNhZ2UKICAgICAg +IC0gIDQgOjogS2V5IHJldm9rZWQKICAgICAgIC0gIDUgOjogS2V5IGV4cGlyZWQK +ICAgICAgIC0gIDYgOjogTm8gQ1JMIGtub3duCiAgICAgICAtICA3IDo6IENSTCB0 +b28gb2xkCiAgICAgICAtICA4IDo6IFBvbGljeSBtaXNtYXRjaAogICAgICAgLSAg +OSA6OiBOb3QgYSBzZWNyZXQga2V5CiAgICAgICAtIDEwIDo6IEtleSBub3QgdHJ1 +c3RlZAogICAgICAgLSAxMSA6OiBNaXNzaW5nIGNlcnRpZmljYXRlCiAgICAgICAt +IDEyIDo6IE1pc3NpbmcgaXNzdWVyIGNlcnRpZmljYXRlCiAgICAgICAtIDEzIDo6 +IEtleSBkaXNhYmxlZAogICAgICAgLSAxNCA6OiBTeW50YXggZXJyb3IgaW4gc3Bl +Y2lmaWNhdGlvbgoKICAgIE5vdGUgdGhhdCBmb3IgaGlzdG9yaWNhbCByZWFzb25z +IHRoZSBJTlZfUkVDUCBzdGF0dXMgaXMgYWxzbyB1c2VkCiAgICBmb3IgZ3Bnc20n +cyBTSUdORVIgY29tbWFuZCB3aGVyZSBpdCByZWxhdGVzIHRvIHNpZ25lcidzIG9m +IGNvdXJzZS4KICAgIE5ld2VyIEdudVBHIHZlcnNpb25zIGFyZSB1c2luZyBJTlZf +U0dOUjsgYXBwbGljYXRpb25zIHNob3VsZAogICAgaWdub3JlIHRoZSBJTlZfUkVD +UCBkdXJpbmcgdGhlIHNlbmRlcidzIGNvbW1hbmQgcHJvY2Vzc2luZyBvbmNlCiAg +ICB0aGV5IGhhdmUgc2VlbiBhbiBJTlZfU0dOUi4gIERpZmZlcmVudCBjb2RlcyBh +cmUgdXNlZCBzbyB0aGF0IHRoZXkKICAgIGNhbiBiZSBkaXN0aW5ndWlzaCB3aGls +ZSBkb2luZyBhbiBlbmNyeXB0K3NpZ24gb3BlcmF0aW9uLgoqKiogTk9fUkVDUCA8 +cmVzZXJ2ZWQ+CiAgICBJc3N1ZWQgaWYgbm8gcmVjaXBpZW50cyBhcmUgdXNhYmxl +LgoKKioqIE5PX1NHTlIgPHJlc2VydmVkPgogICAgSXNzdWVkIGlmIG5vIHNlbmRl +cnMgYXJlIHVzYWJsZS4KCioqKiBLRVlFWFBJUkVEIDxleHBpcmUtdGltZXN0YW1w +PgogICAgVGhlIGtleSBoYXMgZXhwaXJlZC4gIGV4cGlyZS10aW1lc3RhbXAgaXMg +dGhlIGV4cGlyYXRpb24gdGltZSBpbgogICAgc2Vjb25kcyBzaW5jZSBFcG9jaC4g +IFRoaXMgc3RhdHVzIGxpbmUgaXMgbm90IHZlcnkgdXNlZnVsIGJlY2F1c2UKICAg +IGl0IHdpbGwgYWxzbyBiZSBlbWl0dGVkIGZvciBleHBpcmVkIHN1YmtleXMgZXZl +biBpZiB0aGlzIHN1YmtleSBpcwogICAgbm90IHVzZWQuICBUbyBjaGVjayB3aGV0 +aGVyIGEga2V5IHVzZWQgdG8gc2lnbiBhIG1lc3NhZ2UgaGFzCiAgICBleHBpcmVk +LCB0aGUgRVhQS0VZU0lHIHN0YXR1cyBsaW5lIGlzIHRvIGJlIHVzZWQuCgogICAg +Tm90ZSwgdGhhdCB0aGUgVElNRVNUQU1QIG1heSBlaXRoZXIgYmUgYSBudW1iZXIg +b2Ygc2Vjb25kcyBzaW5jZQogICAgRXBvY2ggb3IgYW4gSVNPIDg2MDEgc3RyaW5n +IHdoaWNoIGNhbiBiZSBkZXRlY3RlZCBieSB0aGUgcHJlc2VuY2UKICAgIG9mIHRo +ZSBsZXR0ZXIgJ1QnLgoKKioqIEtFWVJFVk9LRUQKICAgIFRoZSB1c2VkIGtleSBo +YXMgYmVlbiByZXZva2VkIGJ5IGl0cyBvd25lci4gIE5vIGFyZ3VtZW50cyB5ZXQu +CgoqKiogTk9fUFVCS0VZICA8bG9uZyBrZXlpZD4KICAgIFRoZSBwdWJsaWMga2V5 +IGlzIG5vdCBhdmFpbGFibGUKCioqKiBOT19TRUNLRVkgIDxsb25nIGtleWlkPgog +ICAgVGhlIHNlY3JldCBrZXkgaXMgbm90IGF2YWlsYWJsZQoKKioqIEtFWV9DUkVB +VEVEIDx0eXBlPiA8ZmluZ2VycHJpbnQ+IFs8aGFuZGxlPl0KICAgIEEga2V5IGhh +cyBiZWVuIGNyZWF0ZWQuICBWYWx1ZXMgZm9yIDx0eXBlPiBhcmU6CiAgICAgIC0g +QiA6OiBwcmltYXJ5IGFuZCBzdWJrZXkKICAgICAgLSBQIDo6IHByaW1hcnkKICAg +ICAgLSBTIDo6IHN1YmtleQogICAgVGhlIGZpbmdlcnByaW50IGlzIG9uZSBvZiB0 +aGUgcHJpbWFyeSBrZXkgZm9yIHR5cGUgQiBhbmQgUCBhbmQgdGhlCiAgICBvbmUg +b2YgdGhlIHN1YmtleSBmb3IgUy4gIEhhbmRsZSBpcyBhbiBhcmJpdHJhcnkgbm9u +LXdoaXRlc3BhY2UKICAgIHN0cmluZyB1c2VkIHRvIG1hdGNoIGtleSBwYXJhbWV0 +ZXJzIGZyb20gYmF0Y2gga2V5IGNyZWF0aW9uIHJ1bi4KCioqKiBLRVlfTk9UX0NS +RUFURUQgWzxoYW5kbGU+XQogICAgVGhlIGtleSBmcm9tIGJhdGNoIHJ1biBoYXMg +bm90IGJlZW4gY3JlYXRlZCBkdWUgdG8gZXJyb3JzLgoKKioqIFRSVVNUXwogICAg +VGhlc2UgYXJlIHNldmVyYWwgc2ltaWxhciBzdGF0dXMgY29kZXM6CgogICAgLSBU +UlVTVF9VTkRFRklORUQgPGVycm9yX3Rva2VuPgogICAgLSBUUlVTVF9ORVZFUiAg +ICAgPGVycm9yX3Rva2VuPgogICAgLSBUUlVTVF9NQVJHSU5BTCAgWzAgIFs8dmFs +aWRhdGlvbl9tb2RlbD5dXQogICAgLSBUUlVTVF9GVUxMWSAgICAgWzAgIFs8dmFs +aWRhdGlvbl9tb2RlbD5dXQogICAgLSBUUlVTVF9VTFRJTUFURSAgWzAgIFs8dmFs +aWRhdGlvbl9tb2RlbD5dXQoKICAgIEZvciBnb29kIHNpZ25hdHVyZXMgb25lIG9m +IHRoZXNlIHN0YXR1cyBsaW5lcyBhcmUgZW1pdHRlZCB0bwogICAgaW5kaWNhdGUg +dGhlIHZhbGlkaXR5IG9mIHRoZSBrZXkgdXNlZCB0byBjcmVhdGUgdGhlIHNpZ25h +dHVyZS4KICAgIFRoZSBlcnJvciB0b2tlbiB2YWx1ZXMgYXJlIGN1cnJlbnRseSBv +bmx5IGVtaXR0ZWQgYnkgZ3Bnc20uCgogICAgVkFMSURBVElPTl9NT0RFTCBkZXNj +cmliZXMgdGhlIGFsZ29yaXRobSB1c2VkIHRvIGNoZWNrIHRoZQogICAgdmFsaWRp +dHkgb2YgdGhlIGtleS4gIFRoZSBkZWZhdWx0cyBhcmUgdGhlIHN0YW5kYXJkIFdl +YiBvZiBUcnVzdAogICAgbW9kZWwgZm9yIGdwZyBhbmQgdGhlIHRoZSBzdGFuZGFy +ZCBYLjUwOSBtb2RlbCBmb3IgZ3Bnc20uICBUaGUKICAgIGRlZmluZWQgdmFsdWVz +IGFyZQoKICAgICAgIC0gcGdwICAgOjogVGhlIHN0YW5kYXJkIFBHUCBXb1QuCiAg +ICAgICAtIHNoZWxsIDo6IFRoZSBzdGFuZGFyZCBYLjUwOSBtb2RlbC4KICAgICAg +IC0gY2hhaW4gOjogVGhlIGNoYWluIG1vZGVsLgogICAgICAgLSBzdGVlZCA6OiBU +aGUgU1RFRUQgbW9kZWwuCgogICAgTm90ZSB0aGF0IHRoZSB0ZXJtID1UUlVTVF89 +IGluIHRoZSBzdGF0dXMgbmFtZXMgaXMgdXNlZCBmb3IKICAgIGhpc3RvcmljIHJl +YXNvbnM7IHdlIG5vdyBzcGVhayBvZiB2YWxpZGl0eS4KCioqKiBQS0FfVFJVU1Rf +CiAgICBUaGlzIGlzIGlzIG9uZToKCiAgICAtIFBLQV9UUlVTVF9HT09EIDxtYWls +Ym94PgogICAgLSBQS0FfVFJVU1RfQkFEICA8bWFpbGJveD4KCiAgICBEZXBlbmRp +bmcgb24gdGhlIG91dGNvbWUgb2YgdGhlIFBLQSBjaGVjayBvbmUgb2YgdGhlIGFi +b3ZlIHN0YXR1cwogICAgY29kZXMgaXMgZW1pdHRlZCBpbiBhZGRpdGlvbiB0byBh +ID1UUlVTVF8qPSBzdGF0dXMuCgoqKiBSZW1vdGUgY29udHJvbAoqKiogR0VUX0JP +T0wsIEdFVF9MSU5FLCBHRVRfSElEREVOLCBHT1RfSVQKCiAgICBUaGVzZSBzdGF0 +dXMgbGluZSBhcmUgdXNlZCB3aXRoIC0tY29tbWFuZC1mZCBmb3IgaW50ZXJhY3Rp +dmUKICAgIGNvbnRyb2wgb2YgdGhlIHByb2Nlc3MuCgoqKiogVVNFUklEX0hJTlQg +PGxvbmcgbWFpbiBrZXlpZD4gPHN0cmluZz4KICAgIEdpdmUgYSBoaW50IGFib3V0 +IHRoZSB1c2VyIElEIGZvciBhIGNlcnRhaW4ga2V5SUQuCgoqKiogTkVFRF9QQVNT +UEhSQVNFIDxsb25nIGtleWlkPiA8bG9uZyBtYWluIGtleWlkPiA8a2V5dHlwZT4g +PGtleWxlbmd0aD4KICAgIElzc3VlZCB3aGVuZXZlciBhIHBhc3NwaHJhc2UgaXMg +bmVlZGVkLiAgS0VZVFlQRSBpcyB0aGUgbnVtZXJpY2FsCiAgICB2YWx1ZSBvZiB0 +aGUgcHVibGljIGtleSBhbGdvcml0aG0gb3IgMCBpZiB0aGlzIGlzIG5vdCBhcHBs +aWNhYmxlLAogICAgS0VZTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIGtleSBv +ciAwIGlmIGl0IGlzIG5vdCBrbm93biAodGhpcwogICAgaXMgY3VycmVudGx5IGFs +d2F5cyB0aGUgY2FzZSkuCgoqKiogTkVFRF9QQVNTUEhSQVNFX1NZTSA8Y2lwaGVy +X2FsZ28+IDxzMmtfbW9kZT4gPHMya19oYXNoPgogICAgSXNzdWVkIHdoZW5ldmVy +IGEgcGFzc3BocmFzZSBmb3Igc3ltbWV0cmljIGVuY3J5cHRpb24gaXMgbmVlZGVk +LgoKKioqIE5FRURfUEFTU1BIUkFTRV9QSU4gPGNhcmRfdHlwZT4gPGNodm5vPiBb +PHNlcmlhbG5vPl0KICAgIElzc3VlZCB3aGVuZXZlciBhIFBJTiBpcyByZXF1ZXN0 +ZWQgdG8gdW5sb2NrIGEgY2FyZC4KCioqKiBNSVNTSU5HX1BBU1NQSFJBU0UKICAg +IE5vIHBhc3NwaHJhc2Ugd2FzIHN1cHBsaWVkLiAgQW4gYXBwbGljYXRpb24gd2hp +Y2ggZW5jb3VudGVycyB0aGlzCiAgICBtZXNzYWdlIG1heSB3YW50IHRvIHN0b3Ag +cGFyc2luZyBpbW1lZGlhdGVseSBiZWNhdXNlIHRoZSBuZXh0CiAgICBtZXNzYWdl +IHdpbGwgcHJvYmFibHkgYmUgYSBCQURfUEFTU1BIUkFTRS4gIEhvd2V2ZXIsIGlm +IHRoZQogICAgYXBwbGljYXRpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUga2V5 +IGVkaXQgbWVudSBmdW5jdGlvbmFsaXR5IGl0CiAgICBtaWdodCBub3QgbWFrZSBz +ZW5zZSB0byBzdG9wIHBhcnNpbmcgYnV0IHNpbXBseSBpZ25vcmluZyB0aGUKICAg +IGZvbGxvd2luZyBCQURfUEFTU1BIUkFTRS4KCioqKiBCQURfUEFTU1BIUkFTRSA8 +bG9uZyBrZXlpZD4KICAgIFRoZSBzdXBwbGllZCBwYXNzcGhyYXNlIHdhcyB3cm9u +ZyBvciBub3QgZ2l2ZW4uICBJbiB0aGUgbGF0dGVyCiAgICBjYXNlIHlvdSBtYXkg +aGF2ZSBzZWVuIGEgTUlTU0lOR19QQVNTUEhSQVNFLgoKKioqIEdPT0RfUEFTU1BI +UkFTRQogICAgVGhlIHN1cHBsaWVkIHBhc3NwaHJhc2Ugd2FzIGdvb2QgYW5kIHRo +ZSBzZWNyZXQga2V5IG1hdGVyaWFsCiAgICBpcyB0aGVyZWZvcmUgdXNhYmxlLgoK +KiogSW1wb3J0L0V4cG9ydAoqKiogSU1QT1JUX0NIRUNLIDxsb25nIGtleWlkPiA8 +ZmluZ2VycHJpbnQ+IDx1c2VyIElEPgogICAgVGhpcyBzdGF0dXMgaXMgZW1pdHRl +ZCBpbiBpbnRlcmFjdGl2ZSBtb2RlIHJpZ2h0IGJlZm9yZQogICAgdGhlICJpbXBv +cnQub2theSIgcHJvbXB0LgoKKioqIElNUE9SVEVEICAgPGxvbmcga2V5aWQ+ICA8 +dXNlcm5hbWU+CiAgICBUaGUga2V5aWQgYW5kIG5hbWUgb2YgdGhlIHNpZ25hdHVy +ZSBqdXN0IGltcG9ydGVkCgoqKiogSU1QT1JUX09LICA8cmVhc29uPiBbPGZpbmdl +cnByaW50Pl0KICAgIFRoZSBrZXkgd2l0aCB0aGUgcHJpbWFyeSBrZXkncyBGSU5H +RVJQUklOVCBoYXMgYmVlbiBpbXBvcnRlZC4KICAgIFJFQVNPTiBmbGFncyBhcmU6 +CgogICAgLSAwIDo6IE5vdCBhY3R1YWxseSBjaGFuZ2VkCiAgICAtIDEgOjogRW50 +aXJlbHkgbmV3IGtleS4KICAgIC0gMiA6OiBOZXcgdXNlciBJRHMKICAgIC0gNCA6 +OiBOZXcgc2lnbmF0dXJlcwogICAgLSA4IDo6IE5ldyBzdWJrZXlzCiAgICAtIDE2 +IDo6IENvbnRhaW5zIHByaXZhdGUga2V5LgoKICAgIFRoZSBmbGFncyBtYXkgYmUg +T1JlZC4KCioqKiBJTVBPUlRfUFJPQkxFTSA8cmVhc29uPiBbPGZpbmdlcnByaW50 +Pl0KICAgIElzc3VlZCBmb3IgZWFjaCBpbXBvcnQgZmFpbHVyZS4gIFJlYXNvbiBj +b2RlcyBhcmU6CgogICAgLSAwIDo6IE5vIHNwZWNpZmljIHJlYXNvbiBnaXZlbi4K +ICAgIC0gMSA6OiBJbnZhbGlkIENlcnRpZmljYXRlLgogICAgLSAyIDo6IElzc3Vl +ciBDZXJ0aWZpY2F0ZSBtaXNzaW5nLgogICAgLSAzIDo6IENlcnRpZmljYXRlIENo +YWluIHRvbyBsb25nLgogICAgLSA0IDo6IEVycm9yIHN0b3JpbmcgY2VydGlmaWNh +dGUuCgoqKiogSU1QT1JUX1JFUyA8YXJncz4KICAgIEZpbmFsIHN0YXRpc3RpY3Mg +b24gaW1wb3J0IHByb2Nlc3MgKHRoaXMgaXMgb25lIGxvbmcgbGluZSkuIFRoZQog +ICAgYXJncyBhcmUgYSBsaXN0IG9mIHVuc2lnbmVkIG51bWJlcnMgc2VwYXJhdGVk +IGJ5IHdoaXRlIHNwYWNlOgoKICAgIC0gPGNvdW50PgogICAgLSA8bm9fdXNlcl9p +ZD4KICAgIC0gPGltcG9ydGVkPgogICAgLSBhbHdheXMgMCAoZm9ybWVybHkgdXNl +ZCBmb3IgdGhlIG51bWJlciBvZiBSU0Ega2V5cykKICAgIC0gPHVuY2hhbmdlZD4K +ICAgIC0gPG5fdWlkcz4KICAgIC0gPG5fc3Viaz4KICAgIC0gPG5fc2lncz4KICAg +IC0gPG5fcmV2b2M+CiAgICAtIDxzZWNfcmVhZD4KICAgIC0gPHNlY19pbXBvcnRl +ZD4KICAgIC0gPHNlY19kdXBzPgogICAgLSA8c2tpcHBlZF9uZXdfa2V5cz4KICAg +IC0gPG5vdF9pbXBvcnRlZD4KICAgIC0gPHNraXBwZWRfdjNfa2V5cz4KCioqKiBF +WFBPUlRFRCAgPGZpbmdlcnByaW50PgogICAgVGhlIGtleSB3aXRoIDxmaW5nZXJw +cmludD4gaGFzIGJlZW4gZXhwb3J0ZWQuICBUaGUgZmluZ2VycHJpbnQgaXMKICAg +IHRoZSBmaW5nZXJwcmludCBvZiB0aGUgcHJpbWFyeSBrZXkgZXZlbiBpZiB0aGUg +cHJpbWFyeSBrZXkgaGFzCiAgICBiZWVuIHJlcGxhY2VkIGJ5IGEgc3R1YiBrZXkg +ZHVyaW5nIHNlY3JldCBrZXkgZXhwb3J0LgoKKioqIEVYUE9SVF9SRVMgPGFyZ3M+ +CgogICAgRmluYWwgc3RhdGlzdGljcyBvbiBleHBvcnQgcHJvY2VzcyAodGhpcyBp +cyBvbmUgbG9uZyBsaW5lKS4gVGhlCiAgICBhcmdzIGFyZSBhIGxpc3Qgb2YgdW5z +aWduZWQgbnVtYmVycyBzZXBhcmF0ZWQgYnkgd2hpdGUgc3BhY2U6CgogICAgLSA8 +Y291bnQ+CiAgICAtIDxzZWNyZXRfY291bnQ+CiAgICAtIDxleHBvcnRlZD4KCgoq +KiBTbWFydGNhcmQgcmVsYXRlZAoqKiogQ0FSRENUUkwgPHdoYXQ+IFs8c2VyaWFs +bm8+XQogICAgVGhpcyBpcyB1c2VkIHRvIGNvbnRyb2wgc21hcnRjYXJkIG9wZXJh +dGlvbnMuICBEZWZpbmVkIHZhbHVlcyBmb3IKICAgIFdIQVQgYXJlOgoKICAgICAg +LSAxIDo6IFJlcXVlc3QgaW5zZXJ0aW9uIG9mIGEgY2FyZC4gIFNlcmlhbG51bWJl +ciBtYXkgYmUgZ2l2ZW4KICAgICAgICAgICAgIHRvIHJlcXVlc3QgYSBzcGVjaWZp +YyBjYXJkLiAgVXNlZCBieSBncGcgMS40IHcvbwogICAgICAgICAgICAgc2NkYWVt +b24KICAgICAgLSAyIDo6IFJlcXVlc3QgcmVtb3ZhbCBvZiBhIGNhcmQuICBVc2Vk +IGJ5IGdwZyAxLjQgdy9vIHNjZGFlbW9uLgogICAgICAtIDMgOjogQ2FyZCB3aXRo +IHNlcmlhbG51bWJlciBkZXRlY3RlZAogICAgICAtIDQgOjogTm8gY2FyZCBhdmFp +bGFibGUKICAgICAgLSA1IDo6IE5vIGNhcmQgcmVhZGVyIGF2YWlsYWJsZQogICAg +ICAtIDYgOjogTm8gY2FyZCBzdXBwb3J0IGF2YWlsYWJsZQogICAgICAtIDcgOjog +Q2FyZCBpcyBpbiB0ZXJtaW5hdGlvbiBzdGF0ZQoKKioqIFNDX09QX0ZBSUxVUkUg +Wzxjb2RlPl0KICAgIEFuIG9wZXJhdGlvbiBvbiBhIHNtYXJ0Y2FyZCBkZWZpbml0 +ZWx5IGZhaWxlZC4gIEN1cnJlbnRseSB0aGVyZSBpcwogICAgbm8gaW5kaWNhdGlv +biBvZiB0aGUgYWN0dWFsIGVycm9yIGNvZGUsIGJ1dCBhcHBsaWNhdGlvbiBzaG91 +bGQgYmUKICAgIHByZXBhcmVkIHRvIGxhdGVyIGFjY2VwdCBtb3JlIGFyZ3VtZW50 +cy4gIERlZmluZWQgdmFsdWVzIGZvcgogICAgPGNvZGU+IGFyZToKCiAgICAgIC0g +MCA6OiB1bnNwZWNpZmllZCBlcnJvciAoaWRlbnRpY2FsbHkgdG8gYSBtaXNzaW5n +IENPREUpCiAgICAgIC0gMSA6OiBjYW5jZWxlZAogICAgICAtIDIgOjogYmFkIFBJ +TgoKKioqIFNDX09QX1NVQ0NFU1MKICAgIEEgc21hcnQgY2FyZCBvcGVyYWlvbiBz +dWNjZWVkZWQuICBUaGlzIHN0YXR1cyBpcyBvbmx5IHByaW50ZWQgZm9yCiAgICBj +ZXJ0YWluIG9wZXJhdGlvbiBhbmQgaXMgbW9zdGx5IHVzZWZ1bCB0byBjaGVjayB3 +aGV0aGVyIGEgUElOCiAgICBjaGFuZ2UgcmVhbGx5IHdvcmtlZC4KCioqIE1pc2Nl +bGxhbmVvdXMgc3RhdHVzIGNvZGVzCioqKiBOT0RBVEEgIDx3aGF0PgogICAgTm8g +ZGF0YSBoYXMgYmVlbiBmb3VuZC4gIENvZGVzIGZvciBXSEFUIGFyZToKCiAgICAt +IDEgOjogTm8gYXJtb3JlZCBkYXRhLgogICAgLSAyIDo6IEV4cGVjdGVkIGEgcGFj +a2V0IGJ1dCBkaWQgbm90IGZvdW5kIG9uZS4KICAgIC0gMyA6OiBJbnZhbGlkIHBh +Y2tldCBmb3VuZCwgdGhpcyBtYXkgaW5kaWNhdGUgYSBub24gT3BlblBHUAogICAg +ICAgICAgIG1lc3NhZ2UuCiAgICAtIDQgOjogU2lnbmF0dXJlIGV4cGVjdGVkIGJ1 +dCBub3QgZm91bmQKCiAgICBZb3UgbWF5IHNlZSBtb3JlIHRoYW4gb25lIG9mIHRo +ZXNlIHN0YXR1cyBsaW5lcy4KCioqKiBVTkVYUEVDVEVEIDx3aGF0PgogICAgVW5l +eHBlY3RlZCBkYXRhIGhhcyBiZWVuIGVuY291bnRlcmVkLiAgQ29kZXMgZm9yIFdI +QVQgYXJlOgogICAgLSAwIDo6IE5vdCBmdXJ0aGVyIHNwZWNpZmllZAogICAgLSAx +IDo6IENvcnJ1cHRlZCBtZXNzYWdlIHN0cnVjdHVyZQoKKioqIFRSVU5DQVRFRCA8 +bWF4bm8+CiAgICBUaGUgb3V0cHV0IHdhcyB0cnVuY2F0ZWQgdG8gTUFYTk8gaXRl +bXMuICBUaGlzIHN0YXR1cyBjb2RlIGlzCiAgICBpc3N1ZWQgZm9yIGNlcnRhaW4g +ZXh0ZXJuYWwgcmVxdWVzdHMuCgoqKiogRVJST1IgPGVycm9yIGxvY2F0aW9uPiA8 +ZXJyb3IgY29kZT4gWzxtb3JlPl0KICAgIFRoaXMgaXMgYSBnZW5lcmljIGVycm9y +IHN0YXR1cyBtZXNzYWdlLCBpdCBtaWdodCBiZSBmb2xsb3dlZCBieQogICAgZXJy +b3IgbG9jYXRpb24gc3BlY2lmaWMgZGF0YS4gPGVycm9yIGNvZGU+IGFuZCA8ZXJy +b3JfbG9jYXRpb24+CiAgICBzaG91bGQgbm90IGNvbnRhaW4gc3BhY2VzLiAgVGhl +IGVycm9yIGNvZGUgaXMgYSBlaXRoZXIgYSBzdHJpbmcKICAgIGNvbW1lbmNpbmcg +d2l0aCBhIGxldHRlciBvciBzdWNoIGEgc3RyaW5nIHByZWZpeGVkIHdpdGggYQog +ICAgbnVtZXJpY2FsIGVycm9yIGNvZGUgYW5kIGFuIHVuZGVyc2NvcmU7IGUuZy46 +ICIxNTEwMTEzMjdfRU9GIi4KKioqIFdBUk5JTkcgPGxvY2F0aW9uPiA8ZXJyb3Ig +Y29kZT4gWzx0ZXh0Pl0KICAgIFRoaXMgaXMgYSBnZW5lcmljIHdhcm5pbmcgc3Rh +dHVzIG1lc3NhZ2UsIGl0IG1pZ2h0IGJlIGZvbGxvd2VkIGJ5CiAgICBlcnJvciBs +b2NhdGlvbiBzcGVjaWZpYyBkYXRhLiA8ZXJyb3IgY29kZT4gYW5kIDxsb2NhdGlv +bj4KICAgIHNob3VsZCBub3QgY29udGFpbiBzcGFjZXMuICBUaGUgZXJyb3IgY29k +ZSBpcyBhIGVpdGhlciBhIHN0cmluZwogICAgY29tbWVuY2luZyB3aXRoIGEgbGV0 +dGVyIG9yIHN1Y2ggYSBzdHJpbmcgcHJlZml4ZWQgd2l0aCBhCiAgICBudW1lcmlj +YWwgZXJyb3IgY29kZSBhbmQgYW4gdW5kZXJzY29yZTsgZS5nLjogIjE1MTAxMTMy +N19FT0YiLgoqKiogU1VDQ0VTUyBbPGxvY2F0aW9uPl0KICAgIFBvc3RpdmUgY29u +ZmlybWF0aW9uIHRoYXQgYW4gb3BlcmF0aW9uIHN1Y2NlZWRlZC4gIEl0IGlzIHVz +ZWQKICAgIHNpbWlsYXIgdG8gSVNPLUMncyBFWElUX1NVQ0NFU1MuICA8bG9jYXRp +b24+IGlzIG9wdGlvbmFsIGJ1dCBpZgogICAgZ2l2ZW4gc2hvdWxkIG5vdCBjb250 +YWluIHNwYWNlcy4gIFVzZWQgb25seSB3aXRoIGEgZmV3IGNvbW1hbmRzLgoKKioq +IEZBSUxVUkUgPGxvY2F0aW9uPiA8ZXJyb3JfY29kZT4KICAgIFRoaXMgaXMgdGhl +IGNvdW50ZXJwYXJ0IHRvIFNVQ0NFU1MgYW5kIHVzZWQgdG8gaW5kaWNhdGUgYSBw +cm9ncmFtCiAgICBmYWlsdXJlLiAgSXQgaXMgdXNlZCBzaW1pbGFyIHRvIElTTy1D +J3MgRVhJVF9GQUlMVVJFIGJ1dCBhbGxvd3MgdG8KICAgIGNvbnZleSBtb3JlIGlu +Zm9ybWF0aW9uLCBpbiBwYXJ0aWN1bGFyIGFuIGdwZy1lcnJvciBlcnJvciBjb2Rl +LgogICAgVGhhdCBudW1lcmljYWwgZXJyb3IgY29kZSBtYXkgb3B0aW9uYWxseSBo +YXZlIGEgc3VmZml4IG1hZGUgb2YgYW4KICAgIHVuZGVyc2NvcmUgYW5kIGEgc3Ry +aW5nIHdpdGggYW4gZXJyb3Igc3ltYm9sIGxpa2UgIjE1MTAxMTMyN19FT0YiLgog +ICAgQSBkYXNoIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgPGxvY2F0aW9uPi4KCioq +KiBCQURBUk1PUgogICAgVGhlIEFTQ0lJIGFybW9yIGlzIGNvcnJ1cHRlZC4gIE5v +IGFyZ3VtZW50cyB5ZXQuCgoqKiogREVMRVRFX1BST0JMRU0gPHJlYXNvbl9jb2Rl +PgogICAgRGVsZXRpbmcgYSBrZXkgZmFpbGVkLiAgUmVhc29uIGNvZGVzIGFyZToK +ICAgIC0gMSA6OiBObyBzdWNoIGtleQogICAgLSAyIDo6IE11c3QgZGVsZXRlIHNl +Y3JldCBrZXkgZmlyc3QKICAgIC0gMyA6OiBBbWJpZ2lvdXMgc3BlY2lmaWNhdGlv +bgogICAgLSA0IDo6IEtleSBpcyBzdG9yZWQgb24gYSBzbWFydGNhcmQuCgoqKiog +UFJPR1JFU1MgPHdoYXQ+IDxjaGFyPiA8Y3VyPiA8dG90YWw+CiAgICBVc2VkIGJ5 +IHRoZSBwcmltZWdlbiBhbmQgUHVibGljIGtleSBmdW5jdGlvbnMgdG8gaW5kaWNh +dGUKICAgIHByb2dyZXNzLiAgPGNoYXI+IGlzIHRoZSBjaGFyYWN0ZXIgZGlzcGxh +eWVkIHdpdGggbm8gLS1zdGF0dXMtZmQKICAgIGVuYWJsZWQsIHdpdGggdGhlIGxp +bmVmZWVkIHJlcGxhY2VkIGJ5IGFuICdYJy4gIDxjdXI+IGlzIHRoZQogICAgY3Vy +cmVudCBhbW91bnQgZG9uZSBhbmQgPHRvdGFsPiBpcyBhbW91bnQgdG8gYmUgZG9u +ZTsgYSA8dG90YWw+IG9mCiAgICAwIGluZGljYXRlcyB0aGF0IHRoZSB0b3RhbCBh +bW91bnQgaXMgbm90IGtub3duLiBUaGUgY29uZGl0aW9uCiAgICAgIDogICAgICAg +VE9UQUwgJiYgQ1VSID09IFRPVEFMCiAgICBtYXkgYmUgdXNlZCB0byBkZXRlY3Qg +dGhlIGVuZCBvZiBhbiBvcGVyYXRpb24uCgogICAgV2VsbCBrbm93biB2YWx1ZXMg +Zm9yIFdIQVQgYXJlOgoKICAgICAgICAgICAtIHBrX2RzYSAgIDo6IERTQSBrZXkg +Z2VuZXJhdGlvbgogICAgICAgICAgIC0gcGtfZWxnICAgOjogRWxnYW1hbCBrZXkg +Z2VuZXJhdGlvbgogICAgICAgICAgIC0gcHJpbWVnZW4gOjogUHJpbWUgZ2VuZXJh +dGlvbgogICAgICAgICAgIC0gbmVlZF9lbnRyb3B5IDo6IFdhaXRpbmcgZm9yIG5l +dyBlbnRyb3B5IGluIHRoZSBSTkcKICAgICAgICAgICAtIHRpY2sgOjogR2VuZXJp +YyB0aWNrIHdpdGhvdXQgYW55IHNwZWNpYWwgbWVhbmluZyAtIHVzZWZ1bAogICAg +ICAgICAgICAgICAgICAgICBmb3IgbGV0dGluZyBjbGllbnRzIGtub3cgdGhhdCB0 +aGUgc2VydmVyIGlzIHN0aWxsCiAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmcu +CiAgICAgICAgICAgLSBzdGFydGluZ19hZ2VudCA6OiBBIGdwZy1hZ2VudCB3YXMg +c3RhcnRlZCBiZWNhdXNlIGl0IGlzIG5vdAogICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgIHJ1bm5pbmcgYXMgYSBkYWVtb24uCiAgICAgICAgICAgLSBsZWFy +bmNhcmQgOjogU2VuZCBieSB0aGUgYWdlbnQgYW5kIGdwZ3NtIHdoaWxlIGxlYXJp +bmcKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YSBvZiBhIHNtYXJ0 +Y2FyZC4KICAgICAgICAgICAtIGNhcmRfYnVzeSA6OiBBIHNtYXJ0Y2FyZCBpcyBz +dGlsbCB3b3JraW5nCgoqKiogQkFDS1VQX0tFWV9DUkVBVEVEIDxmaW5nZXJwcmlu +dD4gPGZuYW1lPgogICAgQSBiYWNrdXAgb2YgYSBrZXkgaWRlbnRpZmllZCBieSA8 +ZmluZ2VycHJpbnQ+IGhhcyBiZWVuIHdyaXR0ZSB0bwogICAgdGhlIGZpbGUgPGZu +YW1lPjsgPGZuYW1lPiBpcyBwZXJjZW50LWVzY2FwZWQuCgoqKiogTU9VTlRQT0lO +VCA8bmFtZT4KICAgIDxuYW1lPiBpcyBhIHBlcmNlbnQtcGx1cyBlc2NhcGVkIGZp +bGVuYW1lIGRlc2NyaWJpbmcgdGhlCiAgICBtb3VudHBvaW50IGZvciB0aGUgY3Vy +cmVudCBvcGVyYXRpb24gKGUuZy4gdXNlZCBieSAiZzEzIC0tbW91bnQiKS4KICAg +IFRoaXMgbWF5IGVpdGhlciBiZSB0aGUgc3BlY2lmaWVkIG1vdW50cG9pbnQgb3Ig +b25lIHJhbmRvbWx5CiAgICBjaG9vc2VuIGJ5IGcxMy4KCioqKiBQSU5FTlRSWV9M +QVVOQ0hFRCA8cGlkPgogICAgVGhpcyBzdGF0dXMgbGluZSBpcyBlbWl0dGVkIGJ5 +IGdwZyB0byBub3RpZnkgYSBjbGllbnQgdGhhdCBhCiAgICBQaW5lbnRyeSBoYXMg +YmVlbiBsYXVuY2hlZC4gIDxwaWQ+IGlzIHRoZSBQSUQgb2YgdGhlIFBpbmVudHJ5 +LiAgSXQKICAgIG1heSBiZSB1c2VkIHRvIGRpc3BsYXkgYSBoaW50IHRvIHRoZSB1 +c2VyIGJ1dCBjYW4ndCBiZSB1c2VkIHRvCiAgICBzeW5jaHJvbml6ZSB3aXRoIFBp +bmVudHJ5LiAgTm90ZSB0aGF0IHRoZXJlIGlzIGFsc28gYW4gQXNzdWFuCiAgICBp +bnF1aXJ5IGxpbmUgd2l0aCB0aGUgc2FtZSBuYW1lIHVzZWQgaW50ZXJuYWxseSBv +ciwgaWYgZW5hYmxlZCwKICAgIHNlbmQgdG8gdGhlIGNsaWVudCBpbnN0ZWFkIG9m +IHRoaXMgc3RhdHVzIGxpbmUuICBTdWNoIGFuIGlucXVpcnkKICAgIG1heSBiZSB1 +c2VkIHRvIHN5bmMgd2l0aCBQaW5lbnRyeQoKKiogT2Jzb2xldGUgc3RhdHVzIGNv +ZGVzCioqKiBTSUdFWFBJUkVECiAgICBSZW1vdmVkIG9uIDIwMTEtMDItMDQuICBU +aGlzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgS0VZRVhQSVJFRC4KKioqIFJT +QV9PUl9JREVBCiAgICBPYnNvbGV0ZS4gIFRoaXMgc3RhdHVzIG1lc3NhZ2UgdXNl +ZCB0byBiZSBlbWl0dGVkIGZvciByZXF1ZXN0cyB0bwogICAgdXNlIHRoZSBJREVB +IG9yIFJTQSBhbGdvcml0aG1zLiAgSXQgaGFzIGJlZW4gZHJvcHBlZCBmcm9tIEdu +dVBHCiAgICAyLjEgYWZ0ZXIgdGhlIHJlc3BlY3RpdmUgcGF0ZW50cyBleHBpcmVk +LgoqKiogU0hNX0lORk8sIFNITV9HRVQsIFNITV9HRVRfQk9PTCwgU0hNX0dFVF9I +SURERU4KICAgIFRoZXNlIHdlcmUgdXNlZCBmb3IgdGhlIGFuY2llbnQgc2hhcmVk +IG1lbW9yeSBiYXNlZCBjby1wcm9jZXNzaW5nLgoqKiogQkVHSU5fU1RSRUFNLCBF +TkRfU1RSRUFNCiAgICBVc2VkIHRvIGlzc3VlZCBieSB0aGUgZXhwZXJpbWVudGFs +IHBpcGVtb2RlLgoKCiogRm9ybWF0IG9mIHRoZSAtLWF0dHJpYnV0ZS1mZCBvdXRw +dXQKCiAgV2hlbiAtLWF0dHJpYnV0ZS1mZCBpcyBzZXQsIGR1cmluZyBrZXkgbGlz +dGluZ3MgKC0tbGlzdC1rZXlzLAogIC0tbGlzdC1zZWNyZXQta2V5cykgR251UEcg +ZHVtcHMgZWFjaCBhdHRyaWJ1dGUgcGFja2V0IHRvIHRoZSBmaWxlCiAgZGVzY3Jp +cHRvciBzcGVjaWZpZWQuICAtLWF0dHJpYnV0ZS1mZCBpcyBpbnRlbmRlZCBmb3Ig +dXNlIHdpdGgKICAtLXN0YXR1cy1mZCBhcyBwYXJ0IG9mIHRoZSByZXF1aXJlZCBp +bmZvcm1hdGlvbiBpcyBjYXJyaWVkIG9uIHRoZQogIEFUVFJJQlVURSBzdGF0dXMg +dGFnIChzZWUgYWJvdmUpLgoKICBUaGUgY29udGVudHMgb2YgdGhlIGF0dHJpYnV0 +ZSBkYXRhIGlzIHNwZWNpZmllZCBieSBSRkMgNDg4MC4gIEZvcgogIGNvbnZlbmll +bmNlLCBoZXJlIGlzIHRoZSBQaG90byBJRCBmb3JtYXQsIGFzIGl0IGlzIGN1cnJl +bnRseSB0aGUKICBvbmx5IGF0dHJpYnV0ZSBkZWZpbmVkOgoKICAtIEJ5dGUgMC0x +IDo6IFRoZSBsZW5ndGggb2YgdGhlIGltYWdlIGhlYWRlci4gIER1ZSB0byBhIGhp +c3RvcmljYWwKICAgICAgICAgICAgICAgIGFjY2lkZW50IChpLmUuIG9vcHMhKSBi +YWNrIGluIHRoZSBOQUkgUEdQIGRheXMsIHRoaXMKICAgICAgICAgICAgICAgIGlz +IGEgbGl0dGxlLWVuZGlhbiBudW1iZXIuICBDdXJyZW50bHkgMTYgKDB4MTAgMHgw +MCkuCgogIC0gQnl0ZSAyIDo6IFRoZSBpbWFnZSBoZWFkZXIgdmVyc2lvbi4gIEN1 +cnJlbnRseSAweDAxLgoKICAtIEJ5dGUgMyA6OiBFbmNvZGluZyBmb3JtYXQuICAw +eDAxID09IEpQRUcuCgogIC0gQnl0ZSA0LTE1IDo6IFJlc2VydmVkLCBhbmQgY3Vy +cmVudGx5IHVudXNlZC4KCiAgQWxsIG90aGVyIGRhdGEgYWZ0ZXIgdGhpcyBoZWFk +ZXIgaXMgcmF3IGltYWdlIChKUEVHKSBkYXRhLgoKCiogVW5hdHRlbmRlZCBrZXkg +Z2VuZXJhdGlvbgoKICAgUGxlYXNlIHNlZSB0aGUgR251UEcgbWFudWFsIGZvciBh +IGRlc2NyaXB0aW9uLgoKCiogTGF5b3V0IG9mIHRoZSBUcnVzdERCCgogIFRoZSBU +cnVzdERCIGlzIGJ1aWx0IGZyb20gZml4ZWQgbGVuZ3RoIHJlY29yZHMsIHdoZXJl +IHRoZSBmaXJzdCBieXRlCiAgZGVzY3JpYmVzIHRoZSByZWNvcmQgdHlwZS4gIEFs +bCBudW1lcmljIHZhbHVlcyBhcmUgc3RvcmVkIGluIG5ldHdvcmsKICBieXRlIG9y +ZGVyLiAgVGhlIGxlbmd0aCBvZiBlYWNoIHJlY29yZCBpcyA0MCBieXRlcy4gIFRo +ZSBmaXJzdAogIHJlY29yZCBvZiB0aGUgREIgaXMgYWx3YXlzIG9mIHR5cGUgMSBh +bmQgdGhpcyBpcyB0aGUgb25seSByZWNvcmQgb2YKICB0aGlzIHR5cGUuCgogIFRo +ZSByZWNvcmQgdHlwZXM6IGRpcmVjdG9yeSgyKSwga2V5KDMpLCB1aWQoNCksIHBy +ZWYoNSksIHNpZ3JlYyg2KSwKICBhbmQgc2hhZG93IGRpcmVjdG9yeSg4KSBhcmUg +bm90IGFueW1vcmUgdXNlZCBieSB2ZXJzaW9uIDIgb2YgdGhlCiAgVHJ1c3REQi4K +CioqIFJlY29yZCB0eXBlIDAKCiAgIFVudXNlZCByZWNvcmQgb3IgZGVsZXRlZCwg +Y2FuIGJlIHJldXNlZCBmb3IgYW55IHB1cnBvc2UuICBTdWNoCiAgIHJlY29yZHMg +c2hvdWxkIGluIGdlbmVyYWwgbm90IGV4aXN0IGJlY2F1c2UgZGVsZXRlZCByZWNv +cmRzIGFyZSBvZgogICB0eXBlIDI1NCBhbmQga2VwdCBpbiBhIGxpbmtlZCBsaXN0 +LgoKKiogVmVyc2lvbiBpbmZvIChSRUNUWVBFX1ZFUiwgMSkKCiAgIFZlcnNpb24g +aW5mb3JtYXRpb24gZm9yIHRoaXMgVHJ1c3REQi4gIFRoaXMgaXMgYWx3YXlzIHRo +ZSBmaXJzdAogICByZWNvcmQgb2YgdGhlIERCIGFuZCB0aGUgb25seSBvbmUgb2Yg +dGhpcyB0eXBlLgoKICAgLSAxIHU4IDo6IFJlY29yZCB0eXBlICh2YWx1ZTogMSku +CiAgIC0gMyBieXRlIDo6IE1hZ2ljIHZhbHVlICgiZ3BnIikKICAgLSAxIHU4IDo6 +IFRydXN0REIgdmVyc2lvbiAodmFsdWU6IDIpLgogICAtIDEgdTggOjogPW1hcmdp +bmFscz0uIEhvdyBtYW55IG1hcmdpbmFsIHRydXN0ZWQga2V5cyBhcmUgcmVxdWly +ZWQuCiAgIC0gMSB1OCA6OiA9Y29tcGxldGVzPS4gSG93IG1hbnkgY29tcGxldGVs +eSB0cnVzdGVkIGtleXMgYXJlCiAgICAgICAgICAgICByZXF1aXJlZC4KICAgLSAx +IHU4IDo6ID1tYXhfY2VydF9kZXB0aD0uICBIb3cgZGVlcCBpcyB0aGUgV29UIGV2 +YWx1YXRlZC4gIEFsb25nCiAgICAgICAgICAgICB3aXRoID1tYXJnaW5hbHM9IGFu +ZCA9Y29tcGxldGVzPSwgdGhpcyB2YWx1ZSBpcyB1c2VkIHRvCiAgICAgICAgICAg +ICBjaGVjayB3aGV0aGVyIHRoZSBjYWNoZWQgdmFsaWRpdHkgdmFsdWUgZnJvbSBh +IFtGSVhNRQogICAgICAgICAgICAgZGlyXSByZWNvcmQgY2FuIGJlIHVzZWQuCiAg +IC0gMSB1OCA6OiA9dHJ1c3RfbW9kZWw9CiAgIC0gMSB1OCA6OiA9bWluX2NlcnRf +bGV2ZWw9CiAgIC0gMiBieXRlIDo6IE5vdCB1c2VkCiAgIC0gMSB1MzIgOjogPWNy +ZWF0ZWQ9LiBUaW1lc3RhbXAgb2YgdHJ1c3RkYiBjcmVhdGlvbi4KICAgLSAxIHUz +MiA6OiA9bmV4dGNoZWNrPS4gVGltZXN0YW1wIG9mIGxhc3QgbW9kaWZpY2F0aW9u +IHdoaWNoIG1heQogICAgICAgICAgICAgIGFmZmVjdCB0aGUgdmFsaWRpdHkgb2Yg +a2V5cyBpbiB0aGUgdHJ1c3RkYi4gIFRoaXMgdmFsdWUKICAgICAgICAgICAgICBp +cyBjaGVja2VkIGFnYWluc3QgdGhlIHZhbGlkaXR5IHRpbWVzdGFtcCBpbiB0aGUg +ZGlyCiAgICAgICAgICAgICAgcmVjb3Jkcy4KICAgLSAxIHUzMiA6OiA9cmVzZXJ2 +ZWQ9LiAgTm90IHVzZWQuCiAgIC0gMSB1MzIgOjogPXJlc2VydmVkMj0uIE5vdCB1 +c2VkLgogICAtIDEgdTMyIDo6ID1maXJzdGZyZWU9LiBOdW1iZXIgb2YgdGhlIHJl +Y29yZCB3aXRoIHRoZSBoZWFkIHJlY29yZAogICAgICAgICAgICAgIG9mIHRoZSBS +RUNUWVBFX0ZSRUUgbGlua2VkIGxpc3QuCiAgIC0gMSB1MzIgOjogPXJlc2VydmVk +Mz0uIE5vdCB1c2VkLgogICAtIDEgdTMyIDo6ID10cnVzdGhhc2h0Ymw9LiBSZWNv +cmQgbnVtYmVyIG9mIHRoZSB0cnVzdGhhc2h0YWJsZS4KCgoqKiBIYXNoIHRhYmxl +IChSRUNUWVBFX0hUQkwsIDEwKQoKICAgRHVlIHRvIHRoZSBmYWN0IHRoYXQgd2Ug +dXNlIGZpbmdlcnByaW50cyB0byBsb29rdXAga2V5cywgd2UgY2FuCiAgIGltcGxl +bWVudCBxdWljayBhY2Nlc3MgYnkgc29tZSBzaW1wbGUgaGFzaCBtZXRob2RzLCBh +bmQgYXZvaWQgdGhlCiAgIG92ZXJoZWFkIG9mIGdkYm0uICBBIHByb3BlcnR5IG9m +IGZpbmdlcnByaW50cyBpcyB0aGF0IHRoZXkgY2FuIGJlCiAgIHVzZWQgZGlyZWN0 +bHkgYXMgaGFzaCB2YWx1ZXMuICBXaGF0IHdlIHVzZSBpcyBhIGR5bmFtaWMgbXVs +dGlsZXZlbAogICBhcmNoaXRlY3R1cmUsIHdoaWNoIGNvbWJpbmVzIGhhc2ggdGFi +bGVzLCByZWNvcmQgbGlzdHMsIGFuZCBsaW5rZWQKICAgbGlzdHMuCgogICBUaGlz +IHJlY29yZCBpcyBhIGhhc2ggdGFibGUgb2YgMjU2IGVudHJpZXMgd2l0aCB0aGUg +cHJvcGVydHkgdGhhdAogICBhbGwgdGhlc2UgcmVjb3JkcyBhcmUgc3RvcmVkIGNv +bnNlY3V0aXZlbHkgdG8gbWFrZSBvbmUgYmlnCiAgIHRhYmxlLiBUaGUgaGFzaCB2 +YWx1ZSBpcyBzaW1wbGUgdGhlIDFzdCwgMm5kLCAuLi4gYnl0ZSBvZiB0aGUKICAg +ZmluZ2VycHJpbnQgKGRlcGVuZGluZyBvbiB0aGUgaW5kaXJlY3Rpb24gbGV2ZWwp +LgoKICAgLSAxIHU4IDo6IFJlY29yZCB0eXBlICh2YWx1ZTogMTApLgogICAtIDEg +dTggOjogUmVzZXJ2ZWQKICAgLSBuIHUzMiA6OiA9cmVjbnVtPS4gIEEgdGFibGUg +d2l0aCB0aGUgaGFzaCB0YWJsZSBpdGVtcyBmaXR0aW5nIGludG8KICAgICAgICAg +ICAgICB0aGlzIHJlY29yZC4gID1uPSBkZXBlbmRzIG9uIHRoZSByZWNvcmQgbGVu +Z3RoOgogICAgICAgICAgICAgICRuPShyZWNsZW4tMikvNCQgd2hpY2ggeWllbGRz +IDkgZm9yIG91cmUgY3VycmVudCByZWNvcmQKICAgICAgICAgICAgICBsZW5ndGgg +b2YgNDAgYnl0ZXMuCgogICBUaGUgdG90YWwgbnVtYmVyIG9mIGhhc2ggdGFibGUg +cmVjb3JkcyB0byBmb3JtIHRoZSB0YWJsZSBpczoKICAgJG09KDI1NituLTEpL24k +LiAgVGhpcyBpcyAyOSBmb3Igb3VyIHJlY29yZCBsZW5ndGggb2YgNDAuCgogICBU +byBsb29rIHVwIGEga2V5IHdlIHVzZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZmlu +Z2VycHJpbnQgdG8gZ2V0CiAgIHRoZSByZWNudW0gZnJvbSB0aGlzIGhhc2ggdGFi +bGUgYW5kIHRoZW4gbG9vayB1cCB0aGUgYWRkcmVzc2VkCiAgIHJlY29yZDoKCiAg +IC0gSWYgdGhhdCByZWNvcmQgaXMgYW5vdGhlciBoYXNoIHRhYmxlLCB3ZSB1c2Ug +Mm5kIGJ5dGUgdG8gaW5kZXgKICAgICB0aGF0IGhhc2ggdGFibGUgYW5kIHNvIG9u +OwogICAtIGlmIHRoYXQgcmVjb3JkIGlzIGEgaGFzaCBsaXN0LCB3ZSB3YWxrIGFs +bCBlbnRyaWVzIHVudGlsIHdlIGZpbmQKICAgICBhIG1hdGNoaW5nIG9uZTsgb3IK +ICAgLSBpZiB0aGF0IHJlY29yZCBpcyBhIGtleSByZWNvcmQsIHdlIGNvbXBhcmUg +dGhlIGZpbmdlcnByaW50IHRvCiAgICAgZGVjaWRlIHdoZXRoZXIgaXQgaXMgdGhl +IHJlcXVlc3RlZCBrZXk7CgoKKiogSGFzaCBsaXN0IChSRUNUWVBFX0hMU1QsIDEx +KQoKICAgU2VlIGhhc2ggdGFibGUgYWJvdmUgb24gaG93IGl0IGlzIHVzZWQuICBJ +dCBtYXkgYWxzbyBiZSB1c2VkIGZvcgogICBvdGhlciBwdXJwb3Nlcy4KCiAgIC0g +MSB1OCA6OiBSZWNvcmQgdHlwZSAodmFsdWU6IDExKS4KICAgLSAxIHU4IDo6IFJl +c2VydmVkLgogICAtIDEgdTMyIDo6ID1uZXh0PS4gIFJlY29yZCBudW1iZXIgb2Yg +dGhlIG5leHQgaGFzaCBsaXN0IHJlY29yZCBvciAwCiAgICAgICAgICAgICAgaWYg +bm9uZS4KICAgLSBuIHUzMiA6OiA9cm51bT0uICBBcnJheSB3aXRoIHJlY29yZCBu +dW1iZXJzIHRvIHZhbHVlcy4gIFdpdGgKICAgICAgICAgICAgICAkbj0ocmVjbGVu +LTUpLzUkIGFuZCBvdXIgcmVjb3JkIGxlbmd0aCBvZiA0MCwgbiBpcyA3LgoKKiog +VHJ1c3QgcmVjb3JkIChSRUNUWVBFX1RSVVNULCAxMikKCiAgIC0gMSB1OCA6OiBS +ZWNvcmQgdHlwZSAodmFsdWU6IDEyKS4KICAgLSAxIHU4IDo6IFJlc2VydmVkLgog +ICAtIDIwIGJ5dGUgOjogPWZpbmdlcnByaW50PS4KICAgLSAxIHU4IDo6ID1vd25l +cnRydXN0PS4KICAgLSAxIHU4IDo6ID1kZXB0aD0uCiAgIC0gMSB1OCA6OiA9bWlu +X293bmVydHJ1c3Q9LgogICAtIDEgYnl0ZSA6OiBOb3QgdXNlZC4KICAgLSAxIHUz +MiA6OiA9dmFsaWRsaXN0PS4KICAgLSAxMCBieXRlIDo6IE5vdCB1c2VkLgoKKiog +VmFsaWRpdHkgcmVjb3JkIChSRUNUWVBFX1ZBTElELCAxMykKCiAgIC0gMSB1OCA6 +OiBSZWNvcmQgdHlwZSAodmFsdWU6IDEzKS4KICAgLSAxIHU4IDo6IFJlc2VydmVk +LgogICAtIDIwIGJ5dGUgOjogPW5hbWVoYXNoPS4KICAgLSAxIHU4IDo6ID12YWxp +ZGl0eT0KICAgLSAxIHUzMiA6OiA9bmV4dD0uCiAgIC0gMSB1OCA6OiA9ZnVsbF9j +b3VudD0uCiAgIC0gMSB1OCA6OiA9bWFyZ2luYWxfY291bnQ9LgogICAtIDExIGJ5 +dGUgOjogTm90IHVzZWQuCgoqKiBGcmVlIHJlY29yZCAoUkVDVFlQRV9GUkVFLCAy +NTQpCgogICBBbGwgdGhlc2UgcmVjb3JkcyBmb3JtIGEgbGlua2VkIGxpc3Qgb2Yg +dW51c2VkIHJlY29yZHMgaW4gdGhlIFRydXN0REIuCgogICAtIDEgdTggOjogUmVj +b3JkIHR5cGUgKHZhbHVlOiAyNTQpCiAgIC0gMSB1OCA6OiBSZXNlcnZlZC4KICAg +LSAxIHUzMiA6OiA9bmV4dD0uICBSZWNvcmQgbnVtYmVyIG9mIHRoZSBuZXh0IHJj +b3JkIG9mIHRoaXMgdHlwZS4KICAgICAgICAgICAgICBUaGUgcmVjb3JkIG51bWJl +ciB0byB0aGUgaGVhZCBvZiB0aGlzIGxpbmtlZCBsaXN0IGlzCiAgICAgICAgICAg +ICAgc3RvcmVkIGluIHRoZSB2ZXJzaW9uIGluZm8gcmVjb3JkLgoKCiogR05VIGV4 +dGVuc2lvbnMgdG8gdGhlIFMySyBhbGdvcml0aG0KCiAgMSBvY3RldCAgLSBTMksg +VXNhZ2U6IGVpdGhlciAyNTQgb3IgMjU1LgogIDEgb2N0ZXQgIC0gUzJLIENpcGhl +ciBBbGdvOiAwCiAgMSBvY3RldCAgLSBTMksgU3BlY2lmaWVyOiAxMDEKICAzIG9j +dGV0cyAtICJHTlUiCiAgMSBvY3RldCAgLSBHTlUgUzJLIEV4dGVuc2lvbiBOdW1i +ZXIuCgogIElmIHN1Y2ggYSBHTlUgZXh0ZW5zaW9uIGlzIHVzZWQgbmVpdGhlciBh +biBJViBub3IgYW55IGtpbmQgb2YKICBjaGVja3N1bSBpcyB1c2VkLiAgVGhlIGRl +ZmluZWQgR05VIFMySyBFeHRlbnNpb24gTnVtYmVycyBhcmU6CgogIC0gMSA6OiBE +byBub3Qgc3RvcmUgdGhlIHNlY3JldCBwYXJ0IGF0IGFsbC4gIE5vIHNwZWNpZmlj +IGRhdGEKICAgICAgICAgZm9sbG93cy4KCiAgLSAyIDo6IEEgc3R1YiB0byBhY2Nl +c3Mgc21hcnRjYXJkcy4gIFRoaXMgZGF0YSBmb2xsb3dzOgogICAgICAgICAtIE9u +ZSBvY3RldCB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIGZvbGxvd2luZyBzZXJpYWwg +bnVtYmVyLgogICAgICAgICAtIFRoZSBzZXJpYWwgbnVtYmVyLiBSZWdhcmRsZXNz +IG9mIHdoYXQgdGhlIGxlbmd0aCBvY3RldAogICAgICAgICAgIGluZGljYXRlcyBu +byBtb3JlIHRoYW4gMTYgb2N0ZXRzIGFyZSBzdG9yZWQuCgogIE5vdGUgdGhhdCBn +cGcgc3RvcmVzIHRoZSBHTlUgUzJLIEV4dGVuc2lvbiBOdW1iZXIgaW50ZXJuYWxs +eSBhcyBhbgogIFMySyBTcGVjaWZpZXIgd2l0aCBhbiBvZmZzZXQgb2YgMTAwMC4K +CgoqIEtleXNlcnZlciBoZWxwZXIgbWVzc2FnZSBmb3JtYXQKCiAgVGhlIGtleXNl +cnZlciBtYXkgYmUgY29udGFjdGVkIGJ5IGEgVW5peCBEb21haW4gc29ja2V0IG9y +IHZpYSBUQ1AuCgogIFRoZSBmb3JtYXQgb2YgYSByZXF1ZXN0IGlzOgojK2JlZ2lu +X2V4YW1wbGUKICBjb21tYW5kLXRhZwogICJDb250ZW50LWxlbmd0aDoiIGRpZ2l0 +cwogIENSTEYKIytlbmRfZXhhbXBsZQoKICBXaGVyZSBjb21tYW5kLXRhZyBpcwoK +IytiZWdpbl9leGFtcGxlCiAgTk9PUAogIEdFVCA8dXNlci1uYW1lPgogIFBVVAog +IERFTEVURSA8dXNlci1uYW1lPgojK2VuZF9leGFtcGxlCgpUaGUgZm9ybWF0IG9m +IGEgcmVzcG9uc2UgaXM6CgojK2JlZ2luX2V4YW1wbGUKICAiR05VUEcvMS4wIiBz +dGF0dXMtY29kZSBzdGF0dXMtdGV4dAogICJDb250ZW50LWxlbmd0aDoiIGRpZ2l0 +cwogIENSTEYKIytlbmRfZXhhbXBsZQpmb2xsb3dlZCBieSA8ZGlnaXRzPiBieXRl +cyBvZiBkYXRhCgpTdGF0dXMgY29kZXMgYXJlOgoKICAtIDF4eCA6OiBJbmZvcm1h +dGlvbmFsIC0gUmVxdWVzdCByZWNlaXZlZCwgY29udGludWluZyBwcm9jZXNzCgog +IC0gMnh4IDo6IFN1Y2Nlc3MgLSBUaGUgYWN0aW9uIHdhcyBzdWNjZXNzZnVsbHkg +cmVjZWl2ZWQsIHVuZGVyc3Rvb2QsCiAgICAgICAgICAgYW5kIGFjY2VwdGVkCgog +IC0gNHh4IDo6IENsaWVudCBFcnJvciAtIFRoZSByZXF1ZXN0IGNvbnRhaW5zIGJh +ZCBzeW50YXggb3IgY2Fubm90IGJlCiAgICAgICAgICAgZnVsZmlsbGVkCgogIC0g +NXh4IDo6IFNlcnZlciBFcnJvciAtIFRoZSBzZXJ2ZXIgZmFpbGVkIHRvIGZ1bGZp +bGwgYW4gYXBwYXJlbnRseQogICAgICAgICAgIHZhbGlkIHJlcXVlc3QKCgoqIE9i +amVjdCBpZGVudGlmaWVycwoKICBPSURzIGJlbG93IHRoZSBHbnVQRyBhcmM6Cgoj +K2JlZ2luX2V4YW1wbGUKICAxLjMuNi4xLjQuMS4xMTU5MS4yICAgICAgICAgIEdu +dVBHCiAgMS4zLjYuMS40LjEuMTE1OTEuMi4xICAgICAgICAgIG5vdGF0aW9uCiAg +MS4zLjYuMS40LjEuMTE1OTEuMi4xLjEgICAgICAgICAgcGthQWRkcmVzcwogIDEu +My42LjEuNC4xLjExNTkxLjIuMiAgICAgICAgICBYLjUwOSBleHRlbnNpb25zCiAg +MS4zLjYuMS40LjEuMTE1OTEuMi4yLjEgICAgICAgICAgc3RhbmRhbG9uZUNlcnRp +ZmljYXRlCiAgMS4zLjYuMS40LjEuMTE1OTEuMi4yLjIgICAgICAgICAgd2VsbEtu +b3duUHJpdmF0ZUtleQogIDEuMy42LjEuNC4xLjExNTkxLjIuMTIyNDI5NzMgICBp +bnZhbGlkIGVuY29kZWQgT0lECiMrZW5kX2V4YW1wbGUKCgoKKiBNaXNjZWxsYW5l +b3VzIG5vdGVzCgoqKiB2MyBmaW5nZXJwcmludHMKICAgRm9yIHBhY2tldCB2ZXJz +aW9uIDMgd2UgY2FsY3VsYXRlIHRoZSBrZXlpZHMgdGhpcyB3YXk6CiAgICAtIFJT +QSA6OiBMb3cgNjQgYml0cyBvZiBuCiAgICAtIEVMR0FNQUwgOjogQnVpbGQgYSB2 +MyBwdWJrZXkgcGFja2V0ICh3aXRoIENUQiAweDk5KSBhbmQKICAgICAgICAgICAg +ICAgICBjYWxjdWxhdGUgYSBSTUQxNjAgaGFzaCB2YWx1ZSBmcm9tIGl0LiBUaGlz +IGlzIHVzZWQKICAgICAgICAgICAgICAgICBhcyB0aGUgZmluZ2VycHJpbnQgYW5k +IHRoZSBsb3cgNjQgYml0cyBhcmUgdGhlIGtleWlkLgoKKiogU2ltcGxpZmllZCBy +ZXZvY2F0aW9uIGNlcnRpZmljYXRlcwogIFJldm9jYXRpb24gY2VydGlmaWNhdGVz +IGNvbnNpc3Qgb25seSBvZiB0aGUgc2lnbmF0dXJlIHBhY2tldDsKICAiLS1pbXBv +cnQiIGtub3dzIGhvdyB0byBoYW5kbGUgdGhpcy4gIFRoZSByYXRpb25hbGUgYmVo +aW5kIGl0IGlzIHRvCiAga2VlcCB0aGVtIHNtYWxsLgoKKiogRG9jdW1lbnRhdGlv +biBvbiBIS1AgKHRoZSBodHRwIGtleXNlcnZlciBwcm90b2NvbCk6CgogICBBIG1p +bmltYWxpc3RpYyBIVFRQIHNlcnZlciBvbiBwb3J0IDExMzcxIHJlY29nbml6ZXMg +YSBHRVQgZm9yCiAgIC9wa3MvbG9va3VwLiAgVGhlIHN0YW5kYXJkIGh0dHAgVVJM +IGVuY29kZWQgcXVlcnkgcGFyYW1ldGVycyBhcmUKICAgdGhpcyAoYWx3YXlzIGtl +eT12YWx1ZSk6CgogICAtIG9wPWluZGV4IChsaWtlIHBncCAta3YpLCBvcD12aW5k +ZXggKGxpa2UgcGdwIC1rdnYpIGFuZCBvcD1nZXQgKGxpa2UKICAgICBwZ3AgLWt4 +YSkKCiAgIC0gc2VhcmNoPTxzdHJpbmdsaXN0Pi4gVGhpcyBpcyBhIGxpc3Qgb2Yg +d29yZHMgdGhhdCBtdXN0IG9jY3VyIGluIHRoZSBrZXkuCiAgICAgVGhlIHdvcmRz +IGFyZSBkZWxpbWl0ZWQgd2l0aCBzcGFjZSwgcG9pbnRzLCBAIGFuZCBzbyBvbi4g +VGhlIGRlbGltaXRlcnMKICAgICBhcmUgbm90IHNlYXJjaGVkIGZvciBhbmQgdGhl +IG9yZGVyIG9mIHRoZSB3b3JkcyBkb2Vzbid0IG1hdHRlciAoYnV0IHNlZQogICAg +IG5leHQgb3B0aW9uKS4KCiAgIC0gZXhhY3Q9b24uIFRoaXMgc3dpdGNoIHRlbGxz +IHRoZSBoa3Agc2VydmVyIHRvIG9ubHkgcmVwb3J0IGV4YWN0IG1hdGNoaW5nCiAg +ICAga2V5cyBiYWNrLiBJbiB0aGlzIGNhc2UgdGhlIG9yZGVyIGFuZCB0aGUgImRl +bGltaXRlcnMiIGFyZSBpbXBvcnRhbnQuCgogICAtIGZpbmdlcnByaW50PW9uLiBB +bHNvIHJlcG9ydHMgdGhlIGZpbmdlcnByaW50cyB3aGVuIHVzZWQgd2l0aCAnaW5k +ZXgnIG9yCiAgICAgJ3ZpbmRleCcKCiAgIFRoZSBrZXlzZXJ2ZXIgYWxzbyByZWNv +Z25pemVzIGh0dHAtUE9TVHMgdG8gL3Brcy9hZGQuIFVzZSB0aGlzIHRvIHVwbG9h +ZAogICBrZXlzLgoKCiAgIEEgYmV0dGVyIHdheSB0byBkbyB0aGlzIHdvdWxkIGJl +IGEgcmVxdWVzdCBsaWtlOgoKICAgICAgL3Brcy9sb29rdXAvPGdudXBnX2Zvcm1h +dGllcnRlX3VzZXJfaWQ+P29wPTxvcGVyYXRpb24+CgogICBUaGlzIGNhbiBiZSBp +bXBsZW1lbnRlZCB1c2luZyBIdXJkJ3MgdHJhbnNsYXRvciBtZWNoYW5pc20uCiAg +IEhvd2V2ZXIsIEkgdGhpbmsgdGhlIHdob2xlIGtleSBzZXJ2ZXIgc3R1ZmYgaGFz +IHRvIGJlIHJlLXRob3VnaHQ7CiAgIEkgaGF2ZSBzb21lIGlkZWFzIGFuZCBwcm9i +YWJseSBjcmVhdGUgYSB3aGl0ZSBwYXBlci4KKiogQWxnb3JpdGhtIG5hbWVzIGZv +ciB0aGUgImtleWdlbi5hbGdvIiBwcm9tcHQKCiAgV2hlbiB1c2luZyBhIC0tY29t +bWFuZC1mZCBjb250cm9sbGVkIGtleSBnZW5lcmF0aW9uIG9yICJhZGRrZXkiCiAg +dGhlcmUgaXMgd2F5IHRvIGtub3cgdGhlIG51bWJlciB0byBlbnRlciBvbiB0aGUg +ImtleWdlbi5hbGdvIgogIHByb21wdC4gIFRoZSBkaXNwbGF5ZWQgbnVtYmVycyBh +cmUgZm9yIGh1bWFuIHJlY2VwdGlvbiBhbmQgbWF5CiAgY2hhbmdlIHdpdGggcmVs +ZWFzZXMuICBUbyBwcm92aWRlIGEgc3RhYmxlIHdheSB0byBlbnRlciBhIGRlc2ly +ZWQKICBhbGdvcml0aG0gY2hvaWNlIHRoZSBwcm9tcHQgYWxzbyBhY2NlcHRzIHBy +ZWRlZmluZWQgbmFtZXMgZm9yIHRoZQogIGFsZ29yaXRobXMsIHdoaWNoIHdpbGwg +bm90IGNoYW5nZS4KCiAgIHwgTmFtZSAgICB8IE5vIHwgRGVzY3JpcHRpb24gICAg +ICAgICAgICAgICAgICAgICB8CiAgIHwtLS0tLS0tLS0rLS0tLSstLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CiAgIHwgcnNhK3JzYSB8ICAxIHwgUlNB +IGFuZCBSU0EgKGRlZmF1bHQpICAgICAgICAgICB8CiAgIHwgZHNhK2VsZyB8ICAy +IHwgRFNBIGFuZCBFbGdhbWFsICAgICAgICAgICAgICAgICB8CiAgIHwgZHNhICAg +ICB8ICAzIHwgRFNBIChzaWduIG9ubHkpICAgICAgICAgICAgICAgICB8CiAgIHwg +cnNhL3MgICB8ICA0IHwgUlNBIChzaWduIG9ubHkpICAgICAgICAgICAgICAgICB8 +CiAgIHwgZWxnICAgICB8ICA1IHwgRWxnYW1hbCAoZW5jcnlwdCBvbmx5KSAgICAg +ICAgICB8CiAgIHwgcnNhL2UgICB8ICA2IHwgUlNBIChlbmNyeXB0IG9ubHkpICAg +ICAgICAgICAgICB8CiAgIHwgZHNhLyogICB8ICA3IHwgRFNBIChzZXQgeW91ciBv +d24gY2FwYWJpbGl0aWVzKSB8CiAgIHwgcnNhLyogICB8ICA4IHwgUlNBIChzZXQg +eW91ciBvd24gY2FwYWJpbGl0aWVzKSB8CiAgIHwgZWNjK2VjYyB8ICA5IHwgRUND +IGFuZCBFQ0MgICAgICAgICAgICAgICAgICAgICB8CiAgIHwgZWNjL3MgICB8IDEw +IHwgRUNDIChzaWduIG9ubHkpICAgICAgICAgICAgICAgICB8CiAgIHwgZWNjLyog +ICB8IDExIHwgRUNDIChzZXQgeW91ciBvd24gY2FwYWJpbGl0aWVzKSB8CiAgIHwg +ZWNjL2UgICB8IDEyIHwgRUNDIChlbmNyeXB0IG9ubHkpICAgICAgICAgICAgICB8 +CiAgIHwga2V5Z3JpcCB8IDEzIHwgRXhpc3Rpbmcga2V5ICAgICAgICAgICAgICAg +ICAgICB8CgogICBJZiBvbmUgb2YgdGhlICJmb28vKiIgbmFtZXMgYXJlIHVzZWQg +YSAia2V5Z2VuLmZsYWdzIiBwcm9tcHQgbmVlZHMKICAgdG8gYmUgYW5zd2VyZWQg +YXMgd2VsbC4gIEluc3RlYWQgb2YgdG9nZ2xpbmcgdGhlIHByZWRlZmluZWQgZmxh +Z3MsCiAgIGl0IGlzIGFsc28gcG9zc2libGUgdG8gc2V0IHRoZW0gZGlyZWN0OiBV +c2UgYSAiPSIgY2hhcmFjdGVyCiAgIGRpcmVjdGx5IGZvbGxvd2VkIGJ5IGEgY29t +aW5hdGlvbiBvZiAiYSIgKGZvciBhdXRoZW50aWNhdGlvbiksICJzIgogICAoZm9y +IHNpZ25pbmcpLCBvciAiYyIgKGZvciBjZXJ0aWZpY2F0aW9uKS4KQGMgQ29weXJp +Z2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0 +LCAyMDA1LCAyMDA2LCAyMDA3LApAYyAgICAgICAgICAgICAgIDIwMDgsIDIwMDks +IDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkBjIFRoaXMgaXMg +cGFydCBvZiB0aGUgR251UEcgbWFudWFsLgpAYyBGb3IgY29weWluZyBjb25kaXRp +b25zLCBzZWUgdGhlIGZpbGUgZ251cGcudGV4aS4KCkBpbmNsdWRlIGRlZnMuaW5j +CgpAbm9kZSBJbnZva2luZyBHUEcKQGNoYXB0ZXIgSW52b2tpbmcgR1BHCkBjaW5k +ZXggR1BHIGNvbW1hbmQgb3B0aW9ucwpAY2luZGV4IGNvbW1hbmQgb3B0aW9ucwpA +Y2luZGV4IG9wdGlvbnMsIEdQRyBjb21tYW5kCgpAbWFjcm8gZ3BnbmFtZQpncGcy +CkBlbmQgbWFjcm8KQG1hbnBhZ2UgZ3BnMi4xCkBpZnNldCBtYW52ZXJiCi5CIGdw +ZzIKXC0gT3BlblBHUCBlbmNyeXB0aW9uIGFuZCBzaWduaW5nIHRvb2wKQGVuZCBp +ZnNldAoKQG1hbnNlY3Qgc3lub3BzaXMKQGlmc2V0IG1hbnZlcmIKLkIgIGdwZzIK +LlJCIFsgXC1cLWhvbWVkaXIKLklSIGRpciBdCi5SQiBbIFwtXC1vcHRpb25zCi5J +UiBmaWxlIF0KLlJJIFsgb3B0aW9ucyBdCi5JIGNvbW1hbmQKLlJJIFsgYXJncyBd +CkBlbmQgaWZzZXQKCgpAbWFuc2VjdCBkZXNjcmlwdGlvbgpAY29tbWFuZHtAZ3Bn +bmFtZX0gaXMgdGhlIE9wZW5QR1AgcGFydCBvZiB0aGUgR05VIFByaXZhY3kgR3Vh +cmQgKEdudVBHKS4gSXQKaXMgYSB0b29sIHRvIHByb3ZpZGUgZGlnaXRhbCBlbmNy +eXB0aW9uIGFuZCBzaWduaW5nIHNlcnZpY2VzIHVzaW5nIHRoZQpPcGVuUEdQIHN0 +YW5kYXJkLiBAY29tbWFuZHtAZ3BnbmFtZX0gZmVhdHVyZXMgY29tcGxldGUga2V5 +IG1hbmFnZW1lbnQgYW5kCmFsbCBiZWxscyBhbmQgd2hpc3RsZXMgeW91IGNhbiBl +eHBlY3QgZnJvbSBhIGRlY2VudCBPcGVuUEdQCmltcGxlbWVudGF0aW9uLgoKSW4g +Y29udHJhc3QgdG8gdGhlIHN0YW5kYWxvbmUgY29tbWFuZCBncGcgZnJvbSBHbnVQ +RyAxLngsIHdoaWNoIGlzCm1pZ2h0IGJlIGJldHRlciBzdWl0ZWQgZm9yIHNlcnZl +ciBhbmQgZW1iZWRkZWQgcGxhdGZvcm1zLCB0aGUgMi54CnZlcnNpb24gaXMgY29t +bW9ubHkgaW5zdGFsbGVkIHVuZGVyIHRoZSBuYW1lIEBjb21tYW5ke2dwZzJ9IGFu +ZAp0YXJnZXRlZCB0byB0aGUgZGVza3RvcCBhcyBpdCByZXF1aXJlcyBzZXZlcmFs +IG90aGVyIG1vZHVsZXMgdG8gYmUKaW5zdGFsbGVkLgoKQG1hbnBhdXNlClRoZSBv +bGQgMS54IHZlcnNpb24gd2lsbCBiZSBrZXB0IG1haW50YWluZWQgYW5kIGl0IGlz +IHBvc3NpYmxlIHRvCmluc3RhbGwgYm90aCB2ZXJzaW9ucyBvbiB0aGUgc2FtZSBz +eXN0ZW0uICBEb2N1bWVudGF0aW9uIGZvciB0aGUgb2xkCkdudVBHIDEueCBjb21t +YW5kIGlzIGF2YWlsYWJsZSBhcyBhIG1hbiBwYWdlIGFuZCBhdApAaW5mb3JlZntU +b3AsR251UEcgMSxncGd9LgoKQHhyZWZ7T3B0aW9uIEluZGV4fSwgZm9yIGFuIGlu +ZGV4IHRvIEBjb21tYW5ke0BncGduYW1lfSdzIGNvbW1hbmRzIGFuZCBvcHRpb25z +LgpAbWFuY29udAoKQG1lbnUKKiBHUEcgQ29tbWFuZHM6OiAgICAgICAgICAgIExp +c3Qgb2YgYWxsIGNvbW1hbmRzLgoqIEdQRyBPcHRpb25zOjogICAgICAgICAgICAg +TGlzdCBvZiBhbGwgb3B0aW9ucy4KKiBHUEcgQ29uZmlndXJhdGlvbjo6ICAgICAg +IENvbmZpZ3VyYXRpb24gZmlsZXMuCiogR1BHIEV4YW1wbGVzOjogICAgICAgICAg +ICBTb21lIHVzYWdlIGV4YW1wbGVzLgoKRGV2ZWxvcGVyIGluZm9ybWF0aW9uOgoq +IFVuYXR0ZW5kZWQgVXNhZ2Ugb2YgR1BHOjogVXNpbmcgQGNvbW1hbmR7Z3BnfSBm +cm9tIG90aGVyIHByb2dyYW1zLgpAZW5kIG1lbnUKCkBjICogR1BHIFByb3RvY29s +OjogICAgICAgIFRoZSBwcm90b2NvbCB0aGUgc2VydmVyIG1vZGUgdXNlcy4KCgpA +YyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBj +ICoqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioKQGMg +KioqKioqKioqKioqKioqICBDT01NQU5EUyAgKioqKioqKioqKioqKioqKgpAYyAq +KioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqCkBjICoq +KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQG1hbnNl +Y3QgY29tbWFuZHMKQG5vZGUgR1BHIENvbW1hbmRzCkBzZWN0aW9uIENvbW1hbmRz +CgpDb21tYW5kcyBhcmUgbm90IGRpc3Rpbmd1aXNoZWQgZnJvbSBvcHRpb25zIGV4 +Y2VwdCBmb3IgdGhlIGZhY3QgdGhhdApvbmx5IG9uZSBjb21tYW5kIGlzIGFsbG93 +ZWQuCgpAY29tbWFuZHtAZ3BnbmFtZX0gbWF5IGJlIHJ1biB3aXRoIG5vIGNvbW1h +bmRzLCBpbiB3aGljaCBjYXNlIGl0IHdpbGwKcGVyZm9ybSBhIHJlYXNvbmFibGUg +YWN0aW9uIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBmaWxlIGl0IGlzIGdpdmVu +CmFzIGlucHV0IChhbiBlbmNyeXB0ZWQgbWVzc2FnZSBpcyBkZWNyeXB0ZWQsIGEg +c2lnbmF0dXJlIGlzIHZlcmlmaWVkLAphIGZpbGUgY29udGFpbmluZyBrZXlzIGlz +IGxpc3RlZCkuCgpQbGVhc2UgcmVtZW1iZXIgdGhhdCBvcHRpb24gYXMgd2VsbCBh +cyBjb21tYW5kIHBhcnNpbmcgc3RvcHMgYXMgc29vbiBhcwphIG5vbi1vcHRpb24g +aXMgZW5jb3VudGVyZWQsIHlvdSBjYW4gZXhwbGljaXRseSBzdG9wIHBhcnNpbmcg +YnkKdXNpbmcgdGhlIHNwZWNpYWwgb3B0aW9uIEBvcHRpb257LS19LgoKCkBtZW51 +CiogR2VuZXJhbCBHUEcgQ29tbWFuZHM6OiAgICAgICAgQ29tbWFuZHMgbm90IHNw +ZWNpZmljIHRvIHRoZSBmdW5jdGlvbmFsaXR5LgoqIE9wZXJhdGlvbmFsIEdQRyBD +b21tYW5kczo6ICAgIENvbW1hbmRzIHRvIHNlbGVjdCB0aGUgdHlwZSBvZiBvcGVy +YXRpb24uCiogT3BlblBHUCBLZXkgTWFuYWdlbWVudDo6ICAgICAgSG93IHRvIG1h +bmFnZSB5b3VyIGtleXMuCkBlbmQgbWVudQoKCkBjICoqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioqKioqKioqKioqKioKQGMgKioqKioqKioqKiAgR0VORVJB +TCBDT01NQU5EUyAgKioqKioqKioqKioqKgpAYyAqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioqKioqKioqKioqCkBub2RlIEdlbmVyYWwgR1BHIENvbW1h +bmRzCkBzdWJzZWN0aW9uIENvbW1hbmRzIG5vdCBzcGVjaWZpYyB0byB0aGUgZnVu +Y3Rpb24KCkB0YWJsZSBAZ251cGd0YWJvcHQKQGl0ZW0gLS12ZXJzaW9uCkBvcGlu +ZGV4IHZlcnNpb24KUHJpbnQgdGhlIHByb2dyYW0gdmVyc2lvbiBhbmQgbGljZW5z +aW5nIGluZm9ybWF0aW9uLiAgTm90ZSB0aGF0IHlvdQpjYW5ub3QgYWJicmV2aWF0 +ZSB0aGlzIGNvbW1hbmQuCgpAaXRlbSAtLWhlbHAKQGl0ZW14IC1oCkBvcGluZGV4 +IGhlbHAKUHJpbnQgYSB1c2FnZSBtZXNzYWdlIHN1bW1hcml6aW5nIHRoZSBtb3N0 +IHVzZWZ1bCBjb21tYW5kIGxpbmUgb3B0aW9ucy4KTm90ZSB0aGF0IHlvdSBjYW5u +b3QgYWJicmV2aWF0ZSB0aGlzIGNvbW1hbmQuCgpAaXRlbSAtLXdhcnJhbnR5CkBv +cGluZGV4IHdhcnJhbnR5ClByaW50IHdhcnJhbnR5IGluZm9ybWF0aW9uLgoKQGl0 +ZW0gLS1kdW1wLW9wdGlvbnMKQG9waW5kZXggZHVtcC1vcHRpb25zClByaW50IGEg +bGlzdCBvZiBhbGwgYXZhaWxhYmxlIG9wdGlvbnMgYW5kIGNvbW1hbmRzLiAgTm90 +ZSB0aGF0IHlvdSBjYW5ub3QKYWJicmV2aWF0ZSB0aGlzIGNvbW1hbmQuCkBlbmQg +dGFibGUKCgpAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq +KioqKioqCkBjICoqKioqKioqICBPUEVSQVRJT05BTCBDT01NQU5EUyAgKioqKioq +KioqKioKQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq +KioqKgpAbm9kZSBPcGVyYXRpb25hbCBHUEcgQ29tbWFuZHMKQHN1YnNlY3Rpb24g +Q29tbWFuZHMgdG8gc2VsZWN0IHRoZSB0eXBlIG9mIG9wZXJhdGlvbgoKCkB0YWJs +ZSBAZ251cGd0YWJvcHQKCkBpdGVtIC0tc2lnbgpAaXRlbXggLXMKQG9waW5kZXgg +c2lnbgpNYWtlIGEgc2lnbmF0dXJlLiBUaGlzIGNvbW1hbmQgbWF5IGJlIGNvbWJp +bmVkIHdpdGggQG9wdGlvbnstLWVuY3J5cHR9Cihmb3IgYSBzaWduZWQgYW5kIGVu +Y3J5cHRlZCBtZXNzYWdlKSwgQG9wdGlvbnstLXN5bW1ldHJpY30gKGZvciBhCnNp +Z25lZCBhbmQgc3ltbWV0cmljYWxseSBlbmNyeXB0ZWQgbWVzc2FnZSksIG9yIEBv +cHRpb257LS1lbmNyeXB0fSBhbmQKQG9wdGlvbnstLXN5bW1ldHJpY30gdG9nZXRo +ZXIgKGZvciBhIHNpZ25lZCBtZXNzYWdlIHRoYXQgbWF5IGJlCmRlY3J5cHRlZCB2 +aWEgYSBzZWNyZXQga2V5IG9yIGEgcGFzc3BocmFzZSkuICBUaGUga2V5IHRvIGJl +IHVzZWQgZm9yCnNpZ25pbmcgaXMgY2hvc2VuIGJ5IGRlZmF1bHQgb3IgY2FuIGJl +IHNldCB3aXRoIHRoZQpAb3B0aW9uey0tbG9jYWwtdXNlcn0gYW5kIEBvcHRpb257 +LS1kZWZhdWx0LWtleX0gb3B0aW9ucy4KCkBpdGVtIC0tY2xlYXJzaWduCkBvcGlu +ZGV4IGNsZWFyc2lnbgpNYWtlIGEgY2xlYXIgdGV4dCBzaWduYXR1cmUuICBUaGUg +Y29udGVudCBpbiBhIGNsZWFyIHRleHQgc2lnbmF0dXJlIGlzCnJlYWRhYmxlIHdp +dGhvdXQgYW55IHNwZWNpYWwgc29mdHdhcmUuIE9wZW5QR1Agc29mdHdhcmUgaXMg +b25seSBuZWVkZWQKdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUuICBDbGVhciB0ZXh0 +IHNpZ25hdHVyZXMgbWF5IG1vZGlmeSBlbmQtb2YtbGluZQp3aGl0ZXNwYWNlIGZv +ciBwbGF0Zm9ybSBpbmRlcGVuZGVuY2UgYW5kIGFyZSBub3QgaW50ZW5kZWQgdG8g +YmUKcmV2ZXJzaWJsZS4gIFRoZSBrZXkgdG8gYmUgdXNlZCBmb3Igc2lnbmluZyBp +cyBjaG9zZW4gYnkgZGVmYXVsdCBvcgpjYW4gYmUgc2V0IHdpdGggdGhlIEBvcHRp +b257LS1sb2NhbC11c2VyfSBhbmQgQG9wdGlvbnstLWRlZmF1bHQta2V5fQpvcHRp +b25zLgoKCkBpdGVtIC0tZGV0YWNoLXNpZ24KQGl0ZW14IC1iCkBvcGluZGV4IGRl +dGFjaC1zaWduCk1ha2UgYSBkZXRhY2hlZCBzaWduYXR1cmUuCgpAaXRlbSAtLWVu +Y3J5cHQKQGl0ZW14IC1lCkBvcGluZGV4IGVuY3J5cHQKRW5jcnlwdCBkYXRhLiBU +aGlzIG9wdGlvbiBtYXkgYmUgY29tYmluZWQgd2l0aCBAb3B0aW9uey0tc2lnbn0g +KGZvciBhCnNpZ25lZCBhbmQgZW5jcnlwdGVkIG1lc3NhZ2UpLCBAb3B0aW9uey0t +c3ltbWV0cmljfSAoZm9yIGEgbWVzc2FnZSB0aGF0Cm1heSBiZSBkZWNyeXB0ZWQg +dmlhIGEgc2VjcmV0IGtleSBvciBhIHBhc3NwaHJhc2UpLCBvciBAb3B0aW9uey0t +c2lnbn0KYW5kIEBvcHRpb257LS1zeW1tZXRyaWN9IHRvZ2V0aGVyIChmb3IgYSBz +aWduZWQgbWVzc2FnZSB0aGF0IG1heSBiZQpkZWNyeXB0ZWQgdmlhIGEgc2VjcmV0 +IGtleSBvciBhIHBhc3NwaHJhc2UpLgoKQGl0ZW0gLS1zeW1tZXRyaWMKQGl0ZW14 +IC1jCkBvcGluZGV4IHN5bW1ldHJpYwpFbmNyeXB0IHdpdGggYSBzeW1tZXRyaWMg +Y2lwaGVyIHVzaW5nIGEgcGFzc3BocmFzZS4gVGhlIGRlZmF1bHQKc3ltbWV0cmlj +IGNpcGhlciB1c2VkIGlzIEB2YWx1ZXtHUEdTWU1FTkNBTEdPfSwgYnV0IG1heSBi +ZSBjaG9zZW4gd2l0aCB0aGUKQG9wdGlvbnstLWNpcGhlci1hbGdvfSBvcHRpb24u +IFRoaXMgb3B0aW9uIG1heSBiZSBjb21iaW5lZCB3aXRoCkBvcHRpb257LS1zaWdu +fSAoZm9yIGEgc2lnbmVkIGFuZCBzeW1tZXRyaWNhbGx5IGVuY3J5cHRlZCBtZXNz +YWdlKSwKQG9wdGlvbnstLWVuY3J5cHR9IChmb3IgYSBtZXNzYWdlIHRoYXQgbWF5 +IGJlIGRlY3J5cHRlZCB2aWEgYSBzZWNyZXQga2V5Cm9yIGEgcGFzc3BocmFzZSks +IG9yIEBvcHRpb257LS1zaWdufSBhbmQgQG9wdGlvbnstLWVuY3J5cHR9IHRvZ2V0 +aGVyCihmb3IgYSBzaWduZWQgbWVzc2FnZSB0aGF0IG1heSBiZSBkZWNyeXB0ZWQg +dmlhIGEgc2VjcmV0IGtleSBvciBhCnBhc3NwaHJhc2UpLgoKQGl0ZW0gLS1zdG9y +ZQpAb3BpbmRleCBzdG9yZQpTdG9yZSBvbmx5IChtYWtlIGEgc2ltcGxlIFJGQzE5 +OTEgbGl0ZXJhbCBkYXRhIHBhY2tldCkuCgpAaXRlbSAtLWRlY3J5cHQKQGl0ZW14 +IC1kCkBvcGluZGV4IGRlY3J5cHQKRGVjcnlwdCB0aGUgZmlsZSBnaXZlbiBvbiB0 +aGUgY29tbWFuZCBsaW5lIChvciBTVERJTiBpZiBubyBmaWxlCmlzIHNwZWNpZmll +ZCkgYW5kIHdyaXRlIGl0IHRvIFNURE9VVCAob3IgdGhlIGZpbGUgc3BlY2lmaWVk +IHdpdGgKQG9wdGlvbnstLW91dHB1dH0pLiBJZiB0aGUgZGVjcnlwdGVkIGZpbGUg +aXMgc2lnbmVkLCB0aGUgc2lnbmF0dXJlIGlzIGFsc28KdmVyaWZpZWQuIFRoaXMg +Y29tbWFuZCBkaWZmZXJzIGZyb20gdGhlIGRlZmF1bHQgb3BlcmF0aW9uLCBhcyBp +dCBuZXZlcgp3cml0ZXMgdG8gdGhlIGZpbGVuYW1lIHdoaWNoIGlzIGluY2x1ZGVk +IGluIHRoZSBmaWxlIGFuZCBpdCByZWplY3RzCmZpbGVzIHdoaWNoIGRvbid0IGJl +Z2luIHdpdGggYW4gZW5jcnlwdGVkIG1lc3NhZ2UuCgpAaXRlbSAtLXZlcmlmeQpA +b3BpbmRleCB2ZXJpZnkKQXNzdW1lIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IGlz +IGEgc2lnbmVkIGZpbGUgYW5kIHZlcmlmeSBpdCB3aXRob3V0CmdlbmVyYXRpbmcg +YW55IG91dHB1dC4gIFdpdGggbm8gYXJndW1lbnRzLCB0aGUgc2lnbmF0dXJlIHBh +Y2tldCBpcwpyZWFkIGZyb20gU1RESU4uICBJZiBvbmx5IGEgb25lIGFyZ3VtZW50 +IGlzIGdpdmVuLCBpdCBpcyBleHBlY3RlZCB0bwpiZSBhIGNvbXBsZXRlIHNpZ25h +dHVyZS4KCldpdGggbW9yZSB0aGFuIDEgYXJndW1lbnQsIHRoZSBmaXJzdCBzaG91 +bGQgYmUgYSBkZXRhY2hlZCBzaWduYXR1cmUKYW5kIHRoZSByZW1haW5pbmcgZmls +ZXMgYWtlIHVwIHRoZSB0aGUgc2lnbmVkIGRhdGEuIFRvIHJlYWQgdGhlIHNpZ25l +ZApkYXRhIGZyb20gU1RESU4sIHVzZSBAc2FtcHstfSBhcyB0aGUgc2Vjb25kIGZp +bGVuYW1lLiAgRm9yIHNlY3VyaXR5CnJlYXNvbnMgYSBkZXRhY2hlZCBzaWduYXR1 +cmUgY2Fubm90IHJlYWQgdGhlIHNpZ25lZCBtYXRlcmlhbCBmcm9tClNURElOIHdp +dGhvdXQgZGVub3RpbmcgaXQgaW4gdGhlIGFib3ZlIHdheS4KCk5vdGU6IElmIHRo +ZSBvcHRpb24gQG9wdGlvbnstLWJhdGNofSBpcyBub3QgdXNlZCwgQGNvbW1hbmR7 +QGdwZ25hbWV9Cm1heSBhc3N1bWUgdGhhdCBhIHNpbmdsZSBhcmd1bWVudCBpcyBh +IGZpbGUgd2l0aCBhIGRldGFjaGVkIHNpZ25hdHVyZQphbmQgaXQgd2lsbCB0cnkg +dG8gZmluZCBhIG1hdGNoaW5nIGRhdGEgZmlsZSBieSBzdHJpcHBpbmcgY2VydGFp +bgpzdWZmaXhlcy4gIFVzaW5nIHRoaXMgaGlzdG9yaWNhbCBmZWF0dXJlIHRvIHZl +cmlmeSBhIGRldGFjaGVkCnNpZ25hdHVyZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdl +ZDsgYWx3YXlzIHNwZWNpZnkgdGhlIGRhdGEgZmlsZSB0b28uCgpOb3RlOiBXaGVu +IHZlcmlmeWluZyBhIGNsZWFydGV4dCBzaWduYXR1cmUsIEBjb21tYW5ke2dwZ30g +dmVyaWZpZXMKb25seSB3aGF0IG1ha2VzIHVwIHRoZSBjbGVhcnRleHQgc2lnbmVk +IGRhdGEgYW5kIG5vdCBhbnkgZXh0cmEgZGF0YQpvdXRzaWRlIG9mIHRoZSBjbGVh +cnRleHQgc2lnbmF0dXJlIG9yIGhlYWRlciBsaW5lcyBmb2xsb3dpbmcgZGlyZWN0 +bHkKdGhlIGRhc2ggbWFya2VyIGxpbmUuICBUaGUgb3B0aW9uIEBjb2Rley0tb3V0 +cHV0fSBtYXkgYmUgdXNlZCB0byB3cml0ZQpvdXQgdGhlIGFjdHVhbCBzaWduZWQg +ZGF0YTsgYnV0IHRoZXJlIGFyZSBvdGhlciBwaXRmYWxscyB3aXRoIHRoaXMKZm9y +bWF0IGFzIHdlbGwuICBJdCBpcyBzdWdnZXN0ZWQgdG8gYXZvaWQgY2xlYXJ0ZXh0 +IHNpZ25hdHVyZXMgaW4KZmF2b3Igb2YgZGV0YWNoZWQgc2lnbmF0dXJlcy4KCkBp +dGVtIC0tbXVsdGlmaWxlCkBvcGluZGV4IG11bHRpZmlsZQpUaGlzIG1vZGlmaWVz +IGNlcnRhaW4gb3RoZXIgY29tbWFuZHMgdG8gYWNjZXB0IG11bHRpcGxlIGZpbGVz +IGZvcgpwcm9jZXNzaW5nIG9uIHRoZSBjb21tYW5kIGxpbmUgb3IgcmVhZCBmcm9t +IFNURElOIHdpdGggZWFjaCBmaWxlbmFtZSBvbgphIHNlcGFyYXRlIGxpbmUuIFRo +aXMgYWxsb3dzIGZvciBtYW55IGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBhdApvbmNl +LiBAb3B0aW9uey0tbXVsdGlmaWxlfSBtYXkgY3VycmVudGx5IGJlIHVzZWQgYWxv +bmcgd2l0aApAb3B0aW9uey0tdmVyaWZ5fSwgQG9wdGlvbnstLWVuY3J5cHR9LCBh +bmQgQG9wdGlvbnstLWRlY3J5cHR9LiBOb3RlIHRoYXQKQG9wdGlvbnstLW11bHRp +ZmlsZSAtLXZlcmlmeX0gbWF5IG5vdCBiZSB1c2VkIHdpdGggZGV0YWNoZWQgc2ln +bmF0dXJlcy4KCkBpdGVtIC0tdmVyaWZ5LWZpbGVzCkBvcGluZGV4IHZlcmlmeS1m +aWxlcwpJZGVudGljYWwgdG8gQG9wdGlvbnstLW11bHRpZmlsZSAtLXZlcmlmeX0u +CgpAaXRlbSAtLWVuY3J5cHQtZmlsZXMKQG9waW5kZXggZW5jcnlwdC1maWxlcwpJ +ZGVudGljYWwgdG8gQG9wdGlvbnstLW11bHRpZmlsZSAtLWVuY3J5cHR9LgoKQGl0 +ZW0gLS1kZWNyeXB0LWZpbGVzCkBvcGluZGV4IGRlY3J5cHQtZmlsZXMKSWRlbnRp +Y2FsIHRvIEBvcHRpb257LS1tdWx0aWZpbGUgLS1kZWNyeXB0fS4KCkBpdGVtIC0t +bGlzdC1rZXlzCkBpdGVteCAtawpAaXRlbXggLS1saXN0LXB1YmxpYy1rZXlzCkBv +cGluZGV4IGxpc3Qta2V5cwpMaXN0IGFsbCBrZXlzIGZyb20gdGhlIHB1YmxpYyBr +ZXlyaW5ncywgb3IganVzdCB0aGUga2V5cyBnaXZlbiBvbiB0aGUKY29tbWFuZCBs +aW5lLgoKQXZvaWQgdXNpbmcgdGhlIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgaW4g +c2NyaXB0cyBvciBvdGhlciBwcm9ncmFtcyBhcwppdCBpcyBsaWtlbHkgdG8gY2hh +bmdlIGFzIEdudVBHIGNoYW5nZXMuIFNlZSBAb3B0aW9uey0td2l0aC1jb2xvbnN9 +IGZvciBhCm1hY2hpbmUtcGFyc2VhYmxlIGtleSBsaXN0aW5nIGNvbW1hbmQgdGhh +dCBpcyBhcHByb3ByaWF0ZSBmb3IgdXNlIGluCnNjcmlwdHMgYW5kIG90aGVyIHBy +b2dyYW1zLgoKQGl0ZW0gLS1saXN0LXNlY3JldC1rZXlzCkBpdGVteCAtSwpAb3Bp +bmRleCBsaXN0LXNlY3JldC1rZXlzCkxpc3QgYWxsIGtleXMgZnJvbSB0aGUgc2Vj +cmV0IGtleXJpbmdzLCBvciBqdXN0IHRoZSBvbmVzIGdpdmVuIG9uIHRoZQpjb21t +YW5kIGxpbmUuIEEgQGNvZGV7I30gYWZ0ZXIgdGhlIGxldHRlcnMgQGNvZGV7c2Vj +fSBtZWFucyB0aGF0IHRoZQpzZWNyZXQga2V5IGlzIG5vdCB1c2FibGUgKGZvciBl +eGFtcGxlLCBpZiBpdCB3YXMgY3JlYXRlZCB2aWEKQG9wdGlvbnstLWV4cG9ydC1z +ZWNyZXQtc3Via2V5c30pLgoKQGl0ZW0gLS1saXN0LXNpZ3MKQG9waW5kZXggbGlz +dC1zaWdzClNhbWUgYXMgQG9wdGlvbnstLWxpc3Qta2V5c30sIGJ1dCB0aGUgc2ln +bmF0dXJlcyBhcmUgbGlzdGVkIHRvby4KVGhpcyBjb21tYW5kIGhhcyB0aGUgc2Ft +ZSBlZmZlY3QgYXMKdXNpbmcgQG9wdGlvbnstLWxpc3Qta2V5c30gd2l0aCBAb3B0 +aW9uey0td2l0aC1zaWctbGlzdH0uCgpGb3IgZWFjaCBzaWduYXR1cmUgbGlzdGVk +LCB0aGVyZSBhcmUgc2V2ZXJhbCBmbGFncyBpbiBiZXR3ZWVuIHRoZSAic2lnIgp0 +YWcgYW5kIGtleWlkLiBUaGVzZSBmbGFncyBnaXZlIGFkZGl0aW9uYWwgaW5mb3Jt +YXRpb24gYWJvdXQgZWFjaApzaWduYXR1cmUuIEZyb20gbGVmdCB0byByaWdodCwg +dGhleSBhcmUgdGhlIG51bWJlcnMgMS0zIGZvciBjZXJ0aWZpY2F0ZQpjaGVjayBs +ZXZlbCAoc2VlIEBvcHRpb257LS1hc2stY2VydC1sZXZlbH0pLCAiTCIgZm9yIGEg +bG9jYWwgb3IKbm9uLWV4cG9ydGFibGUgc2lnbmF0dXJlIChzZWUgQG9wdGlvbnst +LWxzaWduLWtleX0pLCAiUiIgZm9yIGEKbm9uUmV2b2NhYmxlIHNpZ25hdHVyZSAo +c2VlIHRoZSBAb3B0aW9uey0tZWRpdC1rZXl9IGNvbW1hbmQgIm5yc2lnbiIpLAoi +UCIgZm9yIGEgc2lnbmF0dXJlIHRoYXQgY29udGFpbnMgYSBwb2xpY3kgVVJMIChz +ZWUKQG9wdGlvbnstLWNlcnQtcG9saWN5LXVybH0pLCAiTiIgZm9yIGEgc2lnbmF0 +dXJlIHRoYXQgY29udGFpbnMgYQpub3RhdGlvbiAoc2VlIEBvcHRpb257LS1jZXJ0 +LW5vdGF0aW9ufSksICJYIiBmb3IgYW4gZVhwaXJlZCBzaWduYXR1cmUKKHNlZSBA +b3B0aW9uey0tYXNrLWNlcnQtZXhwaXJlfSksIGFuZCB0aGUgbnVtYmVycyAxLTkg +b3IgIlQiIGZvciAxMCBhbmQKYWJvdmUgdG8gaW5kaWNhdGUgdHJ1c3Qgc2lnbmF0 +dXJlIGxldmVscyAoc2VlIHRoZSBAb3B0aW9uey0tZWRpdC1rZXl9CmNvbW1hbmQg +InRzaWduIikuCgpAaXRlbSAtLWNoZWNrLXNpZ3MKQG9waW5kZXggY2hlY2stc2ln +cwpTYW1lIGFzIEBvcHRpb257LS1saXN0LXNpZ3N9LCBidXQgdGhlIHNpZ25hdHVy +ZXMgYXJlIHZlcmlmaWVkLiAgTm90ZQp0aGF0IGZvciBwZXJmb3JtYW5jZSByZWFz +b25zIHRoZSByZXZvY2F0aW9uIHN0YXR1cyBvZiBhIHNpZ25pbmcga2V5IGlzCm5v +dCBzaG93bi4KVGhpcyBjb21tYW5kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKdXNp +bmcgQG9wdGlvbnstLWxpc3Qta2V5c30gd2l0aCBAb3B0aW9uey0td2l0aC1zaWct +Y2hlY2t9LgoKVGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGlzIGluZGlj +YXRlZCBieSBhIGZsYWcgZGlyZWN0bHkgZm9sbG93aW5nCnRoZSAic2lnIiB0YWcg +KGFuZCB0aHVzIGJlZm9yZSB0aGUgZmxhZ3MgZGVzY3JpYmVkIGFib3ZlIGZvcgpA +b3B0aW9uey0tbGlzdC1zaWdzfSkuICBBICIhIiBpbmRpY2F0ZXMgdGhhdCB0aGUg +c2lnbmF0dXJlIGhhcyBiZWVuCnN1Y2Nlc3NmdWxseSB2ZXJpZmllZCwgYSAiLSIg +ZGVub3RlcyBhIGJhZCBzaWduYXR1cmUgYW5kIGEgIiUiIGlzIHVzZWQKaWYgYW4g +ZXJyb3Igb2NjdXJyZWQgd2hpbGUgY2hlY2tpbmcgdGhlIHNpZ25hdHVyZSAoZS5n +LiBhIG5vbiBzdXBwb3J0ZWQKYWxnb3JpdGhtKS4KCkBpdGVtIC0tbG9jYXRlLWtl +eXMKQG9waW5kZXggbG9jYXRlLWtleXMKTG9jYXRlIHRoZSBrZXlzIGdpdmVuIGFz +IGFyZ3VtZW50cy4gIFRoaXMgY29tbWFuZCBiYXNpY2FsbHkgdXNlcyB0aGUKc2Ft +ZSBhbGdvcml0aG0gYXMgdXNlZCB3aGVuIGxvY2F0aW5nIGtleXMgZm9yIGVuY3J5 +cHRpb24gb3Igc2lnbmluZyBhbmQKbWF5IHRodXMgYmUgdXNlZCB0byBzZWUgd2hh +dCBrZXlzIEBjb21tYW5ke0BncGduYW1lfSBtaWdodCB1c2UuICBJbgpwYXJ0aWN1 +bGFyIGV4dGVybmFsIG1ldGhvZHMgYXMgZGVmaW5lZCBieSBAb3B0aW9uey0tYXV0 +by1rZXktbG9jYXRlfSBtYXkKYmUgdXNlZCB0byBsb2NhdGUgYSBrZXkuICBPbmx5 +IHB1YmxpYyBrZXlzIGFyZSBsaXN0ZWQuCgpAaXRlbSAtLWZpbmdlcnByaW50CkBv +cGluZGV4IGZpbmdlcnByaW50Ckxpc3QgYWxsIGtleXMgKG9yIHRoZSBzcGVjaWZp +ZWQgb25lcykgYWxvbmcgd2l0aCB0aGVpcgpmaW5nZXJwcmludHMuIFRoaXMgaXMg +dGhlIHNhbWUgb3V0cHV0IGFzIEBvcHRpb257LS1saXN0LWtleXN9IGJ1dCB3aXRo +CnRoZSBhZGRpdGlvbmFsIG91dHB1dCBvZiBhIGxpbmUgd2l0aCB0aGUgZmluZ2Vy +cHJpbnQuIE1heSBhbHNvIGJlCmNvbWJpbmVkIHdpdGggQG9wdGlvbnstLWxpc3Qt +c2lnc30gb3IgQG9wdGlvbnstLWNoZWNrLXNpZ3N9LiAgSWYgdGhpcwpjb21tYW5k +IGlzIGdpdmVuIHR3aWNlLCB0aGUgZmluZ2VycHJpbnRzIG9mIGFsbCBzZWNvbmRh +cnkga2V5cyBhcmUKbGlzdGVkIHRvby4KCkBpdGVtIC0tbGlzdC1wYWNrZXRzCkBv +cGluZGV4IGxpc3QtcGFja2V0cwpMaXN0IG9ubHkgdGhlIHNlcXVlbmNlIG9mIHBh +Y2tldHMuIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bCBmb3IKZGVidWdnaW5nLiAgV2hl +biB1c2VkIHdpdGggb3B0aW9uIEBvcHRpb257LS12ZXJib3NlfSB0aGUgYWN0dWFs +IE1QSQp2YWx1ZXMgYXJlIGR1bXBlZCBhbmQgbm90IG9ubHkgdGhlaXIgbGVuZ3Ro +cy4KCgpAaXRlbSAtLWNhcmQtZWRpdApAb3BpbmRleCBjYXJkLWVkaXQKUHJlc2Vu +dCBhIG1lbnUgdG8gd29yayB3aXRoIGEgc21hcnRjYXJkLiBUaGUgc3ViY29tbWFu +ZCAiaGVscCIgcHJvdmlkZXMKYW4gb3ZlcnZpZXcgb24gYXZhaWxhYmxlIGNvbW1h +bmRzLiBGb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiwgcGxlYXNlCnNlZSB0aGUg +Q2FyZCBIT1dUTyBhdApodHRwczovL2dudXBnLm9yZy9kb2N1bWVudGF0aW9uL2hv +d3Rvcy5odG1sI0dudVBHLWNhcmRIT1dUTyAuCgpAaXRlbSAtLWNhcmQtc3RhdHVz +CkBvcGluZGV4IGNhcmQtc3RhdHVzClNob3cgdGhlIGNvbnRlbnQgb2YgdGhlIHNt +YXJ0IGNhcmQuCgpAaXRlbSAtLWNoYW5nZS1waW4KQG9waW5kZXggY2hhbmdlLXBp +bgpQcmVzZW50IGEgbWVudSB0byBhbGxvdyBjaGFuZ2luZyB0aGUgUElOIG9mIGEg +c21hcnRjYXJkLiBUaGlzCmZ1bmN0aW9uYWxpdHkgaXMgYWxzbyBhdmFpbGFibGUg +YXMgdGhlIHN1YmNvbW1hbmQgInBhc3N3ZCIgd2l0aCB0aGUKQG9wdGlvbnstLWNh +cmQtZWRpdH0gY29tbWFuZC4KCkBpdGVtIC0tZGVsZXRlLWtleXMgQGNvZGV7bmFt +ZX0KQGl0ZW14IC0tZGVsZXRlLWtleXMgQGNvZGV7bmFtZX0KUmVtb3ZlIGtleSBm +cm9tIHRoZSBwdWJsaWMga2V5cmluZy4gSW4gYmF0Y2ggbW9kZSBlaXRoZXIgQG9w +dGlvbnstLXllc30gaXMKcmVxdWlyZWQgb3IgdGhlIGtleSBtdXN0IGJlIHNwZWNp +ZmllZCBieSBmaW5nZXJwcmludC4gVGhpcyBpcyBhCnNhZmVndWFyZCBhZ2FpbnN0 +IGFjY2lkZW50YWwgZGVsZXRpb24gb2YgbXVsdGlwbGUga2V5cy4KCkBpdGVtIC0t +ZGVsZXRlLXNlY3JldC1rZXlzIEBjb2Rle25hbWV9CkBvcGluZGV4IGRlbGV0ZS1z +ZWNyZXQta2V5cwpSZW1vdmUga2V5IGZyb20gdGhlIHNlY3JldCBrZXlyaW5nLiBJ +biBiYXRjaCBtb2RlIHRoZSBrZXkKbXVzdCBiZSBzcGVjaWZpZWQgYnkgZmluZ2Vy +cHJpbnQuCgpAaXRlbSAtLWRlbGV0ZS1zZWNyZXQtYW5kLXB1YmxpYy1rZXkgQGNv +ZGV7bmFtZX0KQG9waW5kZXggZGVsZXRlLXNlY3JldC1hbmQtcHVibGljLWtleQpT +YW1lIGFzIEBvcHRpb257LS1kZWxldGUta2V5fSwgYnV0IGlmIGEgc2VjcmV0IGtl +eSBleGlzdHMsIGl0IHdpbGwgYmUKcmVtb3ZlZCBmaXJzdC4gSW4gYmF0Y2ggbW9k +ZSB0aGUga2V5IG11c3QgYmUgc3BlY2lmaWVkIGJ5IGZpbmdlcnByaW50LgoKQGl0 +ZW0gLS1leHBvcnQKQG9waW5kZXggZXhwb3J0CkVpdGhlciBleHBvcnQgYWxsIGtl +eXMgZnJvbSBhbGwga2V5cmluZ3MgKGRlZmF1bHQga2V5cmluZ3MgYW5kIHRob3Nl +CnJlZ2lzdGVyZWQgdmlhIG9wdGlvbiBAb3B0aW9uey0ta2V5cmluZ30pLCBvciBp +ZiBhdCBsZWFzdCBvbmUgbmFtZSBpcyBnaXZlbiwKdGhvc2Ugb2YgdGhlIGdpdmVu +IG5hbWUuIFRoZSBleHBvcnRlZCBrZXlzIGFyZSB3cml0dGVuIHRvIFNURE9VVCBv +ciB0byB0aGUKZmlsZSBnaXZlbiB3aXRoIG9wdGlvbiBAb3B0aW9uey0tb3V0cHV0 +fS4gIFVzZSB0b2dldGhlciB3aXRoCkBvcHRpb257LS1hcm1vcn0gdG8gbWFpbCB0 +aG9zZSBrZXlzLgoKQGl0ZW0gLS1zZW5kLWtleXMgQGNvZGV7a2V5IElEc30KQG9w +aW5kZXggc2VuZC1rZXlzClNpbWlsYXIgdG8gQG9wdGlvbnstLWV4cG9ydH0gYnV0 +IHNlbmRzIHRoZSBrZXlzIHRvIGEga2V5c2VydmVyLgpGaW5nZXJwcmludHMgbWF5 +IGJlIHVzZWQgaW5zdGVhZCBvZiBrZXkgSURzLiBPcHRpb24gQG9wdGlvbnstLWtl +eXNlcnZlcn0KbXVzdCBiZSB1c2VkIHRvIGdpdmUgdGhlIG5hbWUgb2YgdGhpcyBr +ZXlzZXJ2ZXIuIERvbid0IHNlbmQgeW91cgpjb21wbGV0ZSBrZXlyaW5nIHRvIGEg +a2V5c2VydmVyIC0tLSBzZWxlY3Qgb25seSB0aG9zZSBrZXlzIHdoaWNoIGFyZSBu +ZXcKb3IgY2hhbmdlZCBieSB5b3UuICBJZiBubyBrZXkgSURzIGFyZSBnaXZlbiwg +QGNvbW1hbmR7Z3BnfSBkb2VzIG5vdGhpbmcuCgpAaXRlbSAtLWV4cG9ydC1zZWNy +ZXQta2V5cwpAaXRlbXggLS1leHBvcnQtc2VjcmV0LXN1YmtleXMKQG9waW5kZXgg +ZXhwb3J0LXNlY3JldC1rZXlzCkBvcGluZGV4IGV4cG9ydC1zZWNyZXQtc3Via2V5 +cwpTYW1lIGFzIEBvcHRpb257LS1leHBvcnR9LCBidXQgZXhwb3J0cyB0aGUgc2Vj +cmV0IGtleXMgaW5zdGVhZC4gIFRoZQpleHBvcnRlZCBrZXlzIGFyZSB3cml0dGVu +IHRvIFNURE9VVCBvciB0byB0aGUgZmlsZSBnaXZlbiB3aXRoIG9wdGlvbgpAb3B0 +aW9uey0tb3V0cHV0fS4gIFRoaXMgY29tbWFuZCBpcyBvZnRlbiB1c2VkIGFsb25n +IHdpdGggdGhlIG9wdGlvbgpAb3B0aW9uey0tYXJtb3J9IHRvIGFsbG93IGVhc3kg +cHJpbnRpbmcgb2YgdGhlIGtleSBmb3IgcGFwZXIgYmFja3VwOwpob3dldmVyIHRo +ZSBleHRlcm5hbCB0b29sIEBjb21tYW5ke3BhcGVya2V5fSBkb2VzIGEgYmV0dGVy +IGpvYiBmb3IKY3JlYXRpbmcgYmFja3VwcyBvbiBwYXBlci4gIE5vdGUgdGhhdCBl +eHBvcnRpbmcgYSBzZWNyZXQga2V5IGNhbiBiZSBhCnNlY3VyaXR5IHJpc2sgaWYg +dGhlIGV4cG9ydGVkIGtleXMgYXJlIHNlbmQgb3ZlciBhbiBpbnNlY3VyZSBjaGFu +bmVsLgoKVGhlIHNlY29uZCBmb3JtIG9mIHRoZSBjb21tYW5kIGhhcyB0aGUgc3Bl +Y2lhbCBwcm9wZXJ0eSB0byByZW5kZXIgdGhlCnNlY3JldCBwYXJ0IG9mIHRoZSBw +cmltYXJ5IGtleSB1c2VsZXNzOyB0aGlzIGlzIGEgR05VIGV4dGVuc2lvbiB0bwpP +cGVuUEdQIGFuZCBvdGhlciBpbXBsZW1lbnRhdGlvbnMgY2FuIG5vdCBiZSBleHBl +Y3RlZCB0byBzdWNjZXNzZnVsbHkKaW1wb3J0IHN1Y2ggYSBrZXkuICBJdHMgaW50 +ZW5kZWQgdXNlIGlzIHRvIGdlbmVyYXRlZCBhIGZ1bGwga2V5IHdpdGgKYW4gYWRk +aXRpb25hbCBzaWduaW5nIHN1YmtleSBvbiBhIGRlZGljYXRlZCBtYWNoaW5lIGFu +ZCB0aGVuIHVzaW5nCnRoaXMgY29tbWFuZCB0byBleHBvcnQgdGhlIGtleSB3aXRo +b3V0IHRoZSBwcmltYXJ5IGtleSB0byB0aGUgbWFpbgptYWNoaW5lLgoKR251UEcg +bWF5IGFzayB5b3UgdG8gZW50ZXIgdGhlIHBhc3NwaHJhc2UgZm9yIHRoZSBrZXku +ICBUaGlzIGlzCnJlcXVpcmVkIGJlY2F1c2UgdGhlIGludGVybmFsIHByb3RlY3Rp +b24gbWV0aG9kIG9mIHRoZSBzZWNyZXQga2V5IGlzCmRpZmZlcmVudCBmcm9tIHRo +ZSBvbmUgc3BlY2lmaWVkIGJ5IHRoZSBPcGVuUEdQIHByb3RvY29sLgoKQGl0ZW0g +LS1leHBvcnQtc3NoLWtleQpAb3BpbmRleCBleHBvcnQtc3NoLWtleQpUaGlzIGNv +bW1hbmQgaXMgdXNlZCB0byBleHBvcnQgYSBrZXkgaW4gdGhlIE9wZW5TU0ggcHVi +bGljIGtleSBmb3JtYXQuCkl0IHJlcXVpcmVzIHRoZSBzcGVjaWZpY2F0aW9uIG9m +IG9uZSBrZXkgYnkgdGhlIHVzdWFsIG1lYW5zIGFuZApleHBvcnRzIHRoZSBsYXRl +c3QgdmFsaWQgc3Via2V5IHdoaWNoIGhhcyBhbiBhdXRoZW50aWNhdGlvbiBjYXBh +YmlsaXR5CnRvIFNURE9VVCBvciB0byB0aGUgZmlsZSBnaXZlbiB3aXRoIG9wdGlv +biBAb3B0aW9uey0tb3V0cHV0fS4gIFRoYXQKb3V0cHV0IGNhbiBkaXJlY3RseSBi +ZSBhZGRlZCB0byBzc2gncyBAZmlsZXthdXRob3JpemVkX2tleX0gZmlsZS4KCkJ5 +IHNwZWNpZnlpbmcgdGhlIGtleSB0byBleHBvcnQgdXNpbmcgYSBrZXkgSUQgb3Ig +YSBmaW5nZXJwcmludApzdWZmaXhlZCB3aXRoIGFuIGV4Y2xhbWF0aW9uIG1hcmsg +KCEpLCBhIHNwZWNpZmljIHN1YmtleSBvciB0aGUKcHJpbWFyeSBrZXkgY2FuIGJl +IGV4cG9ydGVkLiAgVGhpcyBkb2VzIG5vdCBldmVuIHJlcXVpcmUgdGhhdCB0aGUg +a2V5CmhhcyB0aGUgYXV0aGVudGljYXRpb24gY2FwYWJpbGl0eSBmbGFnIHNldC4g +IFRvIHZpZXcgdGhlIGNhcGFiaWxpdHkKZmxhZ3Mgb2YgYSBrZXkgdXNlIEBjb2Rl +ey0tbGlzdC1vcHRpb25zIHNob3ctdXNhZ2V9IGFsb25nIHdpdGggYSBrZXkKbGlz +dGluZyBjb21tYW5kLgoKQGl0ZW0gLS1pbXBvcnQKQGl0ZW14IC0tZmFzdC1pbXBv +cnQKQG9waW5kZXggaW1wb3J0CkltcG9ydC9tZXJnZSBrZXlzLiBUaGlzIGFkZHMg +dGhlIGdpdmVuIGtleXMgdG8gdGhlCmtleXJpbmcuIFRoZSBmYXN0IHZlcnNpb24g +aXMgY3VycmVudGx5IGp1c3QgYSBzeW5vbnltLgoKVGhlcmUgYXJlIGEgZmV3IG90 +aGVyIG9wdGlvbnMgd2hpY2ggY29udHJvbCBob3cgdGhpcyBjb21tYW5kIHdvcmtz +LgpNb3N0IG5vdGFibGUgaGVyZSBpcyB0aGUgQG9wdGlvbnstLWltcG9ydC1vcHRp +b25zIG1lcmdlLW9ubHl9IG9wdGlvbgp3aGljaCBkb2VzIG5vdCBpbnNlcnQgbmV3 +IGtleXMgYnV0IGRvZXMgb25seSB0aGUgbWVyZ2luZyBvZiBuZXcKc2lnbmF0dXJl +cywgdXNlci1JRHMgYW5kIHN1YmtleXMuCgpAaXRlbSAtLXJlY3Yta2V5cyBAY29k +ZXtrZXkgSURzfQpAb3BpbmRleCByZWN2LWtleXMKSW1wb3J0IHRoZSBrZXlzIHdp +dGggdGhlIGdpdmVuIGtleSBJRHMgZnJvbSBhIGtleXNlcnZlci4gT3B0aW9uCkBv +cHRpb257LS1rZXlzZXJ2ZXJ9IG11c3QgYmUgdXNlZCB0byBnaXZlIHRoZSBuYW1l +IG9mIHRoaXMga2V5c2VydmVyLgoKQGl0ZW0gLS1yZWZyZXNoLWtleXMKQG9waW5k +ZXggcmVmcmVzaC1rZXlzClJlcXVlc3QgdXBkYXRlcyBmcm9tIGEga2V5c2VydmVy +IGZvciBrZXlzIHRoYXQgYWxyZWFkeSBleGlzdCBvbiB0aGUKbG9jYWwga2V5cmlu +Zy4gVGhpcyBpcyB1c2VmdWwgZm9yIHVwZGF0aW5nIGEga2V5IHdpdGggdGhlIGxh +dGVzdApzaWduYXR1cmVzLCB1c2VyIElEcywgZXRjLiBDYWxsaW5nIHRoaXMgd2l0 +aCBubyBhcmd1bWVudHMgd2lsbCByZWZyZXNoCnRoZSBlbnRpcmUga2V5cmluZy4g +T3B0aW9uIEBvcHRpb257LS1rZXlzZXJ2ZXJ9IG11c3QgYmUgdXNlZCB0byBnaXZl +IHRoZQpuYW1lIG9mIHRoZSBrZXlzZXJ2ZXIgZm9yIGFsbCBrZXlzIHRoYXQgZG8g +bm90IGhhdmUgcHJlZmVycmVkIGtleXNlcnZlcnMKc2V0IChzZWUgQG9wdGlvbnst +LWtleXNlcnZlci1vcHRpb25zIGhvbm9yLWtleXNlcnZlci11cmx9KS4KCkBpdGVt +IC0tc2VhcmNoLWtleXMgQGNvZGV7bmFtZXN9CkBvcGluZGV4IHNlYXJjaC1rZXlz +ClNlYXJjaCB0aGUga2V5c2VydmVyIGZvciB0aGUgZ2l2ZW4gbmFtZXMuIE11bHRp +cGxlIG5hbWVzIGdpdmVuIGhlcmUgd2lsbApiZSBqb2luZWQgdG9nZXRoZXIgdG8g +Y3JlYXRlIHRoZSBzZWFyY2ggc3RyaW5nIGZvciB0aGUga2V5c2VydmVyLgpPcHRp +b24gQG9wdGlvbnstLWtleXNlcnZlcn0gbXVzdCBiZSB1c2VkIHRvIGdpdmUgdGhl +IG5hbWUgb2YgdGhpcwprZXlzZXJ2ZXIuICBLZXlzZXJ2ZXJzIHRoYXQgc3VwcG9y +dCBkaWZmZXJlbnQgc2VhcmNoIG1ldGhvZHMgYWxsb3cgdXNpbmcKdGhlIHN5bnRh +eCBzcGVjaWZpZWQgaW4gIkhvdyB0byBzcGVjaWZ5IGEgdXNlciBJRCIgYmVsb3cu +IE5vdGUgdGhhdApkaWZmZXJlbnQga2V5c2VydmVyIHR5cGVzIHN1cHBvcnQgZGlm +ZmVyZW50IHNlYXJjaCBtZXRob2RzLiBDdXJyZW50bHkKb25seSBMREFQIHN1cHBv +cnRzIHRoZW0gYWxsLgoKQGl0ZW0gLS1mZXRjaC1rZXlzIEBjb2Rle1VSSXN9CkBv +cGluZGV4IGZldGNoLWtleXMKUmV0cmlldmUga2V5cyBsb2NhdGVkIGF0IHRoZSBz +cGVjaWZpZWQgVVJJcy4gTm90ZSB0aGF0IGRpZmZlcmVudAppbnN0YWxsYXRpb25z +IG9mIEdudVBHIG1heSBzdXBwb3J0IGRpZmZlcmVudCBwcm90b2NvbHMgKEhUVFAs +IEZUUCwKTERBUCwgZXRjLikKCkBpdGVtIC0tdXBkYXRlLXRydXN0ZGIKQG9waW5k +ZXggdXBkYXRlLXRydXN0ZGIKRG8gdHJ1c3QgZGF0YWJhc2UgbWFpbnRlbmFuY2Uu +IFRoaXMgY29tbWFuZCBpdGVyYXRlcyBvdmVyIGFsbCBrZXlzIGFuZApidWlsZHMg +dGhlIFdlYiBvZiBUcnVzdC4gVGhpcyBpcyBhbiBpbnRlcmFjdGl2ZSBjb21tYW5k +IGJlY2F1c2UgaXQgbWF5CmhhdmUgdG8gYXNrIGZvciB0aGUgIm93bmVydHJ1c3Qi +IHZhbHVlcyBmb3Iga2V5cy4gVGhlIHVzZXIgaGFzIHRvIGdpdmUKYW4gZXN0aW1h +dGlvbiBvZiBob3cgZmFyIHNoZSB0cnVzdHMgdGhlIG93bmVyIG9mIHRoZSBkaXNw +bGF5ZWQga2V5IHRvCmNvcnJlY3RseSBjZXJ0aWZ5IChzaWduKSBvdGhlciBrZXlz +LiBHbnVQRyBvbmx5IGFza3MgZm9yIHRoZSBvd25lcnRydXN0CnZhbHVlIGlmIGl0 +IGhhcyBub3QgeWV0IGJlZW4gYXNzaWduZWQgdG8gYSBrZXkuIFVzaW5nIHRoZQpA +b3B0aW9uey0tZWRpdC1rZXl9IG1lbnUsIHRoZSBhc3NpZ25lZCB2YWx1ZSBjYW4g +YmUgY2hhbmdlZCBhdCBhbnkgdGltZS4KCkBpdGVtIC0tY2hlY2stdHJ1c3RkYgpA +b3BpbmRleCBjaGVjay10cnVzdGRiCkRvIHRydXN0IGRhdGFiYXNlIG1haW50ZW5h +bmNlIHdpdGhvdXQgdXNlciBpbnRlcmFjdGlvbi4gRnJvbSB0aW1lIHRvCnRpbWUg +dGhlIHRydXN0IGRhdGFiYXNlIG11c3QgYmUgdXBkYXRlZCBzbyB0aGF0IGV4cGly +ZWQga2V5cyBvcgpzaWduYXR1cmVzIGFuZCB0aGUgcmVzdWx0aW5nIGNoYW5nZXMg +aW4gdGhlIFdlYiBvZiBUcnVzdCBjYW4gYmUKdHJhY2tlZC4gTm9ybWFsbHksIEdu +dVBHIHdpbGwgY2FsY3VsYXRlIHdoZW4gdGhpcyBpcyByZXF1aXJlZCBhbmQgZG8g +aXQKYXV0b21hdGljYWxseSB1bmxlc3MgQG9wdGlvbnstLW5vLWF1dG8tY2hlY2st +dHJ1c3RkYn0gaXMgc2V0LiBUaGlzCmNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gZm9y +Y2UgYSB0cnVzdCBkYXRhYmFzZSBjaGVjayBhdCBhbnkgdGltZS4gVGhlCnByb2Nl +c3NpbmcgaXMgaWRlbnRpY2FsIHRvIHRoYXQgb2YgQG9wdGlvbnstLXVwZGF0ZS10 +cnVzdGRifSBidXQgaXQKc2tpcHMga2V5cyB3aXRoIGEgbm90IHlldCBkZWZpbmVk +ICJvd25lcnRydXN0Ii4KCkZvciB1c2Ugd2l0aCBjcm9uIGpvYnMsIHRoaXMgY29t +bWFuZCBjYW4gYmUgdXNlZCB0b2dldGhlciB3aXRoCkBvcHRpb257LS1iYXRjaH0g +aW4gd2hpY2ggY2FzZSB0aGUgdHJ1c3QgZGF0YWJhc2UgY2hlY2sgaXMgZG9uZSBv +bmx5IGlmCmEgY2hlY2sgaXMgbmVlZGVkLiBUbyBmb3JjZSBhIHJ1biBldmVuIGlu +IGJhdGNoIG1vZGUgYWRkIHRoZSBvcHRpb24KQG9wdGlvbnstLXllc30uCgpAYW5j +aG9ye29wdGlvbiAtLWV4cG9ydC1vd25lcnRydXN0fQpAaXRlbSAtLWV4cG9ydC1v +d25lcnRydXN0CkBvcGluZGV4IGV4cG9ydC1vd25lcnRydXN0ClNlbmQgdGhlIG93 +bmVydHJ1c3QgdmFsdWVzIHRvIFNURE9VVC4gVGhpcyBpcyB1c2VmdWwgZm9yIGJh +Y2t1cCBwdXJwb3NlcwphcyB0aGVzZSB2YWx1ZXMgYXJlIHRoZSBvbmx5IG9uZXMg +d2hpY2ggY2FuJ3QgYmUgcmUtY3JlYXRlZCBmcm9tIGEKY29ycnVwdGVkIHRydXN0 +ZGIuICBFeGFtcGxlOgpAYyBtYW46LlJTCkBleGFtcGxlCiAgQGdwZ25hbWV7fSAt +LWV4cG9ydC1vd25lcnRydXN0ID4gb3RydXN0LnR4dApAZW5kIGV4YW1wbGUKQGMg +bWFuOi5SRQoKCkBpdGVtIC0taW1wb3J0LW93bmVydHJ1c3QKQG9waW5kZXggaW1w +b3J0LW93bmVydHJ1c3QKVXBkYXRlIHRoZSB0cnVzdGRiIHdpdGggdGhlIG93bmVy +dHJ1c3QgdmFsdWVzIHN0b3JlZCBpbiBAY29kZXtmaWxlc30gKG9yClNURElOIGlm +IG5vdCBnaXZlbik7IGV4aXN0aW5nIHZhbHVlcyB3aWxsIGJlIG92ZXJ3cml0dGVu +LiAgSW4gY2FzZSBvZiBhCnNldmVyZWx5IGRhbWFnZWQgdHJ1c3RkYiBhbmQgaWYg +eW91IGhhdmUgYSByZWNlbnQgYmFja3VwIG9mIHRoZQpvd25lcnRydXN0IHZhbHVl +cyAoZS5nLiBpbiB0aGUgZmlsZSBAZmlsZXtvdHJ1c3QudHh0fSwgeW91IG1heSBy +ZS1jcmVhdGUKdGhlIHRydXN0ZGIgdXNpbmcgdGhlc2UgY29tbWFuZHM6CkBjIG1h +bjouUlMKQGV4YW1wbGUKICBjZCB+Ly5nbnVwZwogIHJtIHRydXN0ZGIuZ3BnCiAg +QGdwZ25hbWV7fSAtLWltcG9ydC1vd25lcnRydXN0IDwgb3RydXN0LnR4dApAZW5k +IGV4YW1wbGUKQGMgbWFuOi5SRQoKCkBpdGVtIC0tcmVidWlsZC1rZXlkYi1jYWNo +ZXMKQG9waW5kZXggcmVidWlsZC1rZXlkYi1jYWNoZXMKV2hlbiB1cGRhdGluZyBm +cm9tIHZlcnNpb24gMS4wLjYgdG8gMS4wLjcgdGhpcyBjb21tYW5kIHNob3VsZCBi +ZSB1c2VkCnRvIGNyZWF0ZSBzaWduYXR1cmUgY2FjaGVzIGluIHRoZSBrZXlyaW5n +LiBJdCBtaWdodCBiZSBoYW5keSBpbiBvdGhlcgpzaXR1YXRpb25zIHRvby4KCkBp +dGVtIC0tcHJpbnQtbWQgQGNvZGV7YWxnb30KQGl0ZW14IC0tcHJpbnQtbWRzCkBv +cGluZGV4IHByaW50LW1kClByaW50IG1lc3NhZ2UgZGlnZXN0IG9mIGFsZ29yaXRo +bSBBTEdPIGZvciBhbGwgZ2l2ZW4gZmlsZXMgb3IgU1RESU4uCldpdGggdGhlIHNl +Y29uZCBmb3JtIChvciBhIGRlcHJlY2F0ZWQgIioiIGFzIGFsZ28pIGRpZ2VzdHMg +Zm9yIGFsbAphdmFpbGFibGUgYWxnb3JpdGhtcyBhcmUgcHJpbnRlZC4KCkBpdGVt +IC0tZ2VuLXJhbmRvbSBAY29kZXswfDF8Mn0gQGNvZGV7Y291bnR9CkBvcGluZGV4 +IGdlbi1yYW5kb20KRW1pdCBAdmFye2NvdW50fSByYW5kb20gYnl0ZXMgb2YgdGhl +IGdpdmVuIHF1YWxpdHkgbGV2ZWwgMCwgMSBvciAyLiBJZgpAdmFye2NvdW50fSBp +cyBub3QgZ2l2ZW4gb3IgemVybywgYW4gZW5kbGVzcyBzZXF1ZW5jZSBvZiByYW5k +b20gYnl0ZXMKd2lsbCBiZSBlbWl0dGVkLiAgSWYgdXNlZCB3aXRoIEBvcHRpb257 +LS1hcm1vcn0gdGhlIG91dHB1dCB3aWxsIGJlCmJhc2U2NCBlbmNvZGVkLiAgUExF +QVNFLCBkb24ndCB1c2UgdGhpcyBjb21tYW5kIHVubGVzcyB5b3Uga25vdyB3aGF0 +CnlvdSBhcmUgZG9pbmc7IGl0IG1heSByZW1vdmUgcHJlY2lvdXMgZW50cm9weSBm +cm9tIHRoZSBzeXN0ZW0hCgpAaXRlbSAtLWdlbi1wcmltZSBAY29kZXttb2RlfSAg +QGNvZGV7Yml0c30KQG9waW5kZXggZ2VuLXByaW1lClVzZSB0aGUgc291cmNlLCBM +dWtlIDotKS4gVGhlIG91dHB1dCBmb3JtYXQgaXMgc3RpbGwgc3ViamVjdCB0byBj +aGFuZ2UuCgoKQGl0ZW0gLS1lbmFybW9yCkBpdGVtIC0tZGVhcm1vcgpAb3BpbmRl +eCBlbmFybW9yCkBvcGluZGV4IGRlYXJtb3IKUGFjayBvciB1bnBhY2sgYW4gYXJi +aXRyYXJ5IGlucHV0IGludG8vZnJvbSBhbiBPcGVuUEdQIEFTQ0lJIGFybW9yLgpU +aGlzIGlzIGEgR251UEcgZXh0ZW5zaW9uIHRvIE9wZW5QR1AgYW5kIGluIGdlbmVy +YWwgbm90IHZlcnkgdXNlZnVsLgoKQGl0ZW0gLS10b2Z1LXNldC1wb2xpY3kgQGNv +ZGV7YXV0b3xnb29kfHVua25vd258YmFkfGFza30gIEBjb2Rle2tleS4uLn0KQG9w +aW5kZXggdG9mdS1zZXQtcG9saWN5ClNldCB0aGUgVE9GVSBwb2xpY3kgZm9yIGFs +bCB0aGUgYmluZGluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKa2V5 +cy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZWFuaW5nIG9mIHRo +ZSBwb2xpY2llcywKQHB4cmVme3RydXN0LW1vZGVsLXRvZnV9LiAgVGhlIGtleXMg +bWF5IGJlIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlaXIKZmluZ2VycHJpbnQgKHBy +ZWZlcnJlZCkgb3IgdGhlaXIga2V5aWQuCgpAYyBAaXRlbSAtLXNlcnZlcgpAYyBA +b3BpbmRleCBzZXJ2ZXIKQGMgUnVuIGdwZyBpbiBzZXJ2ZXIgbW9kZS4gIFRoaXMg +ZmVhdHVyZSBpcyBub3QgeWV0IHJlYWR5IGZvciB1c2UgYW5kCkBjIHRodXMgbm90 +IGRvY3VtZW50ZWQuCgpAZW5kIHRhYmxlCgoKQGMgKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioqKioqKioqKioqKgpAYyAqKioqKioqICBLRVkgTUFOR0VN +RU5UIENPTU1BTkRTICAqKioqKioqKioqCkBjICoqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioqKioqKioqKioKQG5vZGUgT3BlblBHUCBLZXkgTWFuYWdl +bWVudApAc3Vic2VjdGlvbiBIb3cgdG8gbWFuYWdlIHlvdXIga2V5cwoKVGhpcyBz +ZWN0aW9uIGV4cGxhaW5zIHRoZSBtYWluIGNvbW1hbmRzIGZvciBrZXkgbWFuYWdl +bWVudAoKQHRhYmxlIEBnbnVwZ3RhYm9wdAoKQGl0ZW0gLS1xdWljay1nZW4ta2V5 +IEBjb2Rle3VzZXItaWR9CkBvcGluZGV4IHF1aWNrLWdlbi1rZXkKVGhpcyBpcyBh +IHNpbXBsZSBjb21tYW5kIHRvIGdlbmVyYXRlIGEgc3RhbmRhcmQga2V5IHdpdGgg +b25lIHVzZXIgaWQuCkluIGNvbnRyYXN0IHRvIEBvcHRpb257LS1nZW4ta2V5fSB0 +aGUga2V5IGlzIGdlbmVyYXRlZCBkaXJlY3RseQp3aXRob3V0IHRoZSBuZWVkIHRv +IGFuc3dlciBhIGJ1bmNoIG9mIHByb21wdHMuICBVbmxlc3MgdGhlIG9wdGlvbgpA +b3B0aW9uey0teWVzfSBpcyBnaXZlbiwgdGhlIGtleSBjcmVhdGlvbiB3aWxsIGJl +IGNhbmNlbGVkIGlmIHRoZQpnaXZlbiB1c2VyIGlkIGFscmVhZHkgZXhpc3RzIGlu +IHRoZSBrZXkgcmluZy4KCklmIGludm9rZWQgZGlyZWN0bHkgb24gdGhlIGNvbnNv +bGUgd2l0aG91dCBhbnkgc3BlY2lhbCBvcHRpb25zIGFuCmFuc3dlciB0byBhIGBg +Q29udGludWU/Jycgc3R5bGUgY29uZmlybWF0aW9uIHByb21wdCBpcyByZXF1aXJl +ZC4gIEluCmNhc2UgdGhlIHVzZXIgaWQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGtl +eSByaW5nIGEgc2Vjb25kIHByb21wdCB0bwpmb3JjZSB0aGUgY3JlYXRpb24gb2Yg +dGhlIGtleSB3aWxsIHNob3cgdXAuCgpJZiB0aGlzIGNvbW1hbmQgaXMgdXNlZCB3 +aXRoIEBvcHRpb257LS1iYXRjaH0sCkBvcHRpb257LS1waW5lbnRyeS1tb2RlfSBo +YXMgYmVlbiBzZXQgdG8gQGNvZGV7bG9vcGJhY2t9LCBhbmQgb25lIG9mCnRoZSBw +YXNzcGhyYXNlIG9wdGlvbnMgKEBvcHRpb257LS1wYXNzcGhyYXNlfSwKQG9wdGlv +bnstLXBhc3NwaHJhc2UtZmR9LCBvciBAb3B0aW9ue3Bhc3NwaHJhc2UtZmlsZX0p +IGlzIHVzZWQsIHRoZQpzdXBwbGllZCBwYXNzcGhyYXNlIGlzIHVzZWQgZm9yIHRo +ZSBuZXcga2V5IGFuZCB0aGUgYWdlbnQgZG9lcyBub3QgYXNrCmZvciBpdC4gIFRv +IGNyZWF0ZSBhIGtleSB3aXRob3V0IGFueSBwcm90ZWN0aW9uIEBjb2Rley0tcGFz +c3BocmFzZSAnJ30KbWF5IGJlIHVzZWQuCgpAaXRlbSAtLWdlbi1rZXkKQG9waW5k +ZXggZ2VuLWtleQpHZW5lcmF0ZSBhIG5ldyBrZXkgcGFpciB1c2luZyB0aGUgY3Vy +cmVudCBkZWZhdWx0IHBhcmFtZXRlcnMuICBUaGlzIGlzCnRoZSBzdGFuZGFyZCBj +b21tYW5kIHRvIGNyZWF0ZSBhIG5ldyBrZXkuCgpAaXRlbSAtLWZ1bGwtZ2VuLWtl +eQpAb3BpbmRleCBnZW4ta2V5CkdlbmVyYXRlIGEgbmV3IGtleSBwYWlyIHdpdGgg +ZGlhbG9ncyBmb3IgYWxsIG9wdGlvbnMuICBUaGlzIGlzIGFuCmV4dGVuZGVkIHZl +cnNpb24gb2YgQG9wdGlvbnstLWdlbi1rZXl9LgoKVGhlcmUgaXMgYWxzbyBhIGZl +YXR1cmUgd2hpY2ggYWxsb3dzIHlvdSB0byBjcmVhdGUga2V5cyBpbiBiYXRjaApt +b2RlLiBTZWUgdGhlIHRoZSBtYW51YWwgc2VjdGlvbiBgYFVuYXR0ZW5kZWQga2V5 +IGdlbmVyYXRpb24nJyBvbiBob3cKdG8gdXNlIHRoaXMuCgpAaXRlbSAtLWdlbi1y +ZXZva2UgQGNvZGV7bmFtZX0KQG9waW5kZXggZ2VuLXJldm9rZQpHZW5lcmF0ZSBh +IHJldm9jYXRpb24gY2VydGlmaWNhdGUgZm9yIHRoZSBjb21wbGV0ZSBrZXkuIFRv +IHJldm9rZQphIHN1YmtleSBvciBhIHNpZ25hdHVyZSwgdXNlIHRoZSBAb3B0aW9u +ey0tZWRpdH0gY29tbWFuZC4KCkBpdGVtIC0tZGVzaWctcmV2b2tlIEBjb2Rle25h +bWV9CkBvcGluZGV4IGRlc2lnLXJldm9rZQpHZW5lcmF0ZSBhIGRlc2lnbmF0ZWQg +cmV2b2NhdGlvbiBjZXJ0aWZpY2F0ZSBmb3IgYSBrZXkuIFRoaXMgYWxsb3dzIGEK +dXNlciAod2l0aCB0aGUgcGVybWlzc2lvbiBvZiB0aGUga2V5aG9sZGVyKSB0byBy +ZXZva2Ugc29tZW9uZSBlbHNlJ3MKa2V5LgoKCkBpdGVtIC0tZWRpdC1rZXkKQG9w +aW5kZXggZWRpdC1rZXkKUHJlc2VudCBhIG1lbnUgd2hpY2ggZW5hYmxlcyB5b3Ug +dG8gZG8gbW9zdCBvZiB0aGUga2V5IG1hbmFnZW1lbnQKcmVsYXRlZCB0YXNrcy4g +IEl0IGV4cGVjdHMgdGhlIHNwZWNpZmljYXRpb24gb2YgYSBrZXkgb24gdGhlIGNv +bW1hbmQKbGluZS4KCkBjICoqKioqKioqIEJlZ2luIEVkaXQta2V5IE9wdGlvbnMg +KioqKioqKioqKgpAdGFibGUgQGFzaXMKCiAgQGl0ZW0gdWlkIEBjb2Rle259CiAg +QG9waW5kZXgga2V5ZWRpdDp1aWQKICBUb2dnbGUgc2VsZWN0aW9uIG9mIHVzZXIg +SUQgb3IgcGhvdG9ncmFwaGljIHVzZXIgSUQgd2l0aCBpbmRleCBAY29kZXtufS4K +ICBVc2UgQGNvZGV7Kn0gdG8gc2VsZWN0IGFsbCBhbmQgQGNvZGV7MH0gdG8gZGVz +ZWxlY3QgYWxsLgoKICBAaXRlbSBrZXkgQGNvZGV7bn0KICBAb3BpbmRleCBrZXll +ZGl0OmtleQogIFRvZ2dsZSBzZWxlY3Rpb24gb2Ygc3Via2V5IHdpdGggaW5kZXgg +QGNvZGV7bn0gb3Iga2V5IElEIEBjb2Rle259LgogIFVzZSBAY29kZXsqfSB0byBz +ZWxlY3QgYWxsIGFuZCBAY29kZXswfSB0byBkZXNlbGVjdCBhbGwuCgogIEBpdGVt +IHNpZ24KICBAb3BpbmRleCBrZXllZGl0OnNpZ24KICBNYWtlIGEgc2lnbmF0dXJl +IG9uIGtleSBvZiB1c2VyIEBjb2Rle25hbWV9IElmIHRoZSBrZXkgaXMgbm90IHll +dAogIHNpZ25lZCBieSB0aGUgZGVmYXVsdCB1c2VyIChvciB0aGUgdXNlcnMgZ2l2 +ZW4gd2l0aCAtdSksIHRoZSBwcm9ncmFtCiAgZGlzcGxheXMgdGhlIGluZm9ybWF0 +aW9uIG9mIHRoZSBrZXkgYWdhaW4sIHRvZ2V0aGVyIHdpdGggaXRzCiAgZmluZ2Vy +cHJpbnQgYW5kIGFza3Mgd2hldGhlciBpdCBzaG91bGQgYmUgc2lnbmVkLiBUaGlz +IHF1ZXN0aW9uIGlzCiAgcmVwZWF0ZWQgZm9yIGFsbCB1c2VycyBzcGVjaWZpZWQg +d2l0aAogIC11LgoKICBAaXRlbSBsc2lnbgogIEBvcGluZGV4IGtleWVkaXQ6bHNp +Z24KICBTYW1lIGFzICJzaWduIiBidXQgdGhlIHNpZ25hdHVyZSBpcyBtYXJrZWQg +YXMgbm9uLWV4cG9ydGFibGUgYW5kIHdpbGwKICB0aGVyZWZvcmUgbmV2ZXIgYmUg +dXNlZCBieSBvdGhlcnMuIFRoaXMgbWF5IGJlIHVzZWQgdG8gbWFrZSBrZXlzCiAg +dmFsaWQgb25seSBpbiB0aGUgbG9jYWwgZW52aXJvbm1lbnQuCgogIEBpdGVtIG5y +c2lnbgogIEBvcGluZGV4IGtleWVkaXQ6bnJzaWduCiAgU2FtZSBhcyAic2lnbiIg +YnV0IHRoZSBzaWduYXR1cmUgaXMgbWFya2VkIGFzIG5vbi1yZXZvY2FibGUgYW5k +IGNhbgogIHRoZXJlZm9yZSBuZXZlciBiZSByZXZva2VkLgoKICBAaXRlbSB0c2ln +bgogIEBvcGluZGV4IGtleWVkaXQ6dHNpZ24KICBNYWtlIGEgdHJ1c3Qgc2lnbmF0 +dXJlLiBUaGlzIGlzIGEgc2lnbmF0dXJlIHRoYXQgY29tYmluZXMgdGhlIG5vdGlv +bnMKICBvZiBjZXJ0aWZpY2F0aW9uIChsaWtlIGEgcmVndWxhciBzaWduYXR1cmUp +LCBhbmQgdHJ1c3QgKGxpa2UgdGhlCiAgInRydXN0IiBjb21tYW5kKS4gSXQgaXMg +Z2VuZXJhbGx5IG9ubHkgdXNlZnVsIGluIGRpc3RpbmN0IGNvbW11bml0aWVzCiAg +b3IgZ3JvdXBzLgpAZW5kIHRhYmxlCgpAYyBtYW46LlJTCk5vdGUgdGhhdCAibCIg +KGZvciBsb2NhbCAvIG5vbi1leHBvcnRhYmxlKSwgIm5yIiAoZm9yIG5vbi1yZXZv +Y2FibGUsCmFuZCAidCIgKGZvciB0cnVzdCkgbWF5IGJlIGZyZWVseSBtaXhlZCBh +bmQgcHJlZml4ZWQgdG8gInNpZ24iIHRvCmNyZWF0ZSBhIHNpZ25hdHVyZSBvZiBh +bnkgdHlwZSBkZXNpcmVkLgpAYyBtYW46LlJFCgpJZiB0aGUgb3B0aW9uIEBvcHRp +b257LS1vbmx5LXNpZ24tdGV4dC1pZHN9IGlzIHNwZWNpZmllZCwgdGhlbiBhbnkK +bm9uLXRleHQgYmFzZWQgdXNlciBpZHMgKGUuZy4sIHBob3RvIElEcykgd2lsbCBu +b3QgYmUgc2VsZWN0ZWQgZm9yCnNpZ25pbmcuCgpAdGFibGUgQGFzaXMKCiAgQGl0 +ZW0gZGVsc2lnCiAgQG9waW5kZXgga2V5ZWRpdDpkZWxzaWcKICBEZWxldGUgYSBz +aWduYXR1cmUuIE5vdGUgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmFj +dCBhIHNpZ25hdHVyZSwKICBvbmNlIGl0IGhhcyBiZWVuIHNlbmQgdG8gdGhlIHB1 +YmxpYyAoaS5lLiB0byBhIGtleXNlcnZlcikuICBJbiB0aGF0IGNhc2UKICB5b3Ug +YmV0dGVyIHVzZSBAY29kZXtyZXZzaWd9LgoKICBAaXRlbSByZXZzaWcKICBAb3Bp +bmRleCBrZXllZGl0OnJldnNpZwogIFJldm9rZSBhIHNpZ25hdHVyZS4gRm9yIGV2 +ZXJ5IHNpZ25hdHVyZSB3aGljaCBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkKICBvbmUg +b2YgdGhlIHNlY3JldCBrZXlzLCBHbnVQRyBhc2tzIHdoZXRoZXIgYSByZXZvY2F0 +aW9uIGNlcnRpZmljYXRlCiAgc2hvdWxkIGJlIGdlbmVyYXRlZC4KCiAgQGl0ZW0g +Y2hlY2sKICBAb3BpbmRleCBrZXllZGl0OmNoZWNrCiAgQ2hlY2sgdGhlIHNpZ25h +dHVyZXMgb24gYWxsIHNlbGVjdGVkIHVzZXIgSURzLiAgV2l0aCB0aGUgZXh0cmEK +ICBvcHRpb24gQGNvZGV7c2VsZnNpZ30gb25seSBzZWxmLXNpZ25hdHVyZXMgYXJl +IHNob3duLgoKICBAaXRlbSBhZGR1aWQKICBAb3BpbmRleCBrZXllZGl0OmFkZHVp +ZAogIENyZWF0ZSBhbiBhZGRpdGlvbmFsIHVzZXIgSUQuCgogIEBpdGVtIGFkZHBo +b3RvCiAgQG9waW5kZXgga2V5ZWRpdDphZGRwaG90bwogIENyZWF0ZSBhIHBob3Rv +Z3JhcGhpYyB1c2VyIElELiBUaGlzIHdpbGwgcHJvbXB0IGZvciBhIEpQRUcgZmls +ZSB0aGF0CiAgd2lsbCBiZSBlbWJlZGRlZCBpbnRvIHRoZSB1c2VyIElELiBOb3Rl +IHRoYXQgYSB2ZXJ5IGxhcmdlIEpQRUcgd2lsbCBtYWtlCiAgZm9yIGEgdmVyeSBs +YXJnZSBrZXkuIEFsc28gbm90ZSB0aGF0IHNvbWUgcHJvZ3JhbXMgd2lsbCBkaXNw +bGF5IHlvdXIKICBKUEVHIHVuY2hhbmdlZCAoR251UEcpLCBhbmQgc29tZSBwcm9n +cmFtcyB3aWxsIHNjYWxlIGl0IHRvIGZpdCBpbiBhCiAgZGlhbG9nIGJveCAoUEdQ +KS4KCiAgQGl0ZW0gc2hvd3Bob3RvCiAgQG9waW5kZXgga2V5ZWRpdDpzaG93cGhv +dG8KICBEaXNwbGF5IHRoZSBzZWxlY3RlZCBwaG90b2dyYXBoaWMgdXNlciBJRC4K +CiAgQGl0ZW0gZGVsdWlkCiAgQG9waW5kZXgga2V5ZWRpdDpkZWx1aWQKICBEZWxl +dGUgYSB1c2VyIElEIG9yIHBob3RvZ3JhcGhpYyB1c2VyIElELiAgTm90ZSB0aGF0 +IGl0IGlzIG5vdAogIHBvc3NpYmxlIHRvIHJldHJhY3QgYSB1c2VyIGlkLCBvbmNl +IGl0IGhhcyBiZWVuIHNlbmQgdG8gdGhlIHB1YmxpYwogIChpLmUuIHRvIGEga2V5 +c2VydmVyKS4gIEluIHRoYXQgY2FzZSB5b3UgYmV0dGVyIHVzZSBAY29kZXtyZXZ1 +aWR9LgoKICBAaXRlbSByZXZ1aWQKICBAb3BpbmRleCBrZXllZGl0OnJldnVpZAog +IFJldm9rZSBhIHVzZXIgSUQgb3IgcGhvdG9ncmFwaGljIHVzZXIgSUQuCgogIEBp +dGVtIHByaW1hcnkKICBAb3BpbmRleCBrZXllZGl0OnByaW1hcnkKICBGbGFnIHRo +ZSBjdXJyZW50IHVzZXIgaWQgYXMgdGhlIHByaW1hcnkgb25lLCByZW1vdmVzIHRo +ZSBwcmltYXJ5IHVzZXIKICBpZCBmbGFnIGZyb20gYWxsIG90aGVyIHVzZXIgaWRz +IGFuZCBzZXRzIHRoZSB0aW1lc3RhbXAgb2YgYWxsIGFmZmVjdGVkCiAgc2VsZi1z +aWduYXR1cmVzIG9uZSBzZWNvbmQgYWhlYWQuIE5vdGUgdGhhdCBzZXR0aW5nIGEg +cGhvdG8gdXNlciBJRAogIGFzIHByaW1hcnkgbWFrZXMgaXQgcHJpbWFyeSBvdmVy +IG90aGVyIHBob3RvIHVzZXIgSURzLCBhbmQgc2V0dGluZyBhCiAgcmVndWxhciB1 +c2VyIElEIGFzIHByaW1hcnkgbWFrZXMgaXQgcHJpbWFyeSBvdmVyIG90aGVyIHJl +Z3VsYXIgdXNlcgogIElEcy4KCiAgQGl0ZW0ga2V5c2VydmVyCiAgQG9waW5kZXgg +a2V5ZWRpdDprZXlzZXJ2ZXIKICBTZXQgYSBwcmVmZXJyZWQga2V5c2VydmVyIGZv +ciB0aGUgc3BlY2lmaWVkIHVzZXIgSUQocykuIFRoaXMgYWxsb3dzCiAgb3RoZXIg +dXNlcnMgdG8ga25vdyB3aGVyZSB5b3UgcHJlZmVyIHRoZXkgZ2V0IHlvdXIga2V5 +IGZyb20uIFNlZQogIEBvcHRpb257LS1rZXlzZXJ2ZXItb3B0aW9ucyBob25vci1r +ZXlzZXJ2ZXItdXJsfSBmb3IgbW9yZSBvbiBob3cgdGhpcwogIHdvcmtzLiAgU2V0 +dGluZyBhIHZhbHVlIG9mICJub25lIiByZW1vdmVzIGFuIGV4aXN0aW5nIHByZWZl +cnJlZAogIGtleXNlcnZlci4KCiAgQGl0ZW0gbm90YXRpb24KICBAb3BpbmRleCBr +ZXllZGl0Om5vdGF0aW9uCiAgU2V0IGEgbmFtZT12YWx1ZSBub3RhdGlvbiBmb3Ig +dGhlIHNwZWNpZmllZCB1c2VyIElEKHMpLiBTZWUKICBAb3B0aW9uey0tY2VydC1u +b3RhdGlvbn0gZm9yIG1vcmUgb24gaG93IHRoaXMgd29ya3MuIFNldHRpbmcgYSB2 +YWx1ZSBvZgogICJub25lIiByZW1vdmVzIGFsbCBub3RhdGlvbnMsIHNldHRpbmcg +YSBub3RhdGlvbiBwcmVmaXhlZCB3aXRoIGEgbWludXMKICBzaWduICgtKSByZW1v +dmVzIHRoYXQgbm90YXRpb24sIGFuZCBzZXR0aW5nIGEgbm90YXRpb24gbmFtZSAo +d2l0aG91dCB0aGUKICA9dmFsdWUpIHByZWZpeGVkIHdpdGggYSBtaW51cyBzaWdu +IHJlbW92ZXMgYWxsIG5vdGF0aW9ucyB3aXRoIHRoYXQgbmFtZS4KCiAgQGl0ZW0g +cHJlZgogIEBvcGluZGV4IGtleWVkaXQ6cHJlZgogIExpc3QgcHJlZmVyZW5jZXMg +ZnJvbSB0aGUgc2VsZWN0ZWQgdXNlciBJRC4gVGhpcyBzaG93cyB0aGUgYWN0dWFs +CiAgcHJlZmVyZW5jZXMsIHdpdGhvdXQgaW5jbHVkaW5nIGFueSBpbXBsaWVkIHBy +ZWZlcmVuY2VzLgoKICBAaXRlbSBzaG93cHJlZgogIEBvcGluZGV4IGtleWVkaXQ6 +c2hvd3ByZWYKICBNb3JlIHZlcmJvc2UgcHJlZmVyZW5jZXMgbGlzdGluZyBmb3Ig +dGhlIHNlbGVjdGVkIHVzZXIgSUQuIFRoaXMgc2hvd3MKICB0aGUgcHJlZmVyZW5j +ZXMgaW4gZWZmZWN0IGJ5IGluY2x1ZGluZyB0aGUgaW1wbGllZCBwcmVmZXJlbmNl +cyBvZiAzREVTCiAgKGNpcGhlciksIFNIQS0xIChkaWdlc3QpLCBhbmQgVW5jb21w +cmVzc2VkIChjb21wcmVzc2lvbikgaWYgdGhleSBhcmUKICBub3QgYWxyZWFkeSBp +bmNsdWRlZCBpbiB0aGUgcHJlZmVyZW5jZSBsaXN0LiBJbiBhZGRpdGlvbiwgdGhl +CiAgcHJlZmVycmVkIGtleXNlcnZlciBhbmQgc2lnbmF0dXJlIG5vdGF0aW9ucyAo +aWYgYW55KSBhcmUgc2hvd24uCgogIEBpdGVtIHNldHByZWYgQGNvZGV7c3RyaW5n +fQogIEBvcGluZGV4IGtleWVkaXQ6c2V0cHJlZgogIFNldCB0aGUgbGlzdCBvZiB1 +c2VyIElEIHByZWZlcmVuY2VzIHRvIEBjb2Rle3N0cmluZ30gZm9yIGFsbCAob3Ig +anVzdAogIHRoZSBzZWxlY3RlZCkgdXNlciBJRHMuIENhbGxpbmcgc2V0cHJlZiB3 +aXRoIG5vIGFyZ3VtZW50cyBzZXRzIHRoZQogIHByZWZlcmVuY2UgbGlzdCB0byB0 +aGUgZGVmYXVsdCAoZWl0aGVyIGJ1aWx0LWluIG9yIHNldCB2aWEKICBAb3B0aW9u +ey0tZGVmYXVsdC1wcmVmZXJlbmNlLWxpc3R9KSwgYW5kIGNhbGxpbmcgc2V0cHJl +ZiB3aXRoICJub25lIgogIGFzIHRoZSBhcmd1bWVudCBzZXRzIGFuIGVtcHR5IHBy +ZWZlcmVuY2UgbGlzdC4gVXNlIEBjb21tYW5ke0BncGduYW1lCiAgLS12ZXJzaW9u +fSB0byBnZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBhbGdvcml0aG1zLiBOb3RlIHRo +YXQgd2hpbGUgeW91CiAgY2FuIGNoYW5nZSB0aGUgcHJlZmVyZW5jZXMgb24gYW4g +YXR0cmlidXRlIHVzZXIgSUQgKGFrYSAicGhvdG8gSUQiKSwKICBHbnVQRyBkb2Vz +IG5vdCBzZWxlY3Qga2V5cyB2aWEgYXR0cmlidXRlIHVzZXIgSURzIHNvIHRoZXNl +IHByZWZlcmVuY2VzCiAgd2lsbCBub3QgYmUgdXNlZCBieSBHbnVQRy4KCiAgV2hl +biBzZXR0aW5nIHByZWZlcmVuY2VzLCB5b3Ugc2hvdWxkIGxpc3QgdGhlIGFsZ29y +aXRobXMgaW4gdGhlIG9yZGVyCiAgd2hpY2ggeW91J2QgbGlrZSB0byBzZWUgdGhl +bSB1c2VkIGJ5IHNvbWVvbmUgZWxzZSB3aGVuIGVuY3J5cHRpbmcgYQogIG1lc3Nh +Z2UgdG8geW91ciBrZXkuICBJZiB5b3UgZG9uJ3QgaW5jbHVkZSAzREVTLCBpdCB3 +aWxsIGJlCiAgYXV0b21hdGljYWxseSBhZGRlZCBhdCB0aGUgZW5kLiAgTm90ZSB0 +aGF0IHRoZXJlIGFyZSBtYW55IGZhY3RvcnMgdGhhdAogIGdvIGludG8gY2hvb3Np +bmcgYW4gYWxnb3JpdGhtIChmb3IgZXhhbXBsZSwgeW91ciBrZXkgbWF5IG5vdCBi +ZSB0aGUKICBvbmx5IHJlY2lwaWVudCksIGFuZCBzbyB0aGUgcmVtb3RlIE9wZW5Q +R1AgYXBwbGljYXRpb24gYmVpbmcgdXNlZCB0bwogIHNlbmQgdG8geW91IG1heSBv +ciBtYXkgbm90IGZvbGxvdyB5b3VyIGV4YWN0IGNob3NlbiBvcmRlciBmb3IgYSBn +aXZlbgogIG1lc3NhZ2UuICBJdCB3aWxsLCBob3dldmVyLCBvbmx5IGNob29zZSBh +biBhbGdvcml0aG0gdGhhdCBpcyBwcmVzZW50CiAgb24gdGhlIHByZWZlcmVuY2Ug +bGlzdCBvZiBldmVyeSByZWNpcGllbnQga2V5LiAgU2VlIGFsc28gdGhlCiAgSU5U +RVJPUEVSQUJJTElUWSBXSVRIIE9USEVSIE9QRU5QR1AgUFJPR1JBTVMgc2VjdGlv +biBiZWxvdy4KCiAgQGl0ZW0gYWRka2V5CiAgQG9waW5kZXgga2V5ZWRpdDphZGRr +ZXkKICBBZGQgYSBzdWJrZXkgdG8gdGhpcyBrZXkuCgogIEBpdGVtIGFkZGNhcmRr +ZXkKICBAb3BpbmRleCBrZXllZGl0OmFkZGNhcmRrZXkKICBHZW5lcmF0ZSBhIHN1 +YmtleSBvbiBhIGNhcmQgYW5kIGFkZCBpdCB0byB0aGlzIGtleS4KCiAgQGl0ZW0g +a2V5dG9jYXJkCiAgQG9waW5kZXgga2V5ZWRpdDprZXl0b2NhcmQKICBUcmFuc2Zl +ciB0aGUgc2VsZWN0ZWQgc2VjcmV0IHN1YmtleSAob3IgdGhlIHByaW1hcnkga2V5 +IGlmIG5vIHN1YmtleQogIGhhcyBiZWVuIHNlbGVjdGVkKSB0byBhIHNtYXJ0Y2Fy +ZC4gVGhlIHNlY3JldCBrZXkgaW4gdGhlIGtleXJpbmcgd2lsbAogIGJlIHJlcGxh +Y2VkIGJ5IGEgc3R1YiBpZiB0aGUga2V5IGNvdWxkIGJlIHN0b3JlZCBzdWNjZXNz +ZnVsbHkgb24gdGhlCiAgY2FyZCBhbmQgeW91IHVzZSB0aGUgc2F2ZSBjb21tYW5k +IGxhdGVyLiBPbmx5IGNlcnRhaW4ga2V5IHR5cGVzIG1heSBiZQogIHRyYW5zZmVy +cmVkIHRvIHRoZSBjYXJkLiBBIHN1YiBtZW51IGFsbG93cyB5b3UgdG8gc2VsZWN0 +IG9uIHdoYXQgY2FyZAogIHRvIHN0b3JlIHRoZSBrZXkuIE5vdGUgdGhhdCBpdCBp +cyBub3QgcG9zc2libGUgdG8gZ2V0IHRoYXQga2V5IGJhY2sKICBmcm9tIHRoZSBj +YXJkIC0gaWYgdGhlIGNhcmQgZ2V0cyBicm9rZW4geW91ciBzZWNyZXQga2V5IHdp +bGwgYmUgbG9zdAogIHVubGVzcyB5b3UgaGF2ZSBhIGJhY2t1cCBzb21ld2hlcmUu +CgogIEBpdGVtIGJrdXB0b2NhcmQgQGNvZGV7ZmlsZX0KICBAb3BpbmRleCBrZXll +ZGl0OmJrdXB0b2NhcmQKICBSZXN0b3JlIHRoZSBnaXZlbiBmaWxlIHRvIGEgY2Fy +ZC4gVGhpcyBjb21tYW5kIG1heSBiZSB1c2VkIHRvIHJlc3RvcmUgYQogIGJhY2t1 +cCBrZXkgKGFzIGdlbmVyYXRlZCBkdXJpbmcgY2FyZCBpbml0aWFsaXphdGlvbikg +dG8gYSBuZXcgY2FyZC4gSW4KICBhbG1vc3QgYWxsIGNhc2VzIHRoaXMgd2lsbCBi +ZSB0aGUgZW5jcnlwdGlvbiBrZXkuIFlvdSBzaG91bGQgdXNlIHRoaXMKICBjb21t +YW5kIG9ubHkgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwdWJsaWMga2V5IGFuZCBt +YWtlIHN1cmUgdGhhdCB0aGUKICBmaWxlIGdpdmVuIGFzIGFyZ3VtZW50IGlzIGlu +ZGVlZCB0aGUgYmFja3VwIHRvIHJlc3RvcmUuIFlvdSBzaG91bGQgdGhlbgogIHNl +bGVjdCAyIHRvIHJlc3RvcmUgYXMgZW5jcnlwdGlvbiBrZXkuICBZb3Ugd2lsbCBm +aXJzdCBiZSBhc2tlZCB0byBlbnRlcgogIHRoZSBwYXNzcGhyYXNlIG9mIHRoZSBi +YWNrdXAga2V5IGFuZCB0aGVuIGZvciB0aGUgQWRtaW4gUElOIG9mIHRoZSBjYXJk +LgoKICBAaXRlbSBkZWxrZXkKICBAb3BpbmRleCBrZXllZGl0OmRlbGtleQogIFJl +bW92ZSBhIHN1YmtleSAoc2Vjb25kYXJ5IGtleSkuIE5vdGUgdGhhdCBpdCBpcyBu +b3QgcG9zc2libGUgdG8gcmV0cmFjdAogIGEgc3Via2V5LCBvbmNlIGl0IGhhcyBi +ZWVuIHNlbmQgdG8gdGhlIHB1YmxpYyAoaS5lLiB0byBhIGtleXNlcnZlcikuICBJ +bgogIHRoYXQgY2FzZSB5b3UgYmV0dGVyIHVzZSBAY29kZXtyZXZrZXl9LgoKICBA +aXRlbSByZXZrZXkKICBAb3BpbmRleCBrZXllZGl0OnJldmtleQogIFJldm9rZSBh +IHN1YmtleS4KCiAgQGl0ZW0gZXhwaXJlCiAgQG9waW5kZXgga2V5ZWRpdDpleHBp +cmUKICBDaGFuZ2UgdGhlIGtleSBvciBzdWJrZXkgZXhwaXJhdGlvbiB0aW1lLiBJ +ZiBhIHN1YmtleSBpcyBzZWxlY3RlZCwgdGhlCiAgZXhwaXJhdGlvbiB0aW1lIG9m +IHRoaXMgc3Via2V5IHdpbGwgYmUgY2hhbmdlZC4gV2l0aCBubyBzZWxlY3Rpb24s +IHRoZQogIGtleSBleHBpcmF0aW9uIG9mIHRoZSBwcmltYXJ5IGtleSBpcyBjaGFu +Z2VkLgoKICBAaXRlbSB0cnVzdAogIEBvcGluZGV4IGtleWVkaXQ6dHJ1c3QKICBD +aGFuZ2UgdGhlIG93bmVyIHRydXN0IHZhbHVlIGZvciB0aGUga2V5LiBUaGlzIHVw +ZGF0ZXMgdGhlIHRydXN0LWRiCiAgaW1tZWRpYXRlbHkgYW5kIG5vIHNhdmUgaXMg +cmVxdWlyZWQuCgogIEBpdGVtIGRpc2FibGUKICBAaXRlbXggZW5hYmxlCiAgQG9w +aW5kZXgga2V5ZWRpdDpkaXNhYmxlCiAgQG9waW5kZXgga2V5ZWRpdDplbmFibGUK +ICBEaXNhYmxlIG9yIGVuYWJsZSBhbiBlbnRpcmUga2V5LiBBIGRpc2FibGVkIGtl +eSBjYW4gbm90IG5vcm1hbGx5IGJlCiAgdXNlZCBmb3IgZW5jcnlwdGlvbi4KCiAg +QGl0ZW0gYWRkcmV2b2tlcgogIEBvcGluZGV4IGtleWVkaXQ6YWRkcmV2b2tlcgog +IEFkZCBhIGRlc2lnbmF0ZWQgcmV2b2tlciB0byB0aGUga2V5LiBUaGlzIHRha2Vz +IG9uZSBvcHRpb25hbCBhcmd1bWVudDoKICAic2Vuc2l0aXZlIi4gSWYgYSBkZXNp +Z25hdGVkIHJldm9rZXIgaXMgbWFya2VkIGFzIHNlbnNpdGl2ZSwgaXQgd2lsbAog +IG5vdCBiZSBleHBvcnRlZCBieSBkZWZhdWx0IChzZWUgZXhwb3J0LW9wdGlvbnMp +LgoKICBAaXRlbSBwYXNzd2QKICBAb3BpbmRleCBrZXllZGl0OnBhc3N3ZAogIENo +YW5nZSB0aGUgcGFzc3BocmFzZSBvZiB0aGUgc2VjcmV0IGtleS4KCiAgQGl0ZW0g +dG9nZ2xlCiAgQG9waW5kZXgga2V5ZWRpdDp0b2dnbGUKICBUaGlzIGlzIGR1bW15 +IGNvbW1hbmQgd2hpY2ggZXhpc3RzIG9ubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGli +aWxpdHkuCgogIEBpdGVtIGNsZWFuCiAgQG9waW5kZXgga2V5ZWRpdDpjbGVhbgog +IENvbXBhY3QgKGJ5IHJlbW92aW5nIGFsbCBzaWduYXR1cmVzIGV4Y2VwdCB0aGUg +c2VsZnNpZykgYW55IHVzZXIgSUQKICB0aGF0IGlzIG5vIGxvbmdlciB1c2FibGUg +KGUuZy4gcmV2b2tlZCwgb3IgZXhwaXJlZCkuIFRoZW4sIHJlbW92ZSBhbnkKICBz +aWduYXR1cmVzIHRoYXQgYXJlIG5vdCB1c2FibGUgYnkgdGhlIHRydXN0IGNhbGN1 +bGF0aW9ucy4KICBTcGVjaWZpY2FsbHksIHRoaXMgcmVtb3ZlcyBhbnkgc2lnbmF0 +dXJlIHRoYXQgZG9lcyBub3QgdmFsaWRhdGUsIGFueQogIHNpZ25hdHVyZSB0aGF0 +IGlzIHN1cGVyc2VkZWQgYnkgYSBsYXRlciBzaWduYXR1cmUsIHJldm9rZWQgc2ln +bmF0dXJlcywKICBhbmQgc2lnbmF0dXJlcyBpc3N1ZWQgYnkga2V5cyB0aGF0IGFy +ZSBub3QgcHJlc2VudCBvbiB0aGUga2V5cmluZy4KCiAgQGl0ZW0gbWluaW1pemUK +ICBAb3BpbmRleCBrZXllZGl0Om1pbmltaXplCiAgTWFrZSB0aGUga2V5IGFzIHNt +YWxsIGFzIHBvc3NpYmxlLiBUaGlzIHJlbW92ZXMgYWxsIHNpZ25hdHVyZXMgZnJv +bQogIGVhY2ggdXNlciBJRCBleGNlcHQgZm9yIHRoZSBtb3N0IHJlY2VudCBzZWxm +LXNpZ25hdHVyZS4KCiAgQGl0ZW0gY3Jvc3MtY2VydGlmeQogIEBvcGluZGV4IGtl +eWVkaXQ6Y3Jvc3MtY2VydGlmeQogIEFkZCBjcm9zcy1jZXJ0aWZpY2F0aW9uIHNp +Z25hdHVyZXMgdG8gc2lnbmluZyBzdWJrZXlzIHRoYXQgbWF5IG5vdAogIGN1cnJl +bnRseSBoYXZlIHRoZW0uIENyb3NzLWNlcnRpZmljYXRpb24gc2lnbmF0dXJlcyBw +cm90ZWN0IGFnYWluc3QgYQogIHN1YnRsZSBhdHRhY2sgYWdhaW5zdCBzaWduaW5n +IHN1YmtleXMuIFNlZQogIEBvcHRpb257LS1yZXF1aXJlLWNyb3NzLWNlcnRpZmlj +YXRpb259LiAgQWxsIG5ldyBrZXlzIGdlbmVyYXRlZCBoYXZlCiAgdGhpcyBzaWdu +YXR1cmUgYnkgZGVmYXVsdCwgc28gdGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwg +dG8gYnJpbmcKICBvbGRlciBrZXlzIHVwIHRvIGRhdGUuCgogIEBpdGVtIHNhdmUK +ICBAb3BpbmRleCBrZXllZGl0OnNhdmUKICBTYXZlIGFsbCBjaGFuZ2VzIHRvIHRo +ZSBrZXkgcmluZ3MgYW5kIHF1aXQuCgogIEBpdGVtIHF1aXQKICBAb3BpbmRleCBr +ZXllZGl0OnF1aXQKICBRdWl0IHRoZSBwcm9ncmFtIHdpdGhvdXQgdXBkYXRpbmcg +dGhlCiAga2V5IHJpbmdzLgpAZW5kIHRhYmxlCgpAYyBtYW46LlJTClRoZSBsaXN0 +aW5nIHNob3dzIHlvdSB0aGUga2V5IHdpdGggaXRzIHNlY29uZGFyeSBrZXlzIGFu +ZCBhbGwgdXNlcgppZHMuICBUaGUgcHJpbWFyeSB1c2VyIGlkIGlzIGluZGljYXRl +ZCBieSBhIGRvdCwgYW5kIHNlbGVjdGVkIGtleXMgb3IKdXNlciBpZHMgYXJlIGlu +ZGljYXRlZCBieSBhbiBhc3Rlcmlzay4gIFRoZSB0cnVzdAp2YWx1ZSBpcyBkaXNw +bGF5ZWQgd2l0aCB0aGUgcHJpbWFyeSBrZXk6IHRoZSBmaXJzdCBpcyB0aGUgYXNz +aWduZWQgb3duZXIKdHJ1c3QgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIGNhbGN1bGF0 +ZWQgdHJ1c3QgdmFsdWUuIExldHRlcnMgYXJlIHVzZWQgZm9yCnRoZSB2YWx1ZXM6 +CkBjIG1hbjouUkUKCkB0YWJsZSBAYXNpcwoKICBAaXRlbSAtCiAgTm8gb3duZXJ0 +cnVzdCBhc3NpZ25lZCAvIG5vdCB5ZXQgY2FsY3VsYXRlZC4KCiAgQGl0ZW0gZQog +IFRydXN0CiAgY2FsY3VsYXRpb24gaGFzIGZhaWxlZDsgcHJvYmFibHkgZHVlIHRv +IGFuIGV4cGlyZWQga2V5LgoKICBAaXRlbSBxCiAgTm90IGVub3VnaCBpbmZvcm1h +dGlvbiBmb3IgY2FsY3VsYXRpb24uCgogIEBpdGVtIG4KICBOZXZlciB0cnVzdCB0 +aGlzIGtleS4KCiAgQGl0ZW0gbQogIE1hcmdpbmFsbHkgdHJ1c3RlZC4KCiAgQGl0 +ZW0gZgogIEZ1bGx5IHRydXN0ZWQuCgogIEBpdGVtIHUKICBVbHRpbWF0ZWx5IHRy +dXN0ZWQuCgpAZW5kIHRhYmxlCkBjICoqKioqKioqIEVuZCBFZGl0LWtleSBPcHRp +b25zICoqKioqKioqKioKCkBpdGVtIC0tc2lnbi1rZXkgQGNvZGV7bmFtZX0KQG9w +aW5kZXggc2lnbi1rZXkKU2lnbnMgYSBwdWJsaWMga2V5IHdpdGggeW91ciBzZWNy +ZXQga2V5LiBUaGlzIGlzIGEgc2hvcnRjdXQgdmVyc2lvbiBvZgp0aGUgc3ViY29t +bWFuZCAic2lnbiIgZnJvbSBAb3B0aW9uey0tZWRpdH0uCgpAaXRlbSAtLWxzaWdu +LWtleSBAY29kZXtuYW1lfQpAb3BpbmRleCBsc2lnbi1rZXkKU2lnbnMgYSBwdWJs +aWMga2V5IHdpdGggeW91ciBzZWNyZXQga2V5IGJ1dCBtYXJrcyBpdCBhcwpub24t +ZXhwb3J0YWJsZS4gVGhpcyBpcyBhIHNob3J0Y3V0IHZlcnNpb24gb2YgdGhlIHN1 +YmNvbW1hbmQgImxzaWduIgpmcm9tIEBvcHRpb257LS1lZGl0LWtleX0uCgpAaXRl +bSAtLXF1aWNrLXNpZ24ta2V5IEBjb2Rle2Zwcn0gW0Bjb2Rle25hbWVzfV0KQGl0 +ZW14IC0tcXVpY2stbHNpZ24ta2V5IEBjb2Rle2Zwcn0gW0Bjb2Rle25hbWVzfV0K +QG9waW5kZXggcXVpY2stc2lnbi1rZXkKQG9waW5kZXggcXVpY2stbHNpZ24ta2V5 +CkRpcmVjdGx5IHNpZ24gYSBrZXkgZnJvbSB0aGUgcGFzc3BocmFzZSB3aXRob3V0 +IGFueSBmdXJ0aGVyIHVzZXIKaW50ZXJhY3Rpb24uICBUaGUgQGNvZGV7ZnByfSBt +dXN0IGJlIHRoZSB2ZXJpZmllZCBwcmltYXJ5IGZpbmdlcnByaW50Cm9mIGEga2V5 +IGluIHRoZSBsb2NhbCBrZXlyaW5nLiBJZiBubyBAY29kZXtuYW1lc30gYXJlIGdp +dmVuLCBhbGwKdXNlZnVsIHVzZXIgaWRzIGFyZSBzaWduZWQ7IHdpdGggZ2l2ZW4g +W0Bjb2Rle25hbWVzfV0gb25seSB1c2VmdWwgdXNlcgppZHMgbWF0Y2hpbmcgb25l +IG9mIHRoZXNlcyBuYW1lcyBhcmUgc2lnbmVkLiAgVGhlIGNvbW1hbmQKQG9wdGlv +bnstLXF1aWNrLWxzaWduLWtleX0gbWFya3MgdGhlIHNpZ25hdHVyZXMgYXMgbm9u +LWV4cG9ydGFibGUuICBJZgpzdWNoIGEgbm9uLWV4cG9ydGFibGUgc2lnbmF0dXJl +IGFscmVhZHkgZXhpc3RzIHRoZQpAb3B0aW9uey0tcXVpY2stc2lnbi1rZXl9IHR1 +cm5zIGl0IGludG8gYSBleHBvcnRhYmxlIHNpZ25hdHVyZS4KClRoaXMgY29tbWFu +ZCB1c2VzIHJlYXNvbmFibGUgZGVmYXVsdHMgYW5kIHRodXMgZG9lcyBub3QgcHJv +dmlkZSB0aGUKZnVsbCBmbGV4aWJpbGl0eSBvZiB0aGUgInNpZ24iIHN1YmNvbW1h +bmQgZnJvbSBAb3B0aW9uey0tZWRpdC1rZXl9LgpJdHMgaW50ZW5kZWQgdXNlIGlz +IHRvIGhlbHAgdW5hdHRlbmRlZCBrZXkgc2lnbmluZyBieSB1dGlsaXppbmcgYSBs +aXN0Cm9mIHZlcmlmaWVkIGZpbmdlcnByaW50cy4KCkBpdGVtIC0tcXVpY2stYWRk +dWlkICBAdmFye3VzZXItaWR9IEB2YXJ7bmV3LXVzZXItaWR9CkBvcGluZGV4IHF1 +aWNrLWFkZHVpZApUaGlzIGNvbW1hbmQgYWRkcyBhIG5ldyB1c2VyIGlkIHRvIGFu +IGV4aXN0aW5nIGtleS4gIEluIGNvbnRyYXN0IHRvCnRoZSBpbnRlcmFjdGl2ZSBz +dWItY29tbWFuZCBAY29kZXthZGR1aWR9IG9mIEBvcHRpb257LS1lZGl0LWtleX0g +dGhlCkB2YXJ7bmV3LXVzZXItaWR9IGlzIGFkZGVkIHZlcmJhdGltIHdpdGggb25s +eSBsZWFkaW5nIGFuZCB0cmFpbGluZwp3aGl0ZSBzcGFjZSByZW1vdmVkLCBpdCBp +cyBleHBlY3RlZCB0byBiZSBVVEYtOCBlbmNvZGVkLCBhbmQgbm8gY2hlY2tzCm9u +IGl0cyBmb3JtIGFyZSBhcHBsaWVkLgoKQGl0ZW0gLS1wYXNzd2QgQHZhcnt1c2Vy +X2lkfQpAb3BpbmRleCBwYXNzd2QKQ2hhbmdlIHRoZSBwYXNzcGhyYXNlIG9mIHRo +ZSBzZWNyZXQga2V5IGJlbG9uZ2luZyB0byB0aGUgY2VydGlmaWNhdGUKc3BlY2lm +aWVkIGFzIEB2YXJ7dXNlcl9pZH0uICBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIHRo +ZSBzdWItY29tbWFuZApAY29kZXtwYXNzd2R9IG9mIHRoZSBlZGl0IGtleSBtZW51 +LgoKQGVuZCB0YWJsZQoKCkBjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioKQGMgKioqKioqKioqKioqKioqICAgICAgICAgICAgKioq +KioqKioqKioqKioqKgpAYyAqKioqKioqKioqKioqKiogIE9QVElPTlMgICAqKioq +KioqKioqKioqKioqCkBjICoqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioq +KioqKioqKioqKioKQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKgpAbWFuc2VjdCBvcHRpb25zCkBub2RlIEdQRyBPcHRpb25zCkBz +ZWN0aW9uIE9wdGlvbiBTdW1tYXJ5CgpAY29tbWFuZHtAZ3BnbmFtZX0gZmVhdHVy +ZXMgYSBidW5jaCBvZiBvcHRpb25zIHRvIGNvbnRyb2wgdGhlIGV4YWN0CmJlaGF2 +aW91ciBhbmQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCgpA +bWVudQoqIEdQRyBDb25maWd1cmF0aW9uIE9wdGlvbnM6OiAgIEhvdyB0byBjaGFu +Z2UgdGhlIGNvbmZpZ3VyYXRpb24uCiogR1BHIEtleSByZWxhdGVkIE9wdGlvbnM6 +OiAgICAgS2V5IHJlbGF0ZWQgb3B0aW9ucy4KKiBHUEcgSW5wdXQgYW5kIE91dHB1 +dDo6ICAgICAgICBJbnB1dCBhbmQgT3V0cHV0LgoqIE9wZW5QR1AgT3B0aW9uczo6 +ICAgICAgICAgICAgIE9wZW5QR1AgcHJvdG9jb2wgc3BlY2lmaWMgb3B0aW9ucy4K +KiBDb21wbGlhbmNlIE9wdGlvbnM6OiAgICAgICAgICBDb21wbGlhbmNlIG9wdGlv +bnMuCiogR1BHIEVzb3RlcmljIE9wdGlvbnM6OiAgICAgICAgRG9pbmcgdGhpbmdz +IG9uZSB1c3VhbGx5IGRvbid0IHdhbnQgdG8gZG8uCiogRGVwcmVjYXRlZCBPcHRp +b25zOjogICAgICAgICAgRGVwcmVjYXRlZCBvcHRpb25zLgpAZW5kIG1lbnUKCkxv +bmcgb3B0aW9ucyBjYW4gYmUgcHV0IGluIGFuIG9wdGlvbnMgZmlsZSAoZGVmYXVs +dAoifi8uZ251cGcvZ3BnLmNvbmYiKS4gU2hvcnQgb3B0aW9uIG5hbWVzIHdpbGwg +bm90IHdvcmsgLSBmb3IgZXhhbXBsZSwKImFybW9yIiBpcyBhIHZhbGlkIG9wdGlv +biBmb3IgdGhlIG9wdGlvbnMgZmlsZSwgd2hpbGUgImEiIGlzIG5vdC4gRG8gbm90 +CndyaXRlIHRoZSAyIGRhc2hlcywgYnV0IHNpbXBseSB0aGUgbmFtZSBvZiB0aGUg +b3B0aW9uIGFuZCBhbnkgcmVxdWlyZWQKYXJndW1lbnRzLiBMaW5lcyB3aXRoIGEg +aGFzaCAoJyMnKSBhcyB0aGUgZmlyc3Qgbm9uLXdoaXRlLXNwYWNlCmNoYXJhY3Rl +ciBhcmUgaWdub3JlZC4gQ29tbWFuZHMgbWF5IGJlIHB1dCBpbiB0aGlzIGZpbGUg +dG9vLCBidXQgdGhhdCBpcwpub3QgZ2VuZXJhbGx5IHVzZWZ1bCBhcyB0aGUgY29t +bWFuZCB3aWxsIGV4ZWN1dGUgYXV0b21hdGljYWxseSB3aXRoCmV2ZXJ5IGV4ZWN1 +dGlvbiBvZiBncGcuCgpQbGVhc2UgcmVtZW1iZXIgdGhhdCBvcHRpb24gcGFyc2lu +ZyBzdG9wcyBhcyBzb29uIGFzIGEgbm9uLW9wdGlvbiBpcwplbmNvdW50ZXJlZCwg +eW91IGNhbiBleHBsaWNpdGx5IHN0b3AgcGFyc2luZyBieSB1c2luZyB0aGUgc3Bl +Y2lhbCBvcHRpb24KQG9wdGlvbnstLX0uCgpAYyAqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioqKioqKioqKioqCkBjICoqKioqKioqICBDT05GSUdVUkFU +SU9OIE9QVElPTlMgICoqKioqKioqKioKQGMgKioqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioqKioqKioqKgpAbm9kZSBHUEcgQ29uZmlndXJhdGlvbiBP +cHRpb25zCkBzdWJzZWN0aW9uIEhvdyB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRp +b24KClRoZXNlIG9wdGlvbnMgYXJlIHVzZWQgdG8gY2hhbmdlIHRoZSBjb25maWd1 +cmF0aW9uIGFuZCBhcmUgdXN1YWxseSBmb3VuZAppbiB0aGUgb3B0aW9uIGZpbGUu +CgpAdGFibGUgQGdudXBndGFib3B0CgpAaXRlbSAtLWRlZmF1bHQta2V5IEB2YXJ7 +bmFtZX0KQG9waW5kZXggZGVmYXVsdC1rZXkKVXNlIEB2YXJ7bmFtZX0gYXMgdGhl +IGRlZmF1bHQga2V5IHRvIHNpZ24gd2l0aC4gSWYgdGhpcyBvcHRpb24gaXMgbm90 +CnVzZWQsIHRoZSBkZWZhdWx0IGtleSBpcyB0aGUgZmlyc3Qga2V5IGZvdW5kIGlu +IHRoZSBzZWNyZXQga2V5cmluZy4KTm90ZSB0aGF0IEBvcHRpb257LXV9IG9yIEBv +cHRpb257LS1sb2NhbC11c2VyfSBvdmVycmlkZXMgdGhpcyBvcHRpb24uClRoaXMg +b3B0aW9uIG1heSBiZSBnaXZlbiBtdWx0aXBsZSB0aW1lcy4gIEluIHRoaXMgY2Fz +ZSwgdGhlIGxhc3Qga2V5CmZvciB3aGljaCBhIHNlY3JldCBrZXkgaXMgYXZhaWxh +YmxlIGlzIHVzZWQuICBJZiB0aGVyZSBpcyBubyBzZWNyZXQKa2V5IGF2YWlsYWJs +ZSBmb3IgYW55IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLCBHbnVQRyB3aWxsIG5v +dCBlbWl0IGFuCmVycm9yIG1lc3NhZ2UgYnV0IGNvbnRpbnVlIGFzIGlmIHRoaXMg +b3B0aW9uIHdhc24ndCBnaXZlbi4KCkBpdGVtIC0tZGVmYXVsdC1yZWNpcGllbnQg +QHZhcntuYW1lfQpAb3BpbmRleCBkZWZhdWx0LXJlY2lwaWVudApVc2UgQHZhcntu +YW1lfSBhcyBkZWZhdWx0IHJlY2lwaWVudCBpZiBvcHRpb24gQG9wdGlvbnstLXJl +Y2lwaWVudH0gaXMKbm90IHVzZWQgYW5kIGRvbid0IGFzayBpZiB0aGlzIGlzIGEg +dmFsaWQgb25lLiBAdmFye25hbWV9IG11c3QgYmUKbm9uLWVtcHR5LgoKQGl0ZW0g +LS1kZWZhdWx0LXJlY2lwaWVudC1zZWxmCkBvcGluZGV4IGRlZmF1bHQtcmVjaXBp +ZW50LXNlbGYKVXNlIHRoZSBkZWZhdWx0IGtleSBhcyBkZWZhdWx0IHJlY2lwaWVu +dCBpZiBvcHRpb24gQG9wdGlvbnstLXJlY2lwaWVudH0gaXMgbm90CnVzZWQgYW5k +IGRvbid0IGFzayBpZiB0aGlzIGlzIGEgdmFsaWQgb25lLiBUaGUgZGVmYXVsdCBr +ZXkgaXMgdGhlIGZpcnN0Cm9uZSBmcm9tIHRoZSBzZWNyZXQga2V5cmluZyBvciB0 +aGUgb25lIHNldCB3aXRoIEBvcHRpb257LS1kZWZhdWx0LWtleX0uCgpAaXRlbSAt +LW5vLWRlZmF1bHQtcmVjaXBpZW50CkBvcGluZGV4IG5vLWRlZmF1bHQtcmVjaXBp +ZW50ClJlc2V0IEBvcHRpb257LS1kZWZhdWx0LXJlY2lwaWVudH0gYW5kIEBvcHRp +b257LS1kZWZhdWx0LXJlY2lwaWVudC1zZWxmfS4KCkBpdGVtIC12LCAtLXZlcmJv +c2UKQG9waW5kZXggdmVyYm9zZQpHaXZlIG1vcmUgaW5mb3JtYXRpb24gZHVyaW5n +IHByb2Nlc3NpbmcuIElmIHVzZWQKdHdpY2UsIHRoZSBpbnB1dCBkYXRhIGlzIGxp +c3RlZCBpbiBkZXRhaWwuCgpAaXRlbSAtLW5vLXZlcmJvc2UKQG9waW5kZXggbm8t +dmVyYm9zZQpSZXNldCB2ZXJib3NlIGxldmVsIHRvIDAuCgpAaXRlbSAtcSwgLS1x +dWlldApAb3BpbmRleCBxdWlldApUcnkgdG8gYmUgYXMgcXVpZXQgYXMgcG9zc2li +bGUuCgpAaXRlbSAtLWJhdGNoCkBpdGVteCAtLW5vLWJhdGNoCkBvcGluZGV4IGJh +dGNoCkBvcGluZGV4IG5vLWJhdGNoClVzZSBiYXRjaCBtb2RlLiAgTmV2ZXIgYXNr +LCBkbyBub3QgYWxsb3cgaW50ZXJhY3RpdmUgY29tbWFuZHMuCkBvcHRpb257LS1u +by1iYXRjaH0gZGlzYWJsZXMgdGhpcyBvcHRpb24uICBOb3RlIHRoYXQgZXZlbiB3 +aXRoIGEKZmlsZW5hbWUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSwgZ3BnIG1p +Z2h0IHN0aWxsIG5lZWQgdG8gcmVhZCBmcm9tClNURElOIChpbiBwYXJ0aWN1bGFy +IGlmIGdwZyBmaWd1cmVzIHRoYXQgdGhlIGlucHV0IGlzIGEKZGV0YWNoZWQgc2ln +bmF0dXJlIGFuZCBubyBkYXRhIGZpbGUgaGFzIGJlZW4gc3BlY2lmaWVkKS4gIFRo +dXMgaWYgeW91CmRvIG5vdCB3YW50IHRvIGZlZWQgZGF0YSB2aWEgU1RESU4sIHlv +dSBzaG91bGQgY29ubmVjdCBTVERJTiB0bwpAZmlsZXsvZGV2L251bGx9LgoKQGl0 +ZW0gLS1uby10dHkKQG9waW5kZXggbm8tdHR5Ck1ha2Ugc3VyZSB0aGF0IHRoZSBU +VFkgKHRlcm1pbmFsKSBpcyBuZXZlciB1c2VkIGZvciBhbnkgb3V0cHV0LgpUaGlz +IG9wdGlvbiBpcyBuZWVkZWQgaW4gc29tZSBjYXNlcyBiZWNhdXNlIEdudVBHIHNv +bWV0aW1lcyBwcmludHMKd2FybmluZ3MgdG8gdGhlIFRUWSBldmVuIGlmIEBvcHRp +b257LS1iYXRjaH0gaXMgdXNlZC4KCkBpdGVtIC0teWVzCkBvcGluZGV4IHllcwpB +c3N1bWUgInllcyIgb24gbW9zdCBxdWVzdGlvbnMuCgpAaXRlbSAtLW5vCkBvcGlu +ZGV4IG5vCkFzc3VtZSAibm8iIG9uIG1vc3QgcXVlc3Rpb25zLgoKCkBpdGVtIC0t +bGlzdC1vcHRpb25zIEBjb2Rle3BhcmFtZXRlcnN9CkBvcGluZGV4IGxpc3Qtb3B0 +aW9ucwpUaGlzIGlzIGEgc3BhY2Ugb3IgY29tbWEgZGVsaW1pdGVkIHN0cmluZyB0 +aGF0IGdpdmVzIG9wdGlvbnMgdXNlZCB3aGVuCmxpc3Rpbmcga2V5cyBhbmQgc2ln +bmF0dXJlcyAodGhhdCBpcywgQG9wdGlvbnstLWxpc3Qta2V5c30sCkBvcHRpb257 +LS1saXN0LXNpZ3N9LCBAb3B0aW9uey0tbGlzdC1wdWJsaWMta2V5c30sCkBvcHRp +b257LS1saXN0LXNlY3JldC1rZXlzfSwgYW5kIHRoZSBAb3B0aW9uey0tZWRpdC1r +ZXl9IGZ1bmN0aW9ucykuCk9wdGlvbnMgY2FuIGJlIHByZXBlbmRlZCB3aXRoIGEg +QG9wdGlvbntuby19IChhZnRlciB0aGUgdHdvIGRhc2hlcykgdG8KZ2l2ZSB0aGUg +b3Bwb3NpdGUgbWVhbmluZy4gIFRoZSBvcHRpb25zIGFyZToKCkB0YWJsZSBAYXNp +cwoKICBAaXRlbSBzaG93LXBob3RvcwogIEBvcGluZGV4IGxpc3Qtb3B0aW9uczpz +aG93LXBob3RvcwogIENhdXNlcyBAb3B0aW9uey0tbGlzdC1rZXlzfSwgQG9wdGlv +bnstLWxpc3Qtc2lnc30sCiAgQG9wdGlvbnstLWxpc3QtcHVibGljLWtleXN9LCBh +bmQgQG9wdGlvbnstLWxpc3Qtc2VjcmV0LWtleXN9IHRvCiAgZGlzcGxheSBhbnkg +cGhvdG8gSURzIGF0dGFjaGVkIHRvIHRoZSBrZXkuICBEZWZhdWx0cyB0byBuby4g +U2VlIGFsc28KICBAb3B0aW9uey0tcGhvdG8tdmlld2VyfS4gIERvZXMgbm90IHdv +cmsgd2l0aCBAb3B0aW9uey0td2l0aC1jb2xvbnN9OgogIHNlZSBAb3B0aW9uey0t +YXR0cmlidXRlLWZkfSBmb3IgdGhlIGFwcHJvcHJpYXRlIHdheSB0byBnZXQgcGhv +dG8gZGF0YQogIGZvciBzY3JpcHRzIGFuZCBvdGhlciBmcm9udGVuZHMuCgogIEBp +dGVtIHNob3ctdXNhZ2UKICBAb3BpbmRleCBsaXN0LW9wdGlvbnM6c2hvdy11c2Fn +ZQogIFNob3cgdXNhZ2UgaW5mb3JtYXRpb24gZm9yIGtleXMgYW5kIHN1YmtleXMg +aW4gdGhlIHN0YW5kYXJkIGtleQogIGxpc3RpbmcuICBUaGlzIGlzIGEgbGlzdCBv +ZiBsZXR0ZXJzIGluZGljYXRpbmcgdGhlIGFsbG93ZWQgdXNhZ2UgZm9yIGEKICBr +ZXkgKEBjb2Rle0V9PWVuY3J5cHRpb24sIEBjb2Rle1N9PXNpZ25pbmcsIEBjb2Rl +e0N9PWNlcnRpZmljYXRpb24sCiAgQGNvZGV7QX09YXV0aGVudGljYXRpb24pLiAg +RGVmYXVsdHMgdG8gbm8uCgogIEBpdGVtIHNob3ctcG9saWN5LXVybHMKICBAb3Bp +bmRleCBsaXN0LW9wdGlvbnM6c2hvdy1wb2xpY3ktdXJscwogIFNob3cgcG9saWN5 +IFVSTHMgaW4gdGhlIEBvcHRpb257LS1saXN0LXNpZ3N9IG9yIEBvcHRpb257LS1j +aGVjay1zaWdzfQogIGxpc3RpbmdzLiAgRGVmYXVsdHMgdG8gbm8uCgogIEBpdGVt +IHNob3ctbm90YXRpb25zCiAgQGl0ZW14IHNob3ctc3RkLW5vdGF0aW9ucwogIEBp +dGVteCBzaG93LXVzZXItbm90YXRpb25zCiAgQG9waW5kZXggbGlzdC1vcHRpb25z +OnNob3ctbm90YXRpb25zCiAgQG9waW5kZXggbGlzdC1vcHRpb25zOnNob3ctc3Rk +LW5vdGF0aW9ucwogIEBvcGluZGV4IGxpc3Qtb3B0aW9uczpzaG93LXVzZXItbm90 +YXRpb25zCiAgU2hvdyBhbGwsIElFVEYgc3RhbmRhcmQsIG9yIHVzZXItZGVmaW5l +ZCBzaWduYXR1cmUgbm90YXRpb25zIGluIHRoZQogIEBvcHRpb257LS1saXN0LXNp +Z3N9IG9yIEBvcHRpb257LS1jaGVjay1zaWdzfSBsaXN0aW5ncy4gRGVmYXVsdHMg +dG8gbm8uCgogIEBpdGVtIHNob3cta2V5c2VydmVyLXVybHMKICBAb3BpbmRleCBs +aXN0LW9wdGlvbnM6c2hvdy1rZXlzZXJ2ZXItdXJscwogIFNob3cgYW55IHByZWZl +cnJlZCBrZXlzZXJ2ZXIgVVJMIGluIHRoZSBAb3B0aW9uey0tbGlzdC1zaWdzfSBv +cgogIEBvcHRpb257LS1jaGVjay1zaWdzfSBsaXN0aW5ncy4gRGVmYXVsdHMgdG8g +bm8uCgogIEBpdGVtIHNob3ctdWlkLXZhbGlkaXR5CiAgQG9waW5kZXggbGlzdC1v +cHRpb25zOnNob3ctdWlkLXZhbGlkaXR5CiAgRGlzcGxheSB0aGUgY2FsY3VsYXRl +ZCB2YWxpZGl0eSBvZiB1c2VyIElEcyBkdXJpbmcga2V5IGxpc3RpbmdzLgogIERl +ZmF1bHRzIHRvIHllcy4KCiAgQGl0ZW0gc2hvdy11bnVzYWJsZS11aWRzCiAgQG9w +aW5kZXggbGlzdC1vcHRpb25zOnNob3ctdW51c2FibGUtdWlkcwogIFNob3cgcmV2 +b2tlZCBhbmQgZXhwaXJlZCB1c2VyIElEcyBpbiBrZXkgbGlzdGluZ3MuIERlZmF1 +bHRzIHRvIG5vLgoKICBAaXRlbSBzaG93LXVudXNhYmxlLXN1YmtleXMKICBAb3Bp +bmRleCBsaXN0LW9wdGlvbnM6c2hvdy11bnVzYWJsZS1zdWJrZXlzCiAgU2hvdyBy +ZXZva2VkIGFuZCBleHBpcmVkIHN1YmtleXMgaW4ga2V5IGxpc3RpbmdzLiBEZWZh +dWx0cyB0byBuby4KCiAgQGl0ZW0gc2hvdy1rZXlyaW5nCiAgQG9waW5kZXggbGlz +dC1vcHRpb25zOnNob3cta2V5cmluZwogIERpc3BsYXkgdGhlIGtleXJpbmcgbmFt +ZSBhdCB0aGUgaGVhZCBvZiBrZXkgbGlzdGluZ3MgdG8gc2hvdyB3aGljaAogIGtl +eXJpbmcgYSBnaXZlbiBrZXkgcmVzaWRlcyBvbi4gRGVmYXVsdHMgdG8gbm8uCgog +IEBpdGVtIHNob3ctc2lnLWV4cGlyZQogIEBvcGluZGV4IGxpc3Qtb3B0aW9uczpz +aG93LXNpZy1leHBpcmUKICBTaG93IHNpZ25hdHVyZSBleHBpcmF0aW9uIGRhdGVz +IChpZiBhbnkpIGR1cmluZyBAb3B0aW9uey0tbGlzdC1zaWdzfSBvcgogIEBvcHRp +b257LS1jaGVjay1zaWdzfSBsaXN0aW5ncy4gRGVmYXVsdHMgdG8gbm8uCgogIEBp +dGVtIHNob3ctc2lnLXN1YnBhY2tldHMKICBAb3BpbmRleCBsaXN0LW9wdGlvbnM6 +c2hvdy1zaWctc3VicGFja2V0cwogIEluY2x1ZGUgc2lnbmF0dXJlIHN1YnBhY2tl +dHMgaW4gdGhlIGtleSBsaXN0aW5nLiBUaGlzIG9wdGlvbiBjYW4gdGFrZSBhbgog +IG9wdGlvbmFsIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIHN1YnBhY2tldHMgdG8gbGlz +dC4gSWYgbm8gYXJndW1lbnQgaXMKICBwYXNzZWQsIGxpc3QgYWxsIHN1YnBhY2tl +dHMuIERlZmF1bHRzIHRvIG5vLiBUaGlzIG9wdGlvbiBpcyBvbmx5CiAgbWVhbmlu +Z2Z1bCB3aGVuIHVzaW5nIEBvcHRpb257LS13aXRoLWNvbG9uc30gYWxvbmcgd2l0 +aAogIEBvcHRpb257LS1saXN0LXNpZ3N9IG9yIEBvcHRpb257LS1jaGVjay1zaWdz +fS4KCkBlbmQgdGFibGUKCkBpdGVtIC0tdmVyaWZ5LW9wdGlvbnMgQGNvZGV7cGFy +YW1ldGVyc30KQG9waW5kZXggdmVyaWZ5LW9wdGlvbnMKVGhpcyBpcyBhIHNwYWNl +IG9yIGNvbW1hIGRlbGltaXRlZCBzdHJpbmcgdGhhdCBnaXZlcyBvcHRpb25zIHVz +ZWQgd2hlbgp2ZXJpZnlpbmcgc2lnbmF0dXJlcy4gT3B0aW9ucyBjYW4gYmUgcHJl +cGVuZGVkIHdpdGggYSBgbm8tJyB0byBnaXZlCnRoZSBvcHBvc2l0ZSBtZWFuaW5n +LiBUaGUgb3B0aW9ucyBhcmU6CgpAdGFibGUgQGFzaXMKCiAgQGl0ZW0gc2hvdy1w +aG90b3MKICBAb3BpbmRleCB2ZXJpZnktb3B0aW9uczpzaG93LXBob3RvcwogIERp +c3BsYXkgYW55IHBob3RvIElEcyBwcmVzZW50IG9uIHRoZSBrZXkgdGhhdCBpc3N1 +ZWQgdGhlIHNpZ25hdHVyZS4KICBEZWZhdWx0cyB0byBuby4gU2VlIGFsc28gQG9w +dGlvbnstLXBob3RvLXZpZXdlcn0uCgogIEBpdGVtIHNob3ctcG9saWN5LXVybHMK +ICBAb3BpbmRleCB2ZXJpZnktb3B0aW9uczpzaG93LXBvbGljeS11cmxzCiAgU2hv +dyBwb2xpY3kgVVJMcyBpbiB0aGUgc2lnbmF0dXJlIGJlaW5nIHZlcmlmaWVkLiBE +ZWZhdWx0cyB0byB5ZXMuCgogIEBpdGVtIHNob3ctbm90YXRpb25zCiAgQGl0ZW14 +IHNob3ctc3RkLW5vdGF0aW9ucwogIEBpdGVteCBzaG93LXVzZXItbm90YXRpb25z +CiAgQG9waW5kZXggdmVyaWZ5LW9wdGlvbnM6c2hvdy1ub3RhdGlvbnMKICBAb3Bp +bmRleCB2ZXJpZnktb3B0aW9uczpzaG93LXN0ZC1ub3RhdGlvbnMKICBAb3BpbmRl +eCB2ZXJpZnktb3B0aW9uczpzaG93LXVzZXItbm90YXRpb25zCiAgU2hvdyBhbGws +IElFVEYgc3RhbmRhcmQsIG9yIHVzZXItZGVmaW5lZCBzaWduYXR1cmUgbm90YXRp +b25zIGluIHRoZQogIHNpZ25hdHVyZSBiZWluZyB2ZXJpZmllZC4gRGVmYXVsdHMg +dG8gSUVURiBzdGFuZGFyZC4KCiAgQGl0ZW0gc2hvdy1rZXlzZXJ2ZXItdXJscwog +IEBvcGluZGV4IHZlcmlmeS1vcHRpb25zOnNob3cta2V5c2VydmVyLXVybHMKICBT +aG93IGFueSBwcmVmZXJyZWQga2V5c2VydmVyIFVSTCBpbiB0aGUgc2lnbmF0dXJl +IGJlaW5nIHZlcmlmaWVkLgogIERlZmF1bHRzIHRvIHllcy4KCiAgQGl0ZW0gc2hv +dy11aWQtdmFsaWRpdHkKICBAb3BpbmRleCB2ZXJpZnktb3B0aW9uczpzaG93LXVp +ZC12YWxpZGl0eQogIERpc3BsYXkgdGhlIGNhbGN1bGF0ZWQgdmFsaWRpdHkgb2Yg +dGhlIHVzZXIgSURzIG9uIHRoZSBrZXkgdGhhdCBpc3N1ZWQKICB0aGUgc2lnbmF0 +dXJlLiBEZWZhdWx0cyB0byB5ZXMuCgogIEBpdGVtIHNob3ctdW51c2FibGUtdWlk +cwogIEBvcGluZGV4IHZlcmlmeS1vcHRpb25zOnNob3ctdW51c2FibGUtdWlkcwog +IFNob3cgcmV2b2tlZCBhbmQgZXhwaXJlZCB1c2VyIElEcyBkdXJpbmcgc2lnbmF0 +dXJlIHZlcmlmaWNhdGlvbi4KICBEZWZhdWx0cyB0byBuby4KCiAgQGl0ZW0gc2hv +dy1wcmltYXJ5LXVpZC1vbmx5CiAgQG9waW5kZXggdmVyaWZ5LW9wdGlvbnM6c2hv +dy1wcmltYXJ5LXVpZC1vbmx5CiAgU2hvdyBvbmx5IHRoZSBwcmltYXJ5IHVzZXIg +SUQgZHVyaW5nIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24uICBUaGF0IGlzCiAgYWxs +IHRoZSBBS0EgbGluZXMgYXMgd2VsbCBhcyBwaG90byBJZHMgYXJlIG5vdCBzaG93 +biB3aXRoIHRoZSBzaWduYXR1cmUKICB2ZXJpZmljYXRpb24gc3RhdHVzLgoKICBA +aXRlbSBwa2EtbG9va3VwcwogIEBvcGluZGV4IHZlcmlmeS1vcHRpb25zOnBrYS1s +b29rdXBzCiAgRW5hYmxlIFBLQSBsb29rdXBzIHRvIHZlcmlmeSBzZW5kZXIgYWRk +cmVzc2VzLiBOb3RlIHRoYXQgUEtBIGlzIGJhc2VkCiAgb24gRE5TLCBhbmQgc28g +ZW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGRpc2Nsb3NlIGluZm9ybWF0aW9uIG9u +IHdoZW4KICBhbmQgd2hhdCBzaWduYXR1cmVzIGFyZSB2ZXJpZmllZCBvciB0byB3 +aG9tIGRhdGEgaXMgZW5jcnlwdGVkLiBUaGlzCiAgaXMgc2ltaWxhciB0byB0aGUg +IndlYiBidWciIGRlc2NyaWJlZCBmb3IgdGhlIGF1dG8ta2V5LXJldHJpZXZlCiAg +ZmVhdHVyZS4KCiAgQGl0ZW0gcGthLXRydXN0LWluY3JlYXNlCiAgQG9waW5kZXgg +dmVyaWZ5LW9wdGlvbnM6cGthLXRydXN0LWluY3JlYXNlCiAgUmFpc2UgdGhlIHRy +dXN0IGluIGEgc2lnbmF0dXJlIHRvIGZ1bGwgaWYgdGhlIHNpZ25hdHVyZSBwYXNz +ZXMgUEtBCiAgdmFsaWRhdGlvbi4gVGhpcyBvcHRpb24gaXMgb25seSBtZWFuaW5n +ZnVsIGlmIHBrYS1sb29rdXBzIGlzIHNldC4KQGVuZCB0YWJsZQoKQGl0ZW0gLS1l +bmFibGUtbGFyZ2UtcnNhCkBpdGVteCAtLWRpc2FibGUtbGFyZ2UtcnNhCkBvcGlu +ZGV4IGVuYWJsZS1sYXJnZS1yc2EKQG9waW5kZXggZGlzYWJsZS1sYXJnZS1yc2EK +V2l0aCAtLWdlbi1rZXkgYW5kIC0tYmF0Y2gsIGVuYWJsZSB0aGUgY3JlYXRpb24g +b2YgbGFyZ2VyIFJTQSBzZWNyZXQKa2V5cyB0aGFuIGlzIGdlbmVyYWxseSByZWNv +bW1lbmRlZCAodXAgdG8gODE5MiBiaXRzKS4gIFRoZXNlIGxhcmdlCmtleXMgYXJl +IG1vcmUgZXhwZW5zaXZlIHRvIHVzZSwgYW5kIHRoZWlyIHNpZ25hdHVyZXMgYW5k +CmNlcnRpZmljYXRpb25zIGFyZSBhbHNvIGxhcmdlci4KCkBpdGVtIC0tZW5hYmxl +LWRzYTIKQGl0ZW14IC0tZGlzYWJsZS1kc2EyCkBvcGluZGV4IGVuYWJsZS1kc2Ey +CkBvcGluZGV4IGRpc2FibGUtZHNhMgpFbmFibGUgaGFzaCB0cnVuY2F0aW9uIGZv +ciBhbGwgRFNBIGtleXMgZXZlbiBmb3Igb2xkIERTQSBLZXlzIHVwIHRvCjEwMjQg +Yml0LiAgVGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IHdpdGggQG9wdGlvbnstLW9w +ZW5wZ3B9LiAgTm90ZQp0aGF0IG9sZGVyIHZlcnNpb25zIG9mIEdudVBHIGFsc28g +cmVxdWlyZWQgdGhpcyBmbGFnIHRvIGFsbG93IHRoZQpnZW5lcmF0aW9uIG9mIERT +QSBsYXJnZXIgdGhhbiAxMDI0IGJpdC4KCkBpdGVtIC0tcGhvdG8tdmlld2VyIEBj +b2Rle3N0cmluZ30KQG9waW5kZXggcGhvdG8tdmlld2VyClRoaXMgaXMgdGhlIGNv +bW1hbmQgbGluZSB0aGF0IHNob3VsZCBiZSBydW4gdG8gdmlldyBhIHBob3RvIElE +LiAiJWkiCndpbGwgYmUgZXhwYW5kZWQgdG8gYSBmaWxlbmFtZSBjb250YWluaW5n +IHRoZSBwaG90by4gIiVJIiBkb2VzIHRoZQpzYW1lLCBleGNlcHQgdGhlIGZpbGUg +d2lsbCBub3QgYmUgZGVsZXRlZCBvbmNlIHRoZSB2aWV3ZXIgZXhpdHMuCk90aGVy +IGZsYWdzIGFyZSAiJWsiIGZvciB0aGUga2V5IElELCAiJUsiIGZvciB0aGUgbG9u +ZyBrZXkgSUQsICIlZiIKZm9yIHRoZSBrZXkgZmluZ2VycHJpbnQsICIldCIgZm9y +IHRoZSBleHRlbnNpb24gb2YgdGhlIGltYWdlIHR5cGUKKGUuZy4gImpwZyIpLCAi +JVQiIGZvciB0aGUgTUlNRSB0eXBlIG9mIHRoZSBpbWFnZSAoZS5nLiAiaW1hZ2Uv +anBlZyIpLAoiJXYiIGZvciB0aGUgc2luZ2xlLWNoYXJhY3RlciBjYWxjdWxhdGVk +IHZhbGlkaXR5IG9mIHRoZSBpbWFnZSBiZWluZwp2aWV3ZWQgKGUuZy4gImYiKSwg +IiVWIiBmb3IgdGhlIGNhbGN1bGF0ZWQgdmFsaWRpdHkgYXMgYSBzdHJpbmcgKGUu +Zy4KImZ1bGwiKSwgIiVVIiBmb3IgYSBiYXNlMzIgZW5jb2RlZCBoYXNoIG9mIHRo +ZSB1c2VyIElELAphbmQgIiUlIiBmb3IgYW4gYWN0dWFsIHBlcmNlbnQgc2lnbi4g +SWYgbmVpdGhlciAlaSBvciAlSSBhcmUgcHJlc2VudCwKdGhlbiB0aGUgcGhvdG8g +d2lsbCBiZSBzdXBwbGllZCB0byB0aGUgdmlld2VyIG9uIHN0YW5kYXJkIGlucHV0 +LgoKVGhlIGRlZmF1bHQgdmlld2VyIGlzICJ4bG9hZGltYWdlIC1mb3JrIC1xdWll +dCAtdGl0bGUgJ0tleUlEIDB4JWsnClNURElOIi4gTm90ZSB0aGF0IGlmIHlvdXIg +aW1hZ2Ugdmlld2VyIHByb2dyYW0gaXMgbm90IHNlY3VyZSwgdGhlbgpleGVjdXRp +bmcgaXQgZnJvbSBHbnVQRyBkb2VzIG5vdCBtYWtlIGl0IHNlY3VyZS4KCkBpdGVt +IC0tZXhlYy1wYXRoIEBjb2Rle3N0cmluZ30KQG9waW5kZXggZXhlYy1wYXRoClNl +dHMgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgcGhvdG8gdmll +d2VycyBhbmQga2V5c2VydmVyCmhlbHBlcnMuIElmIG5vdCBwcm92aWRlZCwga2V5 +c2VydmVyIGhlbHBlcnMgdXNlIHRoZSBjb21waWxlZC1pbgpkZWZhdWx0IGRpcmVj +dG9yeSwgYW5kIHBob3RvIHZpZXdlcnMgdXNlIHRoZSAkUEFUSCBlbnZpcm9ubWVu +dAp2YXJpYWJsZS4KTm90ZSwgdGhhdCBvbiBXMzIgc3lzdGVtIHRoaXMgdmFsdWUg +aXMgaWdub3JlZCB3aGVuIHNlYXJjaGluZyBmb3IKa2V5c2VydmVyIGhlbHBlcnMu +CgpAaXRlbSAtLWtleXJpbmcgQGNvZGV7ZmlsZX0KQG9waW5kZXgga2V5cmluZwpB +ZGQgQGNvZGV7ZmlsZX0gdG8gdGhlIGN1cnJlbnQgbGlzdCBvZiBrZXlyaW5ncy4g +SWYgQGNvZGV7ZmlsZX0gYmVnaW5zCndpdGggYSB0aWxkZSBhbmQgYSBzbGFzaCwg +dGhlc2UgYXJlIHJlcGxhY2VkIGJ5IHRoZSAkSE9NRSBkaXJlY3RvcnkuIElmCnRo +ZSBmaWxlbmFtZSBkb2VzIG5vdCBjb250YWluIGEgc2xhc2gsIGl0IGlzIGFzc3Vt +ZWQgdG8gYmUgaW4gdGhlIEdudVBHCmhvbWUgZGlyZWN0b3J5ICgifi8uZ251cGci +IGlmIEBvcHRpb257LS1ob21lZGlyfSBvciAkR05VUEdIT01FIGlzIG5vdAp1c2Vk +KS4KCk5vdGUgdGhhdCB0aGlzIGFkZHMgYSBrZXlyaW5nIHRvIHRoZSBjdXJyZW50 +IGxpc3QuIElmIHRoZSBpbnRlbnQgaXMgdG8KdXNlIHRoZSBzcGVjaWZpZWQga2V5 +cmluZyBhbG9uZSwgdXNlIEBvcHRpb257LS1rZXlyaW5nfSBhbG9uZyB3aXRoCkBv +cHRpb257LS1uby1kZWZhdWx0LWtleXJpbmd9LgoKQGl0ZW0gLS1zZWNyZXQta2V5 +cmluZyBAY29kZXtmaWxlfQpAb3BpbmRleCBzZWNyZXQta2V5cmluZwpUaGlzIGlz +IGFuIG9ic29sZXRlIG9wdGlvbiBhbmQgaWdub3JlZC4gIEFsbCBzZWNyZXQga2V5 +cyBhcmUgc3RvcmVkIGluCnRoZSBAZmlsZXtwcml2YXRlLWtleXMtdjEuZH0gZGly +ZWN0b3J5IGJlbG93IHRoZSBHbnVQRyBob21lIGRpcmVjdG9yeS4KCkBpdGVtIC0t +cHJpbWFyeS1rZXlyaW5nIEBjb2Rle2ZpbGV9CkBvcGluZGV4IHByaW1hcnkta2V5 +cmluZwpEZXNpZ25hdGUgQGNvZGV7ZmlsZX0gYXMgdGhlIHByaW1hcnkgcHVibGlj +IGtleXJpbmcuIFRoaXMgbWVhbnMgdGhhdApuZXdseSBpbXBvcnRlZCBrZXlzICh2 +aWEgQG9wdGlvbnstLWltcG9ydH0gb3Iga2V5c2VydmVyCkBvcHRpb257LS1yZWN2 +LWZyb219KSB3aWxsIGdvIHRvIHRoaXMga2V5cmluZy4KCkBpdGVtIC0tdHJ1c3Rk +Yi1uYW1lIEBjb2Rle2ZpbGV9CkBvcGluZGV4IHRydXN0ZGItbmFtZQpVc2UgQGNv +ZGV7ZmlsZX0gaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCB0cnVzdGRiLiBJZiBAY29k +ZXtmaWxlfSBiZWdpbnMKd2l0aCBhIHRpbGRlIGFuZCBhIHNsYXNoLCB0aGVzZSBh +cmUgcmVwbGFjZWQgYnkgdGhlICRIT01FIGRpcmVjdG9yeS4gSWYKdGhlIGZpbGVu +YW1lIGRvZXMgbm90IGNvbnRhaW4gYSBzbGFzaCwgaXQgaXMgYXNzdW1lZCB0byBi +ZSBpbiB0aGUgR251UEcKaG9tZSBkaXJlY3RvcnkgKEBmaWxle34vLmdudXBnfSBp +ZiBAb3B0aW9uey0taG9tZWRpcn0gb3IgJEdOVVBHSE9NRSBpcwpub3QgdXNlZCku +CgpAaW5jbHVkZSBvcHQtaG9tZWRpci50ZXhpCgoKQGl0ZW0gLS1kaXNwbGF5LWNo +YXJzZXQgQGNvZGV7bmFtZX0KQG9waW5kZXggZGlzcGxheS1jaGFyc2V0ClNldCB0 +aGUgbmFtZSBvZiB0aGUgbmF0aXZlIGNoYXJhY3RlciBzZXQuIFRoaXMgaXMgdXNl +ZCB0byBjb252ZXJ0CnNvbWUgaW5mb3JtYXRpb25hbCBzdHJpbmdzIGxpa2UgdXNl +ciBJRHMgdG8gdGhlIHByb3BlciBVVEYtOCBlbmNvZGluZy4KTm90ZSB0aGF0IHRo +aXMgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgY2hhcmFjdGVyIHNldCBvZiBk +YXRhIHRvIGJlCmVuY3J5cHRlZCBvciBzaWduZWQ7IEdudVBHIGRvZXMgbm90IHJl +Y29kZSB1c2VyLXN1cHBsaWVkIGRhdGEuIElmCnRoaXMgb3B0aW9uIGlzIG5vdCB1 +c2VkLCB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0IGlzIGRldGVybWluZWQgZnJv +bQp0aGUgY3VycmVudCBsb2NhbGUuIEEgdmVyYm9zaXR5IGxldmVsIG9mIDMgc2hv +d3MgdGhlIGNob3NlbiBzZXQuClZhbGlkIHZhbHVlcyBmb3IgQGNvZGV7bmFtZX0g +YXJlOgoKQHRhYmxlIEBhc2lzCgogIEBpdGVtIGlzby04ODU5LTEKICBAb3BpbmRl +eCBkaXNwbGF5LWNoYXJzZXQ6aXNvLTg4NTktMQogIFRoaXMgaXMgdGhlIExhdGlu +IDEgc2V0LgoKICBAaXRlbSBpc28tODg1OS0yCiAgQG9waW5kZXggZGlzcGxheS1j +aGFyc2V0Omlzby04ODU5LTIKICBUaGUgTGF0aW4gMiBzZXQuCgogIEBpdGVtIGlz +by04ODU5LTE1CiAgQG9waW5kZXggZGlzcGxheS1jaGFyc2V0Omlzby04ODU5LTE1 +CiAgVGhpcyBpcyBjdXJyZW50bHkgYW4gYWxpYXMgZm9yCiAgdGhlIExhdGluIDEg +c2V0LgoKICBAaXRlbSBrb2k4LXIKICBAb3BpbmRleCBkaXNwbGF5LWNoYXJzZXQ6 +a29pOC1yCiAgVGhlIHVzdWFsIFJ1c3NpYW4gc2V0IChyZmMxNDg5KS4KCiAgQGl0 +ZW0gdXRmLTgKICBAb3BpbmRleCBkaXNwbGF5LWNoYXJzZXQ6dXRmLTgKICBCeXBh +c3MgYWxsIHRyYW5zbGF0aW9ucyBhbmQgYXNzdW1lCiAgdGhhdCB0aGUgT1MgdXNl +cyBuYXRpdmUgVVRGLTggZW5jb2RpbmcuCkBlbmQgdGFibGUKCkBpdGVtIC0tdXRm +OC1zdHJpbmdzCkBpdGVteCAtLW5vLXV0Zjgtc3RyaW5ncwpAb3BpbmRleCB1dGY4 +LXN0cmluZ3MKQXNzdW1lIHRoYXQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhcmUg +Z2l2ZW4gYXMgVVRGOCBzdHJpbmdzLiBUaGUKZGVmYXVsdCAoQG9wdGlvbnstLW5v +LXV0Zjgtc3RyaW5nc30pIGlzIHRvIGFzc3VtZSB0aGF0IGFyZ3VtZW50cyBhcmUK +ZW5jb2RlZCBpbiB0aGUgY2hhcmFjdGVyIHNldCBhcyBzcGVjaWZpZWQgYnkKQG9w +dGlvbnstLWRpc3BsYXktY2hhcnNldH0uIFRoZXNlIG9wdGlvbnMgYWZmZWN0IGFs +bCBmb2xsb3dpbmcKYXJndW1lbnRzLiBCb3RoIG9wdGlvbnMgbWF5IGJlIHVzZWQg +bXVsdGlwbGUgdGltZXMuCgpAYW5jaG9ye2dwZy1vcHRpb24gLS1vcHRpb25zfQpA +aXRlbSAtLW9wdGlvbnMgQGNvZGV7ZmlsZX0KQG9waW5kZXggb3B0aW9ucwpSZWFk +IG9wdGlvbnMgZnJvbSBAY29kZXtmaWxlfSBhbmQgZG8gbm90IHRyeSB0byByZWFk +IHRoZW0gZnJvbSB0aGUKZGVmYXVsdCBvcHRpb25zIGZpbGUgaW4gdGhlIGhvbWVk +aXIgKHNlZSBAb3B0aW9uey0taG9tZWRpcn0pLiBUaGlzCm9wdGlvbiBpcyBpZ25v +cmVkIGlmIHVzZWQgaW4gYW4gb3B0aW9ucyBmaWxlLgoKQGl0ZW0gLS1uby1vcHRp +b25zCkBvcGluZGV4IG5vLW9wdGlvbnMKU2hvcnRjdXQgZm9yIEBvcHRpb257LS1v +cHRpb25zIC9kZXYvbnVsbH0uIFRoaXMgb3B0aW9uIGlzIGRldGVjdGVkCmJlZm9y +ZSBhbiBhdHRlbXB0IHRvIG9wZW4gYW4gb3B0aW9uIGZpbGUuICBVc2luZyB0aGlz +IG9wdGlvbiB3aWxsIGFsc28KcHJldmVudCB0aGUgY3JlYXRpb24gb2YgYSBAZmls +ZXt+Ly5nbnVwZ30gaG9tZWRpci4KCkBpdGVtIC16IEBjb2Rle259CkBpdGVteCAt +LWNvbXByZXNzLWxldmVsIEBjb2Rle259CkBpdGVteCAtLWJ6aXAyLWNvbXByZXNz +LWxldmVsIEBjb2Rle259CkBvcGluZGV4IGNvbXByZXNzLWxldmVsCkBvcGluZGV4 +IGJ6aXAyLWNvbXByZXNzLWxldmVsClNldCBjb21wcmVzc2lvbiBsZXZlbCB0byBA +Y29kZXtufSBmb3IgdGhlIFpJUCBhbmQgWkxJQiBjb21wcmVzc2lvbgphbGdvcml0 +aG1zLiBUaGUgZGVmYXVsdCBpcyB0byB1c2UgdGhlIGRlZmF1bHQgY29tcHJlc3Np +b24gbGV2ZWwgb2YgemxpYgoobm9ybWFsbHkgNikuIEBvcHRpb257LS1iemlwMi1j +b21wcmVzcy1sZXZlbH0gc2V0cyB0aGUgY29tcHJlc3Npb24gbGV2ZWwKZm9yIHRo +ZSBCWklQMiBjb21wcmVzc2lvbiBhbGdvcml0aG0gKGRlZmF1bHRpbmcgdG8gNiBh +cyB3ZWxsKS4gVGhpcyBpcyBhCmRpZmZlcmVudCBvcHRpb24gZnJvbSBAb3B0aW9u +ey0tY29tcHJlc3MtbGV2ZWx9IHNpbmNlIEJaSVAyIHVzZXMgYQpzaWduaWZpY2Fu +dCBhbW91bnQgb2YgbWVtb3J5IGZvciBlYWNoIGFkZGl0aW9uYWwgY29tcHJlc3Np +b24gbGV2ZWwuCkBvcHRpb257LXp9IHNldHMgYm90aC4gQSB2YWx1ZSBvZiAwIGZv +ciBAY29kZXtufSBkaXNhYmxlcyBjb21wcmVzc2lvbi4KCkBpdGVtIC0tYnppcDIt +ZGVjb21wcmVzcy1sb3dtZW0KQG9waW5kZXggYnppcDItZGVjb21wcmVzcy1sb3dt +ZW0KVXNlIGEgZGlmZmVyZW50IGRlY29tcHJlc3Npb24gbWV0aG9kIGZvciBCWklQ +MiBjb21wcmVzc2VkIGZpbGVzLiBUaGlzCmFsdGVybmF0ZSBtZXRob2QgdXNlcyBh +IGJpdCBtb3JlIHRoYW4gaGFsZiB0aGUgbWVtb3J5LCBidXQgYWxzbyBydW5zCmF0 +IGhhbGYgdGhlIHNwZWVkLiBUaGlzIGlzIHVzZWZ1bCB1bmRlciBleHRyZW1lIGxv +dyBtZW1vcnkKY2lyY3Vtc3RhbmNlcyB3aGVuIHRoZSBmaWxlIHdhcyBvcmlnaW5h +bGx5IGNvbXByZXNzZWQgYXQgYSBoaWdoCkBvcHRpb257LS1iemlwMi1jb21wcmVz +cy1sZXZlbH0uCgoKQGl0ZW0gLS1tYW5nbGUtZG9zLWZpbGVuYW1lcwpAaXRlbXgg +LS1uby1tYW5nbGUtZG9zLWZpbGVuYW1lcwpAb3BpbmRleCBtYW5nbGUtZG9zLWZp +bGVuYW1lcwpAb3BpbmRleCBuby1tYW5nbGUtZG9zLWZpbGVuYW1lcwpPbGRlciB2 +ZXJzaW9uIG9mIFdpbmRvd3MgY2Fubm90IGhhbmRsZSBmaWxlbmFtZXMgd2l0aCBt +b3JlIHRoYW4gb25lCmRvdC4gQG9wdGlvbnstLW1hbmdsZS1kb3MtZmlsZW5hbWVz +fSBjYXVzZXMgR251UEcgdG8gcmVwbGFjZSAocmF0aGVyCnRoYW4gYWRkIHRvKSB0 +aGUgZXh0ZW5zaW9uIG9mIGFuIG91dHB1dCBmaWxlbmFtZSB0byBhdm9pZCB0aGlz +CnByb2JsZW0uIFRoaXMgb3B0aW9uIGlzIG9mZiBieSBkZWZhdWx0IGFuZCBoYXMg +bm8gZWZmZWN0IG9uIG5vbi1XaW5kb3dzCnBsYXRmb3Jtcy4KCkBpdGVtIC0tYXNr +LWNlcnQtbGV2ZWwKQGl0ZW14IC0tbm8tYXNrLWNlcnQtbGV2ZWwKQG9waW5kZXgg +YXNrLWNlcnQtbGV2ZWwKV2hlbiBtYWtpbmcgYSBrZXkgc2lnbmF0dXJlLCBwcm9t +cHQgZm9yIGEgY2VydGlmaWNhdGlvbiBsZXZlbC4gSWYgdGhpcwpvcHRpb24gaXMg +bm90IHNwZWNpZmllZCwgdGhlIGNlcnRpZmljYXRpb24gbGV2ZWwgdXNlZCBpcyBz +ZXQgdmlhCkBvcHRpb257LS1kZWZhdWx0LWNlcnQtbGV2ZWx9LiBTZWUgQG9wdGlv +bnstLWRlZmF1bHQtY2VydC1sZXZlbH0gZm9yCmluZm9ybWF0aW9uIG9uIHRoZSBz +cGVjaWZpYyBsZXZlbHMgYW5kIGhvdyB0aGV5IGFyZQp1c2VkLiBAb3B0aW9uey0t +bm8tYXNrLWNlcnQtbGV2ZWx9IGRpc2FibGVzIHRoaXMgb3B0aW9uLiBUaGlzIG9w +dGlvbgpkZWZhdWx0cyB0byBuby4KCkBpdGVtIC0tZGVmYXVsdC1jZXJ0LWxldmVs +IEBjb2Rle259CkBvcGluZGV4IGRlZmF1bHQtY2VydC1sZXZlbApUaGUgZGVmYXVs +dCB0byB1c2UgZm9yIHRoZSBjaGVjayBsZXZlbCB3aGVuIHNpZ25pbmcgYSBrZXku +CgowIG1lYW5zIHlvdSBtYWtlIG5vIHBhcnRpY3VsYXIgY2xhaW0gYXMgdG8gaG93 +IGNhcmVmdWxseSB5b3UgdmVyaWZpZWQKdGhlIGtleS4KCjEgbWVhbnMgeW91IGJl +bGlldmUgdGhlIGtleSBpcyBvd25lZCBieSB0aGUgcGVyc29uIHdobyBjbGFpbXMg +dG8gb3duCml0IGJ1dCB5b3UgY291bGQgbm90LCBvciBkaWQgbm90IHZlcmlmeSB0 +aGUga2V5IGF0IGFsbC4gVGhpcyBpcwp1c2VmdWwgZm9yIGEgInBlcnNvbmEiIHZl +cmlmaWNhdGlvbiwgd2hlcmUgeW91IHNpZ24gdGhlIGtleSBvZiBhCnBzZXVkb255 +bW91cyB1c2VyLgoKMiBtZWFucyB5b3UgZGlkIGNhc3VhbCB2ZXJpZmljYXRpb24g +b2YgdGhlIGtleS4gRm9yIGV4YW1wbGUsIHRoaXMKY291bGQgbWVhbiB0aGF0IHlv +dSB2ZXJpZmllZCB0aGUga2V5IGZpbmdlcnByaW50IGFuZCBjaGVja2VkIHRoZQp1 +c2VyIElEIG9uIHRoZSBrZXkgYWdhaW5zdCBhIHBob3RvIElELgoKMyBtZWFucyB5 +b3UgZGlkIGV4dGVuc2l2ZSB2ZXJpZmljYXRpb24gb2YgdGhlIGtleS4gRm9yIGV4 +YW1wbGUsIHRoaXMKY291bGQgbWVhbiB0aGF0IHlvdSB2ZXJpZmllZCB0aGUga2V5 +IGZpbmdlcnByaW50IHdpdGggdGhlIG93bmVyIG9mIHRoZQprZXkgaW4gcGVyc29u +LCBhbmQgdGhhdCB5b3UgY2hlY2tlZCwgYnkgbWVhbnMgb2YgYSBoYXJkIHRvIGZv +cmdlCmRvY3VtZW50IHdpdGggYSBwaG90byBJRCAoc3VjaCBhcyBhIHBhc3Nwb3J0 +KSB0aGF0IHRoZSBuYW1lIG9mIHRoZSBrZXkKb3duZXIgbWF0Y2hlcyB0aGUgbmFt +ZSBpbiB0aGUgdXNlciBJRCBvbiB0aGUga2V5LCBhbmQgZmluYWxseSB0aGF0IHlv +dQp2ZXJpZmllZCAoYnkgZXhjaGFuZ2Ugb2YgZW1haWwpIHRoYXQgdGhlIGVtYWls +IGFkZHJlc3Mgb24gdGhlIGtleQpiZWxvbmdzIHRvIHRoZSBrZXkgb3duZXIuCgpO +b3RlIHRoYXQgdGhlIGV4YW1wbGVzIGdpdmVuIGFib3ZlIGZvciBsZXZlbHMgMiBh +bmQgMyBhcmUganVzdCB0aGF0OgpleGFtcGxlcy4gSW4gdGhlIGVuZCwgaXQgaXMg +dXAgdG8geW91IHRvIGRlY2lkZSBqdXN0IHdoYXQgImNhc3VhbCIKYW5kICJleHRl +bnNpdmUiIG1lYW4gdG8geW91LgoKVGhpcyBvcHRpb24gZGVmYXVsdHMgdG8gMCAo +bm8gcGFydGljdWxhciBjbGFpbSkuCgpAaXRlbSAtLW1pbi1jZXJ0LWxldmVsCkBv +cGluZGV4IG1pbi1jZXJ0LWxldmVsCldoZW4gYnVpbGRpbmcgdGhlIHRydXN0IGRh +dGFiYXNlLCB0cmVhdCBhbnkgc2lnbmF0dXJlcyB3aXRoIGEKY2VydGlmaWNhdGlv +biBsZXZlbCBiZWxvdyB0aGlzIGFzIGludmFsaWQuIERlZmF1bHRzIHRvIDIsIHdo +aWNoCmRpc3JlZ2FyZHMgbGV2ZWwgMSBzaWduYXR1cmVzLiBOb3RlIHRoYXQgbGV2 +ZWwgMCAibm8gcGFydGljdWxhcgpjbGFpbSIgc2lnbmF0dXJlcyBhcmUgYWx3YXlz +IGFjY2VwdGVkLgoKQGl0ZW0gLS10cnVzdGVkLWtleSBAY29kZXtsb25nIGtleSBJ +RH0KQG9waW5kZXggdHJ1c3RlZC1rZXkKQXNzdW1lIHRoYXQgdGhlIHNwZWNpZmll +ZCBrZXkgKHdoaWNoIG11c3QgYmUgZ2l2ZW4KYXMgYSBmdWxsIDggYnl0ZSBrZXkg +SUQpIGlzIGFzIHRydXN0d29ydGh5IGFzIG9uZSBvZgp5b3VyIG93biBzZWNyZXQg +a2V5cy4gVGhpcyBvcHRpb24gaXMgdXNlZnVsIGlmIHlvdQpkb24ndCB3YW50IHRv +IGtlZXAgeW91ciBzZWNyZXQga2V5cyAob3Igb25lIG9mIHRoZW0pCm9ubGluZSBi +dXQgc3RpbGwgd2FudCB0byBiZSBhYmxlIHRvIGNoZWNrIHRoZSB2YWxpZGl0eSBv +ZiBhIGdpdmVuCnJlY2lwaWVudCdzIG9yIHNpZ25hdG9yJ3Mga2V5LgoKQGl0ZW0g +LS10cnVzdC1tb2RlbCBAY29kZXtwZ3B8Y2xhc3NpY3x0b2Z1fHRvZnUrcGdwfGRp +cmVjdHxhbHdheXN8YXV0b30KQG9waW5kZXggdHJ1c3QtbW9kZWwKU2V0IHdoYXQg +dHJ1c3QgbW9kZWwgR251UEcgc2hvdWxkIGZvbGxvdy4gVGhlIG1vZGVscyBhcmU6 +CgpAdGFibGUgQGFzaXMKCiAgQGl0ZW0gcGdwCiAgQG9waW5kZXggdHJ1c3QtbW9k +ZTpwZ3AKICBUaGlzIGlzIHRoZSBXZWIgb2YgVHJ1c3QgY29tYmluZWQgd2l0aCB0 +cnVzdCBzaWduYXR1cmVzIGFzIHVzZWQgaW4gUEdQCiAgNS54IGFuZCBsYXRlci4g +VGhpcyBpcyB0aGUgZGVmYXVsdCB0cnVzdCBtb2RlbCB3aGVuIGNyZWF0aW5nIGEg +bmV3CiAgdHJ1c3QgZGF0YWJhc2UuCgogIEBpdGVtIGNsYXNzaWMKICBAb3BpbmRl +eCB0cnVzdC1tb2RlOmNsYXNzaWMKICBUaGlzIGlzIHRoZSBzdGFuZGFyZCBXZWIg +b2YgVHJ1c3QgYXMgaW50cm9kdWNlZCBieSBQR1AgMi4KCiAgQGl0ZW0gdG9mdQog +IEBvcGluZGV4IHRydXN0LW1vZGU6dG9mdQogIEBhbmNob3J7dHJ1c3QtbW9kZWwt +dG9mdX0KICBUT0ZVIHN0YW5kcyBmb3IgVHJ1c3QgT24gRmlyc3QgVXNlLiAgSW4g +dGhpcyB0cnVzdCBtb2RlbCwgdGhlIGZpcnN0CiAgdGltZSBhIGtleSBpcyBzZWVu +LCBpdCBpcyBtZW1vcml6ZWQuICBJZiBsYXRlciBhbm90aGVyIGtleSBpcyBzZWVu +CiAgd2l0aCBhIHVzZXIgaWQgd2l0aCB0aGUgc2FtZSBlbWFpbCBhZGRyZXNzLCBh +IHdhcm5pbmcgaXMgZGlzcGxheWVkCiAgaW5kaWNhdGluZyB0aGF0IHRoZXJlIGlz +IGEgY29uZmxpY3QgYW5kIHRoYXQgdGhlIGtleSBtaWdodCBiZSBhCiAgZm9yZ2Vy +eSBhbmQgYW4gYXR0ZW1wdCBhdCBhIG1hbi1pbi10aGUtbWlkZGxlIGF0dGFjay4K +CiAgQmVjYXVzZSBhIHBvdGVudGlhbCBhdHRhY2tlciBpcyBhYmxlIHRvIGNvbnRy +b2wgdGhlIGVtYWlsIGFkZHJlc3MKICBhbmQgdGhlcmVieSBjaXJjdW12ZW50IHRo +ZSBjb25mbGljdCBkZXRlY3Rpb24gYWxnb3JpdGhtIGJ5IHVzaW5nIGFuCiAgZW1h +aWwgYWRkcmVzcyB0aGF0IGlzIHNpbWlsYXIgaW4gYXBwZWFyYW5jZSB0byBhIHRy +dXN0ZWQgZW1haWwKICBhZGRyZXNzLCB3aGVuZXZlciBhIG1lc3NhZ2UgaXMgdmVy +aWZpZWQsIHN0YXRpc3RpY3MgYWJvdXQgdGhlIG51bWJlcgogIG9mIG1lc3NhZ2Vz +IHNpZ25lZCB3aXRoIHRoZSBrZXkgYXJlIHNob3duLiAgSW4gdGhpcyB3YXksIGEg +dXNlciBjYW4KICBlYXNpbHkgaWRlbnRpZnkgYXR0YWNrcyB1c2luZyBmYWtlIGtl +eXMgZm9yIHJlZ3VsYXIgY29ycmVzcG9uZGVudHMuCgogIFdoZW4gY29tcGFyZWQg +d2l0aCB0aGUgV2ViIG9mIFRydXN0LCBUT0ZVIG9mZmVycyBzaWduaWZpY2FudGx5 +CiAgd2Vha2VyIHNlY3VyaXR5IGd1YXJhbnRlZXMuICBJbiBwYXJ0aWN1bGFyLCBU +T0ZVIG9ubHkgaGVscHMgZW5zdXJlCiAgY29uc2lzdGVuY3kgKHRoYXQgaXMsIHRo +YXQgdGhlIGJpbmRpbmcgYmV0d2VlbiBhIGtleSBhbmQgZW1haWwKICBhZGRyZXNz +IGRvZXNuJ3QgY2hhbmdlKS4gIEEgbWFqb3IgYWR2YW50YWdlIG9mIFRPRlUgaXMg +dGhhdCBpdAogIHJlcXVpcmVzIGxpdHRsZSBtYWludGVuYW5jZSB0byB1c2UgY29y +cmVjdGx5LiAgVG8gdXNlIHRoZSB3ZWIgb2YKICB0cnVzdCBwcm9wZXJseSwgeW91 +IG5lZWQgdG8gYWN0aXZlbHkgc2lnbiBrZXlzIGFuZCBtYXJrIHVzZXJzIGFzCiAg +dHJ1c3RlZCBpbnRyb2R1Y2Vycy4gIFRoaXMgaXMgYSB0aW1lLWNvbnN1bWluZyBw +cm9jZXNzIGFuZCBhbmVjZG90YWwKICBldmlkZW5jZSBzdWdnZXN0cyB0aGF0IGV2 +ZW4gc2VjdXJpdHktY29uc2Npb3VzIHVzZXJzIHJhcmVseSB0YWtlIHRoZQogIHRp +bWUgdG8gZG8gdGhpcyB0aG9yb3VnaGx5IGFuZCBpbnN0ZWFkIHJlbHkgb24gYW4g +YWQtaG9jIFRPRlUKICBwcm9jZXNzLgoKICBJbiB0aGUgVE9GVSBtb2RlbCwgcG9s +aWNpZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBiaW5kaW5ncyBiZXR3ZWVuCiAga2V5 +cyBhbmQgZW1haWwgYWRkcmVzc2VzICh3aGljaCBhcmUgZXh0cmFjdGVkIGZyb20g +dXNlciBpZHMgYW5kCiAgbm9ybWFsaXplZCkuICBUaGVyZSBhcmUgZml2ZSBwb2xp +Y2llcywgd2hpY2ggY2FuIGJlIHNldCBtYW51YWxseQogIHVzaW5nIHRoZSBAb3B0 +aW9uey0tdG9mdS1wb2xpY3l9IG9wdGlvbi4gIFRoZSBkZWZhdWx0IHBvbGljeSBj +YW4gYmUKICBzZXQgdXNpbmcgdGhlIEBvcHRpb257LS10b2Z1LWRlZmF1bHQtcG9s +aWN5fSBwb2xpY3kuCgogIFRoZSBUT0ZVIHBvbGljaWVzIGFyZTogQGNvZGV7YXV0 +b30sIEBjb2Rle2dvb2R9LCBAY29kZXt1bmtub3dufSwKICBAY29kZXtiYWR9IGFu +ZCBAY29kZXthc2t9LiAgVGhlIEBjb2Rle2F1dG99IHBvbGljeSBpcyB1c2VkIGJ5 +CiAgZGVmYXVsdCAodW5sZXNzIG92ZXJyaWRkZW4gYnkgQG9wdGlvbnstLXRvZnUt +ZGVmYXVsdC1wb2xpY3l9KSBhbmQKICBtYXJrcyBhIGJpbmRpbmcgYXMgbWFyZ2lu +YWxseSB0cnVzdGVkLiAgVGhlIEBjb2Rle2dvb2R9LAogIEBjb2Rle3Vua25vd259 +IGFuZCBAY29kZXtiYWR9IHBvbGljaWVzIG1hcmsgYSBiaW5kaW5nIGFzIGZ1bGx5 +CiAgdHJ1c3RlZCwgYXMgaGF2aW5nIHVua25vd24gdHJ1c3Qgb3IgYXMgaGF2aW5n +IHRydXN0IG5ldmVyLAogIHJlc3BlY3RpdmVseS4gIFRoZSBAY29kZXt1bmtub3du +fSBwb2xpY3kgaXMgdXNlZnVsIGZvciBqdXN0IHVzaW5nCiAgVE9GVSB0byBkZXRl +Y3QgY29uZmxpY3RzLCBidXQgdG8gbmV2ZXIgYXNzaWduIHBvc2l0aXZlIHRydXN0 +IHRvIGEKICBiaW5kaW5nLiAgVGhlIGZpbmFsIHBvbGljeSwgQGNvZGV7YXNrfSBw +cm9tcHRzIHRoZSB1c2VyIHRvIGluZGljYXRlCiAgdGhlIGJpbmRpbmcncyB0cnVz +dC4gIElmIGJhdGNoIG1vZGUgaXMgZW5hYmxlZCAob3IgaW5wdXQgaXMKICBpbmFw +cHJvcHJpYXRlIGluIHRoZSBjb250ZXh0KSwgdGhlbiB0aGUgdXNlciBpcyBub3Qg +cHJvbXB0ZWQgYW5kIHRoZQogIEBjb2Rle3VuZGVmaW5lZH0gdHJ1c3QgbGV2ZWwg +aXMgcmV0dXJuZWQuCgogIEBpdGVtIHRvZnUrcGdwCiAgQG9waW5kZXggdHJ1c3Qt +bW9kZTp0b2Z1K3BncAogIFRoaXMgdHJ1c3QgbW9kZWwgY29tYmluZXMgVE9GVSB3 +aXRoIHRoZSBXZWIgb2YgVHJ1c3QuICBUaGlzIGlzIGRvbmUKICBieSBjb21wdXRp +bmcgdGhlIHRydXN0IGxldmVsIGZvciBlYWNoIG1vZGVsIGFuZCB0aGVuIHRha2lu +ZyB0aGUKICBtYXhpbXVtIHRydXN0IGxldmVsIHdoZXJlIHRoZSB0cnVzdCBsZXZl +bHMgYXJlIG9yZGVyZWQgYXMgZm9sbG93czoKICBAY29kZXt1bmtub3duIDwgdW5k +ZWZpbmVkIDwgbWFyZ2luYWwgPCBmdWxseSA8IHVsdGltYXRlIDwgZXhwaXJlZCA8 +CiAgbmV2ZXJ9LgoKICBCeSBzZXR0aW5nIEBvcHRpb257LS10b2Z1LWRlZmF1bHQt +cG9saWN5PXVua25vd259LCB0aGlzIG1vZGVsIGNhbiBiZQogIHVzZWQgdG8gaW1w +bGVtZW50IHRoZSB3ZWIgb2YgdHJ1c3Qgd2l0aCBUT0ZVJ3MgY29uZmxpY3QgZGV0 +ZWN0aW9uCiAgYWxnb3JpdGhtLCBidXQgd2l0aG91dCBpdHMgYXNzaWdubWVudCBv +ZiBwb3NpdGl2ZSB0cnVzdCB2YWx1ZXMsCiAgd2hpY2ggc29tZSBzZWN1cml0eS1j +b25zY2lvdXMgdXNlcnMgZG9uJ3QgbGlrZS4KCiAgQGl0ZW0gZGlyZWN0CiAgQG9w +aW5kZXggdHJ1c3QtbW9kZTpkaXJlY3QKICBLZXkgdmFsaWRpdHkgaXMgc2V0IGRp +cmVjdGx5IGJ5IHRoZSB1c2VyIGFuZCBub3QgY2FsY3VsYXRlZCB2aWEgdGhlCiAg +V2ViIG9mIFRydXN0LgoKICBAaXRlbSBhbHdheXMKICBAb3BpbmRleCB0cnVzdC1t +b2RlOmFsd2F5cwogIFNraXAga2V5IHZhbGlkYXRpb24gYW5kIGFzc3VtZSB0aGF0 +IHVzZWQga2V5cyBhcmUgYWx3YXlzIGZ1bGx5CiAgdmFsaWQuIFlvdSBnZW5lcmFs +bHkgd29uJ3QgdXNlIHRoaXMgdW5sZXNzIHlvdSBhcmUgdXNpbmcgc29tZQogIGV4 +dGVybmFsIHZhbGlkYXRpb24gc2NoZW1lLiBUaGlzIG9wdGlvbiBhbHNvIHN1cHBy +ZXNzZXMgdGhlCiAgIlt1bmNlcnRhaW5dIiB0YWcgcHJpbnRlZCB3aXRoIHNpZ25h +dHVyZSBjaGVja3Mgd2hlbiB0aGVyZSBpcyBubwogIGV2aWRlbmNlIHRoYXQgdGhl +IHVzZXIgSUQgaXMgYm91bmQgdG8gdGhlIGtleS4gIE5vdGUgdGhhdCB0aGlzCiAg +dHJ1c3QgbW9kZWwgc3RpbGwgZG9lcyBub3QgYWxsb3cgdGhlIHVzZSBvZiBleHBp +cmVkLCByZXZva2VkLCBvcgogIGRpc2FibGVkIGtleXMuCgogIEBpdGVtIGF1dG8K +ICBAb3BpbmRleCB0cnVzdC1tb2RlOmF1dG8KICBTZWxlY3QgdGhlIHRydXN0IG1v +ZGVsIGRlcGVuZGluZyBvbiB3aGF0ZXZlciB0aGUgaW50ZXJuYWwgdHJ1c3QKICBk +YXRhYmFzZSBzYXlzLiBUaGlzIGlzIHRoZSBkZWZhdWx0IG1vZGVsIGlmIHN1Y2gg +YSBkYXRhYmFzZSBhbHJlYWR5CiAgZXhpc3RzLgpAZW5kIHRhYmxlCgpAaXRlbSAt +LWF1dG8ta2V5LWxvY2F0ZSBAY29kZXtwYXJhbWV0ZXJzfQpAaXRlbXggLS1uby1h +dXRvLWtleS1sb2NhdGUKQG9waW5kZXggYXV0by1rZXktbG9jYXRlCkdudVBHIGNh +biBhdXRvbWF0aWNhbGx5IGxvY2F0ZSBhbmQgcmV0cmlldmUga2V5cyBhcyBuZWVk +ZWQgdXNpbmcgdGhpcwpvcHRpb24uIFRoaXMgaGFwcGVucyB3aGVuIGVuY3J5cHRp +bmcgdG8gYW4gZW1haWwgYWRkcmVzcyAoaW4gdGhlCiJ1c2VyQEBleGFtcGxlLmNv +bSIgZm9ybSksIGFuZCB0aGVyZSBhcmUgbm8gdXNlckBAZXhhbXBsZS5jb20ga2V5 +cyBvbgp0aGUgbG9jYWwga2V5cmluZy4gIFRoaXMgb3B0aW9uIHRha2VzIGFueSBu +dW1iZXIgb2YgdGhlIGZvbGxvd2luZwptZWNoYW5pc21zLCBpbiB0aGUgb3JkZXIg +dGhleSBhcmUgdG8gYmUgdHJpZWQ6CgpAdGFibGUgQGFzaXMKCiAgQGl0ZW0gY2Vy +dAogIExvY2F0ZSBhIGtleSB1c2luZyBETlMgQ0VSVCwgYXMgc3BlY2lmaWVkIGlu +IHJmYzQzOTguCgogIEBpdGVtIHBrYQogIExvY2F0ZSBhIGtleSB1c2luZyBETlMg +UEtBLgoKICBAaXRlbSBkYW5lCiAgTG9jYXRlIGEga2V5IHVzaW5nIERBTkUsIGFz +IHNwZWNpZmllZAogIGluIGRyYWZ0LWlldGYtZGFuZS1vcGVucGdwa2V5LTA1LnR4 +dC4KCiAgQGl0ZW0gbGRhcAogIFVzaW5nIEROUyBTZXJ2aWNlIERpc2NvdmVyeSwg +Y2hlY2sgdGhlIGRvbWFpbiBpbiBxdWVzdGlvbiBmb3IgYW55IExEQVAKICBrZXlz +ZXJ2ZXJzIHRvIHVzZS4gIElmIHRoaXMgZmFpbHMsIGF0dGVtcHQgdG8gbG9jYXRl +IHRoZSBrZXkgdXNpbmcgdGhlCiAgUEdQIFVuaXZlcnNhbCBtZXRob2Qgb2YgY2hl +Y2tpbmcgQHNhbXB7bGRhcDovL2tleXMuKHRoZWRvbWFpbil9LgoKICBAaXRlbSBr +ZXlzZXJ2ZXIKICBMb2NhdGUgYSBrZXkgdXNpbmcgd2hhdGV2ZXIga2V5c2VydmVy +IGlzIGRlZmluZWQgdXNpbmcgdGhlCiAgQG9wdGlvbnstLWtleXNlcnZlcn0gb3B0 +aW9uLgoKICBAaXRlbSBrZXlzZXJ2ZXItVVJMCiAgSW4gYWRkaXRpb24sIGEga2V5 +c2VydmVyIFVSTCBhcyB1c2VkIGluIHRoZSBAb3B0aW9uey0ta2V5c2VydmVyfSBv +cHRpb24KICBtYXkgYmUgdXNlZCBoZXJlIHRvIHF1ZXJ5IHRoYXQgcGFydGljdWxh +ciBrZXlzZXJ2ZXIuCgogIEBpdGVtIGxvY2FsCiAgTG9jYXRlIHRoZSBrZXkgdXNp +bmcgdGhlIGxvY2FsIGtleXJpbmdzLiAgVGhpcyBtZWNoYW5pc20gYWxsb3dzIHRv +CiAgc2VsZWN0IHRoZSBvcmRlciBhIGxvY2FsIGtleSBsb29rdXAgaXMgZG9uZS4g +IFRodXMgdXNpbmcKICBAc2FtcHstLWF1dG8ta2V5LWxvY2F0ZSBsb2NhbH0gaXMg +aWRlbnRpY2FsIHRvCiAgQG9wdGlvbnstLW5vLWF1dG8ta2V5LWxvY2F0ZX0uCgog +IEBpdGVtIG5vZGVmYXVsdAogIFRoaXMgZmxhZyBkaXNhYmxlcyB0aGUgc3RhbmRh +cmQgbG9jYWwga2V5IGxvb2t1cCwgZG9uZSBiZWZvcmUgYW55IG9mIHRoZQogIG1l +Y2hhbmlzbXMgZGVmaW5lZCBieSB0aGUgQG9wdGlvbnstLWF1dG8ta2V5LWxvY2F0 +ZX0gYXJlIHRyaWVkLiAgVGhlCiAgcG9zaXRpb24gb2YgdGhpcyBtZWNoYW5pc20g +aW4gdGhlIGxpc3QgZG9lcyBub3QgbWF0dGVyLiAgSXQgaXMgbm90CiAgcmVxdWly +ZWQgaWYgQGNvZGV7bG9jYWx9IGlzIGFsc28gdXNlZC4KCiAgQGl0ZW0gY2xlYXIK +ICBDbGVhciBhbGwgZGVmaW5lZCBtZWNoYW5pc21zLiAgVGhpcyBpcyB1c2VmdWwg +dG8gb3ZlcnJpZGUKICBtZWNoYW5pc21zIGdpdmVuIGluIGEgY29uZmlnIGZpbGUu +CgpAZW5kIHRhYmxlCgpAaXRlbSAtLWtleWlkLWZvcm1hdCBAY29kZXtzaG9ydHww +eHNob3J0fGxvbmd8MHhsb25nfQpAb3BpbmRleCBrZXlpZC1mb3JtYXQKU2VsZWN0 +IGhvdyB0byBkaXNwbGF5IGtleSBJRHMuICJzaG9ydCIgaXMgdGhlIHRyYWRpdGlv +bmFsIDgtY2hhcmFjdGVyCmtleSBJRC4gImxvbmciIGlzIHRoZSBtb3JlIGFjY3Vy +YXRlIChidXQgbGVzcyBjb252ZW5pZW50KQoxNi1jaGFyYWN0ZXIga2V5IElELiBB +ZGQgYW4gIjB4IiB0byBlaXRoZXIgdG8gaW5jbHVkZSBhbiAiMHgiIGF0IHRoZQpi +ZWdpbm5pbmcgb2YgdGhlIGtleSBJRCwgYXMgaW4gMHg5OTI0MjU2MC4gIE5vdGUg +dGhhdCB0aGlzIG9wdGlvbiBpcwppZ25vcmVkIGlmIHRoZSBvcHRpb24gLS13aXRo +LWNvbG9ucyBpcyB1c2VkLgoKQGl0ZW0gLS1rZXlzZXJ2ZXIgQGNvZGV7bmFtZX0K +QG9waW5kZXgga2V5c2VydmVyClRoaXMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgLSBw +bGVhc2UgdXNlIHRoZSBAb3B0aW9uey0ta2V5c2VydmVyfSBpbgpAZmlsZXtkaXJt +bmdyLmNvbmZ9IGluc3RlYWQuCgpVc2UgQGNvZGV7bmFtZX0gYXMgeW91ciBrZXlz +ZXJ2ZXIuIFRoaXMgaXMgdGhlIHNlcnZlciB0aGF0CkBvcHRpb257LS1yZWN2LWtl +eXN9LCBAb3B0aW9uey0tc2VuZC1rZXlzfSwgYW5kIEBvcHRpb257LS1zZWFyY2gt +a2V5c30Kd2lsbCBjb21tdW5pY2F0ZSB3aXRoIHRvIHJlY2VpdmUga2V5cyBmcm9t +LCBzZW5kIGtleXMgdG8sIGFuZCBzZWFyY2ggZm9yCmtleXMgb24uIFRoZSBmb3Jt +YXQgb2YgdGhlIEBjb2Rle25hbWV9IGlzIGEgVVJJOgpgc2NoZW1lOlsvL11rZXlz +ZXJ2ZXJuYW1lWzpwb3J0XScgVGhlIHNjaGVtZSBpcyB0aGUgdHlwZSBvZiBrZXlz +ZXJ2ZXI6CiJoa3AiIGZvciB0aGUgSFRUUCAob3IgY29tcGF0aWJsZSkga2V5c2Vy +dmVycywgImxkYXAiIGZvciB0aGUgTERBUAprZXlzZXJ2ZXJzLCBvciAibWFpbHRv +IiBmb3IgdGhlIEdyYWZmIGVtYWlsIGtleXNlcnZlci4gTm90ZSB0aGF0IHlvdXIK +cGFydGljdWxhciBpbnN0YWxsYXRpb24gb2YgR251UEcgbWF5IGhhdmUgb3RoZXIg +a2V5c2VydmVyIHR5cGVzCmF2YWlsYWJsZSBhcyB3ZWxsLiBLZXlzZXJ2ZXIgc2No +ZW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4gQWZ0ZXIgdGhlCmtleXNlcnZlciBu +YW1lLCBvcHRpb25hbCBrZXlzZXJ2ZXIgY29uZmlndXJhdGlvbiBvcHRpb25zIG1h +eSBiZQpwcm92aWRlZC4gVGhlc2UgYXJlIHRoZSBzYW1lIGFzIHRoZSBnbG9iYWwg +QG9wdGlvbnstLWtleXNlcnZlci1vcHRpb25zfQpmcm9tIGJlbG93LCBidXQgYXBw +bHkgb25seSB0byB0aGlzIHBhcnRpY3VsYXIga2V5c2VydmVyLgoKTW9zdCBrZXlz +ZXJ2ZXJzIHN5bmNocm9uaXplIHdpdGggZWFjaCBvdGhlciwgc28gdGhlcmUgaXMg +Z2VuZXJhbGx5IG5vCm5lZWQgdG8gc2VuZCBrZXlzIHRvIG1vcmUgdGhhbiBvbmUg +c2VydmVyLiBUaGUga2V5c2VydmVyCkBjb2Rle2hrcDovL2tleXMuZ251cGcubmV0 +fSB1c2VzIHJvdW5kIHJvYmluIEROUyB0byBnaXZlIGEgZGlmZmVyZW50CmtleXNl +cnZlciBlYWNoIHRpbWUgeW91IHVzZSBpdC4KCkBpdGVtIC0ta2V5c2VydmVyLW9w +dGlvbnMgQGNvZGV7bmFtZT12YWx1ZX0KQG9waW5kZXgga2V5c2VydmVyLW9wdGlv +bnMKVGhpcyBpcyBhIHNwYWNlIG9yIGNvbW1hIGRlbGltaXRlZCBzdHJpbmcgdGhh +dCBnaXZlcyBvcHRpb25zIGZvciB0aGUKa2V5c2VydmVyLiBPcHRpb25zIGNhbiBi +ZSBwcmVmaXhlZCB3aXRoIGEgYG5vLScgdG8gZ2l2ZSB0aGUgb3Bwb3NpdGUKbWVh +bmluZy4gVmFsaWQgaW1wb3J0LW9wdGlvbnMgb3IgZXhwb3J0LW9wdGlvbnMgbWF5 +IGJlIHVzZWQgaGVyZSBhcwp3ZWxsIHRvIGFwcGx5IHRvIGltcG9ydGluZyAoQG9w +dGlvbnstLXJlY3Yta2V5fSkgb3IgZXhwb3J0aW5nCihAb3B0aW9uey0tc2VuZC1r +ZXl9KSBhIGtleSBmcm9tIGEga2V5c2VydmVyLiBXaGlsZSBub3QgYWxsIG9wdGlv +bnMKYXJlIGF2YWlsYWJsZSBmb3IgYWxsIGtleXNlcnZlciB0eXBlcywgc29tZSBj +b21tb24gb3B0aW9ucyBhcmU6CgpAdGFibGUgQGFzaXMKCiAgQGl0ZW0gaW5jbHVk +ZS1yZXZva2VkCiAgV2hlbiBzZWFyY2hpbmcgZm9yIGEga2V5IHdpdGggQG9wdGlv +bnstLXNlYXJjaC1rZXlzfSwgaW5jbHVkZSBrZXlzIHRoYXQKICBhcmUgbWFya2Vk +IG9uIHRoZSBrZXlzZXJ2ZXIgYXMgcmV2b2tlZC4gTm90ZSB0aGF0IG5vdCBhbGwg +a2V5c2VydmVycwogIGRpZmZlcmVudGlhdGUgYmV0d2VlbiByZXZva2VkIGFuZCB1 +bnJldm9rZWQga2V5cywgYW5kIGZvciBzdWNoCiAga2V5c2VydmVycyB0aGlzIG9w +dGlvbiBpcyBtZWFuaW5nbGVzcy4gTm90ZSBhbHNvIHRoYXQgbW9zdCBrZXlzZXJ2 +ZXJzIGRvCiAgbm90IGhhdmUgY3J5cHRvZ3JhcGhpYyB2ZXJpZmljYXRpb24gb2Yg +a2V5IHJldm9jYXRpb25zLCBhbmQgc28gdHVybmluZwogIHRoaXMgb3B0aW9uIG9m +ZiBtYXkgcmVzdWx0IGluIHNraXBwaW5nIGtleXMgdGhhdCBhcmUgaW5jb3JyZWN0 +bHkgbWFya2VkCiAgYXMgcmV2b2tlZC4KCiAgQGl0ZW0gaW5jbHVkZS1kaXNhYmxl +ZAogIFdoZW4gc2VhcmNoaW5nIGZvciBhIGtleSB3aXRoIEBvcHRpb257LS1zZWFy +Y2gta2V5c30sIGluY2x1ZGUga2V5cyB0aGF0CiAgYXJlIG1hcmtlZCBvbiB0aGUg +a2V5c2VydmVyIGFzIGRpc2FibGVkLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gaXMg +bm90CiAgdXNlZCB3aXRoIEhLUCBrZXlzZXJ2ZXJzLgoKICBAaXRlbSBhdXRvLWtl +eS1yZXRyaWV2ZQogIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIGF1dG9tYXRpYyBy +ZXRyaWV2aW5nIG9mIGtleXMgZnJvbSBhIGtleXNlcnZlcgogIHdoZW4gdmVyaWZ5 +aW5nIHNpZ25hdHVyZXMgbWFkZSBieSBrZXlzIHRoYXQgYXJlIG5vdCBvbiB0aGUg +bG9jYWwKICBrZXlyaW5nLgoKICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gbWFrZXMg +YSAid2ViIGJ1ZyIgbGlrZSBiZWhhdmlvciBwb3NzaWJsZS4KICBLZXlzZXJ2ZXIg +b3BlcmF0b3JzIGNhbiBzZWUgd2hpY2gga2V5cyB5b3UgcmVxdWVzdCwgc28gYnkg +c2VuZGluZyB5b3UKICBhIG1lc3NhZ2Ugc2lnbmVkIGJ5IGEgYnJhbmQgbmV3IGtl +eSAod2hpY2ggeW91IG5hdHVyYWxseSB3aWxsIG5vdCBoYXZlCiAgb24geW91ciBs +b2NhbCBrZXlyaW5nKSwgdGhlIG9wZXJhdG9yIGNhbiB0ZWxsIGJvdGggeW91ciBJ +UCBhZGRyZXNzIGFuZAogIHRoZSB0aW1lIHdoZW4geW91IHZlcmlmaWVkIHRoZSBz +aWduYXR1cmUuCgogIEBpdGVtIGhvbm9yLWtleXNlcnZlci11cmwKICBXaGVuIHVz +aW5nIEBvcHRpb257LS1yZWZyZXNoLWtleXN9LCBpZiB0aGUga2V5IGluIHF1ZXN0 +aW9uIGhhcyBhIHByZWZlcnJlZAogIGtleXNlcnZlciBVUkwsIHRoZW4gdXNlIHRo +YXQgcHJlZmVycmVkIGtleXNlcnZlciB0byByZWZyZXNoIHRoZSBrZXkKICBmcm9t +LiBJbiBhZGRpdGlvbiwgaWYgYXV0by1rZXktcmV0cmlldmUgaXMgc2V0LCBhbmQg +dGhlIHNpZ25hdHVyZQogIGJlaW5nIHZlcmlmaWVkIGhhcyBhIHByZWZlcnJlZCBr +ZXlzZXJ2ZXIgVVJMLCB0aGVuIHVzZSB0aGF0IHByZWZlcnJlZAogIGtleXNlcnZl +ciB0byBmZXRjaCB0aGUga2V5IGZyb20uIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBp +bnRyb2R1Y2VzIGEKICAid2ViIGJ1ZyI6IFRoZSBjcmVhdG9yIG9mIHRoZSBrZXkg +Y2FuIHNlZSB3aGVuIHRoZSBrZXlzIGlzCiAgcmVmcmVzaGVkLiAgVGh1cyB0aGlz +IG9wdGlvbiBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LgoKICBAaXRlbSBob25v +ci1wa2EtcmVjb3JkCiAgSWYgYXV0by1rZXktcmV0cmlldmUgaXMgc2V0LCBhbmQg +dGhlIHNpZ25hdHVyZSBiZWluZyB2ZXJpZmllZCBoYXMgYQogIFBLQSByZWNvcmQs +IHRoZW4gdXNlIHRoZSBQS0EgaW5mb3JtYXRpb24gdG8gZmV0Y2ggdGhlIGtleS4g +RGVmYXVsdHMKICB0byAieWVzIi4KCiAgQGl0ZW0gaW5jbHVkZS1zdWJrZXlzCiAg +V2hlbiByZWNlaXZpbmcgYSBrZXksIGluY2x1ZGUgc3Via2V5cyBhcyBwb3RlbnRp +YWwgdGFyZ2V0cy4gTm90ZSB0aGF0CiAgdGhpcyBvcHRpb24gaXMgbm90IHVzZWQg +d2l0aCBIS1Aga2V5c2VydmVycywgYXMgdGhleSBkbyBub3Qgc3VwcG9ydAogIHJl +dHJpZXZpbmcga2V5cyBieSBzdWJrZXkgaWQuCgogIEBpdGVtIHRpbWVvdXQKICBU +ZWxsIHRoZSBrZXlzZXJ2ZXIgaGVscGVyIHByb2dyYW0gaG93IGxvbmcgKGluIHNl +Y29uZHMpIHRvIHRyeSBhbmQKICBwZXJmb3JtIGEga2V5c2VydmVyIGFjdGlvbiBi +ZWZvcmUgZ2l2aW5nIHVwLiBOb3RlIHRoYXQgcGVyZm9ybWluZwogIG11bHRpcGxl +IGFjdGlvbnMgYXQgdGhlIHNhbWUgdGltZSB1c2VzIHRoaXMgdGltZW91dCB2YWx1 +ZSBwZXIgYWN0aW9uLgogIEZvciBleGFtcGxlLCB3aGVuIHJldHJpZXZpbmcgbXVs +dGlwbGUga2V5cyB2aWEgQG9wdGlvbnstLXJlY3Yta2V5c30sIHRoZQogIHRpbWVv +dXQgYXBwbGllcyBzZXBhcmF0ZWx5IHRvIGVhY2gga2V5IHJldHJpZXZhbCwgYW5k +IG5vdCB0byB0aGUKICBAb3B0aW9uey0tcmVjdi1rZXlzfSBjb21tYW5kIGFzIGEg +d2hvbGUuIERlZmF1bHRzIHRvIDMwIHNlY29uZHMuCgogIEBpdGVtIGh0dHAtcHJv +eHk9QGNvZGV7dmFsdWV9CiAgVGhpcyBvcHRpb25zIGlzIGRlcHJlY2F0ZWQuCiAg +U2V0IHRoZSBwcm94eSB0byB1c2UgZm9yIEhUVFAgYW5kIEhLUCBrZXlzZXJ2ZXJz +LgogIFRoaXMgb3ZlcnJpZGVzIGFueSBwcm94eSBkZWZpbmVkIGluIEBmaWxle2Rp +cm1uZ3IuY29uZn0uCgogIEBpdGVtIHZlcmJvc2UKICBUaGlzIG9wdGlvbiBoYXMg +bm8gbW9yZSBmdW5jdGlvbiBzaW5jZSBHbnVQRyAyLjEuICBVc2UgdGhlCiAgQGNv +ZGV7ZGlybW5ncn0gY29uZmlndXJhdGlvbiBvcHRpb25zIGluc3RlYWQuCgogIEBp +dGVtIGRlYnVnCiAgVGhpcyBvcHRpb24gaGFzIG5vIG1vcmUgZnVuY3Rpb24gc2lu +Y2UgR251UEcgMi4xLiAgVXNlIHRoZQogIEBjb2Rle2Rpcm1uZ3J9IGNvbmZpZ3Vy +YXRpb24gb3B0aW9ucyBpbnN0ZWFkLgoKICBAaXRlbSBjaGVjay1jZXJ0CiAgVGhp +cyBvcHRpb24gaGFzIG5vIG1vcmUgZnVuY3Rpb24gc2luY2UgR251UEcgMi4xLiAg +VXNlIHRoZQogIEBjb2Rle2Rpcm1uZ3J9IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBp +bnN0ZWFkLgoKICBAaXRlbSBjYS1jZXJ0LWZpbGUKICBUaGlzIG9wdGlvbiBoYXMg +bm8gbW9yZSBmdW5jdGlvbiBzaW5jZSBHbnVQRyAyLjEuICBVc2UgdGhlCiAgQGNv +ZGV7ZGlybW5ncn0gY29uZmlndXJhdGlvbiBvcHRpb25zIGluc3RlYWQuCgpAZW5k +IHRhYmxlCgpAaXRlbSAtLWNvbXBsZXRlcy1uZWVkZWQgQGNvZGV7bn0KQG9waW5k +ZXggY29tcGxpYW50LW5lZWRlZApOdW1iZXIgb2YgY29tcGxldGVseSB0cnVzdGVk +IHVzZXJzIHRvIGludHJvZHVjZSBhIG5ldwprZXkgc2lnbmVyIChkZWZhdWx0cyB0 +byAxKS4KCkBpdGVtIC0tbWFyZ2luYWxzLW5lZWRlZCBAY29kZXtufQpAb3BpbmRl +eCBtYXJnaW5hbHMtbmVlZGVkCk51bWJlciBvZiBtYXJnaW5hbGx5IHRydXN0ZWQg +dXNlcnMgdG8gaW50cm9kdWNlIGEgbmV3CmtleSBzaWduZXIgKGRlZmF1bHRzIHRv +IDMpCgpAaXRlbSAtLXRvZnUtZGVmYXVsdC1wb2xpY3kgQGNvZGV7YXV0b3xnb29k +fHVua25vd258YmFkfGFza30KQG9waW5kZXggdG9mdS1kZWZhdWx0LXBvbGljeQpU +aGUgZGVmYXVsdCBUT0ZVIHBvbGljeSAoZGVmYXVsdHMgdG8gQGNvZGV7YXV0b30p +LiAgRm9yIG1vcmUKaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lYW5pbmcgb2YgdGhp +cyBvcHRpb24sIEB4cmVme3RydXN0LW1vZGVsLXRvZnV9LgoKQGl0ZW0gLS10b2Z1 +LWRiLWZvcm1hdCBAY29kZXthdXRvfHNwbGl0fGZsYXR9CkBvcGluZGV4IHRvZnUt +ZGVmYXVsdC1wb2xpY3kKVGhlIGZvcm1hdCBmb3IgdGhlIFRPRlUgREIuCgpUaGUg +c3BsaXQgZmlsZSBmb3JtYXQgc3BsaXRzIHRoZSBkYXRhIGFjcm9zcyBtYW55IERC +cyB1bmRlciB0aGUKQGNvZGV7dG9mdS5kfSBkaXJlY3RvcnkgKG9uZSBwZXIgZW1h +aWwgYWRkcmVzcyBhbmQgb25lIHBlciBrZXkpLiAgVGhpcwptYWtlcyBpdCBlYXNp +ZXIgdG8gYXV0b21hdGljYWxseSBzeW5jaHJvbml6ZSB0aGUgZGF0YSB1c2luZyBh +IHRvb2wKc3VjaCBhcyBVbmlzb24gKEB1cmx7aHR0cHM6Ly93d3cuY2lzLnVwZW5u +LmVkdS9+YmNwaWVyY2UvdW5pc29uL30pLApzaW5jZSB0aGUgaW5kaXZpZHVhbCBm +aWxlcyBjaGFuZ2UgcmFyZWx5LgoKVGhlIGZsYXQgZmlsZSBmb3JtYXQga2VlcHMg +YWxsIG9mIHRoZSBkYXRhIGluIHRoZSBzaW5nbGUgZmlsZQpAY29kZXt0b2Z1LmRi +fS4gIFRoaXMgZm9ybWF0IHJlc3VsdHMgaW4gYmV0dGVyIHBlcmZvcm1hbmNlLgoK +SWYgc2V0IHRvIGF1dG8gKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgR251UEcgd2ls +bCBmaXJzdCBjaGVjayBmb3IgdGhlCmV4aXN0ZW5jZSBvZiBAY29kZXt0b2Z1LmR9 +IGFuZCBAY29kZXt0b2Z1LmRifS4gIElmIG9uZSBvZiB0aGVzZQpleGlzdHMsIHRo +ZSBjb3JyZXNwb25kaW5nIGZvcm1hdCBpcyB1c2VkLiAgSWYgbmVpdGhlciBvciBi +b3RoIG9mIHRoZXNlCmV4aXN0LCB0aGVuIEdudVBHIGRlZmF1bHRzIHRvIHRoZSBA +Y29kZXtzcGxpdH0gZm9ybWF0LiAgSW4gdGhlIGxhdHRlcgpjYXNlLCBhIHdhcm5p +bmcgaXMgZW1pdHRlZC4KCkBpdGVtIC0tbWF4LWNlcnQtZGVwdGggQGNvZGV7bn0K +QG9waW5kZXggbWF4LWNlcnQtZGVwdGgKTWF4aW11bSBkZXB0aCBvZiBhIGNlcnRp +ZmljYXRpb24gY2hhaW4gKGRlZmF1bHQgaXMgNSkuCgpAaXRlbSAtLW5vLXNpZy1j +YWNoZQpAb3BpbmRleCBuby1zaWctY2FjaGUKRG8gbm90IGNhY2hlIHRoZSB2ZXJp +ZmljYXRpb24gc3RhdHVzIG9mIGtleSBzaWduYXR1cmVzLgpDYWNoaW5nIGdpdmVz +IGEgbXVjaCBiZXR0ZXIgcGVyZm9ybWFuY2UgaW4ga2V5IGxpc3RpbmdzLiBIb3dl +dmVyLCBpZgp5b3Ugc3VzcGVjdCB0aGF0IHlvdXIgcHVibGljIGtleXJpbmcgaXMg +bm90IHNhdmUgYWdhaW5zdCB3cml0ZQptb2RpZmljYXRpb25zLCB5b3UgY2FuIHVz +ZSB0aGlzIG9wdGlvbiB0byBkaXNhYmxlIHRoZSBjYWNoaW5nLiBJdApwcm9iYWJs +eSBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGRpc2FibGUgaXQgYmVjYXVzZSBhbGwg +a2luZCBvZiBkYW1hZ2UKY2FuIGJlIGRvbmUgaWYgc29tZW9uZSBlbHNlIGhhcyB3 +cml0ZSBhY2Nlc3MgdG8geW91ciBwdWJsaWMga2V5cmluZy4KCkBpdGVtIC0tYXV0 +by1jaGVjay10cnVzdGRiCkBpdGVteCAtLW5vLWF1dG8tY2hlY2stdHJ1c3RkYgpA +b3BpbmRleCBhdXRvLWNoZWNrLXRydXN0ZGIKSWYgR251UEcgZmVlbHMgdGhhdCBp +dHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFdlYiBvZiBUcnVzdCBoYXMgdG8gYmUK +dXBkYXRlZCwgaXQgYXV0b21hdGljYWxseSBydW5zIHRoZSBAb3B0aW9uey0tY2hl +Y2stdHJ1c3RkYn0gY29tbWFuZAppbnRlcm5hbGx5LiAgVGhpcyBtYXkgYmUgYSB0 +aW1lIGNvbnN1bWluZwpwcm9jZXNzLiBAb3B0aW9uey0tbm8tYXV0by1jaGVjay10 +cnVzdGRifSBkaXNhYmxlcyB0aGlzIG9wdGlvbi4KCkBpdGVtIC0tdXNlLWFnZW50 +CkBpdGVteCAtLW5vLXVzZS1hZ2VudApAb3BpbmRleCB1c2UtYWdlbnQKVGhpcyBp +cyBkdW1teSBvcHRpb24uIEBjb21tYW5ke0BncGduYW1lfSBhbHdheXMgcmVxdWly +ZXMgdGhlIGFnZW50LgoKQGl0ZW0gLS1ncGctYWdlbnQtaW5mbwpAb3BpbmRleCBn +cGctYWdlbnQtaW5mbwpUaGlzIGlzIGR1bW15IG9wdGlvbi4gSXQgaGFzIG5vIGVm +ZmVjdCB3aGVuIHVzZWQgd2l0aCBAY29tbWFuZHtncGcyfS4KCgpAaXRlbSAtLWFn +ZW50LXByb2dyYW0gQHZhcntmaWxlfQpAb3BpbmRleCBhZ2VudC1wcm9ncmFtClNw +ZWNpZnkgYW4gYWdlbnQgcHJvZ3JhbSB0byBiZSB1c2VkIGZvciBzZWNyZXQga2V5 +IG9wZXJhdGlvbnMuICBUaGUKZGVmYXVsdCB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5 +IHJ1bm5pbmcgQGNvbW1hbmR7Z3BnY29uZn0gd2l0aCB0aGUKb3B0aW9uIEBvcHRp +b257LS1saXN0LWRpcnN9LiAgTm90ZSB0aGF0IHRoZSBwaXBlIHN5bWJvbCAoQGNv +ZGV7fH0pIGlzCnVzZWQgZm9yIGEgcmVncmVzc2lvbiB0ZXN0IHN1aXRlIGhhY2sg +YW5kIG1heSB0aHVzIG5vdCBiZSB1c2VkIGluIHRoZQpmaWxlIG5hbWUuCgpAaXRl +bSAtLWRpcm1uZ3ItcHJvZ3JhbSBAdmFye2ZpbGV9CkBvcGluZGV4IGRpcm1uZ3It +cHJvZ3JhbQpTcGVjaWZ5IGEgZGlybW5nciBwcm9ncmFtIHRvIGJlIHVzZWQgZm9y +IGtleXNlcnZlciBhY2Nlc3MuICBUaGUKZGVmYXVsdCB2YWx1ZSBpcyBAZmlsZXtA +dmFsdWV7QklORElSfS9kaXJtbmdyfS4gIFRoaXMgaXMgb25seSB1c2VkIGFzIGEK +ZmFsbGJhY2sgd2hlbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7RElS +TU5HUl9JTkZPfSBpcyBub3Qgc2V0IG9yCmEgcnVubmluZyBkaXJtbmdyIGNhbm5v +dCBiZSBjb25uZWN0ZWQuCgpAaXRlbSAtLW5vLWF1dG9zdGFydApAb3BpbmRleCBu +by1hdXRvc3RhcnQKRG8gbm90IHN0YXJ0IHRoZSBncGctYWdlbnQgb3IgdGhlIGRp +cm1uZ3IgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbgpzdGFydGVkIGFuZCBpdHMgc2Vy +dmljZSBpcyByZXF1aXJlZC4gIFRoaXMgb3B0aW9uIGlzIG1vc3RseSB1c2VmdWwg +b24KbWFjaGluZXMgd2hlcmUgdGhlIGNvbm5lY3Rpb24gdG8gZ3BnLWFnZW50IGhh +cyBiZWVuIHJlZGlyZWN0ZWQgdG8KYW5vdGhlciBtYWNoaW5lcy4gIElmIGRpcm1u +Z3IgaXMgcmVxdWlyZWQgb24gdGhlIHJlbW90ZSBtYWNoaW5lLCBpdAptYXkgYmUg +c3RhcnRlZCBtYW51YWxseSB1c2luZyBAY29tbWFuZHtncGdjb25mIC0tbGF1bmNo +IGRpcm1uZ3J9LgoKQGl0ZW0gLS1sb2NrLW9uY2UKQG9waW5kZXggbG9jay1vbmNl +CkxvY2sgdGhlIGRhdGFiYXNlcyB0aGUgZmlyc3QgdGltZSBhIGxvY2sgaXMgcmVx +dWVzdGVkCmFuZCBkbyBub3QgcmVsZWFzZSB0aGUgbG9jayB1bnRpbCB0aGUgcHJv +Y2Vzcwp0ZXJtaW5hdGVzLgoKQGl0ZW0gLS1sb2NrLW11bHRpcGxlCkBvcGluZGV4 +IGxvY2stbXVsdGlwbGUKUmVsZWFzZSB0aGUgbG9ja3MgZXZlcnkgdGltZSBhIGxv +Y2sgaXMgbm8gbG9uZ2VyCm5lZWRlZC4gVXNlIHRoaXMgdG8gb3ZlcnJpZGUgYSBw +cmV2aW91cyBAb3B0aW9uey0tbG9jay1vbmNlfQpmcm9tIGEgY29uZmlnIGZpbGUu +CgpAaXRlbSAtLWxvY2stbmV2ZXIKQG9waW5kZXggbG9jay1uZXZlcgpEaXNhYmxl +IGxvY2tpbmcgZW50aXJlbHkuIFRoaXMgb3B0aW9uIHNob3VsZCBiZSB1c2VkIG9u +bHkgaW4gdmVyeQpzcGVjaWFsIGVudmlyb25tZW50cywgd2hlcmUgaXQgY2FuIGJl +IGFzc3VyZWQgdGhhdCBvbmx5IG9uZSBwcm9jZXNzCmlzIGFjY2Vzc2luZyB0aG9z +ZSBmaWxlcy4gQSBib290YWJsZSBmbG9wcHkgd2l0aCBhIHN0YW5kLWFsb25lCmVu +Y3J5cHRpb24gc3lzdGVtIHdpbGwgcHJvYmFibHkgdXNlIHRoaXMuIEltcHJvcGVy +IHVzYWdlIG9mIHRoaXMKb3B0aW9uIG1heSBsZWFkIHRvIGRhdGEgYW5kIGtleSBj +b3JydXB0aW9uLgoKQGl0ZW0gLS1leGl0LW9uLXN0YXR1cy13cml0ZS1lcnJvcgpA +b3BpbmRleCBleGl0LW9uLXN0YXR1cy13cml0ZS1lcnJvcgpUaGlzIG9wdGlvbiB3 +aWxsIGNhdXNlIHdyaXRlIGVycm9ycyBvbiB0aGUgc3RhdHVzIEZEIHRvIGltbWVk +aWF0ZWx5CnRlcm1pbmF0ZSB0aGUgcHJvY2Vzcy4gVGhhdCBzaG91bGQgaW4gZmFj +dCBiZSB0aGUgZGVmYXVsdCBidXQgaXQgbmV2ZXIKd29ya2VkIHRoaXMgd2F5IGFu +ZCB0aHVzIHdlIG5lZWQgYW4gb3B0aW9uIHRvIGVuYWJsZSB0aGlzLCBzbyB0aGF0 +IHRoZQpjaGFuZ2Ugd29uJ3QgYnJlYWsgYXBwbGljYXRpb25zIHdoaWNoIGNsb3Nl +IHRoZWlyIGVuZCBvZiBhIHN0YXR1cyBmZApjb25uZWN0ZWQgcGlwZSB0b28gZWFy +bHkuIFVzaW5nIHRoaXMgb3B0aW9uIGFsb25nIHdpdGgKQG9wdGlvbnstLWVuYWJs +ZS1wcm9ncmVzcy1maWx0ZXJ9IG1heSBiZSB1c2VkIHRvIGNsZWFubHkgY2FuY2Vs +IGxvbmcKcnVubmluZyBncGcgb3BlcmF0aW9ucy4KCkBpdGVtIC0tbGltaXQtY2Fy +ZC1pbnNlcnQtdHJpZXMgQGNvZGV7bn0KQG9waW5kZXggbGltaXQtY2FyZC1pbnNl +cnQtdHJpZXMKV2l0aCBAY29kZXtufSBncmVhdGVyIHRoYW4gMCB0aGUgbnVtYmVy +IG9mIHByb21wdHMgYXNraW5nIHRvIGluc2VydCBhCnNtYXJ0Y2FyZCBnZXRzIGxp +bWl0ZWQgdG8gTi0xLiBUaHVzIHdpdGggYSB2YWx1ZSBvZiAxIGdwZyB3b24ndCBh +dAphbGwgYXNrIHRvIGluc2VydCBhIGNhcmQgaWYgbm9uZSBoYXMgYmVlbiBpbnNl +cnRlZCBhdCBzdGFydHVwLiBUaGlzCm9wdGlvbiBpcyB1c2VmdWwgaW4gdGhlIGNv +bmZpZ3VyYXRpb24gZmlsZSBpbiBjYXNlIGFuIGFwcGxpY2F0aW9uIGRvZXMKbm90 +IGtub3cgYWJvdXQgdGhlIHNtYXJ0Y2FyZCBzdXBwb3J0IGFuZCB3YWl0cyBhZCBp +bmZpbml0dW0gZm9yIGFuCmluc2VydGVkIGNhcmQuCgpAaXRlbSAtLW5vLXJhbmRv +bS1zZWVkLWZpbGUKQG9waW5kZXggbm8tcmFuZG9tLXNlZWQtZmlsZQpHbnVQRyB1 +c2VzIGEgZmlsZSB0byBzdG9yZSBpdHMgaW50ZXJuYWwgcmFuZG9tIHBvb2wgb3Zl +ciBpbnZvY2F0aW9ucy4KVGhpcyBtYWtlcyByYW5kb20gZ2VuZXJhdGlvbiBmYXN0 +ZXI7IGhvd2V2ZXIgc29tZXRpbWVzIHdyaXRlIG9wZXJhdGlvbnMKYXJlIG5vdCBk +ZXNpcmVkLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIHRoYXQg +d2l0aCB0aGUgY29zdCBvZgpzbG93ZXIgcmFuZG9tIGdlbmVyYXRpb24uCgpAaXRl +bSAtLW5vLWdyZWV0aW5nCkBvcGluZGV4IG5vLWdyZWV0aW5nClN1cHByZXNzIHRo +ZSBpbml0aWFsIGNvcHlyaWdodCBtZXNzYWdlLgoKQGl0ZW0gLS1uby1zZWNtZW0t +d2FybmluZwpAb3BpbmRleCBuby1zZWNtZW0td2FybmluZwpTdXBwcmVzcyB0aGUg +d2FybmluZyBhYm91dCAidXNpbmcgaW5zZWN1cmUgbWVtb3J5Ii4KCkBpdGVtIC0t +bm8tcGVybWlzc2lvbi13YXJuaW5nCkBvcGluZGV4IHBlcm1pc3Npb24td2Fybmlu +ZwpTdXBwcmVzcyB0aGUgd2FybmluZyBhYm91dCB1bnNhZmUgZmlsZSBhbmQgaG9t +ZSBkaXJlY3RvcnkgKEBvcHRpb257LS1ob21lZGlyfSkKcGVybWlzc2lvbnMuIE5v +dGUgdGhhdCB0aGUgcGVybWlzc2lvbiBjaGVja3MgdGhhdCBHbnVQRyBwZXJmb3Jt +cyBhcmUKbm90IGludGVuZGVkIHRvIGJlIGF1dGhvcml0YXRpdmUsIGJ1dCByYXRo +ZXIgdGhleSBzaW1wbHkgd2FybiBhYm91dApjZXJ0YWluIGNvbW1vbiBwZXJtaXNz +aW9uIHByb2JsZW1zLiBEbyBub3QgYXNzdW1lIHRoYXQgdGhlIGxhY2sgb2YgYQp3 +YXJuaW5nIG1lYW5zIHRoYXQgeW91ciBzeXN0ZW0gaXMgc2VjdXJlLgoKTm90ZSB0 +aGF0IHRoZSB3YXJuaW5nIGZvciB1bnNhZmUgQG9wdGlvbnstLWhvbWVkaXJ9IHBl +cm1pc3Npb25zIGNhbm5vdCBiZQpzdXBwcmVzc2VkIGluIHRoZSBncGcuY29uZiBm +aWxlLCBhcyB0aGlzIHdvdWxkIGFsbG93IGFuIGF0dGFja2VyIHRvCnBsYWNlIGFu +IHVuc2FmZSBncGcuY29uZiBmaWxlIGluIHBsYWNlLCBhbmQgdXNlIHRoaXMgZmls +ZSB0byBzdXBwcmVzcwp3YXJuaW5ncyBhYm91dCBpdHNlbGYuIFRoZSBAb3B0aW9u +ey0taG9tZWRpcn0gcGVybWlzc2lvbnMgd2FybmluZyBtYXkgb25seSBiZQpzdXBw +cmVzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuCgpAaXRlbSAtLW5vLW1kYy13YXJu +aW5nCkBvcGluZGV4IG5vLW1kYy13YXJuaW5nClN1cHByZXNzIHRoZSB3YXJuaW5n +IGFib3V0IG1pc3NpbmcgTURDIGludGVncml0eSBwcm90ZWN0aW9uLgoKQGl0ZW0g +LS1yZXF1aXJlLXNlY21lbQpAaXRlbXggLS1uby1yZXF1aXJlLXNlY21lbQpAb3Bp +bmRleCByZXF1aXJlLXNlY21lbQpSZWZ1c2UgdG8gcnVuIGlmIEdudVBHIGNhbm5v +dCBnZXQgc2VjdXJlIG1lbW9yeS4gRGVmYXVsdHMgdG8gbm8KKGkuZS4gcnVuLCBi +dXQgZ2l2ZSBhIHdhcm5pbmcpLgoKCkBpdGVtIC0tcmVxdWlyZS1jcm9zcy1jZXJ0 +aWZpY2F0aW9uCkBpdGVteCAtLW5vLXJlcXVpcmUtY3Jvc3MtY2VydGlmaWNhdGlv +bgpAb3BpbmRleCByZXF1aXJlLWNyb3NzLWNlcnRpZmljYXRpb24KV2hlbiB2ZXJp +ZnlpbmcgYSBzaWduYXR1cmUgbWFkZSBmcm9tIGEgc3Via2V5LCBlbnN1cmUgdGhh +dCB0aGUgY3Jvc3MKY2VydGlmaWNhdGlvbiAiYmFjayBzaWduYXR1cmUiIG9uIHRo +ZSBzdWJrZXkgaXMgcHJlc2VudCBhbmQgdmFsaWQuICBUaGlzCnByb3RlY3RzIGFn +YWluc3QgYSBzdWJ0bGUgYXR0YWNrIGFnYWluc3Qgc3Via2V5cyB0aGF0IGNhbiBz +aWduLgpEZWZhdWx0cyB0byBAb3B0aW9uey0tcmVxdWlyZS1jcm9zcy1jZXJ0aWZp +Y2F0aW9ufSBmb3IKQGNvbW1hbmR7QGdwZ25hbWV9LgoKQGl0ZW0gLS1leHBlcnQK +QGl0ZW14IC0tbm8tZXhwZXJ0CkBvcGluZGV4IGV4cGVydApBbGxvdyB0aGUgdXNl +ciB0byBkbyBjZXJ0YWluIG5vbnNlbnNpY2FsIG9yICJzaWxseSIgdGhpbmdzIGxp +a2UKc2lnbmluZyBhbiBleHBpcmVkIG9yIHJldm9rZWQga2V5LCBvciBjZXJ0YWlu +IHBvdGVudGlhbGx5IGluY29tcGF0aWJsZQp0aGluZ3MgbGlrZSBnZW5lcmF0aW5n +IHVudXN1YWwga2V5IHR5cGVzLiBUaGlzIGFsc28gZGlzYWJsZXMgY2VydGFpbgp3 +YXJuaW5nIG1lc3NhZ2VzIGFib3V0IHBvdGVudGlhbGx5IGluY29tcGF0aWJsZSBh +Y3Rpb25zLiBBcyB0aGUgbmFtZQppbXBsaWVzLCB0aGlzIG9wdGlvbiBpcyBmb3Ig +ZXhwZXJ0cyBvbmx5LiBJZiB5b3UgZG9uJ3QgZnVsbHkKdW5kZXJzdGFuZCB0aGUg +aW1wbGljYXRpb25zIG9mIHdoYXQgaXQgYWxsb3dzIHlvdSB0byBkbywgbGVhdmUg +dGhpcwpvZmYuIEBvcHRpb257LS1uby1leHBlcnR9IGRpc2FibGVzIHRoaXMgb3B0 +aW9uLgoKQGVuZCB0YWJsZQoKCkBjICoqKioqKioqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioqKioKQGMgKioqKioqKiogIEtFWSBSRUxBVEVEIE9QVElP +TlMgICoqKioqKioqKioqKgpAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioqCkBub2RlIEdQRyBLZXkgcmVsYXRlZCBPcHRpb25zCkBz +dWJzZWN0aW9uIEtleSByZWxhdGVkIG9wdGlvbnMKCkB0YWJsZSBAZ251cGd0YWJv +cHQKCkBpdGVtIC0tcmVjaXBpZW50IEB2YXJ7bmFtZX0KQGl0ZW14IC1yCkBvcGlu +ZGV4IHJlY2lwaWVudApFbmNyeXB0IGZvciB1c2VyIGlkIEB2YXJ7bmFtZX0uIElm +IHRoaXMgb3B0aW9uIG9yCkBvcHRpb257LS1oaWRkZW4tcmVjaXBpZW50fSBpcyBu +b3Qgc3BlY2lmaWVkLCBHbnVQRyBhc2tzIGZvciB0aGUgdXNlci1pZAp1bmxlc3Mg +QG9wdGlvbnstLWRlZmF1bHQtcmVjaXBpZW50fSBpcyBnaXZlbi4KCkBpdGVtIC0t +aGlkZGVuLXJlY2lwaWVudCBAdmFye25hbWV9CkBpdGVteCAtUgpAb3BpbmRleCBo +aWRkZW4tcmVjaXBpZW50CkVuY3J5cHQgZm9yIHVzZXIgSUQgQHZhcntuYW1lfSwg +YnV0IGhpZGUgdGhlIGtleSBJRCBvZiB0aGlzIHVzZXIncwprZXkuIFRoaXMgb3B0 +aW9uIGhlbHBzIHRvIGhpZGUgdGhlIHJlY2VpdmVyIG9mIHRoZSBtZXNzYWdlIGFu +ZCBpcyBhCmxpbWl0ZWQgY291bnRlcm1lYXN1cmUgYWdhaW5zdCB0cmFmZmljIGFu +YWx5c2lzLiBJZiB0aGlzIG9wdGlvbiBvcgpAb3B0aW9uey0tcmVjaXBpZW50fSBp +cyBub3Qgc3BlY2lmaWVkLCBHbnVQRyBhc2tzIGZvciB0aGUgdXNlciBJRCB1bmxl +c3MKQG9wdGlvbnstLWRlZmF1bHQtcmVjaXBpZW50fSBpcyBnaXZlbi4KCkBpdGVt +IC0tZW5jcnlwdC10byBAY29kZXtuYW1lfQpAb3BpbmRleCBlbmNyeXB0LXRvClNh +bWUgYXMgQG9wdGlvbnstLXJlY2lwaWVudH0gYnV0IHRoaXMgb25lIGlzIGludGVu +ZGVkIGZvciB1c2UgaW4gdGhlCm9wdGlvbnMgZmlsZSBhbmQgbWF5IGJlIHVzZWQg +d2l0aCB5b3VyIG93biB1c2VyLWlkIGFzIGFuCiJlbmNyeXB0LXRvLXNlbGYiLiBU +aGVzZSBrZXlzIGFyZSBvbmx5IHVzZWQgd2hlbiB0aGVyZSBhcmUgb3RoZXIKcmVj +aXBpZW50cyBnaXZlbiBlaXRoZXIgYnkgdXNlIG9mIEBvcHRpb257LS1yZWNpcGll +bnR9IG9yIGJ5IHRoZSBhc2tlZAp1c2VyIGlkLiAgTm8gdHJ1c3QgY2hlY2tpbmcg +aXMgcGVyZm9ybWVkIGZvciB0aGVzZSB1c2VyIGlkcyBhbmQgZXZlbgpkaXNhYmxl +ZCBrZXlzIGNhbiBiZSB1c2VkLgoKQGl0ZW0gLS1oaWRkZW4tZW5jcnlwdC10byBA +Y29kZXtuYW1lfQpAb3BpbmRleCBoaWRkZW4tZW5jcnlwdC10bwpTYW1lIGFzIEBv +cHRpb257LS1oaWRkZW4tcmVjaXBpZW50fSBidXQgdGhpcyBvbmUgaXMgaW50ZW5k +ZWQgZm9yIHVzZSBpbiB0aGUKb3B0aW9ucyBmaWxlIGFuZCBtYXkgYmUgdXNlZCB3 +aXRoIHlvdXIgb3duIHVzZXItaWQgYXMgYSBoaWRkZW4KImVuY3J5cHQtdG8tc2Vs +ZiIuIFRoZXNlIGtleXMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZXJlIGFyZSBvdGhl +cgpyZWNpcGllbnRzIGdpdmVuIGVpdGhlciBieSB1c2Ugb2YgQG9wdGlvbnstLXJl +Y2lwaWVudH0gb3IgYnkgdGhlIGFza2VkIHVzZXIgaWQuCk5vIHRydXN0IGNoZWNr +aW5nIGlzIHBlcmZvcm1lZCBmb3IgdGhlc2UgdXNlciBpZHMgYW5kIGV2ZW4gZGlz +YWJsZWQKa2V5cyBjYW4gYmUgdXNlZC4KCkBpdGVtIC0tZW5jcnlwdC10by1kZWZh +dWx0LWtleQpAb3BpbmRleCBlbmNyeXB0LXRvLWRlZmF1bHQta2V5CklmIHRoZSBk +ZWZhdWx0IHNlY3JldCBrZXkgaXMgdGFrZW4gZnJvbSBAb3B0aW9uey0tZGVmYXVs +dC1rZXl9LCB0aGVuCmFsc28gZW5jcnlwdCB0byB0aGF0IGtleS4KCkBpdGVtIC0t +bm8tZW5jcnlwdC10bwpAb3BpbmRleCBuby1lbmNyeXB0LXRvCkRpc2FibGUgdGhl +IHVzZSBvZiBhbGwgQG9wdGlvbnstLWVuY3J5cHQtdG99IGFuZApAb3B0aW9uey0t +aGlkZGVuLWVuY3J5cHQtdG99IGtleXMuCgpAaXRlbSAtLWdyb3VwIEBjb2Rle25h +bWU9dmFsdWUxIH0KQG9waW5kZXggZ3JvdXAKU2V0cyB1cCBhIG5hbWVkIGdyb3Vw +LCB3aGljaCBpcyBzaW1pbGFyIHRvIGFsaWFzZXMgaW4gZW1haWwgcHJvZ3JhbXMu +CkFueSB0aW1lIHRoZSBncm91cCBuYW1lIGlzIGEgcmVjaXBpZW50IChAb3B0aW9u +ey1yfSBvcgpAb3B0aW9uey0tcmVjaXBpZW50fSksIGl0IHdpbGwgYmUgZXhwYW5k +ZWQgdG8gdGhlIHZhbHVlcwpzcGVjaWZpZWQuIE11bHRpcGxlIGdyb3VwcyB3aXRo +IHRoZSBzYW1lIG5hbWUgYXJlIGF1dG9tYXRpY2FsbHkgbWVyZ2VkCmludG8gYSBz +aW5nbGUgZ3JvdXAuCgpUaGUgdmFsdWVzIGFyZSBAY29kZXtrZXkgSURzfSBvciBm +aW5nZXJwcmludHMsIGJ1dCBhbnkga2V5IGRlc2NyaXB0aW9uCmlzIGFjY2VwdGVk +LiBOb3RlIHRoYXQgYSB2YWx1ZSB3aXRoIHNwYWNlcyBpbiBpdCB3aWxsIGJlIHRy +ZWF0ZWQgYXMKdHdvIGRpZmZlcmVudCB2YWx1ZXMuIE5vdGUgYWxzbyB0aGVyZSBp +cyBvbmx5IG9uZSBsZXZlbCBvZiBleHBhbnNpb24KLS0tIHlvdSBjYW5ub3QgbWFr +ZSBhbiBncm91cCB0aGF0IHBvaW50cyB0byBhbm90aGVyIGdyb3VwLiBXaGVuIHVz +ZWQKZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRv +IHF1b3RlIHRoZSBhcmd1bWVudCB0bwp0aGlzIG9wdGlvbiB0byBwcmV2ZW50IHRo +ZSBzaGVsbCBmcm9tIHRyZWF0aW5nIGl0IGFzIG11bHRpcGxlCmFyZ3VtZW50cy4K +CkBpdGVtIC0tdW5ncm91cCBAY29kZXtuYW1lfQpAb3BpbmRleCB1bmdyb3VwClJl +bW92ZSBhIGdpdmVuIGVudHJ5IGZyb20gdGhlIEBvcHRpb257LS1ncm91cH0gbGlz +dC4KCkBpdGVtIC0tbm8tZ3JvdXBzCkBvcGluZGV4IG5vLWdyb3VwcwpSZW1vdmUg +YWxsIGVudHJpZXMgZnJvbSB0aGUgQG9wdGlvbnstLWdyb3VwfSBsaXN0LgoKQGl0 +ZW0gLS1sb2NhbC11c2VyIEB2YXJ7bmFtZX0KQGl0ZW14IC11CkBvcGluZGV4IGxv +Y2FsLXVzZXIKVXNlIEB2YXJ7bmFtZX0gYXMgdGhlIGtleSB0byBzaWduIHdpdGgu +IE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBvdmVycmlkZXMKQG9wdGlvbnstLWRlZmF1 +bHQta2V5fS4KCkBpdGVtIC0tdHJ5LXNlY3JldC1rZXkgQHZhcntuYW1lfQpAb3Bp +bmRleCB0cnktc2VjcmV0LWtleQpGb3IgaGlkZGVuIHJlY2lwaWVudHMgR1BHIG5l +ZWRzIHRvIGtub3cgdGhlIGtleXMgdG8gdXNlIGZvciB0cmlhbApkZWNyeXB0aW9u +LiAgVGhlIGtleSBzZXQgd2l0aCBAb3B0aW9uey0tZGVmYXVsdC1rZXl9IGlzIGFs +d2F5cyB0cmllZApmaXJzdCwgYnV0IHRoaXMgaXMgb2Z0ZW4gbm90IHN1ZmZpY2ll +bnQuICBUaGlzIG9wdGlvbiBhbGxvd3MgdG8gc2V0IG1vcmUKa2V5cyB0byBiZSB1 +c2VkIGZvciB0cmlhbCBkZWNyeXB0aW9uLiAgQWx0aG91Z2ggYW55IHZhbGlkIHVz +ZXItaWQKc3BlY2lmaWNhdGlvbiBtYXkgYmUgdXNlZCBmb3IgQHZhcntuYW1lfSBp +dCBtYWtlcyBzZW5zZSB0byB1c2UgYXQgbGVhc3QKdGhlIGxvbmcga2V5aWQgdG8g +YXZvaWQgYW1iaWd1aXRpZXMuICBOb3RlIHRoYXQgZ3BnLWFnZW50IG1pZ2h0IHBv +cCB1cCBhCnBpbmVudHJ5IGZvciBhIGxvdCBrZXlzIHRvIGRvIHRoZSB0cmlhbCBk +ZWNyeXB0aW9uLiAgSWYgeW91IHdhbnQgdG8gc3RvcAphbGwgZnVydGhlciB0cmlh +bCBkZWNyeXB0aW9uIHlvdSBtYXkgdXNlIGNsb3NlLXdpbmRvdyBidXR0b24gaW5z +dGVhZCBvZgp0aGUgY2FuY2VsIGJ1dHRvbi4KCkBpdGVtIC0tdHJ5LWFsbC1zZWNy +ZXRzCkBvcGluZGV4IHRyeS1hbGwtc2VjcmV0cwpEb24ndCBsb29rIGF0IHRoZSBr +ZXkgSUQgYXMgc3RvcmVkIGluIHRoZSBtZXNzYWdlIGJ1dCB0cnkgYWxsIHNlY3Jl +dAprZXlzIGluIHR1cm4gdG8gZmluZCB0aGUgcmlnaHQgZGVjcnlwdGlvbiBrZXku +IFRoaXMgb3B0aW9uIGZvcmNlcyB0aGUKYmVoYXZpb3VyIGFzIHVzZWQgYnkgYW5v +bnltb3VzIHJlY2lwaWVudHMgKGNyZWF0ZWQgYnkgdXNpbmcKQG9wdGlvbnstLXRo +cm93LWtleWlkc30gb3IgQG9wdGlvbnstLWhpZGRlbi1yZWNpcGllbnR9KSBhbmQg +bWlnaHQgY29tZQpoYW5keSBpbiBjYXNlIHdoZXJlIGFuIGVuY3J5cHRlZCBtZXNz +YWdlIGNvbnRhaW5zIGEgYm9ndXMga2V5IElELgoKQGl0ZW0gLS1za2lwLWhpZGRl +bi1yZWNpcGllbnRzCkBpdGVteCAtLW5vLXNraXAtaGlkZGVuLXJlY2lwaWVudHMK +QG9waW5kZXggc2tpcC1oaWRkZW4tcmVjaXBpZW50cwpAb3BpbmRleCBuby1za2lw +LWhpZGRlbi1yZWNpcGllbnRzCkR1cmluZyBkZWNyeXB0aW9uIHNraXAgYWxsIGFu +b255bW91cyByZWNpcGllbnRzLiAgVGhpcyBvcHRpb24gaGVscHMgaW4KdGhlIGNh +c2UgdGhhdCBwZW9wbGUgdXNlIHRoZSBoaWRkZW4gcmVjaXBpZW50cyBmZWF0dXJl +IHRvIGhpZGUgdGhlcmUKb3duIGVuY3J5cHQtdG8ga2V5IGZyb20gb3RoZXJzLiAg +SWYgb25lc2VsZiBoYXMgbWFueSBzZWNyZXQga2V5cyB0aGlzCm1heSBsZWFkIHRv +IGEgbWFqb3IgYW5ub3lhbmNlIGJlY2F1c2UgYWxsIGtleXMgYXJlIHRyaWVkIGlu +IHR1cm4gdG8KZGVjcnlwdCBzb21ldGhpbmcgd2hpY2ggd2FzIG5vdCByZWFsbHkg +aW50ZW5kZWQgZm9yIGl0LiAgVGhlIGRyYXdiYWNrCm9mIHRoaXMgb3B0aW9uIGlz +IHRoYXQgaXQgaXMgY3VycmVudGx5IG5vdCBwb3NzaWJsZSB0byBkZWNyeXB0IGEK +bWVzc2FnZSB3aGljaCBpbmNsdWRlcyByZWFsIGFub255bW91cyByZWNpcGllbnRz +LgoKCkBlbmQgdGFibGUKCkBjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioKQGMgKioqKioqKiogIElOUFVUIEFORCBPVVRQVVQgICoq +KioqKioqKioqKioqKgpAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqCkBub2RlIEdQRyBJbnB1dCBhbmQgT3V0cHV0CkBzdWJzZWN0 +aW9uIElucHV0IGFuZCBPdXRwdXQKCkB0YWJsZSBAZ251cGd0YWJvcHQKCkBpdGVt +IC0tYXJtb3IKQGl0ZW14IC1hCkBvcGluZGV4IGFybW9yCkNyZWF0ZSBBU0NJSSBh +cm1vcmVkIG91dHB1dC4gIFRoZSBkZWZhdWx0IGlzIHRvIGNyZWF0ZSB0aGUgYmlu +YXJ5Ck9wZW5QR1AgZm9ybWF0LgoKQGl0ZW0gLS1uby1hcm1vcgpAb3BpbmRleCBu +by1hcm1vcgpBc3N1bWUgdGhlIGlucHV0IGRhdGEgaXMgbm90IGluIEFTQ0lJIGFy +bW9yZWQgZm9ybWF0LgoKQGl0ZW0gLS1vdXRwdXQgQHZhcntmaWxlfQpAaXRlbXgg +LW8gQHZhcntmaWxlfQpAb3BpbmRleCBvdXRwdXQKV3JpdGUgb3V0cHV0IHRvIEB2 +YXJ7ZmlsZX0uCgpAaXRlbSAtLW1heC1vdXRwdXQgQGNvZGV7bn0KQG9waW5kZXgg +bWF4LW91dHB1dApUaGlzIG9wdGlvbiBzZXRzIGEgbGltaXQgb24gdGhlIG51bWJl +ciBvZiBieXRlcyB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkCndoZW4gcHJvY2Vzc2lu +ZyBhIGZpbGUuIFNpbmNlIE9wZW5QR1Agc3VwcG9ydHMgdmFyaW91cyBsZXZlbHMg +b2YKY29tcHJlc3Npb24sIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHBsYWludGV4 +dCBvZiBhIGdpdmVuIG1lc3NhZ2UgbWF5IGJlCnNpZ25pZmljYW50bHkgbGFyZ2Vy +IHRoYW4gdGhlIG9yaWdpbmFsIE9wZW5QR1AgbWVzc2FnZS4gV2hpbGUgR251UEcK +d29ya3MgcHJvcGVybHkgd2l0aCBzdWNoIG1lc3NhZ2VzLCB0aGVyZSBpcyBvZnRl +biBhIGRlc2lyZSB0byBzZXQgYQptYXhpbXVtIGZpbGUgc2l6ZSB0aGF0IHdpbGwg +YmUgZ2VuZXJhdGVkIGJlZm9yZSBwcm9jZXNzaW5nIGlzIGZvcmNlZCB0bwpzdG9w +IGJ5IHRoZSBPUyBsaW1pdHMuIERlZmF1bHRzIHRvIDAsIHdoaWNoIG1lYW5zICJu +byBsaW1pdCIuCgpAaXRlbSAtLWltcG9ydC1vcHRpb25zIEBjb2Rle3BhcmFtZXRl +cnN9CkBvcGluZGV4IGltcG9ydC1vcHRpb25zClRoaXMgaXMgYSBzcGFjZSBvciBj +b21tYSBkZWxpbWl0ZWQgc3RyaW5nIHRoYXQgZ2l2ZXMgb3B0aW9ucyBmb3IKaW1w +b3J0aW5nIGtleXMuIE9wdGlvbnMgY2FuIGJlIHByZXBlbmRlZCB3aXRoIGEgYG5v +LScgdG8gZ2l2ZSB0aGUKb3Bwb3NpdGUgbWVhbmluZy4gVGhlIG9wdGlvbnMgYXJl +OgoKQHRhYmxlIEBhc2lzCgogIEBpdGVtIGltcG9ydC1sb2NhbC1zaWdzCiAgQWxs +b3cgaW1wb3J0aW5nIGtleSBzaWduYXR1cmVzIG1hcmtlZCBhcyAibG9jYWwiLiBU +aGlzIGlzIG5vdAogIGdlbmVyYWxseSB1c2VmdWwgdW5sZXNzIGEgc2hhcmVkIGtl +eXJpbmcgc2NoZW1lIGlzIGJlaW5nIHVzZWQuCiAgRGVmYXVsdHMgdG8gbm8uCgog +IEBpdGVtIGtlZXAtb3duZXJ0cnVzdAogIE5vcm1hbGx5IHBvc3NpYmxlIHN0aWxs +IGV4aXN0aW5nIG93bmVydHJ1c3QgdmFsdWVzIG9mIGEga2V5IGFyZQogIGNsZWFy +ZWQgaWYgYSBrZXkgaXMgaW1wb3J0ZWQuICBUaGlzIGlzIGluIGdlbmVyYWwgZGVz +aXJhYmxlIHNvIHRoYXQKICBhIGZvcm1lcmx5IGRlbGV0ZWQga2V5IGRvZXMgbm90 +IGF1dG9tYXRpY2FsbHkgZ2FpbiBhbiBvd25lcnRydXN0CiAgdmFsdWVzIG1lcmVs +eSBkdWUgdG8gaW1wb3J0LiAgT24gdGhlIG90aGVyIGhhbmQgaXQgaXMgc29tZXRp +bWVzCiAgbmVjZXNzYXJ5IHRvIHJlLWltcG9ydCBhIHRydXN0ZWQgc2V0IG9mIGtl +eXMgYWdhaW4gYnV0IGtlZXBpbmcKICBhbHJlYWR5IGFzc2lnbmVkIG93bmVydHJ1 +c3QgdmFsdWVzLiAgVGhpcyBjYW4gYmUgYWNoaXZlZCBieSB1c2luZwogIHRoaXMg +b3B0aW9uLgoKICBAaXRlbSByZXBhaXItcGtzLXN1YmtleS1idWcKICBEdXJpbmcg +aW1wb3J0LCBhdHRlbXB0IHRvIHJlcGFpciB0aGUgZGFtYWdlIGNhdXNlZCBieSB0 +aGUgUEtTIGtleXNlcnZlcgogIGJ1ZyAocHJlIHZlcnNpb24gMC45LjYpIHRoYXQg +bWFuZ2xlcyBrZXlzIHdpdGggbXVsdGlwbGUgc3Via2V5cy4gTm90ZQogIHRoYXQg +dGhpcyBjYW5ub3QgY29tcGxldGVseSByZXBhaXIgdGhlIGRhbWFnZWQga2V5IGFz +IHNvbWUgY3J1Y2lhbCBkYXRhCiAgaXMgcmVtb3ZlZCBieSB0aGUga2V5c2VydmVy +LCBidXQgaXQgZG9lcyBhdCBsZWFzdCBnaXZlIHlvdSBiYWNrIG9uZQogIHN1Ymtl +eS4gRGVmYXVsdHMgdG8gbm8gZm9yIHJlZ3VsYXIgQG9wdGlvbnstLWltcG9ydH0g +YW5kIHRvIHllcyBmb3IKICBrZXlzZXJ2ZXIgQG9wdGlvbnstLXJlY3Yta2V5c30u +CgogIEBpdGVtIG1lcmdlLW9ubHkKICBEdXJpbmcgaW1wb3J0LCBhbGxvdyBrZXkg +dXBkYXRlcyB0byBleGlzdGluZyBrZXlzLCBidXQgZG8gbm90IGFsbG93CiAgYW55 +IG5ldyBrZXlzIHRvIGJlIGltcG9ydGVkLiBEZWZhdWx0cyB0byBuby4KCiAgQGl0 +ZW0gaW1wb3J0LWNsZWFuCiAgQWZ0ZXIgaW1wb3J0LCBjb21wYWN0IChyZW1vdmUg +YWxsIHNpZ25hdHVyZXMgZXhjZXB0IHRoZQogIHNlbGYtc2lnbmF0dXJlKSBhbnkg +dXNlciBJRHMgZnJvbSB0aGUgbmV3IGtleSB0aGF0IGFyZSBub3QgdXNhYmxlLgog +IFRoZW4sIHJlbW92ZSBhbnkgc2lnbmF0dXJlcyBmcm9tIHRoZSBuZXcga2V5IHRo +YXQgYXJlIG5vdCB1c2FibGUuCiAgVGhpcyBpbmNsdWRlcyBzaWduYXR1cmVzIHRo +YXQgd2VyZSBpc3N1ZWQgYnkga2V5cyB0aGF0IGFyZSBub3QgcHJlc2VudAogIG9u +IHRoZSBrZXlyaW5nLiBUaGlzIG9wdGlvbiBpcyB0aGUgc2FtZSBhcyBydW5uaW5n +IHRoZSBAb3B0aW9uey0tZWRpdC1rZXl9CiAgY29tbWFuZCAiY2xlYW4iIGFmdGVy +IGltcG9ydC4gRGVmYXVsdHMgdG8gbm8uCgogIEBpdGVtIGltcG9ydC1taW5pbWFs +CiAgSW1wb3J0IHRoZSBzbWFsbGVzdCBrZXkgcG9zc2libGUuIFRoaXMgcmVtb3Zl +cyBhbGwgc2lnbmF0dXJlcyBleGNlcHQKICB0aGUgbW9zdCByZWNlbnQgc2VsZi1z +aWduYXR1cmUgb24gZWFjaCB1c2VyIElELiBUaGlzIG9wdGlvbiBpcyB0aGUKICBz +YW1lIGFzIHJ1bm5pbmcgdGhlIEBvcHRpb257LS1lZGl0LWtleX0gY29tbWFuZCAi +bWluaW1pemUiIGFmdGVyIGltcG9ydC4KICBEZWZhdWx0cyB0byBuby4KQGVuZCB0 +YWJsZQoKQGl0ZW0gLS1leHBvcnQtb3B0aW9ucyBAY29kZXtwYXJhbWV0ZXJzfQpA +b3BpbmRleCBleHBvcnQtb3B0aW9ucwpUaGlzIGlzIGEgc3BhY2Ugb3IgY29tbWEg +ZGVsaW1pdGVkIHN0cmluZyB0aGF0IGdpdmVzIG9wdGlvbnMgZm9yCmV4cG9ydGlu +ZyBrZXlzLiBPcHRpb25zIGNhbiBiZSBwcmVwZW5kZWQgd2l0aCBhIGBuby0nIHRv +IGdpdmUgdGhlCm9wcG9zaXRlIG1lYW5pbmcuIFRoZSBvcHRpb25zIGFyZToKCkB0 +YWJsZSBAYXNpcwoKICBAaXRlbSBleHBvcnQtbG9jYWwtc2lncwogIEFsbG93IGV4 +cG9ydGluZyBrZXkgc2lnbmF0dXJlcyBtYXJrZWQgYXMgImxvY2FsIi4gVGhpcyBp +cyBub3QKICBnZW5lcmFsbHkgdXNlZnVsIHVubGVzcyBhIHNoYXJlZCBrZXlyaW5n +IHNjaGVtZSBpcyBiZWluZyB1c2VkLgogIERlZmF1bHRzIHRvIG5vLgoKICBAaXRl +bSBleHBvcnQtYXR0cmlidXRlcwogIEluY2x1ZGUgYXR0cmlidXRlIHVzZXIgSURz +IChwaG90byBJRHMpIHdoaWxlIGV4cG9ydGluZy4gVGhpcyBpcwogIHVzZWZ1bCB0 +byBleHBvcnQga2V5cyBpZiB0aGV5IGFyZSBnb2luZyB0byBiZSB1c2VkIGJ5IGFu +IE9wZW5QR1AKICBwcm9ncmFtIHRoYXQgZG9lcyBub3QgYWNjZXB0IGF0dHJpYnV0 +ZSB1c2VyIElEcy4gRGVmYXVsdHMgdG8geWVzLgoKICBAaXRlbSBleHBvcnQtc2Vu +c2l0aXZlLXJldmtleXMKICBJbmNsdWRlIGRlc2lnbmF0ZWQgcmV2b2tlciBpbmZv +cm1hdGlvbiB0aGF0IHdhcyBtYXJrZWQgYXMKICAic2Vuc2l0aXZlIi4gRGVmYXVs +dHMgdG8gbm8uCgogIEBjIFNpbmNlIEdudVBHIDIuMSBncGctYWdlbnQgbWFuYWdl +cyB0aGUgc2VjcmV0IGtleSBhbmQgdGh1cyB0aGUKICBAYyBleHBvcnQtcmVzZXQt +c3Via2V5LXBhc3N3ZCBoYWNrIGlzIG5vdCBhbnltb3JlIGp1c3RpZmllZC4gIFN1 +Y2ggdXNlCiAgQGMgY2FzZXMgbWF5IGJlIGltcGxlbWVudGVkIHVzaW5nIGEgc3Bl +Y2lhbGl6ZWQgc2VjcmV0IGtleSBleHBvcnQKICBAYyB0b29sLgogIEBjIEBpdGVt +IGV4cG9ydC1yZXNldC1zdWJrZXktcGFzc3dkCiAgQGMgV2hlbiB1c2luZyB0aGUg +QG9wdGlvbnstLWV4cG9ydC1zZWNyZXQtc3Via2V5c30gY29tbWFuZCwgdGhpcyBv +cHRpb24gcmVzZXRzCiAgQGMgdGhlIHBhc3NwaHJhc2VzIGZvciBhbGwgZXhwb3J0 +ZWQgc3Via2V5cyB0byBlbXB0eS4gVGhpcyBpcyB1c2VmdWwKICBAYyB3aGVuIHRo +ZSBleHBvcnRlZCBzdWJrZXkgaXMgdG8gYmUgdXNlZCBvbiBhbiB1bmF0dGVuZGVk +IG1hY2hpbmUgd2hlcmUKICBAYyBhIHBhc3NwaHJhc2UgZG9lc24ndCBuZWNlc3Nh +cmlseSBtYWtlIHNlbnNlLiBEZWZhdWx0cyB0byBuby4KCiAgQGl0ZW0gZXhwb3J0 +LWNsZWFuCiAgQ29tcGFjdCAocmVtb3ZlIGFsbCBzaWduYXR1cmVzIGZyb20pIHVz +ZXIgSURzIG9uIHRoZSBrZXkgYmVpbmcKICBleHBvcnRlZCBpZiB0aGUgdXNlciBJ +RHMgYXJlIG5vdCB1c2FibGUuIEFsc28sIGRvIG5vdCBleHBvcnQgYW55CiAgc2ln +bmF0dXJlcyB0aGF0IGFyZSBub3QgdXNhYmxlLiBUaGlzIGluY2x1ZGVzIHNpZ25h +dHVyZXMgdGhhdCB3ZXJlCiAgaXNzdWVkIGJ5IGtleXMgdGhhdCBhcmUgbm90IHBy +ZXNlbnQgb24gdGhlIGtleXJpbmcuIFRoaXMgb3B0aW9uIGlzCiAgdGhlIHNhbWUg +YXMgcnVubmluZyB0aGUgQG9wdGlvbnstLWVkaXQta2V5fSBjb21tYW5kICJjbGVh +biIgYmVmb3JlIGV4cG9ydAogIGV4Y2VwdCB0aGF0IHRoZSBsb2NhbCBjb3B5IG9m +IHRoZSBrZXkgaXMgbm90IG1vZGlmaWVkLiBEZWZhdWx0cyB0bwogIG5vLgoKICBA +aXRlbSBleHBvcnQtbWluaW1hbAogIEV4cG9ydCB0aGUgc21hbGxlc3Qga2V5IHBv +c3NpYmxlLiBUaGlzIHJlbW92ZXMgYWxsIHNpZ25hdHVyZXMgZXhjZXB0IHRoZQog +IG1vc3QgcmVjZW50IHNlbGYtc2lnbmF0dXJlIG9uIGVhY2ggdXNlciBJRC4gVGhp +cyBvcHRpb24gaXMgdGhlIHNhbWUgYXMKICBydW5uaW5nIHRoZSBAb3B0aW9uey0t +ZWRpdC1rZXl9IGNvbW1hbmQgIm1pbmltaXplIiBiZWZvcmUgZXhwb3J0IGV4Y2Vw +dAogIHRoYXQgdGhlIGxvY2FsIGNvcHkgb2YgdGhlIGtleSBpcyBub3QgbW9kaWZp +ZWQuIERlZmF1bHRzIHRvIG5vLgpAZW5kIHRhYmxlCgpAaXRlbSAtLXdpdGgtY29s +b25zCkBvcGluZGV4IHdpdGgtY29sb25zClByaW50IGtleSBsaXN0aW5ncyBkZWxp +bWl0ZWQgYnkgY29sb25zLiBOb3RlIHRoYXQgdGhlIG91dHB1dCB3aWxsIGJlCmVu +Y29kZWQgaW4gVVRGLTggcmVnYXJkbGVzcyBvZiBhbnkgQG9wdGlvbnstLWRpc3Bs +YXktY2hhcnNldH0gc2V0dGluZy4gVGhpcwpmb3JtYXQgaXMgdXNlZnVsIHdoZW4g +R251UEcgaXMgY2FsbGVkIGZyb20gc2NyaXB0cyBhbmQgb3RoZXIgcHJvZ3JhbXMK +YXMgaXQgaXMgZWFzaWx5IG1hY2hpbmUgcGFyc2VkLiBUaGUgZGV0YWlscyBvZiB0 +aGlzIGZvcm1hdCBhcmUKZG9jdW1lbnRlZCBpbiB0aGUgZmlsZSBAZmlsZXtkb2Mv +REVUQUlMU30sIHdoaWNoIGlzIGluY2x1ZGVkIGluIHRoZSBHbnVQRwpzb3VyY2Ug +ZGlzdHJpYnV0aW9uLgoKCkBpdGVtIC0tcHJpbnQtcGthLXJlY29yZHMKQG9waW5k +ZXggcHJpbnQtcGthLXJlY29yZHMKTW9kaWZ5IHRoZSBvdXRwdXQgb2YgdGhlIGxp +c3QgY29tbWFuZHMgdG8gcHJpbnQgUEtBIHJlY29yZHMgc3VpdGFibGUKdG8gcHV0 +IGludG8gRE5TIHpvbmUgZmlsZXMuICBBbiBPUklHSU4gbGluZSBpcyBwcmludGVk +IGJlZm9yZSBlYWNoCnJlY29yZCB0byBhbGxvdyBkaXZlcnRpbmcgdGhlIHJlY29y +ZHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgem9uZSBmaWxlLgoKQGl0ZW0gLS1wcmlu +dC1kYW5lLXJlY29yZHMKQG9waW5kZXggcHJpbnQtZGFuZS1yZWNvcmRzCk1vZGlm +eSB0aGUgb3V0cHV0IG9mIHRoZSBsaXN0IGNvbW1hbmRzIHRvIHByaW50IE9wZW5Q +R1AgREFORSByZWNvcmRzCnN1aXRhYmxlIHRvIHB1dCBpbnRvIEROUyB6b25lIGZp +bGVzLiAgQW4gT1JJR0lOIGxpbmUgaXMgcHJpbnRlZCBiZWZvcmUKZWFjaCByZWNv +cmQgdG8gYWxsb3cgZGl2ZXJ0aW5nIHRoZSByZWNvcmRzIHRvIHRoZSBjb3JyZXNw +b25kaW5nIHpvbmUKZmlsZS4KCkBpdGVtIC0tZml4ZWQtbGlzdC1tb2RlCkBvcGlu +ZGV4IGZpeGVkLWxpc3QtbW9kZQpEbyBub3QgbWVyZ2UgcHJpbWFyeSB1c2VyIElE +IGFuZCBwcmltYXJ5IGtleSBpbiBAb3B0aW9uey0td2l0aC1jb2xvbn0KbGlzdGlu +ZyBtb2RlIGFuZCBwcmludCBhbGwgdGltZXN0YW1wcyBhcyBzZWNvbmRzIHNpbmNl +IDE5NzAtMDEtMDEuClNpbmNlIEdudVBHIDIuMC4xMCwgdGhpcyBtb2RlIGlzIGFs +d2F5cyB1c2VkIGFuZCB0aHVzIHRoaXMgb3B0aW9uIGlzCm9ic29sZXRlOyBpdCBk +b2VzIG5vdCBoYXJtIHRvIHVzZSBpdCB0aG91Z2guCgpAaXRlbSAtLWxlZ2FjeS1s +aXN0LW1vZGUKQG9waW5kZXggbGVnYWN5LWxpc3QtbW9kZQpSZXZlcnQgdG8gdGhl +IHByZS0yLjEgcHVibGljIGtleSBsaXN0IG1vZGUuICBUaGlzIG9ubHkgYWZmZWN0 +cyB0aGUKaHVtYW4gcmVhZGFibGUgb3V0cHV0IGFuZCBub3QgdGhlIG1hY2hpbmUg +aW50ZXJmYWNlCihpLmUuIEBjb2Rley0td2l0aC1jb2xvbnN9KS4gIE5vdGUgdGhh +dCB0aGUgbGVnYWN5IGZvcm1hdCBkb2VzIG5vdAphbGxvdyB0byBjb252ZXkgc3Vp +dGFibGUgaW5mb3JtYXRpb24gZm9yIGVsbGlwdGljIGN1cnZlcy4KCkBpdGVtIC0t +d2l0aC1maW5nZXJwcmludApAb3BpbmRleCB3aXRoLWZpbmdlcnByaW50ClNhbWUg +YXMgdGhlIGNvbW1hbmQgQG9wdGlvbnstLWZpbmdlcnByaW50fSBidXQgY2hhbmdl +cyBvbmx5IHRoZSBmb3JtYXQKb2YgdGhlIG91dHB1dCBhbmQgbWF5IGJlIHVzZWQg +dG9nZXRoZXIgd2l0aCBhbm90aGVyIGNvbW1hbmQuCgpAaXRlbSAtLXdpdGgtaWNh +by1zcGVsbGluZwpAb3BpbmRleCB3aXRoLWljYW8tc3BlbGxpbmcKUHJpbnQgdGhl +IElDQU8gc3BlbGxpbmcgb2YgdGhlIGZpbmdlcnByaW50IGluIGFkZGl0aW9uIHRv +IHRoZSBoZXggZGlnaXRzLgoKQGl0ZW0gLS13aXRoLWtleWdyaXAKQG9waW5kZXgg +d2l0aC1rZXlncmlwCkluY2x1ZGUgdGhlIGtleWdyaXAgaW4gdGhlIGtleSBsaXN0 +aW5ncy4KCkBpdGVtIC0td2l0aC1zZWNyZXQKQG9waW5kZXggd2l0aC1zZWNyZXQK +SW5jbHVkZSBpbmZvIGFib3V0IHRoZSBwcmVzZW5jZSBvZiBhIHNlY3JldCBrZXkg +aW4gcHVibGljIGtleSBsaXN0aW5ncwpkb25lIHdpdGggQGNvZGV7LS13aXRoLWNv +bG9uc30uCgpAZW5kIHRhYmxlCgpAYyAqKioqKioqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioqKioqCkBjICoqKioqKioqICBPUEVOUEdQIE9QVElPTlMg +ICoqKioqKioqKioqKioqKioKQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioqKgpAbm9kZSBPcGVuUEdQIE9wdGlvbnMKQHN1YnNlY3Rp +b24gT3BlblBHUCBwcm90b2NvbCBzcGVjaWZpYyBvcHRpb25zLgoKQHRhYmxlIEBn +bnVwZ3RhYm9wdAoKQGl0ZW0gLXQsIC0tdGV4dG1vZGUKQGl0ZW14IC0tbm8tdGV4 +dG1vZGUKQG9waW5kZXggdGV4dG1vZGUKVHJlYXQgaW5wdXQgZmlsZXMgYXMgdGV4 +dCBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgT3BlblBHUCBjYW5vbmljYWwgdGV4dApm +b3JtIHdpdGggc3RhbmRhcmQgIkNSTEYiIGxpbmUgZW5kaW5ncy4gVGhpcyBhbHNv +IHNldHMgdGhlIG5lY2Vzc2FyeQpmbGFncyB0byBpbmZvcm0gdGhlIHJlY2lwaWVu +dCB0aGF0IHRoZSBlbmNyeXB0ZWQgb3Igc2lnbmVkIGRhdGEgaXMgdGV4dAphbmQg +bWF5IG5lZWQgaXRzIGxpbmUgZW5kaW5ncyBjb252ZXJ0ZWQgYmFjayB0byB3aGF0 +ZXZlciB0aGUgbG9jYWwKc3lzdGVtIHVzZXMuIFRoaXMgb3B0aW9uIGlzIHVzZWZ1 +bCB3aGVuIGNvbW11bmljYXRpbmcgYmV0d2VlbiB0d28KcGxhdGZvcm1zIHRoYXQg +aGF2ZSBkaWZmZXJlbnQgbGluZSBlbmRpbmcgY29udmVudGlvbnMgKFVOSVgtbGlr +ZSB0byBNYWMsCk1hYyB0byBXaW5kb3dzLCBldGMpLiBAb3B0aW9uey0tbm8tdGV4 +dG1vZGV9IGRpc2FibGVzIHRoaXMgb3B0aW9uLCBhbmQKaXMgdGhlIGRlZmF1bHQu +CgpAaXRlbSAtLWZvcmNlLXYzLXNpZ3MKQGl0ZW14IC0tbm8tZm9yY2UtdjMtc2ln +cwpAaXRlbSAtLWZvcmNlLXY0LWNlcnRzCkBpdGVteCAtLW5vLWZvcmNlLXY0LWNl +cnRzClRoZXNlIG9wdGlvbnMgYXJlIG9ic29sZXRlIGFuZCBoYXZlIG5vIGVmZmVj +dCBzaW5jZSBHbnVQRyAyLjEuCgpAaXRlbSAtLWZvcmNlLW1kYwpAb3BpbmRleCBm +b3JjZS1tZGMKRm9yY2UgdGhlIHVzZSBvZiBlbmNyeXB0aW9uIHdpdGggYSBtb2Rp +ZmljYXRpb24gZGV0ZWN0aW9uIGNvZGUuIFRoaXMKaXMgYWx3YXlzIHVzZWQgd2l0 +aCB0aGUgbmV3ZXIgY2lwaGVycyAodGhvc2Ugd2l0aCBhIGJsb2Nrc2l6ZSBncmVh +dGVyCnRoYW4gNjQgYml0cyksIG9yIGlmIGFsbCBvZiB0aGUgcmVjaXBpZW50IGtl +eXMgaW5kaWNhdGUgTURDIHN1cHBvcnQgaW4KdGhlaXIgZmVhdHVyZSBmbGFncy4K +CkBpdGVtIC0tZGlzYWJsZS1tZGMKQG9waW5kZXggZGlzYWJsZS1tZGMKRGlzYWJs +ZSB0aGUgdXNlIG9mIHRoZSBtb2RpZmljYXRpb24gZGV0ZWN0aW9uIGNvZGUuIE5v +dGUgdGhhdCBieQp1c2luZyB0aGlzIG9wdGlvbiwgdGhlIGVuY3J5cHRlZCBtZXNz +YWdlIGJlY29tZXMgdnVsbmVyYWJsZSB0byBhCm1lc3NhZ2UgbW9kaWZpY2F0aW9u +IGF0dGFjay4KCkBpdGVtIC0tcGVyc29uYWwtY2lwaGVyLXByZWZlcmVuY2VzIEBj +b2Rle3N0cmluZ30KQG9waW5kZXggcGVyc29uYWwtY2lwaGVyLXByZWZlcmVuY2Vz +ClNldCB0aGUgbGlzdCBvZiBwZXJzb25hbCBjaXBoZXIgcHJlZmVyZW5jZXMgdG8g +QGNvZGV7c3RyaW5nfS4gIFVzZQpAY29tbWFuZHtAZ3BnbmFtZSAtLXZlcnNpb259 +IHRvIGdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIGFsZ29yaXRobXMsCmFuZCB1c2Ug +QGNvZGV7bm9uZX0gdG8gc2V0IG5vIHByZWZlcmVuY2UgYXQgYWxsLiAgVGhpcyBh +bGxvd3MgdGhlIHVzZXIKdG8gc2FmZWx5IG92ZXJyaWRlIHRoZSBhbGdvcml0aG0g +Y2hvc2VuIGJ5IHRoZSByZWNpcGllbnQga2V5CnByZWZlcmVuY2VzLCBhcyBHUEcg +d2lsbCBvbmx5IHNlbGVjdCBhbiBhbGdvcml0aG0gdGhhdCBpcyB1c2FibGUgYnkK +YWxsIHJlY2lwaWVudHMuICBUaGUgbW9zdCBoaWdobHkgcmFua2VkIGNpcGhlciBp +biB0aGlzIGxpc3QgaXMgYWxzbwp1c2VkIGZvciB0aGUgQG9wdGlvbnstLXN5bW1l +dHJpY30gZW5jcnlwdGlvbiBjb21tYW5kLgoKQGl0ZW0gLS1wZXJzb25hbC1kaWdl +c3QtcHJlZmVyZW5jZXMgQGNvZGV7c3RyaW5nfQpAb3BpbmRleCBwZXJzb25hbC1k +aWdlc3QtcHJlZmVyZW5jZXMKU2V0IHRoZSBsaXN0IG9mIHBlcnNvbmFsIGRpZ2Vz +dCBwcmVmZXJlbmNlcyB0byBAY29kZXtzdHJpbmd9LiAgVXNlCkBjb21tYW5ke0Bn +cGduYW1lIC0tdmVyc2lvbn0gdG8gZ2V0IGEgbGlzdCBvZiBhdmFpbGFibGUgYWxn +b3JpdGhtcywKYW5kIHVzZSBAY29kZXtub25lfSB0byBzZXQgbm8gcHJlZmVyZW5j +ZSBhdCBhbGwuICBUaGlzIGFsbG93cyB0aGUgdXNlcgp0byBzYWZlbHkgb3ZlcnJp +ZGUgdGhlIGFsZ29yaXRobSBjaG9zZW4gYnkgdGhlIHJlY2lwaWVudCBrZXkKcHJl +ZmVyZW5jZXMsIGFzIEdQRyB3aWxsIG9ubHkgc2VsZWN0IGFuIGFsZ29yaXRobSB0 +aGF0IGlzIHVzYWJsZSBieQphbGwgcmVjaXBpZW50cy4gIFRoZSBtb3N0IGhpZ2hs +eSByYW5rZWQgZGlnZXN0IGFsZ29yaXRobSBpbiB0aGlzIGxpc3QKaXMgYWxzbyB1 +c2VkIHdoZW4gc2lnbmluZyB3aXRob3V0IGVuY3J5cHRpb24KKGUuZy4gQG9wdGlv +bnstLWNsZWFyc2lnbn0gb3IgQG9wdGlvbnstLXNpZ259KS4KCkBpdGVtIC0tcGVy +c29uYWwtY29tcHJlc3MtcHJlZmVyZW5jZXMgQGNvZGV7c3RyaW5nfQpAb3BpbmRl +eCBwZXJzb25hbC1jb21wcmVzcy1wcmVmZXJlbmNlcwpTZXQgdGhlIGxpc3Qgb2Yg +cGVyc29uYWwgY29tcHJlc3Npb24gcHJlZmVyZW5jZXMgdG8gQGNvZGV7c3RyaW5n +fS4KVXNlIEBjb21tYW5ke0BncGduYW1lIC0tdmVyc2lvbn0gdG8gZ2V0IGEgbGlz +dCBvZiBhdmFpbGFibGUKYWxnb3JpdGhtcywgYW5kIHVzZSBAY29kZXtub25lfSB0 +byBzZXQgbm8gcHJlZmVyZW5jZSBhdCBhbGwuICBUaGlzCmFsbG93cyB0aGUgdXNl +ciB0byBzYWZlbHkgb3ZlcnJpZGUgdGhlIGFsZ29yaXRobSBjaG9zZW4gYnkgdGhl +CnJlY2lwaWVudCBrZXkgcHJlZmVyZW5jZXMsIGFzIEdQRyB3aWxsIG9ubHkgc2Vs +ZWN0IGFuIGFsZ29yaXRobSB0aGF0CmlzIHVzYWJsZSBieSBhbGwgcmVjaXBpZW50 +cy4gIFRoZSBtb3N0IGhpZ2hseSByYW5rZWQgY29tcHJlc3Npb24KYWxnb3JpdGht +IGluIHRoaXMgbGlzdCBpcyBhbHNvIHVzZWQgd2hlbiB0aGVyZSBhcmUgbm8gcmVj +aXBpZW50IGtleXMKdG8gY29uc2lkZXIgKGUuZy4gQG9wdGlvbnstLXN5bW1ldHJp +Y30pLgoKQGl0ZW0gLS1zMmstY2lwaGVyLWFsZ28gQGNvZGV7bmFtZX0KQG9waW5k +ZXggczJrLWNpcGhlci1hbGdvClVzZSBAY29kZXtuYW1lfSBhcyB0aGUgY2lwaGVy +IGFsZ29yaXRobSB1c2VkIHRvIHByb3RlY3Qgc2VjcmV0IGtleXMuClRoZSBkZWZh +dWx0IGNpcGhlciBpcyBAdmFsdWV7R1BHU1lNRU5DQUxHT30uIFRoaXMgY2lwaGVy +IGlzIGFsc28gdXNlZApmb3Igc3ltbWV0cmljIGVuY3J5cHRpb24gd2l0aCBhIHBh +c3NwaHJhc2UgaWYKQG9wdGlvbnstLXBlcnNvbmFsLWNpcGhlci1wcmVmZXJlbmNl +c30gYW5kIEBvcHRpb257LS1jaXBoZXItYWxnb30gaXMKbm90IGdpdmVuLgoKQGl0 +ZW0gLS1zMmstZGlnZXN0LWFsZ28gQGNvZGV7bmFtZX0KQG9waW5kZXggczJrLWRp +Z2VzdC1hbGdvClVzZSBAY29kZXtuYW1lfSBhcyB0aGUgZGlnZXN0IGFsZ29yaXRo +bSB1c2VkIHRvIG1hbmdsZSB0aGUgcGFzc3BocmFzZXMuClRoZSBkZWZhdWx0IGFs +Z29yaXRobSBpcyBTSEEtMS4KCkBpdGVtIC0tczJrLW1vZGUgQGNvZGV7bn0KQG9w +aW5kZXggczJrLW1vZGUKU2VsZWN0cyBob3cgcGFzc3BocmFzZXMgYXJlIG1hbmds +ZWQuIElmIEBjb2Rle259IGlzIDAgYSBwbGFpbgpwYXNzcGhyYXNlICh3aGljaCBp +cyBub3QgcmVjb21tZW5kZWQpIHdpbGwgYmUgdXNlZCwgYSAxIGFkZHMgYSBzYWx0 +IHRvCnRoZSBwYXNzcGhyYXNlIGFuZCBhIDMgKHRoZSBkZWZhdWx0KSBpdGVyYXRl +cyB0aGUgd2hvbGUgcHJvY2VzcyBhCm51bWJlciBvZiB0aW1lcyAoc2VlIC0tczJr +LWNvdW50KS4gIFVubGVzcyBAb3B0aW9uey0tcmZjMTk5MX0gaXMgdXNlZCwKdGhp +cyBtb2RlIGlzIGFsc28gdXNlZCBmb3Igc3ltbWV0cmljIGVuY3J5cHRpb24gd2l0 +aCBhIHBhc3NwaHJhc2UuCgpAaXRlbSAtLXMyay1jb3VudCBAY29kZXtufQpAb3Bp +bmRleCBzMmstY291bnQKU3BlY2lmeSBob3cgbWFueSB0aW1lcyB0aGUgcGFzc3Bo +cmFzZSBtYW5nbGluZyBpcyByZXBlYXRlZC4gIFRoaXMKdmFsdWUgbWF5IHJhbmdl +IGJldHdlZW4gMTAyNCBhbmQgNjUwMTE3MTIgaW5jbHVzaXZlLiAgVGhlIGRlZmF1 +bHQgaXMKaW5xdWlyZWQgZnJvbSBncGctYWdlbnQuICBOb3RlIHRoYXQgbm90IGFs +bCB2YWx1ZXMgaW4gdGhlCjEwMjQtNjUwMTE3MTIgcmFuZ2UgYXJlIGxlZ2FsIGFu +ZCBpZiBhbiBpbGxlZ2FsIHZhbHVlIGlzIHNlbGVjdGVkLApHbnVQRyB3aWxsIHJv +dW5kIHVwIHRvIHRoZSBuZWFyZXN0IGxlZ2FsIHZhbHVlLiAgVGhpcyBvcHRpb24g +aXMgb25seQptZWFuaW5nZnVsIGlmIEBvcHRpb257LS1zMmstbW9kZX0gaXMgMy4K +CgpAZW5kIHRhYmxlCgpAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKQGMg +KioqKioqKiBDb21wbGlhbmNlICoqKioqKioqCkBjICoqKioqKioqKioqKioqKioq +KioqKioqKioqKgpAbm9kZSBDb21wbGlhbmNlIE9wdGlvbnMKQHN1YnNlY3Rpb24g +Q29tcGxpYW5jZSBvcHRpb25zCgpUaGVzZSBvcHRpb25zIGNvbnRyb2wgd2hhdCBH +bnVQRyBpcyBjb21wbGlhbnQgdG8uIE9ubHkgb25lIG9mIHRoZXNlCm9wdGlvbnMg +bWF5IGJlIGFjdGl2ZSBhdCBhIHRpbWUuIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBz +ZXR0aW5nIG9mCnRoaXMgaXMgbmVhcmx5IGFsd2F5cyB0aGUgY29ycmVjdCBvbmUu +IFNlZSB0aGUgSU5URVJPUEVSQUJJTElUWSBXSVRICk9USEVSIE9QRU5QR1AgUFJP +R1JBTVMgc2VjdGlvbiBiZWxvdyBiZWZvcmUgdXNpbmcgb25lIG9mIHRoZXNlCm9w +dGlvbnMuCgpAdGFibGUgQGdudXBndGFib3B0CgpAaXRlbSAtLWdudXBnCkBvcGlu +ZGV4IGdudXBnClVzZSBzdGFuZGFyZCBHbnVQRyBiZWhhdmlvci4gVGhpcyBpcyBl +c3NlbnRpYWxseSBPcGVuUEdQIGJlaGF2aW9yCihzZWUgQG9wdGlvbnstLW9wZW5w +Z3B9KSwgYnV0IHdpdGggc29tZSBhZGRpdGlvbmFsIHdvcmthcm91bmRzIGZvciBj +b21tb24KY29tcGF0aWJpbGl0eSBwcm9ibGVtcyBpbiBkaWZmZXJlbnQgdmVyc2lv +bnMgb2YgUEdQLiBUaGlzIGlzIHRoZQpkZWZhdWx0IG9wdGlvbiwgc28gaXQgaXMg +bm90IGdlbmVyYWxseSBuZWVkZWQsIGJ1dCBpdCBtYXkgYmUgdXNlZnVsIHRvCm92 +ZXJyaWRlIGEgZGlmZmVyZW50IGNvbXBsaWFuY2Ugb3B0aW9uIGluIHRoZSBncGcu +Y29uZiBmaWxlLgoKQGl0ZW0gLS1vcGVucGdwCkBvcGluZGV4IG9wZW5wZ3AKUmVz +ZXQgYWxsIHBhY2tldCwgY2lwaGVyIGFuZCBkaWdlc3Qgb3B0aW9ucyB0byBzdHJp +Y3QgT3BlblBHUApiZWhhdmlvci4gVXNlIHRoaXMgb3B0aW9uIHRvIHJlc2V0IGFs +bCBwcmV2aW91cyBvcHRpb25zIGxpa2UKQG9wdGlvbnstLXMyay0qfSwgQG9wdGlv +bnstLWNpcGhlci1hbGdvfSwgQG9wdGlvbnstLWRpZ2VzdC1hbGdvfSBhbmQKQG9w +dGlvbnstLWNvbXByZXNzLWFsZ299IHRvIE9wZW5QR1AgY29tcGxpYW50IHZhbHVl +cy4gQWxsIFBHUAp3b3JrYXJvdW5kcyBhcmUgZGlzYWJsZWQuCgpAaXRlbSAtLXJm +YzQ4ODAKQG9waW5kZXggcmZjNDg4MApSZXNldCBhbGwgcGFja2V0LCBjaXBoZXIg +YW5kIGRpZ2VzdCBvcHRpb25zIHRvIHN0cmljdCBSRkMtNDg4MApiZWhhdmlvci4g +Tm90ZSB0aGF0IHRoaXMgaXMgY3VycmVudGx5IHRoZSBzYW1lIHRoaW5nIGFzCkBv +cHRpb257LS1vcGVucGdwfS4KCkBpdGVtIC0tcmZjMjQ0MApAb3BpbmRleCByZmMy +NDQwClJlc2V0IGFsbCBwYWNrZXQsIGNpcGhlciBhbmQgZGlnZXN0IG9wdGlvbnMg +dG8gc3RyaWN0IFJGQy0yNDQwCmJlaGF2aW9yLgoKQGlmY2xlYXIgZ3BndG93b25l +CkBpdGVtIC0tcmZjMTk5MQpAb3BpbmRleCByZmMxOTkxClRyeSB0byBiZSBtb3Jl +IFJGQy0xOTkxIChQR1AgMi54KSBjb21wbGlhbnQuICBUaGlzIG9wdGlvbiBpcwpk +ZXByZWNhdGVkIHdpbGwgYmUgcmVtb3ZlZCBpbiBHbnVQRyAyLjEuCgpAaXRlbSAt +LXBncDIKQG9waW5kZXggcGdwMgpTZXQgdXAgYWxsIG9wdGlvbnMgdG8gYmUgYXMg +UEdQIDIueCBjb21wbGlhbnQgYXMgcG9zc2libGUsIGFuZCB3YXJuIGlmCmFuIGFj +dGlvbiBpcyB0YWtlbiAoZS5nLiBlbmNyeXB0aW5nIHRvIGEgbm9uLVJTQSBrZXkp +IHRoYXQgd2lsbCBjcmVhdGUKYSBtZXNzYWdlIHRoYXQgUEdQIDIueCB3aWxsIG5v +dCBiZSBhYmxlIHRvIGhhbmRsZS4gTm90ZSB0aGF0IGBQR1AKMi54JyBoZXJlIG1l +YW5zIGBNSVQgUEdQIDIuNi4yJy4gVGhlcmUgYXJlIG90aGVyIHZlcnNpb25zIG9m +IFBHUCAyLngKYXZhaWxhYmxlLCBidXQgdGhlIE1JVCByZWxlYXNlIGlzIGEgZ29v +ZCBjb21tb24gYmFzZWxpbmUuCgpUaGlzIG9wdGlvbiBpbXBsaWVzCkBvcHRpb257 +LS1yZmMxOTkxIC0tZGlzYWJsZS1tZGMgLS1uby1mb3JjZS12NC1jZXJ0cwogLS1l +c2NhcGUtZnJvbS1saW5lcyAgLS1mb3JjZS12My1zaWdzIC0tYWxsb3ctd2Vhay1k +aWdlc3QtYWxnb3MKIC0tY2lwaGVyLWFsZ28gSURFQSAtLWRpZ2VzdC1hbGdvIE1E +NSAtLWNvbXByZXNzLWFsZ28gWklQfS4KSXQgYWxzbyBkaXNhYmxlcyBAb3B0aW9u +ey0tdGV4dG1vZGV9IHdoZW4gZW5jcnlwdGluZy4KClRoaXMgb3B0aW9uIGlzIGRl +cHJlY2F0ZWQgd2lsbCBiZSByZW1vdmVkIGluIEdudVBHIDIuMS4gIFRoZSByZWFz +b24KZm9yIGRyb3BwaW5nIFBHUC0yIHN1cHBvcnQgaXMgdGhhdCB0aGUgUEdQIDIg +Zm9ybWF0IGlzIG5vdCBhbnltb3JlCmNvbnNpZGVyZWQgc2FmZSAoZm9yIGV4YW1w +bGUgZHVlIHRvIHRoZSB1c2Ugb2YgdGhlIGJyb2tlbiBNRDUgYWxnb3JpdGhtKS4K +Tm90ZSB0aGF0IHRoZSBkZWNyeXB0aW9uIG9mIFBHUC0yIGNyZWF0ZWQgbWVzc2Fn +ZXMgd2lsbCBjb250aW51ZSB0byB3b3JrLgpAZW5kIGlmY2xlYXIKCkBpdGVtIC0t +cGdwNgpAb3BpbmRleCBwZ3A2ClNldCB1cCBhbGwgb3B0aW9ucyB0byBiZSBhcyBQ +R1AgNiBjb21wbGlhbnQgYXMgcG9zc2libGUuIFRoaXMKcmVzdHJpY3RzIHlvdSB0 +byB0aGUgY2lwaGVycyBJREVBIChpZiB0aGUgSURFQSBwbHVnaW4gaXMgaW5zdGFs +bGVkKSwKM0RFUywgYW5kIENBU1Q1LCB0aGUgaGFzaGVzIE1ENSwgU0hBMSBhbmQg +UklQRU1EMTYwLCBhbmQgdGhlCmNvbXByZXNzaW9uIGFsZ29yaXRobXMgbm9uZSBh +bmQgWklQLiBUaGlzIGFsc28gZGlzYWJsZXMKLS10aHJvdy1rZXlpZHMsIGFuZCBt +YWtpbmcgc2lnbmF0dXJlcyB3aXRoIHNpZ25pbmcgc3Via2V5cyBhcyBQR1AgNgpk +b2VzIG5vdCB1bmRlcnN0YW5kIHNpZ25hdHVyZXMgbWFkZSBieSBzaWduaW5nIHN1 +YmtleXMuCgpUaGlzIG9wdGlvbiBpbXBsaWVzIEBvcHRpb257LS1kaXNhYmxlLW1k +YyAtLWVzY2FwZS1mcm9tLWxpbmVzfS4KCkBpdGVtIC0tcGdwNwpAb3BpbmRleCBw +Z3A3ClNldCB1cCBhbGwgb3B0aW9ucyB0byBiZSBhcyBQR1AgNyBjb21wbGlhbnQg +YXMgcG9zc2libGUuIFRoaXMgaXMKaWRlbnRpY2FsIHRvIEBvcHRpb257LS1wZ3A2 +fSBleGNlcHQgdGhhdCBNRENzIGFyZSBub3QgZGlzYWJsZWQsIGFuZCB0aGUKbGlz +dCBvZiBhbGxvd2FibGUgY2lwaGVycyBpcyBleHBhbmRlZCB0byBhZGQgQUVTMTI4 +LCBBRVMxOTIsIEFFUzI1NiwgYW5kClRXT0ZJU0guCgpAaXRlbSAtLXBncDgKQG9w +aW5kZXggcGdwOApTZXQgdXAgYWxsIG9wdGlvbnMgdG8gYmUgYXMgUEdQIDggY29t +cGxpYW50IGFzIHBvc3NpYmxlLiBQR1AgOCBpcyBhIGxvdApjbG9zZXIgdG8gdGhl +IE9wZW5QR1Agc3RhbmRhcmQgdGhhbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBQR1As +IHNvIGFsbAp0aGlzIGRvZXMgaXMgZGlzYWJsZSBAb3B0aW9uey0tdGhyb3cta2V5 +aWRzfSBhbmQgc2V0CkBvcHRpb257LS1lc2NhcGUtZnJvbS1saW5lc30uICBBbGwg +YWxnb3JpdGhtcyBhcmUgYWxsb3dlZCBleGNlcHQgZm9yIHRoZQpTSEEyMjQsIFNI +QTM4NCwgYW5kIFNIQTUxMiBkaWdlc3RzLgoKQGVuZCB0YWJsZQoKCkBjICoqKioq +KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQGMgKioqKioq +KiogIEVTT1RFUklDIE9QVElPTlMgICoqKioqKioqKioqKioqKgpAYyAqKioqKioq +KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBub2RlIEdQRyBF +c290ZXJpYyBPcHRpb25zCkBzdWJzZWN0aW9uIERvaW5nIHRoaW5ncyBvbmUgdXN1 +YWxseSBkb2Vzbid0IHdhbnQgdG8gZG8uCgpAdGFibGUgQGdudXBndGFib3B0CgpA +aXRlbSAtbgpAaXRlbXggLS1kcnktcnVuCkBvcGluZGV4IGRyeS1ydW4KRG9uJ3Qg +bWFrZSBhbnkgY2hhbmdlcyAodGhpcyBpcyBub3QgY29tcGxldGVseSBpbXBsZW1l +bnRlZCkuCgpAaXRlbSAtLWxpc3Qtb25seQpAb3BpbmRleCBsaXN0LW9ubHkKQ2hh +bmdlcyB0aGUgYmVoYXZpb3VyIG9mIHNvbWUgY29tbWFuZHMuIFRoaXMgaXMgbGlr +ZSBAb3B0aW9uey0tZHJ5LXJ1bn0gYnV0CmRpZmZlcmVudCBpbiBzb21lIGNhc2Vz +LiBUaGUgc2VtYW50aWMgb2YgdGhpcyBjb21tYW5kIG1heSBiZSBleHRlbmRlZCBp +bgp0aGUgZnV0dXJlLiBDdXJyZW50bHkgaXQgb25seSBza2lwcyB0aGUgYWN0dWFs +IGRlY3J5cHRpb24gcGFzcyBhbmQKdGhlcmVmb3JlIGVuYWJsZXMgYSBmYXN0IGxp +c3Rpbmcgb2YgdGhlIGVuY3J5cHRpb24ga2V5cy4KCkBpdGVtIC1pCkBpdGVteCAt +LWludGVyYWN0aXZlCkBvcGluZGV4IGludGVyYWN0aXZlClByb21wdCBiZWZvcmUg +b3ZlcndyaXRpbmcgYW55IGZpbGVzLgoKQGl0ZW0gLS1kZWJ1Zy1sZXZlbCBAdmFy +e2xldmVsfQpAb3BpbmRleCBkZWJ1Zy1sZXZlbApTZWxlY3QgdGhlIGRlYnVnIGxl +dmVsIGZvciBpbnZlc3RpZ2F0aW5nIHByb2JsZW1zLiBAdmFye2xldmVsfSBtYXkg +YmUKYSBudW1lcmljIHZhbHVlIG9yIGJ5IGEga2V5d29yZDoKCkB0YWJsZSBAY29k +ZQogIEBpdGVtIG5vbmUKICBObyBkZWJ1Z2dpbmcgYXQgYWxsLiAgQSB2YWx1ZSBv +ZiBsZXNzIHRoYW4gMSBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mCiAgdGhlIGtleXdv +cmQuCiAgQGl0ZW0gYmFzaWMKICBTb21lIGJhc2ljIGRlYnVnIG1lc3NhZ2VzLiAg +QSB2YWx1ZSBiZXR3ZWVuIDEgYW5kIDIgbWF5IGJlIHVzZWQKICBpbnN0ZWFkIG9m +IHRoZSBrZXl3b3JkLgogIEBpdGVtIGFkdmFuY2VkCiAgTW9yZSB2ZXJib3NlIGRl +YnVnIG1lc3NhZ2VzLiAgQSB2YWx1ZSBiZXR3ZWVuIDMgYW5kIDUgbWF5IGJlIHVz +ZWQKICBpbnN0ZWFkIG9mIHRoZSBrZXl3b3JkLgogIEBpdGVtIGV4cGVydAogIEV2 +ZW4gbW9yZSBkZXRhaWxlZCBtZXNzYWdlcy4gIEEgdmFsdWUgYmV0d2VlbiA2IGFu +ZCA4IG1heSBiZSB1c2VkCiAgaW5zdGVhZCBvZiB0aGUga2V5d29yZC4KICBAaXRl +bSBndXJ1CiAgQWxsIG9mIHRoZSBkZWJ1ZyBtZXNzYWdlcyB5b3UgY2FuIGdldC4g +QSB2YWx1ZSBncmVhdGVyIHRoYW4gOCBtYXkgYmUKICB1c2VkIGluc3RlYWQgb2Yg +dGhlIGtleXdvcmQuICBUaGUgY3JlYXRpb24gb2YgaGFzaCB0cmFjaW5nIGZpbGVz +IGlzCiAgb25seSBlbmFibGVkIGlmIHRoZSBrZXl3b3JkIGlzIHVzZWQuCkBlbmQg +dGFibGUKCkhvdyB0aGVzZSBtZXNzYWdlcyBhcmUgbWFwcGVkIHRvIHRoZSBhY3R1 +YWwgZGVidWdnaW5nIGZsYWdzIGlzIG5vdApzcGVjaWZpZWQgYW5kIG1heSBjaGFu +Z2Ugd2l0aCBuZXdlciByZWxlYXNlcyBvZiB0aGlzIHByb2dyYW0uIFRoZXkgYXJl +Cmhvd2V2ZXIgY2FyZWZ1bGx5IHNlbGVjdGVkIHRvIGJlc3QgYWlkIGluIGRlYnVn +Z2luZy4KCkBpdGVtIC0tZGVidWcgQHZhcntmbGFnc30KQG9waW5kZXggZGVidWcK +U2V0IGRlYnVnZ2luZyBmbGFncy4gQWxsIGZsYWdzIGFyZSBvci1lZCBhbmQgQHZh +cntmbGFnc30gbWF5IGJlIGdpdmVuCmluIEMgc3ludGF4IChlLmcuIDB4MDA0Mikg +b3IgYXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmbGFnIG5hbWVzLgpUbyBn +ZXQgYSBsaXN0IG9mIGFsbCBzdXBwb3J0ZWQgZmxhZ3MgdGhlIHNpbmdsZSB3b3Jk +ICJoZWxwIiBjYW4gYmUKdXNlZC4KCkBpdGVtIC0tZGVidWctYWxsCkBvcGluZGV4 +IGRlYnVnLWFsbApTZXQgYWxsIHVzZWZ1bCBkZWJ1Z2dpbmcgZmxhZ3MuCgpAaXRl +bSAtLWRlYnVnLWlvbGJmCkBvcGluZGV4IGRlYnVnLWlvbGJmClNldCBzdGRvdXQg +aW50byBsaW5lIGJ1ZmZlcmVkIG1vZGUuICBUaGlzIG9wdGlvbiBpcyBvbmx5IGhv +bm9yZWQgd2hlbgpnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgoKQGl0ZW0gLS1m +YWtlZC1zeXN0ZW0tdGltZSBAdmFye2Vwb2NofQpAb3BpbmRleCBmYWtlZC1zeXN0 +ZW0tdGltZQpUaGlzIG9wdGlvbiBpcyBvbmx5IHVzZWZ1bCBmb3IgdGVzdGluZzsg +aXQgc2V0cyB0aGUgc3lzdGVtIHRpbWUgYmFjayBvcgpmb3J0aCB0byBAdmFye2Vw +b2NofSB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgZWxhcHNlZCBzaW5j +ZSB0aGUgeWVhcgoxOTcwLiAgQWx0ZXJuYXRpdmVseSBAdmFye2Vwb2NofSBtYXkg +YmUgZ2l2ZW4gYXMgYSBmdWxsIElTTyB0aW1lIHN0cmluZwooZS5nLiAiMjAwNzA5 +MjRUMTU0ODEyIikuCgpAaXRlbSAtLWVuYWJsZS1wcm9ncmVzcy1maWx0ZXIKQG9w +aW5kZXggZW5hYmxlLXByb2dyZXNzLWZpbHRlcgpFbmFibGUgY2VydGFpbiBQUk9H +UkVTUyBzdGF0dXMgb3V0cHV0cy4gVGhpcyBvcHRpb24gYWxsb3dzIGZyb250ZW5k +cwp0byBkaXNwbGF5IGEgcHJvZ3Jlc3MgaW5kaWNhdG9yIHdoaWxlIGdwZyBpcyBw +cm9jZXNzaW5nIGxhcmdlciBmaWxlcy4KVGhlcmUgaXMgYSBzbGlnaHQgcGVyZm9y +bWFuY2Ugb3ZlcmhlYWQgdXNpbmcgaXQuCgpAaXRlbSAtLXN0YXR1cy1mZCBAY29k +ZXtufQpAb3BpbmRleCBzdGF0dXMtZmQKV3JpdGUgc3BlY2lhbCBzdGF0dXMgc3Ry +aW5ncyB0byB0aGUgZmlsZSBkZXNjcmlwdG9yIEBjb2Rle259LgpTZWUgdGhlIGZp +bGUgREVUQUlMUyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYSBsaXN0aW5nIG9m +IHRoZW0uCgpAaXRlbSAtLXN0YXR1cy1maWxlIEBjb2Rle2ZpbGV9CkBvcGluZGV4 +IHN0YXR1cy1maWxlClNhbWUgYXMgQG9wdGlvbnstLXN0YXR1cy1mZH0sIGV4Y2Vw +dCB0aGUgc3RhdHVzIGRhdGEgaXMgd3JpdHRlbiB0byBmaWxlCkBjb2Rle2ZpbGV9 +LgoKQGl0ZW0gLS1sb2dnZXItZmQgQGNvZGV7bn0KQG9waW5kZXggbG9nZ2VyLWZk +CldyaXRlIGxvZyBvdXRwdXQgdG8gZmlsZSBkZXNjcmlwdG9yIEBjb2Rle259IGFu +ZCBub3QgdG8gU1RERVJSLgoKQGl0ZW0gLS1sb2ctZmlsZSBAY29kZXtmaWxlfQpA +aXRlbXggLS1sb2dnZXItZmlsZSBAY29kZXtmaWxlfQpAb3BpbmRleCBsb2ctZmls +ZQpTYW1lIGFzIEBvcHRpb257LS1sb2dnZXItZmR9LCBleGNlcHQgdGhlIGxvZ2dl +ciBkYXRhIGlzIHdyaXR0ZW4gdG8gZmlsZQpAY29kZXtmaWxlfS4gIE5vdGUgdGhh +dCBAb3B0aW9uey0tbG9nLWZpbGV9IGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yCkdu +dVBHLTIuCgpAaXRlbSAtLWF0dHJpYnV0ZS1mZCBAY29kZXtufQpAb3BpbmRleCBh +dHRyaWJ1dGUtZmQKV3JpdGUgYXR0cmlidXRlIHN1YnBhY2tldHMgdG8gdGhlIGZp +bGUgZGVzY3JpcHRvciBAY29kZXtufS4gVGhpcyBpcyBtb3N0CnVzZWZ1bCBmb3Ig +dXNlIHdpdGggQG9wdGlvbnstLXN0YXR1cy1mZH0sIHNpbmNlIHRoZSBzdGF0dXMg +bWVzc2FnZXMgYXJlCm5lZWRlZCB0byBzZXBhcmF0ZSBvdXQgdGhlIHZhcmlvdXMg +c3VicGFja2V0cyBmcm9tIHRoZSBzdHJlYW0gZGVsaXZlcmVkCnRvIHRoZSBmaWxl +IGRlc2NyaXB0b3IuCgpAaXRlbSAtLWF0dHJpYnV0ZS1maWxlIEBjb2Rle2ZpbGV9 +CkBvcGluZGV4IGF0dHJpYnV0ZS1maWxlClNhbWUgYXMgQG9wdGlvbnstLWF0dHJp +YnV0ZS1mZH0sIGV4Y2VwdCB0aGUgYXR0cmlidXRlIGRhdGEgaXMgd3JpdHRlbiB0 +bwpmaWxlIEBjb2Rle2ZpbGV9LgoKQGl0ZW0gLS1jb21tZW50IEBjb2Rle3N0cmlu +Z30KQGl0ZW14IC0tbm8tY29tbWVudHMKQG9waW5kZXggY29tbWVudApVc2UgQGNv +ZGV7c3RyaW5nfSBhcyBhIGNvbW1lbnQgc3RyaW5nIGluIGNsZWFyIHRleHQgc2ln +bmF0dXJlcyBhbmQgQVNDSUkKYXJtb3JlZCBtZXNzYWdlcyBvciBrZXlzIChzZWUg +QG9wdGlvbnstLWFybW9yfSkuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzCm5vdCB0 +byB1c2UgYSBjb21tZW50IHN0cmluZy4gQG9wdGlvbnstLWNvbW1lbnR9IG1heSBi +ZSByZXBlYXRlZCBtdWx0aXBsZQp0aW1lcyB0byBnZXQgbXVsdGlwbGUgY29tbWVu +dCBzdHJpbmdzLiBAb3B0aW9uey0tbm8tY29tbWVudHN9IHJlbW92ZXMKYWxsIGNv +bW1lbnRzLiAgSXQgaXMgYSBnb29kIGlkZWEgdG8ga2VlcCB0aGUgbGVuZ3RoIG9m +IGEgc2luZ2xlIGNvbW1lbnQKYmVsb3cgNjAgY2hhcmFjdGVycyB0byBhdm9pZCBw +cm9ibGVtcyB3aXRoIG1haWwgcHJvZ3JhbXMgd3JhcHBpbmcgc3VjaApsaW5lcy4g +IE5vdGUgdGhhdCBjb21tZW50IGxpbmVzLCBsaWtlIGFsbCBvdGhlciBoZWFkZXIg +bGluZXMsIGFyZSBub3QKcHJvdGVjdGVkIGJ5IHRoZSBzaWduYXR1cmUuCgpAaXRl +bSAtLWVtaXQtdmVyc2lvbgpAaXRlbXggLS1uby1lbWl0LXZlcnNpb24KQG9waW5k +ZXggZW1pdC12ZXJzaW9uCkZvcmNlIGluY2x1c2lvbiBvZiB0aGUgdmVyc2lvbiBz +dHJpbmcgaW4gQVNDSUkgYXJtb3JlZCBvdXRwdXQuICBJZgpnaXZlbiBvbmNlIG9u +bHkgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gYW5kIHRoZSBtYWpvciBudW1iZXIg +aXMKZW1pdHRlZCAoZGVmYXVsdCksIGdpdmVuIHR3aWNlIHRoZSBtaW5vciBpcyBh +bHNvIGVtaXR0ZWQsIGdpdmVuIHRyaXBsZQp0aGUgbWljcm8gaXMgYWRkZWQsIGFu +ZCBnaXZlbiBxdWFkIGFuIG9wZXJhdGluZyBzeXN0ZW0gaWRlbnRpZmljYXRpb24K +aXMgYWxzbyBlbWl0dGVkLiAgQG9wdGlvbnstLW5vLWVtaXQtdmVyc2lvbn0gZGlz +YWJsZXMgdGhlIHZlcnNpb24KbGluZS4KCkBpdGVtIC0tc2lnLW5vdGF0aW9uIEBj +b2Rle25hbWU9dmFsdWV9CkBpdGVteCAtLWNlcnQtbm90YXRpb24gQGNvZGV7bmFt +ZT12YWx1ZX0KQGl0ZW14IC1OLCAtLXNldC1ub3RhdGlvbiBAY29kZXtuYW1lPXZh +bHVlfQpAb3BpbmRleCBzaWctbm90YXRpb24KQG9waW5kZXggY2VydC1ub3RhdGlv +bgpAb3BpbmRleCBzZXQtbm90YXRpb24KUHV0IHRoZSBuYW1lIHZhbHVlIHBhaXIg +aW50byB0aGUgc2lnbmF0dXJlIGFzIG5vdGF0aW9uIGRhdGEuCkBjb2Rle25hbWV9 +IG11c3QgY29uc2lzdCBvbmx5IG9mIHByaW50YWJsZSBjaGFyYWN0ZXJzIG9yIHNw +YWNlcywgYW5kCm11c3QgY29udGFpbiBhICdAQCcgY2hhcmFjdGVyIGluIHRoZSBm +b3JtIGtleW5hbWVAQGRvbWFpbi5leGFtcGxlLmNvbQooc3Vic3RpdHV0aW5nIHRo +ZSBhcHByb3ByaWF0ZSBrZXluYW1lIGFuZCBkb21haW4gbmFtZSwgb2YgY291cnNl +KS4gIFRoaXMKaXMgdG8gaGVscCBwcmV2ZW50IHBvbGx1dGlvbiBvZiB0aGUgSUVU +RiByZXNlcnZlZCBub3RhdGlvbgpuYW1lc3BhY2UuIFRoZSBAb3B0aW9uey0tZXhw +ZXJ0fSBmbGFnIG92ZXJyaWRlcyB0aGUgJ0BAJwpjaGVjay4gQGNvZGV7dmFsdWV9 +IG1heSBiZSBhbnkgcHJpbnRhYmxlIHN0cmluZzsgaXQgd2lsbCBiZSBlbmNvZGVk +IGluClVURjgsIHNvIHlvdSBzaG91bGQgY2hlY2sgdGhhdCB5b3VyIEBvcHRpb257 +LS1kaXNwbGF5LWNoYXJzZXR9IGlzIHNldApjb3JyZWN0bHkuIElmIHlvdSBwcmVm +aXggQGNvZGV7bmFtZX0gd2l0aCBhbiBleGNsYW1hdGlvbiBtYXJrICghKSwgdGhl +Cm5vdGF0aW9uIGRhdGEgd2lsbCBiZSBmbGFnZ2VkIGFzIGNyaXRpY2FsCihyZmM0 +ODgwOjUuMi4zLjE2KS4gQG9wdGlvbnstLXNpZy1ub3RhdGlvbn0gc2V0cyBhIG5v +dGF0aW9uIGZvciBkYXRhCnNpZ25hdHVyZXMuIEBvcHRpb257LS1jZXJ0LW5vdGF0 +aW9ufSBzZXRzIGEgbm90YXRpb24gZm9yIGtleSBzaWduYXR1cmVzCihjZXJ0aWZp +Y2F0aW9ucykuIEBvcHRpb257LS1zZXQtbm90YXRpb259IHNldHMgYm90aC4KClRo +ZXJlIGFyZSBzcGVjaWFsIGNvZGVzIHRoYXQgbWF5IGJlIHVzZWQgaW4gbm90YXRp +b24gbmFtZXMuICIlayIgd2lsbApiZSBleHBhbmRlZCBpbnRvIHRoZSBrZXkgSUQg +b2YgdGhlIGtleSBiZWluZyBzaWduZWQsICIlSyIgaW50byB0aGUKbG9uZyBrZXkg +SUQgb2YgdGhlIGtleSBiZWluZyBzaWduZWQsICIlZiIgaW50byB0aGUgZmluZ2Vy +cHJpbnQgb2YgdGhlCmtleSBiZWluZyBzaWduZWQsICIlcyIgaW50byB0aGUga2V5 +IElEIG9mIHRoZSBrZXkgbWFraW5nIHRoZQpzaWduYXR1cmUsICIlUyIgaW50byB0 +aGUgbG9uZyBrZXkgSUQgb2YgdGhlIGtleSBtYWtpbmcgdGhlIHNpZ25hdHVyZSwK +IiVnIiBpbnRvIHRoZSBmaW5nZXJwcmludCBvZiB0aGUga2V5IG1ha2luZyB0aGUg +c2lnbmF0dXJlICh3aGljaCBtaWdodApiZSBhIHN1YmtleSksICIlcCIgaW50byB0 +aGUgZmluZ2VycHJpbnQgb2YgdGhlIHByaW1hcnkga2V5IG9mIHRoZSBrZXkKbWFr +aW5nIHRoZSBzaWduYXR1cmUsICIlYyIgaW50byB0aGUgc2lnbmF0dXJlIGNvdW50 +IGZyb20gdGhlIE9wZW5QR1AKc21hcnRjYXJkLCBhbmQgIiUlIiByZXN1bHRzIGlu +IGEgc2luZ2xlICIlIi4gJWssICVLLCBhbmQgJWYgYXJlIG9ubHkKbWVhbmluZ2Z1 +bCB3aGVuIG1ha2luZyBhIGtleSBzaWduYXR1cmUgKGNlcnRpZmljYXRpb24pLCBh +bmQgJWMgaXMgb25seQptZWFuaW5nZnVsIHdoZW4gdXNpbmcgdGhlIE9wZW5QR1Ag +c21hcnRjYXJkLgoKQGl0ZW0gLS1zaWctcG9saWN5LXVybCBAY29kZXtzdHJpbmd9 +CkBpdGVteCAtLWNlcnQtcG9saWN5LXVybCBAY29kZXtzdHJpbmd9CkBpdGVteCAt +LXNldC1wb2xpY3ktdXJsIEBjb2Rle3N0cmluZ30KQG9waW5kZXggc2lnLXBvbGlj +eS11cmwKQG9waW5kZXggY2VydC1wb2xpY3ktdXJsCkBvcGluZGV4IHNldC1wb2xp +Y3ktdXJsClVzZSBAY29kZXtzdHJpbmd9IGFzIGEgUG9saWN5IFVSTCBmb3Igc2ln +bmF0dXJlcyAocmZjNDg4MDo1LjIuMy4yMCkuICBJZgp5b3UgcHJlZml4IGl0IHdp +dGggYW4gZXhjbGFtYXRpb24gbWFyayAoISksIHRoZSBwb2xpY3kgVVJMIHBhY2tl +dCB3aWxsCmJlIGZsYWdnZWQgYXMgY3JpdGljYWwuIEBvcHRpb257LS1zaWctcG9s +aWN5LXVybH0gc2V0cyBhIHBvbGljeSB1cmwgZm9yCmRhdGEgc2lnbmF0dXJlcy4g +QG9wdGlvbnstLWNlcnQtcG9saWN5LXVybH0gc2V0cyBhIHBvbGljeSB1cmwgZm9y +IGtleQpzaWduYXR1cmVzIChjZXJ0aWZpY2F0aW9ucykuIEBvcHRpb257LS1zZXQt +cG9saWN5LXVybH0gc2V0cyBib3RoLgoKVGhlIHNhbWUgJS1leHBhbmRvcyB1c2Vk +IGZvciBub3RhdGlvbiBkYXRhIGFyZSBhdmFpbGFibGUgaGVyZSBhcyB3ZWxsLgoK +QGl0ZW0gLS1zaWcta2V5c2VydmVyLXVybCBAY29kZXtzdHJpbmd9CkBvcGluZGV4 +IHNpZy1rZXlzZXJ2ZXItdXJsClVzZSBAY29kZXtzdHJpbmd9IGFzIGEgcHJlZmVy +cmVkIGtleXNlcnZlciBVUkwgZm9yIGRhdGEgc2lnbmF0dXJlcy4gSWYKeW91IHBy +ZWZpeCBpdCB3aXRoIGFuIGV4Y2xhbWF0aW9uIG1hcmsgKCEpLCB0aGUga2V5c2Vy +dmVyIFVSTCBwYWNrZXQKd2lsbCBiZSBmbGFnZ2VkIGFzIGNyaXRpY2FsLgoKVGhl +IHNhbWUgJS1leHBhbmRvcyB1c2VkIGZvciBub3RhdGlvbiBkYXRhIGFyZSBhdmFp +bGFibGUgaGVyZSBhcyB3ZWxsLgoKQGl0ZW0gLS1zZXQtZmlsZW5hbWUgQGNvZGV7 +c3RyaW5nfQpAb3BpbmRleCBzZXQtZmlsZW5hbWUKVXNlIEBjb2Rle3N0cmluZ30g +YXMgdGhlIGZpbGVuYW1lIHdoaWNoIGlzIHN0b3JlZCBpbnNpZGUgbWVzc2FnZXMu +ClRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0LCB3aGljaCBpcyB0byB1c2UgdGhl +IGFjdHVhbCBmaWxlbmFtZSBvZiB0aGUKZmlsZSBiZWluZyBlbmNyeXB0ZWQuICBV +c2luZyB0aGUgZW1wdHkgc3RyaW5nIGZvciBAdmFye3N0cmluZ30KZWZmZWN0aXZl +bHkgcmVtb3ZlcyB0aGUgZmlsZW5hbWUgZnJvbSB0aGUgb3V0cHV0LgoKQGl0ZW0g +LS1mb3IteW91ci1leWVzLW9ubHkKQGl0ZW14IC0tbm8tZm9yLXlvdXItZXllcy1v +bmx5CkBvcGluZGV4IGZvci15b3VyLWV5ZXMtb25seQpTZXQgdGhlIGBmb3IgeW91 +ciBleWVzIG9ubHknIGZsYWcgaW4gdGhlIG1lc3NhZ2UuIFRoaXMgY2F1c2VzIEdu +dVBHIHRvCnJlZnVzZSB0byBzYXZlIHRoZSBmaWxlIHVubGVzcyB0aGUgQG9wdGlv +bnstLW91dHB1dH0gb3B0aW9uIGlzIGdpdmVuLAphbmQgUEdQIHRvIHVzZSBhICJz +ZWN1cmUgdmlld2VyIiB3aXRoIGEgY2xhaW1lZCBUZW1wZXN0LXJlc2lzdGFudCBm +b250CnRvIGRpc3BsYXkgdGhlIG1lc3NhZ2UuIFRoaXMgb3B0aW9uIG92ZXJyaWRl +cyBAb3B0aW9uey0tc2V0LWZpbGVuYW1lfS4KQG9wdGlvbnstLW5vLWZvci15b3Vy +LWV5ZXMtb25seX0gZGlzYWJsZXMgdGhpcyBvcHRpb24uCgpAaXRlbSAtLXVzZS1l +bWJlZGRlZC1maWxlbmFtZQpAaXRlbXggLS1uby11c2UtZW1iZWRkZWQtZmlsZW5h +bWUKQG9waW5kZXggdXNlLWVtYmVkZGVkLWZpbGVuYW1lClRyeSB0byBjcmVhdGUg +YSBmaWxlIHdpdGggYSBuYW1lIGFzIGVtYmVkZGVkIGluIHRoZSBkYXRhLiBUaGlz +IGNhbiBiZQphIGRhbmdlcm91cyBvcHRpb24gYXMgaXQgYWxsb3dzIHRvIG92ZXJ3 +cml0ZSBmaWxlcy4gRGVmYXVsdHMgdG8gbm8uCgpAaXRlbSAtLWNpcGhlci1hbGdv +IEBjb2Rle25hbWV9CkBvcGluZGV4IGNpcGhlci1hbGdvClVzZSBAY29kZXtuYW1l +fSBhcyBjaXBoZXIgYWxnb3JpdGhtLiBSdW5uaW5nIHRoZSBwcm9ncmFtIHdpdGgg +dGhlCmNvbW1hbmQgQG9wdGlvbnstLXZlcnNpb259IHlpZWxkcyBhIGxpc3Qgb2Yg +c3VwcG9ydGVkIGFsZ29yaXRobXMuIElmCnRoaXMgaXMgbm90IHVzZWQgdGhlIGNp +cGhlciBhbGdvcml0aG0gaXMgc2VsZWN0ZWQgZnJvbSB0aGUgcHJlZmVyZW5jZXMK +c3RvcmVkIHdpdGggdGhlIGtleS4gSW4gZ2VuZXJhbCwgeW91IGRvIG5vdCB3YW50 +IHRvIHVzZSB0aGlzIG9wdGlvbiBhcwppdCBhbGxvd3MgeW91IHRvIHZpb2xhdGUg +dGhlIE9wZW5QR1Agc3RhbmRhcmQuCkBvcHRpb257LS1wZXJzb25hbC1jaXBoZXIt +cHJlZmVyZW5jZXN9IGlzIHRoZSBzYWZlIHdheSB0byBhY2NvbXBsaXNoIHRoZQpz +YW1lIHRoaW5nLgoKQGl0ZW0gLS1kaWdlc3QtYWxnbyBAY29kZXtuYW1lfQpAb3Bp +bmRleCBkaWdlc3QtYWxnbwpVc2UgQGNvZGV7bmFtZX0gYXMgdGhlIG1lc3NhZ2Ug +ZGlnZXN0IGFsZ29yaXRobS4gUnVubmluZyB0aGUgcHJvZ3JhbQp3aXRoIHRoZSBj +b21tYW5kIEBvcHRpb257LS12ZXJzaW9ufSB5aWVsZHMgYSBsaXN0IG9mIHN1cHBv +cnRlZCBhbGdvcml0aG1zLiBJbgpnZW5lcmFsLCB5b3UgZG8gbm90IHdhbnQgdG8g +dXNlIHRoaXMgb3B0aW9uIGFzIGl0IGFsbG93cyB5b3UgdG8KdmlvbGF0ZSB0aGUg +T3BlblBHUCBzdGFuZGFyZC4gQG9wdGlvbnstLXBlcnNvbmFsLWRpZ2VzdC1wcmVm +ZXJlbmNlc30gaXMgdGhlCnNhZmUgd2F5IHRvIGFjY29tcGxpc2ggdGhlIHNhbWUg +dGhpbmcuCgpAaXRlbSAtLWNvbXByZXNzLWFsZ28gQGNvZGV7bmFtZX0KQG9waW5k +ZXggY29tcHJlc3MtYWxnbwpVc2UgY29tcHJlc3Npb24gYWxnb3JpdGhtIEBjb2Rl +e25hbWV9LiAiemxpYiIgaXMgUkZDLTE5NTAgWkxJQgpjb21wcmVzc2lvbi4gInpp +cCIgaXMgUkZDLTE5NTEgWklQIGNvbXByZXNzaW9uIHdoaWNoIGlzIHVzZWQgYnkg +UEdQLgoiYnppcDIiIGlzIGEgbW9yZSBtb2Rlcm4gY29tcHJlc3Npb24gc2NoZW1l +IHRoYXQgY2FuIGNvbXByZXNzIHNvbWUKdGhpbmdzIGJldHRlciB0aGFuIHppcCBv +ciB6bGliLCBidXQgYXQgdGhlIGNvc3Qgb2YgbW9yZSBtZW1vcnkgdXNlZApkdXJp +bmcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uICJ1bmNvbXByZXNzZWQi +IG9yICJub25lIgpkaXNhYmxlcyBjb21wcmVzc2lvbi4gSWYgdGhpcyBvcHRpb24g +aXMgbm90IHVzZWQsIHRoZSBkZWZhdWx0CmJlaGF2aW9yIGlzIHRvIGV4YW1pbmUg +dGhlIHJlY2lwaWVudCBrZXkgcHJlZmVyZW5jZXMgdG8gc2VlIHdoaWNoCmFsZ29y +aXRobXMgdGhlIHJlY2lwaWVudCBzdXBwb3J0cy4gSWYgYWxsIGVsc2UgZmFpbHMs +IFpJUCBpcyB1c2VkIGZvcgptYXhpbXVtIGNvbXBhdGliaWxpdHkuCgpaTElCIG1h +eSBnaXZlIGJldHRlciBjb21wcmVzc2lvbiByZXN1bHRzIHRoYW4gWklQLCBhcyB0 +aGUgY29tcHJlc3Npb24Kd2luZG93IHNpemUgaXMgbm90IGxpbWl0ZWQgdG8gOGsu +IEJaSVAyIG1heSBnaXZlIGV2ZW4gYmV0dGVyCmNvbXByZXNzaW9uIHJlc3VsdHMg +dGhhbiB0aGF0LCBidXQgd2lsbCB1c2UgYSBzaWduaWZpY2FudGx5IGxhcmdlcgph +bW91bnQgb2YgbWVtb3J5IHdoaWxlIGNvbXByZXNzaW5nIGFuZCBkZWNvbXByZXNz +aW5nLiBUaGlzIG1heSBiZQpzaWduaWZpY2FudCBpbiBsb3cgbWVtb3J5IHNpdHVh +dGlvbnMuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgUEdQIChhbGwKdmVyc2lvbnMpIG9u +bHkgc3VwcG9ydHMgWklQIGNvbXByZXNzaW9uLiBVc2luZyBhbnkgYWxnb3JpdGht +IG90aGVyCnRoYW4gWklQIG9yICJub25lIiB3aWxsIG1ha2UgdGhlIG1lc3NhZ2Ug +dW5yZWFkYWJsZSB3aXRoIFBHUC4gSW4KZ2VuZXJhbCwgeW91IGRvIG5vdCB3YW50 +IHRvIHVzZSB0aGlzIG9wdGlvbiBhcyBpdCBhbGxvd3MgeW91IHRvCnZpb2xhdGUg +dGhlIE9wZW5QR1Agc3RhbmRhcmQuIEBvcHRpb257LS1wZXJzb25hbC1jb21wcmVz +cy1wcmVmZXJlbmNlc30gaXMgdGhlCnNhZmUgd2F5IHRvIGFjY29tcGxpc2ggdGhl +IHNhbWUgdGhpbmcuCgpAaXRlbSAtLWNlcnQtZGlnZXN0LWFsZ28gQGNvZGV7bmFt +ZX0KQG9waW5kZXggY2VydC1kaWdlc3QtYWxnbwpVc2UgQGNvZGV7bmFtZX0gYXMg +dGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB1c2VkIHdoZW4gc2lnbmluZyBh +CmtleS4gUnVubmluZyB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBjb21tYW5kIEBvcHRp +b257LS12ZXJzaW9ufSB5aWVsZHMgYQpsaXN0IG9mIHN1cHBvcnRlZCBhbGdvcml0 +aG1zLiBCZSBhd2FyZSB0aGF0IGlmIHlvdSBjaG9vc2UgYW4gYWxnb3JpdGhtCnRo +YXQgR251UEcgc3VwcG9ydHMgYnV0IG90aGVyIE9wZW5QR1AgaW1wbGVtZW50YXRp +b25zIGRvIG5vdCwgdGhlbiBzb21lCnVzZXJzIHdpbGwgbm90IGJlIGFibGUgdG8g +dXNlIHRoZSBrZXkgc2lnbmF0dXJlcyB5b3UgbWFrZSwgb3IgcXVpdGUKcG9zc2li +bHkgeW91ciBlbnRpcmUga2V5LgoKQGl0ZW0gLS1kaXNhYmxlLWNpcGhlci1hbGdv +IEBjb2Rle25hbWV9CkBvcGluZGV4IGRpc2FibGUtY2lwaGVyLWFsZ28KTmV2ZXIg +YWxsb3cgdGhlIHVzZSBvZiBAY29kZXtuYW1lfSBhcyBjaXBoZXIgYWxnb3JpdGht +LgpUaGUgZ2l2ZW4gbmFtZSB3aWxsIG5vdCBiZSBjaGVja2VkIHNvIHRoYXQgYSBs +YXRlciBsb2FkZWQgYWxnb3JpdGhtCndpbGwgc3RpbGwgZ2V0IGRpc2FibGVkLgoK +QGl0ZW0gLS1kaXNhYmxlLXB1YmtleS1hbGdvIEBjb2Rle25hbWV9CkBvcGluZGV4 +IGRpc2FibGUtcHVia2V5LWFsZ28KTmV2ZXIgYWxsb3cgdGhlIHVzZSBvZiBAY29k +ZXtuYW1lfSBhcyBwdWJsaWMga2V5IGFsZ29yaXRobS4KVGhlIGdpdmVuIG5hbWUg +d2lsbCBub3QgYmUgY2hlY2tlZCBzbyB0aGF0IGEgbGF0ZXIgbG9hZGVkIGFsZ29y +aXRobQp3aWxsIHN0aWxsIGdldCBkaXNhYmxlZC4KCkBpdGVtIC0tdGhyb3cta2V5 +aWRzCkBpdGVteCAtLW5vLXRocm93LWtleWlkcwpAb3BpbmRleCB0aHJvdy1rZXlp +ZHMKRG8gbm90IHB1dCB0aGUgcmVjaXBpZW50IGtleSBJRHMgaW50byBlbmNyeXB0 +ZWQgbWVzc2FnZXMuIFRoaXMgaGVscHMgdG8KaGlkZSB0aGUgcmVjZWl2ZXJzIG9m +IHRoZSBtZXNzYWdlIGFuZCBpcyBhIGxpbWl0ZWQgY291bnRlcm1lYXN1cmUKYWdh +aW5zdCB0cmFmZmljIGFuYWx5c2lzLkBmb290bm90ZXtVc2luZyBhIGxpdHRsZSBz +b2NpYWwgZW5naW5lZXJpbmcKYW55b25lIHdobyBpcyBhYmxlIHRvIGRlY3J5cHQg +dGhlIG1lc3NhZ2UgY2FuIGNoZWNrIHdoZXRoZXIgb25lIG9mIHRoZQpvdGhlciBy +ZWNpcGllbnRzIGlzIHRoZSBvbmUgaGUgc3VzcGVjdHMufSAgT24gdGhlIHJlY2Vp +dmluZyBzaWRlLCBpdCBtYXkKc2xvdyBkb3duIHRoZSBkZWNyeXB0aW9uIHByb2Nl +c3MgYmVjYXVzZSBhbGwgYXZhaWxhYmxlIHNlY3JldCBrZXlzIG11c3QKYmUgdHJp +ZWQuICBAb3B0aW9uey0tbm8tdGhyb3cta2V5aWRzfSBkaXNhYmxlcyB0aGlzIG9w +dGlvbi4gVGhpcyBvcHRpb24KaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdXNp +bmcgQG9wdGlvbnstLWhpZGRlbi1yZWNpcGllbnR9IGZvciBhbGwKcmVjaXBpZW50 +cy4KCkBpdGVtIC0tbm90LWRhc2gtZXNjYXBlZApAb3BpbmRleCBub3QtZGFzaC1l +c2NhcGVkClRoaXMgb3B0aW9uIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mIGNsZWFy +dGV4dCBzaWduYXR1cmVzCnNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBmb3IgcGF0 +Y2ggZmlsZXMuIFlvdSBzaG91bGQgbm90CnNlbmQgc3VjaCBhbiBhcm1vcmVkIGZp +bGUgdmlhIGVtYWlsIGJlY2F1c2UgYWxsIHNwYWNlcwphbmQgbGluZSBlbmRpbmdz +IGFyZSBoYXNoZWQgdG9vLiBZb3UgY2FuIG5vdCB1c2UgdGhpcwpvcHRpb24gZm9y +IGRhdGEgd2hpY2ggaGFzIDUgZGFzaGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYQps +aW5lLCBwYXRjaCBmaWxlcyBkb24ndCBoYXZlIHRoaXMuIEEgc3BlY2lhbCBhcm1v +ciBoZWFkZXIKbGluZSB0ZWxscyBHbnVQRyBhYm91dCB0aGlzIGNsZWFydGV4dCBz +aWduYXR1cmUgb3B0aW9uLgoKQGl0ZW0gLS1lc2NhcGUtZnJvbS1saW5lcwpAaXRl +bXggLS1uby1lc2NhcGUtZnJvbS1saW5lcwpAb3BpbmRleCBlc2NhcGUtZnJvbS1s +aW5lcwpCZWNhdXNlIHNvbWUgbWFpbGVycyBjaGFuZ2UgbGluZXMgc3RhcnRpbmcg +d2l0aCAiRnJvbSAiIHRvICI+RnJvbSAiIGl0CmlzIGdvb2QgdG8gaGFuZGxlIHN1 +Y2ggbGluZXMgaW4gYSBzcGVjaWFsIHdheSB3aGVuIGNyZWF0aW5nIGNsZWFydGV4 +dApzaWduYXR1cmVzIHRvIHByZXZlbnQgdGhlIG1haWwgc3lzdGVtIGZyb20gYnJl +YWtpbmcgdGhlIHNpZ25hdHVyZS4gTm90ZQp0aGF0IGFsbCBvdGhlciBQR1AgdmVy +c2lvbnMgZG8gaXQgdGhpcyB3YXkgdG9vLiAgRW5hYmxlZCBieQpkZWZhdWx0LiBA +b3B0aW9uey0tbm8tZXNjYXBlLWZyb20tbGluZXN9IGRpc2FibGVzIHRoaXMgb3B0 +aW9uLgoKQGl0ZW0gLS1wYXNzcGhyYXNlLXJlcGVhdCBAY29kZXtufQpAb3BpbmRl +eCBwYXNzcGhyYXNlLXJlcGVhdApTcGVjaWZ5IGhvdyBtYW55IHRpbWVzIEBjb21t +YW5ke0BncGduYW1lfSB3aWxsIHJlcXVlc3QgYSBuZXcKcGFzc3BocmFzZSBiZSBy +ZXBlYXRlZC4gIFRoaXMgaXMgdXNlZnVsIGZvciBoZWxwaW5nIG1lbW9yaXplIGEK +cGFzc3BocmFzZS4gIERlZmF1bHRzIHRvIDEgcmVwZXRpdGlvbi4KCkBpdGVtIC0t +cGFzc3BocmFzZS1mZCBAY29kZXtufQpAb3BpbmRleCBwYXNzcGhyYXNlLWZkClJl +YWQgdGhlIHBhc3NwaHJhc2UgZnJvbSBmaWxlIGRlc2NyaXB0b3IgQGNvZGV7bn0u +IE9ubHkgdGhlIGZpcnN0IGxpbmUKd2lsbCBiZSByZWFkIGZyb20gZmlsZSBkZXNj +cmlwdG9yIEBjb2Rle259LiBJZiB5b3UgdXNlIDAgZm9yIEBjb2Rle259LAp0aGUg +cGFzc3BocmFzZSB3aWxsIGJlIHJlYWQgZnJvbSBTVERJTi4gVGhpcyBjYW4gb25s +eSBiZSB1c2VkIGlmIG9ubHkKb25lIHBhc3NwaHJhc2UgaXMgc3VwcGxpZWQuCgpO +b3RlIHRoYXQgdGhpcyBwYXNzcGhyYXNlIGlzIG9ubHkgdXNlZCBpZiB0aGUgb3B0 +aW9uIEBvcHRpb257LS1iYXRjaH0KaGFzIGFsc28gYmVlbiBnaXZlbi4gIFRoaXMg +aXMgZGlmZmVyZW50IGZyb20gR251UEcgdmVyc2lvbiAxLnguCgpAaXRlbSAtLXBh +c3NwaHJhc2UtZmlsZSBAY29kZXtmaWxlfQpAb3BpbmRleCBwYXNzcGhyYXNlLWZp +bGUKUmVhZCB0aGUgcGFzc3BocmFzZSBmcm9tIGZpbGUgQGNvZGV7ZmlsZX0uIE9u +bHkgdGhlIGZpcnN0IGxpbmUgd2lsbApiZSByZWFkIGZyb20gZmlsZSBAY29kZXtm +aWxlfS4gVGhpcyBjYW4gb25seSBiZSB1c2VkIGlmIG9ubHkgb25lCnBhc3NwaHJh +c2UgaXMgc3VwcGxpZWQuIE9idmlvdXNseSwgYSBwYXNzcGhyYXNlIHN0b3JlZCBp +biBhIGZpbGUgaXMKb2YgcXVlc3Rpb25hYmxlIHNlY3VyaXR5IGlmIG90aGVyIHVz +ZXJzIGNhbiByZWFkIHRoaXMgZmlsZS4gRG9uJ3QgdXNlCnRoaXMgb3B0aW9uIGlm +IHlvdSBjYW4gYXZvaWQgaXQuCk5vdGUgdGhhdCB0aGlzIHBhc3NwaHJhc2UgaXMg +b25seSB1c2VkIGlmIHRoZSBvcHRpb24gQG9wdGlvbnstLWJhdGNofQpoYXMgYWxz +byBiZWVuIGdpdmVuLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBHbnVQRyB2ZXJz +aW9uIDEueC4KCkBpdGVtIC0tcGFzc3BocmFzZSBAY29kZXtzdHJpbmd9CkBvcGlu +ZGV4IHBhc3NwaHJhc2UKVXNlIEBjb2Rle3N0cmluZ30gYXMgdGhlIHBhc3NwaHJh +c2UuIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBpZiBvbmx5IG9uZQpwYXNzcGhyYXNl +IGlzIHN1cHBsaWVkLiBPYnZpb3VzbHksIHRoaXMgaXMgb2YgdmVyeSBxdWVzdGlv +bmFibGUKc2VjdXJpdHkgb24gYSBtdWx0aS11c2VyIHN5c3RlbS4gRG9uJ3QgdXNl +IHRoaXMgb3B0aW9uIGlmIHlvdSBjYW4KYXZvaWQgaXQuCk5vdGUgdGhhdCB0aGlz +IHBhc3NwaHJhc2UgaXMgb25seSB1c2VkIGlmIHRoZSBvcHRpb24gQG9wdGlvbnst +LWJhdGNofQpoYXMgYWxzbyBiZWVuIGdpdmVuLiAgVGhpcyBpcyBkaWZmZXJlbnQg +ZnJvbSBHbnVQRyB2ZXJzaW9uIDEueC4KCkBpdGVtIC0tcGluZW50cnktbW9kZSBA +Y29kZXttb2RlfQpAb3BpbmRleCBwaW5lbnRyeS1tb2RlClNldCB0aGUgcGluZW50 +cnkgbW9kZSB0byBAY29kZXttb2RlfS4gIEFsbG93ZWQgdmFsdWVzIGZvciBAY29k +ZXttb2RlfQphcmU6CkB0YWJsZSBAYXNpcwogIEBpdGVtIGRlZmF1bHQKICBVc2Ug +dGhlIGRlZmF1bHQgb2YgdGhlIGFnZW50LCB3aGljaCBpcyBAY29kZXthc2t9Lgog +IEBpdGVtIGFzawogIEZvcmNlIHRoZSB1c2Ugb2YgdGhlIFBpbmVudHJ5LgogIEBp +dGVtIGNhbmNlbAogIEVtdWxhdGUgdXNlIG9mIFBpbmVudHJ5J3MgY2FuY2VsIGJ1 +dHRvbi4KICBAaXRlbSBlcnJvcgogIFJldHVybiBhIFBpbmVudHJ5IGVycm9yIChg +YE5vIFBpbmVudHJ5JycpLgogIEBpdGVtIGxvb3BiYWNrCiAgUmVkaXJlY3QgUGlu +ZW50cnkgcXVlcmllcyB0byB0aGUgY2FsbGVyLiAgTm90ZSB0aGF0IGluIGNvbnRy +YXN0IHRvCiAgUGluZW50cnkgdGhlIHVzZXIgaXMgbm90IHByb21wdGVkIGFnYWlu +IGlmIGhlIGVudGVycyBhIGJhZCBwYXNzd29yZC4KQGVuZCB0YWJsZQoKQGl0ZW0g +LS1jb21tYW5kLWZkIEBjb2Rle259CkBvcGluZGV4IGNvbW1hbmQtZmQKVGhpcyBp +cyBhIHJlcGxhY2VtZW50IGZvciB0aGUgZGVwcmVjYXRlZCBzaGFyZWQtbWVtb3J5 +IElQQyBtb2RlLgpJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB1c2VyIGlucHV0 +IG9uIHF1ZXN0aW9ucyBpcyBub3QgZXhwZWN0ZWQKZnJvbSB0aGUgVFRZIGJ1dCBm +cm9tIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuIEl0IHNob3VsZCBiZSB1c2Vk +CnRvZ2V0aGVyIHdpdGggQG9wdGlvbnstLXN0YXR1cy1mZH0uIFNlZSB0aGUgZmls +ZSBkb2MvREVUQUlMUyBpbiB0aGUgc291cmNlCmRpc3RyaWJ1dGlvbiBmb3IgZGV0 +YWlscyBvbiBob3cgdG8gdXNlIGl0LgoKQGl0ZW0gLS1jb21tYW5kLWZpbGUgQGNv +ZGV7ZmlsZX0KQG9waW5kZXggY29tbWFuZC1maWxlClNhbWUgYXMgQG9wdGlvbnst +LWNvbW1hbmQtZmR9LCBleGNlcHQgdGhlIGNvbW1hbmRzIGFyZSByZWFkIG91dCBv +ZiBmaWxlCkBjb2Rle2ZpbGV9CgpAaXRlbSAtLWFsbG93LW5vbi1zZWxmc2lnbmVk +LXVpZApAaXRlbXggLS1uby1hbGxvdy1ub24tc2VsZnNpZ25lZC11aWQKQG9waW5k +ZXggYWxsb3ctbm9uLXNlbGZzaWduZWQtdWlkCkFsbG93IHRoZSBpbXBvcnQgYW5k +IHVzZSBvZiBrZXlzIHdpdGggdXNlciBJRHMgd2hpY2ggYXJlIG5vdApzZWxmLXNp +Z25lZC4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQsIGFzIGEgbm9uIHNlbGYtc2ln +bmVkIHVzZXIgSUQgaXMKdHJpdmlhbCB0byBmb3JnZS4gQG9wdGlvbnstLW5vLWFs +bG93LW5vbi1zZWxmc2lnbmVkLXVpZH0gZGlzYWJsZXMuCgpAaXRlbSAtLWFsbG93 +LWZyZWVmb3JtLXVpZApAb3BpbmRleCBhbGxvdy1mcmVlZm9ybS11aWQKRGlzYWJs +ZSBhbGwgY2hlY2tzIG9uIHRoZSBmb3JtIG9mIHRoZSB1c2VyIElEIHdoaWxlIGdl +bmVyYXRpbmcgYSBuZXcKb25lLiBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSB1 +c2VkIGluIHZlcnkgc3BlY2lhbCBlbnZpcm9ubWVudHMgYXMKaXQgZG9lcyBub3Qg +ZW5zdXJlIHRoZSBkZS1mYWN0byBzdGFuZGFyZCBmb3JtYXQgb2YgdXNlciBJRHMu +CgpAaXRlbSAtLWlnbm9yZS10aW1lLWNvbmZsaWN0CkBvcGluZGV4IGlnbm9yZS10 +aW1lLWNvbmZsaWN0CkdudVBHIG5vcm1hbGx5IGNoZWNrcyB0aGF0IHRoZSB0aW1l +c3RhbXBzIGFzc29jaWF0ZWQgd2l0aCBrZXlzIGFuZApzaWduYXR1cmVzIGhhdmUg +cGxhdXNpYmxlIHZhbHVlcy4gSG93ZXZlciwgc29tZXRpbWVzIGEgc2lnbmF0dXJl +CnNlZW1zIHRvIGJlIG9sZGVyIHRoYW4gdGhlIGtleSBkdWUgdG8gY2xvY2sgcHJv +YmxlbXMuIFRoaXMgb3B0aW9uCm1ha2VzIHRoZXNlIGNoZWNrcyBqdXN0IGEgd2Fy +bmluZy4gU2VlIGFsc28gQG9wdGlvbnstLWlnbm9yZS12YWxpZC1mcm9tfSBmb3IK +dGltZXN0YW1wIGlzc3VlcyBvbiBzdWJrZXlzLgoKQGl0ZW0gLS1pZ25vcmUtdmFs +aWQtZnJvbQpAb3BpbmRleCBpZ25vcmUtdmFsaWQtZnJvbQpHbnVQRyBub3JtYWxs +eSBkb2VzIG5vdCBzZWxlY3QgYW5kIHVzZSBzdWJrZXlzIGNyZWF0ZWQgaW4gdGhl +IGZ1dHVyZS4KVGhpcyBvcHRpb24gYWxsb3dzIHRoZSB1c2Ugb2Ygc3VjaCBrZXlz +IGFuZCB0aHVzIGV4aGliaXRzIHRoZQpwcmUtMS4wLjcgYmVoYXZpb3VyLiBZb3Ug +c2hvdWxkIG5vdCB1c2UgdGhpcyBvcHRpb24gdW5sZXNzIHRoZXJlCmlzIHNvbWUg +Y2xvY2sgcHJvYmxlbS4gU2VlIGFsc28gQG9wdGlvbnstLWlnbm9yZS10aW1lLWNv +bmZsaWN0fSBmb3IgdGltZXN0YW1wCmlzc3VlcyB3aXRoIHNpZ25hdHVyZXMuCgpA +aXRlbSAtLWlnbm9yZS1jcmMtZXJyb3IKQG9waW5kZXggaWdub3JlLWNyYy1lcnJv +cgpUaGUgQVNDSUkgYXJtb3IgdXNlZCBieSBPcGVuUEdQIGlzIHByb3RlY3RlZCBi +eSBhIENSQyBjaGVja3N1bSBhZ2FpbnN0CnRyYW5zbWlzc2lvbiBlcnJvcnMuIE9j +Y2FzaW9uYWxseSB0aGUgQ1JDIGdldHMgbWFuZ2xlZCBzb21ld2hlcmUgb24KdGhl +IHRyYW5zbWlzc2lvbiBjaGFubmVsIGJ1dCB0aGUgYWN0dWFsIGNvbnRlbnQgKHdo +aWNoIGlzIHByb3RlY3RlZCBieQp0aGUgT3BlblBHUCBwcm90b2NvbCBhbnl3YXkp +IGlzIHN0aWxsIG9rYXkuIFRoaXMgb3B0aW9uIGFsbG93cyBHbnVQRwp0byBpZ25v +cmUgQ1JDIGVycm9ycy4KCkBpdGVtIC0taWdub3JlLW1kYy1lcnJvcgpAb3BpbmRl +eCBpZ25vcmUtbWRjLWVycm9yClRoaXMgb3B0aW9uIGNoYW5nZXMgYSBNREMgaW50 +ZWdyaXR5IHByb3RlY3Rpb24gZmFpbHVyZSBpbnRvIGEgd2FybmluZy4KVGhpcyBj +YW4gYmUgdXNlZnVsIGlmIGEgbWVzc2FnZSBpcyBwYXJ0aWFsbHkgY29ycnVwdCwg +YnV0IGl0IGlzCm5lY2Vzc2FyeSB0byBnZXQgYXMgbXVjaCBkYXRhIGFzIHBvc3Np +YmxlIG91dCBvZiB0aGUgY29ycnVwdCBtZXNzYWdlLgpIb3dldmVyLCBiZSBhd2Fy +ZSB0aGF0IGEgTURDIHByb3RlY3Rpb24gZmFpbHVyZSBtYXkgYWxzbyBtZWFuIHRo +YXQgdGhlCm1lc3NhZ2Ugd2FzIHRhbXBlcmVkIHdpdGggaW50ZW50aW9uYWxseSBi +eSBhbiBhdHRhY2tlci4KCkBpdGVtIC0tYWxsb3ctd2Vhay1kaWdlc3QtYWxnb3MK +QG9waW5kZXggYWxsb3ctd2Vhay1kaWdlc3QtYWxnb3MKU2lnbmF0dXJlcyBtYWRl +IHdpdGgga25vd24td2VhayBkaWdlc3QgYWxnb3JpdGhtcyBhcmUgbm9ybWFsbHkK +cmVqZWN0ZWQgd2l0aCBhbiBgYGludmFsaWQgZGlnZXN0IGFsZ29yaXRobScnIG1l +c3NhZ2UuICBUaGlzIG9wdGlvbgphbGxvd3MgdGhlIHZlcmlmaWNhdGlvbiBvZiBz +aWduYXR1cmVzIG1hZGUgd2l0aCBzdWNoIHdlYWsgYWxnb3JpdGhtcy4KTUQ1IGlz +IHRoZSBvbmx5IGRpZ2VzdCBhbGdvcml0aG0gY29uc2lkZXJlZCB3ZWFrIGJ5IGRl +ZmF1bHQuICBTZWUgYWxzbwpAb3B0aW9uey0td2Vhay1kaWdlc3R9IHRvIHJlamVj +dCBvdGhlciBkaWdlc3QgYWxnb3JpdGhtcy4KCkBpdGVtIC0td2Vhay1kaWdlc3Qg +QGNvZGV7bmFtZX0KQG9waW5kZXggd2Vhay1kaWdlc3QKVHJlYXQgdGhlIHNwZWNp +ZmllZCBkaWdlc3QgYWxnb3JpdGhtIGFzIHdlYWsuICBTaWduYXR1cmVzIG1hZGUg +b3Zlcgp3ZWFrIGRpZ2VzdHMgYWxnb3JpdGhtcyBhcmUgbm9ybWFsbHkgcmVqZWN0 +ZWQuIFRoaXMgb3B0aW9uIGNhbiBiZQpzdXBwbGllZCBtdWx0aXBsZSB0aW1lcyBp +ZiBtdWx0aXBsZSBhbGdvcml0aG1zIHNob3VsZCBiZSBjb25zaWRlcmVkCndlYWsu +ICBTZWUgYWxzbyBAb3B0aW9uey0tYWxsb3ctd2Vhay1kaWdlc3QtYWxnb3N9IHRv +IGRpc2FibGUKcmVqZWN0aW9uIG9mIHdlYWsgZGlnZXN0cy4gIE1ENSBpcyBhbHdh +eXMgY29uc2lkZXJlZCB3ZWFrLCBhbmQgZG9lcwpub3QgbmVlZCB0byBiZSBsaXN0 +ZWQgZXhwbGljaXRseS4KCkBpdGVtIC0tbm8tZGVmYXVsdC1rZXlyaW5nCkBvcGlu +ZGV4IG5vLWRlZmF1bHQta2V5cmluZwpEbyBub3QgYWRkIHRoZSBkZWZhdWx0IGtl +eXJpbmdzIHRvIHRoZSBsaXN0IG9mIGtleXJpbmdzLiBOb3RlIHRoYXQKR251UEcg +d2lsbCBub3Qgb3BlcmF0ZSB3aXRob3V0IGFueSBrZXlyaW5ncywgc28gaWYgeW91 +IHVzZSB0aGlzIG9wdGlvbgphbmQgZG8gbm90IHByb3ZpZGUgYWx0ZXJuYXRlIGtl +eXJpbmdzIHZpYSBAb3B0aW9uey0ta2V5cmluZ30gb3IKQG9wdGlvbnstLXNlY3Jl +dC1rZXlyaW5nfSwgdGhlbiBHbnVQRyB3aWxsIHN0aWxsIHVzZSB0aGUgZGVmYXVs +dCBwdWJsaWMgb3IKc2VjcmV0IGtleXJpbmdzLgoKQGl0ZW0gLS1za2lwLXZlcmlm +eQpAb3BpbmRleCBza2lwLXZlcmlmeQpTa2lwIHRoZSBzaWduYXR1cmUgdmVyaWZp +Y2F0aW9uIHN0ZXAuIFRoaXMgbWF5IGJlCnVzZWQgdG8gbWFrZSB0aGUgZGVjcnlw +dGlvbiBmYXN0ZXIgaWYgdGhlIHNpZ25hdHVyZQp2ZXJpZmljYXRpb24gaXMgbm90 +IG5lZWRlZC4KCkBpdGVtIC0td2l0aC1rZXktZGF0YQpAb3BpbmRleCB3aXRoLWtl +eS1kYXRhClByaW50IGtleSBsaXN0aW5ncyBkZWxpbWl0ZWQgYnkgY29sb25zIChs +aWtlIEBvcHRpb257LS13aXRoLWNvbG9uc30pIGFuZApwcmludCB0aGUgcHVibGlj +IGtleSBkYXRhLgoKQGl0ZW0gLS1mYXN0LWxpc3QtbW9kZQpAb3BpbmRleCBmYXN0 +LWxpc3QtbW9kZQpDaGFuZ2VzIHRoZSBvdXRwdXQgb2YgdGhlIGxpc3QgY29tbWFu +ZHMgdG8gd29yayBmYXN0ZXI7IHRoaXMgaXMgYWNoaWV2ZWQKYnkgbGVhdmluZyBz +b21lIHBhcnRzIGVtcHR5LiBTb21lIGFwcGxpY2F0aW9ucyBkb24ndCBuZWVkIHRo +ZSB1c2VyIElECmFuZCB0aGUgdHJ1c3QgaW5mb3JtYXRpb24gZ2l2ZW4gaW4gdGhl +IGxpc3RpbmdzLiBCeSB1c2luZyB0aGlzIG9wdGlvbnMKdGhleSBjYW4gZ2V0IGEg +ZmFzdGVyIGxpc3RpbmcuIFRoZSBleGFjdCBiZWhhdmlvdXIgb2YgdGhpcyBvcHRp +b24gbWF5CmNoYW5nZSBpbiBmdXR1cmUgdmVyc2lvbnMuICBJZiB5b3UgYXJlIG1p +c3Npbmcgc29tZSBpbmZvcm1hdGlvbiwgZG9uJ3QKdXNlIHRoaXMgb3B0aW9uLgoK +QGl0ZW0gLS1uby1saXRlcmFsCkBvcGluZGV4IG5vLWxpdGVyYWwKVGhpcyBpcyBu +b3QgZm9yIG5vcm1hbCB1c2UuIFVzZSB0aGUgc291cmNlIHRvIHNlZSBmb3Igd2hh +dCBpdCBtaWdodCBiZSB1c2VmdWwuCgpAaXRlbSAtLXNldC1maWxlc2l6ZQpAb3Bp +bmRleCBzZXQtZmlsZXNpemUKVGhpcyBpcyBub3QgZm9yIG5vcm1hbCB1c2UuIFVz +ZSB0aGUgc291cmNlIHRvIHNlZSBmb3Igd2hhdCBpdCBtaWdodCBiZSB1c2VmdWwu +CgpAaXRlbSAtLXNob3ctc2Vzc2lvbi1rZXkKQG9waW5kZXggc2hvdy1zZXNzaW9u +LWtleQpEaXNwbGF5IHRoZSBzZXNzaW9uIGtleSB1c2VkIGZvciBvbmUgbWVzc2Fn +ZS4gU2VlCkBvcHRpb257LS1vdmVycmlkZS1zZXNzaW9uLWtleX0gZm9yIHRoZSBj +b3VudGVycGFydCBvZiB0aGlzIG9wdGlvbi4KCldlIHRoaW5rIHRoYXQgS2V5IEVz +Y3JvdyBpcyBhIEJhZCBUaGluZzsgaG93ZXZlciB0aGUgdXNlciBzaG91bGQgaGF2 +ZQp0aGUgZnJlZWRvbSB0byBkZWNpZGUgd2hldGhlciB0byBnbyB0byBwcmlzb24g +b3IgdG8gcmV2ZWFsIHRoZSBjb250ZW50Cm9mIG9uZSBzcGVjaWZpYyBtZXNzYWdl +IHdpdGhvdXQgY29tcHJvbWlzaW5nIGFsbCBtZXNzYWdlcyBldmVyCmVuY3J5cHRl +ZCBmb3Igb25lIHNlY3JldCBrZXkuCgpZb3UgY2FuIGFsc28gdXNlIHRoaXMgb3B0 +aW9uIGlmIHlvdSByZWNlaXZlIGFuIGVuY3J5cHRlZCBtZXNzYWdlIHdoaWNoCmlz +IGFidXNpdmUgb3Igb2ZmZW5zaXZlLCB0byBwcm92ZSB0byB0aGUgYWRtaW5pc3Ry +YXRvcnMgb2YgdGhlCm1lc3NhZ2luZyBzeXN0ZW0gdGhhdCB0aGUgY2lwaGVydGV4 +dCB0cmFuc21pdHRlZCBjb3JyZXNwb25kcyB0byBhbgppbmFwcHJvcHJpYXRlIHBs +YWludGV4dCBzbyB0aGV5IGNhbiB0YWtlIGFjdGlvbiBhZ2FpbnN0IHRoZSBvZmZl +bmRpbmcKdXNlci4KCkBpdGVtIC0tb3ZlcnJpZGUtc2Vzc2lvbi1rZXkgQGNvZGV7 +c3RyaW5nfQpAb3BpbmRleCBvdmVycmlkZS1zZXNzaW9uLWtleQpEb24ndCB1c2Ug +dGhlIHB1YmxpYyBrZXkgYnV0IHRoZSBzZXNzaW9uIGtleSBAY29kZXtzdHJpbmd9 +LiBUaGUgZm9ybWF0Cm9mIHRoaXMgc3RyaW5nIGlzIHRoZSBzYW1lIGFzIHRoZSBv +bmUgcHJpbnRlZCBieQpAb3B0aW9uey0tc2hvdy1zZXNzaW9uLWtleX0uIFRoaXMg +b3B0aW9uIGlzIG5vcm1hbGx5IG5vdCB1c2VkIGJ1dCBjb21lcwpoYW5keSBpbiBj +YXNlIHNvbWVvbmUgZm9yY2VzIHlvdSB0byByZXZlYWwgdGhlIGNvbnRlbnQgb2Yg +YW4gZW5jcnlwdGVkCm1lc3NhZ2U7IHVzaW5nIHRoaXMgb3B0aW9uIHlvdSBjYW4g +ZG8gdGhpcyB3aXRob3V0IGhhbmRpbmcgb3V0IHRoZQpzZWNyZXQga2V5LgoKQGl0 +ZW0gLS1hc2stc2lnLWV4cGlyZQpAaXRlbXggLS1uby1hc2stc2lnLWV4cGlyZQpA +b3BpbmRleCBhc2stc2lnLWV4cGlyZQpXaGVuIG1ha2luZyBhIGRhdGEgc2lnbmF0 +dXJlLCBwcm9tcHQgZm9yIGFuIGV4cGlyYXRpb24gdGltZS4gSWYgdGhpcwpvcHRp +b24gaXMgbm90IHNwZWNpZmllZCwgdGhlIGV4cGlyYXRpb24gdGltZSBzZXQgdmlh +CkBvcHRpb257LS1kZWZhdWx0LXNpZy1leHBpcmV9IGlzIHVzZWQuIEBvcHRpb257 +LS1uby1hc2stc2lnLWV4cGlyZX0KZGlzYWJsZXMgdGhpcyBvcHRpb24uCgpAaXRl +bSAtLWRlZmF1bHQtc2lnLWV4cGlyZQpAb3BpbmRleCBkZWZhdWx0LXNpZy1leHBp +cmUKVGhlIGRlZmF1bHQgZXhwaXJhdGlvbiB0aW1lIHRvIHVzZSBmb3Igc2lnbmF0 +dXJlIGV4cGlyYXRpb24uIFZhbGlkCnZhbHVlcyBhcmUgIjAiIGZvciBubyBleHBp +cmF0aW9uLCBhIG51bWJlciBmb2xsb3dlZCBieSB0aGUgbGV0dGVyIGQKKGZvciBk +YXlzKSwgdyAoZm9yIHdlZWtzKSwgbSAoZm9yIG1vbnRocyksIG9yIHkgKGZvciB5 +ZWFycykgKGZvcgpleGFtcGxlICIybSIgZm9yIHR3byBtb250aHMsIG9yICI1eSIg +Zm9yIGZpdmUgeWVhcnMpLCBvciBhbiBhYnNvbHV0ZQpkYXRlIGluIHRoZSBmb3Jt +IFlZWVktTU0tREQuIERlZmF1bHRzIHRvICIwIi4KCkBpdGVtIC0tYXNrLWNlcnQt +ZXhwaXJlCkBpdGVteCAtLW5vLWFzay1jZXJ0LWV4cGlyZQpAb3BpbmRleCBhc2st +Y2VydC1leHBpcmUKV2hlbiBtYWtpbmcgYSBrZXkgc2lnbmF0dXJlLCBwcm9tcHQg +Zm9yIGFuIGV4cGlyYXRpb24gdGltZS4gSWYgdGhpcwpvcHRpb24gaXMgbm90IHNw +ZWNpZmllZCwgdGhlIGV4cGlyYXRpb24gdGltZSBzZXQgdmlhCkBvcHRpb257LS1k +ZWZhdWx0LWNlcnQtZXhwaXJlfSBpcyB1c2VkLiBAb3B0aW9uey0tbm8tYXNrLWNl +cnQtZXhwaXJlfQpkaXNhYmxlcyB0aGlzIG9wdGlvbi4KCkBpdGVtIC0tZGVmYXVs +dC1jZXJ0LWV4cGlyZQpAb3BpbmRleCBkZWZhdWx0LWNlcnQtZXhwaXJlClRoZSBk +ZWZhdWx0IGV4cGlyYXRpb24gdGltZSB0byB1c2UgZm9yIGtleSBzaWduYXR1cmUg +ZXhwaXJhdGlvbi4KVmFsaWQgdmFsdWVzIGFyZSAiMCIgZm9yIG5vIGV4cGlyYXRp +b24sIGEgbnVtYmVyIGZvbGxvd2VkIGJ5IHRoZQpsZXR0ZXIgZCAoZm9yIGRheXMp +LCB3IChmb3Igd2Vla3MpLCBtIChmb3IgbW9udGhzKSwgb3IgeSAoZm9yIHllYXJz +KQooZm9yIGV4YW1wbGUgIjJtIiBmb3IgdHdvIG1vbnRocywgb3IgIjV5IiBmb3Ig +Zml2ZSB5ZWFycyksIG9yIGFuCmFic29sdXRlIGRhdGUgaW4gdGhlIGZvcm0gWVlZ +WS1NTS1ERC4gRGVmYXVsdHMgdG8gIjAiLgoKQGl0ZW0gLS1hbGxvdy1zZWNyZXQt +a2V5LWltcG9ydApAb3BpbmRleCBhbGxvdy1zZWNyZXQta2V5LWltcG9ydApUaGlz +IGlzIGFuIG9ic29sZXRlIG9wdGlvbiBhbmQgaXMgbm90IHVzZWQgYW55d2hlcmUu +CgpAaXRlbSAtLWFsbG93LW11bHRpcGxlLW1lc3NhZ2VzCkBpdGVtIC0tbm8tYWxs +b3ctbXVsdGlwbGUtbWVzc2FnZXMKQG9waW5kZXggYWxsb3ctbXVsdGlwbGUtbWVz +c2FnZXMKQWxsb3cgcHJvY2Vzc2luZyBvZiBtdWx0aXBsZSBPcGVuUEdQIG1lc3Nh +Z2VzIGNvbnRhaW5lZCBpbiBhIHNpbmdsZSBmaWxlCm9yIHN0cmVhbS4gIFNvbWUg +cHJvZ3JhbXMgdGhhdCBjYWxsIEdQRyBhcmUgbm90IHByZXBhcmVkIHRvIGRlYWwg +d2l0aAptdWx0aXBsZSBtZXNzYWdlcyBiZWluZyBwcm9jZXNzZWQgdG9nZXRoZXIs +IHNvIHRoaXMgb3B0aW9uIGRlZmF1bHRzIHRvCm5vLiAgTm90ZSB0aGF0IHZlcnNp +b25zIG9mIEdQRyBwcmlvciB0byAxLjQuNyBhbHdheXMgYWxsb3dlZCBtdWx0aXBs +ZQptZXNzYWdlcy4KCldhcm5pbmc6IERvIG5vdCB1c2UgdGhpcyBvcHRpb24gdW5s +ZXNzIHlvdSBuZWVkIGl0IGFzIGEgdGVtcG9yYXJ5Cndvcmthcm91bmQhCgoKQGl0 +ZW0gLS1lbmFibGUtc3BlY2lhbC1maWxlbmFtZXMKQG9waW5kZXggZW5hYmxlLXNw +ZWNpYWwtZmlsZW5hbWVzClRoaXMgb3B0aW9ucyBlbmFibGVzIGEgbW9kZSBpbiB3 +aGljaCBmaWxlbmFtZXMgb2YgdGhlIGZvcm0KQGZpbGV7LSZufSwgd2hlcmUgbiBp +cyBhIG5vbi1uZWdhdGl2ZSBkZWNpbWFsIG51bWJlciwKcmVmZXIgdG8gdGhlIGZp +bGUgZGVzY3JpcHRvciBuIGFuZCBub3QgdG8gYSBmaWxlIHdpdGggdGhhdCBuYW1l +LgoKQGl0ZW0gLS1uby1leHBlbnNpdmUtdHJ1c3QtY2hlY2tzCkBvcGluZGV4IG5v +LWV4cGVuc2l2ZS10cnVzdC1jaGVja3MKRXhwZXJpbWVudGFsIHVzZSBvbmx5LgoK +QGl0ZW0gLS1wcmVzZXJ2ZS1wZXJtaXNzaW9ucwpAb3BpbmRleCBwcmVzZXJ2ZS1w +ZXJtaXNzaW9ucwpEb24ndCBjaGFuZ2UgdGhlIHBlcm1pc3Npb25zIG9mIGEgc2Vj +cmV0IGtleXJpbmcgYmFjayB0byB1c2VyCnJlYWQvd3JpdGUgb25seS4gVXNlIHRo +aXMgb3B0aW9uIG9ubHkgaWYgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFyZSBk +b2luZy4KCkBpdGVtIC0tZGVmYXVsdC1wcmVmZXJlbmNlLWxpc3QgQGNvZGV7c3Ry +aW5nfQpAb3BpbmRleCBkZWZhdWx0LXByZWZlcmVuY2UtbGlzdApTZXQgdGhlIGxp +c3Qgb2YgZGVmYXVsdCBwcmVmZXJlbmNlcyB0byBAY29kZXtzdHJpbmd9LiBUaGlz +IHByZWZlcmVuY2UKbGlzdCBpcyB1c2VkIGZvciBuZXcga2V5cyBhbmQgYmVjb21l +cyB0aGUgZGVmYXVsdCBmb3IgInNldHByZWYiIGluIHRoZQplZGl0IG1lbnUuCgpA +aXRlbSAtLWRlZmF1bHQta2V5c2VydmVyLXVybCBAY29kZXtuYW1lfQpAb3BpbmRl +eCBkZWZhdWx0LWtleXNlcnZlci11cmwKU2V0IHRoZSBkZWZhdWx0IGtleXNlcnZl +ciBVUkwgdG8gQGNvZGV7bmFtZX0uIFRoaXMga2V5c2VydmVyIHdpbGwgYmUKdXNl +ZCBhcyB0aGUga2V5c2VydmVyIFVSTCB3aGVuIHdyaXRpbmcgYSBuZXcgc2VsZi1z +aWduYXR1cmUgb24gYSBrZXksCndoaWNoIGluY2x1ZGVzIGtleSBnZW5lcmF0aW9u +IGFuZCBjaGFuZ2luZyBwcmVmZXJlbmNlcy4KCkBpdGVtIC0tbGlzdC1jb25maWcK +QG9waW5kZXggbGlzdC1jb25maWcKRGlzcGxheSB2YXJpb3VzIGludGVybmFsIGNv +bmZpZ3VyYXRpb24gcGFyYW1ldGVycyBvZiBHbnVQRy4gVGhpcyBvcHRpb24KaXMg +aW50ZW5kZWQgZm9yIGV4dGVybmFsIHByb2dyYW1zIHRoYXQgY2FsbCBHbnVQRyB0 +byBwZXJmb3JtIHRhc2tzLCBhbmQKaXMgdGh1cyBub3QgZ2VuZXJhbGx5IHVzZWZ1 +bC4gU2VlIHRoZSBmaWxlIEBmaWxle2RvYy9ERVRBSUxTfSBpbiB0aGUKc291cmNl +IGRpc3RyaWJ1dGlvbiBmb3IgdGhlIGRldGFpbHMgb2Ygd2hpY2ggY29uZmlndXJh +dGlvbiBpdGVtcyBtYXkgYmUKbGlzdGVkLiBAb3B0aW9uey0tbGlzdC1jb25maWd9 +IGlzIG9ubHkgdXNhYmxlIHdpdGgKQG9wdGlvbnstLXdpdGgtY29sb25zfSBzZXQu +CgpAaXRlbSAtLWxpc3QtZ2NyeXB0LWNvbmZpZwpAb3BpbmRleCBsaXN0LWdjcnlw +dC1jb25maWcKRGlzcGxheSB2YXJpb3VzIGludGVybmFsIGNvbmZpZ3VyYXRpb24g +cGFyYW1ldGVycyBvZiBMaWJnY3J5cHQuCgpAaXRlbSAtLWdwZ2NvbmYtbGlzdApA +b3BpbmRleCBncGdjb25mLWxpc3QKVGhpcyBjb21tYW5kIGlzIHNpbWlsYXIgdG8g +QG9wdGlvbnstLWxpc3QtY29uZmlnfSBidXQgaW4gZ2VuZXJhbCBvbmx5CmludGVy +bmFsbHkgdXNlZCBieSB0aGUgQGNvbW1hbmR7Z3BnY29uZn0gdG9vbC4KCkBpdGVt +IC0tZ3BnY29uZi10ZXN0CkBvcGluZGV4IGdwZ2NvbmYtdGVzdApUaGlzIGlzIG1v +cmUgb3IgbGVzcyBkdW1teSBhY3Rpb24uICBIb3dldmVyIGl0IHBhcnNlcyB0aGUg +Y29uZmlndXJhdGlvbgpmaWxlIGFuZCByZXR1cm5zIHdpdGggZmFpbHVyZSBpZiB0 +aGUgY29uZmlndXJhdGlvbiBmaWxlIHdvdWxkIHByZXZlbnQKQGNvbW1hbmR7Z3Bn +fSBmcm9tIHN0YXJ0dXAuICBUaHVzIGl0IG1heSBiZSB1c2VkIHRvIHJ1biBhIHN5 +bnRheCBjaGVjawpvbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgoKQGVuZCB0YWJs +ZQoKQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAYyAqKioqKioq +IERlcHJlY2F0ZWQgKioqKioqKioqKioqCkBjICoqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioKQG5vZGUgRGVwcmVjYXRlZCBPcHRpb25zCkBzdWJzZWN0aW9u +IERlcHJlY2F0ZWQgb3B0aW9ucwoKQHRhYmxlIEBnbnVwZ3RhYm9wdAoKQGl0ZW0g +LS1zaG93LXBob3RvcwpAaXRlbXggLS1uby1zaG93LXBob3RvcwpAb3BpbmRleCBz +aG93LXBob3RvcwpDYXVzZXMgQG9wdGlvbnstLWxpc3Qta2V5c30sIEBvcHRpb257 +LS1saXN0LXNpZ3N9LApAb3B0aW9uey0tbGlzdC1wdWJsaWMta2V5c30sIEBvcHRp +b257LS1saXN0LXNlY3JldC1rZXlzfSwgYW5kIHZlcmlmeWluZwphIHNpZ25hdHVy +ZSB0byBhbHNvIGRpc3BsYXkgdGhlIHBob3RvIElEIGF0dGFjaGVkIHRvIHRoZSBr +ZXksIGlmCmFueS4gU2VlIGFsc28gQG9wdGlvbnstLXBob3RvLXZpZXdlcn0uIFRo +ZXNlIG9wdGlvbnMgYXJlIGRlcHJlY2F0ZWQuIFVzZQpAb3B0aW9uey0tbGlzdC1v +cHRpb25zIFtuby1dc2hvdy1waG90b3N9IGFuZC9vciBAb3B0aW9uey0tdmVyaWZ5 +LW9wdGlvbnMKW25vLV1zaG93LXBob3Rvc30gaW5zdGVhZC4KCkBpdGVtIC0tc2hv +dy1rZXlyaW5nCkBvcGluZGV4IHNob3cta2V5cmluZwpEaXNwbGF5IHRoZSBrZXly +aW5nIG5hbWUgYXQgdGhlIGhlYWQgb2Yga2V5IGxpc3RpbmdzIHRvIHNob3cgd2hp +Y2gKa2V5cmluZyBhIGdpdmVuIGtleSByZXNpZGVzIG9uLiBUaGlzIG9wdGlvbiBp +cyBkZXByZWNhdGVkOiB1c2UKQG9wdGlvbnstLWxpc3Qtb3B0aW9ucyBbbm8tXXNo +b3cta2V5cmluZ30gaW5zdGVhZC4KCkBpdGVtIC0tYWx3YXlzLXRydXN0CkBvcGlu +ZGV4IGFsd2F5cy10cnVzdApJZGVudGljYWwgdG8gQG9wdGlvbnstLXRydXN0LW1v +ZGVsIGFsd2F5c30uIFRoaXMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuCgpAaXRlbSAt +LXNob3ctbm90YXRpb24KQGl0ZW14IC0tbm8tc2hvdy1ub3RhdGlvbgpAb3BpbmRl +eCBzaG93LW5vdGF0aW9uClNob3cgc2lnbmF0dXJlIG5vdGF0aW9ucyBpbiB0aGUg +QG9wdGlvbnstLWxpc3Qtc2lnc30gb3IgQG9wdGlvbnstLWNoZWNrLXNpZ3N9IGxp +c3RpbmdzCmFzIHdlbGwgYXMgd2hlbiB2ZXJpZnlpbmcgYSBzaWduYXR1cmUgd2l0 +aCBhIG5vdGF0aW9uIGluIGl0LiBUaGVzZQpvcHRpb25zIGFyZSBkZXByZWNhdGVk +LiBVc2UgQG9wdGlvbnstLWxpc3Qtb3B0aW9ucyBbbm8tXXNob3ctbm90YXRpb259 +CmFuZC9vciBAb3B0aW9uey0tdmVyaWZ5LW9wdGlvbnMgW25vLV1zaG93LW5vdGF0 +aW9ufSBpbnN0ZWFkLgoKQGl0ZW0gLS1zaG93LXBvbGljeS11cmwKQGl0ZW14IC0t +bm8tc2hvdy1wb2xpY3ktdXJsCkBvcGluZGV4IHNob3ctcG9saWN5LXVybApTaG93 +IHBvbGljeSBVUkxzIGluIHRoZSBAb3B0aW9uey0tbGlzdC1zaWdzfSBvciBAb3B0 +aW9uey0tY2hlY2stc2lnc30KbGlzdGluZ3MgYXMgd2VsbCBhcyB3aGVuIHZlcmlm +eWluZyBhIHNpZ25hdHVyZSB3aXRoIGEgcG9saWN5IFVSTCBpbgppdC4gVGhlc2Ug +b3B0aW9ucyBhcmUgZGVwcmVjYXRlZC4gVXNlIEBvcHRpb257LS1saXN0LW9wdGlv +bnMKW25vLV1zaG93LXBvbGljeS11cmx9IGFuZC9vciBAb3B0aW9uey0tdmVyaWZ5 +LW9wdGlvbnMKW25vLV1zaG93LXBvbGljeS11cmx9IGluc3RlYWQuCgoKQGVuZCB0 +YWJsZQoKCkBjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq +KioqKioKQGMgKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioq +KioqKgpAYyAqKioqKioqKioqKioqKiogICBGSUxFUyAgICAqKioqKioqKioqKioq +KioqCkBjICoqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioq +KioKQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq +KgpAbWFuc2VjdCBmaWxlcwpAbm9kZSBHUEcgQ29uZmlndXJhdGlvbgpAc2VjdGlv +biBDb25maWd1cmF0aW9uIGZpbGVzCgpUaGVyZSBhcmUgYSBmZXcgY29uZmlndXJh +dGlvbiBmaWxlcyB0byBjb250cm9sIGNlcnRhaW4gYXNwZWN0cyBvZgpAY29tbWFu +ZHtAZ3BnbmFtZX0ncyBvcGVyYXRpb24uIFVubGVzcyBub3RlZCwgdGhleSBhcmUg +ZXhwZWN0ZWQgaW4gdGhlCmN1cnJlbnQgaG9tZSBkaXJlY3RvcnkgKEBweHJlZntv +cHRpb24gLS1ob21lZGlyfSkuCgpAdGFibGUgQGZpbGUKCiAgQGl0ZW0gZ3BnLmNv +bmYKICBAY2luZGV4IGdwZy5jb25mCiAgVGhpcyBpcyB0aGUgc3RhbmRhcmQgY29u +ZmlndXJhdGlvbiBmaWxlIHJlYWQgYnkgQGNvbW1hbmR7QGdwZ25hbWV9IG9uCiAg +c3RhcnR1cC4gIEl0IG1heSBjb250YWluIGFueSB2YWxpZCBsb25nIG9wdGlvbjsg +dGhlIGxlYWRpbmcgdHdvIGRhc2hlcwogIG1heSBub3QgYmUgZW50ZXJlZCBhbmQg +dGhlIG9wdGlvbiBtYXkgbm90IGJlIGFiYnJldmlhdGVkLiAgVGhpcyBkZWZhdWx0 +CiAgbmFtZSBtYXkgYmUgY2hhbmdlZCBvbiB0aGUgY29tbWFuZCBsaW5lIChAcHhy +ZWZ7Z3BnLW9wdGlvbiAtLW9wdGlvbnN9KS4KICBZb3Ugc2hvdWxkIGJhY2t1cCB0 +aGlzIGZpbGUuCgpAZW5kIHRhYmxlCgpAYyBtYW46LlJFCk5vdGUgdGhhdCBvbiBs +YXJnZXIgaW5zdGFsbGF0aW9ucywgaXQgaXMgdXNlZnVsIHRvIHB1dCBwcmVkZWZp +bmVkIGZpbGVzCmludG8gdGhlIGRpcmVjdG9yeSBAZmlsZXtAdmFsdWV7U1lTQ09O +RlNLRUxESVJ9fSBzbyB0aGF0Cm5ld2x5IGNyZWF0ZWQgdXNlcnMgc3RhcnQgdXAg +d2l0aCBhIHdvcmtpbmcgY29uZmlndXJhdGlvbi4KRm9yIGV4aXN0aW5nIHVzZXJz +IGEgc21hbGwKaGVscGVyIHNjcmlwdCBpcyBwcm92aWRlZCB0byBjcmVhdGUgdGhl +c2UgZmlsZXMgKEBweHJlZnthZGRnbnVwZ2hvbWV9KS4KCkZvciBpbnRlcm5hbCBw +dXJwb3NlcyBAY29tbWFuZHtAZ3BnbmFtZX0gY3JlYXRlcyBhbmQgbWFpbnRhaW5z +IGEgZmV3IG90aGVyCmZpbGVzOyBUaGV5IGFsbCBsaXZlIGluIGluIHRoZSBjdXJy +ZW50IGhvbWUgZGlyZWN0b3J5IChAcHhyZWZ7b3B0aW9uCi0taG9tZWRpcn0pLiAg +T25seSB0aGUgQGNvbW1hbmR7QGdwZ25hbWV9IHByb2dyYW0gbWF5IG1vZGlmeSB0 +aGVzZSBmaWxlcy4KCgpAdGFibGUgQGZpbGUKICBAaXRlbSB+Ly5nbnVwZy9wdWJy +aW5nLmdwZwogIFRoZSBwdWJsaWMga2V5cmluZy4gIFlvdSBzaG91bGQgYmFja3Vw +IHRoaXMgZmlsZS4KCiAgQGl0ZW0gfi8uZ251cGcvcHVicmluZy5ncGcubG9jawog +IFRoZSBsb2NrIGZpbGUgZm9yIHRoZSBwdWJsaWMga2V5cmluZy4KCiAgQGl0ZW0g +fi8uZ251cGcvcHVicmluZy5rYngKICBUaGUgcHVibGljIGtleXJpbmcgdXNpbmcg +YSBkaWZmZXJlbnQgZm9ybWF0LiAgVGhpcyBmaWxlIGlzIHNoYXJyZWQKICB3aXRo +IEBjb21tYW5ke2dwZ3NtfS4gIFlvdSBzaG91bGQgYmFja3VwIHRoaXMgZmlsZS4K +CiAgQGl0ZW0gfi8uZ251cGcvcHVicmluZy5rYngubG9jawogIFRoZSBsb2NrIGZp +bGUgZm9yIEBmaWxle3B1YnJpbmcua2J4fS4KCiAgQGl0ZW0gfi8uZ251cGcvc2Vj +cmluZy5ncGcKICBBIHNlY3JldCBrZXlyaW5nIGFzIHVzZWQgYnkgR251UEcgdmVy +c2lvbnMgYmVmb3JlIDIuMS4gIEl0IGlzIG5vdAogIHVzZWQgYnkgR251UEcgMi4x +IGFuZCBsYXRlci4KCiAgQGl0ZW0gfi8uZ251cGcvLmdwZy12MjEtbWlncmF0ZWQK +ICBGaWxlIGluZGljYXRpbmcgdGhhdCBhIG1pZ3JhdGlvbiB0byBHbnVQRyAyLjEg +aGFzIGJlZW4gZG9uZS4KCiAgQGl0ZW0gfi8uZ251cGcvdHJ1c3RkYi5ncGcKICBU +aGUgdHJ1c3QgZGF0YWJhc2UuICBUaGVyZSBpcyBubyBuZWVkIHRvIGJhY2t1cCB0 +aGlzIGZpbGU7IGl0IGlzIGJldHRlcgogIHRvIGJhY2t1cCB0aGUgb3duZXJ0cnVz +dCB2YWx1ZXMgKEBweHJlZntvcHRpb24gLS1leHBvcnQtb3duZXJ0cnVzdH0pLgoK +ICBAaXRlbSB+Ly5nbnVwZy90cnVzdGRiLmdwZy5sb2NrCiAgVGhlIGxvY2sgZmls +ZSBmb3IgdGhlIHRydXN0IGRhdGFiYXNlLgoKICBAaXRlbSB+Ly5nbnVwZy9yYW5k +b21fc2VlZAogIEEgZmlsZSB1c2VkIHRvIHByZXNlcnZlIHRoZSBzdGF0ZSBvZiB0 +aGUgaW50ZXJuYWwgcmFuZG9tIHBvb2wuCgogIEBpdGVtIH4vLmdudXBnL3NlY3Jp +bmcuZ3BnLmxvY2sKICBUaGUgbG9jayBmaWxlIGZvciB0aGUgc2VjcmV0IGtleXJp +bmcuCgogIEBpdGVtIH4vLmdudXBnL29wZW5wZ3AtcmV2b2NzLmQvCiAgVGhpcyBp +cyB0aGUgZGlyZWN0b3J5IHdoZXJlIGdwZyBzdG9yZXMgcHJlLWdlbmVyYXRlZCBy +ZXZvY2F0aW9uCiAgY2VydGlmaWNhdGVzLiAgVGhlIGZpbGUgbmFtZSBjb3JyZXNw +b25kcyB0byB0aGUgT3BlblBHUCBmaW5nZXJwcmludCBvZgogIHRoZSByZXNwZWN0 +aXZlIGtleS4gIEl0IGlzIHN1Z2dlc3RlZCB0byBiYWNrdXAgdGhvc2UgY2VydGlm +aWNhdGVzIGFuZAogIGlmIHRoZSBwcmltYXJ5IHByaXZhdGUga2V5IGlzIG5vdCBz +dG9yZWQgb24gdGhlIGRpc2sgdG8gbW92ZSB0aGVtIHRvCiAgYW4gZXh0ZXJuYWwg +c3RvcmFnZSBkZXZpY2UuICBBbnlvbmUgd2hvIGNhbiBhY2Nlc3MgdGhlc2VzIGZp +bGVzIGlzCiAgYWJsZSB0byByZXZva2UgdGhlIGNvcnJlc3BvbmRpbmcga2V5LiAg +WW91IG1heSB3YW50IHRvIHByaW50IHRoZW0gb3V0LgogIFlvdSBzaG91bGQgYmFj +a3VwIGFsbCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBhbmQgdGFrZSBjYXJlIHRv +IGtlZXAKICB0aGlzIGJhY2t1cCBjbG9zZWQgYXdheS4KCiAgQGl0ZW0gQHZhbHVl +e0RBVEFESVJ9L29wdGlvbnMuc2tlbAogIFRoZSBza2VsZXRvbiBvcHRpb25zIGZp +bGUuCgogIEBpdGVtIEB2YWx1ZXtMSUJESVJ9LwogIERlZmF1bHQgbG9jYXRpb24g +Zm9yIGV4dGVuc2lvbnMuCgpAZW5kIHRhYmxlCgpAYyBtYW46LlJFCk9wZXJhdGlv +biBpcyBmdXJ0aGVyIGNvbnRyb2xsZWQgYnkgYSBmZXcgZW52aXJvbm1lbnQgdmFy +aWFibGVzOgoKQHRhYmxlIEBhc2lzCgogIEBpdGVtIEhPTUUKICBVc2VkIHRvIGxv +Y2F0ZSB0aGUgZGVmYXVsdCBob21lIGRpcmVjdG9yeS4KCiAgQGl0ZW0gR05VUEdI +T01FCiAgSWYgc2V0IGRpcmVjdG9yeSB1c2VkIGluc3RlYWQgb2YgIn4vLmdudXBn +Ii4KCiAgQGl0ZW0gR1BHX0FHRU5UX0lORk8KICBUaGlzIHZhcmlhYmxlIHdhcyB1 +c2VkIGJ5IEdudVBHIHZlcnNpb25zIGJlZm9yZSAyLjEKCiAgQGl0ZW0gUElORU5U +UllfVVNFUl9EQVRBCiAgVGhpcyB2YWx1ZSBpcyBwYXNzZWQgdmlhIGdwZy1hZ2Vu +dCB0byBwaW5lbnRyeS4gIEl0IGlzIHVzZWZ1bCB0byBjb252ZXkKICBleHRyYSBp +bmZvcm1hdGlvbiB0byBhIGN1c3RvbSBwaW5lbnRyeS4KCiAgQGl0ZW0gQ09MVU1O +UwogIEBpdGVteCBMSU5FUwogIFVzZWQgdG8gc2l6ZSBzb21lIGRpc3BsYXlzIHRv +IHRoZSBmdWxsIHNpemUgb2YgdGhlIHNjcmVlbi4KCgogIEBpdGVtIExBTkdVQUdF +CiAgQXBhcnQgZnJvbSBpdHMgdXNlIGJ5IEdOVSwgaXQgaXMgdXNlZCBpbiB0aGUg +VzMyIHZlcnNpb24gdG8gb3ZlcnJpZGUgdGhlCiAgbGFuZ3VhZ2Ugc2VsZWN0aW9u +IGRvbmUgdGhyb3VnaCB0aGUgUmVnaXN0cnkuICBJZiB1c2VkIGFuZCBzZXQgdG8g +YQogIHZhbGlkIGFuZCBhdmFpbGFibGUgbGFuZ3VhZ2UgbmFtZSAoQHZhcntsYW5n +aWR9KSwgdGhlIGZpbGUgd2l0aCB0aGUKICB0cmFuc2xhdGlvbiBpcyBsb2FkZWQg +ZnJvbQoKICBAY29kZXtAdmFye2dwZ2Rpcn0vZ251cGcubmxzL0B2YXJ7bGFuZ2lk +fS5tb30uICBIZXJlIEB2YXJ7Z3BnZGlyfSBpcyB0aGUKICBkaXJlY3Rvcnkgb3V0 +IG9mIHdoaWNoIHRoZSBncGcgYmluYXJ5IGhhcyBiZWVuIGxvYWRlZC4gIElmIGl0 +IGNhbid0IGJlCiAgbG9hZGVkIHRoZSBSZWdpc3RyeSBpcyB0cmllZCBhbmQgYXMg +bGFzdCByZXNvcnQgdGhlIG5hdGl2ZSBXaW5kb3dzCiAgbG9jYWxlIHN5c3RlbSBp +cyB1c2VkLgoKQGVuZCB0YWJsZQoKCkBjICoqKioqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioqKioqKioKQGMgKioqKioqKioqKioqKioqICAgICAgICAg +ICAgKioqKioqKioqKioqKioqKgpAYyAqKioqKioqKioqKioqKiogIEVYQU1QTEVT +ICAqKioqKioqKioqKioqKioqCkBjICoqKioqKioqKioqKioqKiAgICAgICAgICAg +ICoqKioqKioqKioqKioqKioKQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioq +KioqKioqKioqKioqKioqKgpAbWFuc2VjdCBleGFtcGxlcwpAbm9kZSBHUEcgRXhh +bXBsZXMKQHNlY3Rpb24gRXhhbXBsZXMKCkB0YWJsZSBAYXNpcwoKQGl0ZW0gZ3Bn +IC1zZSAtciBAY29kZXtCb2J9IEBjb2Rle2ZpbGV9CnNpZ24gYW5kIGVuY3J5cHQg +Zm9yIHVzZXIgQm9iCgpAaXRlbSBncGcgLS1jbGVhcnNpZ24gQGNvZGV7ZmlsZX0K +bWFrZSBhIGNsZWFyIHRleHQgc2lnbmF0dXJlCgpAaXRlbSBncGcgLXNiIEBjb2Rl +e2ZpbGV9Cm1ha2UgYSBkZXRhY2hlZCBzaWduYXR1cmUKCkBpdGVtIGdwZyAtdSAw +eDEyMzQ1Njc4IC1zYiBAY29kZXtmaWxlfQptYWtlIGEgZGV0YWNoZWQgc2lnbmF0 +dXJlIHdpdGggdGhlIGtleSAweDEyMzQ1Njc4CgpAaXRlbSBncGcgLS1saXN0LWtl +eXMgQGNvZGV7dXNlcl9JRH0Kc2hvdyBrZXlzCgpAaXRlbSBncGcgLS1maW5nZXJw +cmludCBAY29kZXt1c2VyX0lEfQpzaG93IGZpbmdlcnByaW50CgpAaXRlbSBncGcg +LS12ZXJpZnkgQGNvZGV7cGdwZmlsZX0KQGl0ZW14IGdwZyAtLXZlcmlmeSBAY29k +ZXtzaWdmaWxlfQpWZXJpZnkgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZmlsZSBidXQg +ZG8gbm90IG91dHB1dCB0aGUgZGF0YS4gVGhlCnNlY29uZCBmb3JtIGlzIHVzZWQg +Zm9yIGRldGFjaGVkIHNpZ25hdHVyZXMsIHdoZXJlIEBjb2Rle3NpZ2ZpbGV9Cmlz +IHRoZSBkZXRhY2hlZCBzaWduYXR1cmUgKGVpdGhlciBBU0NJSSBhcm1vcmVkIG9y +IGJpbmFyeSkgYW5kCmFyZSB0aGUgc2lnbmVkIGRhdGE7IGlmIHRoaXMgaXMgbm90 +IGdpdmVuLCB0aGUgbmFtZSBvZgp0aGUgZmlsZSBob2xkaW5nIHRoZSBzaWduZWQg +ZGF0YSBpcyBjb25zdHJ1Y3RlZCBieSBjdXR0aW5nIG9mZiB0aGUKZXh0ZW5zaW9u +ICgiLmFzYyIgb3IgIi5zaWciKSBvZiBAY29kZXtzaWdmaWxlfSBvciBieSBhc2tp +bmcgdGhlCnVzZXIgZm9yIHRoZSBmaWxlbmFtZS4KQGVuZCB0YWJsZQoKCkBjICoq +KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQGMgKioq +KioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKgpAYyAqKioq +KioqKioqKioqKiogIFVTRVIgSUQgICAqKioqKioqKioqKioqKioqCkBjICoqKioq +KioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioKQGMgKioqKioq +KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAbWFuc2VjdCBo +b3cgdG8gc3BlY2lmeSBhIHVzZXIgaWQKQGlmc2V0IGlzbWFuCkBpbmNsdWRlIHNw +ZWNpZnktdXNlci1pZC50ZXhpCkBlbmQgaWZzZXQKCkBtYW5zZWN0IHJldHVybiB2 +YWx1ZQpAY2hhcGhlYWRpbmcgUkVUVVJOIFZBTFVFCgpUaGUgcHJvZ3JhbSByZXR1 +cm5zIDAgaWYgZXZlcnl0aGluZyB3YXMgZmluZSwgMSBpZiBhdCBsZWFzdAphIHNp +Z25hdHVyZSB3YXMgYmFkLCBhbmQgb3RoZXIgZXJyb3IgY29kZXMgZm9yIGZhdGFs +IGVycm9ycy4KCkBtYW5zZWN0IHdhcm5pbmdzCkBjaGFwaGVhZGluZyBXQVJOSU5H +UwoKVXNlIGEgKmdvb2QqIHBhc3N3b3JkIGZvciB5b3VyIHVzZXIgYWNjb3VudCBh +bmQgYSAqZ29vZCogcGFzc3BocmFzZQp0byBwcm90ZWN0IHlvdXIgc2VjcmV0IGtl +eS4gVGhpcyBwYXNzcGhyYXNlIGlzIHRoZSB3ZWFrZXN0IHBhcnQgb2YgdGhlCndo +b2xlIHN5c3RlbS4gUHJvZ3JhbXMgdG8gZG8gZGljdGlvbmFyeSBhdHRhY2tzIG9u +IHlvdXIgc2VjcmV0IGtleXJpbmcKYXJlIHZlcnkgZWFzeSB0byB3cml0ZSBhbmQg +c28geW91IHNob3VsZCBwcm90ZWN0IHlvdXIgIn4vLmdudXBnLyIKZGlyZWN0b3J5 +IHZlcnkgd2VsbC4KCktlZXAgaW4gbWluZCB0aGF0LCBpZiB0aGlzIHByb2dyYW0g +aXMgdXNlZCBvdmVyIGEgbmV0d29yayAodGVsbmV0KSwgaXQKaXMgKnZlcnkqIGVh +c3kgdG8gc3B5IG91dCB5b3VyIHBhc3NwaHJhc2UhCgpJZiB5b3UgYXJlIGdvaW5n +IHRvIHZlcmlmeSBkZXRhY2hlZCBzaWduYXR1cmVzLCBtYWtlIHN1cmUgdGhhdCB0 +aGUKcHJvZ3JhbSBrbm93cyBhYm91dCBpdDsgZWl0aGVyIGdpdmUgYm90aCBmaWxl +bmFtZXMgb24gdGhlIGNvbW1hbmQgbGluZQpvciB1c2UgQHNhbXB7LX0gdG8gc3Bl +Y2lmeSBTVERJTi4KCkBtYW5zZWN0IGludGVyb3BlcmFiaWxpdHkKQGNoYXBoZWFk +aW5nIElOVEVST1BFUkFCSUxJVFkgV0lUSCBPVEhFUiBPUEVOUEdQIFBST0dSQU1T +CgpHbnVQRyB0cmllcyB0byBiZSBhIHZlcnkgZmxleGlibGUgaW1wbGVtZW50YXRp +b24gb2YgdGhlIE9wZW5QR1AKc3RhbmRhcmQuIEluIHBhcnRpY3VsYXIsIEdudVBH +IGltcGxlbWVudHMgbWFueSBvZiB0aGUgb3B0aW9uYWwgcGFydHMKb2YgdGhlIHN0 +YW5kYXJkLCBzdWNoIGFzIHRoZSBTSEEtNTEyIGhhc2gsIGFuZCB0aGUgWkxJQiBh +bmQgQlpJUDIKY29tcHJlc3Npb24gYWxnb3JpdGhtcy4gSXQgaXMgaW1wb3J0YW50 +IHRvIGJlIGF3YXJlIHRoYXQgbm90IGFsbApPcGVuUEdQIHByb2dyYW1zIGltcGxl +bWVudCB0aGVzZSBvcHRpb25hbCBhbGdvcml0aG1zIGFuZCB0aGF0IGJ5CmZvcmNp +bmcgdGhlaXIgdXNlIHZpYSB0aGUgQG9wdGlvbnstLWNpcGhlci1hbGdvfSwKQG9w +dGlvbnstLWRpZ2VzdC1hbGdvfSwgQG9wdGlvbnstLWNlcnQtZGlnZXN0LWFsZ299 +LCBvcgpAb3B0aW9uey0tY29tcHJlc3MtYWxnb30gb3B0aW9ucyBpbiBHbnVQRywg +aXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGEKcGVyZmVjdGx5IHZhbGlkIE9wZW5Q +R1AgbWVzc2FnZSwgYnV0IG9uZSB0aGF0IGNhbm5vdCBiZSByZWFkIGJ5IHRoZQpp +bnRlbmRlZCByZWNpcGllbnQuCgpUaGVyZSBhcmUgZG96ZW5zIG9mIHZhcmlhdGlv +bnMgb2YgT3BlblBHUCBwcm9ncmFtcyBhdmFpbGFibGUsIGFuZCBlYWNoCnN1cHBv +cnRzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHN1YnNldCBvZiB0aGVzZSBvcHRpb25h +bCBhbGdvcml0aG1zLgpGb3IgZXhhbXBsZSwgdW50aWwgcmVjZW50bHksIG5vICh1 +bmhhY2tlZCkgdmVyc2lvbiBvZiBQR1Agc3VwcG9ydGVkCnRoZSBCTE9XRklTSCBj +aXBoZXIgYWxnb3JpdGhtLiBBIG1lc3NhZ2UgdXNpbmcgQkxPV0ZJU0ggc2ltcGx5 +IGNvdWxkCm5vdCBiZSByZWFkIGJ5IGEgUEdQIHVzZXIuIEJ5IGRlZmF1bHQsIEdu +dVBHIHVzZXMgdGhlIHN0YW5kYXJkCk9wZW5QR1AgcHJlZmVyZW5jZXMgc3lzdGVt +IHRoYXQgd2lsbCBhbHdheXMgZG8gdGhlIHJpZ2h0IHRoaW5nIGFuZApjcmVhdGUg +bWVzc2FnZXMgdGhhdCBhcmUgdXNhYmxlIGJ5IGFsbCByZWNpcGllbnRzLCByZWdh +cmRsZXNzIG9mIHdoaWNoCk9wZW5QR1AgcHJvZ3JhbSB0aGV5IHVzZS4gT25seSBv +dmVycmlkZSB0aGlzIHNhZmUgZGVmYXVsdCBpZiB5b3UKcmVhbGx5IGtub3cgd2hh +dCB5b3UgYXJlIGRvaW5nLgoKSWYgeW91IGFic29sdXRlbHkgbXVzdCBvdmVycmlk +ZSB0aGUgc2FmZSBkZWZhdWx0LCBvciBpZiB0aGUgcHJlZmVyZW5jZXMKb24gYSBn +aXZlbiBrZXkgYXJlIGludmFsaWQgZm9yIHNvbWUgcmVhc29uLCB5b3UgYXJlIGZh +ciBiZXR0ZXIgb2ZmIHVzaW5nCnRoZSBAb3B0aW9uey0tcGdwNn0sIEBvcHRpb257 +LS1wZ3A3fSwgb3IgQG9wdGlvbnstLXBncDh9IG9wdGlvbnMuIFRoZXNlCm9wdGlv +bnMgYXJlIHNhZmUgYXMgdGhleSBkbyBub3QgZm9yY2UgYW55IHBhcnRpY3VsYXIg +YWxnb3JpdGhtcyBpbgp2aW9sYXRpb24gb2YgT3BlblBHUCwgYnV0IHJhdGhlciBy +ZWR1Y2UgdGhlIGF2YWlsYWJsZSBhbGdvcml0aG1zIHRvIGEKIlBHUC1zYWZlIiBs +aXN0LgoKQG1hbnNlY3QgYnVncwpAY2hhcGhlYWRpbmcgQlVHUwoKT24gb2xkZXIg +c3lzdGVtcyB0aGlzIHByb2dyYW0gc2hvdWxkIGJlIGluc3RhbGxlZCBhcyBzZXR1 +aWQocm9vdCkuIFRoaXMKaXMgbmVjZXNzYXJ5IHRvIGxvY2sgbWVtb3J5IHBhZ2Vz +LiBMb2NraW5nIG1lbW9yeSBwYWdlcyBwcmV2ZW50cyB0aGUKb3BlcmF0aW5nIHN5 +c3RlbSBmcm9tIHdyaXRpbmcgbWVtb3J5IHBhZ2VzICh3aGljaCBtYXkgY29udGFp +bgpwYXNzcGhyYXNlcyBvciBvdGhlciBzZW5zaXRpdmUgbWF0ZXJpYWwpIHRvIGRp +c2suIElmIHlvdSBnZXQgbm8Kd2FybmluZyBtZXNzYWdlIGFib3V0IGluc2VjdXJl +IG1lbW9yeSB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gc3VwcG9ydHMKbG9ja2luZyB3 +aXRob3V0IGJlaW5nIHJvb3QuIFRoZSBwcm9ncmFtIGRyb3BzIHJvb3QgcHJpdmls +ZWdlcyBhcyBzb29uCmFzIGxvY2tlZCBtZW1vcnkgaXMgYWxsb2NhdGVkLgoKTm90 +ZSBhbHNvIHRoYXQgc29tZSBzeXN0ZW1zIChlc3BlY2lhbGx5IGxhcHRvcHMpIGhh +dmUgdGhlIGFiaWxpdHkgdG8KYGBzdXNwZW5kIHRvIGRpc2snJyAoYWxzbyBrbm93 +biBhcyBgYHNhZmUgc2xlZXAnJyBvciBgYGhpYmVybmF0ZScnKS4KVGhpcyB3cml0 +ZXMgYWxsIG1lbW9yeSB0byBkaXNrIGJlZm9yZSBnb2luZyBpbnRvIGEgbG93IHBv +d2VyIG9yIGV2ZW4KcG93ZXJlZCBvZmYgbW9kZS4gIFVubGVzcyBtZWFzdXJlcyBh +cmUgdGFrZW4gaW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0KdG8gcHJvdGVjdCB0aGUg +c2F2ZWQgbWVtb3J5LCBwYXNzcGhyYXNlcyBvciBvdGhlciBzZW5zaXRpdmUgbWF0 +ZXJpYWwKbWF5IGJlIHJlY292ZXJhYmxlIGZyb20gaXQgbGF0ZXIuCgpCZWZvcmUg +eW91IHJlcG9ydCBhIGJ1ZyB5b3Ugc2hvdWxkIGZpcnN0IHNlYXJjaCB0aGUgbWFp +bGluZyBsaXN0CmFyY2hpdmVzIGZvciBzaW1pbGFyIHByb2JsZW1zIGFuZCBzZWNv +bmQgY2hlY2sgd2hldGhlciBzdWNoIGEgYnVnIGhhcwphbHJlYWR5IGJlZW4gcmVw +b3J0ZWQgdG8gb3VyIGJ1ZyB0cmFja2VyIGF0IGh0dHA6Ly9idWdzLmdudXBnLm9y +ZyAuCgpAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq +KioqCkBjICoqKioqKioqKioqKioqKiAgICAgICAgICAgICAgKioqKioqKioqKioq +KioKQGMgKioqKioqKioqKioqKioqICBVTkFUVEVOREVEICAqKioqKioqKioqKioq +KgpAYyAqKioqKioqKioqKioqKiogICAgICAgICAgICAgICoqKioqKioqKioqKioq +CkBjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK +QG1hbnBhdXNlCkBub2RlIFVuYXR0ZW5kZWQgVXNhZ2Ugb2YgR1BHCkBzZWN0aW9u +IFVuYXR0ZW5kZWQgVXNhZ2UKCkBjb21tYW5ke2dwZ30gaXMgb2Z0ZW4gdXNlZCBh +cyBhIGJhY2tlbmQgZW5naW5lIGJ5IG90aGVyIHNvZnR3YXJlLiAgVG8gaGVscAp3 +aXRoIHRoaXMgYSBtYWNoaW5lIGludGVyZmFjZSBoYXMgYmVlbiBkZWZpbmVkIHRv +IGhhdmUgYW4gdW5hbWJpZ3VvdXMKd2F5IHRvIGRvIHRoaXMuICBUaGUgb3B0aW9u +cyBAb3B0aW9uey0tc3RhdHVzLWZkfSBhbmQgQG9wdGlvbnstLWJhdGNofQphcmUg +YWxtb3N0IGFsd2F5cyByZXF1aXJlZCBmb3IgdGhpcy4KCkBtZW51CiogVW5hdHRl +bmRlZCBHUEcga2V5IGdlbmVyYXRpb246OiAgVW5hdHRlbmRlZCBrZXkgZ2VuZXJh +dGlvbgpAZW5kIG1lbnUKCgpAbm9kZSBVbmF0dGVuZGVkIEdQRyBrZXkgZ2VuZXJh +dGlvbgpAc3Vic2VjdGlvbiBVbmF0dGVuZGVkIGtleSBnZW5lcmF0aW9uCgpUaGUg +Y29tbWFuZCBAb3B0aW9uey0tZ2VuLWtleX0gbWF5IGJlIHVzZWQgYWxvbmcgd2l0 +aCB0aGUgb3B0aW9uCkBvcHRpb257LS1iYXRjaH0gZm9yIHVuYXR0ZW5kZWQga2V5 +IGdlbmVyYXRpb24uICBUaGUgcGFyYW1ldGVycyBhcmUKZWl0aGVyIHJlYWQgZnJv +bSBzdGRpbiBvciBnaXZlbiBhcyBhIGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZS4K +VGhlIGZvcm1hdCBvZiB0aGUgcGFyYW1ldGVyIGZpbGUgaXMgYXMgZm9sbG93czoK +CkBpdGVtaXplIEBidWxsZXQKICBAaXRlbSBUZXh0IG9ubHksIGxpbmUgbGVuZ3Ro +IGlzIGxpbWl0ZWQgdG8gYWJvdXQgMTAwMCBjaGFyYWN0ZXJzLgogIEBpdGVtIFVU +Ri04IGVuY29kaW5nIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IG5vbi1BU0NJSSBj +aGFyYWN0ZXJzLgogIEBpdGVtIEVtcHR5IGxpbmVzIGFyZSBpZ25vcmVkLgogIEBp +dGVtIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaWxlIHNwYWNlIGlzIGlnbm9yZWQu +CiAgQGl0ZW0gQSBoYXNoIHNpZ24gYXMgdGhlIGZpcnN0IG5vbiB3aGl0ZSBzcGFj +ZSBjaGFyYWN0ZXIgaW5kaWNhdGVzCiAgYSBjb21tZW50IGxpbmUuCiAgQGl0ZW0g +Q29udHJvbCBzdGF0ZW1lbnRzIGFyZSBpbmRpY2F0ZWQgYnkgYSBsZWFkaW5nIHBl +cmNlbnQgc2lnbiwgdGhlCiAgYXJndW1lbnRzIGFyZSBzZXBhcmF0ZWQgYnkgd2hp +dGUgc3BhY2UgZnJvbSB0aGUga2V5d29yZC4KICBAaXRlbSBQYXJhbWV0ZXJzIGFy +ZSBzcGVjaWZpZWQgYnkgYSBrZXl3b3JkLCBmb2xsb3dlZCBieSBhIGNvbG9uLiAg +QXJndW1lbnRzCiAgYXJlIHNlcGFyYXRlZCBieSB3aGl0ZSBzcGFjZS4KICBAaXRl +bQogIFRoZSBmaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSBAc2FtcHtLZXktVHlwZX07 +IGNvbnRyb2wgc3RhdGVtZW50cyBtYXkgYmUKICBwbGFjZWQgYW55d2hlcmUuCiAg +QGl0ZW0KICBUaGUgb3JkZXIgb2YgdGhlIHBhcmFtZXRlcnMgZG9lcyBub3QgbWF0 +dGVyIGV4Y2VwdCBmb3IgQHNhbXB7S2V5LVR5cGV9CiAgd2hpY2ggbXVzdCBiZSB0 +aGUgZmlyc3QgcGFyYW1ldGVyLiAgVGhlIHBhcmFtZXRlcnMgYXJlIG9ubHkgdXNl +ZCBmb3IKICB0aGUgZ2VuZXJhdGVkIGtleWJsb2NrIChwcmltYXJ5IGFuZCBzdWJr +ZXlzKTsgcGFyYW1ldGVycyBmcm9tIHByZXZpb3VzCiAgc2V0cyBhcmUgbm90IHVz +ZWQuICBTb21lIHN5bnRhY3RpY2FsbHkgY2hlY2tzIG1heSBiZSBwZXJmb3JtZWQu +CiAgQGl0ZW0KICBLZXkgZ2VuZXJhdGlvbiB0YWtlcyBwbGFjZSB3aGVuIGVpdGhl +ciB0aGUgZW5kIG9mIHRoZSBwYXJhbWV0ZXIgZmlsZQogIGlzIHJlYWNoZWQsIHRo +ZSBuZXh0IEBzYW1we0tleS1UeXBlfSBwYXJhbWV0ZXIgaXMgZW5jb3VudGVyZWQg +b3IgYXQgdGhlCiAgY29udHJvbCBzdGF0ZW1lbnQgQHNhbXB7JWNvbW1pdH0gaXMg +ZW5jb3VudGVyZWQuCkBlbmQgaXRlbWl6ZQoKQG5vaW5kZW50CkNvbnRyb2wgc3Rh +dGVtZW50czoKCkB0YWJsZSBAYXNpcwoKQGl0ZW0gJWVjaG8gQHZhcnt0ZXh0fQpQ +cmludCBAdmFye3RleHR9IGFzIGRpYWdub3N0aWMuCgpAaXRlbSAlZHJ5LXJ1bgpT +dXBwcmVzcyBhY3R1YWwga2V5IGdlbmVyYXRpb24gKHVzZWZ1bCBmb3Igc3ludGF4 +IGNoZWNraW5nKS4KCkBpdGVtICVjb21taXQKUGVyZm9ybSB0aGUga2V5IGdlbmVy +YXRpb24uICBOb3RlIHRoYXQgYW4gaW1wbGljaXQgY29tbWl0IGlzIGRvbmUgYXQK +dGhlIG5leHQgQGFzaXN7S2V5LVR5cGV9IHBhcmFtZXRlci4KCkBpdGVtICVwdWJy +aW5nIEB2YXJ7ZmlsZW5hbWV9CkBpdGVteCAlc2VjcmluZyBAdmFye2ZpbGVuYW1l +fQpEbyBub3Qgd3JpdGUgdGhlIGtleSB0byB0aGUgZGVmYXVsdCBvciBjb21tYW5k +bGluZSBnaXZlbiBrZXlyaW5nIGJ1dAp0byBAdmFye2ZpbGVuYW1lfS4gIFRoaXMg +bXVzdCBiZSBnaXZlbiBiZWZvcmUgdGhlIGZpcnN0IGNvbW1pdCB0byB0YWtlCnBs +YWNlLCBkdXBsaWNhdGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2FtZSBmaWxlbmFt +ZSBpcyBpZ25vcmVkLCB0aGUKbGFzdCBmaWxlbmFtZSBiZWZvcmUgYSBjb21taXQg +aXMgdXNlZC4gIFRoZSBmaWxlbmFtZSBpcyB1c2VkIHVudGlsIGEKbmV3IGZpbGVu +YW1lIGlzIHVzZWQgKGF0IGNvbW1pdCBwb2ludHMpIGFuZCBhbGwga2V5cyBhcmUg +d3JpdHRlbiB0bwp0aGF0IGZpbGUuIElmIGEgbmV3IGZpbGVuYW1lIGlzIGdpdmVu +LCB0aGlzIGZpbGUgaXMgY3JlYXRlZCAoYW5kCm92ZXJ3cml0ZXMgYW4gZXhpc3Rp +bmcgb25lKS4gIEZvciBHbnVQRyB2ZXJzaW9ucyBwcmlvciB0byAyLjEsIGJvdGgK +Y29udHJvbCBzdGF0ZW1lbnRzIG11c3QgYmUgZ2l2ZW4uIEZvciBHbnVQRyAyLjEg +YW5kIGxhdGVyCkBzYW1weyVzZWNyaW5nfSBpcyBhIG5vLW9wLgoKQGl0ZW0gJWFz +ay1wYXNzcGhyYXNlCkBpdGVteCAlbm8tYXNrLXBhc3NwaHJhc2UKVGhpcyBvcHRp +b24gaXMgYSBuby1vcCBmb3IgR251UEcgMi4xIGFuZCBsYXRlci4KCkBpdGVtICVu +by1wcm90ZWN0aW9uClVzaW5nIHRoaXMgb3B0aW9uIGFsbG93cyB0aGUgY3JlYXRp +b24gb2Yga2V5cyB3aXRob3V0IGFueSBwYXNzcGhyYXNlCnByb3RlY3Rpb24uICBU +aGlzIG9wdGlvbiBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIHJlZ3Jlc3Npb24gdGVz +dHMuCgpAaXRlbSAldHJhbnNpZW50LWtleQpJZiBnaXZlbiB0aGUga2V5cyBhcmUg +Y3JlYXRlZCB1c2luZyBhIGZhc3RlciBhbmQgYSBzb21ld2hhdCBsZXNzCnNlY3Vy +ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gIFRoaXMgb3B0aW9uIG1heSBiZSB1 +c2VkIGZvciBrZXlzCndoaWNoIGFyZSBvbmx5IHVzZWQgZm9yIGEgc2hvcnQgdGlt +ZSBhbmQgZG8gbm90IHJlcXVpcmUgZnVsbApjcnlwdG9ncmFwaGljIHN0cmVuZ3Ro +LiAgSXQgdGFrZXMgb25seSBlZmZlY3QgaWYgdXNlZCB0b2dldGhlciB3aXRoCnRo +ZSBjb250cm9sIHN0YXRlbWVudCBAc2FtcHslbm8tcHJvdGVjdGlvbn0uCgpAZW5k +IHRhYmxlCgpAbm9pbmRlbnQKR2VuZXJhbCBQYXJhbWV0ZXJzOgoKQHRhYmxlIEBh +c2lzCgpAaXRlbSBLZXktVHlwZTogQHZhcnthbGdvfQpTdGFydHMgYSBuZXcgcGFy +YW1ldGVyIGJsb2NrIGJ5IGdpdmluZyB0aGUgdHlwZSBvZiB0aGUgcHJpbWFyeQpr +ZXkuIFRoZSBhbGdvcml0aG0gbXVzdCBiZSBjYXBhYmxlIG9mIHNpZ25pbmcuICBU +aGlzIGlzIGEgcmVxdWlyZWQKcGFyYW1ldGVyLiAgQHZhcnthbGdvfSBtYXkgZWl0 +aGVyIGJlIGFuIE9wZW5QR1AgYWxnb3JpdGhtIG51bWJlciBvciBhCnN0cmluZyB3 +aXRoIHRoZSBhbGdvcml0aG0gbmFtZS4gIFRoZSBzcGVjaWFsIHZhbHVlIEBzYW1w +e2RlZmF1bHR9IG1heQpiZSB1c2VkIGZvciBAdmFye2FsZ299IHRvIGNyZWF0ZSB0 +aGUgZGVmYXVsdCBrZXkgdHlwZTsgaW4gdGhpcyBjYXNlIGEKQHNhbXB7S2V5LVVz +YWdlfSBzaGFsbCBub3QgYmUgZ2l2ZW4gYW5kIEBzYW1we2RlZmF1bHR9IGFsc28g +YmUgdXNlZApmb3IgQHNhbXB7U3Via2V5LVR5cGV9LgoKQGl0ZW0gS2V5LUxlbmd0 +aDogQHZhcntuYml0c30KVGhlIHJlcXVlc3RlZCBsZW5ndGggb2YgdGhlIGdlbmVy +YXRlZCBrZXkgaW4gYml0cy4gIFRoZSBkZWZhdWx0IGlzCnJldHVybmVkIGJ5IHJ1 +bm5pbmcgdGhlIGNvbW1hbmQgQHNhbXB7Z3BnMiAtLWdwZ2NvbmYtbGlzdH0uCgpA +aXRlbSBLZXktR3JpcDogQHZhcntoZXhzdHJpbmd9ClRoaXMgaXMgb3B0aW9uYWwg +YW5kIHVzZWQgdG8gZ2VuZXJhdGUgYSBDU1Igb3IgY2VydGlmaWNhdGUgZm9yIGFu +CmFscmVhZHkgZXhpc3Rpbmcga2V5LiAgS2V5LUxlbmd0aCB3aWxsIGJlIGlnbm9y +ZWQgd2hlbiBnaXZlbi4KCkBpdGVtIEtleS1Vc2FnZTogQHZhcnt1c2FnZS1saXN0 +fQpTcGFjZSBvciBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBrZXkgdXNhZ2VzLiAg +QWxsb3dlZCB2YWx1ZXMgYXJlCkBzYW1we2VuY3J5cHR9LCBAc2FtcHtzaWdufSwg +YW5kIEBzYW1we2F1dGh9LiAgVGhpcyBpcyB1c2VkIHRvCmdlbmVyYXRlIHRoZSBr +ZXkgZmxhZ3MuICBQbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIGFsZ29yaXRobSBp +cwpjYXBhYmxlIG9mIHRoaXMgdXNhZ2UuICBOb3RlIHRoYXQgT3BlblBHUCByZXF1 +aXJlcyB0aGF0IGFsbCBwcmltYXJ5CmtleXMgYXJlIGNhcGFibGUgb2YgY2VydGlm +aWNhdGlvbiwgc28gbm8gbWF0dGVyIHdoYXQgdXNhZ2UgaXMgZ2l2ZW4KaGVyZSwg +dGhlIEBzYW1we2NlcnR9IGZsYWcgd2lsbCBiZSBvbi4gIElmIG5vIEBzYW1we0tl +eS1Vc2FnZX0gaXMKc3BlY2lmaWVkIGFuZCB0aGUgQHNhbXB7S2V5LVR5cGV9IGlz +IG5vdCBAc2FtcHtkZWZhdWx0fSwgYWxsIGFsbG93ZWQKdXNhZ2VzIGZvciB0aGF0 +IHBhcnRpY3VsYXIgYWxnb3JpdGhtIGFyZSB1c2VkOyBpZiBpdCBpcyBub3QgZ2l2 +ZW4gYnV0CkBzYW1we2RlZmF1bHR9IGlzIHVzZWQgdGhlIHVzYWdlIHdpbGwgYmUg +QHNhbXB7c2lnbn0uCgpAaXRlbSBTdWJrZXktVHlwZTogQHZhcnthbGdvfQpUaGlz +IGdlbmVyYXRlcyBhIHNlY29uZGFyeSBrZXkgKHN1YmtleSkuICBDdXJyZW50bHkg +b25seSBvbmUgc3Via2V5CmNhbiBiZSBoYW5kbGVkLiAgU2VlIGFsc28gQHNhbXB7 +S2V5LVR5cGV9IGFib3ZlLgoKQGl0ZW0gU3Via2V5LUxlbmd0aDogQHZhcntuYml0 +c30KTGVuZ3RoIG9mIHRoZSBzZWNvbmRhcnkga2V5IChzdWJrZXkpIGluIGJpdHMu +ICBUaGUgZGVmYXVsdCBpcyByZXR1cm5lZApieSBydW5uaW5nIHRoZSBjb21tYW5k +IEBzYW1we2dwZzIgLS1ncGdjb25mLWxpc3R9Ii4KCkBpdGVtIFN1YmtleS1Vc2Fn +ZTogQHZhcnt1c2FnZS1saXN0fQpLZXkgdXNhZ2UgbGlzdHMgZm9yIGEgc3Via2V5 +OyBzaW1pbGFyIHRvIEBzYW1we0tleS1Vc2FnZX0uCgpAaXRlbSBQYXNzcGhyYXNl +OiBAdmFye3N0cmluZ30KSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIHBhc3NwaHJh +c2UgZm9yIHRoZSBzZWNyZXQga2V5LCBlbnRlciBpdCBoZXJlLgpEZWZhdWx0IGlz +IHRvIHVzZSB0aGUgUGluZW50cnkgZGlhbG9nIHRvIGFzayBmb3IgYSBwYXNzcGhy +YXNlLgoKQGl0ZW0gTmFtZS1SZWFsOiBAdmFye25hbWV9CkBpdGVteCBOYW1lLUNv +bW1lbnQ6IEB2YXJ7Y29tbWVudH0KQGl0ZW14IE5hbWUtRW1haWw6IEB2YXJ7ZW1h +aWx9ClRoZSB0aHJlZSBwYXJ0cyBvZiBhIHVzZXIgbmFtZS4gIFJlbWVtYmVyIHRv +IHVzZSBVVEYtOCBlbmNvZGluZyBoZXJlLgpJZiB5b3UgZG9uJ3QgZ2l2ZSBhbnkg +b2YgdGhlbSwgbm8gdXNlciBJRCBpcyBjcmVhdGVkLgoKQGl0ZW0gRXhwaXJlLURh +dGU6IEB2YXJ7aXNvLWRhdGV9fChAdmFye251bWJlcn1bZHx3fG18eV0pClNldCB0 +aGUgZXhwaXJhdGlvbiBkYXRlIGZvciB0aGUga2V5IChhbmQgdGhlIHN1YmtleSku +ICBJdCBtYXkgZWl0aGVyCmJlIGVudGVyZWQgaW4gSVNPIGRhdGUgZm9ybWF0IChl +LmcuICIyMDAwMDgxNVQxNDUwMTIiKSBvciBhcyBudW1iZXIgb2YKZGF5cywgd2Vl +a3MsIG1vbnRoIG9yIHllYXJzIGFmdGVyIHRoZSBjcmVhdGlvbiBkYXRlLiAgVGhl +IHNwZWNpYWwKbm90YXRpb24gInNlY29uZHM9TiIgaXMgYWxzbyBhbGxvd2VkIHRv +IHNwZWNpZnkgYSBudW1iZXIgb2Ygc2Vjb25kcwpzaW5jZSBjcmVhdGlvbi4gIFdp +dGhvdXQgYSBsZXR0ZXIgZGF5cyBhcmUgYXNzdW1lZC4gIE5vdGUgdGhhdCB0aGVy +ZQppcyBubyBjaGVjayBkb25lIG9uIHRoZSBvdmVyZmxvdyBvZiB0aGUgdHlwZSB1 +c2VkIGJ5IE9wZW5QR1AgZm9yCnRpbWVzdGFtcHMuICBUaHVzIHlvdSBiZXR0ZXIg +bWFrZSBzdXJlIHRoYXQgdGhlIGdpdmVuIHZhbHVlIG1ha2UKc2Vuc2UuICBBbHRo +b3VnaCBPcGVuUEdQIHdvcmtzIHdpdGggdGltZSBpbnRlcnZhbHMsIEdudVBHIHVz +ZXMgYW4KYWJzb2x1dGUgdmFsdWUgaW50ZXJuYWxseSBhbmQgdGh1cyB0aGUgbGFz +dCB5ZWFyIHdlIGNhbiByZXByZXNlbnQgaXMKMjEwNS4KCkBpdGVtICBDcmVhdGlv +bi1EYXRlOiBAdmFye2lzby1kYXRlfQpTZXQgdGhlIGNyZWF0aW9uIGRhdGUgb2Yg +dGhlIGtleSBhcyBzdG9yZWQgaW4gdGhlIGtleSBpbmZvcm1hdGlvbiBhbmQKd2hp +Y2ggaXMgYWxzbyBwYXJ0IG9mIHRoZSBmaW5nZXJwcmludCBjYWxjdWxhdGlvbi4g +IEVpdGhlciBhIGRhdGUgbGlrZQoiMTk4Ni0wNC0yNiIgb3IgYSBmdWxsIHRpbWVz +dGFtcCBsaWtlICIxOTg2MDQyNlQwNDI2NDAiIG1heSBiZSB1c2VkLgpUaGUgdGlt +ZSBpcyBjb25zaWRlcmVkIHRvIGJlIFVUQy4gIFRoZSBzcGVjaWFsIG5vdGF0aW9u +ICJzZWNvbmRzPU4iCm1heSBiZSB1c2VkIHRvIGRpcmVjdGx5IHNwZWNpZnkgYSB0 +aGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgRXBvY2gKKFVuaXggdGltZSkuICBJ +ZiBpdCBpcyBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgdGltZSBpcyB1c2VkLgoKQGl0 +ZW0gUHJlZmVyZW5jZXM6IEB2YXJ7c3RyaW5nfQpTZXQgdGhlIGNpcGhlciwgaGFz +aCwgYW5kIGNvbXByZXNzaW9uIHByZWZlcmVuY2UgdmFsdWVzIGZvciB0aGlzIGtl +eS4KVGhpcyBleHBlY3RzIHRoZSBzYW1lIHR5cGUgb2Ygc3RyaW5nIGFzIHRoZSBz +dWItY29tbWFuZCBAc2FtcHtzZXRwcmVmfQppbiB0aGUgQG9wdGlvbnstLWVkaXQt +a2V5fSBtZW51LgoKQGl0ZW0gIFJldm9rZXI6IEB2YXJ7YWxnb306QHZhcntmcHJ9 +IFtzZW5zaXRpdmVdCkFkZCBhIGRlc2lnbmF0ZWQgcmV2b2tlciB0byB0aGUgZ2Vu +ZXJhdGVkIGtleS4gIEFsZ28gaXMgdGhlIHB1YmxpYyBrZXkKYWxnb3JpdGhtIG9m +IHRoZSBkZXNpZ25hdGVkIHJldm9rZXIgKGkuZS4gUlNBPTEsIERTQT0xNywgZXRj +LikKQHZhcntmcHJ9IGlzIHRoZSBmaW5nZXJwcmludCBvZiB0aGUgZGVzaWduYXRl +ZCByZXZva2VyLiAgVGhlIG9wdGlvbmFsCkBzYW1we3NlbnNpdGl2ZX0gZmxhZyBt +YXJrcyB0aGUgZGVzaWduYXRlZCByZXZva2VyIGFzIHNlbnNpdGl2ZQppbmZvcm1h +dGlvbi4gIE9ubHkgdjQga2V5cyBtYXkgYmUgZGVzaWduYXRlZCByZXZva2Vycy4K +CkBpdGVtIEtleXNlcnZlcjogQHZhcntzdHJpbmd9ClRoaXMgaXMgYW4gb3B0aW9u +YWwgcGFyYW1ldGVyIHRoYXQgc3BlY2lmaWVzIHRoZSBwcmVmZXJyZWQga2V5c2Vy +dmVyClVSTCBmb3IgdGhlIGtleS4KCkBpdGVtIEhhbmRsZTogQHZhcntzdHJpbmd9 +ClRoaXMgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIG9ubHkgdXNlZCB3aXRoIHRo +ZSBzdGF0dXMgbGluZXMKS0VZX0NSRUFURUQgYW5kIEtFWV9OT1RfQ1JFQVRFRC4g +IEB2YXJ7c3RyaW5nfSBtYXkgYmUgdXAgdG8gMTAwCmNoYXJhY3RlcnMgYW5kIHNo +b3VsZCBub3QgY29udGFpbiBzcGFjZXMuICBJdCBpcyB1c2VmdWwgZm9yIGJhdGNo +IGtleQpnZW5lcmF0aW9uIHRvIGFzc29jaWF0ZSBhIGtleSBwYXJhbWV0ZXIgYmxv +Y2sgd2l0aCBhIHN0YXR1cyBsaW5lLgoKQGVuZCB0YWJsZQoKQG5vaW5kZW50Ckhl +cmUgaXMgYW4gZXhhbXBsZSBvbiBob3cgdG8gY3JlYXRlIGEga2V5OgpAc21hbGxl +eGFtcGxlCiQgY2F0ID5mb28gPDxFT0YKICAgICAlZWNobyBHZW5lcmF0aW5nIGEg +YmFzaWMgT3BlblBHUCBrZXkKICAgICBLZXktVHlwZTogRFNBCiAgICAgS2V5LUxl +bmd0aDogMTAyNAogICAgIFN1YmtleS1UeXBlOiBFTEctRQogICAgIFN1YmtleS1M +ZW5ndGg6IDEwMjQKICAgICBOYW1lLVJlYWw6IEpvZSBUZXN0ZXIKICAgICBOYW1l +LUNvbW1lbnQ6IHdpdGggc3R1cGlkIHBhc3NwaHJhc2UKICAgICBOYW1lLUVtYWls +OiBqb2VAQGZvby5iYXIKICAgICBFeHBpcmUtRGF0ZTogMAogICAgIFBhc3NwaHJh +c2U6IGFiYwogICAgICVwdWJyaW5nIGZvby5wdWIKICAgICAlc2VjcmluZyBmb28u +c2VjCiAgICAgIyBEbyBhIGNvbW1pdCBoZXJlLCBzbyB0aGF0IHdlIGNhbiBsYXRl +ciBwcmludCAiZG9uZSIgOi0pCiAgICAgJWNvbW1pdAogICAgICVlY2hvIGRvbmUK +RU9GCiQgZ3BnMiAtLWJhdGNoIC0tZ2VuLWtleSBmb28KIFsuLi5dCiQgZ3BnMiAt +LW5vLWRlZmF1bHQta2V5cmluZyAtLXNlY3JldC1rZXlyaW5nIC4vZm9vLnNlYyBc +CiAgICAgICAtLWtleXJpbmcgLi9mb28ucHViIC0tbGlzdC1zZWNyZXQta2V5cwov +aG9tZS93ay93b3JrL2dudXBnLXN0YWJsZS9zY3JhdGNoL2Zvby5zZWMKLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNlYyAgMTAyNEQv +OTE1QTg3OEQgMjAwMC0wMy0wOSBKb2UgVGVzdGVyICh3aXRoIHN0dXBpZCBwYXNz +cGhyYXNlKSA8am9lQEBmb28uYmFyPgpzc2IgIDEwMjRnLzhGNzBFMkMwIDIwMDAt +MDMtMDkKQGVuZCBzbWFsbGV4YW1wbGUKCgpAbm9pbmRlbnQKSWYgeW91IHdhbnQg +dG8gY3JlYXRlIGEga2V5IHdpdGggdGhlIGRlZmF1bHQgYWxnb3JpdGhtcyB5b3Ug +d291bGQgdXNlCnRoZXNlIHBhcmFtZXRlcnM6CkBzbWFsbGV4YW1wbGUKICAgICAl +ZWNobyBHZW5lcmF0aW5nIGEgZGVmYXVsdCBrZXkKICAgICBLZXktVHlwZTogZGVm +YXVsdAogICAgIFN1YmtleS1UeXBlOiBkZWZhdWx0CiAgICAgTmFtZS1SZWFsOiBK +b2UgVGVzdGVyCiAgICAgTmFtZS1Db21tZW50OiB3aXRoIHN0dXBpZCBwYXNzcGhy +YXNlCiAgICAgTmFtZS1FbWFpbDogam9lQEBmb28uYmFyCiAgICAgRXhwaXJlLURh +dGU6IDAKICAgICBQYXNzcGhyYXNlOiBhYmMKICAgICAlcHVicmluZyBmb28ucHVi +CiAgICAgJXNlY3JpbmcgZm9vLnNlYwogICAgICMgRG8gYSBjb21taXQgaGVyZSwg +c28gdGhhdCB3ZSBjYW4gbGF0ZXIgcHJpbnQgImRvbmUiIDotKQogICAgICVjb21t +aXQKICAgICAlZWNobyBkb25lCkBlbmQgc21hbGxleGFtcGxlCgoKCgpAbWFuc2Vj +dCBzZWUgYWxzbwpAaWZzZXQgaXNtYW4KQGNvbW1hbmR7Z3Bndn0oMSksCkBjb21t +YW5ke2dwZ3NtfSgxKSwKQGNvbW1hbmR7Z3BnLWFnZW50fSgxKQpAZW5kIGlmc2V0 +CkBpbmNsdWRlIHNlZS1hbHNvLW5vdGUudGV4aQo= +=jeqE +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/00FE67F28A52A8AA08FFAED20AF832DA916D1985.asc b/tests/openpgp/privkeys/00FE67F28A52A8AA08FFAED20AF832DA916D1985.asc new file mode 100644 index 0000000..71d9eb9 --- /dev/null +++ b/tests/openpgp/privkeys/00FE67F28A52A8AA08FFAED20AF832DA916D1985.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjEyOToAqCYxh+c0mGKVkNRLiSe19rSb +OgLVJcL6dH1EnawO6klyypIbrDom7DNNTlp7TMlwQ+UsKbmT8jwkU08/awg6W9Wq +5LCABUStYrVcwJJlf3p4lBru0BSRlaKuIslpk5Powfj2lPXX6o1eRHsnxk9FTD+M +GcWkhfL9HF+Rq8vPcicpKDE6ZTM6AQABKSgxOmQxMjg6NPUmd199hJrT8TOzgIRl +vkfedZRLziNM3yBO2nvEjMxKH3uJxKHh/VUg/VLo72On/HIyiQeeDVYcuLJGTm7e +degk/9C85hT5K4VUF9+LXXDX1Vz/jQdZxq+JwUE/AdlAEC9fkFQzc0ftI832mgjR +OASwMVphqYUQERz00ve+NDUpKDE6cDY1OgDJoHlM5kAfmQ3HQsykH2QoWnxA6mTa +aiCn4XIPEsrXCiwObiwWBj3I+w2OTWbodzxWldxBsaYyVCM3bKR6eldFKSgxOnE2 +NToA1X6NuSiiTP6lQcAqnoPC37LE6PUeoohF05hVoRotOm+/sIcve7ZrgVBvELEr +q6ZU8fUeCUQoMc2ztQEHyC+0eykoMTp1NjQ6HOTajn4vJZPXy/q5sNWhQ7pZDHeJ +clqSismtIwvuCV3wMAQMIUr+OWTlGHOCYa8FnBn7PbE6TevGdDEE8CQcfCkpKQ== +=AhP7 +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/0D6F6AD4C4C803B25470F9104E9F4E6A4CA64255.asc b/tests/openpgp/privkeys/0D6F6AD4C4C803B25470F9104E9F4E6A4CA64255.asc new file mode 100644 index 0000000..ddf0fb9 --- /dev/null +++ b/tests/openpgp/privkeys/0D6F6AD4C4C803B25470F9104E9F4E6A4CA64255.asc @@ -0,0 +1,12 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v1.4.8 (GNU/Linux) +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6ZWxnKDE6cDk3OgD/BWuU2w+pPFZltSIytQ3wyNMV +HbFSG5PDdx29GCJU9RP+rWXX4jcKmilUHH9e4CSDmwcHzTNzqlmDrnZgVXd0uhNx +5LuuJ1vmTbewdraFkYJ5OjoB3Eg7LneCII8M/0UpKDE6ZzE6AikoMTp5OTY6Toef +zlcVKiPuobKfXHDhIUQPTfGic2Az47wkMoYHo9j9ZE7AWaliMdPz4jLyLfqqoU9m +H8g+vJhyAc7UnAF2Sk5466FDypdPm5F9PTW3cqqIwJM4WgkSlM8J2hxH4YtlKSgx +OngyOTob6nEVc0W4M+ZyrqMvp26DaKRnuFwcsDLsN11JLykpKQ== +=Ghie +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/0DD40284FF992CD24DC4AAC367037E066FCEE26A.asc b/tests/openpgp/privkeys/0DD40284FF992CD24DC4AAC367037E066FCEE26A.asc new file mode 100644 index 0000000..49d4413 --- /dev/null +++ b/tests/openpgp/privkeys/0DD40284FF992CD24DC4AAC367037E066FCEE26A.asc @@ -0,0 +1,27 @@ +This is the unprotected private key for + +pub ed25519/97965A9A 2014-08-19 + Key fingerprint = C959 BDBA FA32 A2F8 9A15 3B67 8CFD E121 9796 5A9A + Keygrip = 0DD40284FF992CD24DC4AAC367037E066FCEE26A +uid [ unknown] EdDSA sample key 1 (draft-koch-eddsa-for-openpgp-00) + +The human readable version of the armored s-expression below is: + +(private-key + (ecc + (curve Ed25519) + (flags eddsa) + (q #403F098994BDD916ED4053197934E4A87C80733A1280D62F8010992E43EE3B2406#) + (d #1A8B1FF05DED48E18BF50166C664AB023EA70003D78D9E41F5758A91D850F8D2#) + ) + ) + +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6ZWNjKDU6Y3VydmU3OkVkMjU1MTkpKDU6ZmxhZ3M1 +OmVkZHNhKSgxOnEzMzpAPwmJlL3ZFu1AUxl5NOSofIBzOhKA1i+AEJkuQ+47JAYp +KDE6ZDMyOhqLH/Bd7Ujhi/UBZsZkqwI+pwAD142eQfV1ipHYUPjSKSkp +=SS8V +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/13FDB8809B17C5547779F9D205C45F47CE0217CE.asc b/tests/openpgp/privkeys/13FDB8809B17C5547779F9D205C45F47CE0217CE.asc new file mode 100644 index 0000000..0c15f8c --- /dev/null +++ b/tests/openpgp/privkeys/13FDB8809B17C5547779F9D205C45F47CE0217CE.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v1.4.8 (GNU/Linux) +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjEyOToAqFJWduzk11/m0Ac/K/mab0kz +zr3UUor1bkxh4vcxJHOTZF3a9Y6t1WUpwlOXeCNkY98tRYUg6A40wFgkKz/4jdOa +iDtHW2bOqrvJmJ/wH/5zdmDpthu53JEgXUKP/+j2dfrvYTZYxy2m11DA68QK9iPS +BmksglFMQE2IJatwEAEpKDE6ZTI6AQEpKDE6ZDEyODoAvKABRIX7dtUOm2y6VyGs +ESE5D4YI1AhL0EWodt84EPEUvC1o61UuYbAe28JIHwjIKDLgDiedZ6hTBV3K5cI1 +aFHL421hDE0qtD+mVZhcRGnR2RHhr9gX6qX+4P8mV0w1nhdShwUhlFO1GuwQ2/dW +KwYdXGbDW7P58LIiudGWuSkoMTpwNjU6AMM8WAY5lr1ZdSqr39rNqntLZqoXVO4N +ibd5Tw3o/3JMVJ/xEqMykrude87nlPCAJMPlX9gjP1B57UmRxN8mGNkpKDE6cTY1 +OgDctZRfAPGvQ4vUwxG4uso9nbCtFlGYZTQgMPHfMFflUyxH9Y0zA8ujyKKYFPYX +t7Pe6Y+qqu6BG0mPqvIXe3dpKSgxOnU2NDop+y32myNaSakGsQ732PgarqitgefN +3h9Kec4kS/j85t1esYEbC9XlFluVcIUDaQHdKFpijCl6eC2oFXOkPRwJKSkp +=nyLM +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/1DF48228FEFF3EC2481B106E0ACA8C465C662CC5.asc b/tests/openpgp/privkeys/1DF48228FEFF3EC2481B106E0ACA8C465C662CC5.asc new file mode 100644 index 0000000..688b182 --- /dev/null +++ b/tests/openpgp/privkeys/1DF48228FEFF3EC2481B106E0ACA8C465C662CC5.asc @@ -0,0 +1,23 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4xMjk6AOnl30hwc47r +LL9QH6g0TX1BEPdWMV4Ou6+rQOErIMAr1AOlUzpjwJllvQqf2OHnQWaTr9kbNLn7 +XUEUhjkH3uHDYMHMdyAb7YJrk3ECDqnmr34VV/F/H5BH7D6AiFktl1SpUTczPxBx +vPNlJ4joPmTm+ahfg+zL+4pVu6tIhM0LKSgxOmUzOgEAASkoOTpwcm90ZWN0ZWQx +NDpvcGVucGdwLW5hdGl2ZSgxOTpvcGVucGdwLXByaXZhdGUta2V5KDc6dmVyc2lv +bjE6NCkoNDphbGdvMzpSU0EpKDQ6c2tleTE6XzEyOToA6eXfSHBzjussv1AfqDRN +fUEQ91YxXg67r6tA4SsgwCvUA6VTOmPAmWW9Cp/Y4edBZpOv2Rs0uftdQRSGOQfe +4cNgwcx3IBvtgmuTcQIOqeavfhVX8X8fkEfsPoCIWS2XVKlRNzM/EHG882UniOg+ +ZOb5qF+D7Mv7ilW7q0iEzQsxOl8zOgEAATE6XzEyODpfHMTxVhkHswZdPZ3B7pLc +LktR6NDmaKNVyhP1/G2y95+dY+s2QT4eosp+uYWeR0XHCqNla7TDND41qrzyEAtH +iAF3OoydMK4lb0lqfKORRI4tr017wgMxRBLs82Gk5ehtI7AwSca7WvaoAJwKZp42 +th4MOeykeGRRMagJI420QTE6XzY1OgDzN2Pz0dRD20hHKF6eiqAZYaZhmA7pKWuW +jHCVXO9s6zGfn0Ds+kTQJltOxU/AULATN/ffXqTtXSiprxNUvwnbMTpfNjU6APYx +GOABYcWOpJn35eSoisB04QtOgT5OpAl/dLbeaJ+Yh9KtrY6wLf/mX03FgE+YbkIf +TmeB6tDf4RYbXCYyKJExOl82NDo5wagaIbek0F5TRtmqdVk1weEk/0XXdyG/mNIA +4l/qt/LHcduBN46qHYEKnKhyDMCBDwlSRf455FG8Oi1x+JMYKSg0OmNzdW01OjQx +MDUyKSgxMDpwcm90ZWN0aW9uNDpub25lKSkpKSk= +=hX0p +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/1E28F20E41B54C2D1234D896096495FF57E08D18.asc b/tests/openpgp/privkeys/1E28F20E41B54C2D1234D896096495FF57E08D18.asc new file mode 100644 index 0000000..d0b621a --- /dev/null +++ b/tests/openpgp/privkeys/1E28F20E41B54C2D1234D896096495FF57E08D18.asc @@ -0,0 +1,9 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6ZWNjKDU6Y3VydmU3OkVkMjU1MTkpKDU6ZmxhZ3M1 +OmVkZHNhKSgxOnEzMzpAZ8zkuQDL9x7rcvvoo6s3iEF1j88Dknd9nZhLnTEoBRkp +KDE6ZDMyOnicJkwzhZjYg5Fd8zqmEsZLPdGwe+z+8DU6lq6zj5HcKSkp +=ZStX +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/2BC997C0B8691D41D29A4EC81CCBCF08454E4961.asc b/tests/openpgp/privkeys/2BC997C0B8691D41D29A4EC81CCBCF08454E4961.asc new file mode 100644 index 0000000..13dcd1f --- /dev/null +++ b/tests/openpgp/privkeys/2BC997C0B8691D41D29A4EC81CCBCF08454E4961.asc @@ -0,0 +1,31 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6ALWn703ukwPA +klb9+e/m8qGu/XewzQ5fnciZy+YA71aO1L0vg5idBqmWWhUZ1H2jMLpSmHGTsWvw +v7OpIgsPcyIqmlJ/hXNFxYI/xS8Y9AzFlASs+DqmMOjBghE5crakHjS6JxtkBNK6 +efB3teA5WlD7oVJwhYMsUtkH8/OJq0Lml3sZaca3vDvm0CnEDlqr0pog6RiDxAmO +gUO04ZcjaGVz9sb+U+coIe/qG1kJZFGdSpuV1BS79nyjMnmMfNt2uB0w9v1hnGrv +MU7q+OaaP/ii8+tI01WOGn+KQsJp89PwgcnA8y57Up3zN6pDl9WF80uJL/J3FIe8 +RuaE4VBv76spKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z +aGExLWFlcy1jYmMoKDQ6c2hhMTg6fMHJiYfEZhM4OjE5NzM3NjAwKTE2OuNRxs9I +ktHtlDMTy6rWZJgpNzM2OlWwk5Xhn92HLSgS6iqiDLYg3NLreSQrnI4i2ujY97BD +R62o3Li+mu2wO8zFy+zErpMAg1Xn8Cy5III9jQYznUfUCa4UbThAz4XnSTHkP2Ta +/YunBqAnetFmj+HIeSpFcsUEY/MF9bKNuiEtA2Te0J1X6BYUMY163TxfkLZDTG51 +tyuEqn8n2B6fBu/Vjysyq95ohrrkvIkwIs3p1UOa4qgn+wbr4br8Bu6mf0+ClXoj +nPCim1aQMrzZHyWYXgqnFjRnHW36lHpdWGqav7vV3+qbjzlVMldOGx24PH1bAYnS +BD5eeMletc524qYBSxSIyItuReieymNNYAoF6Wf7ayDzDzf2pGrY55wIt6vH2J4D +24M1ydvS99ibu80A8O/K7WuYHTcrzgPPmp6/aA3q8kxGFrHrAZ1r54yHPKbYnNWE +v0BxNe0poaMZJKDQIoJT0mGEmlpS4lr/K58QyECIDN1nOVyKL7ixxsqjJI3G0ZY9 +vpOpXHzFIToA8U+/82e/qNUA7wkQMOhG2lF9AxyT5eEOEhCW8J7QZM+FO6ocplgH +ZxwHa0ymv8Tj4yOVFNSo/ENJym1HGiyvjgnQS2MSZ5kIyVNuGI8AWPsWQJ6B/04p +LE8apX775kVhvIX+DNU4Bnxnb7KtG2HovT9NxQIzIYcANC/rOKdOq2j5vS4XqHsB +O66pV0JLa8TPD5iKDIzS2ONBxyKi2HqRg+xkEIpNBhvrQgGs2FzoRvivbjBOgwjp +hRkX1dkF4axKWEPRuUhvlA7f/TzbHFtjbWyd5fm57j3BgsVj/EcSrGtpl5JQd4k7 +etSIWvtWWySZJPDXz7CW9Wh7W0ZXA76tmniLDeYl8lnMIYa6ylttTnuiW4hh3naH +JFtWytL1ivCeo8iy5wGQ2X3Jp1C+Y4+lgR4pPE8w04y5Rzo8Jo3VSMWbeovn8djM +qfXy6yH7H6qHYCO31IJxFfz89EuCE0EGrYUzDFr5KpUpKDEyOnByb3RlY3RlZC1h +dDE1OjIwMTQxMTAzVDE3Mjk0MikpKQ== +=jzZd +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/343D8AF79796EE107D645A2787A9D9252F924E6F.asc b/tests/openpgp/privkeys/343D8AF79796EE107D645A2787A9D9252F924E6F.asc new file mode 100644 index 0000000..c674b65 --- /dev/null +++ b/tests/openpgp/privkeys/343D8AF79796EE107D645A2787A9D9252F924E6F.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v1.4.8 (GNU/Linux) +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6ZHNhKDE6cDEyOToArHGqWD0rP0Nn/c3nYELTD4m1 +gqR7f2+l1ZUMdHcweYwn/fVjaJKmbR+9GzeHWP398FWYs5mCU1DIfrZLF0nJnAJ6 +WRnN9TL+oub1BqqLvCmDSngRuZZ2gUX8DVmD8xTsPnDnG74QDUnvtnpDIAs32sg5 +dnusstrriXD8xXgt0g8pKDE6cTIxOgC449htJbbp5rkJHvBDs4YxEIkk5ykoMTpn +MTI4Ol+ITxpSMOT5R67Bu4XWoYU7nVeYURpb6LJ8LK2CV7ygECwFdRFdukiGFB+a +TP8nF6xtuXalaBuerkKp4QXVKqOIkp7MWN2TAOOg9eERHPT//whryf49meNYMPLv +KAe60udHY76Glm+Zso+24WnEwXX2od1PHVV3CItWRb7YmhgGKSgxOnkxMjg6AgXt +40h2lpiIHTjbu6fiCBzbr5j2eQX3cNoydkRphJ66bqD+DsPW/Ag0WBCQxgRaLgMr +db64fQT+fyjbTBLbC8ytt5hpCbm/q5x3TTXDAUNjoB3CnA/tQItBy7qqq/A0d3FZ +grr6AixK58uZ4wauy8LRZCph67UZ8akcgwJkmVkpKDE6eDIwOn/Y1rjZASGMK9IG +b1y/ZDKT0zkTKSkp +=muRa +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/3C9D5ECA70130C2DBB1FC6AC0076BEEEC197716F.asc b/tests/openpgp/privkeys/3C9D5ECA70130C2DBB1FC6AC0076BEEEC197716F.asc new file mode 100644 index 0000000..9a6e102 --- /dev/null +++ b/tests/openpgp/privkeys/3C9D5ECA70130C2DBB1FC6AC0076BEEEC197716F.asc @@ -0,0 +1,31 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6AK8HhE8MmR/i +QdHw5kcWa8Lm7henF1KdhF3Z5iDNeurFrDQsg/RFHJbaMyVCzCP/Jc4ayub2FzeS +fJdKXrpMPAdaGjlbGLdY08Fc49E+7M79YQXgyGXhTm3kZa8bw+TfYnLJC6snxefG +5YQqEpvV/mfvfQd6XXxDcn/u56YDJ5Lo7xRXmnd4Ifj6T1lF2KDQtDAB1vlpnuxE +QfnAI8C8UpsxOWC1tSuQ5HIoFnwqAEfEiHH+P2YuHG6m4oyUfT7c11rHf8S01R9Q +JQCr11Dn9WMAI/IHe67BsrbIAxG+9yeBhIkEShBBxdNqIt2FnE+sTmQHv+uiY4ya +3ch63dvZ53MpKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z +aGExLWFlcy1jYmMoKDQ6c2hhMTg6+Nvda1z6F404OjE5NzM3NjAwKTE2Og6NQq99 +p1NyYxcYgwRiATApNzIwOgzqYGEJNhmx149fV84cgLNbmIifZ48o+oywHbwdju0c +oNmaBHv+Xkm/U5PG/CPYINJbFIewrxuNpGbW69VMfOi5nwcvIE2LouuRd4Ih7cYq +ub9fjqIH9tO4AA4kkSA932AfJseLTZMcSqvSmyIE4GU6psDjQHuXur4ywKYX0iPi +11hlhFtiARw4S3ToidPukg+SiEJV6Sec77BmQ2NG55FEB3GiM8m5LOMSPq+ZfxI9 +RmldLuyC5TfGWRgraR+3SU00gYkbAOjwlblHloQzoHquCpumujGvSxYolDsW32HO +Eojy0k5iezdwbnpBmdWJbnI+qAQQ2wjmEFPKVPnOF4y1Nki+sRXrgFXGbgHwHbRN +yMgRgMVeYycHhhEz5N+VwQ5yKE3hvIbD0dznD6Z8QAb4PXem929eJDz3FrR8gasN +2udqDyHkczK3y5oJs4k82Fnmn3Rjfgddyo04SSf/1Gwg31y33Xh7dkdtU+NOt9s9 +wCu+nJhdbh/IH8fXPax2HuWY7q0EPlZQldbeBta4r+RWvNFFDAG8DK5uBHQqtKoV +vV71ffPm30s4ysaSF4mqF3eIYLltPYNenvsYKpT/cn/3WvbLsKqMIOGytz3P8fQb +49ZDGDyzT1rQDuJ2oDk7N+epZu+lna/nRo7UBEo+Tf7CkcTKQ97wY8tqqLUdclJr +KJsIIutg8WgIx09Xvip1gfOAZV4s9V6aMejT32CBLSEmC86t/Tu+3HrstX2E3F8+ +Sc0gB5B62/PMSzCI3lgkjMRp6yCzm0cZkHSDHOSLpoEvSehV0Gv33DFBPNog8XVE +A4H404JRMBHI5mKpYcYKv/o8ZpQgDGORMZYf5W9/LMF06QZGz36kPVyIwL2j8oCr +0T0kp/ik8WZSV+BkwKON2fPkROQ7c7ZM+S/xcrpKEe40/dWtTZUABGhCL7IXwlqm +u2nGS/Cfjmq3TRuRJAZFZykoMTI6cHJvdGVjdGVkLWF0MTU6MjAxNDExMDNUMTcy +OTQxKSkp +=04As +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/449E644892C951A37525654730DD32C202079926.asc b/tests/openpgp/privkeys/449E644892C951A37525654730DD32C202079926.asc new file mode 100644 index 0000000..1a6a0b6 --- /dev/null +++ b/tests/openpgp/privkeys/449E644892C951A37525654730DD32C202079926.asc @@ -0,0 +1,10 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6ZWNjKDU6Y3VydmUxMDpOSVNUIFAtMjU2KSgxOnE2 +NToEOx/Lj6ZzYdOMdprseVCR/dwZaYPeInquOlapE22Udwppy4tQqj2jXDYH8d0Z +5uRvT/FD5lpcW+Cv+BAoo2auuykoMTpkMzI6Xka+GGkZ6tp+azZo+LPj0inV0GnO +vact0wafLNZvlQQpKSk= +=Rgp0 +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/4DF9172D6FF428C97A0E9AA96F03E8BCE3B2F188.asc b/tests/openpgp/privkeys/4DF9172D6FF428C97A0E9AA96F03E8BCE3B2F188.asc new file mode 100644 index 0000000..0524739 --- /dev/null +++ b/tests/openpgp/privkeys/4DF9172D6FF428C97A0E9AA96F03E8BCE3B2F188.asc @@ -0,0 +1,31 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6AMwChvrQ9TUc +PtBbfK0UWOt2GZrzq7I0ZhcjfoxGD4UXxKNBxHcyb2cQYTh5tF4XqIv9d2Sys1c4 +fU2Rr6lnPDc6VpSLKoHZj76jWkcWVf80+MXFNVp/YqErQBMu/AkA/Cwk3hEgjqQI +ZOo9awfBATJqGmW9y3Ct1IV8oM6SUOjYQ8CcIa2jpSNNq9rhXQjzTYUZHK4ayTmj +mPvuqSxWahUsOZClA3GHpLZkFe9k2UJuVIUfhwYD4CyIR1nqlFfj87p/UEPs1264 +/RpBagz4G74BiLhiHQss8NXm1zWiRZ1xPyJIkrDm42JRQ+6gGf1qvk2tyS3Le4W+ +7sg3r08UExMpKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z +aGExLWFlcy1jYmMoKDQ6c2hhMTg6xlhuUgeZDb84OjE5NzM3NjAwKTE2OilEwfz2 +SNwgLhCK76qARHgpNzIwOqgwKI52Qj5ABmkzDaJ3srvp4C6GnCFvosWjaNBZkLaX +z2cGEh75T8Klm/RR8tXhXxHcl/b+UErb0CDRy6nQvMhU6LX+0hfk6t3M+wE+Wz/Q +/uPoT5cdgWRUKBjCzSgH3DKwjBM8z8L14UCsZt17vEDVwE3jvAIo7DmvCjAKt4tP +jyyBUMl8kn7HBAJkIthCnNZ3Egj1o5NqYVc6Dbh82x01lPh50EkNUOi2MANRxkCG +Ycg8zeB7uaMwM7Hu+wtev+QMve3aoRVRGHIEbwzj6wl/OwmSROWmQxmLebs20dMD +sdhaUkfGV2EFXSzgsK8q3zrWN7mkr/h5zs63kvsQnbsOU3ym+/OPgCOUSBm87Ggu +GyUoIblgyzJHxNHN0x0RoFue3JE4CCZvsj+Cn9auwgniBCTMBHhanLm4+y4jMAdU +CEdHV4m55FOG1i5AyNr9m8U3/SPzlHdPJ+9P/8hEJhcB6tbX7I43K8Wl+5I9yJI4 +p6gI7VQhLCjmpUihsnRdmFGfxneDxNNIlzDwPOoV0thfOoju15ofxNdDHCzWhiin +2WVhQ60iHLT1Pfgk1htGs73wIFDsmHdJphmAscCq+uPDeDu34GPZi+DGQIndIlWw +2Dx0QjvtV5DYYHL4AYKbvCrMhTF+2ECZB1WuwTRV3AaOS27GnaneWK6KURrAE8p+ +LSIvFya6g6tbjScflrLNBm+8n7/Iyq526IiwgxQC8g6t79AxxKBSarjw2RhQRi5Q +PJymKlVvp+smFATNLMC+cjEFSP3zf+8a1gQnmSuaSY+UmhG/yakDlEmZzTRH5K4r +rzgFvQhi4rZMCSBTy2I08IsIzeZhzpsrWmsTCnPIaFZ3VwzzabbLV2pwWda4hW0M +vXf1SZwL02RujWISEiJ5ufPwm6eFwH1dNRvxSTN34cw53/cFyiuuETDx2/XIp7Ec +ODuPCvJvsVjRUBQ6tdxkLSkoMTI6cHJvdGVjdGVkLWF0MTU6MjAxNDExMDRUMDg0 +MzIzKSkp +=opty +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/50B2D4FA4122C212611048BC5FC31BD44393626E.asc b/tests/openpgp/privkeys/50B2D4FA4122C212611048BC5FC31BD44393626E.asc new file mode 100644 index 0000000..6233524 --- /dev/null +++ b/tests/openpgp/privkeys/50B2D4FA4122C212611048BC5FC31BD44393626E.asc @@ -0,0 +1,21 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v1.4.8 (GNU/Linux) +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOmRzYSgxOnAxMjk6AL8pJ97q5V8O +ADcGsak0uFXFP/K3BcykEjykR1OJjSNaditv9i7zC0J5n0YC7H9kD+1537ul2Jsd +d9fk/MN+BRNnCsglrns5SlbAjzvwDNnE2ydW/Ug/q58bIRIowTg9RA7mF4qHABvS +BDAXACtLe/ih5isSWOEnv2Sm3fX0kQATKSgxOnEyMToA+hTknylYwYGT/PEVQ4Jl +LPoWmqUpKDE6ZzEyOToAmfUdfU53m3Kgrg4QAzkb7AfPdIGPgUyidk1azUi3Tcko +egzm6VDYWARaYFUg9MpIOb+NBc9gCnPkOnGmgZhtMJoSjrN8TfYATOhcOYYBkT3R +eGr/BwQ34lwekfK0AD+f6FhpHexh6BDnaZYxH691330o7RXSMtFxySAEDtnaOUUp +KDE6eTEyODp8cyy2nYt0QI5Tf+t/d4WBeib2yNWVtZH/j7XpDqHLZDgVAYkazCA6 +ZF7BvLddBEqVAh1X5tqua4AXX9L4SGYb7B0LRV72alhYiWWHez126KjVgwRTUxtE +J4EnHmYJRReLlXosPIRhXSz7HFAqalPXJ0DvC9kzTQnnjPOylyMPTSkoOTpwcm90 +ZWN0ZWQyNTpvcGVucGdwLXMyazMtc2hhMS1hZXMtY2JjKCg0OnNoYTE4OnBnEA/u +YyreNzo0OTMzNjMyKTE2OtXuvrOxsl1/bOm+6zBEQZ0pODA6XEPa+d4D7F2jof/+ +sJvtf22PzAgN/qZ93eIKlJaHxQFQeOyLrghCAUyZLIBzR8dlNBG+uWhg7DBJMVnR +MhH24nqzdivp+SxlMO0XdnkmkBspKDEyOnByb3RlY3RlZC1hdDE1OjIwMTAxMDE0 +VDEyMDgxMSkpKQ== +=ZfqD +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/58FFE844087634E62440224908BDE44BEA7EB730.asc b/tests/openpgp/privkeys/58FFE844087634E62440224908BDE44BEA7EB730.asc new file mode 100644 index 0000000..103d043 --- /dev/null +++ b/tests/openpgp/privkeys/58FFE844087634E62440224908BDE44BEA7EB730.asc @@ -0,0 +1,31 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6AKotlDIKDSEy +vIjkWDdGHQCzm1ebRtyb15Ljkl17NV4biDAA+2qOrw3QJQ+6CfVpD8XEygXpBEv0 +16VgFuB5MsINHNE94dKAUc0R1uUwZljeINPQ2F/72t3SFiiBBGwY4AHDNn/zi6Rc +M7JwjJW/pkkqcmvy1kA5kP18XA6wgY8NsyCa+H9ZJm5BK64MSGUEdscWykuHUW3z +g6Dc8bST6OhlokclRWh9KVK0QRbqnlQeVP/E/Kv4LhnbXNB2GE2Yecah4rva/PNq +2YZ9CfyuQHwSJQhb1h1MKLi57AAacgAhV6OcR1hM6We1Vh5JDFEj01DsIMC11S1Z +zHYLXRWAec8pKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z +aGExLWFlcy1jYmMoKDQ6c2hhMTg6O8dPH/PCXh04OjE5NzM3NjAwKTE2OhEO7X2q +8iasv3iHvYbCdQcpNzIwOjBesXtjq+5LWL6zU5yqEK5GrykQBIHisxNK+2TA3vBM +sb/646D5Za60r6rjAShVxIWa9c5rzmS+rITBVodTzAjOn2uj9k1TQNmqsWf/i3zj +xe6puh6e0IIkAoMcHpRozSOHF1q5YDKfI7wjr8+u+TdROFhEhObQ1CXTnjTCx1aB +oQG5AvybctPjSCdYxVujXmNjrgngZodiTxsE4OBG/bk2msK6GY+oJKgBCp/5m04Y +DGDe2w9MDt7UcW0tlo2kHk5cwKPs/ziSu1gfaFqqOzFBdUc+gR5ikbzDF1vJ53W8 +3DwnzCSkuciBX8MeGiAfkR8f0WQsBStMNZewnCsPYeB20Cl8bTAtzs+X7LKzdSI2 +8gSkIV/GD3VwYw80cqn2eF+5cJKtKIV1nOxPRoXgcuWvNTL2nyLggaJDVusy3MKY +O3yNnadWmA1XT8NMBx+yY1i0pCfmxWK5h/2F2cNbe21MyhlwgkGD8jVZCiW/NeCB +VdpFHcqZz+rYchLTjs+LSoINKFiwoIpK54pMAuRO+E1y32Zo7XoZqyDkU/ip2iAK +OaB5LTjl/GI5ISRBcsxbPXOxbNnUat+0p88T4Dj/V2ZJkubAwRIzgOE9p4TgHqlF +2kkl+4rqqnooDUQ4ViEIUxjq2YIws9wkWAthMMcJVDgRcD8+G6IGAJ3tQlIaW9oA +OVLsHcXdiFbcEE12m30CMI0uUQSavk+aO0qO1ZQRYtu9EipGWnjWs+0ZqcMaz9rj +ACv6rvsts6puie3uvL+yzEuzpWC74e50kElF0MLVQropNY50hvXqrnKzoU5ppaNt +W7q4vrtKZh7QOFt7mcG4oTSIpr0vTwBGl0YbrORviF1KdaW2sPHNfbL7hrTx1HlU +3BnAM8b0kYz+NEJ1qxNUfymta5iZI21LebJNTWJIiiCBS33J73Cxr92UaafU3VRA +jZRpavMXHHoesBZ78uDqAikoMTI6cHJvdGVjdGVkLWF0MTU6MjAxNDExMDRUMDg0 +MjM0KSkp +=zQRC +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/6E6B7ED0BD4425018FFC54F3921D5467A3AE00EB.asc b/tests/openpgp/privkeys/6E6B7ED0BD4425018FFC54F3921D5467A3AE00EB.asc new file mode 100644 index 0000000..ecabe4d --- /dev/null +++ b/tests/openpgp/privkeys/6E6B7ED0BD4425018FFC54F3921D5467A3AE00EB.asc @@ -0,0 +1,31 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6APL1FJVAgVOE +iOLqgmqCWcCgIfl3FT/pBaLJYLO8NersRuygQ6ArAdNYar/h8MKnOkYCwlISr3fp +Jtj6cpPrz6IU1K09HYEpVc6n1UbD5r25sDc9Ol8ztg5QPVP+ceA42nzpHAnMAW7E +9dz5gsM/H6TlicF4qOT3rOfpBqDx1EHOaOS6pdnem7SwSQZ6RFetJotkXqEFfSNV +lMTLqqysfk5kUW+jn7B4Jlpd7YWtlaLsPXyY1dFwi24VqpIiztOYRoWFObySrpZk +wuPGkQ5P/Eqi/2+L7VKXNfODRI0NV6GX1FaQ96lIq0Y+z1EWojLwPb9JR2FLGqC+ +4/mm/W7Unf0pKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z +aGExLWFlcy1jYmMoKDQ6c2hhMTg6vkrGYgB5EO44OjE5NzM3NjAwKTE2OuQHqFdP ++Q1Oz+cCYcb27DIpNzM2OjoNch/oeQ0jhPqg+yQ0z3Qf26SgZEKqsdozUsPbhBfs +n4zjoOj3goT4DTFl/pCWL6lCMy56Tb2Ra7j/SUeKAqBSSwarsG6mrFktOQntpw34 +QWxaOc0dJEmy5/IqY0uz4vK6y8X0MWPTDPt0kxvi5Z74MQ1uVsC3ZnepSenLpr/W +F38jEsq3CHO5rXUDrwMLLTqL0zE9bE4mgQkFIrzZ0UFM8iFi7cI+Yyp/esbZHubJ +MqJD1QVf9TpA8OAVXPj+JEYljsqszvjqWbO5pceTyT3OxS0/t0GXeGkbhgS+42qw +VOlZQe8r8Zs2MfJcGKwTGxS4HW218YZxZAan0eFOsVan+gKthNRGjvJzyy2w9foV +OND0EOzkeBFDohjWN8ROkVI2z/DyG2WDoc2H7tiajWHTr31uhNlMXDLynhp+zoRV +GfWIEsrfQiUcnuPyWP+tTyHoqTlAPOqeosxDsZfosEN/GRxgd3CFT1OBdgjd0YHc +fB5Dfc8JtVvZwXECz6A2eXCOCUJ7ljRpNp4bxtnRoO9VAydWcgpAq8DjwkgiDqLR +xYAvjAe6irEKNBKVocGV/zw03JvkqnYW7ChLr7sNfiJReFuiJXmWq1mYerOHo356 +LIaZsN0n7NW0OmQmAQmv2ezC1ZCMyjuIMKcDssTieln6Yi7NmmmRPCkkiWoK2XtC +PVY6Q0gZ1zUysQ4O/Rcm3Nt+U8JUpeXvry0086f0sk0yEdzB0RbZFyYMWFzwNSW4 +VsYtxqvzPVmYHBO6UihvmPnCuwIpUBVpKjsXN3NiARlPk8uAzR/quOgLxVIX6leq +1hT9DohrFGxP/O1SQhgD1xZfMRwJGo9J7OYA9JWRvZKguM6bJMYZ7Y+PJWZDfifG +TuQLPq8eA7B2KXEzNjHt6tyyDmV/SsbEoUPZBmGqD59/4JJiHtRy5HJdEAJXTYul +FpV6Fx4qVf6IjnH8ax8tmxLenGBomboigTofJFnz51MpKDEyOnByb3RlY3RlZC1h +dDE1OjIwMTQxMTA0VDA4NDg1NikpKQ== +=4K7Q +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/76F7E2B35832976B50A27A282D9B87E44577EB66.asc b/tests/openpgp/privkeys/76F7E2B35832976B50A27A282D9B87E44577EB66.asc new file mode 100644 index 0000000..79699a2 --- /dev/null +++ b/tests/openpgp/privkeys/76F7E2B35832976B50A27A282D9B87E44577EB66.asc @@ -0,0 +1,21 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v1.4.8 (GNU/Linux) +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOmRzYSgxOnAxMjk6ALZlsUNfTCYk +jzIsNhB0iJl4C4cuZ/IeypdosZQxm1aIC+f+E2ly3BqGbMqbmheKcdS9SQs5DSzy +s6W7XmeHDhrNzfStM/UuwiSfnM5E2cV2BgLpErKE56Kb/rf7/Ia12dObj2VV9oKr +CwSYEISRdp5YMar6J7Vvz0nz1Pqf8mq7KSgxOnEyMToAoQkjVeVGG+B/SzJ6+yif +dHWQVkcpKDE6ZzEyODoVw8i11+Plhxj9mnredV5SqI1hsLGZnPSzz2IcFP0XFDu3 +HtUEG9FxZVFRQYWNCUKTP7cv5DYvmhlhc4oG0PhwFmZFLwPPlSAFZ3jfqfkh4RiM +i01yqQGE6uOgML5ZWeQqb39Ngqf/ltWlcgNKpwVjMniMV5kfRzoupccZ+XI2oyko +MTp5MTI4OlVm585daoJeQG/Pg7LdDkVuNBDT/63LysOfw5NqI+LjUXJScSLos76r +IFLT0WOdmP74+RxFxdb31I3GYQlFjsy40e3nAi8QfaM0Q4n2WzPNkUENu7CyNccr +fn6U9sYTLr3EI/bqIRp/KwoptFcmETUL62TxKcr4abrayK+Yr/lqKSg5OnByb3Rl +Y3RlZDI1Om9wZW5wZ3AtczJrMy1zaGExLWFlcy1jYmMoKDQ6c2hhMTg6ndF2xFqT +19k3OjUyNDI4ODApMTY6QB3EeZz7Zs2uIRmjRj/ocyk4MDoN3zs2+IgNNxe0pZQ9 +XzwAAgAA0MhK4ypYOdDc2fvfvCsjrhQyUW5ZQVVxFmf7hgY6YZzAlldXF9bD9DMC +JtcJmap6Xk5D7VClxR97yHK+ASkoMTI6cHJvdGVjdGVkLWF0MTU6MjAxMDEwMTRU +MTU0MzUyKSkp +=8r3/ +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/7E201E28B6FEB2927B321F443205F4724EBE637E.asc b/tests/openpgp/privkeys/7E201E28B6FEB2927B321F443205F4724EBE637E.asc new file mode 100644 index 0000000..7ec0448 --- /dev/null +++ b/tests/openpgp/privkeys/7E201E28B6FEB2927B321F443205F4724EBE637E.asc @@ -0,0 +1,18 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v1.4.8 (GNU/Linux) +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOmVsZygxOnAxMjk6AOgCS1p47zcd +ec0UvVC0phewalHUU6f7mulWr0j0ZY1RU0IOP18HAeT7INcwPcUaUvC9KYenXmYb +vO1i7sNNUCOsKUamwg+oSNMcbM3AwNwxlggTyJS1N6WzIX7MjRLUlUqtbLRhPDGl +Cltt6yeAjS0pZT646TANaBDiRIgk94ADKSgxOmcxOgUpKDE6eTEyODpGh2X1Sy+4 +Ip/RtMJDPZOY+Y6sWUN7OiM2BkdUmCLOmaOVfgrsEevKdSBBj0oVWN81U02i7jQz +hhAI3tZMFJmP/hlF7AlS5HSaLj2+t1nHAKKy70QhskINR41CCv9sHAc5gN1WrY5N +DpeI12GmqsWMPQVPUHsTTe0QsT6XbHzvCykoOTpwcm90ZWN0ZWQyNTpvcGVucGdw +LXMyazMtc2hhMS1hZXMtY2JjKCg0OnNoYTE4Or78V63MKf6HNzo0OTMzNjMyKTE2 +OkxDOAnTGrRgVCyb5u0UbCYpOTY6tghO175Vpfia/wJGrOUT0hgS3Es/EaEHv+bn +jYBeErvROJrKtUboxoGox/Qa2xxpFFhFWtR3IX6rjmqS1a5RhwEmYxFb/IzVESuZ +Kf00wS+lmJuR14ACnuAOfVF6OQP5KSgxMjpwcm90ZWN0ZWQtYXQxNToyMDEwMTAx +NFQxMjA4MTIpKSk= +=a0Os +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/8B5ABF3EF9EB8D96B91A0B8C2C4401C91C834C34.asc b/tests/openpgp/privkeys/8B5ABF3EF9EB8D96B91A0B8C2C4401C91C834C34.asc new file mode 100644 index 0000000..370e862 --- /dev/null +++ b/tests/openpgp/privkeys/8B5ABF3EF9EB8D96B91A0B8C2C4401C91C834C34.asc @@ -0,0 +1,14 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v1.4.8 (GNU/Linux) +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6ZWxnKDE6cDEyOToAzNix+drHTYCMxS8NiUZNpVTG +nWfzMjxCqVyZYt9CEm7A4JcfSbgRUppqKunwreuDmmNGFc1W+lT1oLfvJaDi/oQ/ +oubgIcq0EZ5gOUydaj961PV3ltNmaaUSZsJ6jRxaa0FB1cgx6EVB88gR6JB4mAM4 +KV+Ct/f9QzPv2TMS8qspKDE6ZzE6BikoMTp5MTI4OjdzptnsiJ124yTW5ewhvUVp +mDGuT9CuA3ggW65bjOhfravX5rfHMCXLPXMNXFgpA012vghVwun/ekkj7/rxapZm +lE28YpSDj8Pwn/lkqNAjy466My+wUeoCgg7mEg/75is2ogKzx1L52nay7BGmfS41 +5m7BBjWHsiUA6KRtFXt1KSgxOngzMTppFcbO0lgUP4k3sTNfSIfwBCt8YwBTmPk5 +a7hTI4y2KSkp +=miH9 +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/9D7CD8F53F2F14C3E2177D1E9D1D11F39513A4A4.asc b/tests/openpgp/privkeys/9D7CD8F53F2F14C3E2177D1E9D1D11F39513A4A4.asc new file mode 100644 index 0000000..f237e10 --- /dev/null +++ b/tests/openpgp/privkeys/9D7CD8F53F2F14C3E2177D1E9D1D11F39513A4A4.asc @@ -0,0 +1,10 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6ZWNjKDU6Y3VydmUxMDpOSVNUIFAtMjU2KSgxOnE2 +NToEMIx/SmNEvuSVkX0Xq60JBOTUT4qTr3ywNqUOSaKijgdYKjwkIF+jpD+7TfSW +vMznIU/Ued6WdRrqtQbi4KVzdCkoMTpkMzM6AIbAgwG04OO3x2tqboQ8eGekVM24 +4oEWVVQjQwNeheokKSkp +=RxSg +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD.asc b/tests/openpgp/privkeys/A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD.asc new file mode 100644 index 0000000..616c697 --- /dev/null +++ b/tests/openpgp/privkeys/A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD.asc @@ -0,0 +1,20 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v1.4.8 (GNU/Linux) +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOmVsZygxOnAxMjk6AJyN1x9X9Lsj +fX2Z8O9s7BzMO9OoOxFtvZw+FA0BuDs0WVYkq1GuZ9/XiO0K30zvtZnlb7NMvBfz +7xbLeYx+vKzy5xkq18+LE5dU+HKKdRQZKrrwgCsDy8tJRO447QsiLTksCDqPMaE3 +2OCRBF5nKrG5vih7/cmEhf2CuAn+2yM3KSgxOmcxOgcpKDE6eTEyODoZ5eYysaLn +AwPeqQ9vNvUyrCxUEmrvl4svG7zkkg3ZcgAbDpDQUmnijt3gEBCoAzO3c41TU5wJ +aUNBEPGPWfKcTlmBEGJWjK50QQuA2diGncxIS5SDs+QVaf434a6/KFVQcCmV7K8/ +T2S8/nuGJ/rIlFL5XovW6A/S9mYEjh2pDykoOTpwcm90ZWN0ZWQyNTpvcGVucGdw +LXMyazMtc2hhMS1hZXMtY2JjKCg0OnNoYTE4OkuRjUFO6YIJNzo0NjYwMjI0KTE2 +Or7L9Ekww4C0lZz3g61PzJEpMTkyOk7ezAcv7simMXQw+afvqUlhdoyVM4QQuhj8 +KzqjNP3IC2fSHoFECWxGfC1fNcuqzRnzs98TqAy5BDnNXSW+e+CpenWtLpID/dvb +azkeATfhMf/2KMd2Mahi6rnQ6IBnxhq1d5jLhYg00Ba1HbojEYOkCPKQlFV01bQw +mUsyQ7sMr42JvdFTI4lDmQlHfqoexpFpLCDv4eUKjvG/K7xs0uLiF4vyMLVH5H/k +6EF9HEP9sUF+aTDJXrrfHOUG1LR6/CkoMTI6cHJvdGVjdGVkLWF0MTU6MjAxMDEw +MTRUMTUzNTM4KSkp +=soiR +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/A2832820DC9F40751BDCD375BB0945BA33EC6B4C.asc b/tests/openpgp/privkeys/A2832820DC9F40751BDCD375BB0945BA33EC6B4C.asc new file mode 100644 index 0000000..e69c27c --- /dev/null +++ b/tests/openpgp/privkeys/A2832820DC9F40751BDCD375BB0945BA33EC6B4C.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjEyOToAx9HkS9EewRBeMrB/4u8wPapd +l6spEli/46To7WcmBhmvEZJdG0ZQatYNvgkREqOadsgd49onjYaCkBSJtrJrSUOS ++Mo56Ff/52ejToFyfuZs6Ky0UGm9tvKEJw3aZiGNAZ5Pyvp+Jf+xLDwvj0xHHAj8 +lEEhOSrIrGvq4yx/+nUpKDE6ZTM6AQABKSgxOmQxMjg6DfYRUGbNEko1eq8wUEfM +BBL6NRWlaf2/coVcLPIvCvASdlTWoog4KC7KiQOTKM07hp8Wz4u3hcDnMG/u60/u +BPHPHCZThYlpGLVMhQwI46NZtMcRSNBp1rhJ5dt/FEcSFvseJOgce4PD/96bB3+c +dbnvKcWM7ncRLj0wVfBzKeEpKDE6cDY1OgDanvj9klp9UkAgNwRxswOgiFOlGBsz +J4dpCZHzWDCjYUd3eGWieynAnfuvctGTaMyB5xT7RwruntbgeRgPpejZKSgxOnE2 +NToA6fv/DFn2WVRAODQVQQGGxsvO2cM847IFJu96BbbxOLaZJ536RE980c2a9q/9 +B4hOYzKV4B4NI03u5/BqoOY8/SkoMTp1NjQ6ZIvWN1fksXhQMypVTLg8R81igqS3 +GXKmQ+KrVEfTIHnXKxH7tyfDeJSS6nfpfARhAe2mP3TIrbjX+9PR+QmkgykpKQ== +=dUou +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/ADE710D74409777B7729A7653373D820F67892E0.asc b/tests/openpgp/privkeys/ADE710D74409777B7729A7653373D820F67892E0.asc new file mode 100644 index 0000000..8a4fbf6 --- /dev/null +++ b/tests/openpgp/privkeys/ADE710D74409777B7729A7653373D820F67892E0.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjEyOToA5Hj2C3jzD8OGtLaw7+P2gYdA +fR4s4YS3/AK+kYYtbm5EX4srysyUbylbQDQXUvRzw4FPkjXbboF6KjHw8icNWHCa +zwSfPTfCDvi0JIildkfNqwBzCmNDRn++X8rvAeDCEJ/BtfcgfgmDTElSJOd+3B4X +wnmtnBW54KlR42PLobspKDE6ZTM6AQABKSgxOmQxMjg6AkvpIaKimXAwf3G1m1nl ++LEDKdo55gosry8XToQakvdeXyUerCkplTS1uax8smOQUvrIPYvvnQZ7S9wuPli3 +FWH6l/O+2Cgdti99xTSPeJRBeCuf2vv3bAgu/0tyB8MZgRRM9j5NJCeGO7o4DwRg +UkLWX2+R5p4daI2LRUfmV4EpKDE6cDY1OgDr3h6mXHrLT4qSNexzz8BAvK/PlHMA +MAJcy76lXSkl92+c4BcpjFDr5Vpaq/VXoLC4L/IlnEEqY967pAycdLH7KSgxOnE2 +NToA9/lAf6hJ4dHQ6ux5BH8DImq2OjW+sK3tIzzf6fpVkPjDuqOYidm+OL2SFCJa +ymSWdVq2gQYbkcdRXdGKVJWDQSkoMTp1NjQ6NeHBLEuc/VX+h3ifO1jyMlh+9nZs +HLkQzUyi2HnrXJ224cjvgc312wvtBQMUyLARWuEuMVMAwWofjX+GZXLz0ikpKQ== +=Rw+Y +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/B2BAA7144303DF19BB6FDE23781DD3FDD97918D4.asc b/tests/openpgp/privkeys/B2BAA7144303DF19BB6FDE23781DD3FDD97918D4.asc new file mode 100644 index 0000000..e1db456 --- /dev/null +++ b/tests/openpgp/privkeys/B2BAA7144303DF19BB6FDE23781DD3FDD97918D4.asc @@ -0,0 +1,31 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6AM0QnGL35Fvz ++RybOtdBOWPX8XHZ3CvPq0gr50pjtZGZLjlDe5Jf8oX24cGBVdFdILOlOglXNJX6 +Qz5WxNrZtU53vDfkgjA8flQXFqIlkxv2ZkjKP2S+Vgr9LjbrFxxWRlZY+XqMNahE +jbfA9gLr1GG8gM7ABsU7O03/pR2q7iF/aDMKm8asN7+k4/tW11e5yZeQkc+aBz8z +bhBCZ90jdfQr5jHQsJx9EOlrCWvDcnGojDXQBc2AflwuEJQHSHqPsy4E5KnMlpp8 +ZzFw2spfExWzNnEfZ/qQ9dXgnhdeNFmg/JRvgohreRExvO3yJiQMbH28UBTb/NBO +e14F8j1XdfkpKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z +aGExLWFlcy1jYmMoKDQ6c2hhMTg6kSqZ9Kag78g4OjE5NzM3NjAwKTE2OlKflmHj +kP1iNdN0sAvT1dopNzM2OvOi7aAUszePhXP3b3zH60C9ygixV1MQIKMUTDlZkTFv +uVwdyH8IsB5rwaIZV5kO9xOdTPZAUG+jw3i5vUJzVYb3tORlIQLMZl+cT6InABFm +eZ0jC7n2i5qEGK5nb+7na4SRv7jOCDpvEvmX3UxYsx9OvnVq9ndNg0t95wDc8Yp4 +OuWQM56DoSmlfi8yvX8vdihp5XVqwvoKZNbXP17o0K2VjSBfWMW30mF+1MRVGZjj +rji0TJA0747OQjYEVVi4Jyvd1Qd+Ao3QWkXm4TzeiRAOYKTy1g9+6mTpLr29IQPo +Ljvea48pJK2YJM9FNoZUOA04Pv6n0w/CCSFMSGDJon8KATgTgkXFWlxhCEPqJxJL +emruPGPIb3Qv05etKPjGyvxk7fm+5xBjpxU2Xwk6kUZOfuX9b8KkBWDBlBSSRV/w +teH+vTVFG1ydDFoCbay4TzKIHRHwS93ME0L11GHLViXMD3tOG1BKudPD4JUxrHVa +MFHKtkvfTEz6v4YPCCp84+cjrbOKhSabg6caNcD0rge7iFVN4BArs1B/akEN+E8i +q3MoUv7lN6GC1XEiEvK/8NgDamwUtbRQfPyJizow4tJSWTm0SZdTlBrkdUgCgW2s +2dTElthntFqGOpBj6AvxoUPpnKKUp4o1W97bqV4regz9g8iMSna+BrzfYMrt8AlB +A4eKtYbjFS0aNzhDRJepATVh/DVsy4bm3XN5L5Lne5greOCRcIjmE6n2GOHjh4Y0 +/ba/hj4WKm2n63toXJlxJ1t1Db90qiH8ASn6Bgd6BR0NueIrYI+YJMoeG+NLjB2h +Ag6rd+yyjLEqaxniJkz9lZvj1AmX0JX3hfC6q8I84ZUdQFyBVQIxeN8EsKeWh45c +1bEgyecQx+PNmrEUa90OZpJt6V1mQhb2SCDBgSVpAGoI4N2J5NOJ8gm+plgLsMDT +Q1xhmBNF67kVYmV+ljiOOCB9CluiR/i2STv75ydnuBkpKDEyOnByb3RlY3RlZC1h +dDE1OjIwMTQxMTA0VDA4NDIzNCkpKQ== +=1YfR +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/C6A6390E9388CDBAD71EAEA698233FE5E04F001E.asc b/tests/openpgp/privkeys/C6A6390E9388CDBAD71EAEA698233FE5E04F001E.asc new file mode 100644 index 0000000..939e8ab --- /dev/null +++ b/tests/openpgp/privkeys/C6A6390E9388CDBAD71EAEA698233FE5E04F001E.asc @@ -0,0 +1,27 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjI1NzoAqBvNbHXRfWWcek7De5Xpw8bO +d8KibdW2sE6F2ZeqifoTvLTDcv2lIGqqovKQuRV9x5UkUIY0RQ0F6uI0d/o3nBSt +8H8JsUylzCoTeds4UiFgpRA+O+egd8DyE7sABtlmBXHApYa7Vl/I/sASuSKS1VQF +0JzkWSzj+381GZDtSg7t2z+A+n9S0MmrSM4EtPHZ5aelr7CQ65FHhmOkebJqcfX/ +j6gVX1FaZnJGzDkfgWDybaZWU9JXs+KlrJnVm6lO2YXb54TBnE2wW5PVm30dSCab +YoHrivL01NuCadhUI+oiAVfTg41H69dRCelt07x2lrnXXdIX1/Q58h/a4IawxSko +MTplMzoBAAEpKDE6ZDI1Njog6qS8HovBCoLrvf1v9wg5YfWupIlKiWTGu/FgjF6D +uthfhGOa4giRwuEbm/RzkT46NL1SGR0mAilM9zL/5Ro7cR8n7rAWq+PxCLIck6zB +BDEY0QfmkfGtUTX1YBHexXXBDieDIdEP1hyUqUZhQuBObi/fS8E4pt4TMjLTCTo1 +XEqZxqvK11AD6y2GddnCtH8vTgUaALzxNks23nngDEAdaDfJMHobST4Jb9RYVHNN +zsZnLkKRr+GIemOoRXlCvTmTaw+8Vh6vUq8OWB5jryNxmt64FtWAHpLcW0n5OE6S +6OlndqM92Xe9NT12wu75Mn+qTYrVauSPQvVveZMakG/hKSgxOnAxMjk6AMNAbeJx +Bb6BlIWYMYrpAhkuPBgB3HvS0wZQ/n0j8LLEh+BJI8xa9HgDz7LOJPo00w6ERHvb +Q+8VVBP69wxwHFJSfxJsImqUmQYXgoA2n/6GAqfj4oFK/FAsFd350bkaFnZcSxqj +hJai8JQPku0cZqPudfRzThX5XIBbynMBNqIxKSgxOnExMjk6ANxpdW6WqMrWGerg +X1i4MQd9ofyyWaT2XaGrnwMJY1qUqAqPViqZWPpPmya8mVrT9XkajdtPUm0zVzeK +IjEScdvoS/pwkIMmM2+GRCFCo9zrsExeqa1cQpc8GFDZgynZ9/jXWeRiidU1xTMt +gANAiZWOb8Ww6ti9p+t96liUEB7VKSgxOnUxMjk6AK/BZIZC/C6GJyRhEoTBlzmn +nSC5eC6MojPTOQwd5VIkeEq4illBE7DF/5gFw/fufn7s+0vicZx/8yLH1mFYkbwq +DfuoY/Da5lnRFw6fGOj4N0ikS26FApjlh2DS09HtIFuNAhErr5PDPjF1F31XL/1M +50jkxfKPamxMiEs8it0VKSkp +=GHvX +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/C905D0AB6AE9655C5A35975939997BBF3325D6DD.asc b/tests/openpgp/privkeys/C905D0AB6AE9655C5A35975939997BBF3325D6DD.asc new file mode 100644 index 0000000..d972814 --- /dev/null +++ b/tests/openpgp/privkeys/C905D0AB6AE9655C5A35975939997BBF3325D6DD.asc @@ -0,0 +1,13 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOmVjYyg1OmN1cnZlNzpFZDI1NTE5 +KSg1OmZsYWdzNTplZGRzYSkoMTpxMzM6QJASwJYtt7iJ0ho9ryWXzi6FYfC5KR+p +uwXT8cWoMCuCKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1zaGExLWFlcy1j +YmMoKDQ6c2hhMTg6vuifz6Hv4GM4OjE5NzM3NjAwKTE2OpcAZjV5+F/YlpOPgp1b +WQUpOTY6qFMSoZCpIVdpOB9iKNKcrowuxl4tpSya+TVyDRedFeYEJgrcUjLFa5qt +Eqi/0/ceDijJBz1HGyZ1mRWwGOzCqhd/8ccVQlQp66GqO8x4Na9uYtfNurj1a7Gv +kdi+aQ+UKSgxMjpwcm90ZWN0ZWQtYXQxNToyMDE0MTEwM1QxODA1MzApKSk= +=FCvp +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/CEFC51AF91F68A2904FBFF62C4F075A4785B803F.asc b/tests/openpgp/privkeys/CEFC51AF91F68A2904FBFF62C4F075A4785B803F.asc new file mode 100644 index 0000000..224ce95 --- /dev/null +++ b/tests/openpgp/privkeys/CEFC51AF91F68A2904FBFF62C4F075A4785B803F.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjEyOToAvkUCG0xYaTIkZiTwd1wCUF8a +Q2+YdrBGjSfzCyB8DzbPozYA29eOAayDg9RuesQGISmFQ6YRSINsAogdNfZmKu8j +VMp/2mRQR6necW4OKkdtdnAI8B6Qaj/clBJt990RahXcrXG13fa0n72TpRbxmUUs +Y4KRpbCRm44rR9AAWPspKDE6ZTM6AQABKSgxOmQxMjg6IvI/yc3C60dXYh9kvzd6 +AVMGWt5zTVFhE+oDfMaxooW5q0tu6vHzViFeYmcxB4FbctnSbTNiN0RUIT7oxpGE +AAumKRejGAaMwiKZz3bMV05l0LI0Yn10GzXsLtRx+iKzpUxThZETRU43BJeMqP5/ +rVqdQAu47pClgTwQWn6bXNkpKDE6cDY1OgDXtvl8CYDL/Q+9qZDCyItE5j7X4wRV +en939fdDepuYAgsLLc7yqnDUOzajXWyx6PxygpnRs5cwmo2zbtZyyWKFKSgxOnE2 +NToA4c2I2FZT8gQLl9E3LF8TkBACZzsGb/t3mBUhYNSNZ7W6R/AkZARLI3IZOto5 +xhBrxfQayRISS2PBk390z3JlfykoMTp1NjQ6TamsumtzX7waNMzurt48kluI5Zy9 +isGpweGpp1T+4L+DiXMMAbhFW60gdqqo4+vzkn2M/M/8BPrKCw1TlDn3TSkpKQ== +=lYo+ +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/CF60965BF51F67CF80DECE853E0D2D343468571D.asc b/tests/openpgp/privkeys/CF60965BF51F67CF80DECE853E0D2D343468571D.asc new file mode 100644 index 0000000..4f075d8 --- /dev/null +++ b/tests/openpgp/privkeys/CF60965BF51F67CF80DECE853E0D2D343468571D.asc @@ -0,0 +1,31 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6AL8OibB/4Jrv +yu3WLmT9knI/wEmxSjU6PXn7xCyDgxXd45szIKV3uURsYVsexrIRr5y+uijOWq2J +FunrhNV4sCGpRAnS3EA1y1zqFx7Ob0/k4bLvNn8UFNtblIlxqSjT2Oz2T5+4GAme +Vo7Z49keWryDyMeo+J1cio0NacBwR5Ee+DL6NfGoSyYYHrrQOn9PCnASR/I7THMP +4l729yHnVNHnsgA1t/plvgXJj2Vf4KTu8NFaXFbd5a2gW14+nv2kUTenQuHs3Nn9 +d9NQeXSZ3tWP7FvthgklO3bp+dmjbynDKacKQGWKFyYlnx/qNKRe9Wnr59vVSeyk +tyA0pbyvYNcpKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z +aGExLWFlcy1jYmMoKDQ6c2hhMTg6LskYBR0oJSs4OjE5NzM3NjAwKTE2OtX507Od +8u583SoOhgpvTDopNzM2OqQsv6qf5uCTG0KqleH7oUveFKt4ucEElrAyAiHe8x4c +5BIt9r2cz9yVyZjiolXC2zuGZMmt15odX+1vp9zUAaK5cFFFk8z6qEBEeFOP+4Ss +iBeI2r3fHN+/mYMlyomBXV9bZ3ER3lio8iqdsnjkqFo+AfA3otGvrZNhXPa6GaLh +1KRW3D3Lg97gp+GwrsQ5sRQ6EFBlGzg2YFWLFGO1txvQfLECEzQMZaej1S6XNKY0 +87LmmCNhyNvSP7WECb0PMwlXKDUEy7zjEK2VkGRSEg4Y8CmMFeW68Zrlvivcy01E +KXQ2EpI0i9mxI/QnQa/6d4GAkuPywbJG4U/rgEDMwubHhp+QVNpU6JWy2KKnMVVf +7Ln5KMKCOKh3ZcvRYUq1yen8ybEOKJ2nFZ5VQfmSSXvW5yDClQCe8PwwOY1a5nw/ +ODcPM4oeW8PmWncWNuhme/uicECa0wuJ4IGUKTyg/Vs4OLMjiXLwT1gblPEcfuws ++3A3o494JOEqnyyvfM3ZmHE+RYe9+OV6/1JFsIhSn9cWty/H26QpuFvN5D2cXXKU +txuqC8MmovtCRzG/ASja68rc0NC7uACBRvb90v5tlDCFmBZAPJmFnBnB/OGqQOmF +dFXGRJiauaKOwRtEzC0wyMdkB5+j4/oBj4Nt3Ua5Qbk1B5m5M4YfEX4c89G635O0 +cmO+c9ubv/oQSNcXnJmIDnIvwBXDMzS9psQp/LzIpXIpbJUU1tRclUL/LAQChhmS +Isq2qP/s8jg8BNSjiXlRkLqg5xkcKuW757y725fiAOrNjDYYBNVC1XIPaVc1/Fkm +T1Mcn0OuQ9Hwcj7C+lqcq7vSZkx6h5+YjvJ5uDUQvFVJMfoDbKMKsKuJ2qSK7ano +ePtji6v9SylT9cSZnSngaar+j55JD/wocGlAcVOZ+fOkoo81wWAJ1+XNZX4YNQ+/ +naNT4eyAq9k+CqxZjDOSbdg/aoOzFPDkRpDrkQGq1IcpKDEyOnByb3RlY3RlZC1h +dDE1OjIwMTQxMTA0VDA4NDg1NykpKQ== +=MG45 +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/D69102E0F5AC6B6DB8E4D16DA8E18CF46D88CAE3.asc b/tests/openpgp/privkeys/D69102E0F5AC6B6DB8E4D16DA8E18CF46D88CAE3.asc new file mode 100644 index 0000000..86f6acf --- /dev/null +++ b/tests/openpgp/privkeys/D69102E0F5AC6B6DB8E4D16DA8E18CF46D88CAE3.asc @@ -0,0 +1,27 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjI1NzoA255CUJxFEKLVwEoSgwZqXd94 +AhjGUbMY6NXdFj5cCq0JmWZrbpT/5OblTrymiH1iLmI0ymo+/s8vh6NtB98dhr1s +yH3asNQfXZRfF+u5X5hLDNPF4sUelsl4+EUef0Hbc9U+e+8F8A9TMxELSqQ8Ul3H +u42hc+/ugkc1G/8++Sv/f60TqWcUR2GmuiAvkuS1WmdATMhwPr7vMfssV0X0mboz +32//b/UfuOyctso5FM+bRaKrEJDQ2WDg57yqnaqsKEgajW0jElpAVIn792W6YWKO +k4auYSpO5f7BVs40Z+bxKGxiH87z9fnmlYAsQwPOOxZwWaCSrReeheK6c6emASko +MTplMzoBAAEpKDE6ZDI1NjoYgHaQ5xkEJcvyhmZm/H8/doq9XnrkazZ7O5OimKsi +Jx4BYZ4uGdeBd9/bbKFTwaauMBddrIQstNFuW5BIJt9KGgtvRC3y49JABClRJ45o +mOVpSp3dkp+6s5hDHUsCvZvjN3D02LzxLx8u0lb6fopFp4rSD5dqB48KNTGQAbvK +hqYZ521wmTfYLiy9taVAhqZLHlhfmrHYmdvvKjdNE3tSActlHWXdu119rdHhJ0zJ +Rxx/N845rl+PXXdFHveQxCBhHBQpSUaKpte+ZbT4vrjyNugD6XjDi4HLI9CysUDP +A0IFD+BJWw7NgYY51yamT7nNcMD6bJdgtt1FXbSgh7jVKSgxOnAxMjk6AN7btgbl +HEHrKf77a9ptklDvd2bEkUOwj3bFavB1lpkliW1USoWMx97zjxRPzQOs6EoE7u9Z +JRDO8xA9ZbI0WOk7io5OHpVp1BHyeqebqfxHzN5wsRphu+peg7vYfENVf0lA8LIU +NeUkbfEWDQ+inXxqkgD51gPfrU3PRdCDM8fnKSgxOnExMjk6APxHMsTrjaUoITcI +LqT35wDinFnX1+OgKD00krcUmc+G0ylLMolVxsB4yDVIkY8QfhbaGtFoP45PCnxS +rvHKrTt/6sZJCWXf+3KaN0QSxyfi/mEPj3KbXhmaY6x8R4aB/M7ipLXNdj/308pu +a50YPwIYyX0L0qoRBBo/xQDgOsXXKSgxOnUxMjk6AMzWw92nzShDRzPZwBvb48YY +YzZFiFtJbcZ1n8DaiM7VmzAkRqwmCu6HPP/8IC4d6UkFUUlHyDyxSaKuA45Y+FR1 +Pb2/Y/mQVsBanK4i+1oL4fYGexFO0qjA+8l2+6BEWbKQX60nIcFXD2hAP0aqWDGO +lXrPhpWPRrwDd4j9DEvfKSkp +=1cwG +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/DF00E361D34F80868D06879AC21D7A7D4E4FAD76.asc b/tests/openpgp/privkeys/DF00E361D34F80868D06879AC21D7A7D4E4FAD76.asc new file mode 100644 index 0000000..0bf0006 --- /dev/null +++ b/tests/openpgp/privkeys/DF00E361D34F80868D06879AC21D7A7D4E4FAD76.asc @@ -0,0 +1,31 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6AK5ASAwdxvm1 +x0sD1PVAjVCEgo2oqT3mg/onopj3t3dVlBuEv23f+5/EoLTEIAE8ulGDCBQRw70X +j4e5B87oc5DxBs2uiMGbCX8L7cEQuXVRRrwQR5kJI62iCle1prehdXTWFgZUBXwQ +60GAGeft/MmznrUN4qy1qt7dp8eqOq9on9xA8uKzigCYEjRsGeScrFedAemg0so6 +AWbCSz6S1BbZKxYPilbG7VMvpA24kgPqQiiaZESlFt7iey04WE9v26vH5CExVqFl ++M+tAGIPw439X0leIpdidTWFdREw7DCkRBjZ8cWbLEIfhErco1mqlSxR1AvlSXnb +yxerHQRO+KspKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z +aGExLWFlcy1jYmMoKDQ6c2hhMTg6tIGQBN/WvYA4OjE5NzM3NjAwKTE2Olq8YLkU +7sO9zkXVYdR0ApwpNzM2OneDiO9TEO0M//ms4Wh2ZDR/oOHF67pj9woAkW+en7vv +r512xqgFV2m2b2aFTJYgeJwWJgVItmgmoM4RsbtL3CVSXrKRi4fi3VbwWEN0p4MI +wOXkbdFFxywvEQjQoNEvvBFHTlLkRIHzugfhUJID4wNzcGq55LnH1zoyXdUorlhi +dpJ7Y1QHjm7j3RBiTRpGXXOIwQkpTf4eNIIsOeaDTQVIhTh62UFzUY26NBftx0mC +cYhFs0lOk7k482OnCkm712BejhvHOcs46Lhi9JwfY6j8QcgrIp4b2MyT8BOg1cIX +vjD39tKJYh9SHWZlB694KZYqSmlr+RfhgLTNV7Oq4Il9JNhPgImG/ouE/O14j8W9 +MyIg7T8NhvYRt+sym9oijvxXb8Z7dD12RomxOZFAajrHMv349JAebUOSIxCBg082 +LNRleJKl7s8Dw5avgyc03kqAUageGOjRWsJvbSKLebKDUoLqEyyNiTNbbTru4oZb +RyfqPftZkPymIQGS7rukohZ7cZHM8jT4Bf79VRvFAXQJ8IVGjHVvrwEbV0mOgin7 +i3n0hYsO8t3YvNtQZ6c2oTkhaeakYgebRKXSgWmLK/FcCtnftYuulPD/ApkcnGFa +jqJcxKT6vNbsrp+YOlder0cZz7S+1qXkKP9iGuVUa6uG818pv4IZrrgWJP85ZUqj +PV5Dy9QYQbd8HHxrDkWQ6xMdFM0049KZeNuKGnbv2gz27RUMf7U7eyj7QBuDCHwL +Q3UHOXr5Db7bDepCOXBdjTxET2BzotOkn/pbNJN1wAa3UZB3ovFWo7vOwQCF1+nY +AWAUxNm8W07SzBVZuCHxPsnMX8z501jz1f8yiKgDgG6JtCCESTIPnOj+7k+86eYV +CXfgf3klgcruOTXCZwaUhQYEf7Rxyln8FoMD/5VoKWAIwUsbpMquhwbZmmq6nada +owEctivvDKqlXNf5vREV76+OTpiFSpRDiX5cwWU/eG4pKDEyOnByb3RlY3RlZC1h +dDE1OjIwMTQxMTA0VDA4NDMyMykpKQ== +=3wKz +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/EB33B687EB8581AB64D04852A54453E85F3DF62D.asc b/tests/openpgp/privkeys/EB33B687EB8581AB64D04852A54453E85F3DF62D.asc new file mode 100644 index 0000000..ede9a91 --- /dev/null +++ b/tests/openpgp/privkeys/EB33B687EB8581AB64D04852A54453E85F3DF62D.asc @@ -0,0 +1,10 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6ZWNjKDU6Y3VydmUxMDpDdXJ2ZTI1NTE5KSg1OmZs +YWdzOTpkamItdHdlYWspKDE6cTMzOkAWeeZlz31O4qTmIKr3CZhlRUXZFxc3YKyo +CXyIZBBRaykoMTpkMzI6VN/VGmlcwGBPcLTya2hfU4t37nMcFCKdNSXjJ5DFA0Ap +KSk= +=eVhB +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/privkeys/FD692BD59D6640A84C8422573D469F84F3B98E53.asc b/tests/openpgp/privkeys/FD692BD59D6640A84C8422573D469F84F3B98E53.asc new file mode 100644 index 0000000..7b25b7a --- /dev/null +++ b/tests/openpgp/privkeys/FD692BD59D6640A84C8422573D469F84F3B98E53.asc @@ -0,0 +1,15 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v1.4.8 (GNU/Linux) +Comment: Use "gpg --dearmor" for unpacking + +KDExOnByaXZhdGUta2V5KDM6ZHNhKDE6cDk3OgDbbxWAbWsheUJprK6VryMTpwDi +YwMfL+92nrHqSfPqlpMWgDTia8qnpRSXbyEmSppp/6/Ygp+N3n32Kznq7PjHXiuW +LlZGvZMtzmvaMA17y0GY6oLBxS7rhASXIKa9hEUpKDE6cTIxOgD/igRZcqjTHbCv +I/mTtAPK5yJhqykoMTpnOTc6ALV10OZ7mJkWRMRYeGu1T3uwS7YYORJAHwd1fwKh +Fys7P8HZaWIXqp8EqFxk8VUEiEo3ONN9jtIRgBmTbNywKbx6WfBItoYTPEoU0UGo +oM1c/5rfmylyqwdIbMNXDhW4oykoMTp5OTc6AJNnAP6skpHlhVAmecLZT9eRzVoO +q1ivUIntK2Mh47qsL74q6BBwz2sviPU2Y3pDlbb6Ed0qJAXvdCT24hlfoGoXzkoD +InkPJTJeL0gCnwmQPjvXFFd71Cvg5LaL4lIQLSkoMTp4MjA6cZuCxaj7sT+FZqTO +y2lNfMjaQMgpKSk= +=s5nv +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/pubdemo.asc b/tests/openpgp/pubdemo.asc new file mode 100644 index 0000000..d550f1a --- /dev/null +++ b/tests/openpgp/pubdemo.asc @@ -0,0 +1,566 @@ +26 demo keys: + +pub 1024D/68697734 1999-03-08 Alpha Test (demo key) <alpha@example.net> +uid Alice (demo key) +uid Alfa Test (demo key) <alfa@example.net> +sub 1024g/46A871F8 1999-03-08 +pub 1024D/1AFDAB6C 1999-03-08 Charlie Test (demo key) <charlie@example.net> +sub 1024g/BC43DA60 1999-03-08 +pub 1024D/FAEF6D1B 1999-03-08 Echo Test (demo key) <echo@example.net> +uid Eve (demo key) +uid Echelon (demo key) +sub 1024g/7272144D 1999-03-08 +pub 1024D/8FC282E6 1999-03-08 Golf Test (demo key) <golf@example.net> +sub 1024g/9DCAD354 1999-03-08 +pub 1024D/04259677 1999-03-08 India Test (demo key) <india@example.net> +sub 1024g/61F76C73 1999-03-08 +pub 1024D/43C2D0C7 1999-03-08 Kilo Test (demo key) <kilo@example.net> +sub 1024g/9AF64D02 1999-03-08 +pub 1024D/A9E3B0B2 1999-03-08 Bravo Test (demo key) <bravo@example.net> +uid Bob (demo key) +sub 1024g/E29BA37F 1999-03-08 +pub 1024D/EB9DC9E6 1999-03-08 Delta Test (demo key) <delta@example.net> +sub 1024g/B0C45424 1999-03-08 +pub 1024D/7372E243 1999-03-08 Foxtrot Test (demo key) <foxtrot@example.net> +sub 1024g/EE45198E 1999-03-08 +pub 1024D/34C6E3F1 1999-03-08 Hotel Test (demo key) <hotel@example.net> +sub 1024g/D622AD0A 1999-03-08 +pub 1024D/D2699313 1999-03-08 Juliet Test (demo key) <juliet@example.net> +sub 1024g/35F8F136 1999-03-08 +pub 1024D/B79103F8 1999-03-08 Lima Test (demo key) <lima@example.net> +sub 1024g/FE56350C 1999-03-08 +pub 1024D/BE5CF886 1999-03-08 Mike Test (demo key) <mike@example.net> +uid Mallory (demo key) +sub 1024g/4F31EAE8 1999-03-08 +pub 1024D/30CEC684 1999-03-08 November Test (demo key) <november@example.net> +sub 1024g/8B70E472 1999-03-08 +pub 1024D/6D9732AC 1999-03-08 Oscar Test (demo key) <oscar@example.net> +sub 1024g/2681619F 1999-03-08 +pub 1024D/3FF13206 1999-03-08 Papa test (demo key) <papa@example.net> +sub 1024g/63330D9C 1999-03-08 +pub 1024D/3C661C84 1999-03-08 Quebec Test (demo key) <quebec@example.net> +sub 1024g/A029ACF4 1999-03-08 +pub 1024D/777FBED3 1999-03-08 Romeo Test (demo key) <romeo@example.net> +sub 1024g/11D102EA 1999-03-08 +pub 1024D/A3AE3EA1 1999-03-08 Sierra Test (demo key) <sierra@example.net> +sub 1024g/0F1B50B4 1999-03-08 +pub 1024D/85A81F38 1999-03-08 Tango Test (demo key) <tango@example.net> +sub 1024g/101C0402 1999-03-08 +pub 1024D/653244D6 1999-03-08 Uniform Test (demo key) <uniform@example.net> +sub 1024g/5522BDB9 1999-03-08 +pub 1024D/61F04784 1999-03-08 Victor Test (demo key) <victor@example.org> +sub 1024g/07287134 1999-03-08 +pub 1024D/EC67DBDE 1999-03-08 Whisky Test (demo key) <whisky@example.net> +sub 1024g/FD6E27F6 1999-03-08 +pub 1024D/567FB34A 1999-03-08 XRay Test (demo key) <xray@example.net> +sub 1024g/41E408BE 1999-03-08 +pub 1024D/4B11B25F 1999-03-08 Yankee Test (demo key) <yankee@example.net> +sub 1024g/F7B080AD 1999-03-08 +pub 1024D/54ACD246 1999-03-08 Zulu Test (demo key) <zulu@example.net> +sub 1024g/A172C881 1999-03-08 + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v0.9.3 (GNU/Linux) +Comment: For info see http://www.gnupg.org + +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 +=1N8S +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/pubring.asc b/tests/openpgp/pubring.asc new file mode 100644 index 0000000..a091e0e --- /dev/null +++ b/tests/openpgp/pubring.asc @@ -0,0 +1,720 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.3.5-cvs (GNU/Linux) + +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 +wRjlQVX31vkPxZDR2UBoHjBYDg== +=XVtd +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/pubring.pkr.asc b/tests/openpgp/pubring.pkr.asc new file mode 100644 index 0000000..e8eaabb --- /dev/null +++ b/tests/openpgp/pubring.pkr.asc @@ -0,0 +1,28 @@ +This is a test pubring generated by pgp 5 beta + +Type Bits KeyID Created Expires Algorithm Use +sec+ 768 439F02CA 1998-03-17 ---------- DSS Sign and Encrypt +sub 768 CB879DE9 1998-03-17 ---------- Diffie-Hellman +uid pgp5 test <pgp5@dev.null> + + +-----BEGIN PGP ARMORED FILE----- +Version: GNUPG v0.2.13a (Linux) +Comment: This is an alpha version! +Comment: Use "gpgm --dearmor" for unpacking + +mQFCBDUOrE4RAwDbbxWAbWsheUJprK6VryMTpwDiYwMfL+92nrHqSfPqlpMWgDTia8qnpRSXbyEm +Sppp/6/Ygp+N3n32Kznq7PjHXiuWLlZGvZMtzmvaMA17y0GY6oLBxS7rhASXIKa9hEUAoP+KBFly +qNMdsK8j+ZO0A8rnImGrAwC1ddDme5iZFkTEWHhrtU97sEu2GDkSQB8HdX8CoRcrOz/B2WliF6qf +BKhcZPFVBIhKNzjTfY7SEYAZk2zcsCm8elnwSLaGEzxKFNFBqKDNXP+a35spcqsHSGzDVw4VuKMD +AJNnAP6skpHlhVAmecLZT9eRzVoOq1ivUIntK2Mh47qsL74q6BBwz2sviPU2Y3pDlbb6Ed0qJAXv +dCT24hlfoGoXzkoDInkPJTJeL0gCnwmQPjvXFFd71Cvg5LaL4lIQLbABh7QZcGdwNSB0ZXN0IDxw +Z3A1QGRldi5udWxsPrABA4kASwQQEQIACwUCNQ6sTgQLAwECAAoJENY0E25DnwLKxIoAoPSyM/Mw +BogpyMU5YY+Sj74k3UIfAJ0RopQa8ciickDVzoSVPrGysrnOkLABZ7kAzQQ1DqxWEAMA/wVrlNsP +qTxWZbUiMrUN8MjTFR2xUhuTw3cdvRgiVPUT/q1l1+I3CpopVBx/XuAkg5sHB80zc6pZg652YFV3 +dLoTceS7ridb5k23sHa2hZGCeTo6AdxIOy53giCPDP9FAAICAv9Oh5/OVxUqI+6hsp9ccOEhRA9N +8aJzYDPjvCQyhgej2P1kTsBZqWIx0/PiMvIt+qqhT2YfyD68mHIBztScAXZKTnjroUPKl0+bkX09 +NbdyqojAkzhaCRKUzwnaHEfhi2WwAYeJAD8DBRg1DqxW1jQTbkOfAsoRAnaPAJ0Z/k6Y2ypgDhXo +qBLeW7Lq/AKYEACeLTod6Nt117DkqDz9epmIqwWOE1ewAWc= +=6BrN +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/quick-key-manipulation.scm b/tests/openpgp/quick-key-manipulation.scm new file mode 100755 index 0000000..6cdf19a --- /dev/null +++ b/tests/openpgp/quick-key-manipulation.scm @@ -0,0 +1,228 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016-2017 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(load (with-path "time.scm")) +(setup-environment) + +(define (exact id) + (string-append "=" id)) + +(define (count-uids-of-secret-key id) + (length (filter (lambda (x) (and (string=? "uid" (car x)) + (not (string=? "r" (cadr x))))) + (gpg-with-colons + `(--with-fingerprint + --list-secret-keys ,(exact id)))))) + +(define alpha "Alpha <alpha@invalid.example.net>") +(define bravo "Bravo <bravo@invalid.example.net>") +(define charlie "Charlie <charlie@invalid.example.net>") +(define delta "Delta <delta@invalid.example.net>") +(define deltahash "359DC5EFF98B14A58AAA615C638E8BD0CEDA537B") + +(define (key-data key) + (filter (lambda (x) (or (string=? (car x) "pub") + (string=? (car x) "sub"))) + (gpg-with-colons `(-k ,key)))) + +(setenv "PINENTRY_USER_DATA" "test" #t) + +(info "Checking quick key generation...") +(call-check `(,@GPG --quick-generate-key ,alpha)) + +(define keyinfo (gpg-with-colons `(-k ,(exact alpha)))) +(define fpr (:fpr (assoc "fpr" keyinfo))) + +(assert (= 1 (count-uids-of-secret-key alpha))) +(assert (not (equal? "" (:expire (assoc "pub" keyinfo))))) + +(info "Checking that we can add a user ID...") + +;; Make sure the key capabilities don't change when we add a user id. +;; (See bug #2697.) +(let ((pre (key-data (exact alpha))) + (result (call-check `(,@GPG --quick-add-uid ,(exact alpha) ,bravo))) + (post (key-data (exact alpha)))) + (if (not (equal? pre post)) + (begin + (display "Key capabilities changed when adding a user id:") + (newline) + (display " Pre: ") + (display pre) + (newline) + (display " Post: ") + (display post) + (newline) + (exit 1)))) + +(assert (= 2 (count-uids-of-secret-key alpha))) +(assert (= 2 (count-uids-of-secret-key bravo))) + +(info "Checking that we can mark an user ID as primary.") +(call-check `(,@gpg --quick-set-primary-uid ,(exact alpha) ,alpha)) +(call-check `(,@gpg --quick-set-primary-uid ,(exact alpha) ,bravo)) +;; XXX I don't know how to verify this. The keylisting does not seem +;; to indicate the primary UID. + +(info "Checking that we get an error making non-existent user ID the primary one.") +(catch '() + (call-check `(,@GPG --quick-set-primary-uid ,(exact alpha) ,charlie)) + (error "Expected an error, but get none.")) + +(info "Checking that we can revoke a user ID...") +(call-check `(,@GPG --quick-revoke-uid ,(exact bravo) ,alpha)) + +(info "Checking that we can revoke a user ID by its hash...") +(call-check `(,@GPG --quick-add-uid ,(exact bravo) ,delta)) +(call-check `(,@GPG --quick-revoke-uid ,(exact bravo) ,deltahash)) + +(info "Checking that we get an error revoking a non-existent user ID.") +(catch '() + (call-check `(,@GPG --quick-revoke-uid ,(exact bravo) ,charlie)) + (error "Expected an error, but get none.")) + +(info "Checking that we get an error revoking the last valid user ID.") +(catch '() + (call-check `(,@GPG --quick-revoke-uid ,(exact bravo) ,bravo)) + (error "Expected an error, but get none.")) + +(assert (= 1 (count-uids-of-secret-key bravo))) + +(info "Checking that we can change the expiration time.") + +(define (expiration-time id) + (:expire (assoc "pub" (gpg-with-colons `(-k ,id))))) + +;; Remove the expiration date. +(call-check `(,@gpg --quick-set-expire ,fpr "0")) +(assert (equal? "" (expiration-time fpr))) + +;; Make the key expire in one year. +(call-check `(,@gpg --quick-set-expire ,fpr "1y")) +(assert (time-matches? (+ (get-time) (years->seconds 1)) + (string->number (expiration-time fpr)) + (minutes->seconds 5))) + + +;; +;; Check --quick-addkey +;; + +;; Get the subkeys. +(define (get-subkeys) + (filter (lambda (x) (equal? "sub" (car x))) + (gpg-with-colons `(-k ,fpr)))) + +;; This keeps track of the number of subkeys. +(define count (length (get-subkeys))) + +(for-each-p + "Checking that we can add subkeys..." + (lambda (args check) + (set! count (+ 1 count)) + (call-check `(,@gpg --quick-add-key ,fpr ,@args)) + (let ((subkeys (get-subkeys))) + (assert (= count (length subkeys))) + (if check (check (last subkeys))))) + ;; A bunch of arguments... + '(() + (- - -) + (default default never) + (rsa "sign auth encr" "seconds=600") ;; GPGME uses this + (rsa "auth,encr" "2") ;; "without a letter, days is assumed" + ;; Sadly, the timestamp is truncated by the use of time_t on + ;; systems where time_t is a signed 32 bit value. + (rsa "sign" "2038-01-01") ;; unix millennium + (rsa "sign" "20380101T115500") ;; unix millennium + ;; Once fixed, we can use later timestamps: + ;; (rsa "sign" "2105-01-01") ;; "last year GnuPG can represent is 2105" + ;; (rsa "sign" "21050101T115500") ;; "last year GnuPG can represent is 2105" + (rsa sign "2d") + (rsa1024 sign "2w") + (rsa2048 encr "2m") + (rsa4096 sign,auth "2y") + (future-default)) + ;; ... with functions to check that the created key matches the + ;; expectations (or #f for no tests). + (list + #f + #f + (lambda (subkey) + (assert (equal? "" (:expire subkey)))) + (lambda (subkey) + (assert (= 1 (:alg subkey))) + (assert (string-contains? (:cap subkey) "s")) + (assert (string-contains? (:cap subkey) "a")) + (assert (string-contains? (:cap subkey) "e")) + (assert (time-matches? (+ (get-time) 600) + (string->number (:expire subkey)) + (minutes->seconds 5)))) + (lambda (subkey) + (assert (= 1 (:alg subkey))) + (assert (string-contains? (:cap subkey) "a")) + (assert (string-contains? (:cap subkey) "e")) + (assert (time-matches? (+ (get-time) (days->seconds 2)) + (string->number (:expire subkey)) + (minutes->seconds 5)))) + (lambda (subkey) + (assert (= 1 (:alg subkey))) + (assert (string-contains? (:cap subkey) "s")) + (assert (time-matches? 2145960000 ;; UTC 2038-01-01 12:00:00 + ;; 4260254400 ;; UTC 2105-01-01 12:00:00 + (string->number (:expire subkey)) + ;; GnuPG choses the middle of the day (local time) + ;; when no hh:mm:ss is specified + (days->seconds 1)))) + (lambda (subkey) + (assert (= 1 (:alg subkey))) + (assert (string-contains? (:cap subkey) "s")) + (assert (time-matches? 2145959700 ;; UTC 2038-01-01 11:55:00 + ;; 4260254100 ;; UTC 2105-01-01 11:55:00 + (string->number (:expire subkey)) + (minutes->seconds 5)))) + (lambda (subkey) + (assert (= 1 (:alg subkey))) + (assert (string-contains? (:cap subkey) "s")) + (assert (time-matches? (+ (get-time) (days->seconds 2)) + (string->number (:expire subkey)) + (minutes->seconds 5)))) + (lambda (subkey) + (assert (= 1 (:alg subkey))) + (assert (= 1024 (:length subkey))) + (assert (string-contains? (:cap subkey) "s")) + (assert (time-matches? (+ (get-time) (weeks->seconds 2)) + (string->number (:expire subkey)) + (minutes->seconds 5)))) + (lambda (subkey) + (assert (= 1 (:alg subkey))) + (assert (= 2048 (:length subkey))) + (assert (string-contains? (:cap subkey) "e")) + (assert (time-matches? (+ (get-time) (months->seconds 2)) + (string->number (:expire subkey)) + (minutes->seconds 5)))) + (lambda (subkey) + (assert (= 1 (:alg subkey))) + (assert (= 4096 (:length subkey))) + (assert (string-contains? (:cap subkey) "s")) + (assert (string-contains? (:cap subkey) "a")) + (assert (time-matches? (+ (get-time) (years->seconds 2)) + (string->number (:expire subkey)) + (minutes->seconds 5)))) + #f)) diff --git a/tests/openpgp/run-tests.scm b/tests/openpgp/run-tests.scm new file mode 100644 index 0000000..d4914bd --- /dev/null +++ b/tests/openpgp/run-tests.scm @@ -0,0 +1,42 @@ +;; Test-suite runner. +;; +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(if (string=? "" (getenv "abs_top_srcdir")) + (begin + (echo "Environment variable 'abs_top_srcdir' not set. Please point it to" + "tests/openpgp.") + (exit 2))) + +;; Set objdir so that the tests can locate built programs. +(setenv "objdir" (getcwd) #f) + +(define setup + (make-environment-cache (test::scm + #f + (path-join "tests" "openpgp" "setup.scm") + (in-srcdir "tests" "openpgp" "setup.scm")))) + +(define tests (filter (lambda (arg) (not (string-prefix? arg "--"))) *args*)) + +(run-tests (if (null? tests) + (load-tests "tests" "openpgp") + (map (lambda (name) + (test::scm setup + (path-join "tests" "openpgp" name) + (in-srcdir "tests" "openpgp" name))) tests))) diff --git a/tests/openpgp/samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc b/tests/openpgp/samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc new file mode 100644 index 0000000..a4772d4 --- /dev/null +++ b/tests/openpgp/samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc @@ -0,0 +1,45 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +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 +=Htgs +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/README b/tests/openpgp/samplekeys/README new file mode 100644 index 0000000..f8a7e9e --- /dev/null +++ b/tests/openpgp/samplekeys/README @@ -0,0 +1,33 @@ + +no-creation-time.gpg A key with a zero creation time. +ecc-sample-1-pub.asc A NIST P-256 ECC sample key. +ecc-sample-1-sec.asc Ditto, but the secret keyblock. +ecc-sample-2-pub.asc A NIST P-384 ECC sample key. +ecc-sample-2-sec.asc Ditto, but the secret keyblock. +ecc-sample-3-pub.asc A NIST P-521 ECC sample key. +ecc-sample-3-sec.asc Ditto, but the secret keyblock. +eddsa-sample-1-pub.asc An Ed25519 sample key. +eddsa-sample-1-sec.asc Ditto, but as protected secret keyblock. +dda252ebb8ebe1af-1.asc rsa4096 key 1 +dda252ebb8ebe1af-2.asc rsa4096 key 2 with a long keyid collision. +whats-new-in-2.1.asc Collection of sample keys. +e2e-p256-1-clr.asc Google End-end-End test key (no protection) +e2e-p256-1-prt.asc Ditto, but protected with passphrase "a". +E657FB607BB4F21C90BB6651BC067AF28BC90111.asc Key with subkeys (no protection) +pgp-desktop-skr.asc Secret key with subkeys w/o signatures +rsa-rsa-sample-1.asc RSA+RSA sample key (no passphrase) +ed25519-cv25519-sample-1.asc Ed25519+CV25519 sample key (no passphrase) +silent-running.asc Collection of sample secret keys (no passphrases) +rsa-primary-auth-only.pub.asc rsa2408 primary only, usage: cert,auth +rsa-primary-auth-only.sec.asc Ditto but the secret keyblock. + + +Notes: + +- pgp-desktop-skr.asc is a secret keyblock without the uid and subkey + binding signatures. When exporting a secret key from PGP desktop + such a file is created which is then directly followed by a separate + armored public key block. To create such a sample concatenate + pgp-desktop-skr.asc and E657FB607BB4F21C90BB6651BC067AF28BC90111.asc +- ecc-sample-2-sec.asc and ecc-sample-3-sec.asc do not have and + binding signatures either. ecc-sample-1-sec.asc has them, though. diff --git a/tests/openpgp/samplekeys/authenticate-only.pub.asc b/tests/openpgp/samplekeys/authenticate-only.pub.asc new file mode 100644 index 0000000..a08a003 --- /dev/null +++ b/tests/openpgp/samplekeys/authenticate-only.pub.asc @@ -0,0 +1,31 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFg8F68BCAC5VS/59Nrg5mw+wEAnk/vi0CGI+K5rGTmyAruy/aiS4kYfUJiE +Pq/JZYCeNQ9GTbJN5M+Fiv1bhw6xeEfl4FAC/A0Uo39fvUSLJH2V+8lT3GxXt8KR +Yx8MvotvoKiG1DRvgnwRh1qibX6+htJahPwHDViUuFz0ZeEPWiCwuoMOELmiTsuE +VZbQsv08BwCOzIc3M8s63TtwMCUe+MBhqfRjEu6/Gt7miuGGVFXB96ao2O9u1HsR +7cUjgVQp6JwGLgIIijjy167Ms+fKZetqA9tzu1C1SAtNYiqmAUoqGG1YEjS7oApo +AKmHD+LGCMUPg5d6bhw+NyHjDAFWJEYv3kG3ABEBAAG0NVRlc3QgS2V5IChkbyBu +b3QgdXNlKSA8YXV0aGVudGljYXRlLW9ubHlAZXhhbXBsZS5vcmc+iQFOBBMBCAA4 +FiEEkn7zd/0aG295XkDAKoeRfY/7pJ8FAlg8F68CGwEFCwkIBwIGFQgJCgsCBBYC +AwECHgECF4AACgkQKoeRfY/7pJ9+zAf9FVZknDCWCNY42+RIR36fq2l1Gs8KfMsX +rNXtfYPtLqioP8fz2LE0LoudSsZMLVygonPG0ZAxdIUHXcFdUqPrEzs4fEyR4xae +OSxui2Q/u6+9bi7eilYYzVNRWkuyx2TrRQZEjMXMnuJcWptGbRWs/ipRUZBHWfLl +2udLl+0TRIL7hni06xVCHbwE5szcLoyzzvIowGVADXFqeG7nty7uRNZNAD+ZWMH2 +J0vspZlUSVi7z1VygzDI3U42SMJmVqnRmICsB3QLI8Ns4nxWXO2z8fheSFcrP+LA +cY3W6JgnLCzvyuogxnWmd4fzr1iB3E2Hcy/sr0cgQ5wtuseQRhmTlrkBDQRYPBfZ +AQgAtKcbBYrIqh3cRTqyZjMxw492RVQoFawYmpr1bQ4HphVGnT4IhJZQ4DAm1JJZ +QjzwDQiZMc1wD9Om6UC/g8gUBuFCpLCobwBzjH4an/G3Cfa8zGz5ANAROo5i5T1j +vgoFEFdVue/GpAmMNixz+0ItQBh9jiOC6IYk1yyv/OsTzsj6AHnH0XiDpGoTNkca +tb6Mu1VcXTMNf620Mxj6c7WE7awxL6MwKIa7XQSgXaO+JnbB+5Szz1wZ1ZhlnDp3 +KOurlfcXIbZirEaqmRByb+V21Dj3icXOJEj1RUbyVNqBS8rhw17kSxcehw/6ZAMW +ehDmhXO98VVUknS0Mf+OJBi2JwARAQABiQE2BBgBCAAgFiEEkn7zd/0aG295XkDA +KoeRfY/7pJ8FAlg8F9kCGyAACgkQKoeRfY/7pJ+sawf/eSjxxAglAdolF9lK070u +VmMgq4GFPqJ3RqJPUFjwEFFSYLXkiALnMGXDSmOfPqCQ4c+PWwumFhKCz4MXVDD8 +x6mi9Z+HlEwIMaCnckrSTuQ5OgwO/6vkhz42OcgMZ3WQnWfNVM8jbNP9vX1vroPe +HLFaPGy9KJMM0Z/hlCIIeyK/a90zWlT5UMfRoqNQRbY/iiYdmpvf69I9PobGVbo/ +7ahZTumPWwjiGOztNXeuo5UUaAVVxMQBYKp2w3wil2sHzYfTfYUSMyh+oUFx4Xlz +WF3bLzsafRaeuK1h5+JuvIcimvU5zWZtn0hOpiIXpZOoJvvM9r5D4ZRT5UX2blQ8 +Pw== +=vt5C +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/authenticate-only.sec.asc b/tests/openpgp/samplekeys/authenticate-only.sec.asc new file mode 100644 index 0000000..109a7a1 --- /dev/null +++ b/tests/openpgp/samplekeys/authenticate-only.sec.asc @@ -0,0 +1,60 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +VDw/ +=vLFX +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/dda252ebb8ebe1af-1.asc b/tests/openpgp/samplekeys/dda252ebb8ebe1af-1.asc new file mode 100644 index 0000000..ddae954 --- /dev/null +++ b/tests/openpgp/samplekeys/dda252ebb8ebe1af-1.asc @@ -0,0 +1,29 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + + +mQINBFJtd/UBEACpw/psXoGNM8RHczviD7FnGdjMQPEJQ+nuWQ2AEGYouulg5hFv +0ChuSQVLiqQht2k5K2liyW1MeXoJ8tr9nSn/Zi9nttc0Wo6K7pvrDD40r2HNg305 +qLCzItr5st3x8cq2cIXvN4LOm2rqpBLZ/sqMmNiW2Y7/aAQqV1xtR35joHqamWHD +UPOmzBMs07YSUjXgC1EMx8kWQSV6cuARj93kxWj8R6eoYHHfrWCEGR313wov6QST +zIfVU7FqQqOmdLW3LaPHxcrI/TjsnkUN99qdlpjJH/YW925LDPJHAkliqPP5AvhU +F9KbY2F8mcIZBCDd8TH+xXynuN3BbIU4kCwVbdx/tcpO1npuJcKB1Go/udyow/Ei +Z3nHzJsCVkezvopek77wnwPaP0nAb7f4iIY3gJCoGirOx6N075TgF6MBe00q9oFE +y4rvnUnU9/QzOOes95eUMhM+9eK1cuLFEV5t47DfxRdq+fQip3FJ2l6v19sZvQ0G +j06pjYqg0of273rG8oXcDrFjb1Zqhj8x1mLl6u7d/ide5wTm9HylBWcYKQjIJJAi +WIScxEPIOINDJKgsKTuKtoyNvISJ3xUeS1yzxiIb3YGLIyPgFFx0vFyqJfbkXq70 +m1n2xnJlkTidfzbZvc6EA7vRGSDYK6FqqhlGhc7UypUEVW8FM/jZNAOS6QARAUGt +tCg5RTY2OTg2MTM2OEJDQTBCRTQyREFGN0REREEyNTJFQkI4RUJFMUFGiQI3BBMB +CgAhBQJSg/uTAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEN2iUuu46+Gv ++Z0P+wQhkLwm+WGcEsS98Lei9O7hit/k4g/VkLUUQV7BOR3n8uRZIFkdOtpvrFU3 +aKf246uCy6GM48Oh+1U2cv5InX/WEuKaFo5uF6t79wyt18BUn1weDcU+DQdOSG4f +fSnNa55wkN0l0svW4fGIthjmDTz6HZFntYD+9A20wZAqpPIs+vyG9Jp+e9E9Y/W/ +EFQbNlxHHb9+BMT2+DtNP+HSl3MPFlQPKOLZxyLAU5uzT0Sa0LxhrQy5FgkW6Jog +sbAJVM9z0pZw+grzGPciM66ZW1rxeICvbYsdWLytRjqxpY8GS8XudyseUGd+dZim +ptarsrE5yfSMg2gW5Z1PTc0tEMXJLUwtpyzQjpFpbb7dPuo2TUp09LgZKX63WCbS +Nb1RTaGfkeYudOTo2rh4Jfg+Tb/JRpO6clo0rxAq8nPH2WmG+9TB8Zbb7YRzGWuV +/e5SeVNR+zY8tXZKnmUIH1HIprc+BtT6Bupdvd0CT14Mg9MmsFvUXofwHLa4gahr +8/iG9y3uHSA6Rhz++yOpyOmNvO1LDxsYNaRCIXQJbqgNwF5YNYlMPsEeY/CG7FOb +Afv7rHiYtRRQfz2P4OF900DJO7QL9gdNXJ1+Hajy/5Lvvl7qwqMG4GvVQEsgFc5O +jjFCUhE2i20j2kEMxvA5RLBH/fOoGARn87tiKSfb+pqLNZQb +=fDJ8 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/dda252ebb8ebe1af-2.asc b/tests/openpgp/samplekeys/dda252ebb8ebe1af-2.asc new file mode 100644 index 0000000..8547463 --- /dev/null +++ b/tests/openpgp/samplekeys/dda252ebb8ebe1af-2.asc @@ -0,0 +1,29 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + + +mQINBFKD+38BEADSv5l4xOx9hCRJVcybq6yK5hTpGSFf3xo1bkhoMvyC62ehb4jD +MDLwwNRyzCBEWQJLbq/LLizPFN2qXFJpXJcsuqsHNYRtDqDBEjtriRQwSqHnqTXt +c0K46FYHldCJQ4/tBXxPI+WwtXjcNRWaV7n2BvR/Jk+B5e4Zz3LPnN0C4w5vORHs +hN1jil8A3Hs/F+OmlQYrU8ZtNwTpSo2EXxe2fVgSDCsKRyNsPZj++OyujPzW+yaN +lJ9I/q6s9gvX9o9o7nwZbqBETipWsdRK6RfBdTKpnyLNordbWwWTk6GxN8T5Ppit +P6a3UlQ71VuflcswCTmEQ1pEfZrlRFKa9psBOW+cZLNxT9h0jGFMh6/B3w48Sag+ +cFcPBFWParC+cAXBIURDxT9G6bzNLogg7YKoaPsyiXnLDH2VJUCXs27D2wPJL24Q +S7npvsg63MPPssWgG5cauLznmNR4y5pQi6oH/C10v0zrUJy6FPJzQhYRhWOvhtz6 +j88RGMrFNNCdB2VACtn699D+ixu3nRlXHIKCT+xLSfgslVYifmJOCNljBLGHOQ1e +FJxQuNVpmmxjvk/8kqK+pHLB9Qn6M1ZYzip7OyUL3OAWabCabgEw2bQmUhiBWD3u +buv0WAVOJEAFvBCAeYNQzrQMY+Rc3RnvynG4pI6Tbo8wC6/IJcDOw516JwARASB3 +tChBNTUxMjA0MjczNzRGM0Y3QUE1RjExNjZEREEyNTJFQkI4RUJFMUFGiQI3BBMB +CgAhBQJSg/uTAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEN2iUuu46+Gv +9L0P/3tFu0LOZ/dAPjUNfKJCZqcIuVnD5xShMTsUbVx+QoXMy7rt4iRLD7ofGi/I +vTAZehxk3sk/Slx5nbews+3NItyw6mcaP9HlmwKNr6k7BC2kJHcCxH4DNzhmIx1H +3T/CggtHX42JBYKlGf22y+M8jAbvsPOUfTznx96mYNrOY6s1dJyn0kRleqJ8+tGj +/5+0y90iZnGCa0FtacQkKUPkXwVodeZVxk8z5OEipShYKc+8dl+5WsvOzHqLC/KY +xCGRb4JaqEMwouLNg8dTNAXXUvFGqJNDX4+andggogmI1hdD9xExfSU9cAGegg2t +vvveC4S+CCHd+zt88iK5ze6F61RxwYhhNbkuFGjdgNGCpHtG/BQhKnYJuKEbq3oi +mgNyxJERlfgaWXveiMG0AmACXN+jCkTtqZjQnsg2N2QDL3tjY7usmuiwRL1aVOFG +Kw5/Cc+2nDeANS3Xi1403Ni269b1c6kNSoLe4zd0WsbO3Kouds8F8EQfeheXQe97 +ZxuvBOMsR9wHC3f0sl/vfxCGdUC+khmKk5taKnUeUFJmVmh5ghlVy8FySHGB0QHO +zd8GUl59rFpQJNpNFQW2YKDhrcjxIr2AeJrdoDI6NsQ02+Qtep/bbq53hqtAD4jF +t3S8vBbTXtRk6g2qn4ojF4SOIc8SAiZcURgVFuSJX8ngFbO4 +=OEw/ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/e2e-p256-1-clr.asc b/tests/openpgp/samplekeys/e2e-p256-1-clr.asc new file mode 100644 index 0000000..2b53091 --- /dev/null +++ b/tests/openpgp/samplekeys/e2e-p256-1-clr.asc @@ -0,0 +1,37 @@ +pub nistp256/03288C74F8BE8F0F 1970-01-01 +uid [ unknown] <example@another.test> +sub nistp256/A6ED196C7C513F1E 1970-01-01 + +Not protected. + +Taken from +https://github.com/google/end-to-end/issues/326#issuecomment-123585977 + +-----BEGIN PGP PRIVATE KEY BLOCK----- +Charset: UTF-8 +Version: End-To-End v0.3.1342 + +xf8AAAB3BAAAAAATCCqGSM49AwEHAgMEmUwnXtxBvQY+nXvduAbd626NmYshRVi4 +HULGQ9fAHjKqfld4qWk97o+ggZDAnhQJ/Jm3ljtXr3/SosXUsSh7AAABAP2/JEYo +22A3Ju3N3vhcbSuvJiHggUDtaomAX2ts2uGYEOvN/wAAABY8ZXhhbXBsZUBhbm90 +aGVyLnRlc3Q+wv8AAACNBBATCAA//wAAAAWCVazty/8AAAACiwn/AAAACZADKIx0 ++L6PD/8AAAAFlQgJCgv/AAAAA5YBAv8AAAACmwP/AAAAAp4BAACIEgD8C80DxHrk +iIBDHF5EWguzM+gUTb4xmIdTAJ2wGUOnTOoA/RpWuJNKU3kdtnnmqce88//jN8VF +1Ho0BONH1b7dRV4ix/8AAAB7BAAAAAASCCqGSM49AwEHAgMEyfb375CDU05C3BXj +FY3tGbGEmGrTgNj0lAzdbi7TVm5tiHidcNWPHSQPS8aMmygH23OvIkTBmJdCHR38 +lGID/gMBCAcAAQD8IOp5uKaGHtkmHNdwiwizTl3a2fAltOEAmWwyS6X0qBD1wv8A +AABtBBgTCAAf/wAAAAWCVazty/8AAAAJkAMojHT4vo8P/wAAAAKbDAAA88EBAKve +TpskPN10clQ6TeCFqlq51jhB5ZhzPSq64ChB7p8nAQCa9aJZneQOvMDquN/1vpJK +MvDHHXB+EgIsuAzL0DtfL8b/AAAAUgQAAAAAEwgqhkjOPQMBBwIDBJlMJ17cQb0G +Pp173bgG3etujZmLIUVYuB1CxkPXwB4yqn5XeKlpPe6PoIGQwJ4UCfyZt5Y7V69/ +0qLF1LEoewDN/wAAABY8ZXhhbXBsZUBhbm90aGVyLnRlc3Q+wv8AAACNBBATCAA/ +/wAAAAWCVazty/8AAAACiwn/AAAACZADKIx0+L6PD/8AAAAFlQgJCgv/AAAAA5YB +Av8AAAACmwP/AAAAAp4BAACIEgD8C80DxHrkiIBDHF5EWguzM+gUTb4xmIdTAJ2w +GUOnTOoA/RpWuJNKU3kdtnnmqce88//jN8VF1Ho0BONH1b7dRV4izv8AAABWBAAA +AAASCCqGSM49AwEHAgMEyfb375CDU05C3BXjFY3tGbGEmGrTgNj0lAzdbi7TVm5t +iHidcNWPHSQPS8aMmygH23OvIkTBmJdCHR38lGID/gMBCAfC/wAAAG0EGBMIAB// +AAAABYJVrO3L/wAAAAmQAyiMdPi+jw//AAAAApsMAADzwQD/ahaSqogMflSlGJRU +Z6Qb51EAaYBB5nL/u1ckWLh/CCEBAM83CFzh1qJXzYnl5DJNAPnj4jJgJKtSxOhn +bvlk62wx +=Xjs9 +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/e2e-p256-1-prt.asc b/tests/openpgp/samplekeys/e2e-p256-1-prt.asc new file mode 100644 index 0000000..d30e8c0 --- /dev/null +++ b/tests/openpgp/samplekeys/e2e-p256-1-prt.asc @@ -0,0 +1,39 @@ +pub nistp256/03288C74F8BE8F0F 1970-01-01 +uid [ unknown] <example@another.test> +sub nistp256/A6ED196C7C513F1E 1970-01-01 + +Passphrase is "a". + +Taken from +https://github.com/google/end-to-end/issues/326#issuecomment-123585977 + +-----BEGIN PGP PRIVATE KEY BLOCK----- +Charset: UTF-8 +Version: End-To-End v0.3.1342 + +xf8AAAClBAAAAAATCCqGSM49AwEHAgMEmUwnXtxBvQY+nXvduAbd626NmYshRVi4 +HULGQ9fAHjKqfld4qWk97o+ggZDAnhQJ/Jm3ljtXr3/SosXUsSh7AP4JAwLJdqYd +6K+4XWACOPArMgQfaUFtQY54pRS1Vo98N4Jpw7o0iYAr80y40s5DaBIcUD5UuMHM +p5no4vv8/hVCkIWJvoD/08rIzJDYEc9h2S4Lzf8AAAAWPGV4YW1wbGVAYW5vdGhl +ci50ZXN0PsL/AAAAjQQQEwgAP/8AAAAFglWs7cv/AAAAAosJ/wAAAAmQAyiMdPi+ +jw//AAAABZUICQoL/wAAAAOWAQL/AAAAApsD/wAAAAKeAQAAiBIA/AvNA8R65IiA +QxxeRFoLszPoFE2+MZiHUwCdsBlDp0zqAP0aVriTSlN5HbZ55qnHvPP/4zfFRdR6 +NATjR9W+3UVeIsf/AAAAqQQAAAAAEggqhkjOPQMBBwIDBMn29++Qg1NOQtwV4xWN +7RmxhJhq04DY9JQM3W4u01ZubYh4nXDVjx0kD0vGjJsoB9tzryJEwZiXQh0d/JRi +A/4DAQgH/gkDAsplyBF6DNuBYC3tTyYEL0QQjWrcaaeTk4JSb93mog6QlL610EO5 ++muowWT9Dl8Ll77BjQSpj7mmqGHIj/IxJubOYqa+iW1e4pj5qlXCaBbC/wAAAG0E +GBMIAB//AAAABYJVrO3L/wAAAAmQAyiMdPi+jw//AAAAApsMAADzwQEAq95OmyQ8 +3XRyVDpN4IWqWrnWOEHlmHM9KrrgKEHunycBAJr1olmd5A68wOq43/W+kkoy8Mcd +cH4SAiy4DMvQO18vxv8AAABSBAAAAAATCCqGSM49AwEHAgMEmUwnXtxBvQY+nXvd +uAbd626NmYshRVi4HULGQ9fAHjKqfld4qWk97o+ggZDAnhQJ/Jm3ljtXr3/SosXU +sSh7AM3/AAAAFjxleGFtcGxlQGFub3RoZXIudGVzdD7C/wAAAI0EEBMIAD//AAAA +BYJVrO3L/wAAAAKLCf8AAAAJkAMojHT4vo8P/wAAAAWVCAkKC/8AAAADlgEC/wAA +AAKbA/8AAAACngEAAIgSAPwLzQPEeuSIgEMcXkRaC7Mz6BRNvjGYh1MAnbAZQ6dM +6gD9Gla4k0pTeR22eeapx7zz/+M3xUXUejQE40fVvt1FXiLO/wAAAFYEAAAAABII +KoZIzj0DAQcCAwTJ9vfvkINTTkLcFeMVje0ZsYSYatOA2PSUDN1uLtNWbm2IeJ1w +1Y8dJA9LxoybKAfbc68iRMGYl0IdHfyUYgP+AwEIB8L/AAAAbQQYEwgAH/8AAAAF +glWs7cv/AAAACZADKIx0+L6PD/8AAAACmwwAAPPBAP9qFpKqiAx+VKUYlFRnpBvn +UQBpgEHmcv+7VyRYuH8IIQEAzzcIXOHWolfNieXkMk0A+ePiMmAkq1LE6Gdu+WTr +bDE= +=Sgsj +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/ecc-sample-1-pub.asc b/tests/openpgp/samplekeys/ecc-sample-1-pub.asc new file mode 100644 index 0000000..478fc3a --- /dev/null +++ b/tests/openpgp/samplekeys/ecc-sample-1-pub.asc @@ -0,0 +1,22 @@ +The key has been generated by the first GnuPG ECC version at +http://code.google.com/p/gnupg-ecc. + +The sample key has ECDSA top key 0xBAA59D9C and a single ECDH +encryption subkey 0x4089AB73. ECDH subkey uses SHA-256 and AES-128 +with KDF. + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2.1.0-ecc (GNU/Linux) + +mFIETJPQrRMIKoZIzj0DAQcCAwQLx6e669XwjHTHe3HuROe7C1oYMXuZbaU5PjOs +xSkyxtL2D00e/jWgufuNN4ftS+6XygEtB7j1g1vnCTVF1TLmtCRlY19kc2FfZGhf +MjU2IDxvcGVucGdwQGJyYWluaHViLm9yZz6IegQTEwgAIgUCTJPQrQIbAwYLCQgH +AwIGFQgCCQoLBBYCAwECHgECF4AACgkQC6Ut8LqlnZzmXQEAiKgiSzPSpUOJcX9d +JtLJ5As98Alit2oFwzhxG7mSVmQA/RP67yOeoUtdsK6bwmRA95cwf9lBIusNjehx +XDfpHj+/uFYETJPQrRIIKoZIzj0DAQcCAwR/cMCoGEzcrqXbILqP7Rfke977dE1X +XsRJEwrzftreZYrn7jXSDoiXkRyfVkvjPZqUvB5cknsaoH/3UNLRHClxAwEIB4hh +BBgTCAAJBQJMk9CtAhsMAAoJEAulLfC6pZ2c1yYBAOSUmaQ8rkgihnepbnpK7tNz +3QEocsLEtsTCDUBGNYGyAQDclifYqsUChXlWKaw3md+yHJPcWZXzHt37c4q/MhIm +oQ== +=hMzp +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/ecc-sample-1-sec.asc b/tests/openpgp/samplekeys/ecc-sample-1-sec.asc new file mode 100644 index 0000000..5ff5555 --- /dev/null +++ b/tests/openpgp/samplekeys/ecc-sample-1-sec.asc @@ -0,0 +1,25 @@ +The key has been generated by the first GnuPG ECC version at +http://code.google.com/p/gnupg-ecc. + +The sample key has ECDSA top key 0xBAA59D9C and a single ECDH +encryption subkey 0x4089AB73. ECDH subkey uses SHA-256 and AES-128 +with KDF. The password for the key is "ecc". + +-----BEGIN PGP PRIVATE KEY BLOCK----- +Version: GnuPG v2.1.0-ecc (GNU/Linux) + +lJ0ETJPQrRMIKoZIzj0DAQcCAwQLx6e669XwjHTHe3HuROe7C1oYMXuZbaU5PjOs +xSkyxtL2D00e/jWgufuNN4ftS+6XygEtB7j1g1vnCTVF1TLm/gMDAmHomSLb9NbE +oyWUoqgKTbZzbFR/SWmiCcuiQEhREcTyvyU1hAglj7FsBJoQ6/pbeAEQZ3bVzlNM +8F0nF8KPLPuEADF1+4CntCRlY19kc2FfZGhfMjU2IDxvcGVucGdwQGJyYWluaHVi +Lm9yZz6IegQTEwgAIgUCTJPQrQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AA +CgkQC6Ut8LqlnZzmXQEAiKgiSzPSpUOJcX9dJtLJ5As98Alit2oFwzhxG7mSVmQA +/RP67yOeoUtdsK6bwmRA95cwf9lBIusNjehxXDfpHj+/nKEETJPQrRIIKoZIzj0D +AQcCAwR/cMCoGEzcrqXbILqP7Rfke977dE1XXsRJEwrzftreZYrn7jXSDoiXkRyf +VkvjPZqUvB5cknsaoH/3UNLRHClxAwEIB/4DAwJh6Jki2/TWxKO7gHKWIcOcxYZp +CRWjlUghbKb6Q83p8GLPjKRN0USl/U1tObWdksqMXhUO0ePLWUnrbwoWYfYXg9Er +ADTgCYhhBBgTCAAJBQJMk9CtAhsMAAoJEAulLfC6pZ2c1yYA/3eJRirPQZmBno+Z +P/HOBSFWmFt4cUBGUx3oqiUd5loOAP480pb+vXx9ipljJWCJDSl/boRSuqB4hePP +qt9Rd5gNdQ== +=O8Dg +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/ecc-sample-2-pub.asc b/tests/openpgp/samplekeys/ecc-sample-2-pub.asc new file mode 100644 index 0000000..f898012 --- /dev/null +++ b/tests/openpgp/samplekeys/ecc-sample-2-pub.asc @@ -0,0 +1,25 @@ +ECC NIST P-384 key taken from +https://sites.google.com/site/brainhub/pgpecckeys + +The sample key has ECDSA top key 0x098033880F54719F and a single ECDH +encryption subkey 0xAA8B938F9A201946. ECDH subkey uses SHA-384 and +AES-256 with KDF. + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Command Line v10.0.0 (Linux) + +mQBvBE1TBZITBSuBBAAiAwME9rjFrO1bhO+fSiCdsuSp37cNKMuMEOzVdnSp+lpn +OJlCti1eUTZ99Me/0/jlAP7s8H7SZaYhqOu75T6UfseMZ366FDvRUzwrNQ4cKfgj +E+HhEI66Bjvh5ksQ5pUOeZwttCRlY19kc2FfZGhfMzg0IDxvcGVucGdwQGJyYWlu +aHViLm9yZz6JAMsEEBMJAFMFAk1TBZIwFIAAAAAAIAAHcHJlZmVycmVkLWVtYWls +LWVuY29kaW5nQHBncC5jb21wZ3BtaW1lBAsJCAcCGQEFGwMAAAACFgIFHgEAAAAE +FQkKCAAKCRAJgDOID1Rxn8orAYCqNzUJaL1fEVr9jOe8exA4IhUtv/BtCvzag1Mp +UQkFuYy0abogj6q4fHQSt5nntjMBf1g2TqSA6KGj8lOgxfIsRG6L6an85iEBNu4w +gRq71JE53ii1vfjcNtBq50hXnp/1A7kAcwRNUwWSEgUrgQQAIgMDBC+qhAJKILZz +XEiX76W/tBv4W37v6rXKDLn/yOoEpGrLJVNKV3aU+eJTQKSrUiOp3R7aUwyKouZx +jbENfmclWMdzb+CTaepXOaKjVUvxbUH6pQVi8RxtObvV3/trmp7JGAMBCQmJAIQE +GBMJAAwFAk1TBZIFGwwAAAAACgkQCYAziA9UcZ+AlwGA7uem2PzuQe5PkonfF/m8 ++dlV3KJcWDuUM286Ky1Jhtxc9Be40tyG90Gp4abSNsDjAX0cdldUWKDPuTroorJ0 +/MZc7s16ke7INla6EyGZafBpRbSMVr0EFSw6BVPF8vS9Emc= +=I76R +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/ecc-sample-2-sec.asc b/tests/openpgp/samplekeys/ecc-sample-2-sec.asc new file mode 100644 index 0000000..b163f63 --- /dev/null +++ b/tests/openpgp/samplekeys/ecc-sample-2-sec.asc @@ -0,0 +1,22 @@ +ECC NIST P-384 key taken from +https://sites.google.com/site/brainhub/pgpecckeys + +The sample key has ECDSA top key 0x098033880F54719F and a single ECDH +encryption subkey 0xAA8B938F9A201946. ECDH subkey uses SHA-384 and +AES-256 with KDF. The password for the key is "ecc". + +-----BEGIN PGP PRIVATE KEY BLOCK----- +Version: PGP Command Line v10.0.0 (Linux) + +lQDSBE1TBZITBSuBBAAiAwME9rjFrO1bhO+fSiCdsuSp37cNKMuMEOzVdnSp+lpn +OJlCti1eUTZ99Me/0/jlAP7s8H7SZaYhqOu75T6UfseMZ366FDvRUzwrNQ4cKfgj +E+HhEI66Bjvh5ksQ5pUOeZwt/gcDAkrFTsfF6LKsqD/tW6Eot2DDE8znJjnQQ/Nr +H98XT1WQ9V0ED8l9DDIIj7z80ED3NR8XMSI8Ew/A/0w6NDPL978BX0MGvpaeBaWV +tEuH1EPAxiA+hFALwftY+a8s1zLktCRlY19kc2FfZGhfMzg0IDxvcGVucGdwQGJy +YWluaHViLm9yZz6dANYETVMFkhIFK4EEACIDAwQvqoQCSiC2c1xIl++lv7Qb+Ft+ +7+q1ygy5/8jqBKRqyyVTSld2lPniU0Ckq1Ijqd0e2lMMiqLmcY2xDX5nJVjHc2/g +k2nqVzmio1VL8W1B+qUFYvEcbTm71d/7a5qeyRgDAQkJ/gkDAqqmkngPLoJGqI4O +rHyyU3wrrPzDDDURkseoUEZlDZINjyto26A8N825mqLqeFytJuuABYH1UnLs4d2x +ZJZIYjEoFMPcFPuUtx+IZnECa1Vcyq2aRFCixVO0G/xrSFar +=a4k3 +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/ecc-sample-3-pub.asc b/tests/openpgp/samplekeys/ecc-sample-3-pub.asc new file mode 100644 index 0000000..14b49d3 --- /dev/null +++ b/tests/openpgp/samplekeys/ecc-sample-3-pub.asc @@ -0,0 +1,28 @@ +ECC NIST P-521 key taken from +https://sites.google.com/site/brainhub/pgpecckeys + +The sample key has ECDSA top key 0x6B4184E145AF2FFE and a single ECDH +encryption subkey 0x07EAAA48A81C4838. ECDH subkey uses SHA-512 and +AES-256 with KDF. + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Command Line v10.0.0 (Linux) + +mQCTBE1TFQITBSuBBAAjBCMEAWuwULfE2XoQmJhSQZ8rT5Ecr/kooudn4043gXHy +NZEdTeFfY2G7kwEaxj8TXfd1U1b4PkEoqhzKxhz/MHK/lwi2ARzW1XQiJ1/kFPsv +IUnQI1CUS099WKKQhD8JMPPyje1dKfjFjm2gzyF3TOMX1Cyy8wFyF0MiHVgB3ezb +w7C6jY+3tCRlY19kc2FfZGhfNTIxIDxvcGVucGdwQGJyYWluaHViLm9yZz6JAO0E +EBMKAFMFAk1TFQIwFIAAAAAAIAAHcHJlZmVycmVkLWVtYWlsLWVuY29kaW5nQHBn +cC5jb21wZ3BtaW1lBAsJCAcCGQEFGwMAAAACFgIFHgEAAAAEFQoJCAAKCRBrQYTh +Ra8v/sm3Agjl0YO73iEpu1z1wGtlUnACi21ti2PJNGlyi84yvDQED0+mxhhTRQYz +3ESaS1s/+4psP4aH0jeVQhce15a9RqfX+AIHam7i8K/tiKFweEjpyMCB594zLzY6 +lWbUf1/1a+tNv3B6yuIwFB1LY1B4HNrze5DUnngEOkmQf2esw/4nQGB87Rm5AJcE +TVMVAhIFK4EEACMEIwQBsRFES0RLIOcCyO18cq2GaphSGXqZtyvtHQt7PKmVNrSw +UuxNClntOe8/DLdq5mYDwNsbT8vi08PyQgiNsdJkcIgAlAayAGB556GKHEmP1JC7 +lCUxRi/2ecJS0bf6iTTqTqZWEFhYs2aXESwFFt3V4mga/OyTGXOpnauHZ22pVLCz +6kADAQoJiQCoBBgTCgAMBQJNUxUCBRsMAAAAAAoJEGtBhOFFry/++p0CCQFJgUCn +kiTKCNfP8Q/MO2BCp1QyESk53GJlCgIBAoa7U6X2fQxe2+OU+PNCjicJmZiSrV6x +6nYfGJ5Jx753sqJWtwIJAc9ZxCQhj4V52FmbPYexZPPneIdeCDjtowD6KUZxiS0K +eD8EzdmeJQWBQsnPtJC/JJL4zz6JyYMXf4jIb5JyGNQC +=5yaB +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/ecc-sample-3-sec.asc b/tests/openpgp/samplekeys/ecc-sample-3-sec.asc new file mode 100644 index 0000000..6552e7a --- /dev/null +++ b/tests/openpgp/samplekeys/ecc-sample-3-sec.asc @@ -0,0 +1,24 @@ +ECC NIST P-521 key taken from +https://sites.google.com/site/brainhub/pgpecckeys + +The sample key has ECDSA top key 0x6B4184E145AF2FFE and a single ECDH +encryption subkey 0x07EAAA48A81C4838. ECDH subkey uses SHA-512 and +AES-256 with KDF. The password for the key is "ecc". + +-----BEGIN PGP PRIVATE KEY BLOCK----- +Version: PGP Command Line v10.0.0 (Linux) + +lQEIBE1TFQITBSuBBAAjBCMEAWuwULfE2XoQmJhSQZ8rT5Ecr/kooudn4043gXHy +NZEdTeFfY2G7kwEaxj8TXfd1U1b4PkEoqhzKxhz/MHK/lwi2ARzW1XQiJ1/kFPsv +IUnQI1CUS099WKKQhD8JMPPyje1dKfjFjm2gzyF3TOMX1Cyy8wFyF0MiHVgB3ezb +w7C6jY+3/gcDAv+CotECRPpSqGkqKrz+xAhAqswHXzFIBprFF0XiDooWktZSTAUR +JVB2U6m28wC4rE3RkqFeR1B+kg4nxEAJ9k6BI8oDE0iyOY5aklF2TxPpTs/BA+N2 +O4hnXb1l5qXfuyd3bSwDeyfq3CdFe4TeKp7vtCRlY19kc2FfZGhfNTIxIDxvcGVu +cGdwQGJyYWluaHViLm9yZz6dAQwETVMVAhIFK4EEACMEIwQBsRFES0RLIOcCyO18 +cq2GaphSGXqZtyvtHQt7PKmVNrSwUuxNClntOe8/DLdq5mYDwNsbT8vi08PyQgiN +sdJkcIgAlAayAGB556GKHEmP1JC7lCUxRi/2ecJS0bf6iTTqTqZWEFhYs2aXESwF +Ft3V4mga/OyTGXOpnauHZ22pVLCz6kADAQoJ/gkDAki71k/zBW2qqGyScDNNuWaA +9A5aWhpNNyRrFembt7f/W+b591G3twdNmdCIh29VoOmQw3fO8wwgsPTUxQFgd8J3 +ncft0zciEcDZi/ztLZA3+rIIP2myZLIs9xLG+k+gf3nXpeED4uYqQX3GL+32PKwg +=Qnd8 +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/ed25519-cv25519-sample-1.asc b/tests/openpgp/samplekeys/ed25519-cv25519-sample-1.asc new file mode 100644 index 0000000..54d2044 --- /dev/null +++ b/tests/openpgp/samplekeys/ed25519-cv25519-sample-1.asc @@ -0,0 +1,21 @@ +pub ed25519 2016-06-22 [SC] + B21DEAB4F875FB3DA42F1D1D139563682A020D0A + Keygrip = 1E28F20E41B54C2D1234D896096495FF57E08D18 +uid [ unknown] patrice.lumumba@example.net +sub cv25519 2016-06-22 [E] + 8D0221D9B2877A741D69AC4E9185878E4FCD74C0 + Keygrip = EB33B687EB8581AB64D04852A54453E85F3DF62D + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +mDMEV2o9XRYJKwYBBAHaRw8BAQdAZ8zkuQDL9x7rcvvoo6s3iEF1j88Dknd9nZhL +nTEoBRm0G3BhdHJpY2UubHVtdW1iYUBleGFtcGxlLm5ldIh5BBMWCAAhBQJXaj1d +AhsDBQsJCAcCBhUICQoLAgQWAgMBAh4BAheAAAoJEBOVY2gqAg0KmQ0BAMUNzAlT +OzG7tolSI92lhePi5VqutdqTEQTyYYWi1aEsAP0YfiuosNggTc0oRTSz46S3i0Qj +AlpXwfU00888yIreDbg4BFdqPY0SCisGAQQBl1UBBQEBB0AWeeZlz31O4qTmIKr3 +CZhlRUXZFxc3YKyoCXyIZBBRawMBCAeIYQQYFggACQUCV2o9jQIbDAAKCRATlWNo +KgINCsuFAP9BplWl813pi779V8OMsRGs/ynyihnOESft/H8qlM8PDQEAqIUPpIty +OX/OBFy2RIlIi7J1bTp9RzcbzQ/4Fk4hWQQ= +=qRfF +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/eddsa-sample-1-pub.asc b/tests/openpgp/samplekeys/eddsa-sample-1-pub.asc new file mode 100644 index 0000000..5a65453 --- /dev/null +++ b/tests/openpgp/samplekeys/eddsa-sample-1-pub.asc @@ -0,0 +1,15 @@ +pub ed25519/97965A9A 2014-08-19 + Key fingerprint = C959 BDBA FA32 A2F8 9A15 3B67 8CFD E121 9796 5A9A + Keygrip = 0DD40284FF992CD24DC4AAC367037E066FCEE26A +uid [ unknown] EdDSA sample key 1 (draft-koch-eddsa-for-openpgp-00) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +mDMEU/NfCxYJKwYBBAHaRw8BAQdAPwmJlL3ZFu1AUxl5NOSofIBzOhKA1i+AEJku +Q+47JAa0NEVkRFNBIHNhbXBsZSBrZXkgMSAoZHJhZnQta29jaC1lZGRzYS1mb3It +b3BlbnBncC0wMCmIeQQTFggAIQUCU/NfCwIbAwULCQgHAgYVCAkKCwIEFgIDAQIe +AQIXgAAKCRCM/eEhl5ZamnNOAP9pKn5wz3jPsgy9p65zxz1+xJEr/cczFQx/tYkk +49tkeAD+P9jJE4SFD2lVofxn1e22H7YLvcVyHDOA9gpYWTNXiAU= +=Jbi7 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/eddsa-sample-1-sec.asc b/tests/openpgp/samplekeys/eddsa-sample-1-sec.asc new file mode 100644 index 0000000..4b5fbcc --- /dev/null +++ b/tests/openpgp/samplekeys/eddsa-sample-1-sec.asc @@ -0,0 +1,19 @@ +sec ed25519/97965A9A 2014-08-19 + Key fingerprint = C959 BDBA FA32 A2F8 9A15 3B67 8CFD E121 9796 5A9A + Keygrip = 0DD40284FF992CD24DC4AAC367037E066FCEE26A +uid [ unknown] EdDSA sample key 1 (draft-koch-eddsa-for-openpgp-00) + +The passphrase is "abc". + +-----BEGIN PGP PRIVATE KEY BLOCK----- +Version: GnuPG v2 + +lIYEU/NfCxYJKwYBBAHaRw8BAQdAPwmJlL3ZFu1AUxl5NOSofIBzOhKA1i+AEJku +Q+47JAb+BwMCeZTNZ5R2udDknlhWE5VnJaHe+HFieLlfQA+nibymcJS5lTYL7NP+ +3CY63ylHwHoS7PuPLpdbEvROJ60u6+a/bSe86jRcJODR6rN2iG9v5LQ0RWREU0Eg +c2FtcGxlIGtleSAxIChkcmFmdC1rb2NoLWVkZHNhLWZvci1vcGVucGdwLTAwKYh5 +BBMWCAAhBQJT818LAhsDBQsJCAcCBhUICQoLAgQWAgMBAh4BAheAAAoJEIz94SGX +llqac04A/2kqfnDPeM+yDL2nrnPHPX7EkSv9xzMVDH+1iSTj22R4AP4/2MkThIUP +aVWh/GfV7bYftgu9xXIcM4D2ClhZM1eIBQ== +=+9EF +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/issue2346.gpg b/tests/openpgp/samplekeys/issue2346.gpg new file mode 100644 index 0000000..cc2d5a8 --- /dev/null +++ b/tests/openpgp/samplekeys/issue2346.gpg @@ -0,0 +1,57 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- +Version: GnuPG v2 + +lQOXBEs9OwYBCACz+AMJEU9xL4LK6LIbNkMYdoG1aXh0j/wS+0uzxMMw/xXgkzep +KLwBd5QpSnJMTJ0n032dSwTbZ6vkJsJq5vuD0LIrHZeEcnt6pAPmz595I82IZmpi +bgp9DQStaRlHIjWfe/KucXmT+yn3xyy8vBls03wksirC1RdQR/46h+Ra2AQpBXWq +L0ZIVu3QL2TydLQN2a8+k0u5Y+avqTYCX4r9n96/0L2hbwMsoL+vtuDIQK4bknm1 +uZD+xd/9eLFzInXe4Qv4IjES+IaLXWuzytF0ZvE6ZYuMpEUmZ60KeuiOWEZie82Z +zaZCrVQX3QHSs+w/LWQE4v9S3qBKDAThu5ljABEBAAEAB/4+dve+vvZe58my2d9v +2H6jUAanS8tWUd+BSx20cLf7Gp6iSxbHrO7MZ4/SYReY6gKmHx77aF1wNeSQlO9o +IXHtB5O/qU681uuK3sDH7QqCBm5BSKLmNSGI0+rqsY7nhLUt/Nx3tcUoGsYvTT92 +5qbAggsVxY1YAJRN9h8Ee8RDzx9mRdy6FxSzizPip3cqvqSYG2Icrc5Q9r+9Frrr +no8+xlYzQtXn8N96xRsLIW4IXa1TxwS0t2+iGL4+wjXPkbZXquRukFkwVd9cc+sl +TDsc4lVCzevbPLaNVQbT9Ysu/fYjymzhH3pt3CzKlzGWUfsNWngmnTM9rL8GIdRo +HZ3JBADTrZQVYGKMrt/K37Js40GxHXhwjst0pciIfEePUmlvQIDBDN8ThYsO1OIR +QzhOmXW3d9pj34u2zqMu9kDAM8NDpM4v8CtPu2n5CJ9TmmEtxYmH1UCFEjujVwJv +URZfAOHB+XHswGQG+2Wc8jzKF2BNA2gvuHHuj0e+OkGWSeaG5QQA2aa/B8NWGLOz +N85tzN/gmqvdRnlPoj2VntMHWNlh/jFQn6f4gVN9JG+kaoNbkYso2YUMI0Exqd4c +RdN0h1vlPC687qya4TMDf7h6dfIkdHtFPdnWc7uCDsjLQkhFsvkv0/JeG9OXEmIG +T0uqUm6oDAwAYnZnnRJqBu6R5VwPkqcD+Jx2nr+oTdiX6Ai+H8eZ+gldywEyde7g +0gY1UwR861UssaSx/d0OB0sGQ449IjvJsZfKI5Pkk7MSVRsQYo21SyIQ1dTK5O2X +M11csVLlskBUTEqgJ1lNNN4KM9v7DYTPHV0w2xl7nhXTfI0xJzctt0L7H/ZcY47X +SnLfCdSeoXtBl7QdVGVzdCBLZXl5eSA8dGVzdEBleGFtcGxlLm9yZz6JATcEEwEI +ACEFAks9OwYCGwMFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQV2EJExpGeGx5 +OAf9EnPOLkj2LYBVXx/zBceU9frnHAqZd7i2Du2s8AAl9tU0PQf4eWjTWL1iROeR +yoKLVUpGaavz70VFpLq3xpOm4stYlqHTToN2LF65bcEui7c3hBaUcqyEhH90j74p +8s7zkvWW84CQuswnpeaAZ5mpLftjrfl7ZYjxkI5UMAdEf/cGlBzN9f8bhFwN7e01 +8ypgoLbVVpStL4G1eNtFtMmRJGMs9CAeR4seAYLwfVypAIAdUJ7TJgGT0JTRWVeO +9hjr6yT9j7FuMZkRfLcA6sfHkmqRXEvAt2a6X31Rarl5w7ETJdUeu0WoFhVzaGWQ +7eBtGS1WyKKp3+/WWaFoxkXfkZ0DmARLPTsGAQgA2pq6vBBhBN9l+g3TSRtsWRgu +hFg4w8mPpfXRhNVbP9i3RtfDTKcsx8xXD+svmEuWVQTj3Ki6PvLCBbYvvTXBnRal +qGzIFDNeGW+qt2129NqO0C4bz6c3K4bN2BCKxtJZ1KzZz59XWg4KLaiIfcaqfIw7 +xlSI9vui29sUXUY9XiBtPKLTEfw1eynUfhzwVhAqty0pVJ4sy8SygxKJo6QacSBI +fzgGUMntTrrdqlvz8tmkLJby51MX657bZtovXY1WZ5TSeaqOI2F5X/AHggHRyD7g +vaDlirLfnemcRkfWDNFj79cIWcybnJLdcsKDBbi3LlCSPyVwUFY5shqUXQcLNQAR +AQABAAf/bFfdjtHLU9/oqcrqWcRmqa2LeHpE//xI3qb7hYs842LkSw8qszXzwr5q +s/ALMb7crhxzVmyligdE1BHcjTk0UUflKJlpfGGNFKw8fxaYq3ga6eDAVeV5OXBh +WuGv9iRQ81ALz5QYdgCZWNG7fCLXYk0aXwyMqWRD7hUhfa0PQzOCUYYr1tdVTb4D +stmZGTR2tuWQQlTDa4WAqWu2ybYJceE4tq3Fam8P5mjFKnlb9OSrS692voRg1AFL +FHyKOvn9BARixE/XFYv1TyUVFNM4AF4wQaVfdU29VySF7oU7sB786yXFgdQrVq9d +mfFmzLconhcHmvz2pRbIiXIJHwnETQQA4dRLkYL1hQxbM+ymwYMJxkasLPcId+2v +NmxPKA518cADWfkFLakQmPH8wD6p9wBToXRxK275S5YQFOLgxk9QikT8N6OY9h6b +oCEDqHOe1wis5VCc6pfTGwv3LtgMuGFoKoCScpTWJ8ZywRSORGLB0IzfVSE1JEzs +rX2F567Ty8MEAPfPVTQ7HjTfnOw9Zx0jxE5sa0VdeWntfCv3RAGRCzwSvH0YEPBw +pN/Ug1JyGUu4pPvJ5g++cLUCfklf0x3CYEOsnUO3VXdo4jssSc4ZjWo+Y/T65Nbq +ux0YrMkhwVAl4ns8iXTiBkLyzP9wucSI9Kr1JaAwCb3Mb2wgMdHlf3WnBADy+gfS +VpGcw38RlrsGdWCpAy4s7XEC9SjW2A+rxd+5jQRSnYxOuP2xBu8zDfUH3melKeeY +EF3Mj41zz/lNE49+UXMSMivKzKtycwrw9vx7hPewRv/lLXoDbPdKq/p4bT8M6nL3 +InNmdpdGS171v896JWFWa8OVS1hLrf1LRY7dc0IziQEfBBgBCAAJBQJLPTsGAhsM +AAoJEFdhCRMaRnhsSUcH/0MiISSuJhwAWMVwD59TTaaUV0AtuflyJcfR3c5natrf +jYt5Ivigy3gNc04YkfhP04nuD2v/2uGqppPVFtSY/wiezWPfDCY0TWL35faAUCt1 +sx5m1w+lzNQpSkx9xVXHKtNikzKRrOaCDv3h2Gad6hU6sH5O1kSFdYD4joScmL0L +QpkO8SR2lXlRvWgClGafipd3SKFd9hz9JP2kyTwrSzvlOBarJek71bsmU25xiMcx +x6eUXD6/jd7XTL9u6t1RijuVkwMBVu+pcgOdu8921kMLOnX3T0qUQPGWtDAQWIEO +C4R9JafHZDPP/xWgPXiRlDm5O4CA6yNANTfw9r3dtTQ= +=njf7 +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/rsa-rsa-sample-1.asc b/tests/openpgp/samplekeys/rsa-rsa-sample-1.asc new file mode 100644 index 0000000..382d4e6 --- /dev/null +++ b/tests/openpgp/samplekeys/rsa-rsa-sample-1.asc @@ -0,0 +1,38 @@ +pub rsa2048 2016-06-22 [SC] + 5B83120DB1E3A65AE5A8DCF6AA43F1DCC7FED1B7 + Keygrip = C6A6390E9388CDBAD71EAEA698233FE5E04F001E +uid [ unknown] steve.biko@example.net +sub rsa2048 2016-06-22 [E] + 4CB4D8C018C57E60EB3847901D777619BE310D79 + Keygrip = D69102E0F5AC6B6DB8E4D16DA8E18CF46D88CAE3 + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +mQENBFdqP+gBCACoG81sddF9ZZx6TsN7lenDxs53wqJt1bawToXZl6qJ+hO8tMNy +/aUgaqqi8pC5FX3HlSRQhjRFDQXq4jR3+jecFK3wfwmxTKXMKhN52zhSIWClED47 +56B3wPITuwAG2WYFccClhrtWX8j+wBK5IpLVVAXQnORZLOP7fzUZkO1KDu3bP4D6 +f1LQyatIzgS08dnlp6WvsJDrkUeGY6R5smpx9f+PqBVfUVpmckbMOR+BYPJtplZT +0lez4qWsmdWbqU7ZhdvnhMGcTbBbk9WbfR1IJptigeuK8vTU24Jp2FQj6iIBV9OD +jUfr11EJ6W3TvHaWuddd0hfX9DnyH9rghrDFABEBAAG0FnN0ZXZlLmJpa29AZXhh +bXBsZS5uZXSJATcEEwEIACEFAldqP+gCGwMFCwkIBwIGFQgJCgsCBBYCAwECHgEC +F4AACgkQqkPx3Mf+0bd5kggAphS7UDycKadfaRH5JENmKXeI+UUd+E0iERwv7eXq +RcgjNK1oHQSXN+ejDEXzZv2fcCRB7rWEvEXL0pCtPveyzDAQJdhZTRVgmfCXTr1m +9pJfVC3B20jgx6ZxZO8jKDL+bqvufWJczWDT0iHP0Jv04SqASLRs2JRPy+a+w3GJ ++DzG8orfAKiIE1Qycovr8Ol+jdo9ZV9blRA8/j4eqZYg4b7AOf8/mDyXsx3xzSPV +uwkDSluhaOrsV8N0suZ51rfdpapv6VJsXlyQbceJwwgSt2A1n2Sw3ZINwpO7BODy +wO6J44751+qY4cmap4NItyqGQTT6TUEL9ANfrZFmPWmFWLkBDQRXaj/oAQgA255C +UJxFEKLVwEoSgwZqXd94AhjGUbMY6NXdFj5cCq0JmWZrbpT/5OblTrymiH1iLmI0 +ymo+/s8vh6NtB98dhr1syH3asNQfXZRfF+u5X5hLDNPF4sUelsl4+EUef0Hbc9U+ +e+8F8A9TMxELSqQ8Ul3Hu42hc+/ugkc1G/8++Sv/f60TqWcUR2GmuiAvkuS1WmdA +TMhwPr7vMfssV0X0mboz32//b/UfuOyctso5FM+bRaKrEJDQ2WDg57yqnaqsKEga +jW0jElpAVIn792W6YWKOk4auYSpO5f7BVs40Z+bxKGxiH87z9fnmlYAsQwPOOxZw +WaCSrReeheK6c6emAQARAQABiQEfBBgBCAAJBQJXaj/oAhsMAAoJEKpD8dzH/tG3 +baoH/0KI3pIUiIYiLESGXqF+s/W2BmGNwdkYldcyFwkXz84VXoG0B3k7nrwT2DOJ +AEeToavzd3J+aZ4PmxBRAMtDhah0wsMXrwCI8y9Stmm6PIssnu9IP9+jgr4IkKIR +UB/Wn6nzgseaNd7vN4JChCyLSvF+vLd3D56Wzq+hBjybaE+zcEusVLdKYDm2i0YC +pkBkmSuC18lLxhNC8oSCCvVOiyw+TqGHhLnrpA4nGi0MLjAR3OgJ5d/TclYgkLcp +yOupg9GplQsAZUFfQPrY80SJuN9ijBp4xtA1U+WCGKh4ySv1+odpRjPX3eOGUFKZ +sJRKpZupoGWfVN78wm1nPLBKTvM= +=6N/A +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/silent-running.asc b/tests/openpgp/samplekeys/silent-running.asc new file mode 100644 index 0000000..e7c6db3 --- /dev/null +++ b/tests/openpgp/samplekeys/silent-running.asc @@ -0,0 +1,120 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- +Version: GnuPG v2 + +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 +=tU5z +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/samplekeys/ssh-dsa.key b/tests/openpgp/samplekeys/ssh-dsa.key new file mode 100644 index 0000000..58707b3 --- /dev/null +++ b/tests/openpgp/samplekeys/ssh-dsa.key @@ -0,0 +1,12 @@ +-----BEGIN DSA PRIVATE KEY----- +MIIBvAIBAAKBgQCx0bAMKBKzYJugVtUFRRiF8jV4eT8mowj5C0q4QRPuPAGgPdqq +g1PKmoIpCKLynqH29+BFErp1OOenWKRdu9claTu0lmIrMYeYw8liKsyMTg5/DxoV +sRXD1DFoKdeZPDVUxOEQWsLf/IuuLXy4c9GxzET88wUDeieV+GcYQFADoQIVAKS7 +giO+VWOnwqr0p/csUWltpo8TAoGBAJcVpe9riXRuxJtmy1sbJJzOvtPtXk5MCpGs +T/KEXJuVZvu334zkySDd9Is1ML2g5e81ONRCgCGHpwNOzoLC4+yp+pr1E+B2xkUY +ouEtZWhKlbaYw7UdHiRRMEVJqvu+CdyI2gwOveDSrVhoXmGyz9PQVNoiuRXP2hMF +C21jNnBrAoGBAILRAY0/mqsaOTII3uC8KvqwbKlmPnYMJr0COmU1PbOXvaeyWLqG +NHhwPZg6OEhqEk+WMIwb2Dcv70AIYKQU8jX0elh0lk6pE8bomn7/ZIkqa60VG1Cx +8x2GUNag78LvnLfmUPAXOrrCPfbGuqdogCymUz1qrtEzdOSbeBvCMAAFAhQr1sV4 ++UWhlUoExLMDdIyT/ohfxQ== +-----END DSA PRIVATE KEY----- diff --git a/tests/openpgp/samplekeys/ssh-ecdsa.key b/tests/openpgp/samplekeys/ssh-ecdsa.key new file mode 100644 index 0000000..db7c45c --- /dev/null +++ b/tests/openpgp/samplekeys/ssh-ecdsa.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIF8Mt42n5l2eJB2rk5TSnS98xAtR2VfmmI96WT5OtFrdoAoGCCqGSM49 +AwEHoUQDQgAEsphhghltvEj+1rFEcIlSNy2ze7IMHdhGsH060PwOzjKTy15M8zHI +uaH9SOMXTzn3Bial8bxrXLsOYEhRZhYSrA== +-----END EC PRIVATE KEY----- diff --git a/tests/openpgp/samplekeys/ssh-ed25519.key b/tests/openpgp/samplekeys/ssh-ed25519.key new file mode 100644 index 0000000..c3760b8 --- /dev/null +++ b/tests/openpgp/samplekeys/ssh-ed25519.key @@ -0,0 +1,7 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW +QyNTUxOQAAACARyDcsgSrXAdihOuO5lN+qVKVPdwsXCmOZ61XYVUA1MAAAAJAOqdhVDqnY +VQAAAAtzc2gtZWQyNTUxOQAAACARyDcsgSrXAdihOuO5lN+qVKVPdwsXCmOZ61XYVUA1MA +AAAEATyEkvuhAExcEet+Rc2Qz2Fxg4iIi4XXJLpZFKwWsY3hHINyyBKtcB2KE647mU36pU +pU93CxcKY5nrVdhVQDUwAAAACHRlc3Qga2V5AQIDBAU= +-----END OPENSSH PRIVATE KEY----- diff --git a/tests/openpgp/samplekeys/ssh-rsa.key b/tests/openpgp/samplekeys/ssh-rsa.key new file mode 100644 index 0000000..ef0425c --- /dev/null +++ b/tests/openpgp/samplekeys/ssh-rsa.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpgIBAAKCAQEAxp4sIUtrNBl4Vbd4075CmtHmwxTc0FhQIGw36kptbrWReLb9 +Np0RQylKyc6qUruxZlCdPVFo7iX3vs272/0GEakPv0DAsKGbe1nTsMyxxz0o3dP4 +JQOlOGEnpETa0ybfPLMX1+qNiBdm7HLjqcP5+S0Exb0Z0deFNIhEP6XckUEgHmwA +/AdDdUUKwwvZeZOi4XyBVt0vXzwM/+84ro27O+CZm9Du3qe1jTIsX7jUrqsUBhp9 +eUwa1jXfXuJJo9b4/GeP4S9x8U7ho+BQ6/HH03dzcKaY3FftanCZkcwxfGBBUiCK +pIA5WgKimLcgP2R75Y3jilDoBh5HyIdGXo0aFwIDAQABAoIBAQCBXLIHeXS4eUJc +KeSjnQ8KgV4Yf3UWqf5+L533lkRSUCYQhrbDpGeC49kXOejLe/4eUrEnJ+f8/HOx +LZSGwvT5+bAM9CLMqGV5YNc1Fw1PZHFCkfXUPdyVrQnBvyr7Th0mDsuf0OAf3IYn +yOipQMCGX6D1HaY8e3AB+CLjhab0X1vAwvqzPb/HIdtMhRWlJxzbuqnE3kr+Ccvz +us3vmD4VBp0CF0f+yblcibMCHdHY6j8Ir6Qeq6Mbd6lEXRPW1TgUqP15idVaJ4AF +1kGXDW9O0ycgrbopGZfk5yY60fEHGdr4QYjx2Gtx2xQcnPcjJ+j5kGgubKWxNhJE +Qx7DPdYxAoGBAP29S+wD1df0U+Tr0x06N6M/nSjNacGs12Oq/ehNJHhTYUO9fWUl +M2X/MXRMMMGsnGaLNsrLao9Jnq0ZU5GFICWYeVBvaCvRrGngbqJBy8jRv+QYyaQs +AckLcdgLGvjhcXonHDcbcxpug7/qFwakT+KY2s11FrHBEzbAIuDiSSKfAoGBAMhj +KPkrjWJh3xxpFrFnGYj5aF86ExrPe2LAP/8F6Ez7dQN+4bA6O5F4hpJ/X0q/6s0n +IBljo/DgARCBjbwDSaAMEWdm8HDeBhJsSCdQHW38ylaRDi8CQDKR60N3a/tV1MRJ +4fKoHZ+7HH3wc+Bjv3oDovwVyUMG7ekCjeqbqI2JAoGBAOkhYX5Jz9KJBAPSwLeb +4760FfuFL+PooEVMt9kV96ouQbFxiqLB2UWfgJqv3iQ0Kcb1pbQRzag1Jfs4x9Vu +ESk5vEyw729DSDxHHp8qAMhUHxC9zZZvcHx9bW3oVjHRQOfQw1XGfK0OWTKdK+bI +VTWG55HaQK21DahCREmG31dVAoGBALBH80KHmsAioziGBi2YKjGCXtvu5eGfBsdP +orzBQKOATmb91qLGB6MoaRI1NOo4POGu+qD7M7xyAt23aq0sIzfFhgX1260e1C6e +zTawVsNsL7/JqbWXAEy8az+VrguTbTIkYL2sQStEWoM75WRPu6El09p5e+0YCnEC +C0CJINUpAoGBAPF1fpPINHlUW+Bvo4Nj3935QgZI47yTplDusptyfYgFYXw6ZYel +y5Zgv9TWZlmW9FDTp4XVgn5zQTEN1LdL7vNXWV9aOvfrqPk5ClBkxhndgq7j6MFs +9+9V06HJDIsSrC0D/ajIkP+iT9Hd6eEZMkJ6y6XtTbkJGYt2zOtnrpb6 +-----END RSA PRIVATE KEY----- diff --git a/tests/openpgp/samplekeys/whats-new-in-2.1.asc b/tests/openpgp/samplekeys/whats-new-in-2.1.asc new file mode 100644 index 0000000..e16db85 --- /dev/null +++ b/tests/openpgp/samplekeys/whats-new-in-2.1.asc @@ -0,0 +1,128 @@ +These are the keys used in the whats-new-in-2.1 document. The private +keys are in ../privkeys and protected with the passphrase "abc". + + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +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 +PTgzPpanbg78WYNuT7+ZqlZYqj13 +=44AC +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/samplemsgs/clearsig-1-key-1.asc b/tests/openpgp/samplemsgs/clearsig-1-key-1.asc new file mode 100644 index 0000000..4673c40 --- /dev/null +++ b/tests/openpgp/samplemsgs/clearsig-1-key-1.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +You are scrupulously honest, frank, and straightforward. Therefore you +have few friends. +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iQE0BAEBCAAeBQJXakWmFxxzdGV2ZS5iaWtvQGV4YW1wbGUubmV0AAoJEKpD8dzH +/tG3OiIH/18NlMSXXRFRrxXq9OZySzJxgLI7BjGilRTqb4ALeFzNjmCwu3Y+Gkdg +t7NjYjSe0erWiKYDEmALICwcpmSmXHA//gol3QkHJKIlKQGXJP1qLvIde5+lnK8K +YVwLKLBQBQtlGMkMXPdUEn9PgzSoBFoFIqrzQmAdLO3yijSdm0Mzl9wyIhtbUXk+ +VgX2d/6DRIwcKcFoX2QbFlM/z1kdrS6cOYFbJWavEpLDz9ON8Q8a8uqcBiqRlSpW +eGOMMsysJs+44+qX6uE3hu2KJE9xvHwhSjJOxqtw8dN3KZ1+8IkxsDrvDAhn+Klf +Hbtj647f/iTOF88o1ihO7goDi93Bpv4= +=xAv4 +-----END PGP SIGNATURE----- diff --git a/tests/openpgp/samplemsgs/clearsig-2-keys-1.asc b/tests/openpgp/samplemsgs/clearsig-2-keys-1.asc new file mode 100644 index 0000000..0d7823e --- /dev/null +++ b/tests/openpgp/samplemsgs/clearsig-2-keys-1.asc @@ -0,0 +1,20 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +"The geeks shall inherit the earth." + -- Karl Lehenbauer +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iQE0BAEBCAAeBQJXakX/FxxzdGV2ZS5iaWtvQGV4YW1wbGUubmV0AAoJEKpD8dzH +/tG3g1AH/iQakK5FoXpNQs6Nj9NR4NUwtIPmlLS/Tas21CDs1Lo1Fum1gjU0VUFN +63+FTnbRg8nXfee9RPddLnec9lYWVqWSkggTFER8qQrj/EurltLMv/tHAZ+B0ueI +mh2XkNHA6KXu3DFipAXQezWaUqi485TGTY6Qv9JtG/plOZBakcRTgCSAamyaDPBA +PHgp85bPf5Zu4aFRBfmJp+IUH/EFLNFIHNXpYyZZy5ZdB3GuhAHGFp6tlpRFk4Z5 +vRU9BtdoeiIeoRHp4orMESGlbeZxUXG3CCrgzVk0e1pab0NrehwQ23+axMxFipya +t6mi8Zrxpp7eFc9+ozp+7r4cH//uw8+IewQBFggAIwUCV2pF/xwccGF0cmljZS5s +dW11bWJhQGV4YW1wbGUubmV0AAoJEBOVY2gqAg0Ko1YBAKVC98xZvGsNoaq0yDHG +AJKmsvjnc8z3qmEHzGtxOQCiAP92ffXZr0EM4qNqbDR0EAws9qNo0XlDPcm0LDxy +0JVcDw== +=Ta4l +-----END PGP SIGNATURE----- diff --git a/tests/openpgp/samplemsgs/clearsig-2-keys-2.asc b/tests/openpgp/samplemsgs/clearsig-2-keys-2.asc new file mode 100644 index 0000000..992f2ba --- /dev/null +++ b/tests/openpgp/samplemsgs/clearsig-2-keys-2.asc @@ -0,0 +1,20 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +The very remembrance of my former misfortune proves a new one to me. + -- Miguel de Cervantes +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iHsEARYIACMFAldqRlwcHHBhdHJpY2UubHVtdW1iYUBleGFtcGxlLm5ldAAKCRAT +lWNoKgINCubRAQC0VyMKKFXWWxLOwCFO5ovhONxq2VLQ6c7jklZt0AAETgEA8ikc +doPxIamOCta2QwgS0JHPhvgmL98GWM1dMLfD3gOJATQEAQEIAB4FAldqRlwXHHN0 +ZXZlLmJpa29AZXhhbXBsZS5uZXQACgkQqkPx3Mf+0beYKQgAp60uW2OmVAyaP2MC +F6alWqWVkxw66L6QW6ciOpiuqjEoc9TN6pNIIP+MeSPu+SE71kw4nD0Vvu5mgH/2 +74dZMf7vFX3vERL/g8u7lTOv2GkXyKpFKAwvMxqPJ7zKUH9z6LxeBc2tNImjQ4mS +7OL30n+SPrsY4FR3BS/d/EY2y+L9spi92oiJeXjgNHH7iIr5iWiSSXS7AwBla0zu +r+mkX2Aats488CEfENACugg79q7cNLpUioeKdOHcqDxCS9wSpYK5Y2+IBqmFEv6t +DKZ1iZnLlk6rHpkZ8aQi96PFbZVZPGnxsOFKkNPWwHjniKeJzoJwd7FqR5i2vrsJ +UiWYwA== +=gWAP +-----END PGP SIGNATURE----- diff --git a/tests/openpgp/samplemsgs/enc-1-key-1.asc b/tests/openpgp/samplemsgs/enc-1-key-1.asc new file mode 100644 index 0000000..bd65330 --- /dev/null +++ b/tests/openpgp/samplemsgs/enc-1-key-1.asc @@ -0,0 +1,9 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hF4DkYWHjk/NdMASAQdAPDV6Y3JTfAGDX8pfZcT6YggC7qV3g8B1ezijcfIcdVAw ++hCFGXS1EikBbZ21v79GtGh6Wp3fmyZFRQcsJZciLE/EFcbf9Mv4Q2qfRhKYHlqj +0lwBRYQrwTJbMNspOwd2MidjYYUxb/02PNiqZSrWUeX0iPsgHFToJol9RVAqs4Zz +bZNKL6y/GeRIRZY12Lzo2TIXSLfjvbMTdkoz53mMKiUXsi/fCKXkTmgIheni8w== +=kmqY +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/enc-1-key-2.asc b/tests/openpgp/samplemsgs/enc-1-key-2.asc new file mode 100644 index 0000000..e9e6e70 --- /dev/null +++ b/tests/openpgp/samplemsgs/enc-1-key-2.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAx13dhm+MQ15AQf8DKnGFmadCHP3k8blxdRa73pC3BL0fn9YSp2+EvKP7n4Y +KsVHmKSZ43RL2pq24y5CImLCu6gPkyFGzTn/vmxq8E2Ul8WOvyJiEuRTczNr5NNs +rZiF7dRMSjeZXCEHme24XIXKGzbnlkALHxh83GpgxVmLqKIlHEjgXYn9fneH85M4 +KTBxIxpAhIKzninnGk2ikmAS2C6z370tRLYP+tQ6gcP8BbehCZFM+TRqyS3aXjdq +WaV3OgY7uWzj4P0PBXBWx0V829tfgRF9Z70Zx+HA1BpOqvmOcsztah1Jq/pyAaeR +7t2FunUZuUwbBIYg67/cxStYAXF9ih70tjSRfYBiotLAEAEvZfW1G7lMnfFCWxx8 +S8L+AD+BEdycI/kUZhgxFVde985CSYcpIcQZE4IuTYCoc96ZXsvil5Zlf5I//KDz +toq+bxa+VU4Gr+h4lbcq8Sj8OPkx11/P4dOyydiYKLqEThig5l/h5IiROL8AvIMf +TpNhu8TnECbjaEDaDt3RE3vIFP7ZV8zfpsibSFDaK9K0UhniSt/wF4NekBltUcBc +kozlxWbvQ0k3A+xl1dBCBEpFaJrywRYFvz2sY5ISJS1X3ePJ4c9fsPXePTiy9a3W +ItE= +=rFeH +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/enc-2-keys-1.asc b/tests/openpgp/samplemsgs/enc-2-keys-1.asc new file mode 100644 index 0000000..abff596 --- /dev/null +++ b/tests/openpgp/samplemsgs/enc-2-keys-1.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAx13dhm+MQ15AQgAkI1KV+RVcuDJlzwXShDT9d2r+1GlV2r16z5vp0aDLETz +Ga+OCTSiDR8So9xqM8kNKp12t2OrhmIerYu3dHQxZAWuqbhj/xkxfh0OyAP2wZb4 +MtwXIcRKWgUz5pUPYcp/7+Eo/dlBs1QaqxF8Lnh5jAlpxDeQvfSgjTZicZAS0rtY +XONLWaX4nuuHb2DNrQWLDsMvDrwu8fJLPMNy7+tEzECs1G7Tv7D9xu/QHbGw6Zvk +fxjWlLsD2nUQYwn/GpqitD02y7BHDoZKXIO8GccHdPhPOxZHLCiGIHQ7r61ResHA +3SlqEsNF9OV81RaIg55ndM72ZLbDTC8ZQDIu/5cXaoReA5GFh45PzXTAEgEHQIFu +PbA2WmzBGnzmBfXmRg8AVKE2JVvSYLjBynfTPbtKMAUbz9U2grH/0BdZPWaGuYUh +HNPg9vmmzL5Ch3rSSunzhtxadesh/Gsic9ETkFz/d9K3AVzb9WEneFuEkk43lJAu +X+btUyQ8rBhkmBQPorvZN+1i+NL0XOP3UJ0iIpo3bn/J7Dy9IEDojQAFtdOBuw6F +hbWOMoRVodE5aA6JcRDR2HLj68X3TAou91a8krHJ8NAK84ilrZd07XEwGtNbaom5 +rZK9xNFIUV0Ddog6r5rJ/pqsN6o3iEYI2uhh0KYntbIHrRD05ZWRCXhQIGPb6qp8 +wEEydtbQpfJFRru8q7Y0V6MlzYflxI1H +=m6X7 +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/enc-2-keys-2.asc b/tests/openpgp/samplemsgs/enc-2-keys-2.asc new file mode 100644 index 0000000..ec6202c --- /dev/null +++ b/tests/openpgp/samplemsgs/enc-2-keys-2.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hF4DkYWHjk/NdMASAQdALju99o8iXdJNYTuUNrk3ZgfLNvw4GuaLed/2PDLbLUEw +LaFnwh5u4djUOPPtZHbNzmJimOobJxYg3gwDew3ERLBqweQqRcqFaypu9+Ss86Df +hQEMAx13dhm+MQ15AQgAwHCbQ5TeyLGsrs+oC/dB7AZphqWwsSoVXTuxAi3NPbEF +upvp3mu19HpBJFXijsjysaMbwUGB+DRVhMYwAANfnJJ2oxltNbhMeGic/vRsCjHx +cJhjv/T0Jc3Yuh3YFlp4V3wMiTa7METMBL/2CQtT+MSQbBubkegcNPBkB5ss1civ +WpQckerDKtv9ik0+gvYCgHw0wLyf7UmHRekiJigUats0IhEHoZYv/qa3kvcmJaKV +WffHsOwxoS0jCwj15eV2YHQVJp7nnyxXlX9E7z4gzjxH4MbXpi+tVvBLGM8pHEg6 +EJ3U7koABqQ8446CnWC+OJKWO5cHoJjkOSCGALDoENKRAenz/t9qGzMWPInAx2iH +lNg2brHS7UM8z53ESeqpYfaHS1QiMvtZWo8Wl9QPJa8vfrDw/bCtNALYU/OHw95N +k9E+/JgWk9oQFc+syNHDJzw0qfEzblxzng5/d6W8vjggFkIrKwMwE1/6x1w6ZLoV +MYG0TXjnLNBGzGCFRSoDx/RuzybgdDSySV/6OFfPAMSo1g== +=iPxe +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/enc-2-keys-hh-1.asc b/tests/openpgp/samplemsgs/enc-2-keys-hh-1.asc new file mode 100644 index 0000000..87822ad --- /dev/null +++ b/tests/openpgp/samplemsgs/enc-2-keys-hh-1.asc @@ -0,0 +1,20 @@ +This message has two anonymous recipients: + + public key is 0000000000000000 (steve.biko@example.net) + public key is 0000000000000000 (patrice.lumumba@example.net) + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAwAAAAAAAAAAAQf/YA9Ch/xoVYQmAEyo+9VqQxlvgYt23G/Vid3jgn0DFGp3 +DRyP8CVEn0ctGpb2kp8Cdgo+SMlO4WCIeVpYzZDCvHYwXSjh6EHMoLL/FVxyUh5q +fXiyXl9692r+ms1qzfqJvVSSAjn4PzH31gFG6iQIz5E0yPRpbaDHA+7UlofP4Gfs +AfidaVJuu9T7OIU50G554Lsjc3oXkr/m1OJDtNVABkkKLsC/bkVZKC6sTxFbmpXV +mYJqq2cBFC5QSE1NO3Gcj4jVhP8CWE2hymIdFtk0HBGiDLQESw9OUmF/MHD6g2Fw +NwVcH1pfzxXQYvygPPjaB0AiHR/52jsBifK/fG82R4ReAwAAAAAAAAAAEgEHQHTC +vCgH7xW/vw5NRqRLSGarsauU9gY3x9aslz65kmYNMNmfnuedeyTxNj/X2C99/iYp +BmofHiCYMkFjd5C0M/+mbGVQNdFwLG4WSSwXf3PkZtJoAXmj3A9opaFDmv51rs3a +05IOjuHScOpUSKbTCWLY+rrAlrYSNQ0ZEvBdqFUXmoKIrUu/BLBPw654zrxTrFiX +7cLcUlALJdQISuAEktJVb2E7dsrVFnLQsjJv+0EReH5FfSJRzqFaWjQ= +=NW7s +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/enc-2-keys-hr-1.asc b/tests/openpgp/samplemsgs/enc-2-keys-hr-1.asc new file mode 100644 index 0000000..00d387a --- /dev/null +++ b/tests/openpgp/samplemsgs/enc-2-keys-hr-1.asc @@ -0,0 +1,29 @@ +This message has one anonymous and one regular recipient: + + public key is 0000000000000000 (steve.biko@example.net) + public key is 9185878E4FCD74C0 (patrice.lumumba@example.net) + + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAwAAAAAAAAAAAQf8Cipp2jtLlN1R/MucnvTxzDPLqRg2drOqWkGMoKuUlSvC +OAzxliOgBLC9TfLxf/RP/v5KkRms1ovrXsm6bMuE59j04koJ1+K11IzO0jRSaFAI +Ij5RM3z4v27dAR7leE1x5QKrltyScxNA74CAXXEvzm/kyGl+efLeeeZcOrbGMxSz +vm2n9rc054bkqkIdJmqNkPlynD2Qo1oJUei0GAsV7s1IMB6dtqlGfSUJqmzYkNYt +pIRd36xq60m74BrincO5xFNbvaSleA+nzLRUVig5KpEODJBGCpraVPQsQjoFzR1M +CtjVVYUFo7s8QET87Wj7b07v06WpJ0e1Nt40zGqdtIReA5GFh45PzXTAEgEHQIA9 +Rwe1OkhWabVrw90AN5lmcTuruB2ANiW4pTiLVjpIMI1XNV9Ob1VysEUIqPIazZuF +unlbIgU1sme+TVLV3/P07C7xiLEGUGUlfOjp4oiIqdLBBAEwtSO3m58GWZurA+aD +K30EiHugSCdTYYdKQ6MbXNZxeLpCfslxzUAGwaXZDRemWrbTrBYXcC2+3Wz8R66S +a9phYUlVSWCODZkvQvKARaxdvLdqZWRqRxFy3D1YYnYEvmb4thPUuxAiPb/2pTxJ +j29hTuKDm3XJ5ZDDG1qlrPx71v1uBxUKBSZDd3YBPMxaLdia2fEmTYjnDN1Q6mzN +NicMjmQo45ekA/QOeBobXMEPFsUr87LCY93PuPTDgQIen64ynOsWsVXv3kTM9X8b +dmvj3MnKIWzDSIDXOKYvjnP4orCahHp/1qB/7obh2xoOS0qSMAphKaTnVhPAAQc5 +d5scPLWGe9GWKLpo7eh7yWrk04ryCbZNJOHjaKd2lwAbQ8ip9pA7dy387kUQsivh +iOljf9oHPhRY8KrcIZzBJiyasGQMox0/wabQtnPHVqUDJdruaPsnqgU0P1Ojc17a +b8cJYTk22pofDEs7oLcUeYZ8iTRpysSTCxydJwEmsj9n1lDW5M69KMlKLL0rZ0nv +9nh2WbuwEnA71DzFq3V++dA6+geno5/yCyt/qROJ8I7zqC0DPiMfdpIfOBsC7n0W +8hpDIps0 +=LChh +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/enc-2-keys-rh-1.asc b/tests/openpgp/samplemsgs/enc-2-keys-rh-1.asc new file mode 100644 index 0000000..1d864c3 --- /dev/null +++ b/tests/openpgp/samplemsgs/enc-2-keys-rh-1.asc @@ -0,0 +1,21 @@ +This message has one regular and one anonymous recipient: + + public key is 1D777619BE310D79 (steve.biko@example.net) + public key is 0000000000000000 (patrice.lumumba@example.net) + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAx13dhm+MQ15AQgAmDRRzNRfv/NXeJzBLOwcmBjWZ7UZAdr8Y5uqvOEdjIyj +XQlvH56/lNVa4WsGcxRWfNucFs78pxqAY3YulApIs1o/+WheCpPEvxMJ5Z+s14rg ++jV0H+oW9UkeIVCKeLlHrosbUbYM8cvzsHdNFm1U6MnqH1DNiyTtwgzA065kyRDQ +QwoCKf3Bsc+nmbfuWafdWDRwNptdE13JuRoFEd/KxhfXDhWF2r3ynM97erADTYMB +RXzOAuNxLxrgdjJ2KJoJu6KRVGMJk1ermzeV1wv3bnfME+QRtZ2Gzu3heAktR9Bj +gk4dOkEdYHQi7aYpoRaeWtK9An8FafLrEsbyYISNqoReAwAAAAAAAAAAEgEHQKD1 +Xk0mkgt/BPeRvR5giCsmMjniGdan99NWiiMJpcNNMOP65NimgxyOYDTbpsGl/tHY +qmNzNy1Wk1/ZRRAr4+K8ITs5lmuoDeVVkGQTE2ahRtKEARtFMKoRDYO5dEgadlnL +FdigDutyPLqVMaIwmx0HivjfXWEYyhBSXc0wwEvPhH76aBBOAnYZKKsLJVx+GoHp +Lxlvdz6CsOOKfgxY7PBjCEpS4aOtIYNenW6fHMYBVTrOXpNok7Q18rx1yNOxvT3X +g6zTetpqqM2SJKgSgRNsOobCDhqr +=jW0C +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/encsig-2-2-keys-3.asc b/tests/openpgp/samplemsgs/encsig-2-2-keys-3.asc new file mode 100644 index 0000000..e563e8d --- /dev/null +++ b/tests/openpgp/samplemsgs/encsig-2-2-keys-3.asc @@ -0,0 +1,35 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAx13dhm+MQ15AQf7B8SvOp1oKADLmqzPCJp8kLUvt2oemNHYvSU06gTlTT8m +DGJnA8a4S0+3q3Oqt/CObBX5tNr9KIB3OOgL8LujUffFVo2A6qfBWYnpyrDeJQOH +idilyZvAu4CdovVvp+2DxAfBYNb0jinIjZEcF3YuIFqk1o5n9Jx0C3LDMgQwjKkb +xEZeUkjt4i9Pb2JNP6+LQ8deDwLLcpS5ykP98MTHgG1OGw5QX1xxKArEq4YJXye3 +ubQBAifE3fGKswGiV5UuwrP3cB92KdtqYLCckrheDa96YJp7kZNDPFds4aqaD5i4 +Ps/bxXeZmeybhgxTT8Q1Ld7wUd+sFV36uRieHOMEIoReA5GFh45PzXTAEgEHQEyw +MoBXgqtfF8+TdiUcIqeH+eXNOHjqGujt00BRn8JTMJNuCXoMZDmu45AaXZqiYxov +TTfDyKGLVvaiTxEJdl/ty55X9C9ANppdFm3qZGZ6GdLqAQBRsaHHa5lSfUBrgJXC +DLidkt1TA0u7owjuWRkUDlzBt3lEcgYEFd6c2zy3wxljpU0zB/gEmlEQiQAYB9dR +alrnENgo93aExGoTW0LgsZlf1n8GuPCyK+3m+1+2ryr3qNreg69Y5HaW3aV4pEG/ +mMnxVffq0sJGtEQRAx8dESImO+jPVmdKx6JcGWQ4B3RmD3qzOgbGwRoeC+C/isV7 +t+VEC0iOlC+QyK7S1QgxcWwzl9ExSs1d+BM3cwNlwe2mLckgsayEUGXrafpifiTR +w1CSyt25fb23iwOu1XZeHGnth/XAAJQcUsi02E+fpMPyS4S0v71PBn8By7iXHE8W +stFZMP9Gcly6lh9qOFg108P+mIWOVj7xtCUMl0RRwxS2hrKypucJtPSmVZ6EgVok +8j0tNm5nSjLzQ4A8I+O20Tx0sPBjmvH3IbMNCvjAQp6gXYlDgiHv2zxAgHwNJjRh +ft1AJy/61HG3MtRNV1QP06l6tofGAzP4gBBqLJkVcK1bCGpx17LZ7t9GI573Y7Jr +CIFN+CUWqzN64Q90IMDFwOl2ghQGZsIRh0jG3wOjd3C5cFo176BJiAq5WVelVEO8 +A3J/xMofeDdAVTkbpDpW+rE66I5dBwa8s9ej1zTpM0hmbiON+Ld9cCW3VPuDjjj3 +pAndSOcbfoq0Qd1RwshQVpfJJYjuhz9qCdlp392KWSvwTD/YuMIZ+nudgxk9Vbu/ +Z3ro/ggyH0FmnaJ53GnJ3NjsiJkSbQ21fSw0zJDNabpwdVPSzSvPtflh1qKiU60M +eNI/QI6lKyZzwFCuAkcZKGWGQrDLjmbRtSMJHAw2cT1sQQJ5XtciiL+pOixawyNE +pTnYI4f/983JewwweUwFJ5GkD/uY6hM10b4OKpjjm8rfpBVmW8rsuAGa5sSOAZB4 +xt+u6/dzVDCdQKtYV4pQHsHahAAkIGT1pWi0PMyWM3deo3sGaiCGcpM7qpO2qE4b +paimL2Un0J1qPkr4cbykzzUx4U1zgHUHKDPhmSEtqLfPEd2DjUHsAvJZJFER4lD9 +yursATLzunEYiWUTuE6DKjcfQYPrAmat/mzquvf+oV5YgPvcY85U3t1XeyW9Zyip +APYSJdgYdN8Wemh21vvGj8B7xnWMaJlcbsCbvuu2GALUGQKbhYzV02lMPSbEUHRH +pRI8NviMcR4UD0/FK7g91I7yDqX6BLBckUw+W1KYKqVvlcMuDUOc5nQTxWXrPWJu +o6EU4sD4bDaFOdDW8cuSBhxiifU+I+1s89p6+6M/Qwenh0hTvUsQwpUx/cXwjNXT +0uRaIk/yjbEZj80lTKyAn1TvlJ4A2vYjscqfiiVYBU1/enfnsYgUf+TTK2qm3TtV +HiuLLNvE2uy2IQfeZ3DnzZlMoCY8PA67yQCxJXR/hVX+/hzlZ0PoPylkYejs +=yD/C +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/encsig-2-2-keys-4.asc b/tests/openpgp/samplemsgs/encsig-2-2-keys-4.asc new file mode 100644 index 0000000..1b63617 --- /dev/null +++ b/tests/openpgp/samplemsgs/encsig-2-2-keys-4.asc @@ -0,0 +1,33 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hF4DkYWHjk/NdMASAQdAtNe4V9DKNR+N65wm9hJk8xRewYZPhmWADCcFraD0rnUw +MWX9tj1E6GIKEhCAMomt/PoboZ8ncBJ4JZ/x4fltX5qsfIZkVqILolPAzrp5EbeE +hQEMAx13dhm+MQ15AQgAkQn04BIdVZ6w0q13WfIoSepk2aQs39E6rmfZRUUs5Axk +aTkHLQa3jSIpWXtSdrm5DBX0rhuNSiFk1h2pwc0OSnIhl6jxrjX1TN4dbXrtaJUz +rguevhF72sfksr7p5sy/yFF1DBv3Z6MRKyyt4FjpbhzczDU0BD4cz0IGMb5tHLB0 +kTS1pJYtkajuWEGiyfT2dR1g0SdNoVwXiu+Hw+buPabAdjgVKocyGmdbYr/ip88t +9o9AayTN2BH0z35YBwpdULcoM3Dww+sTcO2sG6xiy7E24t8RPFUQOfFm5vfmI8EH +Zy4nId6ZkGEdkzX2UkU6FvX5vvru76My07nqKENDBdLpAXp08EPSUkTgnl9d7Hyq +R1jMFiML3/QtMH7azdmjKdmkhrYPMgNoAiK1lO7pw3dU4eHfWDnPUWw8y/WHmoUT +lxtZunT8GUh8ZxXl+skOqy2UXHPPRSN602oqma+yYKZrzn8hQm7Rq/tbmFPRTE7V +cPCuRD0u3Rwnhldq//r5w6AgG1jKu0gXXzLYcubEl7S8fvXG/udSg1ASjhdhbYPD +larTKCby1fESurfhwFnyaIGPknpzGooGFU7sIkrjilNPfVGv8CC10yMp7jOM7nXH +hZ3w6JNHzB3UxlVjOjUkXFRxm3X4ydNXFgrp8soGyOnhjcUcN8A8gIXJoDQwB9G1 +STIilDwsBzFJOZfJSdy0/mjecvqT2slFsl3fjr0h0M2cTsYw1Ws5iG17HTJBVjpW +frmWVjGVLRXkLGkumNbLpGxImlz2wlvuSlk/mqgrbRyyz6ifEpQc2o7uFvT6BGTp +pG6qPafKLEAOkfOZGt/BKMsWESoOXlIa5B8B/4/t8me0Lni7RS09908ait1poKEM +cDYNPtClQlBLJB3GLxPDDUT1WNcEBc+vScU317S5BRgDXBdao16DLzoIoh0C8kYu +JBIQvXYLw23IBilHxzv0Fr/ta2joAUOnojNZMAaOawWj8i8/EwO2Hl0epx8Ww3ft +VMnCF3nVuAIhjYEEzYI90dzA35lcSyEcBDXKBUAnOLi0LhwySi3rzM/d0yxdDGZH +oPw2JQWpgCuv4OMin5YSRowUPhgFmltNc9I6qgVdy1vLKndC/OnCCtQj2OpUrYsH +l1H3ADreaiunjtCrFTGYLey4EK6koLcb+qdKAOkRTaH28nRQGEyzZ4U93mbTsNmJ +nAW4JCbZtMap9on9koJwiopEA+ONuktCD0j6RSAC+HdyhwN+MTWqCtTbO/tIvaqZ +HtAlhiHk3GSi/qaox5dLKZqu5pa92OwiZrS6vS+dWTQpmyCyHYZcglsaRiHAGIEB +3MVPKMvLgp5wV9uuSnr0aXaXoyEXjjMHbP8UnAxojnVxGJTOzsijE59ovddLgqUD +81jYd4K3XIX+aWy3GicJaiAgzOYwJzBrOLZFGIlm9HkXKwM2gqd6TNjKQHxS63o0 +H6vXirtZmnRfA2SnmkGACbwTEa7vKARt4W45rXXk1GiQcxV0U7QrdQ9jMHIPtJF+ +py8jqdfjnNsUNM7PyTVjB9nTk9V3BkwIjUs46R6LqElZsAQQGcVo/EzBoPhjNUaf +K+I= +=kQLr +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/encsig-2-keys-1.asc b/tests/openpgp/samplemsgs/encsig-2-keys-1.asc new file mode 100644 index 0000000..649921e --- /dev/null +++ b/tests/openpgp/samplemsgs/encsig-2-keys-1.asc @@ -0,0 +1,18 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAx13dhm+MQ15AQgAiZPJa/zmtJ6cDpHVze6zBS+4OCbGeEpzcHBkpWiLKV91 +6CiwLTtL6Fhs7P/i5lEUzWQnRp0IGmUe8Ft5tugAL3ibv3Xm9PstXPZ2Q6EGzDCY +98x1aQooSuiUwIB4uQ8zFqA2TYGNfRcDCGdHHLpWAps4F/QkZkQGEWmy7KQZetc+ +mLP6z04fQz5XemL0MaJcarLRE0OK8FI4+413DqQB3RyZsMFiFDAY46g3rA7xymuo +Elum8PjMDXtAEpYAs2NHR29okFMinB7rR/DFGabQtzWIJPlgyGOFUVXs7YWj0Git +SgEje73u8eEYAJYTpud1zup/KPUYOqJzyIMvOHDMz4ReA5GFh45PzXTAEgEHQGSH +2coczePYstzayq418VjtNF+0ohoFKm8lrR9THREYMFJ4oA6/e7r3g38CWlb8kKxN +butxPKCcO2OjZYU5PZMk03CwbpSWM0FTNJEzXfqdKtLAOgHgccG9wgBqAbcTejiX +FQBBsLXRybq8Bra8qW+RVJ5noCav3TH06h8ZVXz/jJMLSUfKt8l+xRQDkYZ88cN3 +GhWNSc1eBOjS8e3JwGYaGs4vuoRVECbzee1DWNk3CUQOgeqZKLoSYHDRwHMpzP/N +suXLpGTV7EoN4+qOcF5q/6cZV4gaGxgokoCUrM+IYfhOjmqK3lfo9/1GUxppyE+x +XsWKiUMta3tJ6zhWYJPCZCqIZvzmkSfk3pNtOnsmmhF9gzwN8ehi/FHGFyHc8/gW +qxx0KsCG7FO4Y514pdoa70KqA8QO63YjxTaFBH858yZr5ORlhzElwctgivU= +=cWGf +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/encsig-2-keys-2.asc b/tests/openpgp/samplemsgs/encsig-2-keys-2.asc new file mode 100644 index 0000000..4eee21d --- /dev/null +++ b/tests/openpgp/samplemsgs/encsig-2-keys-2.asc @@ -0,0 +1,18 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hF4DkYWHjk/NdMASAQdA9op1WNWUj4E0PZ2h33tolomYTag75nRNg8qLo/2xfXcw +QrekSuMoLtkv1KO6/tLIohqYYYdZL5cGadTxlBLyIEj32ISVj7El6DxJrmqKIK3y +hQEMAx13dhm+MQ15AQgAnY6drrcce7MeloBIECLSbFIDjKOloUT4xtqspTg3GM1d +wkXtTJOdEm1yLcNQsb+d8ZdZZfYZhotCyMlZ5QQtvf+0XOieb/FlitUI0twAMsj/ +kwjN9dop+KGLZadFoar5A8TBXUz25PfWmwEzz2qSmIPuoIUzhK90B3eGUG6foGzm +1zEAawfyJ9w7XVAV6pNGJWG2LHSQr2POaMbZs/3iqxQl8p2yb25SlKrg3I35UClZ +0FC9Hidw8bZ8/rZCyX9KYtHIENHzqT5+XEpaXwN4hBqwpVgUn6DcESv2BAR7KCHD +ZwRRNVZtUvrftj05UIxAgnSAdK5GAyhLfWjCsH5Q3tLAPQGFdlgyYU9q+hWrrqwW +1tAvUJQpSW97WyK1Aa9RJOLPNpfU1wzRGzzOuNuuqbL4l9OQktJ81Mihh4IWCXQD +4mN7+nvltCm13bANdujRvZstGGFefRiwkBlEQq9uQMM2SVXA+JAff+AvD5F1Ofq8 +DPVMf/WDsKcoTTdqJahk/zoX4yFHprS50tO2z0Mb9souX14+AN+JJzAGQaGRlXXD +TWeEkUXD18HcVzHfooqLUlYYr5zD2f2gNNVskPYH/iP3FGllvzBeQI1NCznAj+Zr +AdOEXHKOkCJmj2RKnxXeOWTJSczoBlQgIQGd/yP/2TPsGesd4SbqFStYuefEZtw= +=hq0A +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/encsig-2-keys-3.asc b/tests/openpgp/samplemsgs/encsig-2-keys-3.asc new file mode 100644 index 0000000..f10e92a --- /dev/null +++ b/tests/openpgp/samplemsgs/encsig-2-keys-3.asc @@ -0,0 +1,23 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAx13dhm+MQ15AQf+KX1A2pYF9HnvwZZU6kmiOKs6NL/d/8Y+kwfiLot5SnQW +S/2JJm0b7ijyxBOoTyXu8UOqyaPa/eIJWeMqNANExkX83S1hoKfzgrBluzZR4sUB +r6bZ5E26pn+gy+r1RvQJnxUWMX41ux+DSc+oqf36cZ5A4R1Ai6cD9jqW7vE0KINo +jn6Od45NHNG16Q7igH9HgJiOXaibHFyiAfV5du0XB0HxpBlBKIBSV/4ewFUzxVy+ +oR4/3F7SkaUtGwcEi+PUEU26KuYz2ltYA9Ex/yTd59YcYbPTiiq+ynGRpOTgB0ti +y7aYzJVOPWGCKn/TFy69QIoJZgcWTrmUJK39wxFNM4ReA5GFh45PzXTAEgEHQKqL +epFBazPDtJvYGye9GW9gHMSjuTFuEm3yuo6kPIggMBRK/vWfTa7emGniukdA/8Bn +hXrpSZUBab19RlT/mDhC8+CBE7MvEQMHsZvwsEWzt9LBAQFgEPLmrwSchnzw5+vN +bcfeBye2n5STluKZ5IrW4XwZAvmp54w2OI/FDzf5dL1r+KCNiZpcmVO6IVVbEIeL +eZj++YAPDS0cf/bPfWbyfvC/MLNM6IFICdkdlKQ30FC801Xv4OuXvgctjIkZBEDR +CkDvkyrIEUtN9jJaAWjP3KopsCsxGtZ/ZPVU2yv8ekPRZ1paUIb370/NhEz9l2kK +GwmqNm9g6/ekJwIF6kZKoEzncX7cpF0diSTHCyB/CsWc1ncWgn/nktZDsd7UicKP +ypHScloUZfXDiQBcKV+0p6BxYib1MJOFrRbJTu+0Xu3KjcbecQ/mymgfDlkVUwXP +QeGaQNUgQzO+iAW1hPH5Qf8eB8n2DlbqsFEWIXG7B3pGCI0eBWPeR/JpuCnIHMTh +50YOwGqNQLjqRnl6hFi8amSIK5jRvRMzRWYO8TSZaYVh7uLh83cKkSV2e7d2pax6 +CqubZsoiaX71x+r3NaPYf+4hzAQUxPDZET2hTR4GOeEGT14t9RhqMPLTS+f9Ij7D +/LbCpm6sc6eSmbKXZF/XAPpkBmnRIpgqJuA0TgNBnU7a0NEQP6nsicOpviH9SFEL +waeu +=6uha +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/encsig-2-keys-4.asc b/tests/openpgp/samplemsgs/encsig-2-keys-4.asc new file mode 100644 index 0000000..8937f5e --- /dev/null +++ b/tests/openpgp/samplemsgs/encsig-2-keys-4.asc @@ -0,0 +1,23 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hF4DkYWHjk/NdMASAQdAM+CNEu/KZIBKoKmvE96atl4CEdxThqamGsRt9IgeMxcw +Te0hTUQf5LrrK9MhGymBcB2nCCy0bPtqVhA8TdZ6y3CH0QYMObkbSbIcVnGaVmGd +hQEMAx13dhm+MQ15AQf9FcEbvw9ocsmqrteF2Cu6W2ChxrNy6ay0gcDwvd2QfbAE +muM+OcKrvXhgDikOt3gAv4ES+2/ACzsqIZZJGUVWlrkSXYq9Uon+YX1zeK3BfmOK +GvfLqc7p9x0YtrC8KEeMaqpd8z5bRhpF0ZPF4WbvZyiauDAa62FJiH/r4YngGLoY +2hXFNZ2FFHa2EuobUfJUJwfA7VC13IdvqZ76bixrSSjxJjhntiswxYQI+OaXnEg8 +S/UwxR06GT7vOra1O9TGIHYwTcRGQT/3NHcIO3aJMRCHVP2dOLBMkFqkYf44kGeA +e718nBN1UB7cfgv+n2bj7SYGdlEH0bmmpNTavEsDZdLBGQEcNlkdz3CqdqRhXUek +hoWzCKTzOhIkoIhdyZd0stBlYJ54dT+9470JogkVqkNCWjAP1svI6LprOAR5b1sV +m5ar5pCspumNRfMv6oDjXIsjCaux4zJfJV8XO38wmMn30eMPg1CzbKjhqMW+IfXe +Tn8yxDBVGScIKkmaks6AE1v9WtfBSz+zT8sFe1ZFUMRcJ4+vohYmLVZXqkXGFJu7 +F3j8URhctnGb88h33y2+xglaqptso7XpM91OR17e6Vhh4dNAWB/GdKy4VviVY3W+ +fJ+zoimrPTFmPo2Ag+mveTsnTzmGdy4FHDDQCKE6QVcJPfVcfN0+yiPIOx/XacZR +ZnQlI9Z+iYuN5yEchnVK65XZGQkdK+4/5Q/QGq7vLwaOHkMtItplIsretCGHAGEj +XcCeHIY4pVZOd8Of8CSSPvtcaz4+FbZ/cfKXXf1zjdxg5BRkVvBAAtAYqquDUPJn +qcG7tcUD6pQXVDHq+s0j8BofK9BXjjicrTI64RZw2RYntdbRSqd82offshvF4MJm +72hIMbg5ExZsvdUa+IcRw49PoX/fEhKkmElZCI+5fsMG/NJuTfAtNjG5RbdgrYzQ +eR6eIMr6BnY9ZZQRPbuv0te4di55B+HqmTry +=/grx +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/encz0-1-key-1.asc b/tests/openpgp/samplemsgs/encz0-1-key-1.asc new file mode 100644 index 0000000..cf534db --- /dev/null +++ b/tests/openpgp/samplemsgs/encz0-1-key-1.asc @@ -0,0 +1,12 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hF4DkYWHjk/NdMASAQdAPo9H2rEUOisFYLfLQu91wGJCSIGs9jFiYwQsKlhsZlMw +itRELU7+unvpPp8bIINqu4X6FP7hDzkZjOlQM/5JS0Z/q2jaWo4av8DCxYCK+yHU +0sATAZtMvHD99HWEAis3GUlFBzf/jxPBmayNElVyifc5eH4d2pRfCqlZPx9gKX69 +OYymTKuUkkmzCgBxVfA7XPdIdqTmDbSjVwQ2LFeB8hQv6PsYFHY1vqs4xVmeotIu +pgG1a40+6f8HC9YDNn2lUzktui/mi/VNqDwV9vOHYklGqpVDd81nHAl1wGkAzgBs +8sYAcQjRAArAPKBaPTCtn6PZF4p4sDcabGImGR8cWwZHb9yxkHIomJRHUVTF1Uz4 +MUANuPQHpJE4eqKHUaE6wyTXyGEqJQ== +=UB/1 +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/encz0-1-key-2.asc b/tests/openpgp/samplemsgs/encz0-1-key-2.asc new file mode 100644 index 0000000..a885f5b --- /dev/null +++ b/tests/openpgp/samplemsgs/encz0-1-key-2.asc @@ -0,0 +1,13 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAx13dhm+MQ15AQf/WO25gVi//kxCs0RH+BbJ5OWRRkyZ5fD7mYUs6anJ/zRE +SE/SKwNk4KsWi4ajRR7b7txj7HQN8l6RpjUFXDJwd0onkb5JoCcvVIdaSTRR8z3s +5tkI/KTkPhlDPN+E5jCllUnJNSLoUwIIMw5Zgn0gRXxZeR6pUCB00+GmSPpoV+6X +pEk8yuP5gcCFz2uiPmRl6QBezq6QLwlzYS6Kj+m2k2zqgEEgBc31aVnze8FTElbf +Mm2wQ+w50PVaqHKkH7206PMIAd3Jsv2QP4XfgDDRxOe1/s6dHiCOfnhdrx/Fblp2 +VjluZFc/yL2YfofqqEWAxLLzh47aVN6JLr3bhdAVvNJEATedhlr+GTfhfI+KYO9r +rZlP9aDHzvMKkqyX4WDD0O6a+698AnoseFVmrrBIsokdIt1RjLcpycE4BsCQOXHe +EDBJtGo= +=O1Fl +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/issue2419.asc b/tests/openpgp/samplemsgs/issue2419.asc new file mode 100644 index 0000000..b73efed --- /dev/null +++ b/tests/openpgp/samplemsgs/issue2419.asc @@ -0,0 +1,7 @@ +-----BEGIN PGP ARMORED FILE----- +Version: GnuPG v2 +Comment: Use "gpg --dearmor" for unpacking + +AA== +=YWnT +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/samplemsgs/revoke-2D727CC768697734.asc b/tests/openpgp/samplemsgs/revoke-2D727CC768697734.asc new file mode 100644 index 0000000..f20029c --- /dev/null +++ b/tests/openpgp/samplemsgs/revoke-2D727CC768697734.asc @@ -0,0 +1,8 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: This is a revocation certificate + +iGAEIBECACAWIQSg/0WQu2Ei7e9uPFQtcnzHaGl3NAUCWEaoMAIdAAAKCRAtcnzH +aGl3NISuAJ9rsxoazHvPs89Ki33o/SgKMjOg/wCggbFG8V5wXU1njwuiviPUKap3 +uqA= +=79yW +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/samplemsgs/sig-1-key-1.asc b/tests/openpgp/samplemsgs/sig-1-key-1.asc new file mode 100644 index 0000000..875cf83 --- /dev/null +++ b/tests/openpgp/samplemsgs/sig-1-key-1.asc @@ -0,0 +1,8 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iHsEABYIACMFAldqTEMcHHBhdHJpY2UubHVtdW1iYUBleGFtcGxlLm5ldAAKCRAT +lWNoKgINCu0XAQC6VSdsGyTbvFPp5e6BmkmBzPcb5Kex4ar722k0jzhLzgD+Js2q +Y1JIdjfW4GnFhdzqyUbuGTlk1wNY7Re1uNyD6gw= +=c0oW +-----END PGP SIGNATURE----- diff --git a/tests/openpgp/samplemsgs/sig-1-key-2.asc b/tests/openpgp/samplemsgs/sig-1-key-2.asc new file mode 100644 index 0000000..f7ae120 --- /dev/null +++ b/tests/openpgp/samplemsgs/sig-1-key-2.asc @@ -0,0 +1,12 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iQE0BAABCAAeBQJXaky2FxxzdGV2ZS5iaWtvQGV4YW1wbGUubmV0AAoJEKpD8dzH +/tG3LSUH+gJ++JOZuy5GfHwK+5GEGmeVbex4U9N84tYYAwZOsOpQsh4JxT44IH8S +OG9OViY9xUaUmeSvVsuDR890RiZtKOXO3hCMwUo+HCDFLXgIXxosLlS55G1vfi8X +NPl78Y9NFdtwtAkirpOT0oULJcbZ9NItkPjhoxZ16TlgG3GUE6lZzlZJLFAVCw7u +6twOtPnq1AB4xB49rsIIW1XhCNrajwzBCghhl/PD4uM7ptSpGkZur5uOJ7nLjNEM +Qo1mF+jQ6rjWA4OrvpmtW482yvNWejAS+JMlhNcP63hlBySjX3tFhGm8tWtUauCT +3Ky7iF4dFFmhpIXUBT6mMmci4WdA3gE= +=VdOj +-----END PGP SIGNATURE----- diff --git a/tests/openpgp/samplemsgs/sig-2-keys-1.asc b/tests/openpgp/samplemsgs/sig-2-keys-1.asc new file mode 100644 index 0000000..8c767b2 --- /dev/null +++ b/tests/openpgp/samplemsgs/sig-2-keys-1.asc @@ -0,0 +1,15 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iHsEABYIACMFAldqTMccHHBhdHJpY2UubHVtdW1iYUBleGFtcGxlLm5ldAAKCRAT +lWNoKgINCgcQAP0f1yNJcHiBvy3nK7SSuzBf1EgSpy/lFlVSjZ1e/7CEKQD/W68C +Zs8iGAyZplpsXKoz/g7LWSU5z/K3lLWwfre7gAGJATQEAAEIAB4FAldqTMcXHHN0 +ZXZlLmJpa29AZXhhbXBsZS5uZXQACgkQqkPx3Mf+0bdg8wf/ff4tEMfqdwk1dXJm +4+iyrNvKyCfv/T5W8BVL16wc8jn+80HJkHK/pSw5Rr6nsEf1P00u5AnothUPfUl2 +Yqvjg4+oQYvutePo1uLq0LA1lyWfQ1PV6I14B/dd9rBYdPjYIJJsPjr/k5N3Qz9M +8RNtDp/rPDVNVHzDbZN77oGE2jokGRfodRo6qnurqU4CnJYinrnzKV4wqrilNKlE +R2CBieb3riDFUH59PH9S9fHuTHBV7q0HlxNJkI6NeoFwtRcS2f8P5B7FK7VCMrUB +R46JExeWhvUlY2ZkKLU98bI3TLnFD0aQHRzKgJj8sWjD+Akzf408EmnOIyyf6MF8 +H7uIHg== +=ErBQ +-----END PGP SIGNATURE----- diff --git a/tests/openpgp/samplemsgs/sig-2-keys-2.asc b/tests/openpgp/samplemsgs/sig-2-keys-2.asc new file mode 100644 index 0000000..16ae64c --- /dev/null +++ b/tests/openpgp/samplemsgs/sig-2-keys-2.asc @@ -0,0 +1,15 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iQE0BAABCAAeBQJXakzUFxxzdGV2ZS5iaWtvQGV4YW1wbGUubmV0AAoJEKpD8dzH +/tG3B8EH/247hq+cJ8eR8eXb1mv1Bdj9SwYI4yDs/xCZ7FIkU8vVSRYQpeYz59ie +3WZw8Cj1Sd44tr3+viVK682lWXwpHIAl3xUizP+HTFs23tfyH3er7IhDO/aApZ+V +Wd+0oDJY7E/ztsD3CpU50ptKU9D72CgJT8K1/pwBtivzOiMto/scPwVFNDzGlny8 +FC06j+2FyXFkXCLwvz/Xdk+hJmv8lQRGNxnSIB5bU+0/GLEd9wJUFTV3WSs5enEM +zqtGBh6v395BXnqrDHpOmT+EkWrpBOSo5vkPZrbN4bOC9nKSa9isCvU/+fjHW3Dn +GpHVTH1hCWsKRhQjxuOOq/X21YpvgJ2IewQAFggAIwUCV2pM1BwccGF0cmljZS5s +dW11bWJhQGV4YW1wbGUubmV0AAoJEBOVY2gqAg0KPJMA/0+3s4HPotwYw8K8pug3 +7Mxgd9LNIBi/d0nSpBnZTHySAQDURAoIZp0IZI/PS7Jc9A8M3TgWdm1LUkj+qU9x +3L6RCQ== +=3oWb +-----END PGP SIGNATURE----- diff --git a/tests/openpgp/samplemsgs/signed-1-key-1.asc b/tests/openpgp/samplemsgs/signed-1-key-1.asc new file mode 100644 index 0000000..d71c74d --- /dev/null +++ b/tests/openpgp/samplemsgs/signed-1-key-1.asc @@ -0,0 +1,15 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +owGbwMvMwMG4yvnjneP/Lm5nPJ2exBCe5XbZI7E8O7UyVb1YwTk/LzmntDgzP8+K +i9OzBCiSl1+ikJpYXKlQkq9QkJMIpDNSFZJz8svzFMozUvMUKvNL1ctSFdKByoAq +ikrzwArKM/JzUrk4kzOLkkuL9bg6GU1YGBg5GORYmUD2icsUl6SWpeolZWbnO6RW +JOYW5KTq5aWWMHBxCsAcl9zJ/od/6lrXa9snvZR9wrpXuEblNq/F3pzYWed8DZd8 +aApUzgkTy1K64+QU7HuL525G4vM3Yibfvq+VLTf/aFx46FSc7I2MpE2vElhvztZ5 +8SQ2ZWe7m5apT9qu7UfXyhrxxfutyt+ot3daXp3hyxuVPzdfKD147N8djoc5634y +6n9Uvfa7Uec030zZjae3VHScMDY1tD7yQjrFNnXptYQXP+RPtD1l+Kn33I87jeHT +SYnUk8r3zD71zahJbfZYwem0c+WbOzs/+qQeKeE/kaL+Y8GHeY9vbkq6eGNKWag+ +Y+Ydhac6bccZHEpXHFBfy3iBJ9OrZub93Oulx4Tnz5U5tZuL31VZOSzlyESvoJeb +/0kDAA== +=T94L +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/signed-1-key-2.asc b/tests/openpgp/samplemsgs/signed-1-key-2.asc new file mode 100644 index 0000000..64483fb --- /dev/null +++ b/tests/openpgp/samplemsgs/signed-1-key-2.asc @@ -0,0 +1,12 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +owGbwMvMwCEmPDU5Q4uJl4vx9AG9JIbwLLcnnCHl+Qq5qXkKOfn52akpCvmlJQpp +Rfm5CiUZqQoFRZnF+XkKSYlFxTpcnP55qQrFieUKuaUpurpcnCFABflAVUVgweIS +oCI9Li6//HKFnNQSoJEK6UCqJCOzWKEoMz2jxEqhBGgTxMTUomKFxKJUsJ2Zeelg +S0H2lWfmpeSX63GFZ2TmAA0H2pefBpLIVShPLIarTixRSMzJAWsAOkVBVxfMhDgF +pCc9v0QhI7OEKzMPLJGRmpiix9VRzcIgxsGgzMoE8rWMTEFiSVFmcqpeTmluaW5S +okNqRWJuQU6qXl5qCQMXpwAsoD78YWRY1rZ/7kOLr4GrbvSU6HqKnVy6+1BllLYd +c5ebbu2ltZ89GRkOBN6327Z+J4eaa5ppOGeA08P8xgvlcft8tz5u9i7jncwKAA== +=uuW/ +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/signed-2-keys-1.asc b/tests/openpgp/samplemsgs/signed-2-keys-1.asc new file mode 100644 index 0000000..38d25b1 --- /dev/null +++ b/tests/openpgp/samplemsgs/signed-2-keys-1.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +owGbwMvMwMG4yvnjneP/Lm5nmADiiglPTc7QYuLlYjwdm8QQnuVu45iTo+CWmZeY +npOq4JNYXqyQm1ipkJSqkFRZkFhcnJoCZCjkpCYW5WXmpSuUZKQqFGfmFgDVJhaV +KOSnKaTkA8W5yjNLMvJLS4DymXnZQAE9ro5qFgYxDgZlViaQJTIyBYklRZnJqXo5 +pbmluUmJDqkViSBj9PJSSxi4OAVgzpoVw/A/fBVnTGzGFd0DUzZcu6HNcm/6mpaZ +CeuOc+89eOsmg9YGRYb/5U3LTx4pf5Ru3ceW/X+Vkdq22kuGCxqaVwYJHZSL/xfN +08lowsLAyMEgB7FdXKa4JLUsVS8pMzsf3WJY8LR2sv/P9VLy+VZyrvhebd6WMyoz +V/kIXW+p2WbcI1vw58xdofBbU9eHtM2Y47ft6Bm5bS0NL6d6zzl7YsfLl5qKLFJb +s/cVKFe1MM7POqrEqzEr7cqe3amsN08ntDsvbLr3tc1ATKhTgMVKMIhjznseR54F +L1tyl7eUv96SYCbIf+uzu5vZnjWHvulP1zm579qel7afa77Enc94Nnn+U4Xf7F8W +PA5Kumj01S639ux3PcYFLR9+tey0bTDyNPhkqiddvLY9O8ztd94SDw4ph4+bbol+ +5S1+5dJ1vl1w7VSbtSf5dPfV1uxLr7UQnvGiwplnVpzt8XOvFXbHZ6yx2Hm52Kry +0TndFZfZqkRzFGxn7bkOAA== +=iswv +-----END PGP MESSAGE----- diff --git a/tests/openpgp/samplemsgs/signed-2-keys-2.asc b/tests/openpgp/samplemsgs/signed-2-keys-2.asc new file mode 100644 index 0000000..5219e13 --- /dev/null +++ b/tests/openpgp/samplemsgs/signed-2-keys-2.asc @@ -0,0 +1,24 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +owFdk21sFFUUhqcf4O7wIQQLpi71skoKZFj4wUdrgiwYxVaUFrZUvkzuzJ7ZuezM +3M3Mnd2OEpNiTVGTQlSKUn+A1WjBBFMDRIWAKG0qJYEWhVKgkECqBkrQ8AM1u96Z +hVT9NTmZc573ve+5d8eEIiEwdcpORZtTOEEUdnhlwb5n7lzqzp49XHDqV1mo37xi +ZTC8jjrIAGxKiKjI5QXWdZpBTANkYJuBhRhFMiDHVEia6JJXMgsw85pFbLqI6nGU +wS7iEzpJgi0hbMa9NmLaju73WShOEiZhruSBTeTDXRQHMHyMSpg3oAG2kEZslCaQ +QVTlzcRM2EvDYjBc6xAGvi2FmszClhtByDfv2IyTVOCivhQxGSQsXwzbtmNwhOgd +TMNpGP3p6eWnOGe549v8D4tbMqmsc4pJGZJdkRiEYcZpvkWaMZEXlAycS6jFKVX3 +A7QAJcBkOqCMBrzgnvmARZ2EJolktClFde9M/27iKVOHaaMxZYiuIwsUyuN7FfKj +tpiijAsQvioXZajFNDcvzwfiFGzP8SiC+DXC9/fJU1H5J+YtWhJxPjV/HSqAjlQL +wMsmSZSkf1CeYYQvIDh3LopRA62msswXK6FwNWGcIzsJVAOW6hgQFt8qWFAsFASE +sjGF3u2aFuKCaYjIJEmj0ICNlA4RE5ggBic9uIpd6kPZyjdLVjSdbP+96b2J2rhc +6bKGZXtvnJv+1L7wY4MZdSC06tOxx74KzS7rosOTWn6MbN8wPHT1txnNVwJjRnpz +j7wxs7uxV5+8dsPWRzsbetK3bx0emD0wuWfhJ92pNT8fbNh1oO5O1clXbo9r6u96 +ePDQ3ujiwc9PPP3n+x+t7r320xKnONu3deXGlmhh4+nhDyraXv871ifYtUvGt7Wd +jw0PdexeVDLyS1Wd3tizqXx/y/XpFaj1h7e3dLofJ7+YX8NK9xRFrweaZ/4hvTy2 +dekL+w+tiu3JFlX2GJ+VH6m7cXHdc3drl3//+MXO6tx3E53si32nDo7ULO5o73qp +XbnUG2xtP13XX7roKB3Z9lqxMDUgPJFPLRRKYWYRBSK6YziGjP8f3YNHXV4v5BTt +5qbStev/6ghX7xz/4e4jQ09Wtm5898Ss4LfbmkswuyDkttyc9807ZRfmfX3m+Vv1 +/bO+HIzB9sv3pGjwzHGlv+JZ8R8= +=pstx +-----END PGP MESSAGE----- diff --git a/tests/openpgp/seat.scm b/tests/openpgp/seat.scm new file mode 100755 index 0000000..5cbfbe1 --- /dev/null +++ b/tests/openpgp/seat.scm @@ -0,0 +1,31 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking encryption, signing, and producing armored output" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg usrpass1 '(--yes -seat -r two@example.com --passphrase-fd "0")) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-weak-identity source))) + plain-files) diff --git a/tests/openpgp/secdemo.asc b/tests/openpgp/secdemo.asc new file mode 100644 index 0000000..343453c --- /dev/null +++ b/tests/openpgp/secdemo.asc @@ -0,0 +1,737 @@ +26 demo keys (passphrase is "abc"): + +sec 1024D/68697734 1999-03-08 Alpha Test (demo key) <alpha@example.net> +uid Alice (demo key) +uid Alfa Test (demo key) <alfa@example.net> +ssb 1024g/46A871F8 1999-03-08 +sec 1024D/1AFDAB6C 1999-03-08 Charlie Test (demo key) <charlie@example.net> +ssb 1024g/BC43DA60 1999-03-08 +sec 1024D/FAEF6D1B 1999-03-08 Echo Test (demo key) <echo@example.net> +uid Eve (demo key) +uid Echelon (demo key) +ssb 1024g/7272144D 1999-03-08 +sec 1024D/8FC282E6 1999-03-08 Golf Test (demo key) <golf@example.net> +ssb 1024g/9DCAD354 1999-03-08 +sec 1024D/04259677 1999-03-08 India Test (demo key) <india@example.net> +ssb 1024g/61F76C73 1999-03-08 +sec 1024D/43C2D0C7 1999-03-08 Kilo Test (demo key) <kilo@example.net> +ssb 1024g/9AF64D02 1999-03-08 +sec 1024D/A9E3B0B2 1999-03-08 Bravo Test (demo key) <bravo@example.net> +uid Bob (demo key) +ssb 1024g/E29BA37F 1999-03-08 +sec 1024D/EB9DC9E6 1999-03-08 Delta Test (demo key) <delta@example.net> +ssb 1024g/B0C45424 1999-03-08 +sec 1024D/7372E243 1999-03-08 Foxtrot Test (demo key) <foxtrot@example.net> +ssb 1024g/EE45198E 1999-03-08 +sec 1024D/34C6E3F1 1999-03-08 Hotel Test (demo key) <hotel@example.net> +ssb 1024g/D622AD0A 1999-03-08 +sec 1024D/D2699313 1999-03-08 Juliet Test (demo key) <juliet@example.net> +ssb 1024g/35F8F136 1999-03-08 +sec 1024D/B79103F8 1999-03-08 Lima Test (demo key) <lima@example.net> +ssb 1024g/FE56350C 1999-03-08 +sec 1024D/BE5CF886 1999-03-08 Mike Test (demo key) <mike@example.net> +uid Mallory (demo key) +ssb 1024g/4F31EAE8 1999-03-08 +sec 1024D/30CEC684 1999-03-08 November Test (demo key) <november@example.net> +ssb 1024g/8B70E472 1999-03-08 +sec 1024D/6D9732AC 1999-03-08 Oscar Test (demo key) <oscar@example.net> +ssb 1024g/2681619F 1999-03-08 +sec 1024D/3FF13206 1999-03-08 Papa test (demo key) <papa@example.net> +ssb 1024g/63330D9C 1999-03-08 +sec 1024D/3C661C84 1999-03-08 Quebec Test (demo key) <quebec@example.net> +ssb 1024g/A029ACF4 1999-03-08 +sec 1024D/777FBED3 1999-03-08 Romeo Test (demo key) <romeo@example.net> +ssb 1024g/11D102EA 1999-03-08 +sec 1024D/A3AE3EA1 1999-03-08 Sierra Test (demo key) <sierra@example.net> +ssb 1024g/0F1B50B4 1999-03-08 +sec 1024D/85A81F38 1999-03-08 Tango Test (demo key) <tango@example.net> +ssb 1024g/101C0402 1999-03-08 +sec 1024D/653244D6 1999-03-08 Uniform Test (demo key) <uniform@example.net> +ssb 1024g/5522BDB9 1999-03-08 +sec 1024D/61F04784 1999-03-08 Victor Test (demo key) <victor@example.org> +ssb 1024g/07287134 1999-03-08 +sec 1024D/EC67DBDE 1999-03-08 Whisky Test (demo key) <whisky@example.net> +ssb 1024g/FD6E27F6 1999-03-08 +sec 1024D/567FB34A 1999-03-08 XRay Test (demo key) <xray@example.net> +ssb 1024g/41E408BE 1999-03-08 +sec 1024D/4B11B25F 1999-03-08 Yankee Test (demo key) <yankee@example.net> +ssb 1024g/F7B080AD 1999-03-08 +sec 1024D/54ACD246 1999-03-08 Zulu Test (demo key) <zulu@example.net> +ssb 1024g/A172C881 1999-03-08 + +-----BEGIN PGP PRIVATE KEY BLOCK----- +Version: GnuPG v0.9.3 (GNU/Linux) +Comment: For info see http://www.gnupg.org + +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 +=P9+G +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/secring.asc b/tests/openpgp/secring.asc new file mode 100644 index 0000000..99e02ca --- /dev/null +++ b/tests/openpgp/secring.asc @@ -0,0 +1,73 @@ +This is a test secret keyring simply stored by GNUPG so that it is +easier to make diff files. + +sec 1024D/D74C5F22 2003-12-31 Test one (pp=def) <one@example.com> +ssb 1024g/47BE2775 2003-12-31 + +sec 1024D/C40FDECF 2003-12-31 Test two (no pp) <two@example.com> +ssb 1024g/B27907AA 2003-12-31 + +sec 1024R/ECABF51D 2003-12-31 Test three (no pp) <three@example.com> + +-----BEGIN PGP PRIVATE KEY BLOCK----- +Version: GnuPG v1.3.5-cvs (GNU/Linux) + +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 +IHWHiQ== +=52aT +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/secring.skr.asc b/tests/openpgp/secring.skr.asc new file mode 100644 index 0000000..0081b59 --- /dev/null +++ b/tests/openpgp/secring.skr.asc @@ -0,0 +1,27 @@ +This is a test secring generated by pgp 5 beta + +Type Bits KeyID Created Expires Algorithm Use +sec+ 768 439F02CA 1998-03-17 ---------- DSS Sign and Encrypt +sub 768 CB879DE9 1998-03-17 ---------- Diffie-Hellman +uid pgp5 test <pgp5@dev.null> + +There is no password on the key + +-----BEGIN PGP ARMORED FILE----- +Version: GNUPG v0.2.13a (Linux) +Comment: This is an alpha version! +Comment: Use "gpgm --dearmor" for unpacking + +lQFbBDUOrE4RAwDbbxWAbWsheUJprK6VryMTpwDiYwMfL+92nrHqSfPqlpMWgDTia8qnpRSXbyEm +Sppp/6/Ygp+N3n32Kznq7PjHXiuWLlZGvZMtzmvaMA17y0GY6oLBxS7rhASXIKa9hEUAoP+KBFly +qNMdsK8j+ZO0A8rnImGrAwC1ddDme5iZFkTEWHhrtU97sEu2GDkSQB8HdX8CoRcrOz/B2WliF6qf +BKhcZPFVBIhKNzjTfY7SEYAZk2zcsCm8elnwSLaGEzxKFNFBqKDNXP+a35spcqsHSGzDVw4VuKMD +AJNnAP6skpHlhVAmecLZT9eRzVoOq1ivUIntK2Mh47qsL74q6BBwz2sviPU2Y3pDlbb6Ed0qJAXv +dCT24hlfoGoXzkoDInkPJTJeL0gCnwmQPjvXFFd71Cvg5LaL4lIQLQAAn3GbgsWo+7E/hWakzstp +TXzI2kDIDIm0GXBncDUgdGVzdCA8cGdwNUBkZXYubnVsbD6dAO8ENQ6sVhADAP8Fa5TbD6k8VmW1 +IjK1DfDI0xUdsVIbk8N3Hb0YIlT1E/6tZdfiNwqaKVQcf17gJIObBwfNM3OqWYOudmBVd3S6E3Hk +u64nW+ZNt7B2toWRgnk6OgHcSDsud4Igjwz/RQACAgL/ToefzlcVKiPuobKfXHDhIUQPTfGic2Az +47wkMoYHo9j9ZE7AWaliMdPz4jLyLfqqoU9mH8g+vJhyAc7UnAF2Sk5466FDypdPm5F9PTW3cqqI +wJM4WgkSlM8J2hxH4YtlAADlG+pxFXNFuDPmcq6jL6dug2ikZ7hcHLAy7DddSS8OAA== +=1UWo +-----END PGP ARMORED FILE----- diff --git a/tests/openpgp/setup.scm b/tests/openpgp/setup.scm new file mode 100755 index 0000000..22c89a3 --- /dev/null +++ b/tests/openpgp/setup.scm @@ -0,0 +1,49 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) + +(define cache (flag "--create-tarball" *args*)) +(unless (and cache (= 1 (length cache))) + (fail "Usage: setup.scm --create-tarball <file> [--use-keyring]")) + +(when (> (*verbose*) 0) + (define (pad symbol length) + (let loop ((cs (string->list (symbol->string symbol))) + (result (make-string length #\space)) + (i 0)) + (if (null? cs) + result + (begin + (string-set! result i (car cs)) + (loop (cdr cs) result (+ 1 i)))))) + (log " I am going to use these tools:\n" + "==============================") + (for-each + (lambda (t) + (log (pad t 25) (tool t))) + '(gpgconf gpg gpg-agent scdaemon gpgsm dirmngr gpg-connect-agent + gpg-preset-passphrase gpgtar pinentry))) + +(setenv "GNUPGHOME" (getcwd) #t) +(create-gpghome) +(start-agent) +(create-legacy-gpghome) +(stop-agent) +(call-check `(,(tool 'gpgtar) --create --output ,(car cache) ".")) diff --git a/tests/openpgp/shell.scm b/tests/openpgp/shell.scm new file mode 100644 index 0000000..347b3a0 --- /dev/null +++ b/tests/openpgp/shell.scm @@ -0,0 +1,53 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) + +;; This is not a test, but can be used to inspect the test +;; environment. Simply execute +;; +;; make -Ctests/openpgp check XTESTS=shell.scm +;; +;; to run it. + +(if (prompt-yes-no? "Load legacy test environment" #t) + (setup-legacy-environment) + (setup-environment)) + +(if (prompt-yes-no? "Drop 'batch' from gpg.conf" #t) + (apply create-file + (cons "gpg.conf" + (filter (lambda (line) (not (equal? "batch" line))) + (string-split-newlines + (call-with-input-file "gpg.conf" read-all))))) + (begin + (echo "Note that gpg.conf includes 'batch'. If you want to use gpg") + (echo "interactively you should drop that."))) + +;; Add paths to tools to PATH. +(setenv "PATH" (pathsep-join + (append (map (lambda (t) (dirname (tool t))) + '(gpg gpg-agent scdaemon gpgsm dirmngr gpgconf)) + (pathsep-split (getenv "PATH")))) + #t) + +(echo "\nEnjoy your test environment. " + "Type 'exit' to exit it, it will be cleaned up after you.\n") + +(interactive-shell) diff --git a/tests/openpgp/signdemokey b/tests/openpgp/signdemokey new file mode 100755 index 0000000..13c5784 --- /dev/null +++ b/tests/openpgp/signdemokey @@ -0,0 +1,16 @@ +#!/bin/sh + +set -e + +if [ $# != 3 ]; then + echo "Usage: signdemokey name user_id user_id_no" + exit 1 +fi +name="$1" +user_id="$2" +user_id_no="$3" + +echo "abc" | ../g10/gpg --options ./gpg.conf --homedir $name \ + --sign-key --batch --yes --passphrase-fd 0 $user_id \ + $user_id_no sign save + diff --git a/tests/openpgp/signed-messages.scm b/tests/openpgp/signed-messages.scm new file mode 100644 index 0000000..d012f2f --- /dev/null +++ b/tests/openpgp/signed-messages.scm @@ -0,0 +1,281 @@ +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +;; A plain signed message created using +;; echo abc | gpg --homedir . --passphrase-fd 0 -u Alpha -z0 -sa msg +(define msg_ols_asc " +-----BEGIN PGP MESSAGE----- + +kA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdo +dC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0 +aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBh +cmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRp +cmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVk +IG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQM +UlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0 +D8luT78c/1x45Q== +=a29i +-----END PGP MESSAGE----- +") + +;; A plain signed message created using +;; echo abc | gpg --homedir . --passphrase-fd 0 -u Alpha -sa msg +(define msg_cols_asc " +-----BEGIN PGP MESSAGE----- + +owGbwMvMwCSoW1RzPCOz3IRxLSN7EnNucboLT6Cgp0JJRmZeNpBMLFFIzMlRKMpM +zyjRBQtm5qUrFKTmF+SkKmTmgdQVKyTnl+aVFFUqJBalKhRnJmcrJOalcJVkFqWm +KOSnKSSlgrSU5OekQMzLL0rJzEsEKk9JTU7NK4EZBtKcBtRRWgAzlwtmbnlmSQbU +GJjxCmDj9RQUPNVzFZJTi0oSM/NyKhXy8kuAYk6lJSBxLlTF2NziqZCYq8elq+Cb +n1dSqRBQWZKRn8fVYc/MygAKBljYCDIFiTDMT+9seu836Q+bevyHTJ0dzPNuvCjn +ZpgrwX38z58rJsfYDhwOSS4SkN/d6vUAAA== +=s6sY +-----END PGP MESSAGE----- +") + +;; A PGP 2 style message. +(define msg_sl_asc " +-----BEGIN PGP MESSAGE----- + +iD8DBQBEDFJaLXJ8x2hpdzQRAkeCAKCZRBk2Pmx4w9h2LgosS0AppNNaWwCgiI5M +yzgJpGTZtA/Jbk+/HP9ceOWtAQdiA21zZ0QMUlpJIHRoaW5rIHRoYXQgYWxsIHJp +Z2h0LXRoaW5raW5nIHBlb3BsZSBpbiB0aGlzIGNvdW50cnkgYXJlIHNpY2sgYW5k +CnRpcmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBvcmRpbmFyeSBkZWNlbnQgcGVvcGxl +IGFyZSBmZWQgdXAgaW4gdGhpcwpjb3VudHJ5IHdpdGggYmVpbmcgc2ljayBhbmQg +dGlyZWQuICBJJ20gY2VydGFpbmx5IG5vdC4gIEJ1dCBJJ20Kc2ljayBhbmQgdGly +ZWQgb2YgYmVpbmcgdG9sZCB0aGF0IEkgYW0uCi0gTW9udHkgUHl0aG9uCg== +=0ukK +-----END PGP MESSAGE----- +") + +;; An OpenPGP message lacking the onepass packet. We used to accept +;; such messages but now consider them invalid. +(define bad_ls_asc " +-----BEGIN PGP MESSAGE----- + +rQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdodC10aGlua2luZyBwZW9w +bGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0aXJlZCBvZiBiZWluZyB0 +b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBhcmUgZmVkIHVwIGluIHRo +aXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRpcmVkLiAgSSdtIGNlcnRh +aW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVkIG9mIGJlaW5nIHRvbGQg +dGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQMUlotcnzHaGl3NBECR4IA +oJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0D8luT78c/1x45Q== +=Mpiu +-----END PGP MESSAGE----- +") + + +;; A signed message prefixed with an unsigned literal packet. +;; (fols = faked-literal-data, one-pass, literal-data, signature) +;; This should throw an error because running gpg to extract the +;; signed data will return both literal data packets +(define bad_fols_asc " +-----BEGIN PGP MESSAGE----- + +rF1iDG1zZy51bnNpZ25lZEQMY0x0aW1lc2hhcmluZywgbjoKCUFuIGFjY2VzcyBt +ZXRob2Qgd2hlcmVieSBvbmUgY29tcHV0ZXIgYWJ1c2VzIG1hbnkgcGVvcGxlLgqQ +DQMAAhEtcnzHaGl3NAGtAQdiA21zZ0QMUlpJIHRoaW5rIHRoYXQgYWxsIHJpZ2h0 +LXRoaW5raW5nIHBlb3BsZSBpbiB0aGlzIGNvdW50cnkgYXJlIHNpY2sgYW5kCnRp +cmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBvcmRpbmFyeSBkZWNlbnQgcGVvcGxlIGFy +ZSBmZWQgdXAgaW4gdGhpcwpjb3VudHJ5IHdpdGggYmVpbmcgc2ljayBhbmQgdGly +ZWQuICBJJ20gY2VydGFpbmx5IG5vdC4gIEJ1dCBJJ20Kc2ljayBhbmQgdGlyZWQg +b2YgYmVpbmcgdG9sZCB0aGF0IEkgYW0uCi0gTW9udHkgUHl0aG9uCog/AwUARAxS +Wi1yfMdoaXc0EQJHggCgmUQZNj5seMPYdi4KLEtAKaTTWlsAoIiOTMs4CaRk2bQP +yW5Pvxz/XHjl +=UNM4 +-----END PGP MESSAGE----- +") + +;; A signed message suffixed with an unsigned literal packet. +;; (fols = faked-literal-data, one-pass, literal-data, signature) +;; This should throw an error because running gpg to extract the +;; signed data will return both literal data packets +(define bad_olsf_asc " +-----BEGIN PGP MESSAGE----- + +kA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdo +dC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0 +aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBh +cmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRp +cmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVk +IG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQM +UlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0 +D8luT78c/1x45axdYgxtc2cudW5zaWduZWREDGNMdGltZXNoYXJpbmcsIG46CglB +biBhY2Nlc3MgbWV0aG9kIHdoZXJlYnkgb25lIGNvbXB1dGVyIGFidXNlcyBtYW55 +IHBlb3BsZS4K +=3gnG +-----END PGP MESSAGE----- +") + + +;; Two standard signed messages in a row +(define msg_olsols_asc_multiple " +-----BEGIN PGP MESSAGE----- + +kA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdo +dC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0 +aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBh +cmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRp +cmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVk +IG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQM +UlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0 +D8luT78c/1x45ZANAwACES1yfMdoaXc0Aa0BB2IDbXNnRAxSWkkgdGhpbmsgdGhh +dCBhbGwgcmlnaHQtdGhpbmtpbmcgcGVvcGxlIGluIHRoaXMgY291bnRyeSBhcmUg +c2ljayBhbmQKdGlyZWQgb2YgYmVpbmcgdG9sZCB0aGF0IG9yZGluYXJ5IGRlY2Vu +dCBwZW9wbGUgYXJlIGZlZCB1cCBpbiB0aGlzCmNvdW50cnkgd2l0aCBiZWluZyBz +aWNrIGFuZCB0aXJlZC4gIEknbSBjZXJ0YWlubHkgbm90LiAgQnV0IEknbQpzaWNr +IGFuZCB0aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgSSBhbS4KLSBNb250eSBQeXRo +b24KiD8DBQBEDFJaLXJ8x2hpdzQRAkeCAKCZRBk2Pmx4w9h2LgosS0AppNNaWwCg +iI5MyzgJpGTZtA/Jbk+/HP9ceOU= +=8nLN +-----END PGP MESSAGE----- +") + +;; A standard message with two signatures (actually the same signature +;; duplicated). +(define msg_oolss_asc " +-----BEGIN PGP MESSAGE----- + +kA0DAAIRLXJ8x2hpdzQBkA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGlu +ayB0aGF0IGFsbCByaWdodC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5 +IGFyZSBzaWNrIGFuZAp0aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkg +ZGVjZW50IHBlb3BsZSBhcmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJl +aW5nIHNpY2sgYW5kIHRpcmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdt +CnNpY2sgYW5kIHRpcmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5 +IFB5dGhvbgqIPwMFAEQMUlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk +01pbAKCIjkzLOAmkZNm0D8luT78c/1x45Yg/AwUARAxSWi1yfMdoaXc0EQJHggCg +mUQZNj5seMPYdi4KLEtAKaTTWlsAoIiOTMs4CaRk2bQPyW5Pvxz/XHjl +=KVw5 +-----END PGP MESSAGE----- +") + +;; A standard message with two one-pass packet but only one signature +;; packet +(define bad_ools_asc " +-----BEGIN PGP MESSAGE----- + +kA0DAAIRLXJ8x2hpdzQBkA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGlu +ayB0aGF0IGFsbCByaWdodC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5 +IGFyZSBzaWNrIGFuZAp0aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkg +ZGVjZW50IHBlb3BsZSBhcmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJl +aW5nIHNpY2sgYW5kIHRpcmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdt +CnNpY2sgYW5kIHRpcmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5 +IFB5dGhvbgqIPwMFAEQMUlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk +01pbAKCIjkzLOAmkZNm0D8luT78c/1x45Q== +=1/ix +-----END PGP MESSAGE----- +") + +;; Standard cleartext signature +(define msg_cls_asc " +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +I think that all right-thinking people in this country are sick and +tired of being told that ordinary decent people are fed up in this +country with being sick and tired. I'm certainly not. But I'm +sick and tired of being told that I am. +- - Monty Python +-----BEGIN PGP SIGNATURE----- + +iD8DBQFEDVp1LXJ8x2hpdzQRAplUAKCMfpG3GPw/TLN52tosgXP5lNECkwCfQhAa +emmev7IuQjWYrGF9Lxj+zj8= +=qJsY +-----END PGP SIGNATURE----- +") + +;; Cleartext signature with two signatures +(define msg_clss_asc " +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +What is the difference between a Turing machine and the modern computer? +It's the same as that between Hillary's ascent of Everest and the +establishment of a Hilton on its peak. +-----BEGIN PGP SIGNATURE----- + +iD8DBQFEDVz6LXJ8x2hpdzQRAtkGAKCeMhNbHnh339fpjNj9owsYcC4zBwCfYO5l +2u+KEfXX0FKyk8SMzLjZ536IPwMFAUQNXPr+GAsdqeOwshEC2QYAoPOWAiQm0EF/ +FWIAQUplk7JWbyRKAJ92ZJyJpWfzb0yc1s7MY65r2qEHrg== +=1Xvv +-----END PGP SIGNATURE----- +") + +;; Two clear text signatures in a row +(define msg_clsclss_asc_multiple (string-append msg_cls_asc msg_clss_asc)) + + +;; An Ed25519 cleartext message with an R parameter of only 247 bits +;; so that the code to re-insert the stripped zero byte kicks in. The +;; S parameter has 253 bits but that does not strip a full byte. +;; +;; Note that the message has a typo ("the the"), but this should not +;; be fixed because it breaks this test. +(define msg_ed25519_rshort " +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +Dear Emily: + I'm still confused as to what groups articles should be posted +to. How about an example? + -- Still Confused + +Dear Still: + Ok. Let's say you want to report that Gretzky has been traded from +the Oilers to the Kings. Now right away you might think rec.sport.hockey +would be enough. WRONG. Many more people might be interested. This is a +big trade! Since it's a NEWS article, it belongs in the news.* hierarchy +as well. If you are a news admin, or there is one on your machine, try +news.admin. If not, use news.misc. + The Oilers are probably interested in geology, so try sci.physics. +He is a big star, so post to sci.astro, and sci.space because they are also +interested in stars. Next, his name is Polish sounding. So post to +soc.culture.polish. But that group doesn't exist, so cross-post to +news.groups suggesting it should be created. With this many groups of +interest, your article will be quite bizarre, so post to talk.bizarre as +well. (And post to comp.std.mumps, since they hardly get any articles +there, and a \"comp\" group will propagate your article further.) + You may also find it is more fun to post the article once in each +group. If you list all the newsgroups in the same article, some newsreaders +will only show the the article to the reader once! Don't tolerate this. + -- Emily Postnews Answers Your Questions on Netiquette +-----BEGIN PGP SIGNATURE----- + +iJEEARYIADoWIQSyHeq0+HX7PaQvHR0TlWNoKgINCgUCV772DhwccGF0cmljZS5s +dW11bWJhQGV4YW1wbGUubmV0AAoJEBOVY2gqAg0KMAIA90EtUwAja0iJGpO91wyz +GLh9pS5v495V0r94yU6uUyUA/RT/StyPWe1wbnEZuacZnLbUV6Yy/aTXCVAlxf0r +TusO +=vQ3f +-----END PGP SIGNATURE----- +") + +;; An Ed25519 cleartext message with an S parameter of only 248 bits +;; so that the code to re-insert the stripped zero byte kicks in. +(define msg_ed25519_sshort " +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +All articles that coruscate with resplendence are not truly auriferous. +-----BEGIN PGP SIGNATURE----- + +iJEEARYIADoWIQSyHeq0+HX7PaQvHR0TlWNoKgINCgUCV771QhwccGF0cmljZS5s +dW11bWJhQGV4YW1wbGUubmV0AAoJEBOVY2gqAg0KHVEBAI66OPDYXKWO3r6SaFT+ +uxmh8x4ZerW41vMA9gkJ4AEKAPjoe/Z7fDqo1lCptIFutFAGbfNxcm/53prfx2fT +GisM +=L7sk +-----END PGP SIGNATURE----- +") diff --git a/tests/openpgp/signencrypt-dsa.scm b/tests/openpgp/signencrypt-dsa.scm new file mode 100755 index 0000000..1a8f9df --- /dev/null +++ b/tests/openpgp/signencrypt-dsa.scm @@ -0,0 +1,49 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking signing and encryption using DSA" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg usrpass1 `(--yes --passphrase-fd "0" -se + -u ,dsa-usrname1 + --recipient ,dsa-usrname2)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + (append plain-files data-files)) + +(define algos (if (have-hash-algo? "RIPEMD160") + '("SHA1" "RIPEMD160") + '("SHA1"))) +(for-each-p + "Checking signing and encryption using DSA with a specific hash algorithm" + (lambda (hash) + (tr:do + (tr:open (car plain-files)) + (tr:gpg usrpass1 `(--yes --passphrase-fd "0" -se + -u ,dsa-usrname1 + --recipient ,dsa-usrname2 + --digest-algo ,hash)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity (car plain-files)))) + algos) diff --git a/tests/openpgp/signencrypt.scm b/tests/openpgp/signencrypt.scm new file mode 100755 index 0000000..c00e370 --- /dev/null +++ b/tests/openpgp/signencrypt.scm @@ -0,0 +1,41 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking signing and encryption" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg usrpass1 `(--yes --passphrase-fd "0" -se --recipient ,usrname2)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + (append plain-files data-files)) + +(info "Checking bug 537: MDC problem with old style compressed packets.") +(lettmp (tmp) + (call-popen `(,@GPG --yes --passphrase-fd "0" + --output ,tmp --decrypt ,(in-srcdir "tests" "openpgp" + "bug537-test.data.asc")) + usrpass1) + (if (not (string=? "4336AE2A528FAE091E73E59E325B588FEE795F9B" + (cadar (gpg-hash-string `(--print-md SHA1 ,tmp) "")))) + (fail "bug537-test.data.asc: mismatch (bug 537)"))) diff --git a/tests/openpgp/sigs-dsa.scm b/tests/openpgp/sigs-dsa.scm new file mode 100755 index 0000000..82dc624 --- /dev/null +++ b/tests/openpgp/sigs-dsa.scm @@ -0,0 +1,44 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking signing using DSA with the default hash algorithm" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg "" `(--yes --sign --user ,dsa-usrname1)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + (append plain-files data-files)) + +(define algos (if (have-hash-algo? "RIPEMD160") + '("SHA1" "RIPEMD160") + '("SHA1"))) +(for-each-p + "Checking signing using DSA with a specific hash algorithm" + (lambda (hash) + (tr:do + (tr:open (car plain-files)) + (tr:gpg "" `(--yes --sign --user ,dsa-usrname1 --digest-algo ,hash)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity (car plain-files)))) + algos) diff --git a/tests/openpgp/sigs.scm b/tests/openpgp/sigs.scm new file mode 100755 index 0000000..2b1cf3c --- /dev/null +++ b/tests/openpgp/sigs.scm @@ -0,0 +1,51 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(for-each-p + "Checking signing with the default hash algorithm" + (lambda (source) + (tr:do + (tr:open source) + (tr:gpg "" '(--yes --sign)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity source))) + (append plain-files data-files)) + +(for-each-p + "Checking signing with a specific hash algorithm" + (lambda (hash) + (if (have-pubkey-algo? "RSA") + ;; RSA key, so any hash is okay. + (tr:do + (tr:open (car plain-files)) + (tr:gpg "" `(--yes --sign --user ,usrname3 --digest-algo ,hash)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity (car plain-files)))) + (if (not (equal? "MD5" hash)) + ;; Using the DSA sig key - only 160 bit or larger hashes + (tr:do + (tr:open (car plain-files)) + (tr:gpg usrpass1 + `(--yes --sign --passphrase-fd "0" --digest-algo ,hash)) + (tr:gpg "" '(--yes --decrypt)) + (tr:assert-identity (car plain-files))))) + (force all-hash-algos)) diff --git a/tests/openpgp/ssh-export.scm b/tests/openpgp/ssh-export.scm new file mode 100755 index 0000000..136c6e0 --- /dev/null +++ b/tests/openpgp/ssh-export.scm @@ -0,0 +1,52 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-environment) + +(define key + `(,(in-srcdir "tests" "openpgp" "samplekeys" "authenticate-only.sec.asc") + "927EF377FD1A1B6F795E40C02A87917D8FFBA49F" + "72360FDB6380212D5DAF2FA9E51185A9253C496D" + "ssh-rsa")) + +(define :file car) +(define :fpr cadr) +(define :subkey-fpr caddr) +(define :kind cadddr) + +;; Return true if a-str and b-str share a suffix of length n. +(define (string-common-suffix? n a-str b-str) + (let ((a-len (string-length a-str)) + (b-len (string-length b-str))) + (if (> n (min a-len b-len)) + #f + (string=? (substring a-str (- a-len n) a-len) + (substring b-str (- b-len n) b-len))))) + +(info "Checking ssh export...") +(call-check `(,@GPG --yes --import ,(:file key))) + +(let* ((result (call-check `(,@GPG --export-ssh-key ,(:fpr key)))) + (parts (string-splitp (string-trim char-whitespace? result) + char-whitespace? -1))) + (assert (string=? (car parts) (:kind key))) + ;; XXX: We should not use a short keyid as the comment when + ;; exporting an ssh key. + (assert (string-common-suffix? 8 (caddr parts) (:subkey-fpr key)))) diff --git a/tests/openpgp/ssh-import.scm b/tests/openpgp/ssh-import.scm new file mode 100755 index 0000000..555f198 --- /dev/null +++ b/tests/openpgp/ssh-import.scm @@ -0,0 +1,101 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-environment) + +(setenv "SSH_AUTH_SOCK" + (call-check `(,(tool 'gpgconf) --null --list-dirs agent-ssh-socket)) + #t) + +(define path (string-split (getenv "PATH") *pathsep*)) +(define ssh #f) +(catch (skip "ssh not found") (set! ssh (path-expand "ssh" path))) + +(define ssh-add #f) +(catch (skip "ssh-add not found") + (set! ssh-add (path-expand "ssh-add" path))) + +(define ssh-keygen #f) +(catch (skip "ssh-keygen not found") + (set! ssh-keygen (path-expand "ssh-keygen" path))) + +(define ssh-version-string + (:stderr (call-with-io `(,ssh "-V") ""))) + +(log "Using" ssh "version:" ssh-version-string) + +(define ssh-version + (let ((tmp ssh-version-string) + (prefix "OpenSSH_")) + (unless (string-prefix? tmp prefix) + (skip "This doesn't look like OpenSSH:" tmp)) + (string->number (substring tmp (string-length prefix) + (+ 3 (string-length prefix)))))) + +(define (ssh-supports? algorithm) + ;; We exploit ssh-keygen as an oracle to test what algorithms ssh + ;; supports. + (cond + ((equal? algorithm "ed25519") + ;; Unfortunately, our oracle does not work for ed25519 because + ;; this is a specific curve and not a family, so the key size + ;; parameter is ignored. + (>= ssh-version 6.5)) + (else + ;; We call ssh-keygen with the algorithm to test, specify an + ;; invalid key size, and observe the error message. + (let ((output (:stderr (call-with-io `(,ssh-keygen + -t ,algorithm + -b "1009") "")))) + (log "(ssh-supports?" algorithm "), ssh algorithm oracle replied:" output) + (not (string-contains? output "unknown key type")))))) + +(define keys + '(("dsa" "9a:e1:f1:5f:46:ea:a5:06:e1:e2:f8:38:8e:06:54:58") + ("rsa" "c9:85:b5:55:00:84:a9:82:5a:df:d6:62:1b:5a:28:22") + ("ecdsa" "93:37:30:a6:4e:e7:6a:22:79:77:8e:bf:ed:14:e9:8e") + ("ed25519" "08:df:be:af:d2:f5:32:20:3a:1c:56:06:be:31:0f:bf"))) + +(for-each-p' + "Importing ssh keys..." + (lambda (key) + (let ((file (path-join (in-srcdir "tests" "openpgp" "samplekeys") + (string-append "ssh-" (car key) ".key"))) + (hash (cadr key))) + ;; We pipe the key to ssh-add so that it won't complain about + ;; file's permissions. + (pipe:do + (pipe:open file (logior O_RDONLY O_BINARY)) + (pipe:spawn `(,SSH-ADD -))) + (unless (string-contains? (call-popen `(,SSH-ADD -l "-E" md5) "") hash) + (fail "key not added")))) + car (filter (lambda (x) (ssh-supports? (car x))) keys)) + +(info "Checking for issue2316...") +(unlink (path-join GNUPGHOME "sshcontrol")) +(pipe:do + (pipe:open (path-join (in-srcdir "tests" "openpgp" "samplekeys") + (string-append "ssh-rsa.key")) + (logior O_RDONLY O_BINARY)) + (pipe:spawn `(,SSH-ADD -))) +(unless + (string-contains? (call-popen `(,SSH-ADD -l "-E" md5) "") + "c9:85:b5:55:00:84:a9:82:5a:df:d6:62:1b:5a:28:22") + (fail "known private key not (re-)added to sshcontrol")) diff --git a/tests/openpgp/tofu.scm b/tests/openpgp/tofu.scm new file mode 100755 index 0000000..cd4b4c7 --- /dev/null +++ b/tests/openpgp/tofu.scm @@ -0,0 +1,420 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(load (with-path "time.scm")) +(setup-environment) + +(define GPGTIME 1480943782) + +;; Generate a --faked-system-time parameter for a particular offset. +(define (faketime delta) + (string-append "--faked-system-time=" (number->string (+ GPGTIME delta)))) + +;; Redefine GPG without --always-trust and a fixed time. +(define GPG `(,(tool 'gpg) --no-permission-warning ,(faketime 0))) + +(catch (skip "Tofu not supported") + (call-check `(,@GPG --trust-model=tofu --list-config))) + +(let ((trust-model (gpg-config 'gpg "trust-model"))) + (trust-model::update "tofu")) + +(define KEYS '("1C005AF3" "BE04EB2B" "B662E42F")) + +;; Import the test keys. +(for-each (lambda (keyid) + (call-check `(,@GPG --import + ,(in-srcdir "tests" "openpgp" "tofu" "conflicting" + (string-append keyid ".gpg")))) + (catch (fail "Missing key" keyid) + (call-check `(,@GPG --list-keys ,keyid)))) + KEYS) + +;; Get tofu policy for KEYID. Any remaining arguments are simply +;; passed to GPG. +;; +;; This function only supports keys with a single user id. +(define (getpolicy keyid . args) + (let ((policy + (list-ref (assoc "tfs" (gpg-with-colons + `(--with-tofu-info + ,@args + --list-keys ,keyid))) 5))) + (unless (member policy '("auto" "good" "unknown" "bad" "ask")) + (fail "Bad policy:" policy)) + policy)) + +;; Check that KEYID's tofu policy matches EXPECTED-POLICY. Any +;; remaining arguments are simply passed to GPG. +;; +;; This function only supports keys with a single user id. +(define (checkpolicy keyid expected-policy . args) + (let ((policy (apply getpolicy `(,keyid ,@args)))) + (unless (string=? policy expected-policy) + (fail keyid ": Expected policy to be" expected-policy + "but got" policy)))) + +;; Set key KEYID's policy to POLICY. Any remaining arguments are +;; passed as options to gpg. +(define (setpolicy keyid policy . args) + (call-check `(,@GPG ,@args + --tofu-policy ,policy ,keyid))) + +(info "Checking tofu policies and trust...") + +;; Carefully remove the TOFU db. +(catch '() (unlink (path-join GNUPGHOME "tofu.db"))) + +;; Verify a message. There should be no conflict and the trust +;; policy should be set to auto. +(call-check `(,@GPG --verify ,(in-srcdir "tests" "openpgp" "tofu" "conflicting" "1C005AF3-1.txt"))) + +(checkpolicy "1C005AF3" "auto") +;; Check default trust. +(checktrust "1C005AF3" "m") + +;; Trust should be derived lazily. Thus, if the policy is set to +;; auto and we change --tofu-default-policy, then the trust should +;; change as well. Try it. +(checktrust "1C005AF3" "f" '--tofu-default-policy=good) +(checktrust "1C005AF3" "-" '--tofu-default-policy=unknown) +(checktrust "1C005AF3" "n" '--tofu-default-policy=bad) +(checktrust "1C005AF3" "q" '--tofu-default-policy=ask) + +;; Change the policy to something other than auto and make sure the +;; policy and the trust are correct. +(for-each-p + "Setting a fixed policy..." + (lambda (policy) + (let ((expected-trust + (cond + ((string=? "good" policy) "f") + ((string=? "unknown" policy) "-") + (else "n")))) + (setpolicy "1C005AF3" policy) + + ;; Since we have a fixed policy, the trust level shouldn't + ;; change if we change the default policy. + (for-each-p + "" + (lambda (default-policy) + (checkpolicy "1C005AF3" policy + '--tofu-default-policy default-policy) + (checktrust "1C005AF3" expected-trust + '--tofu-default-policy default-policy)) + '("auto" "good" "unknown" "bad" "ask")))) + '("good" "unknown" "bad")) + +;; At the end, 1C005AF3's policy should be bad. +(checkpolicy "1C005AF3" "bad") + +;; 1C005AF3 and BE04EB2B conflict. A policy setting of "auto" +;; (BE04EB2B's state) will result in an effective policy of ask. But, +;; a policy setting of "bad" will result in an effective policy of +;; bad. +(setpolicy "BE04EB2B" "auto") +(checkpolicy "BE04EB2B" "ask") +(checkpolicy "1C005AF3" "bad") + +;; 1C005AF3, B662E42F, and BE04EB2B conflict. We change BE04EB2B's +;; policy to auto and leave 1C005AF3's policy at bad. This conflict +;; should cause BE04EB2B's effective policy to be ask (since it is +;; auto), but not affect 1C005AF3's policy. +(setpolicy "BE04EB2B" "auto") +(checkpolicy "BE04EB2B" "ask") +(call-check `(,@GPG --verify ,(in-srcdir "tests" "openpgp" "tofu" "conflicting" "B662E42F-1.txt"))) +(checkpolicy "BE04EB2B" "ask") +(checkpolicy "1C005AF3" "bad") +(checkpolicy "B662E42F" "ask") + +;; Check that the stats are emitted correctly. + +(display "Checking TOFU stats...\n") + +(define (check-counts keyid expected-sigs expected-sig-days + expected-encs expected-enc-days . args) + (let* + ((tfs (assoc "tfs" + (gpg-with-colons + `(--with-tofu-info ,@args --list-keys ,keyid)))) + (sigs (string->number (list-ref tfs 3))) + (sig-days (string->number (list-ref tfs 11))) + (encs (string->number (list-ref tfs 4))) + (enc-days (string->number (list-ref tfs 12))) + ) + ; (display keyid) (display ": ") (display tfs) (display "\n") + (unless (= sigs expected-sigs) + (fail keyid ": # signatures (" sigs ") does not match expected" + "# signatures (" expected-sigs ").\n")) + (unless (= sig-days expected-sig-days) + (fail keyid ": # signature days (" sig-days ")" + "does not match expected" + "# signature days (" expected-sig-days ").\n")) + (unless (= encs expected-encs) + (fail keyid ": # encryptions (" encs ") does not match expected" + "# encryptions (" expected-encs ").\n")) + (unless (= enc-days expected-enc-days) + (fail keyid ": # encryption days (" encs ")" + "does not match expected" + "# encryption days (" expected-enc-days ").\n")) + )) + +;; Carefully remove the TOFU db. +(catch '() (unlink (path-join GNUPGHOME "tofu.db"))) + +(check-counts "1C005AF3" 0 0 0 0) +(check-counts "BE04EB2B" 0 0 0 0) +(check-counts "B662E42F" 0 0 0 0) + +;; Verify a message. The signature count should increase by 1. +(call-check `(,@GPG --verify ,(in-srcdir "tests" "openpgp" "tofu" "conflicting" "1C005AF3-1.txt"))) + +(check-counts "1C005AF3" 1 1 0 0) + +;; Verify the same message. The signature count should remain the +;; same. +(call-check `(,@GPG --verify ,(in-srcdir "tests" "openpgp" "tofu" "conflicting" "1C005AF3-1.txt"))) +(check-counts "1C005AF3" 1 1 0 0) + +;; Verify another message. +(call-check `(,@GPG --verify ,(in-srcdir "tests" "openpgp" "tofu" "conflicting" "1C005AF3-2.txt"))) +(check-counts "1C005AF3" 2 1 0 0) + +;; Verify another message. +(call-check `(,@GPG --verify ,(in-srcdir "tests" "openpgp" "tofu" "conflicting" "1C005AF3-3.txt"))) +(check-counts "1C005AF3" 3 1 0 0) + +;; Verify a message from a different sender. The signature count +;; should increase by 1 for that key. +(call-check `(,@GPG --verify ,(in-srcdir "tests" "openpgp" "tofu" "conflicting" "BE04EB2B-1.txt"))) +(check-counts "1C005AF3" 3 1 0 0) +(check-counts "BE04EB2B" 1 1 0 0) +(check-counts "B662E42F" 0 0 0 0) + +;; Verify another message on a new day. (Recall: we are interested in +;; when the message was first verified, not when the signer claimed +;; that it was signed.) +(call-check `(,@GPG ,(faketime (days->seconds 2)) + --verify ,(in-srcdir "tests" "openpgp" "tofu" "conflicting" "1C005AF3-4.txt"))) +(check-counts "1C005AF3" 4 2 0 0) +(check-counts "BE04EB2B" 1 1 0 0) +(check-counts "B662E42F" 0 0 0 0) + +;; And another. +(call-check `(,@GPG ,(faketime (days->seconds 2)) + --verify ,(in-srcdir "tests" "openpgp" "tofu" "conflicting" "1C005AF3-5.txt"))) +(check-counts "1C005AF3" 5 2 0 0) +(check-counts "BE04EB2B" 1 1 0 0) +(check-counts "B662E42F" 0 0 0 0) + +;; Another, but for a different key. +(call-check `(,@GPG ,(faketime (days->seconds 2)) + --verify ,(in-srcdir "tests" "openpgp" "tofu" "conflicting" "BE04EB2B-2.txt"))) +(check-counts "1C005AF3" 5 2 0 0) +(check-counts "BE04EB2B" 2 2 0 0) +(check-counts "B662E42F" 0 0 0 0) + +;; And add a third day. +(call-check `(,@GPG ,(faketime (days->seconds 4)) + --verify ,(in-srcdir "tests" "openpgp" "tofu" "conflicting" "BE04EB2B-3.txt"))) +(check-counts "1C005AF3" 5 2 0 0) +(check-counts "BE04EB2B" 3 3 0 0) +(check-counts "B662E42F" 0 0 0 0) + +(call-check `(,@GPG ,(faketime (days->seconds 4)) + --verify ,(in-srcdir "tests" "openpgp" "tofu" "conflicting" "BE04EB2B-4.txt"))) +(check-counts "1C005AF3" 5 2 0 0) +(check-counts "BE04EB2B" 4 3 0 0) +(check-counts "B662E42F" 0 0 0 0) + +;; Check that we detect the following attack: +;; +;; Alice and Bob each have a key and cross sign them. Bob then adds a +;; new user id, "Alice". TOFU should now detect a conflict, because +;; Alice only signed Bob's "Bob" user id. + +(display "Checking cross sigs...\n") +(define GPG `(,(tool 'gpg) --no-permission-warning + --faked-system-time=1476304861)) + +;; Carefully remove the TOFU db. +(catch '() (unlink (path-join GNUPGHOME "tofu.db"))) + +(define DIR "tofu/cross-sigs") +;; The test keys. +(define KEYA "1938C3A0E4674B6C217AC0B987DB2814EC38277E") +(define KEYB "DC463A16E42F03240D76E8BA8B48C6BD871C2247") +(define KEYIDA (substring KEYA (- (string-length KEYA) 8))) +(define KEYIDB (substring KEYB (- (string-length KEYB) 8))) + +(define (verify-messages) + (for-each + (lambda (key) + (for-each + (lambda (i) + (let ((fn (in-srcdir "tests" "openpgp" DIR (string-append key "-" i ".txt")))) + (call-check `(,@GPG --verify ,fn)))) + (list "1" "2"))) + (list KEYIDA KEYIDB))) + +;; Import the public keys. +(display " > Two keys. ") +(call-check `(,@GPG --import ,(in-srcdir "tests" "openpgp" DIR (string-append KEYIDA "-1.gpg")))) +(call-check `(,@GPG --import ,(in-srcdir "tests" "openpgp" DIR (string-append KEYIDB "-1.gpg")))) +;; Make sure the tofu engine registers the keys. +(verify-messages) +(display "<\n") + +;; Since there is no conflict, the policy should be auto. +(checkpolicy KEYA "auto") +(checkpolicy KEYB "auto") + +;; Import the cross sigs. +(display " > Adding cross signatures. ") +(call-check `(,@GPG --import ,(in-srcdir "tests" "openpgp" DIR (string-append KEYIDA "-2.gpg")))) +(call-check `(,@GPG --import ,(in-srcdir "tests" "openpgp" DIR (string-append KEYIDB "-2.gpg")))) +(verify-messages) +(display "<\n") + +;; There is still no conflict, so the policy shouldn't have changed. +(checkpolicy KEYA "auto") +(checkpolicy KEYB "auto") + +;; Import the conflicting user id. +(display " > Adding conflicting user id. ") +(call-check `(,@GPG --import ,(in-srcdir "tests" "openpgp" DIR (string-append KEYIDB "-3.gpg")))) +(verify-messages) +(display "<\n") + +(checkpolicy KEYA "ask") +(checkpolicy KEYB "ask") + +;; Import Alice's signature on the conflicting user id. Since there +;; is now a cross signature, we should revert to the default policy. +(display " > Adding cross signature on user id. ") +(call-check `(,@GPG --import ,(in-srcdir "tests" "openpgp" DIR (string-append KEYIDB "-4.gpg")))) +(verify-messages) +(display "<\n") + +(checkpolicy KEYA "auto") +(checkpolicy KEYB "auto") + +;; Remove the keys. +(call-check `(,@GPG --delete-key ,KEYA)) +(call-check `(,@GPG --delete-key ,KEYB)) + + +;; Check that we detect the following attack: +;; +;; Alice has an ultimately trusted key and she signs Bob's key. Then +;; Bob adds a new user id, "Alice". TOFU should now detect a +;; conflict, because Alice only signed Bob's "Bob" user id. +;; +;; +;; The Alice key: +;; pub rsa2048 2016-10-11 [SC] +;; 1938C3A0E4674B6C217AC0B987DB2814EC38277E +;; uid [ultimate] Spy Cow <spy@cow.com> +;; sub rsa2048 2016-10-11 [E] +;; +;; The Bob key: +;; +;; pub rsa2048 2016-10-11 [SC] +;; DC463A16E42F03240D76E8BA8B48C6BD871C2247 +;; uid [ full ] Spy R. Cow <spy@cow.com> +;; uid [ full ] Spy R. Cow <spy@cow.de> +;; sub rsa2048 2016-10-11 [E] + +(display "Checking UTK sigs...\n") +(define GPG `(,(tool 'gpg) --no-permission-warning + --faked-system-time=1476304861)) + +;; Carefully remove the TOFU db. +(catch '() (unlink (path-join GNUPGHOME "tofu.db"))) + +(define DIR "tofu/cross-sigs") +;; The test keys. +(define KEYA "1938C3A0E4674B6C217AC0B987DB2814EC38277E") +(define KEYB "DC463A16E42F03240D76E8BA8B48C6BD871C2247") +(define KEYIDA (substring KEYA (- (string-length KEYA) 8))) +(define KEYIDB (substring KEYB (- (string-length KEYB) 8))) + +(define (verify-messages) + (for-each + (lambda (key) + (for-each + (lambda (i) + (let ((fn (in-srcdir "tests" "openpgp" DIR (string-append key "-" i ".txt")))) + (call-check `(,@GPG --verify ,fn)))) + (list "1" "2"))) + (list KEYIDA KEYIDB))) + +;; Import the public keys. +(display " > Two keys. ") +(call-check `(,@GPG --import ,(in-srcdir "tests" "openpgp" DIR (string-append KEYIDA "-1.gpg")))) +(call-check `(,@GPG --import ,(in-srcdir "tests" "openpgp" DIR (string-append KEYIDB "-1.gpg")))) +(display "<\n") + +(checkpolicy KEYA "auto") +(checkpolicy KEYB "auto") + +;; Import the cross sigs. +(display " > Adding cross signatures. ") +(call-check `(,@GPG --import ,(in-srcdir "tests" "openpgp" DIR (string-append KEYIDA "-2.gpg")))) +(call-check `(,@GPG --import ,(in-srcdir "tests" "openpgp" DIR (string-append KEYIDB "-2.gpg")))) +(display "<\n") + +(checkpolicy KEYA "auto") +(checkpolicy KEYB "auto") + +;; Make KEYA ultimately trusted. +(display (string-append " > Marking " KEYA " as ultimately trusted. ")) +(pipe:do + (pipe:echo (string-append KEYA ":6:\n")) + (pipe:gpg `(--import-ownertrust))) +(display "<\n") + +;; An ultimately trusted key's policy is good. +(checkpolicy KEYA "good") +;; A key signed by a UTK for which there is no policy gets the default +;; policy of good. +(checkpolicy KEYB "good") + +;; Import the conflicting user id. +(display " > Adding conflicting user id. ") +(call-check `(,@GPG --import ,(in-srcdir "tests" "openpgp" DIR (string-append KEYIDB "-3.gpg")))) +(verify-messages) +(display "<\n") + +(checkpolicy KEYA "good") +(checkpolicy KEYB "ask") + +;; Import Alice's signature on the conflicting user id. +(display " > Adding cross signature on user id. ") +(call-check `(,@GPG --import ,(in-srcdir "tests" "openpgp" DIR (string-append KEYIDB "-4.gpg")))) +(verify-messages) +(display "<\n") + +(checkpolicy KEYA "good") +(checkpolicy KEYB "good") + +;; Remove the keys. +(call-check `(,@GPG --delete-key ,KEYA)) +(call-check `(,@GPG --delete-key ,KEYB)) diff --git a/tests/openpgp/tofu/conflicting/1C005AF3-1.txt b/tests/openpgp/tofu/conflicting/1C005AF3-1.txt Binary files differnew file mode 100644 index 0000000..dba581d --- /dev/null +++ b/tests/openpgp/tofu/conflicting/1C005AF3-1.txt diff --git a/tests/openpgp/tofu/conflicting/1C005AF3-2.txt b/tests/openpgp/tofu/conflicting/1C005AF3-2.txt Binary files differnew file mode 100644 index 0000000..fde9fb8 --- /dev/null +++ b/tests/openpgp/tofu/conflicting/1C005AF3-2.txt diff --git a/tests/openpgp/tofu/conflicting/1C005AF3-3.txt b/tests/openpgp/tofu/conflicting/1C005AF3-3.txt Binary files differnew file mode 100644 index 0000000..e6aa4ac --- /dev/null +++ b/tests/openpgp/tofu/conflicting/1C005AF3-3.txt diff --git a/tests/openpgp/tofu/conflicting/1C005AF3-4.txt b/tests/openpgp/tofu/conflicting/1C005AF3-4.txt Binary files differnew file mode 100644 index 0000000..6a14891 --- /dev/null +++ b/tests/openpgp/tofu/conflicting/1C005AF3-4.txt diff --git a/tests/openpgp/tofu/conflicting/1C005AF3-5.txt b/tests/openpgp/tofu/conflicting/1C005AF3-5.txt Binary files differnew file mode 100644 index 0000000..12fb5fb --- /dev/null +++ b/tests/openpgp/tofu/conflicting/1C005AF3-5.txt diff --git a/tests/openpgp/tofu/conflicting/1C005AF3-secret.gpg b/tests/openpgp/tofu/conflicting/1C005AF3-secret.gpg Binary files differnew file mode 100644 index 0000000..5f1e78a --- /dev/null +++ b/tests/openpgp/tofu/conflicting/1C005AF3-secret.gpg diff --git a/tests/openpgp/tofu/conflicting/1C005AF3.gpg b/tests/openpgp/tofu/conflicting/1C005AF3.gpg Binary files differnew file mode 100644 index 0000000..7a75011 --- /dev/null +++ b/tests/openpgp/tofu/conflicting/1C005AF3.gpg diff --git a/tests/openpgp/tofu/conflicting/B662E42F-1.txt b/tests/openpgp/tofu/conflicting/B662E42F-1.txt Binary files differnew file mode 100644 index 0000000..c39056c --- /dev/null +++ b/tests/openpgp/tofu/conflicting/B662E42F-1.txt diff --git a/tests/openpgp/tofu/conflicting/B662E42F-2.txt b/tests/openpgp/tofu/conflicting/B662E42F-2.txt Binary files differnew file mode 100644 index 0000000..a96ef9f --- /dev/null +++ b/tests/openpgp/tofu/conflicting/B662E42F-2.txt diff --git a/tests/openpgp/tofu/conflicting/B662E42F-3.txt b/tests/openpgp/tofu/conflicting/B662E42F-3.txt Binary files differnew file mode 100644 index 0000000..2e6e81b --- /dev/null +++ b/tests/openpgp/tofu/conflicting/B662E42F-3.txt diff --git a/tests/openpgp/tofu/conflicting/B662E42F-4.txt b/tests/openpgp/tofu/conflicting/B662E42F-4.txt Binary files differnew file mode 100644 index 0000000..470882f --- /dev/null +++ b/tests/openpgp/tofu/conflicting/B662E42F-4.txt diff --git a/tests/openpgp/tofu/conflicting/B662E42F-5.txt b/tests/openpgp/tofu/conflicting/B662E42F-5.txt new file mode 100644 index 0000000..21d54bc --- /dev/null +++ b/tests/openpgp/tofu/conflicting/B662E42F-5.txt @@ -0,0 +1 @@ +£›ÀËÌÀÁ¨%¶¼[Ò}ÆÓI®i’¦\ŒÆ,Œ²bŠ,ù&ÖkÏhí³‰ÒÓŒ†)ee©cà h&q0lÊ;S“ɵ´`ÅâK˾>ž¾}iÚñªwò²ö5?VÙðF+' |]ó$í/Ÿôj×m•³ÓJÄß–TjY‘À¤Á£<ÿø™i»½6%Æ|ªÿ÷¢aûÿGVkgË4eµ<akï¿õÓBî U£o¿fføöZ<ÚñU[ÕÔhþÞJeÒÂníóÜýÞ뤙þœ¶šâœ
f~÷[”dm"v²•?P3}=×üŒŒ}Ó#"ò^µ±¬j-µ‘×ùTÒ²Õœ+/q=±&Ü>̬¸²åüëÏÕÕ%îíkºzùŠNëìýlʳêמŸšž©:æü‘ŠÏ7zü›žÎÐ\oÞµs™úJÅs1éÚñû
\ No newline at end of file diff --git a/tests/openpgp/tofu/conflicting/B662E42F-secret.gpg b/tests/openpgp/tofu/conflicting/B662E42F-secret.gpg Binary files differnew file mode 100644 index 0000000..7362ded --- /dev/null +++ b/tests/openpgp/tofu/conflicting/B662E42F-secret.gpg diff --git a/tests/openpgp/tofu/conflicting/B662E42F.gpg b/tests/openpgp/tofu/conflicting/B662E42F.gpg Binary files differnew file mode 100644 index 0000000..6c07520 --- /dev/null +++ b/tests/openpgp/tofu/conflicting/B662E42F.gpg diff --git a/tests/openpgp/tofu/conflicting/BE04EB2B-1.txt b/tests/openpgp/tofu/conflicting/BE04EB2B-1.txt Binary files differnew file mode 100644 index 0000000..1b3de47 --- /dev/null +++ b/tests/openpgp/tofu/conflicting/BE04EB2B-1.txt diff --git a/tests/openpgp/tofu/conflicting/BE04EB2B-2.txt b/tests/openpgp/tofu/conflicting/BE04EB2B-2.txt Binary files differnew file mode 100644 index 0000000..f4f5487 --- /dev/null +++ b/tests/openpgp/tofu/conflicting/BE04EB2B-2.txt diff --git a/tests/openpgp/tofu/conflicting/BE04EB2B-3.txt b/tests/openpgp/tofu/conflicting/BE04EB2B-3.txt Binary files differnew file mode 100644 index 0000000..7451073 --- /dev/null +++ b/tests/openpgp/tofu/conflicting/BE04EB2B-3.txt diff --git a/tests/openpgp/tofu/conflicting/BE04EB2B-4.txt b/tests/openpgp/tofu/conflicting/BE04EB2B-4.txt Binary files differnew file mode 100644 index 0000000..f15496d --- /dev/null +++ b/tests/openpgp/tofu/conflicting/BE04EB2B-4.txt diff --git a/tests/openpgp/tofu/conflicting/BE04EB2B-5.txt b/tests/openpgp/tofu/conflicting/BE04EB2B-5.txt Binary files differnew file mode 100644 index 0000000..39078f1 --- /dev/null +++ b/tests/openpgp/tofu/conflicting/BE04EB2B-5.txt diff --git a/tests/openpgp/tofu/conflicting/BE04EB2B-secret.gpg b/tests/openpgp/tofu/conflicting/BE04EB2B-secret.gpg Binary files differnew file mode 100644 index 0000000..5d393aa --- /dev/null +++ b/tests/openpgp/tofu/conflicting/BE04EB2B-secret.gpg diff --git a/tests/openpgp/tofu/conflicting/BE04EB2B.gpg b/tests/openpgp/tofu/conflicting/BE04EB2B.gpg Binary files differnew file mode 100644 index 0000000..787b238 --- /dev/null +++ b/tests/openpgp/tofu/conflicting/BE04EB2B.gpg diff --git a/tests/openpgp/tofu/cross-sigs/871C2247-1.gpg b/tests/openpgp/tofu/cross-sigs/871C2247-1.gpg Binary files differnew file mode 100644 index 0000000..f706f70 --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/871C2247-1.gpg diff --git a/tests/openpgp/tofu/cross-sigs/871C2247-1.txt b/tests/openpgp/tofu/cross-sigs/871C2247-1.txt Binary files differnew file mode 100644 index 0000000..0bdc1fc --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/871C2247-1.txt diff --git a/tests/openpgp/tofu/cross-sigs/871C2247-2.gpg b/tests/openpgp/tofu/cross-sigs/871C2247-2.gpg Binary files differnew file mode 100644 index 0000000..0b2485f --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/871C2247-2.gpg diff --git a/tests/openpgp/tofu/cross-sigs/871C2247-2.txt b/tests/openpgp/tofu/cross-sigs/871C2247-2.txt Binary files differnew file mode 100644 index 0000000..4d3aaaa --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/871C2247-2.txt diff --git a/tests/openpgp/tofu/cross-sigs/871C2247-3.gpg b/tests/openpgp/tofu/cross-sigs/871C2247-3.gpg Binary files differnew file mode 100644 index 0000000..eb2c435 --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/871C2247-3.gpg diff --git a/tests/openpgp/tofu/cross-sigs/871C2247-3.txt b/tests/openpgp/tofu/cross-sigs/871C2247-3.txt Binary files differnew file mode 100644 index 0000000..9b2d49d --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/871C2247-3.txt diff --git a/tests/openpgp/tofu/cross-sigs/871C2247-4.gpg b/tests/openpgp/tofu/cross-sigs/871C2247-4.gpg Binary files differnew file mode 100644 index 0000000..9c98ec1 --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/871C2247-4.gpg diff --git a/tests/openpgp/tofu/cross-sigs/871C2247-secret.gpg b/tests/openpgp/tofu/cross-sigs/871C2247-secret.gpg Binary files differnew file mode 100644 index 0000000..a87c61b --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/871C2247-secret.gpg diff --git a/tests/openpgp/tofu/cross-sigs/EC38277E-1.gpg b/tests/openpgp/tofu/cross-sigs/EC38277E-1.gpg Binary files differnew file mode 100644 index 0000000..e6becec --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/EC38277E-1.gpg diff --git a/tests/openpgp/tofu/cross-sigs/EC38277E-1.txt b/tests/openpgp/tofu/cross-sigs/EC38277E-1.txt Binary files differnew file mode 100644 index 0000000..92236be --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/EC38277E-1.txt diff --git a/tests/openpgp/tofu/cross-sigs/EC38277E-2.gpg b/tests/openpgp/tofu/cross-sigs/EC38277E-2.gpg Binary files differnew file mode 100644 index 0000000..d26bd54 --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/EC38277E-2.gpg diff --git a/tests/openpgp/tofu/cross-sigs/EC38277E-2.txt b/tests/openpgp/tofu/cross-sigs/EC38277E-2.txt Binary files differnew file mode 100644 index 0000000..b4013d3 --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/EC38277E-2.txt diff --git a/tests/openpgp/tofu/cross-sigs/EC38277E-3.txt b/tests/openpgp/tofu/cross-sigs/EC38277E-3.txt Binary files differnew file mode 100644 index 0000000..9b2d49d --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/EC38277E-3.txt diff --git a/tests/openpgp/tofu/cross-sigs/EC38277E-secret.gpg b/tests/openpgp/tofu/cross-sigs/EC38277E-secret.gpg Binary files differnew file mode 100644 index 0000000..1839e3a --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/EC38277E-secret.gpg diff --git a/tests/openpgp/tofu/cross-sigs/README b/tests/openpgp/tofu/cross-sigs/README new file mode 100644 index 0000000..439962b --- /dev/null +++ b/tests/openpgp/tofu/cross-sigs/README @@ -0,0 +1,79 @@ +# How I generate the keys and messages to verify: + +# Generate and export two non-conflicting keys. +gpg --quick-gen-key 'Spy Cow <spy@cow.com>' +gpg --quick-gen-key 'Spy R. Cow <spy@cow.de>' + +KEYIDA=1938C3A0E4674B6C217AC0B987DB2814EC38277E +KEYIDB=DC463A16E42F03240D76E8BA8B48C6BD871C2247 + +for KEYID in $KEYIDA $KEYIDB +do + gpg --export $KEYID > tofu-$KEYID.gpg + gpg --export-secret-keys $KEYID > tofu-$KEYID-secret.gpg +done + +# Sign some data. +echo foo | gpg --default-key $KEYIDA -s > tofu-$KEYIDA-1.txt +echo foo | gpg --default-key $KEYIDB -s > tofu-$KEYIDB-1.txt + +# Again, but with an issuer. +echo foo | gpg --default-key "<spy@cow.com>" -s > tofu-$KEYIDA-2.txt +echo foo | gpg --default-key "<spy@cow.de>" -s > tofu-$KEYIDB-2.txt + +# Have A sign B and vice versa. +gpg --default-key $KEYIDA --quick-sign $KEYIDB +gpg --default-key $KEYIDB --quick-sign $KEYIDA + +gpg --export $KEYIDA > tofu-$KEYIDA-2.gpg +gpg --export $KEYIDB > tofu-$KEYIDB-2.gpg + +# Cause A and B to conflict. +gpg --quick-adduid $KEYIDB 'Spy R. Cow <spy@cow.com>' +gpg --export $KEYIDB > tofu-$KEYIDB-3.gpg + +echo foo | gpg --default-key "<spy@cow.com>" -s > tofu-$KEYIDA-3.txt +echo foo | gpg --default-key "<spy@cow.com>" -s > tofu-$KEYIDB-3.txt + +# Have A sign B's conflicting user id. +gpg --default-key $KEYIDA --quick-sign $KEYIDB +gpg --export $KEYIDB > tofu-$KEYIDB-4.gpg + +exit 0 + +# In a new directory (so the keys are not ultimately trusted). + +D=~/neal/work/gpg/test +echo 'trust-model tofu+pgp' > gpg.conf +gpg --import $D/tofu-$KEYIDA.gpg +gpg --import $D/tofu-$KEYIDB.gpg +gpg -k + +gpg --verify $D/tofu-$KEYIDA-1.txt +gpg --verify $D/tofu-$KEYIDB-1.txt +# With an issuer. +gpg --verify $D/tofu-$KEYIDA-2.txt +gpg --verify $D/tofu-$KEYIDB-2.txt + +# Import the cross signatures. +gpg --import $D/tofu-$KEYIDA-2.gpg +gpg --import $D/tofu-$KEYIDB-2.gpg +gpg -k + +gpg --verify $D/tofu-$KEYIDA-1.txt +gpg --verify $D/tofu-$KEYIDB-1.txt +# With an issuer. +gpg --verify $D/tofu-$KEYIDA-2.txt +gpg --verify $D/tofu-$KEYIDB-2.txt + + +gpg --status-fd=1 --batch --verify $D/tofu-$KEYIDA-3.txt | grep TRUST_UNDEFINED +gpg --status-fd=1 --batch --verify $D/tofu-$KEYIDB-3.txt | grep TRUST_UNDEFINED + +# Import the conflicting user id. +gpg --import $D/tofu-$KEYIDB-3.gpg +gpg -k + +# Import the cross signature, which should remove the conflict. +gpg --import $D/tofu-$KEYIDB-4.gpg +gpg -k diff --git a/tests/openpgp/trust-pgp-1.scm b/tests/openpgp/trust-pgp-1.scm new file mode 100755 index 0000000..235cb55 --- /dev/null +++ b/tests/openpgp/trust-pgp-1.scm @@ -0,0 +1,76 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2017 Damien Goutte-Gattat +;; +;; This file is part of GnuPG. +;; +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "trust-pgp" "common.scm")) + +(display "Checking basic WoT (classic trust model)...\n") + +(initscenario "scenario1") + +;; Check initial state. +(checktrust BOBBY "f") ;; Directly signed by Alice's key. +(checktrust CAROL "q") ;; Signed by Bobby, whose key has + ;; no explicit ownertrust. +(checktrust DAVID "q") ;; Likewise. +(checktrust FRANK "q") ;; Likewise. +(checktrust GRACE "-") ;; Signed by the previous three keys; + ;; not evaluated since they are not valid. + +;; Let's trust Bobby. +;; This should make Carol's, David's, and Frank's keys valid. +(setownertrust BOBBY FULLTRUST) +(updatetrustdb) +(checktrust CAROL "f") +(checktrust DAVID "f") +(checktrust FRANK "f") +(checktrust GRACE "q") ;; Now evaluated, but validity still unknown. + +;; Let's trust (marginally) Carol and David. +;; This should not be enough to make Grace's key fully valid +;; since marginals-needed defaults to 3. +(setownertrust CAROL MARGINALTRUST) +(setownertrust DAVID MARGINALTRUST) +(updatetrustdb) +(checktrust GRACE "m") + +;; Add marginal ownertrust to Frank's key. +;; This should make Grace's key fully valid. +(setownertrust FRANK MARGINALTRUST) +(updatetrustdb) +(checktrust GRACE "f") + +;; Now let's play with the length of certification chains. +;; Setting max-cert-length to 2 should put Grace's key +;; one step too far from Alice's key. +(let ((max-cert-depth (gpg-config 'gpg "max-cert-depth"))) + (max-cert-depth::update 2)) +(updatetrustdb) +(checktrust GRACE "-") + +;; Raise the bar for assigning full validity. +;; Bobby's key should be the only one retaining full validity. +(let ((completes-needed (gpg-config 'gpg "completes-needed"))) + (completes-needed::update 2)) +(updatetrustdb) +(checktrust BOBBY "f") +(checktrust CAROL "m") +(checktrust DAVID "m") +(checktrust FRANK "m") +(checktrust GRACE "-") diff --git a/tests/openpgp/trust-pgp-2.scm b/tests/openpgp/trust-pgp-2.scm new file mode 100755 index 0000000..a56d0a9 --- /dev/null +++ b/tests/openpgp/trust-pgp-2.scm @@ -0,0 +1,39 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2017 Damien Goutte-Gattat +;; +;; This file is part of GnuPG. +;; +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "trust-pgp" "common.scm")) + +(display "Checking WoT with trust signatures (PGP trust model)...\n") + +(initscenario "scenario2") + +(checktrust BOBBY "f") ;; Tsigned by Alice with trust=120. +(checktrust CAROL "f") ;; Signed by Bobby, whose key should have full + ;; ownertrust due to the tsig. +(checktrust DAVID "f") ;; Signed by Alice. +(checktrust FRANK "q") ;; Tsigned by David, whose key has no ownertrust. +(checktrust GRACE "-") ;; Signed by Frank. + +(setownertrust DAVID FULLTRUST) +(updatetrustdb) +(checktrust FRANK "f") ;; David's key has now full ownertrust. +(checktrust GRACE "q") ;; David is not authorized to emit tsigs, + ;; so his tsig on Frank's key should be treated + ;; like a normal sig (confering no ownertrust). diff --git a/tests/openpgp/trust-pgp-3.scm b/tests/openpgp/trust-pgp-3.scm new file mode 100755 index 0000000..33832db --- /dev/null +++ b/tests/openpgp/trust-pgp-3.scm @@ -0,0 +1,31 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2017 Damien Goutte-Gattat +;; +;; This file is part of GnuPG. +;; +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "trust-pgp" "common.scm")) + +(display "Checking max depth of trust signature chains...\n") + +(initscenario "scenario3") + +(checktrust BOBBY "f") ;; Tsigned by Alice (level=2, trust=120). +(checktrust CAROL "f") ;; Tsigned by Bobby (level=2, trust=120). +(checktrust DAVID "f") ;; Tsigned by Carol (level=2, trust=120). +(checktrust FRANK "q") ;; The tsig from Carol does not confer + ;; ownertrust to David's key (too deep). diff --git a/tests/openpgp/trust-pgp-4.scm b/tests/openpgp/trust-pgp-4.scm new file mode 100755 index 0000000..17746a5 --- /dev/null +++ b/tests/openpgp/trust-pgp-4.scm @@ -0,0 +1,37 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2017 Damien Goutte-Gattat +;; +;; This file is part of GnuPG. +;; +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "trust-pgp" "common.scm")) + +(display "Checking trust signature with domain restrictions...\n") + +(initscenario "scenario4") + +(checktrust BOBBY "f") ;; Tsigned by Alice, allowed to sign for example.com. +(checktrust CAROL "-") ;; Signed by Bobby, but the signature should be + ;; ignored since Carol has an address in example.net. + +(checktrust DAVID "f") ;; Tsigned by Alice, allowed to sign for example.net. +(checktrust FRANK "-") ;; Tsignature from David should be ignored because + ;; Frank has an address in example.com. + +(checktrust HEIDI "f") ;; Tsigned by David, should be valid since Heidi + ;; has an address in example.org. +(checktrust GRACE "f") ;; Signed by Heidi. diff --git a/tests/openpgp/trust-pgp/alice.sec.asc b/tests/openpgp/trust-pgp/alice.sec.asc new file mode 100644 index 0000000..1cdde46 --- /dev/null +++ b/tests/openpgp/trust-pgp/alice.sec.asc @@ -0,0 +1,11 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +lHcEWW2+WxMIKoZIzj0DAQcCAwQnUnqiwvOPU7gGepFTew8Fk5kmVexr+PvaqXgv +9wKxNzZrs4GvamULk9pl2euwJGKPBRJRz8RSNpW6HIIzAPoOAAEAgOZk+WDjrmum +0OygJdb6qJp27qsyXvMVZ8AGlsdYtUgS37QZQWxpY2UgPGFsaWNlQGV4YW1wbGUu +b3JnPoiQBBMTCAA4FiEE/Zsg3TyYEj7ur4zFG6QVONLmVrUFAlltvlsCGwMFCwkI +BwIGFQgJCgsCBBYCAwECHgECF4AACgkQG6QVONLmVrU7PAEAvOqeIRMiJ8Ne0tz+ +K1aRz/np/umCQxO8ddm9mnr4M7EA/1z4YdD06wJXp4RXUI0G2QOHTY+QXMShCFrp +ySArWQqN +=3+Iz +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/trust-pgp/bobby.sec.asc b/tests/openpgp/trust-pgp/bobby.sec.asc new file mode 100644 index 0000000..2164b5d --- /dev/null +++ b/tests/openpgp/trust-pgp/bobby.sec.asc @@ -0,0 +1,11 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +lHcEWW3WihMIKoZIzj0DAQcCAwTtUYI84wfNPCwa/r2ke7tXz0uv/En9LQZbW0QE +nzHigEvMXLfyjfjCf5tQ2eVbKLbABxtKwDtC2bv8dMcmgqd/AAEA6EzyQYtLOL9v +4SErBRic7MmQfxFbEJIQSu2vtbWos/0QFLQZQm9iYnkgPGJvYmJ5QGV4YW1wbGUu +Y29tPoiQBBMTCAA4FiEETT9Z9NgDD9LYRK/rpbrD7RJcyuUFAllt1ooCGwMFCwkI +BwIGFQgJCgsCBBYCAwECHgECF4AACgkQpbrD7RJcyuWUjgEA9UreuOxgDzhSCGAQ +5GtxBiXkmp/IuH/rvNI8qZaVnoIBAPs/VUgy3eySjF6g9wf/UzvqwUdtoaYvkyC2 +a25O7Lxc +=76RO +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/trust-pgp/carol.sec.asc b/tests/openpgp/trust-pgp/carol.sec.asc new file mode 100644 index 0000000..d366f3f --- /dev/null +++ b/tests/openpgp/trust-pgp/carol.sec.asc @@ -0,0 +1,11 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +lHcEWW3WrxMIKoZIzj0DAQcCAwS4HzEJ0YwXZ1SWciHOmWdfnESTvwC3Zb/sWRu8 +zdIeZzxAwu8lYQaDq/eOgKeXQVW5gxkQG5rCWUazbG+gCBEIAAEA2QzHlkxFJkTg +QvZuimqU0AySYsleRUaO9B9UARiUbOYOwrQZQ2Fyb2wgPGNhcm9sQGV4YW1wbGUu +bmV0PoiQBBMTCAA4FiEEbGJzXkVMzdefpspgEHkROuwSgv0FAllt1q8CGwMFCwkI +BwIGFQgJCgsCBBYCAwECHgECF4AACgkQEHkROuwSgv3MygD+KdusoDvz7WZbsjjB +WI/HLhWfWfXsoAR9mN/5rZ94HDgA/1VqbvUcM+vPU62g7/0qoGqWCda3SURB6263 +Kirbk6hY +=wkQ4 +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/trust-pgp/common.scm b/tests/openpgp/trust-pgp/common.scm new file mode 100644 index 0000000..2a545e8 --- /dev/null +++ b/tests/openpgp/trust-pgp/common.scm @@ -0,0 +1,66 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2017 Damien Goutte-Gattat +;; +;; This file is part of GnuPG. +;; +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) + +;; Redefine GPG without --always-trust. +(define GPG `(,(tool 'gpg))) + +;; Helper constants for setownertrust. +(define MARGINALTRUST "4") +(define FULLTRUST "5") +(define ULTIMATETRUST "6") + +;; Assign OWNERTRUST to the key identified by the provided +;; fingerprint KEYFPR. +(define (setownertrust keyfpr ownertrust) + (pipe:do + (pipe:echo (string-append keyfpr ":" ownertrust ":\n")) + (pipe:gpg `(--import-ownertrust)))) + +;; Force a trustdb update. +(define (updatetrustdb) + (call-check `(,@GPG --check-trustdb --yes))) + +;; IDs of all the keys involved in those tests. +(define ALICE "FD9B20DD3C98123EEEAF8CC51BA41538D2E656B5") +(define BOBBY "4D3F59F4D8030FD2D844AFEBA5BAC3ED125CCAE5") +(define CAROL "6C62735E454CCDD79FA6CA601079113AEC1282FD") +(define DAVID "A0607635198CABA2C467FAA64CE5BB42E3984000") +(define FRANK "CE1A0E07CF8A20CBF8DC47D6DB9017DBAE6CD0EF") +(define GRACE "B935F4B8DA009AFBCCDD41386653A183007F8345") +(define HEIDI "0389C0B7990E10520B334F23756F1571EDA9184B") + +;; Initialize a given scenario. +;; NAME should be the basename of the scenario file +;; in this directory. +(define (initscenario name) + (setup-environment) + ;; Make sure we are using the PGP trust model. This may no + ;; be the default model in the future. + (let ((trust-model (gpg-config 'gpg "trust-model"))) + (trust-model::update "pgp")) + ;; Load the scenario's public keys. + (call-check `(,@GPG --import + ,(in-srcdir "tests" "openpgp" "trust-pgp" + (string-append name ".asc")))) + ;; Use Alice's key as root for all trust evaluations. + (setownertrust ALICE ULTIMATETRUST) + (updatetrustdb)) diff --git a/tests/openpgp/trust-pgp/david.sec.asc b/tests/openpgp/trust-pgp/david.sec.asc new file mode 100644 index 0000000..06c4e83 --- /dev/null +++ b/tests/openpgp/trust-pgp/david.sec.asc @@ -0,0 +1,11 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +lHcEWW3WzRMIKoZIzj0DAQcCAwQrTeILyHVpkkDsAyAlY7wz0PYjG48ShCYeTX2z +5f2bLxZGeepQeMiOXznPvCwRNMNpr63048+LGqu34Q9di5tvAAD9HITG0iG5SzeW +cGMfhzGuXEn2P+9arb0OttTUcj+eGBIP8bQZRGF2aWQgPGRhdmlkQGV4YW1wbGUu +b3JnPoiQBBMTCAA4FiEEoGB2NRmMq6LEZ/qmTOW7QuOYQAAFAllt1s0CGwMFCwkI +BwIGFQgJCgsCBBYCAwECHgECF4AACgkQTOW7QuOYQAAJtAD+JxiDZttAb51FjB5o +J1BksmzIrgL6ouorbLLRjVyk7rkA/0JqyLhh1K3vn4rYDbuKtvQAcfQbCndzwF9X +uGQ/7gbS +=EC4L +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/trust-pgp/frank.sec.asc b/tests/openpgp/trust-pgp/frank.sec.asc new file mode 100644 index 0000000..50235de --- /dev/null +++ b/tests/openpgp/trust-pgp/frank.sec.asc @@ -0,0 +1,11 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +lHcEWW3W3RMIKoZIzj0DAQcCAwQs0QS2PEUXhpmsPlaTFOsXd8AoYqpa6xcc0+AE +Mck1EzlqRlxeibvYeh/+yxjl18Ouww/BERB+PcoABXp00zXzAAD+Oybk8/6x5nc8 +ZNHkRIbfHW8oKh7jxbpob9X7QIfBpf8TcbQZRnJhbmsgPGZyYW5rQGV4YW1wbGUu +Y29tPoiQBBMTCAA4FiEEzhoOB8+KIMv43EfW25AX265s0O8FAllt1t0CGwMFCwkI +BwIGFQgJCgsCBBYCAwECHgECF4AACgkQ25AX265s0O+nDQD/RplCmAPQgMejhs2/ +YmOqWrekyd4IWNj9zyI2n228WXYBAJ1/Wf1vBviOEqzs7t+C0iBExxJXViPlG0nN +Z9aoiX1G +=vnHF +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/trust-pgp/grace.sec.asc b/tests/openpgp/trust-pgp/grace.sec.asc new file mode 100644 index 0000000..23ebd71 --- /dev/null +++ b/tests/openpgp/trust-pgp/grace.sec.asc @@ -0,0 +1,11 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +lHcEWW3W8RMIKoZIzj0DAQcCAwRTGb7wRrdPa+mXxUNJoYgWbKfMDQH9M1H366PQ +ga8L32TYccFzyCD8DuRYOQxzhnCtSHtdzK4QAwwGLaJV6GRjAAEAzBLT+dB5ga7S +Lh7PepOB9yObDHrHAvXGXg9AUvEm3ZkQ6bQZR3JhY2UgPGdyYWNlQGV4YW1wbGUu +bmV0PoiQBBMTCAA4FiEEuTX0uNoAmvvM3UE4ZlOhgwB/g0UFAllt1vECGwMFCwkI +BwIGFQgJCgsCBBYCAwECHgECF4AACgkQZlOhgwB/g0W2AAD+KmW2DQALWTnsVnL/ +QKdJ1J8DsaR1l+y2h7FUYuFttQsBALZYs2vUwOVBnAYyqbHogqgbPSxKRXeAxNqo +epx6csv+ +=05c1 +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/trust-pgp/heidi.sec.asc b/tests/openpgp/trust-pgp/heidi.sec.asc new file mode 100644 index 0000000..f650d1a --- /dev/null +++ b/tests/openpgp/trust-pgp/heidi.sec.asc @@ -0,0 +1,11 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +lHcEWW3XBxMIKoZIzj0DAQcCAwSINFpTZUYnxDDj3k16ljZIt58rh3cuUNIvUcqR +zR9kdlmudQTaf1zUsW6F3r+t91t88kaA2Fcci3wkU0CAob0WAAD/eTlMM3JTEF6K +yh8gxk1+mXRVUAmcGwr+1PzC3nzJAkgPALQZSGVpZGkgPGhlaWRpQGV4YW1wbGUu +b3JnPoiQBBMTCAA4FiEEA4nAt5kOEFILM08jdW8Vce2pGEsFAllt1wcCGwMFCwkI +BwIGFQgJCgsCBBYCAwECHgECF4AACgkQdW8Vce2pGEtwXAD/SVyIRiGnYPkqBVqG +fI2MlTgN8+uirur2JdkcPoylCEMA/j3OeLRRT1docnEnvST1srmlXxZTbNUclnAl +a2OZd7ME +=1goe +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/openpgp/trust-pgp/scenario1.asc b/tests/openpgp/trust-pgp/scenario1.asc new file mode 100644 index 0000000..82fee76 --- /dev/null +++ b/tests/openpgp/trust-pgp/scenario1.asc @@ -0,0 +1,75 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW2+WxMIKoZIzj0DAQcCAwQnUnqiwvOPU7gGepFTew8Fk5kmVexr+PvaqXgv +9wKxNzZrs4GvamULk9pl2euwJGKPBRJRz8RSNpW6HIIzAPoOtBlBbGljZSA8YWxp +Y2VAZXhhbXBsZS5vcmc+iJAEExMIADgWIQT9myDdPJgSPu6vjMUbpBU40uZWtQUC +WW2+WwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAbpBU40uZWtTs8AQC8 +6p4hEyInw17S3P4rVpHP+en+6YJDE7x12b2aevgzsQD/XPhh0PTrAlenhFdQjQbZ +A4dNj5BcxKEIWunJICtZCo0= +=rf4w +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3WihMIKoZIzj0DAQcCAwTtUYI84wfNPCwa/r2ke7tXz0uv/En9LQZbW0QE +nzHigEvMXLfyjfjCf5tQ2eVbKLbABxtKwDtC2bv8dMcmgqd/tBlCb2JieSA8Ym9i +YnlAZXhhbXBsZS5jb20+iJAEExMIADgWIQRNP1n02AMP0thEr+ulusPtElzK5QUC +WW3WigIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRClusPtElzK5ZSOAQD1 +St647GAPOFIIYBDka3EGJeSan8i4f+u80jyplpWeggEA+z9VSDLd7JKMXqD3B/9T +O+rBR22hpi+TILZrbk7svFyIdQQQEwgAHRYhBP2bIN08mBI+7q+MxRukFTjS5la1 +BQJZbhAyAAoJEBukFTjS5la10+gA/2wr/lG67+xA1n3+2tQkIf1254lnwr8NXhwg +w4UAAbajAP9hOXzltmmHV4BaBm35GEv/A2iAABV6lzgvApmM9c445A== +=i2Va +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3WrxMIKoZIzj0DAQcCAwS4HzEJ0YwXZ1SWciHOmWdfnESTvwC3Zb/sWRu8 +zdIeZzxAwu8lYQaDq/eOgKeXQVW5gxkQG5rCWUazbG+gCBEItBlDYXJvbCA8Y2Fy +b2xAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQRsYnNeRUzN15+mymAQeRE67BKC/QUC +WW3WrwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAQeRE67BKC/czKAP4p +26ygO/PtZluyOMFYj8cuFZ9Z9eygBH2Y3/mtn3gcOAD/VWpu9Rwz689TraDv/Sqg +apYJ1rdJREHrbrcqKtuTqFiIdQQQEwgAHRYhBE0/WfTYAw/S2ESv66W6w+0SXMrl +BQJZbhBhAAoJEKW6w+0SXMrlPYgA/21rYq9iItnLASDCdt4ZX6gPKEZVBFDk6850 +Gyvg3TrEAP9/9bjKEFCSbo6vFKONOEpKqA/9B85Ff+2jq1lvfafV4Q== +=mwVS +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3WzRMIKoZIzj0DAQcCAwQrTeILyHVpkkDsAyAlY7wz0PYjG48ShCYeTX2z +5f2bLxZGeepQeMiOXznPvCwRNMNpr63048+LGqu34Q9di5tvtBlEYXZpZCA8ZGF2 +aWRAZXhhbXBsZS5vcmc+iJAEExMIADgWIQSgYHY1GYyrosRn+qZM5btC45hAAAUC +WW3WzQIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBM5btC45hAAAm0AP4n +GINm20BvnUWMHmgnUGSybMiuAvqi6itsstGNXKTuuQD/QmrIuGHUre+fitgNu4q2 +9ABx9BsKd3PAX1e4ZD/uBtKIdQQQEwgAHRYhBE0/WfTYAw/S2ESv66W6w+0SXMrl +BQJZbhB0AAoJEKW6w+0SXMrlARwA/RiqKRh4rYtW5gP20PoQNYfS1qh+lDRTlhfp +SSF5aKKFAP90s5/fp6n382IjbOhmQiEB9N4gv4pZT3YP13NQwAABbg== +=bLxR +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3W3RMIKoZIzj0DAQcCAwQs0QS2PEUXhpmsPlaTFOsXd8AoYqpa6xcc0+AE +Mck1EzlqRlxeibvYeh/+yxjl18Ouww/BERB+PcoABXp00zXztBlGcmFuayA8ZnJh +bmtAZXhhbXBsZS5jb20+iJAEExMIADgWIQTOGg4Hz4ogy/jcR9bbkBfbrmzQ7wUC +WW3W3QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRDbkBfbrmzQ76cNAP9G +mUKYA9CAx6OGzb9iY6pat6TJ3ghY2P3PIjafbbxZdgEAnX9Z/W8G+I4SrOzu34LS +IETHEldWI+UbSc1n1qiJfUaIdQQQEwgAHRYhBE0/WfTYAw/S2ESv66W6w+0SXMrl +BQJZbhCEAAoJEKW6w+0SXMrlepAA/3+AAaRQVfsU+zQtGg43VxAcfW+ezuUVCYUY +IW2Lv+GkAP0WF7Nh5N4nDo/gC3WBW2zdWArlRaWa5NxcCquEUaE7Tg== +=SWmz +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3W8RMIKoZIzj0DAQcCAwRTGb7wRrdPa+mXxUNJoYgWbKfMDQH9M1H366PQ +ga8L32TYccFzyCD8DuRYOQxzhnCtSHtdzK4QAwwGLaJV6GRjtBlHcmFjZSA8Z3Jh +Y2VAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQS5NfS42gCa+8zdQThmU6GDAH+DRQUC +WW3W8QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBmU6GDAH+DRbYAAP4q +ZbYNAAtZOexWcv9Ap0nUnwOxpHWX7LaHsVRi4W21CwEAtliza9TA5UGcBjKpseiC +qBs9LEpFd4DE2qh6nHpyy/6IdQQQEwgAHRYhBGxic15FTM3Xn6bKYBB5ETrsEoL9 +BQJZbhCyAAoJEBB5ETrsEoL9pVoBAPGc50vXiWmSAx8U573pqAyBsVPPMUlfrrgc +tVZZQ9DyAP9LCpG1kJOnB1Fia1M6M/37FAwVjUerWTrp6XoG1888PYh1BBATCAAd +FiEEoGB2NRmMq6LEZ/qmTOW7QuOYQAAFAlluEM4ACgkQTOW7QuOYQAB3HgD+Kw+R +WbH8RcSlNbwlGWCWYwKvik7ukIMcTXXYD5azTYoBANF5Ym2n5RExmEd8nTrWu9MR +TUlOgAXfzm/iH4+TNj2yiHUEEBMIAB0WIQTOGg4Hz4ogy/jcR9bbkBfbrmzQ7wUC +WW4Q7AAKCRDbkBfbrmzQ7weXAP9OyFxzdpbq1R+V6T5WEckR5OtE6Va/7CHRPRW+ +kMNVjwD/YQZVbOCRxKybVbvPuF+29w7sWp4iAmmrmCFnKfgxZsQ= +=r9Ly +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/trust-pgp/scenario2.asc b/tests/openpgp/trust-pgp/scenario2.asc new file mode 100644 index 0000000..3a98621 --- /dev/null +++ b/tests/openpgp/trust-pgp/scenario2.asc @@ -0,0 +1,70 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW2+WxMIKoZIzj0DAQcCAwQnUnqiwvOPU7gGepFTew8Fk5kmVexr+PvaqXgv +9wKxNzZrs4GvamULk9pl2euwJGKPBRJRz8RSNpW6HIIzAPoOtBlBbGljZSA8YWxp +Y2VAZXhhbXBsZS5vcmc+iJAEExMIADgWIQT9myDdPJgSPu6vjMUbpBU40uZWtQUC +WW2+WwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAbpBU40uZWtTs8AQC8 +6p4hEyInw17S3P4rVpHP+en+6YJDE7x12b2aevgzsQD/XPhh0PTrAlenhFdQjQbZ +A4dNj5BcxKEIWunJICtZCo0= +=rf4w +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3WihMIKoZIzj0DAQcCAwTtUYI84wfNPCwa/r2ke7tXz0uv/En9LQZbW0QE +nzHigEvMXLfyjfjCf5tQ2eVbKLbABxtKwDtC2bv8dMcmgqd/tBlCb2JieSA8Ym9i +YnlAZXhhbXBsZS5jb20+iJAEExMIADgWIQRNP1n02AMP0thEr+ulusPtElzK5QUC +WW3WigIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRClusPtElzK5ZSOAQD1 +St647GAPOFIIYBDka3EGJeSan8i4f+u80jyplpWeggEA+z9VSDLd7JKMXqD3B/9T +O+rBR22hpi+TILZrbk7svFyIeQQQEwgAIRYhBP2bIN08mBI+7q+MxRukFTjS5la1 +BQJZbjsoAwUBeAAKCRAbpBU40uZWtVGlAQCgHkwmJSATJbrqV7+h/1ByLDi4+thQ +ApW8nRinGuwkxQD+NgjOVmkPGZtpvaBzLXJS/IdPAYBWAriAzDZEV2GchWM= +=4Xcm +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3WrxMIKoZIzj0DAQcCAwS4HzEJ0YwXZ1SWciHOmWdfnESTvwC3Zb/sWRu8 +zdIeZzxAwu8lYQaDq/eOgKeXQVW5gxkQG5rCWUazbG+gCBEItBlDYXJvbCA8Y2Fy +b2xAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQRsYnNeRUzN15+mymAQeRE67BKC/QUC +WW3WrwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAQeRE67BKC/czKAP4p +26ygO/PtZluyOMFYj8cuFZ9Z9eygBH2Y3/mtn3gcOAD/VWpu9Rwz689TraDv/Sqg +apYJ1rdJREHrbrcqKtuTqFiIdQQQEwgAHRYhBE0/WfTYAw/S2ESv66W6w+0SXMrl +BQJZbjteAAoJEKW6w+0SXMrlkJQBAO19erLoHXOqUI01Wl0tcaKIwEB5HkIHLh0w +cCTOG4bDAQCCG8a8D1mg9jVPukBzTBUZGpDZmg/U3JGW3XE6rKlKXQ== +=Df0N +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3WzRMIKoZIzj0DAQcCAwQrTeILyHVpkkDsAyAlY7wz0PYjG48ShCYeTX2z +5f2bLxZGeepQeMiOXznPvCwRNMNpr63048+LGqu34Q9di5tvtBlEYXZpZCA8ZGF2 +aWRAZXhhbXBsZS5vcmc+iJAEExMIADgWIQSgYHY1GYyrosRn+qZM5btC45hAAAUC +WW3WzQIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBM5btC45hAAAm0AP4n +GINm20BvnUWMHmgnUGSybMiuAvqi6itsstGNXKTuuQD/QmrIuGHUre+fitgNu4q2 +9ABx9BsKd3PAX1e4ZD/uBtKIdQQQEwgAHRYhBP2bIN08mBI+7q+MxRukFTjS5la1 +BQJZbkUBAAoJEBukFTjS5la1zSgA/A6ei6bus+VtQtL1rsJfovwoxnyAq+QzCcJL +ZheUUK3LAQCK+rVE1Yn9QsFoNYZUgLHrnQDtSVq9ClJvNw/Wuz7DpQ== +=No85 +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3W3RMIKoZIzj0DAQcCAwQs0QS2PEUXhpmsPlaTFOsXd8AoYqpa6xcc0+AE +Mck1EzlqRlxeibvYeh/+yxjl18Ouww/BERB+PcoABXp00zXztBlGcmFuayA8ZnJh +bmtAZXhhbXBsZS5jb20+iJAEExMIADgWIQTOGg4Hz4ogy/jcR9bbkBfbrmzQ7wUC +WW3W3QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRDbkBfbrmzQ76cNAP9G +mUKYA9CAx6OGzb9iY6pat6TJ3ghY2P3PIjafbbxZdgEAnX9Z/W8G+I4SrOzu34LS +IETHEldWI+UbSc1n1qiJfUaIeQQQEwgAIRYhBKBgdjUZjKuixGf6pkzlu0LjmEAA +BQJZbkUwAwUBeAAKCRBM5btC45hAAJF0AQD3lBQszLXrlSnCLuHfQxbS/p05DURZ +HRi8MbTqkrcgrQD8Cs3gwQCBkPUrx8boAyjcuX1BK/TYZ1Gg8hWkozNr1lI= +=HwV/ +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3W8RMIKoZIzj0DAQcCAwRTGb7wRrdPa+mXxUNJoYgWbKfMDQH9M1H366PQ +ga8L32TYccFzyCD8DuRYOQxzhnCtSHtdzK4QAwwGLaJV6GRjtBlHcmFjZSA8Z3Jh +Y2VAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQS5NfS42gCa+8zdQThmU6GDAH+DRQUC +WW3W8QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBmU6GDAH+DRbYAAP4q +ZbYNAAtZOexWcv9Ap0nUnwOxpHWX7LaHsVRi4W21CwEAtliza9TA5UGcBjKpseiC +qBs9LEpFd4DE2qh6nHpyy/6IdQQQEwgAHRYhBM4aDgfPiiDL+NxH1tuQF9uubNDv +BQJZbkVQAAoJENuQF9uubNDvyrkBAICiFq2dTFzLrXNsItwpPrB20trzEPM/JAxa +lzSyknJMAQDBCj8nyEtlpkYh9t9ovy/x75D1OUBFFYHOQXCMy0QyRA== +=yoqI +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/trust-pgp/scenario3.asc b/tests/openpgp/trust-pgp/scenario3.asc new file mode 100644 index 0000000..240afd5 --- /dev/null +++ b/tests/openpgp/trust-pgp/scenario3.asc @@ -0,0 +1,58 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW2+WxMIKoZIzj0DAQcCAwQnUnqiwvOPU7gGepFTew8Fk5kmVexr+PvaqXgv +9wKxNzZrs4GvamULk9pl2euwJGKPBRJRz8RSNpW6HIIzAPoOtBlBbGljZSA8YWxp +Y2VAZXhhbXBsZS5vcmc+iJAEExMIADgWIQT9myDdPJgSPu6vjMUbpBU40uZWtQUC +WW2+WwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAbpBU40uZWtTs8AQC8 +6p4hEyInw17S3P4rVpHP+en+6YJDE7x12b2aevgzsQD/XPhh0PTrAlenhFdQjQbZ +A4dNj5BcxKEIWunJICtZCo0= +=rf4w +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3WihMIKoZIzj0DAQcCAwTtUYI84wfNPCwa/r2ke7tXz0uv/En9LQZbW0QE +nzHigEvMXLfyjfjCf5tQ2eVbKLbABxtKwDtC2bv8dMcmgqd/tBlCb2JieSA8Ym9i +YnlAZXhhbXBsZS5jb20+iJAEExMIADgWIQRNP1n02AMP0thEr+ulusPtElzK5QUC +WW3WigIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRClusPtElzK5ZSOAQD1 +St647GAPOFIIYBDka3EGJeSan8i4f+u80jyplpWeggEA+z9VSDLd7JKMXqD3B/9T +O+rBR22hpi+TILZrbk7svFyIeQQQEwgAIRYhBP2bIN08mBI+7q+MxRukFTjS5la1 +BQJZbmYmAwUCeAAKCRAbpBU40uZWtSQhAQD2HLi7PUipgcO9N+KEJLKl2T9ralzj +O1PMy8IbxnG86AD/Ya541TcH9oxZUWm5dsHd/eoBnSu2WwWkLPNHirRkzwE= +=R1uZ +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3WrxMIKoZIzj0DAQcCAwS4HzEJ0YwXZ1SWciHOmWdfnESTvwC3Zb/sWRu8 +zdIeZzxAwu8lYQaDq/eOgKeXQVW5gxkQG5rCWUazbG+gCBEItBlDYXJvbCA8Y2Fy +b2xAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQRsYnNeRUzN15+mymAQeRE67BKC/QUC +WW3WrwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAQeRE67BKC/czKAP4p +26ygO/PtZluyOMFYj8cuFZ9Z9eygBH2Y3/mtn3gcOAD/VWpu9Rwz689TraDv/Sqg +apYJ1rdJREHrbrcqKtuTqFiIeQQQEwgAIRYhBE0/WfTYAw/S2ESv66W6w+0SXMrl +BQJZbmZIAwUCeAAKCRClusPtElzK5YuLAP0b5nCuz6p6DDrHB0rtwfhEfJQgvsEc +zGE2Hh5P5fXP/AEA2Gt8LEWiHYNGWu6ZN02oyCoNUEfZZFva59IIPrzPDHU= +=S6Nc +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3WzRMIKoZIzj0DAQcCAwQrTeILyHVpkkDsAyAlY7wz0PYjG48ShCYeTX2z +5f2bLxZGeepQeMiOXznPvCwRNMNpr63048+LGqu34Q9di5tvtBlEYXZpZCA8ZGF2 +aWRAZXhhbXBsZS5vcmc+iJAEExMIADgWIQSgYHY1GYyrosRn+qZM5btC45hAAAUC +WW3WzQIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBM5btC45hAAAm0AP4n +GINm20BvnUWMHmgnUGSybMiuAvqi6itsstGNXKTuuQD/QmrIuGHUre+fitgNu4q2 +9ABx9BsKd3PAX1e4ZD/uBtKIeQQQEwgAIRYhBGxic15FTM3Xn6bKYBB5ETrsEoL9 +BQJZbmZ0AwUCeAAKCRAQeRE67BKC/eFYAQDaKoyQZYnNH/62hydWITZ1nOYM/h6i +6L/b+XqB9DD0ewD9FAbO1wzassj6FmZMZDaraqdljTX+94JY5E3GJ8EQXo4= +=kaec +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3W3RMIKoZIzj0DAQcCAwQs0QS2PEUXhpmsPlaTFOsXd8AoYqpa6xcc0+AE +Mck1EzlqRlxeibvYeh/+yxjl18Ouww/BERB+PcoABXp00zXztBlGcmFuayA8ZnJh +bmtAZXhhbXBsZS5jb20+iJAEExMIADgWIQTOGg4Hz4ogy/jcR9bbkBfbrmzQ7wUC +WW3W3QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRDbkBfbrmzQ76cNAP9G +mUKYA9CAx6OGzb9iY6pat6TJ3ghY2P3PIjafbbxZdgEAnX9Z/W8G+I4SrOzu34LS +IETHEldWI+UbSc1n1qiJfUaIeQQQEwgAIRYhBKBgdjUZjKuixGf6pkzlu0LjmEAA +BQJZbmaiAwUCeAAKCRBM5btC45hAAMcRAP9dcKO3ETB52AsFdBp2iJVjqJ5JiftN +B/2FZBxPtSjXpAD/YdDzs+zNaAUlFIFmXzP9EmIqmXhC6XSiASrNd5EW33A= +=DXNa +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/trust-pgp/scenario4.asc b/tests/openpgp/trust-pgp/scenario4.asc new file mode 100644 index 0000000..7860c95 --- /dev/null +++ b/tests/openpgp/trust-pgp/scenario4.asc @@ -0,0 +1,84 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW2+WxMIKoZIzj0DAQcCAwQnUnqiwvOPU7gGepFTew8Fk5kmVexr+PvaqXgv +9wKxNzZrs4GvamULk9pl2euwJGKPBRJRz8RSNpW6HIIzAPoOtBlBbGljZSA8YWxp +Y2VAZXhhbXBsZS5vcmc+iJAEExMIADgWIQT9myDdPJgSPu6vjMUbpBU40uZWtQUC +WW2+WwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAbpBU40uZWtTs8AQC8 +6p4hEyInw17S3P4rVpHP+en+6YJDE7x12b2aevgzsQD/XPhh0PTrAlenhFdQjQbZ +A4dNj5BcxKEIWunJICtZCo0= +=rf4w +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3WihMIKoZIzj0DAQcCAwTtUYI84wfNPCwa/r2ke7tXz0uv/En9LQZbW0QE +nzHigEvMXLfyjfjCf5tQ2eVbKLbABxtKwDtC2bv8dMcmgqd/tBlCb2JieSA8Ym9i +YnlAZXhhbXBsZS5jb20+iJAEExMIADgWIQRNP1n02AMP0thEr+ulusPtElzK5QUC +WW3WigIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRClusPtElzK5ZSOAQD1 +St647GAPOFIIYBDka3EGJeSan8i4f+u80jyplpWeggEA+z9VSDLd7JKMXqD3B/9T +O+rBR22hpi+TILZrbk7svFyIlAQQEwgAPBYhBP2bIN08mBI+7q+MxRukFTjS5la1 +BQJZbm5IAwUCeBqGPFtePl0rW0AuXWV4YW1wbGVcLmNvbT4kAAAKCRAbpBU40uZW +tb+2APsFKgWxiLtSbpcekarOlPrw014LVinLGah3VE1Izay+tAEA+0INHdcNoz64 +kRE/2siUnx1ksrWcWvJbvNMteknXhzY= +=UQni +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3WrxMIKoZIzj0DAQcCAwS4HzEJ0YwXZ1SWciHOmWdfnESTvwC3Zb/sWRu8 +zdIeZzxAwu8lYQaDq/eOgKeXQVW5gxkQG5rCWUazbG+gCBEItBlDYXJvbCA8Y2Fy +b2xAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQRsYnNeRUzN15+mymAQeRE67BKC/QUC +WW3WrwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAQeRE67BKC/czKAP4p +26ygO/PtZluyOMFYj8cuFZ9Z9eygBH2Y3/mtn3gcOAD/VWpu9Rwz689TraDv/Sqg +apYJ1rdJREHrbrcqKtuTqFiIdQQQEwgAHRYhBE0/WfTYAw/S2ESv66W6w+0SXMrl +BQJZbm6PAAoJEKW6w+0SXMrlWj8A/2UdgyhbV+tLjyFb87iBiaWxSIVfiVyjhLZN +htPTrKb2AP4yIRxJ3x0LmRSDLkZ/QIQmgahlAXRmKCXSRAB8x2KRsQ== +=Zbpr +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3WzRMIKoZIzj0DAQcCAwQrTeILyHVpkkDsAyAlY7wz0PYjG48ShCYeTX2z +5f2bLxZGeepQeMiOXznPvCwRNMNpr63048+LGqu34Q9di5tvtBlEYXZpZCA8ZGF2 +aWRAZXhhbXBsZS5vcmc+iJAEExMIADgWIQSgYHY1GYyrosRn+qZM5btC45hAAAUC +WW3WzQIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBM5btC45hAAAm0AP4n +GINm20BvnUWMHmgnUGSybMiuAvqi6itsstGNXKTuuQD/QmrIuGHUre+fitgNu4q2 +9ABx9BsKd3PAX1e4ZD/uBtKIlAQQEwgAPBYhBP2bIN08mBI+7q+MxRukFTjS5la1 +BQJZbm5uAwUCeBqGPFtePl0rW0AuXWV4YW1wbGVcLm9yZz4kAAAKCRAbpBU40uZW +tYGkAQDcxaTENxUFCcwyuv/pOpNr51Q7bhCcWVPd3Zn1t3yurQD+KDre0hsrR0Rf +kiq5JYhqh8sEejmFQ1EtcCNI2x8CvHg= +=W5g4 +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3W3RMIKoZIzj0DAQcCAwQs0QS2PEUXhpmsPlaTFOsXd8AoYqpa6xcc0+AE +Mck1EzlqRlxeibvYeh/+yxjl18Ouww/BERB+PcoABXp00zXztBlGcmFuayA8ZnJh +bmtAZXhhbXBsZS5jb20+iJAEExMIADgWIQTOGg4Hz4ogy/jcR9bbkBfbrmzQ7wUC +WW3W3QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRDbkBfbrmzQ76cNAP9G +mUKYA9CAx6OGzb9iY6pat6TJ3ghY2P3PIjafbbxZdgEAnX9Z/W8G+I4SrOzu34LS +IETHEldWI+UbSc1n1qiJfUaIdQQQEwgAHRYhBKBgdjUZjKuixGf6pkzlu0LjmEAA +BQJZbm7vAAoJEEzlu0LjmEAAmT0A/3kZ3vms9aDuS2OD9yE/KoluBQi1UWR59V/2 +JHomhTiRAP9GI/01N3pRty986m4dVBbrXpT39ZkEj4q+zkn1uNeQHA== +=UqlD +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3W8RMIKoZIzj0DAQcCAwRTGb7wRrdPa+mXxUNJoYgWbKfMDQH9M1H366PQ +ga8L32TYccFzyCD8DuRYOQxzhnCtSHtdzK4QAwwGLaJV6GRjtBlHcmFjZSA8Z3Jh +Y2VAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQS5NfS42gCa+8zdQThmU6GDAH+DRQUC +WW3W8QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBmU6GDAH+DRbYAAP4q +ZbYNAAtZOexWcv9Ap0nUnwOxpHWX7LaHsVRi4W21CwEAtliza9TA5UGcBjKpseiC +qBs9LEpFd4DE2qh6nHpyy/6IdQQQEwgAHRYhBAOJwLeZDhBSCzNPI3VvFXHtqRhL +BQJZbm85AAoJEHVvFXHtqRhL6N0BAPjsViTQhc/t9zbC7Jf3bRLQTYjwR5EtW4Wu +IZZeByYXAQDw0Wofsq945J5oRLoTPdc264dBv8ojBr0/1uFWOvci/w== +=q1yC +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mFIEWW3XBxMIKoZIzj0DAQcCAwSINFpTZUYnxDDj3k16ljZIt58rh3cuUNIvUcqR +zR9kdlmudQTaf1zUsW6F3r+t91t88kaA2Fcci3wkU0CAob0WtBlIZWlkaSA8aGVp +ZGlAZXhhbXBsZS5vcmc+iJAEExMIADgWIQQDicC3mQ4QUgszTyN1bxVx7akYSwUC +WW3XBwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRB1bxVx7akYS3BcAP9J +XIhGIadg+SoFWoZ8jYyVOA3z66Ku6vYl2Rw+jKUIQwD+Pc54tFFPV2hycSe9JPWy +uaVfFlNs1RyWcCVrY5l3swSIeQQQEwgAIRYhBKBgdjUZjKuixGf6pkzlu0LjmEAA +BQJZbm8aAwUCeAAKCRBM5btC45hAAPABAPwLtRtV1gnk6qbyb9DvvHbG1kd2sqQ5 +mBM7cw6rPmf2EgEA3V3J9D7/4hbF/tulACVEpW9yvZq3wnEj0GSMpF6qQDE= +=7uOj +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/openpgp/use-exact-key.scm b/tests/openpgp/use-exact-key.scm new file mode 100755 index 0000000..8bff9af --- /dev/null +++ b/tests/openpgp/use-exact-key.scm @@ -0,0 +1,69 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +;; Import the sample key +;; +;; pub 1024R/8BC90111 2015-12-02 +;; Key fingerprint = E657 FB60 7BB4 F21C 90BB 6651 BC06 7AF2 8BC9 0111 +;; uid [ultimate] Barrett Brown <barrett@example.org> +;; sub 1024R/3E880CFF 2015-12-02 (encryption) +;; sub 1024R/F5F77B83 2015-12-02 (signing) +;; sub 1024R/45117079 2015-12-02 (encryption) +;; sub 1024R/1EA97479 2015-12-02 (signing) + +(info "Importing public key.") +(call-check + `(,(tool 'gpg) --import + ,(in-srcdir "tests" "openpgp" "samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc"))) + +;; By default, the most recent, valid signing subkey (1EA97479). +(for-each-p + "Checking that the most recent, valid signing subkey is used by default" + (lambda (keyid) + (tr:do + (tr:pipe-do + (pipe:defer (lambda (sink) (display "" (fdopen sink "w")))) + (pipe:gpg `(-s -u ,keyid)) + (pipe:gpg '(--verify --status-fd=1))) + (tr:call-with-content + (lambda (c) + (unless (string-contains? + c "VALIDSIG 5FBA84ACE02DCB17DA3DFF6BBCA43C441EA97479") + (exit 1)))))) + '("8BC90111" "3E880CFF" "F5F77B83" "45117079" "1EA97479")) + +;; But, if we request a particular signing key, we should get it. +(for-each-p + "Checking that we can select a specific signing key" + (lambda (keyid) + (tr:do + (tr:pipe-do + (pipe:defer (lambda (sink) (display "" (fdopen sink "w")))) + (pipe:gpg `(-s -u ,(string-append keyid "!"))) + (pipe:gpg '(--verify --status-fd=1))) + (tr:call-with-content + (lambda (c) + ;; XXX we do not have a regexp library + (unless (and (string-contains? c "VALIDSIG") + (string-contains? c keyid)) + (exit 1)))))) + '("8BC90111" "F5F77B83" "1EA97479")) diff --git a/tests/openpgp/verify-multifile.scm b/tests/openpgp/verify-multifile.scm new file mode 100755 index 0000000..9ebb672 --- /dev/null +++ b/tests/openpgp/verify-multifile.scm @@ -0,0 +1,41 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-legacy-environment) + +(define files '("clearsig-1-key-1.asc" "signed-1-key-1.asc")) + +(info "Checking verification of supplied files using --multifile.") + +(let* ((status + (call-popen + `(,@gpg --verify --multifile --status-fd=1 + ,@(map (lambda (name) (in-srcdir "tests" "openpgp" "samplemsgs" name)) files)) + "")) + (lines (map (lambda (l) + (assert (string-prefix? l "[GNUPG:] ")) + ;; Split, and strip the prefix. + (cdr (string-split l #\space))) + (string-split-newlines status)))) + (assert + (= 2 (length (filter (lambda (l) + (and (equal? (car l) "GOODSIG") + (equal? (caddr l) "steve.biko@example.net"))) + lines))))) diff --git a/tests/openpgp/verify.scm b/tests/openpgp/verify.scm new file mode 100755 index 0000000..b4dd49b --- /dev/null +++ b/tests/openpgp/verify.scm @@ -0,0 +1,87 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(load (in-srcdir "tests" "openpgp" "signed-messages.scm")) +(setup-legacy-environment) + +;; +;; Two simple tests to check that verify fails for bad input data +;; +(for-each-p + "Checking bogus signature" + (lambda (char) + (lettmp (x) + (call-with-binary-output-file + x + (lambda (port) + (display (make-string 64 (integer->char (string->number char))) + port))) + (if (= 0 (call `(,@GPG --verify ,x data-500))) + (fail "no error code from verify")))) + '("#x2d" "#xca")) + +;; Fixme: We need more tests with manipulated cleartext signatures. + +;; +;; Now run the tests. +;; +(for-each-p + "Checking that a valid signature is verified as such" + (lambda (armored-file) + (pipe:do + (pipe:echo (eval armored-file (current-environment))) + (pipe:spawn `(,@GPG --verify)))) + '(msg_ols_asc msg_cols_asc msg_sl_asc msg_oolss_asc msg_cls_asc msg_clss_asc)) + +(for-each-p + "Checking that a valid signature over multiple messages is verified as such" + (lambda (armored-file) + (pipe:do + (pipe:echo (eval armored-file (current-environment))) + (pipe:spawn `(,@GPG --verify --allow-multiple-messages))) + (catch '() + (pipe:do + (pipe:defer (lambda (sink) + (display armored-file (fdopen sink "w")))) + (pipe:spawn `(,@GPG --verify))) + (fail "verification succeeded but should not"))) + '(msg_olsols_asc_multiple msg_clsclss_asc_multiple)) + +(for-each-p + "Checking that an invalid signature is verified as such" + (lambda (armored-file) + (catch '() + (pipe:do + (pipe:echo (eval armored-file (current-environment))) + (pipe:spawn `(,@GPG --verify))) + (fail "verification succeeded but should not"))) + '(bad_ls_asc bad_fols_asc bad_olsf_asc bad_ools_asc)) + + +;;; Need to import the ed25519 sample key used for +;;; the next two tests. +(call-check `(,@GPG --quiet --yes --import ,(in-srcdir "tests" "openpgp" key-file2))) +(for-each-p + "Checking that a valid Ed25519 signature is verified as such" + (lambda (armored-file) + (pipe:do + (pipe:echo (eval armored-file (current-environment))) + (pipe:spawn `(,@GPG --verify)))) + '(msg_ed25519_rshort msg_ed25519_sshort)) diff --git a/tests/openpgp/version.scm b/tests/openpgp/version.scm new file mode 100755 index 0000000..c2252c5 --- /dev/null +++ b/tests/openpgp/version.scm @@ -0,0 +1,25 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(setup-environment) + +(info "Printing the GPG version") +(assert (string-contains? (call-check `(,@GPG --version)) + "gpg (GnuPG) 2.")) |