bincimap

Log | Files | Refs | LICENSE

commit 21209d7ea26baa236dd8e514d5426ce89ccfae5f
Author: andreaha <andreaha@b31fe1f4-c0d1-0310-8000-a34f4ae90293>
Date:   Mon, 26 Jan 2004 18:06:59 +0000

- Initial commit to Subversion depository.


git-svn-id: file:///home/cwright/convert/bincimap/trunk@1 b31fe1f4-c0d1-0310-8000-a34f4ae90293

Diffstat:
AAUTHORS | 43+++++++++++++++++++++++++++++++++++++++++++
ACOPYING | 356+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ACOPYING.OpenSSL | 127+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AChangeLog | 988+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AINSTALL | 232+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AMakefile.am | 49+++++++++++++++++++++++++++++++++++++++++++++++++
ANEWS | 0
AREADME.SSL | 159+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AREADME.in | 203+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ATODO | 0
Aaclocal.m4 | 844+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aautogen.sh | 1+
Abincimap.spec.in | 1175+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconf/Makefile.am | 34++++++++++++++++++++++++++++++++++
Aconf/bincimap.conf.in | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconf/checkpassword.pl | 41+++++++++++++++++++++++++++++++++++++++++
Aconf/toimapdir | 30++++++++++++++++++++++++++++++
Aconf/tomaildir++ | 31+++++++++++++++++++++++++++++++
Aconf/xinetd-bincimap.in | 26++++++++++++++++++++++++++
Aconf/xinetd-bincimaps.in | 26++++++++++++++++++++++++++
Aconfig.h.in | 270+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconfigure.in | 210+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontrib/Makefile.am | 13+++++++++++++
Acontrib/README | 10++++++++++
Acontrib/authenticators/Makefile.am | 13+++++++++++++
Acontrib/authenticators/bincimap-auth-teapop.sh | 44++++++++++++++++++++++++++++++++++++++++++++
Adoc/Makefile.am | 15+++++++++++++++
Adoc/README | 9+++++++++
Adoc/bincimap-faq.html | 926+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/bincimap-goals.html | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/bincimap-imapdir.html | 257+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/bincimap-tech.html | 503+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/bincimap.css | 8++++++++
Adoc/manual/Makefile.am | 36++++++++++++++++++++++++++++++++++++
Adoc/manual/bincimap-manual.dvi | 0
Adoc/manual/bincimap-manual.ps | 2431+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/manual/bincimap-manual.tex | 816+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc1341.txt | 5265+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc1731.txt | 339+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc1732.txt | 283+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc1733.txt | 171+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2060.txt | 4595+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2061.txt | 171+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2086.txt | 451+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2087.txt | 283+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2088.txt | 115+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2095.txt | 283+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2177.txt | 227+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2180.txt | 787+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2192.txt | 899+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2193.txt | 507+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2195.txt | 283+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2221.txt | 283+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2342.txt | 563+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2359.txt | 339+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2595.txt | 843+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2683.txt | 1291+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc2971.txt | 451+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc3028.txt | 2019+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc3348.txt | 339+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc3501.txt | 6051+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc3502.txt | 395+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc3503.txt | 507+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/rfc3516.txt | 451+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aman/Makefile.am | 26++++++++++++++++++++++++++
Aman/bincimap-up.1 | 280+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aman/bincimap.conf.5 | 285+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aman/bincimapd.1 | 128+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aservice/Makefile.am | 32++++++++++++++++++++++++++++++++
Aservice/down | 0
Aservice/log/Makefile.am | 30++++++++++++++++++++++++++++++
Aservice/log/down | 0
Aservice/log/run-ssl.in | 18++++++++++++++++++
Aservice/log/run.in | 18++++++++++++++++++
Aservice/run-ssl.in | 14++++++++++++++
Aservice/run.in | 16++++++++++++++++
Asrc/Makefile.am | 30++++++++++++++++++++++++++++++
Asrc/address.cc | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/address.h | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/arg-arg.cc | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/arg-arg.h | 205+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/arg-checkers.h | 129+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/arg-error.cc | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/arg-error.h | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/arg-parser.cc | 208+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/arg-parser.h | 149+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/authenticate.cc | 428+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/authenticate.h | 45+++++++++++++++++++++++++++++++++++++++++++++
Asrc/base64.cc | 156+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/base64.h | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/bincimap-up.cc | 212+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/bincimapd-module.cc | 156+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/bincimapd-module.h | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/bincimapd.cc | 206+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/broker.cc | 219+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/broker.h | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/convert.cc | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/convert.h | 310+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/depot.cc | 586+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/depot.h | 162+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/greeting.cc | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/imapparser.cc | 398+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/imapparser.h | 199+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/io-ssl.cc | 312+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/io-ssl.h | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/io.cc | 441+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/io.h | 177+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/mailbox.cc | 144+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/mailbox.h | 167+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildir-close.cc | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildir-create.cc | 106+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildir-delete.cc | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildir-expunge.cc | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildir-readcache.cc | 158+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildir-scan.cc | 491+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildir-scanfilesnames.cc | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildir-select.cc | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildir-updateflags.cc | 109+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildir-writecache.cc | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildir.cc | 799+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildir.h | 207+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildirmessage.cc | 1120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/maildirmessage.h | 328+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/message.h | 173+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/mime-getpart.cc | 103+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/mime-parsefull.cc | 658+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/mime-parseonlyheader.cc | 174+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/mime-printbody.cc | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/mime-printdoc.cc | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/mime-printheader.cc | 203+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/mime-utils.h | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/mime.cc | 178+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/mime.h | 153+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-append.cc | 307+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-authenticate.cc | 269+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-capability.cc | 128+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-check.cc | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-close.cc | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-copy.cc | 201+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-create.cc | 117+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-delete.cc | 114+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-examine.cc | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-expunge.cc | 101+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-fetch.cc | 681+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-list.cc | 272+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-login.cc | 170+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-logout.cc | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-lsub.cc | 266+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-noop-pending.cc | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-noop.cc | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-rename.cc | 155+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-search.cc | 954+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-select.cc | 190+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-starttls.cc | 129+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-status.cc | 182+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-store.cc | 210+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-subscribe.cc | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operator-unsubscribe.cc | 126+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/operators.h | 458+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/pendingupdates.cc | 268+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/pendingupdates.h | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/recursivedescent.cc | 1072+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/recursivedescent.h | 97+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/regmatch.cc | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/regmatch.h | 48++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/session-initialize-bincimap-up.cc | 228+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/session-initialize-bincimapd.cc | 299+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/session.cc | 545+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/session.h | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/status.cc | 48++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/status.h | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/storage.cc | 599+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/storage.h | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/storageparser.cc | 1355+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/tools.cc | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/tools.h | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/Makefile.am | 23+++++++++++++++++++++++
Atests/framework.cc | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/framework.h | 24++++++++++++++++++++++++
Atests/mime.1 | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/mime.2 | 25878+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/tests.cc | 25+++++++++++++++++++++++++
182 files changed, 87969 insertions(+), 0 deletions(-)

diff --git a/AUTHORS b/AUTHORS @@ -0,0 +1,43 @@ +The following parties have participated in writing code or otherwise +contributed to the Binc IMAP project: + +Author: +Andreas Aardal Hanssen <andreas-binc@bincimap.org> + +Several users have been very helpful with bug reports and suggestions, and +the author is very grateful for their contributions. + +Some users have also gone to the extra effort of debugging the cause of a +bug, or have found a way of implementing a feature, and have either provided +a very good description of what is needed, or they have actually provided a +patch that has been added to Binc IMAP. + +While adding extra value to the discussion around the discovery of a bug or +the evaluation of a new feature, these contributors also take some load of +the author's back, so they deserve extra thanks. + +In this list are also included people who have contributed with mirrors and +translations of the web pages. + +Henry Baragar <Henry.Baragar (a) Instantiated.Ca> +Jürgen Botz <jurgen (a) botz.org> +Charlie Brady <charlieb (a) e-smith.com> +Caskey Dickson <caskey (a) technocage.com> +Ketil Froyn <ketil (a) froyn.name> +Marek Gutkowski <marek (a) moveo.pl> +Daniel James <daniel_james (a) eml.cc> +Zak Johnson <zakj (a) nox.cx> +Sergei Kolobov <sergei (a) kolobov.com> +Rafal Kupka <kupson (a) kupson.fdns.net> +Eivind Kvedalen <bincimap (a) eivind.kvedalen.name> +HIROSHIMA Naoki <naokih (a) iron-horse.org> +Greger Stolt Nilsen <greger (a) psychoproject.net> +Peter Stuge <stuge-binc (a) cdy.org> +Gerrit Pape <pape (a) smarden.org> +Jeremy Rossi <jeremy (a) jeremyrossi.com> +Dale Woolridge <dale-contrib-bincimap (a) woolridge.org> + +If you have contributed to the Binc IMAP project but are not listed here +(this happens quite often), please send a mail to andreas-binc@bincimap.org +and I'll add you to the list. + diff --git a/COPYING b/COPYING @@ -0,0 +1,356 @@ +This software is released under the GPL. Find a full copy of the GNU +General Public License below. + +In addition, as a special exception, Andreas Aardal Hanssen, author of +Binc IMAP, gives permission to link the code of this program with the +OpenSSL library (or with modified versions of OpenSSL that use the +same license as OpenSSL, listed in the included COPYING.OpenSSL file), +and distribute linked combinations including the two. + +You must obey the GNU General Public License in all respects for all +of the code used other than OpenSSL. If you modify this file, you may +extend this exception to your version of the file, but you are not +obligated to do so. If you do not wish to do so, delete this exception +statement from your version. + +--------------------------------------------------------------------- + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/COPYING.OpenSSL b/COPYING.OpenSSL @@ -0,0 +1,127 @@ + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. Actually both licenses are BSD-style + Open Source licenses. In case of any license issues related to OpenSSL + please contact openssl-core@openssl.org. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + diff --git a/ChangeLog b/ChangeLog @@ -0,0 +1,988 @@ +* Tue Jan 20 2004 Andreas Aardal Hanssen <andreas-binc at bincimap.org> +- Removed time_t <-> int implicit conversion and overload ambiguity. +- Rewrote the flow of the APPEND command, and the readStr command + in io.cc. +- Fixed behavior of fetching TEXT attribute. +- 1.2.6beta3-1 + +* Fri Jan 16 2004 Andreas Aardal Hanssen <andreas-binc at bincimap.org> +- Fixed a bug where FETCH sometimes claimed that mime parts had + the wrong size. +- Reverted an erroneous change from 1.2.3 to 1.2.4 in io.cc, where + readStr() no longer initialized the input buffer to "". +- AppendOperator now stores the correct date on saved messages. +- 1.2.6b2-1 + +* Wed Jan 14 2004 Andreas Aardal Hanssen <andreas-binc at bincimap.org> +- Two bugs were fixed that prevented a message that was saved to a + mailbox from getting the requested internaldate. +- A bug in the unfolding of MIME headers erroneously removed what was + believed to be comments from within quoted text. This messed up + parsing multipart messages with parenthesis in their boundary + strings. +- 1.2.6b1-1 +- Removed folder prefixes from header comments in all files. The + comments now only mention the base name of the file. + +* Mon Jan 12 2004 Andreas Aardal Hanssen <andreas-binc at bincimap.org> +- LIST and LSUB now return X if X/* is queried for, as recommended + by Marc Crispin on the IMAP protocol list. +- AUTHENTICATE PLAIN now writes "+ \r\n" instead of "+\r\n" as an + initial response. KMail got confused by only the "+", while pine + got confused by "+ OK". This compromise makes AUTHENTICATE PLAIN + work for both clients, while still being completely IMAP compliant. +- Added Daniel James' patch which fixes HEADER.FIELDS.NOT behavior. + +* Fri Jan 09 2004 Andreas Aardal Hanssen <andreas-binc at bincimap.org> +- Fixed problem with APPEND locking up +- Fixed bug where clients were not informed when messages were + expunged. +- 1.2.5-1 + +* Thu Jan 08 2003 Andreas Aardal Hanssen <andreas-binc at bincimap.org> +- Headers now display 2002-2004 in copyright notice. +- 1.2.4-1 + +* Wed Jan 07 2003 Andreas Aardal Hanssen <andreas-binc at bincimap.org> +- Removed mime-printstruct.cc - it caused compile problems, and is + not in use. +- Added Zak Johnson's patch to fix TRYCREATE +- Added Jason Parson's patch to fix a problem with creating lock files. + The open function didn't get the mode argument, and the lock was + created with random mode bits set. + +* Thu Dec 18 2003 Andreas Aardal Hanssen <andreas-binc at bincimap.org> +- Removed lex/yacc storage parser and replaced it and the whole + Storage class with a new approach. This uses less memory and is + faster. Refactoring of units depending on Storage was required. +- Binc no longer requires the SSL cipher list to be set. If left + empty or not set, the default ciphers in OpenSSL are used. + +* Mon Dec 15 2003 Andreas Aardal Hanssen <andreas-binc at bincimap.org> +- Removed memory bloat. Binc IMAP no longer reads entire fetch + responses into memory before outputting them, with the exception + of header fetch responses. + +* Mon Dec 08 2003 Andreas Aardal Hanssen <andreas-binc at bincimap.org> +- Fixed two bugs in FETCH that messed up the fetch attributes and + gave the full header when fetching only selected fields. +- Fixed a bug in the MIME parser. We now successfully parse + Mark Crispin's torture tests completely. + +* Fri Dec 05 2003 Andreas Aardal Hanssen <andreas-binc at bincimap.org> +- Server now correctly displays BAD response if the stub is not + parsed correctly. + +* Thu Dec 04 2003 Andreas Aardal Hanssen <andreas-binc at bincimap.org> +- Added README.SSL +- README and README.SSL now mention the LifeWithBincIMAP.org site. + +* Tue Dec 02 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- The version number in the IMAP greeting can now be switched off with + the "version in greeting" option in Security in bincimap.conf. +- The conf files now accept the '#' character as the start of a comment, + except when quoted. +- Log now reports correct number of (unencrypted) bytes read or written. + +* Fri Nov 28 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Implemented support for fetch attributes ALL, FULL and FAST, which + for some reason had no implementation yet. +- Fixed two bugs in operator-authenticate.cc in reading input to the + AUTHENTICATE command. Basically the server would loop forever if + the client suddenly disconnected while Binc was reading the + arguments. +- Leaving the jail settings in Security{} in bincimap.conf empty + will prevent bincimap-up from entering the chroot jail and becoming + the jail user/group, but will no longer issue any warnings about it. +- Greeting now uses (C) after Copyright instead of (c) before it. +- Removed almost all time(), alarm() and signal() use. Use of this + technique for detecting timeouts is very error prone. We now use + select() instead. +- Major changes to parser allow better detection of timeouts, and more + proper error reporting. + +* Tue Nov 25 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Applied Zak Johnson's patch for fixing a typo in using the + "environment ip variable" setting in bincimap.conf. + +* Tue Nov 17 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed problem in maildir.cc where messages that are created with a + given internaldate always got time(0) instead. + +* Tue Oct 28 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed typos in README + +* Tue Oct 04 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added Gerrit's patch to solve operator<< ambiguous overload. + +* Tue Sep 29 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added doxygen docs. + +* Fri Sep 26 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added Jeremy Rossi's patch, which allows plain text authentication + if the environment variable ALLOWPLAIN is set. This can be used by + tcpserver to allow plain text authentication for clients connecting + from certain IP addresses. + +* Tue Sep 23 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added cache to LIST requests - speeds up consecutive LIST requests + significantly. + +* Sun Sep 21 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added new scripts to files section in spec file. The scripts were not + installed with the earlier rpm packages. + +* Sat Sep 20 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added scripts: "toimapdir", "tomaildir++" and "checkpassword.pl" +- Fixed two bugs in the MIME parser. +- Improved error reporting when creating mailboxes with invalid names. +- 1.2.3-1 + +* Thu Sep 18 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed STATUS to more properly report recent and uidnext. +- Fixed maildir-scan.cc to correctly parse unique part of messages that + erroneously contain more than one ':'. Specifically, the former parser + assumed the ':' was always followed by ",2". + +* Wed Sep 17 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed problem with some mailboxes being marked as \Noselect when + selectable. Not related to Mozilla mailbox error. +- Removed some useless log output. + +* Sun Sep 14 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed memory leak in bincimapd by adding reference counting. +- LSUB sets \Noselect again +- bincimap-subscribed is now called .bincimap-subscribed. The format is + greatly simplified. Existing subscribe-files are automatically + converted to the new format. + +* Wed Sep 10 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- "make cert" no longer uses absolute paths for mktemp and openssl. +- LSUB always reads subscribed entries from bincimap-subscribed. +- 1.2.2-1 + +* Tue Sep 09 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed bug in MIME parser where message sizes were mixed up, causing + some bodies to be reported as empty. Pine reacted to this bug by + reporting an unexpected message size. + +* Sat Sep 06 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed bug in fillInputBuffer when converting CRLF files. + +* Fri Sep 05 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Greeting now displays time in 24h style instead of 12h style + with missing AM/PM. +- Fixed bug in MIME parser where mozilla did not display attachments + correctly. +- MIME parser speedup for partial content fetches +- MIME parser now uses unsigned ints everywhere. +- Artifact off-by-two error in mime parser is now gone. +- BODY response now correctly terminates with a matching ')'. + +* Fri Sep 04 2003 Jurgen Botz <jurgen at botz.org> +- parameterized rpm for '--without ssl' and '--with inusr' +- parameterized version and release (use with --define) +- use configure macro so all the paths are passed to configure + (this might help in future if more paths get used) +- fixed the install and files sections to allow installing into + either /usr or /opt while conforming to FHS +- shared directories shouldn't be owned by the package (i.e. /opt, + /etc, etc.) +- use the doc macro to install doc files + +* Tue Sep 02 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- COPY now correctly reports errors with [TRYCREATE] if the destination + mailbox does not exist. +- supervise files are now in service/ and not supervise/. +- 1.2.1-1 + +* Sun Aug 31 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed so supervise/imaps/run and log/run are copied from the correct + source for "make install" +- Fixed bug in STATUS with Maildir where only messages whose file names + started with a digit were counted. +- bincimapd man page now has an ENVIRONMENT section. + +* Fri Aug 29 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Removed '-v' option from all 'rm'. This option is not defined on + OpenBSD. + +* Thu Aug 28 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed problem with hanging bincimapd +- Known bug: STATUS does not report correct UIDNEXT when there are recent + messages. A temporary fix has been added, which has a non serious race + condition. +- 1.2.0-1 + +* Sat Aug 23 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- BincStream is now a subclass of ostream again, after reports about + hanging processes. +- Added "make cert" for creating an SSL certificate. +- Changed default certificate location in bincimap.conf to the same + directory as bincimap.conf. +- Passing --localstatedir to configure now sets the prefix for the log + dirs for multilog. +- The log/run files now log to the localstate set directory. +- Added version to README file. +- "make install" no longer overwrites existing conf/run/xinetd files. +- Added notice to end of "make install" output. +- Now reports argument (hasn't done this for a while). + +* Fri Aug 22 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- RENAME now renames hierarchies of mailboxes correctly also when the + destination name is longer than the original name. + +* Sun Aug 17 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixes to mime-utils.h make it compile on more platforms. +- TestBincStream binary is no longer installed +- Depot code removed from bincimap-up, it doesn't belong there. +- operator-logout doesn't have mailbox code in bincimap-up. +- 1.2.0b1 + +* Sat Aug 16 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Replaced fgetcCRLF with a buffering much simpler alternative. Also + with support for Mac files (so \r, \r\n and \n are all converted to + proper \r\n before processing). 20% speed increase on parser because + of this. +- Fixed memory leak problem with fopen and open used on same file + descriptor. + +* Fri Aug 15 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed bug where UID COPY treated sequence set as sequence numbers and + not UIDs. + +* Sat Aug 16 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Replaced fgetcCRLF with a buffering much simpler alternative. Also + with support for Mac files (so \r, \r\n and \n are all converted to + proper \r\n before processing). 20% speed increase on parser because + of this. +- Fixed memory leak problem with fopen and open used on same file + descriptor. +- 1.2.0b1 + +* Fri Aug 15 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed bug where UID COPY treated sequence set as sequence numbers and + not UIDs. + +* Thu Aug 14 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed link copying. Messages are now sorted by internaldate on first + select. Then it is sorted by arrival. This allows copying while keeping + internaldate. Note that we now keep both flags and internaldate when + copying or appending messages. +- 1.1.9-1 + +* Tue Aug 12 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed issues with cache and losing file descriptors. + +* Mon Aug 11 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Decided to bump the cache version number because the new message + sorting algorithm gives a different order of arrival than before. This + forces all new clients to resync their mailboxes. + +* Thu Aug 07 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Any files in cur/ and new/ are treated as messages. +- Internaldate of messages is now acquired by stating files and not + by simply inspecting the filename. + +* Thu Jul 31 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Replaced all use of exceptions with return values, or sometimes by + ignoring errors that are not worth reporting. +- Size of binaries is down by 35% when Binc IMAP now compiles with + -fno-exceptions. Those 35% extra were in the data segment, + and they were actually not shared among processes. No thanks to the + gcc team for bloating g++ binaries that use exceptions. :-) +- Implemented full buffering of input and output. Earlier versions + read and wrote data byte by byte, all is now buffered. +- COPY and APPEND operations now keep message flags. +- Depot -> Mailbox -> Message API is greatly improved. There is now + no MIME or Maildir specific code in operators. Approaching point + where we can introduce more backends. +- Mailbox iterator design is much better than before. Depot and Mailbox + iterators are implemented as proxy objects. +- Improved processing of messages makes parser single-pass. Measurements + have shown a performance increase of over 40%. +- Memory footprint of messages is smaller. +- Maildir message cacheing is greatly improved, and controlled + completely by the MaildirMessageCache singleton. The File class is + gone. +- Unsigned ints everywhere allow UID, UIDVALIDITY, sequence numbers + and sizes to be in the full range 0-4294967295. +- Largefile support (O_LARGEFILE). +- Renamed Command to Request (which is more accurate). +- Renamed BincImapParserSet to SequenceSet. +- Improved log output and error reporting. +- Fixed a bug with subscribing to mailboxes. If you subscribed to a + mailbox that didn't exist (which is ok), it wasn't listed in the + output of LSUB. Now it is, but with \NoSelect. +- Added openlog patch, which fixes a problem with trash log output + when using syslog. +- Added the subfolders patch, which fixes the bug where Binc IMAP + would claim that no subfolder creation was allowed, although it + was. +- Switched main development platform to SuSe Linux, so now we have + SuSe packages (for 8.2) in addition to the RedHat packages. + +* Sat May 31 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed bug in operator-capability.cc that did not advertise STARTTLS + correctly. + +* Fri May 30 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- All NULL replaced with 0. +- Cosmetics on .h files, removed lots of whitespace. + +* Sun May 25 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- More work on the manual +- Added manual to distro +- 1.1.8-1 + +* Fri May 23 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- FETCH ENVELOPE now correctly defaults sender and reply-to fields to + the from-field. + +* Thu May 22 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Applied Gerrit's patch to allow compile with gcc-3.3 +- Fixed a bug for strstream users in BincStream that assumed a + stream was 0-terminated after a clear() even though that wasn't + always true. +- Fixed typo in operator-login.cc that disallowed plain text auth + in ssl connection. +- Removed extensive logging from operator-append.cc +- Added more contributors to AUTHORS file +- Added Sergei's patch to install-exec-hook and uninstall-hook + +* Tue May 20 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Minor change to mailbox/mailbox.h allows linking of bincimap-up without + adding the mailbox library. +- 1.1.7-1 + +* Mon May 19 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added short options support for the new argument parser. Now has + more logical short option characters than before. +- Updated man pages with new short options +- Removed the --debug argument completely. Use --ssl instead. +- Added workaround for compiler bug using FreeBSD and gcc 2.95.x. +- Wrote more on Binc manual. + +* Sun May 18 2003 Eivind Kvedalen <bincimap at eivind.kvedalen.name> +- addCapability added to BrokerFactory +- Default capabilities moved to CapabilityOperator::CapabilityOperator. +- Old argument parser removed +- New argumentparser implemented +- Storage::hasKey added +- Storage::get added +- Command::extra is now public +- Session::parseCommandLine added + +* Sun May 18 2003 Eivind Kvedalen <bincimap at eivind.kvedalen.name> +- addCapability added to BrokerFactory +- Default capabilities moved to CapabilityOperator::CapabilityOperator. +- Old argument parser removed +- New argumentparser implemented +- Storage::hasKey added +- Storage::get added +- Command::extra is now public +- Session::parseCommandLine added + +* Sun May 18 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added first draft of the Binc IMAP manual. +- Removed redundant getcwd() from bincimapd.cc. +- Removed gnugetopt / getopt_long requirement. +- Updated html documentation +- Fixed a bug in FETCH with multipart extension data. +- 1.1.6-1 + +* Tue May 13 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added basic statistics to log output when client logs off +- A temporary hack in the mime parser was added to prevent empty mime + parts to have a negative size. +- Added uninstall hooks. + +* Mon May 12 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- manpages are now installed correctly from the tarball. +- log prefix is now fixed and enabled for multilog type logging only +- getpid is only grabbed once in the IO constructor +- Session now properly supports importing and exported data to environment +- bincimapd no longer reads command line arguments or globalconfig, + but inherits them from the environment. +- man pages for bincimap-up and bincimapd were updated with new command + line options (all are passed to bincimap-up) +- service and xinetd files no longer pass configuration details to + bincimapd. +- CAPABILITY no longer reports auth or starttls capabilities in + authenticated state +- Removed excessive logging from LIST output. +- Fixed "auto create inbox" functionality for both empty and non-empty + Mailbox paths, and for both IMAPdir and Maildir++. +- Removed intercomerr tunnel from authenticate.cc +- authenticate.cc exports state to environment before invoking + authenticator. +- Added install hooks for service/ and service/log/ files +- Added install hooks for xinetd and conf files. + +* Sat May 10 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- bincimapd now interprets command line args before anything else (allows + --version etc..) + +* Thu May 08 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Updated man pages to point to the bincimap.org site + +* Mon May 05 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added Gerrit's be-nice patch "diff" to convert.h, replacing a switch + with a series of if-tests, working around a compiler bug on the Alpha + platform for FreeBSD and Debian ports. +- LSUB now always sorts subscription list before showing it to the + client. +- Removed log output from LOGIN - authenticate.cc logs enough already. +- In authenticate.cc, jail is entered after first chunk of data (the + ok response) is written from bincimapd. Fixes bug where retrying a failed + password would always fail. +- Improved log output in authenticate.cc. +- Removed the kill(...) calls in authenticate.cc, they could lead to some + unintended behavior if pids cycle. +- Improved log output in bincimap-up and bincimapd. +- In INSTALL, inserted one line at top referring to README. +- In README, cleaned up examples, added notes about securing the service. +- Updated FAQ with notes on configuring mailboxes and submailboxes. +- Fixed "make install" - added hooks that create the sysconfdir directories + and copy conf files to right places. +- configure --prefix and --sysconfdir now have default values and are no + longer required arguments. + +* Wed Apr 23 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Moved addressToParenlist into Address class +- Removed some switches from inline convert.h functions +- Added Tools singleton class, meant to take over for convert.h, + regex.h etc. +- Started working on exporting and importing whole session object + to/from environment. +- Made some very minor improvements to log output in authenticate.cc +- For Maildir, messages in new/ are now also counted as unseen. This + bug caused several clients to report the wrong number of unseen + messages. +- Added some ostream and ostream.h includes to io.cc and added std:: + prefixes. +- SUBSCRIBE no longer checks if what you wish to subscribe to is a + valid mailbox. +- COPY and SEARCH use dynamic arrays instead of stack allocated + arrays. This is to satisfy ISO C++ restrictions. +- Removed some unused variables +- umask is now read as an unsigned int +- Cleaner exit in authenticate.cc after adding breaks +- Fixed bug in LSUB output. Folders with dots and backslashes are + now properly supported. +- 1.1.5-1 + +* Thu Apr 10 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Removed optimization in LIST, as it turned out to give wrong + interpretation of leaf nodes. Improved algorithm is on its way. +- Changes to BincStream's dummyclass for cross-platform compatibility +- Project now compiles with "-Wall -ansi -pedantic". On some platforms, + only if SSL support is not included (OpenSSL headers do not always + compile under these restrictions). Only one warning is given in + greeting.cc where '%z' is not ISO C++. + +* Mon Apr 07 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Renamed BincImapParserCommand to Command +- Fixed FETCH BODY, acted like BODY[] +- Removed tunneling of log data, bincimapd and bincimap-up now log + seperately. +- Fixed bug in APPEND parser which disallowed empty flag list. +- 1.1.4-1 + +* Sun Apr 06 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- LIST now first checks with the wildcard, then does a test for wether + or not it's a mailbox. Speed-up. + +* Fri Apr 04 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed flags in LIST +- LIST now uses Depot::iterator to find entries +- LIST does not include elements that are not mailboxes unless they + qualify as superiors of mailboxes. +- Minor fixes in Storage::save method now may be a bit faster. +- Removed SSL comment in bincimap-up +- Fixed wording in error message when running an undefined/disallowed + command +- Removed some unused variables +- Removed trailing CR from error when a syntax error is discovered in + storage files. +- Minor change to storage grammar action might speed up parsing of storage + files a tad. +- Fixes to BincStream allow it to work fine with iomanip/ostream + operators. Old strstream does not work. + +* Thu Apr 03 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added Ben Schumacher's regex patch which fixes a regex problem under + FreeBSD. +- Replaced all sstream/stringstream with BincStream, cleaning up the + code a bit. +- Made delimiter in toRegex configurable. + +* Wed Apr 02 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- 1.1.3-1 + +* Tue Apr 01 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Created Status class, and added getStatus and getStatusID to Mailbox. +- Moved much of StatusOperator process code into Depot. +- In bincimap-up, IP from environment is now inserted into Session. +- When unable to translate mailbox name to filename, Depot now gives + more comprehensible error message. +- Removed some unused com/logger variables +- Improved feedback from parser for some operators. +- Added --with-ssl and --without-ssl to configure. + +* Mon Mar 31 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added includes, fixing compile problems with FreeBSD. +- Removed log info about operator exception + +* Sun Mar 30 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed so STARTTLS starts an SSL negotiation. This broke in 1.1.2-1. + +* Sat Mar 29 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added jail-path, jail-user and jail-group to argument list. +- Updated man pages. +- Added timeout to select in authenticate.cc +- 1.1.2-1 + +* Fri Mar 28 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed segfault when calling bincimapd directly with invalid contents + of BINCIMAP_LOGIN in environment. +- Added default umask 0777 if none is provided. + +* Thu Mar 27 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Moved create, delete and rename logics into Depot and out of Operators. + I'd like to enforce that only the Depot knows anything about the + map between file names and mailbox names. +- Fixed a bug in rename that disallowed renaming a/b/c/d to e/b/c/d + unless a, a/b, a/b/c and a/b/c/d all existed. +- Added bumpUidValidity method to Mailbox and Maildir +- Moved compareNodes in search operator into SearchNodes class. +- Added chroot, setgroups, setuid and setgid to bincimap-up stub. Added + configuration options to conf file in new "Security" section. +- Created IOFactory singleton, which now handles IO objects correctly. +- Seperated regular IO from SSL enabled IO. bincimapd does no longer link + against the ssl libraries and has no ssl code in it. +- Stripped down libraries in bincimap-up, reducing code size. +- Added NoopPendingOperator and removed pendingUpdates from regular NOOP + operator. bincimap-up uses only the stripped NOOPoperator. This allows + us to remove the pendingupdates code from bincimap-up. + +* Wed Mar 26 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed a bug in the mime parser where the byte offset was used to seek + using fgetcCRLF. Replaced that with fseek and now fetching headers/mime + of sub-mimeparts is working fine again. +- Fixed similar problem in mime-printbody, which now seeks using fseek. +- bincimap-up now pipes log data from child. +- Removed support from anything other than stderr logging from + authenticated daemon. +- Cleaned up the logics in FETCH when fetching different types of BODY + data. Now supports fetch att MIME correctly. +- 1.1.1-1 + +* Tue Mar 25 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added iterator to Depot class for stepping through depot entries +- Added hierarchical rename +- Fixed problem with some clients not allowing users to subscribe to + subfolders +- APPEND now uses Depot to acquire file names +- LIST and LSUB removes leading and trailing hierarchy delimiters +- Added examine operator (missing in 1.1.0) +- Set default "verify peer" to "no". + +* Mon Mar 24 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Updated README +- Added technical documentation draft +- Added IMAPdir spec draft +- Removed usage.cc. Replaced with a pointer to man pages. +- Added bincimap-up binary +- authenticate.{cc,h} now sets up a tunnel between the client and the + authenticated daemon. SSL is managed by the unauthenticated stub. +- Started enforcing conventions for formatting the source files. Document + is under progress. +- bincimapd, now the authenticated daemon, can no longer do any SSL + related activity. +- bincimapd now reads BINCIMAP_LOGIN from the environment to determine + what the response to the stub's authenticate or login commands should be. +- To meet with checkpassword's conventions, bincimapd now exits with code + 111 on internal errors. +- Removed quite a lot of debugging info +- const-ified more functions. +- Added IMAPdir and MaildirPP classes +- Removed greeting.h +- showGreeting is now self declared. +- Removed most of the hungarian notation in the main classes +- Added Session instance where needed +- LIST and LSUB now use Depot to identify mailbox types +- Added access to argc and argv to Session +- Added pending() method to IO, to check for pending data. Always 0 if not + MODE_SSL. +- readChar can now return -2, meaning that in SSL mode the read call must + be repeated. +- DELETE in maildir.cc can not delete mailbox (which was actually allowed + before) +- Maildir now does not care about IMAP mailbox names, only file names. +- Removed "singular" concept from args parser. +- Updated xinetd and supervise run files to match new invocation method. +- Added goals doc +- LIST no longer sets \Marked +- 1.1.0-1 + +* Thu Mar 20 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Removed bincimap-auth-checkpassword and bincimap-uidpwd completely + from the project +- Added privilege seperation. Unauthenticated daemon is bincimap-up. + Authenticated daemon is bincimapd. Only checkpassword compatible + authenticators are supported. +- Enabled local config settings. Users can now choose path, default + Mailbox type and depot type (IMAPdir/Maildir++). Default is Maildir++. +- Added full support for IMAPdir and Maildir++ via pluggable Depot + objects in DepotFactory. +- Made DepotFactory and BrokerFactory singletons. +- Made delimiter character a variable in depot. +- Cleaned up some code. bincimap-up.cc and bincimapd.cc still look very + bad. +- Added technical documentation draft to docs +- Added updated FAQ to docs +- Added IMAPdir spec draft to docs + +* Tue Mar 18 2003 Eivind Kvedalen <eivind at kvedalen.name> +- Fixed error messages in the various implementations of + the Operator::parse method. + +* Tue Mar 18 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Improved Storage::save algorithm +- Improved Storage::load algorithm +- Removed excessive logging +- Changed pendingUpdates to optionally rescan for changes +- Added speedup to SEARCH +- Added minor speedup to fgetcCRLF functions +- Storage now saves in PRETTIFY mode instead of MINIMIZE. Adds speed. + The MINIMIZE algorithm is undergoing maintenance. +- Moved subscribed, cmdargs, globalconfig, localconfig, userid, ip + and state into new singlton called Session. +- Added session.cc and session.h +- Moved RETURN enum into Operator +- Moved STATE enum into Session +- Removed bincimapd-config.{cc,h}, bincimapd.h, bincimapd-commands.{cc,h} +- Added initconfig.cc with most of bincimapd-config.cc's old content. + +* Mon Mar 17 2003 Eivind Kvedalen <eivind at kvedalen.name> +- Clean-up in depot.h +- getOperator added to Broker +- parse() method added to Operator classes +- parse() method implemented in operators. Code moved from + recursivedescent.cc +- BincImapParserData added to BincImapParserCommand class + +* Mon Mar 17 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed a silly bug in SEARCH UID which caused a segfault. +- authenticate() now takes a Depot as input. +- Initial mailbox create (INBOX) is done with default mailbox from + Depot +- pendingupdates() now takes a Mailbox as input +- Removed global mailbox pointer from bincimapd-config.{cc,h} +- Changed error when expecting set instead of string in recursivedescent.cc +- Weaved in Depot support in all operators +- Removed references to global mailbox pointer. +- Added rollback to UID operator parsers. + +* Sun Mar 16 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Constified loads of variables in Operators +- Added BincException. All Exceptions now inherit BincException. +- Added Depot. Broker now processes the Depot with the Operator +- Made Operators' process method const. + +* Sat Mar 15 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- First stage of new design incorporated. Brokers and Operators are + introduced. +- Converted all functions to operators that work properly. +- Added support for IMAPdir schema. +- Maildir::imapCreate no longer adds the "maildirfolder" file to the + depository. + +* Fri Mar 14 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Removed all other namespaces than Binc. We are moving to a more + object oriented approach. + +* Thu Mar 13 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Renamed MessageDepot to Mailbox + +* Tue Mar 11 2003 Eivind Kvedalen <eivind at kvedalen.name> +- Plain authentication bug fixed +- New iterator has been added to MessageDepot class +- Caching of previous messages moved to MessageDepot class. + +* Tue Mar 11 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Auth method no longer uses environment. Uses netstrings. +- Support for gnugetopt (for BSD) - untested. Removed support for regular + getopt. getopt_long is now required. +- Updated FAQ +- Improvements in "auto create inbox". +- 1.0.25-2 + +* Fri Mar 07 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added function toCanonMaildir to util +- Fixed a bug in mime-parseheader.cc that didn't set the header length. +- Fixed a bug in imapparser.cc that prevented "FETCH *" requests. +- Moved imap close, select, delete, create, expunge, functionality to + maildir class +- Some cleanups in message depot +- Several functions now use toCanonMailbox +- Cleaned up bincimapd-select.cc +- SEARCH now does not parse header if whole message has already been parsed. +- Better error reporting in most imap functions +- Big speedup in LIST by eliminating unnecessary stats +- Fixed a problem with parsing content type header +- FETCH now only parses header if only header is fetched. (bugfix) +- In authenticate(), depot object is created and lives throughout the + life of the imap session. + +* Tue Mar 04 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Removed inlining from recursivedescent.cc - if the user wants these + inlined, he can compile the source with -O3. +- Cleaned up all Makefile.am files. Removed tab indentation and threw + all files on one line. This hopefully removes automake's funny "seperator + missing" complaints. +- Fixed a bug that prevented a user from fetching only '*'. +- Removed stray blank (0x20) character that was printed as part of the + bodystructure response. + +* Mon Mar 03 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added exception to COPYING for linking against OpenSSL +- Added COPYING.OpenSSL +- Added GPL note to README +- Some cleanup in getopt code +- Added Caskey Dickson's setuid/setgid patch +- Added Caskey's copy patch +- Cleaned up the IO code +- Removed repr() and syntaxexception code from imapparser +- Moved DELETE into Maildir code +- Cleaned up create and delete code +- Added create and delete properly to MessageDepot +- Added Syntax exception code to exceptions.cc +- Added stderr as a logtype option. It's equivalent to multilog. +- Moved case converted mailbox name out as seperate function + +* Sat Feb 22 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- 1.0.24-1 +- Added GPL notices to all files +- Gathered all exceptions into one global exceptions file +- Storage class creates shorter aliases than before +- Removed lex/yacc code from argument parser - replaced with getopt +- Fixed Maildir++ complaince in maildir-create.cc +- Fixed message size cacheing +- IO class is no longer a subclass of ostream +- bincimap-uidpwd uses getcwd and not get_current_working_dir +- Added --disable-starttls functionality, and added it to config, usage + and man pages. +- Cleaned up man pages more - added copyright notice +- Added FAQ to docs +- Added contrib area, all contribs are now bundled. +- Some bincimap.conf settings have changed. Defaul for allow plain auth + is "no". +- Minor updates to README +- Moved usage function to seperate file, out of bincimapd.cc +- Moved some configuration details into bincimapd-config.cc +- Now alternatively reads environment variable set in configuration +- All conf file settings can be properly overrun with command line options, + except authenticators. +- In authenticate.cc, proper handling of nonexistant root Maildir +- Append sleeps for a second before returning to ensure IMAP integrity + rules with APPEND. +- Removed comments about Outlook ;) +- CAPABILITY does not advertise STARTTLS if --disable-starttls is passed +- COPY moves chunks of 8k at a time instead of only one byte +- FETCH only full-parses a message at an RFC822.SIZE request if the + size is not already cached. +- LOGOUT no longer cares what's happened to the subscription list +- RENAME says that renaming inbox is not supported, and it properly + explains that you can't rename a folder _to_ INBOX. +- SEARCH parses messages if LARGER or SMALLER is queried for, and if the + size is not already cached. +- STARTTLS will not run if --disable-starttls is passed +- Restructured the RPM file. + +* Sun Feb 16 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- 1.0.23-1 +- Fixes to the man pages +- Running bincimapd with --version shows version +- Running bincimapd with --help shows complete command line option list +- All conf settings are also command line settings +- Removed option to set CA search path - use the CA file instead +- Fixed problem with LSUB requiring user to quote wildcards +- Auth timeout must be larger than 30 +- 1.0.23-2 +- Fixed a problem with CREATE which prevented users from creating + new folders. The new/ and tmp/ folders could also be removed by + mistake in this release. + +* Sat Feb 15 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- It's no longer allowed to create folders called INBOXsomething, without + the dot. +- Added buffers to IO class to allow logging SSL errors. +- updateFlags in Maildir:: no longer tries to update flags where no updates + have been made. +- All auth modules are now pure C++ +- APPEND, COPY, CREATE, DELETE, RENAME, STATUS checks for valid + Maildir through toMaildir function +- APPEND now fsyncs correct directory +- Fixed the problem with server rejecting "syslog" as logtype in conf file. +- Fixed putenv support in authenticate +- Fixed log output in authenticate +- conf files now use only --prefix +- package is now prefixed +- Split up maildir implementation and mime parser into smaller files +- Added Ivan F. Martinez' teapop authenticator to contrib/authenticators + +* Tue Feb 11 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Removed all the C debug code (for SSL) from the IO class +- Made SSL cipher list configurable +- General clean up in IO class, better error messages. +- SSL peer verification is now optional +- Make install problems are now solved, and conf files are generated + correctly. Only one prefix needed to build the package. +- Man pages! ^_^ + +* Mon Feb 10 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed problem with input parser "lock-up". The error was that the + output wasn't flushed. +- IO class doesn't run openlog twice if both command line args and + conf file say to use syslog. + +* Sun Feb 09 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- 1.0.22-1 +- Fixed myisprint, allowing Storage class to save correctly. +- Inserted prefix in spec file, as a first attempt to make the + package relocatable. +- Replaced setenv with putenv, allowing compile on Solaris +- LIST now shows nonexisting inferior mailboxes, with the NoSelect + flag set. +- COPY now uses time(NULL) instead of passed timestamp when storing + messages in destination folder. +- No longer creates .bincimap if none exists. + +* Sat Feb 08 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- 1.0.21-1 +- Minor changes to README +- Added Log section with log type in config +- Added "auto create inbox" to config - valid are "yes" or not "yes" +- Added "auto subscribe mailboxes" for when no subscribed file is found +- Added "umask" to Mailbox section - decides umask for whole session +- Transfer timeout is now used correctly +- Renamed regex files to 'regmatch' to avoid collision with posix regex +- PCRE was removed - in goes posix regex library +- Fixed toMaildir function to return relate rather than absolute path +- Removed PCRE dependencies everywhere +- Added fsync patch for file systems that don't support it - thanks + to Caskey Dickson for spotting this. +- Removed debug logging from Storage implementation. +- Moved mailbox creating into messagedepot and maildir classes. +- Added mode, owner and group settings when creating mailboxes. +- Added syslog support to IO class - somewhat messy, prefixed +- Changed <wait.h> to <sys/wait.h> everywhere +- Removed artifact from checkpassword auth stub, allowing use of non-passwd + based authenticators +- Removed debug logging from pendingUpdates +- All config settings are now read from global config file and used. +- Added command line option --logtype to override log type settings +- Subscription changes are now immediately saved to disk +- STATUS now reports all recent for mailboxes with no cache file +- LOGIN now correctly checks if plain text auth is allowed +- LIST now search relative to cwd, instead of from / +- Un-inlined some functions in FETCH do reduce memory exhaustion during + compile. The inlines are unnecessary. +- CREATE now uses messagedepot::create +- CAPABILITY now reports correctly whether or not plain text auth is + allowed. +- AUTHENTICATE now interprets config correctly wrt plain text auth +- authenticate function now always chdir's into Maildir. +- non chroot should work properly now +- All elements in "auto subscribe mailboxes" are inserted into the + subscribed list if there is no subscribed list. The list is then + saved to disk. +- Subscribed list is saved to current directory instead of / +- Checks for libdl, provides smooth compile under FreeBSD +- Added logtype to service and xinetd files +- xinetd files are now equal for ssl and non-ssl, except for the --ssl + option. +- cleaned up configure.in a bit. + +* Tue Feb 04 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- 1.0.19-1 +- When a new cache file is created, all messages are not marked as recent + as before +- Fixed big bug with expunged messages. +- Bumped cache & uidvalidity file version to avoid problems with messed + up cache files from expunge bug. +- SSL settings from conf file are now used in IO class +- 1.0.20-1 +- Fixed bug: subscription folders are now read as the user authenticates +- Fixed potential buffer overflow with improper use of sprintf +- Fixed service file "xinetd-bincimaps" with relocatable files +- Added README which describes installation procedure with tarball. + +* Sun Feb 02 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- 1.0.18-1 +- Added config.h support +- Removed -j 2 from spec file +- Removed Config class, replaced all uses with Storage +- Compatibility: prefixed all namespace std-includes with ::. +- Added more GPL headers to source +- Added BEFORE, BODY, KEYWORD, ON, SINCE, UNKEYWORD, SENTBEFORE, + SENTON, SENTSINCE to SEARCH +- More compatibility for lacking sstream support (untested) +- Now allows STORE operations with empty flag list () +- Removed "fromhex" binary from distro +- Fixed autoconf/automake problems with defining correct variables + on all known platforms. +- Removed traces of per-ip-subscription +- Almost all configurable settings can now be set through config file +- time and flags are ignored in APPEND, because the former implementation + and any implementation doing otherwise stands in risk of losing mails + in the depository. +- lex/yacc files are now not processed unless by explicitly performing + a "make grammar" in the args/ and storage/ directories. +- Fixed bug in STATUS which reported negative number of RECENT messages +- COPY no longer stores time stamp or flags +- Now correctly shows LOGINDISABLED in non-SSL mode if plain auth is + not supported. +- Support for AUTH=PLAIN - required by the protocol. +- supervise and xinetd files are now generated and follow configure + prefices, except the log files. +- Fixed bug with expunge and flag updates not getting reported properly + +* Sat Jan 25 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added special case for not cacheing status folders with + messages in new/ less than one second old + +* Tue Jan 21 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added support for RENAME. Does not yet support hierarchical rename. +- Fixed a race condition with not detecting folder changes. +- Added compatibility settings in build process (sstream->strstream for + old compilers, untested) + +* Mon Jan 20 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Added workaround for Outlook's broken "Inbox" prefix. If the uppercased + mailbox name is "INBOX", then it is set to "INBOX". If the uppercased + prefix of the mailbox is "INBOX.", then the prefix is replaced with + "INBOX.". This allows Outlook's "Inbox.subfolder" behavior. + +* Sun Jan 19 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- Fixed bug with lock file when selecting invalid maildir +- Now only moves files from new/ to cur/ if time_t part shows file is + older than one second. +- Never uses rename - always uses link() to prevent files from getting + lost. +- Fixed fetch problem because of case sensitive matching on mime headers +- Added --enable-static option to configure +- STATUS now returns correct number of RECENT messages. +- Added EXAMINE +- Speed up in scan() first checks for folder chance using stat +- Only 5 log files are kept, and they are rotated at 1MB. +- Fixed problem with gcc2 interpreting setw and setfill different from + gcc3, causing Binc IMAP compiled with gcc2 to sort messages wrongly. + +* Mon Jan 13 2003 Andreas Aardal Hanssen <bincimap at andreas.hanssen.name> +- AUTHENTICATE no longer requires first argument to be upper case +- Removed some debug info from the log files +- Fixed problem with getting kicked off when the uidvalidity bounces + at first select. diff --git a/INSTALL b/INSTALL @@ -0,0 +1,232 @@ +For specific instructions on how to install Binc IMAP, see the bundled +README. + +Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/opt/bincimap/bin', `/opt/bincimap/man', etc. You can specify an +installation prefix other than `/opt/bincimap' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Makefile.am b/Makefile.am @@ -0,0 +1,49 @@ +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +#-------------------------------------------------------------------------- +SUBDIRS = conf contrib doc man service src + +#-------------------------------------------------------------------------- +EXTRA_DIST = bincimap.spec config.h COPYING.OpenSSL config.h.in README.SSL + +#-------------------------------------------------------------------------- +cert: + @um=$(umask); umask 77 >/dev/null 2>&1; KEY=`mktemp /tmp/openssl.XXXXXX`; CERT=`mktemp /tmp/openssl.XXXXXX` ; openssl req -newkey rsa:1024 -keyout $$KEY -nodes -days 365 -out $$CERT ; cat $$KEY > bincimap.pem; echo "" >> bincimap.pem ; cat $$CERT >> bincimap.pem; rm $$CERT $$KEY; umask $(um) >/dev/null 2>&1 + @echo + @echo "Created 1024 bit private key and a certificate" + @echo "request in bincimap.pem. For more info, please" + @echo "read README.SSL." + +#-------------------------------------------------------------------------- +testcert: + @um=$(umask); umask 77 >/dev/null 2>&1; PEM1=`mktemp /tmp/openssl.XXXXXX`; PEM2=`mktemp /tmp/openssl.XXXXXX` ; openssl req -newkey rsa:1024 -keyout $$PEM1 -nodes -x509 -days 365 -out $$PEM2 ; cat $$PEM1 > $(DESTDIR)$(sysconfdir)/bincimap.pem; echo "" >> $(DESTDIR)$(sysconfdir)/bincimap.pem ; cat $$PEM2 >> $(DESTDIR)$(sysconfdir)/bincimap.pem; $(RM) $$PEM1 $$PEM2; umask $(um) >/dev/null 2>&1 + @echo + @echo "Created 1024 bit bincimap.pem" + @echo "private key with a 1 year test certificate." + @echo "This certificate is only secure in closed networks." + @echo "For more info, please read README.SSL." + +#-------------------------------------------------------------------------- +cacert: + @openssl req -out ca.pem -new -x509 + @um=$(umask); umask 77 >/dev/null 2>&1; KEY=`mktemp /tmp/openssl.XXXXXX`; CERT=`mktemp /tmp/openssl.XXXXXX` ; openssl req -newkey rsa:1024 -keyout $$KEY -CA ca.pem -nodes -x509 -days 365 -out $$CERT ; cat $$KEY > bincimap.pem; echo "" >> bincimap.pem; cat $$CERT >> bincimap.pem; rm $$KEY $$CERT; umask $(um) >/dev/null 2>&1 + @echo + @echo "Created CA certificate in ca.pem." + @echo "Created 1024 bit private key and certificate in bincimap.pem (lasts 365 days)." + @echo "For more info, please read README.SSL." + +#-------------------------------------------------------------------------- +install-exec-hook: + @echo >> $(srcdir)/install.log + @echo "Installation of Binc IMAP v@VERSION@ is complete. Happy IMAPing!" >> $(srcdir)/install.log + @echo + @cat $(srcdir)/install.log + @echo diff --git a/NEWS b/NEWS diff --git a/README.SSL b/README.SSL @@ -0,0 +1,159 @@ +This documentation 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 2 of the +License, or (at your option) any later version. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + +========================================================================= + +Quick guide to SSL certificates with Binc IMAP. + +Table of contents: + +0. Introduction +1. To generate a private key and certificate request +2. To generate a private key and self-signed certificate +3. To generate a private key and CA signed certificate, acting as + one's own CA. + +For more information, check out the project home page's FAQ and +the Life With Binc IMAP community documentation site: + +http://www.lifewithbincimap.org/ + +========================================================================= + +0. Introduction +--------------- + +To use SSL with Binc IMAP, you need a private key and a certificate. + +A private key is a random string of bits that is secret to your host. +If this key is compromised, your SSL server will no longer provide +significant security for your users. + +The certificate is among the first things the server sends to a +client. The client uses this certificate to make certain that it is +communicating with the correct host. To do this, it needs to check the +certificate with a trusted third party, usually via a separate +Internet connection. + +There are in general two types of certificates: + +- CA signed certificates +- Self signed certificates + +CAs, or Certificate Authorities, are used by clients to verify the +authenticity of a certificate. If you want an official CA to verify +your certificate, you need to send a "certificate request". Usually +for a certain price, a signed certificate is returned to you. If you +do not wish to use an official CA, you can act as your own CA and +create your own CA signed certificates. + +A certificate is not valid unless it is signed. If it is self signed, +the clients can not verify its identity. In that sense, a self signed +certificate is only useful in a test environment. The client can not +identify the server if the server uses a self-signed certificate. + +The general idea is: + +* If you are testing an SSL enabled server, generate a self-signed +test certificate. + +* If you want to provide an SSL enabled service on a closed network, +create a CA certificate and a signed host certificate, then install +the CA certificate on all clients on the network. + +* If you want to provide an SSL enabled service on an open network +such as the Internet, use an official CA to sign your certificate. + +1. To generate a private key and certificate request +---------------------------------------------------- + +Quick hit: "make cert". + +To generate a private key and a certificate request, the following +openssl command can be used: + +openssl req -newkey rsa:1024 -keyout bincimap.key -nodes -days 365 -out bincimap.crq + +Inside bincimap.crq is a certificate request in PEM encoding, which +basically means the certificate is base64 encoded and enclosed in a +start string that says "BEGIN CERTIFICATE REQUEST" and an end string +that says "END CERTIFICATE REQUEST". + +Submit this request file to a CA such as Thawte +(http://www.thawte.com/) or Verisign (http://www.verisign.com/). When +you receive the signed certificate from them, store this in a file +called bincimap.crt. + +The file contains the PEM encoded certificate, and it is enclosed in +a start string that says "BEGIN CERTIFICATE" and an end string that +says "END CERTIFICATE". + +Copy the contents of both these files into a file called +"bincimap.pem" and place this file at a location that is read-only for +the bincimap-up process (typically root). + +Then edit bincimap.conf, go to the SSL section and set the path of +this file in the "pem file" option. + +You're now ready to use Binc IMAP with SSL. + +2. To generate a private key and self-signed certificate +-------------------------------------------------------- + +Quick hit: "make testcert". + +To generate a private key and a self-signed certificate, the following +openssl command can be used: + +openssl req -newkey rsa:1024 -keyout bincimap.key -x509 -nodes -days 365 -out bincimap.crt + +Copy the contents of the generated bincimap.key and bincimap.crt files +into a file called "bincimap.pem" and place this file at a location +that is read-only for the bincimap-up process (typically root). + +Then edit bincimap.conf, go to the SSL section and set the path of +this file in the "pem file" option. + +You're now ready to test Binc IMAP with SSL. + +3. To generate a private key and CA signed certificate, acting as + one's own CA. +------------------------------------------------------------------ + +Quick hit: "make cacert". + +First you need to generate a CA certificate. This command creates such +a certificate and places it in a file called "ca.pem": + +openssl req -out ca.pem -new -x509 + +Using this CA certificate, we can generate a private key and a +_signed_ certificate, like this: + +openssl req -newkey rsa:1024 -keyout bincimap.key -CA ca.pem -nodes -x509 -days 365 -out bincimap.crt + +Copy the contents of the generated bincimap.key and bincimap.crt files +into a file called "bincimap.pem" and place this file at a location +that is read-only for the bincimap-up process (typically root). + +Then edit bincimap.conf, go to the SSL section and set the path of +this file in the "pem file" option. + +You're now ready to use Binc IMAP with SSL. + +Happy IMAPing! + Andy :-) + +========================================================================= +Tell us what you think about this server! Post any problems, remarks +or comments to: + +The Binc IMAP mailing list <lists-bincimap@infeline.org> + +Author: Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> diff --git a/README.in b/README.in @@ -0,0 +1,203 @@ +This documentation 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 2 of the +License, or (at your option) any later version. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + +========================================================================= + +Welcome to Binc IMAP! This is the documentation for v@VERSION@. + +Here is a quick guide on how to setup IMAP on your system. + +Note that this is not the full documentation for Binc IMAP. You will +find more about the server by viewing the man pages and reading +through the bundled documentation under /opt/bincimap/doc. + +You can also check out the project home page's FAQ and the Life With +Binc IMAP community documentation site: + +http://www.lifewithbincimap.org/ + ++=======================================================================+ +| | +| The following library is required for Binc IMAP to support SSL: | +| | +| OpenSSL - http://www.openssl.org/ | +| | ++=======================================================================+ + +For instructions on compiling from the tarball, please scroll down. + +If you do not plan to modify the original source code, it will suffice +to grab one of the precompiled binary RPM packages from: + +http://www.bincimap.org/dl/RPMS + +NOTE: These are RedHat/SuSe packages. There are packages available for +Mandrake, Debian and FreeBSD among other distributions. Search for +"Binc IMAP" or "bincimap" on the respective distributions' web sites +to learn more. + +If you can't find a precompiled binary that matches your system, you +can grab a source RPM from here: + +http://www.bincimap.org/dl/SRPMS + +To create RPM packages for your system, you can run the following +command as root: + +rpmbuild --rebuild bincimap-a.b.c-d.src.rpm + +At the end of the input, you will see where your binary package has +been generated. If the rebuild fails, the package is easy to +build from the tarball. + +========================================================================= + +Here's how to set up the service when building from the tarball. Note +that if you experience any problems in this section, do not hesitate +to post your problems to the Binc IMAP mailing list. + +---------------------- +1) Compile the service +---------------------- + +./configure +make +make install # Note: Mac OS X users need to use "sudo make install" + + Add --enable-static to ./configure to build a static binary + (a binary that does not depend on the shared libraries on + the machine it's built on). + + If you want to place the binaries and configuration files in + a different place from what's default, use the --prefix and + --sysconfdir arguments to configure. + + To set the location of the log directories (with multilog), + set --localstatedir. + + If you want smaller binaries, run "make install-strip" instead + of "make install". + + To create a self signed SSL certificate, run "make testcert". Read + more on SSL certificates in README.SSL. + +-------------------------------- +2) Apply necessary configuration +-------------------------------- + + Edit the destination bincimap.conf file, which by default is + installed under /etc/opt/bincimap. Check each + individual setting. + + * Note the location of your server's SSL PEM-encoded + certificate. If you do not have one, you can run "make testcert" + to create a test certificate. + * Note the default path to users' mail depot, relative to the + users' home directories. If the depot directory is ~/Maildir, + set path = "Maildir". If the depot is the current directory, + set path = ".". Remember that if you're using + IMAPdir, the depot needs to have a mailbox called INBOX. + * Use the man pages bundled with the distribution, under + the man/ directory. + + You can read more about this in the bundled FAQ under the + doc/ directory. + + If using daemontools' supervise, tcpserver and multilog, + create the multilog directores. + +mkdir -p /var/opt/log/bincimap{,-ssl} +chown nobody.nobody /var/opt/log/bincimap{,-ssl} + + xinetd users will be more familiar with using syslog. + +---------------------------- +3) Install the service files +---------------------------- + + With xinetd: + + Edit /etc/opt/bincimap/xinetd/imap and + /etc/opt/bincimap/xinetd/imaps and check that the locations + of configuration files and binaries are correct. + + Note the location of your checkpassword authenticator in + particular, and use the man pages to find what options you need + to pass. + + You may also want to symlink them to /etc/xinetd.d instead + of copying the files. + +ln -s /etc/opt/bincimap/xinetd/imap /etc/xinetd.d/imap +ln -s /etc/opt/bincimap/xinetd/imaps /etc/xinetd.d/imaps +service xinetd restart + + With daemontools' supervise: + + Edit /etc/opt/bincimap/service/imap/run, + /etc/opt/bincimap/service/imap/log/run, + /etc/opt/bincimap/service/imaps/run and + /etc/opt/bincimap/service/imaps/log/run and + check that the locations are correct. + Note the location of your authenticator in particular. + + Then copy or symlink the service files in place. + +ln -s /etc/opt/bincimap/service/imap /service/imap +ln -s /etc/opt/bincimap/service/imaps /service/imaps + + There are 'down' files in both service directories, + so you will have to run 'svc -u' on both services (and + log files) to get them running. + +---------------------------- +4) Securing your service +---------------------------- + + - It's a good thing to not allow users to pass their passwords + over a plain text connection. Require that your users enable + SSL by setting this option in your Authentication section + in bincimap.conf: + + allow plain auth in non ssl = "no" + + - Binc IMAP allows users to retry a login if the password they + submit is wrong. To make it harder for malicious users to + brute force passwords, Binc IMAP allows you to make it sleep + for a certain number of seconds after a failed password. You + can set this to 0, for no penalty, but this is a recommended + value: + + auth penalty = 4 + + - The bincimap-up stub channels input to and output from the + main IMAP server. It does this in what we call a "chroot + jail". Make sure you set the path to an empty directory on + your server, preferable one in which a certain unprivileged + user has no rights: + + Security { + jail path = "/opt/bincimap/bin", + jail user = "nobody", + jail group = "nobody" + } + +Happy IMAPing! With these settings your copy of Binc IMAP should be +operational. For more information, please check out the man pages and +FAQ. + Andy :-) + +========================================================================= +Tell us what you think about this server! Post any problems, remarks +or comments to: + +The Binc IMAP mailing list <binc@bincimap.org> +The Binc IMAP Developers' mailing list <binc-dev@bincimap.org> + +Author: Andreas Aardal Hanssen <andreas-binc@bincimap.org> diff --git a/TODO b/TODO diff --git a/aclocal.m4 b/aclocal.m4 @@ -0,0 +1,844 @@ +# generated automatically by aclocal 1.7.2 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*- + +# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_PREREQ([2.52]) + +# serial 6 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# This macro actually does too much some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 8 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +AC_PREREQ([2.54]) + +# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow +# the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl + AC_SUBST([PACKAGE], [AC_PACKAGE_TARNAME])dnl + AC_SUBST([VERSION], [AC_PACKAGE_VERSION])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG(AMTAR, tar) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl + +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[_am_stamp_count=`expr ${_am_stamp_count-0} + 1` +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# Copyright 2002 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.7"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.7.2])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright 2001, 2002 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# +# Check to make sure that the build environment is sane. +# + +# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# -*- Autoconf -*- + + +# Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# AM_AUX_DIR_EXPAND + +# Copyright 2001 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +# Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50]) + +AC_DEFUN([AM_AUX_DIR_EXPAND], [ +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. + +# Copyright 2001 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# AM_PROG_INSTALL_STRIP + +# Copyright 2001 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# serial 4 -*- Autoconf -*- + +# Copyright 1999, 2000, 2001 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + echo '#include "conftest.h"' > conftest.c + echo 'int i;' > conftest.h + echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=conftest.c object=conftest.o \ + depfile=conftest.Po tmpdepfile=conftest.TPo \ + $SHELL ./depcomp $depcc -c -o conftest.o conftest.c >/dev/null 2>&1 && + grep conftest.h conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[rm -f .deps 2>/dev/null +mkdir .deps 2>/dev/null +if test -d .deps; then + DEPDIR=.deps +else + # MS-DOS does not allow filenames that begin with a dot. + DEPDIR=_deps +fi +rmdir .deps 2>/dev/null +AC_SUBST([DEPDIR]) +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking Speeds up one-time builds + --enable-dependency-tracking Do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +#serial 2 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +doit: + @echo done +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST(am__include) +AC_SUBST(am__quote) +AC_MSG_RESULT($_am_result) +rm -f confinc confmf +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 5 + +AC_PREREQ(2.52) + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]) +fi])]) + + +# Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + +# This program 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 2, or (at your option) +# any later version. + +# This program 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +AC_PREREQ(2.50) + +# AM_PROG_LEX +# ----------- +# Autoconf leaves LEX=: if lex or flex can't be found. Change that to a +# "missing" invocation, for better error output. +AC_DEFUN([AM_PROG_LEX], +[AC_REQUIRE([AM_MISSING_HAS_RUN])dnl +AC_REQUIRE([AC_PROG_LEX])dnl +if test "$LEX" = :; then + LEX=${am_missing_run}flex +fi]) + diff --git a/autogen.sh b/autogen.sh @@ -0,0 +1 @@ +aclocal && autoheader && autoconf && touch README && automake -a && echo "Ready to run configure." diff --git a/bincimap.spec.in b/bincimap.spec.in @@ -0,0 +1,1175 @@ +#test +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +#----------------------------------------------------------------------- +# package parameters + +# version and release can be overridden on the rpmbuild command-line +# with --define 'release 2', etc. + +%{!?version:%define version @VERSION@} +%{!?release:%define release 1} + +# --without ssl -- build without SSL support (default is --with ssl) +# --with inusr -- install into /usr instead of /opt + +#%{!?_without_ssl:%define _without_ssl --without-ssl} +%{!?_with_inusr:%define inopt 1} + +#----------------------------------------------------------------------- +Summary: Binc IMAP server +Name: @PACKAGE@ +Version: %{version} +Release: %{release} +URL: http://www.bincimap.org/ +Source0: %{name}-%{version}.tar.gz +License: GPL +Group: System Environment/Daemons +BuildRoot: %{_tmppath}/%{name}-%{version}-root +Packager: Andreas Aardal Hanssen <andreas-binc@bincimap.org> +Vendor: Andreas Aardal Hanssen <andreas-binc@bincimap.org> +%{?_with_ssl:BuildRequires: openssl-devel} +%{?_with_ssl:Requires: openssl} +%{!?inopt:Prefix: /usr} + +# Path settings for /opt installation (for /usr installation +# the default RedHat macros work as is) +%{?inopt:%define _prefix /opt/@PACKAGE@} +%{?inopt:Prefix: %{_prefix}} +%{?inopt:%define _sysconfdir /etc/opt} +%{?inopt:%define _localstatedir /var/opt} +%{?inopt:%define _docdir %{_prefix}/doc} +%{?inopt:%define _mandir %{_prefix}/man} +%{?inopt:%define _sbindir %{_prefix}/bin} + +#----------------------------------------------------------------------- +%description + +Binc IMAP is an IMAP server, written in C++ for the Linux platform. It +supports Dan J. Bernstein's Maildir format and checkpassword +authentication. + +As an alternative to existing similar IMAP servers, Binc IMAP strives +to be + +* very easy to install and use, but robust, stable and secure +* absolutely compliant with the IMAP4rev1 protocol +* simple and modular in design, making it very easy for + third parties to utilize the source code and enhance the + product. + +Binc IMAP is released under the GNU General Public License. + +#----------------------------------------------------------------------- +%prep +%setup -q + +#----------------------------------------------------------------------- +%build + +STATIC=--enable-static + +CXXFLAGS="-O2 -s -I/usr/kerberos/include" +%configure $STATIC --prefix=/opt/@PACKAGE@ --sysconfdir=/etc/opt/@PACKAGE@ --localstatedir=/var/opt + +make + +#----------------------------------------------------------------------- +%install +rm -rf $RPM_BUILD_ROOT + +# shouldn't we be using a 'make install' target for all this? + +PRE=$RPM_BUILD_ROOT%{_prefix} +BIN=$RPM_BUILD_ROOT%{_sbindir} +ETC=$RPM_BUILD_ROOT%{_sysconfdir}/@PACKAGE@ +SCR=$RPM_BUILD_ROOT%{_sysconfdir}/@PACKAGE@/scripts +VAR=$RPM_BUILD_ROOT%{_localstatedir} +MAN=$RPM_BUILD_ROOT%{_mandir} + +# Directory structure +install -d $BIN +install -d $ETC/xinetd +install -d $SCR +install -d $ETC/service/imap/log +install -d $ETC/service/imaps/log +install -d $MAN/man1 +install -d $MAN/man5 +install -d $VAR/log/@PACKAGE@ +install -d $VAR/log/@PACKAGE@-ssl + +# Binaries +install src/bincimapd $BIN +install src/bincimap-up $BIN + +# Config files +install conf/bincimap.conf $ETC +install conf/xinetd-bincimap $ETC/xinetd/imap +install conf/xinetd-bincimaps $ETC/xinetd/imaps + +install conf/checkpassword.pl $SCR +install conf/toimapdir $SCR +#install conf/tomaildir++ $SCR +install conf/xinetd-bincimaps $ETC/xinetd/imaps +install conf/xinetd-bincimaps $ETC/xinetd/imaps + +install service/run $ETC/service/imap/run +install service/log/run $ETC/service/imap/log/run +install service/run-ssl $ETC/service/imaps/run +install service/log/run-ssl $ETC/service/imaps/log/run + +# Documentation +# (the non-man doc files are taken care of with the %doc macro) +install man/bincimapd.1 $MAN/man1 +install man/bincimap-up.1 $MAN/man1 +install man/bincimap.conf.5 $MAN/man5 + +#----------------------------------------------------------------------- +%clean +#rm -rf $RPM_BUILD_ROOT + +#----------------------------------------------------------------------- +%files +%defattr(755,root,root) + +# Documentation files (other than man pages) +%doc README README.SSL COPYING COPYING.OpenSSL ChangeLog +%doc doc/bincimap.css doc/bincimap-*.html +%doc doc/manual/bincimap-manual.{dvi,ps} +%doc doc/rfc2060.txt doc/rfc2683.txt + +# These dirs belong to the package only if in /opt +%{?inopt:%dir %{_prefix}} +%{?inopt:%dir %{_bindir}} +%{?inopt:%dir %{_mandir}} +%{?inopt:%dir %{_mandir}/*} + +# Directories +%dir %{_sysconfdir}/@PACKAGE@ +%dir %{_sysconfdir}/@PACKAGE@/service +%dir %{_sysconfdir}/@PACKAGE@/service/imap +%dir %{_sysconfdir}/@PACKAGE@/service/imap/log +%dir %{_sysconfdir}/@PACKAGE@/service/imaps +%dir %{_sysconfdir}/@PACKAGE@/service/imaps/log +%dir %{_sysconfdir}/@PACKAGE@/xinetd +%dir %{_localstatedir}/log/@PACKAGE@ +%dir %{_localstatedir}/log/@PACKAGE@-ssl + +# Binaries +%defattr(755,root,root) +%{_sbindir}/bincimapd +%{_sbindir}/bincimap-up +#%{_sysconfdir}/@PACKAGE@/scripts/tomaildir++ +%{_sysconfdir}/@PACKAGE@/scripts/toimapdir +%{_sysconfdir}/@PACKAGE@/scripts/checkpassword.pl + +# Config files +%config %{_sysconfdir}/@PACKAGE@/service/imap/run +%config %{_sysconfdir}/@PACKAGE@/service/imap/log/run +%config %{_sysconfdir}/@PACKAGE@/service/imaps/run +%config %{_sysconfdir}/@PACKAGE@/service/imaps/log/run +%defattr(644,root,root) +%config %{_sysconfdir}/@PACKAGE@/bincimap.conf +%config %{_sysconfdir}/@PACKAGE@/xinetd/imap +%config %{_sysconfdir}/@PACKAGE@/xinetd/imaps + +# Man pages +%{_mandir}/man1/bincimapd.1* +%{_mandir}/man1/bincimap-up.1* +%{_mandir}/man5/bincimap.conf.5* + +#----------------------------------------------------------------------- +%changelog + +* Tue Jan 20 2004 Andreas Aardal Hanssen <andreas-binc@bincimap.org> +- Removed time_t <-> int implicit conversion and overload ambiguity. +- Rewrote the flow of the APPEND command, and the readStr command + in io.cc. +- Fixed behavior of fetching TEXT attribute. +- 1.2.6beta3-1 + +* Fri Jan 16 2004 Andreas Aardal Hanssen <andreas-binc@bincimap.org> +- Fixed a bug where FETCH sometimes claimed that mime parts had + the wrong size. +- Reverted an erroneous change from 1.2.3 to 1.2.4 in io.cc, where + readStr() no longer initialized the input buffer to "". +- AppendOperator now stores the correct date on saved messages. +- 1.2.6beta2-1 + +* Wed Jan 14 2004 Andreas Aardal Hanssen <andreas-binc@bincimap.org> +- Two bugs were fixed that prevented a message that was saved to a + mailbox from getting the requested internaldate. +- A bug in the unfolding of MIME headers erroneously removed what was + believed to be comments from within quoted text. This messed up + parsing multipart messages with parenthesis in their boundary + strings. +- 1.2.6beta1-1 +- Removed folder prefixes from header comments in all files. The + comments now only mention the base name of the file. + +* Mon Jan 12 2004 Andreas Aardal Hanssen <andreas-binc@bincimap.org> +- LIST and LSUB now return X if X/* is queried for, as recommended + by Marc Crispin on the IMAP protocol list. +- AUTHENTICATE PLAIN now writes "+ \r\n" instead of "+\r\n" as an + initial response. KMail got confused by only the "+", while pine + got confused by "+ OK". This compromise makes AUTHENTICATE PLAIN + work for both clients, while still being completely IMAP compliant. +- Added Daniel James' patch which fixes HEADER.FIELDS.NOT behavior. + +* Fri Jan 09 2004 Andreas Aardal Hanssen <andreas-binc@bincimap.org> +- Fixed problem with APPEND locking up +- Fixed bug where clients were not informed when messages were + expunged. +- 1.2.5-1 + +* Thu Jan 08 2004 Andreas Aardal Hanssen <andreas-binc@bincimap.org> +- Headers now display 2002-2004 in copyright notice. +- 1.2.4-1 + +* Wed Jan 07 2004 Andreas Aardal Hanssen <andreas-binc@bincimap.org> +- Removed mime-printstruct.cc - it caused compile problems, and is + not in use. +- Added Zak Johnson's patch to fix TRYCREATE +- Added Jason Parson's patch to fix a problem with creating lock files. + The open function didn't get the mode argument, and the lock was + created with random mode bits set. + +* Thu Dec 18 2003 Andreas Aardal Hanssen <andreas-binc@bincimap.org> +- Removed lex/yacc storage parser and replaced it and the whole + Storage class with a new approach. This uses less memory and is + faster. Refactoring of units depending on Storage was required. +- Binc no longer requires the SSL cipher list to be set. If left + empty or not set, the default ciphers in OpenSSL are used. + +* Mon Dec 15 2003 Andreas Aardal Hanssen <andreas-binc@bincimap.org> +- Removed memory bloat. Binc IMAP no longer reads entire fetch + responses into memory before outputting them, with the exception + of header fetch responses. + +* Mon Dec 08 2003 Andreas Aardal Hanssen <andreas-binc@bincimap.org> +- Fixed two bugs in FETCH that messed up the fetch attributes and + gave the full header when fetching only selected fields. +- Fixed a bug in the MIME parser. We now successfully parse + Mark Crispin's torture tests completely. + +* Fri Dec 05 2003 Andreas Aardal Hanssen <andreas-binc@bincimap.org> +- Server now correctly displays BAD response if the stub is not + parsed correctly. + +* Thu Dec 04 2003 Andreas Aardal Hanssen <andreas-binc@bincimap.org> +- Added README.SSL +- README and README.SSL now mention the LifeWithBincIMAP.org site. + +* Tue Dec 02 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- The version number in the IMAP greeting can now be switched off with + the "version in greeting" option in Security in bincimap.conf. +- The conf files now accept the '#' character as the start of a comment, + except when quoted. +- Log now reports correct number of (unencrypted) bytes read or written. + +* Fri Nov 28 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Implemented support for fetch attributes ALL, FULL and FAST, which + for some reason had no implementation yet. +- Fixed two bugs in operator-authenticate.cc in reading input to the + AUTHENTICATE command. Basically the server would loop forever if + the client suddenly disconnected while Binc was reading the + arguments. +- Leaving the jail settings in Security{} in bincimap.conf empty + will prevent bincimap-up from entering the chroot jail and becoming + the jail user/group, but will no longer issue any warnings about it. +- Greeting now uses (C) after Copyright instead of (c) before it. +- Removed almost all time(), alarm() and signal() use. Use of this + technique for detecting timeouts is very error prone. We now use + select() instead. +- Major changes to parser allow better detection of timeouts, and more + proper error reporting. + +* Tue Nov 25 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Applied Zak Johnson's patch for fixing a typo in using the + "environment ip variable" setting in bincimap.conf. + +* Tue Nov 17 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed problem in maildir.cc where messages that are created with a + given internaldate always got time(0) instead. + +* Tue Oct 28 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed typos in README + +* Tue Oct 04 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added Gerrit's patch to solve operator<< ambiguous overload. + +* Tue Sep 29 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added doxygen docs. + +* Fri Sep 26 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added Jeremy Rossi's patch, which allows plain text authentication + if the environment variable ALLOWPLAIN is set. This can be used by + tcpserver to allow plain text authentication for clients connecting + from certain IP addresses. + +* Tue Sep 23 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added cache to LIST requests - speeds up consecutive LIST requests + significantly. + +* Sun Sep 21 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added new scripts to files section in spec file. The scripts were not + installed with the earlier rpm packages. + +* Sat Sep 20 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added scripts: "toimapdir", "tomaildir++" and "checkpassword.pl" +- Fixed two bugs in the MIME parser. +- Improved error reporting when creating mailboxes with invalid names. +- 1.2.3-1 + +* Thu Sep 18 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed STATUS to more properly report recent and uidnext. +- Fixed maildir-scan.cc to correctly parse unique part of messages that + erroneously contain more than one ':'. Specifically, the former parser + assumed the ':' was always followed by ",2". + +* Wed Sep 17 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed problem with some mailboxes being marked as \Noselect when + selectable. Not related to Mozilla mailbox error. +- Removed some useless log output. + +* Sun Sep 14 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed memory leak in bincimapd by adding reference counting. +- LSUB sets \Noselect again +- bincimap-subscribed is now called .bincimap-subscribed. The format is + greatly simplified. Existing subscribe-files are automatically + converted to the new format. + +* Wed Sep 10 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- "make cert" no longer uses absolute paths for mktemp and openssl. +- LSUB always reads subscribed entries from bincimap-subscribed. +- LSUB does not set the \NoSelect flag. +- 1.2.2-1 + +* Tue Sep 09 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed bug in MIME parser where message sizes were mixed up, causing + some bodies to be reported as empty. Pine reacted to this bug by + reporting an unexpected message size. + +* Sat Sep 06 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed bug in fillInputBuffer when converting CRLF files. + +* Fri Sep 05 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Greeting now displays time in 24h style instead of 12h style + with missing AM/PM. +- Fixed bug in MIME parser where mozilla did not display attachments + correctly. +- MIME parser speedup for partial content fetches +- MIME parser now uses unsigned ints everywhere. +- Artifact off-by-two error in mime parser is now gone. +- BODY response now correctly terminates with a matching ')'. + +* Fri Sep 04 2003 Jurgen Botz <jurgen@botz.org> +- parameterized rpm for '--without ssl' and '--with inusr' +- parameterized version and release (use with --define) +- use configure macro so all the paths are passed to configure + (this might help in future if more paths get used) +- fixed the install and files sections to allow installing into + either /usr or /opt while conforming to FHS +- shared directories shouldn't be owned by the package (i.e. /opt, + /etc, etc.) +- use the doc macro to install doc files + +* Tue Sep 02 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- COPY now correctly reports errors with [TRYCREATE] if the destination + mailbox does not exist. +- supervise files are now in service/ and not supervise/. +- 1.2.1-1 + +* Sun Aug 31 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed so supervise/imaps/run and log/run are copied from the correct + source for "make install" +- Fixed bug in STATUS with Maildir where only messages whose file names + started with a digit were counted. +- bincimapd man page now has an ENVIRONMENT section. + +* Fri Aug 29 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Removed '-v' option from all 'rm'. This option is not defined on + OpenBSD. + +* Thu Aug 28 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed problem with hanging bincimapd +- Known bug: STATUS does not report correct UIDNEXT when there are recent + messages. A temporary fix has been added, which has a non serious race + condition. +- 1.2.0-1 + +* Sat Aug 23 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- BincStream is now a subclass of ostream again, after reports about + hanging processes. +- Added "make cert" for creating an SSL certificate. +- Changed default certificate location in bincimap.conf to the same + directory as bincimap.conf. +- Passing --localstatedir to configure now sets the prefix for the log + dirs for multilog. +- The log/run files now log to the localstate set directory. +- Added version to README file. +- "make install" no longer overwrites existing conf/run/xinetd files. +- Added notice to end of "make install" output. +- Now reports argument (hasn't done this for a while). + +* Fri Aug 22 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- RENAME now renames hierarchies of mailboxes correctly also when the + destination name is longer than the original name. + +* Sun Aug 17 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixes to mime-utils.h make it compile on more platforms. +- TestBincStream binary is no longer installed +- Depot code removed from bincimap-up, it doesn't belong there. +- operator-logout doesn't have mailbox code in bincimap-up. +- 1.2.0b1-1 + +* Sat Aug 16 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Replaced fgetcCRLF with a buffering much simpler alternative. Also + with support for Mac files (so \r, \r\n and \n are all converted to + proper \r\n before processing). 20% speed increase on parser because + of this. +- Fixed memory leak problem with fopen and open used on same file + descriptor. + +* Fri Aug 15 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed bug where UID COPY treated sequence set as sequence numbers and + not UIDs. + +* Thu Aug 14 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed link copying. Messages are now sorted by internaldate on first + select. Then it is sorted by arrival. This allows copying while keeping + internaldate. Note that we now keep both flags and internaldate when + copying or appending messages. +- 1.1.9-1 + +* Tue Aug 12 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed issues with cache and losing file descriptors. + +* Mon Aug 11 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Decided to bump the cache version number because the new message + sorting algorithm gives a different order of arrival than before. This + forces all new clients to resync their mailboxes. + +* Thu Aug 07 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Any files in cur/ and new/ are treated as messages. +- Internaldate of messages is now acquired by stating files and not + by simply inspecting the filename. + +* Thu Jul 31 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Replaced all use of exceptions with return values, or sometimes by + ignoring errors that are not worth reporting. +- Size of binaries is down by 35% when Binc IMAP now compiles with + -fno-exceptions. Those 35% extra were in the data segment, + and they were actually not shared among processes. No thanks to the + gcc team for bloating g++ binaries that use exceptions. :-) +- Implemented full buffering of input and output. Earlier versions + read and wrote data byte by byte, all is now buffered. +- COPY and APPEND operations now keep message flags. +- Depot -> Mailbox -> Message API is greatly improved. There is now + no MIME or Maildir specific code in operators. Approaching point + where we can introduce more backends. +- Mailbox iterator design is much better than before. Depot and Mailbox + iterators are implemented as proxy objects. +- Improved processing of messages makes parser single-pass. Measurements + have shown a performance increase of over 40%. +- Memory footprint of messages is smaller. +- Maildir message cacheing is greatly improved, and controlled + completely by the MaildirMessageCache singleton. The File class is + gone. +- Unsigned ints everywhere allow UID, UIDVALIDITY, sequence numbers + and sizes to be in the full range 0-4294967295. +- Largefile support (O_LARGEFILE). +- Renamed Command to Request (which is more accurate). +- Renamed BincImapParserSet to SequenceSet. +- Improved log output and error reporting. +- Fixed a bug with subscribing to mailboxes. If you subscribed to a + mailbox that didn't exist (which is ok), it wasn't listed in the + output of LSUB. Now it is, but with \NoSelect. +- Added openlog patch, which fixes a problem with trash log output + when using syslog. +- Added the subfolders patch, which fixes the bug where Binc IMAP + would claim that no subfolder creation was allowed, although it + was. +- Switched main development platform to SuSe Linux, so now we have + SuSe packages (for 8.2) in addition to the RedHat packages. + +* Sat May 31 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed bug in operator-capability.cc that did not advertise STARTTLS + correctly. + +* Fri May 30 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- All NULL replaced with 0. +- Cosmetics on .h files, removed lots of whitespace. + +* Sun May 25 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- More work on the manual +- Added manual to distro +- 1.1.8-1 + +* Fri May 23 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- FETCH ENVELOPE now correctly defaults sender and reply-to fields to + the from-field. + +* Thu May 22 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Applied Gerrit's patch to allow compile with gcc-3.3 +- Fixed a bug for strstream users in BincStream that assumed a + stream was 0-terminated after a clear() even though that wasn't + always true. +- Fixed typo in operator-login.cc that disallowed plain text auth + in ssl connection. +- Removed extensive logging from operator-append.cc +- Added more contributors to AUTHORS file +- Added Sergei's patch to install-exec-hook and uninstall-hook + +* Tue May 20 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Minor change to mailbox/mailbox.h allows linking of bincimap-up without + adding the mailbox library. +- 1.1.7-1 + +* Mon May 19 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added short options support for the new argument parser. Now has + more logical short option characters than before. +- Updated man pages with new short options +- Removed the --debug argument completely. Use --ssl instead. +- Added workaround for compiler bug using FreeBSD and gcc 2.95.x. +- Wrote more on Binc manual. + +* Sun May 18 2003 Eivind Kvedalen <bincimap@eivind.kvedalen.name> +- addCapability added to BrokerFactory +- Default capabilities moved to CapabilityOperator::CapabilityOperator. +- Old argument parser removed +- New argumentparser implemented +- Storage::hasKey added +- Storage::get added +- Command::extra is now public +- Session::parseCommandLine added + +* Sun May 18 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added first draft of the Binc IMAP manual. +- Removed redundant getcwd() from bincimapd.cc. +- Removed gnugetopt / getopt_long requirement. +- Updated html documentation +- Fixed a bug in FETCH with multipart extension data. +- 1.1.6-1 + +* Tue May 13 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added basic statistics to log output when client logs off +- A temporary hack in the mime parser was added to prevent empty mime + parts to have a negative size. +- Added uninstall hooks. + +* Mon May 12 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- manpages are now installed correctly from the tarball. +- log prefix is now fixed and enabled for multilog type logging only +- getpid is only grabbed once in the IO constructor +- Session now properly supports importing and exported data to environment +- bincimapd no longer reads command line arguments or globalconfig, + but inherits them from the environment. +- man pages for bincimap-up and bincimapd were updated with new command + line options (all are passed to bincimap-up) +- service and xinetd files no longer pass configuration details to + bincimapd. +- CAPABILITY no longer reports auth or starttls capabilities in + authenticated state +- Removed excessive logging from LIST output. +- Fixed "auto create inbox" functionality for both empty and non-empty + Mailbox paths, and for both IMAPdir and Maildir++. +- Removed intercomerr tunnel from authenticate.cc +- authenticate.cc exports state to environment before invoking + authenticator. +- Added install hooks for service/ and service/log/ files +- Added install hooks for xinetd and conf files. + +* Sat May 10 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- bincimapd now interprets command line args before anything else (allows + --version etc..) + +* Thu May 08 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Updated man pages to point to the bincimap.org site + +* Mon May 05 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added Gerrit's be-nice patch "diff" to convert.h, replacing a switch + with a series of if-tests, working around a compiler bug on the Alpha + platform for FreeBSD and Debian ports. +- LSUB now always sorts subscription list before showing it to the + client. +- Removed log output from LOGIN - authenticate.cc logs enough already. +- In authenticate.cc, jail is entered after first chunk of data (the + ok response) is written from bincimapd. Fixes bug where retrying a failed + password would always fail. +- Improved log output in authenticate.cc. +- Removed the kill(...) calls in authenticate.cc, they could lead to some + unintended behavior if pids cycle. +- Improved log output in bincimap-up and bincimapd. +- In INSTALL, inserted one line at top referring to README. +- In README, cleaned up examples, added notes about securing the service. +- Updated FAQ with notes on configuring mailboxes and submailboxes. +- Fixed "make install" - added hooks that create the sysconfdir directories + and copy conf files to right places. +- configure --prefix and --sysconfdir now have default values and are no + longer required arguments. + +* Wed Apr 23 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Moved addressToParenlist into Address class +- Removed some switches from inline convert.h functions +- Added Tools singleton class, meant to take over for convert.h, + regex.h etc. +- Started working on exporting and importing whole session object + to/from environment. +- Made some very minor improvements to log output in authenticate.cc +- For Maildir, messages in new/ are now also counted as unseen. This + bug caused several clients to report the wrong number of unseen + messages. +- Added some ostream and ostream.h includes to io.cc and added std:: + prefixes. +- SUBSCRIBE no longer checks if what you wish to subscribe to is a + valid mailbox. +- COPY and SEARCH use dynamic arrays instead of stack allocated + arrays. This is to satisfy ISO C++ restrictions. +- Removed some unused variables +- umask is now read as an unsigned int +- Cleaner exit in authenticate.cc after adding breaks +- Fixed bug in LSUB output. Folders with dots and backslashes are + now properly supported. +- 1.1.5-1 + +* Thu Apr 10 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Removed optimization in LIST, as it turned out to give wrong + interpretation of leaf nodes. Improved algorithm is on its way. +- Changes to BincStream's dummyclass for cross-platform compatibility +- Project now compiles with "-Wall -ansi -pedantic". On some platforms, + only if SSL support is not included (OpenSSL headers do not always + compile under these restrictions). Only one warning is given in + greeting.cc where '%z' is not ISO C++. + +* Mon Apr 07 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Renamed BincImapParserCommand to Command +- Fixed FETCH BODY, acted like BODY[] +- Removed tunneling of log data, bincimapd and bincimap-up now log + seperately. +- Fixed bug in APPEND parser which disallowed empty flag list. +- 1.1.4-1 + +* Sun Apr 06 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- LIST now first checks with the wildcard, then does a test for wether + or not it's a mailbox. Speed-up. + +* Fri Apr 04 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed flags in LIST +- LIST now uses Depot::iterator to find entries +- LIST does not include elements that are not mailboxes unless they + qualify as superiors of mailboxes. +- Minor fixes in Storage::save method now may be a bit faster. +- Removed SSL comment in bincimap-up +- Fixed wording in error message when running an undefined/disallowed + command +- Removed some unused variables +- Removed trailing CR from error when a syntax error is discovered in + storage files. +- Minor change to storage grammar action might speed up parsing of storage + files a tad. +- Fixes to BincStream allow it to work fine with iomanip/ostream + operators. Old strstream does not work. + +* Thu Apr 03 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added Ben Schumacher's regex patch which fixes a regex problem under + FreeBSD. +- Replaced all sstream/stringstream with BincStream, cleaning up the + code a bit. +- Made delimiter in toRegex configurable. + +* Wed Apr 02 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- 1.1.3-1 +- Removed Local variables from everywhere + +* Tue Apr 01 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Created Status class, and added getStatus and getStatusID to Mailbox. +- Moved much of StatusOperator process code into Depot. +- In bincimap-up, IP from environment is now inserted into Session. +- When unable to translate mailbox name to filename, Depot now gives + more comprehensible error message. +- Removed some unused com/logger variables +- Improved feedback from parser for some operators. +- Added --with-ssl and --without-ssl to configure. + +* Mon Mar 31 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added includes, fixing compile problems with FreeBSD. +- Removed log info about operator exception + +* Sun Mar 30 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed so STARTTLS starts an SSL negotiation. This broke in 1.1.2-1. + +* Sat Mar 29 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added jail-path, jail-user and jail-group to argument list. +- Updated man pages. +- Added timeout to select in authenticate.cc +- 1.1.2-1 + +* Fri Mar 28 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed segfault when calling bincimapd directly with invalid contents + of BINCIMAP_LOGIN in environment. +- Added default umask 0777 if none is provided. + +* Thu Mar 27 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Moved create, delete and rename logics into Depot and out of Operators. + I'd like to enforce that only the Depot knows anything about the + map between file names and mailbox names. +- Fixed a bug in rename that disallowed renaming a/b/c/d to e/b/c/d + unless a, a/b, a/b/c and a/b/c/d all existed. +- Added bumpUidValidity method to Mailbox and Maildir +- Moved compareNodes in search operator into SearchNodes class. +- Added chroot, setgroups, setuid and setgid to bincimap-up stub. Added + configuration options to conf file in new "Security" section. +- Created IOFactory singleton, which now handles IO objects correctly. +- Seperated regular IO from SSL enabled IO. bincimapd does no longer link + against the ssl libraries and has no ssl code in it. +- Stripped down libraries in bincimap-up, reducing code size. +- Added NoopPendingOperator and removed pendingUpdates from regular NOOP + operator. bincimap-up uses only the stripped NOOPoperator. This allows + us to remove the pendingupdates code from bincimap-up. + +* Wed Mar 26 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed a bug in the mime parser where the byte offset was used to seek + using fgetcCRLF. Replaced that with fseek and now fetching headers/mime + of sub-mimeparts is working fine again. +- Fixed similar problem in mime-printbody, which now seeks using fseek. +- bincimap-up now pipes log data from child. +- Removed support from anything other than stderr logging from + authenticated daemon. +- Cleaned up the logics in FETCH when fetching different types of BODY + data. Now supports fetch att MIME correctly. +- 1.1.1-1 + +* Tue Mar 25 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added iterator to Depot class for stepping through depot entries +- Added hierarchical rename +- Fixed problem with some clients not allowing users to subscribe to + subfolders +- APPEND now uses Depot to acquire file names +- LIST and LSUB removes leading and trailing hierarchy delimiters +- Added examine operator (missing in 1.1.0) +- Set default "verify peer" to "no". + +* Mon Mar 24 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Updated README +- Added technical documentation draft +- Added IMAPdir spec draft +- Removed usage.cc. Replaced with a pointer to man pages. +- Added bincimap-up binary +- authenticate.{cc,h} now sets up a tunnel between the client and the + authenticated daemon. SSL is managed by the unauthenticated stub. +- Started enforcing conventions for formatting the source files. Document + is under progress. +- bincimapd, now the authenticated daemon, can no longer do any SSL + related activity. +- bincimapd now reads BINCIMAP_LOGIN from the environment to determine + what the response to the stub's authenticate or login commands should be. +- To meet with checkpassword's conventions, bincimapd now exits with code + 111 on internal errors. +- Removed quite a lot of debugging info +- const-ified more functions. +- Added IMAPdir and MaildirPP classes +- Removed greeting.h +- showGreeting is now self declared. +- Removed most of the hungarian notation in the main classes +- Added Session instance where needed +- LIST and LSUB now use Depot to identify mailbox types +- Added access to argc and argv to Session +- Added pending() method to IO, to check for pending data. Always 0 if not + MODE_SSL. +- readChar can now return -2, meaning that in SSL mode the read call must + be repeated. +- DELETE in maildir.cc can not delete mailbox (which was actually allowed + before) +- Maildir now does not care about IMAP mailbox names, only file names. +- Removed "singular" concept from args parser. +- Updated xinetd and supervise run files to match new invocation method. +- Added goals doc +- LIST no longer sets \Marked +- 1.1.0-1 + +* Mon Mar 24 2003 Eivind Kvedalen <eivind@kvedalen.name> +- Examine command added +- SelectOperator now contains code for Examine command +- SearchOperator now contains SearchNode class +- Operator::parse is now an abtract method + +* Fri Mar 21 2003 Eivind Kvedalen <eivind@kvedalen.name> +- select function call added to IO class +- IO::readChar now takes a timeout argument +- TimeoutException class added +- ModuleException class added + +* Thu Mar 20 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Removed bincimap-auth-checkpassword and bincimap-uidpwd completely + from the project +- Added privilege seperation. Unauthenticated daemon is bincimap-up. + Authenticated daemon is bincimapd. Only checkpassword compatible + authenticators are supported. +- Enabled local config settings. Users can now choose path, default + Mailbox type and depot type (IMAPdir/Maildir++). Default is Maildir++. +- Added full support for IMAPdir and Maildir++ via pluggable Depot + objects in DepotFactory. +- Made DepotFactory and BrokerFactory singletons. +- Made delimiter character a variable in depot. +- Cleaned up some code. bincimap-up.cc and bincimapd.cc still look very + bad. +- Added technical documentation draft to docs +- Added updated FAQ to docs +- Added IMAPdir spec draft to docs + +* Tue Mar 18 2003 Eivind Kvedalen <eivind@kvedalen.name> +- Fixed error messages in the various implementations of + the Operator::parse method. + +* Tue Mar 18 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Improved Storage::save algorithm +- Improved Storage::load algorithm +- Removed excessive logging +- Changed pendingUpdates to optionally rescan for changes +- Added speedup to SEARCH +- Added minor speedup to fgetcCRLF functions +- Storage now saves in PRETTIFY mode instead of MINIMIZE. Adds speed. + The MINIMIZE algorithm is undergoing maintenance. +- Moved subscribed, cmdargs, globalconfig, localconfig, userid, ip + and state into new singlton called Session. +- Added session.cc and session.h +- Moved RETURN enum into Operator +- Moved STATE enum into Session +- Removed bincimapd-config.{cc,h}, bincimapd.h, bincimapd-commands.{cc,h} +- Added initconfig.cc with most of bincimapd-config.cc's old content. + +* Mon Mar 17 2003 Eivind Kvedalen <eivind@kvedalen.name> +- Clean-up in depot.h +- getOperator added to Broker +- parse() method added to Operator classes +- parse() method implemented in operators. Code moved from + recursivedescent.cc +- BincImapParserData added to BincImapParserCommand class + +* Mon Mar 17 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed a silly bug in SEARCH UID which caused a segfault. +- authenticate() now takes a Depot as input. +- Initial mailbox create (INBOX) is done with default mailbox from + Depot +- pendingupdates() now takes a Mailbox as input +- Removed global mailbox pointer from bincimapd-config.{cc,h} +- Changed error when expecting set instead of string in recursivedescent.cc +- Weaved in Depot support in all operators +- Removed references to global mailbox pointer. +- Added rollback to UID operator parsers. + +* Sun Mar 16 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Constified loads of variables in Operators +- Added BincException. All Exceptions now inherit BincException. +- Added Depot. Broker now processes the Depot with the Operator +- Made Operators' process method const. + +* Sat Mar 15 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- First stage of new design incorporated. Brokers and Operators are + introduced. +- Converted all functions to operators that work properly. +- Added support for IMAPdir schema. +- Maildir::imapCreate no longer adds the "maildirfolder" file to the + depository. + +* Fri Mar 14 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Removed all other namespaces than Binc. We are moving to a more + object oriented approach. + +* Thu Mar 13 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Renamed MessageDepot to Mailbox + +* Tue Mar 11 2003 Eivind Kvedalen <eivind@kvedalen.name> +- Plain authentication bug fixed +- New iterator has been added to MessageDepot class +- Caching of previous messages moved to MessageDepot class. + +* Tue Mar 11 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Auth method no longer uses environment. Uses netstrings. +- Support for gnugetopt (FreeBSD) - untested. Removed support for regular + getopt. getopt_long is now required. +- Updated FAQ +- Improvements in "auto create inbox". +- 1.0.25-2 + +* Fri Mar 07 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added function toCanonMaildir to util +- Fixed a bug in mime-parseheader.cc that didn't set the header length. +- Fixed a bug in imapparser.cc that prevented "FETCH *" requests. +- Moved imap close, select, delete, create, expunge, functionality to + maildir class +- Some cleanups in message depot +- Several functions now use toCanonMailbox +- Cleaned up bincimapd-select.cc +- SEARCH now does not parse header if whole message has already been parsed. +- Better error reporting in most imap functions +- Big speedup in LIST by eliminating unnecessary stats +- Fixed a problem with parsing content type header +- FETCH now only parses header if only header is fetched. (bugfix) +- In authenticate(), depot object is created and lives throughout the + life of the imap session. + +* Tue Mar 04 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Removed inlining from recursivedescent.cc - if the user wants these + inlined, he can compile the source with -O3. +- Cleaned up all Makefile.am files. Removed tab indentation and threw + all files on one line. This hopefully removes automake's funny "seperator + missing" complaints. +- Fixed a bug that prevented a user from fetching only '*'. +- Removed stray blank (0x20) character that was printed as part of the + bodystructure response. + +* Mon Mar 03 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added exception to COPYING for linking against OpenSSL +- Added COPYING.OpenSSL +- Added GPL note to README +- Some cleanup in getopt code +- Added Caskey Dickson's setuid/setgid patch +- Added Caskey's copy patch +- Cleaned up the IO code +- Removed repr() and syntaxexception code from imapparser +- Moved DELETE into Maildir code +- Cleaned up create and delete code +- Added create and delete properly to MessageDepot +- Added Syntax exception code to exceptions.cc +- Added stderr as a logtype option. It's equivalent to multilog. +- Moved case converted mailbox name out as seperate function + +* Sat Feb 22 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- 1.0.24-1 +- Added GPL notices to all files +- Gathered all exceptions into one global exceptions file +- Storage class creates shorter aliases than before +- Removed lex/yacc code from argument parser - replaced with getopt +- Fixed Maildir++ complaince in maildir-create.cc +- Fixed message size cacheing +- IO class is no longer a subclass of ostream +- bincimap-uidpwd uses getcwd and not get_current_working_dir +- Added --disable-starttls functionality, and added it to config, usage + and man pages. +- Cleaned up man pages more - added copyright notice +- Added FAQ to docs +- Added contrib area, all contribs are now bundled. +- Some bincimap.conf settings have changed. Defaul for allow plain auth + is "no". +- Minor updates to README +- Moved usage function to seperate file, out of bincimapd.cc +- Moved some configuration details into bincimapd-config.cc +- Now alternatively reads environment variable set in configuration +- All conf file settings can be properly overrun with command line options, + except authenticators. +- In authenticate.cc, proper handling of nonexistant root Maildir +- Append sleeps for a second before returning to ensure IMAP integrity + rules with APPEND. +- Removed comments about Outlook ;) +- CAPABILITY does not advertise STARTTLS if --disable-starttls is passed +- COPY moves chunks of 8k at a time instead of only one byte +- FETCH only full-parses a message at an RFC822.SIZE request if the + size is not already cached. +- LOGOUT no longer cares what's happened to the subscription list +- RENAME says that renaming inbox is not supported, and it properly + explains that you can't rename a folder _to_ INBOX. +- SEARCH parses messages if LARGER or SMALLER is queried for, and if the + size is not already cached. +- STARTTLS will not run if --disable-starttls is passed +- Restructured the RPM file. + +* Sun Feb 16 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- 1.0.23-1 +- Fixes to the man pages +- Running bincimapd with --version shows version +- Running bincimapd with --help shows complete command line option list +- All conf settings are also command line settings +- Removed option to set CA search path - use the CA file instead +- Fixed problem with LSUB requiring user to quote wildcards +- Auth timeout must be larger than 30 +- 1.0.23-2 +- Fixed a problem with CREATE which prevented users from creating + new folders. The new/ and tmp/ folders could also be removed by + mistake in this release. + +* Sat Feb 15 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- It's no longer allowed to create folders called INBOXsomething, without + the dot. +- Added buffers to IO class to allow logging SSL errors. +- updateFlags in Maildir:: no longer tries to update flags where no updates + have been made. +- All auth modules are now pure C++ +- APPEND, COPY, CREATE, DELETE, RENAME, STATUS checks for valid + Maildir through toMaildir function +- APPEND now fsyncs correct directory +- Fixed the problem with server rejecting "syslog" as logtype in conf file. +- Fixed putenv support in authenticate +- Fixed log output in authenticate +- conf files now use only --prefix +- package is now prefixed +- Split up maildir implementation and mime parser into smaller files +- Added Ivan F. Martinez' teapop authenticator to contrib/authenticators + +* Tue Feb 11 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Removed all the C debug code (for SSL) from the IO class +- Made SSL cipher list configurable +- General clean up in IO class, better error messages. +- SSL peer verification is now optional +- Make install problems are now solved, and conf files are generated + correctly. Only one prefix needed to build the package. +- Man pages! ^_^ + +* Mon Feb 10 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed problem with input parser "lock-up". The error was that the + output wasn't flushed. +- IO class doesn't run openlog twice if both command line args and + conf file say to use syslog. + +* Sun Feb 09 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- 1.0.22-1 +- Fixed myisprint, allowing Storage class to save correctly. +- Inserted prefix in spec file, as a first attempt to make the + package relocatable. +- Replaced setenv with putenv, allowing compile on Solaris +- LIST now shows nonexisting inferior mailboxes, with the NoSelect + flag set. +- COPY now uses time(NULL) instead of passed timestamp when storing + messages in destination folder. +- No longer creates .bincimap if none exists. + +* Sat Feb 08 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- 1.0.21-1 +- Minor changes to README +- Added Log section with log type in config +- Added "auto create inbox" to config - valid are "yes" or not "yes" +- Added "auto subscribe mailboxes" for when no subscribed file is found +- Added "umask" to Mailbox section - decides umask for whole session +- Transfer timeout is now used correctly +- Renamed regex files to 'regmatch' to avoid collision with posix regex +- PCRE was removed - in goes posix regex library +- Fixed toMaildir function to return relate rather than absolute path +- Removed PCRE dependencies everywhere +- Added fsync patch for file systems that don't support it - thanks + to Caskey Dickson for spotting this. +- Removed debug logging from Storage implementation. +- Moved mailbox creating into messagedepot and maildir classes. +- Added mode, owner and group settings when creating mailboxes. +- Added syslog support to IO class - somewhat messy, prefixed +- Changed <wait.h> to <sys/wait.h> everywhere +- Removed artifact from checkpassword auth stub, allowing use of non-passwd + based authenticators +- Removed debug logging from pendingUpdates +- All config settings are now read from global config file and used. +- Added command line option --logtype to override log type settings +- Subscription changes are now immediately saved to disk +- STATUS now reports all recent for mailboxes with no cache file +- LOGIN now correctly checks if plain text auth is allowed +- LIST now search relative to cwd, instead of from / +- Un-inlined some functions in FETCH do reduce memory exhaustion during + compile. The inlines are unnecessary. +- CREATE now uses messagedepot::create +- CAPABILITY now reports correctly whether or not plain text auth is + allowed. +- AUTHENTICATE now interprets config correctly wrt plain text auth +- authenticate function now always chdir's into Maildir. +- non chroot should work properly now +- All elements in "auto subscribe mailboxes" are inserted into the + subscribed list if there is no subscribed list. The list is then + saved to disk. +- Subscribed list is saved to current directory instead of / +- Checks for libdl, provides smooth compile under FreeBSD +- Added logtype to service and xinetd files +- xinetd files are now equal for ssl and non-ssl, except for the --ssl + option. +- cleaned up configure.in a bit. + +* Tue Feb 04 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- 1.0.19-1 +- When a new cache file is created, all messages are not marked as recent + as before +- Fixed big bug with expunged messages. +- Bumped cache & uidvalidity file version to avoid problems with messed + up cache files from expunge bug. +- SSL settings from conf file are now used in IO class +- 1.0.20-1 +- Fixed bug: subscription folders are now read as the user authenticates +- Fixed potential buffer overflow with improper use of sprintf +- Fixed service file "xinetd-bincimaps" with relocatable files +- Added README which describes installation procedure with tarball. + +* Sun Feb 02 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- 1.0.18-1 +- Added config.h support +- Removed -j 2 from spec file +- Removed Config class, replaced all uses with Storage +- Compatibility: prefixed all namespace std-includes with ::. +- Added more GPL headers to source +- Added BEFORE, BODY, KEYWORD, ON, SINCE, UNKEYWORD, SENTBEFORE, + SENTON, SENTSINCE to SEARCH +- More compatibility for lacking sstream support (untested) +- Now allows STORE operations with empty flag list () +- Removed "fromhex" binary from distro +- Fixed autoconf/automake problems with defining correct variables + on all known platforms. +- Removed traces of per-ip-subscription +- Almost all configurable settings can now be set through config file +- time and flags are ignored in APPEND, because the former implementation + and any implementation doing otherwise stands in risk of losing mails + in the depository. +- lex/yacc files are now not processed unless by explicitly performing + a "make grammar" in the args/ and storage/ directories. +- Fixed bug in STATUS which reported negative number of RECENT messages +- COPY no longer stores time stamp or flags +- Now correctly shows LOGINDISABLED in non-SSL mode if plain auth is + not supported. +- Support for AUTH=PLAIN - required by the protocol. +- supervise and xinetd files are now generated and follow configure + prefices, except the log files. +- Fixed bug with expunge and flag updates not getting reported properly + +* Sat Jan 25 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added special case for not cacheing status folders with + messages in new/ less than one second old + +* Tue Jan 21 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added support for RENAME. Does not yet support hierarchical rename. +- Fixed a race condition with not detecting folder changes. +- Added compatibility settings in build process (sstream->strstream for + old compilers, untested) + +* Mon Jan 20 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Added workaround for Outlook's broken "Inbox" prefix. If the uppercased + mailbox name is "INBOX", then it is set to "INBOX". If the uppercased + prefix of the mailbox is "INBOX.", then the prefix is replaced with + "INBOX.". This allows Outlook's "Inbox.subfolder" behavior. + +* Sun Jan 19 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- Fixed bug with lock file when selecting invalid maildir +- Now only moves files from new/ to cur/ if time_t part shows file is + older than one second. +- Never uses rename - always uses link() to prevent files from getting + lost. +- Fixed fetch problem because of case sensitive matching on mime headers +- Added --enable-static option to configure +- STATUS now returns correct number of RECENT messages. +- Added EXAMINE +- Speed up in scan() first checks for folder chance using stat +- Only 5 log files are kept, and they are rotated at 1MB. +- Fixed problem with gcc2 interpreting setw and setfill different from + gcc3, causing Binc IMAP compiled with gcc2 to sort messages wrongly. + +* Mon Jan 13 2003 Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> +- AUTHENTICATE no longer requires first argument to be upper case +- Removed some debug info from the log files +- Fixed problem with getting kicked off when the uidvalidity bounces + at first select. + +#----------------------------------------------------------------------- +# Local variables: +# mode: rpm-spec +# End: diff --git a/conf/Makefile.am b/conf/Makefile.am @@ -0,0 +1,34 @@ +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +#-------------------------------------------------------------------------- +EXTRA_DIST=bincimap.conf xinetd-bincimap xinetd-bincimaps bincimap.conf.in toimapdir tomaildir++ checkpassword.pl + +#-------------------------------------------------------------------------- +install-exec-hook: + @rm -f $(srcdir)/../install.log + @$(mkinstalldirs) -m 755 $(DESTDIR)$(sysconfdir) + @if [ ! -e $(DESTDIR)$(sysconfdir)/bincimap.conf ]; then $(INSTALL_DATA) $(srcdir)/bincimap.conf $(DESTDIR)$(sysconfdir); else $(INSTALL_DATA) $(srcdir)/bincimap.conf $(DESTDIR)$(sysconfdir)/bincimap.conf.new; echo "- New conf file saved as $(DESTDIR)$(sysconfdir)/bincimap.conf.new" >> $(srcdir)/../install.log; fi; + @$(mkinstalldirs) -m 755 $(DESTDIR)$(sysconfdir)/xinetd + + @if [ ! -e $(DESTDIR)$(sysconfdir)/xinetd/imap ]; then $(INSTALL_DATA) $(srcdir)/xinetd-bincimap $(DESTDIR)$(sysconfdir)/xinetd/imap; else $(INSTALL_DATA) $(srcdir)/xinetd-bincimap $(DESTDIR)$(sysconfdir)/xinetd/imap.new; echo "- New xinetd/imap file saved as $(DESTDIR)$(sysconfdir)/xinetd/imap.new" >> $(srcdir)/../install.log; fi; + @if [ ! -e $(DESTDIR)$(sysconfdir)/xinetd/imaps ]; then $(INSTALL_DATA) $(srcdir)/xinetd-bincimaps $(DESTDIR)$(sysconfdir)/xinetd/imaps; else $(INSTALL_DATA) $(srcdir)/xinetd-bincimaps $(DESTDIR)$(sysconfdir)/xinetd/imaps.new; echo "- New xinetd/imaps file saved as $(DESTDIR)$(sysconfdir)/xinetd/imaps.new" >> $(srcdir)/../install.log; fi; + + @$(mkinstalldirs) -m 755 $(DESTDIR)$(sysconfdir)/scripts + @if [ ! -e $(DESTDIR)$(sysconfdir)/scripts/checkpassword.pl ]; then $(INSTALL_DATA) -m 0755 $(srcdir)/checkpassword.pl $(DESTDIR)$(sysconfdir)/scripts; else $(INSTALL_DATA) -m 0755 $(srcdir)/checkpassword.pl $(DESTDIR)$(sysconfdir)/scripts/checkpassword.pl.new; echo "- New file saved as $(DESTDIR)$(sysconfdir)/scripts/checkpassword.pl.new" >> $(srcdir)/../install.log; fi; + @if [ ! -e $(DESTDIR)$(sysconfdir)/scripts/tomaildir++ ]; then $(INSTALL_DATA) -m 0755 $(srcdir)/tomaildir++ $(DESTDIR)$(sysconfdir)/scripts; else $(INSTALL_DATA) -m 0755 $(srcdir)/tomaildir++ $(DESTDIR)$(sysconfdir)/scripts/tomaildir++.new; echo "- New file saved as $(DESTDIR)$(sysconfdir)/scripts/tomaildir++.new" >> $(srcdir)/../install.log; fi; + @if [ ! -e $(DESTDIR)$(sysconfdir)/scripts/toimapdir ]; then $(INSTALL_DATA) -m 0755 $(srcdir)/toimapdir $(DESTDIR)$(sysconfdir)/scripts; else $(INSTALL_DATA) -m 0755 $(srcdir)/toimapdir $(DESTDIR)$(sysconfdir)/scripts/toimapdir.new; echo "- New file saved as $(DESTDIR)$(sysconfdir)/scripts/toimapdir.new" >> $(srcdir)/../install.log; fi; + @if [ ! -e $(DESTDIR)$(sysconfdir)/scripts/tomaildir++ ]; then $(INSTALL_DATA) -m 0755 $(srcdir)/tomaildir++ $(DESTDIR)$(sysconfdir)/scripts; else $(INSTALL_DATA) -m 0755 $(srcdir)/tomaildir++ $(DESTDIR)$(sysconfdir)/scripts/tomaildir++.new; echo "- New file saved as $(DESTDIR)$(sysconfdir)/scripts/tomaildir++.new" >> $(srcdir)/../install.log; fi; + +#-------------------------------------------------------------------------- +uninstall-hook: + rm $(DESTDIR)$(sysconfdir)/bincimap.conf + rm $(DESTDIR)$(sysconfdir)/xinetd/imap + rm $(DESTDIR)$(sysconfdir)/xinetd/imaps diff --git a/conf/bincimap.conf.in b/conf/bincimap.conf.in @@ -0,0 +1,118 @@ +/* -*- mode:java -*- */ + +// This program 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 2 of the License, or +// (at your option) any later version. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +// USA. + +// Global configuration file for Binc IMAP. Some settings in this file +// can be overrun with command line arguments. + +//---------------------------------------------------------------------------- +Authentication { + allow plain auth in non ssl = "no", /* allow login or + authenticate + when not in + SSL/TLS mode */ + + auth penalty = 4, /* on auth failure, + * server sleeps so + * many seconds + * before allowing + * client to + * authenticate + * again. + */ + disable starttls = "no" +} + +//---------------------------------------------------------------------------- +Security { + jail path = "@prefix@/bin", + jail user = "nobody", + jail group = "nobody" +} + +//---------------------------------------------------------------------------- +Log { + type = "syslog", /* supports + * multilog or + * syslog or + * stderr (for testing). + */ + environment ip variable = "TCPREMOTEIP" +} + +//---------------------------------------------------------------------------- +Mailbox { + depot = "Maildir++", /* Use Maildir++ style + * depot. */ + + type = "Maildir", /* only Maildir + * support */ + + path = "Maildir", /* default path */ + + auto create inbox = "yes", /* create INBOX in + * given format if + * it doesn't + * exist. + */ + + auto subscribe mailboxes = "INBOX", /* list mailboxes + * in one string, + * seperated by + * commas + */ + + umask = "077" /* use this umask + * when creating + * mailboxes, or + * when copying and + * appending + * messages. + */ +} + +//---------------------------------------------------------------------------- +Session { + idle timeout = 1860, /* idle timeout in + seconds */ + + auth timeout = 60, /* timeout before + auth in + seconds */ + + transfer timeout = 1200, /* timeout per + transferred com + unit (I/O) */ + + transfer buffer size = 1024 /* number of bytes + to buffer before + passing on to + client. */ +} + +//---------------------------------------------------------------------------- +SSL { + pem file = "@sysconfdir@/bincimap.pem", /* private key and + certificate + chain PEM file + name */ + + ca file = "", /* file to use as + certificate + authority */ + + cipher list = "!ADH:RC4+RSA:HIGH:MEDIUM:LOW:EXP:+SSLv2:+EXP", + + verify peer = "no" +} + +//---------------------------------------------------------------------------- + /* $Id: bincimap.conf.in,v 1.2 2003/08/23 12:53:25 andreaha Exp $ */ diff --git a/conf/checkpassword.pl b/conf/checkpassword.pl @@ -0,0 +1,41 @@ +#! /usr/bin/perl + +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +# This file is a part of Binc IMAP. + +sub authenticated { + my ($user,$pass) = @_; + # This is the only function you need to change. + + # If password is OK, change to the right home area + # and return 1, otherwise return 0. + # On error exit(111); + exit(111); +} + +use strict; + +my ($in, $len, $buf); +open (FD3, "<&=3") or exit(111); +$len = read(FD3, $buf, 512); +close FD3; + +exit(111) if $len < 4; + +my($user, $pass) = split /\x00/, $buf; +$user = lc $user; + +if (authenticated($user, $pass)) { + exec @ARGV; +} else { + exit 1; +} diff --git a/conf/toimapdir b/conf/toimapdir @@ -0,0 +1,30 @@ +#! /usr/bin/perl + +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +# This file is a part of Binc IMAP. + +# Convert file entries to corresponding IMAPdir mailbox names. +# Use this script like this to add all IMAPdir entries to the +# subscription file: +# +# ls -a IMAPdir | toimapdir > IMAPdir/.bincimap-subscribed + +while (<>) { + unless (/^\\/ or /^\.$/ or /^\.\.$/) { + chomp; + s|([^\\])\.|$1/|g; + s|\\\.|\.|g; + s|\\\\|\\|g; + s|^/|\.|; + print; print "\n"; + } +} diff --git a/conf/tomaildir++ b/conf/tomaildir++ @@ -0,0 +1,31 @@ +#! /usr/bin/perl + +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +# This file is a part of Binc IMAP. + +# Convert file entries to corresponding IMAPdir mailbox names. +# Use this script like this to add all IMAPdir entries to the +# subscription file: +# +# ls -a IMAPdir | toimapdir > IMAPdir/.bincimap-subscribed + +while (<>) { + unless (/^[^\.]/ or /^\.$/ or /\.\./) { + chomp; + s|\.|/|g; + s|\\\.|\.|g; + s|\\\\|\\|g; + s|^/|\.|; + s|^\.(.*)|INBOX/$1|; + print "$_\n"; + } +} diff --git a/conf/xinetd-bincimap.in b/conf/xinetd-bincimap.in @@ -0,0 +1,26 @@ +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +# $Id: xinetd-bincimap.in,v 1.1.1.1 2003/08/18 18:06:05 andreaha Exp $ +# default: on +# description: Binc IMAP +service imap +{ + disable = no + flags = REUSE + socket_type = stream + wait = no + user = root + group = root + instances = UNLIMITED + server = @prefix@/bin/bincimap-up + server_args = --conf=@sysconfdir@/bincimap.conf --logtype=syslog -- /bin/checkpassword @prefix@/bin/bincimapd + log_type = SYSLOG daemon info +} diff --git a/conf/xinetd-bincimaps.in b/conf/xinetd-bincimaps.in @@ -0,0 +1,26 @@ +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +# $Id: xinetd-bincimaps.in,v 1.1.1.1 2003/08/18 18:06:05 andreaha Exp $ +# default: on +# description: Binc IMAP, SSL +service imaps +{ + disable = no + flags = REUSE + socket_type = stream + wait = no + user = root + group = root + instances = UNLIMITED + server = @prefix@/bin/bincimap-up + server_args = --ssl --conf=@sysconfdir@/bincimap.conf --logtype=syslog -- /bin/checkpassword @prefix@/bin/bincimapd + log_type = SYSLOG daemon info +} diff --git a/config.h.in b/config.h.in @@ -0,0 +1,270 @@ +/* config.h.in. Generated from configure.in by autoheader. */ + +#ifndef config_h_included +#define config_h_included + + +/* Define to 1 if the `closedir' function returns void instead of `int'. */ +#undef CLOSEDIR_VOID + +/* Define to 1 if you have the `alarm' function. */ +#undef HAVE_ALARM + +/* Define to 1 if your system has a working `chown' function. */ +#undef HAVE_CHOWN + +/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'. + */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you have the `dup2' function. */ +#undef HAVE_DUP2 + +/* Define to 1 if you have the <fcntl.h> header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `fork' function. */ +#undef HAVE_FORK + +/* Define to 1 if you have the `getcwd' function. */ +#undef HAVE_GETCWD + +/* Define to 1 if you have the `gethostname' function. */ +#undef HAVE_GETHOSTNAME + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the <inttypes.h> header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if `lstat' has the bug that it succeeds when given the + zero-length file name argument. */ +#undef HAVE_LSTAT_EMPTY_STRING_BUG + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#undef HAVE_MALLOC + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the `mkdir' function. */ +#undef HAVE_MKDIR + +/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */ +#undef HAVE_NDIR_H + +/* support for O_LARGEFILE */ +#undef HAVE_OLARGEFILE + +/* support for ostream */ +#undef HAVE_OSTREAM + +/* Define to 1 if you have the `putenv' function. */ +#undef HAVE_PUTENV + +/* Define to 1 if your system has a GNU libc compatible `realloc' function, + and to 0 otherwise. */ +#undef HAVE_REALLOC + +/* Define to 1 if you have the `regcomp' function. */ +#undef HAVE_REGCOMP + +/* Define to 1 if you have the `rmdir' function. */ +#undef HAVE_RMDIR + +/* Define to 1 if you have the `select' function. */ +#undef HAVE_SELECT + +/* Define to 1 if you have the `setenv' function. */ +#undef HAVE_SETENV + +/* support for sstream */ +#undef HAVE_SSTREAM + +/* Define to 1 if `stat' has the bug that it succeeds when given the + zero-length file name argument. */ +#undef HAVE_STAT_EMPTY_STRING_BUG + +/* Define to 1 if stdbool.h conforms to C99. */ +#undef HAVE_STDBOOL_H + +/* Define to 1 if you have the <stddef.h> header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strchr' function. */ +#undef HAVE_STRCHR + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the `strftime' function. */ +#undef HAVE_STRFTIME + +/* Define to 1 if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strtol' function. */ +#undef HAVE_STRTOL + +/* Define to 1 if you have the <syslog.h> header file. */ +#undef HAVE_SYSLOG_H + +/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'. + */ +#undef HAVE_SYS_DIR_H + +/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'. + */ +#undef HAVE_SYS_NDIR_H + +/* Define to 1 if you have the <sys/select.h> header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define to 1 if you have the <sys/socket.h> header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the <sys/time.h> header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the <sys/types.h> header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + +/* Define to 1 if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `utime' function. */ +#undef HAVE_UTIME + +/* Define to 1 if you have the <utime.h> header file. */ +#undef HAVE_UTIME_H + +/* Define to 1 if `utime(file, NULL)' sets file's timestamp to the present. */ +#undef HAVE_UTIME_NULL + +/* Define to 1 if you have the `vfork' function. */ +#undef HAVE_VFORK + +/* Define to 1 if you have the <vfork.h> header file. */ +#undef HAVE_VFORK_H + +/* Define to 1 if you have the <wait.h> header file. */ +#undef HAVE_WAIT_H + +/* Define to 1 if `fork' works. */ +#undef HAVE_WORKING_FORK + +/* Define to 1 if `vfork' works. */ +#undef HAVE_WORKING_VFORK + +/* Define to 1 if the system has the type `_Bool'. */ +#undef HAVE__BOOL + +/* Define to 1 if `lstat' dereferences a symlink specified with a trailing + slash. */ +#undef LSTAT_FOLLOWS_SLASHED_SYMLINK + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define as the return type of signal handlers (`int' or `void'). */ +#undef RETSIGTYPE + +/* Define to the type of arg 1 for `select'. */ +#undef SELECT_TYPE_ARG1 + +/* Define to the type of args 2, 3 and 4 for `select'. */ +#undef SELECT_TYPE_ARG234 + +/* Define to the type of arg 5 for `select'. */ +#undef SELECT_TYPE_ARG5 + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ +#undef TIME_WITH_SYS_TIME + +/* Define to 1 if your <sys/time.h> declares `struct tm'. */ +#undef TM_IN_SYS_TIME + +/* Version number of package */ +#undef VERSION + +/* Define to 1 if SSL support is included. */ +#undef WITH_SSL + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#undef YYTEXT_POINTER + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `int' if <sys/types.h> doesn't define. */ +#undef gid_t + +/* Define as `__inline' if that's what the C compiler calls it, or to nothing + if it is not supported. */ +#undef inline + +/* Define to rpl_malloc if the replacement function should be used. */ +#undef malloc + +/* Define to `int' if <sys/types.h> does not define. */ +#undef mode_t + +/* Define to `int' if <sys/types.h> does not define. */ +#undef pid_t + +/* Define to rpl_realloc if the replacement function should be used. */ +#undef realloc + +/* Define to `unsigned' if <sys/types.h> does not define. */ +#undef size_t + +/* Define to `int' if <sys/types.h> doesn't define. */ +#undef uid_t + +/* Define as `fork' if `vfork' does not work. */ +#undef vfork + +#endif + diff --git a/configure.in b/configure.in @@ -0,0 +1,210 @@ +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. + +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +dnl USA. + +dnl Process this file with autoconf to produce a configure script. +dnl AC_PREREQ(2.57) +AC_INIT(bincimap, 1.2.6beta4, bincimap@andreas.hanssen.name) +AC_CONFIG_SRCDIR([config.h.in]) +AM_CONFIG_HEADER([config.h]) +AM_INIT_AUTOMAKE + +dnl Checks for programs. +AC_PROG_CXX +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_MAKE_SET +AC_PROG_AWK +AM_PROG_LEX +AC_PROG_LN_S +AC_PROG_RANLIB +AC_PROG_YACC + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_DIRENT +AC_HEADER_STDBOOL +AC_HEADER_STDC +AC_HEADER_SYS_WAIT +AC_CHECK_HEADERS([fcntl.h stddef.h stdlib.h string.h unistd.h sys/time.h syslog.h utime.h wait.h]) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_UID_T +AC_C_INLINE +AC_TYPE_MODE_T +AC_TYPE_PID_T +AC_TYPE_SIZE_T +AC_STRUCT_TM + +dnl Checks for library functions. +AC_FUNC_CHOWN +AC_FUNC_CLOSEDIR_VOID +AC_FUNC_FORK +AC_FUNC_LSTAT +AC_FUNC_MALLOC +AC_FUNC_MKTIME +AC_FUNC_REALLOC +AC_FUNC_SELECT_ARGTYPES +AC_TYPE_SIGNAL +AC_FUNC_STAT +AC_FUNC_STRFTIME +AC_FUNC_STRTOD +AC_FUNC_UTIME_NULL +AC_FUNC_ERROR_AT_LINE +AC_CHECK_FUNCS([alarm dup2 getcwd gethostname gettimeofday memset mkdir putenv regcomp rmdir select setenv strchr strdup strerror strtol utime]) + +AC_PREFIX_DEFAULT(/opt/bincimap) + +dnl Add /usr/kerberos/include to include path if this path +dnl exists. +AC_MSG_CHECKING(wether to include /usr/kerberos/include) +if [[ -e /usr/kerberos/include ]]; then + AC_MSG_RESULT([yes]) + CXXFLAGS="-I/usr/kerberos/include $CXXFLAGS" +else + AC_MSG_RESULT([not necessary]) +fi + +CXXFLAGS="$CXXFLAGS -Wall -fno-exceptions" + +prefix=$(eval echo $(eval echo ${prefix})) +sysconfdir=$(eval echo $(eval echo ${sysconfdir})) +localstatedir=$(eval echo $(eval echo ${localstatedir})) + +AC_MSG_CHECKING(--prefix) +if [[ "x$prefix" = "xNONE" ]]; then + AC_MSG_RESULT([unset, defaulting to /opt/bincimap]) + prefix=/opt/bincimap + AC_SUBST(prefix) +else + AC_MSG_RESULT(using $prefix) +fi + +AC_MSG_CHECKING(--sysconfdir) +if [[ "x$sysconfdir" = "xNONE/etc" ]]; then + AC_MSG_RESULT([unset, defaulting to /etc/opt/bincimap]) + sysconfdir=/etc/opt/bincimap + AC_SUBST(sysconfdir) +else + AC_MSG_RESULT(using $sysconfdir) +fi + +AC_MSG_CHECKING(--localstatedir) +if [[ "x$localstatedir" = "xNONE/var" ]]; then + AC_MSG_RESULT([unset, defaulting to /var/opt]) + localstatedir=/var/opt + AC_SUBST(localstatedir) +else + AC_MSG_RESULT(using $localstatedir) +fi + +AC_ARG_ENABLE(static, + AC_HELP_STRING([--enable-static], [Enable static compile]), + [STATIC="-static --all-static"], [STATIC=]) +AC_SUBST(STATIC) + +AC_ARG_WITH(optimization, + AC_HELP_STRING([--with-optimization], [Compile with -O2 (default)]) +AC_HELP_STRING([--without-optimization], [Compile with -O0]), + [ if [[ "x$withval" != "xno" ]]; then WITH_OPTIMIZATION=1; fi ], + WITH_OPTIMIZATION=1) + +AC_MSG_CHECKING(wether to compile with optimization) +if [[ "x$WITH_OPTIMIZATION" = "x1" ]]; then + AC_MSG_RESULT(yes) + CXXFLAGS="$CXXFLAGS -O2" +else + AC_MSG_RESULT(no) + CXXFLAGS="$CXXFLAGS -O0" +fi + +AC_ARG_WITH(openssl-lib, + AC_HELP_STRING([--with-openssl-lib], [Set path to OpenSSL libraries]), + [ if [[ "x$withval" != "xno" -a "x$withval" != "xyes" ]]; then LDFLAGS="$LDFLAGS -L$withval"; fi ],) + +AC_ARG_WITH(openssl-include, + AC_HELP_STRING([--with-openssl-include], [Set path to OpenSSL headers]), + [ if [[ "x$withval" != "xno" -a "x$withval" != "xyes" ]]; then CXXFLAGS="$CXXFLAGS -I$withval"; fi ],) + +AC_ARG_WITH(ssl, + AC_HELP_STRING([--with-ssl], [Enable SSL support (default)]) + AC_HELP_STRING([--without-ssl], [Disable SSL support]), + [ if [[ "x$withval" != "xno" ]]; then WITH_SSL=1; fi ], + WITH_SSL=1) + +AC_MSG_CHECKING(for OpenSSL libraries) +if [[ "$WITH_SSL" = "1" ]]; then + AC_DEFINE(WITH_SSL, 1, [Define to 1 if SSL support is included.]) + + export LDTMP=$LDFLAGS + for k in found /usr/lib /usr/local/lib /usr/local/ssl/lib /usr/local/openssl/lib /opt/ssl/lib /opt/openssl/lib; do + export LDFLAGS="-L$k $LDTMP -lssl -lcrypto" + AC_TRY_COMPILE([#include <openssl/ssl.h>], [SSL_write(0, 0, 0);], LIBSSL="-L$k -lssl -lcrypto"; AC_MSG_RESULT($k), []) + if [[ "x$LIBSSL" != "x" ]]; then break; fi + done + + if [[ "x$LIBSSL" = "x" ]]; then + AC_MSG_RESULT(not found) + AC_MSG_ERROR([Unable to find the ssl library which is part of OpenSSL. You want want to look up the FAQ to learn more about this requirement and how to deal with it. Or run configure with --without-ssl.]) + fi + + AC_LANG_CPLUSPLUS + AC_MSG_CHECKING(wether OpenSSL headers are included properly) + AC_TRY_COMPILE([#include <openssl/ssl.h>], [], AC_MSG_RESULT([yes]), AC_MSG_ERROR([Unable to include header files for OpenSSL. Check config.log to see what exactly went wrong. With some platforms you need to explicitly add paths to certain header files in CXXFLAGS. For example ./configure CXXFLAGS="$CXXFLAGS -I /usr/kerberos/include".])) + AC_LANG_C +else + AC_MSG_RESULT(no) +fi + +AC_CHECK_LIB(dl, dlopen, LIBDL=-ldl, LIBDL=) +AC_SUBST(LIBDL) +AC_SUBST(LIBSSL) + +dnl Checks +AC_LANG_CPLUSPLUS +AC_MSG_CHECKING(whether to include <sstream> or <strstream>) +AC_TRY_COMPILE([#include <sstream>], [], AC_MSG_RESULT([<sstream>]); AC_DEFINE(HAVE_SSTREAM,, [support for sstream]), AC_MSG_RESULT([<strstream>])) + +AC_MSG_CHECKING(whether to include <ostream> or <ostream.h>) +AC_TRY_COMPILE([#include <ostream>], [], AC_MSG_RESULT([<ostream>]); AC_DEFINE(HAVE_OSTREAM,, [support for ostream]), AC_MSG_RESULT([<ostream.h>])) + +AC_MSG_CHECKING(whether O_LARGEFILE is defined) +AC_TRY_COMPILE([ #include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +int i = O_LARGEFILE;], [], AC_MSG_RESULT([yes]); AC_DEFINE(HAVE_OLARGEFILE,, [support for O_LARGEFILE]), AC_MSG_RESULT([no])) + +AC_LANG_C + +AH_TOP(#ifndef config_h_included +#define config_h_included +) +AH_BOTTOM(#endif +) + +AC_OUTPUT([ + Makefile + conf/Makefile + conf/xinetd-bincimap + conf/bincimap.conf + conf/xinetd-bincimaps + man/Makefile + doc/Makefile + doc/manual/Makefile + contrib/Makefile + contrib/authenticators/Makefile + service/log/Makefile + service/Makefile + service/run + service/log/run + service/run-ssl + service/log/run-ssl + src/Makefile + bincimap.spec + README]) diff --git a/contrib/Makefile.am b/contrib/Makefile.am @@ -0,0 +1,13 @@ +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +SUBDIRS=authenticators + +EXTRA_DIST=README diff --git a/contrib/README b/contrib/README @@ -0,0 +1,10 @@ +$Id: README,v 1.1.1.1 2003/08/18 18:06:05 andreaha Exp $ + +This directory is for user contributed plugins and for programs that are +useful additions to the Binc IMAP project. + +Please submit your contributions to the Binc IMAP mailing list: + + lists-bincimap@infeline.org + +Andreas, 2003-02-15 diff --git a/contrib/authenticators/Makefile.am b/contrib/authenticators/Makefile.am @@ -0,0 +1,13 @@ +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +EXTRA_DIST= \ + bincimap-auth-teapop.sh + diff --git a/contrib/authenticators/bincimap-auth-teapop.sh b/contrib/authenticators/bincimap-auth-teapop.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# +# bincimap authentication using teapop textfile configs +# +# 2003 - Ivan F. Martinez <ivanfm@users.sourceforge.net> +# +if [ "$BINC_USERID" != "" ] && [ "$BINC_PASSWORD" != "" ] +then + DOMAIN=`echo "$BINC_USERID" | cut -f 2 -d "@"` + USERID=`echo "$BINC_USERID" | cut -f 1 -d "@"` + LN=`grep "^${DOMAIN}:\*:textfile" /etc/teapop.passwd` + if [ $? -eq 0 ] + then + DOMDIR=`echo "$LN" | cut -f 4 -d ":"` + USER=`echo "$LN" | cut -f 6 -d ":"` + GROUP=`echo "$LN" | cut -f 7 -d ":"` + PASSFILE=`echo "$LN" | cut -f 8 -d ":"` + if [ "$PASSFILE" != "" ] && [ -f $PASSFILE ] + then + LN=`grep "^${USERID}:${BINC_PASSWORD}" $PASSFILE` + if [ $? -eq 0 ] + then + USERDIR=`echo "$LN" | cut -f 3 -d ":"` + USERDIR="${DOMDIR}/${USERDIR}" + XUID=`grep "^${USER}:" /etc/passwd | cut -f 3 -d ":"` + # If blank probably already numeric + if [ "$XUID" = "" ] + then + XUID="${USER}" + fi + XGID=`grep "^${GROUP}:" /etc/group | cut -f 3 -d ":"` + # If blank probably already numeric + if [ "$XGID" = "" ] + then + XGID="${GROUP}" + fi + echo "${XUID}.${XGID}" + echo "${USERDIR}" + exit 0 + fi + fi + fi +fi +exit 112 diff --git a/doc/Makefile.am b/doc/Makefile.am @@ -0,0 +1,15 @@ +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +#-------------------------------------------------------------------------- +SUBDIRS = manual + +#-------------------------------------------------------------------------- +EXTRA_DIST = README rfc1733.txt rfc2086.txt rfc2095.txt rfc2192.txt rfc2221.txt rfc2595.txt rfc3028.txt rfc1731.txt rfc2060.txt rfc2087.txt rfc2177.txt rfc2193.txt rfc2342.txt rfc2683.txt rfc3348.txt rfc1732.txt rfc2061.txt rfc2088.txt rfc2180.txt rfc2195.txt rfc2359.txt rfc2971.txt bincimap-faq.html bincimap.css bincimap-tech.html bincimap-imapdir.html bincimap-goals.html diff --git a/doc/README b/doc/README @@ -0,0 +1,9 @@ +$Id: README,v 1.1.1.1 2003/08/18 18:06:05 andreaha Exp $ + +The Binc IMAP projects documentation is provided in the parent +directory README, the man pages under man/ and some extra information +on the home page, + + http://www.bincimap.andreas.hanssen.name/ + +Andreas, 2003-02-15 diff --git a/doc/bincimap-faq.html b/doc/bincimap-faq.html @@ -0,0 +1,926 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<HTML> + +<HEAD> + <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> + <META HTTP-EQUIV="Content-Language" CONTENT="en"> + + <TITLE>Binc IMAP - FAQ</TITLE> + <META NAME="revisit-after" CONTENT="14 days"> + <META NAME="keywords" CONTENT="Binc IMAP FAQ checkpassword daemontools tcpserver xinetd Maildir qmail"> + <META NAME="description" CONTENT="Andreas Aardal Hanssen"> + <META NAME="copyright" CONTENT="Copyright Andreas Aardal Hanssen 2002, 2003"> + <META NAME="distribution" CONTENT="global"> + <META NAME="author" CONTENT="Andreas Aardal Hanssen"> + <LINK REL="stylesheet" HREF="bincimap.css" TYPE="text/css"> + <LINK REL="icon" HREF="/favicon.ico" TYPE="image/ico"> + <LINK REL="shortcut icon" HREF="/favicon.ico"> + +</HEAD> + +<BODY BGCOLOR="#000000"> + +<TABLE WIDTH="95%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> +<TR> +<TD BGCOLOR="#004444"> + +<TABLE WIDTH="99%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> + <TR> + <TD CLASS="headtext" BGCOLOR="#226666" ALIGN="LEFT"> + <TABLE> + <TR> + <TD ALIGN="center" VALIGN="middle"><IMG ALT="Binc IMAP logo" SRC="b-button64.png" BORDER="0"></TD> + <TD ALIGN="center" VALIGN="middle">Binc IMAP - FAQ</TD> + </TR> + </TABLE> + </TD> + <TD CLASS="bodytext" BGCOLOR="#226666" ALIGN="RIGHT"> + <A HREF="http://www.gnu.org/licenses/gpl.html">GNU General Public License</A><BR> + Andreas Aardal Hanssen &lt;andreas@hanssen.name&gt; + </TD> + </TR> + <TR> + <TD CLASS="bodytext" BGCOLOR="#FFFFFF" COLSPAN="2"></TD> + </TR> +</TABLE> + +<DIV CLASS="bodytext"> + +<UL> + <LI>General questions + <BLOCKQUOTE> + <P><A HREF="#q1">Q: Why did you start writing Binc IMAP?</A></P> + <P><A HREF="#q2">Q: What is "Binc"?</A></P> + </BLOCKQUOTE> + </LI> + <LI>About Binc IMAP + <BLOCKQUOTE> + <P><A HREF="#q3">Q: What are the advantages of Binc IMAP?</A></P> + <P><A HREF="#q4">Q: So Binc IMAP doesn't focus on security?</A></P> + <P><A HREF="#q5">Q: Is Binc IMAP <I>fast</I>?</A></P> + <P><A HREF="#q6">Q: Is Binc IMAP a stable, secure server?</A></P> + </BLOCKQUOTE> + </LI> + <LI>Configuration + <BLOCKQUOTE> + <P><A HREF="#q7">Q: Which configuration files are used by Binc IMAP?</A></P> + <P><A HREF="#q12">Q: How can I tell Binc IMAP where my mailboxes/folders are?</A></P> + <P><A HREF="#q13">Q: How can I get SSL to work?</A></P> + </BLOCKQUOTE> + </LI> + <LI>Usage + <BLOCKQUOTE> + <P><A HREF="#q14">Q: How do I find my folders in Binc IMAP?</A></P> + </BLOCKQUOTE> + </LI> + <LI>Authentication + <BLOCKQUOTE> + <P><A HREF="#q8">Q: How does Binc IMAP authentication work?</A></P> + </BLOCKQUOTE> + </LI> + <LI>Compiling + <BLOCKQUOTE> + <P><A HREF="#q15">Q: How do I fix this: "Unable to find required function getopt_long"?</A></P> + <P><A HREF="#q16">Q: How do I fix this: "Unable to find the crypto library which is part of OpenSSL"?</A></P> + <P><A HREF="#q17">Q: How do I fix this: "Unable to find the ssl library which is part of OpenSSL"?</A></P> + </BLOCKQUOTE> + </LI> + <LI>Installing + <BLOCKQUOTE> + <P><A HREF="#q10">Q: How do I install Binc IMAP?</A></P> + <P><A HREF="#q11">Q: Why does Binc IMAP (RPM) install under /opt?</A></P> + </BLOCKQUOTE> + </LI> +</UL> + +<HR> + +<A NAME="q1"> +<B><U>Q: Why did you start writing Binc IMAP?</U></B> +</A> + +<BLOCKQUOTE> +<P>First of all, I work a lot with qmail servers, and there haven't +really been many Maildir capable IMAP4rev1 servers around. I used +Courier-IMAP for years, but after loads of abuse from the Courier +community and its author, I found that earth had room for one more +IMAP4rev1 server.</P> + +<P>Enjoying the simplicity of qmail-pop3d, I decided to create an IMAP +server that was equally simple to install and use, and that could work +side-by-side with qmail-pop3d to provide IMAP service to qmail +users.</P> + +<P>I had already written an IMAP server for proxying POP3-accounts at +work, and I had so many good experiences from that project that I +beleived that I could really write a great IMAP server.</P> + +<P>Well, it's up to you to determine how great it is, but I swear it has +it's advantages over the existing Maildir capable IMAP servers out +there.</P> +</BLOCKQUOTE> + +<HR> + +<A NAME="q2"> +<B><U>Q: What is "Binc"?</U></B> +</A> + +<BLOCKQUOTE> + +<P>This should be quite obvious: Binc Is Not Courier-IMAP :-).</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q3"> +<B><U>Q: What are the advantages of Binc IMAP?</U></B> +</A> + +<BLOCKQUOTE> + +<P>Binc IMAP is a <I>light weight alternative</I> to existing IMAP +servers. It's easier to install, easier to maintain, and it's easy to +integrate into existing (perhaps legacy) authentication +environments.</P> + +<P>Binc IMAP is small and simple. The total number of lines of source +code is much smaller in Binc than in the other servers. Version +1.0.24-1 of Binc IMAP has about 18000 lines of code. There are only +17000 lines of hand written code, including comments. Few lines in +itself does <I>not</I> imply that the code is better, but it's +certainly much easier to maintain.</P> + +<P>It is also written in C++, using standard C++ data components. If +this server crashes, it'll most likely abort, and not suffer a +segmentation fault, which is the most common reason for exploits.</P> + +<P>Binc IMAP uses an object oriented design all the way. A modular, +simple design with few lines of code means that it's easier to uncover +bugs, and it's easier to fix them without disturbing the rest of the +source code.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q4"> +<B><U>Q: So Binc IMAP doesn't focus on security?</U></B> +</A> + +<UL> + <LI>Security comes naturally with a service with a clean, correct + design and no bugs</LI> + + <LI>Security can not be claimed. To prove that a server is not + secure, one must simply find a way to exploit it. <I>Claiming</I> + that a server is secure is like claiming that nobody can find a way + to break it.</LI> + + <LI>The only true argument is to <I>prove</I> that it's secure. And + that's almost impossible.</LI> + + <LI>Binc IMAP focuses on creating a service with a clean, correct + design with no bugs. Time and experience will tell wether it's a + secure server or not.</LI> +</UL> + +<HR> + +<A NAME="q5"> +<B><U>Q: Is Binc IMAP <I>fast</I>?</U></B> +</A> + +<P>Binc IMAP focuses its optimizations on the type of activity that +dominates the lifetime of an IMAP connection, which is idle time.</P> + + <UL> + <LI>Pending updates: When a client issues NOOP, CHECK or similar, + the server must give the latest changes to the depository. If no + changes have been made, this operation will with Binc IMAP + consist of only two stat-calls, which is extremely fast.</LI> + + <LI>FETCH: Multiple subsequent operations on the same message + will never cause the message to be parsed more than twice - once + for header-only operations and once for full message info.</LI> + + <LI>STATUS: The status command is typically used to check for + new messages in all subscribed mailboxes. If no changes have been + made to a mailbox, the status command in Binc IMAP consists of + only two stat calls, which is extremely fast.</LI> + + <LI>SEARCH: The search keys are weighted, and the search query is + sorted with lightest-search first. This prevents unnecessary + processing of slow search keys if the light search keys do not + match the message set.</LI> + </UL> + +<P>Some activity is not optimal in Binc IMAP, and searching for random +text in particular is no faster than a sequential search using +standard UNIX tools such as <I>grep</I>. Searching for text in a large +mailbox is quite rare, however, compared to the random activity of +close-to-idle clients.</P> + +<HR> + +<A NAME="q6"> +<B><U>Q: Is Binc IMAP a stable, secure server?</U></B> +</A> + +<BLOCKQUOTE> +<P>It's hard to write bug free programs, especially with a complex +protocol like IMAP4rev1. Any attempts to verify code usually comes +down to the limitations in the author's experience with +verification. Or as +<A HREF="http://www-cs-faculty.stanford.edu/~knuth/">Donald Knuth</A> +said (my favorite quote):</P> + +<P><I>"Beware of bugs in the above code; I have only proved it correct, + not tried it."</I></P> + +<P>Knuth teaches that it can be easy to prove that your code is +correct, but who's going to prove that your <I>proof</I> is correct? +Proving your proof might turn out to be close to impossle. What you +can have, is conventions and principles that prevent bugs from showing +up in your programs. Here are mine:</P> + +<UL> + <LI>Don't reinvent the wheel. Unless absolutely necessary, write + code that doesn't exist already.</LI> + <LI>Spend your time on making it work as simple as possible, + then start making optimizations.</LI> + <LI>Don't let optimization obfuscate your source code.</LI> + <LI>Find a better algorithm, or if you can't get the speed that you + want, change to a more efficient programming language.</LI> + <LI>Handle all error conditions.</LI> + <LI>Avoid buffers altogether.</LI> + <LI>Don't hand write parsers unless strictly necessary - they are + hard to get right.</LI> + <LI>For G's sake, be compliant! If the standard has flaws, then + <I>help fix the flaws</I> - don't break the standard.</LI> +</UL> + +<P>Now I don't pay $2.56^n where n equals the total number of +bugs discovered in Binc IMAP, but I will certainly give you +many pats on the back if I get the chance. :-)</P> + +<P>I could go on and on, but the point is that I have tried my best to +perform all the expected tasks in the most logical and obvious way +possible, using all my C++ security experience to aid me. But at the +time of writing, the server is young, the community small, and we are +only in Beta. So time will have to tell how stable and secure we +are.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q7"> +<B><U>Q: Which configuration files are used by Binc IMAP?</U></B> +</A> + +<BLOCKQUOTE> +<UL> + <LI>/etc/opt/bincimap/supervise/imap/run</LI> + <LI>/etc/opt/bincimap/supervise/imaps/run</LI> + <LI>/etc/opt/bincimap/xinetd/imap</LI> + <LI>/etc/opt/bincimap/xinetd/imaps</LI> +</UL> + +<P>These files are for administrators. You can set up Binc IMAP's +authentication method here.</P> + +<UL> +<LI>/etc/opt/bincimap/bincimap.conf</LI> +</UL> + +<P>This first file is for setting global administrator settings, such +as paths to the host's SSL certificate, timeouts for idle clients and +so on. It need not be readable for anyone but root.</P> + +<UL> +<LI>$HOME/.bincimap</LI> +</UL> + +<P>This file is for individual settings, such as what the exact path +is to this user's depository, which default Mailbox type to use and +which type of depository the user uses.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q12"> +<B><U>Q: How can I tell Binc IMAP where my mailboxes/folders are?</U></B> +</A> + +<BLOCKQUOTE> + +<P>The configuration file has a section called <B>Mailbox</B>. You can +set the <B>path</B> to your users' mail depository there, relative to +the users' home areas.</P> + +<P>If your depository is not is users' homeareas, for instance if your +depository has a <B>/var/mail/user/</B> structure, you can safely set +<B>path</B> to <B>"."</B> or <B>""</B>. Your authenticator must then +change to the full path of the depository, <B>/var/mail/user/</B>, +before invoking bincimapd.</P> + +<P>For a <B>Maildir++</B> depository under standard home areas, with +the mailbox path set to "Maildir" in bincimap.conf, your structure +would typically look something like this:</P> + +<TABLE ALIGN="center" CELLSPACING="5" CELLPADDING="5"> + <TR> + <TH BGCOLOR="#555555">File system + </TH> + <TH BGCOLOR="#555555">IMAP + </TH> + <TH BGCOLOR="#555555">Description + </TH> + </TR> + <TR> + <TD BGCOLOR="#555555"> + <PRE> +~/Maildir/ +~/Maildir/.Sent/ + </PRE> + </TD> + <TD BGCOLOR="#555555"> + <PRE> +"INBOX" +"INBOX/Sent" + </PRE> + </TD> + <TD BGCOLOR="#555555"> + <PRE> +The main mailbox, the INBOX. +A user created mailbox. + </PRE> + </TD> + </TR> +</TABLE> + +<P>If you use IMAPdir (setting depot="IMAPdir" and for instance +path="IMAPdir"), the structure would be slightly different:</P> + +<TABLE ALIGN="center" CELLSPACING="5" CELLPADDING="5"> + <TR> + <TH BGCOLOR="#555555">File system + </TH> + <TH BGCOLOR="#555555">IMAP + </TH> + <TH BGCOLOR="#555555">Description + </TH> + </TR> + <TR> + <TD BGCOLOR="#555555"> + <PRE> +~/IMAPdir/INBOX -> ../Maildir +~/IMAPdir/Sent/ +~/IMAPdir/Sent.2003/ +~/Maildir/ + </PRE> + </TD> + <TD BGCOLOR="#555555"> + <PRE> +"INBOX" +"Sent" +"Sent/2003" +&lt;zip&gt; + </PRE> + </TD> + <TD BGCOLOR="#555555"> + <PRE> +The main mailbox symlink, the INBOX. +A user created mailbox. +A sublevel user created mailbox. +Invisible. + </PRE> + </TD> + </TR> +</TABLE> + +<P>With no seperate directory for the mail depository, your structure +would be like this with IMAPdir, and similar with Maildir++ <I>(the +prefix folder is simply dropped, and INBOX itself is a Maildir, note +that the MTA must be instructed to deliver to INBOX and not +Maildir)</I>:</P> + +<TABLE ALIGN="center" CELLSPACING="5" CELLPADDING="5"> + <TR> + <TH BGCOLOR="#555555">File system + </TH> + <TH BGCOLOR="#555555">IMAP + </TH> + <TH BGCOLOR="#555555">Description + </TH> + </TR> + <TR> + <TD BGCOLOR="#555555"> + <PRE> +~/INBOX +~/Sent/ +~/Sent.2003/ + </PRE> + </TD> + <TD BGCOLOR="#555555"> + <PRE> +"INBOX" +"Sent" +"Sent/2003" + </PRE> + </TD> + <TD BGCOLOR="#555555"> + <PRE> +The main mailbox, the INBOX, a Maildir. +A user created mailbox. +A sublevel user created mailbox. + </PRE> + </TD> + </TR> +</TABLE> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q13"> +<B><U>Q: How can I get SSL to work?</U></B> +</A> + +<BLOCKQUOTE> + +<P>SSL in Binc IMAP is quite simple to set up. First you need a PEM +encoded certificate file. In some distributions, you can generate this +file by changing to /usr/share/ssl/certs and running "make". A script +will give you the option to build a PEM file.</P> + +<P>When you have a PEM file, edit <B>bincimap.conf</B> in the SSL +section . You need to add an item called <B>pem file</B> and set it to +point to your PEM certificate. The path name must be absolute. For +example:</P> + +<PRE> + SSL { + pem file = "/usr/share/ssl/certs/mypemfile.pem", + ca file = "", + cipher list = "!ADH:RC4+RSA:HIGH:MEDIUM:LOW:EXP:+SSLv2:+EXP", + verify peer = "no" + } +</PRE> + +<P>The item <B>ca file</B> in <B>bincimap.conf</B> tells Binc IMAP +which file on your system contains a bundle of <B>certificate +authorities</B>.</P> + +<P>Next comes the item called <B>cipher list</B>. It tells Binc IMAP +about which ciphers you want your server to support. This depends on +what version of OpenSSL you're running.</P> + +<P>Last comes an option called <B>verify peer</B>. This tells Binc +IMAP wether to attempt to verify the client's identity.</P> + +<P>Visit <A +HREF="http://httpd.apache.org/docs-2.0/ssl/ssl_intro.html">this link +at the Apache.org website</A> to read more about SSL and TLS +principles.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q14"> +<B><U>Q: How do I find my folders in Binc IMAP?</U></B> +</A> + +<BLOCKQUOTE> + +<P>Binc IMAP can be configured to use two types of depositories: +Maildir++ and IMAPdir.</P> + +<P>Using Maildir++, all folders in Binc IMAP must be subfolders of +INBOX. This is the default setting.</P> + +<P>This means that if you want to create a folder called <B>work</B>, +you have to create <B>INBOX.work</B> or <B>INBOX/work</B>.</P> + +<P>For some graphical IMAP clients like <B>Outlook</B> (look out!) or +<B>Mozilla Mail</B>, this means you need to <I>right click</I> on +<B>INBOX</B> and select "Create subfolder".</P> + +<P>Using IMAPdir, folders can be created in any levels. See also <A +HREF="#q12">this question</A>.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q8"> +<B><U>Q: How does Binc IMAP authentication work?</U></B> +</A> + +<BLOCKQUOTE> +<P>Binc IMAP is spawned by xinetd, tcpserver or any other TCP wrapper +running as root.</P> + +<P>It immediately goes into pre-authentication mode, where it expects +the client to enter STARTTLS if the client is not already running an +SSL connection. When in TLS/SSL mode, it will accept clear text +authentication.</P> + +<P>Binc IMAP uses the same authentication method as +<U>qmail-pop3d</U>, checkpassword. The pre-authentication stub invokes +the checkpassword compatible authenticator, which if the password is +correct in turn invokes the main Binc IMAP daemon.</P> + +<P>The <A HREF="http://cr.yp.to/checkpwd.html">checkpassword documentation</A> is +required reading for everyone running Binc IMAP.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q15"> +<B><U>Q: How do I fix this: "Unable to find required function getopt_long"?</U></B> +</A> + +<BLOCKQUOTE> + +<P>The <U>getopt_long</U> function is a GNU extension to the POSIX.2 <U>getopt</U> +function. It allows long arguments such as <B>--enable-ssl</B>.</P> + +<P>Unfortunately, this function is not defined on all +platforms. Specifically, it is known to not exist on FreeBSD.</P> + +<P>For FreeBSD users, install <U>gnugetopt</U> from ports. Otherwise, +post this problem with as much relevant info as you can provide, to +the mailing list.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q16"> +<B><U>Q: How do I fix this: "Unable to find the crypto library which is part of OpenSSL"?</U></B> +</A> + +<BLOCKQUOTE> + +<P>The <U>crypto</U> library is a part of <A HREF="http://www.openssl.org">OpenSSL</A>. This +library is required for Binc IMAP to compile.</P> + +<P>If you can not get Binc IMAP to compile with OpenSSL, there should +be a <A HREF="dl/RPMS">static RPM package</A> available for download.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q17"> +<B><U>Q: How do I fix this: "Unable to find the ssl library which is part of OpenSSL"?</U></B> +</A> + +<BLOCKQUOTE> + +<P>The <U>crypto</U> library is a part of <A HREF="http://www.openssl.org">OpenSSL</A>. This +library is required for Binc IMAP to compile.</P> + +<P>If you can not get Binc IMAP to compile with OpenSSL, there should +be a <A HREF="dl/RPMS">static RPM package</A> available for download.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q10"> +<B><U>Q: How do I install Binc IMAP?</U></B> +</A> + +<BLOCKQUOTE> + +<P>The <I>easiest</I> way to install Binc IMAP on your server is to +follow these instructions:</P> + +<UL> + <LI>Download the RPM from <A HREF="dl/RPMS">http://www.bincimap.andreas.hanssen.name/dl/RPMS</A></LI> + <LI>Install the RPM</LI> + <LI>Copy, edit and perhaps symlink the configuration files: + <UL> + <LI>with daemontools: + <UL> + <LI>ln -s /etc/opt/bincimap/supervise/imap /service/imap</LI> + <LI>ln -s /etc/opt/bincimap/supervise/imaps /service/imaps</LI> + </UL> + </LI> + <LI>with xinetd: + <UL> + <LI>ln -s /etc/opt/bincimap/xinetd/imap /etc/xinetd.d/imap</LI> + <LI>ln -s /etc/opt/bincimap/xinetd/imaps /etc/xinetd.d/imaps</LI> + <LI>service xinetd restart</LI> + </UL> + </LI> + </UL> + </LI> + <LI>Check that the service is up by connecting using a standard IMAP client</LI> +</UL> + +<P>If you want to build Binc IMAP from source, there's a <B>README</B> +file that gives you the instructions step by step, inside the +tarball. You can also get some clues by inspecting the bundled +<B>bincimap-spec</B> file's <B>install</B> section.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q11"> +<B><U>Q: Why does Binc IMAP (RPM) install under /opt?</U></B> +</A> + +<BLOCKQUOTE> + +<P>The reason for this is that I have tried my best to follow the <A +HREF="http://www.pathname.com/fhs/">File System Hierarchy +Standard</A>.</P> + +<P>Binaries go under <B>/opt/bincimap/bin</B></P> + +<P>Host specific configuration goes under <B>/etc/opt/bincimap</B></P> + +<P>If you want your files elsewhere, there's always the option to build +the project from source. :-)</P> + +</BLOCKQUOTE> + +<HR> + +<TABLE WIDTH="99%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> + <TR> + <TD CLASS="bodytext" BGCOLOR="#FFFFFF"></TD> + </TR> + <TR> + <TD CLASS="headtext" BGCOLOR="#226666"> + <A HREF="http://validator.w3.org/check/referer"> + <IMG BORDER="0" SRC="http://www.w3.org/Icons/valid-html401" + ALT="Valid HTML 4.01!" HEIGHT="31" WIDTH="88"> + </A> + <A HREF="http://cr.yp.to/djbdns.html"><IMG BORDER="0" WIDTH="88" + HEIGHT="31" SRC="djbdns.jpg" ALT="Powered by djbdns!"></A> + <IMG BORDER="0" WIDTH="88" HEIGHT="30" SRC="binclogo.gif" + ALT="Powered by Binc IMAP"> + </TD> + </TR> +</TABLE> + +</DIV> +</TD> +</TR> +</TABLE> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> + +</BODY> +</HTML> ++FLAGS \Flagged +* FETCH (FLAGS (\Seen \Flagged)) +8 OK STORE completed + </PRE> + </LI> + </UL> +</P> + +<P>If all these tests work fine, try connecting with an IMAP client +such as Mozilla, Outlook, Eudora, Netscape, Mutt or Pine.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q14"> +<B><U>Q: How do I find my folders in Binc IMAP?</U></B> +</A> + +<BLOCKQUOTE> + +<P>Binc IMAP can be configured to use two types of depositories: +Maildir++ and IMAPdir.</P> + +<P>Using Maildir++, all folders in Binc IMAP must be subfolders of +INBOX. This is the default setting.</P> + +<P>This means that if you want to create a folder called <B>work</B>, +you have to create <B>INBOX.work</B> or <B>INBOX/work</B>.</P> + +<P>For some graphical IMAP clients like <B>Outlook</B> (look out!) or +<B>Mozilla Mail</B>, this means you need to <I>right click</I> on +<B>INBOX</B> and select "Create subfolder".</P> + +<P>Using IMAPdir, folders can be created in any levels. See also <A +HREF="#q12">this question</A>.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q8"> +<B><U>Q: How does Binc IMAP authentication work?</U></B> +</A> + +<BLOCKQUOTE> +<P>Binc IMAP is spawned by xinetd, tcpserver or any other TCP wrapper +running as root.</P> + +<P>It immediately goes into pre-authentication mode, where it expects +the client to enter STARTTLS if the client is not already running an +SSL connection. When in TLS/SSL mode, it will accept clear text +authentication.</P> + +<P>Binc IMAP uses the same authentication method as +<U>qmail-pop3d</U>, checkpassword. The pre-authentication stub invokes +the checkpassword compatible authenticator, which if the password is +correct in turn invokes the main Binc IMAP daemon.</P> + +<P>The <A HREF="http://cr.yp.to/checkpwd.html">checkpassword documentation</A> is +required reading for everyone running Binc IMAP.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q19"> +<B><U>Q: What does this mean: "Server broke for <userid>, /bin/checkpassword returned 111 (internal error)"?</U></B> +</A> + +<BLOCKQUOTE> + +<P>This log line is printed by <U>bincimap-up</U>, and reflects how +confusing checkpassword can be at times. Most often, though, the +problem is easy to solve.</P> + +<P>Log in as the user who tried to log in. If you are using a virtual +mail account system like vpopmail, become the user that mail accounts +are stored as.</P> + +<P>Try running the bincimapd daemon manually. If you can execute the +binary, there will be no output and the server will simply exit. Most +often, however, you will get an error such as "command not found" or +"permission denied". This should explain quite easily what the problem +is. Note that the bincimapd binary must have read and execute +permissions for all users (755).</P> + +<P>If this didn't solve your problem, please post to the mailing list +a stack trace. To create a stacktrace, attach to tcpserver/xinetd +using "strace -s 1024 -f -p <pid> 2>&1 >dump". Log in to reproduce the +error. Then interrupt the strace program and email the "dump" file to +the mailing list. <B>Note:</B> It is likely that the dump file +contains passwords in plain text.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q15"> +<B><U>Q: How do I fix this: "Unable to find required function getopt_long"?</U></B> +</A> + +<BLOCKQUOTE> + +<P>Note: This only applies to versions 1.1.6 or older.</P> + +<P>The <U>getopt_long</U> function is a GNU extension to the POSIX.2 <U>getopt</U> +function. It allows long arguments such as <B>--enable-ssl</B>.</P> + +<P>Unfortunately, this function is not defined on all +platforms. Specifically, it is known to not exist on FreeBSD.</P> + +<P>For FreeBSD users, install <U>gnugetopt</U> from ports. Otherwise, +post this problem with as much relevant info as you can provide, to +the mailing list.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q16"> +<B><U>Q: How do I fix this: "Unable to find the crypto library which is part of OpenSSL"?</U></B> +</A> + +<BLOCKQUOTE> + +<P>The <U>crypto</U> library is a part of <A HREF="http://www.openssl.org">OpenSSL</A>. This +library is required for Binc IMAP to compile.</P> + +<P>If you can not get Binc IMAP to compile with OpenSSL, there should +be a <A HREF="dl/RPMS">static RPM package</A> available for download.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q17"> +<B><U>Q: How do I fix this: "Unable to find the ssl library which is part of OpenSSL"?</U></B> +</A> + +<BLOCKQUOTE> + +<P>The <U>crypto</U> library is a part of <A HREF="http://www.openssl.org">OpenSSL</A>. This +library is required for Binc IMAP to compile.</P> + +<P>If you can not get Binc IMAP to compile with OpenSSL, there should +be a <A HREF="dl/RPMS">static RPM package</A> available for download.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q10"> +<B><U>Q: How do I install Binc IMAP?</U></B> +</A> + +<BLOCKQUOTE> + +<P>The <I>easiest</I> way to install Binc IMAP on your server is to +follow these instructions:</P> + +<UL> + <LI>Download the RPM from <A HREF="dl/RPMS">http://www.bincimap.andreas.hanssen.name/dl/RPMS</A></LI> + <LI>Install the RPM</LI> + <LI>Copy, edit and perhaps symlink the configuration files: + <UL> + <LI>with daemontools: + <UL> + <LI>ln -s /etc/opt/bincimap/supervise/imap /service/imap</LI> + <LI>ln -s /etc/opt/bincimap/supervise/imaps /service/imaps</LI> + </UL> + </LI> + <LI>with xinetd: + <UL> + <LI>ln -s /etc/opt/bincimap/xinetd/imap /etc/xinetd.d/imap</LI> + <LI>ln -s /etc/opt/bincimap/xinetd/imaps /etc/xinetd.d/imaps</LI> + <LI>service xinetd restart</LI> + </UL> + </LI> + </UL> + </LI> + <LI>Check that the service is up by connecting using a standard IMAP client</LI> +</UL> + +<P>If you want to build Binc IMAP from source, there's a <B>README</B> +file that gives you the instructions step by step, inside the +tarball. You can also get some clues by inspecting the bundled +<B>bincimap-spec</B> file's <B>install</B> section.</P> + +</BLOCKQUOTE> + +<HR> + +<A NAME="q11"> +<B><U>Q: Why does Binc IMAP (RPM) install under /opt?</U></B> +</A> + +<BLOCKQUOTE> + +<P>The reason for this is that I have tried my best to follow the <A +HREF="http://www.pathname.com/fhs/">File System Hierarchy +Standard</A>.</P> + +<P>Binaries go under <B>/opt/bincimap/bin</B></P> + +<P>Host specific configuration goes under <B>/etc/opt/bincimap</B></P> + +<P>If you want your files elsewhere, there's always the option to build +the project from source. :-)</P> + +</BLOCKQUOTE> + +<HR> + +<TABLE WIDTH="99%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> + <TR> + <TD CLASS="bodytext" BGCOLOR="#FFFFFF"></TD> + </TR> + <TR> + <TD CLASS="headtext" BGCOLOR="#226666"> + <A HREF="http://validator.w3.org/check/referer"> + <IMG BORDER="0" SRC="http://www.w3.org/Icons/valid-html401" + ALT="Valid HTML 4.01!" HEIGHT="31" WIDTH="88"> + </A> + <A HREF="http://cr.yp.to/djbdns.html"><IMG BORDER="0" WIDTH="88" + HEIGHT="31" SRC="djbdns.jpg" ALT="Powered by djbdns!"></A> + <IMG BORDER="0" WIDTH="88" HEIGHT="30" SRC="binclogo.gif" + ALT="Powered by Binc IMAP"> + </TD> + </TR> +</TABLE> + +</DIV> +</TD> +</TR> +</TABLE> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> + +</BODY> +</HTML> diff --git a/doc/bincimap-goals.html b/doc/bincimap-goals.html @@ -0,0 +1,160 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<HTML> + +<HEAD> + <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> + <META HTTP-EQUIV="Content-Language" CONTENT="en"> + + <TITLE>Binc IMAP - Goals</TITLE> + <META NAME="revisit-after" CONTENT="14 days"> + <META NAME="keywords" CONTENT="Binc IMAP Goals checkpassword daemontools tcpserver xinetd Maildir qmail"> + <META NAME="description" CONTENT="Andreas Aardal Hanssen"> + <META NAME="copyright" CONTENT="Copyright Andreas Aardal Hanssen 2002, 2003"> + <META NAME="distribution" CONTENT="global"> + <META NAME="author" CONTENT="Andreas Aardal Hanssen"> + <LINK REL="stylesheet" HREF="bincimap.css" TYPE="text/css"> + <LINK REL="icon" HREF="/favicon.ico" TYPE="image/ico"> + <LINK REL="shortcut icon" HREF="/favicon.ico"> + +</HEAD> + +<BODY BGCOLOR="#000000"> + +<TABLE WIDTH="95%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> +<TR> +<TD BGCOLOR="#004444"> + +<TABLE WIDTH="99%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> + <TR> + <TD CLASS="headtext" BGCOLOR="#226666" ALIGN="LEFT"> + <TABLE> + <TR> + <TD ALIGN="center" VALIGN="middle"><IMG ALT="Binc IMAP logo" SRC="b-button64.png" BORDER="0"></TD> + <TD ALIGN="center" VALIGN="middle">Binc IMAP - Goals</TD> + </TR> + </TABLE> + </TD> + <TD CLASS="bodytext" BGCOLOR="#226666" ALIGN="RIGHT"> + <A HREF="http://www.gnu.org/licenses/gpl.html">GNU General Public License</A><BR> + Andreas Aardal Hanssen &lt;andreas@hanssen.name&gt; + </TD> + </TR> + <TR> + <TD CLASS="bodytext" BGCOLOR="#FFFFFF" COLSPAN="2"></TD> + </TR> +</TABLE> + +<BLOCKQUOTE> + +The Binc IMAP project is more than programming. This is a list of the main goals and visions +that the author of Binc IMAP has put to ground. + +<UL> +<LI>Helpful, hospitable community + <UL> + <LI>Although it is expected that users of Binc IMAP do their homework before posting, the server author + and community of the Binc IMAP mailing list will be friendly and will approach everyone with respect. + The same is expected from those who post to the list.</LI> + <LI>There will be no RTFM on the project's mailing list. Flaming and personal insults on the project's mailing list will result in banning of the originator.</LI> + <LI>The community is encouraged to pay back to the project's contributors by <B>sharing</B> their own + contributions to Binc IMAP through the GPL license.</LI> + </UL> +</LI> +<LI>Security through good design + <UL> + <LI>A well designed server is <U>less exposed to bugs</U> than a poorly designed server.</LI> + <LI>The server will strive to use <U>every kind of security enhancing feature</U>, while + keeping the implementation details as simple as possible.</LI> + <LI><U>The source is open</U> and downloadable. Potential bugs and/or nasty pieces of + code are easily uncovered when the whole community is able to study every line of + code in detail. Bugs should always be reported to the project's mailing list.</LI> + </UL> +</LI> +<LI>No competition + <UL> + <LI>Under no circumstance will this project be in market driven competition with other + IMAP servers.</LI> + <LI>Binc IMAP is first and foremost a <U>quality driven project</U>.</LI> + <LI>This project is meant to <U><I>influence</I> the community</U> of authors of + network protocols and servers, and hopes to increase the general quality + of software that is used all over the globe and beyond.</LI> + </UL> +</LI> +<LI>Modularity + <UL> + <LI><B>Binary modularity</B> + <P><U>Pluggable extension support.</U> Modules that are loaded into Binc can change a + great deal of Binc's behavior. Adding your own extension or altering Binc + IMAP's behavior should be as easy as it can get, and it should not require a + recompile of the Binc IMAP core.</P> + <P><U>Pluggable authentication support.</U> By supporting <B>checkpassword</B> + compatible authentication modules, Binc IMAP clients can authenticate against great + number of authorities.</P> + </LI> + <LI><B>Source modularity</B> + <P>With a modular and simple yet advanced object oriented design, it should be + easy to quickly understand what every method and function does. This will + increase third party developers' ability to write extensions and modifications fast.</P> + <P>Development of the design and implementation of Binc IMAP will focus on + <U>extensibility, robustness and speed</U>. + </LI> + + </UL> +</LI> +<LI>Quality over quantity + <UL> + <LI>Binc IMAP's releases are milestones. We strive for perfection.</LI> + <LI>Work on improving the existing design and extensibility will always go ahead of + adding new features.</LI> + <LI>Through extensive module support, the community is encouraged to contribute + to the adding and testing of new features. Core design and implementation will + always focus on quality.</LI> + </UL> +</LI> +</UL> + +<HR> +Last updated: 2003-03-24 + + +</BLOCKQUOTE> + +<TABLE WIDTH="99%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> + <TR> + <TD CLASS="bodytext" BGCOLOR="#FFFFFF"></TD> + </TR> + <TR> + <TD CLASS="headtext" BGCOLOR="#226666"> + <A HREF="http://validator.w3.org/check/referer"> + <IMG BORDER="0" SRC="http://www.w3.org/Icons/valid-html401" + ALT="Valid HTML 4.01!" HEIGHT="31" WIDTH="88"> + </A> + <A HREF="http://cr.yp.to/djbdns.html"><IMG BORDER="0" WIDTH="88" + HEIGHT="31" SRC="djbdns.jpg" ALT="Powered by djbdns!"></A> + <IMG BORDER="0" WIDTH="88" HEIGHT="30" SRC="binclogo.gif" + ALT="Powered by Binc IMAP"> + </TD> + </TR> +</TABLE> + +</TD> +</TR> +</TABLE> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> + +</BODY> +</HTML> +"> + </TD> + </TR> +</TABLE> + +</TD> +</TR> +</TABLE> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> + +</BODY> +</HTML> diff --git a/doc/bincimap-imapdir.html b/doc/bincimap-imapdir.html @@ -0,0 +1,257 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<HTML> + +<HEAD> + <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> + <META HTTP-EQUIV="Content-Language" CONTENT="en"> + + <TITLE>Binc IMAP - IMAPdir</TITLE> + <META NAME="revisit-after" CONTENT="14 days"> + <META NAME="keywords" CONTENT="Binc IMAP imapdir checkpassword daemontools tcpserver xinetd Maildir qmail"> + <META NAME="description" CONTENT="Andreas Aardal Hanssen"> + <META NAME="copyright" CONTENT="Copyright Andreas Aardal Hanssen 2002, 2003"> + <META NAME="distribution" CONTENT="global"> + <META NAME="author" CONTENT="Andreas Aardal Hanssen"> + <LINK REL="stylesheet" HREF="bincimap.css" TYPE="text/css"> + <LINK REL="icon" HREF="/favicon.ico" TYPE="image/ico"> + <LINK REL="shortcut icon" HREF="/favicon.ico"> + +</HEAD> + +<BODY BGCOLOR="#000000"> + +<TABLE WIDTH="95%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> +<TR> +<TD BGCOLOR="#004444"> + +<TABLE WIDTH="99%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> + <TR> + <TD CLASS="headtext" BGCOLOR="#226666" ALIGN="LEFT"> + <TABLE> + <TR> + <TD ALIGN="center" VALIGN="middle"><IMG ALT="Binc IMAP logo" SRC="b-button64.png" BORDER="0"></TD> + <TD ALIGN="center" VALIGN="middle">Binc IMAP - IMAPdir</TD> + </TR> + </TABLE> + </TD> + <TD CLASS="bodytext" BGCOLOR="#226666" ALIGN="RIGHT"> + <A HREF="http://www.gnu.org/licenses/gpl.html">GNU General Public License</A><BR> + Andreas Aardal Hanssen &lt;andreas@hanssen.name&gt; + </TD> + </TR> + <TR> + <TD CLASS="bodytext" BGCOLOR="#FFFFFF" COLSPAN="2"></TD> + </TR> +</TABLE> + +<DIV CLASS="bodytext"> + +<BLOCKQUOTE> + +<P>This document describes the generic mail folder structure +<B>IMAPdir</B>.</P> + +<P>The goal of the work behind this specification is to provide the +community with an unambiguous representation of a mailbox hierarchy +where a mailbox name has a one-to-one match against a file system +representation. The hierarchy and naming style is inspired by the +IMAP4 protocol.</P> + +<P>Rather than being a completely new mailbox format, this specification +sets conventions on how to represent a mailbox hierarchy on a file +system, using existing mailbox formats. <B>IMAPdir</B> is not bound to +any protocol.</P> + +<P><B>IMAPdir</B> works with any mailbox format where one mailbox can +be identified by a file, a directory or a symbolic link. One entry in +an <B>IMAPdir</B> folder is a candidate for a mailbox. If the +<B>IMAPdir</B> client can not identify a directory entry as a +selectable mailbox, then the client must either skip the entry or +mark it as invalid (in IMAP, marked as \NoSelect).</P> + +<UL> +<LI>There is no limitation to the type of file system or the number of +file systems represented inside an <B>IMAPdir</B>.</LI> +<LI>There are no reserved ordinary folder +names such as "Sent", "Draft" or "Trash".</LI> +<LI>Clients of the mailboxes inside an <B>IMAPdir</B> +folder <I>must</I> follow the respective format and protocol conventions +strictly.</LI> +</UL> + +<P>The format of a mailbox representation in <B>IMAPdir</B> is a +sequence of one or more US-ASCII characters (32-126), encoded using +the following rules:</P> + +<UL> +<LI>A dot '.' character represents a soft hierarchy delimiter with two exceptions: + <UL> + <LI>A leading dot represents the dot itself.</LI> + <LI>A dot '.' preceded by a backslash '\' represents the dot '.' itself.</LI> + </UL> +</LI> +<LI>A backslash '\' preceded by a backslash '\' represents the backslash '\' itself. For all other cases than before a dot '.' or a backslash '\', a stray backslash '\' character is considered an error.</LI> +<LI>A backslash '\' as the first character of an entry is considered an error.</LI> +<LI>All other characters represent themselves.</LI> +</UL> + +Note that the protocol used to fetch the mailbox using the +structuring <B>IMAPdir</B> convention may restrict the character set +allowed. The clients <I>must</I> in those cases translate the mailbox +names to a selectable format. + +<P>As with <A +HREF="http://www.inter7.com/courierimap/README.maildirquota.html">Maildir++</A>, +submailboxes can not be represented in a recursive fashion in the file +system. The mailbox' representation name will contain the soft +hierarchy delimiter character dot '.', and all mailboxes must reside +in the same root level directory.</P> + +<P>The following example shows the typical content of an +<B>IMAPdir</B> stored under the directory <B>mail/</B>. The <B>file +system</B> column displays the contents as viewed by the UNIX command +'ls -al -F'.</P> + +<TABLE ALIGN="center" CELLSPACING="5" CELLPADDING="5"> + <TR> + <TH BGCOLOR="#555555">File system + </TH> + <TH BGCOLOR="#555555">IMAP + </TH> + <TH BGCOLOR="#555555">Description + </TH> + </TR> + <TR> + <TD BGCOLOR="#555555"> + <PRE> +mail/INBOX -> /var/mail/paul +mail/INBOX.old/ -> ../Maildir/ +mail/INBOX.outbox/ +mail/work +mail/3rd\. of July +mail/Sent.2003.Jan/ +mail/Sent.2003.Feb/ +mail/Sent.2003.Mar/ +mail/.foo + </PRE> + </TD> + <TD BGCOLOR="#555555"> + <PRE> +"INBOX" +"INBOX/old" +"INBOX/outbox" +"work" +"3rd. of July" +"Sent/2003/Jan" +"Sent/2003/Feb" +"Sent/2003/Mar" +".foo" + </PRE> + </TD> + <TD BGCOLOR="#555555"> + <PRE> +Symbolic link to mbox +Symbolic link to Maildir +Maildir +mbox +mbox +Maildir +Maildir +Maildir +mbox + </PRE> + </TD> + </TR> +</TABLE> + +<P>In other multi level mailbox formats, <B>INBOX</B> is treated as a +special case.</P> + +<BLOCKQUOTE> + <P><U><B>Maildir++</B></U></P> + + <UL> + <LI><A + HREF="http://www.inter7.com/courierimap/README.maildirquota.html">Maildir++</A> + defines the mail directory itself as + <B>INBOX</B>. Any subdirectories inside starting with a single dot + '.', and containing the file <B>maildirfolder</B> are interpreted as + a <A + HREF="http://www.inter7.com/courierimap/README.maildirquota.html">Maildir++</A> + submailbox. + + <LI><P>A <A HREF="http://cr.yp.to/proto/maildir.html">Maildir</A> is by + Dan J. Bernstein's definition identified by a directory that + contains the subdirectories <B>cur</B>, + <B>new</B> and <B>tmp</B> and nothing else.</LI> + + <LI>The <A + HREF="http://www.inter7.com/courierimap/README.maildirquota.html">Maildir++</A> + definition follows naturally from <A + HREF="http://www.inter7.com/courierimap/README.maildirquota.html">Maildir++</A> + being an extension to Dan J. Bernstein's <A + HREF="http://cr.yp.to/proto/maildir.html">Maildir</A> + format. However, although the directory ~/Maildir/ itself is a + standard representation of INBOX for <A + HREF="http://cr.yp.to/proto/maildir.html">Maildir</A> clients, it is + not standard for other mailbox formats. With <A + HREF="http://www.inter7.com/courierimap/README.maildirquota.html">Maildir++</A>, + your mailboxes and INBOX in particular must be a <A + HREF="http://cr.yp.to/proto/maildir.html">Maildir</A>. + </UL> + + <P><U><B>mbox</B></U></P> + + <UL> + <LI>When using the <B>mbox</B> storage format, the user's INBOX is typically + stored at /var/spool/mail/&lt;username&gt;.</LI> + + <LI>Using this format, the mail depository client must both have the + path to the user's INBOX <I>and</I> the path to the user's local + mailbox depository, typically <B>mail/</B>.</LI> + </UL> + +</BLOCKQUOTE> + +<P>Note that although <B>IMAPdir</B> has no restrictions with regards +to mailbox names, the protocol that uses <B>IMAPdir</B> might. For +example, IMAP servers will require the mailbox <B>INBOX</B> to be +present.</P> + +<HR> + +<P>Last updated on <B>2003-03-20</B>.</P> + +<P>Please direct comments to <B>IMAPdir</B> or this document to the +<A HREF="/#mailinglist">Binc IMAP mailing list</A>. Remember to <I>search the archives</I> +first.</P> + +</BLOCKQUOTE> + +<TABLE WIDTH="99%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> + <TR> + <TD CLASS="bodytext" BGCOLOR="#FFFFFF"></TD> + </TR> + <TR> + <TD CLASS="headtext" BGCOLOR="#226666"> + <A HREF="http://validator.w3.org/check/referer"> + <IMG BORDER="0" SRC="http://www.w3.org/Icons/valid-html401" + ALT="Valid HTML 4.01!" HEIGHT="31" WIDTH="88"> + </A> + <A HREF="http://cr.yp.to/djbdns.html"><IMG BORDER="0" WIDTH="88" + HEIGHT="31" SRC="djbdns.jpg" ALT="Powered by djbdns!"></A> + <IMG BORDER="0" WIDTH="88" HEIGHT="30" SRC="binclogo.gif" + ALT="Powered by Binc IMAP"> + </TD> + </TR> +</TABLE> + +</DIV> +</TD> +</TR> +</TABLE> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> + +</BODY> +</HTML> diff --git a/doc/bincimap-tech.html b/doc/bincimap-tech.html @@ -0,0 +1,503 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<HTML> + +<HEAD> + <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> + <META HTTP-EQUIV="Content-Language" CONTENT="en"> + + <TITLE>Binc IMAP - Technical Documentation</TITLE> + <META NAME="revisit-after" CONTENT="14 days"> + <META NAME="keywords" CONTENT="Binc IMAP technical documentation checkpassword daemontools tcpserver xinetd Maildir qmail"> + <META NAME="description" CONTENT="Andreas Aardal Hanssen"> + <META NAME="copyright" CONTENT="Copyright Andreas Aardal Hanssen 2002, 2003"> + <META NAME="distribution" CONTENT="global"> + <META NAME="author" CONTENT="Andreas Aardal Hanssen"> + <LINK REL="stylesheet" HREF="bincimap.css" TYPE="text/css"> + <LINK REL="icon" HREF="/favicon.ico" TYPE="image/ico"> + <LINK REL="shortcut icon" HREF="/favicon.ico"> + +</HEAD> + +<BODY BGCOLOR="#000000"> + +<TABLE WIDTH="95%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> +<TR> +<TD BGCOLOR="#004444"> + +<TABLE WIDTH="99%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> + <TR> + <TD CLASS="headtext" BGCOLOR="#226666" ALIGN="LEFT"> + <TABLE> + <TR> + <TD ALIGN="center" VALIGN="middle"><IMG ALT="Binc IMAP logo" SRC="b-button64.png" BORDER="0"></TD> + <TD ALIGN="center" VALIGN="middle">Binc IMAP - Technical Documentation</TD> + </TR> + </TABLE> + </TD> + <TD CLASS="bodytext" BGCOLOR="#226666" ALIGN="RIGHT"> + <A HREF="http://www.gnu.org/licenses/gpl.html">GNU General Public License</A><BR> + Andreas Aardal Hanssen &lt;andreas@hanssen.name&gt; + </TD> + </TR> + <TR> + <TD CLASS="bodytext" BGCOLOR="#FFFFFF" COLSPAN="2"></TD> + </TR> +</TABLE> + +<DIV CLASS="bodytext"> + +<P><U><B>Binc in my home area, IMAPdir and cousins</B></U></P> + +<BLOCKQUOTE> + +<P>Binc IMAP uses either <A +HREF="http://www.inter7.com/courierimap/README.maildirquota.html">Maildir++</A> +or a structure called <A HREF="bincimap-imapdir.html">IMAPdir</A> to +store its set of mailboxes. <A +HREF="bincimap-imapdir.html">IMAPdir</A> is more or less similar to <A +HREF="http://www.inter7.com/courierimap/README.maildirquota.html">Maildir++</A>, +but it provides more flexibility with regards to mailbox names and +hierarchy structure.</P> + +<P>In a sense, <A HREF="bincimap-imapdir.html">IMAPdir</A> takes all +the goods from <A +HREF="http://cr.yp.to/proto/maildir.html">Maildir</A> and adds root +level mailboxes, submailboxes both of regular root level mailboxes and +of the special mailbox INBOX, mail in mailboxes of any level, and with +no restrictions.</P> + +<P>In the root of the <A HREF="bincimap-imapdir.html">IMAPdir</A> +structure, Binc IMAP stores the list of a user's subscribed folders in +a file called +<B>bincimap-subscribed</B>. This file should only be edited manually +if you are confident with <B>Binc::Storage</B>. Normally the +administrator and the IMAP user will leave this to Binc IMAP.</P> + +<P>Binc IMAP's <A +HREF="http://cr.yp.to/proto/maildir.html">Maildir</A> backend +(default) will temporarily create a lock file called +<B>bincimap-scan-lock</B> inside a <A +HREF="http://cr.yp.to/proto/maildir.html">Maildir</A> when it is +scanning for mailbox changes and delegating unique message +identifiers. This is to ensure that UIDs are delegated exactly once to +every message that has been detected by any one Binc IMAP server +instance.</P> + +<P>Inside each <A +HREF="http://cr.yp.to/proto/maildir.html">Maildir</A>, Binc IMAP +stores two files that allow multiple instances of the server to +communicate the state and changes of the mailbox: +<B>bincimap-uidvalidity</B> and +<B>bincimap-cache</B>. These files are safe to delete, although that +will trigger UIDVALIDITY to bounce and clients may have to +resynchronize their local state.</P> + +</BLOCKQUOTE> + +<P><U><B>Object Oriented Design: Brokers, Depots, Operators.</B></U></P> + +<BLOCKQUOTE> + +<TABLE WIDTH="100%"> + <TR> + <TD VALIGN="TOP"> + <P>Binc IMAP's design is <I>simple</I> and <I>modular</I>. This + makes it <I>easy</I> to maintain and extend.</P> + + <P>Although the IMAP protocol is relatively complex, you will + find that Binc IMAP's solution is surprisingly easy to + grasp.</P> + + <P>At the heart of Binc IMAP's implementation lies the basic + functionality for Object Oriented Design provided by the ISO C++ + standard and general knowledge in the area of standard Design + Patterns.</P> + + <P>The main components are:</P> + + <UL> + <LI>The <A HREF="#Broker">Broker</A></LI> + <LI>The <A HREF="#BrokerFactory">BrokerFactory</A></LI> + <LI>The <A HREF="#Command">Command</A></LI> + <LI>The <A HREF="#Depot">Depot</A></LI> + <LI>The <A HREF="#DepotFactory">DepotFactory</A></LI> + <LI>The <A HREF="#Mailbox">Mailbox</A></LI> + <LI>The <A HREF="#Operator">Operator</A></LI> + <LI>The <A HREF="#Session">Session</A></LI> + <LI>The <A HREF="#IO">IO</A></LI> + </UL> + </TD> + <TD> + <IMG BORDER="0" SRC="bincimap-design-tiny.png" ALT="Binc IMAP, Object Oriented Design"> + </TD> + </TR> +</TABLE> + +<HR> +<A NAME="Broker"><B>Broker</B></A> + + <P>One <A HREF="#Broker">Broker</A> holds a set of <A + HREF="#Operator">Operators</A>. For each + <I>state</I> Binc IMAP is in, the <A + HREF="#BrokerFactory">BrokerFactory</A> delegates exactly one <A + HREF="#Broker">Broker</A> to hold the relevant <A + HREF="#Operator">Operator</A> objects.</P> + + <P>Typically, an <A HREF="#Operator">Operator</A> can be assigned to + more than one <A HREF="#Broker">Broker</A>. For example, the <A + HREF="#Operator">Operator</A> that serves the IMAP command "NOOP" (a + command that is available in all three IMAP <I>states</I>), + <B>NoopOperator</B>, is available in all <A + HREF="#Broker">Broker</A> objects.</P> + + <P>The <A HREF="#Broker">Broker</A> is responsible for first passing + the <A HREF="#Depot">Depot</A> and the <A HREF="#IO">IO</A> + singleton to the appropriate <A HREF="#Operator">Operator</A>, + generating a <A HREF="#Command">Command</A> object.</P> + + <P>The <A HREF="#Broker">Broker</A> is also responsible for passing + the resulting <A HREF="#Command">Command</A> object to the <A + HREF="#Operator">Operator</A> together with the <A + HREF="#Depot">Depot</A>, generating the <I>untagged responses</I> + that come as a result of the processing.</P> + + <BR> + <TABLE> + <TR> + <TD BGCOLOR="#555555"> + <PRE> +Broker *broker = BrokerFactory.getBroker(STATE_SELECTED); +if (broker != NULL) + throw CriticalException("no broker for selected state"); + +Command command; + +try { + broker.parse(com, command); + broker.process(depot, command); +} catch (... + </PRE> + </TD> + </TR> + </TABLE> + +<HR> +<A NAME="BrokerFactory"><B>BrokerFactory</B></A> + + <P>The <A HREF="#BrokerFactory">BrokerFactory</A> manages the <A + HREF="#Broker">Broker</A> objects.</P> + + <P>Given a <I>state</I>, the <A + HREF="#BrokerFactory">BrokerFactory</A> provides a <A + HREF="#Broker">Broker</A> that holds all the <A + HREF="#Operator">Operator</A> objects available to the client.</P> + + <P>This provides a modular and safe separation of the priviledges + available at the different <I>states</I> in the IMAP session.</P> + + <P>The <I>preauthenticate stub</I> has a <A + HREF="#BrokerFactory">BrokerFactory</A> that can only generate <A + HREF="#Broker">Broker</A> objects for the <I>non-authenticated</I> + state.</P> + +<HR> +<A NAME="Command"><B>Command</B></A> + + <P>A <A HREF="#Command">Command</A> object holds all information + that was passed to the <A HREF="#Operator">Operator</A> that served + a specific IMAP command.</P> + + <P><A HREF="#Command">Command</A> objects are named. Examples of + such names are "CHECK", "SUBSCRIBE" and "LOGOUT".</P> + + <P>For the name "FETCH", the <A HREF="#Command">Command</A> object + is decorated with + <I>sequence set</I>, optionally a <I>section</I> and so on. The + <B>parse()</B> method in each <A HREF="#Operator">Operator</A> is + responsible for decorating the <A HREF="#Command">Command</A> + object.</P> + + <P>The <A HREF="#Command">Command</A> object is + <I>short-lived</I>. It is created, decorated, passed on to the <A + HREF="#Operator">Operator</A>, then discarded.</P> + +<HR> +<A NAME="Depot"><B>Depot</B></A> + + <P>A <A HREF="#Depot">Depot</A> is responsible for handling the + different <A HREF="#Mailbox">Mailbox</A> objects, and it is the + mailbox structure authority.</P> + + <P>Given an IMAP mailbox path as input, a <A HREF="#Depot">Depot</A> + can give the caller a corresponding <A HREF="#Mailbox">Mailbox</A> + object if it finds one that successfully identifies the type of <A + HREF="#Mailbox">Mailbox</A>. + + <P>The <A HREF="#Depot">Depot</A> is also aware of what the + <I>default</I> <A HREF="#Mailbox">Mailbox</A> type object is. This + <A HREF="#Mailbox">Mailbox</A> object is used when creating new IMAP + mailboxes.</P> + + <P>Finally, the <A HREF="#Depot">Depot</A> is used to translate + mailbox names to a representation on the file system and back. There + are currently two specializations of the <A HREF="#Depot">Depot</A> + object available: one for <A + HREF="http://www.inter7.com/courierimap/README.maildirquota.html">Maildir++</A> + and one for <A HREF="bincimap-imapdir.html">IMAPdir</A>. Each has + its own characteristics in how do translate the mailbox hierarchy to + the file system.</P> + + <TABLE> + <TR> + <TD BGCOLOR="#555555"> + <PRE> +Mailbox *mailbox = depot.getDefaultMailbox(); +if (mailbox == NULL) + throw CriticalException("no default mailbox provided"); + +try { + mailbox->imapCreate("work/2003/07/todo"); +} catch (... + </PRE> + </TD> + </TR> + </TABLE> + +<HR> +<A NAME="DepotFactory"><B>DepotFactory</B></A> + + <P>The <A NAME="DepotFactory">DepotFactory</A> manages the <A + HREF="#Depot">Depot</A> objects.</P> + + <P>New <A HREF="#Depot">Depot</A> objects are assigned to the <A + NAME="DepotFactory">DepotFactory</A> in runtime. This makes it easy + to add new <A HREF="#Depot">Depot</A> objects using loadable + modules. The <A HREF="#Depot">Depot</A> objects are registered and + accessed via their <I>names</I>, such as "<A + HREF="http://www.inter7.com/courierimap/README.maildirquota.html">Maildir++</A>" + or "<A HREF="bincimap-imapdir.html">IMAPdir</A>".</P> + + <P>The <A NAME="DepotFactory">DepotFactory</A> gives individual + users of Binc IMAP the option to choose the <A + HREF="#Depot">Depot</A> object that suits their needs the best.</P> + +<HR> +<A NAME="IO"><B>IO</B></A> + + <P>The <A HREF="#IO">IO</A> is a <I>global</I>. It consists of two instances - + <U>com</U> and <U>logger</U>.</P> + + <P><U>com</U> reads and writes characters to and from the client, + and hides the optional SSL encryption.</P> + + <P><U>logger</U> writes characters to Binc IMAP's log files. It + hides the method used to log data. Currently it supports logging to + stderr and syslog.</P> + +<HR> +<A NAME="Mailbox"><B>Mailbox</B></A> + + <P>The <A HREF="#Mailbox">Mailbox</A> is an abstract for Binc IMAP's different + <I>backends</I>. Bundled with Binc is a backend for <A + HREF="http://cr.yp.to/proto/maildir.html">Maildir</A>. The class + Maildir <I>inherits</I> <A HREF="#Mailbox">Mailbox</A>.</P> + + <P>In short, a <A HREF="#Mailbox">Mailbox</A> contains all methods needed for Binc + IMAP to serve a specific backend. It also holds a method to identify + a <A HREF="#Mailbox">Mailbox</A> of its own kind.</P> + + <P>All registered <A HREF="#Mailbox">Mailbox</A> objects are held by the + <A HREF="#Depot">Depot</A>.</P> + + <BR> + <TABLE> + <TR> + <TD BGCOLOR="#555555"> + <PRE> +Mailbox *mailbox = depot.getSelectedMailbox(); +if (mailbox == NULL) + throw CriticalException("no selected mailbox in selected state"); + +mailbox->imapExpunge(); +mailbox->imapClose(); + </PRE> + </TD> + </TR> + </TABLE> + +<HR> +<A NAME="Operator"><B>Operator</B></A> + + <P>An <A HREF="#Operator">Operator</A> is associated with an IMAP command such as + "SEARCH" or "AUTHENTICATE". In short, the <A HREF="#Operator">Operator</A> is used to + perform an arbitrary operation on a <A HREF="#Mailbox">Mailbox</A>.<P> + + <P>Typically, an <A HREF="#Operator">Operator</A> can be assigned to one or more + <A HREF="#Broker">Broker</A> objects. + + <P>Operators contain, among others, the two public methods: + <B>parse()</B> and <B>process()</B>.</P> + + <P>When given the <B>IO singleton</B> as input, the <B>parse()</B> + method generates a <A HREF="#Command">Command</A> object. This object can then be + fed to <B>process()</B> together with a <A HREF="#Depot">Depot</A>.</P> + + <P>When processing its command, an <A HREF="#Operator">Operator</A> is allowed to + generate <I>untagged responses</I> and it can also update the + <I>state</I> of a <A HREF="#Mailbox">Mailbox</A>, the <A HREF="#Depot">Depot</A> or the + <A HREF="#Session">Session</A> singleton.</P> + + <P><A HREF="#Operator">Operator</A> objects are assigned + <I>dynamically</I> to each <A HREF="#Broker">Broker</A>, making it + very easy to write + <I>extensions</I> that add or replace existing <A + HREF="#Operator">Operator</A> objects using Binc IMAP's <I>loadable + module support.</I></P> + +<HR> +<A NAME="Session"><B>Session</B></A> + + <P>The <A HREF="#Session">Session</A> is a <I>singleton</I> object that holds + information that is relevant to the current IMAP session.</P> + + <P>Currently, the <A HREF="#Session">Session</A> contains information about:</P> + + <UL> + <LI>Global configuration (administrator settings)</LI> + <LI>Local configuration (user settings)</LI> + <LI>Command line arguments</LI> + <LI>Folder subscription list</LI> + </UL> + +<HR> + +<P>Last updated on <B>2003-03-20</B>.</P> + +<P>Please direct comments on this document to the <A +HREF="/#mailinglist">Binc IMAP mailing list</A>. Remember to <I>search +the archives</I> first.</P> + +</BLOCKQUOTE> + +<TABLE WIDTH="99%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> + <TR> + <TD CLASS="bodytext" BGCOLOR="#FFFFFF"></TD> + </TR> + <TR> + <TD CLASS="headtext" BGCOLOR="#226666"> + <A HREF="http://validator.w3.org/check/referer"> + <IMG BORDER="0" SRC="http://www.w3.org/Icons/valid-html401" + ALT="Valid HTML 4.01!" HEIGHT="31" WIDTH="88"> + </A> + <A HREF="http://cr.yp.to/djbdns.html"><IMG BORDER="0" WIDTH="88" + HEIGHT="31" SRC="djbdns.jpg" ALT="Powered by djbdns!"></A> + <IMG BORDER="0" WIDTH="88" HEIGHT="30" SRC="binclogo.gif" + ALT="Powered by Binc IMAP"> + </TD> + </TR> +</TABLE> + +</DIV> +</TD> +</TR> +</TABLE> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> + +</BODY> +</HTML> +style with only LF. The MaildirMessage is an + implementation of Message used in Maildir. When using a Maildir + mailbox, Mailbox::iterator will return a reference to a + MaildirMessage. MaildirMessage also uses a MaildirMessageCache + singleton to handle cacheing of messages.</P> + + <P>Although the inside of MaildirMessage both deals with files, + cacheing and MIME, the Operator needs not think about this.</P> + +</BLOCKQUOTE> + +<HR> +<A NAME="Operator"><B>Operator</B></A> +<BLOCKQUOTE> + + <P>An <A HREF="#Operator">Operator</A> is associated with an IMAP command such as + "SEARCH" or "AUTHENTICATE". In short, the <A HREF="#Operator">Operator</A> is used to + perform an arbitrary operation on a <A HREF="#Mailbox">Mailbox</A>.<P> + + <P>Typically, an <A HREF="#Operator">Operator</A> can be assigned to one or more + <A HREF="#Broker">Broker</A> objects. + + <P>Operators contain, among others, the two public methods: + <B>parse()</B> and <B>process()</B>.</P> + + <P>The <B>parse()</B> method decorates a <A + HREF="#Request">Request</A> object. This object can then be fed to + <B>process()</B> together with a <A HREF="#Depot">Depot</A>.</P> + + <P>When processing its request, an <A HREF="#Operator">Operator</A> + is allowed to generate <I>untagged responses</I> and it can also + update the <I>state</I> of a <A HREF="#Mailbox">Mailbox</A>, the <A + HREF="#Depot">Depot</A> or the <A HREF="#Session">Session</A> + singleton.</P> + + <P><A HREF="#Operator">Operator</A> objects are assigned + <I>dynamically</I> to each <A HREF="#Broker">Broker</A>, making it + very easy to write <I>extensions</I> that add or replace existing <A + HREF="#Operator">Operator</A> objects using Binc IMAP's <I>loadable + module support.</I></P> +</BLOCKQUOTE> + +<HR> +<A NAME="Session"><B>Session</B></A> +<BLOCKQUOTE> + <P>The <A HREF="#Session">Session</A> is a <I>singleton</I> object that holds + information that is relevant to the current IMAP session.</P> + + <P>Currently, the <A HREF="#Session">Session</A> contains information about:</P> + + <UL> + <LI>Global configuration (administrator settings)</LI> + <LI>Local configuration (user settings)</LI> + <LI>Command line arguments</LI> + <LI>Folder subscription list</LI> + </UL> +</BLOCKQUOTE> + +<HR> + +<P>Last updated on <B>2003-07-31</B>.</P> + +<P>Please direct comments on this document to the <A +HREF="/#mailinglist">Binc IMAP mailing list</A>. Remember to <I>search +the archives</I> first.</P> + +</BLOCKQUOTE> + +<TABLE WIDTH="99%" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="4"> + <TR> + <TD CLASS="bodytext" BGCOLOR="#FFFFFF"></TD> + </TR> + <TR> + <TD CLASS="headtext" BGCOLOR="#226666"> + <A HREF="http://validator.w3.org/check/referer"> + <IMG BORDER="0" SRC="http://www.w3.org/Icons/valid-html401" + ALT="Valid HTML 4.01!" HEIGHT="31" WIDTH="88"> + </A> + <A HREF="http://cr.yp.to/djbdns.html"><IMG BORDER="0" WIDTH="88" + HEIGHT="31" SRC="djbdns.jpg" ALT="Powered by djbdns!"></A> + <IMG BORDER="0" WIDTH="88" HEIGHT="30" SRC="binclogo.gif" + ALT="Powered by Binc IMAP"> + </TD> + </TR> +</TABLE> + +</DIV> +</TD> +</TR> +</TABLE> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> + +</BODY> +</HTML> diff --git a/doc/bincimap.css b/doc/bincimap.css @@ -0,0 +1,8 @@ +a:link { color: #fff; font-size: 12pt; font-family: Arial, Helvetica, Verdana; text-decoration: underline } +a:active { color: #fff; font-size: 12pt; font-family: Arial, Helvetica, Verdana; text-decoration: underline } +a { color: #fff; font-size: 12pt; font-family: Arial, Helvetica, Verdana; text-decoration: underline } +a:vlink { color: #fff; font-size: 12pt; font-family: Arial, Helvetica, Verdana; text-decoration: underline } +body { color: #fff; font-size: 12pt; font-family: Arial, Helvetica, Verdana } +.bodytext { color: #fff; font-size: 12pt; font-family: Arial, Helvetica, Verdana } +.headtext { color: #fff; font-size: 20pt; font-family: Arial, Helvetica, Verdana } + diff --git a/doc/manual/Makefile.am b/doc/manual/Makefile.am @@ -0,0 +1,36 @@ +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +#-------------------------------------------------------------------------- +EXTRA_DIST = bincimap-manual.dvi bincimap-manual.ps bincimap-manual.tex + +#-------------------------------------------------------------------------- +ps: dvi + dvips bincimap-manual.dvi -o bincimap-manual.ps + +#-------------------------------------------------------------------------- +dvi: bincimap-manual.dvi + +#-------------------------------------------------------------------------- +bincimap-manual.dvi: bincimap-manual.tex + latex bincimap-manual.tex + latex bincimap-manual.tex + +#-------------------------------------------------------------------------- +install-exec-hook: + $(mkinstalldirs) $(DESTDIR)$(prefix)/doc + $(INSTALL_DATA) $(srcdir)/bincimap-manual.ps $(DESTDIR)$(prefix)/doc + $(INSTALL_DATA) $(srcdir)/bincimap-manual.dvi $(DESTDIR)$(prefix)/doc + +#-------------------------------------------------------------------------- +uninstall-hook: + rm -v $(DESTDIR)$(prefix)/doc/bincimap-manual.ps + rm -v $(DESTDIR)$(prefix)/doc/bincimap-manual.dvi + diff --git a/doc/manual/bincimap-manual.dvi b/doc/manual/bincimap-manual.dvi Binary files differ. diff --git a/doc/manual/bincimap-manual.ps b/doc/manual/bincimap-manual.ps @@ -0,0 +1,2431 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software +%%Title: bincimap-manual.dvi +%%Pages: 20 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips bincimap-manual.dvi -o bincimap-manual.ps +%DVIPSParameters: dpi=600, compressed +%DVIPSSource: TeX output 2003.05.25:1952 +%%BeginProcSet: texc.pro +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 +1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx +0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx +sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ +rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp +gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B +/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ +/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ +A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy +get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} +ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp +fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 +{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add +chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ +1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} +forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ +/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) +(LaserWriter 16/600)]{A length product length le{A length product exch 0 +exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse +end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask +grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} +imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round +exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto +fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p +delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} +B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ +p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S +rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +%%BeginProcSet: special.pro +%! +TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N +/vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N +/rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N +/@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ +/hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho +X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B +/@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ +/urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known +{userdict/md get type/dicttype eq{userdict begin md length 10 add md +maxlength ge{/md md dup length 20 add dict copy def}if end md begin +/letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S +atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ +itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll +transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll +curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf +pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} +if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 +-1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 +get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip +yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub +neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ +noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop +90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get +neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr +1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr +2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 +-1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S +TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ +Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale +}if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState +save N userdict maxlength dict begin/magscale true def normalscale +currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts +/psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x +psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx +psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub +TR/showpage{}N/erasepage{}N/copypage{}N/p 3 def @MacSetUp}N/doclip{ +psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 +roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath +moveto}N/endTexFig{end psf$SavedState restore}N/@beginspecial{SDict +begin/SpecialSave save N gsave normalscale currentpoint TR +@SpecialDefaults count/ocount X/dcount countdictstack N}N/@setspecial{ +CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto +closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx +sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR +}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse +CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury +lineto closepath clip}if/showpage{}N/erasepage{}N/copypage{}N newpath}N +/@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{end} +repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N +/@fedspecial{end}B/li{lineto}B/rl{rlineto}B/rc{rcurveto}B/np{/SaveX +currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY +moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X +/yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0 +1 startangle endangle arc savematrix setmatrix}N end + +%%EndProcSet +%%BeginProcSet: color.pro +%! +TeXDict begin/setcmykcolor where{pop}{/setcmykcolor{dup 10 eq{pop +setrgbcolor}{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll +}repeat setrgbcolor pop}ifelse}B}ifelse/TeXcolorcmyk{setcmykcolor}def +/TeXcolorrgb{setrgbcolor}def/TeXcolorgrey{setgray}def/TeXcolorgray{ +setgray}def/TeXcolorhsb{sethsbcolor}def/currentcmykcolor where{pop}{ +/currentcmykcolor{currentrgbcolor 10}B}ifelse/DC{exch dup userdict exch +known{pop pop}{X}ifelse}B/GreenYellow{0.15 0 0.69 0 setcmykcolor}DC +/Yellow{0 0 1 0 setcmykcolor}DC/Goldenrod{0 0.10 0.84 0 setcmykcolor}DC +/Dandelion{0 0.29 0.84 0 setcmykcolor}DC/Apricot{0 0.32 0.52 0 +setcmykcolor}DC/Peach{0 0.50 0.70 0 setcmykcolor}DC/Melon{0 0.46 0.50 0 +setcmykcolor}DC/YellowOrange{0 0.42 1 0 setcmykcolor}DC/Orange{0 0.61 +0.87 0 setcmykcolor}DC/BurntOrange{0 0.51 1 0 setcmykcolor}DC +/Bittersweet{0 0.75 1 0.24 setcmykcolor}DC/RedOrange{0 0.77 0.87 0 +setcmykcolor}DC/Mahogany{0 0.85 0.87 0.35 setcmykcolor}DC/Maroon{0 0.87 +0.68 0.32 setcmykcolor}DC/BrickRed{0 0.89 0.94 0.28 setcmykcolor}DC/Red{ +0 1 1 0 setcmykcolor}DC/OrangeRed{0 1 0.50 0 setcmykcolor}DC/RubineRed{ +0 1 0.13 0 setcmykcolor}DC/WildStrawberry{0 0.96 0.39 0 setcmykcolor}DC +/Salmon{0 0.53 0.38 0 setcmykcolor}DC/CarnationPink{0 0.63 0 0 +setcmykcolor}DC/Magenta{0 1 0 0 setcmykcolor}DC/VioletRed{0 0.81 0 0 +setcmykcolor}DC/Rhodamine{0 0.82 0 0 setcmykcolor}DC/Mulberry{0.34 0.90 +0 0.02 setcmykcolor}DC/RedViolet{0.07 0.90 0 0.34 setcmykcolor}DC +/Fuchsia{0.47 0.91 0 0.08 setcmykcolor}DC/Lavender{0 0.48 0 0 +setcmykcolor}DC/Thistle{0.12 0.59 0 0 setcmykcolor}DC/Orchid{0.32 0.64 0 +0 setcmykcolor}DC/DarkOrchid{0.40 0.80 0.20 0 setcmykcolor}DC/Purple{ +0.45 0.86 0 0 setcmykcolor}DC/Plum{0.50 1 0 0 setcmykcolor}DC/Violet{ +0.79 0.88 0 0 setcmykcolor}DC/RoyalPurple{0.75 0.90 0 0 setcmykcolor}DC +/BlueViolet{0.86 0.91 0 0.04 setcmykcolor}DC/Periwinkle{0.57 0.55 0 0 +setcmykcolor}DC/CadetBlue{0.62 0.57 0.23 0 setcmykcolor}DC +/CornflowerBlue{0.65 0.13 0 0 setcmykcolor}DC/MidnightBlue{0.98 0.13 0 +0.43 setcmykcolor}DC/NavyBlue{0.94 0.54 0 0 setcmykcolor}DC/RoyalBlue{1 +0.50 0 0 setcmykcolor}DC/Blue{1 1 0 0 setcmykcolor}DC/Cerulean{0.94 0.11 +0 0 setcmykcolor}DC/Cyan{1 0 0 0 setcmykcolor}DC/ProcessBlue{0.96 0 0 0 +setcmykcolor}DC/SkyBlue{0.62 0 0.12 0 setcmykcolor}DC/Turquoise{0.85 0 +0.20 0 setcmykcolor}DC/TealBlue{0.86 0 0.34 0.02 setcmykcolor}DC +/Aquamarine{0.82 0 0.30 0 setcmykcolor}DC/BlueGreen{0.85 0 0.33 0 +setcmykcolor}DC/Emerald{1 0 0.50 0 setcmykcolor}DC/JungleGreen{0.99 0 +0.52 0 setcmykcolor}DC/SeaGreen{0.69 0 0.50 0 setcmykcolor}DC/Green{1 0 +1 0 setcmykcolor}DC/ForestGreen{0.91 0 0.88 0.12 setcmykcolor}DC +/PineGreen{0.92 0 0.59 0.25 setcmykcolor}DC/LimeGreen{0.50 0 1 0 +setcmykcolor}DC/YellowGreen{0.44 0 0.74 0 setcmykcolor}DC/SpringGreen{ +0.26 0 0.76 0 setcmykcolor}DC/OliveGreen{0.64 0 0.95 0.40 setcmykcolor} +DC/RawSienna{0 0.72 1 0.45 setcmykcolor}DC/Sepia{0 0.83 1 0.70 +setcmykcolor}DC/Brown{0 0.81 1 0.60 setcmykcolor}DC/Tan{0.14 0.42 0.56 0 +setcmykcolor}DC/Gray{0 0 0 0.50 setcmykcolor}DC/Black{0 0 0 1 +setcmykcolor}DC/White{0 0 0 0 setcmykcolor}DC end + +%%EndProcSet +TeXDict begin 39158280 55380996 1000 600 600 (bincimap-manual.dvi) +@start +%DVIPSBitmapFont: Fa ecst1095 10.95 10 +/Fa 10 81 df<120FEA3FC0127F13E012FFA313C0127F1380EA1E000B0B6D8A2F>46 +D<153F4B7E8215FFA25CA215F7140315E7A2140715C7140FA21587141FA2EC3F0782143E +147EA214FCA3EB01F8A2EB03F0A3EB07E0A3EB0FC0A249B57EA35BA25B90387E0003A25B +A212015BA2485AA2D87FFEEB3FFFB5491380A46C486D130029397DB82F>65 +D<017FB512F090B612FC16FF178017C07F903A07E0003FE0160FEE07F0A21603130F5CA4 +EE07E0131F4A130F17C0EE1F80167FEEFF00013FEB07FE91B55A16F016C016F016FC4980 +90387E0001ED007FEE3F80A2161F01FE15C049140FA50001ED1F805BA2EE3F005E16FE00 +03140149495AED1FF8007FB65AB75A5E5E4BC7FC6C14F02C387DB72F>I<913903FC01C0 +91391FFF03E0027F13C749B512E74914FF5B90380FFE0790261FF80113C090383FE00049 +48137F49C7FC4848143F5B000316805B485A5B120F5B001FED1F0049141E003F92C7FC90 +CAFCA35A127EA412FE5AA716F06C4A7EA2007E14035E127F15076C5D6D130F6D495A001F +143F6D495A270FF801FFC7FC3907FE07FE6CB55A5DC65C6D13C0011F90C8FCEB07F82B3A +78B82F>I<013FB7FC49168090B8FCA27FA2D903F0C7EA3F00A45F13074A143E173C94C7 +FCA3130F5CA2ED01E015034B7E131F02805B91B5FCA45B5EEC000FA4496D5A017E90C9FC +A513FE5BA512015BA2387FFFF0B5FC80A25C6C5B31387DB72F>70 +D<017FB512FE90B7FCA316FE7F9039000FC000A5141F5DA5143F92C7FCA55C147EA514FE +5CA513015CA513035CA513075CA2007FB512FCB67EA46C5C283878B72F>73 +D<D97FF0EC7FE06EEB01FF01FF16F04C13E080017F4A13C0D90FBCEC7C00160FA2161E17 +FCD91FBE133E023EEB3CF8167C1678021E13F816F190383F1F01013E5DED03E1A2ED07C1 +16C3D97E0F1383017C010F5BED8F03159F159EEDBE0701FC13BCD9F8075C15F8A215F016 +0F0001EB03E09026F001C05B91C7FCA3161F12034992C7FCA45E120749143EA2D87FF890 +3803FFC0486C497FA46C486D5B34387EB72F>77 D<D97FF890383FFF80496C5B18C08018 +80017F6E1300D907DEEB03E0A314DF1607EB0FCF028F5CA21580A2160F131F02075C15C0 +A3161F133FD93E0391C7FC15E0A35EEB7E01017C143E15F0A3167EEBFC0049EBF87CA4ED +78FC1201495C157CA2153C153D1203495CA2D87FFE133FB5131FA35E6C486D5A32387DB7 +2F>I<91B51280010714F0011F14F84914FC4914FE90B6FC48EBC0079039FE0001FF4848 +7F49147F5B120749143FA34848147F167EA3485AA548C812FCA6007EEC01F8A600FEEC03 +F05AA3150716E0A3150F16C0151FA26CEC3F80157F6CECFF00EBC00790B55A7E5D6C14F0 +000F5C000149C7FC283A78B82F>I<013FB512F04914FE82178017C06D15E0903A03F000 +7FF0161FEE07F81603A20107EC01FC5CA21600A3010FEC01F85CA2160317F01607011FEC +0FE04A131FEE3FC0EEFF800303130091B55A495C5E16E0168003FCC7FC91C9FC5B137EA5 +13FE5BA512015BA2387FFFC0A2B57EA26C5BA22E387DB72F>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fb ectt1440 14.4 17 +/Fb 17 117 df<EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F800D0D688C3D +>46 D<EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F80C7FCB3A7EA0F80EA3F +E0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F800D3368B23D>58 D<007FB612C0B712F816 +FE707E83836C82D801FCC76C7EEE0FFC1607707E707E82831880173FA7177F18005F5F16 +014C5A1607EE1FF8EE7FF092380FFFE090B75A94C7FC16FC16FF17C0838301FCC7EA0FFC +1607EE01FE707EEF7F80173F18C0171FA3EF0FE0A7171F18C0A2173F177FEFFF805E4C13 +00160FEE3FFE007FB75AB85A5F5F17804CC7FC6C15F033497CC83D>66 +D<DAFFE013F0010701FC13F8011FEBFF81017F14E148B612F14815FB4815FF48EB803F90 +38FC0007D81FF0130148487F49143F485A161F90C8120F5A481507A31603A37E6CED01F0 +93C7FC7F6C7E7F6C7E13FC6CB4FC6C13F06C13FF6C14F86C6CEBFF806D14E0010F14F801 +0114FED9001F7F02011480DA001F13C0030113E09238003FF0EE1FF81607EE03FCA2EE01 +FE1600A217FF007C167F12FEA57E17FF17FE7F16016DEC03FC6D140701F8EC0FF86D141F +D9FF80EB7FF09139F801FFE091B612C0481680486C1500011F5C010714F848C614E00078 +010F90C7FC304B7AC93D>83 D<90380FFFC090B512F8000314FE486E7E4881824881D9F8 +007F49EB1FFC15076F7E6C4813016C486D7EC97E83163FA6ED7FFF021FB5FC49B6FC130F +133F90B7FC0003ECFC3F48EBFC004813C04848C7FCEA3FF05BEA7F8090C8FC5A5AA56C15 +7F7E6D14FF6D1303D83FF0010F13E001FE90B612F06CB812F87E6C15CF6C15076CECFC03 +6C6C9039E0007FF0D90FFEC9FC353679B43D>97 D<EA7FFEB5FCA57EC67EAEED1FF0EDFF +FC020313FF020F14C0023F804A8091B67E9238C07FFC9238000FFE02FC13074AEB01FF4A +7F4A15804A147F4AEC3FC0A2EF1FE091C8FC170FA218F0A21707A9170FA218E080171F18 +C06E143FA26EEC7F8017FF6E4913006E5B6E495A6EEB1FFC9139FFC0FFF892B5FC6E14E0 +6E5C020F5C6D6C49C7FCD91E0113F890C7EA3FE0344A7DC83D>I<91380FFFC091B512FC +010314FF491580011F15C05B4915E09039FFF8007F4801C0133F4890C7FC485A49EC1FC0 +4848EC0F80484891C7FC5B485AA25B127F90CAFCA35A5AA97E7EA27FA26C7E6DEC01F000 +1FED03F87F6C6C14076D15F06CB4140F6C6DEB1FE002F0137F6C9039FE01FFC06C90B612 +80013F15006D5C6D5C010314F0010014C0DA1FFCC7FC2D3677B43D>I<EC1FF891B57E01 +0314E0010F14F84980498049809026FFF80F138048D9C00113C04890C7EA7FE0D807FC14 +1F4848EC0FF05B4848EC07F81603485A4915FC1601127F90C8FC17FE4815005AB8FCA617 +FC48CAFC7E7EA37F123F7F6C6C157C17FE6C7E7F6C6C14016CB4EC03FC6E13076C01F0EB +1FF86C01FEEBFFF06DB612E06D15C0010F15806D1500010114FC6D6C13E0020790C7FC2F +3679B43D>101 D<EEFF80030F13F0033F13F892B512FC4A14FE5C5C91380FFE03EC1FF8 +9238E001FC91393FC000F84B1300147F92C8FCAA003FB712F04816F8B8FCA46C16F0C76C +C8FCB3B3001FB612FC4881A56C5D2F4A7CC93D>I<DA1FF0EB3FE0913AFFFE01FFF80103 +D9FF8713FC4902DF13FE4991B5FC5B5B90267FF01FEBE0FC903BFFC007FE0078DA000114 +0048486D7EA248486E7E49143F000782A249141FA66D143FA200035E6D147F6C6C4AC7FC +A26C6C495AECC00790397FF01FFC90B65A485D5E5ED803FB5C01F049C8FCEC1FF091CAFC +A37F12017F3800FE4090B612F86DECFF8090B712F04816FC4816FF481780D80FFCC7000F +13C0D81FF0020013E0D83FC0151F49ED0FF048C91207EF03F8007E160100FE17FC5A1700 +A56C1601007E17F8007F16036D15076C6CED0FF0D81FF0ED3FE001FC15FF6CB46C010713 +C06C01F8017F13806C90B71200C616FC6D5D011F15E001071580010002FCC7FC020F13C0 +37517DB33D>I<143C147E14FF497FA46D90C8FC147E143C91C9FCAD001FB5FC48805AA3 +7E7EC7123FB3B3003FB612FE4881B81280A36C16006C5D294A76C93D>105 +D<DA1FC013FE3C7FE0FFF007FF80D8FFF16D487F01F7D9FC3F7F90B55B6FB57EA26C01E0 +B5EA07F800039039807FFC039139003FF8014902F07F4914E0031F1300A2495CA3495CB3 +AA3D7FFF81FFFC0FFFE0B500C36D4813F002C75CA302C3806C0181496C13E03C3480B33D +>109 D<ED3FE03A7FFE01FFFCB500077F021F6D7E5C4A8091B67E6CECC07F3B007FFE00 +1FF04A130F4A13074A805C4A1303A25CA391C7FCB3A9007FB548B512F8B6008314FC1587 +A315836C020114F836347DB33D>I<EC1FE0ECFFFC0107EBFF804980013F14F0498090B6 +7E489038E01FFE4890388007FF9038FE000148486D13804848EC7FC049143F4848EC1FE0 +49140F003F16F0491407A248C8EA03F8A400FEED01FCAA6C15036C16F8A26D1407A2003F +16F06D140F6D141F001F16E06D143F6C6CEC7FC06C6CECFF806D5B2703FF800713006C90 +38F03FFE6C90B55A6D5C6D5C010F14C06D5C010149C7FC9038001FE02E3679B43D>I<ED +1FF0D87FFEEBFFFCB5000313FF020F14C0023F804A8091B67E6C9138C07FFCC66C903800 +0FFE02FC13074AEB01FF4A7F4A15804A147F4AEC3FC0A2EF1FE091C8FC170FA218F0A217 +07A9170FA218E080171F18C06E143FA26EEC7F8017FF6E4913006E5B6E495A6EEB1FFC91 +39FFC0FFF892B5FC6E14E06E5C020F5C6E49C7FC020113F89138003FE092C9FCB3007FB5 +FCB67EA56C91C9FC344F7DB33D>I<EE1FF8267FFFE090B5FCB5D8F0071480031F14C05D +4B14E002F1B6FC6C01F3EBF03F260007F713809239FE001FC0DAFFF8EB0F804B90C7FC5D +5D5D92C9FC5CA25CA25CA45CB3A3007FB612E0B77E82A35E6C5D33347BB33D>114 +D<147814FC1301AD003FB712F84816FCB8FCA46C16F8260001FCC8FCB3A6173E177FA86E +14FFEE01FE6D6C130392388007FC91387FF01F92B512F86E14F017E06E1480020714006E +13FC9138007FC030437DC13D>116 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fc ecbx1200 12 32 +/Fc 32 122 df<ED0FFF4AB512C0020F14F0027F80903A01FFF803FC499038C000FE010F +EB00034948497E49485B5C495A4C138001FF6E13005CA3705AEE01F893C8FCA74BB51280 +B9FCA5C69038E00003B3B0007FD9FFC1B6FCA538467EC53E>28 D<EA07C0EA1FF0EA3FF8 +EA7FFCEAFFFEA7EA7FFCEA3FF8EA1FF0EA07C00F0F788E1F>46 D<17C0EE01E01603A217 +C01607A2EE0F80A217005EA2163EA2163C167CA25EA24B5AA25E1503A24B5AA25E150FA2 +4BC7FCA2151E153EA25DA2157815F8A24A5AA25D1403A24A5AA25D140FA24AC8FCA2143E +A2143C147CA25CA25C1301A2495AA25C1307A2495AA291C9FC5BA2133EA2133C137CA25B +A25B1201A2485AA2485AA25B120FA248CAFCA2121E123EA25AA2127812F8A25A12602B64 +7ACA38>I<EC03C01407141F147FEB03FF133FB6FCA413C3EA0003B3B3ADB712FCA52641 +77C038>49 D<ECFFE0010F13FE013F6D7E90B612E0000315F82607FC0313FE3A0FE0007F +FFD81F806D138048C7000F13C0488001C015E001F07F00FF6E13F07F17F881A46C5A6C5A +6C5AC9FC17F05DA217E05D17C04B13804B1300A2ED1FFC4B5A5E4B5A4B5A4A90C7FC4A5A +4A5AEC0FF04A5AEC3F804AC7127814FE495A494814F8D907E014F0495A495A49C8FC017C +140149140348B7FC4816E05A5A5A5A5AB8FC17C0A42D417BC038>I<ECFFF0010713FF01 +1F14C0017F14F049C66C7ED803F8EB3FFED807E06D7E81D80FF86D138013FE001F16C07F +A66C5A6C4815806C485BC814005D5E4B5A4B5A4B5A4A5B020F1380902607FFFEC7FC15F8 +15FF16C090C713F0ED3FFCED0FFEEEFF80816F13C017E0A26F13F0A217F8A3EA0FC0EA3F +F0487EA2487EA217F0A25D17E06C5A494913C05BD83F80491380D81FF0491300D80FFEEB +FFFE6CB612F800015D6C6C14C0011F49C7FC010113E02D427BC038>I<163FA25E5E5D5D +A25D5D5D5DA25D92B5FCEC01F7EC03E7140715C7EC0F87EC1F07143E147E147C14F8EB01 +F0EB03E0130714C0EB0F80EB1F00133E5BA25B485A485A485A120F5B48C7FC123E5A12FC +B91280A5C8000F90C7FCAC027FB61280A531417DC038>I<0007150301E0143F01FFEB07 +FF91B6FC5E5E5E5E5E16804BC7FC5D15E092C8FC01C0C9FCAAEC3FF001C1B5FC01C714C0 +01DF14F09039FFE03FFC9138000FFE01FC6D7E01F06D13804915C0497F6C4815E0C8FC6F +13F0A317F8A4EA0F80EA3FE0487E12FF7FA317F05B5D6C4815E05B007EC74813C0123E00 +3F4A1380D81FC0491300D80FF0495AD807FEEBFFFC6CB612F0C65D013F1480010F01FCC7 +FC010113C02D427BC038>I<4AB47E021F13F0027F13FC49B6FC01079038807F8090390F +FC001FD93FF014C04948137F4948EBFFE048495A5A1400485A120FA248486D13C0EE7F80 +EE1E00003F92C7FCA25B127FA2EC07FC91381FFF8000FF017F13E091B512F89039F9F01F +FC9039FBC007FE9039FF8003FF17804A6C13C05B6F13E0A24915F0A317F85BA4127FA512 +3FA217F07F121FA2000F4A13E0A26C6C15C06D4913806C018014006C6D485A6C9038E01F +FC6DB55A011F5C010714C0010191C7FC9038003FF02D427BC038>I<EE1F80A24C7EA24C +7EA34C7EA24B7FA34B7FA24B7FA34B7F169F031F80161F82033F80ED3E07037E80157C82 +03FC804B7E02018115F0820203814B137F0207815D173F020F814B7F021F8292C77EA24A +82023E80027E82027FB7FCA291B87EA2498302F0C8FCA20103834A157F0107834A153FA2 +49488284011F8491C97E4984133E017E82B6020FB612F0A54C457CC455>65 +D<B712F0A526003FFECAFCB3B1F00780A4180F1900A460A360A2187EA218FE1701170317 +07171F177FEE03FFB95AA539447CC343>76 D<B500FE067FB512806E95B6FCA26F5EA2D8 +003F50C7FC013D6DEE03DFA2013C6DEE079FA26E6CEE0F1FA26E6C161EA26E6C163CA36E +6C1678A26E6C16F0A26E6DEC01E0A26E6DEC03C0A36E6DEC0780A26F6CEC0F00A26F6C14 +1EA26F6C5CA36F6C5CA26F6C5CA26F6D485AA26F6D485AA26F6D485AA3706C48C7FCA293 +383FF81EA2706C5AA2706C5AA3706C5AA2705BA2705BA2705BA2B6057FB6128071C7FCA2 +173E171C61447CC36A>I<923807FFC092B512FE0207ECFFC0021F15F091267FFE0013FC +902601FFF0EB1FFF01070180010313C04990C76C7FD91FFC6E6C7E49486F7E49486F7E01 +FF8348496F7E48496F1380A248496F13C0A24890C96C13E0A24819F04982003F19F8A300 +7F19FC49177FA400FF19FEAD007F19FC6D17FFA3003F19F8A26D5E6C19F0A26E5D6C19E0 +A26C6D4B13C06C19806E5D6C6D4B13006C6D4B5A6D6C4B5A6D6C4B5A6D6C4A5B6D01C001 +075B6D01F0011F5B010101FE90B5C7FC6D90B65A023F15F8020715C002004AC8FC030713 +C047467AC454>79 D<DAFFE0131C010701FE133C013F9038FF807C90B6EAE0FC4815F948 +9038801FFF3907FC00014848EB007F4848143F4848140F491407007F15035B1601160012 +FF177CA27FA26D153C7F7F6D92C7FC6C7EEBFFE014FE6CEBFFF015FF6C15E016FC6C816C +6F7E6C826C826C6C81011F810107811300020F80140003077FED007F82040F1380828212 +F082A282A27EA218007EA26C5D6C5E6D14036D5D6D140701F84A5A01FFEC3FF002F8EBFF +E0486CB65AD8FC1F92C7FCD8F80714FC48C614F0480107138031467AC43E>83 +D<003FBA12E0A59026FE000FEB8003D87FE09338003FF049171F90C71607A2007E180300 +7C1801A300781800A400F819F8481978A5C81700B3B3A20107B8FCA545437CC24E>I<90 +3801FFE0011F13FE017F6D7E48B612E03A03FE007FF84848EB1FFC6D6D7E486C6D7EA26F +7FA36F7F6C5A6C5AEA00F090C7FCA40203B5FC91B6FC1307013F13F19038FFFC01000313 +E0481380381FFE00485A5B127F5B12FF5BA35DA26D5B6C6C5B4B13F0D83FFE013EEBFFC0 +3A1FFF80FC7F0007EBFFF86CECE01FC66CEB8007D90FFCC9FC322F7DAD36>97 +D<EB7FC0B5FCA512037EB1ED0FF892B57E02C314E002CF14F89139DFC03FFC9139FF000F +FE02FCEB03FF4A6D13804A15C04A6D13E05CEF7FF0A218F8173FA318FCAC18F8A2177F18 +F0A3EFFFE06E15C06E5B6E491380027C491300496C495A903AFC1FC07FFC496CB512F0D9 +F00314C049C691C7FCC8EA1FF036467DC43E>I<EC3FFC49B512C0010F14F0013F14FC90 +397FF003FE9039FFC001FF0003495A48494813805B120F485AA2485A6F1300007F6E5AED +00784991C7FCA212FFAC6C7EA3123F6DEC03C0A26C6C1407000F16806D140F6C6DEB1F00 +6C6D133E6C01F05B3A007FFC03F86DB55A010F14C0010391C7FC9038003FF82A2F7CAD32 +>I<EC3FF80103B57E010F14E0013F8090397FF83FF89039FFC007FC48496C7E48496C7E +48486D1380485A001FED7FC05B003FED3FE0A2127F5B17F0161F12FFA290B7FCA401F0C9 +FCA5127FA27FA2123F17F06C7E16016C6C15E06C6C14036C6DEB07C06C6DEB0F806C01F0 +EB3F0090397FFE01FE011FB55A010714F0010114C09026001FFEC7FC2C2F7DAD33>101 +D<DAFFE0137E010F9039FE03FF80013FEBFF8F90B812C048D9C07F133F489038001FF848 +48EB0FFC4848903907FE1F80001F9238FF0F00496D90C7FCA2003F82A8001F93C7FCA26D +5B000F5D6C6C495A6C6C495A6C9038C07FF04890B55A1680D8078F49C8FC018013E0000F +90CAFCA47F7F7F90B612C016FC6CEDFF8017E06C826C16FC7E000382000F82D81FF0C77E +D83FC014074848020113808248C9FC177FA46D15FF007F17006D5C6C6C4A5A6C6C4A5AD8 +0FFEEC3FF83B07FFC001FFF0000190B612C06C6C92C7FC010F14F8D9007F90C8FC32427D +AC38>103 D<EB7FC0B5FCA512037EB1ED07FE92383FFF8092B512E002C114F89139C7F0 +3FFC9138CF801F9139DF000FFE14DE14FC4A6D7E5CA25CA35CB3A7B60083B512FEA53745 +7CC43E>I<137C48B4FC4813804813C0A24813E0A56C13C0A26C13806C1300EA007C90C7 +FCAAEB7FC0EA7FFFA512037EB3AFB6FCA518467CC520>I<EB7FC0B5FCA512037EB3B3B3 +A3B61280A519457CC420>108 D<90397F8007FEB590383FFF8092B512E0028114F89139 +87F03FFC91388F801F000390399F000FFE6C139E14BC02F86D7E5CA25CA35CB3A7B60083 +B512FEA5372D7CAC3E>110 D<EC1FFC49B512C0010714F0011F14FC90397FF80FFF9026 +FFC0017F48496C7F4848C7EA3FE000078248486E7E49140F001F82A2003F82491407007F +82A400FF1780AA007F1700A46C6C4A5AA2001F5E6D141F000F5E6C6C4A5AA26C6C6CEBFF +E06C6D485B27007FF80F90C7FC6DB55A010F14F8010114C09026001FFCC8FC312F7DAD38 +>I<90397FC00FF8B590B57E02C314E002CF14F89139DFC03FFC9139FF001FFE000301FC +EB07FF6C496D13804A15C04A6D13E05C7013F0A2EF7FF8A4EF3FFCACEF7FF8A318F017FF +A24C13E06E15C06E5B6E4913806E4913006E495A9139DFC07FFC02CFB512F002C314C002 +C091C7FCED1FF092C9FCADB67EA536407DAC3E>I<90387F807FB53881FFE0028313F002 +8F13F8ED8FFC91389F1FFE000313BE6C13BC14F8A214F0ED0FFC9138E007F8ED01E092C7 +FCA35CB3A5B612E0A5272D7DAC2E>114 D<90391FFC038090B51287000314FF120F381F +F003383FC00049133F48C7121F127E00FE140FA215077EA27F01E090C7FC13FE387FFFF0 +14FF6C14C015F06C14FC6C800003806C15806C7E010F14C0EB003F020313E0140000F014 +3FA26C141F150FA27EA26C15C06C141FA26DEB3F8001E0EB7F009038F803FE90B55A00FC +5CD8F03F13E026E007FEC7FC232F7CAD2C>I<EB01E0A51303A41307A2130FA2131FA213 +3F137F13FF1203000F90B51280B7FCA4C601E0C7FCB3A3ED01E0A9150302F013C0137F15 +0790393FF80F8090391FFC1F006DB5FC6D13FC01015B9038003FE023407EBE2C>I<D97F +C049B4FCB50103B5FCA50003EC000F6C81B3A85EA25EA25E7E6E491380017FD901F713FE +9138F807E76DB512C7010F1407010313FE9026007FF0EBFC00372E7CAC3E>I<B500FE90 +383FFFF0A5C601F0903803E0006D6C495A6D6C495A011F4AC7FC6E5B6D6C137E6DEB807C +6D6D5A6DEBC1F0EDE3E06DEBF7C06EB45A806E90C8FC5D6E7E6E7F6E7FA24A7F4A7F8291 +381F3FFCEC3E1F027C7F4A6C7E49486C7F01036D7F49487E02C08049486C7F49C76C7E01 +3E6E7E017E141FB500E090B512FCA5362C7EAB3B>120 D<B6903803FFFCA5000101E090 +38003E006C163C80017F5D8017F8013F5D6E1301011F5D6E1303010F5D6E13076D5DED80 +0F6D92C7FC15C05E6DEBE01E163E6D143CEDF07C027F1378EDF8F8023F5B15FD021F5B15 +FF6E5BA36E5BA26E90C8FCA26E5AA26E5AA21578A215F85D14015D001F1303D83F805B38 +7FC007D8FFE05B140F92C9FC5C143E495A387FC1F8EB07F06CB45A6C5B000790CAFCEA01 +FC36407EAB3B>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fd ecbx1440 14.4 33 +/Fd 33 120 df<1718173CB3B3A5007FBC12FCBD12FEA3CA003CCAFCB3B3A61718575979 +C966>43 D<EA07E0EA1FF8EA3FFCEA7FFEA2B5FCA6EA7FFEA2EA3FFCEA1FF8EA07E01010 +768F25>46 D<151E153E15FE1403140F147FEB07FF0003B5FCB6FCA3EBF87FEAFC00C7FC +B3B3B3A6007FB712FCA52E4E76CD42>49 D<EC1FFE49B512F0010F14FC013FECFF804915 +E02701FF803F7F2703FC000713FCD807F001017F48486D7FD81F806E138048C87E7013C0 +D87FE016E001F8806D16F000FF817F7013F8A56C5AA26C5A6C5AEA0380C914F05EA218E0 +5E18C05E18804C13005F4C5A4C5A5F4B5B4B5B4B5B94C7FCED0FFC4B5A4B5AED7FC04B5A +4A90C8FCEC03FC4A5A4A4814F84A5A4A5A4AC8FC02FEEC01F0495A495A495A5CD90F8014 +0349C8FC013E1507017FB7FC90B812E05A5A5A5A5A5A5AB9FC18C0A4354E7ACD42>I<91 +3807FFC0027F13FC0103B67E010F15E090261FF80313F890267FC0007F01FEC7EA3FFE48 +488148486E138013FE486C6C6D13C0804817E080A66C5B18C06C5B6C90C75AD800381680 +90C8FC4C1300A24C5A5F4C5A4B5B4B13C0030F5BDB7FFEC7FC91387FFFF816C016FCEEFF +80DA000313E09238007FF8EE3FFE707E70138018C07013E018F07013F8A218FC82A218FE +A3EA03C0EA0FF0EA3FFC487EA2B5FCA218FCA25E18F8A26C4816F0495C4916E0D83FE04A +13C06C485CD80FF04A1380D807FE91387FFE003B03FFE003FFFC6C90B65A6C6C15E0010F +92C7FC010114FCD9001F1380374F7BCD42>I<17FC1601A216031607160FA2161F163F16 +7FA216FF5D5DA25D5D5D167F153E157E15FC15F8EC01F01403EC07E015C0EC0F80141FEC +3F00143E5C14FC495A5C495A1307495A5C49C7FC5B137E137C5B1201485A5B485A120F48 +5A90C8FC123E127E5ABA1280A5C901FCC7FCAF021FB71280A5394F7CCE42>I<173FA24D +7EA34D7EA24C7FA34C7FA24C7FA34C7FA24C7FA34C7F163E83047E80EE7C3F04FC8016F8 +830301814C7E03038116E0830307814C7E030F81168083031F811600834B81033E80037E +82157C8403FC824B800201835D840203834B800207835D92B8FC4A83A34A8392C9FC4A83 +143E85027E84027C8202FC845C850101854A820103855C850107854A82A2494884D93FF0 +82B600F0020FB712C0A55A547CD363>65 D<B912FEF0FFF019FE737E1AE0D8000F01C0C7 +001F7F06037F727F726C7E867313807313C0A27313E0A37313F0A94F13E0A34F13C01B80 +614F1300624F5A06035B4E13E0063F5B92B8C7FC19F8A2F1FF8003C0C7001F13E0060113 +F89538007FFE737E070F13C01BE07313F0851BF87313FCA27313FEA31BFFA91BFEA2611B +FCA2614F13F81BF0614F13E0077F13C04EB51280060FEBFE00BB5A1AF01AC04FC7FC19C0 +50527BD15D>I<BAFC19F819FF1AE01AF8D8000701F0C7001F13FE06017FDE003F13C007 +0F7F07037F737F737F747E747E747F86747F8886888688A2747FA3881B7FA288A51D80AF +1D00A564A21BFF64A3505BA2505BA2505BA2505B505B99C7FC505A1A7F4F485A4F13F007 +0F5B073F5B4EB55A061F49C8FCBB12F81AE097C9FC19F896CAFC59527CD165>68 +D<B81280A5D8000701F0C7FCB3B3B3B2B81280A529527DD130>73 +D<B600F04EB612F06F606F60A3D800076D4E49C7FCA2DADFFFF01F7FA202CF6D173EA302 +C76D177CA202C36D17F8A202C16DEE01F0A202C06DEE03E0A36F6CEE07C0A26F6CEE0F80 +A26F6CEE1F00A36F6D153EA26F6D5DA26F6D5DA36F6D4A5AA26F6D4A5AA2706C4A5AA370 +6C4A5AA2706C4AC7FCA2706D133EA3706D5BA2706D5BA2706D485AA2706D485AA3716C48 +5AA2716C485AA2716C48C8FCA37113BEA27113FCA2715BA3715BA2715BA2D91FF06F5AB6 +00FE050FB712F0A2725AA272C7FC74527CD17D>77 D<B912FCF0FFE019FE737E1AE0D800 +0F01E0C7003F7F060313FC06007F737E7313807313C07313E0851BF0A21BF885A21BFCA9 +1BF8A3611BF0A21BE04F13C0614F13804F13004F5A060713F8063F5B92B812C097C7FC19 +F8198003E0CBFCB3AEB712FEA54E527CD15A>80 D<DA0FFE141C91B500F0133C010702FC +137C011F02FF13FC017F15C19026FFF00113E148903980001FFB4890C7EA07FFD807FC14 +014848804848153F171F4848150FA2007F1607491503A2170112FFA217007FA26D167CA2 +7F7F6D93C7FC6C7E14C014F8ECFF806C14F8EDFFC06C15FC6CEDFF8017F06C16FC6C826C +707E6C836D82011F8201078213016D6C81020781EC007F030380ED003F04031480160017 +3F837113C0838312F883A3837EA319807EA26C5E19007F6D4B5A7F6D4B5A01FC4B5A6D15 +1FD9FFC04A5AD97FF8ECFFE028FE1FFF80075B010790B6C7FCD8FC0115FC486C6C14F048 +010F14C0489026007FFCC8FC3A5479D249>83 D<EC3FFE0107B512E0011F14FC017F14FF +2701FFC00F13C02703FE00037F486C01007F6E6D7E486D80707EA2707EA3707F6C5B6C90 +C7FC6C5AC9FCA60307B5FC0203B6FC147F0103B7FC011FEBF00F017F1300EBFFFC000313 +F04813C0485B4890C7FC5A5B485AF081F012FF5BA35EA26D5C127F6D5C003F03F713C36D +D901E314E06CD9C00714FF00079026F01F8114C06C90B5C61480C602FC6D1300011F01F0 +EB3FFC01010180EB07F03C387CB642>97 D<EB3FF8B5FCA51203C6FCB3A4EE7FF00307B5 +FC031F14C0037F14F0913AF9FF007FFCDAFFF8EB1FFF03E001077F03806D7F92C76C7F4A +6E7F5C4A6F7E85183F85A38584A31A80AD1A00A36061A261187F616E15FF616E4A5B6E4A +5B6F495BDACFE04990C7FCDA87F0EB3FFE913A01FE01FFF8496CB65A49013F14C0490107 +49C8FC90C813E041547DD249>I<913803FFE0023F13FE91B67E010315E0010F9038003F +F8D93FFCEB07FC4948497E4948131F4849497E485B485BA24890C7FC5A5B003F6F5A705A +705A007F92C8FC5BA312FFAD127F7FA3123F7F6CEE0F80A26C6D141F18006C6D5C6C6D14 +3E6C6D147E6C6D5C6D6C495A6DB4EB07F0010F9038C01FE06D90B5128001014AC7FCD900 +3F13F80203138031387CB63A>I<943803FF80040FB5FCA5EE003F170FB3A4913803FF80 +023F13F849B512FE0107ECFF8F011F9038C03FEF90273FFE0007B5FCD97FF8130149487F +484980484980484980488291C8FC5A5B123FA2127F5BA312FFAD127FA37F123FA3121F7F +6C5E6C6D5C5F6C6D91B5FC6C6D5B6C6D4914E0D97FFCD90FEFEBFF80D91FFFEB7F8F0107 +90B5120F010114FC6D6C13E00207010049C7FC41547CD249>I<913807FF80027F13F849 +B512FE01076E7E011F010313E0903A3FFC007FF0D97FF06D7E49486D7E4849130F48496D +7E48824890C77E1880485A82003F17C0A3485A18E082A212FFA290B8FCA401FCCAFCA612 +7FA37F123FA2EF03E06C7E17076C17C06C6D140F18806C6D141F6C6DEC3F006C6D147ED9 +7FFC495AD91FFFEB07F86D9038E03FF0010390B512C001005D023F01FCC7FC020113E033 +387CB63C>I<ED1FF8913803FFFE020FEBFF80023F14C09139FFF83FE001039038E0FFF0 +49138049010113F85BEB3FFEA2EB7FFCA26F13F0495AEE7FE0EE1F8093C7FCAEB712C0A5 +C601F8C8FCB3B3A7B612FEA52D547CD328>I<DA1FFE14FE49B539E007FF80010FDAFC1F +13C0013FDAFF7F13E090267FF807EBFF072701FFE001EBF07F48497E484990387FF83F91 +C7003F14C048EEFC1F489338FE070049021F90C7FCA2003F82A9001F5EA26D143F6C5E6C +5E6E137F6C6D495A6C6D485B6CD9F80713804890B6C8FCD803EF14FC01C114E02707C01F +FEC9FC49CBFCA2487EA37FA27F13FC90B612FE6CEDFFF017FCEFFF806C8318F06C836C83 +7F48B87E1207D80FFCC700037F4848EC003F4848150F48486F138083485A83A56D5D007F +18006D5D003F5F6C6C4B5A01FE153FD807FFED7FF06C01C049485AC601FC011F1380013F +B648C7FC010F15F8010115C0D9000F01F8C8FC3B4F7CB542>I<EB3FF8B5FCA51203C6FC +B3A4EE1FFC93B57E030314E0030F14F892391FC07FFC92397E003FFE03F86D7EECF9F04B +6D7FECFBC0ECFF8092C76C7FA25CA25CA45CB3ACB6D8F807B612C0A542537CD249>I<13 +3FEBFFC0487F487FA2487FA66C5BA26C5B6C5B013FC7FC90C8FCAEEB1FF8B5FCA512017E +B3B3A6B612F0A51C547CD324>I<EB3FF8B5FCA51203C6FCB3A50407B512F0A59339007F +F000EF3FC04D5A4DC7FCEE01FC4C5AEE0FF04C5A4C5A4CC8FC16FEED03FC4B5A4B5A4B5A +4B7E4B7EECF9FF02FB7F91B57EA28203BF7F031F7F14FE4A6C7FDAF0077F6F7FA26F7F6F +7F167F83707F707FA2707F707F707FA2707F707F84B6D8F00F14FEA53F537DD245>107 +D<EB3FF8B5FCA51203C6FCB3B3B3B1B612F8A51D537CD224>I<D93FF0D91FF84AB47EB5 +91B56C010F13F8030302E0013F13FE030F6E90B6FCDB3F809027F803F80F7F922A7E007F +FC07E0077F000302F890283FFE0F80037FC6D9F1F0011F49487EDAF3E0DAFF3E814B153C +DAF7805D92C76C496D7F14FF4A5EA24A5EA34A5EB3ADB6D8F80FB66CB612F8A565367BB5 +6E>I<D93FF0EB1FFCB591B57E030314E0030F14F892391FC07FFC92397E003FFE000302 +F86D7EC6EBF1F04B6D7FECF3C0ECF78092C76C7F14FF5CA25CA45CB3ACB6D8F807B612C0 +A542367CB549>I<913801FFC0023F13FE91B67E010315E0010F018013F8903A3FFC001F +FED97FF0EB07FF49486D7F48496D7F48496D7F91C8127F4883488349153F001F83A2003F +8349151FA2007F83A400FF1880AC007F1800A3003F5F6D153FA2001F5FA26C6C4B5AA26C +6D4A5A6C5F6C6D495B6C6D495B6D6C4990C7FCD93FFCEB1FFE6DB46CB45A010790B512F0 +010115C0D9003F49C8FC020313E039387CB642>I<D93FF8EB7FF0B50107B5FC031F14C0 +037F14F09126F9FF0013FCDAFFF8EB3FFF000302E0010F7FC602806D7F92C76C7F4A824A +804A6E7F85187F85A2183F85A4721380AD4E1300A44E5AA26118FF616E5C616E4A5B6E4A +5B6F495B03E04990C7FC6FEB7FFE913AF9FE01FFF802F8B65A033F14C0030749C8FC0300 +13E093CAFCB1B612F8A5414D7DB549>I<90393FF001FCB590380FFF804B13E0037F13F0 +9238FE1FF89138F1F83F00019138F07FFC6CEBF3E015C0ECF780A2ECFF00EE3FF84AEB1F +F0EE0FE093C7FC5CA45CB3ABB612FEA52E367DB535>114 D<903903FFC00E011FEBFC1E +90B6127E000315FE3907FE003FD80FF0130F4848130348481301491300127F90C8127EA2 +48153EA27FA27F01F091C7FC13FCEBFF806C13FEECFFF06C14FE6F7E6C15E06C816C15FC +6C81C681133F010F15801301D9000F14C0EC003F030713E0150100F880167F6C153FA216 +1F7EA217C07E6D143F17807F6DEC7F0001F85C6DEB03FE9039FF801FFC486CB512F0D8F8 +1F14C0D8F00791C7FC39E0007FF02B387CB634>I<147CA614FCA41301A31303A21307A2 +130F131F133F137F13FF1203000F90B512FEB7FCA426007FFCC8FCB3A9EE0F80ABEE1F00 +6D7EA2011F143E806D6D5A6DEBC1F86DEBFFF001005C023F1380DA03FEC7FC294D7ECB33 +>I<D93FF8913801FFC0B50207B5FCA50003ED001FC61607B3AE5FA35FA25F137F5F6D6C +14F7DC01E713F06D6CD907C7EBFFC0903A0FFF801F876D90B51207010114FC6D6C13F002 +0701C091C7FC42377CB549>I<B600E1B6D8800FB5FCA500019026F0000301C0C7EA3FE0 +6E6D6DEC0F806CF21F00A26E6D6D5C017F193E6E147F72147E013F197C6E6F14FC6D6117 +FF6F6E13016D4A5E03C06E13036D615E03E001E7EB80076D02075E03F001C313C06D4E5A +160F03F80181EBE01F6D96C7FC6F48C6FC735A027F49153EDBFE3E90387FF87E023F177C +167EDBFF7C90383FFCFC6E01FC5D4CEB1FFF6E5FA24C7F6E5F4C7F6E5FA24C7F6E5F4C7F +A26E94C8FC93C8FC6F5DA2033E157C58367DB45F>119 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fe ecti1095 10.95 22 +/Fe 22 122 df<387FFFFCA3B5FCA21605799520>45 D<49B77E18F018FC903B0003FC00 +03FE9438007F804B143FF00FC019E00207ED07F04B140319F81801140F4B15FC1800A214 +1F4B15FEA3143F5DA21801147F92C8FCA219FC5C4A1503A3010117F84A1507A219F00103 +160F5C19E0181F010717C05CF03F80A2010FEE7F004A157E18FE4D5A011F5E4A4A5A1707 +4D5A013F4B5A4A4A5A4DC7FC017FEC01FC4C5A91C7EA0FE049EC7FC0007F90B6C8FCB712 +FC16C03F3E7BBD44>68 D<147E49B47E903907C1C38090391F80EFC090383F00FF017E13 +7F4914804848133F485AA248481400120F5B001F5C157E485AA215FE007F5C90C7FCA214 +01485C5AA21403EDF0385AA21407EDE078020F1370127C021F13F0007E013F13E0003E13 +7FECF3E1261F01E313C03A0F8781E3803A03FF00FF00D800FC133E252977A72E>97 +D<EB1FC0EA0FFF5CA2EA003FA291C7FCA25BA2137EA213FEA25BA21201A25BA21203A25B +147C3807F1FF9038F787C09038EE03E09038FC01F0EA0FF801F013F814005B485A15FC5B +1401123FA21300A248130315F8127EA2140700FE14F05AA2EC0FE0A348EB1FC01580143F +1500147E1278007C5B495A383C03F06C485A380F0F80D807FEC7FCEA01F81E4076BE29> +I<EC1FC0ECFFF0903803F07C90380FC01E90381F000E013E130F49131F01FC137F485A48 +5A0007147E5B000F143848481300A2485AA3127F90C8FCA35A5AA55A1506150E007E141E +153C1578003E14F0003FEB01E06CEB07C0390F800F003807C07E3801FFF038007F802029 +77A729>I<EE3F80ED1FFF1700A2ED007FA2167EA216FEA25EA21501A25EA21503A25EA2 +1507A25E147E903801FF8F903807C1CF90391F80EFC090383F00FF017E137F5B48486D5A +485AA2485A000F92C7FC5B001F5CA24848137EA215FE127F90C75AA214015A485CA21403 +16384814F0A21407167891380FE070127C021F13F0007E013F5B003E137FECF3E1261F01 +E35B3A0F8781E3802703FF00FFC7FCD800FC133E294077BE2E>I<143F903801FFE09038 +07C0F090381F0078137E49133C485A485A12074848137C491378121F484813F8EC01F000 +7FEB07E09038001FC0903801FF00EBFFF8B5128048C8FCA45AA6150C151C153C007C1478 +15F0007EEB01E0003EEB03C06CEB0F806CEB1E00380780FC3803FFE0C690C7FC1E2976A7 +29>I<167C4BB4FC923807C78092380F83C0151F160FED3F1FA2157E1780EE0F0093C7FC +5DA414015DA414035DA30103B512F8A390260007E0C7FCA3140F5DA5141F5DA4143F92C8 +FCA45C147EA414FE5CA413015CA4495AA4495AA4495AA2121C007E5B12FE49C9FCA2EAFC +1E485A12F0EA7878EA3FE0EA0F802A5383BF1C>I<EC03E0EC1FF891383E1E389138F80E +FC903801F007EB03E001071303D90FC013F8EB1F80133F14004914F0137E01FE1307A248 +4814E0A2150F12034914C0A2151F1207491480A2153FA2491400A25DA2000314FE140113 +F0000113034A5A3800F80EEB7C3DEB1FF1903807C1F8EB00011403A25DA21407A25D140F +003C5C127E00FE495A4AC7FC147E485B38F001F8387C03E0383FFF80D807FEC8FC263B7C +A729>I<EB01FC13FF5CA21303A25CA21307A25CA2130FA25CA2131FA25CA2133FA291C8 +FCEC03F890387F0FFE91383E0F80D97E7813C0ECE007D9FFC013E014801400A2485A5BA2 +5B0003140F16C05BA20007141F16805BA2000F143F16005B5D001F147EEDFE074913FCA2 +003F0101130FEDF80E1300161E48ECF01CA2007E1538A200FE1570020013E048EC7FC000 +38EC1F0028407ABE2E>I<1470EB01FCA314F8A2EB00E01400AD137C48B4FC38038F80EA +0707000E13C0121E121CEA3C0F1238A2EA781F00701380A2EAF03F140012005B137E13FE +5BA212015BA212035B1438120713E0000F1378EBC070A214F0EB80E0A2EB81C013831480 +38078700EA03FEEA00F8163D79BB1C>I<EB07F0EA03FF14E0A2EA000FA214C0A2131FA2 +1480A2133FA21400A25BA2137EA213FEA25BA21201A25BA21203A25BA21207A25BA2120F +A25BA2121FA25BA2123FA290C7FCA25A1307127EA2EAFE0F130E12FCA2131E131CA2EA7C +381378EA3C70EA1FE0EA0780144079BE17>108 D<D801F0D93F80137F3D07FC01FFE003 +FFC03D0F3E07C1F80F83F03D0E1F0F00FC1E01F8001E011C90387C3800001C49D97E707F +003C01F05C0038157F4A5C26783FC05C12704A91C7FC91C7127E00F003FE1301494A5CEA +007EA20301140301FE5F495CA203031407000160495C180F03075D0003051F13E0494A14 +80A2030FEC3F810007F001C0495CA2031F91383E0380120F494AEC0700A2033F150E001F +EF1E1C4991C7EA0FF80007C7000EEC03E0432979A74A>I<D801F0EB3F803A07FC01FFE0 +3A0F3E07C1F83A0E1F0F00FC001E011C137C001C49137E003C13F012385C38783FC01270 +5C91C7FC00F015FE495CEA007EA2150101FE5C5BA2150300015D5B15075E0003020F1370 +4914C0A2031F13F00007ED80E05B1681EE01C0120F49EC0380A2EE0700001FEC0F0E49EB +07FC0007C7EA01F02C2979A733>I<EC1FC0ECFFF8903803F07C90380FC01FEB1F809039 +3F000F80017E14C0491307484814E0485A12075B000F15F0485AA2485AA2ED0FE0127F90 +C7FCA2151F4815C05AA2ED3F80A2ED7F00A248147E007C5C007E13015D4A5A003E495A6C +495A4A5A260F803EC7FC3807C0FC3801FFF038003F80242977A72E>I<903903E001F890 +390FF807FE903A1E7C1E0F80903A1C3E3C07C0013C137801389038E003E0EB783F017001 +C013F0ED80019038F07F0001E015F8147E1603000113FEA2C75AA20101140717F05CA201 +03140F17E05CA20107EC1FC0A24A1480163F010F15005E167E5E131F4B5A6E485A4B5A90 +393FB80F80DA9C1FC7FCEC0FFCEC03E049C9FCA2137EA213FEA25BA21201A25BA21203A2 +387FFFE0B5FCA22D3A80A72E>I<D801F013FE3A07FC03FF803A0F3E0F03E0390E1F1C01 +001EEB3807001C017013F0003C9038F00FE0003813E014C0D8783FEB0380007049C7FCA2 +91C8FC12F05BEA007EA313FE5BA312015BA312035BA312075BA3120F5BA3121F5B0007C9 +FC242979A726>114 D<EC7F80903801FFE0903807C0F890381E003C49131C151E49130E +49133E157EA20001147CA215106D13007FEBFF8014F86C13FF15806D13C0011F13E01307 +9038007FF0140F1403A21401123E007E1300007F130100FE14E0A25A48EB03C048EB0780 +12700078EB0F006C133C001F13F83807FFE0C690C7FC1F297AA725>I<EB01C0EB03F013 +07A25CA2130FA25CA2131FA25CA2133FA291C7FCA2007FB51280B6FC1500D8007EC7FC13 +FEA25BA21201A25BA21203A25BA21207A25BA2120FA25BA2121F141C1380A2003F133C14 +38EB0078147014F05C495AEA1F03495A6C48C7FCEA07FCEA01F0193A78B81E>I<137C48 +B4143826038F8013FCEA0707000E7F001E1401121CD83C0F5C12381503EA781F00700180 +5BA2D8F03F1307140000005D5B017E130FA201FE5C5B151F1201495CA2153F0003ED8380 +491403A2157F1607037E1300A2EDFE0F160E000113019039F803BE1C0000EB073E90397C +1E1E3890393FF80FF0903907E003E0292979A730>I<903903E003F090390FF80FFC9039 +3C3C1C1F9039701E380F9039E01F703F000102F013803B03C00FE07F001380000714C0D9 +001F131C4892C7FC000E5CA2001E133FA2C790C8FCA25C147EA314FE5CA313014A1338A3 +010314781670001C4913F0007E5D0107130100FE5D010F495A90380EF80727781C780FC7 +FC9038383C3C393FF01FF83907C007E029297CA729>120 D<137C48B4143826038F8013 +FCEA0707000E7F001E1401001C15F8EA3C0F12381503D8781F14F000701380A2D8F03F13 +07020013E012005B017E130F16C013FE5B151F1201491480A2153F000315005BA25D157E +A315FE5D00011301EBF8030000130790387C1FF8EB3FF9EB07E1EB00035DA214075D121F +486C485AA24A5AD87F0090C7FC007E133E0038137E5CEB01F06C485A381E0FC0D807FFC8 +FCEA01F8263B79A72C>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Ff ecrm0900 9 40 +/Ff 40 122 df<0003130648130E000E131C481338001813300038137000301360007013 +E0006013C0A2EAE00100C01380A400DE13BC00FF13FEEB81FFA2EA7F80A2383F007E001E +133C181780B31A>16 D<003C1378007E13FC38FF01FEA2EB81FFA2EA7F80003D137B0001 +1303A400031307EB0006A248130E0006130C000E131C000C1318001C13384813704813E0 +006013C018177FB31A>I<EC1FE0ECFFFC903803F01E90390FC00780EB1F8090393F000F +C0017E131F5BA2485AED0F8092C7FCA9ED0FC0B7FCA33901F8001F150FB3A6486CEB1FE0 +267FFFC1B5FCA328357FB42B>28 D<14C01301EB0380EB0F00130E5B133C5B5BA2485A48 +5AA212075B120F90C7FC5AA2121E123EA3123C127CA55AB0127CA5123C123EA3121E121F +A27E7F12077F1203A26C7E6C7EA213787F131C7F130FEB0380EB01C01300124A79B71E> +40 D<12C07E1270123C121C7E120F6C7E6C7EA26C7E6C7EA27F1378137C133C133EA213 +1E131FA37F1480A5EB07C0B0EB0F80A514005BA3131E133EA2133C137C137813F85BA248 +5A485AA2485A48C7FC120E5A123C12705A5A124A7CB71E>I<123C127EB4FCA21380A212 +7F123D1201A412031300A25A1206120E120C121C5A5A126009177A8715>44 +D<B512F0A514057F921A>I<123C127E12FFA4127E123C08087A8715>I<1518A215381530 +A21570156015E015C0A214011580A2140315005C1406A2140E140CA2141C141814381430 +A214701460A214E05CA213015C130391C7FCA25B1306A2130E130C131C1318A213381330 +A213701360A213E05B12015BA2120390C8FCA25A1206120E120CA2121C1218A212381230 +12701260A212E05AA21D4B7CB726>I<123C127E12FFA4127E123C1200B0123C127E12FF +A4127E123C08207A9F15>58 D<15E0A34A7EA24A7EA34A7EA3EC0DFE140CA2EC187FA34A +6C7EA202707FEC601FA202E07FECC00FA2D901807F1507A249486C7EA301066D7EA2010E +80010FB5FCA249800118C77EA24981163FA2496E7EA3496E7EA20001821607487ED81FF0 +4A7ED8FFFE49B512E0A333367DB53A>65 D<B81280A3D803FCC7FC0001151FEE07C01603 +A21601A21600A41760150CA31700A2151CA2153C15FC90B5FCA3EBFC00153C151CA2150C +A592C8FCAB487EB512FEA32B337DB232>70 D<B512FEA3000113006C5AB3B3A7487EB512 +FEA317337EB21C>73 D<D8FFFC923801FFF86D5DA20003EFFE00D801BFED06FCA3D99F80 +140CA2D98FC01418A3D987E01430A2D983F01460A3D981F814C0A3D980FCEB0180A2027E +EB0300A36E1306A26E6C5AA36E6C5AA36E6C5AA26E6C5AA36E6C5AA3913800FD80A2037F +C7FCA3486C133ED80FF04B7EB5011C90387FFFF8A33D337CB246>77 +D<B612FCEDFF8016F03A01FE0007FC0000EC01FEED007F707E707E83160F83A65FA24C5A +A24C5A047EC7FC4B5AED0FF090B612C093C8FC9039FE001FC0ED07F06F7E6F7E15008216 +7E167FA583A5180C17C0A2043F131C486C1618B500FEEB1FE0040F1338933807F070C938 +01FFE09338003F8036357EB239>82 D<007FB712FEA390398007F001D87C00EC003E0078 +161E0070160EA20060160600E01607A3481603A6C71500B3AB4A7E011FB512FCA330337D +B237>84 D<B500FE90381FFFF8A3000190C813006C48153C1718B3AF1738017F1530A217 +706D6C1460011F15E06E495A010F14036D6C495A6D6C49C7FCD901FC131E6DB413FC9138 +3FFFF0020F13C0020190C8FC35357EB23A>I<EB7F803803FFF0380F80FC381C003E003F +133F6D6C7E6E7EA26E7EEA1F00C7FCA4EB01FF131FEBFF873803FC07EA0FF0EA1FC0EA3F +80127F13004815C05AA3140FA26C131F6C133B3A3F8071F180391FC1E1FF2607FFC01300 +3900FE003C22237DA126>97 D<EA03F012FFA312071203AEEC3F80ECFFE09038F3C0F890 +38F7007E01FE7F49EB1F8049EB0FC05BED07E016F0A2150316F8AA16F0150716E0A2ED0F +C07F6DEB1F8001ECEB3F0001CF137C90388381F8903801FFE0C76CC7FC25357EB32B>I< +EB07F8EB3FFF9038FC07C03901F000E03903E003F03807C007120FEA1F80123F90380003 +E04890C7FCA2127E12FEAA127FA26C14187F001F14386D1330000F14706C6C13E03903F0 +01C03900FC0F8090383FFE00EB07F01D237EA122>I<153FEC0FFFA3EC007F81AEEB07F0 +EB3FFCEBFC0F3901F003BF3907E001FF48487E48487F8148C7FCA25A127E12FEAA127E12 +7FA27E6C6C5BA26C6C5B6C6C4813803A03F007BFFC3900F81E3FEB3FFCD90FE013002635 +7DB32B>I<EB0FE0EB7FFCEBF83F3903F00F80D807E013C0390FC007E0381F800315F0EA +3F0014014814F8127EA212FEA2B6FCA248C8FCA5127E127FA26C1418A26C6C1338000F14 +306D13706C6C13E03901F003C03900FC0F00EB3FFEEB07F01D237EA122>I<EB01FCEB07 +FF90381F078090383E0FC0EB7C1F13FCEA01F8A20003EB070049C7FCACB512F0A3D803F0 +C7FCB3A7487E387FFFE0A31A357FB417>I<151F90391FC07F809039FFF8E3C03901F07F +C73907E03F033A0FC01F83809039800F8000001F80EB00074880A66C5CEB800F000F5CEB +C01F6C6C48C7FCEBF07C380EFFF8380C1FC0001CC9FCA3121EA2121F380FFFFEECFFC06C +14F06C14FC4880381F0001003EEB007F4880ED1F8048140FA56C141F007C15006C143E6C +5C390FC001F83903F007E0C6B51280D91FFCC7FC22337EA126>I<EA03F012FFA3120712 +03AEEC1FC0EC7FF09038F1E0FC9038F3807C9038F7007E13FE497FA25BA25BB3486CEB7F +80B538C7FFFCA326347EB32B>I<EA0780EA0FC0EA1FE0A4EA0FC0EA0780C7FCAAEA07E0 +12FFA3120F1207B3A6EA0FF0B5FCA310337EB215>I<EA03F012FFA312071203AF913803 +FFE0A36E1300EC00F8EC01E05D4A5A020FC7FC141C5C5C14F0EBF3F8EBF7FC13FEEBFC7E +EBF87F496C7E141F6E7E8114076E7E8114016E7E81486CEBFF80B500C313F0A324347EB3 +29>107 D<EA07E012FFA3120F1207B3B3A7EA0FF0B5FCA310347EB315>I<2703F01FE013 +FF00FF90267FF80313C0903BF1E07C0F03E0903BF3803E1C01F02807F7003F387FD803FE +1470496D486C7EA2495CA2495CB3486C496C487EB53BC7FFFE3FFFF0A33C217EA041>I< +3903F01FC000FFEB7FF09038F1E0FC9038F3807C3907F7007EEA03FE497FA25BA25BB348 +6CEB7F80B538C7FFFCA326217EA02B>I<EB07F0EB3FFE9038FC1F803901F007C03903C0 +01E000078048486C7E48C7127CA248147E003E143E007E143FA300FE1580A8007E1500A3 +6C147EA26C147C6D13FC6C6C485A00075C3903F007E03900FC1F80D93FFEC7FCEB07F021 +237EA126>I<3903F03F8000FFEBFFE09038F3C0F89038F7007ED807FE7F6C48EB1F8049 +14C049130F16E0ED07F0A3ED03F8A9150716F0A216E0150F16C06D131F6DEB3F80160001 +FF13FC9038F381F89038F1FFE0D9F07FC7FC91C8FCAA487EB512C0A325307EA02B>I<38 +03E07C38FFE1FF9038E38F809038E71FC0EA07EEEA03ECA29038FC0F8049C7FCA35BB248 +7EB512E0A31A217FA01E>114 D<EBFF06000713CE381F00FE003C133E48131E140E5A14 +06A27EA200FE90C7FC6C7EEA7FFC383FFFC014F0000F7F6C7FC67FEB0FFF1300EC3F8000 +C0131F140F6C1307A37E15006C5B6C130E6C5B38F7807838E1FFE038C07F8019237EA11E +>I<1330A51370A313F0A21201A212031207381FFFFEB5FCA23803F000AF1403A8140738 +01F806A23800FC0EEB7E1CEB1FF8EB07E0182F7FAD1E>I<D803F0133F00FFEB0FFFA300 +07EB007F000380B35DA35D12016D4813800000903803BFFC90387E073FEB1FFED907F813 +0026227EA02B>I<B5EBFFF0A3D80FF0EB3F800007EC1F000003140E150C6D131C000114 +18A26C6C5BA26D1370017E1360137F6D5BA290381F8180A214C3010F90C7FCA2EB07E6A2 +14FE6D5AA26D5AA36D5AA2146024217E9F29>I<B53A1FFF81FFF0A33C07F801FC003F80 +01F049EB1E0000030100141C816C6C017C1318A26D017E1338000002FE1330A290267E01 +FF5B159F168090263F030F5BA216C0903A1F8607C180A202C613E390260FCC0390C7FCA2 +D907FC13F6ECF80116FE6D486C5AA36D481378A36D48133034217F9F37>I<B53801FFF8 +A32603FE0013806C48EB7C0000001478017E1370017F5B90383F81C090381F8380D90FC3 +C7FCEB07E614FE6D5A6D5A6D7E80805B9038039F809038071FC09038060FE0EB0C079038 +1C03F0496C7E01707FEBF000000180000FECFF8026FFFC0313FCA326207F9F29>I<3A7F +FF807FF8A33A07F8001FC00003EC0F800001EC070015066C6C5BA26D131C017E1318A26D +5BA2EC8070011F1360ECC0E0010F5BA2903807E180A214F3010390C7FC14FBEB01FEA26D +5AA31478A21430A25CA214E05CA2495A1278D8FC03C8FCA21306130EEA701CEA7838EA1F +F0EA0FC025307F9F29>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fg ecrm0600 6 1 +/Fg 1 50 df<13E01201120712FF12F91201B3A7487EB512C0A212217AA01E>49 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fh ecrm0800 8 1 +/Fh 1 50 df<130C133C137CEA03FC12FFEAFC7C1200B3B113FE387FFFFEA2172C7AAB23 +>49 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fi cmsy10 10.95 1 +/Fi 1 16 df<EB0FFCEB3FFF90B512C0000314F04880488048804880A2481580A3B712C0 +AA6C1580A36C1500A26C5C6C5C6C5C6C5CC614C0013F90C7FCEB0FFC22227BA72D>15 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fj ecbx2074 20.74 11 +/Fj 11 117 df<EE03C0160F161F163F16FF1503150F157F0203B5FC143F010FB6FCB8FC +A314FC14C0EBF000C8FCB3B3B3B3B2003FBAFCA6407172F05B>49 +D<92381FFF804AB512FC020FECFF80023F15F091B712FC010316FF010FD9001F14C0D91F +F8010380D93FE0010014F8D97F80023F7F4848C86C7F01FC6F7F48486F148048486F14C0 +4848817114E0484818F04982003F7113F813F8D87FFE7013FC6D7E6E17FEB56C81A2801A +FFA284A56C5BA26C5B6C495DD807FEC9FCD801F818FECBFCA2601AFCA21AF8601AF0601A +E095B5FC1AC04D14801A005F614D5B4D5B614D5B4D5B614D90C7FC4D5A4C13F8604C5B4C +5B4C5B4C48C8FC4C5A4C5A5F4C5A4B13804B90C9FC4B5A4B5A4B5A4B48153F4B5A4B5A93 +C9FC4A48167E4A5A4A5A4A5A4A5A4A5A4A4816FE4ACAFC495AD903F817FC4A1601495A49 +48160F49B9FC5B5B90BAFC5A4819F85AA25A5A5A5ABBFCA21AF0A4487177F05B>I<9238 +03FFF8037FEBFFC00203B612FC020F15FF027F16C09127FFFC007F13F0010301C0010F13 +FC4948C700037FD91FF86E7FD93FE06E14C049488191C98001FE707F2601FFC08302F081 +486D838080486D8384A38192C8FCA46C5F5C6C495F6C5BEB3FE00107C95C90CA5AA26260 +6295B55AA24D5C97C7FC4D5B4D5B614D5B4D13C0057F5B4D48C8FC04035B4BB512F04AB6 +12804DC9FC17F8EFFFE018FC91C86CB47E050F13E0050313F87113FE716C7E1AC0727F72 +7F727F86727F86A2721480A21BC0A21BE084A31BF0A3EA03FE380FFF80487F487F487FA2 +B57EA31BE0A260A21BC05C6C1A804A5D4A18006C5B49C9485BEA1FF801E04C5B6C6C4C5B +D807FC606C6C4C5B2601FFC092B55A6C01F002035CD93FFF020F49C7FC6D01F8017F5B01 +0790B712F0010117C06D6C93C8FC020F15F8020015C0030701F8C9FC4C7379F05B>I<19 +7F61A2606060A26060A2606095B5FCA25F5FA25F5F5FA25F5FA217FD1601EE03F917F116 +07EE0FE1EE1FC11781163FEE7F01167E16FEED01FCED03F816F01507ED0FE016C0151FED +3F80ED7F00157E15FE4A5A5D14034A5A4A5A5D141F4A5A92C7FC147E14FE495A5C130349 +5A5C495A131F495A91C8FC5B13FE5B485A1203485A5B120F485A5B48C9FC5A12FEBDFCA6 +CA000391C7FCB3A4030FB9FCA650727BF15B>I<952601FFFE160E95B600F0151E050F03 +FE153E94B86C147E040305F014FE041F05FC1301047F9127F0003FFE13034BB500FCC739 +03FF8007030702E09138007FE0031F91C9381FF00F037F01F8933807F81F92B500E09338 +03FC3F02034A933800FF7F4A91CBEA7FFF4A49844A01F8844A49844A498491B54884494A +844991CDFC495B491C7F49491A3F5D491C1F49491A0F5D90B51B075D5A481D035D1E0148 +91CEFCA25A1E005C5AA21F7E485BA31F005AA35CA3B5FCB27EA280A47EA31F7E6C7FA37E +80A26C1EFE1FFC6C80A26F1A016C1EF87E6F1A036D1DF06F1A076D6D1BE06D1C0F6F1BC0 +6D6D1A1F6DF43F806D7F6D6EF17F006D6E19FE6E6D4E5A6E6D18036E6D4E5A6E01FE4E5A +6E6D4E5A6E02C0EF7FC002006E4DC7FC6F01FCEE03FE031F01FFEE0FFC030702E0ED3FF0 +030102FE4AB45A6F6CD9FFF0013F1380041F91B648C8FC040317F8040017E0050F93C9FC +050015F0060149CAFC6F7A76F784>67 D<92381FFFC00203B512FE023FECFFC091B712F0 +010316FC010FD9E00313FFD91FFCC76C13C0D93FE0021F7FD97F806E7FD9FFF06E7F6E6E +7F486D6E7F6E824870806E8186A2727FA46C496F7FA26C5BEB3FF0EB0FC090CAFCA96004 +0FB6FC0303B7FC157F0203B5EAFC1F021F140091B512F0010391C7FC010F13FC4913F001 +7F13C090B55A4891C8FC485B485B485B485B5A5C5A4AF007E0A2B5FC5CA260A360A26E92 +B5FC7E6EEC01EF17036C6DDA07C79038F80FC06C6DEC0F876C6DDA1F07EBFC1F6C6DDA7E +039038FF7F806C6D6C48486CECFF006C9138E00FF86C6C90B5D8E0005C011F4B013F5B01 +0792C76C13F0010002F802075B020701C0020090C7FC53507ACE5B>97 +D<923801FFFC031FEBFFC092B612F8020715FE021F6F7E027FD9E03F13E09127FFFE0007 +7F010301F801017F49496D7F4901C0EC3FFE4949814990C86C138049486F13C013FF4A6F +13E05A48496F13F0A2484917F848831AFCA2484981A24819FEA3485B197F1AFFA3B5FCA4 +91BAFCA402C0CBFCA77EA4807EA37E80A26C193FA26C6D177F1A7E6C7F6C19FE6EEE01FC +6C7F6DEF03F86D6DED07F06D6DED0FE06D6DED1FC06D01F8ED3F806D6DEDFF006D01FFEC +03FE6D6C01E0EB0FFC6E01FEEBFFF8020F90B612E002031680DA007F4AC7FC030F14F0DB +007F90C8FC48507BCE53>101 D<903803FFF8B6FCA6C67E131F7FB3AFF07FF80503B512 +C0051F14F0057F14FC94B7FC932603FE0180932707F0007F7FDC0FC06D7F4CC77E043E82 +4C6E7F5E4C80DBF9E082A2EDFBC0DBFF80808793C8FCA25DA35DA45DB3B3A9B8D8803FB7 +12E0A65B787AF766>104 D<902603FFF8903801FFF0B6021F13FF94B612E0040315FC04 +0F15FF93263FF80114C09327FFC0003F7FC66CD9F9FEC76C7F011FD9FBF8020713FC6DD9 +FFF06E7F4C6E7F04806E8093C96C7FA24B707F4B707F5D747FA2747FA2888688A286A21D +80A4861DC0AF501480A51D0062A26462A264626462646F4C5B816F4C5B97B55A704A91C7 +FC704A5B04F04A5B704A5BDBF9FC023F5BDBF8FF91B512C093267FF00791C8FC041FB612 +FC040715F0040115C0DC003F49C9FC050713C094CCFCB3A8B87EA65A6F7BCD66>112 +D<902603FFF0EB1FF0B6EC7FFE4CB51280040714E04C14F093391FE07FF893393F80FFFC +C66CDA7E0113FE011F14FC6D4A4813FFEDF1F0A2EDF3E016C0A2EDF7807113FE160003FF +6D13FCF07FF84BEC1FE0F0030095C7FCA25DA65DB3B3A6B812F0A6404E7CCD49>114 +D<15FCA71401A51403A31407A3140FA2141FA2143F147F14FFA25B5B5B131F5B90B5FC00 +0F91B612FCB9FCA5D8000701FCC9FCB3B3A4F01F80AF183F6D170081A2187E6D7F18FE6D +6E5B6E4A5AEEC0036E6D485A6E9038F80FE0020790B55A6E5D02004AC7FC031F13F80301 +13C0396E7DEC47>116 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fk ecsl1095 10.95 23 +/Fk 23 86 df<121E127FEAFF80A413005A123C0909778819>46 +D<153015F014011407143F903803FFE0137FEBFFCFEBFC0F1300141F15C0A5143F1580A5 +147F1500A55C5CA513015CA513035CA513075CA5130F5CA3131F497EB612F8A31D3D78BC +2D>49 D<EC01FE91380FFFE0023F13F89138FC07FC903901E001FE9039038000FF49C7EA +7F80010EEC3FC05B49EC1FE0133013700160140F13FE7FA25A161FA3EA00FC0130EC3FC0 +90C8FC167F1780EEFF00A24B5A5E4B5A4B5A4B5A4B5A5E4BC7FC157E5D4A5AEC03E04A5A +4A5A021EC8FC147C5C495A49481306D907805B49C7FC131E495C5B01E014384848143048 +48147048B612F05A003F5D5AB7FC5EA22B3D7CBC2D>I<EC07FC91383FFF8091B512E090 +3903F80FF09039078003F890390E0001FC4914FE491300017E14FFEB7F8013FFA56D485A +013C14FE90C7FCED03FCA2ED07F816F0ED0FE0ED1FC0ED3F80ED7F0015FCEC07F0903803 +FFC015F090380001FCEC007FED3F8016C0151F16E0ED0FF0A316F8A4120EEA3F80486C13 +1F16F012FFA2153F16E05B48C7EA7FC000E015800060ECFF0000705B6C5C003C495A001F +EB0FF0390FE03FE00003B51280C649C7FCEB1FF0283F7ABC2D>I<160C161C163C167C16 +FCED01F8A215031507150F151FED3FF01537156715C7EC018714039138070FE01406140C +1418143014709138E01FC014C0EB0180EB03001306130E49EB3F8013185B5B5B12014848 +EB7F0090C7FC12065A5A12384814FE1260B8FCA3C73801FE00A25DA41403A25DA314074A +7E0107B512F8A3283E7BBD2D>I<17C04C7EA21603A2160783160FA2161FA24C7EA21667 +A216C7A292380187FC1683ED0303A2150683ED0C01A21518A203307F1570ED600015E05D +14014B804AC7127FA21406A24A81173F5C021FB6FC5CA20260C7EA3FE0171F5CA2495A84 +49C8120FA21306130E010C82131C011815071338137801F882487ED807FEED1FFEB500C0 +0103B512FC4C14F8A23E417DC044>65 D<011FB7FC4916F018FC903B007FE00003FE023F +913800FF80F07FC04B143FF01FE019F0180FA2027F16F85DA502FF16F092C8121F19E018 +3F19C0F07F8049EEFF004A4A5A4D5AEF0FF0EF3FE04CB4C7FC49B612F8EFFF8002FCC7EA +1FE0EF07F0EF03FC717E13074A6E7E1980187FA219C0130F5CA5011FEEFF805C19005F4D +5AA2013F4B5A4A4A5A4D5AEF7FE0017FEDFF8001FF020790C7FC007F90B612FC17F0B8C8 +FC3D3E7DBD40>I<4BB46C1370031F13F0037F01FC13E0913A03FF803E01913A0FF8000F +83DA1FE0EB03C7DA7F80EB01EF4AC8FCD903FCED7FC04948153F495A4948151F495A4948 +150F01FF178091C91207485A12035B485A000F180084485AA248485EA295C7FC485AA412 +FF5BA790CCFCA21818183818307FA2007F1770186018E0003F5F6D1501606C6C15034DC7 +FC6C6C150E12076C6C5D6D15786C6C5D6C6C4A5AD93FC0EB07806D6C011FC8FCD907FE13 +FC0101B512F06D6C13C0DA07FEC9FC3C4276BF41>I<011FB7FC4916E018F8903B007FE0 +0007FE023FEC00FFF03FC04B6E7E180F727E727E85027F15014B6E7EA28585A202FF1780 +92C9FCA54918C05CA41A8013034A16FFA41A0013074A5DA261A24E5A130F4A4B5AA26118 +0F61011F4C5A4A153F614EC7FC18FE4D5A013F4B5A4A4A5AEF1FE0EF7F80017F4A48C8FC +01FFEC0FFC007F90B612F01780B700FCC9FC423E7DBD45>I<011FB812F05BA29026007F +E0C7127F023F150F18034B14011800A31970147F4B1560A502FF146092C7FCA3190017E0 +495D4A1301A21607161F91B6FC495DA29138FC003F160F16071603010792C8FC5CA21960 +19E019C0010F14064A90C712011980A218031900011F5E5C180EA2181E181C013F163C4A +157C4D5A1703017F150F01FFEDFFF0007F90B7FCA2B95A3C3E7DBD3D>I<011FB812E05B +A29026007FE0C7FC023F151F18074B14031801A31800147F4B15C0A514FF92C71260A319 +0017E0495D5C160116031607161F49B65AA39138FC003F160F1607010792C8FC4A7FA501 +0F14065C93C9FCA4131F5CA5133F5CA3137F497E007FEBFFF0A2B6FC3B3E7DBD3B>I<4B +B46C1370031F13F0037F01FC13E0913A03FF803E01913A0FF8000F83DA1FE0EB03C7DA7F +80EB01EF4AC8FCD903FCED7FC04948153F495A4948151F495A4948150F01FF178091C912 +07485A12035B485A000F180084485AA248485EA295C7FC485AA412FF5BA6043FB512E090 +C8FCA29339001FFC00715AA26D5EA2127FA2171F6C7E60A26C7EA26C6C153F12076C6C4B +5A7F6C6C15FF6C6CEC01CFD93FC0EB0787D91FF0EB1F07D907FE9038FC03800101B5EAF0 +016D6C01C0C8FCDA07FEC9FC3C4276BF47>I<013FB5D8F007B512FEA39026007FF0C738 +0FFE006E486E5AA24B5DA4180F147F4B5DA4181F14FF92C85BA4183F5B4A5EA491B8FC5B +6102FCC8127FA318FF13074A93C7FCA45F130F4A5DA41703131F4A5DA41707133F4A5DA3 +017F150F496C4A7E007F9026FFC00FB512F8B65BA2473E7DBD44>I<013FB512F0A39039 +007FF0006E5AA25DA5147F5DA514FF92C7FCA55B5CA513035CA513075CA5130F5CA5131F +5CA5133F5CA3137F497EB612E05DA2243E7DBD21>I<011FB512FC5BA29026007FF8C8FC +EC3FE0A25DA5147F5DA514FF92C9FCA55B5CA513035CA513075CA21830A21860130F5CA2 +18C0A3011F15014A15801703A21707EF0F00013F5D4A5C5F17FE017F140301FF143F007F +90B6FC5FB8FC343E7DBD38>76 D<90263FFFE0933807FFFC6F5EA2D9007F94381BFC0002 +3FEF1FF8DA3BF816370233601A67A2DA31FC16C7F1018F147102619338030FE0A2DA60FE +1506A2F10C1F14E0DAC07F03185B1930A219601A3F01016D6C14C0028060F00180F00300 +6F7E0606137F130302004B91C7FC6F7E60A24E5B495E01066D6C5D60A24D5ADB03F81401 +010EED0300010C03065CA26F6C5AA24D1303131C01184B5CED00FE5F5F19070138EC7F80 +013060013892C7FC137801FC027E140FD807FF023C4A7E007F01F0030FB512F0B502385B +1618563E7DBD53>I<90263FFFF091381FFFFEA281D9003F030013C06E6CED3F00023F16 +3CDA33FE151C1918EC31FFA202306D143814709126607FC01430A26F7EA26F6C147014E0 +4A6C6C1460A26F7E15037014E00101130102806D5C6F7FA2707E18010103EC3FE091C75D +EE1FF0A2EE0FF8180349EC07FC010694C7FCEE03FEA2EE01FF60010E6E1387010C1686EF +7FC6A2EF3FE618EE011CED1FFE01185E170FA217071703133801306F5A13380178150013 +FCD807FF1678007F13F0B51630A2473E7DBD44>I<ED03FF033F13F09238FE01FC913907 +F0007FDA0FC0EB1F80023FC76C7E027EEC07F0D901F86E7E4948140149486E7E49488101 +1F167F495A49C9EA3F805B4917C0485A0003171F4917E01207485AA2121F5B19F0123F5B +A2127FA219E04848163FA5F07FC0A490CAEAFF80A219005F6D5EA24D5A127F4D5AA26C6C +4B5A4D5A001F5F4D5A6C6C157F4DC7FC6C6C5D6C6CEC01F80001ED07F06C6C4A5A017EEC +1F806D6C017FC8FC90390FC001FC903907F80FF00100B51280DA1FF8C9FC3C4276BF46> +I<011FB612FE49EDFFC018F0903B007FE0000FFC023FEC03FEEF00FF4BEC7F80F03FC0A2 +F01FE0A2147F5D19F0A402FFED3FE092C8FCA219C0187F19805B4AEDFF004D5A60EF07F8 +4D5A0103ED3FC04A49B4C7FC91B612FC17E002FCCAFCA213075CA5130F5CA5131F5CA513 +3F5CA3137F497E007FEBFFC0A2B6FC3C3E7DBD3D>I<013FB612F017FF18E0903B007FE0 +003FF8023FEC07FCEF01FE4BEB007F1980F03FC0A2F01FE0147F4B15F0A502FFED3FE092 +C8FCA219C0F07F80A249EEFF004A4A5A4D5AEF07F0EF1FE0EF7F800103DA03FEC7FC91B6 +12F017C09139FC0007F0EE01FC70B4FC01076F7E4A143F84717EA3130F5CA5011F153F5C +A5013F17035CA21907017F1706496C021F130E007FD9FFC0150CB691380FF01C943803F8 +78CBEAFFE0F03F8040407DBD43>82 D<03FF1307020713E0021FEBF80E91397F00FE1ED9 +01FCEB1F3ED903F0EB07BE4948EB03FE49481301494814FC91C8FC49157C133E137E173C +491538A66D1530A26D1500808080EB7FFCECFFC06D13FCEDFF806D14E06D14F80103806D +80D9003F7F1403DA007F1380150715016F13C0167F163FA2161F1218A3160F161F003816 +80A31700003C5D163E007C157E007E157C007F15FC6D495A6D495AD87DE0495AD8F8F8EB +1FC0D8F07F017FC7FC39E01FFFFC010713F048C613C030427BBF32>I<0007B912E0A33C +0FFC001FF0003F01E0160F0180160390C7491301121E001C1700A212180038143F00304B +14C0A35AA2157F485DA3C81600A215FF93C9FCA55C5DA514035DA514075DA5140F5DA514 +1F5DA3143FEC7FF80003B612FE5EA23B3E76BD41>I<B600C090387FFFF8A3000101C0C7 +000313006C49EC00FC18F091C912701860A318E05A495EA417011203495EA41703120749 +93C7FCA45F120F491506A4170E121F49150CA4171C123F491518A3173817301770176000 +1F16E05F16016C6C4A5A160794C8FC6C6C141E6C6C5C00015D6C6C495A017FEB07C09039 +3FC03F8090260FFFFEC9FC010313F89038007FC03D4073BD44>I +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fl ectt1095 10.95 75 +/Fl 75 127 df<121FEA3F80EA7FC0EAFFE0B2EA7FC0B0EA3F80C7FCA8121FEA3F80EA7F +C0EAFFE0A5EA7FC0EA3F80EA1F000B396EB82F>33 D<003C130F007EEB1F80B4EB3FC0A9 +6C1480A7007E131FA8003CEB0F001A1B76B82F>I<90390780078090390FC00FC0A9011F +131F02801380A4003FB612FC4815FEB8FCA36C15FE3A003F003F00A2495B017E137EA901 +FE13FE495BA2007FB612FEB8FCA36C15FE6C15FC3A01F801F800A30003130301F05BA96C +486C5A28387DB72F>I<EB07E0497EEB3FF880497E13FFEBFC7E80EA01F88013F0A55CA2 +147EED1FFF9026F8FE3F13803800F9FCA2EBFBF89026FFF01F1300ED07C0EB7FE0ECC00F +02805BEBFF00151F4892C7FC5A486D5A48143E391FEFC07ED83FC7137CEB87E0D87F0313 +FC6E5A387E01F100FEEBF9F038FC00FBECFFE0147F5D023F130791391F800F806C14C000 +7E133FEC7FE0007F9038FFF81FD83F839038FC3F00D9FFF9B5FC6C01F85B6CEBE07F6C49 +6C5A6C9038800FF83A00FE0003E0293A7EB82F>38 D<143C147EB0003FB612FC4815FEB8 +FCA36C15FEC7007EC7FCB1143C28297DAF2F>43 D<EA07C0EA0FF0EA1FF8123F13FCA213 +FEA2121F120F1207EA007E13FE13FC1201A2EA03F8EA0FF0123FEAFFE013C01380EA7E00 +12380F18708A2F>I<007FB512F8B612FCA46C14F81E0678962F>I<121FEA3F80EA7FC0EA +FFE0A5EA7FC0EA3F80EA1F000B0B6E8A2F>I<16E0ED01F01503A2150716E0150F16C015 +1F1680153F16005D157E15FE5DA214015D14035D14075D140F5D141F5D143F92C7FCA25C +147E14FE5C13015C13035C13075C130F5CA2131F5C133F91C8FC5B137E13FE5B12015B12 +035BA212075B120F5B121F5B123F90C9FC5A127E12FE5AA25A127824477BBE2F>I<EB01 +FE903807FF80011F13E0497F497F90B57E48EB03FE3903FC00FF497F4848EB3F804848EB +1FC049130F001F15E0491307A248C7EA03F0A3007EEC01F8A448EC00FCAD6C1401007E15 +F8A3007F14036C15F0A26D1307001F15E06D130FA26C6CEB1FC0A26C6CEB3F806C6CEB7F +006D5B3901FF03FE6CEBFFFC6D5B6D5B6D5B01071380D901FEC7FC263A7CB82F>I<EB03 +80497EA2130FA2131F133FA2137FEA01FF5A127FB5FCA213CF138FEA7E0F1200B3B0003F +B512F85A15FCA215F8A21E3977B82F>I<EB0FFC90383FFF8090B512E0000314F8488048 +80391FF80FFF263FE0011380903880007F48C7EA3FC0007E141FED0FE000FE140716F07E +1503A3127E1218C8FCA2150716E0150F16C0151FA2ED3F80ED7F005D4A5A4A5A4A5A4A5A +4A5A4A5A4A5A4AC7FC495AEB07FC495A495A495AEB7F8049C8FC485A4848EB01E0D80FF8 +EB03F0485A485A48B6FCB7FCA46C15E024397BB82F>I<EB07FF013F13E048B512F84814 +FE4880481580261FFC0113C09038E0003FD83F80EB1FE06D130716F01503A26C5A6CC7FC +C8FC150716E0150FA2ED1FC0157FEDFF80020F130090380FFFFE495B5DA215FE6D7FD900 +0113809138003FC0ED1FE0ED07F0150316F8150116FC1500A21218127EB4FCA2150116F8 +481403A2007FEC07F06DEB1FE0D83FE0133F3A1FFE01FFC06CB612806C15006C5CC614F8 +013F13E0010390C7FC263A7CB82F>I<EC07F84A7EA2141F143F157C147F147E14FEEB01 +FC14F8130314F01307EB0FE014C0131F1480133FEB7F00137E13FE5B485A12035B12075B +485A121F5B123F90C7FC127E12FEB712FE16FFA46C15FEC8EA7C00AA91387FFFFC91B512 +FEA46E13FC28397DB82F>I<000FB6FC481580A416000180C8FCAEEB83FE90389FFFC090 +B512F08181819038FE03FFD9F000138049133F0180EB1FC0150F6CC713E0C81207A216F0 +1503A4123C127EB4FC150716E0150F5A007EEC1FC0007F143F6DEB7F803A3FC001FF0039 +1FF80FFE90B55A6C5C00035C6C14C06C6C90C7FCEB0FF824397BB72F>I<EC1FE0ECFFFC +010313FF010F14805B4914C090387FF03F9039FF800FE03901FE001F485A485A5B4848EB +0FC049EB0780001F91C7FC5B123F90C9FC5AA2007E1310903807FF80011F13E0D8FE7F13 +F848B57E00FD80B7FCEBFC019039F0007F8001C0EB3FC049131F90C7EA0FE0A248140716 +F01503A3127EA4127F6C140716E07F001F140F6DEB1FC06C6C133F6DEB7F806C6CEBFF00 +3803FE0390B55A6C5C6C5C013F13E0010F1380D903FEC7FC243A7BB82F>I<1278B712F8 +16FCA416F800FCC7EA07F0ED0FE0ED1FC00078EC3F80C8FCED7F0015FE4A5A5D14034A5A +5D140F5D141F5D143F92C7FC5C147E14FE5CA213015CA2495AA313075CA3130F5CA5131F +5CAA6DC8FC263A7CB82F>I<EB03FF011F13E0017F13F848B512FE4880481580260FFE01 +13C03A1FF0003FE049131FD83F80EB07F0A248C7EA03F8007E1401A5007F14036C15F06D +13076C6CEB0FE06C6CEB1FC001F8137F3A03FF03FF006CEBFFFE6C6C13F8011F13E0497F +90B512FC000314FF2607FC001380D80FF0EB3FC0D81FC0EB0FE04848EB07F090C7120348 +15F8007E140100FE15FC481400A66C1401007E15F8007F14036D13076C6CEB0FF06C6CEB +1FE06D133F3A0FFE01FFC06CB612806C15006C5C6C6C13F8011F13E0010390C7FC263A7C +B82F>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F00C7FCB1121FEA3F80EA7FC0 +EAFFE0A5EA7FC0EA3F80EA1F000B276EA62F>58 D<EA07C0EA0FE0EA1FF0EA3FF8A5EA1F +F0EA0FE0EA07C0C7FCB1EA07C0EA0FF0EA1FF8123F13FCA213FEA2121F120F1207EA007E +13FE13FC1201A2EA03F8EA0FF0123FEAFFE013C01380EA7E0012380F3470A62F>I<1640 +ED01E0ED07F0150F153FED7FE0913801FFC04A1300EC0FFEEC1FF8EC7FF0ECFFC001035B +4948C7FCEB1FFCEB3FF0EBFFE0481380000790C8FCEA0FFCEA3FF8EA7FE0485A90C9FC13 +C06C7EEA3FF8EA0FFC6CB4FC00017F6C13E0EB3FF0EB1FFCEB07FE6D6C7E01007FEC7FF0 +EC1FF8EC0FFEEC03FF6E13C09138007FE0ED3FF0150F1507ED01E0ED0040242F7BB22F> +I<003FB612FC4815FEB8FCA36C15FECAFCA9007FB612FEB8FCA36C15FE6C15FC28157DA5 +2F>I<1230127812FE7E13C06C7EEA3FF8EA0FFC6CB4FC00017F6C13E0EB3FF0EB1FFCEB +07FE6D6C7E01007FEC7FF0EC1FF8EC0FFEEC03FF6E13C09138007FE0ED3FF0150F153FED +7FE0913801FFC04A1300EC0FFEEC1FF8EC7FF0ECFFC001035B4948C7FCEB1FFCEB3FF0EB +FFE0481380000790C8FCEA0FFCEA3FF8EA7FE0485A90C9FC5A12781230242F7BB22F>I< +EB1FFF90B512F0000314FC000F14FF4815804815C0387FF001903980003FE000FEC7120F +ED07F06C1403A3007E1407ED0FE0C8121FED7FC0EC01FF4A1380020F1300EC1FFCEC3FF0 +4A5A15804AC7FC495AA2495A5CA213075CA7130390C9FCA9EB01C0EB07F0A2497EA36D5A +A2EB01C024397BB82F>I<143F4A7EA24A7EA4903801F3E0A501037FA314E101077FA414 +C0010F7FA490381F807EA4013F137F4A7EA4017E6D7EA2017FB5FCA290B67EA49038FC00 +0F48486D7EA4000381491303A3D87FFF90383FFF80A2B56C4813C0A26C496C1380A22A39 +7EB82F>65 D<007FB512E0B612FC15FF168016C06C15E03A03F0001FF0150FED03F8A215 +0116FC1500A5150116F8150316F01507ED1FE0ED7FC090B61280160015FC15FF16C016E0 +9039F0000FF0ED03F8ED01FC150016FE167EA2163FA6167F167E16FEA2ED01FC1507ED1F +F8007FB6FCB712F016E0168016006C14F828387EB72F>I<91387F8038903903FFE07C01 +0FEBF8FC4913FC4913FF5BEBFFC048EB003F4848130FEA07F849130748481303A2484813 +015B123F90C8FCA25A127E1678160012FE5AAC7E127EA21678007F15FC7EA27F121F6D13 +016C6C14F86D130312076DEB07F0D803FE130F6C6CEB1FE06C9038C07FC06DB512806D14 +006D5B6D5B010313F09038007F80263A7CB82F>I<007FB57EB612F015FC81816C812607 +E0017F9138003FE0151F6F7E6F7E15036F7EA26F7EA2167E167F82A41780161FAB163F17 +00A35E167EA216FE4B5AA24B5A15074B5A151F4B5A4AB45A007FB65AB7C7FC5D5D15F06C +148029387EB72F>I<007FB612FCB77EA47ED803F0C7127EA7163C93C7FCA515F04A7EA4 +90B5FCA6EBF001A46E5A92C8FCA5160FEE1F80A9007FB7FCB8FCA46C160029387DB72F> +I<007FB612FEB8FCA47ED803F0C7123FA7161E1600A6157815FCA490B5FCA6EBF000A415 +7892C7FCAE387FFFE0B57EA46C5B28387DB72F>I<02FE13E0903907FFC1F04913F3013F +13FB4913FF90B6FC4813813903FE007F49133F4848131F485A49130F485A15075B123F90 +C712035AA2127EED01E092C7FC12FE5AA9EDFFFE4A13FFA27E127E6E13FEED03F0127F15 +077E7F121F6D130FA26C7E6D131F6C6C133F6C7E6D137F3901FF81FF6C90B5FC7F6D13FB +010F13E36DEBC1E0D900FEC7FC283A7DB82F>I<3B7FFF807FFF80A2B56CB512C0A26C49 +6C1380A23B03F00003F000B290B6FCA69038F00003B3A23B7FFF807FFF80A2B56CB512C0 +A26C496C1380A22A387EB72F>I<007FB512FEB7FCA46C14FE390007E000B3B3A8007FB5 +12FEB7FCA46C14FE203879B72F>I<387FFFF080B5FCA27E5CD801F8C8FCB3B0161E163F +A9007FB7FCA2B8FCA27E16FE28387DB72F>76 D<D87FF0ECFFE06D5B00FF16F06D5B007F +16E0A2D807DE903807BE00A301DF130F01CF143EA2EC801FA201C7131EA2ECC03EA201C3 +133CECE07CA201C11378ECF0F8A301C013F014F9A2EC79E0A3EC3FC0A3EC1F80A2EC0F00 +91C7FCADD87FFC903803FFE0A2486C4913F0A26C486D13E0A22C387FB72F>I<D87FF890 +383FFF807F00FF4A13C07F007F6E1380A2D803EF903801F000A2148013E7A214C013E3A2 +14E0A213E114F0A213E014F8A21478147CA2143EA3141FA3EC0F81A2140715C1A2140315 +E1A2140115F1A21400A215F91579A2157D153DA2D87FFF131FA2B51280150F6C13006F5A +2A387EB72F>I<90383FFFC00003B512FC488048804815804815C0EBF00001C0133F4848 +EB1FE090C7120F007E1407A400FE15F0481403B3A96C1407A2007E15E0A3007F140FA26D +131F6C6CEB3FC09038F801FF90B6FC6C15806C15006C5C6C5CD8003F13C0243A7BB82F> +I<007FB512E0B612F815FEEDFF8016C06C15E03A03F0007FF0151FED07F81503ED01FCA2 +150016FE167EA616FE16FC1501A2ED03F81507ED1FF0157F90B612E016C01680EDFE0015 +F815E001F0C8FCB0387FFF80B57EA46C5B27387DB72F>I<387FFFFEECFFC0B612F015FC +6C80812603F0037F9138007FC0153F6F7E150F1507821503A515075E150F151F4B5A157F +913803FF8090B6C7FC5D5D5D81819038F003FF9138007F80153F151F82150FA9EEC1E0EE +C3F0A316E33A7FFF8007E7EEFFE0B512C06F13C06C497E6F1380C9EA3E002C397EB72F> +82 D<90391FF8038090397FFF07C048B512C74814EF4814FF5A381FF80F383FC00349C6 +FC48C7127F007E143F12FE48141FA2150FA46CEC0780007E91C7FC127F6C7E7FEA1FF86C +B47E6C13F86CEBFF806C14E06C6C13F8010F7F01007FEC0FFF02001380ED3FC0151FED0F +E01507A216F00078140312FCA56C140716E06C140F7F6DEB1FC001F0137F9039FE01FF80 +90B612005D00FD5CD8F87F5B011F13E0D8700390C7FC243A7BB82F>I<007FB71280B812 +C0A53AFC003F000FA70078ED0780C791C7FCB3B290381FFFFE497FA46D5B2A387EB72F> +I<3B7FFF801FFFE0B56C4813F0A46C496C13E0D803F0C7EAFC00B3B16D1301A200015DA2 +6D13036C6C495AA2017F495AEC801F90393FE07FC06DB55A6D91C7FC6D5B6D5B010013F0 +EC3FC02C397FB72F>I<D87FF8903801FFE0486C4913F0A46C486D13E0001FC8EA0F806D +141F000F1600A76C6C143EA7EC1F806C6C486C5AA4EC7FE01479A3000115789039F0F9F0 +F8A414F001F113F800005DA39038F9E079A201FB137DA390397BC03DE0A4017F133FEC80 +1FA3013F5CEC000F011E6D5A2C397FB72F>87 D<D83FFFEBFFFC02817F5AA27E02005BD8 +01FCEB1F806C6C133F93C7FC017F5B157E90383F80FE5DEB1FC1010F5B14E301075B14F7 +01035B14FF6D5BA26D5BA26EC8FCA44A7EA2497FA2497F14F7ECF3F0EB07E3ECE1F8EB0F +C181EB1F808190383F007E157F017E7F8201FE131F49800001140F498000036E7ED87FFE +90381FFF806D5BB515C0A26C1680497F2A387EB72F>I<007FB612E0A2B712F0A36C15E0 +A224077B7D2F>95 D<EB7FF03803FFFE486D7E4880488048809038C01FF8EC03FC14016E +7E6C48137E6CC7127FC87EA4EC7FFF0107B5FC133F48B6FC120748EBF83F381FFE00EA3F +F0EA7FC090C7FC12FE5AA45D7E007F5CD980037F263FE01F13FF90B712807E6C14DF6C14 +0F0001D9FC01130026007FE0C8FC292A7BA82F>97 D<EA7FF0487EA4127F1201AAEC0FF0 +EC3FFC91B5FC01FB14C090B67E82ECF03F9138C00FF891388003FCEC0001496D7E5B167F +4980A21780161FA8163FA26D15005EA26D14FEA26D495AEC80076E485A9138F03FF091B5 +5A5E01FB5C01F991C7FC3900F07FFC9038001FE029397EB72F>I<903803FFC0010F13F8 +013F7F90B57E488048158048EB007FEA0FF85B485A49EB3F004848131E90C9FC5A127EA2 +12FE5AA87E127EA2127FED07806C6CEB0FC07F6C6C131F6D1480D80FFC137F3A07FF81FF +006C90B5FC6C5C6C5C013F13F0010F13C0D903FEC7FC222A79A82F>I<913803FF804A7F +A480EC000FAAEB03FCEB1FFF017F13CF90B512EF4814FF5A3807FE07380FF801391FF000 +7F01C0133F485A151F48C7FC150F127E12FEA25AA87E007E141FA2127F6C6C133F157F6C +7E6D13FF380FF8012607FE0713FF90B712806C14EF6C14CF6C6C138F90261FFE071300D9 +07F8C8FC29397DB72F>I<EB03FE90380FFF80013F13E090B57E488048803907FE07FE39 +0FF800FF497FD81FC0EB3F80003F141F4914C090C7120F5A127E16E000FE14075AB7FCA5 +16C000FCC9FC7E127EA2127F6C6CEB03C0ED07E06C7E6D130FD80FF8EB1FC0D807FE133F +9039FF80FF806C90B5FC6C15006C6C13FC6D5B010F13E0010190C7FC232A7BA82F>I<4A +B4FC020713C0021F13E0147F91B512F0A249130FEB03FC9138F807E0903907F001804AC7 +FCA8007FB61280B712C0A46C1580260007E0C7FCB3A9003FB512FC4880A46C5C24397DB8 +2F>I<903903F801FE903A1FFF07FF80017F13DF90B712C05A5AD9FE0FEB0F803B07F803 +FC070048486C6CC7FCEBE00049137E001F147F497FA66D5B000F147E6D13FEEBF0016C6C +485A3903FE0FF890B5FC485C5D485C019F90C8FCEB83F80180C9FCA37FEA07E490B512F0 +6C14FF4815C0488148813A3FC0001FF890C7EA01FC007E6E7E007C157E00FC153E48153F +82A46C5D007C153E007F15FE6C6C495A01E01307D81FFEEB7FF86CB65A6C5D000115806C +92C7FC011F13F8010313C02A3E7DA72F>I<EA7FF0487EA4127F1201AAEC0FF0EC3FFCEC +FFFE01FB7F90B67EA29138F03FC0ECC01F4A6C7E14004913075BA35BB3A23B7FFFE07FFF +80B56CB512C0A46C496C13802A387EB72F>I<EB0380EB0FE0A2497EA36D5AA2EB038090 +C9FCA9383FFFE0487FA47EEA0003B3A9007FB6FCB7FC1680A216007E213979B82F>I<EC +0380EC0FE0A2EC1FF0A3EC0FE0A2EC038091C7FCA990B512E015F05AA27EA2EB0003B3B3 +A5140715E0007E130F15C0B4131FEC3F8014FF90B512006C5B5C6C5B000F13E000011380 +1C4E7CB82F>I<EA7FF0487EA4127F1200AB0207B5FC5C1780A21700809138003F804BC7 +FC15FE4A5A4A5A4A5A4A5A4A5A4A5A4AC8FC5C01F97F13FB90B57EECE7E0ECC7F01483EC +01F8496C7E497F49137E816F7EA26F7E6F7E823B7FFFF03FFFC0B56C5A17E0A217C06C49 +7E2B387EB72F>I<387FFFF080B5FCA27EA2EA0001B3B3A8007FB612E0A2B712F0A26C15 +E0A224387BB72F>I<903901F801F83A7F8FFC0FFC3AFFDFFE1FFE90B5487E92B51280A2 +3A7FFE1FFE1F3B07FC0FFC0FC001F813F89039F007F00701E013E0A301C013C0B3A33B7F +FC3FFC3FFCD8FFFE01FE13FE027F137FA2023F133FD87FFC01FC13FC2F2880A72F>I<EC +0FF0397FF03FFC486CB47E01FB7F90B67EA26C9038F03FC00001EBC01F4A6C7E14004913 +075BA35BB3A23B7FFFE07FFF80B56CB512C0A46C496C13802A287EA72F>I<EB03FC9038 +1FFF80497F90B512F0488048803907FE07FE390FF801FF9038E0007F4848EB3F8049131F +003F15C090C7120F4815E0007E1407A248EC03F0A96C1407007E15E0A2007F140FA26C6C +EB1FC0A26C6CEB3F806D137F3A0FF801FF003907FE07FE6CB55A6C5C6C5C6D5B011F1380 +D903FCC7FC242A7BA82F>I<EC0FF0397FF03FFC486CB5FC01FB14C090B67E826CEBF03F +00019038C00FF891388003FCEC0001496D7E5B167F4980A21780161FA8163FA26D15005E +A26D14FEA26D495AEC80076E485A9138F03FF091B55A5E01FB5C01F991C7FC9038F87FFC +EC1FE091C9FCAD387FFFE0B57EA46C5B293C7EA72F>I<903903FE01E090390FFF83F001 +3F13E390B512F34814FB4814FF481303380FFC0001F0133F4848131F485A49130F48C712 +07A2127E150312FE5AA77E1507127E127F150F6C7E151F6C6C133F01F0137F6C6C13FF38 +07FE036CB6FC6C14FB6C14F36D13C3011F1303EB03FC90C7FCAD4AB512E0A24A14F0A26E +14E0A22C3C7DA72F>I<ED0FF0D87FFFEB7FFE0281B5FCB51287028F14806C139F9138BF +F87F39001FFFC09238003F004A131E4A90C7FC5C5CA25C5CA45CAF007FB512F881B6FCA2 +7E5D29287EA72F>I<90381FFC0E48B5129F000714FF5A5A5A387FF007EB800000FEC77E +A24880A37E007F141E01C090C7FCEA3FFC381FFFF06CEBFF80000314E0C614F8011F13FE +9038007FFF02011380EC007F0078EC1FC000FC140FED07E0A27EA27E6D130F6DEB1FC06D +133F9039FC01FF8090B6FC16005D00F814F8013F13E0D8700790C7FC232A7AA82F>I<13 +0F497EAA007FB612C0B712E0A46C15C026001F80C7FCB216F0ED01F8A5ECC003ED07F090 +380FE00F9138F81FE06DB512C0A26D14806DEBFE009038007FF8EC1FE025337EB12F>I< +3A7FF001FFC0486C487FA4007F7F0001EB0007B3A4150FA2151F153F6D137F6CB448B512 +8091B612C07FA26D13E7010F01831380D903FEC8FC2A287EA62F>I<D87FFF90383FFF80 +B56C4813C0A46C496C1380D801F0903803E000A26D130700005DA26D130F017C5CA36D49 +C7FCA36D133EA36D6C5AA36D6C5AA3903803E1F0A3903801F3E0A36DB45AA36E5AA26EC8 +FC2A277EA62F>I<3B7FFF801FFFE06E5AB515F0A26C16E04A7ED807C0C7EA3E00A36D14 +7E0003157CA56C6C5CEC0F80EC1FC0EC3FE0A36C6C486C5AEC7DF1A214FD15F914F9D978 +F85B1379137DA2ECF079157B013FEB7FC014E0153FA2ECC01F6D486C5A2C277FA62F>I< +3A3FFF80FFFE4801C17FA46C01805B27007E001FC7FC6D5B157E6D6C5AEB0FC0903807C1 +F8ECE3F0903803F3E0EB01FF6D5B5D6EC8FC80A25C4A7E81903801F3E0903803E3F0EB07 +E1ECC0F849487E011F137E90383F003E013E7F017E80496D7E3B7FFF807FFF806EB5FCB5 +15C0A26C16804A7E2A277EA62F>I<3B7FFF803FFF80B54913C014C0A214806C6E13803B +01F00003E0007F12004B5A7F137C017E495A133EA2013F49C7FC7FA290380F803EA214C0 +01075BA214E001035BA2EB01F05D14F1EB00F95DA2147BEC7FC0143FA25D141FA292C8FC +A3143EA35CA214FC000F5BEA1F81EA3FC1EBC3F0EB07E0131FEBFFC06C5BA26C48C9FC6C +5AEA03F02A3C7EA62F>I<003FB612F84815FCA416F8007EC7EA0FF0ED1FE0ED3FC0ED7F +80EDFF00003C495AC7485A4A5A4A5A4A5A4A5A4A5A4AC7FC495A495A495A495A495A495A +495A49C7123C4848147E485A485A485A485A485A48B612FEB7FCA46C15FC27277DA62F> +I<ED3FE0913803FFF0140F5C147F16E09138FFE0004AC7FC495A5CB3A21303495A133F38 +3FFFE0B55A5C49C8FC6D7E80003F7F38003FF013076D7E1301B3A2806D7EECFFE091387F +FFE016F0141F8014039138003FE024477BBE2F>I<127CA212FEB3B3B3AD127CA207476C +BE2F>I<EA7FC0EAFFFC13FF8014E07EC66C7E13076D7E1301B3A2806D7EECFFC091387F +FFC06E13F0801407141F5C4A13C09138FFC0004AC7FC495A5CB3A21303495A137F387FFF +E0B5FC148091C8FC13FCEA7FC024477BBE2F>I<D801FC1307D807FFEB0F80489038C01F +C048EBF03F48EBFEFF4890B51280D8FFDF140001035B48C65B007CEB3FF80038EB0FE022 +0B7AB72F>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fm ecbx1095 10.95 38 +/Fm 38 119 df<B912E0A33303809934>21 D<ED7FF891380FFFFE027F6D7E903A01FFC0 +1FC0903A07FE0003E0D91FFC497ED93FF0EB1FF84948133FA2495A4C7E48496D5AA3705A +705AEE038093C8FCA6923803FFFCB8FCA40001903880000FB3AE007FD9FE03B512F0A434 +407EBF3A>28 D<EA0F80EA3FE0EA7FF013F8EAFFFCA313FEA3127FA2123FEA0FCEEA000E +A2131E131CA2133C13381378A213F0A2EA01E0EA03C01207EA0F80EA1F00121E120C0F20 +79BE1D>39 D<EA0780EA1FE0EA3FF0EA7FF8EAFFFCA6EA7FF8EA3FF0EA1FE0EA07800E0E +798D1D>46 D<140F5C147F495A130F48B5FCB6FCA213F7EAFE071200B3B3AA003FB612F8 +A4253C79BB34>49 D<903803FF80013F13F890B512FE00036E7E2607F80F7F260FC00113 +F048486C7F48C76C7ED87FC06D7E7F486C6D7E7FA26F1380A46C5AA2EA1FC00007C7FCC8 +14005DA25E153F5E4B5A5E4B5A4A5B5E4A90C7FC4A5AEC0FF84A5A5DEC3F804AC8FC14FE +D901F8EB0780495A495A4948EB0F00495A013EC7FC5B495C485A90B7FC485D5A5A5A5A5A +B7FC5EA3293C7BBB34>I<ECFFE0010F13FC013FEBFF80D9FF0113E03A01F8007FF0D803 +E06D7E484880D80FF06D7E13FC486C80A47F5BA2120F6C485CD803F0133FC85BA24B5A5E +4B5A4A5B4A90C7FCEC0FFC903807FFF05D15FE90390001FF809138007FE0ED3FF86F7E82 +6F7E17806F13C0A3D8078015E0EA1FE0EA7FF8A2487EA417C0A2495B007F1680491500D8 +3FC05B001F4A5AD80FF0495A3A07FE01FFF06CB65AC61580011F01FCC7FC010113C02B3D +7CBB34>I<ED01F0A215031507150F151FA2153F157F15FFA25C5C5CEC0FBF153F141E14 +3C147C147814F0EB01E0130314C0EB0780EB0F005B133E133C5B5B12015B485A485A120F +48C7FC121E5A5A12F8B812F8A4C8387FF000AB49B612F8A42D3C7DBB34>I<000E1518D8 +0FC014F801FC131F90B65AA25E5E5E93C7FC15FC5D15E092C8FC14F80180C9FCA9903881 +FFC0018F13F801BF13FE9039FF01FF809039F8007FE001E06D7E4980496D7E6CC7FCC87F +150F82A31780A2120FEA3FC0487E487EA41700A25B6C48495A5B007CC75B6C143F003F5D +6C6C495AD80FE0495A2607FC075B0001B6C7FC6C14FC013F13F0010790C8FC293D7BBB34 +>I<121E121F13F090B712F0A35A17E017C0178017005EA2485D007CC7EA01F84B5A0078 +4A5A5E150F4B5A484AC7FC157E5DC85A14014A5A4A5AA24A5A141F5D143FA24AC8FCA25C +A2495AA21303A313075CA2130FA5131FAA6D5A6D5A6D5A2C3F7ABD34>55 +D<ECFFE0010F13FC013F13FF90397FC07FC04848C66C7E48486D7E00076E7E484880001F +1407003F814980007F80A2178012FFA217C0A517E0A5007F5CA3123F5D6C7E000F5C6C7E +0003143B3901FF807B39007FFFF3011F13C30107018313C090C71203A317805DA2D807F0 +1500487E486C5C150F5EA24B5A4B5A49495A6C48495AD9C0015B2607F80790C7FC6CB512 +FC6C14F06C6C13C0D90FFCC8FC2B3D7CBB34>57 D<EA0780EA1FE0EA3FF0EA7FF8EAFFFC +A6EA7FF8EA3FF0EA1FE0EA0780C7FCACEA0780EA1FE0EA3FF0EA7FF8EAFFFCA6EA7FF8EA +3FF0EA1FE0EA07800E2879A71D>I<16F84B7EA24B7EA34B7EA24B7FA34B7FA24B7FA34B +7F157D03FD7F15F8A2020180EDF07F020380EDE03FA2DA07C07F82020F814B7E021F8115 +00824A81023E7F027E81147C8202FC814A7F0101825C91B7FC4982A2498202C0C7123F83 +010F834A80011F8391C8FC834983013E81017E83137C83D801FE83B500FC49B612F8A445 +3F7CBE4E>65 D<B812F8EFFF8018F018FC26003FFCC7EA3FFEEF0FFF7113807113C019E0 +8319F0A27113F8A74D13F0A34D13E019C04D13804D13004D5AEFFFF891B712E095C7FC18 +F002FCC7EA3FFE943807FF807113C07113E07113F0F07FF819FCA2F03FFEA219FFA819FE +A2187F19FCF0FFF85F4D13F04D13E0053F13C0BA120018FC18F095C7FC403E7DBD4A>I< +922607FF80131C92B500F8133C020702FE137C023F9138FF80FC91B538003FE1010301F0 +EB07F74901C0EB01FF011F90C8FCD93FFC153F4948151F495A4849150F48170748491503 +5C48170191C9FC481700A2485AA2197C127FA2491700A212FFAC127FA27F193C123FA36C +7E197C6C1878806C18F86E16F06C6D15016CEF03E06C6DED07C06D6C150FD93FFEED1F80 +6D6CED3F00010701C014FE6D01F0EB03F8010001FFEB1FF0023F90B512C0020792C7FC02 +0014F8030713803E407ABE4B>I<B812F8EFFF8018F018FC26003FFEC76CB4FC050F13C0 +05037F05007FF03FF8727E727E85721380841AC0A27213E0A21AF084A21AF8A41AFCAD1A +F8A41AF0A2601AE0A24E13C0A24E13801A00604E5A4E5AF0FFF84D13E0050F5B057F5BB9 +48C7FC18F818C005F8C8FC463E7DBD50>I<B71280A426003FFEC7FCB3B3B2B71280A421 +3E7DBD27>73 D<B500FE051FB512E06E5FA26F5ED8003FF28000A2013D6D16F7A2013C6D +ED01E7A26E6CED03C7A26E6CED0787A36E6CED0F07A26E6C151EA26E6C153CA26E6D1478 +A36E6D14F0A26E6DEB01E0A26F6CEB03C0A26F6CEB0780A36F6CEB0F00A26F6C131EA26F +6C5BA26F6D5AA36F6D5AA26FEBE1E0A293387FF3C0A270B45AA37090C7FCA2705AA2705A +A2017E6E5AB6041FB612E0A2705A705A5B3E7DBD62>77 D<B500FE033FB5FC8081A2C66C +6D9138003F006F151E81017B7F01797F8113786E7E6E7F6E7F6E7F82806E7F6E7F6E7F6F +7E6F7F83816F7F6F7F6F7F6F7F8381707E7013807013C07013E07013F018F8827013FC70 +13FEEF7FFF71139E19DE7113FE8383838383A2187F183F181F180F1807A21803180101FC +1600B500FC167E193E191EA2483E7CBD51>I<B812F017FF18E018F828003FFE00017F93 +38003FFE94380FFF80837113C019E0A27113F0A319F8A719F0A34D13E0A219C04D13804D +1300EF3FFE4CB45A91B712F018C005FCC7FC4ACAFCB3A6B77EA43D3E7DBD47>80 +D<003FB912F8A4903BFC007FFC007F01E0160FD87F80EE03FC90C71501007E1700A2007C +187CA20078183CA548181EA5C81600B3B1011FB712F0A43F3D7CBC48>84 +D<903807FF80013F13F048B512FC3903FC03FF2607E00013C0D80FF86D7E001F6E7E7F6F +7EA26F7EA26C5A6C5AEA01C0C8FCA3EC03FF49B5FC130F017F138F3901FFF00F00071380 +481300EA1FFC485A127F5B12FF5BA3151FA26D133F127F6D49B4FC273FFC01F713FC391F +FE07E30007B5128100019038FE007F26001FF890C7FC2E2B7DA932>97 +D<EC7FF00103B5FC011F14C090397FE01FE09039FF8003F0489038000FF8484814FC0007 +141F485A121F5B123FED0FF8007FEC07F049EB01C092C7FC12FFAB127FA27FA2003F151E +7F001F153E000F153C6D147C6C6C14F86C90388001F0C69038C003E090397FF00FC0011F +B51200010713FC9038007FE0272B7DA92E>99 D<EE07F8ED07FFA4ED003F161FB0EC7FE0 +903803FFFC011F13FF90397FF00FDF9039FFC003FF000390C7FC4848147F000F153F4914 +1F121F485AA2127F5BA312FFAA127FA37F123FA2121F6D143F000F157F6C6C14FF6C6C49 +7F6CD98007EBFFE03A007FE01F9F90391FFFFE1F010713F89026007FC0EBE00033407DBE +3A>I<ECFFE0010713FC013F13FFD97FE013803A01FF803FC0489038001FE04848EB0FF0 +484814F8ED07FC485A003FEC03FEA3485A16FFA200FF80A390B7FCA301F0C8FCA5127FA3 +6C7E160F121F6D141F000F151E6C6C143E0003157C6C6C14F86C9038C003F090397FF01F +E0011FB512C00107EBFE009038007FF0282B7DA92F>I<903A03FF8003F0013F9038F81F +FC90B538FE7FFE0003903801FFFC3A07FC007FE1000F15E04848EB3FF0003FEDF87C4901 +1F1300A2007F81A7003F5DA26D133F001F5D6C6C495A00075D9039FF01FF80DAFFFEC7FC +D80F3F13F801031380001ECAFCA2121FA37F7F90B6FC6C15F016FC6C15FF17806C16C017 +E0120F271FC0000113F04848EB001F48C8EA0FF8160712FE1603A46C15076C16F06D140F +6C6CEC1FE06C6CEC3FC0D80FF8ECFF803B03FF800FFE00C690B512F8011F14C0010101FC +C7FC2F3D7DA834>103 D<13FFB5FCA412077EB0ED3FF0EDFFFE02036D7EDA0FC07F9139 +1E007FE04A6D7E5C5C4A6D7E5CA25CA391C7FCB3A5B5D8FC07B512E0A4333F7CBE3A>I< +EA01F8487E487E487E481380A66C13006C5A6C5A6C5AC8FCA913FFB5FCA412077EB3ADB5 +12F8A415407CBF1D>I<13FFB5FCA412077EB3B3B1B512FCA4163F7CBE1D>108 +D<D801FED93FF049B47E00FFDAFFFE010713F002039026FF801F13FCDA0FC09039C07E07 +FE913C1E007FE0F003FF00074990273FF1E0011380000349ECF3C04AECF7806D486DB4C7 +13C04A5CA24A5CA391C75BB3A5B5D8FC07B5D8E03F13FFA450297CA857>I<D801FEEB3F +F000FFECFFFE02036D7EDA0FC07F91391E007FE00007496D7E00035B5C6D486D7E5CA25C +A391C7FCB3A5B5D8FC07B512E0A433297CA83A>I<EC7FF0903803FFFE011FEBFFC09039 +7FE03FF09039FF800FF848496C7E48486D7E48486D7E48486D1380001F16C0A2003F16E0 +49147F007F16F0A400FF16F8AA007F16F0A46C6CECFFE0A2001F16C0000F16806D5B6C6C +4913006C6C495A6C6D485A3A007FE03FF0011FB512C0010791C7FC9038007FF02D2B7DA9 +34>I<01FFEB7FE0B53807FFFC021F13FFDA7F0113C09139F8007FF00007496D7E6C496D +7E02806D7E8391C77E18808218C0A38218E0AA18C05EA34C1380A218006E495A6E131F6E +5C6E495A6EEBFFE0DA7F035B021FB5C7FC020713F8020013C092C9FCADB512FCA4333B7D +A83A>I<3901FE01FC00FF903807FF804A13E091383F1FF0143C00079038783FF8000313 +F014E013FF14C0ED1FF09138800FE0ED038092C7FCA291C8FCB3A4B6FCA425297DA82B> +114 D<90381FF80E48B5123E000714FE380FE007381F800148C7FC007E147E007C143E12 +FC151EA27E7E6D90C7FC13E013FF6C13FCECFF806C14E06C14F86C80000380C680133F01 +031480EB000F020113C000F0EB007F153F6C141FA2150F7EA26C1580151F6C15006D5B01 +E0137E9038F803FC00FCB512F0D8F03F13C026E007FEC7FC222B7DA929>I<EB0780A513 +0FA4131FA3133F137FA213FF5A1207001FEBFFFCB6FCA30001EB8000B3A2151EA96C143C +14C0A290387FE07890383FF0F090381FFFE0010713C0010013001F3B7EB928>I<01FFEC +07F8B5EB07FFA40007EC003F6C151FB3A6163FA3167F6C15FFA26E487F6C913907DFFFE0 +90397FE01F9F90391FFFFE1F010713F8010001E0EBE000332A7CA83A>I<B500F890381F +FFC0A400030180903803F8006CED01E06E13036C5E80017F4A5A80160F013F92C7FC6E5B +011F141E6E133E010F143C6E137C010714786E13F86D5C15816D5C15C16DEBC3C015E315 +E7027F5B15FF6E90C8FCA26E5AA26E5AA26E5AA26E5AA26E5A32287EA737>I +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fn ecbx2488 24.88 24 +/Fn 24 118 df[<96387FFFC0067FB512FC050FB7FC057F16C00403B812F0041FDA8001 +7F047F01F0C7EA1FFE4BB50080EC07FF030749C800017F031F01F86F6C7E4B13E092B548 +923803FFE04A4A150F4A91C9487F4A495E4A494C7F4A4993B5FC5E5C4A5BA291B5484B80 +745CA25B5EA2755B755B755B755BE103FEC8FC98CAFCB30707B612FCBEFCA7D8000102C0 +C97E8787B3B3B3B3A4007FB80107B812F0A7>108 144 123 271 +120 28 D[<F201F8507EA2507EA3507EA3507FA2507FA3507FA397B57EA24F80A34F80A3 +4F80A24F80A34F81A3DF3FBF801A3F4F6C80197EA2DFFE0F8019FC0601828619F806036D +8019F0A206076D8019E0060F6D8061A2061F6E8061A2063F6E8096C7FC4E6E80187EA206 +FE6E8060A205016F806005036F8060A205076F8060A2050F6F8060051F708060A2053F70 +8095C9FC4D8588177E05FE70805FA2040171805F040386885F040771805FA2040F71805F +041F728094BCFCA24C87A34C87A204FECB000F805EA2030173805EA2030373805E030773 +805EA2030F73805EA2031F74805E033F748093CDFCA24B7480157E03FE898A5D02017580 +5DA2020375805D020775805DA2020F75805D141FDA3FF07580010FB512C0B800F00403BA +12F0A7>148 145 121 272 163 65 D[<BE12C01DFF1EF01EFEF6FFC01FF01FFCC70007 +02E0C9000714FFE2007F800B1F14E00B07800B01807780787F787F78807880A278808D8A +8D8A8DA28A8DA38B8DAB699CB5FCA3696669A2545CA2545C545CA2545C5491C7FC545B9B +B55A535C535C5314C00B1F5C0B7F49C8FC52B512F80A0F14E00903B6C9FC94BA12F81E80 +1EF8F6FF801FF005E0CA003F13FE0B076D7E0B0114E0776C13F80C1F13FE787F78807814 +E0788078808D8B797F8D791480A27914C0A222E08B22F0A37914F8A422FCA58BA267A522 +F8A36722F0A26722E0A25514C0A25514806722009CB6FC545C545C545C545C545C0C7F5C +53B65A0B0792C7FC0B3F14FC0A03B65AC112E0208055C8FC1FF01F800CF8C9FC53CAFC> +134 142 121 269 154 I[<97263FFFE017E0071FB616010603B700F01503063F04FC15 +074DB96C140F050F06E0141F053F18F84CB7D8000101FE143F040703C09026000FFF147F +041F02FCC8000101C013FF047F02C06F6C6C5A93B6CA381FF803030302F8943807FC074B +02E0EF03FE031F0280943800FF0F4B91CCEA7F9F4B01FC73B5FC4AB548854A4A19074A02 +C0854A4A854A91CDFC4A49864A498791B54887498A5E494A87494A875B4C874991CFFC8C +495B498A5D90B51E7FA2485C213F485C211FA2485CA248200FA25D5AA22107A2485CA29E +C7FCA25AA492D3FCA3B6FCB3A27EA381A47EA46C80F907E0A37E81A27E210F6C6E1EC0A3 +6C80211F6C6E1E80A26D1F3F6F1E007F6D6D65701C7E6D1FFE70646D1E016D6E515A6D80 +70515A6D1E0F6E6D646E6D515A6E6D515A6E6E1A7F6E6E50C7FC6E02F04F5A6E6E4F5A6E +6C6D4F5A6F01FFF11FF06F02C04E5A03076EF0FFC06F02F84D90C8FC030002FFEF07FE70 +02E0EE1FFC041F02FCEEFFF00407DAFFC002075B040103FF91B51280DC003F92B648C9FC +050F18F8050118E0DD003F94CAFC060316F8DE001F1580DF003F01F0CBFC>131 +146 116 271 156 I[<BE7E1DFEF5FFE01EFCF6FF801FF01FFCC7000702E0C9003F14FF +0A0115C0E2003F14F00B07800B0014FE0C3F7F0C0F807814E00C01807880797F797F0D0F +7F79808E8B798079807A7FA27A7F8E8C7A7FA28F8C8F8C8FA27A80A28F8CA28FA28D8FA4 +8F8DA4A11280A7A112C0A78DA669A7A11280A7A11200A369A26BA36B9EB5FCA26BA2686B +A3565CA2565CA26B68A0C7FC565B686A565B9DB5FC6A555C555C555C5591C8FC67555B55 +13F854B55A545C0C0F5C0C3F5C9BB548C9FC0B035C0B1F14F052B612C00A3F5DC048CAFC +1FF01FC054CBFC1EF053CCFC1D80>146 142 121 269 166 I[<BB12E0A7C7000302F8C8 +FCB3B3B3B3B3B3B3A2BB12E0A7>67 142 122 269 79 73 D[<B800F89BB812F0716571 +65A37165A2C700076FE20FBF49C8FCA303F76EF41F3FA203F36E1C3EA203F16E1C7CA303 +F06E1CF8A2706DF301F0A2706DF303E0A3706DF307C0A2706EF20F80A3706EF21F00A270 +6E1A3EA2706E62A3706E62A2716D4F5AA3716D4F5AA2716D4F5AA2716E4E5AA3716E4EC7 +FCA2716E183EA3716E60A2716E60A2726D4D5AA3726D4D5AA2726D4D5AA2726E4C5AA372 +6E4CC8FCA2726E163EA3726E5EA2726E5EA2736D4B5AA3736D4B5AA2736D4B5AA3736E4A +5AA2736E4AC9FCA2736E143EA3736E5CA2736E5CA2746D495AA3746D495AA2746D495AA3 +746E485AA2746E48CAFCA274ECE03EA3746E5AA2746E5AA375EBFDF0A275EBFFE0A2755C +A3755CA27591CBFCA2755BA3755BA2755BA2EC1FFC0103B500E0715AB96C0807BA12F076 +5AA2765AA3765A>188 142 120 269 205 77 D[<BD12FEF4FFF8F5FF801EF81EFEF6FF +C01FF0C7000702E0C9810A0714FE0A006E7E0B1F800B078077800B0080787F787F787F21 +807814C08A21E08A21F021F88AA221FCA37814FEA421FFAC21FEA45414FCA321F8A25414 +F0A221E06621C0541480541400A2545B545B53B55A535C0B0F14C0535C9AB548C7FC0A07 +5C99B612F094BB12C09CC8FC1EF81EC00BF8C9FC52CAFC05F0CFFCB3B3B3A4BB7EA7> +128 142 121 269 148 80 D[<001FC212C0A703FCC7000102FCC71201480280E0000F14 +E002FCC8190102F0767E02C01D1F4A8949C91A03498A498AA2491F7F491F3FA2491F1FA3 +491F0F007F21F0A290CA1B07A5007E2003A800FE21F8482001A7CB98C7FCB3B3B3B3AF03 +7FBC12F0A7>133 141 120 268 150 84 D<93387FFF80030FB512FC92B712C0020316F8 +020F16FE023FD980076D7EDAFFF8C780490180023F13F0D907FEC86C7FD90FF86F13FE49 +486F7F02C06F80D93FF86F80D97FFE816E6C8390B56C6F7FA26F6F7F5A6F838587A38587 +6C5CA26D5BA26D5BD90FFEC9FCEB03F890CBFCA90603B6FC051FB7FC040FB8FC93B9FC03 +0FECFC0F037F14000203B512E0021F91C7FC027F13F849B512E0010714804949C8FC013F +5B495B90B55A485C485C485C4891C9FCA2485BA2485BF507E0485BA3B5FC5C61A461193B +197B806C18F3806CDD01E3EC800F6EDB03C116C06C6D15076CDD0F80ECC01F6F4A489138 +E03F806C02E0023E6D9038F07F0000016E02FC92B5FC6C02FCD903F86D5C013F9027FF80 +3FF06D5C010F91B500C06D5C010393C700035CD9007F02FC6E14C0020F02F06E6C90C7FC +DA003F90C9EA0FF8635F79DD6C>97 D<933801FFFC043FEBFFE00303B612FE031F6F7E03 +7F16E04AB5D8C00313F8020701FCC7EA3FFE4A01F0EC03FF023F01C0020013C04A49ED3F +E049B5C96C7E494916074949EE3FF84949EEFFFC49491503494D7F5D49495D90B5844B5D +5A4891C9FCA25A5C5A735B5A4A705BA248725B070013E0F23F8097C8FC5A5CA5B5FCB07E +A380A37EA36C7FA37E6EF00FC07E1B1F6C6E1880A26C6E173F1C006C6E5F6D197E6F17FE +6D6D4C5A6D6D4C5A7F6D6D4C5A6D6D4C5A6D02C04B5A6D6EED7F80023F01F84BC7FC6E6D +EC03FC0207D9FF80EB0FF8020102F8EBFFE06E6C90B65A031F93C8FC030315F8DB003F14 +C0040101F8C9FC525F79DD60>99 D[<F40FF0081FB5FC071FB6FCA7F100071A018687B3 +B3A2933801FFF0047FEBFF800303B612F0031F15FC037F15FF4AB5D8E00313C0020749C7 +EA3FE0021F01F8EC0FF84A01E0EC03FC91B50080EC00FE4991C9127F494970B5FC494982 +49498249498249498249845D90B583485CA24891CBFCA2485BA25AA2485BA35AA3485BA6 +B5FCB17EA56C7FA47EA36C7FA27EA26C7FA26C80626C6E5E6D606D7F626D6D5E6D6D5E6D +6D5E6D6DDB01FE8001006DDB03F8806E01C0DA0FF014FF6E6DDA3FE0EDFFC0020F01FCEC +FF8002039026FF800F5B020091B512FC033F15F0030F15C003004AC7FC040701C00480C7 +FC>106 144 121 270 120 I<933803FFF8047FEBFFC00307B612FC033F15FF92B812C0 +0203DA807F13F04A9026FC000F13FC021F01E001037F4A4901007F91B5C86C7F49496F7F +49496F7F49496F7F49496F7F49498349834949838590B54883488492CA14805A7413C048 +5BA2481BE04A835AA21CF05AA2865C5A1CF8A4B5FCA391BBFCA402F8CDFCAA7EA4807EA3 +7EA2807EA2F301F86C7F1B036C1BF06C801B076C6E18E06D190F6FEF1FC06D1A806D6D17 +3F6D6DEF7F006D6D17FE6D6D4C5A6D6D4C5A6D6E4B5A6E01E0ED1FE0021F01F8ED7FC06E +01FE4A485A0203D9FFC0D907FEC7FC020002FCEBFFFC033F90B612F0030F16C003014BC8 +FCDB001F14F0040091C9FC555F7ADD62>I<F41FE093263FFF80913801FFF80307B500FC +020F13FE037FDAFFC0013F7F4AB700F090B612800207D9F803D9FC0313C3021F902AC000 +7FFF07FC0713C0027F90C7001FEBCFE0DAFFFC0207EBFF000103496E495B49496E497F49 +8449496E7F4B6F168049736C130049736C5A4B6FEC003890B57290C7FCA2488692C97E48 +86A44886AB6C62A46C626F5D6C62A26D616F5D6D616D96C9FC6F92B5FC6D6D4A5B6D606D +6D4A5B6D6D4A13E003FF021F5BD903DF01C0017F90CAFCD907879039F803FFFCD90F8190 +B612F0DA007F15C049010702FCCBFCDB003F1380013E91CEFCA2137EA313FEA37FA280A2 +8080A214F880ECFF8092B712FC6DEFFFF8F2FF801BF06D19FC1BFF6D1AC01CF06D866D1A +FE6D867F6D876E8691BC7E1307011F87017F90C912072601FFFCDC001F804801F0170348 +49EF007F4849727F481A0F484984A24890CC6C7F87A2485A87A76D616C64A26E606C646E +606C646C6D4E5B6C6D4E5B6C6D4E5B6C6D4E90C7FC6C6D4E5A6D6C4D5B011F01C0040713 +F06D01F0041F5B010301FE93B512800100D9FFC0020749C8FC021F01FE91B512F0020790 +B812C0DA007F04FCC9FC030716C0DB000F02E0CAFC62887ADD6C>103 +D[<ED7F8090B6FCB7FCA7EA003F130F7F7FB3B3A2F13FFF0603B512F0060F14FE063F6E +7E95B712E04D010014F8DD07F8011F7FDD0FC06D7F4D486D7F053EC7FC4D6E804D6E80EE +81F04D83DC83C080EE878089048FC9FC168E049E82169C04BC8416B816F8A25EA35EA55E +B3B3B1B9011FB812E0A7>107 143 121 270 120 I[<EC7F80903801FFE0497F497F497F +497F497FA24980A86D91C7FCA26D5B6D5B6D5B6D5B6D5B9038007F8091C9FCB3A9ED7F80 +017FB5FCB7FCA7EA003F1307A27FB3B3B3B3A2B812FCA7>46 144 +121 271 60 I[<ED7F8090B6FCB7FCA7EA003F1307A27FB3B3B3B3B3B3B0B812FEA7>47 +143 121 270 60 108 D<DB7F80EC3FFF90B60203B512F0B7020F14FE063F6E7E95B712 +E04D010014F8DD07F8011F7FDD0FC06D7F4D486D7FD8003F033EC7FC010F4B6E806D4B6E +806DEC81F04D83DC83C080EE878089048FC9FC168E049E82169C04BC8416B816F8A25EA3 +5EA55EB3B3B1B9011FB812E0A76B5D79DC78>110 D<EFFFFE043FEBFFF84BB7FC030F16 +E0033F16F84AB5D8C00713FF4A01FCC76C7F020F01F0021F13E0023F01C0020713F84A90 +C800017F4A486F7F4949707E4949707F4949707F4949707F49864949707F4949707FA290 +B5CA6C7F4887A24849711480A2481CC04A84481CE0A2481CF0A3481CF84A84A3481CFCA5 +B51BFEB06C1CFCA56C1CF86E60A36C1CF0A36C6D95B512E0A26C1CC0A26C6D4D1480A26C +1C006F5E6C636D6D4C5B6D626F5E6D6D4C5B6D626D6D4C5B6D6D4C5B6D6D93B5C7FC6D6C +6C6C020313FC6E6D4A5B020F01F0021F13E06E01FE91B55A02019026FFC00791C8FC6E6C +90B612FC030F16E003031680DB003F02F8C9FC040049CAFC5F5F7ADD6C>I<DB7F80ECFF +F890B6021FEBFFC0B791B612FC050315FF050F16C094263FFC0014F0DDFFC0011F13FCDC +83FEC7000713FFDC87F8020180D8003FDA8FF06E14E0010FDA9FC06F7F6DDABF806F7F6D +02FFC96C7F4C707F4C707F5E4C70804C70804C85878A888AA2767FA28A88A28AA288A21F +80A57614C0B11F8064A51F0064A266A26466A2525BA26699B5FC666366704C5C705E7096 +C7FC515B704C5B704C5B704C5B7192B55ADCDFE04A5CDCC7F0020791C8FCDCC3FC4A5BDC +C1FF027F13F89327C07FF003B512E0051FB7128005074BC9FC050115F0716C91CAFC0603 +13E095CDFCB3AEB9FCA76A857ADC78>I<03FFEC1FF890B691B5FCB7010314E0050F804D +14FC94393FF00FFE94397F003FFF05FE491380DC01F890B5FCD8003F4A484814C0010F15 +E06D4A484814E06D1580160F17005E161E5EA27214C05E72148004706E130004F06E5AF1 +0FF84C91C8FCA55EA65EB3B3AEB912E0A74B5D7ADC57>114 D<92263FFF80EB0380020F +B500FC1307027F02FF131F49B7EAE03F0107EEF07F011F903AC0007FFCFFD97FFCC7000F +B5FCD9FFE0140148496E7E4890C97E484882000F83498248488284123F4982007F187FA3 +193F12FF7FA2191F7F7F7F80806E93C7FC14F86C13FF15F0EDFF806C15FCEEFFE06C16FE +EFFFC06C17F06C17FC18FF6C846C18E06C84013F836D830107836D8301001880143F0207 +17C0DA007F16E01507DB001F15F01600050F14F81701717E8400FC050F13FC84846C83A2 +84A26C187FA2193F7FA26D18F8A27FA26D18F0197F7F6D18E019FF6D18C06D5E6E4B1380 +6E4B130002F04B5A6E4B5AD9E7FEED7FF89026C1FF8049485A018001F8011F13C026FE00 +3FB75A48010F4BC7FC48010315F0480100158048020701F0C8FC465F79DD55>I[<ED03F0 +A81507A5150FA4151FA3153FA2157FA215FFA25CA25C5CA25C5C5C5C91B5FC13035B131F +017F91B7FC0007BAFCBBFCA5C702F0C9FCB3B3ACF107E0B2190F6E17C082A280F11F8082 +6EEE3F00826E167E6E7F6E5E6E6E485A6EECE0036F9038F80FF0031F90B512C003075D03 +0192C7FCDB003F13FC040113E0>67 132 124 258 84 I<DB7FC0EF0FF890B6041FB5FC +B7031FB6FCA7D8003FEF0007010F18016D846D85B3B3B298B5FCA462A362A26D19BF1A07 +1B3F1A0F6D6E151EA26E173C1A786E05F88070DA01F0806E6DDA03E06E7E6E6DDA0FC0ED +FFE06E01FFEC3F8002019139E001FF006E91B512FC033F5D030715E0030092C7FC040701 +F804E0C7FC6B5E79DC78>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fo ecrm1095 10.95 77 +/Fo 77 123 df<486C1360000314E039070001C0000EEB0380000C1400001C5B00181306 +0038130E0030130C0070131C00601318A200E01338481330A500CEEB338039FF803FE001 +C013F0A3007F131FA2393F800FE0390E0003801C1B80BE1E>16 D<001C1307007FEB1FC0 +39FF803FE0A201C013F0A3007F131F001CEB073000001300A500011470491360A2000314 +E090C712C048130100061480000E1303000C1400001C5B48130E485B006013181C1B7FBE +1E>I<BE1280A2590280985A>22 D<DA03FFEB0FE0021F9038C07FF8913AFE00F1F81CD9 +01F890383BE07ED907E090387FC0FF90390FC001FFD91F805CD93F005C5B017E167E01FE +6D48130049147EAEB91280A3D800FCC7007EC7FCB3AE486C14FF277FFFF83F13FFA33840 +7FBF35>27 D<EC03FE91381FFFC09138FE01E0903901F80078D907E0131C4948137C4948 +13FE90383F00015B137E13FE496D5A167893C7FCAB167EB712FEA33900FC00011500167E +B3AC486C14FF277FFFF83F13FCA32E407FBF32>I<EC03FF021F13EE9138FE00FEEB01F8 +903807E001EB0FC0EB1F80EB3F005B017E130001FE147E5BAEB712FEA3D800FCC7127EB3 +AE486C14FF277FFFF83F13FCA32E407FBF32>I<003E131F007FEB3F80A239FF807FC039 +7F003F80A9007E131F003E1400A9001C130EA9001813061A2177BF2D>34 +D<121C127FEAFF80A213C0A3127F121C1200A512011380A2120313005A1206120E120C12 +1C5A5A12600A1B78BE19>39 D<1430147014E0EB01C0EB0380EB07005B131E5BA25B5BA2 +485AA2485AA212075B120FA290C7FC5AA2121E123EA3123C127CA6127812F8B21278127C +A6123C123EA3121E121FA27E7FA212077F1203A26C7EA26C7EA213787FA27F7F7FEB0380 +EB01C0EB00E014701430145A77C323>I<12C07E12707E7E7E120F6C7E6C7EA26C7E6C7E +A21378A27FA2133E131E131FA27F1480A2130714C0A3130314E0A6130114F0B214E01303 +A614C01307A31480130FA214005BA2131E133E133CA25BA25BA2485A485AA2485A48C7FC +120E5A5A5A5A5A145A7BC323>I<1506B3ABBA12E0A2C80006C9FCB3AB3B3C7BB446>43 +D<121C127FEAFF80A213C0A3127F121C1200A512011380A2120313005A1206120E120C12 +1C5A5A12600A1B788819>I<B512FEA517057F951E>I<121C127FEAFF80A5EA7F00121C09 +09788819>I<16C0A215011680A2150316005D1506A2150E150CA2151C1518A215381530 +A21570156015E05DA214015DA2140392C7FCA25C1406140E140CA2141C1418A214381430 +A214701460A214E05C13015CA2130391C8FCA25B1306A2130E130CA2131C131813381330 +A213701360A213E05BA212015B120390C9FCA25A1206A2120E120CA2121C1218A2123812 +3012701260A212E05AA2225B7BC32D>I<EB03FC90381FFF8090383E07C09038F801F048 +486C7E4848137C49133C0007143E48487FA248C7EA0F80A24815C0A4007EEC07E0A500FE +15F0B3A3007E15E0A4007F140F6C15C0A46C15806D131F000F1500A26C6C133EA26C6C5B +6C6C5B6C6C485A90383E07C06DB45AD903FCC7FC243F7CBC2D>I<14C013031307131F13 +7FEA07FFB5FC139FEAF81F1200B3B3ACEB7FF0B612F8A31D3D78BC2D>I<EB07FC90383F +FF8090B512E03901F00FF839078003FC48486C7E000E6D7E48EC7F8048EC3FC012300070 +EC1FE01260A200FEEC0FF07E7FA56CC7FC121CC813E0151FA216C0153F1680157F160015 +FE4A5AA24A5A4A5A4A5A5D4A5A023EC7FC5C5C495A495A5C495A49C71230131E5B5B4914 +60485A485A485A90C812E048B6FC5A5A4815C0B7FCA3243D7CBC2D>I<EB07FC90383FFF +8090B512E03901F807F83907C003FC48C66C7E000E6D7E48EC7F80EA1F80486CEB3FC07F +A56C5A0007C7FCC81380157FA216005D5D4A5A4A5A5DEC0FC0023FC7FCEB1FFCECFF8090 +38000FE0EC03F86E7E6E7E157F1680ED3FC0A216E0A2151F16F0A2120C123F487E487EA4 +ED3FE05B6CC713C01270ED7F807E6CECFF00000F495A3907C003FC3903F80FF0C6B55A01 +3F1380D907FCC7FC243F7CBC2D>I<150EA2151E153EA2157E15FEA214011403A2140614 +0E140C141814381430146014E014C0EB0180130314001306130E130C5B133813305B13E0 +5B485A120390C7FC1206120E120C5A123812305A12E0B8FCA3C8EAFE00AC4A7E49B6FCA3 +283E7EBD2D>I<00061403D807C0130F01F813FE90B55AA215F05D5D92C7FC38063FF890 +C9FCADEB01FE90380FFF8090383E03E090387001F8496C7ED807C0137E497F90C7138000 +06141FC813C0A216E0150FA316F0A4123E127F487EA490C713E048141F12E0006015C012 +700030EC3F8012386CEC7F00001E14FE6C495A3907C003F83903F00FE0C6B55A013F90C7 +FCEB07F8243F7CBC2D>I<EC1FE0ECFFF8010313FE90380FF01F90391F80078090383F00 +03017EEB0FC049131F4848133F485AA2485A000FEC1F8049EB0F00001F91C7FCA25B123F +A3127F90C9FCEB01FE903807FF8039FF0E03E0496C7E90383800FC49137E0160133E01E0 +133F49EB1F8016C05B16E0150FA290C713F0A67EA56C7E16E0A2121FED1FC07F000F1580 +153F6C6C14006C6C137E6C6C5B6C6C485A90387E07F06DB45A010F1380D903FCC7FC243F +7CBC2D>I<12301238123E003FB612FCA316F85A16F016E00070C8FC0060EC01C0ED0380 +16005D48140E150C151C5DC8123015705D4A5A5D14034AC7FCA2140EA25CA2143C143814 +78A214F85C1301A31303A313075CA3130FA5131FAA6D5A6D5A26407BBD2D>I<EB03FC90 +381FFF80017F13E09038FC03F83901E000FC4848133E48487F48C77E000E1580001E1407 +001C15C0003C1403A3123EA2123F15076D1480D81FE0130F6D140001FC131E6C6C5B6D6C +5A6C6D5A6CEBF1E06CEBFF806C91C7FC133F6D13C06D7F4913F801787F48486C7E3903C0 +1FFF48486C1380260F000313C0487F001E9038007FE048143F007C140F0078EC07F01503 +12F8481401A21500A46C15E000781401A2007C15C06C1403001EEC0780001FEC0F00D80F +C0131E6C6C137C3901FC03F86CB512E0011F1380D903FCC7FC243F7CBC2D>I<EB03FCEB +1FFF4913C09038FE07F03901F801F848486C7E4848137C000F147E48487F5B003FEC1F80 +A2127F90C713C0A25AED0FE0A516F0A66C141FA27F123F153F121F6C6C137F0007146F6D +13EF3903F001CF3900F8038F90387C070FD91FFE13E0EB07F890C7FC151FA216C0A3ED3F +80A2000F1500486C5B486C137EA25D4A5A138049485A001C495A001EEB1FC0260FC07FC7 +FC3803FFFE6C13F838003FC0243F7CBC2D>I<121C127FEAFF80A5EA7F00121CC7FCB3A3 +121C127FEAFF80A5EA7F00121C092778A619>I<121C127FEAFF80A5EA7F00121CC7FCB3 +A3121C127FEAFF80A213C0A3127F121C1200A512011380A2120313005A1206120E120C12 +1C5A5A12600A3978A619>I<BA12E0A2CDFCB0BA12E0A23B147BA046>61 +D<EB3FF890B5FC3903C01FC0390F0007F0001CEB01F84814FC48EB00FE1260007C147F12 +FE7EA4127E003C14FFC812FEA2EC01FCEC03F8EC07F0EC0FE01580EC1F00143E143C5C14 +F85C5C13015C5C1303A291C7FCAB90C8FCA91307EB1FC0497EA56D5A0107C7FC20407BBF +2B>63 D<1507A34B7EA24B7EA34B7EA34B7E156FA2EDCFF815C7A291380187FC1583A291 +380301FEA391380600FFA2020E80020C137FA2021C800218133FA24A80161FA24A80160F +A24A6D7EA349486D7E91B6FC4981A291C712014981010680A24982177FA24982173FA249 +6F7EA21370717E13F0000183487ED80FFEED3FFEB500C00107B512F8A33D417DC044>65 +D<B712FCEEFFC017F0C69039C0000FFC6D48EB03FEEE00FFEF7F80EF3FC018E0171F18F0 +170F18F8A718F0171F18E0173F18C0EF7F80EFFF00EE03FEEE0FF8EE7FE091B6C7FC17E0 +9139800003FCEE00FEEF7F80EF3FC0EF1FE0EF0FF018F8170718FC1703A218FEA718FC17 +07A2EF0FF818F0171FEF3FE0EF7FC0933801FF80496C90380FFE00B85A17E094C7FC373E +7DBD40>I<DB3FF0130C912603FFFE131C021FEBFF80913A7FE00FC03C913AFF0001F07C +D903FCEB0078D907F0EC3CFCD91FE0140F494814074948140349C8FC4848150149150012 +034848167CA24848163CA24848161CA2123F5B180C127FA349160012FFAC127F7F180CA2 +123FA27F001F171C18186C7EA26C6C163818306C6C1670000117606D16E06C6CED01C06D +6CEC03806D6C14076D6CEC0F00D907F0141ED903FC5CD900FF14F091397FE007E0021FB5 +1280020349C7FC9138003FF036427BBF41>I<B712FCEEFF8017E0C69039C0001FF86D48 +EB03FEEE00FFEF3F80717E717E717E717E717EA2717E84841980183F19C0A319E0181FA4 +19F0AB19E0A4183F19C0A21980187FA2190018FEA24D5A4D5A17074D5A4D5A4D5A05FFC7 +FCEE03FE496CEB1FF8B85A178004FCC8FC3C3E7DBD45>I<B912C0A3C69038C000016D48 +EB001FEF0FE01703A217011700A31860A418301630A41800A21670A216F01501150791B5 +FCA3EC8007150115001670A21630A21806A3180C93C7FCA4181C1818A21838A21878A218 +F0170117031707171F496CEB01FFB912E0A3373E7DBD3D>I<B91280A3C69038C000036D +48EB003FEF1FC017071703A21701A31700A41860A21630A31800A31670A216F015011507 +91B5FCA3EC8007150115001670A21630A693C8FCAFEBFFE0B612F0A3333E7DBD3B>I<DB +3FF0130C912603FFFE131C021FEBFF80913A7FE00FC03C913AFF0001F07CD903FCEB0078 +D907F0EC3CFCD91FE0140F494814074948140349C8FC4848150149150012034848167CA2 +4848163CA24848161CA2123F5B180C127FA34993C7FC12FFAB041FB512F0127F7F933900 +0FFE00EF03FC123FA27F121FA26C7EA26C7EA26C7E6C7EA26C7E6D6C14076D7E6D6C140F +D907F8141C6D6CEC387CD900FFECF03C913A7FF007E01C021FB5EA800C020349C8FC9138 +003FF03C427BBF47>I<B6D8C01FB512F8A3C601C0C7381FF8006D486E5AB3A691B7FCA3 +0280C7120FB3A9496C4A7EB6D8C01FB512F8A33D3E7DBD44>I<B612C0A30001EBE00038 +007F80B3B3B23801FFE0B612C0A31A3E7DBD21>I<B612F0A3C601E0C8FCEB7F80B3B017 +03A517071706A4170EA3171EA2173E177E17FEEE01FC1607496C133FB8FCA3303E7DBD38 +>76 D<B56C93381FFFF06E5EA2C6F1F000D96FE0EE6FE0A2D967F016CFA3D963F8ED018F +A2D961FCED030FA3D960FE1506A2027F150CA36E6C1418A36E6C1430A26E6C1460A36E6C +14C0A26E6CEB0180A36E6CEB0300A26E6C1306A3037F5BA26F6C5AA36F6C5AA26F6C5AA3 +6F6C5AA2923803F980A36FB4C7FCA26F5AA213F0486C147CD807FE4D7EB500F00138011F +B512F0A34C3E7DBD53>I<B56C91387FFFF88080D8007F030313006EEC00FCD96FF81578 +6E15301367EB63FE80136101607F6E7EA26E7E6E7EA26E7E6E7EA26E7E6E7EA26E7F6F7E +82153F6F7E82150F6F7E8215036F7E6F1380A2EE7FC0EE3FE0A2EE1FF0EE0FF8A2EE07FC +EE03FEA2EE01FF7013B018F0177F173FA2171F170F1707A2170301F01501487ED807FE15 +00B500F01570A218303D3E7DBD44>I<EDFFE0020713FC91393FC07F809139FE000FE0D9 +01F8EB03F0D907E0EB00FC4948147E49488049C86C7E017E6F7E01FE8248486F7E48486F +7EA248486F7EA248486F7E001F83A24982003F1880A3007F18C049163FA300FF18E0AC00 +7F18C06D167FA4003F18806D16FF001F1800A36C6C4B5AA26C6C4B5A00035F6D15070001 +5F6C6C4B5A017F4B5A6D6C4A5A011F93C7FCD90FE014FE6D6C495AD901F8EB03F0D900FE +EB0FE091393FC07F80912607FFFCC8FC020013E03B427BBF46>I<B712F016FF17C0C690 +39C0003FF06D48EB07F8EE01FE707E831880EF3FC0A2EF1FE0A218F0A818E0A2EF3FC0A2 +EF7F80180017FEEE03FC4C5AEE3FE091B6128004FCC7FC0280C9FCB3A7497EB612C0A334 +3E7DBD3D>I<B712C016FCEEFF80C69039C0007FE06D48EB0FF0EE03FC707E707E717E71 +7EA284171F84A760173F6060177F4DC7FCEE01FC4C5AEE0FE0EEFF8091B500FCC8FC5E91 +388000FFEE3FC0EE0FE0707E707E83707EA2707EA684A7190618C0177FA2190E496C9138 +3FE00CB600C0011F131C94380FF038943807F870CA3801FFE09438003F803F407DBD43> +82 D<D907FC131890393FFF803890B512E03A01FC03F8783903F0007CD807C0EB1EF848 +48130F48C71207481403003E1401007E1400A2007C157812FCA21638A36C1518A27EA26C +6C14007F7FEA3FF813FF6C13F06C13FF15F06C14FC0001806CECFF80013F14C0010714E0 +EB007F020713F09138007FF8151FED0FFC15071503ED01FEA200C01400A3167EA27EA316 +7C7E16FC6C15F86C14016C15F06C14036DEB07E0D8FBE0EB0FC0D8F1F8EB1F80D8F07FEB +7F0039E01FFFFC010713F039C0007FC027427BBF32>I<003FB9FCA3D9E000EBC00190C7 +397F80003F007EEF1F80007C170F0078170700701703A300601701A548EF00C0A5C81600 +B3B24B7E4A7F0107B612F8A33A3E7DBD41>I<B600C090387FFFF8A3C601C0C700031300 +6D48EC00FC18781830B3B3A4013F16706E1560A218E0011F5E6E1401130F6E4A5A01074B +C7FC6D6C5C6D6C140E6D6C143C027F5C91393FC001F091390FF00FE00203B51280020049 +C8FCED1FF03D407DBD44>I<B500FE013FB56C48B5FCA3000701C0010101F0C7EA3FF86C +90C8D87FC0EC0FE06CF207C0053FED03806C1B00A26E6E6C5C017F1906A26E4A7E013F61 +A26E4A7E011F03675DA2EFE7FC6D6C02C35DA204017F6D6C02815DA2846D6C49C65DA36D +6C01066D6C485AA36E4990383FC0036D96C7FCA26F486D6C5A027F1706A26F48EB0FF002 +3F5FA2DBE07014F8021F016001075BA204E014FC6E6C4801035BA203F115FE912607F980 +01015BA219FF6EB4C85BA36E486F5AA34B153F020094C8FCA24B810378151EA20370150E +0330150C58407EBD5D>87 D<007FB56C48B512E0A3C601FCC7383FFC00D93FF8EC1FE06D +48EC0F8095C7FC6D6C140E6D6C140C171C6D6C5C6D6C14305F6D6D13E06E6C5B4C5A9138 +3FE003DA1FF090C8FC160691380FF80E913807FC0C5E913803FE38913801FF305E6E13E0 +6F5AA26F7E6F7EA26F7E4B7EA2ED33FEED71FF156103C07F02016D7E15804A486C7E4A6D +7E14064A6D7E021C6D7E5C02306D7E02706D7E5C4A6D7F49486E7E130391C86C7E496F7E +130E011E6F7E013E8201FF82000701C0EC3FFFB500F049B512FEA33F3E7EBD44>I<B692 +B51280A3000101F092383FF8006C49ED0FC0017F5F013F94C7FC6E150E011F160C6D6C5D +6E1538010716306D6C157018606D6C5D6F13016D5E6E6C13036F91C8FC023F14066E6C13 +0E170C6E6C131C6F131802075C6E6C137017606E6C13E06E6D5AEE8180ED7FC304E3C9FC +ED3FE7ED1FF616FC150F6F5AB3A44B7E020FB512FCA3413E7FBD44>I<003FB712F0A349 +C7EA3FE013F001C0EC7FC090C8FC003EEDFF80003C4A1300A200384A5A00785D00701407 +4B5AA24B5A00604A5AA24B5AA24B5AC74890C7FCA24A5A5D14074A5AA24A5A4A5AA24A5A +A24A5A4990C8FCA2495A5C01071518495AA2495A495AA2495A1738495A4890C8FCA2485A +4915701207484815F0A24848140148481403160F4848143FED01FFB8FCA32D3E7BBD37> +I<EB1FF0EBFFFC3803E03F390F000FC0001C6D7E001F6D7E486C6C7E6D6C7EA3157E6C5A +6CC7FCC8FCA4EC1FFEEB03FF90381FF87EEB7F803801FC00EA07F0485A485A485A127F90 +C7FC160312FEA315FEA21401007F14BE14033A3F80071F06261FC00E138E3A0FF03C0FFC +3A03FFF007F83A003FC003E0282A7CA82D>97 D<EA01F812FFA3120712031201B1EC07F8 +EC1FFF9138780FC09039F9E003F09039FB8001F801FFC77E49147E4980EE1F805B17C016 +0F17E0A2160717F0AA17E0160FA317C0161F17806DEC3F007F01F6147E01F75C9039E380 +01F89039C1C003E09039C0F81F809026803FFEC7FCC7EA07F02C407EBE32>I<49B4FC01 +0F13E090383F00F8017C131E484813074848131F4848EB3F804848137FA2485AA248C7EA +3F00151E4891C7FCA2127E12FEAB127FA36C15C07F001F14016D1480000F14036C6CEB07 +006C6C13066C6C131E6C6C133890383F01F090380FFFC0D901FEC7FC222A7DA828>I<ED +01F815FFA3150715031501B114FF010713C190381F80F190387C00394848131D4848130F +4848130748481303A248481301123F90C7FC5AA3127E12FEAA127E127FA27E7F001F1403 +A26C6C13076C6C130F6C6CEB0DFC6C6CEB3DFE6C6C903871FFF090383F01E190380FFF81 +903A01FE01F8002C407DBE32>I<EB03FC90381FFF8090387E07E09038F801F048486C7E +4848137C48487F000F143F48487F168048C7FC150F5A16C0127EA212FEA2B7FCA248C9FC +A6127E127FA36C15C07F001F14016C6C148015036C6CEB07006C6C130E6C6C5B6C6C5B90 +383F01F090380FFFC0D901FEC7FC222A7DA828>I<EC1FC0ECFFF0903803F038903807C0 +FC90380F81FE131FEB3F01133E137EEC00FC491300AFB6FCA3D800FCC7FCB3AE487E387F +FFFEA31F407FBF1C>I<167E903903FC01FF903A0FFF07878090393E07CE0F9038FC03FC +3901F801F83B03F000FC070049017CC7FC0007147EA248487FA86C6C137EA20003147C6D +13FC6C6C485A6D485A9038BE07C026038FFFC8FCEB03FC48CAFCA47FA27F6C7E90B512F0 +6C14FE6F7E6C6C14E048B612F83907C0001FD81F80EB03FC48C87E003E157E48153E163F +4881A56C5D007C153E007E157E6C5D6C6C495A6C6C495AD803F0EB0FC0D800FE017FC7FC +90383FFFFC010313C0293D7EA82D>I<EA01F812FFA3120712031201B1EC03FC91380FFF +8091383C0FC09138F003E0D9F9C07F9039FB8001F8140001FF6D7E5BA25BA25BB3A6486C +497EB539F07FFFF8A32D3F7EBE32>I<EA01C0EA07F0487EA56C5AEA01C0C8FCACEA01F8 +127FA3120712031201B3AC487EB512E0A3133D7EBC19>I<1470EB01FCEB03FEA5EB01FC +EB00701400AC14FE133FA313011300147EB3B3A6123C007E137CB413FCA214F8130100FE +13F0387803E0383E07C0380FFF00EA01FC175084BC1C>I<EA01F812FFA3120712031201 +B292387FFF80A392381FFC00ED0FE016804BC7FC151C5D5D5DEC03C04AC8FC140E141E14 +3E147F9038F9FF809038FB9FC0EBFF0F496C7E01FC7FEBF8036E7E816E7E157E8182151F +6F7E826F7EA282486C14FEB539F03FFFE0A32B3F7EBE30>I<EA01F812FFA31207120312 +01B3B3B1487EB512F0A3143F7EBE19>I<2701F803FCEB01FE00FF903B0FFF8007FFC091 +3B3C0FC01E07E0913BF003E07801F02607F9C0D9F0E07F3D03FB8001F9C000FC00010100 +5C01FFD900FF147E4992C7FCA2495CA2495CB3A6486C496C14FFB528F07FFFF83F13FCA3 +46287EA74B>I<3901F803FC00FF90380FFF8091383C0FC09138F003E02607F9C07F3A03 +FB8001F80001130001FF6D7E5BA25BA25BB3A6486C497EB539F07FFFF8A32D287EA732> +I<EB01FE90380FFFC090383F03F090387C00F8D801F0133E48487F4848EB0F80A24848EB +07C0001F15E090C712034815F0A2007EEC01F8A400FE15FCA9007E15F8A3007F14036C15 +F0A26C6CEB07E0000F15C06D130F000715806C6CEB1F006C6C133ED800FC13FC90383F03 +F090380FFFC0D901FEC7FC262A7DA82D>I<3901F807F800FFEB1FFF9138780FC09039F9 +E003F03A03FB8001F86CB4C77E49147E49147FEE3F8049141F17C0A2EE0FE0A317F01607 +A9EE0FE0A4EE1FC0A2EE3F806D15006D5C16FE6D495A9039FB8003F89039F9C007E09039 +F8F81F80DA3FFEC7FCEC07F091C9FCAD487EB512F0A32C3A7EA732>I<02FF130C0107EB +C01C90381F80F090387E003849EB1C3CD803F8130E4848EB077C491303484814FC001F14 +01485A150048C8FCA412FEA97E7EA36C7E15016C7E000F14037F000714076C6C130E6C6C +131CD8007E137890383F01E090380FFFC0903801FE0090C8FCAD4B7E92387FFFF8A32D3A +7DA730>I<3903F00FC000FFEB3FF0ECF0F89038F1C3FC00071383EA03F33801F70313F6 +EC01F89038FE0060491300A45BB3A4487EB512F8A31E287EA723>I<90387FC0603903FF +F8E03807C03D381E000F481303481301A20070130012F01560A27EA27EB41400EA7FC013 +FE383FFFE06C13FC00077F6CEBFF80C66C13C0010713E0EB003FEC0FF000C01303EC01F8 +14007E1578A27EA27E15F07EEC01E06C14C039F780078039F1E01F0038E0FFFC38C01FE0 +1D2A7DA824>I<1318A61338A41378A213F8A2120112031207001FB512C0B6FCA2D801F8 +C7FCB3A21560A96C6C13E015C0A2EB7E0190383F038090381F8700EB07FEEB01F81B397E +B723>I<D801F814FC00FF147FA3000714030003140100011400B3A51501A3150312006D +1307ED0EFE017C497E6D4913F890381F80F0903807FFE00100903800FC002D297EA732> +I<B539C007FFE0A32707FC000113006C48EB007C1678000115707F00001560A2017E5CA2 +017F13016D5CA26D6C48C7FCA26E5A010F1306A26D6C5AA2ECF01C01031318A26D6C5AA2 +ECFC7001001360A2EC7EC0A2147F6E5AA26EC8FCA3140EA22B287EA630>I<B53B87FFFC +03FFF0A33D0FFC003FE0007FC0D807F06D48EB3F0000036E48131E70131C6C7E03071418 +826C6C010F5CA26D6E1370017E01191460A2017F6E13E06D01305CA20280EBFC01011FD9 +607C5BA290280FC0E07E03C7FCEDC03EA2D907E1EB3F06ED801F1786D903F3148CED000F +17CCD901FEEB07D8A217F86D486D5AA302786D5AA302306D5A3C287EA641>I<3B7FFFC0 +0FFFE0A3000390390007FE00C6EC03F86D14E06D5C02805B6D6C48C7FC010F130E903807 +E00C6E5A903803F83801015B6D6C5A6E5AEC7F80143F141F6E7E81141FEC3BF0EC71F8EC +E1FCECC0FE903801807E01037FD907007F010E6D7E010C130F011C6D7E498001F86D7E00 +0181D80FFC497EB590381FFFF8A32D277FA630>I<B539C007FFE0A32707FC000113006C +48EB007C0001157816707F000015607F017E5CA26D495AA2EC8003011F91C7FCA290380F +C006A2ECE00E0107130CA26D6C5AA2ECF8380101133014FC01005BA2EC7EC0A2147F6E5A +A26EC8FCA3140EA2140CA2141C1418A25CA25C1238007C13E000FE5B13015C49C9FCEA7C +07EA700EEA383CEA1FF8EA07E02B3A7EA630>I<001FB61280A29038E0007F90C7130000 +1E14FE001C495A140300185C0038495A4A5A0030131F5D4A5A4AC7FCA2C712FE495A1303 +5C495A495A131F9138C00180EB3F80EB7F00A213FE485A000314035B48481400485A001F +5C495B485A48C7123F4849B4FC90B6FCA221277EA628>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fp ecrm1200 12 16 +/Fp 16 122 df<121EEA7F8012FF13C0A213E0A3127FEA1E601200A413E013C0A3120113 +80120313005A1206120E5A5A5A12600B1D78891B>44 D<14FF010713E090381F81F89038 +3E007C01FC133F4848EB1F8049130F4848EB07C04848EB03E0A2000F15F0491301001F15 +F8A2003F15FCA390C8FC4815FEA54815FFB3A46C15FEA56D1301003F15FCA3001F15F8A2 +6C6CEB03F0A36C6CEB07E0000315C06D130F6C6CEB1F806C6CEB3F00013E137C90381F81 +F8903807FFE0010090C7FC28447CC131>48 D<EB03FE90381FFFC0017F13F03901F80FFC +3903C001FE48486C7E000EC7EA7F8048EC3FC0ED1FE04815F00030140F007015F8006014 +07126CB415FC7F7F1503A46C4813076CC7FCC8FC16F8A2150F16F0151F16E0A2ED3FC0ED +7F8016005D5D4A5A4A5A4A5A5D4A5A4A5A4AC7FC147C5C5C495A495A495A49C7120C131E +5B013814185B5B485A4848143848C81230000E1570001FB612F0A25A5AB712E0A326427B +C131>50 D<49B4FC010F13E0013F13FC9038FE01FE3A01F0007F80D803C0EB3FC048C7EA +1FE0120EED0FF0EA0FE0486C14F8A215077F5BA26C48130FEA03C0C813F0A3ED1FE0A2ED +3FC01680ED7F0015FE4A5AEC03F0EC1FC0D90FFFC7FC15F090380001FCEC007FED3F80ED +1FC0ED0FE016F0ED07F816FC150316FEA2150116FFA3121EEA7F80487EA416FE491303A2 +007EC713FC00701407003015F80038140F6C15F06CEC1FE06C6CEB3FC0D803E0EB7F803A +01FE01FE0039007FFFF8010F13E0010190C7FC28447CC131>I<000615C0D807C0130701 +FCEB7F8090B612005D5D5D15E0158026063FFCC7FC90C9FCAE14FF010713C090381F01F0 +90383800FC01F0137ED807C07F49EB1F8016C090C7120F000615E0C8EA07F0A316F81503 +A216FCA5123E127F487EA416F890C712075A006015F0A20070140F003015E00038EC1FC0 +7E001EEC3F806CEC7F006C6C13FE6C6C485A3901F807F039007FFFE0011F90C7FCEB07F8 +26447BC131>53 D<16C04B7EA34B7EA34B7EA34B7EA3ED19FEA3ED30FFA203707FED607F +A203E07FEDC03FA2020180ED801FA2DA03007F160FA20206801607A24A6D7EA34A6D7EA3 +4A6D7EA20270810260147FA202E08191B7FCA249820280C7121FA249C87F170FA2010682 +1707A2496F7EA3496F7EA3496F7EA201788313F8486C83D80FFF03037FB500E0027FEBFF +C0A342477DC649>65 D<B6D8C003B6FCA3000101E0C70007138026007F80913801FE00B3 +A991B7FCA30280C71201B3AC2601FFE0913807FF80B6D8C003B6FCA340447CC349>72 +D<B56C933807FFFC6E5EA20001F1FE0026006FE0EE1BF8A3D967F01633A2D963F81663A3 +D961FC16C3A3D960FEED0183A2027FED0303A36E6C1406A36E6C140CA26E6C1418A36E6C +1430A36E6C1460A26E6C14C0A36E6CEB0180A3037FEB0300A292383F8006A36F6C5AA36F +6C5AA26F6C5AA36F6C5AA36F6C5AA26FB45AA370C7FC13F0A2486C143ED80FFFEF0FFEB5 +00F0011C0107B512FCA34E447BC359>77 D<EB07FC90383FFF809038F80FE03903C003F0 +48C66C7E000E6D7ED80FC0137E486C137F6D6D7EA36F7EA26C5AEA0380C8FCA4EC0FFF49 +B5FC90380FFE1FEB3FC0EBFF00EA03FC485A485A485A485A127F5B176048C7FCA3153FA3 +6D137F007F14EF6D9038C7E0C0003F13013A1FE00783F13B07F81E03FF802701FFFC0113 +003A001FE0007C2B2E7CAC31>97 D<167FED3FFFA315018182B3EC7F80903803FFF09038 +0FC07C90383F000E017E1307496D5AD803F87F48487F5B000F81485AA2485AA2127FA290 +C8FC5AAB7E7FA2123FA26C7EA2000F5D7F6C6C5B00035C6C6C9038077F806C6C010E13C0 +013F011C13FE90380FC0F8903803FFE09026007F0013002F467DC436>100 +D<EB01FE903807FFC090381F03F090387E00FC49137E48487F485A4848EB1F80000F15C0 +49130F121F484814E01507A2007F15F090C7FCA25AA390B6FCA290C9FCA67EA27FA2123F +16306C7E1670000F15606D14E06C6C14C0000314016C6CEB03806C6CEB0700013E131E90 +381F80F8903803FFE0010090C7FC242E7DAC2B>I<EA01FC12FFA3120712031201B3B3B3 +A5487EB512F8A315457DC41C>108 D<3901FC01FE00FF903807FFC091381E07F0913838 +01F8000701707F0003EBE0002601FDC07F5C01FF147F91C7FCA25BA35BB3A8486CECFF80 +B5D8F83F13FEA32F2C7DAB36>110 D<3903F803F000FFEB1FFCEC3C3EEC707F0007EBE0 +FF3803F9C000015B13FBEC007E153C01FF13005BA45BB3A748B4FCB512FEA3202C7DAB26 +>114 D<90383FE0183901FFFC383907E01F78390F0003F8001E1301481300007C147812 +7800F81438A21518A27EA27E6C6C13006C7E13FC383FFFE06C13FC6C13FF6C14C06C14E0 +C614F0011F13F81300EC0FFC140300C0EB01FE1400157E7E153EA27EA36C143C6C147C15 +786C14F86CEB01F039F38003E039F1F00F8039E07FFE0038C00FF01F2E7DAC26>I<B539 +F001FFFCA3000790C7EA7FE06C48EC1F8000011600160E0000150C6D141C6D1418A26E13 +38013F1430A26D6C5BA26E13E0010F5CA26D6C485AA2ECF803010391C7FCA2903801FC06 +A2ECFE0E0100130CA2EC7F18A215B8EC3FB0A2EC1FE0A36E5AA26E5AA36EC8FCA21406A3 +5CA25CA2123C007E5BB4FC5CA25CEAFE01387C0380D87007C9FCEA3C1EEA0FFCEA03F02E +3F7EAA33>121 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fq ecrm1728 17.28 18 +/Fq 18 118 df<150E151E153C157815F0EC01E0EC03C01407EC0F80EC1F00143EA25C5C +13015C495A13075C130F5C131F91C7FC5B133E137E137C13FCA2485AA3485AA3485AA312 +0F5BA3121F5BA3123FA390C8FCA25AA5127EA312FEB3A7127EA3127FA57EA27FA3121FA3 +7F120FA37F1207A36C7EA36C7EA36C7EA2137C137E133E133F7F80130F8013078013036D +7E801300147C80A280EC0F80EC07C01403EC01E0EC00F01578153C151E150E1F8F73EA34 +>40 D<12E07E12787E7E7E6C7E7F6C7E6C7E6C7EA2137C7F133F7F6D7E80130780130380 +130180130080147C147EA280A3EC1F80A3EC0FC0A315E01407A315F01403A315F8A31401 +A215FCA51400A315FEB3A715FCA31401A515F8A21403A315F0A3140715E0A3140F15C0A3 +EC1F80A3EC3F00A3147EA2147C14FC5C13015C13035C13075C130F5C49C7FC5B133E5B5B +A2485A485A485A5B48C8FC121E5A5A5A5A1F8F79EA34>I<170FA34D7EA24D7EA34D7EA3 +4D7EA34C7F17DFA29338039FFC178FA29338070FFE1707040F7FEE0E03A2041E80EE1C01 +A2043C80EE3800A24C80187FA24C80183FA24B4880181F0303814C130FA203078193C712 +07A24B81030E80A24B8284A24B8284A24B82197F03F0824B153FA20201834B151FA20203 +8392B8FCA24A83A292C91207020E8385A24A8485023C84023882A20278840270177FA202 +F0844A173FA24948841A1FA24948841A0FA249CB7F1A074985865B496C85497E48486C4D +7F000F01F8051F13F0B60407B612F0A45C657CE465>65 D<B912F018FF19E019F8C601FC +C8EA3FFED93FF8ED07FF011F040113C0727F737E737E737E737E1907737EA2731380A21B +C085A21BE0A91BC061A21B80611B004F5A190F624F5A4F5AF1FFE04E5B4E90C7FCF00FFE +F07FF894381FFFC091B748C8FCF0FFC019FC02F8C8EA07FF060013C0F13FE0F11FF8737E +737E737E7313807313C0F27FE0A2F23FF0A2F21FF8A21BFCA21A0F1BFEA91BFC1A1FA3F2 +3FF8A2F27FF0A2F2FFE0614F13C01B80070F13004F5A4F5AF1FFF8013F040313E0D9FFFC +033F5BBBC7FC19FC19E04EC8FC4F6278E15F>I<B912F018FF19E019F8C601FCC8EA7FFE +D93FF892380FFF80011F04017F9538007FF0F11FF8737EF103FE737E737F747E747E747E +1A0F87747E1A0387747EA2741380A2F37FC0A21CE01B3FA21CF0A21B1F1CF8A31CFCA21B +0FA41CFEAF1CFCA51B1F1CF8A4F33FF0A21CE0A21B7F1CC01BFF1C80A2501300A2505A50 +5AA2505A505A505A505A1AFF4F5B4F90C7FCF107FCF11FF8F17FF0953801FFC0013F0407 +5BD9FFFCDB7FFEC8FCBA12F819E096C9FC18F0576278E167>68 D<BB12FCA4C601FCC812 +0FD93FF89238007FFE011F171F190719031900A21A7E1A3EA21A1EA21A1F86A486A6F203 +80A318E0A297C7FCA61701A417031707170F171F17FF91B7FCA402F8C7FC171F170F1707 +17031701A41700A895C9FCB3A580133F90B57EB712E0A4496278E158>70 +D<B712C0A4C66CEB8000D91FFEC7FC6D5AB3B3B3B3AE497E90387FFF80B712C0A4226279 +E131>73 D<B500FC071FB51280A36E61C6F58000013F51C7FCD91DFFF177FCA2011C6D18 +E7A36E6CEF01C7A36E6CEF0387A36E6CEF0707A26E6C170EA36E6C171CA36E6C1738A36E +6C1770A26E6D16E0A36F6CED01C0A36F6CED0380A36F6CED0700A26F6C150EA36F6C5DA3 +6F6C5DA36F6C5DA26F6D5CA3706C495AA3706C495AA3706C49C7FCA2706C130EA3706C5B +A3706C5BA3706C5BA3706D5AA294387FC1C0A394383FE380A3DD1FF7C8FCA3EF0FFEA201 +3E6F5AA2137F715A2601FFC04F7E000701F096383FFF80B66C6D48023FB61280A3715A69 +6277E17C>77 D<B912C018FEF0FFC019F0C601FCC813FCD93FF8ED0FFF011F04037F0600 +7FF13FF0737E737E1907737E86731380A27313C0A31BE01A7FA21BF0A91BE0A21AFF1BC0 +A34F13801B00614F5A624F5A4F5AF17FE04F5A060390C7FCF01FFE943801FFF891B812E0 +96C8FC18F802F8CCFCB3B3A4497E90B5FCB7FCA44C6278E15C>80 +D<B812F8EFFFC018F818FFC601FCC7000F13C0D93FF8020013F0011FEE1FF8F007FE727E +06007F737E737E86737E737EA2737EA286A28587A998C8FC61A262A24F5A62191F4F5A62 +4F5A4E485A4E48C9FC4E5AF03FF0F0FFC0050F90CAFC91B712FC18C018F002F8C7EA1FFC +EF03FF050013C0727EF01FF0727E727E85727E727FA2727FA3737EAA86AAF401C086193F +A3071F1403741480070F1407496C8390B50407EC0F00B76F6C131E73EB803E9639007FE0 +7C97381FFFF8CD000713E09738007F805A6478E163>82 D<003FBC12F0A4912680000790 +3880000701FCC76C90C8FC01E0191F49190F4848F107F890C81703007E1A01007C1A00A3 +00781B78A400701B38A600F01B3C481B1CA7C91800B3B3B3A54C7FA2043F13F00203B8FC +A456627BE161>84 D<EC3FE0903803FFFE010F6D7E90393FC03FE090397C000FF801F0EB +03FC48486D7E48486D7E48486E7E48C86C7E7F01F06E7E487E6D6E7EA3707EA36C5AEA03 +E0C9FCA6167FED7FFF020FB5FC91387FF807903801FF80903807FC00EB1FF0EB7FC0495A +D803FEC7FC485A120F5B485A485AA24848EE01C0A312FF5BA2160FA3161F6D141B007F15 +3B16736D17806C6C9138E1FC03001FEC03C16C6C903A0780FE0700D807FE49486C5A2701 +FF807CEB7FFE6C6CB4486D5A011F01E06D5A010390C7EA07E03A4179BF43>97 +D<4AB47E020F13F8023F13FE9139FF007F80D903FCEB07E0D907F0EB01F0D91FE0EB0078 +49488049488049C87E48485D4915FF00034B138048485CA2485AA2485AA2003F6F130049 +EC007C94C7FC127FA35B12FFAD127F7FA4123F7FA2001FEE01C07F000F16036D16801207 +6C6C15076D160000015E6C6C151E6D6C5C6D6C5C6D6C5CD90FF8495AD903FCEB07C0903A +00FF803F8091263FFFFEC7FC020F13F80201138032417BBF3C>99 +D<1378EA01FE487E487FA66C90C7FC6C5AEA007890C8FCB3A2EB0780EA0FFFB5FCA41203 +C6FCA2137FB3B3AC497E487FB61280A4195F7BDE25>105 D<EB0780EA0FFFB5FCA41203 +C6FCA2137FB3B3B3B3AD497E487FB612C0A41A647BE325>108 D<D903C0D97FE04AB47E +D807FF902603FFFC020F13F0B5010F01FF023F13FCDB3F0001C09038FC03FF0378903C1F +E001E0007F804B6D6C48486D7E0001D9C1C06D6C48C76C7E27007FC380DAFC0E8102C7C7 +000349140FD93FCE6F48810501160702DC5E02D8166002F8912600FFE06E7E4A5EA34A5E +A34A93C8FCB3B3496C4A6D4A7E496C4A6D4A7EB6D8F003B6D8C00FB6FCA4683F7CBE71> +I<D903C0EB7FE0D807FF903803FFFCB5010F13FFDB3F0013C00378EB1FE04B6D7E0001D9 +C1C06D7E27007FC3808002C7C71203D93FCE81170114DC14D802F86E7E5CA35CA35CB3B3 +496C4A7F496C4A7FB6D8F003B612C0A4423F7CBE4B>I<D903C0150FD807FFED1FFFB502 +03B5FCA40001ED0007D8007F1501A2013F81B3B25FA35FA35F011F15066E140E5F130F6E +4A7F01075D6D6C494813E0D901FE4948EBFFC0903A00FFC01F8091393FFFFE00020F13F8 +020001C0EC800042407CBE4B>117 D E +%EndDVIPSBitmapFont +end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%PaperSize: A4 + +%%EndSetup +%%Page: 1 1 +1 0 bop Black 0 TeXcolorgray Black Black Black Black +781 2312 a Fq(Binc)46 b(IMAP)e(man)l(ual)h(\(DRAFT\))1149 +2773 y Fp(Andreas)34 b(Aardal)d(Hanssen)1391 3025 y(Ma)m(y)j(25,)e +(2003)p Black Black eop +%%Page: 2 2 +2 1 bop Black 0 TeXcolorgray Black 581 249 a Fo(2)p Black +Black Black eop +%%Page: 3 3 +3 2 bop Black 0 TeXcolorgray Black Black 183 1212 a Fn(Con)-6 +b(ten)g(ts)p 1 0 0 TeXcolorrgb 183 1748 a Fm(1)83 b(In)m(tro)s(ducing) +33 b(Binc)h(IMAP)p Black 1709 w(5)p 1 0 0 TeXcolorrgb +183 1951 a(2)83 b(Installing)34 b(Binc)h(IMAP)p Black +1815 w(7)p 1 0 0 TeXcolorrgb 318 2064 a Fo(2.1)93 b(Do)m(wnloading)33 +b(the)d(pac)m(k)-5 b(age)p Black 87 w(.)45 b(.)h(.)g(.)f(.)h(.)f(.)h(.) +g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)p Black +143 w(7)p Black 1 0 0 TeXcolorrgb 318 2177 a(2.2)93 b(Building)31 +b(from)g(the)g(tarball)p Black 25 w(.)46 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h +(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)p +Black 143 w(8)p Black 1 0 0 TeXcolorrgb 526 2290 a(2.2.1)104 +b(Options)31 b(to)g(con\034gure)p Black 64 w(.)46 b(.)g(.)f(.)h(.)f(.)h +(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)p +Black 143 w(9)p Black 1 0 0 TeXcolorrgb 318 2402 a(2.3)93 +b(Building)31 b(from)g(the)g(src.rpm)p Black 60 w(.)45 +b(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f +(.)h(.)p Black 98 w(10)p Black 1 0 0 TeXcolorrgb 318 +2515 a(2.4)93 b(After)30 b(building)i(and)f(installing)g(the)f(pac)m(k) +-5 b(age)p Black 40 w(.)45 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) +p Black 98 w(10)p Black 1 0 0 TeXcolorrgb 183 2719 a +Fm(3)83 b(Con\034guring)33 b(Binc)h(IMAP)p Black 1655 +w(11)p 1 0 0 TeXcolorrgb 318 2832 a Fo(3.1)93 b(In)m(tro)s(duction)32 +b(to)e Fl(Binc::Storage)p Black 57 w Fo(.)45 b(.)h(.)f(.)h(.)g(.)f(.)h +(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)p Black 98 w(11)p +Black 1 0 0 TeXcolorrgb 318 2944 a(3.2)93 b(Sections)31 +b(in)g Fl(bincimap.conf)p Black 92 w Fo(.)46 b(.)g(.)f(.)h(.)f(.)h(.)g +(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)p Black +98 w(12)p Black 1 0 0 TeXcolorrgb 526 3057 a(3.2.1)104 +b(Authen)m(tication)p Black 71 w(.)45 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h +(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)p +Black 98 w(13)p Black 1 0 0 TeXcolorrgb 526 3170 a(3.2.2)104 +b(Logging)p Black 67 w(.)46 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h +(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)p +Black 98 w(13)p Black 1 0 0 TeXcolorrgb 526 3283 a(3.2.3)104 +b(Securit)m(y)p Black 58 w(.)46 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f +(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)p +Black 98 w(14)p Black 1 0 0 TeXcolorrgb 526 3396 a(3.2.4)104 +b(Mailb)s(o)m(x)31 b(settings)p Black 77 w(.)46 b(.)f(.)h(.)g(.)f(.)h +(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)p +Black 98 w(15)p Black 1 0 0 TeXcolorrgb 526 3509 a(3.2.5)104 +b(Session)p Black 26 w(.)45 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f +(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)p +Black 98 w(16)p Black 1 0 0 TeXcolorrgb 526 3622 a(3.2.6)104 +b(SSL/TLS)p Black 77 w(.)46 b(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f +(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)p +Black 98 w(17)p Black 1 0 0 TeXcolorrgb 183 3825 a Fm(4)83 +b(The)35 b(Binc)f(IMAP)i(Dep)s(ot)p Black 1695 w(19)p +1 0 0 TeXcolorrgb 318 3938 a Fo(4.1)93 b(Maildir++)p +Black 28 w(.)45 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h +(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)p +Black 98 w(19)p Black 1 0 0 TeXcolorrgb 318 4051 a(4.2)93 +b(IMAPdir)p Black 30 w(.)46 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f +(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) +h(.)p Black 98 w(20)p Black Black 1654 5652 a(3)p Black +eop +%%Page: 4 4 +4 3 bop Black 0 TeXcolorgray Black 581 249 a Fo(4)2431 +b Fk(CONTENTS)p Black Black Black eop +%%Page: 5 5 +5 4 bop Black 0 TeXcolorgray Black Black 183 1171 a Fj(Chapter)60 +b(1)183 1586 y Fn(In)-6 b(tro)6 b(duction)p Black Black +410 2031 a Fo(\020As)30 b(an)g(alternativ)m(e)i(to)e(existing)h +(similar)g(IMAP)e(serv)m(ers,)i(Binc)f(IMAP)410 2144 +y(striv)m(es)g(to)h(b)s(e)f(v)m(ery)g(easy)g(to)h(use,)f(but)h(robust,) +f(stable)h(and)g(secure.\021)183 2324 y(W)-8 b(elcome)24 +b(to)g(Binc)g(IMAP)-8 b(,)23 b(a)g(pro)5 b(ject)24 b(started)g(Decem)m +(b)s(er)h(2003)f(b)m(y)f(Andreas)h(Aardal)183 2437 y(Hanssen.)65 +b(Binc)39 b(IMAP)f(is)g(an)h(op)s(en)f(source)h(IMAP)g(pro)5 +b(ject)39 b(whic)m(h)h(di\033ers)e(from)183 2550 y(existing)30 +b(IMAP)g(pro)5 b(jects.)41 b(Here)30 b(is)g(a)g(list)h(of)f(the)g(pro)5 +b(ject)31 b(goals:)p Black 294 2730 a(1.)p Black 46 w(Binc)g(IMAP)e +(will)i(alw)m(a)m(ys)g(ha)m(v)m(e)h(a)e(helpful,)h(hospitable)h(comm)m +(unit)m(y)-8 b(.)p Black 519 2907 a Fi(\017)p Black 46 +w Fo(Although)32 b(it)g(is)f(exp)s(ected)g(that)h(users)f(of)g(Binc)h +(IMAP)f(do)g(their)h(home-)610 3020 y(w)m(ork)44 b(b)s(efore)f(p)s +(osting)g(to)g(the)h(mailing)g(list,)j(the)c(serv)m(er)h(author)g(and) +610 3133 y(comm)m(unit)m(y)e(of)e(the)h(Binc)f(IMAP)g(pro)5 +b(ject)40 b(will)h(b)s(e)f(friendly)g(and)h(will)610 +3246 y(approac)m(h)35 b(ev)m(ery)m(one)g(with)f(resp)s(ect.)50 +b(The)34 b(same)g(b)s(eha)m(vior)g(is)f(exp)s(ected)610 +3359 y(from)d(those)h(who)g(p)s(ost)f(to)g(the)h(list.)p +Black 519 3494 a Fi(\017)p Black 46 w Fo(There)36 b(will)g(b)s(e)f(no)h +(R)-8 b(TFM)p 1 0 0 TeXcolorrgb -33 x Fh(1)p Black 1652 +3494 a Fo(on)35 b(the)h(pro)5 b(ject's)36 b(mailing)h(list.)55 +b(Flaming)610 3607 y(and)42 b(p)s(ersonal)h(insults)f(on)g(the)h(pro)5 +b(ject's)42 b(mailing)h(list)f(will)h(result)f(in)610 +3720 y(banning)31 b(of)f(the)h(originator.)p Black 519 +3856 a Fi(\017)p Black 46 w Fo(The)36 b(comm)m(unit)m(y)h(is)e +(encouraged)i(to)e(pa)m(y)h(bac)m(k)g(to)f(the)h(pro)5 +b(ject's)36 b(con-)610 3969 y(tributors)42 b(b)m(y)g(sharing)g(their)g +(o)m(wn)h(exp)s(erience)f(and)g(con)m(tributions)h(to)610 +4081 y(Binc)31 b(IMAP)e(through)j(the)f(GPL)g(license.)p +Black 294 4258 a(2.)p Black 46 w(Binc)g(IMAP)e(will)i(not)g(comp)s(ete) +g(with)g(other)g(IMAP)f(pro)5 b(jects)p Black 519 4435 +a Fi(\017)p Black 46 w Fo(Under)27 b(no)f(circumstance)i(will)f(this)g +(pro)5 b(ject)27 b(b)s(e)f(in)h(mark)m(et)g(driv)m(en)h(com-)610 +4548 y(p)s(etition)j(with)g(other)g(IMAP)f(serv)m(ers.)p +Black 519 4684 a Fi(\017)p Black 46 w Fo(Binc)h(IMAP)e(will)i(\034rst)g +(and)f(foremost)h(b)s(e)f(a)g(qualit)m(y)h(driv)m(en)g(pro)5 +b(ject.)p Black 519 4819 a Fi(\017)p Black 46 w Fo(This)37 +b(pro)5 b(ject)38 b(is)e(mean)m(t)i(to)g(in\035uence)g(the)f(comm)m +(unit)m(y)i(of)e(authors)h(of)610 4932 y(similar)33 b(net)m(w)m(ork)i +(proto)s(cols)f(and)f(serv)m(ers,)h(and)f(hop)s(es)g(to)g(increase)h +(the)610 5045 y(general)44 b(qualit)m(y)f(of)f(soft)m(w)m(are)i(that)g +(is)e(used)h(all)g(o)m(v)m(er)h(the)f(glob)s(e)g(and)610 +5158 y(b)s(ey)m(ond.)p Black 183 5226 1196 4 v 286 5280 +a Fg(1)p 0 TeXcolorgray Black 321 5312 a Ff(A)n(ccording)28 +b(to)h(acron)n(ym\034nder.com,)e(R)-6 b(TFM)28 b(stands,)i(among)e(man) +n(y)e(other)j(suggestions,)i(for)183 5403 y(\020Read)25 +b(The)g(F)-6 b(sc)n(king)26 b(Man)n(ual\021)32 b(\(fsc)n(k)26 +b(is)g(a)g(Unix)f(\034lesystem)f(c)n(hec)n(k)n(er\))p +Black Black 1654 5652 a Fo(5)p Black eop +%%Page: 6 6 +6 5 bop Black 0 TeXcolorgray Black 581 249 a Fo(6)1110 +b Fk(CHAPTER)30 b(1.)71 b(INTR)m(ODUCING)29 b(BINC)h(IMAP)p +Black Black 693 548 a Fo(3.)p Black 45 w(Binc)h(IMAP)f(pro)m(vides)h +(securit)m(y)g(through)h(go)s(o)s(d)d(design)p Black +918 736 a Fi(\017)p Black 45 w Fo(A)34 b(w)m(ell)g(designed)h(serv)m +(er)f(is)f(less)g(exp)s(osed)g(to)h(bugs)g(than)g(a)f(p)s(o)s(orly)g +(de-)1008 848 y(signed)e(serv)m(er.)p Black 918 995 a +Fi(\017)p Black 45 w Fo(The)e(serv)m(er)g(will)g(striv)m(e)f(to)h(use)f +(ev)m(ery)h(kind)f(of)g(securit)m(y)h(enhancing)h(fea-)1008 +1108 y(ture,)c(while)d(k)m(eeping)h(the)g(implemen)m(tation)i(details)d +(as)g(go)s(o)s(d)g(and)g(simple)1008 1220 y(as)30 b(p)s(ossible.)p +Black 918 1367 a Fi(\017)p Black 45 w Fo(The)46 b(source)f(is)f(op)s +(en)h(and)g(do)m(wnloadable.)86 b(P)m(oten)m(tial)47 +b(bugs)e(and/or)1008 1479 y(nast)m(y)39 b(pieces)g(of)g(co)s(de)g(are)g +(easily)f(unco)m(v)m(ered)j(when)e(the)h(whole)f(com-)1008 +1592 y(m)m(unit)m(y)33 b(is)f(able)g(to)f(study)h(ev)m(ery)f(line)h(of) +g(co)s(de)f(in)h(detail.)45 b(Bugs)31 b(should)1008 1705 +y(alw)m(a)m(ys)h(b)s(e)e(rep)s(orted)h(to)f(the)h(pro)5 +b(ject's)31 b(mailing)g(list.)p Black 693 1893 a(4.)p +Black 45 w(Binc)g(IMAP)f(is)g(mo)s(dular)p Black 918 +2081 a Fi(\017)p Black 45 w Fo(Where)e(p)s(ossible)f(and)g(practical)i +(from)e(b)s(oth)g(a)g(usage)g(and)h(design)f(stand)1008 +2193 y(p)s(oin)m(t,)42 b(mo)s(dules)e(will)f(b)s(e)g(sep)s(erated)g +(and)h(replaceable)g(through)h Fe(plug-)1008 2306 y(gable)35 +b(extension)e(supp)-5 b(ort)p Fo(.)42 b(Examples)31 b(of)f(future)h +(replaceables)h(and)f(en-)1008 2419 y(hancemen)m(ts)i(include:)p +Black 1081 2565 a Fm(\025)p Black 45 w Fo(authen)m(tication)h(mo)s +(dules)c(\(shado)m(w,)i(P)-8 b(AM,)31 b(LD)m(AP\))p Black +1081 2695 a Fm(\025)p Black 45 w Fo(searc)m(h)h(mo)s(dules)p +Black 1081 2824 a Fm(\025)p Black 45 w Fo(proto)s(col)e(extensions)f +(mo)s(dules)g(\(namespaces,)h(A)m(CL,)g(shared)g(fold-)1178 +2937 y(ers\))p Black 1081 3067 a Fm(\025)p Black 45 w +Fo(mailb)s(o)m(x)h(formats)g(\(Maildir,)g(m)m(b)s(o)m(x\))p +Black 918 3213 a Fi(\017)p Black 45 w Fo(With)23 b(a)g(mo)s(dular)g +(and)g(go)s(o)s(d)f(ob)5 b(ject)23 b(orien)m(ted)i(design,)f(it)f(will) +g(b)s(e)f(easy)h(to)1008 3326 y(quic)m(kly)35 b(understand)g(what)g(ev) +m(ery)f(metho)s(d)h(and)g(function)g(do)s(es.)52 b(This)1008 +3439 y(will)42 b(increase)g(third)g(part)m(y)h(dev)m(elop)s(ers')f +(abilit)m(y)g(to)g(write)g(extensions)1008 3552 y(and)31 +b(mo)s(di\034cations)h(fast.)p Black 693 3739 a(5.)p +Black 45 w(Binc)f(IMAP)f(fa)m(v)m(ors)h(qualit)m(y)f(o)m(v)m(er)i(quan) +m(tit)m(y)p Black 918 3952 a Fi(\017)p Black 45 w Fo(Binc)f(IMAP's)f +(releases)g(are)h(milestones.)41 b(W)-8 b(e)31 b(striv)m(e)f(for)g(p)s +(erfection.)p Black 918 4098 a Fi(\017)p Black 45 w Fo(W)-8 +b(ork)36 b(on)f(impro)m(ving)h(the)f(existing)h(design)f(and)g +(extensibilit)m(y)h(will)f(al-)1008 4211 y(w)m(a)m(ys)c(go)g(ahead)g +(of)f(adding)h(new)g(features.)p Black 918 4357 a Fi(\017)p +Black 45 w Fo(Through)c(extensiv)m(e)e(mo)s(dule)h(supp)s(ort,)g(the)f +(comm)m(unit)m(y)i(is)e(encouraged)1008 4470 y(to)31 +b(con)m(tribute)h(to)f(the)g(adding)g(and)g(testing)f(of)g(new)h +(features.)p Black 918 4616 a Fi(\017)p Black 45 w Fo(Core)g(design)g +(and)g(implemen)m(tation)i(will)e(alw)m(a)m(ys)g(fo)s(cus)f(on)g +(qualit)m(y)-8 b(.)722 4829 y Fm(This)35 b(do)s(cumen)m(t)f(serv)m(es)h +(as)g(the)g(serv)m(er's)g(main)f(do)s(cumen)m(tation.)p +Black Black eop +%%Page: 7 7 +7 6 bop Black 0 TeXcolorgray Black Black 183 1171 a Fj(Chapter)60 +b(2)183 1586 y Fn(Installation)183 2032 y Fo(The)30 b(installation)h +(pro)s(cedure)g(for)f(Binc)h(IMAP)e(is)h(designed)h(to)f(b)s(e)f(quic)m +(k)i(and)f(easy)-8 b(,)183 2145 y(and)37 b(in)h(most)f(cases)g(y)m(ou)g +(will)h(get)f(what)h(y)m(ou)g(w)m(an)m(t)g(at)g(y)m(our)f(\034rst)h +(attempt.)62 b(The)183 2257 y(source)30 b(co)s(de)h(is)f(designed)h(to) +f(b)s(e)g(able)h(to)g(compile)g(on)g(most)f(UNIX-lik)m(e)g(platforms.) +324 2371 y(If)39 b(y)m(ou)i(exp)s(erience)g(problems)g(with)f +(compiling)i(and)f(installing)g(this)f(pac)m(k)-5 b(age)183 +2484 y(on)33 b(y)m(our)g(o)m(wn)h(platform,)g(don't)f(hesitate)h(to)e +(p)s(ost)h(y)m(our)g(problem)h(to)f(the)g(pro)5 b(ject's)183 +2596 y(mailing)31 b(list.)183 2885 y Fd(2.1)130 b(Do)l(wnloading)44 +b(the)g(pac)l(k)-7 b(age)183 3088 y Fo(Binc)30 b(IMAP)f(is)h(a)m(v)-5 +b(ailable)31 b(for)e(a)h(n)m(um)m(b)s(er)i(of)d(platforms)h(and)h +(distributions.)41 b(Do)m(wn-)183 3201 y(load)24 b(the)f(pac)m(k)-5 +b(age)25 b(most)e(suitable)h(for)f(y)m(our)h(distribution)h(from)e(one) +h(of)f(the)h(follo)m(wing)183 3314 y(lo)s(cations:)p +Black 319 3528 a Fi(\017)p Black 46 w Fo(Red)30 b(Hat)g(Lin)m(ux:)p +Black 513 3717 a Fm(\025)p Black 0 1 0 0 TeXcolorcmyk +45 w Fl(http://www.bincimap.org/)p Black Black 513 3864 +a Fm(\025)p Black 0 1 0 0 TeXcolorcmyk 45 w Fl +(http://www.bincimap.andreas.hanssen.name/)p Black Black +513 4010 a Fm(\025)p Black 0 1 0 0 TeXcolorcmyk 45 w +Fl(http://bincimap.argonsoft.de/)p Black Black 319 4199 +a Fi(\017)p Black 46 w Fo(Mandrak)m(e)h(Lin)m(ux:)p Black +513 4388 a Fm(\025)p Black 0 1 0 0 TeXcolorcmyk 45 w +Fl(ftp://sunsite.uio.no/linux/Mandrake/Mandrake-)t(devel/contrib)p +Black Black 319 4577 a Fi(\017)p Black 46 w Fo(Debian)g(Lin)m(ux:)p +Black 513 4766 a Fm(\025)p Black 0 1 0 0 TeXcolorcmyk +45 w Fl(http://packages.debian.org/testing/mail/bincimap.html)p +Black Black 513 4912 a Fm(\025)p Black 0 1 0 0 TeXcolorcmyk +45 w Fl(http://packages.debian.org/unstable/mail/bincimap.html)p +Black Black 319 5101 a Fi(\017)p Black 46 w Fo(F)-8 b(reeBSD:)p +Black 513 5290 a Fm(\025)p Black 0 1 0 0 TeXcolorcmyk +45 w Fl(http://www.freebsd.org/cgi/ports.cgi?query=bincimap&stype=)610 +5403 y(all)p Black Black 1654 5652 a Fo(7)p Black eop +%%Page: 8 8 +8 7 bop Black 0 TeXcolorgray Black 581 249 a Fo(8)1223 +b Fk(CHAPTER)30 b(2.)71 b(INST)-8 b(ALLING)30 b(BINC)g(IMAP)p +Black Black 718 548 a Fi(\017)p Black 45 w Fo(Other)i(\(tarball\):)p +Black 911 740 a Fm(\025)p Black 0 1 0 0 TeXcolorcmyk +45 w Fl(http://www.bincimap.org/)p Black Black 911 888 +a Fm(\025)p Black 0 1 0 0 TeXcolorcmyk 45 w Fl +(http://www.bincimap.andreas.hanssen.name/)p Black Black +911 1036 a Fm(\025)p Black 0 1 0 0 TeXcolorcmyk 45 w +Fl(http://bincimap.argonsoft.de/)p Black 581 1328 a Fd(2.2)131 +b(Building)45 b(from)f(the)g(tarball)581 1533 y Fo(This)37 +b(section)g(describ)s(es)g(ho)m(w)g(y)m(ou)g(can)g(build)h(the)f(Binc)f +(IMAP)h(serv)m(er)g(using)f(the)581 1646 y(compressed)22 +b(tar)f(arc)m(hiv)m(e)i(\()p Fe(tarb)-5 b(al)5 b(l)k +Fo(\).)39 b(This)21 b(approac)m(h)i(should)f(w)m(ork)f(on)h(all)f(supp) +s(orted)581 1759 y(platforms.)722 1873 y(The)j(tarball)g(creates)g(a)f +(sep)s(erate)g(directory)h(in)g(whic)m(h)g(it)f(installs)h(all)f +(source)h(\034les.)581 1985 y(The)36 b(installation)h(pro)s(cedure)g +(is)e(t)m(ypical)i(for)e(op)s(en)h(source)g(C)g(and)g(C++)h(soft)m(w)m +(are)581 2098 y(that)31 b(uses)f(the)h Fl(autoconf)f +Fo(and)g Fl(automake)g Fo(to)s(ols.)40 b(First,)31 b(unpac)m(k)g(the)g +(tarball:)581 2316 y Fl(#)47 b(zcat)g(bincimap-1.1.6.tar.gz)f(|)h(tar)g +(xvf)g(-)581 2429 y(<outputs)g(a)g(list)g(of)g(files>)581 +2646 y Fo(No)m(w,)38 b(en)m(ter)g(the)e(directory)h(that)g(w)m(as)g +(created.)59 b(In)36 b(this)g(directory)-8 b(,)39 b(y)m(ou)e(will)f +(\034nd)581 2759 y(the)31 b Fl(configure)f Fo(script.)581 +2977 y Fl(#)47 b(cd)g(bincimap-1.1.6)581 3090 y(#)g(ls)g(configure)581 +3203 y(configure)581 3316 y(#)581 3533 y Fo(Run)20 b(the)h(con\034gure) +h(script)e(with)h(all)g(options)f(y)m(ou)h(\034nd)g(appropriate.)39 +b(The)21 b Fl(configure)581 3646 y Fo(options)32 b(are)h(listed)f(in)f +(section)p 0 1 0 0 TeXcolorcmyk 33 w(2.2.1)p Black 32 +w(on)h(the)g(facing)g(page.)46 b(Most)31 b(users)g(will)i(b)s(e)e(ok) +581 3759 y(with)g(these)g(common)g(options:)581 3977 +y Fl(#)47 b(./configure)g(--prefix=/opt/bincimap)f +(--sysconfdir=/etc/opt/bincimap)581 4194 y Fo(The)36 +b Fl(configure)f Fo(script)g(will)h(pro)s(duce)g(man)m(y)g(lines)f(of)g +(output,)j(and)d(\034nally)-8 b(,)38 b(if)d(all)581 4307 +y(go)s(es)27 b(w)m(ell,)i(it)f(will)g(create)g(all)g(the)f +Fl(Makefile)p Fo(s)g(w)m(e)h(need)g(to)g(build)g(this)f(pro)5 +b(jectm)28 b(W)-8 b(e)581 4420 y(can)31 b(no)m(w)g(run)g +Fl(make)p Fo(:)581 4637 y Fl(#)47 b(make)581 4855 y Fo(If)30 +b(the)g(compile)i(\034nishes)e(with)h(no)g(problems,)g(y)m(ou)g(can)f +(install)h(y)m(our)g(new)g(soft)m(w)m(are:)581 5073 y +Fl(#)47 b(make)g(install)581 5290 y Fo(If)37 b(the)h +Fl(prefix)g Fo(option)h(is)e Fl(/opt/bincimap)p Fo(,)j +Fl(make)47 b(install)37 b Fo(will)i(create)g(the)f(fol-)581 +5403 y(lo)m(wing)32 b(\034les:)p Black Black eop +%%Page: 9 9 +9 8 bop Black 0 TeXcolorgray Black 183 249 a Fk(2.2.)71 +b(BUILDING)29 b(FR)m(OM)h(THE)h(T)-8 b(ARBALL)1274 b +Fo(9)p Black 183 548 a Fl(/opt/bincimap/bin/bincimap-up)657 +b(#)47 b(Startup)f(stub)183 661 y(/opt/bincimap/bin/bincimapd)751 +b(#)47 b(Main)f(server)183 774 y(/opt/bincimap/man/man1/bincimap-up.1) +328 b(#)47 b(Man)g(page)183 887 y(/opt/bincimap/man/man1/bincimapd.1) +422 b(#)47 b(Man)g(page)183 1000 y +(/opt/bincimap/man/man5/bincimap.conf.5)234 b(#)47 b(Man)g(page)183 +1234 y Fo(The)33 b Fl(sysconfdir)g Fo(option)h(tells)g(Binc)f(IMAP)g +(where)h(to)g(install)f(the)h(con\034guration)183 1346 +y(\034les.)39 b(If)34 b Fl(sysconfdir)27 b Fo(is)g(set)h(to)f +Fl(/etc/opt/bincimap)p Fo(,)h Fl(make)47 b(install)27 +b Fo(will)h(create)183 1459 y(the)i(follo)m(wing)i(\034les:)183 +1693 y Fl(/etc/opt/bincimap/bincimap.conf)563 b(#)47 +b(Main)f(conf)h(file)183 1806 y(/etc/opt/bincimap/xinetd/imap)657 +b(#)47 b(xinetd)f(conf)h(file)183 1919 y +(/etc/opt/bincimap/xinetd/imaps)610 b(#)47 b(xinetd)f(conf)h(file)183 +2032 y(/etc/opt/bincimap/supervise/imap/run)328 b(#)47 +b(supervise)f(conf)h(file)183 2145 y +(/etc/opt/bincimap/supervise/imap/log/run)140 b(#)47 +b(supervise)f(conf)h(file)183 2258 y +(/etc/opt/bincimap/supervise/imaps/run)281 b(#)47 b(supervise)f(conf)h +(file)183 2371 y(/etc/opt/bincimap/supervise/imaps/log/run)93 +b(#)47 b(supervise)f(conf)h(file)183 2605 y Fo(Y)-8 b(ou)36 +b(are)g(no)m(w)h(ready)f(to)g(con\034gure)h(Binc)f(IMAP)-8 +b(.)36 b(Read)g(more)g(ab)s(out)h(this)e(in)h(sec-)183 +2718 y(tion)p 0 1 0 0 TeXcolorcmyk 30 w(3)p Black 31 +w(on)30 b(page)p 0 1 0 0 TeXcolorcmyk 31 w(11)p Black(.)183 +2986 y Fc(2.2.1)112 b(Options)37 b(to)g(con\034gure)p +Black 319 3165 a Fi(\017)p Black 46 w Fl(--prefix=<dir>)410 +3278 y Fo(Where)g(to)g(install)g(binary)g(\034les)g(and)g(man)g(pages.) +60 b(Binary)37 b(\034les)f(will)i(b)s(e)e(in-)410 3391 +y(stalled)31 b(under)g Fl(<dir>/bin)f Fo(and)h(man)f(pages)h(go)g +(under)g Fl(<dir>)p Fo(/man.)p Black 319 3596 a Fi(\017)p +Black 46 w Fl(--sysconfdir=<dir>)410 3709 y Fo(Where)43 +b(to)g(install)h(con\034guration)h(\034les.)78 b(The)43 +b(main)h(conf)f(\034le)g(go)s(es)f(under)410 3822 y Fl +(<dir>/bincimap.conf)20 b Fo(and)g(other)h(conf)g(\034les)f(go)g(under) +i Fl(<dir>/<path>/...)o Fo(,)410 3935 y(dep)s(ending)31 +b(on)g(the)g(t)m(yp)s(e)f(of)g(conf)g(\034les.)410 4094 +y Fm(Note:)64 b Fo(The)42 b(bundled)h(sup)s(ervise)f(\034les)f(m)m(ust) +i Fm(not)f Fo(b)s(e)f(stored)h(on)g(an)g(NFS)410 4207 +y(partition)32 b(or)e(an)m(y)h(partition)h(that)e(do)s(es)g(not)h(supp) +s(ort)g(\034le)f(lo)s(c)m(king.)p Black 319 4411 a Fi(\017)p +Black 46 w Fl(--disable-ssl)410 4524 y Fo(Compile)44 +b(Binc)g(IMAP)e(with)i(no)f(SSL)h(co)s(de,)i(and)e(without)g(the)f(Op)s +(enSSL)410 4637 y(requiremen)m(t.)f(Also)30 b(remo)m(v)m(es)i(the)e(ST) +-8 b(AR)g(TTLS)32 b(capabilit)m(y)-8 b(.)p Black 319 +4842 a Fi(\017)p Black 46 w Fl(--enable-ssl)30 b Fo(\(default\))410 +4955 y(Compile)37 b(Binc)e(IMAP)g(with)h(SSL)g(co)s(de,)h(and)f(with)g +(the)g(Op)s(enSSL)h(require-)410 5068 y(men)m(t.)42 b(Enables)31 +b(the)f(ST)-8 b(AR)g(TTLS)33 b(capabilit)m(y)-8 b(.)p +Black 319 5272 a Fi(\017)p Black 46 w Fl(--enable-static)410 +5385 y Fo(Compile)31 b(Binc)g(IMAP)f(with)h(static)f(link)-5 +b(age.)p Black Black eop +%%Page: 10 10 +10 9 bop Black 0 TeXcolorgray Black 581 249 a Fo(10)1178 +b Fk(CHAPTER)30 b(2.)71 b(INST)-8 b(ALLING)30 b(BINC)g(IMAP)p +Black 581 548 a Fd(2.3)131 b(Building)45 b(from)f(the)g(src.rpm)581 +751 y Fo(The)35 b Fl(src.rpm)f Fo(pac)m(k)-5 b(ages)34 +b(are)h(designed)g(for)f(the)g(Red)g(Hat)g(Lin)m(ux)h(distribution.)54 +b(If)581 864 y(y)m(ou)32 b(are)g(not)g(running)h(Red)f(Hat)f(Lin)m(ux)i +(or)f(similar)g(distributions)h(and)f(this)f(pro)s(ce-)581 +977 y(dure)c(fails,)g(then)g(y)m(ou)g(should)g(build)h(Binc)e(IMAP)g +(from)h(the)g(tarball)g(\(section)p 0 1 0 0 TeXcolorcmyk +28 w(2.2)p Black 27 w(on)581 1090 y(page)p 0 1 0 0 TeXcolorcmyk +31 w(8)p Black(\).)p Black 718 1302 a Fi(\017)p Black +45 w Fo(Mak)m(e)h(sure)g(y)m(ou)h(ha)m(v)m(e)g(the)f +Fl(rpmbuild)f Fo(program)i(installed.)41 b(In)27 b(Red)h(Hat,)g(it)g +(is)808 1415 y(a)j(part)g(of)f(the)g Fl(rpm-build)g Fo(pac)m(k)-5 +b(age.)p Black 718 1603 a Fi(\017)p Black 45 w Fo(As)30 +b(ro)s(ot)p 1 0 0 TeXcolorrgb -33 x Fh(1)p Black 1145 +1603 a Fo(,)g(run)h(the)f(follo)m(wing)i(command:)808 +1815 y Fl(rpmbuild)47 b(--rebuild)g(bincimap-1.1.6-1.src.rpm)p +Black 718 2028 a Fi(\017)p Black 45 w Fo(If)20 b(the)i(command)g +(succeeds,)h(y)m(ou)e(will)h(ha)m(v)m(e)g(generated)g(a)f(binary)g(rpm) +h(pac)m(k)-5 b(age)808 2141 y(that)31 b(y)m(ou)g(can)g(install.)808 +2353 y Fl(rpm)47 b(-i)g(bincimap-1.1.6-1.i386.rpm)581 +2640 y Fd(2.4)131 b(After)44 b(building)h(and)f(installing)i(the)d(pac) +l(k)-7 b(age)581 2842 y Fo(When)31 b(the)g(service)f(has)h(b)s(een)f +(installed)i(successfully)-8 b(,)30 b(y)m(ou)h(should)g(tak)m(e)g(y)m +(our)g(time)581 2955 y(to)g(con\034gure)g(it)g(prop)s(erly)-8 +b(.)41 b(Please)31 b(refer)f(to)h(section)p 0 1 0 0 TeXcolorcmyk +31 w(3)p Black 30 w(on)g(the)f(next)h(page.)p Black 581 +5226 1196 4 v 685 5280 a Fg(1)p 0 TeXcolorgray Black +719 5312 a Ff(It)41 b(is)h(p)r(ossible)g(to)f(build)g(src.rpm)f(pac)n +(k)l(ages)i(as)g(non-ro)r(ot.)81 b(There)41 b(is)h(info)g(a)n(v)l +(ailable)g(on)581 5403 y(h)n(ttp://www.rpm.org/)28 b(ab)r(out)d(this.)p +Black Black Black eop +%%Page: 11 11 +11 10 bop Black 0 TeXcolorgray Black Black 183 1171 a +Fj(Chapter)60 b(3)183 1587 y Fn(Con\034guration)183 2032 +y Fo(With)34 b(most)h(services,)g(the)g(hardest)g(thing)g(to)g(get)g +(righ)m(t)g(is)f(the)h(con\034guration)i(\034le.)183 +2145 y(With)26 b(Binc)g(IMAP)-8 b(,)26 b(this)g(should)h(not)f(b)s(e)g +(a)g(problem)h(for)f(the)h(administrator.)40 b(There)183 +2258 y(are)28 b(few)h(options)g(to)g(set,)f(and)h(the)g(pac)m(k)-5 +b(age)30 b(also)e(pro)m(vides)i(a)e(default)h(con\034guration)183 +2371 y(\034le)h(whose)h(default)g(settings)f(are)h(\034ne)g(for)f(most) +g(uses.)324 2484 y(This)41 b(section)g(will)h(\034rst)f(giv)m(e)h(an)f +(o)m(v)m(erview)h(of)f(the)g(format)h(of)f(Binc)g(IMAP's)183 +2597 y(con\034guration)32 b(\034le,)f(and)g(it)f(will)h(then)g(explain) +g(ev)m(ery)f(option)h(that)g(y)m(ou)g(can)g(set.)183 +2886 y Fd(3.1)130 b(In)l(tro)t(duction)46 b(to)d Fb(Binc::Storage)183 +3089 y Fo(Binc)33 b(IMAP)g(uses)h(a)f(sp)s(ecial)h(\034le)f(format,)i +(called)g Fl(Binc::Storage)e Fo(after)g(its)h(C++)183 +3202 y(class)23 b(name.)39 b(This)24 b(\034le)g(format)g(is)f(h)m(uman) +i(readable)g(and)f(editable,)j(it's)c(fast)g(to)h(parse)183 +3315 y(programmatically)-8 b(,)30 b(and)e(it)f(has)g(v)m(ery)g(little)g +(o)m(v)m(erhead)i(when)f(represen)m(ting)h(data.)40 b(It)183 +3428 y(also)f(groups)g(options)h(together)g(in)g(sections,)h(supp)s +(orts)e(commen)m(ts)i(\(c-st)m(yle\))f(and)183 3541 y(arbitrary)31 +b(whitespace)g(usage.)324 3654 y(The)g(structure)g(of)f(the)g(\034le)h +(is)f(as)g(follo)m(ws:)p Black 294 3869 a(1.)p Black +46 w(Aliases)p Black 294 4058 a(2.)p Black 46 w(Section1)p +Black 449 4247 a(\(a\))p Black 46 w(k)m(ey1=v)-5 b(alue1)p +Black 444 4394 a(\(b\))p Black 46 w(k)m(ey2=v)g(alue2)p +Black 454 4541 a(\(c\))p Black 46 w(...)p Black 294 4731 +a(3.)p Black 46 w(Section2)p Black 449 4920 a(\(a\))p +Black 46 w(k)m(ey1=v)g(alue1)p Black 444 5067 a(\(b\))p +Black 46 w(k)m(ey2=v)g(alue2)p Black 454 5214 a(\(c\))p +Black 46 w(...)p Black 294 5403 a(4.)p Black 46 w(SectionN...)p +Black 1632 5652 a(11)p Black eop +%%Page: 12 12 +12 11 bop Black 0 TeXcolorgray Black 581 249 a Fo(12)1067 +b Fk(CHAPTER)30 b(3.)71 b(CONFIGURING)28 b(BINC)i(IMAP)p +Black 581 548 a Fo(Mo)m(ving)25 b(on)f(to)h(the)f(actual)h(format,)h +(the)f(\034le)f(starts)g(with)h(an)f(optional)i(list)e(of)g(aliases.) +581 661 y(These)34 b(aliases)f(start)h(with)g(a)g(question)f(mark)h +(\(?\),)g(follo)m(w)m(ed)h(b)m(y)f(the)g(alias,)h(a)e(colon)581 +774 y(\(:\),)h(the)g(replacemen)m(t)i(text,)e(and)f(\034nally)h(a)f +(semicolon)i(\(;\).)49 b(This)33 b(example)h(de\034nes)581 +887 y(the)d(alias)f("m")h(to)g(represen)m(t)g(the)g(text)f("m)m +(y\034rstsection":)581 1106 y Fl(?m:MyFirstSection;)581 +1326 y Fo(Then)c(comes)f(sections.)38 b(A)25 b(section)g(starts)g(with) +g(an)g(iden)m(ti\034er)i(\026)e(the)g(section)g(name.)581 +1439 y(The)35 b(name)g(con)m(tains)g(only)g(alphan)m(umeric)i(\(a)d(to) +h(z,)g(A)f(to)g(Z)h(and)f(0-9\))h(c)m(haracters,)581 +1552 y(and)26 b(it's)f(case)g(sensitiv)m(e)h(\(\020hello\021)33 +b(and)26 b(\020HELLO\021)34 b(could)26 b(b)s(e)f(t)m(w)m(o)i +(di\033eren)m(t)f(sections\).)581 1665 y(The)31 b(section)g(con)m(ten)m +(t)h(itself)e(is)g(enclosed)h(in)g(braces,)g(as)f(in)g(the)h(follo)m +(wing)g(example.)581 1884 y Fl(MyFirstSection)47 b({)581 +2110 y(})581 2330 y Fo(Inside)38 b(a)h(section)f(w)m(e)h(ha)m(v)m(e)h +(a)e(comma)h(sep)s(erated)g(list)f(of)g(k)m(ey=v)-5 b(alue)39 +b(pairs.)64 b(The)581 2442 y(k)m(eys)36 b(and)h(v)-5 +b(alues)37 b(consist)f(of)h(a)f(sequence)h(of)g(one)g(or)f(more)i +(alphan)m(umeric)h(w)m(ords.)581 2555 y(The)31 b(v)-5 +b(alue)31 b(can)f(also)h(con)m(tain)g(quoted)g(strings:)581 +2775 y Fl(MyFirstSection)47 b({)769 2888 y(certificate)g(path)g(=)g +("/etc/path/certificate.txt",)769 3001 y(optional)g(argument)g(=)g(yes) +581 3114 y(})581 3333 y Fo(The)36 b(aliases)f(from)h(the)g(start)f(of)g +(the)h(con\034guration)h(\034le)f(are)g(useful)f(if)g(w)m(e)h(wish)g +(to)581 3446 y(appreviate)31 b(long)f(w)m(ords)h(in)e(a)h(k)m(ey)g(or)f +(section)i(name)f(in)g(order)g(to)g(sa)m(v)m(e)g(space.)41 +b(Nor-)581 3559 y(mally)28 b(this)f(is)f(only)h(used)h(in)f(generated)h +(\034les,)g(but)g(they)f(can)g(also)g(mak)m(e)h(a)f(man)m(ually)581 +3672 y(edited)g(conf)g(\034le)g(more)g(compact.)40 b(Here)27 +b(w)m(e)g(ha)m(v)m(e)h(replaced)f(\020MyFirstSection\021)35 +b(with)581 3785 y(its)30 b(alias)h(\020m\021:)581 4005 +y Fl(m)47 b({)769 4117 y(certificate)g(path)g(=)g +("/etc/path/certificate.txt",)769 4230 y(optional)g(argument)g(=)g +("yes")581 4343 y(})581 4563 y Fo(When)41 b(accessed)f(b)m(y)h(Binc)f +(IMAP)-8 b(,)40 b(the)h(t)m(w)m(o)h(sections)e(are)h(treated)g(equally) +-8 b(,)43 b(as)d(if)581 4676 y(there)31 b(w)m(as)g(no)g(alias)f +(subsitution.)722 4790 y(The)42 b(follo)m(wing)g(sections)f(describ)s +(e)g(the)g Fl(Binc::Storage)f Fo(sections)h(that)g(Binc)581 +4903 y(IMAP)30 b(recognizes.)581 5197 y Fd(3.2)131 b(Sections)44 +b(in)g Fb(bincimap.conf)581 5403 y Fo(No)m(w)26 b(follo)m(w)m(es)h(a)f +(brief)f(description)i(of)e(all)h(recognized)i(sections)d(in)h +Fl(bincimap.conf)p Fo(.)p Black Black eop +%%Page: 13 13 +13 12 bop Black 0 TeXcolorgray Black 183 249 a Fk(3.2.)71 +b(SECTIONS)31 b(IN)e Fa(BINCIMAP.CONF)1453 b Fo(13)p +Black 183 548 a Fc(3.2.1)112 b(Authen)m(tication)183 +720 y Fo(The)20 b(authen)m(tication)k(details)c(in)h(Binc)f(IMAP)g(are) +h(set)f(in)g(a)h(section)f(called)i Fl(Authentication)p +Fo(:)183 930 y Fl(Authentication)46 b({)183 1156 y(})183 +1367 y Fo(The)30 b(recognized)i(options)f(are:)p Black +319 1578 a Fi(\017)p Black 46 w Fl(allow)47 b(plain)g(auth)g(in)f(non)h +(ssl)g(=)g(yes|no)p Black 424 1765 a(yes)p Black 45 w +Fo(Clien)m(ts)e(are)f(allo)m(w)m(ed)i(to)e(authen)m(ticate)i(using)e +(plain)h(text)f(passw)m(ords)610 1878 y(when)31 b(transp)s(ort)g(is)f +(not)g(encrypted)i(with)f(SSL.)p Black 471 2024 a Fl(no)p +Black 45 w Fo(Clien)m(ts)25 b(are)f Fe(not)32 b Fo(allo)m(w)m(ed)26 +b(to)f(authen)m(ticate)h(using)e(plain)h(text)f(passw)m(ords)610 +2137 y(when)31 b(transp)s(ort)g(is)f(not)g(encrypted)i(with)f(SSL.)p +Black 319 2324 a Fi(\017)p Black 46 w Fl(auth)47 b(penalty)g(=)g(<n>)p +Black Black 610 2511 a Fo(If)37 b(a)i(user)f(tries)g(to)h(authen)m +(ticate)h(but)f(the)g(passw)m(ord)g(or)f(username)i(is)610 +2624 y(wrong,)g(the)d(serv)m(er)g(will)h(sleep)f(for)g +Fl(<n>)f Fo(seconds)h(b)s(efore)g(allo)m(wing)i(the)610 +2737 y(user)30 b(to)h(try)f(again.)183 2947 y(This)g(is)g(an)h(example) +g(of)f(an)g Fl(Authentication)g Fo(section)h(in)f Fl(bincimap.conf)p +Fo(:)183 3158 y Fl(Authentication)46 b({)371 3271 y(allow)g(plain)h +(auth)g(in)g(non)g(ssl)g(=)g(no,)371 3384 y(auth)f(penalty)h(=)g(4)183 +3497 y(})183 3740 y Fc(3.2.2)112 b(Logging)183 3912 y +Fo(The)30 b(logging)i(details)f(in)f(Binc)h(IMAP)f(are)g(set)g(in)h(a)f +(section)h(called)g Fl(Log)p Fo(:)183 4123 y Fl(Log)47 +b({)183 4349 y(})183 4560 y Fo(The)30 b(recognized)i(options)f(are:)p +Black 319 4770 a Fi(\017)p Black 46 w Fl(type)47 b(=)g(syslog|multilog) +p Black 283 4958 a(syslog)p Black 45 w Fo(Binc)31 b(IMAP)e(will)i(log)g +(using)f(syslog.)p Black 189 5103 a Fl(multilog)p Black +45 w Fo(Binc)49 b(IMAP)f(will)h(log)g(to)g Fe(stderr)p +Fo(,)54 b(whic)m(h)c(is)e(the)h(default)g(input)g(for)610 +5216 y Fl(multilog)p Fo(.)p Black 319 5403 a Fi(\017)p +Black 46 w Fl(environment)e(ip)g(variable)f(=)h(<var>)p +Black Black eop +%%Page: 14 14 +14 13 bop Black 0 TeXcolorgray Black 581 249 a Fo(14)1067 +b Fk(CHAPTER)30 b(3.)71 b(CONFIGURING)28 b(BINC)i(IMAP)p +Black Black Black 1008 548 a Fo(If)e(con\034gured)i(to)f(log)f(using)i +Fl(multilog)p Fo(,)f(Binc)f(IMAP)g(attempts)i(to)e(\034nd)1008 +661 y(the)34 b(remote)h(host's)e(IP)g(address)h(in)f(the)h(en)m +(vironmen)m(t)i(v)-5 b(ariables.)50 b(This)1008 774 y(option)33 +b(allo)m(ws)g(the)f(administrator)h(to)f(suggest)f(whic)m(h)i(v)-5 +b(ariable)33 b(the)f(IP)1008 887 y(address)f(is)f(stored)g(in.)p +Black 718 1069 a Fi(\017)p Black 45 w Fl(syslog)47 b(facility)g(=)g +(<facility>)p Black Black 1008 1252 a Fo(If)35 b(Binc)h(IMAP)f(is)g +(con\034gured)i(to)f(log)f(using)h(syslog,)g(it)g(will)g(log)g(using) +1008 1365 y(the)31 b(syslog)f(facilit)m(y)h(describ)s(ed)f(b)m(y)h(the) +g(alias)f Fl(<facility>)p Fo(.)p Black 718 1548 a Fi(\017)p +Black 45 w Fl(syslog)47 b(facility)g(number)g(=)g(<facilitynr>)p +Black Black 1008 1731 a Fo(If)35 b(Binc)h(IMAP)f(is)g(con\034gured)i +(to)f(log)f(using)h(syslog,)g(it)g(will)g(log)g(using)1008 +1844 y(the)f(syslog)f(facilit)m(y)h(n)m(um)m(b)s(er)h +Fl(<facilitynr>)p Fo(.)53 b(This)34 b(is)g(t)m(ypically)i(used)1008 +1957 y(if)30 b(the)h(textual)g(facilit)m(y)g(name)g(is)f(not)g +(recognized)i(b)m(y)f(Binc)g(IMAP)-8 b(.)581 2155 y(This)31 +b(is)e(an)i(example)g(of)f(a)g Fl(Log)g Fo(section)h(in)g +Fl(bincimap.conf)p Fo(:)581 2353 y Fl(Log)47 b({)769 +2466 y(type)g(=)g(syslog,)769 2579 y(syslog)g(facility)g(=)g +(LOG_DAEMON)581 2692 y(})581 2933 y Fc(3.2.3)113 b(Securit)m(y)581 +3104 y Fo(The)31 b(securit)m(y)g(details)g(in)f(Binc)h(IMAP)f(are)g +(set)h(in)f(a)g(section)h(called)g Fl(Security)p Fo(:)581 +3302 y Fl(Security)47 b({)581 3528 y(})581 3726 y Fo(The)31 +b(recognized)h(options)f(are:)p Black 718 3924 a Fi(\017)p +Black 45 w Fl(jail)47 b(path)g(=)g(<path>)p Black Black +1008 4107 a Fo(Binc)27 b(IMAP's)f(in)m(v)m(o)s(cation)h(stub,)h +Fl(bincimap-up)p Fo(,)e(en)m(ters)i(a)e(\020c)m(hro)s(ot)h(jail\021) +1008 4220 y(path)43 b(after)e(starting)i(the)f(main)g(serv)m(er.)74 +b(The)42 b(path)h(is)e(giv)m(en)h(in)g(this)1008 4333 +y(setting)31 b(and)g(it)f(m)m(ust)h(exist)f(for)h(Binc)f(IMAP)g(to)h +(function)g(prop)s(erly)-8 b(.)p Black 718 4516 a Fi(\017)p +Black 45 w Fl(jail)47 b(user)g(=)g(<userid>)p Black Black +1008 4699 a Fo(Binc)35 b(IMAP's)f(in)m(v)m(o)s(cation)i(stub)e(is)g(b)m +(y)h(default)g(run)g(as)f(the)h(privileged)1008 4812 +y(user)g Fl(root)p Fo(.)55 b(Before)35 b(the)g(stub)g(en)m(ters)h(its)f +(\020c)m(hro)s(ot)h(jail\021,)g(it)f(c)m(hanges)i(to)1008 +4925 y(the)31 b Fl(<userid>)f Fo(user,)h(whic)m(h)g(should)g(b)s(e)f(a) +g(user)h(with)g(no)f(privileges.)p Black 718 5107 a Fi(\017)p +Black 45 w Fl(jail)47 b(group)g(=)g(<groupid>)p Black +Black 1008 5290 a Fo(As)33 b(with)i Fl(jail)47 b(user)p +Fo(,)34 b(but)g(sets)f(the)h Fe(gr)-5 b(oup)41 b Fo(that)34 +b(the)g(in)m(v)m(o)s(cation)i(stub)1008 5403 y(c)m(hanges)c(to)e(b)s +(efore)h(en)m(tering)h(the)e(jail.)p Black Black eop +%%Page: 15 15 +15 14 bop Black 0 TeXcolorgray Black 183 249 a Fk(3.2.)71 +b(SECTIONS)31 b(IN)e Fa(BINCIMAP.CONF)1453 b Fo(15)p +Black 183 548 a(This)30 b(is)g(an)h(example)g(of)f(a)g +Fl(Security)g Fo(section)h(in)f Fl(bincimap.conf)p Fo(:)183 +781 y Fl(Security)46 b({)371 894 y(jail)g(path)h(=)g +("/opt/bincimap/bin",)371 1007 y(jail)f(user)h(=)g(nobody,)371 +1119 y(jail)f(group)h(=)g(nobody)183 1232 y(})183 1499 +y Fc(3.2.4)112 b(Mailb)s(o)m(x)37 b(settings)183 1678 +y Fo(The)30 b(mailb)s(o)m(x)h(settings)g(in)f(Binc)h(IMAP)f(are)h(set)f +(in)g(a)h(section)f(called)i Fl(Mailbox)p Fo(:)183 1911 +y Fl(Mailbox)46 b({)183 2137 y(})183 2370 y Fo(The)30 +b(recognized)i(options)f(are:)p Black 319 2602 a Fi(\017)p +Black 46 w Fl(type)47 b(=)g(<type>)p Black Black 610 +2806 a Fo(Sets)33 b(the)h(t)m(yp)s(e)f(of)g(mailb)s(o)m(x)g(that)h +(Binc)g(IMAP)e(should)i(use)f(as)g(default.)610 2919 +y(Curren)m(tly)-8 b(,)32 b(the)f(only)f(supp)s(orted)h(format)g(is)f +Fl(Maildir)p Fo(.)p Black 319 3123 a Fi(\017)p Black +46 w Fl(depot)47 b(=)g(<depottype>)p Black Black 610 +3327 a Fo(Sets)37 b(the)g(t)m(yp)s(e)g(of)g(dep)s(ot)g(that)h(Binc)f +(IMAP)g(should)g(use.)60 b(The)38 b(dep)s(ot)610 3440 +y(decides)g(ho)m(w)g(the)g(con)m(ten)m(ts)h(of)e(an)g(IMAP)g(user's)g +(mail)h(path)g(is)f(in)m(ter-)610 3552 y(preted.)i(Curren)m(t)m(y)-8 +b(,)27 b(the)d(t)m(w)m(o)h(supp)s(orted)f(dep)s(ot)g(t)m(yp)s(es)f(are) +h Fl(IMAPdir)f Fo(and)610 3665 y Fl(Maildir++)p Fo(..)p +Black 319 3869 a Fi(\017)p Black 46 w Fl(path)47 b(=)g(<path>)p +Black Black 610 4073 a Fo(When)30 b(a)g(user)g(authen)m(ticates,)i +(Binc)f(IMAP)e(can)i(optionally)g(c)m(hange)g(to)610 +4186 y(a)26 b(sep)s(erate)g(mail)g(directory)h(within)g(the)f(user's)f +(home)i(area.)40 b(This)25 b(direc-)610 4299 y(tory)30 +b(is)g(set)f(with)i(the)f Fl(path)g Fo(setting.)41 b(F)-8 +b(or)30 b(mail)h(storage)f(con\034gurations)610 4412 +y(where)h(there)g(is)f(no)h(sep)s(erate)f(area)h(for)f(mail,)h(set)f +Fl(path="")p Fo(.)p Black 319 4615 a Fi(\017)p Black +46 w Fl(auto)47 b(create)g(inbox)g(=)f(yes|no)p Black +443 4819 a Fo(y)m(es)p Black 46 w(Binc)24 b(IMAP)g(will)h(create)g(the) +f(INBO)m(X)g(mailb)s(o)m(x)h(if)e(the)i(IMAP)f(user)g(do)s(es)610 +4932 y(not)31 b(already)g(ha)m(v)m(e)g(one.)p Black 469 +5086 a(no)p Black 46 w(The)k(serv)m(er)f(will)h Fe(not)43 +b Fo(create)35 b(INBO)m(X)f(when)h(the)g(user)f(logs)g(in)h(for)f(the) +610 5199 y(\034rst)c(time.)p Black 319 5403 a Fi(\017)p +Black 46 w Fl(auto)47 b(subscribe)g(mailboxes)f(=)h(<mailboxlist>)p +Black Black eop +%%Page: 16 16 +16 15 bop Black 0 TeXcolorgray Black 581 249 a Fo(16)1067 +b Fk(CHAPTER)30 b(3.)71 b(CONFIGURING)28 b(BINC)i(IMAP)p +Black Black Black 1008 548 a Fo(When)k(logging)g(on)m(to)g(the)f(IMAP)g +(service)g(for)g(the)g(\034rst)g(time,)h(the)g(user)1008 +661 y(will)g(automatically)h(b)s(e)d(subscrib)s(ed)h(to)g(the)h(mailb)s +(o)m(xes)f(in)g(the)h(comma)1008 774 y(sep)s(erated)j(list)g +Fl(<mailboxlist>)o Fo(.)59 b(The)37 b(con)m(ten)m(t)h(of)f(the)f(list)h +(if)f(for)g(ex-)1008 887 y(ample)c("INBO)m(X,T)-8 b(rash,Drafts,Sen)m +(t".)p Black 718 1071 a Fi(\017)p Black 45 w Fl(umask)47 +b(=)g(<number>)p Black Black 1008 1255 a Fo(All)33 b(op)s(erations)g +(in)g(a)g(user's)f(mail)h(directory)h(will)f(b)s(e)f(p)s(erformed)i +(using)1008 1368 y(this)d(umask.)581 1569 y(This)g(is)e(an)i(example)g +(of)f(a)g Fl(Mailbox)g Fo(section)h(in)g Fl(bincimap.conf)p +Fo(:)581 1771 y Fl(Mailbox)47 b({)769 1884 y(path)g(=)g("Maildir",)769 +1997 y(type)g(=)g("Maildir",)769 2110 y(depot)g(=)g("IMAPdir",)769 +2223 y(auto)g(create)g(inbox)g(=)g(yes,)769 2336 y(auto)g(subscribe)g +(mailboxes)f(=)h("INBOX,Work,Work/Sent",)769 2448 y(umask)g(=)g(0777) +581 2561 y(})581 2803 y Fc(3.2.5)113 b(Session)581 2975 +y Fo(The)31 b(session)f(details)h(in)f(Binc)h(IMAP)f(are)g(set)g(in)h +(a)f(section)h(called)g Fl(Session)p Fo(:)581 3176 y +Fl(Session)47 b({)581 3402 y(})581 3604 y Fo(The)31 b(recognized)h +(options)f(are:)p Black 718 3806 a Fi(\017)p Black 45 +w Fl(auth)47 b(timeout)g(=)g(<seconds>)p Black Black +1008 3990 a Fo(Before)32 b(authen)m(ticating,)i(Binc)e(IMAP)e(will)i +(allo)m(w)g(clien)m(ts)h(to)e(idle)h(\(sta)m(y)1008 4102 +y(connected)25 b(with)e(no)g(activit)m(y\))h(for)e Fl(<second>)h +Fo(seconds)g(b)s(efore)f(automat-)1008 4215 y(ically)31 +b(closing)g(the)g(IMAP)e(session.)p Black 718 4399 a +Fi(\017)p Black 45 w Fl(idle)47 b(timeout)g(=)g(<seconds>)p +Black Black 1008 4583 a Fo(After)36 b(authen)m(ticating,)41 +b(Binc)c(IMAP)e(will)i(allo)m(w)g(clien)m(ts)h(to)e(idle)h(\(sta)m(y) +1008 4696 y(connected)25 b(with)e(no)g(activit)m(y\))h(for)e +Fl(<second>)h Fo(seconds)g(b)s(efore)f(automat-)1008 +4809 y(ically)31 b(closing)g(the)g(IMAP)e(session.)p +Black 718 4993 a Fi(\017)p Black 45 w Fl(transfer)47 +b(timeout)g(=)g(<seconds>)p Black Black 1008 5177 a Fo(Ev)m(ery)23 +b(c)m(h)m(unk)g(of)e(data)i(that)f(is)f(sen)m(t)i(b)m(y)f(Binc)g(IMAP)f +(to)h(the)g(IMAP)f(clien)m(t)1008 5290 y(has)33 b Fl(<seconds>)f +Fo(seconds)h(to)f(complete.)49 b(If)31 b(this)i(timeout)h(is)e +(exceeded,)1008 5403 y(the)f(IMAP)f(session)g(is)g(closed.)p +Black Black eop +%%Page: 17 17 +17 16 bop Black 0 TeXcolorgray Black 183 249 a Fk(3.2.)71 +b(SECTIONS)31 b(IN)e Fa(BINCIMAP.CONF)1453 b Fo(17)p +Black Black 319 548 a Fi(\017)p Black 46 w Fl(transfer)47 +b(buffer)g(size)f(=)h(<nrofbytes>)p Black Black 610 735 +a Fo(T)-8 b(o)21 b(sa)m(v)m(e)g(net)m(w)m(ork)h(roundtrips,)h(Binc)e +(IMAP)f(bu\033ers)g(up)h(to)f Fl(<nrofbytes>)610 848 +y Fo(b)m(ytes)29 b(in)f(memory)h(b)s(efore)f(it)h(is)f(shipp)s(ed)g +(o\033)g(to)h(the)g(clien)m(t.)41 b(Greatly)28 b(af-)610 +961 y(fects)i(p)s(erformance)h(on)g(high)g(latency)f(links.)324 +1173 y(This)g(is)g(an)h(example)g(of)f(a)g Fl(Session)g +Fo(section)h(in)f Fl(bincimap.conf)p Fo(:)183 1385 y +Fl(Session)46 b({)277 1498 y(auth)g(timeout)h(=)g(30,)277 +1611 y(idle)f(timeout)h(=)g(1800,)277 1724 y(transfer)f(timeout)h(=)g +(1200,)277 1837 y(transfer)f(buffer)h(size)g(=)g(1024)183 +1950 y(})183 2193 y Fc(3.2.6)112 b(SSL/TLS)183 2365 y +Fo(The)30 b(SSL)i(details)e(in)h(Binc)f(IMAP)g(are)h(set)f(in)h(a)f +(section)h(called)g Fl(SSL)p Fo(:)183 2576 y Fl(SSL)47 +b({)183 2802 y(})183 3014 y Fo(The)30 b(recognized)i(options)f(are:)p +Black 319 3226 a Fi(\017)p Black 46 w Fl(pem)47 b(file)g(=)g(<file>)p +Black Black 610 3414 a Fo(Binc)30 b(IMAP)g(reads)g(a)h(PEM)f(enco)s +(ded)h(SSL)g(certi\034cate)h(from)e(this)g(lo)s(ca-)610 +3527 y(tion.)38 b(This)20 b(\034le)h(can)f(often)h(b)s(e)f(generated)i +(with)e(scripts)h(under)g Fl(/usr/share/ssl/certs)p Fo(.)p +Black 319 3714 a Fi(\017)p Black 46 w Fl(ca)47 b(file)g(=)g(<file>)p +Black Black 610 3901 a Fo(Giv)m(es)30 b(Binc)g(IMAP)g(a)g(\034le)g +(that)h(con)m(tains)g(certi\034cate)h(authorities.)42 +b(The)610 4014 y(purp)s(ose)34 b(of)g(this)g(\034le)h(is)f(sp)s +(eci\034c)g(to)h(the)f(SSL)h(proto)s(col)g(and)g(it)f(is)g(used)610 +4127 y(in)c(the)h(SSL)g(hand)g(shak)m(e.)p Black 319 +4315 a Fi(\017)p Black 46 w Fl(ca)47 b(path)g(=)g(<path>)p +Black Black 610 4502 a Fo(Giv)m(es)30 b(Binc)g(IMAP)f(a)h(path)h(in)f +(whic)m(h)h(the)f(SSL)h(library)f(can)h(searc)m(h)f(for)610 +4615 y(\034les)25 b(con)m(taining)j(certi\034cate)f(authorities.)40 +b(The)26 b(purp)s(ose)g(of)f(this)h(path)g(is)610 4728 +y(sp)s(eci\034c)h(to)h(the)f(SSL)h(proto)s(col)g(and)g(it)g(is)e(used)i +(in)f(the)h(SSL)g(hand)g(shak)m(e.)p Black 319 4915 a +Fi(\017)p Black 46 w Fl(cipher)47 b(list)g(=)g(<ciphers>)p +Black Black 610 5103 a Fo(The)h(string)g(pro)m(vided)h(in)e +Fl(<ciphers>)h Fo(informs)f(the)h(SSL)h(library)f(of)610 +5216 y(whic)m(h)32 b(ciphers)e(are)h(a)m(v)-5 b(ailable.)p +Black 319 5403 a Fi(\017)p Black 46 w Fl(verify)47 b(peer)g(=)g(yes|no) +p Black Black eop +%%Page: 18 18 +18 17 bop Black 0 TeXcolorgray Black 581 249 a Fo(18)1067 +b Fk(CHAPTER)30 b(3.)71 b(CONFIGURING)28 b(BINC)i(IMAP)p +Black Black Black 1008 548 a Fo(Informs)35 b(Binc)h(IMAP)f(w)m(ether)h +(or)g(not)f(the)h(serv)m(er)f(should)h(attempt)h(to)1008 +661 y(v)m(erify)31 b(the)f(p)s(eer's)g(certi\034cate.)581 +873 y(This)h(is)e(an)i(example)g(of)f(a)g Fl(SSL)g Fo(section)h(in)g +Fl(bincimap.conf)p Fo(:)581 1086 y Fl(SSL)47 b({)675 +1199 y(pem)g(file)g(=)g("/usr/share/ssl/certs/server.pem",)675 +1312 y(ca)g(file)g(=)g("",)675 1425 y(ca)g(path)g(=)g("",)675 +1538 y(cipher)g(list)g(=)g +("!ADH:RC4+RSA:HIGH:MEDIUM:LOW:EXP:+SSLv2:+EXP",)675 +1650 y(verify)g(peer)g(=)g(no)581 1763 y(})p Black Black +eop +%%Page: 19 19 +19 18 bop Black 0 TeXcolorgray Black Black 183 1171 a +Fj(Chapter)60 b(4)183 1587 y Fn(The)72 b(Binc)g(IMAP)g(Dep)6 +b(ot)183 2033 y Fo(The)25 b(main)h(role)f(of)g(an)g(IMAP)f(serv)m(er)i +(is)e(to)h(giv)m(e)h(email)g(clien)m(ts)g(an)f(in)m(terface)h(through) +183 2146 y(whic)m(h)g(they)g(can)g(authen)m(ticate)i(and)e(then)g +(access)f(email)h(and)g(mailb)s(o)m(xes)g(lo)s(cated)g(on)183 +2259 y(a)i(\(remote\))i(mail)f(serv)m(er.)40 b(The)29 +b(mails)g(are)f(stored)h(on)g(the)g(mail)g(serv)m(ers)f(in)h(a)f(sp)s +(ecial)183 2372 y(structure,)j(and)g(this)f(structure)h(v)-5 +b(aries)30 b(from)h(system)f(to)g(system.)324 2485 y(Most)36 +b(often)i(w)m(e)f(distinguish)h(b)s(et)m(w)m(een)h(the)e(mailb)s(o)m(x) +h Fe(structur)-5 b(e)46 b Fo(\(or)37 b Fe(hier)-5 b(ar)g(chy)183 +2598 y(structur)g(e)7 b Fo(\))32 b(and)g(its)f Fe(format)p +Fo(.)41 b(The)32 b(structure)g(determines)g(ho)m(w)g(the)f(di\033eren)m +(t)i(mail-)183 2711 y(b)s(o)m(xes)k(and)i(submailb)s(o)m(xes)f(are)h +(stored,)h(and)f(the)f(format)g(decides)h(ho)m(w)g(eac)m(h)g(and)183 +2824 y(ev)m(ery)30 b(email)h(is)f(stored)h(within)g(one)g(mailb)s(o)m +(x.)324 2938 y(Binc)e(IMAP)g(uses)g(the)h(generic)g(con)m(tainer)h(ob)5 +b(ject)30 b Fe(Dep)-5 b(ot)39 b Fo(to)29 b(describ)s(e)h(the)g(map)183 +3051 y(b)s(et)m(w)m(een)36 b(the)e(hierarc)m(h)m(y)j(structure)e(and)f +(its)g(translation)i(to)e(selectable)i(mailb)s(o)m(xes)183 +3164 y(in)c(IMAP)-8 b(.)33 b(The)g(Dep)s(ot)g(has)g(t)m(w)m(o)h(sp)s +(ecializations:)46 b(one)33 b(for)g(IMAPdir)f(and)h(one)g(for)183 +3277 y(Maildir++.)183 3567 y Fd(4.1)130 b(Maildir++)183 +3772 y Fo(Courier-IMAP)32 b(de\034nes)g(the)f(hierarc)m(h)m(y)j +(structure)e(Maildir++,)h(whic)m(h)f(pro)m(vides)g(a)183 +3885 y(w)m(a)m(y)27 b(for)f(existing)g(Maildir)h(users)f(\(Maildir)h +(is)f(a)g(mailb)s(o)m(x)h(format\))g(to)f(ha)m(v)m(e)i(m)m(ultiple)183 +3998 y(mailb)s(o)m(xes)37 b(and)h(submailb)s(o)m(xes)f(inside)h(the)f +(directory)h(that)g(con)m(tains)g(the)g(default)183 4111 +y(mailb)s(o)m(x)31 b(\020INBO)m(X\021)38 b(\(whic)m(h)31 +b(often)g(resides)f(in)h Fl(~/Maildir)f Fo(for)g(eac)m(h)h(UNIX)e +(user\).)324 4224 y(Read)h(more)h(ab)s(out)g(the)f(Maildir++)i(format)f +(at)f(the)h(follo)m(wing)h(lo)s(cation:)p Black Black +0 1 0 0 TeXcolorcmyk 410 4441 a Fl +(http://www.inter7.com/courierimap/README.maildirquota.html)p +Black 324 4657 a Fo(Binc)j(IMAP)f(supp)s(orts)g(this)h(mailb)s(o)m(x)g +(structure)h(with)f(a)f(few)h(limitations)h(and)183 4770 +y(a)30 b(few)g(enhancemen)m(ts:)p Black 319 4987 a Fi(\017)p +Black 46 w Fo(The)38 b Fe(maildirfolder)47 b Fo(\034le)37 +b(is)g(not)h(created)g(inside)g(eac)m(h)g(Maildir)g(submailb)s(o)m(x.) +410 5099 y(The)32 b(reason)g(for)g(this)f(is)h(that)g(this)g(only)f(w)m +(orks)h(with)h(mailb)s(o)m(x)f(formats)g(that)410 5212 +y(store)e(a)h(mailb)s(o)m(x)g(inside)f(a)h(directory)-8 +b(,)32 b(suc)m(h)e(as)g(Maildir.)p Black 319 5403 a Fi(\017)p +Black 46 w Fo(Maildir++)h(quotas)g(are)f(not)h(supp)s(orted)p +Black 1632 5652 a(19)p Black eop +%%Page: 20 20 +20 19 bop Black 0 TeXcolorgray Black 581 249 a Fo(20)1186 +b Fk(CHAPTER)30 b(4.)71 b(THE)31 b(BINC)f(IMAP)f(DEPOT)p +Black Black 718 548 a Fi(\017)p Black 45 w Fo(No)i(Maildir++)g +(restrictions)g(to)g(mailb)s(o)m(x)g(names)f(apply)h(\(suc)m(h)g(as)f +Fl(.Trash)p Fo(\))p Black 718 736 a Fi(\017)p Black 45 +w Fo(Mailb)s(o)m(xes)e(inside)f(a)g(Maildir++)h(structure)g(can)g(b)s +(e)e(of)h(an)m(y)h(format,)g(not)f(just)808 848 y(Maildir.)581 +1135 y Fd(4.2)131 b(IMAPdir)581 1338 y Fo(IMAPdir)27 +b(is)g(Binc)g(IMAP's)f(nativ)m(e)i(mailb)s(o)m(x)g(structure.)40 +b(It)27 b(is)f(op)s(en)h(and)h(usable)f(for)581 1451 +y(most)36 b(existing)g(lo)s(cal)g(mail)g(clien)m(ts.)58 +b(F)-8 b(or)36 b(a)g(full)g(description,)i(lo)s(ok)e(up)g(the)g(follo)m +(w-)581 1564 y(ing)31 b(w)m(eb)h(site,)f(or)g(searc)m(h)g(for)g(the)g +Fl(bincimap-imapdir.html)f Fo(\034le)h(in)g(the)g(pac)m(k)-5 +b(aged)581 1677 y(do)s(cumen)m(tation.)p Black Black +0 1 0 0 TeXcolorcmyk 808 1889 a Fl(http://www.bincimap.org/bincimap-)t +(imapdir.html)p Black 722 2102 a Fo(IMAPdir)27 b(do)s(es)g(not)g +(extend/c)m(hange)i(an)m(y)e(mailb)s(o)m(x)h(formats;)g(it)f(merely)g +(de\034nes)581 2215 y(a)32 b(w)m(a)m(y)h(to)g(describ)s(e)f(mailb)s(o)m +(xes)g(and)h(submailb)s(o)m(xes)g(in)f(a)g(w)m(a)m(y)h(that)g(is)e +(suitable)i(for)581 2327 y(an)e(IMAP)f(serv)m(er,)g(with)h(as)f(few)g +(restrictions)i(as)e(necessary)-8 b(.)p Black Black eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/doc/manual/bincimap-manual.tex b/doc/manual/bincimap-manual.tex @@ -0,0 +1,816 @@ +\documentclass[11pt,a4paper,twoside,openright]{report} +\usepackage[latin1]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[colorlinks=true]{hyperref} +\usepackage[usenames]{color} +\usepackage{fancyvrb,varioref} + +\pagestyle{headings} +% \pagecolor[rgb]{0.134,0.40,0.40} + +\begin{document} + +% \color{white} +\title{Binc IMAP manual (DRAFT)} +\author{Andreas Aardal Hanssen} + +\maketitle +\tableofcontents + +%---------------------------------------------------------------- +%---------------------------------------------------------------- +%---------------------------------------------------------------- +\chapter[Introducing Binc IMAP]{Introduction} + +\begin{quote} +``As an alternative to existing similar IMAP servers, Binc IMAP +strives to be very easy to use, but robust, stable and secure.'' +\end{quote} +Welcome to Binc IMAP, a project started December 2003 by Andreas +Aardal Hanssen. Binc IMAP is an open source IMAP project which differs +from existing IMAP projects. Here is a list of the project goals: + +\begin{enumerate} +\item Binc IMAP will always have a helpful, hospitable community. + \begin {itemize} + \item Although it is expected that users of Binc IMAP do their + homework before posting to the mailing list, the server author and + community of the Binc IMAP project will be friendly and will + approach everyone with respect. The same behavior is expected from + those who post to the list. + + \item There will be no RTFM\footnote{According to acronymfinder.com, + RTFM stands, among many other suggestions, for ``Read The Fscking + Manual'' (fsck is a Unix filesystem checker)} on the project's + mailing list. Flaming and personal insults on the project's mailing + list will result in banning of the originator. + + \item The community is encouraged to pay back to the project's + contributors by sharing their own experience and contributions to + Binc IMAP through the GPL license. + \end{itemize} + +\item Binc IMAP will not compete with other IMAP projects + \begin{itemize} + \item Under no circumstance will this project be in market driven + competition with other IMAP servers. + + \item Binc IMAP will first and foremost be a quality driven project. + + \item This project is meant to influence the community of authors of + similar network protocols and servers, and hopes to increase the + general quality of software that is used all over the globe and + beyond. + \end{itemize} + +\item Binc IMAP provides security through good design + \begin{itemize} + \item A well designed server is less exposed to bugs than a poorly + designed server. + + \item The server will strive to use every kind of security enhancing + feature, while keeping the implementation details as good and simple + as possible. + + \item The source is open and downloadable. Potential bugs and/or + nasty pieces of code are easily uncovered when the whole community + is able to study every line of code in detail. Bugs should always be + reported to the project's mailing list. + \end{itemize} + +\item Binc IMAP is modular + \begin{itemize} + \item Where possible and practical from both a usage and design + stand point, modules will be seperated and replaceable through + \textit{pluggable extension support}. Examples of future + replaceables and enhancements include: + \begin{itemize} + \item authentication modules (shadow, PAM, LDAP) + \item search modules + \item protocol extensions modules (namespaces, ACL, shared folders) + \item mailbox formats (Maildir, mbox, MySQL, POP3 proxy) + \end{itemize} + + \item With a modular and good object oriented design, it will be + easy to quickly understand what every method and function does. This + will increase third party developers' ability to write extensions + and modifications fast. + + \end{itemize} + +\item Binc IMAP favors quality over quantity + + \begin{itemize} + \item Binc IMAP's releases are milestones. We strive for perfection. + + \item Work on improving the existing design and extensibility will + always go ahead of adding new features. + + \item Through extensive module support, the community is encouraged + to contribute to the adding and testing of new features. + + \item Core design and implementation will always focus on quality. + \end{itemize} + +\end{enumerate} + +\textbf{This document serves as the server's main documentation.} + +%---------------------------------------------------------------- +%---------------------------------------------------------------- +%---------------------------------------------------------------- +\chapter[Installing Binc IMAP]{Installation} + +The installation procedure for Binc IMAP is designed to be quick and +easy, and in most cases you will get what you want at your first +attempt. The source code is designed to be able to compile on most +UNIX-like platforms. + +If you experience problems with compiling and installing this package +on your own platform, don't hesitate to post your problem to the +project's mailing list. + +%---------------------------------------------------------------- +\section{Downloading the package} + +Binc IMAP is available for a number of platforms and distributions. +Download the package most suitable for your distribution from one +of the following locations: + +\begin{itemize} + +\item Red Hat Linux: + \begin{itemize} + \item \url{http://www.bincimap.org/} + \item \url{http://www.bincimap.andreas.hanssen.name/} + \item \url{http://bincimap.argonsoft.de/} + \end{itemize} + +\item Mandrake Linux: + \begin{itemize} + \item \url{ftp://sunsite.uio.no/linux/Mandrake/Mandrake-devel/contrib} + \end{itemize} + +\item Debian Linux: + \begin{itemize} + \item \url{http://packages.debian.org/testing/mail/bincimap.html} + \item \url{http://packages.debian.org/unstable/mail/bincimap.html} + \end{itemize} + +\item FreeBSD: + \begin{itemize} + \item \url{http://www.freebsd.org/cgi/ports.cgi?query=bincimap&stype=all} + \end{itemize} + +\item Other (tarball): + \begin{itemize} + \item \url{http://www.bincimap.org/} + \item \url{http://www.bincimap.andreas.hanssen.name/} + \item \url{http://bincimap.argonsoft.de/} + \end{itemize} + +\end{itemize} + +%---------------------------------------------------------------- +\section{Building from the tarball} +\label{buildfromtarball} + +This section describes how you can build the Binc IMAP server using +the compressed tar archive (\textit{tarball}). This approach should +work on all supported platforms. + +The tarball creates a seperate directory in which it installs all +source files. The installation procedure is typical for open source C +and C++ software that uses the \texttt{autoconf} and \texttt{automake} +tools. First, unpack the tarball: + +\begin{Verbatim} +# zcat bincimap-1.2.1.tar.gz | tar xvf - +<outputs a list of files> +\end{Verbatim} +Now, enter the directory that was created. In this directory, you will +find the \texttt{configure} script. + +\begin{Verbatim} +# cd bincimap-1.2.1 +# ls configure +configure +# +\end{Verbatim} +Run the configure script with all options you find appropriate. The +\texttt{configure} options are listed in +section\vref{configureoptions}. Most users will be ok with these +common options: + +\begin{Verbatim} +# ./configure --prefix=/opt/bincimap --sysconfdir=/etc/opt/bincimap +\end{Verbatim} +The \texttt{configure} script will produce many lines of output, and +finally, if all goes well, it will create all the \texttt{Makefile}s +we need to build this projectm We can now run \texttt{make}: + +\begin{Verbatim} +# make +\end{Verbatim} +If the compile finishes with no problems, you can install your new +software: + +\begin{Verbatim} +# make install +\end{Verbatim} +If the \texttt{prefix} option is \texttt{/opt/bincimap}, \texttt{make +install} will create the following files: + +\begin{Verbatim} +/opt/bincimap/bin/bincimap-up # Startup stub +/opt/bincimap/bin/bincimapd # Main server +/opt/bincimap/man/man1/bincimap-up.1 # Man page +/opt/bincimap/man/man1/bincimapd.1 # Man page +/opt/bincimap/man/man5/bincimap.conf.5 # Man page +\end{Verbatim} +The \texttt{sysconfdir} option tells Binc IMAP where to install the +configuration files. If \texttt{sysconfdir} is set to +\texttt{/etc/opt/bincimap}, \texttt{make install} will create the +following files: + +\begin{Verbatim} +/etc/opt/bincimap/bincimap.conf # Main conf file +/etc/opt/bincimap/xinetd/imap # xinetd conf file +/etc/opt/bincimap/xinetd/imaps # xinetd conf file +/etc/opt/bincimap/service/imap/run # service conf file +/etc/opt/bincimap/service/imap/log/run # service conf file +/etc/opt/bincimap/service/imaps/run # service conf file +/etc/opt/bincimap/service/imaps/log/run # service conf file +\end{Verbatim} +You are now ready to configure Binc IMAP. Read more about this in +section\vref{configuration}. + +%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +\subsection{Options to configure} +\label{configureoptions} + +\begin{itemize} + +\item \Verb@--prefix=<dir>@\\ + Where to install binary files and man pages. Binary files + will be installed under \Verb@<dir>/bin@ and man pages go + under \Verb@<dir>@/man. + +\item \Verb@--sysconfdir=<dir>@\\ + Where to install configuration files. The main conf file + goes under \Verb@<dir>/bincimap.conf@ and other conf files + go under \Verb@<dir>/<path>/...@, depending on the type + of conf files. + + \textbf{Note:} The bundled service files + must \textbf{not} be stored on an NFS partition or any partition + that does not support file locking. + +\item \Verb@--localstatedir=<dir>@\\ + Where log directories go for multilog logging. Directories + \texttt{log/bincimap} and \texttt{log/bincimap-ssl} will be created + under this prefix. + +\item \Verb@--disable-ssl@\\ + Compile Binc IMAP with no SSL code, and without the OpenSSL + requirement. Also removes the STARTTLS capability. + +\item \Verb@--enable-ssl@ (default)\\ + Compile Binc IMAP with SSL code, and with the OpenSSL + requirement. Enables the STARTTLS capability. + +\item \Verb@--enable-static@\\ + Compile Binc IMAP with static linkage. + +\item \Verb@--without-optimization@\\ + Compile Binc IMAP with -O0 (no optimization). + +\end{itemize} + +\section{Building from the src.rpm} + +The \texttt{src.rpm} packages are designed for the Red Hat Linux +distribution. If you are not running Red Hat Linux or similar +distributions and this procedure fails, then you should build Binc +IMAP from the tarball (section\vref{buildfromtarball}). + +\begin{itemize} + +\item Make sure you have the \texttt{rpmbuild} program installed. In +Red Hat, it is a part of the \texttt{rpm-build} package. + +\item As root\footnote{It is possible to build src.rpm packages as +non-root. There is info available on http://www.rpm.org/ +about this.}, run the following command: + +\begin{Verbatim} +rpmbuild --rebuild bincimap-1.2.1-1.src.rpm +\end{Verbatim} + +\item If the command succeeds, you will have generated a binary rpm +package that you can install. + +\begin{Verbatim} +rpm -i bincimap-1.2.1-1.i386.rpm +\end{Verbatim} + +\end{itemize} + +\section{After building and installing the package} + +When the service has been installed successfully, you should take your +time to configure it properly. Please refer to +section\vref{configuration}. + +%---------------------------------------------------------------- +%---------------------------------------------------------------- +%---------------------------------------------------------------- +\chapter[Configuring Binc IMAP]{Configuration} +\label{configuration} + +With most services, the hardest thing to get right is the +configuration file. With Binc IMAP, this should not be a problem for +the administrator. There are few options to set, and the package also +provides a default configuration file whose default settings are fine +for most uses. + +This section will first give an overview of the format of Binc IMAP's +configuration file, and it will then explain every option that you +can set. + +\section{Introduction to \texttt{Binc::Storage}} + +Binc IMAP uses a special file format, called \texttt{Binc::Storage} +after its C++ class name. This file format is human readable and +editable, it's fast to parse programmatically, and it has very little +overhead when representing data. It also groups options together in +sections, supports comments (c-style) and arbitrary whitespace usage. + +The structure of the file is as follows: + +\begin{enumerate} +\item Aliases +\item Section1 + \begin{enumerate} + \item key1=value1 + \item key2=value2 + \item ... + \end{enumerate} +\item Section2 + \begin{enumerate} + \item key1=value1 + \item key2=value2 + \item ... + \end{enumerate} +\item SectionN... +\end{enumerate} +Moving on to the actual format, the file starts with an optional list +of aliases. These aliases start with a question mark (?), followed by +the alias, a colon (:), the replacement text, and finally a semicolon +(;). This example defines the alias "m" to represent the text +"myfirstsection": + +\begin{Verbatim} +?m:MyFirstSection; +\end{Verbatim} +Then comes sections. A section starts with an identifier --- the +section name. The name contains only alphanumeric (a to z, A to Z and +0-9) characters, and it's case sensitive (``hello'' and ``HELLO'' +could be two different sections). The section content itself is +enclosed in braces, as in the following example. + +\begin{Verbatim} +MyFirstSection { + +} +\end{Verbatim} +Inside a section we have a comma seperated list of key=value pairs. +The keys and values consist of a sequence of one or more alphanumeric +words. The value can also contain quoted strings: + +\begin{Verbatim} +MyFirstSection { + certificate path = "/etc/path/certificate.txt", + optional argument = yes +} +\end{Verbatim} +The aliases from the start of the configuration file are useful if we +wish to appreviate long words in a key or section name in order to +save space. Normally this is only used in generated files, but they +can also make a manually edited conf file more compact. Here we have +replaced ``MyFirstSection'' with its alias ``m'': + +\begin{Verbatim} +m { + certificate path = "/etc/path/certificate.txt", + optional argument = "yes" +} +\end{Verbatim} +When accessed by Binc IMAP, the two sections are treated equally, as +if there was no alias subsitution. + +The following sections describe the \texttt{Binc::Storage} sections +that Binc IMAP recognizes. + +\section{Sections in \texttt{bincimap.conf}} + +Now followes a brief description of all recognized sections in +\texttt{bincimap.conf}. + +%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +\subsection{Authentication} + +The authentication details in Binc IMAP are set in a section called \texttt{Authentication}: + +\begin{Verbatim} +Authentication { + +} +\end{Verbatim} +The recognized options are: + +\begin{itemize} + +\item \texttt{allow plain auth in non ssl = yes{|}no} + \begin{itemize} + \item[\texttt{yes}] Clients are allowed to authenticate using + plain text passwords when transport is not encrypted with SSL. + \item[\texttt{no}] Clients are \textit{not} allowed to + authenticate using plain text passwords when transport is not + encrypted with SSL. + \end{itemize} + +\item \texttt{auth penalty = \Verb@<n>@} + \begin{itemize} + \item [] If a user tries to authenticate but the password or + username is wrong, the server will sleep for \Verb@<n>@ seconds + before allowing the user to try again. + \end{itemize} +\end{itemize} +This is an example of an \texttt{Authentication} section in +\texttt{bincimap.conf}: + +\begin{Verbatim} +Authentication { + allow plain auth in non ssl = no, + auth penalty = 4 +} +\end{Verbatim} + +%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +\subsection{Logging} + +The logging details in Binc IMAP are set in a section called \texttt{Log}: + +\begin{Verbatim} +Log { + +} +\end{Verbatim} +The recognized options are: + +\begin{itemize} + +\item \texttt{type = syslog{|}multilog} + \begin{itemize} + \item [\texttt{syslog}] Binc IMAP will log using syslog. + \item [\texttt{multilog}] Binc IMAP will log to \textit{stderr}, + which is the default input for \texttt{multilog}. + \end{itemize} + +\item \texttt{environment ip variable = <var>} + \begin{itemize} + \item [] If configured to log using \texttt{multilog}, Binc IMAP + attempts to find the remote host's IP address in the environment + variables. This option allows the administrator to suggest which + variable the IP address is stored in. + \end{itemize} + +\item \texttt{syslog facility = <facility>} + \begin{itemize} + \item [] If Binc IMAP is configured to log using syslog, it will + log using the syslog facility described by the alias + \Verb@<facility>@. + \end{itemize} + +\item \texttt{syslog facility number = <facilitynr>} + \begin{itemize} + \item [] If Binc IMAP is configured to log using syslog, it will + log using the syslog facility number \Verb@<facilitynr>@. This + is typically used if the textual facility name is not recognized + by Binc IMAP. + \end{itemize} +\end{itemize} +This is an example of a \texttt{Log} section in +\texttt{bincimap.conf}: + +\begin{Verbatim} +Log { + type = syslog, + syslog facility = LOG_DAEMON +} +\end{Verbatim} + +%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +\subsection{Security} + +The security details in Binc IMAP are set in a section called \texttt{Security}: + +\begin{Verbatim} +Security { + +} +\end{Verbatim} +The recognized options are: + +\begin{itemize} +\item \texttt{jail path = <path>} + \begin{itemize} + \item [] Binc IMAP's invocation stub, \texttt{bincimap-up}, enters + a ``chroot jail'' path after starting the main server. The path + is given in this setting and it must exist for Binc IMAP to + function properly. + \end{itemize} +\item \texttt{jail user = <userid>} + \begin{itemize} + \item [] Binc IMAP's invocation stub is by default run as the + privileged user \texttt{root}. Before the stub enters its + ``chroot jail'', it changes to the \Verb@<userid>@ user, which + should be a user with no privileges. + \end{itemize} +\item \texttt{jail group = <groupid>} + \begin{itemize} + \item [] As with \texttt{jail user}, but sets the \textit{group} + that the invocation stub changes to before entering the jail. + \end{itemize} +\end{itemize} +This is an example of a \texttt{Security} section in +\texttt{bincimap.conf}: + +\begin{Verbatim} +Security { + jail path = "/opt/bincimap/bin", + jail user = nobody, + jail group = nobody +} +\end{Verbatim} + +%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +\subsection{Mailbox settings} + +The mailbox settings in Binc IMAP are set in a section called \texttt{Mailbox}: + +\begin{Verbatim} +Mailbox { + +} +\end{Verbatim} +The recognized options are: + +\begin{itemize} +\item \texttt{type = <type>} + \begin{itemize} + \item [] Sets the type of mailbox that Binc IMAP should + use as default. Currently, the only supported format is + \texttt{Maildir}. + \end{itemize} +\item \texttt{depot = <depottype>} + \begin{itemize} + \item [] Sets the type of depot that Binc IMAP should use. The + depot decides how the contents of an IMAP user's mail path is + interpreted. Currenty, the two supported depot types are + \texttt{IMAPdir} and \texttt{Maildir++}.. + \end{itemize} +\item \texttt{path = <path>} + \begin{itemize} + \item [] When a user authenticates, Binc IMAP can optionally + change to a seperate mail directory within the user's home area. + This directory is set with the \texttt{path} setting. For mail + storage configurations where there is no seperate area for mail, + set \texttt{path=""}. + \end{itemize} +\item \texttt{auto create inbox = yes{|}no} + \begin{itemize} + \item [yes] Binc IMAP will create the INBOX mailbox if the IMAP + user does not already have one. + \item [no] The server will \textit{not} create INBOX when the user + logs in for the first time. + \end{itemize} +\item \texttt{auto subscribe mailboxes = <mailboxlist>} + \begin{itemize} + \item [] When logging onto the IMAP service for the first time, + the user will automatically be subscribed to the mailboxes in + the comma seperated list \Verb@<mailboxlist>@. The content of + the list if for example "INBOX,Trash,Drafts,Sent". + \end{itemize} +\item \texttt{umask = <number>} + \begin{itemize} + \item [] All operations in a user's mail directory will be + performed using this umask. + \end{itemize} + + +\end{itemize} +This is an example of a \texttt{Mailbox} section in +\texttt{bincimap.conf}: + +\begin{Verbatim} +Mailbox { + path = "Maildir", + type = "Maildir", + depot = "IMAPdir", + auto create inbox = yes, + auto subscribe mailboxes = "INBOX,Work,Work/Sent", + umask = 0777 +} +\end{Verbatim} + +%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +\subsection{Session} + +The session details in Binc IMAP are set in a section called \texttt{Session}: + +\begin{Verbatim} +Session { + +} +\end{Verbatim} +The recognized options are: + +\begin{itemize} + +\item \texttt{auth timeout = <seconds>} + \begin{itemize} + \item [] Before authenticating, Binc IMAP will allow clients to + idle (stay connected with no activity) for \Verb@<second>@ + seconds before automatically closing the IMAP session. + \end{itemize} + +\item \texttt{idle timeout = <seconds>} + \begin{itemize} + \item [] After authenticating, Binc IMAP will allow clients to + idle (stay connected with no activity) for \Verb@<second>@ + seconds before automatically closing the IMAP session. + \end{itemize} + +\item \texttt{transfer timeout = <seconds>} + \begin{itemize} + \item [] Every chunk of data that is sent by Binc IMAP to the IMAP + client has \Verb@<seconds>@ seconds to complete. If this timeout + is exceeded, the IMAP session is closed. + \end{itemize} + +\item \texttt{transfer buffer size = <nrofbytes>} + \begin{itemize} + \item [] To save network roundtrips, Binc IMAP buffers up to + \Verb@<nrofbytes>@ bytes in memory before it is shipped off to + the client. Greatly affects performance on high latency links. + \end{itemize} +\end{itemize} + + +This is an example of a \texttt{Session} section in +\texttt{bincimap.conf}: + +\begin{Verbatim} +Session { + auth timeout = 30, + idle timeout = 1800, + transfer timeout = 1200, + transfer buffer size = 1024 +} +\end{Verbatim} + +%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +\subsection{SSL/TLS} + +The SSL details in Binc IMAP are set in a section called \texttt{SSL}: + +\begin{Verbatim} +SSL { + +} +\end{Verbatim} +The recognized options are: + +\begin{itemize} + +\item \texttt{pem file = <file>} + \begin{itemize} + \item [] Binc IMAP reads a PEM encoded SSL certificate from this + location. This file can often be generated with scripts under + \texttt{/usr/share/ssl/certs}. + \end{itemize} + +\item \texttt{ca file = <file>} + \begin{itemize} + \item [] Gives Binc IMAP a file that contains certificate + authorities. The purpose of this file is specific to the SSL + protocol and it is used in the SSL hand shake. + \end{itemize} + +\item \texttt{ca path = <path>} + \begin{itemize} + \item [] Gives Binc IMAP a path in which the SSL library can + search for files containing certificate authorities. The + purpose of this path is specific to the SSL protocol and it is + used in the SSL hand shake. + \end{itemize} + +\item \texttt{cipher list = <ciphers>} + \begin{itemize} + \item [] The string provided in \Verb@<ciphers>@ informs the SSL + library of which ciphers are available. + \end{itemize} + +\item \texttt{verify peer = yes{|}no} + \begin{itemize} + \item [] Informs Binc IMAP wether or not the server should attempt + to verify the peer's certificate. + \end{itemize} + +\end{itemize} +This is an example of a \texttt{SSL} section in +\texttt{bincimap.conf}: + +\begin{Verbatim} +SSL { + pem file = "/usr/share/ssl/certs/server.pem", + ca file = "", + ca path = "", + cipher list = "!ADH:RC4+RSA:HIGH:MEDIUM:LOW:EXP:+SSLv2:+EXP", + verify peer = no +} +\end{Verbatim} + +%---------------------------------------------------------------- +%---------------------------------------------------------------- +%---------------------------------------------------------------- +\chapter{The Binc IMAP Depot} + +The main role of an IMAP server is to give email clients an interface +through which they can authenticate and then access email and +mailboxes located on a (remote) mail server. The mails are stored on +the mail servers in a special structure, and this structure varies +from system to system. + +Most often we distinguish between the mailbox \textit{structure} (or +\textit{hierarchy structure}) and its \textit{format}. The structure +determines how the different mailboxes and submailboxes are stored, +and the format decides how each and every email is stored within one +mailbox. + +Binc IMAP uses the generic container object \textit{Depot} to describe +the map between the hierarchy structure and its translation to +selectable mailboxes in IMAP. The Depot has two specializations: one +for IMAPdir and one for Maildir++. + +%---------------------------------------------------------------- +\section{Maildir++} + +Courier-IMAP defines the hierarchy structure Maildir++, which provides +a way for existing Maildir users (Maildir is a mailbox format) to have +multiple mailboxes and submailboxes inside the directory that contains +the default mailbox ``INBOX'' (which often resides in \Verb@~/Maildir@ +for each UNIX user). + +Read more about the Maildir++ format at the following location: + +\begin{itemize} +\item [] \url{http://www.inter7.com/courierimap/README.maildirquota.html} +\end{itemize} + +Binc IMAP supports this mailbox structure with a few limitations and a +few enhancements: + +\begin{itemize} +\item The \textit{maildirfolder} file is not created inside each +Maildir submailbox. The reason for this is that this only works with +mailbox formats that store a mailbox inside a directory, such as +Maildir. +\item Maildir++ quotas are not supported +\item No Maildir++ restrictions to mailbox names apply (such as +\texttt{.Trash}) +\item Mailboxes inside a Maildir++ structure can be of any format, not +just Maildir. +\end{itemize} + +%---------------------------------------------------------------- +\section{IMAPdir} + +IMAPdir is Binc IMAP's native mailbox structure. It is open and usable +for most existing local mail clients. For a full description, look up +the following web site, or search for the +\texttt{bincimap-imapdir.html} file in the packaged documentation. + +\begin{itemize} +\item [] \url{http://www.bincimap.org/bincimap-imapdir.html} +\end{itemize} + +IMAPdir does not extend/change any mailbox formats; it merely defines +a way to describe mailboxes and submailboxes in a way that is suitable +for an IMAP server, with as few restrictions as necessary. + + +\end{document} + diff --git a/doc/rfc1341.txt b/doc/rfc1341.txt @@ -0,0 +1,5265 @@ + + + + + + + Network Working Group N. Borenstein, Bellcore + Request for Comments: 1341 N. Freed, Innosoft + June 1992 + + + + MIME (Multipurpose Internet Mail Extensions): + + + Mechanisms for Specifying and Describing + the Format of Internet Message Bodies + + + Status of this Memo + + This RFC specifies an IAB standards track protocol for the + Internet community, and requests discussion and suggestions + for improvements. Please refer to the current edition of + the "IAB Official Protocol Standards" for the + standardization state and status of this protocol. + Distribution of this memo is unlimited. + + Abstract + + RFC 822 defines a message representation protocol which + specifies considerable detail about message headers, but + which leaves the message content, or message body, as flat + ASCII text. This document redefines the format of message + bodies to allow multi-part textual and non-textual message + bodies to be represented and exchanged without loss of + information. This is based on earlier work documented in + RFC 934 and RFC 1049, but extends and revises that work. + Because RFC 822 said so little about message bodies, this + document is largely orthogonal to (rather than a revision + of) RFC 822. + + In particular, this document is designed to provide + facilities to include multiple objects in a single message, + to represent body text in character sets other than US- + ASCII, to represent formatted multi-font text messages, to + represent non-textual material such as images and audio + fragments, and generally to facilitate later extensions + defining new types of Internet mail for use by cooperating + mail agents. + + This document does NOT extend Internet mail header fields to + permit anything other than US-ASCII text data. It is + recognized that such extensions are necessary, and they are + the subject of a companion document [RFC -1342]. + + A table of contents appears at the end of this document. + + + + + + + Borenstein & Freed [Page i] + + + + + + + + 1 Introduction + + Since its publication in 1982, RFC 822 [RFC-822] has defined + the standard format of textual mail messages on the + Internet. Its success has been such that the RFC 822 format + has been adopted, wholly or partially, well beyond the + confines of the Internet and the Internet SMTP transport + defined by RFC 821 [RFC-821]. As the format has seen wider + use, a number of limitations have proven increasingly + restrictive for the user community. + + RFC 822 was intended to specify a format for text messages. + As such, non-text messages, such as multimedia messages that + might include audio or images, are simply not mentioned. + Even in the case of text, however, RFC 822 is inadequate for + the needs of mail users whose languages require the use of + character sets richer than US ASCII [US-ASCII]. Since RFC + 822 does not specify mechanisms for mail containing audio, + video, Asian language text, or even text in most European + languages, additional specifications are needed + + One of the notable limitations of RFC 821/822 based mail + systems is the fact that they limit the contents of + electronic mail messages to relatively short lines of + seven-bit ASCII. This forces users to convert any non- + textual data that they may wish to send into seven-bit bytes + representable as printable ASCII characters before invoking + a local mail UA (User Agent, a program with which human + users send and receive mail). Examples of such encodings + currently used in the Internet include pure hexadecimal, + uuencode, the 3-in-4 base 64 scheme specified in RFC 1113, + the Andrew Toolkit Representation [ATK], and many others. + + The limitations of RFC 822 mail become even more apparent as + gateways are designed to allow for the exchange of mail + messages between RFC 822 hosts and X.400 hosts. X.400 [X400] + specifies mechanisms for the inclusion of non-textual body + parts within electronic mail messages. The current + standards for the mapping of X.400 messages to RFC 822 + messages specify that either X.400 non-textual body parts + should be converted to (not encoded in) an ASCII format, or + that they should be discarded, notifying the RFC 822 user + that discarding has occurred. This is clearly undesirable, + as information that a user may wish to receive is lost. + Even though a user's UA may not have the capability of + dealing with the non-textual body part, the user might have + some mechanism external to the UA that can extract useful + information from the body part. Moreover, it does not allow + for the fact that the message may eventually be gatewayed + back into an X.400 message handling system (i.e., the X.400 + message is "tunneled" through Internet mail), where the + non-textual information would definitely become useful + again. + + + + + Borenstein & Freed [Page 1] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + This document describes several mechanisms that combine to + solve most of these problems without introducing any serious + incompatibilities with the existing world of RFC 822 mail. + In particular, it describes: + + 1. A MIME-Version header field, which uses a version number + to declare a message to be conformant with this + specification and allows mail processing agents to + distinguish between such messages and those generated + by older or non-conformant software, which is presumed + to lack such a field. + + 2. A Content-Type header field, generalized from RFC 1049 + [RFC-1049], which can be used to specify the type and + subtype of data in the body of a message and to fully + specify the native representation (encoding) of such + data. + + 2.a. A "text" Content-Type value, which can be used to + represent textual information in a number of + character sets and formatted text description + languages in a standardized manner. + + 2.b. A "multipart" Content-Type value, which can be + used to combine several body parts, possibly of + differing types of data, into a single message. + + 2.c. An "application" Content-Type value, which can be + used to transmit application data or binary data, + and hence, among other uses, to implement an + electronic mail file transfer service. + + 2.d. A "message" Content-Type value, for encapsulating + a mail message. + + 2.e An "image" Content-Type value, for transmitting + still image (picture) data. + + 2.f. An "audio" Content-Type value, for transmitting + audio or voice data. + + 2.g. A "video" Content-Type value, for transmitting + video or moving image data, possibly with audio as + part of the composite video data format. + + 3. A Content-Transfer-Encoding header field, which can be + used to specify an auxiliary encoding that was applied + to the data in order to allow it to pass through mail + transport mechanisms which may have data or character + set limitations. + + 4. Two optional header fields that can be used to further + describe the data in a message body, the Content-ID and + Content-Description header fields. + + + + Borenstein & Freed [Page 2] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + MIME has been carefully designed as an extensible mechanism, + and it is expected that the set of content-type/subtype + pairs and their associated parameters will grow + significantly with time. Several other MIME fields, notably + including character set names, are likely to have new values + defined over time. In order to ensure that the set of such + values is developed in an orderly, well-specified, and + public manner, MIME defines a registration process which + uses the Internet Assigned Numbers Authority (IANA) as a + central registry for such values. Appendix F provides + details about how IANA registration is accomplished. + + Finally, to specify and promote interoperability, Appendix A + of this document provides a basic applicability statement + for a subset of the above mechanisms that defines a minimal + level of "conformance" with this document. + + HISTORICAL NOTE: Several of the mechanisms described in + this document may seem somewhat strange or even baroque at + first reading. It is important to note that compatibility + with existing standards AND robustness across existing + practice were two of the highest priorities of the working + group that developed this document. In particular, + compatibility was always favored over elegance. + + 2 Notations, Conventions, and Generic BNF Grammar + + This document is being published in two versions, one as + plain ASCII text and one as PostScript. The latter is + recommended, though the textual contents are identical. An + Andrew-format copy of this document is also available from + the first author (Borenstein). + + Although the mechanisms specified in this document are all + described in prose, most are also described formally in the + modified BNF notation of RFC 822. Implementors will need to + be familiar with this notation in order to understand this + specification, and are referred to RFC 822 for a complete + explanation of the modified BNF notation. + + Some of the modified BNF in this document makes reference to + syntactic entities that are defined in RFC 822 and not in + this document. A complete formal grammar, then, is obtained + by combining the collected grammar appendix of this document + with that of RFC 822. + + The term CRLF, in this document, refers to the sequence of + the two ASCII characters CR (13) and LF (10) which, taken + together, in this order, denote a line break in RFC 822 + mail. + + The term "character set", wherever it is used in this + document, refers to a coded character set, in the sense of + ISO character set standardization work, and must not be + + + + Borenstein & Freed [Page 3] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + misinterpreted as meaning "a set of characters." + + The term "message", when not further qualified, means either + the (complete or "top-level") message being transferred on a + network, or a message encapsulated in a body of type + "message". + + The term "body part", in this document, means one of the + parts of the body of a multipart entity. A body part has a + header and a body, so it makes sense to speak about the body + of a body part. + + The term "entity", in this document, means either a message + or a body part. All kinds of entities share the property + that they have a header and a body. + + The term "body", when not further qualified, means the body + of an entity, that is the body of either a message or of a + body part. + + Note : the previous four definitions are clearly circular. + This is unavoidable, since the overal structure of a MIME + message is indeed recursive. + + In this document, all numeric and octet values are given in + decimal notation. + + It must be noted that Content-Type values, subtypes, and + parameter names as defined in this document are case- + insensitive. However, parameter values are case-sensitive + unless otherwise specified for the specific parameter. + + FORMATTING NOTE: This document has been carefully formatted + for ease of reading. The PostScript version of this + document, in particular, places notes like this one, which + may be skipped by the reader, in a smaller, italicized, + font, and indents it as well. In the text version, only the + indentation is preserved, so if you are reading the text + version of this you might consider using the PostScript + version instead. However, all such notes will be indented + and preceded by "NOTE:" or some similar introduction, even + in the text version. + + The primary purpose of these non-essential notes is to + convey information about the rationale of this document, or + to place this document in the proper historical or + evolutionary context. Such information may be skipped by + those who are focused entirely on building a compliant + implementation, but may be of use to those who wish to + understand why this document is written as it is. + + For ease of recognition, all BNF definitions have been + placed in a fixed-width font in the PostScript version of + this document. + + + + Borenstein & Freed [Page 4] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + 3 The MIME-Version Header Field + + Since RFC 822 was published in 1982, there has really been + only one format standard for Internet messages, and there + has been little perceived need to declare the format + standard in use. This document is an independent document + that complements RFC 822. Although the extensions in this + document have been defined in such a way as to be compatible + with RFC 822, there are still circumstances in which it + might be desirable for a mail-processing agent to know + whether a message was composed with the new standard in + mind. + + Therefore, this document defines a new header field, "MIME- + Version", which is to be used to declare the version of the + Internet message body format standard in use. + + Messages composed in accordance with this document MUST + include such a header field, with the following verbatim + text: + + MIME-Version: 1.0 + + The presence of this header field is an assertion that the + message has been composed in compliance with this document. + + Since it is possible that a future document might extend the + message format standard again, a formal BNF is given for the + content of the MIME-Version field: + + MIME-Version := text + + Thus, future format specifiers, which might replace or + extend "1.0", are (minimally) constrained by the definition + of "text", which appears in RFC 822. + + Note that the MIME-Version header field is required at the + top level of a message. It is not required for each body + part of a multipart entity. It is required for the embedded + headers of a body of type "message" if and only if the + embedded message is itself claimed to be MIME-compliant. + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 5] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + 4 The Content-Type Header Field + + The purpose of the Content-Type field is to describe the + data contained in the body fully enough that the receiving + user agent can pick an appropriate agent or mechanism to + present the data to the user, or otherwise deal with the + data in an appropriate manner. + + HISTORICAL NOTE: The Content-Type header field was first + defined in RFC 1049. RFC 1049 Content-types used a simpler + and less powerful syntax, but one that is largely compatible + with the mechanism given here. + + The Content-Type header field is used to specify the nature + of the data in the body of an entity, by giving type and + subtype identifiers, and by providing auxiliary information + that may be required for certain types. After the type and + subtype names, the remainder of the header field is simply a + set of parameters, specified in an attribute/value notation. + The set of meaningful parameters differs for the different + types. The ordering of parameters is not significant. + Among the defined parameters is a "charset" parameter by + which the character set used in the body may be declared. + Comments are allowed in accordance with RFC 822 rules for + structured header fields. + + In general, the top-level Content-Type is used to declare + the general type of data, while the subtype specifies a + specific format for that type of data. Thus, a Content-Type + of "image/xyz" is enough to tell a user agent that the data + is an image, even if the user agent has no knowledge of the + specific image format "xyz". Such information can be used, + for example, to decide whether or not to show a user the raw + data from an unrecognized subtype -- such an action might be + reasonable for unrecognized subtypes of text, but not for + unrecognized subtypes of image or audio. For this reason, + registered subtypes of audio, image, text, and video, should + not contain embedded information that is really of a + different type. Such compound types should be represented + using the "multipart" or "application" types. + + Parameters are modifiers of the content-subtype, and do not + fundamentally affect the requirements of the host system. + Although most parameters make sense only with certain + content-types, others are "global" in the sense that they + might apply to any subtype. For example, the "boundary" + parameter makes sense only for the "multipart" content-type, + but the "charset" parameter might make sense with several + content-types. + + An initial set of seven Content-Types is defined by this + document. This set of top-level names is intended to be + substantially complete. It is expected that additions to + the larger set of supported types can generally be + + + + Borenstein & Freed [Page 6] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + accomplished by the creation of new subtypes of these + initial types. In the future, more top-level types may be + defined only by an extension to this standard. If another + primary type is to be used for any reason, it must be given + a name starting with "X-" to indicate its non-standard + status and to avoid a potential conflict with a future + official name. + + In the Extended BNF notation of RFC 822, a Content-Type + header field value is defined as follows: + + Content-Type := type "/" subtype *[";" parameter] + + type := "application" / "audio" + / "image" / "message" + / "multipart" / "text" + / "video" / x-token + + x-token := <The two characters "X-" followed, with no + intervening white space, by any token> + + subtype := token + + parameter := attribute "=" value + + attribute := token + + value := token / quoted-string + + token := 1*<any CHAR except SPACE, CTLs, or tspecials> + + tspecials := "(" / ")" / "<" / ">" / "@" ; Must be in + / "," / ";" / ":" / "\" / <"> ; quoted-string, + / "/" / "[" / "]" / "?" / "." ; to use within + / "=" ; parameter values + + Note that the definition of "tspecials" is the same as the + RFC 822 definition of "specials" with the addition of the + three characters "/", "?", and "=". + + Note also that a subtype specification is MANDATORY. There + are no default subtypes. + + The type, subtype, and parameter names are not case + sensitive. For example, TEXT, Text, and TeXt are all + equivalent. Parameter values are normally case sensitive, + but certain parameters are interpreted to be case- + insensitive, depending on the intended use. (For example, + multipart boundaries are case-sensitive, but the "access- + type" for message/External-body is not case-sensitive.) + + Beyond this syntax, the only constraint on the definition of + subtype names is the desire that their uses must not + conflict. That is, it would be undesirable to have two + + + + Borenstein & Freed [Page 7] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + different communities using "Content-Type: + application/foobar" to mean two different things. The + process of defining new content-subtypes, then, is not + intended to be a mechanism for imposing restrictions, but + simply a mechanism for publicizing the usages. There are, + therefore, two acceptable mechanisms for defining new + Content-Type subtypes: + + 1. Private values (starting with "X-") may be + defined bilaterally between two cooperating + agents without outside registration or + standardization. + + 2. New standard values must be documented, + registered with, and approved by IANA, as + described in Appendix F. Where intended for + public use, the formats they refer to must + also be defined by a published specification, + and possibly offered for standardization. + + The seven standard initial predefined Content-Types are + detailed in the bulk of this document. They are: + + text -- textual information. The primary subtype, + "plain", indicates plain (unformatted) text. No + special software is required to get the full + meaning of the text, aside from support for the + indicated character set. Subtypes are to be used + for enriched text in forms where application + software may enhance the appearance of the text, + but such software must not be required in order to + get the general idea of the content. Possible + subtypes thus include any readable word processor + format. A very simple and portable subtype, + richtext, is defined in this document. + multipart -- data consisting of multiple parts of + independent data types. Four initial subtypes + are defined, including the primary "mixed" + subtype, "alternative" for representing the same + data in multiple formats, "parallel" for parts + intended to be viewed simultaneously, and "digest" + for multipart entities in which each part is of + type "message". + message -- an encapsulated message. A body of + Content-Type "message" is itself a fully formatted + RFC 822 conformant message which may contain its + own different Content-Type header field. The + primary subtype is "rfc822". The "partial" + subtype is defined for partial messages, to permit + the fragmented transmission of bodies that are + thought to be too large to be passed through mail + transport facilities. Another subtype, + "External-body", is defined for specifying large + bodies by reference to an external data source. + + + + Borenstein & Freed [Page 8] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + image -- image data. Image requires a display device + (such as a graphical display, a printer, or a FAX + machine) to view the information. Initial + subtypes are defined for two widely-used image + formats, jpeg and gif. + audio -- audio data, with initial subtype "basic". + Audio requires an audio output device (such as a + speaker or a telephone) to "display" the contents. + video -- video data. Video requires the capability to + display moving images, typically including + specialized hardware and software. The initial + subtype is "mpeg". + application -- some other kind of data, typically + either uninterpreted binary data or information to + be processed by a mail-based application. The + primary subtype, "octet-stream", is to be used in + the case of uninterpreted binary data, in which + case the simplest recommended action is to offer + to write the information into a file for the user. + Two additional subtypes, "ODA" and "PostScript", + are defined for transporting ODA and PostScript + documents in bodies. Other expected uses for + "application" include spreadsheets, data for + mail-based scheduling systems, and languages for + "active" (computational) email. (Note that active + email entails several securityconsiderations, + which are discussed later in this memo, + particularly in the context of + application/PostScript.) + + Default RFC 822 messages are typed by this protocol as plain + text in the US-ASCII character set, which can be explicitly + specified as "Content-type: text/plain; charset=us-ascii". + If no Content-Type is specified, either by error or by an + older user agent, this default is assumed. In the presence + of a MIME-Version header field, a receiving User Agent can + also assume that plain US-ASCII text was the sender's + intent. In the absence of a MIME-Version specification, + plain US-ASCII text must still be assumed, but the sender's + intent might have been otherwise. + + RATIONALE: In the absence of any Content-Type header field + or MIME-Version header field, it is impossible to be certain + that a message is actually text in the US-ASCII character + set, since it might well be a message that, using the + conventions that predate this document, includes text in + another character set or non-textual data in a manner that + cannot be automatically recognized (e.g., a uuencoded + compressed UNIX tar file). Although there is no fully + acceptable alternative to treating such untyped messages as + "text/plain; charset=us-ascii", implementors should remain + aware that if a message lacks both the MIME-Version and the + Content-Type header fields, it may in practice contain + almost anything. + + + + Borenstein & Freed [Page 9] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + It should be noted that the list of Content-Type values + given here may be augmented in time, via the mechanisms + described above, and that the set of subtypes is expected to + grow substantially. + + When a mail reader encounters mail with an unknown Content- + type value, it should generally treat it as equivalent to + "application/octet-stream", as described later in this + document. + + 5 The Content-Transfer-Encoding Header Field + + Many Content-Types which could usefully be transported via + email are represented, in their "natural" format, as 8-bit + character or binary data. Such data cannot be transmitted + over some transport protocols. For example, RFC 821 + restricts mail messages to 7-bit US-ASCII data with 1000 + character lines. + + It is necessary, therefore, to define a standard mechanism + for re-encoding such data into a 7-bit short-line format. + This document specifies that such encodings will be + indicated by a new "Content-Transfer-Encoding" header field. + The Content-Transfer-Encoding field is used to indicate the + type of transformation that has been used in order to + represent the body in an acceptable manner for transport. + + Unlike Content-Types, a proliferation of Content-Transfer- + Encoding values is undesirable and unnecessary. However, + establishing only a single Content-Transfer-Encoding + mechanism does not seem possible. There is a tradeoff + between the desire for a compact and efficient encoding of + largely-binary data and the desire for a readable encoding + of data that is mostly, but not entirely, 7-bit data. For + this reason, at least two encoding mechanisms are necessary: + a "readable" encoding and a "dense" encoding. + + The Content-Transfer-Encoding field is designed to specify + an invertible mapping between the "native" representation of + a type of data and a representation that can be readily + exchanged using 7 bit mail transport protocols, such as + those defined by RFC 821 (SMTP). This field has not been + defined by any previous standard. The field's value is a + single token specifying the type of encoding, as enumerated + below. Formally: + + Content-Transfer-Encoding := "BASE64" / "QUOTED-PRINTABLE" / + "8BIT" / "7BIT" / + "BINARY" / x-token + + These values are not case sensitive. That is, Base64 and + BASE64 and bAsE64 are all equivalent. An encoding type of + 7BIT requires that the body is already in a seven-bit mail- + ready representation. This is the default value -- that is, + + + + Borenstein & Freed [Page 10] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + "Content-Transfer-Encoding: 7BIT" is assumed if the + Content-Transfer-Encoding header field is not present. + + The values "8bit", "7bit", and "binary" all imply that NO + encoding has been performed. However, they are potentially + useful as indications of the kind of data contained in the + object, and therefore of the kind of encoding that might + need to be performed for transmission in a given transport + system. "7bit" means that the data is all represented as + short lines of US-ASCII data. "8bit" means that the lines + are short, but there may be non-ASCII characters (octets + with the high-order bit set). "Binary" means that not only + may non-ASCII characters be present, but also that the lines + are not necessarily short enough for SMTP transport. + + The difference between "8bit" (or any other conceivable + bit-width token) and the "binary" token is that "binary" + does not require adherence to any limits on line length or + to the SMTP CRLF semantics, while the bit-width tokens do + require such adherence. If the body contains data in any + bit-width other than 7-bit, the appropriate bit-width + Content-Transfer-Encoding token must be used (e.g., "8bit" + for unencoded 8 bit wide data). If the body contains binary + data, the "binary" Content-Transfer-Encoding token must be + used. + + NOTE: The distinction between the Content-Transfer-Encoding + values of "binary," "8bit," etc. may seem unimportant, in + that all of them really mean "none" -- that is, there has + been no encoding of the data for transport. However, clear + labeling will be of enormous value to gateways between + future mail transport systems with differing capabilities in + transporting data that do not meet the restrictions of RFC + 821 transport. + + As of the publication of this document, there are no + standardized Internet transports for which it is legitimate + to include unencoded 8-bit or binary data in mail bodies. + Thus there are no circumstances in which the "8bit" or + "binary" Content-Transfer-Encoding is actually legal on the + Internet. However, in the event that 8-bit or binary mail + transport becomes a reality in Internet mail, or when this + document is used in conjunction with any other 8-bit or + binary-capable transport mechanism, 8-bit or binary bodies + should be labeled as such using this mechanism. + + NOTE: The five values defined for the Content-Transfer- + Encoding field imply nothing about the Content-Type other + than the algorithm by which it was encoded or the transport + system requirements if unencoded. + + Implementors may, if necessary, define new Content- + Transfer-Encoding values, but must use an x-token, which is + a name prefixed by "X-" to indicate its non-standard status, + + + + Borenstein & Freed [Page 11] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + e.g., "Content-Transfer-Encoding: x-my-new-encoding". + However, unlike Content-Types and subtypes, the creation of + new Content-Transfer-Encoding values is explicitly and + strongly discouraged, as it seems likely to hinder + interoperability with little potential benefit. Their use + is allowed only as the result of an agreement between + cooperating user agents. + + If a Content-Transfer-Encoding header field appears as part + of a message header, it applies to the entire body of that + message. If a Content-Transfer-Encoding header field + appears as part of a body part's headers, it applies only to + the body of that body part. If an entity is of type + "multipart" or "message", the Content-Transfer-Encoding is + not permitted to have any value other than a bit width + (e.g., "7bit", "8bit", etc.) or "binary". + + It should be noted that email is character-oriented, so that + the mechanisms described here are mechanisms for encoding + arbitrary byte streams, not bit streams. If a bit stream is + to be encoded via one of these mechanisms, it must first be + converted to an 8-bit byte stream using the network standard + bit order ("big-endian"), in which the earlier bits in a + stream become the higher-order bits in a byte. A bit stream + not ending at an 8-bit boundary must be padded with zeroes. + This document provides a mechanism for noting the addition + of such padding in the case of the application Content-Type, + which has a "padding" parameter. + + The encoding mechanisms defined here explicitly encode all + data in ASCII. Thus, for example, suppose an entity has + header fields such as: + + Content-Type: text/plain; charset=ISO-8859-1 + Content-transfer-encoding: base64 + + This should be interpreted to mean that the body is a base64 + ASCII encoding of data that was originally in ISO-8859-1, + and will be in that character set again after decoding. + + The following sections will define the two standard encoding + mechanisms. The definition of new content-transfer- + encodings is explicitly discouraged and should only occur + when absolutely necessary. All content-transfer-encoding + namespace except that beginning with "X-" is explicitly + reserved to the IANA for future use. Private agreements + about content-transfer-encodings are also explicitly + discouraged. + + Certain Content-Transfer-Encoding values may only be used on + certain Content-Types. In particular, it is expressly + forbidden to use any encodings other than "7bit", "8bit", or + "binary" with any Content-Type that recursively includes + other Content-Type fields, notably the "multipart" and + + + + Borenstein & Freed [Page 12] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + "message" Content-Types. All encodings that are desired for + bodies of type multipart or message must be done at the + innermost level, by encoding the actual body that needs to + be encoded. + + NOTE ON ENCODING RESTRICTIONS: Though the prohibition + against using content-transfer-encodings on data of type + multipart or message may seem overly restrictive, it is + necessary to prevent nested encodings, in which data are + passed through an encoding algorithm multiple times, and + must be decoded multiple times in order to be properly + viewed. Nested encodings add considerable complexity to + user agents: aside from the obvious efficiency problems + with such multiple encodings, they can obscure the basic + structure of a message. In particular, they can imply that + several decoding operations are necessary simply to find out + what types of objects a message contains. Banning nested + encodings may complicate the job of certain mail gateways, + but this seems less of a problem than the effect of nested + encodings on user agents. + + NOTE ON THE RELATIONSHIP BETWEEN CONTENT-TYPE AND CONTENT- + TRANSFER-ENCODING: It may seem that the Content-Transfer- + Encoding could be inferred from the characteristics of the + Content-Type that is to be encoded, or, at the very least, + that certain Content-Transfer-Encodings could be mandated + for use with specific Content-Types. There are several + reasons why this is not the case. First, given the varying + types of transports used for mail, some encodings may be + appropriate for some Content-Type/transport combinations and + not for others. (For example, in an 8-bit transport, no + encoding would be required for text in certain character + sets, while such encodings are clearly required for 7-bit + SMTP.) Second, certain Content-Types may require different + types of transfer encoding under different circumstances. + For example, many PostScript bodies might consist entirely + of short lines of 7-bit data and hence require little or no + encoding. Other PostScript bodies (especially those using + Level 2 PostScript's binary encoding mechanism) may only be + reasonably represented using a binary transport encoding. + Finally, since Content-Type is intended to be an open-ended + specification mechanism, strict specification of an + association between Content-Types and encodings effectively + couples the specification of an application protocol with a + specific lower-level transport. This is not desirable since + the developers of a Content-Type should not have to be aware + of all the transports in use and what their limitations are. + + NOTE ON TRANSLATING ENCODINGS: The quoted-printable and + base64 encodings are designed so that conversion between + them is possible. The only issue that arises in such a + conversion is the handling of line breaks. When converting + from quoted-printable to base64 a line break must be + converted into a CRLF sequence. Similarly, a CRLF sequence + + + + Borenstein & Freed [Page 13] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + in base64 data should be converted to a quoted-printable + line break, but ONLY when converting text data. + + NOTE ON CANONICAL ENCODING MODEL: There was some + confusion, in earlier drafts of this memo, regarding the + model for when email data was to be converted to canonical + form and encoded, and in particular how this process would + affect the treatment of CRLFs, given that the representation + of newlines varies greatly from system to system. For this + reason, a canonical model for encoding is presented as + Appendix H. + + 5.1 Quoted-Printable Content-Transfer-Encoding + + The Quoted-Printable encoding is intended to represent data + that largely consists of octets that correspond to printable + characters in the ASCII character set. It encodes the data + in such a way that the resulting octets are unlikely to be + modified by mail transport. If the data being encoded are + mostly ASCII text, the encoded form of the data remains + largely recognizable by humans. A body which is entirely + ASCII may also be encoded in Quoted-Printable to ensure the + integrity of the data should the message pass through a + character-translating, and/or line-wrapping gateway. + + In this encoding, octets are to be represented as determined + by the following rules: + + Rule #1: (General 8-bit representation) Any octet, + except those indicating a line break according to the + newline convention of the canonical form of the data + being encoded, may be represented by an "=" followed by + a two digit hexadecimal representation of the octet's + value. The digits of the hexadecimal alphabet, for this + purpose, are "0123456789ABCDEF". Uppercase letters must + be + used when sending hexadecimal data, though a robust + implementation may choose to recognize lowercase + letters on receipt. Thus, for example, the value 12 + (ASCII form feed) can be represented by "=0C", and the + value 61 (ASCII EQUAL SIGN) can be represented by + "=3D". Except when the following rules allow an + alternative encoding, this rule is mandatory. + + Rule #2: (Literal representation) Octets with decimal + values of 33 through 60 inclusive, and 62 through 126, + inclusive, MAY be represented as the ASCII characters + which correspond to those octets (EXCLAMATION POINT + through LESS THAN, and GREATER THAN through TILDE, + respectively). + + Rule #3: (White Space): Octets with values of 9 and 32 + MAY be represented as ASCII TAB (HT) and SPACE + characters, respectively, but MUST NOT be so + + + + Borenstein & Freed [Page 14] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + represented at the end of an encoded line. Any TAB (HT) + or SPACE characters on an encoded line MUST thus be + followed on that line by a printable character. In + particular, an "=" at the end of an encoded line, + indicating a soft line break (see rule #5) may follow + one or more TAB (HT) or SPACE characters. It follows + that an octet with value 9 or 32 appearing at the end + of an encoded line must be represented according to + Rule #1. This rule is necessary because some MTAs + (Message Transport Agents, programs which transport + messages from one user to another, or perform a part of + such transfers) are known to pad lines of text with + SPACEs, and others are known to remove "white space" + characters from the end of a line. Therefore, when + decoding a Quoted-Printable body, any trailing white + space on a line must be deleted, as it will necessarily + have been added by intermediate transport agents. + + Rule #4 (Line Breaks): A line break in a text body + part, independent of what its representation is + following the canonical representation of the data + being encoded, must be represented by a (RFC 822) line + break, which is a CRLF sequence, in the Quoted- + Printable encoding. If isolated CRs and LFs, or LF CR + and CR LF sequences are allowed to appear in binary + data according to the canonical form, they must be + represented using the "=0D", "=0A", "=0A=0D" and + "=0D=0A" notations respectively. + + Note that many implementation may elect to encode the + local representation of various content types directly. + In particular, this may apply to plain text material on + systems that use newline conventions other than CRLF + delimiters. Such an implementation is permissible, but + the generation of line breaks must be generalized to + account for the case where alternate representations of + newline sequences are used. + + Rule #5 (Soft Line Breaks): The Quoted-Printable + encoding REQUIRES that encoded lines be no more than 76 + characters long. If longer lines are to be encoded with + the Quoted-Printable encoding, 'soft' line breaks must + be used. An equal sign as the last character on a + encoded line indicates such a non-significant ('soft') + line break in the encoded text. Thus if the "raw" form + of the line is a single unencoded line that says: + + Now's the time for all folk to come to the aid of + their country. + + This can be represented, in the Quoted-Printable + encoding, as + + + + + + Borenstein & Freed [Page 15] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Now's the time = + for all folk to come= + to the aid of their country. + + This provides a mechanism with which long lines are + encoded in such a way as to be restored by the user + agent. The 76 character limit does not count the + trailing CRLF, but counts all other characters, + including any equal signs. + + Since the hyphen character ("-") is represented as itself in + the Quoted-Printable encoding, care must be taken, when + encapsulating a quoted-printable encoded body in a multipart + entity, to ensure that the encapsulation boundary does not + appear anywhere in the encoded body. (A good strategy is to + choose a boundary that includes a character sequence such as + "=_" which can never appear in a quoted-printable body. See + the definition of multipart messages later in this + document.) + + NOTE: The quoted-printable encoding represents something of + a compromise between readability and reliability in + transport. Bodies encoded with the quoted-printable + encoding will work reliably over most mail gateways, but may + not work perfectly over a few gateways, notably those + involving translation into EBCDIC. (In theory, an EBCDIC + gateway could decode a quoted-printable body and re-encode + it using base64, but such gateways do not yet exist.) A + higher level of confidence is offered by the base64 + Content-Transfer-Encoding. A way to get reasonably reliable + transport through EBCDIC gateways is to also quote the ASCII + characters + + !"#$@[\]^`{|}~ + + according to rule #1. See Appendix B for more information. + + Because quoted-printable data is generally assumed to be + line-oriented, it is to be expected that the breaks between + the lines of quoted printable data may be altered in + transport, in the same manner that plain text mail has + always been altered in Internet mail when passing between + systems with differing newline conventions. If such + alterations are likely to constitute a corruption of the + data, it is probably more sensible to use the base64 + encoding rather than the quoted-printable encoding. + + + + + + + + + + + + Borenstein & Freed [Page 16] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + 5.2 Base64 Content-Transfer-Encoding + + The Base64 Content-Transfer-Encoding is designed to + represent arbitrary sequences of octets in a form that is + not humanly readable. The encoding and decoding algorithms + are simple, but the encoded data are consistently only about + 33 percent larger than the unencoded data. This encoding is + based on the one used in Privacy Enhanced Mail applications, + as defined in RFC 1113. The base64 encoding is adapted + from RFC 1113, with one change: base64 eliminates the "*" + mechanism for embedded clear text. + + A 65-character subset of US-ASCII is used, enabling 6 bits + to be represented per printable character. (The extra 65th + character, "=", is used to signify a special processing + function.) + + NOTE: This subset has the important property that it is + represented identically in all versions of ISO 646, + including US ASCII, and all characters in the subset are + also represented identically in all versions of EBCDIC. + Other popular encodings, such as the encoding used by the + UUENCODE utility and the base85 encoding specified as part + of Level 2 PostScript, do not share these properties, and + thus do not fulfill the portability requirements a binary + transport encoding for mail must meet. + + The encoding process represents 24-bit groups of input bits + as output strings of 4 encoded characters. Proceeding from + left to right, a 24-bit input group is formed by + concatenating 3 8-bit input groups. These 24 bits are then + treated as 4 concatenated 6-bit groups, each of which is + translated into a single digit in the base64 alphabet. When + encoding a bit stream via the base64 encoding, the bit + stream must be presumed to be ordered with the most- + significant-bit first. That is, the first bit in the stream + will be the high-order bit in the first byte, and the eighth + bit will be the low-order bit in the first byte, and so on. + + Each 6-bit group is used as an index into an array of 64 + printable characters. The character referenced by the index + is placed in the output string. These characters, identified + in Table 1, below, are selected so as to be universally + representable, and the set excludes characters with + particular significance to SMTP (e.g., ".", "CR", "LF") and + to the encapsulation boundaries defined in this document + (e.g., "-"). + + + + + + + + + + + Borenstein & Freed [Page 17] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Table 1: The Base64 Alphabet + + Value Encoding Value Encoding Value Encoding Value + Encoding + 0 A 17 R 34 i 51 z + 1 B 18 S 35 j 52 0 + 2 C 19 T 36 k 53 1 + 3 D 20 U 37 l 54 2 + 4 E 21 V 38 m 55 3 + 5 F 22 W 39 n 56 4 + 6 G 23 X 40 o 57 5 + 7 H 24 Y 41 p 58 6 + 8 I 25 Z 42 q 59 7 + 9 J 26 a 43 r 60 8 + 10 K 27 b 44 s 61 9 + 11 L 28 c 45 t 62 + + 12 M 29 d 46 u 63 / + 13 N 30 e 47 v + 14 O 31 f 48 w (pad) = + 15 P 32 g 49 x + 16 Q 33 h 50 y + + The output stream (encoded bytes) must be represented in + lines of no more than 76 characters each. All line breaks + or other characters not found in Table 1 must be ignored by + decoding software. In base64 data, characters other than + those in Table 1, line breaks, and other white space + probably indicate a transmission error, about which a + warning message or even a message rejection might be + appropriate under some circumstances. + + Special processing is performed if fewer than 24 bits are + available at the end of the data being encoded. A full + encoding quantum is always completed at the end of a body. + When fewer than 24 input bits are available in an input + group, zero bits are added (on the right) to form an + integral number of 6-bit groups. Output character positions + which are not required to represent actual input data are + set to the character "=". Since all base64 input is an + integral number of octets, only the following cases can + arise: (1) the final quantum of encoding input is an + integral multiple of 24 bits; here, the final unit of + encoded output will be an integral multiple of 4 characters + with no "=" padding, (2) the final quantum of encoding input + is exactly 8 bits; here, the final unit of encoded output + will be two characters followed by two "=" padding + characters, or (3) the final quantum of encoding input is + exactly 16 bits; here, the final unit of encoded output will + be three characters followed by one "=" padding character. + + Care must be taken to use the proper octets for line breaks + if base64 encoding is applied directly to text material that + has not been converted to canonical form. In particular, + text line breaks should be converted into CRLF sequences + + + + Borenstein & Freed [Page 18] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + prior to base64 encoding. The important thing to note is + that this may be done directly by the encoder rather than in + a prior canonicalization step in some implementations. + + NOTE: There is no need to worry about quoting apparent + encapsulation boundaries within base64-encoded parts of + multipart entities because no hyphen characters are used in + the base64 encoding. + + 6 Additional Optional Content- Header Fields + + 6.1 Optional Content-ID Header Field + + In constructing a high-level user agent, it may be desirable + to allow one body to make reference to another. + Accordingly, bodies may be labeled using the "Content-ID" + header field, which is syntactically identical to the + "Message-ID" header field: + + Content-ID := msg-id + + Like the Message-ID values, Content-ID values must be + generated to be as unique as possible. + + 6.2 Optional Content-Description Header Field + + The ability to associate some descriptive information with a + given body is often desirable. For example, it may be useful + to mark an "image" body as "a picture of the Space Shuttle + Endeavor." Such text may be placed in the Content- + Description header field. + + Content-Description := *text + + The description is presumed to be given in the US-ASCII + character set, although the mechanism specified in [RFC- + 1342] may be used for non-US-ASCII Content-Description + values. + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 19] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + 7 The Predefined Content-Type Values + + This document defines seven initial Content-Type values and + an extension mechanism for private or experimental types. + Further standard types must be defined by new published + specifications. It is expected that most innovation in new + types of mail will take place as subtypes of the seven types + defined here. The most essential characteristics of the + seven content-types are summarized in Appendix G. + + 7.1 The Text Content-Type + + The text Content-Type is intended for sending material which + is principally textual in form. It is the default Content- + Type. A "charset" parameter may be used to indicate the + character set of the body text. The primary subtype of text + is "plain". This indicates plain (unformatted) text. The + default Content-Type for Internet mail is "text/plain; + charset=us-ascii". + + Beyond plain text, there are many formats for representing + what might be known as "extended text" -- text with embedded + formatting and presentation information. An interesting + characteristic of many such representations is that they are + to some extent readable even without the software that + interprets them. It is useful, then, to distinguish them, + at the highest level, from such unreadable data as images, + audio, or text represented in an unreadable form. In the + absence of appropriate interpretation software, it is + reasonable to show subtypes of text to the user, while it is + not reasonable to do so with most nontextual data. + + Such formatted textual data should be represented using + subtypes of text. Plausible subtypes of text are typically + given by the common name of the representation format, e.g., + "text/richtext". + + 7.1.1 The charset parameter + + A critical parameter that may be specified in the Content- + Type field for text data is the character set. This is + specified with a "charset" parameter, as in: + + Content-type: text/plain; charset=us-ascii + + Unlike some other parameter values, the values of the + charset parameter are NOT case sensitive. The default + character set, which must be assumed in the absence of a + charset parameter, is US-ASCII. + + An initial list of predefined character set names can be + found at the end of this section. Additional character sets + may be registered with IANA as described in Appendix F, + although the standardization of their use requires the usual + + + + Borenstein & Freed [Page 20] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + IAB review and approval. Note that if the specified + character set includes 8-bit data, a Content-Transfer- + Encoding header field and a corresponding encoding on the + data are required in order to transmit the body via some + mail transfer protocols, such as SMTP. + + The default character set, US-ASCII, has been the subject of + some confusion and ambiguity in the past. Not only were + there some ambiguities in the definition, there have been + wide variations in practice. In order to eliminate such + ambiguity and variations in the future, it is strongly + recommended that new user agents explicitly specify a + character set via the Content-Type header field. "US-ASCII" + does not indicate an arbitrary seven-bit character code, but + specifies that the body uses character coding that uses the + exact correspondence of codes to characters specified in + ASCII. National use variations of ISO 646 [ISO-646] are NOT + ASCII and their use in Internet mail is explicitly + discouraged. The omission of the ISO 646 character set is + deliberate in this regard. The character set name of "US- + ASCII" explicitly refers to ANSI X3.4-1986 [US-ASCII] only. + The character set name "ASCII" is reserved and must not be + used for any purpose. + + NOTE: RFC 821 explicitly specifies "ASCII", and references + an earlier version of the American Standard. Insofar as one + of the purposes of specifying a Content-Type and character + set is to permit the receiver to unambiguously determine how + the sender intended the coded message to be interpreted, + assuming anything other than "strict ASCII" as the default + would risk unintentional and incompatible changes to the + semantics of messages now being transmitted. This also + implies that messages containing characters coded according + to national variations on ISO 646, or using code-switching + procedures (e.g., those of ISO 2022), as well as 8-bit or + multiple octet character encodings MUST use an appropriate + character set specification to be consistent with this + specification. + + The complete US-ASCII character set is listed in [US-ASCII]. + Note that the control characters including DEL (0-31, 127) + have no defined meaning apart from the combination CRLF + (ASCII values 13 and 10) indicating a new line. Two of the + characters have de facto meanings in wide use: FF (12) often + means "start subsequent text on the beginning of a new + page"; and TAB or HT (9) often (though not always) means + "move the cursor to the next available column after the + current position where the column number is a multiple of 8 + (counting the first column as column 0)." Apart from this, + any use of the control characters or DEL in a body must be + part of a private agreement between the sender and + recipient. Such private agreements are discouraged and + should be replaced by the other capabilities of this + document. + + + + Borenstein & Freed [Page 21] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + NOTE: Beyond US-ASCII, an enormous proliferation of + character sets is possible. It is the opinion of the IETF + working group that a large number of character sets is NOT a + good thing. We would prefer to specify a single character + set that can be used universally for representing all of the + world's languages in electronic mail. Unfortunately, + existing practice in several communities seems to point to + the continued use of multiple character sets in the near + future. For this reason, we define names for a small number + of character sets for which a strong constituent base + exists. It is our hope that ISO 10646 or some other + effort will eventually define a single world character set + which can then be specified for use in Internet mail, but in + the advance of that definition we cannot specify the use of + ISO 10646, Unicode, or any other character set whose + definition is, as of this writing, incomplete. + + The defined charset values are: + + US-ASCII -- as defined in [US-ASCII]. + + ISO-8859-X -- where "X" is to be replaced, as + necessary, for the parts of ISO-8859 [ISO- + 8859]. Note that the ISO 646 character sets + have deliberately been omitted in favor of + their 8859 replacements, which are the + designated character sets for Internet mail. + As of the publication of this document, the + legitimate values for "X" are the digits 1 + through 9. + + Note that the character set used, if anything other than + US-ASCII, must always be explicitly specified in the + Content-Type field. + + No other character set name may be used in Internet mail + without the publication of a formal specification and its + registration with IANA as described in Appendix F, or by + private agreement, in which case the character set name must + begin with "X-". + + Implementors are discouraged from defining new character + sets for mail use unless absolutely necessary. + + The "charset" parameter has been defined primarily for the + purpose of textual data, and is described in this section + for that reason. However, it is conceivable that non- + textual data might also wish to specify a charset value for + some purpose, in which case the same syntax and values + should be used. + + In general, mail-sending software should always use the + "lowest common denominator" character set possible. For + example, if a body contains only US-ASCII characters, it + + + + Borenstein & Freed [Page 22] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + should be marked as being in the US-ASCII character set, not + ISO-8859-1, which, like all the ISO-8859 family of character + sets, is a superset of US-ASCII. More generally, if a + widely-used character set is a subset of another character + set, and a body contains only characters in the widely-used + subset, it should be labeled as being in that subset. This + will increase the chances that the recipient will be able to + view the mail correctly. + + 7.1.2 The Text/plain subtype + + The primary subtype of text is "plain". This indicates + plain (unformatted) text. The default Content-Type for + Internet mail, "text/plain; charset=us-ascii", describes + existing Internet practice, that is, it is the type of body + defined by RFC 822. + + 7.1.3 The Text/richtext subtype + + In order to promote the wider interoperability of simple + formatted text, this document defines an extremely simple + subtype of "text", the "richtext" subtype. This subtype was + designed to meet the following criteria: + + 1. The syntax must be extremely simple to parse, + so that even teletype-oriented mail systems can + easily strip away the formatting information and + leave only the readable text. + + 2. The syntax must be extensible to allow for new + formatting commands that are deemed essential. + + 3. The capabilities must be extremely limited, to + ensure that it can represent no more than is + likely to be representable by the user's primary + word processor. While this limits what can be + sent, it increases the likelihood that what is + sent can be properly displayed. + + 4. The syntax must be compatible with SGML, so + that, with an appropriate DTD (Document Type + Definition, the standard mechanism for defining a + document type using SGML), a general SGML parser + could be made to parse richtext. However, despite + this compatibility, the syntax should be far + simpler than full SGML, so that no SGML knowledge + is required in order to implement it. + + The syntax of "richtext" is very simple. It is assumed, at + the top-level, to be in the US-ASCII character set, unless + of course a different charset parameter was specified in the + Content-type field. All characters represent themselves, + with the exception of the "<" character (ASCII 60), which is + used to mark the beginning of a formatting command. + + + + Borenstein & Freed [Page 23] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Formatting instructions consist of formatting commands + surrounded by angle brackets ("<>", ASCII 60 and 62). Each + formatting command may be no more than 40 characters in + length, all in US-ASCII, restricted to the alphanumeric and + hyphen ("-") characters. Formatting commands may be preceded + by a forward slash or solidus ("/", ASCII 47), making them + negations, and such negations must always exist to balance + the initial opening commands, except as noted below. Thus, + if the formatting command "<bold>" appears at some point, + there must later be a "</bold>" to balance it. There are + only three exceptions to this "balancing" rule: First, the + command "<lt>" is used to represent a literal "<" character. + Second, the command "<nl>" is used to represent a required + line break. (Otherwise, CRLFs in the data are treated as + equivalent to a single SPACE character.) Finally, the + command "<np>" is used to represent a page break. (NOTE: + The 40 character limit on formatting commands does not + include the "<", ">", or "/" characters that might be + attached to such commands.) + + Initially defined formatting commands, not all of which will + be implemented by all richtext implementations, include: + + Bold -- causes the subsequent text to be in a bold + font. + Italic -- causes the subsequent text to be in an italic + font. + Fixed -- causes the subsequent text to be in a fixed + width font. + Smaller -- causes the subsequent text to be in a + smaller font. + Bigger -- causes the subsequent text to be in a bigger + font. + Underline -- causes the subsequent text to be + underlined. + Center -- causes the subsequent text to be centered. + FlushLeft -- causes the subsequent text to be left + justified. + FlushRight -- causes the subsequent text to be right + justified. + Indent -- causes the subsequent text to be indented at + the left margin. + IndentRight -- causes the subsequent text to be + indented at the right margin. + Outdent -- causes the subsequent text to be outdented + at the left margin. + OutdentRight -- causes the subsequent text to be + outdented at the right margin. + SamePage -- causes the subsequent text to be grouped, + if possible, on one page. + Subscript -- causes the subsequent text to be + interpreted as a subscript. + + + + + + Borenstein & Freed [Page 24] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Superscript -- causes the subsequent text to be + interpreted as a superscript. + Heading -- causes the subsequent text to be interpreted + as a page heading. + Footing -- causes the subsequent text to be interpreted + as a page footing. + ISO-8859-X (for any value of X that is legal as a + "charset" parameter) -- causes the subsequent text + to be interpreted as text in the appropriate + character set. + US-ASCII -- causes the subsequent text to be + interpreted as text in the US-ASCII character set. + Excerpt -- causes the subsequent text to be interpreted + as a textual excerpt from another source. + Typically this will be displayed using indentation + and an alternate font, but such decisions are up + to the viewer. + Paragraph -- causes the subsequent text to be + interpreted as a single paragraph, with + appropriate paragraph breaks (typically blank + space) before and after. + Signature -- causes the subsequent text to be + interpreted as a "signature". Some systems may + wish to display signatures in a smaller font or + otherwise set them apart from the main text of the + message. + Comment -- causes the subsequent text to be interpreted + as a comment, and hence not shown to the reader. + No-op -- has no effect on the subsequent text. + lt -- <lt> is replaced by a literal "<" character. No + balancing </lt> is allowed. + nl -- <nl> causes a line break. No balancing </nl> is + allowed. + np -- <np> causes a page break. No balancing </np> is + allowed. + + Each positive formatting command affects all subsequent text + until the matching negative formatting command. Such pairs + of formatting commands must be properly balanced and nested. + Thus, a proper way to describe text in bold italics is: + + <bold><italic>the-text</italic></bold> + + or, alternately, + + <italic><bold>the-text</bold></italic> + + but, in particular, the following is illegal + richtext: + + <bold><italic>the-text</bold></italic> + + NOTE: The nesting requirement for formatting commands + imposes a slightly higher burden upon the composers of + + + + Borenstein & Freed [Page 25] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + richtext bodies, but potentially simplifies richtext + displayers by allowing them to be stack-based. The main + goal of richtext is to be simple enough to make multifont, + formatted email widely readable, so that those with the + capability of sending it will be able to do so with + confidence. Thus slightly increased complexity in the + composing software was deemed a reasonable tradeoff for + simplified reading software. Nonetheless, implementors of + richtext readers are encouraged to follow the general + Internet guidelines of being conservative in what you send + and liberal in what you accept. Those implementations that + can do so are encouraged to deal reasonably with improperly + nested richtext. + + Implementations must regard any unrecognized formatting + command as equivalent to "No-op", thus facilitating future + extensions to "richtext". Private extensions may be defined + using formatting commands that begin with "X-", by analogy + to Internet mail header field names. + + It is worth noting that no special behavior is required for + the TAB (HT) character. It is recommended, however, that, at + least when fixed-width fonts are in use, the common + semantics of the TAB (HT) character should be observed, + namely that it moves to the next column position that is a + multiple of 8. (In other words, if a TAB (HT) occurs in + column n, where the leftmost column is column 0, then that + TAB (HT) should be replaced by 8-(n mod 8) SPACE + characters.) + + Richtext also differentiates between "hard" and "soft" line + breaks. A line break (CRLF) in the richtext data stream is + interpreted as a "soft" line break, one that is included + only for purposes of mail transport, and is to be treated as + white space by richtext interpreters. To include a "hard" + line break (one that must be displayed as such), the "<nl>" + or "<paragraph> formatting constructs should be used. In + general, a soft line break should be treated as white space, + but when soft line breaks immediately follow a <nl> or a + </paragraph> tag they should be ignored rather than treated + as white space. + + Putting all this together, the following "text/richtext" + body fragment: + + <bold>Now</bold> is the time for + <italic>all</italic> good men + <smaller>(and <lt>women>)</smaller> to + <ignoreme></ignoreme> come + + to the aid of their + <nl> + + + + + + Borenstein & Freed [Page 26] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + beloved <nl><nl>country. <comment> Stupid + quote! </comment> -- the end + + represents the following formatted text (which will, no + doubt, look cryptic in the text-only version of this + document): + + Now is the time for all good men (and <women>) to + come to the aid of their + beloved + + country. -- the end + + Richtext conformance: A minimal richtext implementation is + one that simply converts "<lt>" to "<", converts CRLFs to + SPACE, converts <nl> to a newline according to local newline + convention, removes everything between a <comment> command + and the next balancing </comment> command, and removes all + other formatting commands (all text enclosed in angle + brackets). + + NOTE ON THE RELATIONSHIP OF RICHTEXT TO SGML: Richtext is + decidedly not SGML, and must not be used to transport + arbitrary SGML documents. Those who wish to use SGML + document types as a mail transport format must define a new + text or application subtype, e.g., "text/sgml-dtd-whatever" + or "application/sgml-dtd-whatever", depending on the + perceived readability of the DTD in use. Richtext is + designed to be compatible with SGML, and specifically so + that it will be possible to define a richtext DTD if one is + needed. However, this does not imply that arbitrary SGML + can be called richtext, nor that richtext implementors have + any need to understand SGML; the description in this + document is a complete definition of richtext, which is far + simpler than complete SGML. + + NOTE ON THE INTENDED USE OF RICHTEXT: It is recognized that + implementors of future mail systems will want rich text + functionality far beyond that currently defined for + richtext. The intent of richtext is to provide a common + format for expressing that functionality in a form in which + much of it, at least, will be understood by interoperating + software. Thus, in particular, software with a richer + notion of formatted text than richtext can still use + richtext as its basic representation, but can extend it with + new formatting commands and by hiding information specific + to that software system in richtext comments. As such + systems evolve, it is expected that the definition of + richtext will be further refined by future published + specifications, but richtext as defined here provides a + platform on which evolutionary refinements can be based. + + IMPLEMENTATION NOTE: In some environments, it might be + impossible to combine certain richtext formatting commands, + + + + Borenstein & Freed [Page 27] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + whereas in others they might be combined easily. For + example, the combination of <bold> and <italic> might + produce bold italics on systems that support such fonts, but + there exist systems that can make text bold or italicized, + but not both. In such cases, the most recently issued + recognized formatting command should be preferred. + + One of the major goals in the design of richtext was to make + it so simple that even text-only mailers will implement + richtext-to-plain-text translators, thus increasing the + likelihood that multifont text will become "safe" to use + very widely. To demonstrate this simplicity, an extremely + simple 35-line C program that converts richtext input into + plain text output is included in Appendix D. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 28] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + 7.2 The Multipart Content-Type + + In the case of multiple part messages, in which one or more + different sets of data are combined in a single body, a + "multipart" Content-Type field must appear in the entity's + header. The body must then contain one or more "body parts," + each preceded by an encapsulation boundary, and the last one + followed by a closing boundary. Each part starts with an + encapsulation boundary, and then contains a body part + consisting of header area, a blank line, and a body area. + Thus a body part is similar to an RFC 822 message in syntax, + but different in meaning. + + A body part is NOT to be interpreted as actually being an + RFC 822 message. To begin with, NO header fields are + actually required in body parts. A body part that starts + with a blank line, therefore, is allowed and is a body part + for which all default values are to be assumed. In such a + case, the absence of a Content-Type header field implies + that the encapsulation is plain US-ASCII text. The only + header fields that have defined meaning for body parts are + those the names of which begin with "Content-". All other + header fields are generally to be ignored in body parts. + Although they should generally be retained in mail + processing, they may be discarded by gateways if necessary. + Such other fields are permitted to appear in body parts but + should not be depended on. "X-" fields may be created for + experimental or private purposes, with the recognition that + the information they contain may be lost at some gateways. + + The distinction between an RFC 822 message and a body part + is subtle, but important. A gateway between Internet and + X.400 mail, for example, must be able to tell the difference + between a body part that contains an image and a body part + that contains an encapsulated message, the body of which is + an image. In order to represent the latter, the body part + must have "Content-Type: message", and its body (after the + blank line) must be the encapsulated message, with its own + "Content-Type: image" header field. The use of similar + syntax facilitates the conversion of messages to body parts, + and vice versa, but the distinction between the two must be + understood by implementors. (For the special case in which + all parts actually are messages, a "digest" subtype is also + defined.) + + As stated previously, each body part is preceded by an + encapsulation boundary. The encapsulation boundary MUST NOT + appear inside any of the encapsulated parts. Thus, it is + crucial that the composing agent be able to choose and + specify the unique boundary that will separate the parts. + + All present and future subtypes of the "multipart" type must + use an identical syntax. Subtypes may differ in their + semantics, and may impose additional restrictions on syntax, + + + + Borenstein & Freed [Page 29] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + but must conform to the required syntax for the multipart + type. This requirement ensures that all conformant user + agents will at least be able to recognize and separate the + parts of any multipart entity, even of an unrecognized + subtype. + + As stated in the definition of the Content-Transfer-Encoding + field, no encoding other than "7bit", "8bit", or "binary" is + permitted for entities of type "multipart". The multipart + delimiters and header fields are always 7-bit ASCII in any + case, and data within the body parts can be encoded on a + part-by-part basis, with Content-Transfer-Encoding fields + for each appropriate body part. + + Mail gateways, relays, and other mail handling agents are + commonly known to alter the top-level header of an RFC 822 + message. In particular, they frequently add, remove, or + reorder header fields. Such alterations are explicitly + forbidden for the body part headers embedded in the bodies + of messages of type "multipart." + + 7.2.1 Multipart: The common syntax + + All subtypes of "multipart" share a common syntax, defined + in this section. A simple example of a multipart message + also appears in this section. An example of a more complex + multipart message is given in Appendix C. + + The Content-Type field for multipart entities requires one + parameter, "boundary", which is used to specify the + encapsulation boundary. The encapsulation boundary is + defined as a line consisting entirely of two hyphen + characters ("-", decimal code 45) followed by the boundary + parameter value from the Content-Type header field. + + NOTE: The hyphens are for rough compatibility with the + earlier RFC 934 method of message encapsulation, and for + ease of searching for the boundaries in some + implementations. However, it should be noted that multipart + messages are NOT completely compatible with RFC 934 + encapsulations; in particular, they do not obey RFC 934 + quoting conventions for embedded lines that begin with + hyphens. This mechanism was chosen over the RFC 934 + mechanism because the latter causes lines to grow with each + level of quoting. The combination of this growth with the + fact that SMTP implementations sometimes wrap long lines + made the RFC 934 mechanism unsuitable for use in the event + that deeply-nested multipart structuring is ever desired. + + Thus, a typical multipart Content-Type header field might + look like this: + + Content-Type: multipart/mixed; + + + + + Borenstein & Freed [Page 30] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + boundary=gc0p4Jq0M2Yt08jU534c0p + + This indicates that the entity consists of several parts, + each itself with a structure that is syntactically identical + to an RFC 822 message, except that the header area might be + completely empty, and that the parts are each preceded by + the line + + --gc0p4Jq0M2Yt08jU534c0p + + Note that the encapsulation boundary must occur at the + beginning of a line, i.e., following a CRLF, and that that + initial CRLF is considered to be part of the encapsulation + boundary rather than part of the preceding part. The + boundary must be followed immediately either by another CRLF + and the header fields for the next part, or by two CRLFs, in + which case there are no header fields for the next part (and + it is therefore assumed to be of Content-Type text/plain). + + NOTE: The CRLF preceding the encapsulation line is + considered part of the boundary so that it is possible to + have a part that does not end with a CRLF (line break). + Body parts that must be considered to end with line breaks, + therefore, should have two CRLFs preceding the encapsulation + line, the first of which is part of the preceding body part, + and the second of which is part of the encapsulation + boundary. + + The requirement that the encapsulation boundary begins with + a CRLF implies that the body of a multipart entity must + itself begin with a CRLF before the first encapsulation line + -- that is, if the "preamble" area is not used, the entity + headers must be followed by TWO CRLFs. This is indeed how + such entities should be composed. A tolerant mail reading + program, however, may interpret a body of type multipart + that begins with an encapsulation line NOT initiated by a + CRLF as also being an encapsulation boundary, but a + compliant mail sending program must not generate such + entities. + + Encapsulation boundaries must not appear within the + encapsulations, and must be no longer than 70 characters, + not counting the two leading hyphens. + + The encapsulation boundary following the last body part is a + distinguished delimiter that indicates that no further body + parts will follow. Such a delimiter is identical to the + previous delimiters, with the addition of two more hyphens + at the end of the line: + + --gc0p4Jq0M2Yt08jU534c0p-- + + There appears to be room for additional information prior to + the first encapsulation boundary and following the final + + + + Borenstein & Freed [Page 31] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + boundary. These areas should generally be left blank, and + implementations should ignore anything that appears before + the first boundary or after the last one. + + NOTE: These "preamble" and "epilogue" areas are not used + because of the lack of proper typing of these parts and the + lack of clear semantics for handling these areas at + gateways, particularly X.400 gateways. + + NOTE: Because encapsulation boundaries must not appear in + the body parts being encapsulated, a user agent must + exercise care to choose a unique boundary. The boundary in + the example above could have been the result of an algorithm + designed to produce boundaries with a very low probability + of already existing in the data to be encapsulated without + having to prescan the data. Alternate algorithms might + result in more 'readable' boundaries for a recipient with an + old user agent, but would require more attention to the + possibility that the boundary might appear in the + encapsulated part. The simplest boundary possible is + something like "---", with a closing boundary of "-----". + + As a very simple example, the following multipart message + has two parts, both of them plain text, one of them + explicitly typed and one of them implicitly typed: + + From: Nathaniel Borenstein <nsb@bellcore.com> + To: Ned Freed <ned@innosoft.com> + Subject: Sample message + MIME-Version: 1.0 + Content-type: multipart/mixed; boundary="simple + boundary" + + This is the preamble. It is to be ignored, though it + is a handy place for mail composers to include an + explanatory note to non-MIME compliant readers. + --simple boundary + + This is implicitly typed plain ASCII text. + It does NOT end with a linebreak. + --simple boundary + Content-type: text/plain; charset=us-ascii + + This is explicitly typed plain ASCII text. + It DOES end with a linebreak. + + --simple boundary-- + This is the epilogue. It is also to be ignored. + + The use of a Content-Type of multipart in a body part within + another multipart entity is explicitly allowed. In such + cases, for obvious reasons, care must be taken to ensure + that each nested multipart entity must use a different + boundary delimiter. See Appendix C for an example of nested + + + + Borenstein & Freed [Page 32] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + multipart entities. + + The use of the multipart Content-Type with only a single + body part may be useful in certain contexts, and is + explicitly permitted. + + The only mandatory parameter for the multipart Content-Type + is the boundary parameter, which consists of 1 to 70 + characters from a set of characters known to be very robust + through email gateways, and NOT ending with white space. + (If a boundary appears to end with white space, the white + space must be presumed to have been added by a gateway, and + should be deleted.) It is formally specified by the + following BNF: + + boundary := 0*69<bchars> bcharsnospace + + bchars := bcharsnospace / " " + + bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" / "+" / + "_" + / "," / "-" / "." / "/" / ":" / "=" / "?" + + Overall, the body of a multipart entity may be specified as + follows: + + multipart-body := preamble 1*encapsulation + close-delimiter epilogue + + encapsulation := delimiter CRLF body-part + + delimiter := CRLF "--" boundary ; taken from Content-Type + field. + ; when content-type is + multipart + ; There must be no space + ; between "--" and boundary. + + close-delimiter := delimiter "--" ; Again, no space before + "--" + + preamble := *text ; to be ignored upon + receipt. + + epilogue := *text ; to be ignored upon + receipt. + + body-part = <"message" as defined in RFC 822, + with all header fields optional, and with the + specified delimiter not occurring anywhere in + the message body, either on a line by itself + or as a substring anywhere. Note that the + + + + + + Borenstein & Freed [Page 33] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + semantics of a part differ from the semantics + of a message, as described in the text.> + + NOTE: Conspicuously missing from the multipart type is a + notion of structured, related body parts. In general, it + seems premature to try to standardize interpart structure + yet. It is recommended that those wishing to provide a more + structured or integrated multipart messaging facility should + define a subtype of multipart that is syntactically + identical, but that always expects the inclusion of a + distinguished part that can be used to specify the structure + and integration of the other parts, probably referring to + them by their Content-ID field. If this approach is used, + other implementations will not recognize the new subtype, + but will treat it as the primary subtype (multipart/mixed) + and will thus be able to show the user the parts that are + recognized. + + 7.2.2 The Multipart/mixed (primary) subtype + + The primary subtype for multipart, "mixed", is intended for + use when the body parts are independent and intended to be + displayed serially. Any multipart subtypes that an + implementation does not recognize should be treated as being + of subtype "mixed". + + 7.2.3 The Multipart/alternative subtype + + The multipart/alternative type is syntactically identical to + multipart/mixed, but the semantics are different. In + particular, each of the parts is an "alternative" version of + the same information. User agents should recognize that the + content of the various parts are interchangeable. The user + agent should either choose the "best" type based on the + user's environment and preferences, or offer the user the + available alternatives. In general, choosing the best type + means displaying only the LAST part that can be displayed. + This may be used, for example, to send mail in a fancy text + format in such a way that it can easily be displayed + anywhere: + + From: Nathaniel Borenstein <nsb@bellcore.com> + To: Ned Freed <ned@innosoft.com> + Subject: Formatted text mail + MIME-Version: 1.0 + Content-Type: multipart/alternative; boundary=boundary42 + + + --boundary42 + Content-Type: text/plain; charset=us-ascii + + ...plain text version of message goes here.... + + + + + + Borenstein & Freed [Page 34] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + --boundary42 + Content-Type: text/richtext + + .... richtext version of same message goes here ... + --boundary42 + Content-Type: text/x-whatever + + .... fanciest formatted version of same message goes here + ... + --boundary42-- + + In this example, users whose mail system understood the + "text/x-whatever" format would see only the fancy version, + while other users would see only the richtext or plain text + version, depending on the capabilities of their system. + + In general, user agents that compose multipart/alternative + entities should place the body parts in increasing order of + preference, that is, with the preferred format last. For + fancy text, the sending user agent should put the plainest + format first and the richest format last. Receiving user + agents should pick and display the last format they are + capable of displaying. In the case where one of the + alternatives is itself of type "multipart" and contains + unrecognized sub-parts, the user agent may choose either to + show that alternative, an earlier alternative, or both. + + NOTE: From an implementor's perspective, it might seem more + sensible to reverse this ordering, and have the plainest + alternative last. However, placing the plainest alternative + first is the friendliest possible option when + mutlipart/alternative entities are viewed using a non-MIME- + compliant mail reader. While this approach does impose some + burden on compliant mail readers, interoperability with + older mail readers was deemed to be more important in this + case. + + It may be the case that some user agents, if they can + recognize more than one of the formats, will prefer to offer + the user the choice of which format to view. This makes + sense, for example, if mail includes both a nicely-formatted + image version and an easily-edited text version. What is + most critical, however, is that the user not automatically + be shown multiple versions of the same data. Either the + user should be shown the last recognized version or should + explicitly be given the choice. + + + + + + + + + + + + Borenstein & Freed [Page 35] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + 7.2.4 The Multipart/digest subtype + + This document defines a "digest" subtype of the multipart + Content-Type. This type is syntactically identical to + multipart/mixed, but the semantics are different. In + particular, in a digest, the default Content-Type value for + a body part is changed from "text/plain" to + "message/rfc822". This is done to allow a more readable + digest format that is largely compatible (except for the + quoting convention) with RFC 934. + + A digest in this format might, then, look something like + this: + + From: Moderator-Address + MIME-Version: 1.0 + Subject: Internet Digest, volume 42 + Content-Type: multipart/digest; + boundary="---- next message ----" + + + ------ next message ---- + + From: someone-else + Subject: my opinion + + ...body goes here ... + + ------ next message ---- + + From: someone-else-again + Subject: my different opinion + + ... another body goes here... + + ------ next message ------ + + 7.2.5 The Multipart/parallel subtype + + This document defines a "parallel" subtype of the multipart + Content-Type. This type is syntactically identical to + multipart/mixed, but the semantics are different. In + particular, in a parallel entity, all of the parts are + intended to be presented in parallel, i.e., simultaneously, + on hardware and software that are capable of doing so. + Composing agents should be aware that many mail readers will + lack this capability and will show the parts serially in any + event. + + + + + + + + + + Borenstein & Freed [Page 36] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + 7.3 The Message Content-Type + + It is frequently desirable, in sending mail, to encapsulate + another mail message. For this common operation, a special + Content-Type, "message", is defined. The primary subtype, + message/rfc822, has no required parameters in the Content- + Type field. Additional subtypes, "partial" and "External- + body", do have required parameters. These subtypes are + explained below. + + NOTE: It has been suggested that subtypes of message might + be defined for forwarded or rejected messages. However, + forwarded and rejected messages can be handled as multipart + messages in which the first part contains any control or + descriptive information, and a second part, of type + message/rfc822, is the forwarded or rejected message. + Composing rejection and forwarding messages in this manner + will preserve the type information on the original message + and allow it to be correctly presented to the recipient, and + hence is strongly encouraged. + + As stated in the definition of the Content-Transfer-Encoding + field, no encoding other than "7bit", "8bit", or "binary" is + permitted for messages or parts of type "message". The + message header fields are always US-ASCII in any case, and + data within the body can still be encoded, in which case the + Content-Transfer-Encoding header field in the encapsulated + message will reflect this. Non-ASCII text in the headers of + an encapsulated message can be specified using the + mechanisms described in [RFC-1342]. + + Mail gateways, relays, and other mail handling agents are + commonly known to alter the top-level header of an RFC 822 + message. In particular, they frequently add, remove, or + reorder header fields. Such alterations are explicitly + forbidden for the encapsulated headers embedded in the + bodies of messages of type "message." + + 7.3.1 The Message/rfc822 (primary) subtype + + A Content-Type of "message/rfc822" indicates that the body + contains an encapsulated message, with the syntax of an RFC + 822 message. + + 7.3.2 The Message/Partial subtype + + A subtype of message, "partial", is defined in order to + allow large objects to be delivered as several separate + pieces of mail and automatically reassembled by the + receiving user agent. (The concept is similar to IP + fragmentation/reassembly in the basic Internet Protocols.) + This mechanism can be used when intermediate transport + agents limit the size of individual messages that can be + sent. Content-Type "message/partial" thus indicates that + + + + Borenstein & Freed [Page 37] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + the body contains a fragment of a larger message. + + Three parameters must be specified in the Content-Type field + of type message/partial: The first, "id", is a unique + identifier, as close to a world-unique identifier as + possible, to be used to match the parts together. (In + general, the identifier is essentially a message-id; if + placed in double quotes, it can be any message-id, in + accordance with the BNF for "parameter" given earlier in + this specification.) The second, "number", an integer, is + the part number, which indicates where this part fits into + the sequence of fragments. The third, "total", another + integer, is the total number of parts. This third subfield + is required on the final part, and is optional on the + earlier parts. Note also that these parameters may be given + in any order. + + Thus, part 2 of a 3-part message may have either of the + following header fields: + + Content-Type: Message/Partial; + number=2; total=3; + id="oc=jpbe0M2Yt4s@thumper.bellcore.com"; + + Content-Type: Message/Partial; + id="oc=jpbe0M2Yt4s@thumper.bellcore.com"; + number=2 + + But part 3 MUST specify the total number of parts: + + Content-Type: Message/Partial; + number=3; total=3; + id="oc=jpbe0M2Yt4s@thumper.bellcore.com"; + + Note that part numbering begins with 1, not 0. + + When the parts of a message broken up in this manner are put + together, the result is a complete RFC 822 format message, + which may have its own Content-Type header field, and thus + may contain any other data type. + + Message fragmentation and reassembly: The semantics of a + reassembled partial message must be those of the "inner" + message, rather than of a message containing the inner + message. This makes it possible, for example, to send a + large audio message as several partial messages, and still + have it appear to the recipient as a simple audio message + rather than as an encapsulated message containing an audio + message. That is, the encapsulation of the message is + considered to be "transparent". + + When generating and reassembling the parts of a + message/partial message, the headers of the encapsulated + message must be merged with the headers of the enclosing + + + + Borenstein & Freed [Page 38] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + entities. In this process the following rules must be + observed: + + (1) All of the headers from the initial enclosing + entity (part one), except those that start with + "Content-" and "Message-ID", must be copied, in + order, to the new message. + + (2) Only those headers in the enclosed message + which start with "Content-" and "Message-ID" must + be appended, in order, to the headers of the new + message. Any headers in the enclosed message + which do not start with "Content-" (except for + "Message-ID") will be ignored. + + (3) All of the headers from the second and any + subsequent messages will be ignored. + + For example, if an audio message is broken into two parts, + the first part might look something like this: + + X-Weird-Header-1: Foo + From: Bill@host.com + To: joe@otherhost.com + Subject: Audio mail + Message-ID: id1@host.com + MIME-Version: 1.0 + Content-type: message/partial; + id="ABC@host.com"; + number=1; total=2 + + X-Weird-Header-1: Bar + X-Weird-Header-2: Hello + Message-ID: anotherid@foo.com + Content-type: audio/basic + Content-transfer-encoding: base64 + + ... first half of encoded audio data goes here... + + and the second half might look something like this: + + From: Bill@host.com + To: joe@otherhost.com + Subject: Audio mail + MIME-Version: 1.0 + Message-ID: id2@host.com + Content-type: message/partial; + id="ABC@host.com"; number=2; total=2 + + ... second half of encoded audio data goes here... + + Then, when the fragmented message is reassembled, the + resulting message to be displayed to the user should look + something like this: + + + + Borenstein & Freed [Page 39] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + X-Weird-Header-1: Foo + From: Bill@host.com + To: joe@otherhost.com + Subject: Audio mail + Message-ID: anotherid@foo.com + MIME-Version: 1.0 + Content-type: audio/basic + Content-transfer-encoding: base64 + + ... first half of encoded audio data goes here... + ... second half of encoded audio data goes here... + + It should be noted that, because some message transfer + agents may choose to automatically fragment large messages, + and because such agents may use different fragmentation + thresholds, it is possible that the pieces of a partial + message, upon reassembly, may prove themselves to comprise a + partial message. This is explicitly permitted. + + It should also be noted that the inclusion of a "References" + field in the headers of the second and subsequent pieces of + a fragmented message that references the Message-Id on the + previous piece may be of benefit to mail readers that + understand and track references. However, the generation of + such "References" fields is entirely optional. + + 7.3.3 The Message/External-Body subtype + + The external-body subtype indicates that the actual body + data are not included, but merely referenced. In this case, + the parameters describe a mechanism for accessing the + external data. + + When a message body or body part is of type + "message/external-body", it consists of a header, two + consecutive CRLFs, and the message header for the + encapsulated message. If another pair of consecutive CRLFs + appears, this of course ends the message header for the + encapsulated message. However, since the encapsulated + message's body is itself external, it does NOT appear in the + area that follows. For example, consider the following + message: + + Content-type: message/external-body; access- + type=local-file; + name=/u/nsb/Me.gif + + Content-type: image/gif + + THIS IS NOT REALLY THE BODY! + + The area at the end, which might be called the "phantom + body", is ignored for most external-body messages. However, + it may be used to contain auxilliary information for some + + + + Borenstein & Freed [Page 40] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + such messages, as indeed it is when the access-type is + "mail-server". Of the access-types defined by this + document, the phantom body is used only when the access-type + is "mail-server". In all other cases, the phantom body is + ignored. + + The only always-mandatory parameter for message/external- + body is "access-type"; all of the other parameters may be + mandatory or optional depending on the value of access-type. + + ACCESS-TYPE -- One or more case-insensitive words, + comma-separated, indicating supported access + mechanisms by which the file or data may be + obtained. Values include, but are not limited to, + "FTP", "ANON-FTP", "TFTP", "AFS", "LOCAL-FILE", + and "MAIL-SERVER". Future values, except for + experimental values beginning with "X-", must be + registered with IANA, as described in Appendix F . + + In addition, the following two parameters are optional for + ALL access-types: + + EXPIRATION -- The date (in the RFC 822 "date-time" + syntax, as extended by RFC 1123 to permit 4 digits + in the date field) after which the existence of + the external data is not guaranteed. + + SIZE -- The size (in octets) of the data. The + intent of this parameter is to help the recipient + decide whether or not to expend the necessary + resources to retrieve the external data. + + PERMISSION -- A field that indicates whether or + not it is expected that clients might also attempt + to overwrite the data. By default, or if + permission is "read", the assumption is that they + are not, and that if the data is retrieved once, + it is never needed again. If PERMISSION is "read- + write", this assumption is invalid, and any local + copy must be considered no more than a cache. + "Read" and "Read-write" are the only defined + values of permission. + + The precise semantics of the access-types defined here are + described in the sections that follow. + + 7.3.3.1 The "ftp" and "tftp" access-types + + An access-type of FTP or TFTP indicates that the message + body is accessible as a file using the FTP [RFC-959] or TFTP + [RFC-783] protocols, respectively. For these access-types, + the following additional parameters are mandatory: + + + + + + Borenstein & Freed [Page 41] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + NAME -- The name of the file that contains the + actual body data. + + SITE -- A machine from which the file may be + obtained, using the given protocol + + Before the data is retrieved, using these protocols, the + user will generally need to be asked to provide a login id + and a password for the machine named by the site parameter. + + In addition, the following optional parameters may also + appear when the access-type is FTP or ANON-FTP: + + DIRECTORY -- A directory from which the data named + by NAME should be retrieved. + + MODE -- A transfer mode for retrieving the + information, e.g. "image". + + 7.3.3.2 The "anon-ftp" access-type + + The "anon-ftp" access-type is identical to the "ftp" access + type, except that the user need not be asked to provide a + name and password for the specified site. Instead, the ftp + protocol will be used with login "anonymous" and a password + that corresponds to the user's email address. + + 7.3.3.3 The "local-file" and "afs" access-types + + An access-type of "local-file" indicates that the actual + body is accessible as a file on the local machine. An + access-type of "afs" indicates that the file is accessible + via the global AFS file system. In both cases, only a + single parameter is required: + + NAME -- The name of the file that contains the + actual body data. + + The following optional parameter may be used to describe the + locality of reference for the data, that is, the site or + sites at which the file is expected to be visible: + + SITE -- A domain specifier for a machine or set of + machines that are known to have access to the data + file. Asterisks may be used for wildcard matching + to a part of a domain name, such as + "*.bellcore.com", to indicate a set of machines on + which the data should be directly visible, while a + single asterisk may be used to indicate a file + that is expected to be universally available, + e.g., via a global file system. + + 7.3.3.4 The "mail-server" access-type + + + + + Borenstein & Freed [Page 42] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + The "mail-server" access-type indicates that the actual body + is available from a mail server. The mandatory parameter + for this access-type is: + + SERVER -- The email address of the mail server + from which the actual body data can be obtained. + + Because mail servers accept a variety of syntax, some of + which is multiline, the full command to be sent to a mail + server is not included as a parameter on the content-type + line. Instead, it may be provided as the "phantom body" + when the content-type is message/external-body and the + access-type is mail-server. + + Note that MIME does not define a mail server syntax. + Rather, it allows the inclusion of arbitrary mail server + commands in the phantom body. Implementations should + include the phantom body in the body of the message it sends + to the mail server address to retrieve the relevant data. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 43] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + 7.3.3.5 Examples and Further Explanations + + With the emerging possibility of very wide-area file + systems, it becomes very hard to know in advance the set of + machines where a file will and will not be accessible + directly from the file system. Therefore it may make sense + to provide both a file name, to be tried directly, and the + name of one or more sites from which the file is known to be + accessible. An implementation can try to retrieve remote + files using FTP or any other protocol, using anonymous file + retrieval or prompting the user for the necessary name and + password. If an external body is accessible via multiple + mechanisms, the sender may include multiple parts of type + message/external-body within an entity of type + multipart/alternative. + + However, the external-body mechanism is not intended to be + limited to file retrieval, as shown by the mail-server + access-type. Beyond this, one can imagine, for example, + using a video server for external references to video clips. + + If an entity is of type "message/external-body", then the + body of the entity will contain the header fields of the + encapsulated message. The body itself is to be found in the + external location. This means that if the body of the + "message/external-body" message contains two consecutive + CRLFs, everything after those pairs is NOT part of the + message itself. For most message/external-body messages, + this trailing area must simply be ignored. However, it is a + convenient place for additional data that cannot be included + in the content-type header field. In particular, if the + "access-type" value is "mail-server", then the trailing area + must contain commands to be sent to the mail server at the + address given by NAME@SITE, where NAME and SITE are the + values of the NAME and SITE parameters, respectively. + + The embedded message header fields which appear in the body + of the message/external-body data can be used to declare the + Content-type of the external body. Thus a complete + message/external-body message, referring to a document in + PostScript format, might look like this: + + From: Whomever + Subject: whatever + MIME-Version: 1.0 + Message-ID: id1@host.com + Content-Type: multipart/alternative; boundary=42 + + + --42 + Content-Type: message/external-body; + name="BodyFormats.ps"; + + + + + + Borenstein & Freed [Page 44] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + site="thumper.bellcore.com"; + access-type=ANON-FTP; + directory="pub"; + mode="image"; + expiration="Fri, 14 Jun 1991 19:13:14 -0400 (EDT)" + + Content-type: application/postscript + + --42 + Content-Type: message/external-body; + name="/u/nsb/writing/rfcs/RFC-XXXX.ps"; + site="thumper.bellcore.com"; + access-type=AFS + expiration="Fri, 14 Jun 1991 19:13:14 -0400 (EDT)" + + Content-type: application/postscript + + --42 + Content-Type: message/external-body; + access-type=mail-server + server="listserv@bogus.bitnet"; + expiration="Fri, 14 Jun 1991 19:13:14 -0400 (EDT)" + + Content-type: application/postscript + + get rfc-xxxx doc + + --42-- + + Like the message/partial type, the message/external-body + type is intended to be transparent, that is, to convey the + data type in the external body rather than to convey a + message with a body of that type. Thus the headers on the + outer and inner parts must be merged using the same rules as + for message/partial. In particular, this means that the + Content-type header is overridden, but the From and Subject + headers are preserved. + + Note that since the external bodies are not transported as + mail, they need not conform to the 7-bit and line length + requirements, but might in fact be binary files. Thus a + Content-Transfer-Encoding is not generally necessary, though + it is permitted. + + Note that the body of a message of type "message/external- + body" is governed by the basic syntax for an RFC 822 + message. In particular, anything before the first + consecutive pair of CRLFs is header information, while + anything after it is body information, which is ignored for + most access-types. + + + + + + + + Borenstein & Freed [Page 45] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + 7.4 The Application Content-Type + + The "application" Content-Type is to be used for data which + do not fit in any of the other categories, and particularly + for data to be processed by mail-based uses of application + programs. This is information which must be processed by an + application before it is viewable or usable to a user. + Expected uses for Content-Type application include mail- + based file transfer, spreadsheets, data for mail-based + scheduling systems, and languages for "active" + (computational) email. (The latter, in particular, can pose + security problems which should be understood by + implementors, and are considered in detail in the discussion + of the application/PostScript content-type.) + + For example, a meeting scheduler might define a standard + representation for information about proposed meeting dates. + An intelligent user agent would use this information to + conduct a dialog with the user, and might then send further + mail based on that dialog. More generally, there have been + several "active" messaging languages developed in which + programs in a suitably specialized language are sent through + the mail and automatically run in the recipient's + environment. + + Such applications may be defined as subtypes of the + "application" Content-Type. This document defines three + subtypes: octet-stream, ODA, and PostScript. + + In general, the subtype of application will often be the + name of the application for which the data are intended. + This does not mean, however, that any application program + name may be used freely as a subtype of application. Such + usages must be registered with IANA, as described in + Appendix F. + + 7.4.1 The Application/Octet-Stream (primary) subtype + + The primary subtype of application, "octet-stream", may be + used to indicate that a body contains binary data. The set + of possible parameters includes, but is not limited to: + + NAME -- a suggested name for the binary data if + stored as a file. + + TYPE -- the general type or category of binary + data. This is intended as information for the + human recipient rather than for any automatic + processing. + + CONVERSIONS -- the set of operations that have + been performed on the data before putting it in + the mail (and before any Content-Transfer-Encoding + that might have been applied). If multiple + + + + Borenstein & Freed [Page 46] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + conversions have occurred, they must be separated + by commas and specified in the order they were + applied -- that is, the leftmost conversion must + have occurred first, and conversions are undone + from right to left. Note that NO conversion + values are defined by this document. Any + conversion values that that do not begin with "X-" + must be preceded by a published specification and + by registration with IANA, as described in + Appendix F. + + PADDING -- the number of bits of padding that were + appended to the bitstream comprising the actual + contents to produce the enclosed byte-oriented + data. This is useful for enclosing a bitstream in + a body when the total number of bits is not a + multiple of the byte size. + + The values for these attributes are left undefined at + present, but may require specification in the future. An + example of a common (though UNIX-specific) usage might be: + + Content-Type: application/octet-stream; + name=foo.tar.Z; type=tar; + conversions="x-encrypt,x-compress" + + However, it should be noted that the use of such conversions + is explicitly discouraged due to a lack of portability and + standardization. The use of uuencode is particularly + discouraged, in favor of the Content-Transfer-Encoding + mechanism, which is both more standardized and more portable + across mail boundaries. + + The recommended action for an implementation that receives + application/octet-stream mail is to simply offer to put the + data in a file, with any Content-Transfer-Encoding undone, + or perhaps to use it as input to a user-specified process. + + To reduce the danger of transmitting rogue programs through + the mail, it is strongly recommended that implementations + NOT implement a path-search mechanism whereby an arbitrary + program named in the Content-Type parameter (e.g., an + "interpreter=" parameter) is found and executed using the + mail body as input. + + 7.4.2 The Application/PostScript subtype + + A Content-Type of "application/postscript" indicates a + PostScript program. The language is defined in + [POSTSCRIPT]. It is recommended that Postscript as sent + through email should use Postscript document structuring + conventions if at all possible, and correctly. + + + + + + Borenstein & Freed [Page 47] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + The execution of general-purpose PostScript interpreters + entails serious security risks, and implementors are + discouraged from simply sending PostScript email bodies to + "off-the-shelf" interpreters. While it is usually safe to + send PostScript to a printer, where the potential for harm + is greatly constrained, implementors should consider all of + the following before they add interactive display of + PostScript bodies to their mail readers. + + The remainder of this section outlines some, though probably + not all, of the possible problems with sending PostScript + through the mail. + + Dangerous operations in the PostScript language include, but + may not be limited to, the PostScript operators deletefile, + renamefile, filenameforall, and file. File is only + dangerous when applied to something other than standard + input or output. Implementations may also define additional + nonstandard file operators; these may also pose a threat to + security. Filenameforall, the wildcard file search + operator, may appear at first glance to be harmless. Note, + however, that this operator has the potential to reveal + information about what files the recipient has access to, + and this information may itself be sensitive. Message + senders should avoid the use of potentially dangerous file + operators, since these operators are quite likely to be + unavailable in secure PostScript implementations. Message- + receiving and -displaying software should either completely + disable all potentially dangerous file operators or take + special care not to delegate any special authority to their + operation. These operators should be viewed as being done by + an outside agency when interpreting PostScript documents. + Such disabling and/or checking should be done completely + outside of the reach of the PostScript language itself; care + should be taken to insure that no method exists for + reenabling full-function versions of these operators. + + The PostScript language provides facilities for exiting the + normal interpreter, or server, loop. Changes made in this + "outer" environment are customarily retained across + documents, and may in some cases be retained semipermanently + in nonvolatile memory. The operators associated with exiting + the interpreter loop have the potential to interfere with + subsequent document processing. As such, their unrestrained + use constitutes a threat of service denial. PostScript + operators that exit the interpreter loop include, but may + not be limited to, the exitserver and startjob operators. + Message-sending software should not generate PostScript that + depends on exiting the interpreter loop to operate. The + ability to exit will probably be unavailable in secure + PostScript implementations. Message-receiving and + -displaying software should, if possible, disable the + ability to make retained changes to the PostScript + environment. Eliminate the startjob and exitserver commands. + + + + Borenstein & Freed [Page 48] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + If these commands cannot be eliminated, at least set the + password associated with them to a hard-to-guess value. + + PostScript provides operators for setting system-wide and + device-specific parameters. These parameter settings may be + retained across jobs and may potentially pose a threat to + the correct operation of the interpreter. The PostScript + operators that set system and device parameters include, but + may not be limited to, the setsystemparams and setdevparams + operators. Message-sending software should not generate + PostScript that depends on the setting of system or device + parameters to operate correctly. The ability to set these + parameters will probably be unavailable in secure PostScript + implementations. Message-receiving and -displaying software + should, if possible, disable the ability to change system + and device parameters. If these operators cannot be + disabled, at least set the password associated with them to + a hard-to-guess value. + + Some PostScript implementations provide nonstandard + facilities for the direct loading and execution of machine + code. Such facilities are quite obviously open to + substantial abuse. Message-sending software should not + make use of such features. Besides being totally hardware- + specific, they are also likely to be unavailable in secure + implementations of PostScript. Message-receiving and + -displaying software should not allow such operators to be + used if they exist. + + PostScript is an extensible language, and many, if not most, + implementations of it provide a number of their own + extensions. This document does not deal with such extensions + explicitly since they constitute an unknown factor. + Message-sending software should not make use of nonstandard + extensions; they are likely to be missing from some + implementations. Message-receiving and -displaying software + should make sure that any nonstandard PostScript operators + are secure and don't present any kind of threat. + + It is possible to write PostScript that consumes huge + amounts of various system resources. It is also possible to + write PostScript programs that loop infinitely. Both types + of programs have the potential to cause damage if sent to + unsuspecting recipients. Message-sending software should + avoid the construction and dissemination of such programs, + which is antisocial. Message-receiving and -displaying + software should provide appropriate mechanisms to abort + processing of a document after a reasonable amount of time + has elapsed. In addition, PostScript interpreters should be + limited to the consumption of only a reasonable amount of + any given system resource. + + Finally, bugs may exist in some PostScript interpreters + which could possibly be exploited to gain unauthorized + + + + Borenstein & Freed [Page 49] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + access to a recipient's system. Apart from noting this + possibility, there is no specific action to take to prevent + this, apart from the timely correction of such bugs if any + are found. + + 7.4.3 The Application/ODA subtype + + The "ODA" subtype of application is used to indicate that a + body contains information encoded according to the Office + Document Architecture [ODA] standards, using the ODIF + representation format. For application/oda, the Content- + Type line should also specify an attribute/value pair that + indicates the document application profile (DAP), using the + key word "profile". Thus an appropriate header field might + look like this: + + Content-Type: application/oda; profile=Q112 + + Consult the ODA standard [ODA] for further information. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 50] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + 7.5 The Image Content-Type + + A Content-Type of "image" indicates that the bodycontains an + image. The subtype names the specific image format. These + names are case insensitive. Two initial subtypes are "jpeg" + for the JPEG format, JFIF encoding, and "gif" for GIF format + [GIF]. + + The list of image subtypes given here is neither exclusive + nor exhaustive, and is expected to grow as more types are + registered with IANA, as described in Appendix F. + + 7.6 The Audio Content-Type + + A Content-Type of "audio" indicates that the body contains + audio data. Although there is not yet a consensus on an + "ideal" audio format for use with computers, there is a + pressing need for a format capable of providing + interoperable behavior. + + The initial subtype of "basic" is specified to meet this + requirement by providing an absolutely minimal lowest common + denominator audio format. It is expected that richer + formats for higher quality and/or lower bandwidth audio will + be defined by a later document. + + The content of the "audio/basic" subtype is audio encoded + using 8-bit ISDN u-law [PCM]. When this subtype is present, + a sample rate of 8000 Hz and a single channel is assumed. + + 7.7 The Video Content-Type + + A Content-Type of "video" indicates that the body contains a + time-varying-picture image, possibly with color and + coordinated sound. The term "video" is used extremely + generically, rather than with reference to any particular + technology or format, and is not meant to preclude subtypes + such as animated drawings encoded compactly. The subtype + "mpeg" refers to video coded according to the MPEG standard + [MPEG]. + + Note that although in general this document strongly + discourages the mixing of multiple media in a single body, + it is recognized that many so-called "video" formats include + a representation for synchronized audio, and this is + explicitly permitted for subtypes of "video". + + 7.8 Experimental Content-Type Values + + A Content-Type value beginning with the characters "X-" is a + private value, to be used by consenting mail systems by + mutual agreement. Any format without a rigorous and public + definition must be named with an "X-" prefix, and publicly + specified values shall never begin with "X-". (Older + + + + Borenstein & Freed [Page 51] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + versions of the widely-used Andrew system use the "X-BE2" + name, so new systems should probably choose a different + name.) + + In general, the use of "X-" top-level types is strongly + discouraged. Implementors should invent subtypes of the + existing types whenever possible. The invention of new + types is intended to be restricted primarily to the + development of new media types for email, such as digital + odors or holography, and not for new data formats in + general. In many cases, a subtype of application will be + more appropriate than a new top-level type. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 52] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Summary + + Using the MIME-Version, Content-Type, and Content-Transfer- + Encoding header fields, it is possible to include, in a + standardized way, arbitrary types of data objects with RFC + 822 conformant mail messages. No restrictions imposed by + either RFC 821 or RFC 822 are violated, and care has been + taken to avoid problems caused by additional restrictions + imposed by the characteristics of some Internet mail + transport mechanisms (see Appendix B). The "multipart" and + "message" Content-Types allow mixing and hierarchical + structuring of objects of different types in a single + message. Further Content-Types provide a standardized + mechanism for tagging messages or body parts as audio, + image, or several other kinds of data. A distinguished + parameter syntax allows further specification of data format + details, particularly the specification of alternate + character sets. Additional optional header fields provide + mechanisms for certain extensions deemed desirable by many + implementors. Finally, a number of useful Content-Types are + defined for general use by consenting user agents, notably + text/richtext, message/partial, and message/external-body. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 53] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Acknowledgements + + This document is the result of the collective effort of a + large number of people, at several IETF meetings, on the + IETF-SMTP and IETF-822 mailing lists, and elsewhere. + Although any enumeration seems doomed to suffer from + egregious omissions, the following are among the many + contributors to this effort: + + Harald Tveit Alvestrand Timo Lehtinen + Randall Atkinson John R. MacMillan + Philippe Brandon Rick McGowan + Kevin Carosso Leo Mclaughlin + Uhhyung Choi Goli Montaser-Kohsari + Cristian Constantinof Keith Moore + Mark Crispin Tom Moore + Dave Crocker Erik Naggum + Terry Crowley Mark Needleman + Walt Daniels John Noerenberg + Frank Dawson Mats Ohrman + Hitoshi Doi Julian Onions + Kevin Donnelly Michael Patton + Keith Edwards David J. Pepper + Chris Eich Blake C. Ramsdell + Johnny Eriksson Luc Rooijakkers + Craig Everhart Marshall T. Rose + Patrik Faeltstroem Jonathan Rosenberg + Erik E. Fair Jan Rynning + Roger Fajman Harri Salminen + Alain Fontaine Michael Sanderson + James M. Galvin Masahiro Sekiguchi + Philip Gladstone Mark Sherman + Thomas Gordon Keld Simonsen + Phill Gross Bob Smart + James Hamilton Peter Speck + Steve Hardcastle-Kille Henry Spencer + David Herron Einar Stefferud + Bruce Howard Michael Stein + Bill Janssen Klaus Steinberger + Olle Jaernefors Peter Svanberg + Risto Kankkunen James Thompson + Phil Karn Steve Uhler + Alan Katz Stuart Vance + Tim Kehres Erik van der Poel + Neil Katin Guido van Rossum + Kyuho Kim Peter Vanderbilt + Anders Klemets Greg Vaudreuil + John Klensin Ed Vielmetti + Valdis Kletniek Ryan Waldron + Jim Knowles Wally Wedel + Stev Knowles Sven-Ove Westberg + Bob Kummerfeld Brian Wideen + + + + + + Borenstein & Freed [Page 54] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Pekka Kytolaakso John Wobus + Stellan Lagerstr.m Glenn Wright + Vincent Lau Rayan Zachariassen + Donald Lindsay David Zimmerman + The authors apologize for any omissions from this list, + which are certainly unintentional. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 55] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Appendix A -- Minimal MIME-Conformance + + The mechanisms described in this document are open-ended. + It is definitely not expected that all implementations will + support all of the Content-Types described, nor that they + will all share the same extensions. In order to promote + interoperability, however, it is useful to define the + concept of "MIME-conformance" to define a certain level of + implementation that allows the useful interworking of + messages with content that differs from US ASCII text. In + this section, we specify the requirements for such + conformance. + + A mail user agent that is MIME-conformant MUST: + + 1. Always generate a "MIME-Version: 1.0" header + field. + + 2. Recognize the Content-Transfer-Encoding header + field, and decode all received data encoded with + either the quoted-printable or base64 + implementations. Encode any data sent that is + not in seven-bit mail-ready representation using + one of these transformations and include the + appropriate Content-Transfer-Encoding header + field, unless the underlying transport mechanism + supports non-seven-bit data, as SMTP does not. + + 3. Recognize and interpret the Content-Type + header field, and avoid showing users raw data + with a Content-Type field other than text. Be + able to send at least text/plain messages, with + the character set specified as a parameter if it + is not US-ASCII. + + 4. Explicitly handle the following Content-Type + values, to at least the following extents: + + Text: + -- Recognize and display "text" mail + with the character set "US-ASCII." + -- Recognize other character sets at + least to the extent of being able + to inform the user about what + character set the message uses. + -- Recognize the "ISO-8859-*" character + sets to the extent of being able to + display those characters that are + common to ISO-8859-* and US-ASCII, + namely all characters represented + by octet values 0-127. + -- For unrecognized subtypes, show or + offer to show the user the "raw" + version of the data. An ability at + + + + Borenstein & Freed [Page 56] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + least to convert "text/richtext" to + plain text, as shown in Appendix D, + is encouraged, but not required for + conformance. + Message: + --Recognize and display at least the + primary (822) encapsulation. + Multipart: + -- Recognize the primary (mixed) + subtype. Display all relevant + information on the message level + and the body part header level and + then display or offer to display + each of the body parts + individually. + -- Recognize the "alternative" subtype, + and avoid showing the user + redundant parts of + multipart/alternative mail. + -- Treat any unrecognized subtypes as if + they were "mixed". + Application: + -- Offer the ability to remove either of + the two types of Content-Transfer- + Encoding defined in this document + and put the resulting information + in a user file. + + 5. Upon encountering any unrecognized Content- + Type, an implementation must treat it as if it had + a Content-Type of "application/octet-stream" with + no parameter sub-arguments. How such data are + handled is up to an implementation, but likely + options for handling such unrecognized data + include offering the user to write it into a file + (decoded from its mail transport format) or + offering the user to name a program to which the + decoded data should be passed as input. + Unrecognized predefined types, which in a MIME- + conformant mailer might still include audio, + image, or video, should also be treated in this + way. + + A user agent that meets the above conditions is said to be + MIME-conformant. The meaning of this phrase is that it is + assumed to be "safe" to send virtually any kind of + properly-marked data to users of such mail systems, because + such systems will at least be able to treat the data as + undifferentiated binary, and will not simply splash it onto + the screen of unsuspecting users. There is another sense + in which it is always "safe" to send data in a format that + is MIME-conformant, which is that such data will not break + or be broken by any known systems that are conformant with + RFC 821 and RFC 822. User agents that are MIME-conformant + + + + Borenstein & Freed [Page 57] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + have the additional guarantee that the user will not be + shown data that were never intended to be viewed as text. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 58] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Appendix B -- General Guidelines For Sending Email Data + + Internet email is not a perfect, homogeneous system. Mail + may become corrupted at several stages in its travel to a + final destination. Specifically, email sent throughout the + Internet may travel across many networking technologies. + Many networking and mail technologies do not support the + full functionality possible in the SMTP transport + environment. Mail traversing these systems is likely to be + modified in such a way that it can be transported. + + There exist many widely-deployed non-conformant MTAs in the + Internet. These MTAs, speaking the SMTP protocol, alter + messages on the fly to take advantage of the internal data + structure of the hosts they are implemented on, or are just + plain broken. + + The following guidelines may be useful to anyone devising a + data format (Content-Type) that will survive the widest + range of networking technologies and known broken MTAs + unscathed. Note that anything encoded in the base64 + encoding will satisfy these rules, but that some well-known + mechanisms, notably the UNIX uuencode facility, will not. + Note also that anything encoded in the Quoted-Printable + encoding will survive most gateways intact, but possibly not + some gateways to systems that use the EBCDIC character set. + + (1) Under some circumstances the encoding used for + data may change as part of normal gateway or user + agent operation. In particular, conversion from + base64 to quoted-printable and vice versa may be + necessary. This may result in the confusion of + CRLF sequences with line breaks in text body + parts. As such, the persistence of CRLF as + something other than a line break should not be + relied on. + + (2) Many systems may elect to represent and store + text data using local newline conventions. Local + newline conventions may not match the RFC822 CRLF + convention -- systems are known that use plain CR, + plain LF, CRLF, or counted records. The result is + that isolated CR and LF characters are not well + tolerated in general; they may be lost or + converted to delimiters on some systems, and hence + should not be relied on. + + (3) TAB (HT) characters may be misinterpreted or + may be automatically converted to variable numbers + of spaces. This is unavoidable in some + environments, notably those not based on the ASCII + character set. Such conversion is STRONGLY + DISCOURAGED, but it may occur, and mail formats + should not rely on the persistence of TAB (HT) + + + + Borenstein & Freed [Page 59] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + characters. + + (4) Lines longer than 76 characters may be wrapped + or truncated in some environments. Line wrapping + and line truncation are STRONGLY DISCOURAGED, but + unavoidable in some cases. Applications which + require long lines should somehow differentiate + between soft and hard line breaks. (A simple way + to do this is to use the quoted-printable + encoding.) + + (5) Trailing "white space" characters (SPACE, TAB + (HT)) on a line may be discarded by some transport + agents, while other transport agents may pad lines + with these characters so that all lines in a mail + file are of equal length. The persistence of + trailing white space, therefore, should not be + relied on. + + (6) Many mail domains use variations on the ASCII + character set, or use character sets such as + EBCDIC which contain most but not all of the US- + ASCII characters. The correct translation of + characters not in the "invariant" set cannot be + depended on across character converting gateways. + For example, this situation is a problem when + sending uuencoded information across BITNET, an + EBCDIC system. Similar problems can occur without + crossing a gateway, since many Internet hosts use + character sets other than ASCII internally. The + definition of Printable Strings in X.400 adds + further restrictions in certain special cases. In + particular, the only characters that are known to + be consistent across all gateways are the 73 + characters that correspond to the upper and lower + case letters A-Z and a-z, the 10 digits 0-9, and + the following eleven special characters: + + "'" (ASCII code 39) + "(" (ASCII code 40) + ")" (ASCII code 41) + "+" (ASCII code 43) + "," (ASCII code 44) + "-" (ASCII code 45) + "." (ASCII code 46) + "/" (ASCII code 47) + ":" (ASCII code 58) + "=" (ASCII code 61) + "?" (ASCII code 63) + + A maximally portable mail representation, such as + the base64 encoding, will confine itself to + relatively short lines of text in which the only + meaningful characters are taken from this set of + + + + Borenstein & Freed [Page 60] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + 73 characters. + + Please note that the above list is NOT a list of recommended + practices for MTAs. RFC 821 MTAs are prohibited from + altering the character of white space or wrapping long + lines. These BAD and illegal practices are known to occur + on established networks, and implementions should be robust + in dealing with the bad effects they can cause. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 61] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Appendix C -- A Complex Multipart Example + + What follows is the outline of a complex multipart message. + This message has five parts to be displayed serially: two + introductory plain text parts, an embedded multipart + message, a richtext part, and a closing encapsulated text + message in a non-ASCII character set. The embedded + multipart message has two parts to be displayed in parallel, + a picture and an audio fragment. + + MIME-Version: 1.0 + From: Nathaniel Borenstein <nsb@bellcore.com> + Subject: A multipart example + Content-Type: multipart/mixed; + boundary=unique-boundary-1 + + This is the preamble area of a multipart message. + Mail readers that understand multipart format + should ignore this preamble. + If you are reading this text, you might want to + consider changing to a mail reader that understands + how to properly display multipart messages. + --unique-boundary-1 + + ...Some text appears here... + [Note that the preceding blank line means + no header fields were given and this is text, + with charset US ASCII. It could have been + done with explicit typing as in the next part.] + + --unique-boundary-1 + Content-type: text/plain; charset=US-ASCII + + This could have been part of the previous part, + but illustrates explicit versus implicit + typing of body parts. + + --unique-boundary-1 + Content-Type: multipart/parallel; + boundary=unique-boundary-2 + + + --unique-boundary-2 + Content-Type: audio/basic + Content-Transfer-Encoding: base64 + + ... base64-encoded 8000 Hz single-channel + u-law-format audio data goes here.... + + --unique-boundary-2 + Content-Type: image/gif + Content-Transfer-Encoding: Base64 + + + + + + Borenstein & Freed [Page 62] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + ... base64-encoded image data goes here.... + + --unique-boundary-2-- + + --unique-boundary-1 + Content-type: text/richtext + + This is <bold><italic>richtext.</italic></bold> + <nl><nl>Isn't it + <bigger><bigger>cool?</bigger></bigger> + + --unique-boundary-1 + Content-Type: message/rfc822 + + From: (name in US-ASCII) + Subject: (subject in US-ASCII) + Content-Type: Text/plain; charset=ISO-8859-1 + Content-Transfer-Encoding: Quoted-printable + + ... Additional text in ISO-8859-1 goes here ... + + --unique-boundary-1-- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 63] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Appendix D -- A Simple Richtext-to-Text Translator in C + + One of the major goals in the design of the richtext subtype + of the text Content-Type is to make formatted text so simple + that even text-only mailers will implement richtext-to- + plain-text translators, thus increasing the likelihood that + multifont text will become "safe" to use very widely. To + demonstrate this simplicity, what follows is an extremely + simple 44-line C program that converts richtext input into + plain text output: + + #include <stdio.h> + #include <ctype.h> + main() { + int c, i; + char token[50]; + + while((c = getc(stdin)) != EOF) { + if (c == '<') { + for (i=0; (i<49 && (c = getc(stdin)) != '>' + && c != EOF); ++i) { + token[i] = isupper(c) ? tolower(c) : c; + } + if (c == EOF) break; + if (c != '>') while ((c = getc(stdin)) != + '>' + && c != EOF) {;} + if (c == EOF) break; + token[i] = '\0'; + if (!strcmp(token, "lt")) { + putc('<', stdout); + } else if (!strcmp(token, "nl")) { + putc('\n', stdout); + } else if (!strcmp(token, "/paragraph")) { + fputs("\n\n", stdout); + } else if (!strcmp(token, "comment")) { + int commct=1; + while (commct > 0) { + while ((c = getc(stdin)) != '<' + && c != EOF) ; + if (c == EOF) break; + for (i=0; (c = getc(stdin)) != '>' + && c != EOF; ++i) { + token[i] = isupper(c) ? + tolower(c) : c; + } + if (c== EOF) break; + token[i] = NULL; + if (!strcmp(token, "/comment")) -- + commct; + if (!strcmp(token, "comment")) + ++commct; + + + + + + Borenstein & Freed [Page 64] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + } + } /* Ignore all other tokens */ + } else if (c != '\n') putc(c, stdout); + } + putc('\n', stdout); /* for good measure */ + } + It should be noted that one can do considerably better than + this in displaying richtext data on a dumb terminal. In + particular, one can replace font information such as "bold" + with textual emphasis (like *this* or _T_H_I_S_). One can + also properly handle the richtext formatting commands + regarding indentation, justification, and others. However, + the above program is all that is necessary in order to + present richtext on a dumb terminal. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 65] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Appendix E -- Collected Grammar + + This appendix contains the complete BNF grammar for all the + syntax specified by this document. + + By itself, however, this grammar is incomplete. It refers + to several entities that are defined by RFC 822. Rather + than reproduce those definitions here, and risk + unintentional differences between the two, this document + simply refers the reader to RFC 822 for the remaining + definitions. Wherever a term is undefined, it refers to the + RFC 822 definition. + + attribute := token + + body-part = <"message" as defined in RFC 822, + with all header fields optional, and with the + specified delimiter not occurring anywhere in + the message body, either on a line by itself + or as a substring anywhere.> + + boundary := 0*69<bchars> bcharsnospace + + bchars := bcharsnospace / " " + + bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" / "+" / + "_" + / "," / "-" / "." / "/" / ":" / "=" / "?" + + close-delimiter := delimiter "--" + + Content-Description := *text + + Content-ID := msg-id + + Content-Transfer-Encoding := "BASE64" / "QUOTED- + PRINTABLE" / + "8BIT" / "7BIT" / + "BINARY" / x-token + + Content-Type := type "/" subtype *[";" parameter] + + delimiter := CRLF "--" boundary ; taken from Content-Type + field. + ; when content-type is + multipart + ; There should be no space + ; between "--" and boundary. + + encapsulation := delimiter CRLF body-part + + epilogue := *text ; to be ignored upon + receipt. + + + + + Borenstein & Freed [Page 66] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + MIME-Version := 1*text + + multipart-body := preamble 1*encapsulation close-delimiter + epilogue + + parameter := attribute "=" value + + preamble := *text ; to be ignored upon + receipt. + + subtype := token + + token := 1*<any CHAR except SPACE, CTLs, or tspecials> + + tspecials := "(" / ")" / "<" / ">" / "@" ; Must be in + / "," / ";" / ":" / "\" / <"> ; quoted-string, + / "/" / "[" / "]" / "?" / "." ; to use within + / "=" ; parameter values + + + type := "application" / "audio" ; case- + insensitive + / "image" / "message" + / "multipart" / "text" + / "video" / x-token + + value := token / quoted-string + + x-token := <The two characters "X-" followed, with no + intervening white space, by any token> + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 67] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Appendix F -- IANA Registration Procedures + + MIME has been carefully designed to have extensible + mechanisms, and it is expected that the set of content- + type/subtype pairs and their associated parameters will grow + significantly with time. Several other MIME fields, notably + character set names, access-type parameters for the + message/external-body type, conversions parameters for the + application type, and possibly even Content-Transfer- + Encoding values, are likely to have new values defined over + time. In order to ensure that the set of such values is + developed in an orderly, well-specified, and public manner, + MIME defines a registration process which uses the Internet + Assigned Numbers Authority (IANA) as a central registry for + such values. + + In general, parameters in the content-type header field are + used to convey supplemental information for various content + types, and their use is defined when the content-type and + subtype are defined. New parameters should not be defined + as a way to introduce new functionality. + + In order to simplify and standardize the registration + process, this appendix gives templates for the registration + of new values with IANA. Each of these is given in the form + of an email message template, to be filled in by the + registering party. + + F.1 Registration of New Content-type/subtype Values + + Note that MIME is generally expected to be extended by + subtypes. If a new fundamental top-level type is needed, + its specification should be published as an RFC or + submitted in a form suitable to become an RFC, and be + subject to the Internet standards process. + + To: IANA@isi.edu + Subject: Registration of new MIME content-type/subtype + + MIME type name: + + (If the above is not an existing top-level MIME type, + please explain why an existing type cannot be used.) + + MIME subtype name: + + Required parameters: + + Optional parameters: + + Encoding considerations: + + Security considerations: + + + + + Borenstein & Freed [Page 68] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Published specification: + + (The published specification must be an Internet RFC or + RFC-to-be if a new top-level type is being defined, and + must be a publicly available specification in any + case.) + + Person & email address to contact for further + information: + F.2 Registration of New Character Set Values + + To: IANA@isi.edu + Subject: Registration of new MIME character set value + + MIME character set name: + + Published specification: + + (The published specification must be an Internet RFC or + RFC-to-be or an international standard.) + + Person & email address to contact for further + information: + + F.3 Registration of New Access-type Values for + Message/external-body + + To: IANA@isi.edu + Subject: Registration of new MIME Access-type for + Message/external-body content-type + + MIME access-type name: + + Required parameters: + + Optional parameters: + + Published specification: + + (The published specification must be an Internet RFC or + RFC-to-be.) + + Person & email address to contact for further + information: + + + F.4 Registration of New Conversions Values for Application + + To: IANA@isi.edu + Subject: Registration of new MIME Conversions value + for Application content-type + + MIME Conversions name: + + + + + Borenstein & Freed [Page 69] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Published specification: + + (The published specification must be an Internet RFC or + RFC-to-be.) + + Person & email address to contact for further + information: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 70] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Appendix G -- Summary of the Seven Content-types + + Content-type: text + + Subtypes defined by this document: plain, richtext + + Important Parameters: charset + + Encoding notes: quoted-printable generally preferred if an + encoding is needed and the character set is mostly an + ASCII superset. + + Security considerations: Rich text formats such as TeX and + Troff often contain mechanisms for executing arbitrary + commands or file system operations, and should not be + used automatically unless these security problems have + been addressed. Even plain text may contain control + characters that can be used to exploit the capabilities + of "intelligent" terminals and cause security + violations. User interfaces designed to run on such + terminals should be aware of and try to prevent such + problems. + ________________________________________________________________ + + Content-type: multipart + + Subtypes defined by this document: mixed, alternative, + digest, parallel. + + Important Parameters: boundary + + Encoding notes: No content-transfer-encoding is permitted. + + ________________________________________________________________ + + Content-type: message + + Subtypes defined by this document: rfc822, partial, + external-body + + Important Parameters: id, number, total + + Encoding notes: No content-transfer-encoding is permitted. + + ________________________________________________________________ + + Content-type: application + + Subtypes defined by this document: octet-stream, + postscript, oda + + Important Parameters: profile + + + + + + Borenstein & Freed [Page 71] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Encoding notes: base64 generally preferred for octet-stream + or other unreadable subtypes. + + Security considerations: This type is intended for the + transmission of data to be interpreted by locally-installed + programs. If used, for example, to transmit executable + binary programs or programs in general-purpose interpreted + languages, such as LISP programs or shell scripts, severe + security problems could result. In general, authors of + mail-reading agents are cautioned against giving their + systems the power to execute mail-based application data + without carefully considering the security implications. + While it is certainly possible to define safe application + formats and even safe interpreters for unsafe formats, each + interpreter should be evaluated separately for possible + security problems. + ________________________________________________________________ + + Content-type: image + + Subtypes defined by this document: jpeg, gif + + Important Parameters: none + + Encoding notes: base64 generally preferred + + ________________________________________________________________ + + Content-type: audio + + Subtypes defined by this document: basic + + Important Parameters: none + + Encoding notes: base64 generally preferred + + ________________________________________________________________ + + Content-type: video + + Subtypes defined by this document: mpeg + + Important Parameters: none + + Encoding notes: base64 generally preferred + + + + + + + + + + + + + Borenstein & Freed [Page 72] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Appendix H -- Canonical Encoding Model + + + + There was some confusion, in earlier drafts of this memo, + regarding the model for when email data was to be converted + to canonical form and encoded, and in particular how this + process would affect the treatment of CRLFs, given that the + representation of newlines varies greatly from system to + system. For this reason, a canonical model for encoding is + presented below. + + The process of composing a MIME message part can be modelled + as being done in a number of steps. Note that these steps + are roughly similar to those steps used in RFC1113: + + Step 1. Creation of local form. + + The body part to be transmitted is created in the system's + native format. The native character set is used, and where + appropriate local end of line conventions are used as well. + The may be a UNIX-style text file, or a Sun raster image, or + a VMS indexed file, or audio data in a system-dependent + format stored only in memory, or anything else that + corresponds to the local model for the representation of + some form of information. + + Step 2. Conversion to canonical form. + + The entire body part, including "out-of-band" information + such as record lengths and possibly file attribute + information, is converted to a universal canonical form. + The specific content type of the body part as well as its + associated attributes dictate the nature of the canonical + form that is used. Conversion to the proper canonical form + may involve character set conversion, transformation of + audio data, compression, or various other operations + specific to the various content types. + + For example, in the case of text/plain data, the text must + be converted to a supported character set and lines must be + delimited with CRLF delimiters in accordance with RFC822. + Note that the restriction on line lengths implied by RFC822 + is eliminated if the next step employs either quoted- + printable or base64 encoding. + + Step 3. Apply transfer encoding. + + A Content-Transfer-Encoding appropriate for this body part + is applied. Note that there is no fixed relationship + between the content type and the transfer encoding. In + particular, it may be appropriate to base the choice of + base64 or quoted-printable on character frequency counts + which are specific to a given instance of body part. + + + + Borenstein & Freed [Page 73] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Step 4. Insertion into message. + + The encoded object is inserted into a MIME message with + appropriate body part headers and boundary markers. + + It is vital to note that these steps are only a model; they + are specifically NOT a blueprint for how an actual system + would be built. In particular, the model fails to account + for two common designs: + + 1. In many cases the conversion to a canonical + form prior to encoding will be subsumed into the + encoder itself, which understands local formats + directly. For example, the local newline + convention for text bodyparts might be carried + through to the encoder itself along with knowledge + of what that format is. + + 2. The output of the encoders may have to pass + through one or more additional steps prior to + being transmitted as a message. As such, the + output of the encoder may not be compliant with + the formats specified by RFC822. In particular, + once again it may be appropriate for the + converter's output to be expressed using local + newline conventions rather than using the standard + RFC822 CRLF delimiters. + + Other implementation variations are conceivable as well. + The only important aspect of this discussion is that the + resulting messages are consistent with those produced by the + model described here. + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 74] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + References + + [US-ASCII] Coded Character Set--7-Bit American Standard Code + for Information Interchange, ANSI X3.4-1986. + + [ATK] Borenstein, Nathaniel S., Multimedia Applications + Development with the Andrew Toolkit, Prentice-Hall, 1990. + + [GIF] Graphics Interchange Format (Version 89a), Compuserve, + Inc., Columbus, Ohio, 1990. + + [ISO-2022] International Standard--Information Processing-- + ISO 7-bit and 8-bit coded character sets--Code extension + techniques, ISO 2022:1986. + + [ISO-8859] Information Processing -- 8-bit Single-Byte Coded + Graphic Character Sets -- Part 1: Latin Alphabet No. 1, ISO + 8859-1:1987. Part 2: Latin alphabet No. 2, ISO 8859-2, + 1987. Part 3: Latin alphabet No. 3, ISO 8859-3, 1988. Part + 4: Latin alphabet No. 4, ISO 8859-4, 1988. Part 5: + Latin/Cyrillic alphabet, ISO 8859-5, 1988. Part 6: + Latin/Arabic alphabet, ISO 8859-6, 1987. Part 7: + Latin/Greek alphabet, ISO 8859-7, 1987. Part 8: + Latin/Hebrew alphabet, ISO 8859-8, 1988. Part 9: Latin + alphabet No. 5, ISO 8859-9, 1990. + + [ISO-646] International Standard--Information Processing-- + ISO 7-bit coded character set for information interchange, + ISO 646:1983. + + [MPEG] Video Coding Draft Standard ISO 11172 CD, ISO + IEC/TJC1/SC2/WG11 (Motion Picture Experts Group), May, 1991. + + [ODA] ISO 8613; Information Processing: Text and Office + System; Office Document Architecture (ODA) and Interchange + Format (ODIF), Part 1-8, 1989. + + [PCM] CCITT, Fascicle III.4 - Recommendation G.711, Geneva, + 1972, "Pulse Code Modulation (PCM) of Voice Frequencies". + + [POSTSCRIPT] Adobe Systems, Inc., PostScript Language + Reference Manual, Addison-Wesley, 1985. + + [X400] Schicker, Pietro, "Message Handling Systems, X.400", + Message Handling Systems and Distributed Applications, E. + Stefferud, O-j. Jacobsen, and P. Schicker, eds., North- + Holland, 1989, pp. 3-41. + + [RFC-783] Sollins, K.R. TFTP Protocol (revision 2). June, + 1981, MIT, RFC-783. + + [RFC-821] Postel, J.B. Simple Mail Transfer Protocol. + August, 1982, USC/Information Sciences Institute, RFC-821. + + + + + Borenstein & Freed [Page 75] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + [RFC-822] Crocker, D. Standard for the format of ARPA + Internet text messages. August, 1982, UDEL, RFC-822. + + [RFC-934] Rose, M.T.; Stefferud, E.A. Proposed standard + for message encapsulation. January, 1985, Delaware + and NMA, RFC-934. + + [RFC-959] Postel, J.B.; Reynolds, J.K. File Transfer + Protocol. October, 1985, USC/Information Sciences + Institute, RFC-959. + + [RFC-1049] Sirbu, M.A. Content-Type header field for + Internet messages. March, 1988, CMU, RFC-1049. + + [RFC-1113] Linn, J. Privacy enhancement for Internet + electronic mail: Part I - message encipherment and + authentication procedures. August, 1989, IAB Privacy Task + Force, RFC-1113. + + [RFC-1154] Robinson, D.; Ullmann, R. Encoding header field + for Internet messages. April, 1990, Prime Computer, + Inc., RFC-1154. + + [RFC-1342] Moore, Keith, Representation of Non-Ascii Text in + Internet Message Headers. June, 1992, University of + Tennessee, RFC-1342. + + Security Considerations + + Security issues are discussed in Section 7.4.2 and in + Appendix G. Implementors should pay special attention to + the security implications of any mail content-types that can + cause the remote execution of any actions in the recipient's + environment. In such cases, the discussion of the + applicaton/postscript content-type in Section 7.4.2 may + serve as a model for considering other content-types with + remote execution capabilities. + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 76] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + Authors' Addresses + + For more information, the authors of this document may be + contacted via Internet mail: + + Nathaniel S. Borenstein + MRE 2D-296, Bellcore + 445 South St. + Morristown, NJ 07962-1910 + + Phone: +1 201 829 4270 + Fax: +1 201 829 7019 + Email: nsb@bellcore.com + + + Ned Freed + Innosoft International, Inc. + 250 West First Street + Suite 240 + Claremont, CA 91711 + + Phone: +1 714 624 7907 + Fax: +1 714 621 5319 + Email: ned@innosoft.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page 77] + + + + + RFC 1341MIME: Multipurpose Internet Mail ExtensionsJune 1992 + + + + + + THIS PAGE INTENTIONALLY LEFT BLANK. + + Please discard this page and place the following table of + contents after the title page. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page i] + + + + + + + + + Table of Contents + + + 1 Introduction....................................... 1 + 2 Notations, Conventions, and Generic BNF Grammar.... 3 + 3 The MIME-Version Header Field...................... 5 + 4 The Content-Type Header Field...................... 6 + 5 The Content-Transfer-Encoding Header Field......... 10 + 5.1 Quoted-Printable Content-Transfer-Encoding......... 14 + 5.2 Base64 Content-Transfer-Encoding................... 17 + 6 Additional Optional Content- Header Fields......... 19 + 6.1 Optional Content-ID Header Field................... 19 + 6.2 Optional Content-Description Header Field.......... 19 + 7 The Predefined Content-Type Values................. 20 + 7.1 The Text Content-Type.............................. 20 + 7.1.1 The charset parameter.............................. 20 + 7.1.2 The Text/plain subtype............................. 23 + 7.1.3 The Text/richtext subtype.......................... 23 + 7.2 The Multipart Content-Type......................... 29 + 7.2.1 Multipart: The common syntax...................... 30 + 7.2.2 The Multipart/mixed (primary) subtype.............. 34 + 7.2.3 The Multipart/alternative subtype.................. 34 + 7.2.4 The Multipart/digest subtype....................... 36 + 7.2.5 The Multipart/parallel subtype..................... 36 + 7.3 The Message Content-Type........................... 37 + 7.3.1 The Message/rfc822 (primary) subtype............... 37 + 7.3.2 The Message/Partial subtype........................ 37 + 7.3.3 The Message/External-Body subtype.................. 40 + 7.4 The Application Content-Type....................... 46 + 7.4.1 The Application/Octet-Stream (primary) subtype..... 46 + 7.4.2 The Application/PostScript subtype................. 47 + 7.4.3 The Application/ODA subtype........................ 50 + 7.5 The Image Content-Type............................. 51 + 7.6 The Audio Content-Type............................. 51 + 7.7 The Video Content-Type............................. 51 + 7.8 Experimental Content-Type Values................... 51 + Summary............................................ 53 + Acknowledgements................................... 54 + Appendix A -- Minimal MIME-Conformance............. 56 + Appendix B -- General Guidelines For Sending Email Data59 + Appendix C -- A Complex Multipart Example.......... 62 + Appendix D -- A Simple Richtext-to-Text Translator in C64 + Appendix E -- Collected Grammar.................... 66 + Appendix F -- IANA Registration Procedures......... 68 + F.1 Registration of New Content-type/subtype Values..68 + F.2 Registration of New Character Set Values...... 69 + F.3 Registration of New Access-type Values for Message/external-body69 + F.4 Registration of New Conversions Values for Application69 + Appendix G -- Summary of the Seven Content-types... 71 + Appendix H -- Canonical Encoding Model............. 73 + References......................................... 75 + Security Considerations............................ 76 + Authors' Addresses................................. 77 + + + + Borenstein & Freed [Page ii] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Borenstein & Freed [Page iii] + diff --git a/doc/rfc1731.txt b/doc/rfc1731.txt @@ -0,0 +1,339 @@ + + + + + + +Network Working Group J. Myers +Request for Comments: 1731 Carnegie Mellon +Category: Standards Track December 1994 + + + IMAP4 Authentication Mechanisms + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + + +1. Introduction + + The Internet Message Access Protocol, Version 4 [IMAP4] contains the + AUTHENTICATE command, for identifying and authenticating a user to an + IMAP4 server and for optionally negotiating a protection mechanism + for subsequent protocol interactions. This document describes + several authentication mechanisms for use by the IMAP4 AUTHENTICATE + command. + + +2. Kerberos version 4 authentication mechanism + + The authentication type associated with Kerberos version 4 is + "KERBEROS_V4". + + The data encoded in the first ready response contains a random 32-bit + number in network byte order. The client should respond with a + Kerberos ticket and an authenticator for the principal + "imap.hostname@realm", where "hostname" is the first component of the + host name of the server with all letters in lower case and where + "realm" is the Kerberos realm of the server. The encrypted checksum + field included within the Kerberos authenticator should contain the + server provided 32-bit number in network byte order. + + Upon decrypting and verifying the ticket and authenticator, the + server should verify that the contained checksum field equals the + original server provided random 32-bit number. Should the + verification be successful, the server must add one to the checksum + and construct 8 octets of data, with the first four octets containing + the incremented checksum in network byte order, the fifth octet + containing a bit-mask specifying the protection mechanisms supported + by the server, and the sixth through eighth octets containing, in + + + +Myers [Page 1] + +RFC 1731 IMAP4 Authentication Mechanisms December 1994 + + + network byte order, the maximum cipher-text buffer size the server is + able to receive. The server must encrypt the 8 octets of data in the + session key and issue that encrypted data in a second ready response. + The client should consider the server authenticated if the first four + octets the un-encrypted data is equal to one plus the checksum it + previously sent. + + The client must construct data with the first four octets containing + the original server-issued checksum in network byte order, the fifth + octet containing the bit-mask specifying the selected protection + mechanism, the sixth through eighth octets containing in network byte + order the maximum cipher-text buffer size the client is able to + receive, and the following octets containing a user name string. The + client must then append from one to eight octets so that the length + of the data is a multiple of eight octets. The client must then PCBC + encrypt the data with the session key and respond to the second ready + response with the encrypted data. The server decrypts the data and + verifies the contained checksum. The username field identifies the + user for whom subsequent IMAP operations are to be performed; the + server must verify that the principal identified in the Kerberos + ticket is authorized to connect as that user. After these + verifications, the authentication process is complete. + + The protection mechanisms and their corresponding bit-masks are as + follows: + + 1 No protection mechanism + 2 Integrity (krb_mk_safe) protection + 4 Privacy (krb_mk_priv) protection + + + EXAMPLE: The following are two Kerberos version 4 login scenarios + (note that the line breaks in the sample authenticators are for + editorial clarity and are not in real authenticators) + + S: * OK IMAP4 Server + C: A001 AUTHENTICATE KERBEROS_V4 + S: + AmFYig== + C: BAcAQU5EUkVXLkNNVS5FRFUAOCAsho84kLN3/IJmrMG+25a4DT + +nZImJjnTNHJUtxAA+o0KPKfHEcAFs9a3CL5Oebe/ydHJUwYFd + WwuQ1MWiy6IesKvjL5rL9WjXUb9MwT9bpObYLGOKi1Qh + S: + or//EoAADZI= + C: DiAF5A4gA+oOIALuBkAAmw== + S: A001 OK Kerberos V4 authentication successful + + + + + + + +Myers [Page 2] + +RFC 1731 IMAP4 Authentication Mechanisms December 1994 + + + S: * OK IMAP4 Server + C: A001 AUTHENTICATE KERBEROS_V4 + S: + gcfgCA== + C: BAcAQU5EUkVXLkNNVS5FRFUAOCAsho84kLN3/IJmrMG+25a4DT + +nZImJjnTNHJUtxAA+o0KPKfHEcAFs9a3CL5Oebe/ydHJUwYFd + WwuQ1MWiy6IesKvjL5rL9WjXUb9MwT9bpObYLGOKi1Qh + S: A001 NO Kerberos V4 authentication failed + + +3. GSSAPI authentication mechanism + + The authentication type associated with all mechanisms employing the + GSSAPI [RFC1508] is "GSSAPI". + + The first ready response issued by the server contains no data. The + client should call GSS_Init_sec_context, passing in 0 for + input_context_handle (initially) and a targ_name equal to output_name + from GSS_Import_Name called with input_name_type of NULL and + input_name_string of "SERVICE:imap@hostname" where "hostname" is the + fully qualified host name of the server with all letters in lower + case. The client must then respond with the resulting output_token. + If GSS_Init_sec_context returns GSS_CONTINUE_NEEDED, then the client + should expect the server to issue a token in a subsequent ready + response. The client must pass the token to another call to + GSS_Init_sec_context. + + If GSS_Init_sec_context returns GSS_COMPLETE, then the client should + respond with any resulting output_token. If there is no + output_token, the client should respond with no data. The client + should then expect the server to issue a token in a subsequent ready + response. The client should pass this token to GSS_Unseal and + interpret the first octet of resulting cleartext as a bit-mask + specifying the protection mechanisms supported by the server and the + second through fourth octets as the maximum size output_message to + send to the server. The client should construct data, with the first + octet containing the bit-mask specifying the selected protection + mechanism, the second through fourth octets containing in network + byte order the maximum size output_message the client is able to + receive, and the remaining octets containing a user name string. The + client must pass the data to GSS_Seal with conf_flag set to FALSE, + and respond with the generated output_message. The client can then + consider the server authenticated. + + The server must issue a ready response with no data and pass the + resulting client supplied token to GSS_Accept_sec_context as + input_token, setting acceptor_cred_handle to NULL (for "use default + credentials"), and 0 for input_context_handle (initially). If + GSS_Accept_sec_context returns GSS_CONTINUE_NEEDED, the server should + + + +Myers [Page 3] + +RFC 1731 IMAP4 Authentication Mechanisms December 1994 + + + return the generated output_token to the client in a ready response + and pass the resulting client supplied token to another call to + GSS_Accept_sec_context. + + If GSS_Accept_sec_context returns GSS_COMPLETE, then if an + output_token is returned, the server should return it to the client + in a ready response and expect a reply from the client with no data. + Whether or not an output_token was returned, the server then should + then construct 4 octets of data, with the first octet containing a + bit-mask specifying the protection mechanisms supported by the server + and the second through fourth octets containing in network byte order + the maximum size output_token the server is able to receive. The + server must then pass the plaintext to GSS_Seal with conf_flag set to + FALSE and issue the generated output_message to the client in a ready + response. The server must then pass the resulting client supplied + token to GSS_Unseal and interpret the first octet of resulting + cleartext as the bit-mask for the selected protection mechanism, the + second through fourth octets as the maximum size output_message to + send to the client, and the remaining octets as the user name. Upon + verifying the src_name is authorized to authenticate as the user + name, The server should then consider the client authenticated. + + The protection mechanisms and their corresponding bit-masks are as + follows: + + 1 No protection mechanism + 2 Integrity protection. + Sender calls GSS_Seal with conf_flag set to FALSE + 4 Privacy protection. + Sender calls GSS_Seal with conf_flag set to TRUE + + +4. S/Key authentication mechanism + + The authentication type associated with S/Key [SKEY] is "SKEY". + + The first ready response issued by the server contains no data. The + client responds with the user name string. + + The data encoded in the second ready response contains the decimal + sequence number followed by a single space and the seed string for + the indicated user. The client responds with the one-time-password, + as either a 64-bit value in network byte order or encoded in the "six + English words" format. + + Upon successful verification of the one-time-password, the server + should consider the client authenticated. + + + + +Myers [Page 4] + +RFC 1731 IMAP4 Authentication Mechanisms December 1994 + + + S/Key authentication does not provide for any protection mechanisms. + + + EXAMPLE: The following are two S/Key login scenarios. + + S: * OK IMAP4 Server + C: A001 AUTHENTICATE SKEY + S: + + C: bW9yZ2Fu + S: + OTUgUWE1ODMwOA== + C: Rk9VUiBNQU5OIFNPT04gRklSIFZBUlkgTUFTSA== + S: A001 OK S/Key authentication successful + + + S: * OK IMAP4 Server + C: A001 AUTHENTICATE SKEY + S: + + C: c21pdGg= + S: + OTUgUWE1ODMwOA== + C: BsAY3g4gBNo= + S: A001 NO S/Key authentication failed + + +5. References + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version 4", + RFC 1730, University of Washington, December 1994. + + [RFC1508] Linn, J., "Generic Security Service Application Program + Interface", RFC 1508, Geer Zolot Associates, September 1993. + + [SKEY] Haller, Neil M. "The S/Key One-Time Password System", + Bellcore, Morristown, New Jersey, October 1993, + thumper.bellcore.com:pub/nmh/docs/ISOC.symp.ps + + + + + + + + + + + + + + + + + +Myers [Page 5] + +RFC 1731 IMAP4 Authentication Mechanisms December 1994 + + +6. Security Considerations + + Security issues are discussed throughout this memo. + + +7. Author's Address + + John G. Myers + Carnegie-Mellon University + 5000 Forbes Ave. + Pittsburgh PA, 15213-3890 + + EMail: jgm+@cmu.edu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Myers [Page 6] + diff --git a/doc/rfc1732.txt b/doc/rfc1732.txt @@ -0,0 +1,283 @@ + + + + + + +Network Working Group M. Crispin +Request for Comments: 1732 University of Washington +Category: Informational December 1994 + + + IMAP4 COMPATIBILITY WITH IMAP2 AND IMAP2BIS + + +Status of this Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +Introduction + + This is a summary of hints and recommendations to enable an IMAP4 + implementation to interoperate with implementations that conform to + earlier specifications. None of these hints and recommendations are + required by the IMAP4 specification; implementors must decide for + themselves whether they want their implementation to fail if it + encounters old software. + + IMAP4 has been designed to be upwards compatible with earlier + specifications. For the most part, IMAP4 facilities that were not in + earlier specifications should be invisible to clients unless the + client asks for the facility. + + In some cases, older servers may support some of the capabilities + listed as being "new in IMAP4" as experimental extensions to the + IMAP2 protocol described in RFC 1176. + + This information may not be complete; it reflects current knowledge + of server and client implementations as well as "folklore" acquired + in the evolution of the protocol. + + + + + + + + + + + + + + + + +Crispin [Page 1] + +RFC 1732 IMAP4 - Compatibility December 1994 + + +IMAP4 client interoperability with old servers + + In general, a client should be able to discover whether an IMAP2 + server supports a facility by trial-and-error; if an attempt to use a + facility generates a BAD response, the client can assume that the + server does not support the facility. + + A quick way to check whether a server implementation supports the + IMAP4 specification is to try the CAPABILITY command. An OK response + that includes the IMAP4 capability value indicates a server that + supports IMAP4; a BAD response or one without the IMAP4 capability + value indicates an older server. + + The following is a list of facilities that are only in IMAP4, and + suggestions for how new clients might interoperate with old servers: + + CAPABILITY command + A BAD response to this command indicates that the server + implements IMAP2 (or IMAP2bis) and not IMAP4. + + AUTHENTICATE command. + Use the LOGIN command. + + LSUB and LIST commands + Try the RFC 1176 FIND command. + + * in a sequence + Use the number of messages in the mailbox from the EXISTS + unsolicited response. + + SEARCH extensions (character set, additional criteria) + Reformulate the search request using only the searching + options listed in search_old in the IMAP4 grammar. This may + entail doing multiple searches to achieve the desired + results. + + BODYSTRUCTURE fetch data item + Try to fetch the non-extensible BODY data item. + + body section number 0 + Fetch the entire message and extract the header. + + RFC822.HEADER.LINES and RFC822.HEADER.LINES.NOT fetch data items + Use RFC822.HEADER and remove the unwanted information. + + BODY.PEEK[section], RFC822.PEEK, and RFC822.TEXT.PEEK fetch data + items Use the corresponding non-PEEK versions and manually + clear the \Seen flag as necessary. + + + +Crispin [Page 2] + +RFC 1732 IMAP4 - Compatibility December 1994 + + + UID fetch data item and the UID commands + No equivalent capabilitity exists in older servers. + + FLAGS.SILENT, +FLAGS.SILENT, and -FLAGS.SILENT store data items + Use the corresponding non-SILENT versions and ignore the + untagged FETCH responses which com eback. + + + The following IMAP4 facilities were introduced in the experimental + IMAP2bis revisions to RFC-1176, and may be present in a server that + does not support the CAPABILITY command: + + CREATE, DELETE, and RENAME commands + To test whether these commands are present, try a CREATE + INBOX command. If the response is NO, these commands are + supported by the server. If the response is BAD, they are + not. Older servers without the CREATE capability may sup- + port implicit creation of a mailbox by a COPY command with a + non-existant name as the destination. + + APPEND command + To test whether this command is present, try to append a + zero-length stream to a mailbox name that is known not to + exist (or at least, highly unlikely to exist) on the remote + system. + + SUBSCRIBE and UNSUBSCRIBE commands + Try the form of these commands with the optional MAILBOX + keyword. + + EXAMINE command + Use the SELECT command instead. + + flags and internal date argument to APPEND command + Try the APPEND without any flag list and internal date argu- + ments. + + BODY, BODY[section], and FULL fetch data items + Use RFC822.TEXT and ALL instead. Server does not support + MIME. + + PARTIAL command + Use the appropriate FETCH command and ignore the unwanted + data. + + + IMAP4 client implementations must accept all responses and data for- + mats documented in the IMAP4 specification, including those labeled + + + +Crispin [Page 3] + +RFC 1732 IMAP4 - Compatibility December 1994 + + + as obsolete. This includes the COPY and STORE unsolicited responses + and the old format of dates and times. In particular, client imple- + mentations must not treat a date/time as a fixed format string; nor + may they assume that the time begins at a particular octet. + + IMAP4 client implementations must not depend upon the presence of any + server extensions that are not in the base IMAP4 specification. + + The experimental IMAP2bis version specified that the TRYCREATE spe- + cial information token is sent as a separate unsolicited OK response + instead of inside the NO response. + + The FIND BBOARDS, FIND ALL.BBOARDS, and BBOARD commands of RFC 1176 + are removed from IMAP4. There is no equivalent to the bboard com- + mands, which provided a separate namespace with implicit restrictions + on what may be done in that namespace. + + Older server implementations may automatically create the destination + mailbox on COPY if that mailbox does not already exist. This was how + a new mailbox was created in older specifications. If the server + does not support the CREATE command (see above for how to test for + this), it will probably create a mailbox on COPY. + + Older server implementations may not preserve flags or internal dates + on COPY. Some server implementations may not permit the preservation + of certain flags on COPY or their setting with APPEND as site policy. + + + + + + + + + + + + + + + + + + + + + + + + + +Crispin [Page 4] + +RFC 1732 IMAP4 - Compatibility December 1994 + + +IMAP4 server interoperability with old clients + + In general, there should be no interoperation problem between a + server conforming to the IMAP4 specification and a well-written + client that conforms to an earlier specification. Known problems are + noted below: + + Poor wording in the description of the CHECK command in earlier + specifications implied that a CHECK command is the way to get the + current number of messages in the mailbox. This is incorrect. A + CHECK command does not necessarily result in an EXISTS response. + Clients must remember the most recent EXISTS value sent from the + server, and should not generate unnecessary CHECK commands. + + An incompatibility exists with COPY in IMAP4. COPY in IMAP4 + servers does not automatically create the destination mailbox if + that mailbox does not already exist. This may cause problems with + old clients that expect automatic mailbox creation in COPY. + + The PREAUTH unsolicited response is new in IMAP4. It is highly + unlikely that an old client would ever see this response. + + The format of dates and times has changed due to the impending end + of the century. Clients that fail to accept a four-digit year or + a signed four-digit timezone value will not work properly with + IMAP4. + + An incompatibility exists with the use of "\" in quoted strings. + This is best avoided by using literals instead of quoted strings + if "\" or <"> is embedded in the string. + +Security Considerations + + Security issues are not discussed in this memo. + +Author's Address: + + Mark R. Crispin + Networks and Distributed Computing, JE-30 + University of Washington + Seattle, WA 98195 + + Phone: (206) 543-5762 + + EMail: MRC@CAC.Washington.EDU + + + + + + +Crispin [Page 5] + diff --git a/doc/rfc1733.txt b/doc/rfc1733.txt @@ -0,0 +1,171 @@ + + + + + + +Network Working Group M. Crispin +Request for Comments: 1733 University of Washington +Category: Informational December 1994 + + + DISTRIBUTED ELECTRONIC MAIL MODELS IN IMAP4 + + +Status of this Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + + +Distributed Electronic Mail Models + + There are three fundamental models of client/server email: offline, + online, and disconnected use. IMAP4 can be used in any one of these + three models. + + The offline model is the most familiar form of client/server email + today, and is used by protocols such as POP-3 (RFC 1225) and UUCP. + In this model, a client application periodically connects to a + server. It downloads all the pending messages to the client machine + and deletes these from the server. Thereafter, all mail processing + is local to the client. This model is store-and-forward; it moves + mail on demand from an intermediate server (maildrop) to a single + destination machine. + + The online model is most commonly used with remote filesystem + protocols such as NFS. In this model, a client application + manipulates mailbox data on a server machine. A connection to the + server is maintained throughout the session. No mailbox data are + kept on the client; the client retrieves data from the server as is + needed. IMAP4 introduces a form of the online model that requires + considerably less network bandwidth than a remote filesystem + protocol, and provides the opportunity for using the server for CPU + or I/O intensive functions such as parsing and searching. + + The disconnected use model is a hybrid of the offline and online + models, and is used by protocols such as PCMAIL (RFC 1056). In this + model, a client user downloads some set of messages from the server, + manipulates them offline, then at some later time uploads the + changes. The server remains the authoritative repository of the + messages. The problems of synchronization (particularly when + multiple clients are involved) are handled through the means of + unique identifiers for each message. + + + +Crispin [Page 1] + +RFC 1733 IMAP4 - Model December 1994 + + + Each of these models have their own strengths and weaknesses: + + Feature Offline Online Disc + ------- ------- ------ ---- + Can use multiple clients NO YES YES + Minimum use of server connect time YES NO YES + Minimum use of server resources YES NO NO + Minimum use of client disk resources NO YES NO + Multiple remote mailboxes NO YES YES + Fast startup NO YES NO + Mail processing when not online YES NO YES + + Although IMAP4 has its origins as a protocol designed to accommodate + the online model, it can support the other two models as well. This + makes possible the creation of clients that can be used in any of the + three models. For example, a user may wish to switch between the + online and disconnected models on a regular basis (e.g. owing to + travel). + + IMAP4 is designed to transmit message data on demand, and to provide + the facilities necessary for a client to decide what data it needs at + any particular time. There is generally no need to do a wholesale + transfer of an entire mailbox or even of the complete text of a + message. This makes a difference in situations where the mailbox is + large, or when the link to the server is slow. + + More specifically, IMAP4 supports server-based RFC 822 and MIME + processing. With this information, it is possible for a client to + determine in advance whether it wishes to retrieve a particular + message or part of a message. For example, a user connected to an + IMAP4 server via a dialup link can determine that a message has a + 2000 byte text segment and a 40 megabyte video segment, and elect to + fetch only the text segment. + + In IMAP4, the client/server relationship lasts only for the duration + of the TCP connection. There is no registration of clients. Except + for any unique identifiers used in disconnected use operation, the + client initially has no knowledge of mailbox state and learns it from + the IMAP4 server when a mailbox is selected. This initial transfer + is minimal; the client requests additional state data as it needs. + + As noted above, the choice for the location of mailbox data depends + upon the model chosen. The location of message state (e.g. whether + or not a message has been read or answered) is also determined by the + model, and is not necessarily the same as the location of the mailbox + data. For example, in the online model message state can be co- + located with mailbox data; it can also be located elsewhere (on the + client or on a third agent) using unique identifiers to achieve + + + +Crispin [Page 2] + +RFC 1733 IMAP4 - Model December 1994 + + + common reference across sessions. The latter is particularly useful + with a server that exports public data such as netnews and does not + maintain per-user state. + + The IMAP4 protocol provides the generality to implement these + different models. This is done by means of server and (especially) + client configuration, and not by requiring changes to the protocol or + the implementation of the protocol. + + +Security Considerations + + Security issues are not discussed in this memo. + + +Author's Address: + + Mark R. Crispin + Networks and Distributed Computing, JE-30 + University of Washington + Seattle, WA 98195 + + Phone: (206) 543-5762 + + EMail: MRC@CAC.Washington.EDU + + + + + + + + + + + + + + + + + + + + + + + + + + +Crispin [Page 3] + diff --git a/doc/rfc2060.txt b/doc/rfc2060.txt @@ -0,0 +1,4595 @@ + + + + + + +Network Working Group M. Crispin +Request for Comments: 2060 University of Washington +Obsoletes: 1730 December 1996 +Category: Standards Track + + + INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1 + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Abstract + + The Internet Message Access Protocol, Version 4rev1 (IMAP4rev1) + allows a client to access and manipulate electronic mail messages on + a server. IMAP4rev1 permits manipulation of remote message folders, + called "mailboxes", in a way that is functionally equivalent to local + mailboxes. IMAP4rev1 also provides the capability for an offline + client to resynchronize with the server (see also [IMAP-DISC]). + + IMAP4rev1 includes operations for creating, deleting, and renaming + mailboxes; checking for new messages; permanently removing messages; + setting and clearing flags; [RFC-822] and [MIME-IMB] parsing; + searching; and selective fetching of message attributes, texts, and + portions thereof. Messages in IMAP4rev1 are accessed by the use of + numbers. These numbers are either message sequence numbers or unique + identifiers. + + IMAP4rev1 supports a single server. A mechanism for accessing + configuration information to support multiple IMAP4rev1 servers is + discussed in [ACAP]. + + IMAP4rev1 does not specify a means of posting mail; this function is + handled by a mail transfer protocol such as [SMTP]. + + IMAP4rev1 is designed to be upwards compatible from the [IMAP2] and + unpublished IMAP2bis protocols. In the course of the evolution of + IMAP4rev1, some aspects in the earlier protocol have become obsolete. + Obsolete commands, responses, and data formats which an IMAP4rev1 + implementation may encounter when used with an earlier implementation + are described in [IMAP-OBSOLETE]. + + + + + +Crispin Standards Track [Page 1] + +RFC 2060 IMAP4rev1 December 1996 + + + Other compatibility issues with IMAP2bis, the most common variant of + the earlier protocol, are discussed in [IMAP-COMPAT]. A full + discussion of compatibility issues with rare (and presumed extinct) + variants of [IMAP2] is in [IMAP-HISTORICAL]; this document is + primarily of historical interest. + +Table of Contents + +IMAP4rev1 Protocol Specification .................................. 4 +1. How to Read This Document ................................. 4 +1.1. Organization of This Document ............................. 4 +1.2. Conventions Used in This Document ......................... 4 +2. Protocol Overview ......................................... 5 +2.1. Link Level ................................................ 5 +2.2. Commands and Responses .................................... 6 +2.2.1. Client Protocol Sender and Server Protocol Receiver ....... 6 +2.2.2. Server Protocol Sender and Client Protocol Receiver ....... 7 +2.3. Message Attributes ........................................ 7 +2.3.1. Message Numbers ........................................... 7 +2.3.1.1. Unique Identifier (UID) Message Attribute ......... 7 +2.3.1.2. Message Sequence Number Message Attribute ......... 9 +2.3.2. Flags Message Attribute .................................... 9 +2.3.3. Internal Date Message Attribute ........................... 10 +2.3.4. [RFC-822] Size Message Attribute .......................... 11 +2.3.5. Envelope Structure Message Attribute ...................... 11 +2.3.6. Body Structure Message Attribute .......................... 11 +2.4. Message Texts ............................................. 11 +3. State and Flow Diagram .................................... 11 +3.1. Non-Authenticated State ................................... 11 +3.2. Authenticated State ....................................... 11 +3.3. Selected State ............................................ 12 +3.4. Logout State .............................................. 12 +4. Data Formats .............................................. 12 +4.1. Atom ...................................................... 13 +4.2. Number .................................................... 13 +4.3. String ..................................................... 13 +4.3.1. 8-bit and Binary Strings .................................. 13 +4.4. Parenthesized List ........................................ 14 +4.5. NIL ....................................................... 14 +5. Operational Considerations ................................ 14 +5.1. Mailbox Naming ............................................ 14 +5.1.1. Mailbox Hierarchy Naming .................................. 14 +5.1.2. Mailbox Namespace Naming Convention ....................... 14 +5.1.3. Mailbox International Naming Convention ................... 15 +5.2. Mailbox Size and Message Status Updates ................... 16 +5.3. Response when no Command in Progress ...................... 16 +5.4. Autologout Timer .......................................... 16 +5.5. Multiple Commands in Progress ............................. 17 + + + +Crispin Standards Track [Page 2] + +RFC 2060 IMAP4rev1 December 1996 + + +6. Client Commands ........................................... 17 +6.1. Client Commands - Any State ............................... 18 +6.1.1. CAPABILITY Command ........................................ 18 +6.1.2. NOOP Command .............................................. 19 +6.1.3. LOGOUT Command ............................................ 20 +6.2. Client Commands - Non-Authenticated State ................. 20 +6.2.1. AUTHENTICATE Command ...................................... 21 +6.2.2. LOGIN Command ............................................. 22 +6.3. Client Commands - Authenticated State ..................... 22 +6.3.1. SELECT Command ............................................ 23 +6.3.2. EXAMINE Command ........................................... 24 +6.3.3. CREATE Command ............................................ 25 +6.3.4. DELETE Command ............................................ 26 +6.3.5. RENAME Command ............................................ 27 +6.3.6. SUBSCRIBE Command ......................................... 29 +6.3.7. UNSUBSCRIBE Command ....................................... 30 +6.3.8. LIST Command .............................................. 30 +6.3.9. LSUB Command .............................................. 32 +6.3.10. STATUS Command ............................................ 33 +6.3.11. APPEND Command ............................................ 34 +6.4. Client Commands - Selected State .......................... 35 +6.4.1. CHECK Command ............................................. 36 +6.4.2. CLOSE Command ............................................. 36 +6.4.3. EXPUNGE Command ........................................... 37 +6.4.4. SEARCH Command ............................................ 37 +6.4.5. FETCH Command ............................................. 41 +6.4.6. STORE Command ............................................. 45 +6.4.7. COPY Command .............................................. 46 +6.4.8. UID Command ............................................... 47 +6.5. Client Commands - Experimental/Expansion .................. 48 +6.5.1. X<atom> Command ........................................... 48 +7. Server Responses .......................................... 48 +7.1. Server Responses - Status Responses ....................... 49 +7.1.1. OK Response ............................................... 51 +7.1.2. NO Response ............................................... 51 +7.1.3. BAD Response .............................................. 52 +7.1.4. PREAUTH Response .......................................... 52 +7.1.5. BYE Response .............................................. 52 +7.2. Server Responses - Server and Mailbox Status .............. 53 +7.2.1. CAPABILITY Response ....................................... 53 +7.2.2. LIST Response .............................................. 54 +7.2.3. LSUB Response ............................................. 55 +7.2.4 STATUS Response ........................................... 55 +7.2.5. SEARCH Response ........................................... 55 +7.2.6. FLAGS Response ............................................ 56 +7.3. Server Responses - Mailbox Size ........................... 56 +7.3.1. EXISTS Response ........................................... 56 +7.3.2. RECENT Response ........................................... 57 + + + +Crispin Standards Track [Page 3] + +RFC 2060 IMAP4rev1 December 1996 + + +7.4. Server Responses - Message Status ......................... 57 +7.4.1. EXPUNGE Response .......................................... 57 +7.4.2. FETCH Response ............................................ 58 +7.5. Server Responses - Command Continuation Request ........... 63 +8. Sample IMAP4rev1 connection ............................... 63 +9. Formal Syntax ............................................. 64 +10. Author's Note ............................................. 74 +11. Security Considerations ................................... 74 +12. Author's Address .......................................... 75 +Appendices ........................................................ 76 +A. References ................................................ 76 +B. Changes from RFC 1730 ..................................... 77 +C. Key Word Index ............................................ 79 + + +IMAP4rev1 Protocol Specification + +1. How to Read This Document + +1.1. Organization of This Document + + This document is written from the point of view of the implementor of + an IMAP4rev1 client or server. Beyond the protocol overview in + section 2, it is not optimized for someone trying to understand the + operation of the protocol. The material in sections 3 through 5 + provides the general context and definitions with which IMAP4rev1 + operates. + + Sections 6, 7, and 9 describe the IMAP commands, responses, and + syntax, respectively. The relationships among these are such that it + is almost impossible to understand any of them separately. In + particular, do not attempt to deduce command syntax from the command + section alone; instead refer to the Formal Syntax section. + +1.2. Conventions Used in This Document + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. + + The following terms are used in this document to signify the + requirements of this specification. + + 1) MUST, or the adjective REQUIRED, means that the definition is + an absolute requirement of the specification. + + 2) MUST NOT that the definition is an absolute prohibition of the + specification. + + + + +Crispin Standards Track [Page 4] + +RFC 2060 IMAP4rev1 December 1996 + + + 3) SHOULD means that there may exist valid reasons in particular + circumstances to ignore a particular item, but the full + implications MUST be understood and carefully weighed before + choosing a different course. + + 4) SHOULD NOT means that there may exist valid reasons in + particular circumstances when the particular behavior is + acceptable or even useful, but the full implications SHOULD be + understood and the case carefully weighed before implementing + any behavior described with this label. + + 5) MAY, or the adjective OPTIONAL, means that an item is truly + optional. One vendor may choose to include the item because a + particular marketplace requires it or because the vendor feels + that it enhances the product while another vendor may omit the + same item. An implementation which does not include a + particular option MUST be prepared to interoperate with another + implementation which does include the option. + + "Can" is used instead of "may" when referring to a possible + circumstance or situation, as opposed to an optional facility of + the protocol. + + "User" is used to refer to a human user, whereas "client" refers + to the software being run by the user. + + "Connection" refers to the entire sequence of client/server + interaction from the initial establishment of the network + connection until its termination. "Session" refers to the + sequence of client/server interaction from the time that a mailbox + is selected (SELECT or EXAMINE command) until the time that + selection ends (SELECT or EXAMINE of another mailbox, CLOSE + command, or connection termination). + + Characters are 7-bit US-ASCII unless otherwise specified. Other + character sets are indicated using a "CHARSET", as described in + [MIME-IMT] and defined in [CHARSET]. CHARSETs have important + additional semantics in addition to defining character set; refer + to these documents for more detail. + +2. Protocol Overview + +2.1. Link Level + + The IMAP4rev1 protocol assumes a reliable data stream such as + provided by TCP. When TCP is used, an IMAP4rev1 server listens on + port 143. + + + + +Crispin Standards Track [Page 5] + +RFC 2060 IMAP4rev1 December 1996 + + +2.2. Commands and Responses + + An IMAP4rev1 connection consists of the establishment of a + client/server network connection, an initial greeting from the + server, and client/server interactions. These client/server + interactions consist of a client command, server data, and a server + completion result response. + + All interactions transmitted by client and server are in the form of + lines; that is, strings that end with a CRLF. The protocol receiver + of an IMAP4rev1 client or server is either reading a line, or is + reading a sequence of octets with a known count followed by a line. + +2.2.1. Client Protocol Sender and Server Protocol Receiver + + The client command begins an operation. Each client command is + prefixed with an identifier (typically a short alphanumeric string, + e.g. A0001, A0002, etc.) called a "tag". A different tag is + generated by the client for each command. + + There are two cases in which a line from the client does not + represent a complete command. In one case, a command argument is + quoted with an octet count (see the description of literal in String + under Data Formats); in the other case, the command arguments require + server feedback (see the AUTHENTICATE command). In either case, the + server sends a command continuation request response if it is ready + for the octets (if appropriate) and the remainder of the command. + This response is prefixed with the token "+". + + Note: If, instead, the server detected an error in the command, it + sends a BAD completion response with tag matching the command (as + described below) to reject the command and prevent the client from + sending any more of the command. + + It is also possible for the server to send a completion response + for some other command (if multiple commands are in progress), or + untagged data. In either case, the command continuation request + is still pending; the client takes the appropriate action for the + response, and reads another response from the server. In all + cases, the client MUST send a complete command (including + receiving all command continuation request responses and command + continuations for the command) before initiating a new command. + + The protocol receiver of an IMAP4rev1 server reads a command line + from the client, parses the command and its arguments, and transmits + server data and a server command completion result response. + + + + + +Crispin Standards Track [Page 6] + +RFC 2060 IMAP4rev1 December 1996 + + +2.2.2. Server Protocol Sender and Client Protocol Receiver + + Data transmitted by the server to the client and status responses + that do not indicate command completion are prefixed with the token + "*", and are called untagged responses. + + Server data MAY be sent as a result of a client command, or MAY be + sent unilaterally by the server. There is no syntactic difference + between server data that resulted from a specific command and server + data that were sent unilaterally. + + The server completion result response indicates the success or + failure of the operation. It is tagged with the same tag as the + client command which began the operation. Thus, if more than one + command is in progress, the tag in a server completion response + identifies the command to which the response applies. There are + three possible server completion responses: OK (indicating success), + NO (indicating failure), or BAD (indicating protocol error such as + unrecognized command or command syntax error). + + The protocol receiver of an IMAP4rev1 client reads a response line + from the server. It then takes action on the response based upon the + first token of the response, which can be a tag, a "*", or a "+". + + A client MUST be prepared to accept any server response at all times. + This includes server data that was not requested. Server data SHOULD + be recorded, so that the client can reference its recorded copy + rather than sending a command to the server to request the data. In + the case of certain server data, the data MUST be recorded. + + This topic is discussed in greater detail in the Server Responses + section. + +2.3. Message Attributes + + In addition to message text, each message has several attributes + associated with it. These attributes may be retrieved individually + or in conjunction with other attributes or message texts. + +2.3.1. Message Numbers + + Messages in IMAP4rev1 are accessed by one of two numbers; the unique + identifier and the message sequence number. + +2.3.1.1. Unique Identifier (UID) Message Attribute + + A 32-bit value assigned to each message, which when used with the + unique identifier validity value (see below) forms a 64-bit value + + + +Crispin Standards Track [Page 7] + +RFC 2060 IMAP4rev1 December 1996 + + + that is permanently guaranteed not to refer to any other message in + the mailbox. Unique identifiers are assigned in a strictly ascending + fashion in the mailbox; as each message is added to the mailbox it is + assigned a higher UID than the message(s) which were added + previously. + + Unlike message sequence numbers, unique identifiers are not + necessarily contiguous. Unique identifiers also persist across + sessions. This permits a client to resynchronize its state from a + previous session with the server (e.g. disconnected or offline access + clients); this is discussed further in [IMAP-DISC]. + + Associated with every mailbox is a unique identifier validity value, + which is sent in an UIDVALIDITY response code in an OK untagged + response at mailbox selection time. If unique identifiers from an + earlier session fail to persist to this session, the unique + identifier validity value MUST be greater than the one used in the + earlier session. + + Note: Unique identifiers MUST be strictly ascending in the mailbox + at all times. If the physical message store is re-ordered by a + non-IMAP agent, this requires that the unique identifiers in the + mailbox be regenerated, since the former unique identifers are no + longer strictly ascending as a result of the re-ordering. Another + instance in which unique identifiers are regenerated is if the + message store has no mechanism to store unique identifiers. + Although this specification recognizes that this may be + unavoidable in certain server environments, it STRONGLY ENCOURAGES + message store implementation techniques that avoid this problem. + + Another cause of non-persistance is if the mailbox is deleted and + a new mailbox with the same name is created at a later date, Since + the name is the same, a client may not know that this is a new + mailbox unless the unique identifier validity is different. A + good value to use for the unique identifier validity value is a + 32-bit representation of the creation date/time of the mailbox. + It is alright to use a constant such as 1, but only if it + guaranteed that unique identifiers will never be reused, even in + the case of a mailbox being deleted (or renamed) and a new mailbox + by the same name created at some future time. + + The unique identifier of a message MUST NOT change during the + session, and SHOULD NOT change between sessions. However, if it is + not possible to preserve the unique identifier of a message in a + subsequent session, each subsequent session MUST have a new unique + identifier validity value that is larger than any that was used + previously. + + + + +Crispin Standards Track [Page 8] + +RFC 2060 IMAP4rev1 December 1996 + + +2.3.1.2. Message Sequence Number Message Attribute + + A relative position from 1 to the number of messages in the mailbox. + This position MUST be ordered by ascending unique identifier. As + each new message is added, it is assigned a message sequence number + that is 1 higher than the number of messages in the mailbox before + that new message was added. + + Message sequence numbers can be reassigned during the session. For + example, when a message is permanently removed (expunged) from the + mailbox, the message sequence number for all subsequent messages is + decremented. Similarly, a new message can be assigned a message + sequence number that was once held by some other message prior to an + expunge. + + In addition to accessing messages by relative position in the + mailbox, message sequence numbers can be used in mathematical + calculations. For example, if an untagged "EXISTS 11" is received, + and previously an untagged "8 EXISTS" was received, three new + messages have arrived with message sequence numbers of 9, 10, and 11. + Another example; if message 287 in a 523 message mailbox has UID + 12345, there are exactly 286 messages which have lesser UIDs and 236 + messages which have greater UIDs. + +2.3.2. Flags Message Attribute + + A list of zero or more named tokens associated with the message. A + flag is set by its addition to this list, and is cleared by its + removal. There are two types of flags in IMAP4rev1. A flag of + either type may be permanent or session-only. + + A system flag is a flag name that is pre-defined in this + specification. All system flags begin with "\". Certain system + flags (\Deleted and \Seen) have special semantics described + elsewhere. The currently-defined system flags are: + + \Seen Message has been read + + \Answered Message has been answered + + \Flagged Message is "flagged" for urgent/special attention + + \Deleted Message is "deleted" for removal by later EXPUNGE + + \Draft Message has not completed composition (marked as a + draft). + + + + + +Crispin Standards Track [Page 9] + +RFC 2060 IMAP4rev1 December 1996 + + + \Recent Message is "recently" arrived in this mailbox. This + session is the first session to have been notified + about this message; subsequent sessions will not see + \Recent set for this message. This flag can not be + altered by the client. + + If it is not possible to determine whether or not + this session is the first session to be notified + about a message, then that message SHOULD be + considered recent. + + If multiple connections have the same mailbox + selected simultaneously, it is undefined which of + these connections will see newly-arrives messages + with \Recent set and which will see it without + \Recent set. + + A keyword is defined by the server implementation. Keywords do + not begin with "\". Servers MAY permit the client to define new + keywords in the mailbox (see the description of the + PERMANENTFLAGS response code for more information). + + A flag may be permanent or session-only on a per-flag basis. + Permanent flags are those which the client can add or remove + from the message flags permanently; that is, subsequent sessions + will see any change in permanent flags. Changes to session + flags are valid only in that session. + + Note: The \Recent system flag is a special case of a + session flag. \Recent can not be used as an argument in a + STORE command, and thus can not be changed at all. + +2.3.3. Internal Date Message Attribute + + The internal date and time of the message on the server. This is not + the date and time in the [RFC-822] header, but rather a date and time + which reflects when the message was received. In the case of + messages delivered via [SMTP], this SHOULD be the date and time of + final delivery of the message as defined by [SMTP]. In the case of + messages delivered by the IMAP4rev1 COPY command, this SHOULD be the + internal date and time of the source message. In the case of + messages delivered by the IMAP4rev1 APPEND command, this SHOULD be + the date and time as specified in the APPEND command description. + All other cases are implementation defined. + + + + + + + +Crispin Standards Track [Page 10] + +RFC 2060 IMAP4rev1 December 1996 + + +2.3.4. [RFC-822] Size Message Attribute + + The number of octets in the message, as expressed in [RFC-822] + format. + +2.3.5. Envelope Structure Message Attribute + + A parsed representation of the [RFC-822] envelope information (not to + be confused with an [SMTP] envelope) of the message. + +2.3.6. Body Structure Message Attribute + + A parsed representation of the [MIME-IMB] body structure information + of the message. + +2.4. Message Texts + + In addition to being able to fetch the full [RFC-822] text of a + message, IMAP4rev1 permits the fetching of portions of the full + message text. Specifically, it is possible to fetch the [RFC-822] + message header, [RFC-822] message body, a [MIME-IMB] body part, or a + [MIME-IMB] header. + +3. State and Flow Diagram + + An IMAP4rev1 server is in one of four states. Most commands are + valid in only certain states. It is a protocol error for the client + to attempt a command while the command is in an inappropriate state. + In this case, a server will respond with a BAD or NO (depending upon + server implementation) command completion result. + +3.1. Non-Authenticated State + + In non-authenticated state, the client MUST supply authentication + credentials before most commands will be permitted. This state is + entered when a connection starts unless the connection has been pre- + authenticated. + +3.2. Authenticated State + + In authenticated state, the client is authenticated and MUST select a + mailbox to access before commands that affect messages will be + permitted. This state is entered when a pre-authenticated connection + starts, when acceptable authentication credentials have been + provided, or after an error in selecting a mailbox. + + + + + + +Crispin Standards Track [Page 11] + +RFC 2060 IMAP4rev1 December 1996 + + +3.3. Selected State + + In selected state, a mailbox has been selected to access. This state + is entered when a mailbox has been successfully selected. + +3.4. Logout State + + In logout state, the connection is being terminated, and the server + will close the connection. This state can be entered as a result of + a client request or by unilateral server decision. + + +--------------------------------------+ + |initial connection and server greeting| + +--------------------------------------+ + || (1) || (2) || (3) + VV || || + +-----------------+ || || + |non-authenticated| || || + +-----------------+ || || + || (7) || (4) || || + || VV VV || + || +----------------+ || + || | authenticated |<=++ || + || +----------------+ || || + || || (7) || (5) || (6) || + || || VV || || + || || +--------+ || || + || || |selected|==++ || + || || +--------+ || + || || || (7) || + VV VV VV VV + +--------------------------------------+ + | logout and close connection | + +--------------------------------------+ + + (1) connection without pre-authentication (OK greeting) + (2) pre-authenticated connection (PREAUTH greeting) + (3) rejected connection (BYE greeting) + (4) successful LOGIN or AUTHENTICATE command + (5) successful SELECT or EXAMINE command + (6) CLOSE command, or failed SELECT or EXAMINE command + (7) LOGOUT command, server shutdown, or connection closed + +4. Data Formats + + IMAP4rev1 uses textual commands and responses. Data in IMAP4rev1 can + be in one of several forms: atom, number, string, parenthesized list, + or NIL. + + + +Crispin Standards Track [Page 12] + +RFC 2060 IMAP4rev1 December 1996 + + +4.1. Atom + + An atom consists of one or more non-special characters. + +4.2. Number + + A number consists of one or more digit characters, and represents a + numeric value. + +4.3. String + + A string is in one of two forms: literal and quoted string. The + literal form is the general form of string. The quoted string form + is an alternative that avoids the overhead of processing a literal at + the cost of limitations of characters that can be used in a quoted + string. + + A literal is a sequence of zero or more octets (including CR and LF), + prefix-quoted with an octet count in the form of an open brace ("{"), + the number of octets, close brace ("}"), and CRLF. In the case of + literals transmitted from server to client, the CRLF is immediately + followed by the octet data. In the case of literals transmitted from + client to server, the client MUST wait to receive a command + continuation request (described later in this document) before + sending the octet data (and the remainder of the command). + + A quoted string is a sequence of zero or more 7-bit characters, + excluding CR and LF, with double quote (<">) characters at each end. + + The empty string is represented as either "" (a quoted string with + zero characters between double quotes) or as {0} followed by CRLF (a + literal with an octet count of 0). + + Note: Even if the octet count is 0, a client transmitting a + literal MUST wait to receive a command continuation request. + +4.3.1. 8-bit and Binary Strings + + 8-bit textual and binary mail is supported through the use of a + [MIME-IMB] content transfer encoding. IMAP4rev1 implementations MAY + transmit 8-bit or multi-octet characters in literals, but SHOULD do + so only when the [CHARSET] is identified. + + + + + + + + + +Crispin Standards Track [Page 13] + +RFC 2060 IMAP4rev1 December 1996 + + + Although a BINARY body encoding is defined, unencoded binary strings + are not permitted. A "binary string" is any string with NUL + characters. Implementations MUST encode binary data into a textual + form such as BASE64 before transmitting the data. A string with an + excessive amount of CTL characters MAY also be considered to be + binary. + +4.4. Parenthesized List + + Data structures are represented as a "parenthesized list"; a sequence + of data items, delimited by space, and bounded at each end by + parentheses. A parenthesized list can contain other parenthesized + lists, using multiple levels of parentheses to indicate nesting. + + The empty list is represented as () -- a parenthesized list with no + members. + +4.5. NIL + + The special atom "NIL" represents the non-existence of a particular + data item that is represented as a string or parenthesized list, as + distinct from the empty string "" or the empty parenthesized list (). + +5. Operational Considerations + +5.1. Mailbox Naming + + The interpretation of mailbox names is implementation-dependent. + However, the case-insensitive mailbox name INBOX is a special name + reserved to mean "the primary mailbox for this user on this server". + +5.1.1. Mailbox Hierarchy Naming + + If it is desired to export hierarchical mailbox names, mailbox names + MUST be left-to-right hierarchical using a single character to + separate levels of hierarchy. The same hierarchy separator character + is used for all levels of hierarchy within a single name. + +5.1.2. Mailbox Namespace Naming Convention + + By convention, the first hierarchical element of any mailbox name + which begins with "#" identifies the "namespace" of the remainder of + the name. This makes it possible to disambiguate between different + types of mailbox stores, each of which have their own namespaces. + + + + + + + +Crispin Standards Track [Page 14] + +RFC 2060 IMAP4rev1 December 1996 + + + For example, implementations which offer access to USENET + newsgroups MAY use the "#news" namespace to partition the USENET + newsgroup namespace from that of other mailboxes. Thus, the + comp.mail.misc newsgroup would have an mailbox name of + "#news.comp.mail.misc", and the name "comp.mail.misc" could refer + to a different object (e.g. a user's private mailbox). + +5.1.3. Mailbox International Naming Convention + + By convention, international mailbox names are specified using a + modified version of the UTF-7 encoding described in [UTF-7]. The + purpose of these modifications is to correct the following problems + with UTF-7: + + 1) UTF-7 uses the "+" character for shifting; this conflicts with + the common use of "+" in mailbox names, in particular USENET + newsgroup names. + + 2) UTF-7's encoding is BASE64 which uses the "/" character; this + conflicts with the use of "/" as a popular hierarchy delimiter. + + 3) UTF-7 prohibits the unencoded usage of "\"; this conflicts with + the use of "\" as a popular hierarchy delimiter. + + 4) UTF-7 prohibits the unencoded usage of "~"; this conflicts with + the use of "~" in some servers as a home directory indicator. + + 5) UTF-7 permits multiple alternate forms to represent the same + string; in particular, printable US-ASCII chararacters can be + represented in encoded form. + + In modified UTF-7, printable US-ASCII characters except for "&" + represent themselves; that is, characters with octet values 0x20-0x25 + and 0x27-0x7e. The character "&" (0x26) is represented by the two- + octet sequence "&-". + + All other characters (octet values 0x00-0x1f, 0x7f-0xff, and all + Unicode 16-bit octets) are represented in modified BASE64, with a + further modification from [UTF-7] that "," is used instead of "/". + Modified BASE64 MUST NOT be used to represent any printing US-ASCII + character which can represent itself. + + "&" is used to shift to modified BASE64 and "-" to shift back to US- + ASCII. All names start in US-ASCII, and MUST end in US-ASCII (that + is, a name that ends with a Unicode 16-bit octet MUST end with a "- + "). + + + + + +Crispin Standards Track [Page 15] + +RFC 2060 IMAP4rev1 December 1996 + + + For example, here is a mailbox name which mixes English, Japanese, + and Chinese text: ~peter/mail/&ZeVnLIqe-/&U,BTFw- + +5.2. Mailbox Size and Message Status Updates + + At any time, a server can send data that the client did not request. + Sometimes, such behavior is REQUIRED. For example, agents other than + the server MAY add messages to the mailbox (e.g. new mail delivery), + change the flags of message in the mailbox (e.g. simultaneous access + to the same mailbox by multiple agents), or even remove messages from + the mailbox. A server MUST send mailbox size updates automatically + if a mailbox size change is observed during the processing of a + command. A server SHOULD send message flag updates automatically, + without requiring the client to request such updates explicitly. + Special rules exist for server notification of a client about the + removal of messages to prevent synchronization errors; see the + description of the EXPUNGE response for more detail. + + Regardless of what implementation decisions a client makes on + remembering data from the server, a client implementation MUST record + mailbox size updates. It MUST NOT assume that any command after + initial mailbox selection will return the size of the mailbox. + +5.3. Response when no Command in Progress + + Server implementations are permitted to send an untagged response + (except for EXPUNGE) while there is no command in progress. Server + implementations that send such responses MUST deal with flow control + considerations. Specifically, they MUST either (1) verify that the + size of the data does not exceed the underlying transport's available + window size, or (2) use non-blocking writes. + +5.4. Autologout Timer + + If a server has an inactivity autologout timer, that timer MUST be of + at least 30 minutes' duration. The receipt of ANY command from the + client during that interval SHOULD suffice to reset the autologout + timer. + + + + + + + + + + + + + +Crispin Standards Track [Page 16] + +RFC 2060 IMAP4rev1 December 1996 + + +5.5. Multiple Commands in Progress + + The client MAY send another command without waiting for the + completion result response of a command, subject to ambiguity rules + (see below) and flow control constraints on the underlying data + stream. Similarly, a server MAY begin processing another command + before processing the current command to completion, subject to + ambiguity rules. However, any command continuation request responses + and command continuations MUST be negotiated before any subsequent + command is initiated. + + The exception is if an ambiguity would result because of a command + that would affect the results of other commands. Clients MUST NOT + send multiple commands without waiting if an ambiguity would result. + If the server detects a possible ambiguity, it MUST execute commands + to completion in the order given by the client. + + The most obvious example of ambiguity is when a command would affect + the results of another command; for example, a FETCH of a message's + flags and a STORE of that same message's flags. + + A non-obvious ambiguity occurs with commands that permit an untagged + EXPUNGE response (commands other than FETCH, STORE, and SEARCH), + since an untagged EXPUNGE response can invalidate sequence numbers in + a subsequent command. This is not a problem for FETCH, STORE, or + SEARCH commands because servers are prohibited from sending EXPUNGE + responses while any of those commands are in progress. Therefore, if + the client sends any command other than FETCH, STORE, or SEARCH, it + MUST wait for a response before sending a command with message + sequence numbers. + + For example, the following non-waiting command sequences are invalid: + + FETCH + NOOP + STORE + STORE + COPY + FETCH + COPY + COPY + CHECK + FETCH + + The following are examples of valid non-waiting command sequences: + + FETCH + STORE + SEARCH + CHECK + STORE + COPY + EXPUNGE + +6. Client Commands + + IMAP4rev1 commands are described in this section. Commands are + organized by the state in which the command is permitted. Commands + which are permitted in multiple states are listed in the minimum + + + +Crispin Standards Track [Page 17] + +RFC 2060 IMAP4rev1 December 1996 + + + permitted state (for example, commands valid in authenticated and + selected state are listed in the authenticated state commands). + + Command arguments, identified by "Arguments:" in the command + descriptions below, are described by function, not by syntax. The + precise syntax of command arguments is described in the Formal Syntax + section. + + Some commands cause specific server responses to be returned; these + are identified by "Responses:" in the command descriptions below. + See the response descriptions in the Responses section for + information on these responses, and the Formal Syntax section for the + precise syntax of these responses. It is possible for server data to + be transmitted as a result of any command; thus, commands that do not + specifically require server data specify "no specific responses for + this command" instead of "none". + + The "Result:" in the command description refers to the possible + tagged status responses to a command, and any special interpretation + of these status responses. + +6.1. Client Commands - Any State + + The following commands are valid in any state: CAPABILITY, NOOP, and + LOGOUT. + +6.1.1. CAPABILITY Command + + Arguments: none + + Responses: REQUIRED untagged response: CAPABILITY + + Result: OK - capability completed + BAD - command unknown or arguments invalid + + The CAPABILITY command requests a listing of capabilities that the + server supports. The server MUST send a single untagged + CAPABILITY response with "IMAP4rev1" as one of the listed + capabilities before the (tagged) OK response. This listing of + capabilities is not dependent upon connection state or user. It + is therefore not necessary to issue a CAPABILITY command more than + once in a connection. + + + + + + + + + +Crispin Standards Track [Page 18] + +RFC 2060 IMAP4rev1 December 1996 + + + A capability name which begins with "AUTH=" indicates that the + server supports that particular authentication mechanism. All + such names are, by definition, part of this specification. For + example, the authorization capability for an experimental + "blurdybloop" authenticator would be "AUTH=XBLURDYBLOOP" and not + "XAUTH=BLURDYBLOOP" or "XAUTH=XBLURDYBLOOP". + + Other capability names refer to extensions, revisions, or + amendments to this specification. See the documentation of the + CAPABILITY response for additional information. No capabilities, + beyond the base IMAP4rev1 set defined in this specification, are + enabled without explicit client action to invoke the capability. + + See the section entitled "Client Commands - + Experimental/Expansion" for information about the form of site or + implementation-specific capabilities. + + Example: C: abcd CAPABILITY + S: * CAPABILITY IMAP4rev1 AUTH=KERBEROS_V4 + S: abcd OK CAPABILITY completed + +6.1.2. NOOP Command + + Arguments: none + + Responses: no specific responses for this command (but see below) + + Result: OK - noop completed + BAD - command unknown or arguments invalid + + The NOOP command always succeeds. It does nothing. + + Since any command can return a status update as untagged data, the + NOOP command can be used as a periodic poll for new messages or + message status updates during a period of inactivity. The NOOP + command can also be used to reset any inactivity autologout timer + on the server. + + Example: C: a002 NOOP + S: a002 OK NOOP completed + . . . + C: a047 NOOP + S: * 22 EXPUNGE + S: * 23 EXISTS + S: * 3 RECENT + S: * 14 FETCH (FLAGS (\Seen \Deleted)) + S: a047 OK NOOP completed + + + + +Crispin Standards Track [Page 19] + +RFC 2060 IMAP4rev1 December 1996 + + +6.1.3. LOGOUT Command + + Arguments: none + + Responses: REQUIRED untagged response: BYE + + Result: OK - logout completed + BAD - command unknown or arguments invalid + + The LOGOUT command informs the server that the client is done with + the connection. The server MUST send a BYE untagged response + before the (tagged) OK response, and then close the network + connection. + + Example: C: A023 LOGOUT + S: * BYE IMAP4rev1 Server logging out + S: A023 OK LOGOUT completed + (Server and client then close the connection) + +6.2. Client Commands - Non-Authenticated State + + In non-authenticated state, the AUTHENTICATE or LOGIN command + establishes authentication and enter authenticated state. The + AUTHENTICATE command provides a general mechanism for a variety of + authentication techniques, whereas the LOGIN command uses the + traditional user name and plaintext password pair. + + Server implementations MAY allow non-authenticated access to certain + mailboxes. The convention is to use a LOGIN command with the userid + "anonymous". A password is REQUIRED. It is implementation-dependent + what requirements, if any, are placed on the password and what access + restrictions are placed on anonymous users. + + Once authenticated (including as anonymous), it is not possible to + re-enter non-authenticated state. + + In addition to the universal commands (CAPABILITY, NOOP, and LOGOUT), + the following commands are valid in non-authenticated state: + AUTHENTICATE and LOGIN. + + + + + + + + + + + + +Crispin Standards Track [Page 20] + +RFC 2060 IMAP4rev1 December 1996 + + +6.2.1. AUTHENTICATE Command + + Arguments: authentication mechanism name + + Responses: continuation data can be requested + + Result: OK - authenticate completed, now in authenticated state + NO - authenticate failure: unsupported authentication + mechanism, credentials rejected + BAD - command unknown or arguments invalid, + authentication exchange cancelled + + The AUTHENTICATE command indicates an authentication mechanism, + such as described in [IMAP-AUTH], to the server. If the server + supports the requested authentication mechanism, it performs an + authentication protocol exchange to authenticate and identify the + client. It MAY also negotiate an OPTIONAL protection mechanism + for subsequent protocol interactions. If the requested + authentication mechanism is not supported, the server SHOULD + reject the AUTHENTICATE command by sending a tagged NO response. + + The authentication protocol exchange consists of a series of + server challenges and client answers that are specific to the + authentication mechanism. A server challenge consists of a + command continuation request response with the "+" token followed + by a BASE64 encoded string. The client answer consists of a line + consisting of a BASE64 encoded string. If the client wishes to + cancel an authentication exchange, it issues a line with a single + "*". If the server receives such an answer, it MUST reject the + AUTHENTICATE command by sending a tagged BAD response. + + A protection mechanism provides integrity and privacy protection + to the connection. If a protection mechanism is negotiated, it is + applied to all subsequent data sent over the connection. The + protection mechanism takes effect immediately following the CRLF + that concludes the authentication exchange for the client, and the + CRLF of the tagged OK response for the server. Once the + protection mechanism is in effect, the stream of command and + response octets is processed into buffers of ciphertext. Each + buffer is transferred over the connection as a stream of octets + prepended with a four octet field in network byte order that + represents the length of the following data. The maximum + ciphertext buffer length is defined by the protection mechanism. + + Authentication mechanisms are OPTIONAL. Protection mechanisms are + also OPTIONAL; an authentication mechanism MAY be implemented + without any protection mechanism. If an AUTHENTICATE command + fails with a NO response, the client MAY try another + + + +Crispin Standards Track [Page 21] + +RFC 2060 IMAP4rev1 December 1996 + + + authentication mechanism by issuing another AUTHENTICATE command, + or MAY attempt to authenticate by using the LOGIN command. In + other words, the client MAY request authentication types in + decreasing order of preference, with the LOGIN command as a last + resort. + + Example: S: * OK KerberosV4 IMAP4rev1 Server + C: A001 AUTHENTICATE KERBEROS_V4 + S: + AmFYig== + C: BAcAQU5EUkVXLkNNVS5FRFUAOCAsho84kLN3/IJmrMG+25a4DT + +nZImJjnTNHJUtxAA+o0KPKfHEcAFs9a3CL5Oebe/ydHJUwYFd + WwuQ1MWiy6IesKvjL5rL9WjXUb9MwT9bpObYLGOKi1Qh + S: + or//EoAADZI= + C: DiAF5A4gA+oOIALuBkAAmw== + S: A001 OK Kerberos V4 authentication successful + + Note: the line breaks in the first client answer are for editorial + clarity and are not in real authenticators. + +6.2.2. LOGIN Command + + Arguments: user name + password + + Responses: no specific responses for this command + + Result: OK - login completed, now in authenticated state + NO - login failure: user name or password rejected + BAD - command unknown or arguments invalid + + The LOGIN command identifies the client to the server and carries + the plaintext password authenticating this user. + + Example: C: a001 LOGIN SMITH SESAME + S: a001 OK LOGIN completed + +6.3. Client Commands - Authenticated State + + In authenticated state, commands that manipulate mailboxes as atomic + entities are permitted. Of these commands, the SELECT and EXAMINE + commands will select a mailbox for access and enter selected state. + + In addition to the universal commands (CAPABILITY, NOOP, and LOGOUT), + the following commands are valid in authenticated state: SELECT, + EXAMINE, CREATE, DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, LSUB, + STATUS, and APPEND. + + + + + +Crispin Standards Track [Page 22] + +RFC 2060 IMAP4rev1 December 1996 + + +6.3.1. SELECT Command + + Arguments: mailbox name + + Responses: REQUIRED untagged responses: FLAGS, EXISTS, RECENT + OPTIONAL OK untagged responses: UNSEEN, PERMANENTFLAGS + + Result: OK - select completed, now in selected state + NO - select failure, now in authenticated state: no + such mailbox, can't access mailbox + BAD - command unknown or arguments invalid + + The SELECT command selects a mailbox so that messages in the + mailbox can be accessed. Before returning an OK to the client, + the server MUST send the following untagged data to the client: + + FLAGS Defined flags in the mailbox. See the description + of the FLAGS response for more detail. + + <n> EXISTS The number of messages in the mailbox. See the + description of the EXISTS response for more detail. + + <n> RECENT The number of messages with the \Recent flag set. + See the description of the RECENT response for more + detail. + + OK [UIDVALIDITY <n>] + The unique identifier validity value. See the + description of the UID command for more detail. + + to define the initial state of the mailbox at the client. + + The server SHOULD also send an UNSEEN response code in an OK + untagged response, indicating the message sequence number of the + first unseen message in the mailbox. + + If the client can not change the permanent state of one or more of + the flags listed in the FLAGS untagged response, the server SHOULD + send a PERMANENTFLAGS response code in an OK untagged response, + listing the flags that the client can change permanently. + + Only one mailbox can be selected at a time in a connection; + simultaneous access to multiple mailboxes requires multiple + connections. The SELECT command automatically deselects any + currently selected mailbox before attempting the new selection. + Consequently, if a mailbox is selected and a SELECT command that + fails is attempted, no mailbox is selected. + + + + +Crispin Standards Track [Page 23] + +RFC 2060 IMAP4rev1 December 1996 + + + If the client is permitted to modify the mailbox, the server + SHOULD prefix the text of the tagged OK response with the + "[READ-WRITE]" response code. + + If the client is not permitted to modify the mailbox but is + permitted read access, the mailbox is selected as read-only, and + the server MUST prefix the text of the tagged OK response to + SELECT with the "[READ-ONLY]" response code. Read-only access + through SELECT differs from the EXAMINE command in that certain + read-only mailboxes MAY permit the change of permanent state on a + per-user (as opposed to global) basis. Netnews messages marked in + a server-based .newsrc file are an example of such per-user + permanent state that can be modified with read-only mailboxes. + + Example: C: A142 SELECT INBOX + S: * 172 EXISTS + S: * 1 RECENT + S: * OK [UNSEEN 12] Message 12 is first unseen + S: * OK [UIDVALIDITY 3857529045] UIDs valid + S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) + S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited + S: A142 OK [READ-WRITE] SELECT completed + +6.3.2. EXAMINE Command + + Arguments: mailbox name + + Responses: REQUIRED untagged responses: FLAGS, EXISTS, RECENT + OPTIONAL OK untagged responses: UNSEEN, PERMANENTFLAGS + + Result: OK - examine completed, now in selected state + NO - examine failure, now in authenticated state: no + such mailbox, can't access mailbox + BAD - command unknown or arguments invalid + + The EXAMINE command is identical to SELECT and returns the same + output; however, the selected mailbox is identified as read-only. + No changes to the permanent state of the mailbox, including + per-user state, are permitted. + + + + + + + + + + + + +Crispin Standards Track [Page 24] + +RFC 2060 IMAP4rev1 December 1996 + + + The text of the tagged OK response to the EXAMINE command MUST + begin with the "[READ-ONLY]" response code. + + Example: C: A932 EXAMINE blurdybloop + S: * 17 EXISTS + S: * 2 RECENT + S: * OK [UNSEEN 8] Message 8 is first unseen + S: * OK [UIDVALIDITY 3857529045] UIDs valid + S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) + S: * OK [PERMANENTFLAGS ()] No permanent flags permitted + S: A932 OK [READ-ONLY] EXAMINE completed + +6.3.3. CREATE Command + + Arguments: mailbox name + + Responses: no specific responses for this command + + Result: OK - create completed + NO - create failure: can't create mailbox with that name + BAD - command unknown or arguments invalid + + The CREATE command creates a mailbox with the given name. An OK + response is returned only if a new mailbox with that name has been + created. It is an error to attempt to create INBOX or a mailbox + with a name that refers to an extant mailbox. Any error in + creation will return a tagged NO response. + + If the mailbox name is suffixed with the server's hierarchy + separator character (as returned from the server by a LIST + command), this is a declaration that the client intends to create + mailbox names under this name in the hierarchy. Server + implementations that do not require this declaration MUST ignore + it. + + If the server's hierarchy separator character appears elsewhere in + the name, the server SHOULD create any superior hierarchical names + that are needed for the CREATE command to complete successfully. + In other words, an attempt to create "foo/bar/zap" on a server in + which "/" is the hierarchy separator character SHOULD create foo/ + and foo/bar/ if they do not already exist. + + If a new mailbox is created with the same name as a mailbox which + was deleted, its unique identifiers MUST be greater than any + unique identifiers used in the previous incarnation of the mailbox + UNLESS the new incarnation has a different unique identifier + validity value. See the description of the UID command for more + detail. + + + +Crispin Standards Track [Page 25] + +RFC 2060 IMAP4rev1 December 1996 + + + Example: C: A003 CREATE owatagusiam/ + S: A003 OK CREATE completed + C: A004 CREATE owatagusiam/blurdybloop + S: A004 OK CREATE completed + + Note: the interpretation of this example depends on whether "/" + was returned as the hierarchy separator from LIST. If "/" is the + hierarchy separator, a new level of hierarchy named "owatagusiam" + with a member called "blurdybloop" is created. Otherwise, two + mailboxes at the same hierarchy level are created. + +6.3.4. DELETE Command + + Arguments: mailbox name + + Responses: no specific responses for this command + + Result: OK - delete completed + NO - delete failure: can't delete mailbox with that name + BAD - command unknown or arguments invalid + + The DELETE command permanently removes the mailbox with the given + name. A tagged OK response is returned only if the mailbox has + been deleted. It is an error to attempt to delete INBOX or a + mailbox name that does not exist. + + The DELETE command MUST NOT remove inferior hierarchical names. + For example, if a mailbox "foo" has an inferior "foo.bar" + (assuming "." is the hierarchy delimiter character), removing + "foo" MUST NOT remove "foo.bar". It is an error to attempt to + delete a name that has inferior hierarchical names and also has + the \Noselect mailbox name attribute (see the description of the + LIST response for more details). + + It is permitted to delete a name that has inferior hierarchical + names and does not have the \Noselect mailbox name attribute. In + this case, all messages in that mailbox are removed, and the name + will acquire the \Noselect mailbox name attribute. + + The value of the highest-used unique identifier of the deleted + mailbox MUST be preserved so that a new mailbox created with the + same name will not reuse the identifiers of the former + incarnation, UNLESS the new incarnation has a different unique + identifier validity value. See the description of the UID command + for more detail. + + + + + + +Crispin Standards Track [Page 26] + +RFC 2060 IMAP4rev1 December 1996 + + + Examples: C: A682 LIST "" * + S: * LIST () "/" blurdybloop + S: * LIST (\Noselect) "/" foo + S: * LIST () "/" foo/bar + S: A682 OK LIST completed + C: A683 DELETE blurdybloop + S: A683 OK DELETE completed + C: A684 DELETE foo + S: A684 NO Name "foo" has inferior hierarchical names + C: A685 DELETE foo/bar + S: A685 OK DELETE Completed + C: A686 LIST "" * + S: * LIST (\Noselect) "/" foo + S: A686 OK LIST completed + C: A687 DELETE foo + S: A687 OK DELETE Completed + + + C: A82 LIST "" * + S: * LIST () "." blurdybloop + S: * LIST () "." foo + S: * LIST () "." foo.bar + S: A82 OK LIST completed + C: A83 DELETE blurdybloop + S: A83 OK DELETE completed + C: A84 DELETE foo + S: A84 OK DELETE Completed + C: A85 LIST "" * + S: * LIST () "." foo.bar + S: A85 OK LIST completed + C: A86 LIST "" % + S: * LIST (\Noselect) "." foo + S: A86 OK LIST completed + +6.3.5. RENAME Command + + Arguments: existing mailbox name + new mailbox name + + Responses: no specific responses for this command + + Result: OK - rename completed + NO - rename failure: can't rename mailbox with that name, + can't rename to mailbox with that name + BAD - command unknown or arguments invalid + + The RENAME command changes the name of a mailbox. A tagged OK + response is returned only if the mailbox has been renamed. It is + + + +Crispin Standards Track [Page 27] + +RFC 2060 IMAP4rev1 December 1996 + + + an error to attempt to rename from a mailbox name that does not + exist or to a mailbox name that already exists. Any error in + renaming will return a tagged NO response. + + If the name has inferior hierarchical names, then the inferior + hierarchical names MUST also be renamed. For example, a rename of + "foo" to "zap" will rename "foo/bar" (assuming "/" is the + hierarchy delimiter character) to "zap/bar". + + The value of the highest-used unique identifier of the old mailbox + name MUST be preserved so that a new mailbox created with the same + name will not reuse the identifiers of the former incarnation, + UNLESS the new incarnation has a different unique identifier + validity value. See the description of the UID command for more + detail. + + Renaming INBOX is permitted, and has special behavior. It moves + all messages in INBOX to a new mailbox with the given name, + leaving INBOX empty. If the server implementation supports + inferior hierarchical names of INBOX, these are unaffected by a + rename of INBOX. + + Examples: C: A682 LIST "" * + S: * LIST () "/" blurdybloop + S: * LIST (\Noselect) "/" foo + S: * LIST () "/" foo/bar + S: A682 OK LIST completed + C: A683 RENAME blurdybloop sarasoop + S: A683 OK RENAME completed + C: A684 RENAME foo zowie + S: A684 OK RENAME Completed + C: A685 LIST "" * + S: * LIST () "/" sarasoop + S: * LIST (\Noselect) "/" zowie + S: * LIST () "/" zowie/bar + S: A685 OK LIST completed + + + + + + + + + + + + + + + +Crispin Standards Track [Page 28] + +RFC 2060 IMAP4rev1 December 1996 + + + C: Z432 LIST "" * + S: * LIST () "." INBOX + S: * LIST () "." INBOX.bar + S: Z432 OK LIST completed + C: Z433 RENAME INBOX old-mail + S: Z433 OK RENAME completed + C: Z434 LIST "" * + S: * LIST () "." INBOX + S: * LIST () "." INBOX.bar + S: * LIST () "." old-mail + S: Z434 OK LIST completed + +6.3.6. SUBSCRIBE Command + + Arguments: mailbox + + Responses: no specific responses for this command + + Result: OK - subscribe completed + NO - subscribe failure: can't subscribe to that name + BAD - command unknown or arguments invalid + + The SUBSCRIBE command adds the specified mailbox name to the + server's set of "active" or "subscribed" mailboxes as returned by + the LSUB command. This command returns a tagged OK response only + if the subscription is successful. + + A server MAY validate the mailbox argument to SUBSCRIBE to verify + that it exists. However, it MUST NOT unilaterally remove an + existing mailbox name from the subscription list even if a mailbox + by that name no longer exists. + + Note: this requirement is because some server sites may routinely + remove a mailbox with a well-known name (e.g. "system-alerts") + after its contents expire, with the intention of recreating it + when new contents are appropriate. + + Example: C: A002 SUBSCRIBE #news.comp.mail.mime + S: A002 OK SUBSCRIBE completed + + + + + + + + + + + + +Crispin Standards Track [Page 29] + +RFC 2060 IMAP4rev1 December 1996 + + +6.3.7. UNSUBSCRIBE Command + + Arguments: mailbox name + + Responses: no specific responses for this command + + Result: OK - unsubscribe completed + NO - unsubscribe failure: can't unsubscribe that name + BAD - command unknown or arguments invalid + + The UNSUBSCRIBE command removes the specified mailbox name from + the server's set of "active" or "subscribed" mailboxes as returned + by the LSUB command. This command returns a tagged OK response + only if the unsubscription is successful. + + Example: C: A002 UNSUBSCRIBE #news.comp.mail.mime + S: A002 OK UNSUBSCRIBE completed + +6.3..8. LIST Command + + Arguments: reference name + mailbox name with possible wildcards + + Responses: untagged responses: LIST + + Result: OK - list completed + NO - list failure: can't list that reference or name + BAD - command unknown or arguments invalid + + The LIST command returns a subset of names from the complete set + of all names available to the client. Zero or more untagged LIST + replies are returned, containing the name attributes, hierarchy + delimiter, and name; see the description of the LIST reply for + more detail. + + The LIST command SHOULD return its data quickly, without undue + delay. For example, it SHOULD NOT go to excess trouble to + calculate \Marked or \Unmarked status or perform other processing; + if each name requires 1 second of processing, then a list of 1200 + names would take 20 minutes! + + An empty ("" string) reference name argument indicates that the + mailbox name is interpreted as by SELECT. The returned mailbox + names MUST match the supplied mailbox name pattern. A non-empty + reference name argument is the name of a mailbox or a level of + mailbox hierarchy, and indicates a context in which the mailbox + name is interpreted in an implementation-defined manner. + + + + +Crispin Standards Track [Page 30] + +RFC 2060 IMAP4rev1 December 1996 + + + An empty ("" string) mailbox name argument is a special request to + return the hierarchy delimiter and the root name of the name given + in the reference. The value returned as the root MAY be null if + the reference is non-rooted or is null. In all cases, the + hierarchy delimiter is returned. This permits a client to get the + hierarchy delimiter even when no mailboxes by that name currently + exist. + + The reference and mailbox name arguments are interpreted, in an + implementation-dependent fashion, into a canonical form that + represents an unambiguous left-to-right hierarchy. The returned + mailbox names will be in the interpreted form. + + Any part of the reference argument that is included in the + interpreted form SHOULD prefix the interpreted form. It SHOULD + also be in the same form as the reference name argument. This + rule permits the client to determine if the returned mailbox name + is in the context of the reference argument, or if something about + the mailbox argument overrode the reference argument. Without + this rule, the client would have to have knowledge of the server's + naming semantics including what characters are "breakouts" that + override a naming context. + + For example, here are some examples of how references and mailbox + names might be interpreted on a UNIX-based server: + + Reference Mailbox Name Interpretation + ------------ ------------ -------------- + ~smith/Mail/ foo.* ~smith/Mail/foo.* + archive/ % archive/% + #news. comp.mail.* #news.comp.mail.* + ~smith/Mail/ /usr/doc/foo /usr/doc/foo + archive/ ~fred/Mail/* ~fred/Mail/* + + The first three examples demonstrate interpretations in the + context of the reference argument. Note that "~smith/Mail" SHOULD + NOT be transformed into something like "/u2/users/smith/Mail", or + it would be impossible for the client to determine that the + interpretation was in the context of the reference. + + The character "*" is a wildcard, and matches zero or more + characters at this position. The character "%" is similar to "*", + but it does not match a hierarchy delimiter. If the "%" wildcard + is the last character of a mailbox name argument, matching levels + of hierarchy are also returned. If these levels of hierarchy are + not also selectable mailboxes, they are returned with the + \Noselect mailbox name attribute (see the description of the LIST + response for more details). + + + +Crispin Standards Track [Page 31] + +RFC 2060 IMAP4rev1 December 1996 + + + Server implementations are permitted to "hide" otherwise + accessible mailboxes from the wildcard characters, by preventing + certain characters or names from matching a wildcard in certain + situations. For example, a UNIX-based server might restrict the + interpretation of "*" so that an initial "/" character does not + match. + + The special name INBOX is included in the output from LIST, if + INBOX is supported by this server for this user and if the + uppercase string "INBOX" matches the interpreted reference and + mailbox name arguments with wildcards as described above. The + criteria for omitting INBOX is whether SELECT INBOX will return + failure; it is not relevant whether the user's real INBOX resides + on this or some other server. + + Example: C: A101 LIST "" "" + S: * LIST (\Noselect) "/" "" + S: A101 OK LIST Completed + C: A102 LIST #news.comp.mail.misc "" + S: * LIST (\Noselect) "." #news. + S: A102 OK LIST Completed + C: A103 LIST /usr/staff/jones "" + S: * LIST (\Noselect) "/" / + S: A103 OK LIST Completed + C: A202 LIST ~/Mail/ % + S: * LIST (\Noselect) "/" ~/Mail/foo + S: * LIST () "/" ~/Mail/meetings + S: A202 OK LIST completed + +6.3.9. LSUB Command + + Arguments: reference name + mailbox name with possible wildcards + + Responses: untagged responses: LSUB + + Result: OK - lsub completed + NO - lsub failure: can't list that reference or name + BAD - command unknown or arguments invalid + + The LSUB command returns a subset of names from the set of names + that the user has declared as being "active" or "subscribed". + Zero or more untagged LSUB replies are returned. The arguments to + LSUB are in the same form as those for LIST. + + A server MAY validate the subscribed names to see if they still + exist. If a name does not exist, it SHOULD be flagged with the + \Noselect attribute in the LSUB response. The server MUST NOT + + + +Crispin Standards Track [Page 32] + +RFC 2060 IMAP4rev1 December 1996 + + + unilaterally remove an existing mailbox name from the subscription + list even if a mailbox by that name no longer exists. + + Example: C: A002 LSUB "#news." "comp.mail.*" + S: * LSUB () "." #news.comp.mail.mime + S: * LSUB () "." #news.comp.mail.misc + S: A002 OK LSUB completed + +6.3.10. STATUS Command + + Arguments: mailbox name + status data item names + + Responses: untagged responses: STATUS + + Result: OK - status completed + NO - status failure: no status for that name + BAD - command unknown or arguments invalid + + The STATUS command requests the status of the indicated mailbox. + It does not change the currently selected mailbox, nor does it + affect the state of any messages in the queried mailbox (in + particular, STATUS MUST NOT cause messages to lose the \Recent + flag). + + The STATUS command provides an alternative to opening a second + IMAP4rev1 connection and doing an EXAMINE command on a mailbox to + query that mailbox's status without deselecting the current + mailbox in the first IMAP4rev1 connection. + + Unlike the LIST command, the STATUS command is not guaranteed to + be fast in its response. In some implementations, the server is + obliged to open the mailbox read-only internally to obtain certain + status information. Also unlike the LIST command, the STATUS + command does not accept wildcards. + + The currently defined status data items that can be requested are: + + MESSAGES The number of messages in the mailbox. + + RECENT The number of messages with the \Recent flag set. + + UIDNEXT The next UID value that will be assigned to a new + message in the mailbox. It is guaranteed that this + value will not change unless new messages are added + to the mailbox; and that it will change when new + messages are added even if those new messages are + subsequently expunged. + + + +Crispin Standards Track [Page 33] + +RFC 2060 IMAP4rev1 December 1996 + + + UIDVALIDITY The unique identifier validity value of the + mailbox. + + UNSEEN The number of messages which do not have the \Seen + flag set. + + + Example: C: A042 STATUS blurdybloop (UIDNEXT MESSAGES) + S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) + S: A042 OK STATUS completed + +6.3.11. APPEND Command + + Arguments: mailbox name + OPTIONAL flag parenthesized list + OPTIONAL date/time string + message literal + + Responses: no specific responses for this command + + Result: OK - append completed + NO - append error: can't append to that mailbox, error + in flags or date/time or message text + BAD - command unknown or arguments invalid + + The APPEND command appends the literal argument as a new message + to the end of the specified destination mailbox. This argument + SHOULD be in the format of an [RFC-822] message. 8-bit characters + are permitted in the message. A server implementation that is + unable to preserve 8-bit data properly MUST be able to reversibly + convert 8-bit APPEND data to 7-bit using a [MIME-IMB] content + transfer encoding. + + Note: There MAY be exceptions, e.g. draft messages, in which + required [RFC-822] header lines are omitted in the message literal + argument to APPEND. The full implications of doing so MUST be + understood and carefully weighed. + + If a flag parenthesized list is specified, the flags SHOULD be set in + the resulting message; otherwise, the flag list of the resulting + message is set empty by default. + + If a date_time is specified, the internal date SHOULD be set in the + resulting message; otherwise, the internal date of the resulting + message is set to the current date and time by default. + + + + + + +Crispin Standards Track [Page 34] + +RFC 2060 IMAP4rev1 December 1996 + + + If the append is unsuccessful for any reason, the mailbox MUST be + restored to its state before the APPEND attempt; no partial appending + is permitted. + + If the destination mailbox does not exist, a server MUST return an + error, and MUST NOT automatically create the mailbox. Unless it is + certain that the destination mailbox can not be created, the server + MUST send the response code "[TRYCREATE]" as the prefix of the text + of the tagged NO response. This gives a hint to the client that it + can attempt a CREATE command and retry the APPEND if the CREATE is + successful. + + If the mailbox is currently selected, the normal new mail actions + SHOULD occur. Specifically, the server SHOULD notify the client + immediately via an untagged EXISTS response. If the server does not + do so, the client MAY issue a NOOP command (or failing that, a CHECK + command) after one or more APPEND commands. + + Example: C: A003 APPEND saved-messages (\Seen) {310} + C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) + C: From: Fred Foobar <foobar@Blurdybloop.COM> + C: Subject: afternoon meeting + C: To: mooch@owatagu.siam.edu + C: Message-Id: <B27397-0100000@Blurdybloop.COM> + C: MIME-Version: 1.0 + C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII + C: + C: Hello Joe, do you think we can meet at 3:30 tomorrow? + C: + S: A003 OK APPEND completed + + Note: the APPEND command is not used for message delivery, because + it does not provide a mechanism to transfer [SMTP] envelope + information. + +6.4. Client Commands - Selected State + + In selected state, commands that manipulate messages in a mailbox are + permitted. + + In addition to the universal commands (CAPABILITY, NOOP, and LOGOUT), + and the authenticated state commands (SELECT, EXAMINE, CREATE, + DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, LSUB, STATUS, and + APPEND), the following commands are valid in the selected state: + CHECK, CLOSE, EXPUNGE, SEARCH, FETCH, STORE, COPY, and UID. + + + + + + +Crispin Standards Track [Page 35] + +RFC 2060 IMAP4rev1 December 1996 + + +6.4.1. CHECK Command + + Arguments: none + + Responses: no specific responses for this command + + Result: OK - check completed + BAD - command unknown or arguments invalid + + The CHECK command requests a checkpoint of the currently selected + mailbox. A checkpoint refers to any implementation-dependent + housekeeping associated with the mailbox (e.g. resolving the + server's in-memory state of the mailbox with the state on its + disk) that is not normally executed as part of each command. A + checkpoint MAY take a non-instantaneous amount of real time to + complete. If a server implementation has no such housekeeping + considerations, CHECK is equivalent to NOOP. + + There is no guarantee that an EXISTS untagged response will happen + as a result of CHECK. NOOP, not CHECK, SHOULD be used for new + mail polling. + + Example: C: FXXZ CHECK + S: FXXZ OK CHECK Completed + +6.4.2. CLOSE Command + + Arguments: none + + Responses: no specific responses for this command + + Result: OK - close completed, now in authenticated state + NO - close failure: no mailbox selected + BAD - command unknown or arguments invalid + + The CLOSE command permanently removes from the currently selected + mailbox all messages that have the \Deleted flag set, and returns + to authenticated state from selected state. No untagged EXPUNGE + responses are sent. + + No messages are removed, and no error is given, if the mailbox is + selected by an EXAMINE command or is otherwise selected read-only. + + Even if a mailbox is selected, a SELECT, EXAMINE, or LOGOUT + command MAY be issued without previously issuing a CLOSE command. + The SELECT, EXAMINE, and LOGOUT commands implicitly close the + currently selected mailbox without doing an expunge. However, + when many messages are deleted, a CLOSE-LOGOUT or CLOSE-SELECT + + + +Crispin Standards Track [Page 36] + +RFC 2060 IMAP4rev1 December 1996 + + + sequence is considerably faster than an EXPUNGE-LOGOUT or + EXPUNGE-SELECT because no untagged EXPUNGE responses (which the + client would probably ignore) are sent. + + Example: C: A341 CLOSE + S: A341 OK CLOSE completed + +6.4.3. EXPUNGE Command + + Arguments: none + + Responses: untagged responses: EXPUNGE + + Result: OK - expunge completed + NO - expunge failure: can't expunge (e.g. permission + denied) + BAD - command unknown or arguments invalid + + The EXPUNGE command permanently removes from the currently + selected mailbox all messages that have the \Deleted flag set. + Before returning an OK to the client, an untagged EXPUNGE response + is sent for each message that is removed. + + Example: C: A202 EXPUNGE + S: * 3 EXPUNGE + S: * 3 EXPUNGE + S: * 5 EXPUNGE + S: * 8 EXPUNGE + S: A202 OK EXPUNGE completed + + Note: in this example, messages 3, 4, 7, and 11 had the + \Deleted flag set. See the description of the EXPUNGE + response for further explanation. + +6.4.4. SEARCH Command + + Arguments: OPTIONAL [CHARSET] specification + searching criteria (one or more) + + Responses: REQUIRED untagged response: SEARCH + + Result: OK - search completed + NO - search error: can't search that [CHARSET] or + criteria + BAD - command unknown or arguments invalid + + + + + + +Crispin Standards Track [Page 37] + +RFC 2060 IMAP4rev1 December 1996 + + + The SEARCH command searches the mailbox for messages that match + the given searching criteria. Searching criteria consist of one + or more search keys. The untagged SEARCH response from the server + contains a listing of message sequence numbers corresponding to + those messages that match the searching criteria. + + When multiple keys are specified, the result is the intersection + (AND function) of all the messages that match those keys. For + example, the criteria DELETED FROM "SMITH" SINCE 1-Feb-1994 refers + to all deleted messages from Smith that were placed in the mailbox + since February 1, 1994. A search key can also be a parenthesized + list of one or more search keys (e.g. for use with the OR and NOT + keys). + + Server implementations MAY exclude [MIME-IMB] body parts with + terminal content media types other than TEXT and MESSAGE from + consideration in SEARCH matching. + + The OPTIONAL [CHARSET] specification consists of the word + "CHARSET" followed by a registered [CHARSET]. It indicates the + [CHARSET] of the strings that appear in the search criteria. + [MIME-IMB] content transfer encodings, and [MIME-HDRS] strings in + [RFC-822]/[MIME-IMB] headers, MUST be decoded before comparing + text in a [CHARSET] other than US-ASCII. US-ASCII MUST be + supported; other [CHARSET]s MAY be supported. If the server does + not support the specified [CHARSET], it MUST return a tagged NO + response (not a BAD). + + In all search keys that use strings, a message matches the key if + the string is a substring of the field. The matching is case- + insensitive. + + The defined search keys are as follows. Refer to the Formal + Syntax section for the precise syntactic definitions of the + arguments. + + <message set> Messages with message sequence numbers + corresponding to the specified message sequence + number set + + ALL All messages in the mailbox; the default initial + key for ANDing. + + ANSWERED Messages with the \Answered flag set. + + BCC <string> Messages that contain the specified string in the + envelope structure's BCC field. + + + + +Crispin Standards Track [Page 38] + +RFC 2060 IMAP4rev1 December 1996 + + + BEFORE <date> Messages whose internal date is earlier than the + specified date. + + BODY <string> Messages that contain the specified string in the + body of the message. + + CC <string> Messages that contain the specified string in the + envelope structure's CC field. + + DELETED Messages with the \Deleted flag set. + + DRAFT Messages with the \Draft flag set. + + FLAGGED Messages with the \Flagged flag set. + + FROM <string> Messages that contain the specified string in the + envelope structure's FROM field. + + HEADER <field-name> <string> + Messages that have a header with the specified + field-name (as defined in [RFC-822]) and that + contains the specified string in the [RFC-822] + field-body. + + KEYWORD <flag> Messages with the specified keyword set. + + LARGER <n> Messages with an [RFC-822] size larger than the + specified number of octets. + + NEW Messages that have the \Recent flag set but not the + \Seen flag. This is functionally equivalent to + "(RECENT UNSEEN)". + + NOT <search-key> + Messages that do not match the specified search + key. + + OLD Messages that do not have the \Recent flag set. + This is functionally equivalent to "NOT RECENT" (as + opposed to "NOT NEW"). + + ON <date> Messages whose internal date is within the + specified date. + + OR <search-key1> <search-key2> + Messages that match either search key. + + RECENT Messages that have the \Recent flag set. + + + +Crispin Standards Track [Page 39] + +RFC 2060 IMAP4rev1 December 1996 + + + SEEN Messages that have the \Seen flag set. + + SENTBEFORE <date> + Messages whose [RFC-822] Date: header is earlier + than the specified date. + + SENTON <date> Messages whose [RFC-822] Date: header is within the + specified date. + + SENTSINCE <date> + Messages whose [RFC-822] Date: header is within or + later than the specified date. + + SINCE <date> Messages whose internal date is within or later + than the specified date. + + SMALLER <n> Messages with an [RFC-822] size smaller than the + specified number of octets. + + SUBJECT <string> + Messages that contain the specified string in the + envelope structure's SUBJECT field. + + TEXT <string> Messages that contain the specified string in the + header or body of the message. + + TO <string> Messages that contain the specified string in the + envelope structure's TO field. + + UID <message set> + Messages with unique identifiers corresponding to + the specified unique identifier set. + + UNANSWERED Messages that do not have the \Answered flag set. + + UNDELETED Messages that do not have the \Deleted flag set. + + UNDRAFT Messages that do not have the \Draft flag set. + + UNFLAGGED Messages that do not have the \Flagged flag set. + + UNKEYWORD <flag> + Messages that do not have the specified keyword + set. + + UNSEEN Messages that do not have the \Seen flag set. + + + + + +Crispin Standards Track [Page 40] + +RFC 2060 IMAP4rev1 December 1996 + + + Example: C: A282 SEARCH FLAGGED SINCE 1-Feb-1994 NOT FROM "Smith" + S: * SEARCH 2 84 882 + S: A282 OK SEARCH completed + +6.4.5. FETCH Command + + Arguments: message set + message data item names + + Responses: untagged responses: FETCH + + Result: OK - fetch completed + NO - fetch error: can't fetch that data + BAD - command unknown or arguments invalid + + The FETCH command retrieves data associated with a message in the + mailbox. The data items to be fetched can be either a single atom + or a parenthesized list. + + The currently defined data items that can be fetched are: + + ALL Macro equivalent to: (FLAGS INTERNALDATE + RFC822.SIZE ENVELOPE) + + BODY Non-extensible form of BODYSTRUCTURE. + + BODY[<section>]<<partial>> + The text of a particular body section. The section + specification is a set of zero or more part + specifiers delimited by periods. A part specifier + is either a part number or one of the following: + HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, MIME, and + TEXT. An empty section specification refers to the + entire message, including the header. + + Every message has at least one part number. + Non-[MIME-IMB] messages, and non-multipart + [MIME-IMB] messages with no encapsulated message, + only have a part 1. + + Multipart messages are assigned consecutive part + numbers, as they occur in the message. If a + particular part is of type message or multipart, + its parts MUST be indicated by a period followed by + the part number within that nested multipart part. + + + + + + +Crispin Standards Track [Page 41] + +RFC 2060 IMAP4rev1 December 1996 + + + A part of type MESSAGE/RFC822 also has nested part + numbers, referring to parts of the MESSAGE part's + body. + + The HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, and + TEXT part specifiers can be the sole part specifier + or can be prefixed by one or more numeric part + specifiers, provided that the numeric part + specifier refers to a part of type MESSAGE/RFC822. + The MIME part specifier MUST be prefixed by one or + more numeric part specifiers. + + The HEADER, HEADER.FIELDS, and HEADER.FIELDS.NOT + part specifiers refer to the [RFC-822] header of + the message or of an encapsulated [MIME-IMT] + MESSAGE/RFC822 message. HEADER.FIELDS and + HEADER.FIELDS.NOT are followed by a list of + field-name (as defined in [RFC-822]) names, and + return a subset of the header. The subset returned + by HEADER.FIELDS contains only those header fields + with a field-name that matches one of the names in + the list; similarly, the subset returned by + HEADER.FIELDS.NOT contains only the header fields + with a non-matching field-name. The field-matching + is case-insensitive but otherwise exact. In all + cases, the delimiting blank line between the header + and the body is always included. + + The MIME part specifier refers to the [MIME-IMB] + header for this part. + + The TEXT part specifier refers to the text body of + the message, omitting the [RFC-822] header. + + + + + + + + + + + + + + + + + + +Crispin Standards Track [Page 42] + +RFC 2060 IMAP4rev1 December 1996 + + + Here is an example of a complex message + with some of its part specifiers: + + HEADER ([RFC-822] header of the message) + TEXT MULTIPART/MIXED + 1 TEXT/PLAIN + 2 APPLICATION/OCTET-STREAM + 3 MESSAGE/RFC822 + 3.HEADER ([RFC-822] header of the message) + 3.TEXT ([RFC-822] text body of the message) + 3.1 TEXT/PLAIN + 3.2 APPLICATION/OCTET-STREAM + 4 MULTIPART/MIXED + 4.1 IMAGE/GIF + 4.1.MIME ([MIME-IMB] header for the IMAGE/GIF) + 4.2 MESSAGE/RFC822 + 4.2.HEADER ([RFC-822] header of the message) + 4.2.TEXT ([RFC-822] text body of the message) + 4.2.1 TEXT/PLAIN + 4.2.2 MULTIPART/ALTERNATIVE + 4.2.2.1 TEXT/PLAIN + 4.2.2.2 TEXT/RICHTEXT + + + It is possible to fetch a substring of the + designated text. This is done by appending an open + angle bracket ("<"), the octet position of the + first desired octet, a period, the maximum number + of octets desired, and a close angle bracket (">") + to the part specifier. If the starting octet is + beyond the end of the text, an empty string is + returned. + + Any partial fetch that attempts to read beyond the + end of the text is truncated as appropriate. A + partial fetch that starts at octet 0 is returned as + a partial fetch, even if this truncation happened. + + Note: this means that BODY[]<0.2048> of a + 1500-octet message will return BODY[]<0> + with a literal of size 1500, not BODY[]. + + Note: a substring fetch of a + HEADER.FIELDS or HEADER.FIELDS.NOT part + specifier is calculated after subsetting + the header. + + + + + +Crispin Standards Track [Page 43] + +RFC 2060 IMAP4rev1 December 1996 + + + The \Seen flag is implicitly set; if this causes + the flags to change they SHOULD be included as part + of the FETCH responses. + + BODY.PEEK[<section>]<<partial>> + An alternate form of BODY[<section>] that does not + implicitly set the \Seen flag. + + BODYSTRUCTURE The [MIME-IMB] body structure of the message. This + is computed by the server by parsing the [MIME-IMB] + header fields in the [RFC-822] header and + [MIME-IMB] headers. + + ENVELOPE The envelope structure of the message. This is + computed by the server by parsing the [RFC-822] + header into the component parts, defaulting various + fields as necessary. + + FAST Macro equivalent to: (FLAGS INTERNALDATE + RFC822.SIZE) + + FLAGS The flags that are set for this message. + + FULL Macro equivalent to: (FLAGS INTERNALDATE + RFC822.SIZE ENVELOPE BODY) + + INTERNALDATE The internal date of the message. + + RFC822 Functionally equivalent to BODY[], differing in the + syntax of the resulting untagged FETCH data (RFC822 + is returned). + + RFC822.HEADER Functionally equivalent to BODY.PEEK[HEADER], + differing in the syntax of the resulting untagged + FETCH data (RFC822.HEADER is returned). + + RFC822.SIZE The [RFC-822] size of the message. + + RFC822.TEXT Functionally equivalent to BODY[TEXT], differing in + the syntax of the resulting untagged FETCH data + (RFC822.TEXT is returned). + + UID The unique identifier for the message. + + + + + + + + +Crispin Standards Track [Page 44] + +RFC 2060 IMAP4rev1 December 1996 + + + Example: C: A654 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)]) + S: * 2 FETCH .... + S: * 3 FETCH .... + S: * 4 FETCH .... + S: A654 OK FETCH completed + +6.4.6. STORE Command + + Arguments: message set + message data item name + value for message data item + + Responses: untagged responses: FETCH + + Result: OK - store completed + NO - store error: can't store that data + BAD - command unknown or arguments invalid + + The STORE command alters data associated with a message in the + mailbox. Normally, STORE will return the updated value of the + data with an untagged FETCH response. A suffix of ".SILENT" in + the data item name prevents the untagged FETCH, and the server + SHOULD assume that the client has determined the updated value + itself or does not care about the updated value. + + Note: regardless of whether or not the ".SILENT" suffix was + used, the server SHOULD send an untagged FETCH response if a + change to a message's flags from an external source is + observed. The intent is that the status of the flags is + determinate without a race condition. + + The currently defined data items that can be stored are: + + FLAGS <flag list> + Replace the flags for the message with the + argument. The new value of the flags are returned + as if a FETCH of those flags was done. + + FLAGS.SILENT <flag list> + Equivalent to FLAGS, but without returning a new + value. + + +FLAGS <flag list> + Add the argument to the flags for the message. The + new value of the flags are returned as if a FETCH + of those flags was done. + + + + + +Crispin Standards Track [Page 45] + +RFC 2060 IMAP4rev1 December 1996 + + + +FLAGS.SILENT <flag list> + Equivalent to +FLAGS, but without returning a new + value. + + -FLAGS <flag list> + Remove the argument from the flags for the message. + The new value of the flags are returned as if a + FETCH of those flags was done. + + -FLAGS.SILENT <flag list> + Equivalent to -FLAGS, but without returning a new + value. + + Example: C: A003 STORE 2:4 +FLAGS (\Deleted) + S: * 2 FETCH FLAGS (\Deleted \Seen) + S: * 3 FETCH FLAGS (\Deleted) + S: * 4 FETCH FLAGS (\Deleted \Flagged \Seen) + S: A003 OK STORE completed + +6.4.7. COPY Command + + Arguments: message set + mailbox name + + Responses: no specific responses for this command + + Result: OK - copy completed + NO - copy error: can't copy those messages or to that + name + BAD - command unknown or arguments invalid + + The COPY command copies the specified message(s) to the end of the + specified destination mailbox. The flags and internal date of the + message(s) SHOULD be preserved in the copy. + + If the destination mailbox does not exist, a server SHOULD return + an error. It SHOULD NOT automatically create the mailbox. Unless + it is certain that the destination mailbox can not be created, the + server MUST send the response code "[TRYCREATE]" as the prefix of + the text of the tagged NO response. This gives a hint to the + client that it can attempt a CREATE command and retry the COPY if + the CREATE is successful. + + + + + + + + + +Crispin Standards Track [Page 46] + +RFC 2060 IMAP4rev1 December 1996 + + + If the COPY command is unsuccessful for any reason, server + implementations MUST restore the destination mailbox to its state + before the COPY attempt. + + Example: C: A003 COPY 2:4 MEETING + S: A003 OK COPY completed + +6.4.8. UID Command + + Arguments: command name + command arguments + + Responses: untagged responses: FETCH, SEARCH + + Result: OK - UID command completed + NO - UID command error + BAD - command unknown or arguments invalid + + The UID command has two forms. In the first form, it takes as its + arguments a COPY, FETCH, or STORE command with arguments + appropriate for the associated command. However, the numbers in + the message set argument are unique identifiers instead of message + sequence numbers. + + In the second form, the UID command takes a SEARCH command with + SEARCH command arguments. The interpretation of the arguments is + the same as with SEARCH; however, the numbers returned in a SEARCH + response for a UID SEARCH command are unique identifiers instead + of message sequence numbers. For example, the command UID SEARCH + 1:100 UID 443:557 returns the unique identifiers corresponding to + the intersection of the message sequence number set 1:100 and the + UID set 443:557. + + Message set ranges are permitted; however, there is no guarantee + that unique identifiers be contiguous. A non-existent unique + identifier within a message set range is ignored without any error + message generated. + + The number after the "*" in an untagged FETCH response is always a + message sequence number, not a unique identifier, even for a UID + command response. However, server implementations MUST implicitly + include the UID message data item as part of any FETCH response + caused by a UID command, regardless of whether a UID was specified + as a message data item to the FETCH. + + + + + + + +Crispin Standards Track [Page 47] + +RFC 2060 IMAP4rev1 December 1996 + + + Example: C: A999 UID FETCH 4827313:4828442 FLAGS + S: * 23 FETCH (FLAGS (\Seen) UID 4827313) + S: * 24 FETCH (FLAGS (\Seen) UID 4827943) + S: * 25 FETCH (FLAGS (\Seen) UID 4828442) + S: A999 UID FETCH completed + +6.5. Client Commands - Experimental/Expansion + +6.5.1. X<atom> Command + + Arguments: implementation defined + + Responses: implementation defined + + Result: OK - command completed + NO - failure + BAD - command unknown or arguments invalid + + Any command prefixed with an X is an experimental command. + Commands which are not part of this specification, a standard or + standards-track revision of this specification, or an IESG- + approved experimental protocol, MUST use the X prefix. + + Any added untagged responses issued by an experimental command + MUST also be prefixed with an X. Server implementations MUST NOT + send any such untagged responses, unless the client requested it + by issuing the associated experimental command. + + Example: C: a441 CAPABILITY + S: * CAPABILITY IMAP4rev1 AUTH=KERBEROS_V4 XPIG-LATIN + S: a441 OK CAPABILITY completed + C: A442 XPIG-LATIN + S: * XPIG-LATIN ow-nay eaking-spay ig-pay atin-lay + S: A442 OK XPIG-LATIN ompleted-cay + +7. Server Responses + + Server responses are in three forms: status responses, server data, + and command continuation request. The information contained in a + server response, identified by "Contents:" in the response + descriptions below, is described by function, not by syntax. The + precise syntax of server responses is described in the Formal Syntax + section. + + The client MUST be prepared to accept any response at all times. + + + + + + +Crispin Standards Track [Page 48] + +RFC 2060 IMAP4rev1 December 1996 + + + Status responses can be tagged or untagged. Tagged status responses + indicate the completion result (OK, NO, or BAD status) of a client + command, and have a tag matching the command. + + Some status responses, and all server data, are untagged. An + untagged response is indicated by the token "*" instead of a tag. + Untagged status responses indicate server greeting, or server status + that does not indicate the completion of a command (for example, an + impending system shutdown alert). For historical reasons, untagged + server data responses are also called "unsolicited data", although + strictly speaking only unilateral server data is truly "unsolicited". + + Certain server data MUST be recorded by the client when it is + received; this is noted in the description of that data. Such data + conveys critical information which affects the interpretation of all + subsequent commands and responses (e.g. updates reflecting the + creation or destruction of messages). + + Other server data SHOULD be recorded for later reference; if the + client does not need to record the data, or if recording the data has + no obvious purpose (e.g. a SEARCH response when no SEARCH command is + in progress), the data SHOULD be ignored. + + An example of unilateral untagged server data occurs when the IMAP + connection is in selected state. In selected state, the server + checks the mailbox for new messages as part of command execution. + Normally, this is part of the execution of every command; hence, a + NOOP command suffices to check for new messages. If new messages are + found, the server sends untagged EXISTS and RECENT responses + reflecting the new size of the mailbox. Server implementations that + offer multiple simultaneous access to the same mailbox SHOULD also + send appropriate unilateral untagged FETCH and EXPUNGE responses if + another agent changes the state of any message flags or expunges any + messages. + + Command continuation request responses use the token "+" instead of a + tag. These responses are sent by the server to indicate acceptance + of an incomplete client command and readiness for the remainder of + the command. + +7.1. Server Responses - Status Responses + + Status responses are OK, NO, BAD, PREAUTH and BYE. OK, NO, and BAD + may be tagged or untagged. PREAUTH and BYE are always untagged. + + Status responses MAY include an OPTIONAL "response code". A response + code consists of data inside square brackets in the form of an atom, + possibly followed by a space and arguments. The response code + + + +Crispin Standards Track [Page 49] + +RFC 2060 IMAP4rev1 December 1996 + + + contains additional information or status codes for client software + beyond the OK/NO/BAD condition, and are defined when there is a + specific action that a client can take based upon the additional + information. + + The currently defined response codes are: + + ALERT The human-readable text contains a special alert + that MUST be presented to the user in a fashion + that calls the user's attention to the message. + + NEWNAME Followed by a mailbox name and a new mailbox name. + A SELECT or EXAMINE is failing because the target + mailbox name no longer exists because it was + renamed to the new mailbox name. This is a hint to + the client that the operation can succeed if the + SELECT or EXAMINE is reissued with the new mailbox + name. + + PARSE The human-readable text represents an error in + parsing the [RFC-822] header or [MIME-IMB] headers + of a message in the mailbox. + + PERMANENTFLAGS Followed by a parenthesized list of flags, + indicates which of the known flags that the client + can change permanently. Any flags that are in the + FLAGS untagged response, but not the PERMANENTFLAGS + list, can not be set permanently. If the client + attempts to STORE a flag that is not in the + PERMANENTFLAGS list, the server will either reject + it with a NO reply or store the state for the + remainder of the current session only. The + PERMANENTFLAGS list can also include the special + flag \*, which indicates that it is possible to + create new keywords by attempting to store those + flags in the mailbox. + + READ-ONLY The mailbox is selected read-only, or its access + while selected has changed from read-write to + read-only. + + READ-WRITE The mailbox is selected read-write, or its access + while selected has changed from read-only to + read-write. + + + + + + + +Crispin Standards Track [Page 50] + +RFC 2060 IMAP4rev1 December 1996 + + + TRYCREATE An APPEND or COPY attempt is failing because the + target mailbox does not exist (as opposed to some + other reason). This is a hint to the client that + the operation can succeed if the mailbox is first + created by the CREATE command. + + UIDVALIDITY Followed by a decimal number, indicates the unique + identifier validity value. + + UNSEEN Followed by a decimal number, indicates the number + of the first message without the \Seen flag set. + + Additional response codes defined by particular client or server + implementations SHOULD be prefixed with an "X" until they are + added to a revision of this protocol. Client implementations + SHOULD ignore response codes that they do not recognize. + +7.1.1. OK Response + + Contents: OPTIONAL response code + human-readable text + + The OK response indicates an information message from the server. + When tagged, it indicates successful completion of the associated + command. The human-readable text MAY be presented to the user as + an information message. The untagged form indicates an + information-only message; the nature of the information MAY be + indicated by a response code. + + The untagged form is also used as one of three possible greetings + at connection startup. It indicates that the connection is not + yet authenticated and that a LOGIN command is needed. + + Example: S: * OK IMAP4rev1 server ready + C: A001 LOGIN fred blurdybloop + S: * OK [ALERT] System shutdown in 10 minutes + S: A001 OK LOGIN Completed + +7.1.2. NO Response + + Contents: OPTIONAL response code + human-readable text + + The NO response indicates an operational error message from the + server. When tagged, it indicates unsuccessful completion of the + associated command. The untagged form indicates a warning; the + command can still complete successfully. The human-readable text + describes the condition. + + + +Crispin Standards Track [Page 51] + +RFC 2060 IMAP4rev1 December 1996 + + + Example: C: A222 COPY 1:2 owatagusiam + S: * NO Disk is 98% full, please delete unnecessary data + S: A222 OK COPY completed + C: A223 COPY 3:200 blurdybloop + S: * NO Disk is 98% full, please delete unnecessary data + S: * NO Disk is 99% full, please delete unnecessary data + S: A223 NO COPY failed: disk is full + +7.1.3. BAD Response + + Contents: OPTIONAL response code + human-readable text + + The BAD response indicates an error message from the server. When + tagged, it reports a protocol-level error in the client's command; + the tag indicates the command that caused the error. The untagged + form indicates a protocol-level error for which the associated + command can not be determined; it can also indicate an internal + server failure. The human-readable text describes the condition. + + Example: C: ...very long command line... + S: * BAD Command line too long + C: ...empty line... + S: * BAD Empty command line + C: A443 EXPUNGE + S: * BAD Disk crash, attempting salvage to a new disk! + S: * OK Salvage successful, no data lost + S: A443 OK Expunge completed + +7.1.4. PREAUTH Response + + Contents: OPTIONAL response code + human-readable text + + The PREAUTH response is always untagged, and is one of three + possible greetings at connection startup. It indicates that the + connection has already been authenticated by external means and + thus no LOGIN command is needed. + + Example: S: * PREAUTH IMAP4rev1 server logged in as Smith + +7.1.5. BYE Response + + Contents: OPTIONAL response code + human-readable text + + + + + + +Crispin Standards Track [Page 52] + +RFC 2060 IMAP4rev1 December 1996 + + + The BYE response is always untagged, and indicates that the server + is about to close the connection. The human-readable text MAY be + displayed to the user in a status report by the client. The BYE + response is sent under one of four conditions: + + 1) as part of a normal logout sequence. The server will close + the connection after sending the tagged OK response to the + LOGOUT command. + + 2) as a panic shutdown announcement. The server closes the + connection immediately. + + 3) as an announcement of an inactivity autologout. The server + closes the connection immediately. + + 4) as one of three possible greetings at connection startup, + indicating that the server is not willing to accept a + connection from this client. The server closes the + connection immediately. + + The difference between a BYE that occurs as part of a normal + LOGOUT sequence (the first case) and a BYE that occurs because of + a failure (the other three cases) is that the connection closes + immediately in the failure case. + + Example: S: * BYE Autologout; idle for too long + +7.2. Server Responses - Server and Mailbox Status + + These responses are always untagged. This is how server and mailbox + status data are transmitted from the server to the client. Many of + these responses typically result from a command with the same name. + +7.2.1. CAPABILITY Response + + Contents: capability listing + + The CAPABILITY response occurs as a result of a CAPABILITY + command. The capability listing contains a space-separated + listing of capability names that the server supports. The + capability listing MUST include the atom "IMAP4rev1". + + A capability name which begins with "AUTH=" indicates that the + server supports that particular authentication mechanism. + + + + + + + +Crispin Standards Track [Page 53] + +RFC 2060 IMAP4rev1 December 1996 + + + Other capability names indicate that the server supports an + extension, revision, or amendment to the IMAP4rev1 protocol. + Server responses MUST conform to this document until the client + issues a command that uses the associated capability. + + Capability names MUST either begin with "X" or be standard or + standards-track IMAP4rev1 extensions, revisions, or amendments + registered with IANA. A server MUST NOT offer unregistered or + non-standard capability names, unless such names are prefixed with + an "X". + + Client implementations SHOULD NOT require any capability name + other than "IMAP4rev1", and MUST ignore any unknown capability + names. + + Example: S: * CAPABILITY IMAP4rev1 AUTH=KERBEROS_V4 XPIG-LATIN + +7.2.2. LIST Response + + Contents: name attributes + hierarchy delimiter + name + + The LIST response occurs as a result of a LIST command. It + returns a single name that matches the LIST specification. There + can be multiple LIST responses for a single LIST command. + + Four name attributes are defined: + + \Noinferiors It is not possible for any child levels of + hierarchy to exist under this name; no child levels + exist now and none can be created in the future. + + \Noselect It is not possible to use this name as a selectable + mailbox. + + \Marked The mailbox has been marked "interesting" by the + server; the mailbox probably contains messages that + have been added since the last time the mailbox was + selected. + + \Unmarked The mailbox does not contain any additional + messages since the last time the mailbox was + selected. + + If it is not feasible for the server to determine whether the + mailbox is "interesting" or not, or if the name is a \Noselect + name, the server SHOULD NOT send either \Marked or \Unmarked. + + + +Crispin Standards Track [Page 54] + +RFC 2060 IMAP4rev1 December 1996 + + + The hierarchy delimiter is a character used to delimit levels of + hierarchy in a mailbox name. A client can use it to create child + mailboxes, and to search higher or lower levels of naming + hierarchy. All children of a top-level hierarchy node MUST use + the same separator character. A NIL hierarchy delimiter means + that no hierarchy exists; the name is a "flat" name. + + The name represents an unambiguous left-to-right hierarchy, and + MUST be valid for use as a reference in LIST and LSUB commands. + Unless \Noselect is indicated, the name MUST also be valid as an + argument for commands, such as SELECT, that accept mailbox + names. + + Example: S: * LIST (\Noselect) "/" ~/Mail/foo + +7.2.3. LSUB Response + + Contents: name attributes + hierarchy delimiter + name + + The LSUB response occurs as a result of an LSUB command. It + returns a single name that matches the LSUB specification. There + can be multiple LSUB responses for a single LSUB command. The + data is identical in format to the LIST response. + + Example: S: * LSUB () "." #news.comp.mail.misc + +7.2.4 STATUS Response + + Contents: name + status parenthesized list + + The STATUS response occurs as a result of an STATUS command. It + returns the mailbox name that matches the STATUS specification and + the requested mailbox status information. + + Example: S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) + +7.2.5. SEARCH Response + + Contents: zero or more numbers + + + + + + + + + +Crispin Standards Track [Page 55] + +RFC 2060 IMAP4rev1 December 1996 + + + The SEARCH response occurs as a result of a SEARCH or UID SEARCH + command. The number(s) refer to those messages that match the + search criteria. For SEARCH, these are message sequence numbers; + for UID SEARCH, these are unique identifiers. Each number is + delimited by a space. + + Example: S: * SEARCH 2 3 6 + +7.2.6. FLAGS Response + + Contents: flag parenthesized list + + The FLAGS response occurs as a result of a SELECT or EXAMINE + command. The flag parenthesized list identifies the flags (at a + minimum, the system-defined flags) that are applicable for this + mailbox. Flags other than the system flags can also exist, + depending on server implementation. + + The update from the FLAGS response MUST be recorded by the client. + + Example: S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) + +7.3. Server Responses - Mailbox Size + + These responses are always untagged. This is how changes in the size + of the mailbox are trasnmitted from the server to the client. + Immediately following the "*" token is a number that represents a + message count. + +7.3.1. EXISTS Response + + Contents: none + + The EXISTS response reports the number of messages in the mailbox. + This response occurs as a result of a SELECT or EXAMINE command, + and if the size of the mailbox changes (e.g. new mail). + + The update from the EXISTS response MUST be recorded by the + client. + + Example: S: * 23 EXISTS + + + + + + + + + + +Crispin Standards Track [Page 56] + +RFC 2060 IMAP4rev1 December 1996 + + +7.3.2. RECENT Response + + Contents: none + + The RECENT response reports the number of messages with the + \Recent flag set. This response occurs as a result of a SELECT or + EXAMINE command, and if the size of the mailbox changes (e.g. new + mail). + + Note: It is not guaranteed that the message sequence numbers of + recent messages will be a contiguous range of the highest n + messages in the mailbox (where n is the value reported by the + RECENT response). Examples of situations in which this is not + the case are: multiple clients having the same mailbox open + (the first session to be notified will see it as recent, others + will probably see it as non-recent), and when the mailbox is + re-ordered by a non-IMAP agent. + + The only reliable way to identify recent messages is to look at + message flags to see which have the \Recent flag set, or to do + a SEARCH RECENT. + + The update from the RECENT response MUST be recorded by the + client. + + Example: S: * 5 RECENT + +7.4. Server Responses - Message Status + + These responses are always untagged. This is how message data are + transmitted from the server to the client, often as a result of a + command with the same name. Immediately following the "*" token is a + number that represents a message sequence number. + +7.4.1. EXPUNGE Response + + Contents: none + + The EXPUNGE response reports that the specified message sequence + number has been permanently removed from the mailbox. The message + sequence number for each successive message in the mailbox is + immediately decremented by 1, and this decrement is reflected in + message sequence numbers in subsequent responses (including other + untagged EXPUNGE responses). + + As a result of the immediate decrement rule, message sequence + numbers that appear in a set of successive EXPUNGE responses + depend upon whether the messages are removed starting from lower + + + +Crispin Standards Track [Page 57] + +RFC 2060 IMAP4rev1 December 1996 + + + numbers to higher numbers, or from higher numbers to lower + numbers. For example, if the last 5 messages in a 9-message + mailbox are expunged; a "lower to higher" server will send five + untagged EXPUNGE responses for message sequence number 5, whereas + a "higher to lower server" will send successive untagged EXPUNGE + responses for message sequence numbers 9, 8, 7, 6, and 5. + + An EXPUNGE response MUST NOT be sent when no command is in + progress; nor while responding to a FETCH, STORE, or SEARCH + command. This rule is necessary to prevent a loss of + synchronization of message sequence numbers between client and + server. + + The update from the EXPUNGE response MUST be recorded by the + client. + + Example: S: * 44 EXPUNGE + +7.4.2. FETCH Response + + Contents: message data + + The FETCH response returns data about a message to the client. + The data are pairs of data item names and their values in + parentheses. This response occurs as the result of a FETCH or + STORE command, as well as by unilateral server decision (e.g. flag + updates). + + The current data items are: + + BODY A form of BODYSTRUCTURE without extension data. + + BODY[<section>]<<origin_octet>> + A string expressing the body contents of the + specified section. The string SHOULD be + interpreted by the client according to the content + transfer encoding, body type, and subtype. + + If the origin octet is specified, this string is a + substring of the entire body contents, starting at + that origin octet. This means that BODY[]<0> MAY + be truncated, but BODY[] is NEVER truncated. + + 8-bit textual data is permitted if a [CHARSET] + identifier is part of the body parameter + parenthesized list for this section. Note that + headers (part specifiers HEADER or MIME, or the + header portion of a MESSAGE/RFC822 part), MUST be + + + +Crispin Standards Track [Page 58] + +RFC 2060 IMAP4rev1 December 1996 + + + 7-bit; 8-bit characters are not permitted in + headers. Note also that the blank line at the end + of the header is always included in header data. + + Non-textual data such as binary data MUST be + transfer encoded into a textual form such as BASE64 + prior to being sent to the client. To derive the + original binary data, the client MUST decode the + transfer encoded string. + + BODYSTRUCTURE A parenthesized list that describes the [MIME-IMB] + body structure of a message. This is computed by + the server by parsing the [MIME-IMB] header fields, + defaulting various fields as necessary. + + For example, a simple text message of 48 lines and + 2279 octets can have a body structure of: ("TEXT" + "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 2279 + 48) + + Multiple parts are indicated by parenthesis + nesting. Instead of a body type as the first + element of the parenthesized list there is a nested + body. The second element of the parenthesized list + is the multipart subtype (mixed, digest, parallel, + alternative, etc.). + + For example, a two part message consisting of a + text and a BASE645-encoded text attachment can have + a body structure of: (("TEXT" "PLAIN" ("CHARSET" + "US-ASCII") NIL NIL "7BIT" 1152 23)("TEXT" "PLAIN" + ("CHARSET" "US-ASCII" "NAME" "cc.diff") + "<960723163407.20117h@cac.washington.edu>" + "Compiler diff" "BASE64" 4554 73) "MIXED")) + + Extension data follows the multipart subtype. + Extension data is never returned with the BODY + fetch, but can be returned with a BODYSTRUCTURE + fetch. Extension data, if present, MUST be in the + defined order. + + The extension data of a multipart body part are in + the following order: + + body parameter parenthesized list + A parenthesized list of attribute/value pairs + [e.g. ("foo" "bar" "baz" "rag") where "bar" is + the value of "foo" and "rag" is the value of + + + +Crispin Standards Track [Page 59] + +RFC 2060 IMAP4rev1 December 1996 + + + "baz"] as defined in [MIME-IMB]. + + body disposition + A parenthesized list, consisting of a + disposition type string followed by a + parenthesized list of disposition + attribute/value pairs. The disposition type and + attribute names will be defined in a future + standards-track revision to [DISPOSITION]. + + body language + A string or parenthesized list giving the body + language value as defined in [LANGUAGE-TAGS]. + + Any following extension data are not yet defined in + this version of the protocol. Such extension data + can consist of zero or more NILs, strings, numbers, + or potentially nested parenthesized lists of such + data. Client implementations that do a + BODYSTRUCTURE fetch MUST be prepared to accept such + extension data. Server implementations MUST NOT + send such extension data until it has been defined + by a revision of this protocol. + + The basic fields of a non-multipart body part are + in the following order: + + body type + A string giving the content media type name as + defined in [MIME-IMB]. + + body subtype + A string giving the content subtype name as + defined in [MIME-IMB]. + + body parameter parenthesized list + A parenthesized list of attribute/value pairs + [e.g. ("foo" "bar" "baz" "rag") where "bar" is + the value of "foo" and "rag" is the value of + "baz"] as defined in [MIME-IMB]. + + body id + A string giving the content id as defined in + [MIME-IMB]. + + body description + A string giving the content description as + defined in [MIME-IMB]. + + + +Crispin Standards Track [Page 60] + +RFC 2060 IMAP4rev1 December 1996 + + + body encoding + A string giving the content transfer encoding as + defined in [MIME-IMB]. + + body size + A number giving the size of the body in octets. + Note that this size is the size in its transfer + encoding and not the resulting size after any + decoding. + + A body type of type MESSAGE and subtype RFC822 + contains, immediately after the basic fields, the + envelope structure, body structure, and size in + text lines of the encapsulated message. + + A body type of type TEXT contains, immediately + after the basic fields, the size of the body in + text lines. Note that this size is the size in its + content transfer encoding and not the resulting + size after any decoding. + + Extension data follows the basic fields and the + type-specific fields listed above. Extension data + is never returned with the BODY fetch, but can be + returned with a BODYSTRUCTURE fetch. Extension + data, if present, MUST be in the defined order. + + The extension data of a non-multipart body part are + in the following order: + + body MD5 + A string giving the body MD5 value as defined in + [MD5]. + + body disposition + A parenthesized list with the same content and + function as the body disposition for a multipart + body part. + + body language + A string or parenthesized list giving the body + language value as defined in [LANGUAGE-TAGS]. + + Any following extension data are not yet defined in + this version of the protocol, and would be as + described above under multipart extension data. + + + + + +Crispin Standards Track [Page 61] + +RFC 2060 IMAP4rev1 December 1996 + + + ENVELOPE A parenthesized list that describes the envelope + structure of a message. This is computed by the + server by parsing the [RFC-822] header into the + component parts, defaulting various fields as + necessary. + + The fields of the envelope structure are in the + following order: date, subject, from, sender, + reply-to, to, cc, bcc, in-reply-to, and message-id. + The date, subject, in-reply-to, and message-id + fields are strings. The from, sender, reply-to, + to, cc, and bcc fields are parenthesized lists of + address structures. + + An address structure is a parenthesized list that + describes an electronic mail address. The fields + of an address structure are in the following order: + personal name, [SMTP] at-domain-list (source + route), mailbox name, and host name. + + [RFC-822] group syntax is indicated by a special + form of address structure in which the host name + field is NIL. If the mailbox name field is also + NIL, this is an end of group marker (semi-colon in + RFC 822 syntax). If the mailbox name field is + non-NIL, this is a start of group marker, and the + mailbox name field holds the group name phrase. + + Any field of an envelope or address structure that + is not applicable is presented as NIL. Note that + the server MUST default the reply-to and sender + fields from the from field; a client is not + expected to know to do this. + + FLAGS A parenthesized list of flags that are set for this + message. + + INTERNALDATE A string representing the internal date of the + message. + + RFC822 Equivalent to BODY[]. + + RFC822.HEADER Equivalent to BODY.PEEK[HEADER]. + + RFC822.SIZE A number expressing the [RFC-822] size of the + message. + + RFC822.TEXT Equivalent to BODY[TEXT]. + + + +Crispin Standards Track [Page 62] + +RFC 2060 IMAP4rev1 December 1996 + + + UID A number expressing the unique identifier of the + message. + + + Example: S: * 23 FETCH (FLAGS (\Seen) RFC822.SIZE 44827) + +7.5. Server Responses - Command Continuation Request + + The command continuation request response is indicated by a "+" token + instead of a tag. This form of response indicates that the server is + ready to accept the continuation of a command from the client. The + remainder of this response is a line of text. + + This response is used in the AUTHORIZATION command to transmit server + data to the client, and request additional client data. This + response is also used if an argument to any command is a literal. + + The client is not permitted to send the octets of the literal unless + the server indicates that it expects it. This permits the server to + process commands and reject errors on a line-by-line basis. The + remainder of the command, including the CRLF that terminates a + command, follows the octets of the literal. If there are any + additional command arguments the literal octets are followed by a + space and those arguments. + + Example: C: A001 LOGIN {11} + S: + Ready for additional command text + C: FRED FOOBAR {7} + S: + Ready for additional command text + C: fat man + S: A001 OK LOGIN completed + C: A044 BLURDYBLOOP {102856} + S: A044 BAD No such command as "BLURDYBLOOP" + +8. Sample IMAP4rev1 connection + + The following is a transcript of an IMAP4rev1 connection. A long + line in this sample is broken for editorial clarity. + +S: * OK IMAP4rev1 Service Ready +C: a001 login mrc secret +S: a001 OK LOGIN completed +C: a002 select inbox +S: * 18 EXISTS +S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) +S: * 2 RECENT +S: * OK [UNSEEN 17] Message 17 is the first unseen message +S: * OK [UIDVALIDITY 3857529045] UIDs valid + + + +Crispin Standards Track [Page 63] + +RFC 2060 IMAP4rev1 December 1996 + + +S: a002 OK [READ-WRITE] SELECT completed +C: a003 fetch 12 full +S: * 12 FETCH (FLAGS (\Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700" + RFC822.SIZE 4286 ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)" + "IMAP4rev1 WG mtg summary and minutes" + (("Terry Gray" NIL "gray" "cac.washington.edu")) + (("Terry Gray" NIL "gray" "cac.washington.edu")) + (("Terry Gray" NIL "gray" "cac.washington.edu")) + ((NIL NIL "imap" "cac.washington.edu")) + ((NIL NIL "minutes" "CNRI.Reston.VA.US") + ("John Klensin" NIL "KLENSIN" "INFOODS.MIT.EDU")) NIL NIL + "<B27397-0100000@cac.washington.edu>") + BODY ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 3028 92)) +S: a003 OK FETCH completed +C: a004 fetch 12 body[header] +S: * 12 FETCH (BODY[HEADER] {350} +S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT) +S: From: Terry Gray <gray@cac.washington.edu> +S: Subject: IMAP4rev1 WG mtg summary and minutes +S: To: imap@cac.washington.edu +S: cc: minutes@CNRI.Reston.VA.US, John Klensin <KLENSIN@INFOODS.MIT.EDU> +S: Message-Id: <B27397-0100000@cac.washington.edu> +S: MIME-Version: 1.0 +S: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII +S: +S: ) +S: a004 OK FETCH completed +C: a005 store 12 +flags \deleted +S: * 12 FETCH (FLAGS (\Seen \Deleted)) +S: a005 OK +FLAGS completed +C: a006 logout +S: * BYE IMAP4rev1 server terminating connection +S: a006 OK LOGOUT completed + +9. Formal Syntax + + The following syntax specification uses the augmented Backus-Naur + Form (BNF) notation as specified in [RFC-822] with one exception; the + delimiter used with the "#" construct is a single space (SPACE) and + not one or more commas. + + In the case of alternative or optional rules in which a later rule + overlaps an earlier rule, the rule which is listed earlier MUST take + priority. For example, "\Seen" when parsed as a flag is the \Seen + flag name and not a flag_extension, even though "\Seen" could be + parsed as a flag_extension. Some, but not all, instances of this + rule are noted below. + + + + +Crispin Standards Track [Page 64] + +RFC 2060 IMAP4rev1 December 1996 + + + Except as noted otherwise, all alphabetic characters are case- + insensitive. The use of upper or lower case characters to define + token strings is for editorial clarity only. Implementations MUST + accept these strings in a case-insensitive fashion. + +address ::= "(" addr_name SPACE addr_adl SPACE addr_mailbox + SPACE addr_host ")" + +addr_adl ::= nstring + ;; Holds route from [RFC-822] route-addr if + ;; non-NIL + +addr_host ::= nstring + ;; NIL indicates [RFC-822] group syntax. + ;; Otherwise, holds [RFC-822] domain name + +addr_mailbox ::= nstring + ;; NIL indicates end of [RFC-822] group; if + ;; non-NIL and addr_host is NIL, holds + ;; [RFC-822] group name. + ;; Otherwise, holds [RFC-822] local-part + +addr_name ::= nstring + ;; Holds phrase from [RFC-822] mailbox if + ;; non-NIL + +alpha ::= "A" / "B" / "C" / "D" / "E" / "F" / "G" / "H" / + "I" / "J" / "K" / "L" / "M" / "N" / "O" / "P" / + "Q" / "R" / "S" / "T" / "U" / "V" / "W" / "X" / + "Y" / "Z" / + "a" / "b" / "c" / "d" / "e" / "f" / "g" / "h" / + "i" / "j" / "k" / "l" / "m" / "n" / "o" / "p" / + "q" / "r" / "s" / "t" / "u" / "v" / "w" / "x" / + "y" / "z" + ;; Case-sensitive + +append ::= "APPEND" SPACE mailbox [SPACE flag_list] + [SPACE date_time] SPACE literal + +astring ::= atom / string + +atom ::= 1*ATOM_CHAR + +ATOM_CHAR ::= <any CHAR except atom_specials> + +atom_specials ::= "(" / ")" / "{" / SPACE / CTL / list_wildcards / + quoted_specials + + + + +Crispin Standards Track [Page 65] + +RFC 2060 IMAP4rev1 December 1996 + + +authenticate ::= "AUTHENTICATE" SPACE auth_type *(CRLF base64) + +auth_type ::= atom + ;; Defined by [IMAP-AUTH] + +base64 ::= *(4base64_char) [base64_terminal] + +base64_char ::= alpha / digit / "+" / "/" + +base64_terminal ::= (2base64_char "==") / (3base64_char "=") + +body ::= "(" body_type_1part / body_type_mpart ")" + +body_extension ::= nstring / number / "(" 1#body_extension ")" + ;; Future expansion. Client implementations + ;; MUST accept body_extension fields. Server + ;; implementations MUST NOT generate + ;; body_extension fields except as defined by + ;; future standard or standards-track + ;; revisions of this specification. + +body_ext_1part ::= body_fld_md5 [SPACE body_fld_dsp + [SPACE body_fld_lang + [SPACE 1#body_extension]]] + ;; MUST NOT be returned on non-extensible + ;; "BODY" fetch + +body_ext_mpart ::= body_fld_param + [SPACE body_fld_dsp SPACE body_fld_lang + [SPACE 1#body_extension]] + ;; MUST NOT be returned on non-extensible + ;; "BODY" fetch + +body_fields ::= body_fld_param SPACE body_fld_id SPACE + body_fld_desc SPACE body_fld_enc SPACE + body_fld_octets + +body_fld_desc ::= nstring + +body_fld_dsp ::= "(" string SPACE body_fld_param ")" / nil + +body_fld_enc ::= (<"> ("7BIT" / "8BIT" / "BINARY" / "BASE64"/ + "QUOTED-PRINTABLE") <">) / string + +body_fld_id ::= nstring + +body_fld_lang ::= nstring / "(" 1#string ")" + + + + +Crispin Standards Track [Page 66] + +RFC 2060 IMAP4rev1 December 1996 + + +body_fld_lines ::= number + +body_fld_md5 ::= nstring + +body_fld_octets ::= number + +body_fld_param ::= "(" 1#(string SPACE string) ")" / nil + +body_type_1part ::= (body_type_basic / body_type_msg / body_type_text) + [SPACE body_ext_1part] + +body_type_basic ::= media_basic SPACE body_fields + ;; MESSAGE subtype MUST NOT be "RFC822" + +body_type_mpart ::= 1*body SPACE media_subtype + [SPACE body_ext_mpart] + +body_type_msg ::= media_message SPACE body_fields SPACE envelope + SPACE body SPACE body_fld_lines + +body_type_text ::= media_text SPACE body_fields SPACE body_fld_lines + +capability ::= "AUTH=" auth_type / atom + ;; New capabilities MUST begin with "X" or be + ;; registered with IANA as standard or + ;; standards-track + +capability_data ::= "CAPABILITY" SPACE [1#capability SPACE] "IMAP4rev1" + [SPACE 1#capability] + ;; IMAP4rev1 servers which offer RFC 1730 + ;; compatibility MUST list "IMAP4" as the first + ;; capability. + +CHAR ::= <any 7-bit US-ASCII character except NUL, + 0x01 - 0x7f> + +CHAR8 ::= <any 8-bit octet except NUL, 0x01 - 0xff> + +command ::= tag SPACE (command_any / command_auth / + command_nonauth / command_select) CRLF + ;; Modal based on state + +command_any ::= "CAPABILITY" / "LOGOUT" / "NOOP" / x_command + ;; Valid in all states + +command_auth ::= append / create / delete / examine / list / lsub / + rename / select / status / subscribe / unsubscribe + ;; Valid only in Authenticated or Selected state + + + +Crispin Standards Track [Page 67] + +RFC 2060 IMAP4rev1 December 1996 + + +command_nonauth ::= login / authenticate + ;; Valid only when in Non-Authenticated state + +command_select ::= "CHECK" / "CLOSE" / "EXPUNGE" / + copy / fetch / store / uid / search + ;; Valid only when in Selected state + +continue_req ::= "+" SPACE (resp_text / base64) + +copy ::= "COPY" SPACE set SPACE mailbox + +CR ::= <ASCII CR, carriage return, 0x0D> + +create ::= "CREATE" SPACE mailbox + ;; Use of INBOX gives a NO error + +CRLF ::= CR LF + +CTL ::= <any ASCII control character and DEL, + 0x00 - 0x1f, 0x7f> + +date ::= date_text / <"> date_text <"> + +date_day ::= 1*2digit + ;; Day of month + +date_day_fixed ::= (SPACE digit) / 2digit + ;; Fixed-format version of date_day + +date_month ::= "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / + "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec" + +date_text ::= date_day "-" date_month "-" date_year + +date_year ::= 4digit + +date_time ::= <"> date_day_fixed "-" date_month "-" date_year + SPACE time SPACE zone <"> + +delete ::= "DELETE" SPACE mailbox + ;; Use of INBOX gives a NO error + +digit ::= "0" / digit_nz + +digit_nz ::= "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / + "9" + + + + + +Crispin Standards Track [Page 68] + +RFC 2060 IMAP4rev1 December 1996 + + +envelope ::= "(" env_date SPACE env_subject SPACE env_from + SPACE env_sender SPACE env_reply_to SPACE env_to + SPACE env_cc SPACE env_bcc SPACE env_in_reply_to + SPACE env_message_id ")" + +env_bcc ::= "(" 1*address ")" / nil + +env_cc ::= "(" 1*address ")" / nil + +env_date ::= nstring + +env_from ::= "(" 1*address ")" / nil + +env_in_reply_to ::= nstring + +env_message_id ::= nstring + +env_reply_to ::= "(" 1*address ")" / nil + +env_sender ::= "(" 1*address ")" / nil + +env_subject ::= nstring + +env_to ::= "(" 1*address ")" / nil + +examine ::= "EXAMINE" SPACE mailbox + +fetch ::= "FETCH" SPACE set SPACE ("ALL" / "FULL" / + "FAST" / fetch_att / "(" 1#fetch_att ")") + +fetch_att ::= "ENVELOPE" / "FLAGS" / "INTERNALDATE" / + "RFC822" [".HEADER" / ".SIZE" / ".TEXT"] / + "BODY" ["STRUCTURE"] / "UID" / + "BODY" [".PEEK"] section + ["<" number "." nz_number ">"] + +flag ::= "\Answered" / "\Flagged" / "\Deleted" / + "\Seen" / "\Draft" / flag_keyword / flag_extension + +flag_extension ::= "\" atom + ;; Future expansion. Client implementations + ;; MUST accept flag_extension flags. Server + ;; implementations MUST NOT generate + ;; flag_extension flags except as defined by + ;; future standard or standards-track + ;; revisions of this specification. + +flag_keyword ::= atom + + + +Crispin Standards Track [Page 69] + +RFC 2060 IMAP4rev1 December 1996 + + +flag_list ::= "(" #flag ")" + +greeting ::= "*" SPACE (resp_cond_auth / resp_cond_bye) CRLF + +header_fld_name ::= astring + +header_list ::= "(" 1#header_fld_name ")" + +LF ::= <ASCII LF, line feed, 0x0A> + +list ::= "LIST" SPACE mailbox SPACE list_mailbox + +list_mailbox ::= 1*(ATOM_CHAR / list_wildcards) / string + +list_wildcards ::= "%" / "*" + +literal ::= "{" number "}" CRLF *CHAR8 + ;; Number represents the number of CHAR8 octets + +login ::= "LOGIN" SPACE userid SPACE password + +lsub ::= "LSUB" SPACE mailbox SPACE list_mailbox + +mailbox ::= "INBOX" / astring + ;; INBOX is case-insensitive. All case variants of + ;; INBOX (e.g. "iNbOx") MUST be interpreted as INBOX + ;; not as an astring. Refer to section 5.1 for + ;; further semantic details of mailbox names. + +mailbox_data ::= "FLAGS" SPACE flag_list / + "LIST" SPACE mailbox_list / + "LSUB" SPACE mailbox_list / + "MAILBOX" SPACE text / + "SEARCH" [SPACE 1#nz_number] / + "STATUS" SPACE mailbox SPACE + "(" #<status_att number ")" / + number SPACE "EXISTS" / number SPACE "RECENT" + +mailbox_list ::= "(" #("\Marked" / "\Noinferiors" / + "\Noselect" / "\Unmarked" / flag_extension) ")" + SPACE (<"> QUOTED_CHAR <"> / nil) SPACE mailbox + +media_basic ::= (<"> ("APPLICATION" / "AUDIO" / "IMAGE" / + "MESSAGE" / "VIDEO") <">) / string) + SPACE media_subtype + ;; Defined in [MIME-IMT] + +media_message ::= <"> "MESSAGE" <"> SPACE <"> "RFC822" <"> + + + +Crispin Standards Track [Page 70] + +RFC 2060 IMAP4rev1 December 1996 + + + ;; Defined in [MIME-IMT] + +media_subtype ::= string + ;; Defined in [MIME-IMT] + +media_text ::= <"> "TEXT" <"> SPACE media_subtype + ;; Defined in [MIME-IMT] + +message_data ::= nz_number SPACE ("EXPUNGE" / + ("FETCH" SPACE msg_att)) + +msg_att ::= "(" 1#("ENVELOPE" SPACE envelope / + "FLAGS" SPACE "(" #(flag / "\Recent") ")" / + "INTERNALDATE" SPACE date_time / + "RFC822" [".HEADER" / ".TEXT"] SPACE nstring / + "RFC822.SIZE" SPACE number / + "BODY" ["STRUCTURE"] SPACE body / + "BODY" section ["<" number ">"] SPACE nstring / + "UID" SPACE uniqueid) ")" + +nil ::= "NIL" + +nstring ::= string / nil + +number ::= 1*digit + ;; Unsigned 32-bit integer + ;; (0 <= n < 4,294,967,296) + +nz_number ::= digit_nz *digit + ;; Non-zero unsigned 32-bit integer + ;; (0 < n < 4,294,967,296) + +password ::= astring + +quoted ::= <"> *QUOTED_CHAR <"> + +QUOTED_CHAR ::= <any TEXT_CHAR except quoted_specials> / + "\" quoted_specials + +quoted_specials ::= <"> / "\" + +rename ::= "RENAME" SPACE mailbox SPACE mailbox + ;; Use of INBOX as a destination gives a NO error + +response ::= *(continue_req / response_data) response_done + +response_data ::= "*" SPACE (resp_cond_state / resp_cond_bye / + mailbox_data / message_data / capability_data) + + + +Crispin Standards Track [Page 71] + +RFC 2060 IMAP4rev1 December 1996 + + + CRLF + +response_done ::= response_tagged / response_fatal + +response_fatal ::= "*" SPACE resp_cond_bye CRLF + ;; Server closes connection immediately + +response_tagged ::= tag SPACE resp_cond_state CRLF + +resp_cond_auth ::= ("OK" / "PREAUTH") SPACE resp_text + ;; Authentication condition + +resp_cond_bye ::= "BYE" SPACE resp_text + +resp_cond_state ::= ("OK" / "NO" / "BAD") SPACE resp_text + ;; Status condition + +resp_text ::= ["[" resp_text_code "]" SPACE] (text_mime2 / text) + ;; text SHOULD NOT begin with "[" or "=" + +resp_text_code ::= "ALERT" / "PARSE" / + "PERMANENTFLAGS" SPACE "(" #(flag / "\*") ")" / + "READ-ONLY" / "READ-WRITE" / "TRYCREATE" / + "UIDVALIDITY" SPACE nz_number / + "UNSEEN" SPACE nz_number / + atom [SPACE 1*<any TEXT_CHAR except "]">] + +search ::= "SEARCH" SPACE ["CHARSET" SPACE astring SPACE] + 1#search_key + ;; [CHARSET] MUST be registered with IANA + +search_key ::= "ALL" / "ANSWERED" / "BCC" SPACE astring / + "BEFORE" SPACE date / "BODY" SPACE astring / + "CC" SPACE astring / "DELETED" / "FLAGGED" / + "FROM" SPACE astring / + "KEYWORD" SPACE flag_keyword / "NEW" / "OLD" / + "ON" SPACE date / "RECENT" / "SEEN" / + "SINCE" SPACE date / "SUBJECT" SPACE astring / + "TEXT" SPACE astring / "TO" SPACE astring / + "UNANSWERED" / "UNDELETED" / "UNFLAGGED" / + "UNKEYWORD" SPACE flag_keyword / "UNSEEN" / + ;; Above this line were in [IMAP2] + "DRAFT" / + "HEADER" SPACE header_fld_name SPACE astring / + "LARGER" SPACE number / "NOT" SPACE search_key / + "OR" SPACE search_key SPACE search_key / + "SENTBEFORE" SPACE date / "SENTON" SPACE date / + "SENTSINCE" SPACE date / "SMALLER" SPACE number / + + + +Crispin Standards Track [Page 72] + +RFC 2060 IMAP4rev1 December 1996 + + + "UID" SPACE set / "UNDRAFT" / set / + "(" 1#search_key ")" + +section ::= "[" [section_text / (nz_number *["." nz_number] + ["." (section_text / "MIME")])] "]" + +section_text ::= "HEADER" / "HEADER.FIELDS" [".NOT"] + SPACE header_list / "TEXT" + +select ::= "SELECT" SPACE mailbox + +sequence_num ::= nz_number / "*" + ;; * is the largest number in use. For message + ;; sequence numbers, it is the number of messages + ;; in the mailbox. For unique identifiers, it is + ;; the unique identifier of the last message in + ;; the mailbox. + +set ::= sequence_num / (sequence_num ":" sequence_num) / + (set "," set) + ;; Identifies a set of messages. For message + ;; sequence numbers, these are consecutive + ;; numbers from 1 to the number of messages in + ;; the mailbox + ;; Comma delimits individual numbers, colon + ;; delimits between two numbers inclusive. + ;; Example: 2,4:7,9,12:* is 2,4,5,6,7,9,12,13, + ;; 14,15 for a mailbox with 15 messages. + +SPACE ::= <ASCII SP, space, 0x20> + +status ::= "STATUS" SPACE mailbox SPACE "(" 1#status_att ")" + +status_att ::= "MESSAGES" / "RECENT" / "UIDNEXT" / "UIDVALIDITY" / + "UNSEEN" + +store ::= "STORE" SPACE set SPACE store_att_flags + +store_att_flags ::= (["+" / "-"] "FLAGS" [".SILENT"]) SPACE + (flag_list / #flag) + +string ::= quoted / literal + +subscribe ::= "SUBSCRIBE" SPACE mailbox + +tag ::= 1*<any ATOM_CHAR except "+"> + +text ::= 1*TEXT_CHAR + + + +Crispin Standards Track [Page 73] + +RFC 2060 IMAP4rev1 December 1996 + + +text_mime2 ::= "=?" <charset> "?" <encoding> "?" + <encoded-text> "?=" + ;; Syntax defined in [MIME-HDRS] + +TEXT_CHAR ::= <any CHAR except CR and LF> + +time ::= 2digit ":" 2digit ":" 2digit + ;; Hours minutes seconds + +uid ::= "UID" SPACE (copy / fetch / search / store) + ;; Unique identifiers used instead of message + ;; sequence numbers + +uniqueid ::= nz_number + ;; Strictly ascending + +unsubscribe ::= "UNSUBSCRIBE" SPACE mailbox + +userid ::= astring + +x_command ::= "X" atom <experimental command arguments> + +zone ::= ("+" / "-") 4digit + ;; Signed four-digit value of hhmm representing + ;; hours and minutes west of Greenwich (that is, + ;; (the amount that the given time differs from + ;; Universal Time). Subtracting the timezone + ;; from the given time will give the UT form. + ;; The Universal Time zone is "+0000". + +10. Author's Note + + This document is a revision or rewrite of earlier documents, and + supercedes the protocol specification in those documents: RFC 1730, + unpublished IMAP2bis.TXT document, RFC 1176, and RFC 1064. + +11. Security Considerations + + IMAP4rev1 protocol transactions, including electronic mail data, are + sent in the clear over the network unless privacy protection is + negotiated in the AUTHENTICATE command. + + A server error message for an AUTHENTICATE command which fails due to + invalid credentials SHOULD NOT detail why the credentials are + invalid. + + Use of the LOGIN command sends passwords in the clear. This can be + avoided by using the AUTHENTICATE command instead. + + + +Crispin Standards Track [Page 74] + +RFC 2060 IMAP4rev1 December 1996 + + + A server error message for a failing LOGIN command SHOULD NOT specify + that the user name, as opposed to the password, is invalid. + + Additional security considerations are discussed in the section + discussing the AUTHENTICATE and LOGIN commands. + +12. Author's Address + + Mark R. Crispin + Networks and Distributed Computing + University of Washington + 4545 15th Aveneue NE + Seattle, WA 98105-4527 + + Phone: (206) 543-5762 + + EMail: MRC@CAC.Washington.EDU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Crispin Standards Track [Page 75] + +RFC 2060 IMAP4rev1 December 1996 + + +Appendices + +A. References + +[ACAP] Myers, J. "ACAP -- Application Configuration Access Protocol", +Work in Progress. + +[CHARSET] Reynolds, J., and J. Postel, "Assigned Numbers", STD 2, +RFC 1700, USC/Information Sciences Institute, October 1994. + +[DISPOSITION] Troost, R., and Dorner, S., "Communicating Presentation +Information in Internet Messages: The Content-Disposition Header", +RFC 1806, June 1995. + +[IMAP-AUTH] Myers, J., "IMAP4 Authentication Mechanism", RFC 1731. +Carnegie-Mellon University, December 1994. + +[IMAP-COMPAT] Crispin, M., "IMAP4 Compatibility with IMAP2bis", RFC +2061, University of Washington, November 1996. + +[IMAP-DISC] Austein, R., "Synchronization Operations for Disconnected +IMAP4 Clients", Work in Progress. + +[IMAP-HISTORICAL] Crispin, M. "IMAP4 Compatibility with IMAP2 and +IMAP2bis", RFC 1732, University of Washington, December 1994. + +[IMAP-MODEL] Crispin, M., "Distributed Electronic Mail Models in +IMAP4", RFC 1733, University of Washington, December 1994. + +[IMAP-OBSOLETE] Crispin, M., "Internet Message Access Protocol - +Obsolete Syntax", RFC 2062, University of Washington, November 1996. + +[IMAP2] Crispin, M., "Interactive Mail Access Protocol - Version 2", +RFC 1176, University of Washington, August 1990. + +[LANGUAGE-TAGS] Alvestrand, H., "Tags for the Identification of +Languages", RFC 1766, March 1995. + +[MD5] Myers, J., and M. Rose, "The Content-MD5 Header Field", RFC +1864, October 1995. + +[MIME-IMB] Freed, N., and N. Borenstein, "MIME (Multipurpose Internet +Mail Extensions) Part One: Format of Internet Message Bodies", RFC +2045, November 1996. + +[MIME-IMT] Freed, N., and N. Borenstein, "MIME (Multipurpose +Internet Mail Extensions) Part Two: Media Types", RFC 2046, +November 1996. + + + +Crispin Standards Track [Page 76] + +RFC 2060 IMAP4rev1 December 1996 + + +[MIME-HDRS] Moore, K., "MIME (Multipurpose Internet Mail Extensions) +Part Three: Message Header Extensions for Non-ASCII Text", RFC +2047, November 1996. + +[RFC-822] Crocker, D., "Standard for the Format of ARPA Internet Text +Messages", STD 11, RFC 822, University of Delaware, August 1982. + +[SMTP] Postel, J., "Simple Mail Transfer Protocol", STD 10, +RFC 821, USC/Information Sciences Institute, August 1982. + +[UTF-7] Goldsmith, D., and Davis, M., "UTF-7: A Mail-Safe +Transformation Format of Unicode", RFC 1642, July 1994. + +B. Changes from RFC 1730 + +1) The STATUS command has been added. + +2) Clarify in the formal syntax that the "#" construct can never +refer to multiple spaces. + +3) Obsolete syntax has been moved to a separate document. + +4) The PARTIAL command has been obsoleted. + +5) The RFC822.HEADER.LINES, RFC822.HEADER.LINES.NOT, RFC822.PEEK, and +RFC822.TEXT.PEEK fetch attributes have been obsoleted. + +6) The "<" origin "." size ">" suffix for BODY text attributes has +been added. + +7) The HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, MIME, and TEXT part +specifiers have been added. + +8) Support for Content-Disposition and Content-Language has been +added. + +9) The restriction on fetching nested MULTIPART parts has been +removed. + +10) Body part number 0 has been obsoleted. + +11) Server-supported authenticators are now identified by +capabilities. + + + + + + + + +Crispin Standards Track [Page 77] + +RFC 2060 IMAP4rev1 December 1996 + + +12) The capability that identifies this protocol is now called +"IMAP4rev1". A server that provides backwards support for RFC 1730 +SHOULD emit the "IMAP4" capability in addition to "IMAP4rev1" in its +CAPABILITY response. Because RFC-1730 required "IMAP4" to appear as +the first capability, it MUST listed first in the response. + +13) A description of the mailbox name namespace convention has been +added. + +14) A description of the international mailbox name convention has +been added. + +15) The UID-NEXT and UID-VALIDITY status items are now called UIDNEXT +and UIDVALIDITY. This is a change from the IMAP STATUS +Work in Progress and not from RFC-1730 + +16) Add a clarification that a null mailbox name argument to the LIST +command returns an untagged LIST response with the hierarchy +delimiter and root of the reference argument. + +17) Define terms such as "MUST", "SHOULD", and "MUST NOT". + +18) Add a section which defines message attributes and more +thoroughly details the semantics of message sequence numbers, UIDs, +and flags. + +19) Add a clarification detailing the circumstances when a client may +send multiple commands without waiting for a response, and the +circumstances in which ambiguities may result. + +20) Add a recommendation on server behavior for DELETE and RENAME +when inferior hierarchical names of the given name exist. + +21) Add a clarification that a mailbox name may not be unilaterally +unsubscribed by the server, even if that mailbox name no longer +exists. + +22) Add a clarification that LIST should return its results quickly +without undue delay. + +23) Add a clarification that the date_time argument to APPEND sets +the internal date of the message. + +24) Add a clarification on APPEND behavior when the target mailbox is +the currently selected mailbox. + + + + + + +Crispin Standards Track [Page 78] + +RFC 2060 IMAP4rev1 December 1996 + + +25) Add a clarification that external changes to flags should be +always announced via an untagged FETCH even if the current command is +a STORE with the ".SILENT" suffix. + +26) Add a clarification that COPY appends to the target mailbox. + +27) Add the NEWNAME response code. + +28) Rewrite the description of the untagged BYE response to clarify +its semantics. + +29) Change the reference for the body MD5 to refer to the proper RFC. + +30) Clarify that the formal syntax contains rules which may overlap, +and that in the event of such an overlap the rule which occurs first +takes precedence. + +31) Correct the definition of body_fld_param. + +32) More formal syntax for capability_data. + +33) Clarify that any case variant of "INBOX" must be interpreted as +INBOX. + +34) Clarify that the human-readable text in resp_text should not +begin with "[" or "=". + +35) Change MIME references to Draft Standard documents. + +36) Clarify \Recent semantics. + +37) Additional examples. + +C. Key Word Index + + +FLAGS <flag list> (store command data item) ............... 45 + +FLAGS.SILENT <flag list> (store command data item) ........ 46 + -FLAGS <flag list> (store command data item) ............... 46 + -FLAGS.SILENT <flag list> (store command data item) ........ 46 + ALERT (response code) ...................................... 50 + ALL (fetch item) ........................................... 41 + ALL (search key) ........................................... 38 + ANSWERED (search key) ...................................... 38 + APPEND (command) ........................................... 34 + AUTHENTICATE (command) ..................................... 20 + BAD (response) ............................................. 52 + BCC <string> (search key) .................................. 38 + BEFORE <date> (search key) ................................. 39 + + + +Crispin Standards Track [Page 79] + +RFC 2060 IMAP4rev1 December 1996 + + + BODY (fetch item) .......................................... 41 + BODY (fetch result) ........................................ 58 + BODY <string> (search key) ................................. 39 + BODY.PEEK[<section>]<<partial>> (fetch item) ............... 44 + BODYSTRUCTURE (fetch item) ................................. 44 + BODYSTRUCTURE (fetch result) ............................... 59 + BODY[<section>]<<origin_octet>> (fetch result) ............. 58 + BODY[<section>]<<partial>> (fetch item) .................... 41 + BYE (response) ............................................. 52 + Body Structure (message attribute) ......................... 11 + CAPABILITY (command) ....................................... 18 + CAPABILITY (response) ...................................... 53 + CC <string> (search key) ................................... 39 + CHECK (command) ............................................ 36 + CLOSE (command) ............................................ 36 + COPY (command) ............................................. 46 + CREATE (command) ........................................... 25 + DELETE (command) ........................................... 26 + DELETED (search key) ....................................... 39 + DRAFT (search key) ......................................... 39 + ENVELOPE (fetch item) ...................................... 44 + ENVELOPE (fetch result) .................................... 62 + EXAMINE (command) .......................................... 24 + EXISTS (response) .......................................... 56 + EXPUNGE (command) .......................................... 37 + EXPUNGE (response) ......................................... 57 + Envelope Structure (message attribute) ..................... 11 + FAST (fetch item) .......................................... 44 + FETCH (command) ............................................ 41 + FETCH (response) ........................................... 58 + FLAGGED (search key) ....................................... 39 + FLAGS (fetch item) ......................................... 44 + FLAGS (fetch result) ....................................... 62 + FLAGS (response) ........................................... 56 + FLAGS <flag list> (store command data item) ................ 45 + FLAGS.SILENT <flag list> (store command data item) ......... 45 + FROM <string> (search key) ................................. 39 + FULL (fetch item) .......................................... 44 + Flags (message attribute) .................................. 9 + HEADER (part specifier) .................................... 41 + HEADER <field-name> <string> (search key) .................. 39 + HEADER.FIELDS <header_list> (part specifier) ............... 41 + HEADER.FIELDS.NOT <header_list> (part specifier) ........... 41 + INTERNALDATE (fetch item) .................................. 44 + INTERNALDATE (fetch result) ................................ 62 + Internal Date (message attribute) .......................... 10 + KEYWORD <flag> (search key) ................................ 39 + Keyword (type of flag) ..................................... 10 + + + +Crispin Standards Track [Page 80] + +RFC 2060 IMAP4rev1 December 1996 + + + LARGER <n> (search key) .................................... 39 + LIST (command) ............................................. 30 + LIST (response) ............................................ 54 + LOGIN (command) ............................................ 22 + LOGOUT (command) ........................................... 20 + LSUB (command) ............................................. 32 + LSUB (response) ............................................ 55 + MAY (specification requirement term) ....................... 5 + MESSAGES (status item) ..................................... 33 + MIME (part specifier) ...................................... 42 + MUST (specification requirement term) ...................... 4 + MUST NOT (specification requirement term) .................. 4 + Message Sequence Number (message attribute) ................ 9 + NEW (search key) ........................................... 39 + NEWNAME (response code) .................................... 50 + NO (response) .............................................. 51 + NOOP (command) ............................................. 19 + NOT <search-key> (search key) .............................. 39 + OK (response) .............................................. 51 + OLD (search key) ........................................... 39 + ON <date> (search key) ..................................... 39 + OPTIONAL (specification requirement term) .................. 5 + OR <search-key1> <search-key2> (search key) ................ 39 + PARSE (response code) ...................................... 50 + PERMANENTFLAGS (response code) ............................. 50 + PREAUTH (response) ......................................... 52 + Permanent Flag (class of flag) ............................. 10 + READ-ONLY (response code) .................................. 50 + READ-WRITE (response code) ................................. 50 + RECENT (response) .......................................... 57 + RECENT (search key) ........................................ 39 + RECENT (status item) ....................................... 33 + RENAME (command) ........................................... 27 + REQUIRED (specification requirement term) .................. 4 + RFC822 (fetch item) ........................................ 44 + RFC822 (fetch result) ...................................... 63 + RFC822.HEADER (fetch item) ................................. 44 + RFC822.HEADER (fetch result) ............................... 62 + RFC822.SIZE (fetch item) ................................... 44 + RFC822.SIZE (fetch result) ................................. 62 + RFC822.TEXT (fetch item) ................................... 44 + RFC822.TEXT (fetch result) ................................. 62 + SEARCH (command) ........................................... 37 + SEARCH (response) .......................................... 55 + SEEN (search key) .......................................... 40 + SELECT (command) ........................................... 23 + SENTBEFORE <date> (search key) ............................. 40 + SENTON <date> (search key) ................................. 40 + + + +Crispin Standards Track [Page 81] + +RFC 2060 IMAP4rev1 December 1996 + + + SENTSINCE <date> (search key) .............................. 40 + SHOULD (specification requirement term) .................... 5 + SHOULD NOT (specification requirement term) ................ 5 + SINCE <date> (search key) .................................. 40 + SMALLER <n> (search key) ................................... 40 + STATUS (command) ........................................... 33 + STATUS (response) .......................................... 55 + STORE (command) ............................................ 45 + SUBJECT <string> (search key) .............................. 40 + SUBSCRIBE (command) ........................................ 29 + Session Flag (class of flag) ............................... 10 + System Flag (type of flag) ................................. 9 + TEXT (part specifier) ...................................... 42 + TEXT <string> (search key) ................................. 40 + TO <string> (search key) ................................... 40 + TRYCREATE (response code) .................................. 51 + UID (command) .............................................. 47 + UID (fetch item) ........................................... 44 + UID (fetch result) ......................................... 63 + UID <message set> (search key) ............................. 40 + UIDNEXT (status item) ...................................... 33 + UIDVALIDITY (response code) ................................ 51 + UIDVALIDITY (status item) .................................. 34 + UNANSWERED (search key) .................................... 40 + UNDELETED (search key) ..................................... 40 + UNDRAFT (search key) ....................................... 40 + UNFLAGGED (search key) ..................................... 40 + UNKEYWORD <flag> (search key) .............................. 40 + UNSEEN (response code) ..................................... 51 + UNSEEN (search key) ........................................ 40 + UNSEEN (status item) ....................................... 34 + UNSUBSCRIBE (command) ...................................... 30 + Unique Identifier (UID) (message attribute) ................ 7 + X<atom> (command) .......................................... 48 + [RFC-822] Size (message attribute) ......................... 11 + \Answered (system flag) .................................... 9 + \Deleted (system flag) ..................................... 9 + \Draft (system flag) ....................................... 9 + \Flagged (system flag) ..................................... 9 + \Marked (mailbox name attribute) ........................... 54 + \Noinferiors (mailbox name attribute) ...................... 54 + \Noselect (mailbox name attribute) ......................... 54 + \Recent (system flag) ...................................... 10 + \Seen (system flag) ........................................ 9 + \Unmarked (mailbox name attribute) ......................... 54 + + + + + + +Crispin Standards Track [Page 82] + diff --git a/doc/rfc2061.txt b/doc/rfc2061.txt @@ -0,0 +1,171 @@ + + + + + + +Network Working Group M. Crispin +Request for Comments: 2061 University of Washington +Category: Informational December 1996 + + + IMAP4 COMPATIBILITY WITH IMAP2BIS + +Status of this Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +Introduction + + The Internet Message Access Protocol (IMAP) has been through several + revisions and variants in its 10-year history. Many of these are + either extinct or extremely rare; in particular, several undocumented + variants and the variants described in RFC 1064, RFC 1176, and RFC + 1203 fall into this category. + + One variant, IMAP2bis, is at the time of this writing very common and + has been widely distributed with the Pine mailer. Unfortunately, + there is no definite document describing IMAP2bis. This document is + intended to be read along with RFC 1176 and the most recent IMAP4 + specification (RFC 2060) to assist implementors in creating an IMAP4 + implementation to interoperate with implementations that conform to + earlier specifications. Nothing in this document is required by the + IMAP4 specification; implementors must decide for themselves whether + they want their implementation to fail if it encounters old software. + + At the time of this writing, IMAP4 has been updated from the version + described in RFC 1730. An implementor who wishes to interoperate + with both RFC 1730 and RFC 2060 should refer to both documents. + + This information is not complete; it reflects current knowledge of + server and client implementations as well as "folklore" acquired in + the evolution of the protocol. It is NOT a description of how to + interoperate with all variants of IMAP, but rather with the old + variant that is most likely to be encountered. For detailed + information on interoperating with other old variants, refer to RFC + 1732. + +IMAP4 client interoperability with IMAP2bis servers + + A quick way to check whether a server implementation supports the + IMAP4 specification is to try the CAPABILITY command. An OK response + will indicate which variant(s) of IMAP4 are supported by the server. + + + +Crispin Informational [Page 1] + +RFC 2061 IMAP4 Compatibility December 1996 + + + If the client does not find any of its known variant in the response, + it should treat the server as IMAP2bis. A BAD response indicates an + IMAP2bis or older server. + + Most IMAP4 facilities are in IMAP2bis. The following exceptions + exist: + + CAPABILITY command + The absense of this command indicates IMAP2bis (or older). + + AUTHENTICATE command. + Use the LOGIN command. + + LSUB, SUBSCRIBE, and UNSUBSCRIBE commands + No direct functional equivalent. IMAP2bis had a concept + called "bboards" which is not in IMAP4. RFC 1176 supported + these with the BBOARD and FIND BBOARDS commands. IMAP2bis + augmented these with the FIND ALL.BBOARDS, SUBSCRIBE BBOARD, + and UNSUBSCRIBE BBOARD commands. It is recommended that + none of these commands be implemented in new software, + including servers that support old clients. + + LIST command + Use the command FIND ALL.MAILBOXES, which has a similar syn- + tax and response to the FIND MAILBOXES command described in + RFC 1176. The FIND MAILBOXES command is unlikely to produce + useful information. + + * in a sequence + Use the number of messages in the mailbox from the EXISTS + unsolicited response. + + SEARCH extensions (character set, additional criteria) + Reformulate the search request using only the RFC 1176 syn- + tax. This may entail doing multiple searches to achieve the + desired results. + + BODYSTRUCTURE fetch data item + Use the non-extensible BODY data item. + + body sections HEADER, TEXT, MIME, HEADER.FIELDS, HEADER.FIELDS.NOT + Use body section numbers only. + + BODY.PEEK[section] + Use BODY[section] and manually clear the \Seen flag as + necessary. + + + + + +Crispin Informational [Page 2] + +RFC 2061 IMAP4 Compatibility December 1996 + + + FLAGS.SILENT, +FLAGS.SILENT, and -FLAGS.SILENT store data items + Use the corresponding non-SILENT versions and ignore the + untagged FETCH responses which come back. + + UID fetch data item and the UID commands + No functional equivalent. + + CLOSE command + No functional equivalent. + + + In IMAP2bis, the TRYCREATE special information token is sent as a + separate unsolicited OK response instead of inside the NO response. + + IMAP2bis is ambiguous about whether or not flags or internal dates + are preserved on COPY. It is impossible to know what behavior is + supported by the server. + +IMAP4 server interoperability with IMAP2bis clients + + The only interoperability problem between an IMAP4 server and a + well-written IMAP2bis client is an incompatibility with the use of + "\" in quoted strings. This is best avoided by using literals + instead of quoted strings if "\" or <"> is embedded in the string. + +Security Considerations + + Security issues are not discussed in this memo. + +Author's Address + + Mark R. Crispin + Networks and Distributed Computing + University of Washington + 4545 15th Aveneue NE + Seattle, WA 98105-4527 + + Phone: (206) 543-5762 + EMail: MRC@CAC.Washington.EDU + + + + + + + + + + + + +Crispin Informational [Page 3] + diff --git a/doc/rfc2086.txt b/doc/rfc2086.txt @@ -0,0 +1,451 @@ + + + + + + +Network Working Group J. Myers +Request for Comments: 2086 Carnegie Mellon +Category: Standards Track January 1997 + + + IMAP4 ACL extension + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +1. Abstract + + The ACL extension of the Internet Message Access Protocol [IMAP4] + permits access control lists to be manipulated through the IMAP + protocol. + +Table of Contents + + 1. Abstract............................................... 1 + 2. Conventions Used in this Document...................... 1 + 3. Introduction and Overview.............................. 2 + 4. Commands............................................... 3 + 4.1. SETACL................................................. 3 + 4.2. DELETEACL.............................................. 4 + 4.3. GETACL................................................. 4 + 4.4. LISTRIGHTS............................................. 4 + 4.5. MYRIGHTS............................................... 5 + 5. Responses.............................................. 5 + 5.1. ACL.................................................... 5 + 5.2. LISTRIGHTS............................................. 6 + 5.3. MYRIGHTS............................................... 6 + 6. Formal Syntax.......................................... 6 + 7. References............................................. 7 + 8. Security Considerations................................ 7 + 9. Author's Address....................................... 8 + +2. Conventions Used in this Document + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. + + + + + + +Myers Standards Track [Page 1] + +RFC 2086 ACL extension January 1997 + + +3. Introduction and Overview + + The ACL extension is present in any IMAP4 implementation which + returns "ACL" as one of the supported capabilities to the CAPABILITY + command. + + An access control list is a set of <identifier,rights> pairs. + + Identifier is a US-ASCII string. The identifier anyone is reserved + to refer to the universal identity (all authentications, including + anonymous). All user name strings accepted by the LOGIN or + AUTHENTICATE commands to authenticate to the IMAP server are reserved + as identifiers for the corresponding user. Identifiers starting with + a dash ("-") are reserved for "negative rights", described below. + All other identifier strings are interpreted in an implementation- + defined manner. + + Rights is a string listing a (possibly empty) set of alphanumeric + characters, each character listing a set of operations which is being + controlled. Letters are reserved for ``standard'' rights, listed + below. The set of standard rights may only be extended by a + standards-track document. Digits are reserved for implementation or + site defined rights. The currently defined standard rights are: + + l - lookup (mailbox is visible to LIST/LSUB commands) + r - read (SELECT the mailbox, perform CHECK, FETCH, PARTIAL, + SEARCH, COPY from mailbox) + s - keep seen/unseen information across sessions (STORE SEEN flag) + w - write (STORE flags other than SEEN and DELETED) + i - insert (perform APPEND, COPY into mailbox) + p - post (send mail to submission address for mailbox, + not enforced by IMAP4 itself) + c - create (CREATE new sub-mailboxes in any implementation-defined + hierarchy) + d - delete (STORE DELETED flag, perform EXPUNGE) + a - administer (perform SETACL) + + An implementation may tie rights together or may force rights to + always or never be granted to particular identifiers. For example, + in an implementation that uses unix mode bits, the rights "wisd" are + tied, the "a" right is always granted to the owner of a mailbox and + is never granted to another user. If rights are tied in an + implementation, the implementation must be conservative in granting + rights in response to SETACL commands--unless all rights in a tied + set are specified, none of that set should be included in the ACL + entry for that identifier. A client may discover the set of rights + which may be granted to a given identifier in the ACL for a given + mailbox by using the LISTRIGHTS command. + + + +Myers Standards Track [Page 2] + +RFC 2086 ACL extension January 1997 + + + It is possible for multiple identifiers in an access control list to + apply to a given user (or other authentication identity). For + example, an ACL may include rights to be granted to the identifier + matching the user, one or more implementation-defined identifiers + matching groups which include the user, and/or the identifier + "anyone". How these rights are combined to determine the user's + access is implementation-defined. An implementation may choose, for + example, to use the union of the rights granted to the applicable + identifiers. An implementation may instead choose, for example, to + only use those rights granted to the most specific identifier present + in the ACL. A client may determine the set of rights granted to the + logged-in user for a given mailbox by using the MYRIGHTS command. + + When an identifier in an ACL starts with a dash ("-"), that indicates + that associated rights are to be removed from the identifier that is + prefixed by the dash. For example, if the identifier "-fred" is + granted the "w" right, that indicates that the "w" right is to be + removed from users matching the identifier "fred". Implementations + need not support having identifiers which start with a dash in ACLs. + +4. Commands + +4.1. SETACL + + Arguments: mailbox name + authentication identifier + access right modification + + Data: no specific data for this command + + Result: OK - setacl completed + NO - setacl failure: can't set acl + BAD - command unknown or arguments invalid + + The SETACL command changes the access control list on the + specified mailbox so that the specified identifier is granted + permissions as specified in the third argument. + + The third argument is a string containing an optional plus ("+") + or minus ("-") prefix, followed by zero or more rights characters. + If the string starts with a plus, the following rights are added + to any existing rights for the identifier. If the string starts + with a minus, the following rights are removed from any existing + rights for the identifier. If the string does not start with a + plus or minus, the rights replace any existing rights for the + identifier. + + + + + +Myers Standards Track [Page 3] + +RFC 2086 ACL extension January 1997 + + +4.2. DELETEACL + + Arguments: mailbox name + authentication identifier + + Data: no specific data for this command + + Result: OK - deleteacl completed + NO - deleteacl failure: can't delete acl + BAD - command unknown or arguments invalid + + The DELETEACL command removes any <identifier,rights> pair for the + specified identifier from the access control list for the specified + mailbox. + +4.3. GETACL + + Arguments: mailbox name + + Data: untagged responses: ACL + + Result: OK - getacl completed + NO - getacl failure: can't get acl + BAD - command unknown or arguments invalid + + The GETACL command returns the access control list for mailbox in + an untagged ACL reply. + + Example: C: A002 GETACL INBOX + S: * ACL INBOX Fred rwipslda + S: A002 OK Getacl complete + +4.4. LISTRIGHTS + + Arguments: mailbox name + authentication identifier + + Data: untagged responses: LISTRIGHTS + + Result: OK - listrights completed + NO - listrights failure: can't get rights list + BAD - command unknown or arguments invalid + + The LISTRIGHTS command takes a mailbox name and an identifier and + returns information about what rights may be granted to the identifier + in the ACL for the mailbox. + + + + + +Myers Standards Track [Page 4] + +RFC 2086 ACL extension January 1997 + + + Example: C: a001 LISTRIGHTS ~/Mail/saved smith + S: * LISTRIGHTS ~/Mail/saved smith la r swicd + S: a001 OK Listrights completed + + + C: a005 LISTRIGHTS archive.imap anyone + S: * LISTRIGHTS archive.imap anyone "" l r s w i p c d a + 0 1 2 3 4 5 6 7 8 9 + +4.5. MYRIGHTS + + Arguments: mailbox name + + Data: untagged responses: MYRIGHTS + + Result: OK - myrights completed + NO - myrights failure: can't get rights + BAD - command unknown or arguments invalid + + The MYRIGHTS command returns the set of rights that the user has + to mailbox in an untagged MYRIGHTS reply. + + Example: C: A003 MYRIGHTS INBOX + S: * MYRIGHTS INBOX rwipslda + S: A003 OK Myrights complete + +5. Responses + +5.1. ACL + + Data: mailbox name + zero or more identifier rights pairs + + The ACL response occurs as a result of a GETACL command. The first + string is the mailbox name for which this ACL applies. This is + followed by zero or more pairs of strings, each pair contains the + identifier for which the entry applies followed by the set of + rights that the identifier has. + + + + + + + + + + + + + +Myers Standards Track [Page 5] + +RFC 2086 ACL extension January 1997 + + +5.2. LISTRIGHTS + + Data: mailbox name + identifier + required rights + list of optional rights + + The LISTRIGHTS response occurs as a result of a LISTRIGHTS + command. The first two strings are the mailbox name and identifier + for which this rights list applies. Following the identifier is a + string containing the (possibly empty) set of rights the + identifier will always be granted in the mailbox. + + Following this are zero or more strings each containing a set of + rights the identifier may be granted in the mailbox. Rights + mentioned in the same string are tied together--either all must be + granted to the identifier in the mailbox or none may be granted. + + The same right may not be listed more than once in the LISTRIGHTS + command. + +5.3. MYRIGHTS + + Data: mailbox name + rights + + The MYRIGHTS response occurs as a result of a MYRIGHTS command. + The first string is the mailbox name for which these rights apply. + The second string is the set of rights that the client has. + +6. Formal Syntax + + The following syntax specification uses the augmented Backus-Naur + Form (BNF) notation as specified in [RFC-822] as modified by [IMAP4]. + Non-terminals referenced but not defined below are as defined by + [IMAP4]. + + Except as noted otherwise, all alphabetic characters are case- + insensitive. The use of upper or lower case characters to define + token strings is for editorial clarity only. Implementations MUST + accept these strings in a case-insensitive fashion. + + + + + + + + + + +Myers Standards Track [Page 6] + +RFC 2086 ACL extension January 1997 + + + acl_data ::= "ACL" SPACE mailbox *(SPACE identifier SPACE + rights) + + deleteacl ::= "DELETEACL" SPACE mailbox SPACE identifier + + getacl ::= "GETACL" SPACE mailbox + + identifier ::= astring + + listrights ::= "LISTRIGHTS" SPACE mailbox SPACE identifier + + listrights_data ::= "LISTRIGHTS" SPACE mailbox SPACE identifier + SPACE rights *(SPACE rights) + + mod_rights ::= astring + ;; +rights to add, -rights to remove + ;; rights to replace + + myrights ::= "MYRIGHTS" SPACE mailbox + + myrights_data ::= "MYRIGHTS" SPACE mailbox SPACE rights + + rights ::= astring + + setacl ::= "SETACL" SPACE mailbox SPACE identifier + SPACE mod_rights + +7. References + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version 4", + RFC 1730, University of Washington, December 1994. + + [RFC-822] Crocker, D., "Standard for the Format of ARPA Internet Text + Messages", STD 11, RFC 822. + +8. Security Considerations + + An implementation must make sure the ACL commands themselves do not + give information about mailboxes with appropriately restricted ACL's. + For example, a GETACL command on a mailbox for which the user has + insufficient rights should not admit the mailbox exists, much less + return the mailbox's ACL. + + + + + + + + + +Myers Standards Track [Page 7] + +RFC 2086 ACL extension January 1997 + + +9. Author's Address + + John G. Myers + Carnegie-Mellon University + 5000 Forbes Ave. + Pittsburgh PA, 15213-3890 + + Email: jgm+@cmu.edu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Myers Standards Track [Page 8] + diff --git a/doc/rfc2087.txt b/doc/rfc2087.txt @@ -0,0 +1,283 @@ + + + + + + +Network Working Group J. Myers +Request for Comments: 2087 Carnegie Mellon +Category: Standards Track January 1997 + + + IMAP4 QUOTA extension + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +1. Abstract + + The QUOTA extension of the Internet Message Access Protocol [IMAP4] + permits administrative limits on resource usage (quotas) to be + manipulated through the IMAP protocol. + +Table of Contents + + 1. Abstract........................................... 1 + 2. Conventions Used in this Document.................. 1 + 3. Introduction and Overview.......................... 2 + 4. Commands........................................... 2 + 4.1. SETQUOTA Command................................... 2 + 4.2. GETQUOTA Command................................... 2 + 4.3. GETQUOTAROOT Command............................... 3 + 5. Responses.......................................... 3 + 5.1. QUOTA Response..................................... 3 + 5.2. QUOTAROOT Response................................. 4 + 6. Formal syntax...................................... 4 + 7. References......................................... 5 + 8. Security Considerations............................ 5 + 9. Author's Address................................... 5 + + +2. Conventions Used in this Document + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. + + + + + + + + +Myers Standards Track [Page 1] + +RFC 2087 QUOTA January 1997 + + +3. Introduction and Overview + + The QUOTA extension is present in any IMAP4 implementation which + returns "QUOTA" as one of the supported capabilities to the + CAPABILITY command. + + An IMAP4 server which supports the QUOTA capability may support + limits on any number of resources. Each resource has an atom name + and an implementation-defined interpretation which evaluates to an + integer. Examples of such resources are: + + Name Interpretation + + STORAGE Sum of messages' RFC822.SIZE, in units of 1024 octets + MESSAGE Number of messages + + + Each mailbox has zero or more implementation-defined named "quota + roots". Each quota root has zero or more resource limits. All + mailboxes that share the same named quota root share the resource + limits of the quota root. + + Quota root names do not necessarily have to match the names of + existing mailboxes. + +4. Commands + +4.1. SETQUOTA Command + + Arguments: quota root + list of resource limits + + Data: untagged responses: QUOTA + + Result: OK - setquota completed + NO - setquota error: can't set that data + BAD - command unknown or arguments invalid + + The SETQUOTA command takes the name of a mailbox quota root and a + list of resource limits. The resource limits for the named quota root + are changed to be the specified limits. Any previous resource limits + for the named quota root are discarded. + + If the named quota root did not previously exist, an implementation + may optionally create it and change the quota roots for any number of + existing mailboxes in an implementation-defined manner. + + + + + +Myers Standards Track [Page 2] + +RFC 2087 QUOTA January 1997 + + + Example: C: A001 SETQUOTA "" (STORAGE 512) + S: * QUOTA "" (STORAGE 10 512) + S: A001 OK Setquota completed + +4.2. GETQUOTA Command + + Arguments: quota root + + Data: untagged responses: QUOTA + + Result: OK - getquota completed + NO - getquota error: no such quota root, permission + denied + BAD - command unknown or arguments invalid + + The GETQUOTA command takes the name of a quota root and returns the + quota root's resource usage and limits in an untagged QUOTA response. + + Example: C: A003 GETQUOTA "" + S: * QUOTA "" (STORAGE 10 512) + S: A003 OK Getquota completed + +4.3. GETQUOTAROOT Command + + Arguments: mailbox name + + Data: untagged responses: QUOTAROOT, QUOTA + + Result: OK - getquota completed + NO - getquota error: no such mailbox, permission denied + BAD - command unknown or arguments invalid + + The GETQUOTAROOT command takes the name of a mailbox and returns the + list of quota roots for the mailbox in an untagged QUOTAROOT + response. For each listed quota root, it also returns the quota + root's resource usage and limits in an untagged QUOTA response. + + Example: C: A003 GETQUOTAROOT INBOX + S: * QUOTAROOT INBOX "" + S: * QUOTA "" (STORAGE 10 512) + S: A003 OK Getquota completed + + + + + + + + + + +Myers Standards Track [Page 3] + +RFC 2087 QUOTA January 1997 + + +5. Responses + +5.1. QUOTA Response + + Data: quota root name + list of resource names, usages, and limits + + This response occurs as a result of a GETQUOTA or GETQUOTAROOT + command. The first string is the name of the quota root for which + this quota applies. + + The name is followed by a S-expression format list of the resource + usage and limits of the quota root. The list contains zero or + more triplets. Each triplet conatins a resource name, the current + usage of the resource, and the resource limit. + + Resources not named in the list are not limited in the quota root. + Thus, an empty list means there are no administrative resource + limits in the quota root. + + Example: S: * QUOTA "" (STORAGE 10 512) + +5.2. QUOTAROOT Response + + Data: mailbox name + zero or more quota root names + + This response occurs as a result of a GETQUOTAROOT command. The + first string is the mailbox and the remaining strings are the + names of the quota roots for the mailbox. + + Example: S: * QUOTAROOT INBOX "" + S: * QUOTAROOT comp.mail.mime + +6. Formal syntax + + The following syntax specification uses the augmented Backus-Naur + Form (BNF) notation as specified in RFC 822 with one exception; the + delimiter used with the "#" construct is a single space (SP) and not + one or more commas. + + Except as noted otherwise, all alphabetic characters are case- + insensitive. The use of upper or lower case characters to define + token strings is for editorial clarity only. Implementations MUST + accept these strings in a case-insensitive fashion. + + + + + + +Myers Standards Track [Page 4] + +RFC 2087 QUOTA January 1997 + + + getquota ::= "GETQUOTA" SP astring + + getquotaroot ::= "GETQUOTAROOT" SP astring + + quota_list ::= "(" #quota_resource ")" + + quota_resource ::= atom SP number SP number + + quota_response ::= "QUOTA" SP astring SP quota_list + + quotaroot_response + ::= "QUOTAROOT" SP astring *(SP astring) + + setquota ::= "SETQUOTA" SP astring SP setquota_list + + setquota_list ::= "(" 0#setquota_resource ")" + + setquota_resource ::= atom SP number + +7. References + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version 4", + RFC 1730, University of Washington, December 1994. + + [RFC-822] Crocker, D., "Standard for the Format of ARPA Internet + Text Messages", STD 11, RFC 822. + +8. Security Considerations + + Implementors should be careful to make sure the implementation of + these commands does not violate the site's security policy. The + resource usage of other users is likely to be considered confidential + information and should not be divulged to unauthorized persons. + +9. Author's Address + + John G. Myers + Carnegie-Mellon University + 5000 Forbes Ave. + Pittsburgh PA, 15213-3890 + + EMail: jgm+@cmu.edu + + + + + + + + + +Myers Standards Track [Page 5] + diff --git a/doc/rfc2088.txt b/doc/rfc2088.txt @@ -0,0 +1,115 @@ + + + + + + +Network Working Group J. Myers +Request for Comments: 2088 Carnegie Mellon +Cateogry: Standards Track January 1997 + + + IMAP4 non-synchronizing literals + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +1. Abstract + + The Internet Message Access Protocol [IMAP4] contains the "literal" + syntactic construct for communicating strings. When sending a + literal from client to server, IMAP4 requires the client to wait for + the server to send a command continuation request between sending the + octet count and the string data. This document specifies an + alternate form of literal which does not require this network round + trip. + +2. Conventions Used in this Document + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. + +3. Specification + + The non-synchronizing literal is added an alternate form of literal, + and may appear in communication from client to server instead of the + IMAP4 form of literal. The IMAP4 form of literal, used in + communication from client to server, is referred to as a + synchronizing literal. + + Non-synchronizing literals may be used with any IMAP4 server + implementation which returns "LITERAL+" as one of the supported + capabilities to the CAPABILITY command. If the server does not + advertise the LITERAL+ capability, the client must use synchronizing + literals instead. + + The non-synchronizing literal is distinguished from the original + synchronizing literal by having a plus ('+') between the octet count + and the closing brace ('}'). The server does not generate a command + continuation request in response to a non-synchronizing literal, and + + + +Myers Standards Track [Page 1] + +RFC 2088 LITERAL January 1997 + + + clients are not required to wait before sending the octets of a non- + synchronizing literal. + + The protocol receiver of an IMAP4 server must check the end of every + received line for an open brace ('{') followed by an octet count, a + plus ('+'), and a close brace ('}') immediately preceeding the CRLF. + If it finds this sequence, it is the octet count of a non- + synchronizing literal and the server MUST treat the specified number + of following octets and the following line as part of the same + command. A server MAY still process commands and reject errors on a + line-by-line basis, as long as it checks for non-synchronizing + literals at the end of each line. + + Example: C: A001 LOGIN {11+} + C: FRED FOOBAR {7+} + C: fat man + S: A001 OK LOGIN completed + +4. Formal Syntax + + The following syntax specification uses the augmented Backus-Naur + Form (BNF) notation as specified in [RFC-822] as modified by [IMAP4]. + Non-terminals referenced but not defined below are as defined by + [IMAP4]. + + literal ::= "{" number ["+"] "}" CRLF *CHAR8 + ;; Number represents the number of CHAR8 octets + +6. References + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version 4", + draft-crispin-imap-base-XX.txt, University of Washington, April 1996. + + [RFC-822] Crocker, D., "Standard for the Format of ARPA Internet Text + Messages", STD 11, RFC 822. + +7. Security Considerations + + There are no known security issues with this extension. + +8. Author's Address + + John G. Myers + Carnegie-Mellon University + 5000 Forbes Ave. + Pittsburgh PA, 15213-3890 + + Email: jgm+@cmu.edu + + + +Myers Standards Track [Page 2] + diff --git a/doc/rfc2095.txt b/doc/rfc2095.txt @@ -0,0 +1,283 @@ + + + + + + +Network Working Group J. Klensin +Request for Comments: 2095 R. Catoe +Category: Standards Track P. Krumviede + MCI + January 1997 + + + IMAP/POP AUTHorize Extension for Simple Challenge/Response + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Abstract + + While IMAP4 supports a number of strong authentication mechanisms as + described in RFC 1731, it lacks any mechanism that neither passes + cleartext, reusable passwords across the network nor requires either + a significant security infrastructure or that the mail server update + a mail-system-wide user authentication file on each mail access. + This specification provides a simple challenge-response + authentication protocol that is suitable for use with IMAP4. Since + it utilizes Keyed-MD5 digests and does not require that the secret be + stored in the clear on the server, it may also constitute an + improvement on APOP for POP3 use as specified in RFC 1734. + +1. Introduction + + Existing Proposed Standards specify an AUTHENTICATE mechanism for the + IMAP4 protocol [IMAP, IMAP-AUTH] and a parallel AUTH mechanism for + the POP3 protocol [POP3-AUTH]. The AUTHENTICATE mechanism is + intended to be extensible; the four methods specified in [IMAP-AUTH] + are all fairly powerful and require some security infrastructure to + support. The base POP3 specification [POP3] also contains a + lightweight challenge-response mechanism called APOP. APOP is + associated with most of the risks associated with such protocols: in + particular, it requires that both the client and server machines have + access to the shared secret in cleartext form. CRAM offers a method + for avoiding such cleartext storage while retaining the algorithmic + simplicity of APOP in using only MD5, though in a "keyed" method. + + + + + + + +Klensin, Catoe & Krumviede Standards Track [Page 1] + +RFC 2095 IMAP/POP AUTHorize Extension January 1997 + + + At present, IMAP [IMAP] lacks any facility corresponding to APOP. + The only alternative to the strong mechanisms identified in [IMAP- + AUTH] is a presumably cleartext username and password, supported + through the LOGIN command in [IMAP]. This document describes a + simple challenge-response mechanism, similar to APOP and PPP CHAP + [PPP], that can be used with IMAP (and, in principle, with POP3). + + This mechanism also has the advantage over some possible alternatives + of not requiring that the server maintain information about email + "logins" on a per-login basis. While mechanisms that do require such + per-login history records may offer enhanced security, protocols such + as IMAP, which may have several connections between a given client + and server open more or less simultaneous, may make their + implementation particularly challenging. + +2. Challenge-Response Authentication Mechanism (CRAM) + + The authentication type associated with CRAM is "CRAM-MD5". + + The data encoded in the first ready response contains an + presumptively arbitrary string of random digits, a timestamp, and the + fully-qualified primary host name of the server. The syntax of the + unencoded form must correspond to that of an RFC 822 'msg-id' + [RFC822] as described in [POP3]. + + The client makes note of the data and then responds with a string + consisting of the user name, a space, and a 'digest'. The latter is + computed by applying the keyed MD5 algorithm from [KEYED-MD5] where + the key is a shared secret and the digested text is the timestamp + (including angle-brackets). + + This shared secret is a string known only to the client and server. + The `digest' parameter itself is a 16-octet value which is sent in + hexadecimal format, using lower-case ASCII characters. + + When the server receives this client response, it verifies the digest + provided. If the digest is correct, the server should consider the + client authenticated and respond appropriately. + + Keyed MD5 is chosen for this application because of the greater + security imparted to authentication of short messages. In addition, + the use of the techniques described in [KEYED-MD5] for precomputation + of intermediate results make it possible to avoid explicit cleartext + storage of the shared secret on the server system by instead storing + the intermediate results which are known as "contexts". + + + + + + +Klensin, Catoe & Krumviede Standards Track [Page 2] + +RFC 2095 IMAP/POP AUTHorize Extension January 1997 + + + CRAM does not support a protection mechanism. + + Example: + + The examples in this document show the use of the CRAM mechanism with + the IMAP4 AUTHENTICATE command [IMAP-AUTH]. The base64 encoding of + the challenges and responses is part of the IMAP4 AUTHENTICATE + command, not part of the CRAM specification itself. + + S: * OK IMAP4 Server + C: A0001 AUTHENTICATE CRAM-MD5 + S: + PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ+ + C: dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw + S: A0001 OK CRAM authentication successful + + In this example, the shared secret is the string + 'tanstaaftanstaaf'. Hence, the Keyed MD5 digest is produced by + calculating + + MD5((tanstaaftanstaaf XOR opad), + MD5((tanstaaftanstaaf XOR ipad), + <1896.697170952@postoffice.reston.mci.net>)) + + where ipad and opad are as defined in the keyed-MD5 Work in + Progress [KEYED-MD5] and the string shown in the challenge is the + base64 encoding of <1896.697170952@postoffice.reston.mci.net>. The + shared secret is null-padded to a length of 64 bytes. If the + shared secret is longer than 64 bytes, the MD5 digest of the + shared secret is used as a 16 byte input to the keyed MD5 + calculation. + + This produces a digest value (in hexadecimal) of + + b913a602c7eda7a495b4e6e7334d3890 + + The user name is then prepended to it, forming + + tim b913a602c7eda7a495b4e6e7334d3890 + + Which is then base64 encoded to meet the requirements of the IMAP4 + AUTHENTICATE command (or the similar POP3 AUTH command), yielding + + dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw + + + + + + + + +Klensin, Catoe & Krumviede Standards Track [Page 3] + +RFC 2095 IMAP/POP AUTHorize Extension January 1997 + + +3. References + + [CHAP] Lloyd, B., and W. Simpson, "PPP Authentication Protocols", + RFC 1334, October 1992. + + [IMAP] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, University of Washington, December 1996. + + [IMAP-AUTH] Myers, J., "IMAP4 Authentication Mechanisms", + RFC 1731, Carnegie Mellon, December 1994. + + [KEYED-MD5] Krawczyk, H., "HMAC-MD5: Keyed-MD5 for Message + Authentication", Work in Progess. + + [MD5] Rivest, R., "The MD5 Message Digest Algorithm", + RFC 1321, MIT Laboratory for Computer Science, April 1992. + + [POP3] Myers, J., and M. Rose, "Post Office Protocol - Version 3", + STD 53, RFC 1939, Carnegie Mellon, May 1996. + + [POP3-AUTH] Myers, J., "POP3 AUTHentication command", RFC 1734, + Carnegie Mellon, December, 1994. + +4. Security Considerations + + It is conjectured that use of the CRAM authentication mechanism + provides origin identification and replay protection for a session. + Accordingly, a server that implements both a cleartext password + command and this authentication type should not allow both methods of + access for a given user. + + While the saving, on the server, of "contexts" (see section 2) is + marginally better than saving the shared secrets in cleartext as is + required by CHAP [CHAP] and APOP [POP3], it is not sufficient to + protect the secrets if the server itself is compromised. + Consequently, servers that store the secrets or contexts must both be + protected to a level appropriate to the potential information value + in user mailboxes and identities. + + As the length of the shared secret increases, so does the difficulty + of deriving it. + + While there are now suggestions in the literature that the use of MD5 + and keyed MD5 in authentication procedures probably has a limited + effective lifetime, the technique is now widely deployed and widely + understood. It is believed that this general understanding may + assist with the rapid replacement, by CRAM-MD5, of the current uses + of permanent cleartext passwords in IMAP. This document has been + + + +Klensin, Catoe & Krumviede Standards Track [Page 4] + +RFC 2095 IMAP/POP AUTHorize Extension January 1997 + + + deliberately written to permit easy upgrading to use SHA (or whatever + alternatives emerge) when they are considered to be widely available + and adequately safe. + + Even with the use of CRAM, users are still vulnerable to active + attacks. An example of an increasingly common active attack is 'TCP + Session Hijacking' as described in CERT Advisory CA-95:01 [CERT95]. + + See section 1 above for additional discussion. + +5. Acknowledgements + + This memo borrows ideas and some text liberally from [POP3] and + [RFC-1731] and thanks are due the authors of those documents. Ran + Atkinson made a number of valuable technical and editorial + contributions to the document. + +6. Authors' Addresses + + John C. Klensin + MCI Telecommunications + 800 Boylston St, 7th floor + Boston, MA 02199 + USA + + EMail: klensin@mci.net + Phone: +1 617 960 1011 + + Randy Catoe + MCI Telecommunications + 2100 Reston Parkway + Reston, VA 22091 + USA + + EMail: randy@mci.net + Phone: +1 703 715 7366 + + Paul Krumviede + MCI Telecommunications + 2100 Reston Parkway + Reston, VA 22091 + USA + + EMail: paul@mci.net + Phone: +1 703 715 7251 + + + + + + +Klensin, Catoe & Krumviede Standards Track [Page 5] + diff --git a/doc/rfc2177.txt b/doc/rfc2177.txt @@ -0,0 +1,227 @@ + + + + + + +Network Working Group B. Leiba +Request for Comments: 2177 IBM T.J. Watson Research Center +Category: Standards Track June 1997 + + + IMAP4 IDLE command + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +1. Abstract + + The Internet Message Access Protocol [IMAP4] requires a client to + poll the server for changes to the selected mailbox (new mail, + deletions). It's often more desirable to have the server transmit + updates to the client in real time. This allows a user to see new + mail immediately. It also helps some real-time applications based on + IMAP, which might otherwise need to poll extremely often (such as + every few seconds). (While the spec actually does allow a server to + push EXISTS responses aysynchronously, a client can't expect this + behaviour and must poll.) + + This document specifies the syntax of an IDLE command, which will + allow a client to tell the server that it's ready to accept such + real-time updates. + +2. Conventions Used in this Document + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. + + The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" + in this document are to be interpreted as described in RFC 2060 + [IMAP4]. + +3. Specification + + IDLE Command + + Arguments: none + + Responses: continuation data will be requested; the client sends + the continuation data "DONE" to end the command + + + +Leiba Standards Track [Page 1] + +RFC 2177 IMAP4 IDLE command June 1997 + + + + Result: OK - IDLE completed after client sent "DONE" + NO - failure: the server will not allow the IDLE + command at this time + BAD - command unknown or arguments invalid + + The IDLE command may be used with any IMAP4 server implementation + that returns "IDLE" as one of the supported capabilities to the + CAPABILITY command. If the server does not advertise the IDLE + capability, the client MUST NOT use the IDLE command and must poll + for mailbox updates. In particular, the client MUST continue to be + able to accept unsolicited untagged responses to ANY command, as + specified in the base IMAP specification. + + The IDLE command is sent from the client to the server when the + client is ready to accept unsolicited mailbox update messages. The + server requests a response to the IDLE command using the continuation + ("+") response. The IDLE command remains active until the client + responds to the continuation, and as long as an IDLE command is + active, the server is now free to send untagged EXISTS, EXPUNGE, and + other messages at any time. + + The IDLE command is terminated by the receipt of a "DONE" + continuation from the client; such response satisfies the server's + continuation request. At that point, the server MAY send any + remaining queued untagged responses and then MUST immediately send + the tagged response to the IDLE command and prepare to process other + commands. As in the base specification, the processing of any new + command may cause the sending of unsolicited untagged responses, + subject to the ambiguity limitations. The client MUST NOT send a + command while the server is waiting for the DONE, since the server + will not be able to distinguish a command from a continuation. + + The server MAY consider a client inactive if it has an IDLE command + running, and if such a server has an inactivity timeout it MAY log + the client off implicitly at the end of its timeout period. Because + of that, clients using IDLE are advised to terminate the IDLE and + re-issue it at least every 29 minutes to avoid being logged off. + This still allows a client to receive immediate mailbox updates even + though it need only "poll" at half hour intervals. + + + + + + + + + + + +Leiba Standards Track [Page 2] + +RFC 2177 IMAP4 IDLE command June 1997 + + + Example: C: A001 SELECT INBOX + S: * FLAGS (Deleted Seen) + S: * 3 EXISTS + S: * 0 RECENT + S: * OK [UIDVALIDITY 1] + S: A001 OK SELECT completed + C: A002 IDLE + S: + idling + ...time passes; new mail arrives... + S: * 4 EXISTS + C: DONE + S: A002 OK IDLE terminated + ...another client expunges message 2 now... + C: A003 FETCH 4 ALL + S: * 4 FETCH (...) + S: A003 OK FETCH completed + C: A004 IDLE + S: * 2 EXPUNGE + S: * 3 EXISTS + S: + idling + ...time passes; another client expunges message 3... + S: * 3 EXPUNGE + S: * 2 EXISTS + ...time passes; new mail arrives... + S: * 3 EXISTS + C: DONE + S: A004 OK IDLE terminated + C: A005 FETCH 3 ALL + S: * 3 FETCH (...) + S: A005 OK FETCH completed + C: A006 IDLE + +4. Formal Syntax + + The following syntax specification uses the augmented Backus-Naur + Form (BNF) notation as specified in [RFC-822] as modified by [IMAP4]. + Non-terminals referenced but not defined below are as defined by + [IMAP4]. + + command_auth ::= append / create / delete / examine / list / lsub / + rename / select / status / subscribe / unsubscribe + / idle + ;; Valid only in Authenticated or Selected state + + idle ::= "IDLE" CRLF "DONE" + + + + + + +Leiba Standards Track [Page 3] + +RFC 2177 IMAP4 IDLE command June 1997 + + +5. References + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + +6. Security Considerations + + There are no known security issues with this extension. + +7. Author's Address + + Barry Leiba + IBM T.J. Watson Research Center + 30 Saw Mill River Road + Hawthorne, NY 10532 + + Email: leiba@watson.ibm.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Leiba Standards Track [Page 4] + diff --git a/doc/rfc2180.txt b/doc/rfc2180.txt @@ -0,0 +1,787 @@ + + + + + + +Network Working Group M. Gahrns +Request for Comments: 2180 Microsoft +Category: Informational July 1997 + + + IMAP4 Multi-Accessed Mailbox Practice + +Status of this Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +1. Abstract + + IMAP4[RFC-2060] is rich client/server protocol that allows a client + to access and manipulate electronic mail messages on a server. + Within the protocol framework, it is possible to have differing + results for particular client/server interactions. If a protocol does + not allow for this, it is often unduly restrictive. + + For example, when multiple clients are accessing a mailbox and one + attempts to delete the mailbox, an IMAP4 server may choose to + implement a solution based upon server architectural constraints or + individual preference. + + With this flexibility comes greater client responsibility. It is not + sufficient for a client to be written based upon the behavior of a + particular IMAP server. Rather the client must be based upon the + behavior allowed by the protocol. + + By documenting common IMAP4 server practice for the case of + simultaneous client access to a mailbox, we hope to ensure the widest + amount of inter-operation between IMAP4 clients and servers. + + The behavior described in this document reflects the practice of some + existing servers or behavior that the consensus of the IMAP mailing + list has deemed to be reasonable. The behavior described within this + document is believed to be [RFC-2060] compliant. However, this + document is not meant to define IMAP4 compliance, nor is it an + exhaustive list of valid IMAP4 behavior. [RFC-2060] must always be + consulted to determine IMAP4 compliance, especially for server + behavior not described within this document. + + + + + + + + +Gahrns Informational [Page 1] + +RFC 2180 IMAP4 Multi-Accessed Mailbox Practice July 1997 + + +2. Conventions used in this document + + In examples,"C1:", "C2:" and "C3:" indicate lines sent by 3 different + clients (client #1, client #2 and client #3) that are connected to a + server. "S1:", "S2:" and "S3:" indicated lines sent by the server to + client #1, client #2 and client #3 respectively. + + A shared mailbox, is a mailbox that can be used by multiple users. + + A multi-accessed mailbox, is a mailbox that has multiple clients + simultaneously accessing it. + + A client is said to have accessed a mailbox after a successful SELECT + or EXAMINE command. + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [RFC-2119]. + + +3. Deletion/Renaming of a multi-accessed mailbox + + If an external agent or multiple clients are accessing a mailbox, + care must be taken when handling the deletion or renaming of the + mailbox. Following are some strategies an IMAP server may choose to + use when dealing with this situation. + + +3.1. The server MAY fail the DELETE/RENAME command of a multi-accessed + mailbox + + In some cases, this behavior may not be practical. For example, if a + large number of clients are accessing a shared mailbox, the window in + which no clients have the mailbox accessed may be small or non- + existent, effectively rendering the mailbox undeletable or + unrenamable. + + Example: + + <Client #1 and Client #2 have mailbox FOO accessed. Client #1 tries + to DELETE the mailbox and is refused> + + C1: A001 DELETE FOO + S1: A001 NO Mailbox FOO is in use by another user. + + + + + + + +Gahrns Informational [Page 2] + +RFC 2180 IMAP4 Multi-Accessed Mailbox Practice July 1997 + + +3.2. The server MAY allow the DELETE command of a multi-accessed + mailbox, but keep the information in the mailbox available for + those clients that currently have access to the mailbox. + + When all clients have finished accessing the mailbox, it is + permanently removed. For clients that do not already have access to + the mailbox, the 'ghosted' mailbox would not be available. For + example, it would not be returned to these clients in a subsequent + LIST or LSUB command and would not be a valid mailbox argument to any + other IMAP command until the reference count of clients accessing the + mailbox reached 0. + + In some cases, this behavior may not be desirable. For example if + someone created a mailbox with offensive or sensitive information, + one might prefer to have the mailbox deleted and all access to the + information contained within removed immediately, rather than + continuing to allow access until the client closes the mailbox. + + Furthermore, this behavior, may prevent 'recycling' of the same + mailbox name until all clients have finished accessing the original + mailbox. + + Example: + + <Client #1 and Client #2 have mailbox FOO selected. Client #1 DELETEs + mailbox FOO> + + C1: A001 DELETE FOO + S1: A001 OK Mailbox FOO is deleted. + + <Client #2 is still able to operate on the deleted mailbox> + + C2: B001 STORE 1 +FLAGS (\Seen) + S2: * 1 FETCH FLAGS (\Seen) + S2: B001 OK STORE completed + + <Client #3 which did not have access to the mailbox prior to the + deletion by client #1 does not have access to the mailbox> + + C3: C001 STATUS FOO (MESSAGES) + S3: C001 NO Mailbox does not exist + + <Nor is client #3 able to create a mailbox with the name FOO, while + the reference count is non zero> + + C3: C002 CREATE FOO + S3: C002 NO Mailbox FOO is still in use. Try again later. + + + + +Gahrns Informational [Page 3] + +RFC 2180 IMAP4 Multi-Accessed Mailbox Practice July 1997 + + + <Client #2 closes its access to the mailbox, no other clients have + access to the mailbox FOO and reference count becomes 0> + + C2: B002 CLOSE + S2: B002 OK CLOSE Completed + + <Now that the reference count on FOO has reached 0, the mailbox name + can be recycled> + + C3: C003 CREATE FOO + S3: C003 OK CREATE Completed + + +3.3. The server MAY allow the DELETE/RENAME of a multi-accessed + mailbox, but disconnect all other clients who have the mailbox + accessed by sending a untagged BYE response. + + A server may often choose to disconnect clients in the DELETE case, + but may choose to implement a "friendlier" method for the RENAME + case. + + Example: + + <Client #1 and Client #2 have mailbox FOO accessed. Client #1 DELETEs + the mailbox FOO> + + C1: A002 DELETE FOO + S1: A002 OK DELETE completed. + + <Server disconnects all other users of the mailbox> + S2: * BYE Mailbox FOO has been deleted. + + +3.4. The server MAY allow the RENAME of a multi-accessed mailbox by + simply changing the name attribute on the mailbox. + + Other clients that have access to the mailbox can continue issuing + commands such as FETCH that do not reference the mailbox name. + Clients would discover the renaming the next time they referred to + the old mailbox name. Some servers MAY choose to include the + [NEWNAME] response code in their tagged NO response to a command that + contained the old mailbox name, as a hint to the client that the + operation can succeed if the command is issued with the new mailbox + name. + + + + + + + +Gahrns Informational [Page 4] + +RFC 2180 IMAP4 Multi-Accessed Mailbox Practice July 1997 + + + Example: + + <Client #1 and Client #2 have mailbox FOO accessed. Client #1 RENAMEs + the mailbox.> + + C1: A001 RENAME FOO BAR + S1: A001 OK RENAME completed. + + <Client #2 is still able to do operations that do not reference the + mailbox name> + + C2: B001 FETCH 2:4 (FLAGS) + S2: * 2 FETCH . . . + S2: * 3 FETCH . . . + S2: * 4 FETCH . . . + S2: B001 OK FETCH completed + + <Client #2 is not able to do operations that reference the mailbox + name> + + C2: B002 APPEND FOO {300} C2: Date: Mon, 7 Feb 1994 + 21:52:25 0800 (PST) C2: . . . S2: B002 NO [NEWNAME FOO + BAR] Mailbox has been renamed + + +4. Expunging of messages on a multi-accessed mailbox + + If an external agent or multiple clients are accessing a mailbox, + care must be taken when handling the EXPUNGE of messages. Other + clients accessing the mailbox may be in the midst of issuing a + command that depends upon message sequence numbers. Because an + EXPUNGE response can not be sent while responding to a FETCH, STORE + or SEARCH command, it is not possible to immediately notify the + client of the EXPUNGE. This can result in ambiguity if the client + issues a FETCH, STORE or SEARCH operation on a message that has been + EXPUNGED. + + +4.1. Fetching of expunged messages + + Following are some strategies an IMAP server may choose to use when + dealing with a FETCH command on expunged messages. + + + + + + + + + +Gahrns Informational [Page 5] + +RFC 2180 IMAP4 Multi-Accessed Mailbox Practice July 1997 + + + Consider the following scenario: + + - Client #1 and Client #2 have mailbox FOO selected. + - There are 7 messages in the mailbox. + - Messages 4:7 are marked for deletion. + - Client #1 issues an EXPUNGE, to expunge messages 4:7 + + +4.1.1. The server MAY allow the EXPUNGE of a multi-accessed mailbox but + keep the messages available to satisfy subsequent FETCH commands + until it is able to send an EXPUNGE response to each client. + + In some cases, the behavior of keeping "ghosted" messages may not be + desirable. For example if a message contained offensive or sensitive + information, one might prefer to instantaneously remove all access to + the information, regardless of whether another client is in the midst + of accessing it. + + Example: (Building upon the scenario outlined in 4.1.) + + <Client #2 is still able to access the expunged messages because the + server has kept a 'ghosted' copy of the messages until it is able to + notify client #2 of the EXPUNGE> + + C2: B001 FETCH 4:7 RFC822 + S2: * 4 FETCH RFC822 . . . (RFC822 info returned) + S2: * 5 FETCH RFC822 . . . (RFC822 info returned) + S2: * 6 FETCH RFC822 . . . (RFC822 info returned) + S2: * 7 FETCH RFC822 . . . (RFC822 info returned) + S2: B001 OK FETCH Completed + + <Client #2 issues a command where it can get notified of the EXPUNGE> + + C2: B002 NOOP + S2: * 4 EXPUNGE + S2: * 4 EXPUNGE + S2: * 4 EXPUNGE + S2: * 4 EXPUNGE + S2: * 3 EXISTS + S2: B002 OK NOOP Complete + + <Client #2 no longer has access to the expunged messages> + + C2: B003 FETCH 4:7 RFC822 + S2: B003 NO Messages 4:7 are no longer available. + + + + + + +Gahrns Informational [Page 6] + +RFC 2180 IMAP4 Multi-Accessed Mailbox Practice July 1997 + + +4.1.2 The server MAY allow the EXPUNGE of a multi-accessed mailbox, + and on subsequent FETCH commands return FETCH responses only for + non-expunged messages and a tagged NO. + + After receiving a tagged NO FETCH response, the client SHOULD issue a + NOOP command so that it will be informed of any pending EXPUNGE + responses. The client may then either reissue the failed FETCH + command, or by examining the EXPUNGE response from the NOOP and the + FETCH response from the FETCH, determine that the FETCH failed + because of pending expunges. + + Example: (Building upon the scenario outlined in 4.1.) + + <Client #2 attempts to FETCH a mix of expunged and non-expunged + messages. A FETCH response is returned only for then non-expunged + messages along with a tagged NO> + + C2: B001 FETCH 3:5 ENVELOPE + S2: * 3 FETCH ENVELOPE . . . (ENVELOPE info returned) + S2: B001 NO Some of the requested messages no longer exist + + <Upon receiving a tagged NO FETCH response, Client #2 issues a NOOP + to be informed of any pending EXPUNGE responses> + + C2: B002 NOOP + S2: * 4 EXPUNGE + S2: * 4 EXPUNGE + S2: * 4 EXPUNGE + S2: * 4 EXPUNGE + S2: * 3 EXISTS + S2: B002 OK NOOP Completed. + + <By receiving a FETCH response for message 3, and an EXPUNGE response + that indicates messages 4:7 have been expunged, the client does not + need to re-issue the FETCH> + + + + + + + + + + + + + + + + +Gahrns Informational [Page 7] + +RFC 2180 IMAP4 Multi-Accessed Mailbox Practice July 1997 + + +4.1.3 The server MAY allow the EXPUNGE of a multi-accessed mailbox, and + on subsequent FETCH commands return the usual FETCH responses for + non-expunged messages, "NIL FETCH Responses" for expunged + messages, and a tagged OK response. + + If all of the messages in the subsequent FETCH command have been + expunged, the server SHOULD return only a tagged NO. In this case, + the client SHOULD issue a NOOP command so that it will be informed of + any pending EXPUNGE responses. The client may then either reissue + the failed FETCH command, or by examining the EXPUNGE response from + the NOOP, determine that the FETCH failed because of pending + expunges. + + "NIL FETCH responses" are a representation of empty data as + appropriate for the FETCH argument specified. + + Example: + + * 1 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)) + * 1 FETCH (FLAGS ()) + * 1 FETCH (INTERNALDATE "00-Jan-0000 00:00:00 +0000") + * 1 FETCH (RFC822 "") + * 1 FETCH (RFC822.HEADER "") + * 1 FETCH (RFC822.TEXT "") + * 1 FETCH (RFC822.SIZE 0) + * 1 FETCH (BODY ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0) + * 1 FETCH (BODYSTRUCTURE ("TEXT" "PLAIN" NIL NIL NIL "7BIT" 0 0) + * 1 FETCH (BODY[<section>] "") + * 1 FETCH (BODY[<section>]<partial> "") + + In some cases, a client may not be able to distinguish between "NIL + FETCH responses" received because a message was expunged and those + received because the data actually was NIL. For example, a * 5 + FETCH (FLAGS ()) response could be received if no flags were set on + message 5, or because message 5 was expunged. In a case of potential + ambiguity, the client SHOULD issue a command such as NOOP to force + the sending of the EXPUNGE responses to resolve any ambiguity. + + Example: (Building upon the scenario outlined in 4.1.) + + <Client #2 attempts to access a mix of expunged and non-expunged + messages. Normal data is returned for non-expunged message, "NIL + FETCH responses" are returned for expunged messages> + + + + + + + + +Gahrns Informational [Page 8] + +RFC 2180 IMAP4 Multi-Accessed Mailbox Practice July 1997 + + + C2: B002 FETCH 3:5 ENVELOPE + S2: * 3 FETCH ENVELOPE . . . (ENVELOPE info returned) + S2: * 4 FETCH ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL + NIL NIL) + S2: * 5 FETCH ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL + NIL NIL) + S2: B002 OK FETCH Completed + + <Client #2 attempts to FETCH only expunged messages and receives a + tagged NO response> + + C2: B002 FETCH 4:7 ENVELOPE + S2: B002 NO Messages 4:7 have been expunged. + + +4.1.4 To avoid the situation altogether, the server MAY fail the + EXPUNGE of a multi-accessed mailbox + + In some cases, this behavior may not be practical. For example, if a + large number of clients are accessing a shared mailbox, the window in + which no clients have the mailbox accessed may be small or non- + existent, effectively rendering the message unexpungeable. + + +4.2. Storing of expunged messages + + Following are some strategies an IMAP server may choose to use when + dealing with a STORE command on expunged messages. + + +4.2.1 If the ".SILENT" suffix is used, and the STORE completed + successfully for all the non-expunged messages, the server SHOULD + return a tagged OK. + + Example: (Building upon the scenario outlined in 4.1.) + + <Client #2 tries to silently STORE flags on expunged and non- + expunged messages. The server sets the flags on the non-expunged + messages and returns OK> + + C2: B001 STORE 1:7 +FLAGS.SILENT (\SEEN) + S2: B001 OK + + + + + + + + + +Gahrns Informational [Page 9] + +RFC 2180 IMAP4 Multi-Accessed Mailbox Practice July 1997 + + +4.2.2. If the ".SILENT" suffix is not used, and only expunged messages + are referenced, the server SHOULD return only a tagged NO. + + Example: (Building upon the scenario outlined in 4.1.) + + <Client #2 tries to STORE flags only on expunged messages> + + C2: B001 STORE 5:7 +FLAGS (\SEEN) + S2: B001 NO Messages have been expunged + + +4.2.3. If the ".SILENT" suffix is not used, and a mixture of expunged + and non-expunged messages are referenced, the server MAY set the + flags and return a FETCH response for the non-expunged messages + along with a tagged NO. + + After receiving a tagged NO STORE response, the client SHOULD issue a + NOOP command so that it will be informed of any pending EXPUNGE + responses. The client may then either reissue the failed STORE + command, or by examining the EXPUNGE responses from the NOOP and + FETCH responses from the STORE, determine that the STORE failed + because of pending expunges. + + Example: (Building upon the scenario outlined in 4.1.) + + <Client #2 tries to STORE flags on a mixture of expunged and non- + expunged messages> + + C2: B001 STORE 1:7 +FLAGS (\SEEN) + S2: * FETCH 1 FLAGS (\SEEN) + S2: * FETCH 2 FLAGS (\SEEN) + S2: * FETCH 3 FLAGS (\SEEN) + S2: B001 NO Some of the messages no longer exist. + + C2: B002 NOOP + S2: * 4 EXPUNGE + S2: * 4 EXPUNGE + S2: * 4 EXPUNGE + S2: * 4 EXPUNGE + S2: * 3 EXISTS + S2: B002 OK NOOP Completed. + + <By receiving FETCH responses for messages 1:3, and an EXPUNGE + response that indicates messages 4:7 have been expunged, the client + does not need to re-issue the STORE> + + + + + + +Gahrns Informational [Page 10] + +RFC 2180 IMAP4 Multi-Accessed Mailbox Practice July 1997 + + +4.2.4. If the ".SILENT" suffix is not used, and a mixture of expunged + and non-expunged messages are referenced, the server MAY return + an untagged NO and not set any flags. + + After receiving a tagged NO STORE response, the client SHOULD issue a + NOOP command so that it will be informed of any pending EXPUNGE + responses. The client would then re-issue the STORE command after + updating its message list per any EXPUNGE response. + + If a large number of clients are accessing a shared mailbox, the + window in which there are no pending expunges may be small or non- + existent, effectively disallowing a client from setting the flags on + all messages at once. + + Example: (Building upon the scenario outlined in 4.1.) + + <Client #2 tries to STORE flags on a mixture of expunged and non- + expunged messages> + + C2: B001 STORE 1:7 +FLAGS (\SEEN) + S2: B001 NO Some of the messages no longer exist. + + <Client #2 issues a NOOP to be informed of the EXPUNGED messages> + + C2: B002 NOOP + S2: * 4 EXPUNGE + S2: * 4 EXPUNGE + S2: * 4 EXPUNGE + S2: * 4 EXPUNGE + S2: * 3 EXISTS + S2: B002 OK NOOP Completed. + + <Client #2 updates its message list and re-issues the STORE on only + those messages that have not been expunged> + + C2: B003 STORE 1:3 +FLAGS (\SEEN) S2: * FETCH 1 FLAGS + (\SEEN) S2: * FETCH 2 FLAGS (\SEEN) S2: * FETCH 3 FLAGS + (\SEEN) S2: B003 OK STORE Completed + + +4.3. Searching of expunged messages + + A server MAY simply not return a search response for messages that + have been expunged and it has not been able to inform the client + about. If a client was expecting a particular message to be returned + in a search result, and it was not, the client SHOULD issue a NOOP + command to see if the message was expunged by another client. + + + + +Gahrns Informational [Page 11] + +RFC 2180 IMAP4 Multi-Accessed Mailbox Practice July 1997 + + +4.4 Copying of expunged messages + + COPY is the only IMAP4 sequence number command that is safe to allow + an EXPUNGE response on. This is because a client is not permitted to + cascade several COPY commands together. A client is required to wait + and confirm that the copy worked before issuing another one. + +4.4.1 The server MAY disallow the COPY of messages in a multi-access + mailbox that contains expunged messages. + + Pending EXPUNGE response(s) MUST be returned to the COPY command. + + Example: + + C: A001 COPY 2,4,6,8 FRED + S: * 4 EXPUNGE + S: A001 NO COPY rejected, because some of the requested + messages were expunged + + Note: Non of the above messages are copied because if a COPY command + is unsuccessful, the server MUST restore the destination mailbox to + its state before the COPY attempt. + + +4.4.2 The server MAY allow the COPY of messages in a multi-access + mailbox that contains expunged messages. + + Pending EXPUNGE response(s) MUST be returned to the COPY command. + Messages that are copied are messages corresponding to sequence + numbers before any EXPUNGE response. + + Example: + + C: A001 COPY 2,4,6,8 FRED + S: * 3 EXPUNGE + S: A001 OK COPY completed + + In the above example, the messages that are copied to FRED are + messages 2,4,6,8 at the start of the COPY command. These are + equivalent to messages 2,3,5,7 at the end of the COPY command. The + EXPUNGE response can't take place until after the messages from the + COPY command are identified (because of the "no expunge while no + commands in progress" rule). + + + + + + + + +Gahrns Informational [Page 12] + +RFC 2180 IMAP4 Multi-Accessed Mailbox Practice July 1997 + + + Example: + + C: A001 COPY 2,4,6,8 FRED + S: * 4 EXPUNGE + S: A001 OK COPY completed + + In the above example, message 4 was copied before it was expunged, + and MUST appear in the destination mailbox FRED. + + +5. Security Considerations + + This document describes behavior of servers that use the IMAP4 + protocol, and as such, has the same security considerations as + described in [RFC-2060]. + + In particular, some described server behavior does not allow for the + immediate deletion of information when a mailbox is accessed by + multiple clients. This may be a consideration when dealing with + sensitive information where immediate deletion would be preferred. + + +6. References + + [RFC-2060], Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, University of Washington, December 1996. + + [RFC-2119], Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", RFC 2119, Harvard University, March 1997. + + +7. Acknowledgments + + This document is the result of discussions on the IMAP4 mailing list + and is meant to reflect consensus of this group. In particular, + Raymond Cheng, Mark Crispin, Jim Evans, Erik Forsberg, Steve Hole, + Mark Keasling, Barry Leiba, Syd Logan, John Mani, Pat Moran, Larry + Osterman, Chris Newman, Bart Schaefer, Vladimir Vulovic, and Jack De + Winter were active participants in this discussion or made + suggestions to this document. + + + + + + + + + + + +Gahrns Informational [Page 13] + +RFC 2180 IMAP4 Multi-Accessed Mailbox Practice July 1997 + + +8. Author's Address + + Mike Gahrns + Microsoft + One Microsoft Way + Redmond, WA, 98072 + + Phone: (206) 936-9833 + EMail: mikega@microsoft.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Gahrns Informational [Page 14] + diff --git a/doc/rfc2192.txt b/doc/rfc2192.txt @@ -0,0 +1,899 @@ + + + + + + +Network Working Group C. Newman +Request for Comments: 2192 Innosoft +Category: Standards Track September 1997 + + + IMAP URL Scheme + + +Status of this memo + + This document specifies an Internet standards track protocol for + the Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is + unlimited. + + +Abstract + + IMAP [IMAP4] is a rich protocol for accessing remote message + stores. It provides an ideal mechanism for accessing public + mailing list archives as well as private and shared message stores. + This document defines a URL scheme for referencing objects on an + IMAP server. + + +1. Conventions used in this document + + The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" + in this document are to be interpreted as defined in "Key words for + use in RFCs to Indicate Requirement Levels" [KEYWORDS]. + + +2. IMAP scheme + + The IMAP URL scheme is used to designate IMAP servers, mailboxes, + messages, MIME bodies [MIME], and search programs on Internet hosts + accessible using the IMAP protocol. + + The IMAP URL follows the common Internet scheme syntax as defined + in RFC 1738 [BASIC-URL] except that clear text passwords are not + permitted. If :<port> is omitted, the port defaults to 143. + + + + + + + + +Newman Standards Track [Page 1] + +RFC 2192 IMAP URL Scheme September 1997 + + + An IMAP URL takes one of the following forms: + + imap://<iserver>/ + imap://<iserver>/<enc_list_mailbox>;TYPE=<list_type> + imap://<iserver>/<enc_mailbox>[uidvalidity][?<enc_search>] + imap://<iserver>/<enc_mailbox>[uidvalidity]<iuid>[isection] + + The first form is used to refer to an IMAP server, the second form + refers to a list of mailboxes, the third form refers to the + contents of a mailbox or a set of messages resulting from a search, + and the final form refers to a specific message or message part. + Note that the syntax here is informal. The authoritative formal + syntax for IMAP URLs is defined in section 11. + + +3. IMAP User Name and Authentication Mechanism + + A user name and/or authentication mechanism may be supplied. They + are used in the "LOGIN" or "AUTHENTICATE" commands after making the + connection to the IMAP server. If no user name or authentication + mechanism is supplied, the user name "anonymous" is used with the + "LOGIN" command and the password is supplied as the Internet e-mail + address of the end user accessing the resource. If the URL doesn't + supply a user name, the program interpreting the IMAP URL SHOULD + request one from the user if necessary. + + An authentication mechanism can be expressed by adding + ";AUTH=<enc_auth_type>" to the end of the user name. When such an + <enc_auth_type> is indicated, the client SHOULD request appropriate + credentials from that mechanism and use the "AUTHENTICATE" command + instead of the "LOGIN" command. If no user name is specified, one + SHOULD be obtained from the mechanism or requested from the user as + appropriate. + + The string ";AUTH=*" indicates that the client SHOULD select an + appropriate authentication mechanism. It MAY use any mechanism + listed in the CAPABILITY command or use an out of band security + service resulting in a PREAUTH connection. If no user name is + specified and no appropriate authentication mechanisms are + available, the client SHOULD fall back to anonymous login as + described above. This allows a URL which grants read-write access + to authorized users, and read-only anonymous access to other users. + + If a user name is included with no authentication mechanism, then + ";AUTH=*" is assumed. + + + + + + +Newman Standards Track [Page 2] + +RFC 2192 IMAP URL Scheme September 1997 + + + Since URLs can easily come from untrusted sources, care must be + taken when resolving a URL which requires or requests any sort of + authentication. If authentication credentials are supplied to the + wrong server, it may compromise the security of the user's account. + The program resolving the URL should make sure it meets at least + one of the following criteria in this case: + + (1) The URL comes from a trusted source, such as a referral server + which the client has validated and trusts according to site policy. + Note that user entry of the URL may or may not count as a trusted + source, depending on the experience level of the user and site + policy. + (2) Explicit local site policy permits the client to connect to the + server in the URL. For example, if the client knows the site + domain name, site policy may dictate that any hostname ending in + that domain is trusted. + (3) The user confirms that connecting to that domain name with the + specified credentials and/or mechanism is permitted. + (4) A mechanism is used which validates the server before passing + potentially compromising client credentials. + (5) An authentication mechanism is used which will not reveal + information to the server which could be used to compromise future + connections. + + URLs which do not include a user name must be treated with extra + care, since they are more likely to compromise the user's primary + account. A URL containing ";AUTH=*" must also be treated with + extra care since it might fall back on a weaker security mechanism. + Finally, clients are discouraged from using a plain text password + as a fallback with ";AUTH=*" unless the connection has strong + encryption (e.g. a key length of greater than 56 bits). + + A program interpreting IMAP URLs MAY cache open connections to an + IMAP server for later re-use. If a URL contains a user name, only + connections authenticated as that user may be re-used. If a URL + does not contain a user name or authentication mechanism, then only + an anonymous connection may be re-used. If a URL contains an + authentication mechanism without a user name, then any non- + anonymous connection may be re-used. + + Note that if unsafe or reserved characters such as " " or ";" are + present in the user name or authentication mechanism, they MUST be + encoded as described in RFC 1738 [BASIC-URL]. + + + + + + + + +Newman Standards Track [Page 3] + +RFC 2192 IMAP URL Scheme September 1997 + + +4. IMAP server + + An IMAP URL referring to an IMAP server has the following form: + + imap://<iserver>/ + + A program interpreting this URL would issue the standard set of + commands it uses to present a view of the contents of an IMAP + server. This is likely to be semanticly equivalent to one of the + following URLs: + + imap://<iserver>/;TYPE=LIST + imap://<iserver>/;TYPE=LSUB + + The program interpreting this URL SHOULD use the LSUB form if it + supports mailbox subscriptions. + + +5. Lists of mailboxes + + An IMAP URL referring to a list of mailboxes has the following + form: + + imap://<iserver>/<enc_list_mailbox>;TYPE=<list_type> + + The <list_type> may be either "LIST" or "LSUB", and is case + insensitive. The field ";TYPE=<list_type>" MUST be included. + + The <enc_list_mailbox> is any argument suitable for the + list_mailbox field of the IMAP [IMAP4] LIST or LSUB commands. The + field <enc_list_mailbox> may be omitted, in which case the program + interpreting the IMAP URL may use "*" or "%" as the + <enc_list_mailbox>. The program SHOULD use "%" if it supports a + hierarchical view, otherwise it SHOULD use "*". + + Note that if unsafe or reserved characters such as " " or "%" are + present in <enc_list_mailbox> they MUST be encoded as described in + RFC 1738 [BASIC-URL]. If the character "/" is present in + enc_list_mailbox, it SHOULD NOT be encoded. + + +6. Lists of messages + + An IMAP URL referring to a list of messages has the following form: + + imap://<iserver>/<enc_mailbox>[uidvalidity][?<enc_search>] + + + + + +Newman Standards Track [Page 4] + +RFC 2192 IMAP URL Scheme September 1997 + + + The <enc_mailbox> field is used as the argument to the IMAP4 + "SELECT" command. Note that if unsafe or reserved characters such + as " ", ";", or "?" are present in <enc_mailbox> they MUST be + encoded as described in RFC 1738 [BASIC-URL]. If the character "/" + is present in enc_mailbox, it SHOULD NOT be encoded. + + The [uidvalidity] field is optional. If it is present, it MUST be + the argument to the IMAP4 UIDVALIDITY status response at the time + the URL was created. This SHOULD be used by the program + interpreting the IMAP URL to determine if the URL is stale. + + The [?<enc_search>] field is optional. If it is not present, the + contents of the mailbox SHOULD be presented by the program + interpreting the URL. If it is present, it SHOULD be used as the + arguments following an IMAP4 SEARCH command with unsafe characters + such as " " (which are likely to be present in the <enc_search>) + encoded as described in RFC 1738 [BASIC-URL]. + + +7. A specific message or message part + + An IMAP URL referring to a specific message or message part has the + following form: + + imap://<iserver>/<enc_mailbox>[uidvalidity]<iuid>[isection] + + The <enc_mailbox> and [uidvalidity] are as defined above. + + If [uidvalidity] is present in this form, it SHOULD be used by the + program interpreting the URL to determine if the URL is stale. + + The <iuid> refers to an IMAP4 message UID, and SHOULD be used as + the <set> argument to the IMAP4 "UID FETCH" command. + + The [isection] field is optional. If not present, the URL refers + to the entire Internet message as returned by the IMAP command "UID + FETCH <uid> BODY.PEEK[]". If present, the URL refers to the object + returned by a "UID FETCH <uid> BODY.PEEK[<section>]" command. The + type of the object may be determined with a "UID FETCH <uid> + BODYSTRUCTURE" command and locating the appropriate part in the + resulting BODYSTRUCTURE. Note that unsafe characters in [isection] + MUST be encoded as described in [BASIC-URL]. + + + + + + + + + +Newman Standards Track [Page 5] + +RFC 2192 IMAP URL Scheme September 1997 + + +8. Relative IMAP URLs + + Relative IMAP URLs are permitted and are resolved according to the + rules defined in RFC 1808 [REL-URL] with one exception. In IMAP + URLs, parameters are treated as part of the normal path with + respect to relative URL resolution. This is believed to be the + behavior of the installed base and is likely to be documented in a + future revision of the relative URL specification. + + The following observations are also important: + + The <iauth> grammar element is considered part of the user name for + purposes of resolving relative IMAP URLs. This means that unless a + new login/server specification is included in the relative URL, the + authentication mechanism is inherited from a base IMAP URL. + + URLs always use "/" as the hierarchy delimiter for the purpose of + resolving paths in relative URLs. IMAP4 permits the use of any + hierarchy delimiter in mailbox names. For this reason, relative + mailbox paths will only work if the mailbox uses "/" as the + hierarchy delimiter. Relative URLs may be used on mailboxes which + use other delimiters, but in that case, the entire mailbox name + MUST be specified in the relative URL or inherited as a whole from + the base URL. + + The base URL for a list of mailboxes or messages which was referred + to by an IMAP URL is always the referring IMAP URL itself. The + base URL for a message or message part which was referred to by an + IMAP URL may be more complicated to determine. The program + interpreting the relative URL will have to check the headers of the + MIME entity and any enclosing MIME entities in order to locate the + "Content-Base" and "Content-Location" headers. These headers are + used to determine the base URL as defined in [HTTP]. For example, + if the referring IMAP URL contains a "/;SECTION=1.2" parameter, + then the MIME headers for section 1.2, for section 1, and for the + enclosing message itself SHOULD be checked in that order for + "Content-Base" or "Content-Location" headers. + + +9. Multinational Considerations + + IMAP4 [IMAP4] section 5.1.3 includes a convention for encoding + non-US-ASCII characters in IMAP mailbox names. Because this + convention is private to IMAP, it is necessary to convert IMAP's + encoding to one that can be more easily interpreted by a URL + display program. For this reason, IMAP's modified UTF-7 encoding + for mailboxes MUST be converted to UTF-8 [UTF8]. Since 8-bit + characters are not permitted in URLs, the UTF-8 characters are + + + +Newman Standards Track [Page 6] + +RFC 2192 IMAP URL Scheme September 1997 + + + encoded as required by the URL specification [BASIC-URL]. Sample + code is included in Appendix A to demonstrate this conversion. + + +10. Examples + + The following examples demonstrate how an IMAP4 client program + might translate various IMAP4 URLs into a series of IMAP4 commands. + Commands sent from the client to the server are prefixed with "C:", + and responses sent from the server to the client are prefixed with + "S:". + + The URL: + + <imap://minbari.org/gray-council;UIDVALIDITY=385759045/;UID=20> + + Results in the following client commands: + + <connect to minbari.org, port 143> + C: A001 LOGIN ANONYMOUS sheridan@babylon5.org + C: A002 SELECT gray-council + <client verifies the UIDVALIDITY matches> + C: A003 UID FETCH 20 BODY.PEEK[] + + The URL: + + <imap://michael@minbari.org/users.*;type=list> + + Results in the following client commands: + + <client requests password from user> + <connect to minbari.org imap server, activate strong encryption> + C: A001 LOGIN MICHAEL zipper + C: A002 LIST "" users.* + + The URL: + + <imap://psicorp.org/~peter/%E6%97%A5%E6%9C%AC%E8%AA%9E/ + %E5%8F%B0%E5%8C%97> + + Results in the following client commands: + + <connect to psicorp.org, port 143> + C: A001 LOGIN ANONYMOUS bester@psycop.psicorp.org + C: A002 SELECT ~peter/&ZeVnLIqe-/&U,BTFw- + <commands the client uses for viewing the contents of a mailbox> + + + + + +Newman Standards Track [Page 7] + +RFC 2192 IMAP URL Scheme September 1997 + + + The URL: + + <imap://;AUTH=KERBEROS_V4@minbari.org/gray-council/;uid=20/ + ;section=1.2> + + Results in the following client commands: + + <connect to minbari.org, port 143> + C: A001 AUTHENTICATE KERBEROS_V4 + <authentication exchange> + C: A002 SELECT gray-council + C: A003 UID FETCH 20 BODY.PEEK[1.2] + + If the following relative URL is located in that body part: + + <;section=1.4> + + This could result in the following client commands: + + C: A004 UID FETCH 20 (BODY.PEEK[1.2.MIME] + BODY.PEEK[1.MIME] + BODY.PEEK[HEADER.FIELDS (Content-Base Content-Location)]) + <Client looks for Content-Base or Content-Location headers in + result. If no such headers, then it does the following> + C: A005 UID FETCH 20 BODY.PEEK[1.4] + + The URL: + + <imap://;AUTH=*@minbari.org/gray%20council?SUBJECT%20shadows> + + Could result in the following: + + <connect to minbari.org, port 143> + C: A001 CAPABILITY + S: * CAPABILITY IMAP4rev1 AUTH=GSSAPI + S: A001 OK + C: A002 AUTHENTICATE GSSAPI + <authentication exchange> + S: A002 OK user lennier authenticated + C: A003 SELECT "gray council" + ... + C: A004 SEARCH SUBJECT shadows + S: * SEARCH 8 10 13 14 15 16 + S: A004 OK SEARCH completed + C: A005 FETCH 8,10,13:16 ALL + ... + + + + + +Newman Standards Track [Page 8] + +RFC 2192 IMAP URL Scheme September 1997 + + + NOTE: In this final example, the client has implementation + dependent choices. The authentication mechanism could be anything, + including PREAUTH. And the final FETCH command could fetch more or + less information about the messages, depending on what it wishes to + display to the user. + + +11. Security Considerations + + Security considerations discussed in the IMAP specification [IMAP4] + and the URL specification [BASIC-URL] are relevant. Security + considerations related to authenticated URLs are discussed in + section 3 of this document. + + Many email clients store the plain text password for later use + after logging into an IMAP server. Such clients MUST NOT use a + stored password in response to an IMAP URL without explicit + permission from the user to supply that password to the specified + host name. + + +12. ABNF for IMAP URL scheme + + This uses ABNF as defined in RFC 822 [IMAIL]. Terminals from the + BNF for IMAP [IMAP4] and URLs [BASIC-URL] are also used. Strings + are not case sensitive and free insertion of linear-white-space is + not permitted. + + achar = uchar / "&" / "=" / "~" + ; see [BASIC-URL] for "uchar" definition + + bchar = achar / ":" / "@" / "/" + + enc_auth_type = 1*achar + ; encoded version of [IMAP-AUTH] "auth_type" + + enc_list_mailbox = 1*bchar + ; encoded version of [IMAP4] "list_mailbox" + + enc_mailbox = 1*bchar + ; encoded version of [IMAP4] "mailbox" + + enc_search = 1*bchar + ; encoded version of search_program below + + enc_section = 1*bchar + ; encoded version of section below + + + + +Newman Standards Track [Page 9] + +RFC 2192 IMAP URL Scheme September 1997 + + + enc_user = 1*achar + ; encoded version of [IMAP4] "userid" + + imapurl = "imap://" iserver "/" [ icommand ] + + iauth = ";AUTH=" ( "*" / enc_auth_type ) + + icommand = imailboxlist / imessagelist / imessagepart + + imailboxlist = [enc_list_mailbox] ";TYPE=" list_type + + imessagelist = enc_mailbox [ "?" enc_search ] [uidvalidity] + + imessagepart = enc_mailbox [uidvalidity] iuid [isection] + + isection = "/;SECTION=" enc_section + + iserver = [iuserauth "@"] hostport + ; See [BASIC-URL] for "hostport" definition + + iuid = "/;UID=" nz_number + ; See [IMAP4] for "nz_number" definition + + iuserauth = enc_user [iauth] / [enc_user] iauth + + list_type = "LIST" / "LSUB" + + search_program = ["CHARSET" SPACE astring SPACE] + search_key *(SPACE search_key) + ; IMAP4 literals may not be used + ; See [IMAP4] for "astring" and "search_key" + + section = section_text / (nz_number *["." nz_number] + ["." (section_text / "MIME")]) + ; See [IMAP4] for "section_text" and "nz_number" + + uidvalidity = ";UIDVALIDITY=" nz_number + ; See [IMAP4] for "nz_number" definition + +13. References + + [BASIC-URL] Berners-Lee, Masinter, McCahill, "Uniform Resource + Locators (URL)", RFC 1738, CERN, Xerox Corporation, University of + Minnesota, December 1994. + + <ftp://ds.internic.net/rfc/rfc1738.txt> + + + + + +Newman Standards Track [Page 10] + +RFC 2192 IMAP URL Scheme September 1997 + + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, University of Washington, December 1996. + + <ftp://ds.internic.net/rfc/rfc2060.txt> + + [IMAP-AUTH] Myers, J., "IMAP4 Authentication Mechanism", RFC 1731, + Carnegie-Mellon University, December 1994. + + <ftp://ds.internic.net/rfc/rfc1731.txt> + + [HTTP] Fielding, Gettys, Mogul, Frystyk, Berners-Lee, "Hypertext + Transfer Protocol -- HTTP/1.1", RFC 2068, UC Irvine, DEC, MIT/LCS, + January 1997. + + <ftp://ds.internic.net/rfc/rfc2068.txt> + + [IMAIL] Crocker, "Standard for the Format of ARPA Internet Text + Messages", STD 11, RFC 822, University of Delaware, August 1982. + + <ftp://ds.internic.net/rfc/rfc822.txt> + + [KEYWORDS] Bradner, "Key words for use in RFCs to Indicate + Requirement Levels", RFC 2119, Harvard University, March 1997. + + <ftp://ds.internic.net/rfc/rfc2119.txt> + + [MIME] Freed, N., Borenstein, N., "Multipurpose Internet Mail + Extensions", RFC 2045, Innosoft, First Virtual, November 1996. + + <ftp://ds.internic.net/rfc/rfc2045.txt> + + [REL-URL] Fielding, "Relative Uniform Resource Locators", RFC 1808, + UC Irvine, June 1995. + + <ftp://ds.internic.net/rfc/rfc1808.txt> + + [UTF8] Yergeau, F. "UTF-8, a transformation format of Unicode and + ISO 10646", RFC 2044, Alis Technologies, October 1996. + + <ftp://ds.internic.net/rfc/rfc2044.txt> + +14. Author's Address + + Chris Newman + Innosoft International, Inc. + 1050 Lakes Drive + West Covina, CA 91790 USA + EMail: chris.newman@innosoft.com + + + +Newman Standards Track [Page 11] + +RFC 2192 IMAP URL Scheme September 1997 + + +Appendix A. Sample code + +Here is sample C source code to convert between URL paths and IMAP +mailbox names, taking into account mapping between IMAP's modified UTF-7 +[IMAP4] and hex-encoded UTF-8 which is more appropriate for URLs. This +code has not been rigorously tested nor does it necessarily behave +reasonably with invalid input, but it should serve as a useful example. +This code just converts the mailbox portion of the URL and does not deal +with parameters, query or server components of the URL. + +#include <stdio.h> +#include <string.h> + +/* hexadecimal lookup table */ +static char hex[] = "0123456789ABCDEF"; + +/* URL unsafe printable characters */ +static char urlunsafe[] = " \"#%&+:;<=>?@[\\]^`{|}"; + +/* UTF7 modified base64 alphabet */ +static char base64chars[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,"; +#define UNDEFINED 64 + +/* UTF16 definitions */ +#define UTF16MASK 0x03FFUL +#define UTF16SHIFT 10 +#define UTF16BASE 0x10000UL +#define UTF16HIGHSTART 0xD800UL +#define UTF16HIGHEND 0xDBFFUL +#define UTF16LOSTART 0xDC00UL +#define UTF16LOEND 0xDFFFUL + +/* Convert an IMAP mailbox to a URL path + * dst needs to have roughly 4 times the storage space of src + * Hex encoding can triple the size of the input + * UTF-7 can be slightly denser than UTF-8 + * (worst case: 8 octets UTF-7 becomes 9 octets UTF-8) + */ +void MailboxToURL(char *dst, char *src) +{ + unsigned char c, i, bitcount; + unsigned long ucs4, utf16, bitbuf; + unsigned char base64[256], utf8[6]; + + + + + + + +Newman Standards Track [Page 12] + +RFC 2192 IMAP URL Scheme September 1997 + + + /* initialize modified base64 decoding table */ + memset(base64, UNDEFINED, sizeof (base64)); + for (i = 0; i < sizeof (base64chars); ++i) { + base64[base64chars[i]] = i; + } + + /* loop until end of string */ + while (*src != '\0') { + c = *src++; + /* deal with literal characters and &- */ + if (c != '&' || *src == '-') { + if (c < ' ' || c > '~' || strchr(urlunsafe, c) != NULL) { + /* hex encode if necessary */ + dst[0] = '%'; + dst[1] = hex[c >> 4]; + dst[2] = hex[c & 0x0f]; + dst += 3; + } else { + /* encode literally */ + *dst++ = c; + } + /* skip over the '-' if this is an &- sequence */ + if (c == '&') ++src; + } else { + /* convert modified UTF-7 -> UTF-16 -> UCS-4 -> UTF-8 -> HEX */ + bitbuf = 0; + bitcount = 0; + ucs4 = 0; + while ((c = base64[(unsigned char) *src]) != UNDEFINED) { + ++src; + bitbuf = (bitbuf << 6) | c; + bitcount += 6; + /* enough bits for a UTF-16 character? */ + if (bitcount >= 16) { + bitcount -= 16; + utf16 = (bitcount ? bitbuf >> bitcount + : bitbuf) & 0xffff; + /* convert UTF16 to UCS4 */ + if + (utf16 >= UTF16HIGHSTART && utf16 <= UTF16HIGHEND) { + ucs4 = (utf16 - UTF16HIGHSTART) << UTF16SHIFT; + continue; + } else if + (utf16 >= UTF16LOSTART && utf16 <= UTF16LOEND) { + ucs4 += utf16 - UTF16LOSTART + UTF16BASE; + } else { + ucs4 = utf16; + } + + + +Newman Standards Track [Page 13] + +RFC 2192 IMAP URL Scheme September 1997 + + + /* convert UTF-16 range of UCS4 to UTF-8 */ + if (ucs4 <= 0x7fUL) { + utf8[0] = ucs4; + i = 1; + } else if (ucs4 <= 0x7ffUL) { + utf8[0] = 0xc0 | (ucs4 >> 6); + utf8[1] = 0x80 | (ucs4 & 0x3f); + i = 2; + } else if (ucs4 <= 0xffffUL) { + utf8[0] = 0xe0 | (ucs4 >> 12); + utf8[1] = 0x80 | ((ucs4 >> 6) & 0x3f); + utf8[2] = 0x80 | (ucs4 & 0x3f); + i = 3; + } else { + utf8[0] = 0xf0 | (ucs4 >> 18); + utf8[1] = 0x80 | ((ucs4 >> 12) & 0x3f); + utf8[2] = 0x80 | ((ucs4 >> 6) & 0x3f); + utf8[3] = 0x80 | (ucs4 & 0x3f); + i = 4; + } + /* convert utf8 to hex */ + for (c = 0; c < i; ++c) { + dst[0] = '%'; + dst[1] = hex[utf8[c] >> 4]; + dst[2] = hex[utf8[c] & 0x0f]; + dst += 3; + } + } + } + /* skip over trailing '-' in modified UTF-7 encoding */ + if (*src == '-') ++src; + } + } + /* terminate destination string */ + *dst = '\0'; +} + +/* Convert hex coded UTF-8 URL path to modified UTF-7 IMAP mailbox + * dst should be about twice the length of src to deal with non-hex + * coded URLs + */ +void URLtoMailbox(char *dst, char *src) +{ + unsigned int utf8pos, utf8total, i, c, utf7mode, bitstogo, utf16flag; + unsigned long ucs4, bitbuf; + unsigned char hextab[256]; + + /* initialize hex lookup table */ + + + +Newman Standards Track [Page 14] + +RFC 2192 IMAP URL Scheme September 1997 + + + memset(hextab, 0, sizeof (hextab)); + for (i = 0; i < sizeof (hex); ++i) { + hextab[hex[i]] = i; + if (isupper(hex[i])) hextab[tolower(hex[i])] = i; + } + + utf7mode = 0; + utf8total = 0; + bitstogo = 0; + while ((c = *src) != '\0') { + ++src; + /* undo hex-encoding */ + if (c == '%' && src[0] != '\0' && src[1] != '\0') { + c = (hextab[src[0]] << 4) | hextab[src[1]]; + src += 2; + } + /* normal character? */ + if (c >= ' ' && c <= '~') { + /* switch out of UTF-7 mode */ + if (utf7mode) { + if (bitstogo) { + *dst++ = base64chars[(bitbuf << (6 - bitstogo)) & 0x3F]; + } + *dst++ = '-'; + utf7mode = 0; + } + *dst++ = c; + /* encode '&' as '&-' */ + if (c == '&') { + *dst++ = '-'; + } + continue; + } + /* switch to UTF-7 mode */ + if (!utf7mode) { + *dst++ = '&'; + utf7mode = 1; + } + /* Encode US-ASCII characters as themselves */ + if (c < 0x80) { + ucs4 = c; + utf8total = 1; + } else if (utf8total) { + /* save UTF8 bits into UCS4 */ + ucs4 = (ucs4 << 6) | (c & 0x3FUL); + if (++utf8pos < utf8total) { + continue; + } + + + +Newman Standards Track [Page 15] + +RFC 2192 IMAP URL Scheme September 1997 + + + } else { + utf8pos = 1; + if (c < 0xE0) { + utf8total = 2; + ucs4 = c & 0x1F; + } else if (c < 0xF0) { + utf8total = 3; + ucs4 = c & 0x0F; + } else { + /* NOTE: can't convert UTF8 sequences longer than 4 */ + utf8total = 4; + ucs4 = c & 0x03; + } + continue; + } + /* loop to split ucs4 into two utf16 chars if necessary */ + utf8total = 0; + do { + if (ucs4 >= UTF16BASE) { + ucs4 -= UTF16BASE; + bitbuf = (bitbuf << 16) | ((ucs4 >> UTF16SHIFT) + + UTF16HIGHSTART); + ucs4 = (ucs4 & UTF16MASK) + UTF16LOSTART; + utf16flag = 1; + } else { + bitbuf = (bitbuf << 16) | ucs4; + utf16flag = 0; + } + bitstogo += 16; + /* spew out base64 */ + while (bitstogo >= 6) { + bitstogo -= 6; + *dst++ = base64chars[(bitstogo ? (bitbuf >> bitstogo) + : bitbuf) + & 0x3F]; + } + } while (utf16flag); + } + /* if in UTF-7 mode, finish in ASCII */ + if (utf7mode) { + if (bitstogo) { + *dst++ = base64chars[(bitbuf << (6 - bitstogo)) & 0x3F]; + } + *dst++ = '-'; + } + /* tie off string */ + *dst = '\0'; +} + + + +Newman Standards Track [Page 16] + diff --git a/doc/rfc2193.txt b/doc/rfc2193.txt @@ -0,0 +1,507 @@ + + + + + + +Network Working Group M. Gahrns +Request for Comments: 2193 Microsoft +Category: Standards Track September 1997 + + + IMAP4 Mailbox Referrals + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +1. Abstract + + When dealing with large amounts of users, messages and geographically + dispersed IMAP4 [RFC-2060] servers, it is often desirable to + distribute messages amongst different servers within an organization. + For example an administrator may choose to store user's personal + mailboxes on a local IMAP4 server, while storing shared mailboxes + remotely on another server. This type of configuration is common + when it is uneconomical to store all data centrally due to limited + bandwidth or disk resources. + + Mailbox referrals allow clients to seamlessly access mailboxes that + are distributed across several IMAP4 servers. + + A referral mechanism can provide efficiencies over the alternative + "proxy method", in which the local IMAP4 server contacts the remote + server on behalf of the client, and then transfers the data from the + remote server to itself, and then on to the client. The referral + mechanism's direct client connection to the remote server is often a + more efficient use of bandwidth, and does not require the local + server to impersonate the client when authenticating to the remote + server. + +2. Conventions used in this document + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. + + A home server, is an IMAP4 server that contains the user's inbox. + + A remote mailbox is a mailbox that is not hosted on the user's home + server. + + + + +Gahrns Standards Track [Page 1] + +RFC 2193 IMAP4 Mailbox Referrals September 1997 + + + A remote server is a server that contains remote mailboxes. + + A shared mailbox, is a mailbox that multiple users have access to. + + An IMAP mailbox referral is when the server directs the client to + another IMAP mailbox. + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [RFC-2119]. + +3. Introduction and Overview + + IMAP4 servers that support this extension MUST list the keyword + MAILBOX-REFERRALS in their CAPABILITY response. No client action is + needed to invoke the MAILBOX-REFERRALS capability in a server. + + A MAILBOX-REFERRALS capable IMAP4 server MUST NOT return referrals + that result in a referrals loop. + + A referral response consists of a tagged NO response and a REFERRAL + response code. The REFERRAL response code MUST contain as an + argument a one or more valid URLs separated by a space as defined in + [RFC-1738]. If a server replies with multiple URLs for a particular + object, they MUST all be of the same type. In this case, the URL MUST + be an IMAP URL as defined in [RFC-2192]. A client that supports the + REFERRALS extension MUST be prepared for a URL of any type, but it + need only be able to process IMAP URLs. + + A server MAY respond with multiple IMAP mailbox referrals if there is + more than one replica of the mailbox. This allows the implementation + of a load balancing or failover scheme. How a server keeps multiple + replicas of a mailbox in sync is not addressed by this document. + + If the server has a preferred order in which the client should + attempt to access the URLs, the preferred URL SHOULD be listed in the + first, with the remaining URLs presented in descending order of + preference. If multiple referrals are given for a mailbox, a server + should be aware that there are synchronization issues for a client if + the UIDVALIDITY of the referred mailboxes are different. + + An IMAP mailbox referral may be given in response to an IMAP command + that specifies a mailbox as an argument. + + + + + + + + +Gahrns Standards Track [Page 2] + +RFC 2193 IMAP4 Mailbox Referrals September 1997 + + + Example: + + A001 NO [REFERRAL IMAP://user;AUTH=*@SERVER2/REMOTE]Remote Mailbox + + NOTE: user;AUTH=* is specified as required by [RFC-2192] to avoid a + client falling back to anonymous login. + + Remote mailboxes and their inferiors, that are accessible only via + referrals SHOULD NOT appear in LIST and LSUB responses issued against + the user's home server. They MUST appear in RLIST and RLSUB + responses issued against the user's home server. Hierarchy referrals, + in which a client would be required to connect to the remote server + to issue a LIST to discover the inferiors of a mailbox are not + addressed in this document. + + For example, if shared mailboxes were only accessible via referrals + on a remote server, a RLIST "" "#SHARED/%" command would return the + same response if issued against the user's home server or the remote + server. + + Note: Mailboxes that are available on the user's home server do not + need to be available on the remote server. In addition, there may be + additional mailboxes available on the remote server, but they will + not accessible to the client via referrals unless they appear in the + LIST response to the RLIST command against the user's home server. + + A MAILBOX-REFERRALS capable client will issue the RLIST and RLSUB + commands in lieu of LIST and LSUB. The RLIST and RLSUB commands + behave identically to their LIST and LSUB counterparts, except remote + mailboxes are returned in addition to local mailboxes in the LIST and + LSUB responses. This avoids displaying to a non MAILBOX-REFERRALS + enabled client inaccessible remote mailboxes. + +4.1. SELECT, EXAMINE, DELETE, SUBSCRIBE, UNSUBSCRIBE, STATUS and APPEND + Referrals + + An IMAP4 server MAY respond to the SELECT, EXAMINE, DELETE, + SUBSCRIBE, UNSUBSCRIBE, STATUS or APPEND command with one or more + IMAP mailbox referrals to indicate to the client that the mailbox is + hosted on a remote server. + + When a client processes an IMAP mailbox referral, it will open a new + connection or use an existing connection to the remote server so that + it is able to issue the commands necessary to process the remote + mailbox. + + + + + + +Gahrns Standards Track [Page 3] + +RFC 2193 IMAP4 Mailbox Referrals September 1997 + + + Example: <IMAP4 connection to home server> + + C: A001 DELETE "SHARED/FOO" + S: A001 NO [REFERRAL IMAP://user;AUTH=*@SERVER2/SHARED/FOO] + Remote mailbox. Try SERVER2. + + <Client established a second connection to SERVER2 and + issues the DELETE command on the referred mailbox> + + S: * OK IMAP4rev1 server ready + C: B001 AUTHENTICATE KERBEROS_V4 + <authentication exchange> + S: B001 OK user is authenticated + + C: B002 DELETE "SHARED/FOO" + S: B002 OK DELETE completed + + Example: <IMAP4 connection to home server> + + C: A001 SELECT REMOTE + S: A001 NO [REFERRAL IMAP://user;AUTH=*@SERVER2/REMOTE + IMAP://user;AUTH=*@SERVER3/REMOTE] Remote mailbox. + Try SERVER2 or SERVER3. + + <Client opens second connection to remote server, and + issues the commands needed to process the items in the + remote mailbox> + + S: * OK IMAP4rev1 server ready + C: B001 AUTHENTICATE KERBEROS_V4 + <authentication exchange> + S: B001 OK user is authenticated + + C: B002 SELECT REMOTE + S: * 12 EXISTS + S: * 1 RECENT + S: * OK [UNSEEN 10] Message 10 is first unseen + S: * OK [UIDVALIDITY 123456789] + S: * FLAGS (Answered Flagged Deleted Seen Draft) + S: * OK [PERMANENTFLAGS (Answered Deleted Seen ] + S: B002 OK [READ-WRITE] Selected completed + + C: B003 FETCH 10:12 RFC822 + S: * 10 FETCH . . . + S: * 11 FETCH . . . + S: * 12 FETCH . . . + S: B003 OK FETCH Completed + + + + +Gahrns Standards Track [Page 4] + +RFC 2193 IMAP4 Mailbox Referrals September 1997 + + + <Client is finished processing the REMOTE mailbox and + wants to process a mailbox on its home server> + + C: B004 LOGOUT + S: * BYE IMAP4rev1 server logging out + S: B004 OK LOGOUT Completed + + <Client continues with first connection> + + C: A002 SELECT INBOX + S: * 16 EXISTS + S: * 2 RECENT + S: * OK [UNSEEN 10] Message 10 is first unseen + S: * OK [UIDVALIDITY 123456789] + S: * FLAGS (Answered Flagged Deleted Seen Draft) + S: * OK [PERMANENTFLAGS (Answered Deleted Seen ] + S: A002 OK [READ-WRITE] Selected completed + +4.2. CREATE Referrals + + An IMAP4 server MAY respond to the CREATE command with one or more + IMAP mailbox referrals, if it wishes to direct the client to issue + the CREATE against another server. The server can employ any means, + such as examining the hierarchy of the specified mailbox name, in + determining which server the mailbox should be created on. + + Example: + + C: A001 CREATE "SHARED/FOO" + S: A001 NO [REFERRAL IMAP://user;AUTH=*@SERVER2/SHARED/FOO] + Mailbox should be created on remote server + + Alternatively, because a home server is required to maintain a + listing of referred remote mailboxes, a server MAY allow the creation + of a mailbox that will ultimately reside on a remote server against + the home server, and provide referrals on subsequent commands that + manipulate the mailbox. + + Example: + + C: A001 CREATE "SHARED/FOO" + S: A001 OK CREATE succeeded + + C: A002 SELECT "SHARED/FOO" + S: A002 NO [REFERRAL IMAP://user;AUTH=*@SERVER2/SHARED/FOO] + Remote mailbox. Try SERVER2 + + + + + +Gahrns Standards Track [Page 5] + +RFC 2193 IMAP4 Mailbox Referrals September 1997 + + +4.3. RENAME Referrals + + An IMAP4 server MAY respond to the RENAME command with one or more + pairs of IMAP mailbox referrals. In each pair of IMAP mailbox + referrals, the first one is an URL to the existing mailbox name and + the second is an URL to the requested new mailbox name. + + If within an IMAP mailbox referral pair, the existing and new mailbox + URLs are on different servers, the remote servers are unable to + perform the RENAME operation. To achieve the same behavior of + server RENAME, the client MAY issue the constituent CREATE, FETCH, + APPEND, and DELETE commands against both servers. + + If within an IMAP mailbox referral pair, the existing and new mailbox + URLs are on the same server it is an indication that the currently + connected server is unable to perform the operation. The client can + simply re-issue the RENAME command on the remote server. + + Example: + + C: A001 RENAME FOO BAR + S: A001 NO [REFERRAL IMAP://user;AUTH=*@SERVER1/FOO + IMAP://user;AUTH=*@SERVER2/BAR] Unable to rename mailbox + across servers + + Since the existing and new mailbox names are on different servers, + the client would be required to make a connection to both servers and + issue the constituent commands require to achieve the RENAME. + + Example: + + C: A001 RENAME FOO BAR + S: A001 NO [REFERRAL IMAP://user;AUTH=*@SERVER2/FOO + IMAP://user;AUTH=*@SERVER2/BAR] Unable to rename mailbox + located on SERVER2 + + Since both the existing and new mailbox are on the same remote + server, the client can simply make a connection to the remote server + and re-issue the RENAME command. + +4.4. COPY Referrals + + An IMAP4 server MAY respond to the COPY command with one or more IMAP + mailbox referrals. This indicates that the destination mailbox is on + a remote server. To achieve the same behavior of a server COPY, the + client MAY issue the constituent FETCH and APPEND commands against + both servers. + + + + +Gahrns Standards Track [Page 6] + +RFC 2193 IMAP4 Mailbox Referrals September 1997 + + + Example: + + C: A001 COPY 1 "SHARED/STUFF" + S: A001 NO [REFERRAL IMAP://user;AUTH=*@SERVER2/SHARED/STUFF] + Unable to copy message(s) to SERVER2. + +5.1 RLIST command + + Arguments: reference name + mailbox name with possible wildcards + + Responses: untagged responses: LIST + + Result: OK - RLIST Completed + NO - RLIST Failure + BAD - command unknown or arguments invalid + + The RLIST command behaves identically to its LIST counterpart, except + remote mailboxes are returned in addition to local mailboxes in the + LIST responses. + +5.2 RLSUB Command + + Arguments: reference name + mailbox name with possible wildcards + + Responses: untagged responses: LSUB + + Result: OK - RLSUB Completed + NO - RLSUB Failure + BAD - command unknown or arguments invalid + + The RLSUB command behaves identically to its LSUB counterpart, except + remote mailboxes are returned in addition to local mailboxes in the + LSUB responses. + +6. Formal Syntax + + The following syntax specification uses the augmented Backus-Naur + Form (BNF) as described in [ABNF]. + + list_mailbox = <list_mailbox> as defined in [RFC-2060] + + mailbox = <mailbox> as defined in [RFC-2060] + + mailbox_referral = <tag> SPACE "NO" SPACE + <referral_response_code> (text / text_mime2) + ; See [RFC-2060] for <tag>, text and text_mime2 definition + + + +Gahrns Standards Track [Page 7] + +RFC 2193 IMAP4 Mailbox Referrals September 1997 + + + referral_response_code = "[" "REFERRAL" 1*(SPACE <url>) "]" + ; See [RFC-1738] for <url> definition + + rlist = "RLIST" SPACE mailbox SPACE list_mailbox + + rlsub = "RLSUB" SPACE mailbox SPACE list_mailbox + +6. Security Considerations + + The IMAP4 referral mechanism makes use of IMAP URLs, and as such, + have the same security considerations as general internet URLs [RFC- + 1738], and in particular IMAP URLs [RFC-2192]. + + With the MAILBOX-REFERRALS capability, it is potentially easier to + write a rogue server that injects a bogus referral response that + directs a user to an incorrect mailbox. Although referrals reduce + the effort to write such a server, the referral response makes + detection of the intrusion easier. + +7. References + + [RFC-2060], Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, University of Washington, December 1996. + + [RFC-2192], Newman, C., "IMAP URL Scheme", RFC 2192, Innosoft, + September 1997. + + [RFC-1738], Berners-Lee, T., Masinter, L., and M. McCahill, "Uniform + Resource Locators (URL)", RFC 1738, CERN, Xerox Corporation, + University of Minnesota, December 1994. + + [RFC-2119], Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", RFC 2119, Harvard University, March 1997. + + [ABNF], DRUMS working group, Dave Crocker Editor, "Augmented BNF for + Syntax Specifications: ABNF", Work in Progress, Internet Mail + Consortium, April 1997. + +8. Acknowledgments + + Many valuable suggestions were received from private discussions and + the IMAP4 mailing list. In particular, Raymond Cheng, Mark Crispin, + Mark Keasling, Chris Newman and Larry Osterman made significant + contributions to this document. + + + + + + + +Gahrns Standards Track [Page 8] + +RFC 2193 IMAP4 Mailbox Referrals September 1997 + + +9. Author's Address + + Mike Gahrns + Microsoft + One Microsoft Way + Redmond, WA, 98072 + + Phone: (206) 936-9833 + EMail: mikega@microsoft.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Gahrns Standards Track [Page 9] + diff --git a/doc/rfc2195.txt b/doc/rfc2195.txt @@ -0,0 +1,283 @@ + + + + + + +Network Working Group J. Klensin +Request for Comments: 2195 R. Catoe +Category: Standards Track P. Krumviede +Obsoletes: 2095 MCI + September 1997 + + + IMAP/POP AUTHorize Extension for Simple Challenge/Response + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Abstract + + While IMAP4 supports a number of strong authentication mechanisms as + described in RFC 1731, it lacks any mechanism that neither passes + cleartext, reusable passwords across the network nor requires either + a significant security infrastructure or that the mail server update + a mail-system-wide user authentication file on each mail access. + This specification provides a simple challenge-response + authentication protocol that is suitable for use with IMAP4. Since + it utilizes Keyed-MD5 digests and does not require that the secret be + stored in the clear on the server, it may also constitute an + improvement on APOP for POP3 use as specified in RFC 1734. + +1. Introduction + + Existing Proposed Standards specify an AUTHENTICATE mechanism for the + IMAP4 protocol [IMAP, IMAP-AUTH] and a parallel AUTH mechanism for + the POP3 protocol [POP3-AUTH]. The AUTHENTICATE mechanism is + intended to be extensible; the four methods specified in [IMAP-AUTH] + are all fairly powerful and require some security infrastructure to + support. The base POP3 specification [POP3] also contains a + lightweight challenge-response mechanism called APOP. APOP is + associated with most of the risks associated with such protocols: in + particular, it requires that both the client and server machines have + access to the shared secret in cleartext form. CRAM offers a method + for avoiding such cleartext storage while retaining the algorithmic + simplicity of APOP in using only MD5, though in a "keyed" method. + + + + + + + +Klensin, Catoe & Krumviede Standards Track [Page 1] + +RFC 2195 IMAP/POP AUTHorize Extension September 1997 + + + At present, IMAP [IMAP] lacks any facility corresponding to APOP. + The only alternative to the strong mechanisms identified in [IMAP- + AUTH] is a presumably cleartext username and password, supported + through the LOGIN command in [IMAP]. This document describes a + simple challenge-response mechanism, similar to APOP and PPP CHAP + [PPP], that can be used with IMAP (and, in principle, with POP3). + + This mechanism also has the advantage over some possible alternatives + of not requiring that the server maintain information about email + "logins" on a per-login basis. While mechanisms that do require such + per-login history records may offer enhanced security, protocols such + as IMAP, which may have several connections between a given client + and server open more or less simultaneous, may make their + implementation particularly challenging. + +2. Challenge-Response Authentication Mechanism (CRAM) + + The authentication type associated with CRAM is "CRAM-MD5". + + The data encoded in the first ready response contains an + presumptively arbitrary string of random digits, a timestamp, and the + fully-qualified primary host name of the server. The syntax of the + unencoded form must correspond to that of an RFC 822 'msg-id' + [RFC822] as described in [POP3]. + + The client makes note of the data and then responds with a string + consisting of the user name, a space, and a 'digest'. The latter is + computed by applying the keyed MD5 algorithm from [KEYED-MD5] where + the key is a shared secret and the digested text is the timestamp + (including angle-brackets). + + This shared secret is a string known only to the client and server. + The `digest' parameter itself is a 16-octet value which is sent in + hexadecimal format, using lower-case ASCII characters. + + When the server receives this client response, it verifies the digest + provided. If the digest is correct, the server should consider the + client authenticated and respond appropriately. + + Keyed MD5 is chosen for this application because of the greater + security imparted to authentication of short messages. In addition, + the use of the techniques described in [KEYED-MD5] for precomputation + of intermediate results make it possible to avoid explicit cleartext + storage of the shared secret on the server system by instead storing + the intermediate results which are known as "contexts". + + + + + + +Klensin, Catoe & Krumviede Standards Track [Page 2] + +RFC 2195 IMAP/POP AUTHorize Extension September 1997 + + + CRAM does not support a protection mechanism. + + Example: + + The examples in this document show the use of the CRAM mechanism with + the IMAP4 AUTHENTICATE command [IMAP-AUTH]. The base64 encoding of + the challenges and responses is part of the IMAP4 AUTHENTICATE + command, not part of the CRAM specification itself. + + S: * OK IMAP4 Server + C: A0001 AUTHENTICATE CRAM-MD5 + S: + PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ+ + C: dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw + S: A0001 OK CRAM authentication successful + + In this example, the shared secret is the string + 'tanstaaftanstaaf'. Hence, the Keyed MD5 digest is produced by + calculating + + MD5((tanstaaftanstaaf XOR opad), + MD5((tanstaaftanstaaf XOR ipad), + <1896.697170952@postoffice.reston.mci.net>)) + + where ipad and opad are as defined in the keyed-MD5 Work in + Progress [KEYED-MD5] and the string shown in the challenge is the + base64 encoding of <1896.697170952@postoffice.reston.mci.net>. The + shared secret is null-padded to a length of 64 bytes. If the + shared secret is longer than 64 bytes, the MD5 digest of the + shared secret is used as a 16 byte input to the keyed MD5 + calculation. + + This produces a digest value (in hexadecimal) of + + b913a602c7eda7a495b4e6e7334d3890 + + The user name is then prepended to it, forming + + tim b913a602c7eda7a495b4e6e7334d3890 + + Which is then base64 encoded to meet the requirements of the IMAP4 + AUTHENTICATE command (or the similar POP3 AUTH command), yielding + + dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw + + + + + + + + +Klensin, Catoe & Krumviede Standards Track [Page 3] + +RFC 2195 IMAP/POP AUTHorize Extension September 1997 + + +3. References + + [CHAP] Lloyd, B., and W. Simpson, "PPP Authentication Protocols", + RFC 1334, October 1992. + + [IMAP] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, University of Washington, December 1996. + + [IMAP-AUTH] Myers, J., "IMAP4 Authentication Mechanisms", + RFC 1731, Carnegie Mellon, December 1994. + + [KEYED-MD5] Krawczyk, Bellare, Canetti, "HMAC: Keyed-Hashing for + Message Authentication", RFC 2104, February 1997. + + [MD5] Rivest, R., "The MD5 Message Digest Algorithm", + RFC 1321, MIT Laboratory for Computer Science, April 1992. + + [POP3] Myers, J., and M. Rose, "Post Office Protocol - Version 3", + STD 53, RFC 1939, Carnegie Mellon, May 1996. + + [POP3-AUTH] Myers, J., "POP3 AUTHentication command", RFC 1734, + Carnegie Mellon, December, 1994. + +4. Security Considerations + + It is conjectured that use of the CRAM authentication mechanism + provides origin identification and replay protection for a session. + Accordingly, a server that implements both a cleartext password + command and this authentication type should not allow both methods of + access for a given user. + + While the saving, on the server, of "contexts" (see section 2) is + marginally better than saving the shared secrets in cleartext as is + required by CHAP [CHAP] and APOP [POP3], it is not sufficient to + protect the secrets if the server itself is compromised. + Consequently, servers that store the secrets or contexts must both be + protected to a level appropriate to the potential information value + in user mailboxes and identities. + + As the length of the shared secret increases, so does the difficulty + of deriving it. + + While there are now suggestions in the literature that the use of MD5 + and keyed MD5 in authentication procedures probably has a limited + effective lifetime, the technique is now widely deployed and widely + understood. It is believed that this general understanding may + assist with the rapid replacement, by CRAM-MD5, of the current uses + of permanent cleartext passwords in IMAP. This document has been + + + +Klensin, Catoe & Krumviede Standards Track [Page 4] + +RFC 2195 IMAP/POP AUTHorize Extension September 1997 + + + deliberately written to permit easy upgrading to use SHA (or whatever + alternatives emerge) when they are considered to be widely available + and adequately safe. + + Even with the use of CRAM, users are still vulnerable to active + attacks. An example of an increasingly common active attack is 'TCP + Session Hijacking' as described in CERT Advisory CA-95:01 [CERT95]. + + See section 1 above for additional discussion. + +5. Acknowledgements + + This memo borrows ideas and some text liberally from [POP3] and + [RFC-1731] and thanks are due the authors of those documents. Ran + Atkinson made a number of valuable technical and editorial + contributions to the document. + +6. Authors' Addresses + + John C. Klensin + MCI Telecommunications + 800 Boylston St, 7th floor + Boston, MA 02199 + USA + + EMail: klensin@mci.net + Phone: +1 617 960 1011 + + Randy Catoe + MCI Telecommunications + 2100 Reston Parkway + Reston, VA 22091 + USA + + EMail: randy@mci.net + Phone: +1 703 715 7366 + + Paul Krumviede + MCI Telecommunications + 2100 Reston Parkway + Reston, VA 22091 + USA + + EMail: paul@mci.net + Phone: +1 703 715 7251 + + + + + + +Klensin, Catoe & Krumviede Standards Track [Page 5] + diff --git a/doc/rfc2221.txt b/doc/rfc2221.txt @@ -0,0 +1,283 @@ + + + + + + +Network Working Group M. Gahrns +Request for Comments: 2221 Microsoft +Category: Standards Track October 1997 + + + IMAP4 Login Referrals + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (1997). All Rights Reserved. + +1. Abstract + + When dealing with large amounts of users and many IMAP4 [RFC-2060] + servers, it is often necessary to move users from one IMAP4 server to + another. For example, hardware failures or organizational changes + may dictate such a move. + + Login referrals allow clients to transparently connect to an + alternate IMAP4 server, if their home IMAP4 server has changed. + + A referral mechanism can provide efficiencies over the alternative + 'proxy method', in which the local IMAP4 server contacts the remote + server on behalf of the client, and then transfers the data from the + remote server to itself, and then on to the client. The referral + mechanism's direct client connection to the remote server is often a + more efficient use of bandwidth, and does not require the local + server to impersonate the client when authenticating to the remote + server. + +2. Conventions used in this document + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. + + A home server, is an IMAP4 server that contains the user's inbox. + + A remote server is a server that contains remote mailboxes. + + + + + +Gahrns Standards Track [Page 1] + +RFC 2221 IMAP4 Login Referrals October 1997 + + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [RFC-2119]. + +3. Introduction and Overview + + IMAP4 servers that support this extension MUST list the keyword + LOGIN-REFERRALS in their CAPABILITY response. No client action is + needed to invoke the LOGIN-REFERRALS capability in a server. + + A LOGIN-REFERRALS capable IMAP4 server SHOULD NOT return a referral + to a server that will return a referral. A client MUST NOT follow + more than 10 levels of referral without consulting the user. + + A LOGIN-REFERRALS response code MUST contain as an argument a valid + IMAP server URL as defined in [IMAP-URL]. + + A home server referral consists of either a tagged NO or OK, or an + untagged BYE response that contains a LOGIN-REFERRALS response code. + + Example: A001 NO [REFERRAL IMAP://user;AUTH=*@SERVER2/] Remote Server + + NOTE: user;AUTH=* is specified as required by [IMAP-URL] to avoid a + client falling back to anonymous login. + +4. Home Server Referrals + + A home server referral may be returned in response to an AUTHENTICATE + or LOGIN command, or it may appear in the connection startup banner. + If a server returns a home server referral in a tagged NO response, + that server does not contain any mailboxes that are accessible to the + user. If a server returns a home server referral in a tagged OK + response, it indicates that the user's personal mailboxes are + elsewhere, but the server contains public mailboxes which are + readable by the user. After receiving a home server referral, the + client can not make any assumptions as to whether this was a + permanent or temporary move of the user. + +4.1. LOGIN and AUTHENTICATE Referrals + + An IMAP4 server MAY respond to a LOGIN or AUTHENTICATE command with a + home server referral if it wishes to direct the user to another IMAP4 + server. + + Example: C: A001 LOGIN MIKE PASSWORD + S: A001 NO [REFERRAL IMAP://MIKE@SERVER2/] Specified user + is invalid on this server. Try SERVER2. + + + + +Gahrns Standards Track [Page 2] + +RFC 2221 IMAP4 Login Referrals October 1997 + + + Example: C: A001 LOGIN MATTHEW PASSWORD + S: A001 OK [REFERRAL IMAP://MATTHEW@SERVER2/] Specified + user's personal mailboxes located on Server2, but + public mailboxes are available. + + Example: C: A001 AUTHENTICATE GSSAPI + <authentication exchange> + S: A001 NO [REFERRAL IMAP://user;AUTH=GSSAPI@SERVER2/] + Specified user is invalid on this server. Try + SERVER2. + +4.2. BYE at connection startup referral + + An IMAP4 server MAY respond with an untagged BYE and a REFERRAL + response code that contains an IMAP URL to a home server if it is not + willing to accept connections and wishes to direct the client to + another IMAP4 server. + + Example: S: * BYE [REFERRAL IMAP://user;AUTH=*@SERVER2/] Server not + accepting connections. Try SERVER2 + +5. Formal Syntax + + The following syntax specification uses the augmented Backus-Naur + Form (BNF) as described in [ABNF]. + + This amends the "resp_text_code" element of the IMAP4 grammar + described in [RFC-2060] + + resp_text_code =/ "REFERRAL" SPACE <imapurl> + ; See [IMAP-URL] for definition of <imapurl> + ; See [RFC-2060] for base definition of resp_text_code + +6. Security Considerations + + The IMAP4 login referral mechanism makes use of IMAP URLs, and as + such, have the same security considerations as general internet URLs + [RFC-1738], and in particular IMAP URLs [IMAP-URL]. + + A server MUST NOT give a login referral if authentication for that + user fails. This is to avoid revealing information about the user's + account to an unauthorized user. + + With the LOGIN-REFERRALS capability, it is potentially easier to + write a rogue 'password catching' server that collects login data and + then refers the client to their actual IMAP4 server. Although + referrals reduce the effort to write such a server, the referral + response makes detection of the intrusion easier. + + + +Gahrns Standards Track [Page 3] + +RFC 2221 IMAP4 Login Referrals October 1997 + + +7. References + + [RFC-2060], Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + [IMAP-URL], Newman, C., "IMAP URL Scheme", RFC 2192, Innosoft, + September 1997. + + [RFC-1738], Berners-Lee, T., Masinter, L. and M. McCahill, "Uniform + Resource Locators (URL)", RFC 1738, December 1994. + + [RFC-2119], Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", RFC 2119, March 1997. + + [ABNF], DRUMS working group, Dave Crocker Editor, "Augmented BNF for + Syntax Specifications: ABNF", Work in Progress. + +8. Acknowledgments + + Many valuable suggestions were received from private discussions and + the IMAP4 mailing list. In particular, Raymond Cheng, Mark Crispin, + Mark Keasling Chris Newman and Larry Osterman made significant + contributions to this document. + +9. Author's Address + + Mike Gahrns + Microsoft + One Microsoft Way + Redmond, WA, 98072 + + Phone: (206) 936-9833 + EMail: mikega@microsoft.com + + + + + + + + + + + + + + + + + + +Gahrns Standards Track [Page 4] + +RFC 2221 IMAP4 Login Referrals October 1997 + + +10. Full Copyright Statement + + Copyright (C) The Internet Society (1997). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implmentation may be prepared, copied, published + andand distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE." + + + + + + + + + + + + + + + + + + + + + + + + +Gahrns Standards Track [Page 5] + diff --git a/doc/rfc2342.txt b/doc/rfc2342.txt @@ -0,0 +1,563 @@ + + + + + + +Network Working Group M. Gahrns +Request for Comments: 2342 Microsoft +Category: Standards Track C. Newman + Innosoft + May 1998 + + + IMAP4 Namespace + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (1998). All Rights Reserved. + +1. Abstract + + IMAP4 [RFC-2060] does not define a default server namespace. As a + result, two common namespace models have evolved: + + The "Personal Mailbox" model, in which the default namespace that is + presented consists of only the user's personal mailboxes. To access + shared mailboxes, the user must use an escape mechanism to reach + another namespace. + + The "Complete Hierarchy" model, in which the default namespace that + is presented includes the user's personal mailboxes along with any + other mailboxes they have access to. + + These two models, create difficulties for certain client operations. + This document defines a NAMESPACE command that allows a client to + discover the prefixes of namespaces used by a server for personal + mailboxes, other users' mailboxes, and shared mailboxes. This allows + a client to avoid much of the manual user configuration that is now + necessary when mixing and matching IMAP4 clients and servers. + +2. Conventions used in this document + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. If such lines are wrapped without a new "C:" or + "S:" label, then the wrapping is for editorial clarity and is not + part of the command. + + + +Gahrns & Newman Standards Track [Page 1] + +RFC 2342 IMAP4 Namespace May 1998 + + + Personal Namespace: A namespace that the server considers within the + personal scope of the authenticated user on a particular connection. + Typically, only the authenticated user has access to mailboxes in + their Personal Namespace. It is the part of the namespace that + belongs to the user that is allocated for mailboxes. If an INBOX + exists for a user, it MUST appear within the user's personal + namespace. In the typical case, there SHOULD be only one Personal + Namespace on a server. + + Other Users' Namespace: A namespace that consists of mailboxes from + the Personal Namespaces of other users. To access mailboxes in the + Other Users' Namespace, the currently authenticated user MUST be + explicitly granted access rights. For example, it is common for a + manager to grant to their secretary access rights to their mailbox. + In the typical case, there SHOULD be only one Other Users' Namespace + on a server. + + Shared Namespace: A namespace that consists of mailboxes that are + intended to be shared amongst users and do not exist within a user's + Personal Namespace. + + The namespaces a server uses MAY differ on a per-user basis. + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [RFC-2119]. + +3. Introduction and Overview + + Clients often attempt to create mailboxes for such purposes as + maintaining a record of sent messages (e.g. "Sent Mail") or + temporarily saving messages being composed (e.g. "Drafts"). For + these clients to inter-operate correctly with the variety of IMAP4 + servers available, the user must enter the prefix of the Personal + Namespace used by the server. Using the NAMESPACE command, a client + is able to automatically discover this prefix without manual user + configuration. + + In addition, users are often required to manually enter the prefixes + of various namespaces in order to view the mailboxes located there. + For example, they might be required to enter the prefix of #shared to + view the shared mailboxes namespace. The NAMESPACE command allows a + client to automatically discover the namespaces that are available on + a server. This allows a client to present the available namespaces to + the user in what ever manner it deems appropriate. For example, a + + + + + + +Gahrns & Newman Standards Track [Page 2] + +RFC 2342 IMAP4 Namespace May 1998 + + + client could choose to initially display only personal mailboxes, or + it may choose to display the complete list of mailboxes available, + and initially position the user at the root of their Personal + Namespace. + + A server MAY choose to make available to the NAMESPACE command only a + subset of the complete set of namespaces the server supports. To + provide the ability to access these namespaces, a client SHOULD allow + the user the ability to manually enter a namespace prefix. + +4. Requirements + + IMAP4 servers that support this extension MUST list the keyword + NAMESPACE in their CAPABILITY response. + + The NAMESPACE command is valid in the Authenticated and Selected + state. + +5. NAMESPACE Command + + Arguments: none + + Response: an untagged NAMESPACE response that contains the prefix + and hierarchy delimiter to the server's Personal + Namespace(s), Other Users' Namespace(s), and Shared + Namespace(s) that the server wishes to expose. The + response will contain a NIL for any namespace class + that is not available. Namespace_Response_Extensions + MAY be included in the response. + Namespace_Response_Extensions which are not on the IETF + standards track, MUST be prefixed with an "X-". + + Result: OK - Command completed + NO - Error: Can't complete command + BAD - argument invalid + + Example 5.1: + =========== + + < A server that supports a single personal namespace. No leading + prefix is used on personal mailboxes and "/" is the hierarchy + delimiter.> + + C: A001 NAMESPACE + S: * NAMESPACE (("" "/")) NIL NIL + S: A001 OK NAMESPACE command completed + + + + + +Gahrns & Newman Standards Track [Page 3] + +RFC 2342 IMAP4 Namespace May 1998 + + + Example 5.2: + =========== + + < A user logged on anonymously to a server. No personal mailboxes + are associated with the anonymous user and the user does not have + access to the Other Users' Namespace. No prefix is required to + access shared mailboxes and the hierarchy delimiter is "." > + + C: A001 NAMESPACE + S: * NAMESPACE NIL NIL (("" ".")) + S: A001 OK NAMESPACE command completed + + Example 5.3: + =========== + + < A server that contains a Personal Namespace and a single Shared + Namespace. > + + C: A001 NAMESPACE + S: * NAMESPACE (("" "/")) NIL (("Public Folders/" "/")) + S: A001 OK NAMESPACE command completed + + Example 5.4: + =========== + + < A server that contains a Personal Namespace, Other Users' + Namespace and multiple Shared Namespaces. Note that the hierarchy + delimiter used within each namespace can be different. > + + C: A001 NAMESPACE + S: * NAMESPACE (("" "/")) (("~" "/")) (("#shared/" "/") + ("#public/" "/")("#ftp/" "/")("#news." ".")) + S: A001 OK NAMESPACE command completed + + The prefix string allows a client to do things such as automatically + creating personal mailboxes or LISTing all available mailboxes within + a namespace. + + Example 5.5: + =========== + + < A server that supports only the Personal Namespace, with a + leading prefix of INBOX to personal mailboxes and a hierarchy + delimiter of "."> + + C: A001 NAMESPACE + S: * NAMESPACE (("INBOX." ".")) NIL NIL + S: A001 OK NAMESPACE command completed + + + +Gahrns & Newman Standards Track [Page 4] + +RFC 2342 IMAP4 Namespace May 1998 + + + < Automatically create a mailbox to store sent items.> + + C: A002 CREATE "INBOX.Sent Mail" + S: A002 OK CREATE command completed + + Although typically a server will support only a single Personal + Namespace, and a single Other User's Namespace, circumstances exist + where there MAY be multiples of these, and a client MUST be prepared + for them. If a client is configured such that it is required to + create a certain mailbox, there can be circumstances where it is + unclear which Personal Namespaces it should create the mailbox in. + In these situations a client SHOULD let the user select which + namespaces to create the mailbox in. + + Example 5.6: + =========== + + < In this example, a server supports 2 Personal Namespaces. In + addition to the regular Personal Namespace, the user has an + additional personal namespace to allow access to mailboxes in an + MH format mailstore. > + + < The client is configured to save a copy of all mail sent by the + user into a mailbox called 'Sent Mail'. Furthermore, after a + message is deleted from a mailbox, the client is configured to + move that message to a mailbox called 'Deleted Items'.> + + < Note that this example demonstrates how some extension flags can + be passed to further describe the #mh namespace. > + + C: A001 NAMESPACE + S: * NAMESPACE (("" "/")("#mh/" "/" "X-PARAM" ("FLAG1" "FLAG2"))) + NIL NIL + S: A001 OK NAMESPACE command completed + + < It is desired to keep only one copy of sent mail. It is unclear + which Personal Namespace the client should use to create the 'Sent + Mail' mailbox. The user is prompted to select a namespace and + only one 'Sent Mail' mailbox is created. > + + C: A002 CREATE "Sent Mail" + S: A002 OK CREATE command completed + + < The client is designed so that it keeps two 'Deleted Items' + mailboxes, one for each namespace. > + + C: A003 CREATE "Delete Items" + S: A003 OK CREATE command completed + + + +Gahrns & Newman Standards Track [Page 5] + +RFC 2342 IMAP4 Namespace May 1998 + + + C: A004 CREATE "#mh/Deleted Items" + S: A004 OK CREATE command completed + + The next level of hierarchy following the Other Users' Namespace + prefix SHOULD consist of <username>, where <username> is a user name + as per the IMAP4 LOGIN or AUTHENTICATE command. + + A client can construct a LIST command by appending a "%" to the Other + Users' Namespace prefix to discover the Personal Namespaces of other + users that are available to the currently authenticated user. + + In response to such a LIST command, a server SHOULD NOT return user + names that have not granted access to their personal mailboxes to the + user in question. + + A server MAY return a LIST response containing only the names of + users that have explicitly granted access to the user in question. + + Alternatively, a server MAY return NO to such a LIST command, + requiring that a user name be included with the Other Users' + Namespace prefix before listing any other user's mailboxes. + + Example 5.7: + =========== + + < A server that supports providing a list of other user's + mailboxes that are accessible to the currently logged on user. > + + C: A001 NAMESPACE + S: * NAMESPACE (("" "/")) (("Other Users/" "/")) NIL + S: A001 OK NAMESPACE command completed + + C: A002 LIST "" "Other Users/%" + S: * LIST () "/" "Other Users/Mike" + S: * LIST () "/" "Other Users/Karen" + S: * LIST () "/" "Other Users/Matthew" + S: * LIST () "/" "Other Users/Tesa" + S: A002 OK LIST command completed + + Example 5.8: + =========== + + < A server that does not support providing a list of other user's + mailboxes that are accessible to the currently logged on user. + The mailboxes are listable if the client includes the name of the + other user with the Other Users' Namespace prefix. > + + + + + +Gahrns & Newman Standards Track [Page 6] + +RFC 2342 IMAP4 Namespace May 1998 + + + C: A001 NAMESPACE + S: * NAMESPACE (("" "/")) (("#Users/" "/")) NIL + S: A001 OK NAMESPACE command completed + + < In this example, the currently logged on user has access to the + Personal Namespace of user Mike, but the server chose to suppress + this information in the LIST response. However, by appending the + user name Mike (received through user input) to the Other Users' + Namespace prefix, the client is able to get a listing of the + personal mailboxes of user Mike. > + + C: A002 LIST "" "#Users/%" + S: A002 NO The requested item could not be found. + + C: A003 LIST "" "#Users/Mike/%" + S: * LIST () "/" "#Users/Mike/INBOX" + S: * LIST () "/" "#Users/Mike/Foo" + S: A003 OK LIST command completed. + + A prefix string might not contain a hierarchy delimiter, because + in some cases it is not needed as part of the prefix. + + Example 5.9: + =========== + + < A server that allows access to the Other Users' Namespace by + prefixing the others' mailboxes with a '~' followed by <username>, + where <username> is a user name as per the IMAP4 LOGIN or + AUTHENTICATE command.> + + C: A001 NAMESPACE + S: * NAMESPACE (("" "/")) (("~" "/")) NIL + S: A001 OK NAMESPACE command completed + + < List the mailboxes for user mark > + + C: A002 LIST "" "~mark/%" + S: * LIST () "/" "~mark/INBOX" + S: * LIST () "/" "~mark/foo" + S: A002 OK LIST command completed + + Historical convention has been to start all namespaces with the "#" + character. Namespaces that include the "#" character are not IMAP + URL [IMAP-URL] friendly requiring the "#" character to be represented + as %23 when within URLs. As such, server implementers MAY instead + consider using namespace prefixes that do not contain the "#" + character. + + + + +Gahrns & Newman Standards Track [Page 7] + +RFC 2342 IMAP4 Namespace May 1998 + + +6. Formal Syntax + + The following syntax specification uses the augmented Backus-Naur + Form (BNF) as described in [ABNF]. + + atom = <atom> + ; <atom> as defined in [RFC-2060] + + Namespace = nil / "(" 1*( "(" string SP (<"> QUOTED_CHAR <"> / + nil) *(Namespace_Response_Extension) ")" ) ")" + + Namespace_Command = "NAMESPACE" + + Namespace_Response_Extension = SP string SP "(" string *(SP string) + ")" + + Namespace_Response = "*" SP "NAMESPACE" SP Namespace SP Namespace SP + Namespace + + ; The first Namespace is the Personal Namespace(s) + ; The second Namespace is the Other Users' Namespace(s) + ; The third Namespace is the Shared Namespace(s) + + nil = <nil> + ; <nil> as defined in [RFC-2060] + + QUOTED_CHAR = <QUOTED_CHAR> + ; <QUOTED_CHAR> as defined in [RFC-2060] + + string = <string> + ; <string> as defined in [RFC-2060] + ; Note that the namespace prefix is to a mailbox and following + ; IMAP4 convention, any international string in the NAMESPACE + ; response MUST be of modified UTF-7 format as described in + ; [RFC-2060]. + +7. Security Considerations + + In response to a LIST command containing an argument of the Other + Users' Namespace prefix, a server SHOULD NOT list users that have not + granted list access to their personal mailboxes to the currently + authenticated user. Providing such a list, could compromise security + by potentially disclosing confidential information of who is located + on the server, or providing a starting point of a list of user + accounts to attack. + + + + + + +Gahrns & Newman Standards Track [Page 8] + +RFC 2342 IMAP4 Namespace May 1998 + + +8. References + + [RFC-2060], Crispin, M., "Internet Message Access Protocol Version + 4rev1", RFC 2060, December 1996. + + [RFC-2119], Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [ABNF] Crocker, D., Editor, and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", RFC 2234, November 1997. + + [IMAP-URL], Newman, C., "IMAP URL Scheme", RFC 2192, September 1997. + +9. Acknowledgments + + Many people have participated in the discussion of IMAP namespaces on + the IMAP mailing list. In particular, the authors would like to + thank Mark Crispin for many of the concepts relating to the Personal + Namespace and accessing the Personal Namespace of other users, Steve + Hole for summarizing the two namespace models, John Myers and Jack De + Winter for their work in a preceding effort trying to define a + standardized personal namespace, and Larry Osterman for his review + and collaboration on this document. + +11. Authors' Addresses + + Mike Gahrns + Microsoft + One Microsoft Way + Redmond, WA, 98072, USA + + Phone: (425) 936-9833 + EMail: mikega@microsoft.com + + + Chris Newman + Innosoft International, Inc. + 1050 East Garvey Ave. South + West Covina, CA, 91790, USA + + EMail: chris.newman@innosoft.com + + + + + + + + + + +Gahrns & Newman Standards Track [Page 9] + +RFC 2342 IMAP4 Namespace May 1998 + + +12. Full Copyright Statement + + Copyright (C) The Internet Society (1998). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + + + + + + + + + + + + + + + + + + + + + + + +Gahrns & Newman Standards Track [Page 10] + diff --git a/doc/rfc2359.txt b/doc/rfc2359.txt @@ -0,0 +1,339 @@ + + + + + + +Network Working Group J. Myers +Request for Comments: 2359 Netscape Communications +Category: Standards Track June 1998 + + + IMAP4 UIDPLUS extension + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (1998). All Rights Reserved. + +IESG NOTE + + The IMAP extension described here assumes a particular means of using + IMAP to support disconnected operation. However, this means of + supporting disconnected operation is not yet documented. Also, there + are multiple theories about how best to do disconnected operation in + IMAP, and as yet, there is no consensus on which one should be + adopted as a standard. + + This document is being approved as a Proposed Standard because it + does not appear to have technical flaws in itelf. However, approval + of this document as a Proposed Standard should not be considered an + IETF endorsement of any particular means of doing disconnected + operation in IMAP. + +Table of Contents + + 1. Abstract .............................................. 2 + 2. Conventions Used in this Document ..................... 2 + 3. Introduction and Overview ............................. 2 + 4. Features .............................................. 2 + 4.1. UID EXPUNGE Command ................................... 2 + 4.2. APPENDUID response code ............................... 3 + 4.3. COPYUID response code ................................. 4 + 5. Formal Syntax ......................................... 4 + 6. References ............................................ 4 + 7. Security Considerations ............................... 5 + 8. Author's Address ...................................... 5 + 9. Full Copyright Statement .............................. 6 + + + +Myers Standards Track [Page 1] + +RFC 2359 IMAP4 UIDPLUS extension June 1998 + + +1. Abstract + + The UIDPLUS extension of the Internet Message Access Protocol [IMAP4] + provides a set of features intended to reduce the amount of time and + resources used by some client operations. The features in UIDPLUS + are primarily intended for disconnected-use clients. + +2. Conventions Used in this Document + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. + + The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" + in this document are to be interpreted as defined in "Key words for + use in RFCs to Indicate Requirement Levels" [KEYWORDS]. + +3. Introduction and Overview + + The UIDPLUS extension is present in any IMAP4 server implementation + which returns "UIDPLUS" as one of the supported capabilities to the + CAPABILITY command. The UIDPLUS extension contains one additional + command and additional data returned with successful APPEND and COPY + commands. + + Clients that wish to use the new command in UIDPLUS must of course + first test for the presence of the extension by issuing a CAPABILITY + command. Each of the features in UIDPLUS are optimizations; clients + can provide the same functionality, albeit more slowly, by using + commands in the base protocol. With each feature, this document + recommends a fallback approach to take when the UIDPLUS extension is + not supported by the server. + +4. Features + +4.1. UID EXPUNGE Command + + Arguments: message set + + Data: untagged responses: EXPUNGE + + Result: OK - expunge completed + NO - expunge failure (e.g. permission denied) + BAD - command unknown or arguments invalid + + + + + + + + +Myers Standards Track [Page 2] + +RFC 2359 IMAP4 UIDPLUS extension June 1998 + + + The UID EXPUNGE command permanently removes from the currently + selected mailbox all messages that both have the \Deleted flag set + and have a UID that is included in the specified message set. If + a message either does not have the \Deleted flag set or is has a + UID that is not included in the specified message set, it is not + affected. + + This command may be used to ensure that a replayed EXPUNGE command + does not remove any messages that have been marked as \Deleted + between the time that the user requested the expunge operation and + the time the server processes the command. + + If the server does not support the UIDPLUS capability, the client + should fall back to using the STORE command to temporarily remove + the \Deleted flag from messages it does not want to remove. The + client could alternatively fall back to using the EXPUNGE command, + risking the unintended removal of some messages. + + Example: C: A003 UID EXPUNGE 3000:3002 + S: * 3 EXPUNGE + S: * 3 EXPUNGE + S: * 3 EXPUNGE + S: A003 OK UID EXPUNGE completed + +4.2. APPENDUID response code + + Successful APPEND commands return an APPENDUID response code in the + tagged OK response. The APPENDUID response code contains as + arguments the UIDVALIDITY of the destination mailbox and the UID + assigned to the appended message. + + If the server does not support the UIDPLUS capability, the client can + only discover this information by selecting the destination mailbox + and issuing FETCH commands. + + Example: C: A003 APPEND saved-messages (\Seen) {310} + C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) + C: From: Fred Foobar <foobar@Blurdybloop.COM> + C: Subject: afternoon meeting + C: To: mooch@owatagu.siam.edu + C: Message-Id: <B27397-0100000@Blurdybloop.COM> + C: MIME-Version: 1.0 + C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII + C: + C: Hello Joe, do you think we can meet at 3:30 tomorrow? + C: + S: A003 OK [APPENDUID 38505 3955] APPEND completed + + + + +Myers Standards Track [Page 3] + +RFC 2359 IMAP4 UIDPLUS extension June 1998 + + +4.3. COPYUID response code + + Successful COPY and UID COPY commands return a COPYUID response code + in the tagged OK response whenever at least one message was copied. + The COPYUID response code contains as an argument the UIDVALIDITY of + the appended-to mailbox, a message set containing the UIDs of the + messages copied to the destination mailbox, in the order they were + copied, and a message containing the UIDs assigned to the copied + messages, in the order they were assigned. Neither of the message + sets may contain extraneous UIDs or the symbol '*'. + + If the server does not support the UIDPLUS capability, the client can + only discover this information by selecting the destination mailbox + and issuing FETCH commands. + + Example: C: A003 COPY 2:4 MEETING + S: A003 OK [COPYUID 38505 304,319:320 3956:3958] Done + C: A003 UID COPY 305:310 MEETING + S: A003 OK Done + +5. Formal Syntax + + The following syntax specification uses the augmented Backus-Naur + Form (BNF) notation as specified in [RFC-822] as modified by [IMAP4]. + Non-terminals referenced but not defined below are as defined by + [IMAP4]. + + Except as noted otherwise, all alphabetic characters are case- + insensitive. The use of upper or lower case characters to define + token strings is for editorial clarity only. Implementations MUST + accept these strings in a case-insensitive fashion. + + resp_code_apnd ::= "APPENDUID" SPACE nz_number SPACE uniqueid + + resp_code_copy ::= "COPYUID" SPACE nz_number SPACE set SPACE set + + uid_expunge ::= "UID" SPACE "EXPUNGE" SPACE set + +6. References + + [IMAP4] Crispin, M., "Internet Message Access Protocol - + Version 4rev1", RFC 2060, December 1996. + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC-822] Crocker, D., "Standard for the Format of ARPA Internet + Text Messages", STD 11, RFC 822, August 1982. + + + +Myers Standards Track [Page 4] + +RFC 2359 IMAP4 UIDPLUS extension June 1998 + + +7. Security Considerations + + There are no known security issues with this extension. + +8. Author's Address + + John Gardiner Myers + Netscape Communications + 501 East Middlefield Road + Mail Stop MV-029 + Mountain View, CA 94043 + + EMail: jgmyers@netscape.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Myers Standards Track [Page 5] + +RFC 2359 IMAP4 UIDPLUS extension June 1998 + + +9. Full Copyright Statement + + Copyright (C) The Internet Society (1998). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + + + + + + + + + + + + + + + + + + + + + + + +Myers Standards Track [Page 6] + diff --git a/doc/rfc2595.txt b/doc/rfc2595.txt @@ -0,0 +1,843 @@ + + + + + + +Network Working Group C. Newman +Request for Comments: 2595 Innosoft +Category: Standards Track June 1999 + + + Using TLS with IMAP, POP3 and ACAP + + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (1999). All Rights Reserved. + +1. Motivation + + The TLS protocol (formerly known as SSL) provides a way to secure an + application protocol from tampering and eavesdropping. The option of + using such security is desirable for IMAP, POP and ACAP due to common + connection eavesdropping and hijacking attacks [AUTH]. Although + advanced SASL authentication mechanisms can provide a lightweight + version of this service, TLS is complimentary to simple + authentication-only SASL mechanisms or deployed clear-text password + login commands. + + Many sites have a high investment in authentication infrastructure + (e.g., a large database of a one-way-function applied to user + passwords), so a privacy layer which is not tightly bound to user + authentication can protect against network eavesdropping attacks + without requiring a new authentication infrastructure and/or forcing + all users to change their password. Recognizing that such sites will + desire simple password authentication in combination with TLS + encryption, this specification defines the PLAIN SASL mechanism for + use with protocols which lack a simple password authentication + command such as ACAP and SMTP. (Note there is a separate RFC for the + STARTTLS command in SMTP [SMTPTLS].) + + There is a strong desire in the IETF to eliminate the transmission of + clear-text passwords over unencrypted channels. While SASL can be + used for this purpose, TLS provides an additional tool with different + deployability characteristics. A server supporting both TLS with + + + + +Newman Standards Track [Page 1] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + simple passwords and a challenge/response SASL mechanism is likely to + interoperate with a wide variety of clients without resorting to + unencrypted clear-text passwords. + + The STARTTLS command rectifies a number of the problems with using a + separate port for a "secure" protocol variant. Some of these are + mentioned in section 7. + +1.1. Conventions Used in this Document + + The key words "REQUIRED", "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", + "MAY", and "OPTIONAL" in this document are to be interpreted as + described in "Key words for use in RFCs to Indicate Requirement + Levels" [KEYWORDS]. + + Terms related to authentication are defined in "On Internet + Authentication" [AUTH]. + + Formal syntax is defined using ABNF [ABNF]. + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. + +2. Basic Interoperability and Security Requirements + + The following requirements apply to all implementations of the + STARTTLS extension for IMAP, POP3 and ACAP. + +2.1. Cipher Suite Requirements + + Implementation of the TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA [TLS] cipher + suite is REQUIRED. This is important as it assures that any two + compliant implementations can be configured to interoperate. + + All other cipher suites are OPTIONAL. + +2.2. Privacy Operational Mode Security Requirements + + Both clients and servers SHOULD have a privacy operational mode which + refuses authentication unless successful activation of an encryption + layer (such as that provided by TLS) occurs prior to or at the time + of authentication and which will terminate the connection if that + encryption layer is deactivated. Implementations are encouraged to + have flexability with respect to the minimal encryption strength or + cipher suites permitted. A minimalist approach to this + recommendation would be an operational mode where the + TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA cipher suite is mandatory prior to + permitting authentication. + + + +Newman Standards Track [Page 2] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + Clients MAY have an operational mode which uses encryption only when + it is advertised by the server, but authentication continues + regardless. For backwards compatibility, servers SHOULD have an + operational mode where only the authentication mechanisms required by + the relevant base protocol specification are needed to successfully + authenticate. + +2.3. Clear-Text Password Requirements + + Clients and servers which implement STARTTLS MUST be configurable to + refuse all clear-text login commands or mechanisms (including both + standards-track and nonstandard mechanisms) unless an encryption + layer of adequate strength is active. Servers which allow + unencrypted clear-text logins SHOULD be configurable to refuse + clear-text logins both for the entire server, and on a per-user + basis. + +2.4. Server Identity Check + + During the TLS negotiation, the client MUST check its understanding + of the server hostname against the server's identity as presented in + the server Certificate message, in order to prevent man-in-the-middle + attacks. Matching is performed according to these rules: + + - The client MUST use the server hostname it used to open the + connection as the value to compare against the server name as + expressed in the server certificate. The client MUST NOT use any + form of the server hostname derived from an insecure remote source + (e.g., insecure DNS lookup). CNAME canonicalization is not done. + + - If a subjectAltName extension of type dNSName is present in the + certificate, it SHOULD be used as the source of the server's + identity. + + - Matching is case-insensitive. + + - A "*" wildcard character MAY be used as the left-most name + component in the certificate. For example, *.example.com would + match a.example.com, foo.example.com, etc. but would not match + example.com. + + - If the certificate contains multiple names (e.g. more than one + dNSName field), then a match with any one of the fields is + considered acceptable. + + If the match fails, the client SHOULD either ask for explicit user + confirmation, or terminate the connection and indicate the server's + identity is suspect. + + + +Newman Standards Track [Page 3] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + +2.5. TLS Security Policy Check + + Both the client and server MUST check the result of the STARTTLS + command and subsequent TLS negotiation to see whether acceptable + authentication or privacy was achieved. Ignoring this step + completely invalidates using TLS for security. The decision about + whether acceptable authentication or privacy was achieved is made + locally, is implementation-dependent, and is beyond the scope of this + document. + +3. IMAP STARTTLS extension + + When the TLS extension is present in IMAP, "STARTTLS" is listed as a + capability in response to the CAPABILITY command. This extension + adds a single command, "STARTTLS" to the IMAP protocol which is used + to begin a TLS negotiation. + +3.1. STARTTLS Command + + Arguments: none + + Responses: no specific responses for this command + + Result: OK - begin TLS negotiation + BAD - command unknown or arguments invalid + + A TLS negotiation begins immediately after the CRLF at the end of + the tagged OK response from the server. Once a client issues a + STARTTLS command, it MUST NOT issue further commands until a + server response is seen and the TLS negotiation is complete. + + The STARTTLS command is only valid in non-authenticated state. + The server remains in non-authenticated state, even if client + credentials are supplied during the TLS negotiation. The SASL + [SASL] EXTERNAL mechanism MAY be used to authenticate once TLS + client credentials are successfully exchanged, but servers + supporting the STARTTLS command are not required to support the + EXTERNAL mechanism. + + Once TLS has been started, the client MUST discard cached + information about server capabilities and SHOULD re-issue the + CAPABILITY command. This is necessary to protect against + man-in-the-middle attacks which alter the capabilities list prior + to STARTTLS. The server MAY advertise different capabilities + after STARTTLS. + + The formal syntax for IMAP is amended as follows: + + + + +Newman Standards Track [Page 4] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + command_any =/ "STARTTLS" + + Example: C: a001 CAPABILITY + S: * CAPABILITY IMAP4rev1 STARTTLS LOGINDISABLED + S: a001 OK CAPABILITY completed + C: a002 STARTTLS + S: a002 OK Begin TLS negotiation now + <TLS negotiation, further commands are under TLS layer> + C: a003 CAPABILITY + S: * CAPABILITY IMAP4rev1 AUTH=EXTERNAL + S: a003 OK CAPABILITY completed + C: a004 LOGIN joe password + S: a004 OK LOGIN completed + +3.2. IMAP LOGINDISABLED capability + + The current IMAP protocol specification (RFC 2060) requires the + implementation of the LOGIN command which uses clear-text passwords. + Many sites may choose to disable this command unless encryption is + active for security reasons. An IMAP server MAY advertise that the + LOGIN command is disabled by including the LOGINDISABLED capability + in the capability response. Such a server will respond with a tagged + "NO" response to any attempt to use the LOGIN command. + + An IMAP server which implements STARTTLS MUST implement support for + the LOGINDISABLED capability on unencrypted connections. + + An IMAP client which complies with this specification MUST NOT issue + the LOGIN command if this capability is present. + + This capability is useful to prevent clients compliant with this + specification from sending an unencrypted password in an environment + subject to passive attacks. It has no impact on an environment + subject to active attacks as a man-in-the-middle attacker can remove + this capability. Therefore this does not relieve clients of the need + to follow the privacy mode recommendation in section 2.2. + + Servers advertising this capability will fail to interoperate with + many existing compliant IMAP clients and will be unable to prevent + those clients from disclosing the user's password. + +4. POP3 STARTTLS extension + + The POP3 STARTTLS extension adds the STLS command to POP3 servers. + If this is implemented, the POP3 extension mechanism [POP3EXT] MUST + also be implemented to avoid the need for client probing of multiple + commands. The capability name "STLS" indicates this command is + present and permitted in the current state. + + + +Newman Standards Track [Page 5] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + STLS + + Arguments: none + + Restrictions: + Only permitted in AUTHORIZATION state. + + Discussion: + A TLS negotiation begins immediately after the CRLF at the + end of the +OK response from the server. A -ERR response + MAY result if a security layer is already active. Once a + client issues a STLS command, it MUST NOT issue further + commands until a server response is seen and the TLS + negotiation is complete. + + The STLS command is only permitted in AUTHORIZATION state + and the server remains in AUTHORIZATION state, even if + client credentials are supplied during the TLS negotiation. + The AUTH command [POP-AUTH] with the EXTERNAL mechanism + [SASL] MAY be used to authenticate once TLS client + credentials are successfully exchanged, but servers + supporting the STLS command are not required to support the + EXTERNAL mechanism. + + Once TLS has been started, the client MUST discard cached + information about server capabilities and SHOULD re-issue + the CAPA command. This is necessary to protect against + man-in-the-middle attacks which alter the capabilities list + prior to STLS. The server MAY advertise different + capabilities after STLS. + + Possible Responses: + +OK -ERR + + Examples: + C: STLS + S: +OK Begin TLS negotiation + <TLS negotiation, further commands are under TLS layer> + ... + C: STLS + S: -ERR Command not permitted when TLS active + + + + + + + + + + +Newman Standards Track [Page 6] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + +5. ACAP STARTTLS extension + + When the TLS extension is present in ACAP, "STARTTLS" is listed as a + capability in the ACAP greeting. No arguments to this capability are + defined at this time. This extension adds a single command, + "STARTTLS" to the ACAP protocol which is used to begin a TLS + negotiation. + +5.1. STARTTLS Command + + Arguments: none + + Responses: no specific responses for this command + + Result: OK - begin TLS negotiation + BAD - command unknown or arguments invalid + + A TLS negotiation begins immediately after the CRLF at the end of + the tagged OK response from the server. Once a client issues a + STARTTLS command, it MUST NOT issue further commands until a + server response is seen and the TLS negotiation is complete. + + The STARTTLS command is only valid in non-authenticated state. + The server remains in non-authenticated state, even if client + credentials are supplied during the TLS negotiation. The SASL + [SASL] EXTERNAL mechanism MAY be used to authenticate once TLS + client credentials are successfully exchanged, but servers + supporting the STARTTLS command are not required to support the + EXTERNAL mechanism. + + After the TLS layer is established, the server MUST re-issue an + untagged ACAP greeting. This is necessary to protect against + man-in-the-middle attacks which alter the capabilities list prior + to STARTTLS. The client MUST discard cached capability + information and replace it with the information from the new ACAP + greeting. The server MAY advertise different capabilities after + STARTTLS. + + The formal syntax for ACAP is amended as follows: + + command_any =/ "STARTTLS" + + Example: S: * ACAP (SASL "CRAM-MD5") (STARTTLS) + C: a002 STARTTLS + S: a002 OK "Begin TLS negotiation now" + <TLS negotiation, further commands are under TLS layer> + S: * ACAP (SASL "CRAM-MD5" "PLAIN" "EXTERNAL") + + + + +Newman Standards Track [Page 7] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + +6. PLAIN SASL mechanism + + Clear-text passwords are simple, interoperate with almost all + existing operating system authentication databases, and are useful + for a smooth transition to a more secure password-based + authentication mechanism. The drawback is that they are unacceptable + for use over an unencrypted network connection. + + This defines the "PLAIN" SASL mechanism for use with ACAP and other + protocols with no clear-text login command. The PLAIN SASL mechanism + MUST NOT be advertised or used unless a strong encryption layer (such + as the provided by TLS) is active or backwards compatibility dictates + otherwise. + + The mechanism consists of a single message from the client to the + server. The client sends the authorization identity (identity to + login as), followed by a US-ASCII NUL character, followed by the + authentication identity (identity whose password will be used), + followed by a US-ASCII NUL character, followed by the clear-text + password. The client may leave the authorization identity empty to + indicate that it is the same as the authentication identity. + + The server will verify the authentication identity and password with + the system authentication database and verify that the authentication + credentials permit the client to login as the authorization identity. + If both steps succeed, the user is logged in. + + The server MAY also use the password to initialize any new + authentication database, such as one suitable for CRAM-MD5 + [CRAM-MD5]. + + Non-US-ASCII characters are permitted as long as they are represented + in UTF-8 [UTF-8]. Use of non-visible characters or characters which + a user may be unable to enter on some keyboards is discouraged. + + The formal grammar for the client message using Augmented BNF [ABNF] + follows. + + message = [authorize-id] NUL authenticate-id NUL password + authenticate-id = 1*UTF8-SAFE ; MUST accept up to 255 octets + authorize-id = 1*UTF8-SAFE ; MUST accept up to 255 octets + password = 1*UTF8-SAFE ; MUST accept up to 255 octets + NUL = %x00 + UTF8-SAFE = %x01-09 / %x0B-0C / %x0E-7F / UTF8-2 / + UTF8-3 / UTF8-4 / UTF8-5 / UTF8-6 + UTF8-1 = %x80-BF + UTF8-2 = %xC0-DF UTF8-1 + UTF8-3 = %xE0-EF 2UTF8-1 + + + +Newman Standards Track [Page 8] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + UTF8-4 = %xF0-F7 3UTF8-1 + UTF8-5 = %xF8-FB 4UTF8-1 + UTF8-6 = %xFC-FD 5UTF8-1 + + Here is an example of how this might be used to initialize a CRAM-MD5 + authentication database for ACAP: + + Example: S: * ACAP (SASL "CRAM-MD5") (STARTTLS) + C: a001 AUTHENTICATE "CRAM-MD5" + S: + "<1896.697170952@postoffice.reston.mci.net>" + C: "tim b913a602c7eda7a495b4e6e7334d3890" + S: a001 NO (TRANSITION-NEEDED) + "Please change your password, or use TLS to login" + C: a002 STARTTLS + S: a002 OK "Begin TLS negotiation now" + <TLS negotiation, further commands are under TLS layer> + S: * ACAP (SASL "CRAM-MD5" "PLAIN" "EXTERNAL") + C: a003 AUTHENTICATE "PLAIN" {21+} + C: <NUL>tim<NUL>tanstaaftanstaaf + S: a003 OK CRAM-MD5 password initialized + + Note: In this example, <NUL> represents a single ASCII NUL octet. + +7. imaps and pop3s ports + + Separate "imaps" and "pop3s" ports were registered for use with SSL. + Use of these ports is discouraged in favor of the STARTTLS or STLS + commands. + + A number of problems have been observed with separate ports for + "secure" variants of protocols. This is an attempt to enumerate some + of those problems. + + - Separate ports lead to a separate URL scheme which intrudes into + the user interface in inappropriate ways. For example, many web + pages use language like "click here if your browser supports SSL." + This is a decision the browser is often more capable of making than + the user. + + - Separate ports imply a model of either "secure" or "not secure." + This can be misleading in a number of ways. First, the "secure" + port may not in fact be acceptably secure as an export-crippled + cipher suite might be in use. This can mislead users into a false + sense of security. Second, the normal port might in fact be + secured by using a SASL mechanism which includes a security layer. + Thus the separate port distinction makes the complex topic of + security policy even more confusing. One common result of this + confusion is that firewall administrators are often misled into + + + +Newman Standards Track [Page 9] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + permitting the "secure" port and blocking the standard port. This + could be a poor choice given the common use of SSL with a 40-bit + key encryption layer and plain-text password authentication is less + secure than strong SASL mechanisms such as GSSAPI with Kerberos 5. + + - Use of separate ports for SSL has caused clients to implement only + two security policies: use SSL or don't use SSL. The desirable + security policy "use TLS when available" would be cumbersome with + the separate port model, but is simple with STARTTLS. + + - Port numbers are a limited resource. While they are not yet in + short supply, it is unwise to set a precedent that could double (or + worse) the speed of their consumption. + + +8. IANA Considerations + + This constitutes registration of the "STARTTLS" and "LOGINDISABLED" + IMAP capabilities as required by section 7.2.1 of RFC 2060 [IMAP]. + + The registration for the POP3 "STLS" capability follows: + + CAPA tag: STLS + Arguments: none + Added commands: STLS + Standard commands affected: May enable USER/PASS as a side-effect. + CAPA command SHOULD be re-issued after successful completion. + Announced states/Valid states: AUTHORIZATION state only. + Specification reference: this memo + + The registration for the ACAP "STARTTLS" capability follows: + + Capability name: STARTTLS + Capability keyword: STARTTLS + Capability arguments: none + Published Specification(s): this memo + Person and email address for further information: + see author's address section below + + The registration for the PLAIN SASL mechanism follows: + + SASL mechanism name: PLAIN + Security Considerations: See section 9 of this memo + Published specification: this memo + Person & email address to contact for further information: + see author's address section below + Intended usage: COMMON + Author/Change controller: see author's address section below + + + +Newman Standards Track [Page 10] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + +9. Security Considerations + + TLS only provides protection for data sent over a network connection. + Messages transferred over IMAP or POP3 are still available to server + administrators and usually subject to eavesdropping, tampering and + forgery when transmitted through SMTP or NNTP. TLS is no substitute + for an end-to-end message security mechanism using MIME security + multiparts [MIME-SEC]. + + A man-in-the-middle attacker can remove STARTTLS from the capability + list or generate a failure response to the STARTTLS command. In + order to detect such an attack, clients SHOULD warn the user when + session privacy is not active and/or be configurable to refuse to + proceed without an acceptable level of security. + + A man-in-the-middle attacker can always cause a down-negotiation to + the weakest authentication mechanism or cipher suite available. For + this reason, implementations SHOULD be configurable to refuse weak + mechanisms or cipher suites. + + Any protocol interactions prior to the TLS handshake are performed in + the clear and can be modified by a man-in-the-middle attacker. For + this reason, clients MUST discard cached information about server + capabilities advertised prior to the start of the TLS handshake. + + Clients are encouraged to clearly indicate when the level of + encryption active is known to be vulnerable to attack using modern + hardware (such as encryption keys with 56 bits of entropy or less). + + The LOGINDISABLED IMAP capability (discussed in section 3.2) only + reduces the potential for passive attacks, it provides no protection + against active attacks. The responsibility remains with the client + to avoid sending a password over a vulnerable channel. + + The PLAIN mechanism relies on the TLS encryption layer for security. + When used without TLS, it is vulnerable to a common network + eavesdropping attack. Therefore PLAIN MUST NOT be advertised or used + unless a suitable TLS encryption layer is active or backwards + compatibility dictates otherwise. + + When the PLAIN mechanism is used, the server gains the ability to + impersonate the user to all services with the same password + regardless of any encryption provided by TLS or other network privacy + mechanisms. While many other authentication mechanisms have similar + weaknesses, stronger SASL mechanisms such as Kerberos address this + issue. Clients are encouraged to have an operational mode where all + mechanisms which are likely to reveal the user's password to the + server are disabled. + + + +Newman Standards Track [Page 11] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + The security considerations for TLS apply to STARTTLS and the + security considerations for SASL apply to the PLAIN mechanism. + Additional security requirements are discussed in section 2. + +10. References + + [ABNF] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", RFC 2234, November 1997. + + [ACAP] Newman, C. and J. Myers, "ACAP -- Application + Configuration Access Protocol", RFC 2244, November 1997. + + [AUTH] Haller, N. and R. Atkinson, "On Internet Authentication", + RFC 1704, October 1994. + + [CRAM-MD5] Klensin, J., Catoe, R. and P. Krumviede, "IMAP/POP + AUTHorize Extension for Simple Challenge/Response", RFC + 2195, September 1997. + + [IMAP] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [MIME-SEC] Galvin, J., Murphy, S., Crocker, S. and N. Freed, + "Security Multiparts for MIME: Multipart/Signed and + Multipart/Encrypted", RFC 1847, October 1995. + + [POP3] Myers, J. and M. Rose, "Post Office Protocol - Version 3", + STD 53, RFC 1939, May 1996. + + [POP3EXT] Gellens, R., Newman, C. and L. Lundblade, "POP3 Extension + Mechanism", RFC 2449, November 1998. + + [POP-AUTH] Myers, J., "POP3 AUTHentication command", RFC 1734, + December 1994. + + [SASL] Myers, J., "Simple Authentication and Security Layer + (SASL)", RFC 2222, October 1997. + + [SMTPTLS] Hoffman, P., "SMTP Service Extension for Secure SMTP over + TLS", RFC 2487, January 1999. + + [TLS] Dierks, T. and C. Allen, "The TLS Protocol Version 1.0", + RFC 2246, January 1999. + + + + + +Newman Standards Track [Page 12] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + [UTF-8] Yergeau, F., "UTF-8, a transformation format of ISO + 10646", RFC 2279, January 1998. + + +11. Author's Address + + Chris Newman + Innosoft International, Inc. + 1050 Lakes Drive + West Covina, CA 91790 USA + + EMail: chris.newman@innosoft.com + + +A. Appendix -- Compliance Checklist + + An implementation is not compliant if it fails to satisfy one or more + of the MUST requirements for the protocols it implements. An + implementation that satisfies all the MUST and all the SHOULD + requirements for its protocols is said to be "unconditionally + compliant"; one that satisfies all the MUST requirements but not all + the SHOULD requirements for its protocols is said to be + "conditionally compliant". + + Rules Section + ----- ------- + Mandatory-to-implement Cipher Suite 2.1 + SHOULD have mode where encryption required 2.2 + server SHOULD have mode where TLS not required 2.2 + MUST be configurable to refuse all clear-text login + commands or mechanisms 2.3 + server SHOULD be configurable to refuse clear-text + login commands on entire server and on per-user basis 2.3 + client MUST check server identity 2.4 + client MUST use hostname used to open connection 2.4 + client MUST NOT use hostname from insecure remote lookup 2.4 + client SHOULD support subjectAltName of dNSName type 2.4 + client SHOULD ask for confirmation or terminate on fail 2.4 + MUST check result of STARTTLS for acceptable privacy 2.5 + client MUST NOT issue commands after STARTTLS + until server response and negotiation done 3.1,4,5.1 + client MUST discard cached information 3.1,4,5.1,9 + client SHOULD re-issue CAPABILITY/CAPA command 3.1,4 + IMAP server with STARTTLS MUST implement LOGINDISABLED 3.2 + IMAP client MUST NOT issue LOGIN if LOGINDISABLED 3.2 + POP server MUST implement POP3 extensions 4 + ACAP server MUST re-issue ACAP greeting 5.1 + + + + +Newman Standards Track [Page 13] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + + client SHOULD warn when session privacy not active and/or + refuse to proceed without acceptable security level 9 + SHOULD be configurable to refuse weak mechanisms or + cipher suites 9 + + The PLAIN mechanism is an optional part of this specification. + However if it is implemented the following rules apply: + + Rules Section + ----- ------- + MUST NOT use PLAIN unless strong encryption active + or backwards compatibility dictates otherwise 6,9 + MUST use UTF-8 encoding for characters in PLAIN 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Newman Standards Track [Page 14] + +RFC 2595 Using TLS with IMAP, POP3 and ACAP June 1999 + + +Full Copyright Statement + + Copyright (C) The Internet Society (1999). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Newman Standards Track [Page 15] + diff --git a/doc/rfc2683.txt b/doc/rfc2683.txt @@ -0,0 +1,1291 @@ + + + + + + +Network Working Group B. Leiba +Request for Comments: 2683 IBM T.J. Watson Research Center +Category: Informational September 1999 + + + IMAP4 Implementation Recommendations + +Status of this Memo + + This memo provides information for the Internet community. It does + not specify an Internet standard of any kind. Distribution of this + memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (1999). All Rights Reserved. + +1. Abstract + + The IMAP4 specification [RFC-2060] describes a rich protocol for use + in building clients and servers for storage, retrieval, and + manipulation of electronic mail. Because the protocol is so rich and + has so many implementation choices, there are often trade-offs that + must be made and issues that must be considered when designing such + clients and servers. This document attempts to outline these issues + and to make recommendations in order to make the end products as + interoperable as possible. + +2. Conventions used in this document + + In examples, "C:" indicates lines sent by a client that is connected + to a server. "S:" indicates lines sent by the server to the client. + + The words "must", "must not", "should", "should not", and "may" are + used with specific meaning in this document; since their meaning is + somewhat different from that specified in RFC 2119, we do not put + them in all caps here. Their meaning is as follows: + + must -- This word means that the action described is necessary + to ensure interoperability. The recommendation should + not be ignored. + must not -- This phrase means that the action described will be + almost certain to hurt interoperability. The + recommendation should not be ignored. + + + + + + + +Leiba Informational [Page 1] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + should -- This word means that the action described is strongly + recommended and will enhance interoperability or + usability. The recommendation should not be ignored + without careful consideration. + should not -- This phrase means that the action described is strongly + recommended against, and might hurt interoperability or + usability. The recommendation should not be ignored + without careful consideration. + may -- This word means that the action described is an + acceptable implementation choice. No specific + recommendation is implied; this word is used to point + out a choice that might not be obvious, or to let + implementors know what choices have been made by + existing implementations. + +3. Interoperability Issues and Recommendations + +3.1. Accessibility + + This section describes the issues related to access to servers and + server resources. Concerns here include data sharing and maintenance + of client/server connections. + +3.1.1. Multiple Accesses of the Same Mailbox + + One strong point of IMAP4 is that, unlike POP3, it allows for + multiple simultaneous access to a single mailbox. A user can, thus, + read mail from a client at home while the client in the office is + still connected; or the help desk staff can all work out of the same + inbox, all seeing the same pool of questions. An important point + about this capability, though is that NO SERVER IS GUARANTEED TO + SUPPORT THIS. If you are selecting an IMAP server and this facility + is important to you, be sure that the server you choose to install, + in the configuration you choose to use, supports it. + + If you are designing a client, you must not assume that you can + access the same mailbox more than once at a time. That means + + 1. you must handle gracefully the failure of a SELECT command if the + server refuses the second SELECT, + 2. you must handle reasonably the severing of your connection (see + "Severed Connections", below) if the server chooses to allow the + second SELECT by forcing the first off, + 3. you must avoid making multiple connections to the same mailbox in + your own client (for load balancing or other such reasons), and + 4. you must avoid using the STATUS command on a mailbox that you have + selected (with some server implementations the STATUS command has + the same problems with multiple access as do the SELECT and + + + +Leiba Informational [Page 2] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + EXAMINE commands). + + A further note about STATUS: The STATUS command is sometimes used to + check a non-selected mailbox for new mail. This mechanism must not + be used to check for new mail in the selected mailbox; section 5.2 of + [RFC-2060] specifically forbids this in its last paragraph. Further, + since STATUS takes a mailbox name it is an independent operation, not + operating on the selected mailbox. Because of this, the information + it returns is not necessarily in synchronization with the selected + mailbox state. + +3.1.2. Severed Connections + + The client/server connection may be severed for one of three reasons: + the client severs the connection, the server severs the connection, + or the connection is severed by outside forces beyond the control of + the client and the server (a telephone line drops, for example). + Clients and servers must both deal with these situations. + + When the client wants to sever a connection, it's usually because it + has finished the work it needed to do on that connection. The client + should send a LOGOUT command, wait for the tagged response, and then + close the socket. But note that, while this is what's intended in + the protocol design, there isn't universal agreement here. Some + contend that sending the LOGOUT and waiting for the two responses + (untagged BYE and tagged OK) is wasteful and unnecessary, and that + the client can simply close the socket. The server should interpret + the closed socket as a log out by the client. The counterargument is + that it's useful from the standpoint of cleanup, problem + determination, and the like, to have an explicit client log out, + because otherwise there is no way for the server to tell the + difference between "closed socket because of log out" and "closed + socket because communication was disrupted". If there is a + client/server interaction problem, a client which routinely + terminates a session by breaking the connection without a LOGOUT will + make it much more difficult to determine the problem. + + Because of this disagreement, server designers must be aware that + some clients might close the socket without sending a LOGOUT. In any + case, whether or not a LOGOUT was sent, the server should not + implicitly expunge any messages from the selected mailbox. If a + client wants the server to do so, it must send a CLOSE or EXPUNGE + command explicitly. + + When the server wants to sever a connection it's usually due to an + inactivity timeout or is because a situation has arisen that has + changed the state of the mail store in a way that the server can not + communicate to the client. The server should send an untagged BYE + + + +Leiba Informational [Page 3] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + response to the client and then close the socket. Sending an + untagged BYE response before severing allows the server to send a + human-readable explanation of the problem to the client, which the + client may then log, display to the user, or both (see section 7.1.5 + of [RFC-2060]). + + Regarding inactivity timeouts, there is some controversy. Unlike + POP, for which the design is for a client to connect, retrieve mail, + and log out, IMAP's design encourages long-lived (and mostly + inactive) client/server sessions. As the number of users grows, this + can use up a lot of server resources, especially with clients that + are designed to maintain sessions for mailboxes that the user has + finished accessing. To alleviate this, a server may implement an + inactivity timeout, unilaterally closing a session (after first + sending an untagged BYE, as noted above). Some server operators have + reported dramatic improvements in server performance after doing + this. As specified in [RFC-2060], if such a timeout is done it must + not be until at least 30 minutes of inactivity. The reason for this + specification is to prevent clients from sending commands (such as + NOOP) to the server at frequent intervals simply to avert a too-early + timeout. If the client knows that the server may not time out the + session for at least 30 minutes, then the client need not poll at + intervals more frequent than, say, 25 minutes. + +3.2. Scaling + + IMAP4 has many features that allow for scalability, as mail stores + become larger and more numerous. Large numbers of users, mailboxes, + and messages, and very large messages require thought to handle + efficiently. This document will not address the administrative + issues involved in large numbers of users, but we will look at the + other items. + +3.2.1. Flood Control + + There are three situations when a client can make a request that will + result in a very large response - too large for the client reasonably + to deal with: there are a great many mailboxes available, there are a + great many messages in the selected mailbox, or there is a very large + message part. The danger here is that the end user will be stuck + waiting while the server sends (and the client processes) an enormous + response. In all of these cases there are things a client can do to + reduce that danger. + + There is also the case where a client can flood a server, by sending + an arbitratily long command. We'll discuss that issue, too, in this + section. + + + + +Leiba Informational [Page 4] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + +3.2.1.1. Listing Mailboxes + + Some servers present Usenet newsgroups to IMAP users. Newsgroups, + and other such hierarchical mailbox structures, can be very numerous + but may have only a few entries at the top level of hierarchy. Also, + some servers are built against mail stores that can, unbeknownst to + the server, have circular hierarchies - that is, it's possible for + "a/b/c/d" to resolve to the same file structure as "a", which would + then mean that "a/b/c/d/b" is the same as "a/b", and the hierarchy + will never end. The LIST response in this case will be unlimited. + + Clients that will have trouble with this are those that use + + C: 001 LIST "" * + + to determine the mailbox list. Because of this, clients should not + use an unqualified "*" that way in the LIST command. A safer + approach is to list each level of hierarchy individually, allowing + the user to traverse the tree one limb at a time, thus: + + C: 001 LIST "" % + S: * LIST () "/" Banana + S: * LIST ...etc... + S: 001 OK done + + and then + + C: 002 LIST "" Banana/% + S: * LIST () "/" Banana/Apple + S: * LIST ...etc... + S: 002 OK done + + Using this technique the client's user interface can give the user + full flexibility without choking on the voluminous reply to "LIST *". + + Of course, it is still possible that the reply to + + C: 005 LIST "" alt.fan.celebrity.% + + may be thousands of entries long, and there is, unfortunately, + nothing the client can do to protect itself from that. This has not + yet been a notable problem. + + Servers that may export circular hierarchies (any server that + directly presents a UNIX file system, for instance) should limit the + hierarchy depth to prevent unlimited LIST responses. A suggested + depth limit is 20 hierarchy levels. + + + + +Leiba Informational [Page 5] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + +3.2.1.2. Fetching the List of Messages + + When a client selects a mailbox, it is given a count, in the untagged + EXISTS response, of the messages in the mailbox. This number can be + very large. In such a case it might be unwise to use + + C: 004 FETCH 1:* ALL + + to populate the user's view of the mailbox. One good method to avoid + problems with this is to batch the requests, thus: + + C: 004 FETCH 1:50 ALL + S: * 1 FETCH ...etc... + S: 004 OK done + C: 005 FETCH 51:100 ALL + S: * 51 FETCH ...etc... + S: 005 OK done + C: 006 FETCH 101:150 ALL + ...etc... + + Using this method, another command, such as "FETCH 6 BODY[1]" can be + inserted as necessary, and the client will not have its access to the + server blocked by a storm of FETCH replies. (Such a method could be + reversed to fetch the LAST 50 messages first, then the 50 prior to + that, and so on.) + + As a smart extension of this, a well designed client, prepared for + very large mailboxes, will not automatically fetch data for all + messages AT ALL. Rather, the client will populate the user's view + only as the user sees it, possibly pre-fetching selected information, + and only fetching other information as the user scrolls to it. For + example, to select only those messages beginning with the first + unseen one: + + C: 003 SELECT INBOX + S: * 10000 EXISTS + S: * 80 RECENT + S: * FLAGS (\Answered \Flagged \Deleted \Draft \Seen) + S: * OK [UIDVALIDITY 824708485] UID validity status + S: * OK [UNSEEN 9921] First unseen message + S: 003 OK [READ-WRITE] SELECT completed + C: 004 FETCH 9921:* ALL + ... etc... + + If the server does not return an OK [UNSEEN] response, the client may + use SEARCH UNSEEN to obtain that value. + + + + + +Leiba Informational [Page 6] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + This mechanism is good as a default presentation method, but only + works well if the default message order is acceptable. A client may + want to present various sort orders to the user (by subject, by date + sent, by sender, and so on) and in that case (lacking a SORT + extension on the server side) the client WILL have to retrieve all + message descriptors. A client that provides this service should not + do it by default and should inform the user of the costs of choosing + this option for large mailboxes. + +3.2.1.3. Fetching a Large Body Part + + The issue here is similar to the one for a list of messages. In the + BODYSTRUCTURE response the client knows the size, in bytes, of the + body part it plans to fetch. Suppose this is a 70 MB video clip. The + client can use partial fetches to retrieve the body part in pieces, + avoiding the problem of an uninterruptible 70 MB literal coming back + from the server: + + C: 022 FETCH 3 BODY[1]<0.20000> + S: * 3 FETCH (FLAGS(\Seen) BODY[1]<0> {20000} + S: ...data...) + S: 022 OK done + C: 023 FETCH 3 BODY[1]<20001.20000> + S: * 3 FETCH (BODY[1]<20001> {20000} + S: ...data...) + S: 023 OK done + C: 024 FETCH 3 BODY[1]<40001.20000> + ...etc... + +3.2.1.4. BODYSTRUCTURE vs. Entire Messages + + Because FETCH BODYSTRUCTURE is necessary in order to determine the + number of body parts, and, thus, whether a message has "attachments", + clients often use FETCH FULL as their normal method of populating the + user's view of a mailbox. The benefit is that the client can display + a paperclip icon or some such indication along with the normal + message summary. However, this comes at a significant cost with some + server configurations. The parsing needed to generate the FETCH + BODYSTRUCTURE response may be time-consuming compared with that + needed for FETCH ENVELOPE. The client developer should consider this + issue when deciding whether the ability to add a paperclip icon is + worth the tradeoff in performance, especially with large mailboxes. + + Some clients, rather than using FETCH BODYSTRUCTURE, use FETCH BODY[] + (or the equivalent FETCH RFC822) to retrieve the entire message. + They then do the MIME parsing in the client. This may give the + client slightly more flexibility in some areas (access, for instance, + to header fields that aren't returned in the BODYSTRUCTURE and + + + +Leiba Informational [Page 7] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + ENVELOPE responses), but it can cause severe performance problems by + forcing the transfer of all body parts when the user might only want + to see some of them - a user logged on by modem and reading a small + text message with a large ZIP file attached may prefer to read the + text only and save the ZIP file for later. Therefore, a client + should not normally retrieve entire messages and should retrieve + message body parts selectively. + +3.2.1.5. Long Command Lines + + A client can wind up building a very long command line in an effort to + try to be efficient about requesting information from a server. This + can typically happen when a client builds a message set from selected + messages and doesn't recognise that contiguous blocks of messages may + be group in a range. Suppose a user selects all 10,000 messages in a + large mailbox and then unselects message 287. The client could build + that message set as "1:286,288:10000", but a client that doesn't + handle that might try to enumerate each message individually and build + "1,2,3,4, [and so on] ,9999,10000". Adding that to the fetch command + results in a command line that's almost 49,000 octets long, and, + clearly, one can construct a command line that's even longer. + + A client should limit the length of the command lines it generates to + approximately 1000 octets (including all quoted strings but not + including literals). If the client is unable to group things into + ranges so that the command line is within that length, it should + split the request into multiple commands. The client should use + literals instead of long quoted strings, in order to keep the command + length down. + + For its part, a server should allow for a command line of at least + 8000 octets. This provides plenty of leeway for accepting reasonable + length commands from clients. The server should send a BAD response + to a command that does not end within the server's maximum accepted + command length. + +3.2.2. Subscriptions + + The client isn't the only entity that can get flooded: the end user, + too, may need some flood control. The IMAP4 protocol provides such + control in the form of subscriptions. Most servers support the + SUBSCRIBE, UNSUBSCRIBE, and LSUB commands, and many users choose to + narrow down a large list of available mailboxes by subscribing to the + ones that they usually want to see. Clients, with this in mind, + should give the user a way to see only subscribed mailboxes. A + client that never uses the LSUB command takes a significant usability + feature away from the user. Of course, the client would not want to + hide the LIST command completely; the user needs to have a way to + + + +Leiba Informational [Page 8] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + choose between LIST and LSUB. The usual way to do this is to provide + a setting like "show which mailboxes?: [] all [] subscribed only". + +3.2.3. Searching + + IMAP SEARCH commands can become particularly troublesome (that is, + slow) on mailboxes containing a large number of messages. So let's + put a few things in perspective in that regard. + + The flag searches should be fast. The flag searches (ALL, [UN]SEEN, + [UN]ANSWERED, [UN]DELETED, [UN]DRAFT, [UN]FLAGGED, NEW, OLD, RECENT) + are known to be used by clients for the client's own use (for + instance, some clients use "SEARCH UNSEEN" to find unseen mail and + "SEARCH DELETED" to warn the user before expunging messages). + + Other searches, particularly the text searches (HEADER, TEXT, BODY) + are initiated by the user, rather than by the client itself, and + somewhat slower performance can be tolerated, since the user is aware + that the search is being done (and is probably aware that it might be + time-consuming). A smart server might use dynamic indexing to speed + commonly used text searches. + + The client may allow other commands to be sent to the server while a + SEARCH is in progress, but at the time of this writing there is + little or no server support for parallel processing of multiple + commands in the same session (and see "Multiple Accesses of the Same + Mailbox" above for a description of the dangers of trying to work + around this by doing your SEARCH in another session). + + Another word about text searches: some servers, built on database + back-ends with indexed search capabilities, may return search results + that do not match the IMAP spec's "case-insensitive substring" + requirements. While these servers are in violation of the protocol, + there is little harm in the violation as long as the search results + are used only in response to a user's request. Still, developers of + such servers should be aware that they ARE violating the protocol, + should think carefully about that behaviour, and must be certain that + their servers respond accurately to the flag searches for the reasons + outlined above. + + In addition, servers should support CHARSET UTF-8 [UTF-8] in + searches. + + + + + + + + + +Leiba Informational [Page 9] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + +3.3 Avoiding Invalid Requests + + IMAP4 provides ways for a server to tell a client in advance what is + and isn't permitted in some circumstances. Clients should use these + features to avoid sending requests that a well designed client would + know to be invalid. This section explains this in more detail. + +3.3.1. The CAPABILITY Command + + All IMAP4 clients should use the CAPABILITY command to determine what + version of IMAP and what optional features a server supports. The + client should not send IMAP4rev1 commands and arguments to a server + that does not advertize IMAP4rev1 in its CAPABILITY response. + Similarly, the client should not send IMAP4 commands that no longer + exist in IMAP4rev1 to a server that does not advertize IMAP4 in its + CAPABILITY response. An IMAP4rev1 server is NOT required to support + obsolete IMAP4 or IMAP2bis commands (though some do; do not let this + fact lull you into thinking that it's valid to send such commands to + an IMAP4rev1 server). + + A client should not send commands to probe for the existance of + certain extensions. All standard and standards-track extensions + include CAPABILITY tokens indicating their presense. All private and + experimental extensions should do the same, and clients that take + advantage of them should use the CAPABILITY response to determine + whether they may be used or not. + +3.3.2. Don't Do What the Server Says You Can't + + In many cases, the server, in response to a command, will tell the + client something about what can and can't be done with a particular + mailbox. The client should pay attention to this information and + should not try to do things that it's been told it can't do. + + Examples: + + * Do not try to SELECT a mailbox that has the \Noselect flag set. + * Do not try to CREATE a sub-mailbox in a mailbox that has the + \Noinferiors flag set. + * Do not respond to a failing COPY or APPEND command by trying to + CREATE the target mailbox if the server does not respond with a + [TRYCREATE] response code. + * Do not try to expunge a mailbox that has been selected with the + [READ-ONLY] response code. + + + + + + + +Leiba Informational [Page 10] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + +3.4. Miscellaneous Protocol Considerations + + We describe here a number of important protocol-related issues, the + misunderstanding of which has caused significant interoperability + problems in IMAP4 implementations. One general item is that every + implementer should be certain to take note of and to understand + section 2.2.2 and the preamble to section 7 of the IMAP4rev1 spec + [RFC-2060]. + +3.4.1. Well Formed Protocol + + We cannot stress enough the importance of adhering strictly to the + protocol grammar. The specification of the protocol is quite rigid; + do not assume that you can insert blank space for "readability" if + none is called for. Keep in mind that there are parsers out there + that will crash if there are protocol errors. There are clients that + will report every parser burp to the user. And in any case, + information that cannot be parsed is information that is lost. Be + careful in your protocol generation. And see "A Word About Testing", + below. + + In particular, note that the string in the INTERNALDATE response is + NOT an RFC-822 date string - that is, it is not in the same format as + the first string in the ENVELOPE response. Since most clients will, + in fact, accept an RFC-822 date string in the INTERNALDATE response, + it's easy to miss this in your interoperability testing. But it will + cause a problem with some client, so be sure to generate the correct + string for this field. + +3.4.2. Special Characters + + Certain characters, currently the double-quote and the backslash, may + not be sent as-is inside a quoted string. These characters must be + preceded by the escape character if they are in a quoted string, or + else the string must be sent as a literal. Both clients and servers + must handle this, both on output (they must send these characters + properly) and on input (they must be able to receive escaped + characters in quoted strings). Example: + + C: 001 LIST "" % + S: * LIST () "" INBOX + S: * LIST () "\\" TEST + S: * LIST () "\\" {12} + S: "My" mailbox + S: 001 OK done + C: 002 LIST "" "\"My\" mailbox\\%" + S: * LIST () "\\" {17} + S: "My" mailbox\Junk + + + +Leiba Informational [Page 11] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + S: 002 OK done + + Note that in the example the server sent the hierarchy delimiter as + an escaped character in the quoted string and sent the mailbox name + containing imbedded double-quotes as a literal. The client used only + quoted strings, escaping both the backslash and the double-quote + characters. + + The CR and LF characters may be sent ONLY in literals; they are not + allowed, even if escaped, inside quoted strings. + + And while we're talking about special characters: the IMAP spec, in + the section titled "Mailbox International Naming Convention", + describes how to encode mailbox names in modified UTF-7 [UTF-7 and + RFC-2060]. Implementations must adhere to this in order to be + interoperable in the international market, and servers should + validate mailbox names sent by client and reject names that do not + conform. + + As to special characters in userids and passwords: clients must not + restrict what a user may type in for a userid or a password. The + formal grammar specifies that these are "astrings", and an astring + can be a literal. A literal, in turn can contain any 8-bit + character, and clients must allow users to enter all 8-bit characters + here, and must pass them, unchanged, to the server (being careful to + send them as literals when necessary). In particular, some server + configurations use "@" in user names, and some clients do not allow + that character to be entered; this creates a severe interoperability + problem. + +3.4.3. UIDs and UIDVALIDITY + + Servers that support existing back-end mail stores often have no good + place to save UIDs for messages. Often the existing mail store will + not have the concept of UIDs in the sense that IMAP has: strictly + increasing, never re-issued, 32-bit integers. Some servers solve + this by storing the UIDs in a place that's accessible to end users, + allowing for the possibility that the users will delete them. Others + solve it by re-assigning UIDs every time a mailbox is selected. + + The server should maintain UIDs permanently for all messages if it + can. If that's not possible, the server must change the UIDVALIDITY + value for the mailbox whenever any of the UIDs may have become + invalid. Clients must recognize that the UIDVALIDITY has changed and + must respond to that condition by throwing away any information that + they have saved about UIDs in that mailbox. There have been many + problems in this area when clients have failed to do this; in the + worst case it will result in loss of mail when a client deletes the + + + +Leiba Informational [Page 12] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + wrong piece of mail by using a stale UID. + + It seems to be a common misunderstanding that "the UIDVALIDITY and + the UID, taken together, form a 64-bit identifier that uniquely + identifies a message on a server". This is absolutely NOT TRUE. + There is no assurance that the UIDVALIDITY values of two mailboxes be + different, so the UIDVALIDITY in no way identifies a mailbox. The + ONLY purpose of UIDVALIDITY is, as its name indicates, to give the + client a way to check the validity of the UIDs it has cached. While + it is a valid implementation choice to put these values together to + make a 64-bit identifier for the message, the important concept here + is that UIDs are not unique between mailboxes; they are only unique + WITHIN a given mailbox. + + Some server implementations have attempted to make UIDs unique across + the entire server. This is inadvisable, in that it limits the life + of UIDs unnecessarily. The UID is a 32-bit number and will run out + in reasonably finite time if it's global across the server. If you + assign UIDs sequentially in one mailbox, you will not have to start + re-using them until you have had, at one time or another, 2**32 + different messages in that mailbox. In the global case, you will + have to reuse them once you have had, at one time or another, 2**32 + different messages in the entire mail store. Suppose your server has + around 8000 users registered (2**13). That gives an average of 2**19 + UIDs per user. Suppose each user gets 32 messages (2**5) per day. + That gives you 2**14 days (16000+ days = about 45 years) before you + run out. That may seem like enough, but multiply the usage just a + little (a lot of spam, a lot of mailing list subscriptions, more + users) and you limit yourself too much. + + What's worse is that if you have to wrap the UIDs, and, thus, you + have to change UIDVALIDITY and invalidate the UIDs in the mailbox, + you have to do it for EVERY mailbox in the system, since they all + share the same UID pool. If you assign UIDs per mailbox and you have + a problem, you only have to kill the UIDs for that one mailbox. + + Under extreme circumstances (and this is extreme, indeed), the server + may have to invalidate UIDs while a mailbox is in use by a client - + that is, the UIDs that the client knows about in its active mailbox + are no longer valid. In that case, the server must immediately + change the UIDVALIDITY and must communicate this to the client. The + server may do this by sending an unsolicited UIDVALIDITY message, in + the same form as in response to the SELECT command. Clients must be + prepared to handle such a message and the possibly coincident failure + of the command in process. For example: + + + + + + +Leiba Informational [Page 13] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + C: 032 UID STORE 382 +Flags.silent \Deleted + S: * OK [UIDVALIDITY 12345] New UIDVALIDITY value! + S: 032 NO UID command rejected because UIDVALIDITY changed! + C: ...invalidates local information and re-fetches... + C: 033 FETCH 1:* UID + ...etc... + + At the time of the writing of this document, the only server known to + do this does so only under the following condition: the client + selects INBOX, but there is not yet a physical INBOX file created. + Nonetheless, the SELECT succeeds, exporting an empty INBOX with a + temporary UIDVALIDITY of 1. While the INBOX remains selected, mail + is delivered to the user, which creates the real INBOX file and + assigns a permanent UIDVALIDITY (that is likely not to be 1). The + server reports the change of UIDVALIDITY, but as there were no + messages before, so no UIDs have actually changed, all the client + must do is accept the change in UIDVALIDITY. + + Alternatively, a server may force the client to re-select the + mailbox, at which time it will obtain a new UIDVALIDITY value. To do + this, the server closes this client session (see "Severed + Connections" above) and the client then reconnects and gets back in + synch. Clients must be prepared for either of these behaviours. + + We do not know of, nor do we anticipate the future existance of, a + server that changes UIDVALIDITY while there are existing messages, + but clients must be prepared to handle this eventuality. + +3.4.4. FETCH Responses + + When a client asks for certain information in a FETCH command, the + server may return the requested information in any order, not + necessarily in the order that it was requested. Further, the server + may return the information in separate FETCH responses and may also + return information that was not explicitly requested (to reflect to + the client changes in the state of the subject message). Some + examples: + + C: 001 FETCH 1 UID FLAGS INTERNALDATE + S: * 5 FETCH (FLAGS (\Deleted)) + S: * 1 FETCH (FLAGS (\Seen) INTERNALDATE "..." UID 345) + S: 001 OK done + + (In this case, the responses are in a different order. Also, the + server returned a flag update for message 5, which wasn't part of the + client's request.) + + + + + +Leiba Informational [Page 14] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + C: 002 FETCH 2 UID FLAGS INTERNALDATE + S: * 2 FETCH (INTERNALDATE "...") + S: * 2 FETCH (UID 399) + S: * 2 FETCH (FLAGS ()) + S: 002 OK done + + (In this case, the responses are in a different order and were + returned in separate responses.) + + C: 003 FETCH 2 BODY[1] + S: * 2 FETCH (FLAGS (\Seen) BODY[1] {14} + S: Hello world! + S: ) + S: 003 OK done + + (In this case, the FLAGS response was added by the server, since + fetching the body part caused the server to set the \Seen flag.) + + Because of this characteristic a client must be ready to receive any + FETCH response at any time and should use that information to update + its local information about the message to which the FETCH response + refers. A client must not assume that any FETCH responses will come + in any particular order, or even that any will come at all. If after + receiving the tagged response for a FETCH command the client finds + that it did not get all of the information requested, the client + should send a NOOP command to the server to ensure that the server + has an opportunity to send any pending EXPUNGE responses to the + client (see [RFC-2180]). + +3.4.5. RFC822.SIZE + + Some back-end mail stores keep the mail in a canonical form, rather + than retaining the original MIME format of the messages. This means + that the server must reassemble the message to produce a MIME stream + when a client does a fetch such as RFC822 or BODY[], requesting the + entire message. It also may mean that the server has no convenient + way to know the RFC822.SIZE of the message. Often, such a server + will actually have to build the MIME stream to compute the size, only + to throw the stream away and report the size to the client. + + When this is the case, some servers have chosen to estimate the size, + rather than to compute it precisely. Such an estimate allows the + client to display an approximate size to the user and to use the + estimate in flood control considerations (q.v.), but requires that + the client not use the size for things such as allocation of buffers, + because those buffers might then be too small to hold the actual MIME + stream. Instead, a client should use the size that's returned in the + literal when you fetch the data. + + + +Leiba Informational [Page 15] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + The protocol requires that the RFC822.SIZE value returned by the + server be EXACT. Estimating the size is a protocol violation, and + server designers must be aware that, despite the performance savings + they might realize in using an estimate, this practice will cause + some clients to fail in various ways. If possible, the server should + compute the RFC822.SIZE for a particular message once, and then save + it for later retrieval. If that's not possible, the server must + compute the value exactly every time. Incorrect estimates do cause + severe interoperability problems with some clients. + +3.4.6. Expunged Messages + + If the server allows multiple connections to the same mailbox, it is + often possible for messages to be expunged in one client unbeknownst + to another client. Since the server is not allowed to tell the + client about these expunged messages in response to a FETCH command, + the server may have to deal with the issue of how to return + information about an expunged message. There was extensive + discussion about this issue, and the results of that discussion are + summarized in [RFC-2180]. See that reference for a detailed + explanation and for recommendations. + +3.4.7. The Namespace Issue + + Namespaces are a very muddy area in IMAP4 implementation right now + (see [NAMESPACE] for a proposal to clear the water a bit). Until the + issue is resolved, the important thing for client developers to + understand is that some servers provide access through IMAP to more + than just the user's personal mailboxes, and, in fact, the user's + personal mailboxes may be "hidden" somewhere in the user's default + hierarchy. The client, therefore, should provide a setting wherein + the user can specify a prefix to be used when accessing mailboxes. If + the user's mailboxes are all in "~/mail/", for instance, then the + user can put that string in the prefix. The client would then put + the prefix in front of any name pattern in the LIST and LSUB + commands: + + C: 001 LIST "" ~/mail/% + + (See also "Reference Names in the LIST Command" below.) + +3.4.8. Creating Special-Use Mailboxes + + It may seem at first that this is part of the namespace issue; it is + not, and is only indirectly related to it. A number of clients like + to create special-use mailboxes with particular names. Most + commonly, clients with a "trash folder" model of message deletion + want to create a mailbox with the name "Trash" or "Deleted". Some + + + +Leiba Informational [Page 16] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + clients want to create a "Drafts" mailbox, an "Outbox" mailbox, or a + "Sent Mail" mailbox. And so on. There are two major + interoperability problems with this practice: + + 1. different clients may use different names for mailboxes with + similar functions (such as "Trash" and "Deleted"), or may manage + the same mailboxes in different ways, causing problems if a user + switches between clients and + 2. there is no guarantee that the server will allow the creation of + the desired mailbox. + + The client developer is, therefore, well advised to consider + carefully the creation of any special-use mailboxes on the server, + and, further, the client must not require such mailbox creation - + that is, if you do decide to do this, you must handle gracefully the + failure of the CREATE command and behave reasonably when your + special-use mailboxes do not exist and can not be created. + + In addition, the client developer should provide a convenient way for + the user to select the names for any special-use mailboxes, allowing + the user to make these names the same in all clients used and to put + them where the user wants them. + +3.4.9. Reference Names in the LIST Command + + Many implementers of both clients and servers are confused by the + "reference name" on the LIST command. The reference name is intended + to be used in much the way a "cd" (change directory) command is used + on Unix, PC DOS, Windows, and OS/2 systems. That is, the mailbox + name is interpreted in much the same way as a file of that name would + be found if one had done a "cd" command into the directory specified + by the reference name. For example, in Unix we have the following: + + > cd /u/jones/junk + > vi banana [file is "/u/jones/junk/banana"] + > vi stuff/banana [file is "/u/jones/junk/stuff/banana"] + > vi /etc/hosts [file is "/etc/hosts"] + + In the past, there have been several interoperability problems with + this. First, while some IMAP servers are built on Unix or PC file + systems, many others are not, and the file system semantics do not + make sense in those configurations. Second, while some IMAP servers + expose the underlying file system to the clients, others allow access + only to the user's personal mailboxes, or to some other limited set + of files, making such file-system-like semantics less meaningful. + Third, because the IMAP spec leaves the interpretation of the + reference name as "implementation-dependent", in the past the various + server implementations handled it in vastly differing ways. + + + +Leiba Informational [Page 17] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + The following recommendations are the result of significant + operational experience, and are intended to maximize + interoperability. + + Server implementations must implement the reference argument in a way + that matches the intended "change directory" operation as closely as + possible. As a minimum implementation, the reference argument may be + prepended to the mailbox name (while suppressing double delimiters; + see the next paragraph). Even servers that do not provide a way to + break out of the current hierarchy (see "breakout facility" below) + must provide a reasonable implementation of the reference argument, + as described here, so that they will interoperate with clients that + use it. + + Server implementations that prepend the reference argument to the + mailbox name should insert a hierarchy delimiter between them, and + must not insert a second if one is already present: + + C: A001 LIST ABC DEF + S: * LIST () "/" ABC/DEF <=== should do this + S: A001 OK done + + C: A002 LIST ABC/ /DEF + S: * LIST () "/" ABC//DEF <=== must not do this + S: A002 OK done + + On clients, the reference argument is chiefly used to implement a + "breakout facility", wherein the user may directly access a mailbox + outside the "current directory" hierarchy. Client implementations + should have an operational mode that does not use the reference + argument. This is to interoperate with older servers that did not + implement the reference argument properly. While it's a good idea to + give the user access to a breakout facility, clients that do not + intend to do so should not use the reference argument at all. + + Client implementations should always place a trailing hierarchy + delimiter on the reference argument. This is because some servers + prepend the reference argument to the mailbox name without inserting + a hierarchy delimiter, while others do insert a hierarchy delimiter + if one is not already present. A client that puts the delimiter in + will work with both varieties of server. + + Client implementations that implement a breakout facility should + allow the user to choose whether or not to use a leading hierarchy + delimiter on the mailbox argument. This is because the handling of a + leading mailbox hierarchy delimiter also varies from server to + server, and even between different mailstores on the same server. In + some cases, a leading hierarchy delimiter means "discard the + + + +Leiba Informational [Page 18] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + reference argument" (implementing the intended breakout facility), + thus: + + C: A001 LIST ABC/ /DEF + S: * LIST () "/" /DEF + S: A001 OK done + + In other cases, however, the two are catenated and the extra + hierarchy delimiter is discarded, thus: + + C: A001 LIST ABC/ /DEF + S: * LIST () "/" ABC/DEF + S: A001 OK done + + Client implementations must not assume that the server supports a + breakout facility, but may provide a way for the user to use one if + it is available. Any breakout facility should be exported to the + user interface. Note that there may be other "breakout" characters + besides the hierarchy delimiter (for instance, UNIX filesystem + servers are likely to use a leading "~" as well), and that their + interpretation is server-dependent. + +3.4.10. Mailbox Hierarchy Delimiters + + The server's selection of what to use as a mailbox hierarchy + delimiter is a difficult one, involving several issues: What + characters do users expect to see? What characters can they enter + for a hierarchy delimiter if it is desired (or required) that the + user enter it? What character can be used for the hierarchy + delimiter, noting that the chosen character can not otherwise be used + in the mailbox name? + + Because some interfaces show users the hierarchy delimiters or allow + users to enter qualified mailbox names containing them, server + implementations should use delimiter characters that users generally + expect to see as name separators. The most common characters used + for this are "/" (as in Unix file names), "\" (as in OS/2 and Windows + file names), and "." (as in news groups). There is little to choose + among these apart from what users may expect or what is dictated by + the underlying file system, if any. One consideration about using + "\" is that it's also a special character in the IMAP protocol. While + the use of other hierarchy delimiter characters is permissible, A + DESIGNER IS WELL ADVISED TO STAY WITH ONE FROM THIS SET unless the + server is intended for special purposes only. Implementers might be + thinking about using characters such as "-", "_", ";", "&", "#", "@", + and "!", but they should be aware of the surprise to the user as well + as of the effect on URLs and other external specifications (since + some of these characters have special meanings there). Also, a + + + +Leiba Informational [Page 19] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + server that uses "\" (and clients of such a server) must remember to + escape that character in quoted strings or to send literals instead. + Literals are recommended over escaped characters in quoted strings in + order to maintain compatibility with older IMAP versions that did not + allow escaped characters in quoted strings (but check the grammar to + see where literals are allowed): + + C: 001 LIST "" {13} + S: + send literal + C: this\%\%\%\h* + S: * LIST () "\\" {27} + S: this\is\a\mailbox\hierarchy + S: 001 OK LIST complete + + In any case, a server should not use normal alpha-numeric characters + (such as "X" or "0") as delimiters; a user would be very surprised to + find that "EXPENDITURES" actually represented a two-level hierarchy. + And a server should not use characters that are non-printable or + difficult or impossible to enter on a standard US keyboard. Control + characters, box-drawing characters, and characters from non-US + alphabets fit into this category. Their use presents + interoperability problems that are best avoided. + + The UTF-7 encoding of mailbox names also raises questions about what + to do with the hierarchy delimiters in encoded names: do we encode + each hierarchy level and separate them with delimiters, or do we + encode the fully qualified name, delimiters and all? The answer for + IMAP is the former: encode each hierarchy level separately, and + insert delimiters between. This makes it particularly important not + to use as a hierarchy delimiter a character that might cause + confusion with IMAP's modified UTF-7 [UTF-7 and RFC-2060] encoding. + + To repeat: a server should use "/", "\", or "." as its hierarchy + delimiter. The use of any other character is likely to cause + problems and is STRONGLY DISCOURAGED. + +3.4.11. ALERT Response Codes + + The protocol spec is very clear on the matter of what to do with + ALERT response codes, and yet there are many clients that violate it + so it needs to be said anyway: "The human-readable text contains a + special alert that must be presented to the user in a fashion that + calls the user's attention to the message." That should be clear + enough, but I'll repeat it here: Clients must present ALERT text + clearly to the user. + + + + + + +Leiba Informational [Page 20] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + +3.4.12. Deleting Mailboxes + + The protocol does not guarantee that a client may delete a mailbox + that is not empty, though on some servers it is permissible and is, + in fact, much faster than the alternative or deleting all the + messages from the client. If the client chooses to try to take + advantage of this possibility it must be prepared to use the other + method in the even that the more convenient one fails. Further, a + client should not try to delete the mailbox that it has selected, but + should first close that mailbox; some servers do not permit the + deletion of the selected mailbox. + + That said, a server should permit the deletion of a non-empty + mailbox; there's little reason to pass this work on to the client. + Moreover, forbidding this prevents the deletion of a mailbox that for + some reason can not be opened or expunged, leading to possible + denial-of-service problems. + + Example: + + [User tells the client to delete mailbox BANANA, which is + currently selected...] + C: 008 CLOSE + S: 008 OK done + C: 009 DELETE BANANA + S: 009 NO Delete failed; mailbox is not empty. + C: 010 SELECT BANANA + S: * ... untagged SELECT responses + S: 010 OK done + C: 011 STORE 1:* +FLAGS.SILENT \DELETED + S: 011 OK done + C: 012 CLOSE + S: 012 OK done + C: 013 DELETE BANANA + S: 013 OK done + +3.5. A Word About Testing + + Since the whole point of IMAP is interoperability, and since + interoperability can not be tested in a vacuum, the final + recommendation of this treatise is, "Test against EVERYTHING." Test + your client against every server you can get an account on. Test + your server with every client you can get your hands on. Many + clients make limited test versions available on the Web for the + downloading. Many server owners will give serious client developers + guest accounts for testing. Contact them and ask. NEVER assume that + because your client works with one or two servers, or because your + server does fine with one or two clients, you will interoperate well + + + +Leiba Informational [Page 21] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + + in general. + + In particular, in addition to everything else, be sure to test + against the reference implementations: the PINE client, the + University of Washington server, and the Cyrus server. + + See the following URLs on the web for more information here: + + IMAP Products and Sources: http://www.imap.org/products.html + IMC MailConnect: http://www.imc.org/imc-mailconnect + +4. Security Considerations + + This document describes behaviour of clients and servers that use the + IMAP4 protocol, and as such, has the same security considerations as + described in [RFC-2060]. + +5. References + + [RFC-2060] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + [RFC-2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC-2180] Gahrns, M., "IMAP4 Multi-Accessed Mailbox Practice", RFC + 2180, July 1997. + + [UTF-8] Yergeau, F., " UTF-8, a transformation format of Unicode + and ISO 10646", RFC 2044, October 1996. + + [UTF-7] Goldsmith, D. and M. Davis, "UTF-7, a Mail-Safe + Transformation Format of Unicode", RFC 2152, May 1997. + + [NAMESPACE] Gahrns, M. and C. Newman, "IMAP4 Namespace", Work in + Progress. + +6. Author's Address + + Barry Leiba + IBM T.J. Watson Research Center + 30 Saw Mill River Road + Hawthorne, NY 10532 + + Phone: 1-914-784-7941 + EMail: leiba@watson.ibm.com + + + + + +Leiba Informational [Page 22] + +RFC 2683 IMAP4 Implementation Recommendations September 1999 + + +7. Full Copyright Statement + + Copyright (C) The Internet Society (1999). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Leiba Informational [Page 23] + diff --git a/doc/rfc2971.txt b/doc/rfc2971.txt @@ -0,0 +1,451 @@ + + + + + + +Network Working Group T. Showalter +Request for Comments: 2971 Mirapoint, Inc. +Category: Standards Track October 2000 + + + IMAP4 ID extension + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2000). All Rights Reserved. + +Abstract + + The ID extension to the Internet Message Access Protocol - Version + 4rev1 (IMAP4rev1) protocol allows the server and client to exchange + identification information on their implementation in order to make + bug reports and usage statistics more complete. + +1. Introduction + + The IMAP4rev1 protocol described in [IMAP4rev1] provides a method for + accessing remote mail stores, but it provides no facility to + advertise what program a client or server uses to provide service. + This makes it difficult for implementors to get complete bug reports + from users, as it is frequently difficult to know what client or + server is in use. + + Additionally, some sites may wish to assemble usage statistics based + on what clients are used, but in an an environment where users are + permitted to obtain and maintain their own clients this is difficult + to accomplish. + + The ID command provides a facility to advertise information on what + programs are being used along with contact information (should bugs + ever occur). + + + + + + + + +Showalter Standards Track [Page 1] + +RFC 2971 IMAP4 ID extension October 2000 + + +2. Conventions Used in this Document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [KEYWORDS]. + + The conventions used in this document are the same as specified in + [IMAP4rev1]. In examples, "C:" and "S:" indicate lines sent by the + client and server respectively. Line breaks have been inserted for + readability. + +3. Specification + + The sole purpose of the ID extension is to enable clients and servers + to exchange information on their implementations for the purposes of + statistical analysis and problem determination. + + This information is be submitted to a server by any client wishing to + provide information for statistical purposes, provided the server + advertises its willingness to take the information with the atom "ID" + included in the list of capabilities returned by the CAPABILITY + command. + + Implementations MUST NOT make operational changes based on the data + sent as part of the ID command or response. The ID command is for + human consumption only, and is not to be used in improving the + performance of clients or servers. + + This includes, but is not limited to, the following: + + Servers MUST NOT attempt to work around client bugs by using + information from the ID command. Clients MUST NOT attempt to work + around server bugs based on the ID response. + + Servers MUST NOT provide features to a client or otherwise + optimize for a particular client by using information from the ID + command. Clients MUST NOT provide features to a server or + otherwise optimize for a particular server based on the ID + response. + + Servers MUST NOT deny access to or refuse service for a client + based on information from the ID command. Clients MUST NOT refuse + to operate or limit their operation with a server based on the ID + response. + + + + + + + +Showalter Standards Track [Page 2] + +RFC 2971 IMAP4 ID extension October 2000 + + + Rationale: It is imperative that this extension not supplant IMAP's + CAPABILITY mechanism with a ad-hoc approach where implementations + guess each other's features based on who they claim to be. + + Implementations MUST NOT send false information in an ID command. + + Implementations MAY send less information than they have available or + no information at all. Such behavior may be useful to preserve user + privacy. See Security Considerations, section 7. + +3.1. ID Command + + Arguments: client parameter list or NIL + + Responses: OPTIONAL untagged response: ID + + Result: OK identification information accepted + BAD command unknown or arguments invalid + + Implementation identification information is sent by the client with + the ID command. + + This command is valid in any state. + + The information sent is in the form of a list of field/value pairs. + Fields are permitted to be any IMAP4 string, and values are permitted + to be any IMAP4 string or NIL. A value of NIL indicates that the + client can not or will not specify this information. The client may + also send NIL instead of the list, indicating that it wants to send + no information, but would still accept a server response. + + The available fields are defined in section 3.3. + + Example: C: a023 ID ("name" "sodr" "version" "19.34" "vendor" + "Pink Floyd Music Limited") + S: * ID NIL + S: a023 OK ID completed + +3.2. ID Response + + Contents: server parameter list + + In response to an ID command issued by the client, the server replies + with a tagged response containing information on its implementation. + The format is the same as the client list. + + + + + + +Showalter Standards Track [Page 3] + +RFC 2971 IMAP4 ID extension October 2000 + + + Example: C: a042 ID NIL + S: * ID ("name" "Cyrus" "version" "1.5" "os" "sunos" + "os-version" "5.5" "support-url" + "mailto:cyrus-bugs+@andrew.cmu.edu") + S: a042 OK ID command completed + + A server MUST send a tagged ID response to an ID command. However, a + server MAY send NIL in place of the list. + +3.3. Defined Field Values + + Any string may be sent as a field, but the following are defined to + describe certain values that might be sent. Implementations are free + to send none, any, or all of these. Strings are not case-sensitive. + Field strings MUST NOT be longer than 30 octets. Value strings MUST + NOT be longer than 1024 octets. Implementations MUST NOT send more + than 30 field-value pairs. + + name Name of the program + version Version number of the program + os Name of the operating system + os-version Version of the operating system + vendor Vendor of the client/server + support-url URL to contact for support + address Postal address of contact/vendor + date Date program was released, specified as a date-time + in IMAP4rev1 + command Command used to start the program + arguments Arguments supplied on the command line, if any + if any + environment Description of environment, i.e., UNIX environment + variables or Windows registry settings + + Implementations MUST NOT use contact information to submit automatic + bug reports. Implementations may include information from an ID + response in a report automatically prepared, but are prohibited from + sending the report without user authorization. + + It is preferable to find the name and version of the underlying + operating system at runtime in cases where this is possible. + + Information sent via an ID response may violate user privacy. See + Security Considerations, section 7. + + Implementations MUST NOT send the same field name more than once. + + + + + + +Showalter Standards Track [Page 4] + +RFC 2971 IMAP4 ID extension October 2000 + + +4. Formal Syntax + + This syntax is intended to augment the grammar specified in + [IMAP4rev1] in order to provide for the ID command. This + specification uses the augmented Backus-Naur Form (BNF) notation as + used in [IMAP4rev1]. + + command_any ::= "CAPABILITY" / "LOGOUT" / "NOOP" / x_command / id + ;; adds id command to command_any in [IMAP4rev1] + + id ::= "ID" SPACE id_params_list + + id_response ::= "ID" SPACE id_params_list + + id_params_list ::= "(" #(string SPACE nstring) ")" / nil + ;; list of field value pairs + + response_data ::= "*" SPACE (resp_cond_state / resp_cond_bye / + mailbox_data / message_data / capability_data / id_response) + +5. Use of the ID extension with Firewalls and Other Intermediaries + + There exist proxies, firewalls, and other intermediary systems that + can intercept an IMAP session and make changes to the data exchanged + in the session. Such intermediaries are not anticipated by the IMAP4 + protocol design and are not within the scope of the IMAP4 standard. + However, in order for the ID command to be useful in the presence of + such intermediaries, those intermediaries need to take special note + of the ID command and response. In particular, if an intermediary + changes any part of the IMAP session it must also change the ID + command to advertise its presence. + + A firewall MAY act to block transmission of specific information + fields in the ID command and response that it believes reveal + information that could expose a security vulnerability. However, a + firewall SHOULD NOT disable the extension, when present, entirely, + and SHOULD NOT unconditionally remove either the client or server + list. + + Finally, it should be noted that a firewall, when handling a + CAPABILITY response, MUST NOT allow the names of extensions to be + returned to the client that the firewall has no knowledge of. + + + + + + + + + +Showalter Standards Track [Page 5] + +RFC 2971 IMAP4 ID extension October 2000 + + +6. References + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", RFC 2119, March 1997. + + [IMAP4rev1] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, October 1996. + + [RFC-822] Crocker, D., "Standard for the Format of ARPA Internet + Text Messages", STD 11, RFC 822, August 1982. + +7. Security Considerations + + This extension has the danger of violating the privacy of users if + misused. Clients and servers should notify users that they implement + and enable the ID command. + + It is highly desirable that implementations provide a method of + disabling ID support, perhaps by not sending ID at all, or by sending + NIL as the argument to the ID command or response. + + Implementors must exercise extreme care in adding fields sent as part + of an ID command or response. Some fields, including a processor ID + number, Ethernet address, or other unique (or mostly unique) + identifier allow tracking of users in ways that violate user privacy + expectations. + + Having implementation information of a given client or server may + make it easier for an attacker to gain unauthorized access due to + security holes. + + Since this command includes arbitrary data and does not require the + user to authenticate, server implementations are cautioned to guard + against an attacker sending arbitrary garbage data in order to fill + up the ID log. In particular, if a server naively logs each ID + command to disk without inspecting it, an attacker can simply fire up + thousands of connections and send a few kilobytes of random data. + Servers have to guard against this. Methods include truncating + abnormally large responses; collating responses by storing only a + single copy, then keeping a counter of the number of times that + response has been seen; keeping only particularly interesting parts + of responses; and only logging responses of users who actually log + in. + + Security is affected by firewalls which modify the IMAP protocol + stream; see section 5, Use of the ID Extension with Firewalls and + Other Intermediaries, for more information. + + + + +Showalter Standards Track [Page 6] + +RFC 2971 IMAP4 ID extension October 2000 + + +8. Author's Address + + Tim Showalter + Mirapoint, Inc. + 909 Hermosa Ct. + Sunnyvale, CA 94095 + + EMail: tjs@mirapoint.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Showalter Standards Track [Page 7] + +RFC 2971 IMAP4 ID extension October 2000 + + +9. Full Copyright Statement + + Copyright (C) The Internet Society (2000). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Showalter Standards Track [Page 8] + diff --git a/doc/rfc3028.txt b/doc/rfc3028.txt @@ -0,0 +1,2019 @@ + + + + + + +Network Working Group T. Showalter +Request for Comments: 3028 Mirapoint, Inc. +Category: Standards Track January 2001 + + + Sieve: A Mail Filtering Language + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2001). All Rights Reserved. + +Abstract + + This document describes a language for filtering e-mail messages at + time of final delivery. It is designed to be implementable on either + a mail client or mail server. It is meant to be extensible, simple, + and independent of access protocol, mail architecture, and operating + system. It is suitable for running on a mail server where users may + not be allowed to execute arbitrary programs, such as on black box + Internet Message Access Protocol (IMAP) servers, as it has no + variables, loops, or ability to shell out to external programs. + +Table of Contents + + 1. Introduction ........................................... 3 + 1.1. Conventions Used in This Document ..................... 4 + 1.2. Example mail messages ................................. 4 + 2. Design ................................................. 5 + 2.1. Form of the Language .................................. 5 + 2.2. Whitespace ............................................ 5 + 2.3. Comments .............................................. 6 + 2.4. Literal Data .......................................... 6 + 2.4.1. Numbers ............................................... 6 + 2.4.2. Strings ............................................... 7 + 2.4.2.1. String Lists .......................................... 7 + 2.4.2.2. Headers ............................................... 8 + 2.4.2.3. Addresses ............................................. 8 + 2.4.2.4. MIME Parts ............................................ 9 + 2.5. Tests ................................................. 9 + 2.5.1. Test Lists ............................................ 9 + + + +Showalter Standards Track [Page 1] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + 2.6. Arguments ............................................. 9 + 2.6.1. Positional Arguments .................................. 9 + 2.6.2. Tagged Arguments ...................................... 10 + 2.6.3. Optional Arguments .................................... 10 + 2.6.4. Types of Arguments .................................... 10 + 2.7. String Comparison ..................................... 11 + 2.7.1. Match Type ............................................ 11 + 2.7.2. Comparisons Across Character Sets ..................... 12 + 2.7.3. Comparators ........................................... 12 + 2.7.4. Comparisons Against Addresses ......................... 13 + 2.8. Blocks ................................................ 14 + 2.9. Commands .............................................. 14 + 2.10. Evaluation ............................................ 15 + 2.10.1. Action Interaction .................................... 15 + 2.10.2. Implicit Keep ......................................... 15 + 2.10.3. Message Uniqueness in a Mailbox ....................... 15 + 2.10.4. Limits on Numbers of Actions .......................... 16 + 2.10.5. Extensions and Optional Features ...................... 16 + 2.10.6. Errors ................................................ 17 + 2.10.7. Limits on Execution ................................... 17 + 3. Control Commands ....................................... 17 + 3.1. Control Structure If .................................. 18 + 3.2. Control Structure Require ............................. 19 + 3.3. Control Structure Stop ................................ 19 + 4. Action Commands ........................................ 19 + 4.1. Action reject ......................................... 20 + 4.2. Action fileinto ....................................... 20 + 4.3. Action redirect ....................................... 21 + 4.4. Action keep ........................................... 21 + 4.5. Action discard ........................................ 22 + 5. Test Commands .......................................... 22 + 5.1. Test address .......................................... 23 + 5.2. Test allof ............................................ 23 + 5.3. Test anyof ............................................ 24 + 5.4. Test envelope ......................................... 24 + 5.5. Test exists ........................................... 25 + 5.6. Test false ............................................ 25 + 5.7. Test header ........................................... 25 + 5.8. Test not .............................................. 26 + 5.9. Test size ............................................. 26 + 5.10. Test true ............................................. 26 + 6. Extensibility .......................................... 26 + 6.1. Capability String ..................................... 27 + 6.2. IANA Considerations ................................... 28 + 6.2.1. Template for Capability Registrations ................. 28 + 6.2.2. Initial Capability Registrations ...................... 28 + 6.3. Capability Transport .................................. 29 + 7. Transmission ........................................... 29 + + + +Showalter Standards Track [Page 2] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + 8. Parsing ................................................ 30 + 8.1. Lexical Tokens ........................................ 30 + 8.2. Grammar ............................................... 31 + 9. Extended Example ....................................... 32 + 10. Security Considerations ................................ 34 + 11. Acknowledgments ........................................ 34 + 12. Author's Address ....................................... 34 + 13. References ............................................. 34 + 14. Full Copyright Statement ............................... 36 + +1. Introduction + + This memo documents a language that can be used to create filters for + electronic mail. It is not tied to any particular operating system or + mail architecture. It requires the use of [IMAIL]-compliant + messages, but should otherwise generalize to many systems. + + The language is powerful enough to be useful but limited in order to + allow for a safe server-side filtering system. The intention is to + make it impossible for users to do anything more complex (and + dangerous) than write simple mail filters, along with facilitating + the use of GUIs for filter creation and manipulation. The language is + not Turing-complete: it provides no way to write a loop or a function + and variables are not provided. + + Scripts written in Sieve are executed during final delivery, when the + message is moved to the user-accessible mailbox. In systems where + the MTA does final delivery, such as traditional Unix mail, it is + reasonable to sort when the MTA deposits mail into the user's + mailbox. + + There are a number of reasons to use a filtering system. Mail + traffic for most users has been increasing due to increased usage of + e-mail, the emergence of unsolicited email as a form of advertising, + and increased usage of mailing lists. + + Experience at Carnegie Mellon has shown that if a filtering system is + made available to users, many will make use of it in order to file + messages from specific users or mailing lists. However, many others + did not make use of the Andrew system's FLAMES filtering language + [FLAMES] due to difficulty in setting it up. + + Because of the expectation that users will make use of filtering if + it is offered and easy to use, this language has been made simple + enough to allow many users to make use of it, but rich enough that it + can be used productively. However, it is expected that GUI-based + editors will be the preferred way of editing filters for a large + number of users. + + + +Showalter Standards Track [Page 3] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + +1.1. Conventions Used in This Document + + In the sections of this document that discuss the requirements of + various keywords and operators, the following conventions have been + adopted. + + The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and + "MAY" in this document are to be interpreted as defined in + [KEYWORDS]. + + Each section on a command (test, action, or control structure) has a + line labeled "Syntax:". This line describes the syntax of the + command, including its name and its arguments. Required arguments + are listed inside angle brackets ("<" and ">"). Optional arguments + are listed inside square brackets ("[" and "]"). Each argument is + followed by its type, so "<key: string>" represents an argument + called "key" that is a string. Literal strings are represented with + double-quoted strings. Alternatives are separated with slashes, and + parenthesis are used for grouping, similar to [ABNF]. + + In the "Syntax" line, there are three special pieces of syntax that + are frequently repeated, MATCH-TYPE, COMPARATOR, and ADDRESS-PART. + These are discussed in sections 2.7.1, 2.7.3, and 2.7.4, + respectively. + + The formal grammar for these commands in section 10 and is the + authoritative reference on how to construct commands, but the formal + grammar does not specify the order, semantics, number or types of + arguments to commands, nor the legal command names. The intent is to + allow for extension without changing the grammar. + +1.2. Example mail messages + + The following mail messages will be used throughout this document in + examples. + + Message A + ----------------------------------------------------------- + Date: Tue, 1 Apr 1997 09:06:31 -0800 (PST) + From: coyote@desert.example.org + To: roadrunner@acme.example.com + Subject: I have a present for you + + Look, I'm sorry about the whole anvil thing, and I really + didn't mean to try and drop it on you from the top of the + cliff. I want to try to make it up to you. I've got some + great birdseed over here at my place--top of the line + + + + +Showalter Standards Track [Page 4] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + stuff--and if you come by, I'll have it all wrapped up + for you. I'm really sorry for all the problems I've caused + for you over the years, but I know we can work this out. + -- + Wile E. Coyote "Super Genius" coyote@desert.example.org + ----------------------------------------------------------- + + Message B + ----------------------------------------------------------- + From: youcouldberich!@reply-by-postal-mail.invalid + Sender: b1ff@de.res.example.com + To: rube@landru.example.edu + Date: Mon, 31 Mar 1997 18:26:10 -0800 + Subject: $$$ YOU, TOO, CAN BE A MILLIONAIRE! $$$ + + YOU MAY HAVE ALREADY WON TEN MILLION DOLLARS, BUT I DOUBT + IT! SO JUST POST THIS TO SIX HUNDRED NEWSGROUPS! IT WILL + GUARANTEE THAT YOU GET AT LEAST FIVE RESPONSES WITH MONEY! + MONEY! MONEY! COLD HARD CASH! YOU WILL RECEIVE OVER + $20,000 IN LESS THAN TWO MONTHS! AND IT'S LEGAL!!!!!!!!! + !!!!!!!!!!!!!!!!!!111111111!!!!!!!11111111111!!1 JUST + SEND $5 IN SMALL, UNMARKED BILLS TO THE ADDRESSES BELOW! + ----------------------------------------------------------- + +2. Design + +2.1. Form of the Language + + The language consists of a set of commands. Each command consists of + a set of tokens delimited by whitespace. The command identifier is + the first token and it is followed by zero or more argument tokens. + Arguments may be literal data, tags, blocks of commands, or test + commands. + + The language is represented in UTF-8, as specified in [UTF-8]. + + Tokens in the ASCII range are considered case-insensitive. + +2.2. Whitespace + + Whitespace is used to separate tokens. Whitespace is made up of + tabs, newlines (CRLF, never just CR or LF), and the space character. + The amount of whitespace used is not significant. + + + + + + + + +Showalter Standards Track [Page 5] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + +2.3. Comments + + Two types of comments are offered. Comments are semantically + equivalent to whitespace and can be used anyplace that whitespace is + (with one exception in multi-line strings, as described in the + grammar). + + Hash comments begin with a "#" character that is not contained within + a string and continue until the next CRLF. + + Example: if size :over 100K { # this is a comment + discard; + } + + Bracketed comments begin with the token "/*" and end with "*/" outside + of a string. Bracketed comments may span multiple lines. Bracketed + comments do not nest. + + Example: if size :over 100K { /* this is a comment + this is still a comment */ discard /* this is a comment + */ ; + } + +2.4. Literal Data + + Literal data means data that is not executed, merely evaluated "as + is", to be used as arguments to commands. Literal data is limited to + numbers and strings. + +2.4.1. Numbers + + Numbers are given as ordinary decimal numbers. However, those + numbers that have a tendency to be fairly large, such as message + sizes, MAY have a "K", "M", or "G" appended to indicate a multiple of + a power of two. To be comparable with the power-of-two-based + versions of SI units that computers frequently use, K specifies + kibi-, or 1,024 (2^10) times the value of the number; M specifies + mebi-, or 1,048,576 (2^20) times the value of the number; and G + specifies tebi-, or 1,073,741,824 (2^30) times the value of the + number [BINARY-SI]. + + Implementations MUST provide 31 bits of magnitude in numbers, but MAY + provide more. + + Only positive integers are permitted by this specification. + + + + + + +Showalter Standards Track [Page 6] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + +2.4.2. Strings + + Scripts involve large numbers of strings as they are used for pattern + matching, addresses, textual bodies, etc. Typically, short quoted + strings suffice for most uses, but a more convenient form is provided + for longer strings such as bodies of messages. + + A quoted string starts and ends with a single double quote (the <"> + character, ASCII 34). A backslash ("\", ASCII 92) inside of a quoted + string is followed by either another backslash or a double quote. + This two-character sequence represents a single backslash or double- + quote within the string, respectively. + + No other characters should be escaped with a single backslash. + + An undefined escape sequence (such as "\a" in a context where "a" has + no special meaning) is interpreted as if there were no backslash (in + this case, "\a" is just "a"). + + Non-printing characters such as tabs, CR and LF, and control + characters are permitted in quoted strings. Quoted strings MAY span + multiple lines. NUL (ASCII 0) is not allowed in strings. + + For entering larger amounts of text, such as an email message, a + multi-line form is allowed. It starts with the keyword "text:", + followed by a CRLF, and ends with the sequence of a CRLF, a single + period, and another CRLF. In order to allow the message to contain + lines with a single-dot, lines are dot-stuffed. That is, when + composing a message body, an extra `.' is added before each line + which begins with a `.'. When the server interprets the script, + these extra dots are removed. Note that a line that begins with a + dot followed by a non-dot character is not interpreted dot-stuffed; + that is, ".foo" is interpreted as ".foo". However, because this is + potentially ambiguous, scripts SHOULD be properly dot-stuffed so such + lines do not appear. + + Note that a hashed comment or whitespace may occur in between the + "text:" and the CRLF, but not within the string itself. Bracketed + comments are not allowed here. + +2.4.2.1. String Lists + + When matching patterns, it is frequently convenient to match against + groups of strings instead of single strings. For this reason, a list + of strings is allowed in many tests, implying that if the test is + true using any one of the strings, then the test is true. + Implementations are encouraged to use short-circuit evaluation in + these cases. + + + +Showalter Standards Track [Page 7] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + For instance, the test `header :contains ["To", "Cc"] + ["me@example.com", "me00@landru.example.edu"]' is true if either the + To header or Cc header of the input message contains either of the + e-mail addresses "me@example.com" or "me00@landru.example.edu". + + Conversely, in any case where a list of strings is appropriate, a + single string is allowed without being a member of a list: it is + equivalent to a list with a single member. This means that the test + `exists "To"' is equivalent to the test `exists ["To"]'. + +2.4.2.2. Headers + + Headers are a subset of strings. In the Internet Message + Specification [IMAIL] [RFC1123], each header line is allowed to have + whitespace nearly anywhere in the line, including after the field + name and before the subsequent colon. Extra spaces between the + header name and the ":" in a header field are ignored. + + A header name never contains a colon. The "From" header refers to a + line beginning "From:" (or "From :", etc.). No header will match + the string "From:" due to the trailing colon. + + Folding of long header lines (as described in [IMAIL] 3.4.8) is + removed prior to interpretation of the data. The folding syntax (the + CRLF that ends a line plus any leading whitespace at the beginning of + the next line that indicates folding) are interpreted as if they were + a single space. + +2.4.2.3. Addresses + + A number of commands call for email addresses, which are also a + subset of strings. When these addresses are used in outbound + contexts, addresses must be compliant with [IMAIL], but are further + constrained. Using the symbols defined in [IMAIL], section 6.1, the + syntax of an address is: + + sieve-address = addr-spec ; simple address + / phrase "<" addr-spec ">" ; name & addr-spec + + That is, routes and group syntax are not permitted. If multiple + addresses are required, use a string list. Named groups are not used + here. + + Implementations MUST ensure that the addresses are syntactically + valid, but need not ensure that they actually identify an email + recipient. + + + + + +Showalter Standards Track [Page 8] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + +2.4.2.4. MIME Parts + + In a few places, [MIME] body parts are represented as strings. These + parts include MIME headers and the body. This provides a way of + embedding typed data within a Sieve script so that, among other + things, character sets other than UTF-8 can be used for output + messages. + +2.5. Tests + + Tests are given as arguments to commands in order to control their + actions. In this document, tests are given to if/elsif/else to + decide which block of code is run. + + Tests MUST NOT have side effects. That is, a test cannot affect the + state of the filter or message. No tests in this specification have + side effects, and side effects are forbidden in extension tests as + well. + + The rationale for this is that tests with side effects impair + readability and maintainability and are difficult to represent in a + graphic interface for generating scripts. Side effects are confined + to actions where they are clearer. + +2.5.1. Test Lists + + Some tests ("allof" and "anyof", which implement logical "and" and + logical "or", respectively) may require more than a single test as an + argument. The test-list syntax element provides a way of grouping + tests. + + Example: if anyof (not exists ["From", "Date"], + header :contains "from" "fool@example.edu") { + discard; + } + +2.6. Arguments + + In order to specify what to do, most commands take arguments. There + are three types of arguments: positional, tagged, and optional. + +2.6.1. Positional Arguments + + Positional arguments are given to a command which discerns their + meaning based on their order. When a command takes positional + arguments, all positional arguments must be supplied and must be in + the order prescribed. + + + + +Showalter Standards Track [Page 9] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + +2.6.2. Tagged Arguments + + This document provides for tagged arguments in the style of + CommonLISP. These are also similar to flags given to commands in + most command-line systems. + + A tagged argument is an argument for a command that begins with ":" + followed by a tag naming the argument, such as ":contains". This + argument means that zero or more of the next tokens have some + particular meaning depending on the argument. These next tokens may + be numbers or strings but they are never blocks. + + Tagged arguments are similar to positional arguments, except that + instead of the meaning being derived from the command, it is derived + from the tag. + + Tagged arguments must appear before positional arguments, but they + may appear in any order with other tagged arguments. For simplicity + of the specification, this is not expressed in the syntax definitions + with commands, but they still may be reordered arbitrarily provided + they appear before positional arguments. Tagged arguments may be + mixed with optional arguments. + + To simplify this specification, tagged arguments SHOULD NOT take + tagged arguments as arguments. + +2.6.3. Optional Arguments + + Optional arguments are exactly like tagged arguments except that they + may be left out, in which case a default value is implied. Because + optional arguments tend to result in shorter scripts, they have been + used far more than tagged arguments. + + One particularly noteworthy case is the ":comparator" argument, which + allows the user to specify which [ACAP] comparator will be used to + compare two strings, since different languages may impose different + orderings on UTF-8 [UTF-8] characters. + +2.6.4. Types of Arguments + + Abstractly, arguments may be literal data, tests, or blocks of + commands. In this way, an "if" control structure is merely a command + that happens to take a test and a block as arguments and may execute + the block of code. + + However, this abstraction is ambiguous from a parsing standpoint. + The grammar in section 9.2 presents a parsable version of this: + Arguments are string-lists, numbers, and tags, which may be followed + + + +Showalter Standards Track [Page 10] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + by a test or a test-list, which may be followed by a block of + commands. No more than one test or test list, nor more than one + block of commands, may be used, and commands that end with blocks of + commands do not end with semicolons. + +2.7. String Comparison + + When matching one string against another, there are a number of ways + of performing the match operation. These are accomplished with three + types of matches: an exact match, a substring match, and a wildcard + glob-style match. These are described below. + + In order to provide for matches between character sets and case + insensitivity, Sieve borrows ACAP's comparator registry. + + However, when a string represents the name of a header, the + comparator is never user-specified. Header comparisons are always + done with the "i;ascii-casemap" operator, i.e., case-insensitive + comparisons, because this is the way things are defined in the + message specification [IMAIL]. + +2.7.1. Match Type + + There are three match types describing the matching used in this + specification: ":is", ":contains", and ":matches". Match type + arguments are supplied to those commands which allow them to specify + what kind of match is to be performed. + + These are used as tagged arguments to tests that perform string + comparison. + + The ":contains" match type describes a substring match. If the value + argument contains the key argument as a substring, the match is true. + For instance, the string "frobnitzm" contains "frob" and "nit", but + not "fbm". The null key ("") is contained in all values. + + The ":is" match type describes an absolute match; if the contents of + the first string are absolutely the same as the contents of the + second string, they match. Only the string "frobnitzm" is the string + "frobnitzm". The null key ":is" and only ":is" the null value. + + The ":matches" version specifies a wildcard match using the + characters "*" and "?". "*" matches zero or more characters, and "?" + matches a single character. "?" and "*" may be escaped as "\\?" and + "\\*" in strings to match against themselves. The first backslash + escapes the second backslash; together, they escape the "*". This is + awkward, but it is commonplace in several programming languages that + use globs and regular expressions. + + + +Showalter Standards Track [Page 11] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + In order to specify what type of match is supposed to happen, + commands that support matching take optional tagged arguments + ":matches", ":is", and ":contains". Commands default to using ":is" + matching if no match type argument is supplied. Note that these + modifiers may interact with comparators; in particular, some + comparators are not suitable for matching with ":contains" or + ":matches". It is an error to use a comparator with ":contains" or + ":matches" that is not compatible with it. + + It is an error to give more than one of these arguments to a given + command. + + For convenience, the "MATCH-TYPE" syntax element is defined here as + follows: + + Syntax: ":is" / ":contains" / ":matches" + +2.7.2. Comparisons Across Character Sets + + All Sieve scripts are represented in UTF-8, but messages may involve + a number of character sets. In order for comparisons to work across + character sets, implementations SHOULD implement the following + behavior: + + Implementations decode header charsets to UTF-8. Two strings are + considered equal if their UTF-8 representations are identical. + Implementations should decode charsets represented in the forms + specified by [MIME] for both message headers and bodies. + Implementations must be capable of decoding US-ASCII, ISO-8859-1, + the ASCII subset of ISO-8859-* character sets, and UTF-8. + + If implementations fail to support the above behavior, they MUST + conform to the following: + + No two strings can be considered equal if one contains octets + greater than 127. + +2.7.3. Comparators + + In order to allow for language-independent, case-independent matches, + the match type may be coupled with a comparator name. Comparators + are described for [ACAP]; a registry is defined for ACAP, and this + specification uses that registry. + + ACAP defines multiple comparator types. Only equality types are used + in this specification. + + + + + +Showalter Standards Track [Page 12] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + All implementations MUST support the "i;octet" comparator (simply + compares octets) and the "i;ascii-casemap" comparator (which treats + uppercase and lowercase characters in the ASCII subset of UTF-8 as + the same). If left unspecified, the default is "i;ascii-casemap". + + Some comparators may not be usable with substring matches; that is, + they may only work with ":is". It is an error to try and use a + comparator with ":matches" or ":contains" that is not compatible with + it. + + A comparator is specified by the ":comparator" option with commands + that support matching. This option is followed by a string providing + the name of the comparator to be used. For convenience, the syntax + of a comparator is abbreviated to "COMPARATOR", and (repeated in + several tests) is as follows: + + Syntax: ":comparator" <comparator-name: string> + + So in this example, + + Example: if header :contains :comparator "i;octet" "Subject" + "MAKE MONEY FAST" { + discard; + } + + would discard any message with subjects like "You can MAKE MONEY + FAST", but not "You can Make Money Fast", since the comparator used + is case-sensitive. + + Comparators other than i;octet and i;ascii-casemap must be declared + with require, as they are extensions. If a comparator declared with + require is not known, it is an error, and execution fails. If the + comparator is not declared with require, it is also an error, even if + the comparator is supported. (See 2.10.5.) + + Both ":matches" and ":contains" match types are compatible with the + "i;octet" and "i;ascii-casemap" comparators and may be used with + them. + + It is an error to give more than one of these arguments to a given + command. + +2.7.4. Comparisons Against Addresses + + Addresses are one of the most frequent things represented as strings. + These are structured, and being able to compare against the local- + part or the domain of an address is useful, so some tests that act + + + + +Showalter Standards Track [Page 13] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + exclusively on addresses take an additional optional argument that + specifies what the test acts on. + + These optional arguments are ":localpart", ":domain", and ":all", + which act on the local-part (left-side), the domain part (right- + side), and the whole address. + + The kind of comparison done, such as whether or not the test done is + case-insensitive, is specified as a comparator argument to the test. + + If an optional address-part is omitted, the default is ":all". + + It is an error to give more than one of these arguments to a given + command. + + For convenience, the "ADDRESS-PART" syntax element is defined here as + follows: + + Syntax: ":localpart" / ":domain" / ":all" + +2.8. Blocks + + Blocks are sets of commands enclosed within curly braces. Blocks are + supplied to commands so that the commands can implement control + commands. + + A control structure is a command that happens to take a test and a + block as one of its arguments; depending on the result of the test + supplied as another argument, it runs the code in the block some + number of times. + + With the commands supplied in this memo, there are no loops. The + control structures supplied--if, elsif, and else--run a block either + once or not at all. So there are two arguments, the test and the + block. + +2.9. Commands + + Sieve scripts are sequences of commands. Commands can take any of + the tokens above as arguments, and arguments may be either tagged or + positional arguments. Not all commands take all arguments. + + There are three kinds of commands: test commands, action commands, + and control commands. + + The simplest is an action command. An action command is an + identifier followed by zero or more arguments, terminated by a + semicolon. Action commands do not take tests or blocks as arguments. + + + +Showalter Standards Track [Page 14] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + A control command is similar, but it takes a test as an argument, and + ends with a block instead of a semicolon. + + A test command is used as part of a control command. It is used to + specify whether or not the block of code given to the control command + is executed. + +2.10. Evaluation + +2.10.1. Action Interaction + + Some actions cannot be used with other actions because the result + would be absurd. These restrictions are noted throughout this memo. + + Extension actions MUST state how they interact with actions defined + in this specification. + +2.10.2. Implicit Keep + + Previous experience with filtering systems suggests that cases tend + to be missed in scripts. To prevent errors, Sieve has an "implicit + keep". + + An implicit keep is a keep action (see 4.4) performed in absence of + any action that cancels the implicit keep. + + An implicit keep is performed if a message is not written to a + mailbox, redirected to a new address, or explicitly thrown out. That + is, if a fileinto, a keep, a redirect, or a discard is performed, an + implicit keep is not. + + Some actions may be defined to not cancel the implicit keep. These + actions may not directly affect the delivery of a message, and are + used for their side effects. None of the actions specified in this + document meet that criteria, but extension actions will. + + For instance, with any of the short messages offered above, the + following script produces no actions. + + Example: if size :over 500K { discard; } + + As a result, the implicit keep is taken. + +2.10.3. Message Uniqueness in a Mailbox + + Implementations SHOULD NOT deliver a message to the same folder more + than once, even if a script explicitly asks for a message to be + written to a mailbox twice. + + + +Showalter Standards Track [Page 15] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + The test for equality of two messages is implementation-defined. + + If a script asks for a message to be written to a mailbox twice, it + MUST NOT be treated as an error. + +2.10.4. Limits on Numbers of Actions + + Site policy MAY limit numbers of actions taken and MAY impose + restrictions on which actions can be used together. In the event + that a script hits a policy limit on the number of actions taken for + a particular message, an error occurs. + + Implementations MUST prohibit more than one reject. + + Implementations MUST allow at least one keep or one fileinto. If + fileinto is not implemented, implementations MUST allow at least one + keep. + + Implementations SHOULD prohibit reject when used with other actions. + +2.10.5. Extensions and Optional Features + + Because of the differing capabilities of many mail systems, several + features of this specification are optional. Before any of these + extensions can be executed, they must be declared with the "require" + action. + + If an extension is not enabled with "require", implementations MUST + treat it as if they did not support it at all. + + If a script does not understand an extension declared with require, + the script must not be used at all. Implementations MUST NOT execute + scripts which require unknown capability names. + + Note: The reason for this restriction is that prior experiences with + languages such as LISP and Tcl suggest that this is a workable + way of noting that a given script uses an extension. + + Experience with PostScript suggests that mechanisms that allow + a script to work around missing extensions are not used in + practice. + + Extensions which define actions MUST state how they interact with + actions discussed in the base specification. + + + + + + + +Showalter Standards Track [Page 16] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + +2.10.6. Errors + + In any programming language, there are compile-time and run-time + errors. + + Compile-time errors are ones in syntax that are detectable if a + syntax check is done. + + Run-time errors are not detectable until the script is run. This + includes transient failures like disk full conditions, but also + includes issues like invalid combinations of actions. + + When an error occurs in a Sieve script, all processing stops. + + Implementations MAY choose to do a full parse, then evaluate the + script, then do all actions. Implementations might even go so far as + to ensure that execution is atomic (either all actions are executed + or none are executed). + + Other implementations may choose to parse and run at the same time. + Such implementations are simpler, but have issues with partial + failure (some actions happen, others don't). + + Implementations might even go so far as to ensure that scripts can + never execute an invalid set of actions (e.g., reject + fileinto) + before execution, although this could involve solving the Halting + Problem. + + This specification allows any of these approaches. Solving the + Halting Problem is considered extra credit. + + When an error happens, implementations MUST notify the user that an + error occurred, which actions (if any) were taken, and do an implicit + keep. + +2.10.7. Limits on Execution + + Implementations may limit certain constructs. However, this + specification places a lower bound on some of these limits. + + Implementations MUST support fifteen levels of nested blocks. + + Implementations MUST support fifteen levels of nested test lists. + +3. Control Commands + + Control structures are needed to allow for multiple and conditional + actions. + + + +Showalter Standards Track [Page 17] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + +3.1. Control Structure If + + There are three pieces to if: "if", "elsif", and "else". Each is + actually a separate command in terms of the grammar. However, an + elsif MUST only follow an if, and an else MUST follow only either an + if or an elsif. An error occurs if these conditions are not met. + + Syntax: if <test1: test> <block1: block> + + Syntax: elsif <test2: test> <block2: block> + + Syntax: else <block> + + The semantics are similar to those of any of the many other + programming languages these control commands appear in. When the + interpreter sees an "if", it evaluates the test associated with it. + If the test is true, it executes the block associated with it. + + If the test of the "if" is false, it evaluates the test of the first + "elsif" (if any). If the test of "elsif" is true, it runs the + elsif's block. An elsif may be followed by an elsif, in which case, + the interpreter repeats this process until it runs out of elsifs. + + When the interpreter runs out of elsifs, there may be an "else" case. + If there is, and none of the if or elsif tests were true, the + interpreter runs the else case. + + This provides a way of performing exactly one of the blocks in the + chain. + + In the following example, both Message A and B are dropped. + + Example: require "fileinto"; + if header :contains "from" "coyote" { + discard; + } elsif header :contains ["subject"] ["$$$"] { + discard; + } else { + fileinto "INBOX"; + } + + + When the script below is run over message A, it redirects the message + to acm@example.edu; message B, to postmaster@example.edu; any other + message is redirected to field@example.edu. + + + + + + +Showalter Standards Track [Page 18] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + Example: if header :contains ["From"] ["coyote"] { + redirect "acm@example.edu"; + } elsif header :contains "Subject" "$$$" { + redirect "postmaster@example.edu"; + } else { + redirect "field@example.edu"; + } + + Note that this definition prohibits the "... else if ..." sequence + used by C. This is intentional, because this construct produces a + shift-reduce conflict. + +3.2. Control Structure Require + + Syntax: require <capabilities: string-list> + + The require action notes that a script makes use of a certain + extension. Such a declaration is required to use the extension, as + discussed in section 2.10.5. Multiple capabilities can be declared + with a single require. + + The require command, if present, MUST be used before anything other + than a require can be used. An error occurs if a require appears + after a command other than require. + + Example: require ["fileinto", "reject"]; + + Example: require "fileinto"; + require "vacation"; + +3.3. Control Structure Stop + + Syntax: stop + + The "stop" action ends all processing. If no actions have been + executed, then the keep action is taken. + +4. Action Commands + + This document supplies five actions that may be taken on a message: + keep, fileinto, redirect, reject, and discard. + + Implementations MUST support the "keep", "discard", and "redirect" + actions. + + Implementations SHOULD support "reject" and "fileinto". + + + + + +Showalter Standards Track [Page 19] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + Implementations MAY limit the number of certain actions taken (see + section 2.10.4). + +4.1. Action reject + + Syntax: reject <reason: string> + + The optional "reject" action refuses delivery of a message by sending + back an [MDN] to the sender. It resends the message to the sender, + wrapping it in a "reject" form, noting that it was rejected by the + recipient. In the following script, message A is rejected and + returned to the sender. + + Example: if header :contains "from" "coyote@desert.example.org" { + reject "I am not taking mail from you, and I don't want + your birdseed, either!"; + } + + A reject message MUST take the form of a failure MDN as specified by + [MDN]. The human-readable portion of the message, the first + component of the MDN, contains the human readable message describing + the error, and it SHOULD contain additional text alerting the + original sender that mail was refused by a filter. This part of the + MDN might appear as follows: + + ------------------------------------------------------------ + Message was refused by recipient's mail filtering program. Reason + given was as follows: + + I am not taking mail from you, and I don't want your birdseed, + either! + ------------------------------------------------------------ + + The MDN action-value field as defined in the MDN specification MUST + be "deleted" and MUST have the MDN-sent-automatically and automatic- + action modes set. + + Because some implementations can not or will not implement the reject + command, it is optional. The capability string to be used with the + require command is "reject". + +4.2. Action fileinto + + Syntax: fileinto <folder: string> + + The "fileinto" action delivers the message into the specified folder. + Implementations SHOULD support fileinto, but in some environments + this may be impossible. + + + +Showalter Standards Track [Page 20] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + The capability string for use with the require command is "fileinto". + + In the following script, message A is filed into folder + "INBOX.harassment". + + Example: require "fileinto"; + if header :contains ["from"] "coyote" { + fileinto "INBOX.harassment"; + } + +4.3. Action redirect + + Syntax: redirect <address: string> + + The "redirect" action is used to send the message to another user at + a supplied address, as a mail forwarding feature does. The + "redirect" action makes no changes to the message body or existing + headers, but it may add new headers. The "redirect" modifies the + envelope recipient. + + The redirect command performs an MTA-style "forward"--that is, what + you get from a .forward file using sendmail under UNIX. The address + on the SMTP envelope is replaced with the one on the redirect command + and the message is sent back out. (This is not an MUA-style forward, + which creates a new message with a different sender and message ID, + wrapping the old message in a new one.) + + A simple script can be used for redirecting all mail: + + Example: redirect "bart@example.edu"; + + Implementations SHOULD take measures to implement loop control, + possibly including adding headers to the message or counting received + headers. If an implementation detects a loop, it causes an error. + +4.4. Action keep + + Syntax: keep + + The "keep" action is whatever action is taken in lieu of all other + actions, if no filtering happens at all; generally, this simply means + to file the message into the user's main mailbox. This command + provides a way to execute this action without needing to know the + name of the user's main mailbox, providing a way to call it without + needing to understand the user's setup, or the underlying mail + system. + + + + + +Showalter Standards Track [Page 21] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + For instance, in an implementation where the IMAP server is running + scripts on behalf of the user at time of delivery, a keep command is + equivalent to a fileinto "INBOX". + + Example: if size :under 1M { keep; } else { discard; } + + Note that the above script is identical to the one below. + + Example: if not size :under 1M { discard; } + +4.5. Action discard + + Syntax: discard + + Discard is used to silently throw away the message. It does so by + simply canceling the implicit keep. If discard is used with other + actions, the other actions still happen. Discard is compatible with + all other actions. (For instance fileinto+discard is equivalent to + fileinto.) + + Discard MUST be silent; that is, it MUST NOT return a non-delivery + notification of any kind ([DSN], [MDN], or otherwise). + + In the following script, any mail from "idiot@example.edu" is thrown + out. + + Example: if header :contains ["from"] ["idiot@example.edu"] { + discard; + } + + While an important part of this language, "discard" has the potential + to create serious problems for users: Students who leave themselves + logged in to an unattended machine in a public computer lab may find + their script changed to just "discard". In order to protect users in + this situation (along with similar situations), implementations MAY + keep messages destroyed by a script for an indefinite period, and MAY + disallow scripts that throw out all mail. + +5. Test Commands + + Tests are used in conditionals to decide which part(s) of the + conditional to execute. + + Implementations MUST support these tests: "address", "allof", + "anyof", "exists", "false", "header", "not", "size", and "true". + + Implementations SHOULD support the "envelope" test. + + + + +Showalter Standards Track [Page 22] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + +5.1. Test address + + Syntax: address [ADDRESS-PART] [COMPARATOR] [MATCH-TYPE] + <header-list: string-list> <key-list: string-list> + + The address test matches Internet addresses in structured headers + that contain addresses. It returns true if any header contains any + key in the specified part of the address, as modified by the + comparator and the match keyword. + + Like envelope and header, this test returns true if any combination + of the header-list and key-list arguments match. + + Internet email addresses [IMAIL] have the somewhat awkward + characteristic that the local-part to the left of the at-sign is + considered case sensitive, and the domain-part to the right of the + at-sign is case insensitive. The "address" command does not deal + with this itself, but provides the ADDRESS-PART argument for allowing + users to deal with it. + + The address primitive never acts on the phrase part of an email + address, nor on comments within that address. It also never acts on + group names, although it does act on the addresses within the group + construct. + + Implementations MUST restrict the address test to headers that + contain addresses, but MUST include at least From, To, Cc, Bcc, + Sender, Resent-From, Resent-To, and SHOULD include any other header + that utilizes an "address-list" structured header body. + + Example: if address :is :all "from" "tim@example.com" { + discard; + +5.2. Test allof + + Syntax: allof <tests: test-list> + + The allof test performs a logical AND on the tests supplied to it. + + Example: allof (false, false) => false + allof (false, true) => false + allof (true, true) => true + + The allof test takes as its argument a test-list. + + + + + + + +Showalter Standards Track [Page 23] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + +5.3. Test anyof + + Syntax: anyof <tests: test-list> + + The anyof test performs a logical OR on the tests supplied to it. + + Example: anyof (false, false) => false + anyof (false, true) => true + anyof (true, true) => true + +5.4. Test envelope + + Syntax: envelope [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE] + <envelope-part: string-list> <key-list: string-list> + + The "envelope" test is true if the specified part of the SMTP (or + equivalent) envelope matches the specified key. + + If one of the envelope-part strings is (case insensitive) "from", + then matching occurs against the FROM address used in the SMTP MAIL + command. + + If one of the envelope-part strings is (case insensitive) "to", then + matching occurs against the TO address used in the SMTP RCPT command + that resulted in this message getting delivered to this user. Note + that only the most recent TO is available, and only the one relevant + to this user. + + The envelope-part is a string list and may contain more than one + parameter, in which case all of the strings specified in the key-list + are matched against all parts given in the envelope-part list. + + Like address and header, this test returns true if any combination of + the envelope-part and key-list arguments is true. + + All tests against envelopes MUST drop source routes. + + If the SMTP transaction involved several RCPT commands, only the data + from the RCPT command that caused delivery to this user is available + in the "to" part of the envelope. + + If a protocol other than SMTP is used for message transport, + implementations are expected to adapt this command appropriately. + + The envelope command is optional. Implementations SHOULD support it, + but the necessary information may not be available in all cases. + + + + + +Showalter Standards Track [Page 24] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + Example: require "envelope"; + if envelope :all :is "from" "tim@example.com" { + discard; + } + +5.5. Test exists + + Syntax: exists <header-names: string-list> + + The "exists" test is true if the headers listed in the header-names + argument exist within the message. All of the headers must exist or + the test is false. + + The following example throws out mail that doesn't have a From header + and a Date header. + + Example: if not exists ["From","Date"] { + discard; + } + +5.6. Test false + + Syntax: false + + The "false" test always evaluates to false. + +5.7. Test header + + Syntax: header [COMPARATOR] [MATCH-TYPE] + <header-names: string-list> <key-list: string-list> + + The "header" test evaluates to true if any header name matches any + key. The type of match is specified by the optional match argument, + which defaults to ":is" if not specified, as specified in section + 2.6. + + Like address and envelope, this test returns true if any combination + of the string-list and key-list arguments match. + + If a header listed in the header-names argument exists, it contains + the null key (""). However, if the named header is not present, it + does not contain the null key. So if a message contained the header + + X-Caffeine: C8H10N4O2 + + + + + + + +Showalter Standards Track [Page 25] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + these tests on that header evaluate as follows: + + header :is ["X-Caffeine"] [""] => false + header :contains ["X-Caffeine"] [""] => true + +5.8. Test not + + Syntax: not <test> + + The "not" test takes some other test as an argument, and yields the + opposite result. "not false" evaluates to "true" and "not true" + evaluates to "false". + +5.9. Test size + + Syntax: size <":over" / ":under"> <limit: number> + + The "size" test deals with the size of a message. It takes either a + tagged argument of ":over" or ":under", followed by a number + representing the size of the message. + + If the argument is ":over", and the size of the message is greater + than the number provided, the test is true; otherwise, it is false. + + If the argument is ":under", and the size of the message is less than + the number provided, the test is true; otherwise, it is false. + + Exactly one of ":over" or ":under" must be specified, and anything + else is an error. + + The size of a message is defined to be the number of octets from the + initial header until the last character in the message body. + + Note that for a message that is exactly 4,000 octets, the message is + neither ":over" 4000 octets or ":under" 4000 octets. + +5.10. Test true + + Syntax: true + + The "true" test always evaluates to true. + +6. Extensibility + + New control structures, actions, and tests can be added to the + language. Sites must make these features known to their users; this + document does not define a way to discover the list of extensions + supported by the server. + + + +Showalter Standards Track [Page 26] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + Any extensions to this language MUST define a capability string that + uniquely identifies that extension. If a new version of an extension + changes the functionality of a previously defined extension, it MUST + use a different name. + + In a situation where there is a submission protocol and an extension + advertisement mechanism aware of the details of this language, + scripts submitted can be checked against the mail server to prevent + use of an extension that the server does not support. + + Extensions MUST state how they interact with constraints defined in + section 2.10, e.g., whether they cancel the implicit keep, and which + actions they are compatible and incompatible with. + +6.1. Capability String + + Capability strings are typically short strings describing what + capabilities are supported by the server. + + Capability strings beginning with "vnd." represent vendor-defined + extensions. Such extensions are not defined by Internet standards or + RFCs, but are still registered with IANA in order to prevent + conflicts. Extensions starting with "vnd." SHOULD be followed by the + name of the vendor and product, such as "vnd.acme.rocket-sled". + + The following capability strings are defined by this document: + + envelope The string "envelope" indicates that the implementation + supports the "envelope" command. + + fileinto The string "fileinto" indicates that the implementation + supports the "fileinto" command. + + reject The string "reject" indicates that the implementation + supports the "reject" command. + + comparator- The string "comparator-elbonia" is provided if the + implementation supports the "elbonia" comparator. + Therefore, all implementations have at least the + "comparator-i;octet" and "comparator-i;ascii-casemap" + capabilities. However, these comparators may be used + without being declared with require. + + + + + + + + + +Showalter Standards Track [Page 27] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + +6.2. IANA Considerations + + In order to provide a standard set of extensions, a registry is + provided by IANA. Capability names may be registered on a first- + come, first-served basis. Extensions designed for interoperable use + SHOULD be defined as standards track or IESG approved experimental + RFCs. + +6.2.1. Template for Capability Registrations + + The following template is to be used for registering new Sieve + extensions with IANA. + + To: iana@iana.org + Subject: Registration of new Sieve extension + + Capability name: + Capability keyword: + Capability arguments: + Standards Track/IESG-approved experimental RFC number: + Person and email address to contact for further information: + +6.2.2. Initial Capability Registrations + + The following are to be added to the IANA registry for Sieve + extensions as the initial contents of the capability registry. + + Capability name: fileinto + Capability keyword: fileinto + Capability arguments: fileinto <folder: string> + Standards Track/IESG-approved experimental RFC number: + RFC 3028 (Sieve base spec) + Person and email address to contact for further information: + Tim Showalter + tjs@mirapoint.com + + Capability name: reject + Capability keyword: reject + Capability arguments: reject <reason: string> + Standards Track/IESG-approved experimental RFC number: + RFC 3028 (Sieve base spec) + Person and email address to contact for further information: + Tim Showalter + tjs@mirapoint.com + + + + + + + +Showalter Standards Track [Page 28] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + Capability name: envelope + Capability keyword: envelope + Capability arguments: + envelope [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE] + <envelope-part: string-list> <key-list: string-list> + Standards Track/IESG-approved experimental RFC number: + RFC 3028 (Sieve base spec) + Person and email address to contact for further information: + Tim Showalter + tjs@mirapoint.com + + Capability name: comparator-* + Capability keyword: + comparator-* (anything starting with "comparator-") + Capability arguments: (none) + Standards Track/IESG-approved experimental RFC number: + RFC 3028, Sieve, by reference of + RFC 2244, Application Configuration Access Protocol + Person and email address to contact for further information: + Tim Showalter + tjs@mirapoint.com + +6.3. Capability Transport + + As the range of mail systems that this document is intended to apply + to is quite varied, a method of advertising which capabilities an + implementation supports is difficult due to the wide range of + possible implementations. Such a mechanism, however, should have + property that the implementation can advertise the complete set of + extensions that it supports. + +7. Transmission + + The MIME type for a Sieve script is "application/sieve". + + The registration of this type for RFC 2048 requirements is as + follows: + + Subject: Registration of MIME media type application/sieve + + MIME media type name: application + MIME subtype name: sieve + Required parameters: none + Optional parameters: none + Encoding considerations: Most sieve scripts will be textual, + written in UTF-8. When non-7bit characters are used, + quoted-printable is appropriate for transport systems + that require 7bit encoding. + + + +Showalter Standards Track [Page 29] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + Security considerations: Discussed in section 10 of RFC 3028. + Interoperability considerations: Discussed in section 2.10.5 + of RFC 3028. + Published specification: RFC 3028. + Applications which use this media type: sieve-enabled mail servers + Additional information: + Magic number(s): + File extension(s): .siv + Macintosh File Type Code(s): + Person & email address to contact for further information: + See the discussion list at ietf-mta-filters@imc.org. + Intended usage: + COMMON + Author/Change controller: + See Author information in RFC 3028. + +8. Parsing + + The Sieve grammar is separated into tokens and a separate grammar as + most programming languages are. + +8.1. Lexical Tokens + + Sieve scripts are encoded in UTF-8. The following assumes a valid + UTF-8 encoding; special characters in Sieve scripts are all ASCII. + + The following are tokens in Sieve: + + - identifiers + - tags + - numbers + - quoted strings + - multi-line strings + - other separators + + Blanks, horizontal tabs, CRLFs, and comments ("white space") are + ignored except as they separate tokens. Some white space is required + to separate otherwise adjacent tokens and in specific places in the + multi-line strings. + + The other separators are single individual characters, and are + mentioned explicitly in the grammar. + + The lexical structure of sieve is defined in the following BNF (as + described in [ABNF]): + + + + + + +Showalter Standards Track [Page 30] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + bracket-comment = "/*" *(CHAR-NOT-STAR / ("*" CHAR-NOT-SLASH)) "*/" + ;; No */ allowed inside a comment. + ;; (No * is allowed unless it is the last character, + ;; or unless it is followed by a character that isn't a + ;; slash.) + + CHAR-NOT-DOT = (%x01-09 / %x0b-0c / %x0e-2d / %x2f-ff) + ;; no dots, no CRLFs + + CHAR-NOT-CRLF = (%x01-09 / %x0b-0c / %x0e-ff) + + CHAR-NOT-SLASH = (%x00-57 / %x58-ff) + + CHAR-NOT-STAR = (%x00-51 / %x53-ff) + + comment = bracket-comment / hash-comment + + hash-comment = ( "#" *CHAR-NOT-CRLF CRLF ) + + identifier = (ALPHA / "_") *(ALPHA DIGIT "_") + + tag = ":" identifier + + number = 1*DIGIT [QUANTIFIER] + + QUANTIFIER = "K" / "M" / "G" + + quoted-string = DQUOTE *CHAR DQUOTE + ;; in general, \ CHAR inside a string maps to CHAR + ;; so \" maps to " and \\ maps to \ + ;; note that newlines and other characters are all allowed + ;; strings + + multi-line = "text:" *(SP / HTAB) (hash-comment / CRLF) + *(multi-line-literal / multi-line-dotstuff) + "." CRLF + multi-line-literal = [CHAR-NOT-DOT *CHAR-NOT-CRLF] CRLF + multi-line-dotstuff = "." 1*CHAR-NOT-CRLF CRLF + ;; A line containing only "." ends the multi-line. + ;; Remove a leading '.' if followed by another '.'. + + white-space = 1*(SP / CRLF / HTAB) / comment + +8.2. Grammar + + The following is the grammar of Sieve after it has been lexically + interpreted. No white space or comments appear below. The start + symbol is "start". + + + +Showalter Standards Track [Page 31] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + argument = string-list / number / tag + + arguments = *argument [test / test-list] + + block = "{" commands "}" + + command = identifier arguments ( ";" / block ) + + commands = *command + + start = commands + + string = quoted-string / multi-line + + string-list = "[" string *("," string) "]" / string ;; if + there is only a single string, the brackets are optional + + test = identifier arguments + + test-list = "(" test *("," test) ")" + +9. Extended Example + + The following is an extended example of a Sieve script. Note that it + does not make use of the implicit keep. + + # + # Example Sieve Filter + # Declare any optional features or extension used by the script + # + require ["fileinto", "reject"]; + + # + # Reject any large messages (note that the four leading dots get + # "stuffed" to three) + # + if size :over 1M + { + reject text: + Please do not send me large attachments. + Put your file on a server and send me the URL. + Thank you. + .... Fred + . + ; + stop; + } + # + + + +Showalter Standards Track [Page 32] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + # Handle messages from known mailing lists + # Move messages from IETF filter discussion list to filter folder + # + if header :is "Sender" "owner-ietf-mta-filters@imc.org" + { + fileinto "filter"; # move to "filter" folder + } + # + # Keep all messages to or from people in my company + # + elsif address :domain :is ["From", "To"] "example.com" + { + keep; # keep in "In" folder + } + + # + # Try and catch unsolicited email. If a message is not to me, + # or it contains a subject known to be spam, file it away. + # + elsif anyof (not address :all :contains + ["To", "Cc", "Bcc"] "me@example.com", + header :matches "subject" + ["*make*money*fast*", "*university*dipl*mas*"]) + { + # If message header does not contain my address, + # it's from a list. + fileinto "spam"; # move to "spam" folder + } + else + { + # Move all other (non-company) mail to "personal" + # folder. + fileinto "personal"; + } + + + + + + + + + + + + + + + + + +Showalter Standards Track [Page 33] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + +10. Security Considerations + + Users must get their mail. It is imperative that whatever method + implementations use to store the user-defined filtering scripts be + secure. + + It is equally important that implementations sanity-check the user's + scripts, and not allow users to create on-demand mailbombs. For + instance, an implementation that allows a user to reject or redirect + multiple times to a single message might also allow a user to create + a mailbomb triggered by mail from a specific user. Site- or + implementation-defined limits on actions are useful for this. + + Several commands, such as "discard", "redirect", and "fileinto" allow + for actions to be taken that are potentially very dangerous. + + Implementations SHOULD take measures to prevent languages from + looping. + +11. Acknowledgments + + I am very thankful to Chris Newman for his support and his ABNF + syntax checker, to John Myers and Steve Hole for outlining the + requirements for the original drafts, to Larry Greenfield for nagging + me about the grammar and finally fixing it, to Greg Sereda for + repeatedly fixing and providing examples, to Ned Freed for fixing + everything else, to Rob Earhart for an early implementation and a + great deal of help, and to Randall Gellens for endless amounts of + proofreading. I am grateful to Carnegie Mellon University where most + of the work on this document was done. I am also indebted to all of + the readers of the ietf-mta-filters@imc.org mailing list. + +12. Author's Address + + Tim Showalter + Mirapoint, Inc. + 909 Hermosa Court + Sunnyvale, CA 94085 + + EMail: tjs@mirapoint.com + +13. References + + [ABNF] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", RFC 2234, November 1997. + + + + + + +Showalter Standards Track [Page 34] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + + [ACAP] Newman, C. and J. G. Myers, "ACAP -- Application + Configuration Access Protocol", RFC 2244, November 1997. + + [BINARY-SI] "Standard IEC 60027-2: Letter symbols to be used in + electrical technology - Part 2: Telecommunications and + electronics", January 1999. + + [DSN] Moore, K. and G. Vaudreuil, "An Extensible Message Format + for Delivery Status Notifications", RFC 1894, January + 1996. + + [FLAMES] Borenstein, N, and C. Thyberg, "Power, Ease of Use, and + Cooperative Work in a Practical Multimedia Message + System", Int. J. of Man-Machine Studies, April, 1991. + Reprinted in Computer-Supported Cooperative Work and + Groupware, Saul Greenberg, editor, Harcourt Brace + Jovanovich, 1991. Reprinted in Readings in Groupware and + Computer-Supported Cooperative Work, Ronald Baecker, + editor, Morgan Kaufmann, 1993. + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [IMAP] Crispin, M., "Internet Message Access Protocol - version + 4rev1", RFC 2060, December 1996. + + [IMAIL] Crocker, D., "Standard for the Format of ARPA Internet + Text Messages", STD 11, RFC 822, August 1982. + + [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part One: Format of Internet Message + Bodies", RFC 2045, November 1996. + + [MDN] Fajman, R., "An Extensible Message Format for Message + Disposition Notifications", RFC 2298, March 1998. + + [RFC1123] Braden, R., "Requirements for Internet Hosts -- + Application and Support", STD 3, RFC 1123, November 1989. + + [SMTP] Postel, J., "Simple Mail Transfer Protocol", STD 10, RFC + 821, August 1982. + + [UTF-8] Yergeau, F., "UTF-8, a transformation format of Unicode + and ISO 10646", RFC 2044, October 1996. + + + + + + + +Showalter Standards Track [Page 35] + +RFC 3028 Sieve: A Mail Filtering Language January 2001 + + +14. Full Copyright Statement + + Copyright (C) The Internet Society (2001). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Showalter Standards Track [Page 36] + diff --git a/doc/rfc3348.txt b/doc/rfc3348.txt @@ -0,0 +1,339 @@ + + + + + + +Network Working Group M. Gahrns +Request for Comments: 3348 R. Cheng +Category: Informational Microsoft + July 2002 + + + The Internet Message Action Protocol (IMAP4) + Child Mailbox Extension + +Status of this Memo + + This memo provides information for the Internet community. It does + not specify an Internet standard of any kind. Distribution of this + memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2002). All Rights Reserved. + +Abstract + + The Internet Message Action Protocol (IMAP4) CHILDREN extension + provides a mechanism for a client to efficiently determine if a + particular mailbox has children, without issuing a LIST "" * or a + LIST "" % for each mailbox. + +1. Conventions used in this document + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. If such lines are wrapped without a new "C:" or + "S:" label, then the wrapping is for editorial clarity and is not + part of the command. + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [RFC-2119]. + +2. Introduction and Overview + + Many IMAP4 [RFC-2060] clients present to the user a hierarchical view + of the mailboxes that a user has access to. Rather than initially + presenting to the user the entire mailbox hierarchy, it is often + preferable to show to the user a collapsed outline list of the + mailbox hierarchy (particularly if there is a large number of + mailboxes). The user can then expand the collapsed outline hierarchy + as needed. It is common to include within the collapsed hierarchy a + + + + + +Gahrns, et al. Informational [Page 1] + +RFC 3348 IMAP4 Child Mailbox Extension July 2002 + + + visual clue (such as a "+") to indicate that there are child + mailboxes under a particular mailbox. When the visual clue is + clicked the hierarchy list is expanded to show the child mailboxes. + + Several IMAP vendors implemented this proposal, and it is proposed to + document this behavior and functionality as an Informational RFC. + + There is interest in addressing the general extensibility of the IMAP + LIST command through an IMAP LIST Extension draft. Similar + functionality to the \HasChildren and \HasNoChildren flags could be + incorporated into this new LIST Extension. It is proposed that the + more general LIST Extension draft proceed on the standards track with + this proposal being relegated to informational status only. + + If the functionality of the \HasChildren and \HasNoChildren flags + were incorporated into a more general LIST extension, this would have + the advantage that a client could then have the opportunity to + request whether or not the server should return this information. + This would be an advantage over the current draft for servers where + this information is expensive to compute, since the server would only + need to compute the information when it knew that the client + requesting the information was able to consume it. + +3. Requirements + + IMAP4 servers that support this extension MUST list the keyword + CHILDREN in their CAPABILITY response. + + The CHILDREN extension defines two new attributes that MAY be + returned within a LIST response. + + \HasChildren - The presence of this attribute indicates that the + mailbox has child mailboxes. + + Servers SHOULD NOT return \HasChildren if child mailboxes exist, but + none will be displayed to the current user in a LIST response (as + should be the case where child mailboxes exist, but a client does not + have permissions to access them.) In this case, \HasNoChildren + SHOULD be used. + + In many cases, however, a server may not be able to efficiently + compute whether a user has access to all child mailboxes, or multiple + users may be accessing the same account and simultaneously changing + the mailbox hierarchy. As such a client MUST be prepared to accept + the \HasChildren attribute as a hint. That is, a mailbox MAY be + flagged with the \HasChildren attribute, but no child mailboxes will + appear in a subsequent LIST response. + + + + +Gahrns, et al. Informational [Page 2] + +RFC 3348 IMAP4 Child Mailbox Extension July 2002 + + + Example 3.1: + ============ + + /*** Consider a server that has the following mailbox hierarchy: + + INBOX + ITEM_1 + ITEM_1A + ITEM_2 + TOP_SECRET + + Where INBOX, ITEM_1 and ITEM_2 are top level mailboxes. ITEM_1A is a + child mailbox of ITEM_1 and TOP_SECRET is a child mailbox of ITEM_2 + that the currently logged on user does NOT have access to. + + Note that in this case, the server is not able to efficiently compute + access rights to child mailboxes and responds with a \HasChildren + attribute for mailbox ITEM_2, even though ITEM_2/TOP_SECRET does not + appear in the list response. ***/ + + C: A001 LIST "" * + S: * LIST (\HasNoChildren) "/" INBOX + S: * LIST (\HasChildren) "/" ITEM_1 + S: * LIST (\HasNoChildren) "/" ITEM_1/ITEM_1A + S: * LIST (\HasChildren) "/" ITEM_2 + S: A001 OK LIST Completed + + \HasNoChildren - The presence of this attribute indicates that the + mailbox has NO child mailboxes that are accessible to the currently + authenticated user. If a mailbox has the \Noinferiors attribute, the + \HasNoChildren attribute is redundant and SHOULD be omitted in the + LIST response. + + In some instances a server that supports the CHILDREN extension MAY + NOT be able to determine whether a mailbox has children. For example + it may have difficulty determining whether there are child mailboxes + when LISTing mailboxes while operating in a particular namespace. + + In these cases, a server MAY exclude both the \HasChildren and + \HasNoChildren attributes in the LIST response. As such, a client + can not make any assumptions about whether a mailbox has children + based upon the absence of a single attribute. + + It is an error for the server to return both a \HasChildren and a + \HasNoChildren attribute in a LIST response. + + + + + + +Gahrns, et al. Informational [Page 3] + +RFC 3348 IMAP4 Child Mailbox Extension July 2002 + + + It is an error for the server to return both a \HasChildren and a + \NoInferiors attribute in a LIST response. + + Note: the \HasNoChildren attribute should not be confused with the + IMAP4 [RFC-2060] defined attribute \Noinferiors which indicates that + no child mailboxes exist now and none can be created in the future. + + The \HasChildren and \HasNoChildren attributes might not be returned + in response to a LSUB response. Many servers maintain a simple + mailbox subscription list that is not updated when the underlying + mailbox structure is changed. A client MUST NOT assume that + hierarchy information will be maintained in the subscription list. + + RLIST is a command defined in [RFC-2193] that includes in a LIST + response mailboxes that are accessible only via referral. That is, a + client must explicitly issue an RLIST command to see a list of these + mailboxes. Thus in the case where a mailbox has child mailboxes that + are available only via referral, the mailboxes would appear as + \HasNoChildren in response to the LIST command, and \HasChildren in + response to the RLIST command. + +5. Formal Syntax + + The following syntax specification uses the augmented Backus-Naur + Form (BNF) as described in [ABNF]. + + Two new mailbox attributes are defined as flag_extensions to the + IMAP4 mailbox_list response: + + HasChildren = "\HasChildren" + + HasNoChildren = "\HasNoChildren" + +6. Security Considerations + + This extension provides a client a more efficient means of + determining whether a particular mailbox has children. If a mailbox + has children, but the currently authenticated user does not have + access to any of them, the server SHOULD respond with a + \HasNoChildren attribute. In many cases, however, a server may not + be able to efficiently compute whether a user has access to all child + mailboxes. If such a server responds with a \HasChildren attribute, + when in fact the currently authenticated user does not have access to + any child mailboxes, potentially more information is conveyed about + the mailbox than intended. A server designed with such levels of + security in mind SHOULD NOT attach the \HasChildren attribute to a + mailbox unless the server is certain that the user has access to at + least one of the child mailboxes. + + + +Gahrns, et al. Informational [Page 4] + +RFC 3348 IMAP4 Child Mailbox Extension July 2002 + + +7. References + + [RFC-2060] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 2060, December 1996. + + [RFC-2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC-2234] Crocker, D. and P. Overell, Editors, "Augmented BNF for + Syntax Specifications: ABNF", RFC 2234, November 1997. + + [RFC-2193] Gahrns, M., "IMAP4 Mailbox Referrals", RFC 2193, September + 1997. + +8. Acknowledgments + + The authors would like to thank the participants of several IMC Mail + Connect events for their input when this idea was originally + presented and refined. + +9. Author's Address + + Mike Gahrns + Microsoft + One Microsoft Way + Redmond, WA, 98052 + Phone: (425) 936-9833 + EMail: mikega@microsoft.com + + Raymond Cheng + Microsoft + One Microsoft Way + Redmond, WA, 98052 + Phone: (425) 703-4913 + EMail: raych@microsoft.com + + + + + + + + + + + + + + + + +Gahrns, et al. Informational [Page 5] + +RFC 3348 IMAP4 Child Mailbox Extension July 2002 + + +10. Full Copyright Statement + + Copyright (C) The Internet Society (2002). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Gahrns, et al. Informational [Page 6] + diff --git a/doc/rfc3501.txt b/doc/rfc3501.txt @@ -0,0 +1,6051 @@ + + + + + + +Network Working Group M. Crispin +Request for Comments: 3501 University of Washington +Obsoletes: 2060 March 2003 +Category: Standards Track + + + INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1 + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2003). All Rights Reserved. + +Abstract + + The Internet Message Access Protocol, Version 4rev1 (IMAP4rev1) + allows a client to access and manipulate electronic mail messages on + a server. IMAP4rev1 permits manipulation of mailboxes (remote + message folders) in a way that is functionally equivalent to local + folders. IMAP4rev1 also provides the capability for an offline + client to resynchronize with the server. + + IMAP4rev1 includes operations for creating, deleting, and renaming + mailboxes, checking for new messages, permanently removing messages, + setting and clearing flags, RFC 2822 and RFC 2045 parsing, searching, + and selective fetching of message attributes, texts, and portions + thereof. Messages in IMAP4rev1 are accessed by the use of numbers. + These numbers are either message sequence numbers or unique + identifiers. + + IMAP4rev1 supports a single server. A mechanism for accessing + configuration information to support multiple IMAP4rev1 servers is + discussed in RFC 2244. + + IMAP4rev1 does not specify a means of posting mail; this function is + handled by a mail transfer protocol such as RFC 2821. + + + + + + + + +Crispin Standards Track [Page 1] + +RFC 3501 IMAPv4 March 2003 + + +Table of Contents + + IMAP4rev1 Protocol Specification ................................ 4 + 1. How to Read This Document ............................... 4 + 1.1. Organization of This Document ........................... 4 + 1.2. Conventions Used in This Document ....................... 4 + 1.3. Special Notes to Implementors ........................... 5 + 2. Protocol Overview ....................................... 6 + 2.1. Link Level .............................................. 6 + 2.2. Commands and Responses .................................. 6 + 2.2.1. Client Protocol Sender and Server Protocol Receiver ..... 6 + 2.2.2. Server Protocol Sender and Client Protocol Receiver ..... 7 + 2.3. Message Attributes ...................................... 8 + 2.3.1. Message Numbers ......................................... 8 + 2.3.1.1. Unique Identifier (UID) Message Attribute ....... 8 + 2.3.1.2. Message Sequence Number Message Attribute ....... 10 + 2.3.2. Flags Message Attribute ................................. 11 + 2.3.3. Internal Date Message Attribute ......................... 12 + 2.3.4. [RFC-2822] Size Message Attribute ....................... 12 + 2.3.5. Envelope Structure Message Attribute .................... 12 + 2.3.6. Body Structure Message Attribute ........................ 12 + 2.4. Message Texts ........................................... 13 + 3. State and Flow Diagram .................................. 13 + 3.1. Not Authenticated State ................................. 13 + 3.2. Authenticated State ..................................... 13 + 3.3. Selected State .......................................... 13 + 3.4. Logout State ............................................ 14 + 4. Data Formats ............................................ 16 + 4.1. Atom .................................................... 16 + 4.2. Number .................................................. 16 + 4.3. String .................................................. 16 + 4.3.1. 8-bit and Binary Strings ................................ 17 + 4.4. Parenthesized List ...................................... 17 + 4.5. NIL ..................................................... 17 + 5. Operational Considerations .............................. 18 + 5.1. Mailbox Naming .......................................... 18 + 5.1.1. Mailbox Hierarchy Naming ................................ 19 + 5.1.2. Mailbox Namespace Naming Convention ..................... 19 + 5.1.3. Mailbox International Naming Convention ................. 19 + 5.2. Mailbox Size and Message Status Updates ................. 21 + 5.3. Response when no Command in Progress .................... 21 + 5.4. Autologout Timer ........................................ 22 + 5.5. Multiple Commands in Progress ........................... 22 + 6. Client Commands ........................................ 23 + 6.1. Client Commands - Any State ............................ 24 + 6.1.1. CAPABILITY Command ..................................... 24 + 6.1.2. NOOP Command ........................................... 25 + 6.1.3. LOGOUT Command ......................................... 26 + + + +Crispin Standards Track [Page 2] + +RFC 3501 IMAPv4 March 2003 + + + 6.2. Client Commands - Not Authenticated State .............. 26 + 6.2.1. STARTTLS Command ....................................... 27 + 6.2.2. AUTHENTICATE Command ................................... 28 + 6.2.3. LOGIN Command .......................................... 30 + 6.3. Client Commands - Authenticated State .................. 31 + 6.3.1. SELECT Command ......................................... 32 + 6.3.2. EXAMINE Command ........................................ 34 + 6.3.3. CREATE Command ......................................... 34 + 6.3.4. DELETE Command ......................................... 35 + 6.3.5. RENAME Command ......................................... 37 + 6.3.6. SUBSCRIBE Command ...................................... 39 + 6.3.7. UNSUBSCRIBE Command .................................... 39 + 6.3.8. LIST Command ........................................... 40 + 6.3.9. LSUB Command ........................................... 43 + 6.3.10. STATUS Command ......................................... 44 + 6.3.11. APPEND Command ......................................... 46 + 6.4. Client Commands - Selected State ....................... 47 + 6.4.1. CHECK Command .......................................... 47 + 6.4.2. CLOSE Command .......................................... 48 + 6.4.3. EXPUNGE Command ........................................ 49 + 6.4.4. SEARCH Command ......................................... 49 + 6.4.5. FETCH Command .......................................... 54 + 6.4.6. STORE Command .......................................... 58 + 6.4.7. COPY Command ........................................... 59 + 6.4.8. UID Command ............................................ 60 + 6.5. Client Commands - Experimental/Expansion ............... 62 + 6.5.1. X<atom> Command ........................................ 62 + 7. Server Responses ....................................... 62 + 7.1. Server Responses - Status Responses .................... 63 + 7.1.1. OK Response ............................................ 65 + 7.1.2. NO Response ............................................ 66 + 7.1.3. BAD Response ........................................... 66 + 7.1.4. PREAUTH Response ....................................... 67 + 7.1.5. BYE Response ........................................... 67 + 7.2. Server Responses - Server and Mailbox Status ........... 68 + 7.2.1. CAPABILITY Response .................................... 68 + 7.2.2. LIST Response .......................................... 69 + 7.2.3. LSUB Response .......................................... 70 + 7.2.4 STATUS Response ........................................ 70 + 7.2.5. SEARCH Response ........................................ 71 + 7.2.6. FLAGS Response ......................................... 71 + 7.3. Server Responses - Mailbox Size ........................ 71 + 7.3.1. EXISTS Response ........................................ 71 + 7.3.2. RECENT Response ........................................ 72 + 7.4. Server Responses - Message Status ...................... 72 + 7.4.1. EXPUNGE Response ....................................... 72 + 7.4.2. FETCH Response ......................................... 73 + 7.5. Server Responses - Command Continuation Request ........ 79 + + + +Crispin Standards Track [Page 3] + +RFC 3501 IMAPv4 March 2003 + + + 8. Sample IMAP4rev1 connection ............................ 80 + 9. Formal Syntax .......................................... 81 + 10. Author's Note .......................................... 92 + 11. Security Considerations ................................ 92 + 11.1. STARTTLS Security Considerations ....................... 92 + 11.2. Other Security Considerations .......................... 93 + 12. IANA Considerations .................................... 94 + Appendices ..................................................... 95 + A. References ............................................. 95 + B. Changes from RFC 2060 .................................. 97 + C. Key Word Index ......................................... 103 + Author's Address ............................................... 107 + Full Copyright Statement ....................................... 108 + +IMAP4rev1 Protocol Specification + +1. How to Read This Document + +1.1. Organization of This Document + + This document is written from the point of view of the implementor of + an IMAP4rev1 client or server. Beyond the protocol overview in + section 2, it is not optimized for someone trying to understand the + operation of the protocol. The material in sections 3 through 5 + provides the general context and definitions with which IMAP4rev1 + operates. + + Sections 6, 7, and 9 describe the IMAP commands, responses, and + syntax, respectively. The relationships among these are such that it + is almost impossible to understand any of them separately. In + particular, do not attempt to deduce command syntax from the command + section alone; instead refer to the Formal Syntax section. + +1.2. Conventions Used in This Document + + "Conventions" are basic principles or procedures. Document + conventions are noted in this section. + + In examples, "C:" and "S:" indicate lines sent by the client and + server respectively. + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "MAY", and "OPTIONAL" in this document are to + be interpreted as described in [KEYWORDS]. + + The word "can" (not "may") is used to refer to a possible + circumstance or situation, as opposed to an optional facility of the + protocol. + + + +Crispin Standards Track [Page 4] + +RFC 3501 IMAPv4 March 2003 + + + "User" is used to refer to a human user, whereas "client" refers to + the software being run by the user. + + "Connection" refers to the entire sequence of client/server + interaction from the initial establishment of the network connection + until its termination. + + "Session" refers to the sequence of client/server interaction from + the time that a mailbox is selected (SELECT or EXAMINE command) until + the time that selection ends (SELECT or EXAMINE of another mailbox, + CLOSE command, or connection termination). + + Characters are 7-bit US-ASCII unless otherwise specified. Other + character sets are indicated using a "CHARSET", as described in + [MIME-IMT] and defined in [CHARSET]. CHARSETs have important + additional semantics in addition to defining character set; refer to + these documents for more detail. + + There are several protocol conventions in IMAP. These refer to + aspects of the specification which are not strictly part of the IMAP + protocol, but reflect generally-accepted practice. Implementations + need to be aware of these conventions, and avoid conflicts whether or + not they implement the convention. For example, "&" may not be used + as a hierarchy delimiter since it conflicts with the Mailbox + International Naming Convention, and other uses of "&" in mailbox + names are impacted as well. + +1.3. Special Notes to Implementors + + Implementors of the IMAP protocol are strongly encouraged to read the + IMAP implementation recommendations document [IMAP-IMPLEMENTATION] in + conjunction with this document, to help understand the intricacies of + this protocol and how best to build an interoperable product. + + IMAP4rev1 is designed to be upwards compatible from the [IMAP2] and + unpublished IMAP2bis protocols. IMAP4rev1 is largely compatible with + the IMAP4 protocol described in RFC 1730; the exception being in + certain facilities added in RFC 1730 that proved problematic and were + subsequently removed. In the course of the evolution of IMAP4rev1, + some aspects in the earlier protocols have become obsolete. Obsolete + commands, responses, and data formats which an IMAP4rev1 + implementation can encounter when used with an earlier implementation + are described in [IMAP-OBSOLETE]. + + Other compatibility issues with IMAP2bis, the most common variant of + the earlier protocol, are discussed in [IMAP-COMPAT]. A full + discussion of compatibility issues with rare (and presumed extinct) + + + + +Crispin Standards Track [Page 5] + +RFC 3501 IMAPv4 March 2003 + + + variants of [IMAP2] is in [IMAP-HISTORICAL]; this document is + primarily of historical interest. + + IMAP was originally developed for the older [RFC-822] standard, and + as a consequence several fetch items in IMAP incorporate "RFC822" in + their name. With the exception of RFC822.SIZE, there are more modern + replacements; for example, the modern version of RFC822.HEADER is + BODY.PEEK[HEADER]. In all cases, "RFC822" should be interpreted as a + reference to the updated [RFC-2822] standard. + +2. Protocol Overview + +2.1. Link Level + + The IMAP4rev1 protocol assumes a reliable data stream such as that + provided by TCP. When TCP is used, an IMAP4rev1 server listens on + port 143. + +2.2. Commands and Responses + + An IMAP4rev1 connection consists of the establishment of a + client/server network connection, an initial greeting from the + server, and client/server interactions. These client/server + interactions consist of a client command, server data, and a server + completion result response. + + All interactions transmitted by client and server are in the form of + lines, that is, strings that end with a CRLF. The protocol receiver + of an IMAP4rev1 client or server is either reading a line, or is + reading a sequence of octets with a known count followed by a line. + +2.2.1. Client Protocol Sender and Server Protocol Receiver + + The client command begins an operation. Each client command is + prefixed with an identifier (typically a short alphanumeric string, + e.g., A0001, A0002, etc.) called a "tag". A different tag is + generated by the client for each command. + + Clients MUST follow the syntax outlined in this specification + strictly. It is a syntax error to send a command with missing or + extraneous spaces or arguments. + + There are two cases in which a line from the client does not + represent a complete command. In one case, a command argument is + quoted with an octet count (see the description of literal in String + under Data Formats); in the other case, the command arguments require + server feedback (see the AUTHENTICATE command). In either case, the + + + + +Crispin Standards Track [Page 6] + +RFC 3501 IMAPv4 March 2003 + + + server sends a command continuation request response if it is ready + for the octets (if appropriate) and the remainder of the command. + This response is prefixed with the token "+". + + Note: If instead, the server detected an error in the + command, it sends a BAD completion response with a tag + matching the command (as described below) to reject the + command and prevent the client from sending any more of the + command. + + It is also possible for the server to send a completion + response for some other command (if multiple commands are + in progress), or untagged data. In either case, the + command continuation request is still pending; the client + takes the appropriate action for the response, and reads + another response from the server. In all cases, the client + MUST send a complete command (including receiving all + command continuation request responses and command + continuations for the command) before initiating a new + command. + + The protocol receiver of an IMAP4rev1 server reads a command line + from the client, parses the command and its arguments, and transmits + server data and a server command completion result response. + +2.2.2. Server Protocol Sender and Client Protocol Receiver + + Data transmitted by the server to the client and status responses + that do not indicate command completion are prefixed with the token + "*", and are called untagged responses. + + Server data MAY be sent as a result of a client command, or MAY be + sent unilaterally by the server. There is no syntactic difference + between server data that resulted from a specific command and server + data that were sent unilaterally. + + The server completion result response indicates the success or + failure of the operation. It is tagged with the same tag as the + client command which began the operation. Thus, if more than one + command is in progress, the tag in a server completion response + identifies the command to which the response applies. There are + three possible server completion responses: OK (indicating success), + NO (indicating failure), or BAD (indicating a protocol error such as + unrecognized command or command syntax error). + + Servers SHOULD enforce the syntax outlined in this specification + strictly. Any client command with a protocol syntax error, including + (but not limited to) missing or extraneous spaces or arguments, + + + +Crispin Standards Track [Page 7] + +RFC 3501 IMAPv4 March 2003 + + + SHOULD be rejected, and the client given a BAD server completion + response. + + The protocol receiver of an IMAP4rev1 client reads a response line + from the server. It then takes action on the response based upon the + first token of the response, which can be a tag, a "*", or a "+". + + A client MUST be prepared to accept any server response at all times. + This includes server data that was not requested. Server data SHOULD + be recorded, so that the client can reference its recorded copy + rather than sending a command to the server to request the data. In + the case of certain server data, the data MUST be recorded. + + This topic is discussed in greater detail in the Server Responses + section. + +2.3. Message Attributes + + In addition to message text, each message has several attributes + associated with it. These attributes can be retrieved individually + or in conjunction with other attributes or message texts. + +2.3.1. Message Numbers + + Messages in IMAP4rev1 are accessed by one of two numbers; the unique + identifier or the message sequence number. + + +2.3.1.1. Unique Identifier (UID) Message Attribute + + A 32-bit value assigned to each message, which when used with the + unique identifier validity value (see below) forms a 64-bit value + that MUST NOT refer to any other message in the mailbox or any + subsequent mailbox with the same name forever. Unique identifiers + are assigned in a strictly ascending fashion in the mailbox; as each + message is added to the mailbox it is assigned a higher UID than the + message(s) which were added previously. Unlike message sequence + numbers, unique identifiers are not necessarily contiguous. + + The unique identifier of a message MUST NOT change during the + session, and SHOULD NOT change between sessions. Any change of + unique identifiers between sessions MUST be detectable using the + UIDVALIDITY mechanism discussed below. Persistent unique identifiers + are required for a client to resynchronize its state from a previous + session with the server (e.g., disconnected or offline access + clients); this is discussed further in [IMAP-DISC]. + + + + + +Crispin Standards Track [Page 8] + +RFC 3501 IMAPv4 March 2003 + + + Associated with every mailbox are two values which aid in unique + identifier handling: the next unique identifier value and the unique + identifier validity value. + + The next unique identifier value is the predicted value that will be + assigned to a new message in the mailbox. Unless the unique + identifier validity also changes (see below), the next unique + identifier value MUST have the following two characteristics. First, + the next unique identifier value MUST NOT change unless new messages + are added to the mailbox; and second, the next unique identifier + value MUST change whenever new messages are added to the mailbox, + even if those new messages are subsequently expunged. + + Note: The next unique identifier value is intended to + provide a means for a client to determine whether any + messages have been delivered to the mailbox since the + previous time it checked this value. It is not intended to + provide any guarantee that any message will have this + unique identifier. A client can only assume, at the time + that it obtains the next unique identifier value, that + messages arriving after that time will have a UID greater + than or equal to that value. + + The unique identifier validity value is sent in a UIDVALIDITY + response code in an OK untagged response at mailbox selection time. + If unique identifiers from an earlier session fail to persist in this + session, the unique identifier validity value MUST be greater than + the one used in the earlier session. + + Note: Ideally, unique identifiers SHOULD persist at all + times. Although this specification recognizes that failure + to persist can be unavoidable in certain server + environments, it STRONGLY ENCOURAGES message store + implementation techniques that avoid this problem. For + example: + + 1) Unique identifiers MUST be strictly ascending in the + mailbox at all times. If the physical message store is + re-ordered by a non-IMAP agent, this requires that the + unique identifiers in the mailbox be regenerated, since + the former unique identifiers are no longer strictly + ascending as a result of the re-ordering. + + 2) If the message store has no mechanism to store unique + identifiers, it must regenerate unique identifiers at + each session, and each session must have a unique + UIDVALIDITY value. + + + + +Crispin Standards Track [Page 9] + +RFC 3501 IMAPv4 March 2003 + + + 3) If the mailbox is deleted and a new mailbox with the + same name is created at a later date, the server must + either keep track of unique identifiers from the + previous instance of the mailbox, or it must assign a + new UIDVALIDITY value to the new instance of the + mailbox. A good UIDVALIDITY value to use in this case + is a 32-bit representation of the creation date/time of + the mailbox. It is alright to use a constant such as + 1, but only if it guaranteed that unique identifiers + will never be reused, even in the case of a mailbox + being deleted (or renamed) and a new mailbox by the + same name created at some future time. + + 4) The combination of mailbox name, UIDVALIDITY, and UID + must refer to a single immutable message on that server + forever. In particular, the internal date, [RFC-2822] + size, envelope, body structure, and message texts + (RFC822, RFC822.HEADER, RFC822.TEXT, and all BODY[...] + fetch data items) must never change. This does not + include message numbers, nor does it include attributes + that can be set by a STORE command (e.g., FLAGS). + + +2.3.1.2. Message Sequence Number Message Attribute + + A relative position from 1 to the number of messages in the mailbox. + This position MUST be ordered by ascending unique identifier. As + each new message is added, it is assigned a message sequence number + that is 1 higher than the number of messages in the mailbox before + that new message was added. + + Message sequence numbers can be reassigned during the session. For + example, when a message is permanently removed (expunged) from the + mailbox, the message sequence number for all subsequent messages is + decremented. The number of messages in the mailbox is also + decremented. Similarly, a new message can be assigned a message + sequence number that was once held by some other message prior to an + expunge. + + In addition to accessing messages by relative position in the + mailbox, message sequence numbers can be used in mathematical + calculations. For example, if an untagged "11 EXISTS" is received, + and previously an untagged "8 EXISTS" was received, three new + messages have arrived with message sequence numbers of 9, 10, and 11. + Another example, if message 287 in a 523 message mailbox has UID + 12345, there are exactly 286 messages which have lesser UIDs and 236 + messages which have greater UIDs. + + + + +Crispin Standards Track [Page 10] + +RFC 3501 IMAPv4 March 2003 + + +2.3.2. Flags Message Attribute + + A list of zero or more named tokens associated with the message. A + flag is set by its addition to this list, and is cleared by its + removal. There are two types of flags in IMAP4rev1. A flag of + either type can be permanent or session-only. + + A system flag is a flag name that is pre-defined in this + specification. All system flags begin with "\". Certain system + flags (\Deleted and \Seen) have special semantics described + elsewhere. The currently-defined system flags are: + + \Seen + Message has been read + + \Answered + Message has been answered + + \Flagged + Message is "flagged" for urgent/special attention + + \Deleted + Message is "deleted" for removal by later EXPUNGE + + \Draft + Message has not completed composition (marked as a draft). + + \Recent + Message is "recently" arrived in this mailbox. This session + is the first session to have been notified about this + message; if the session is read-write, subsequent sessions + will not see \Recent set for this message. This flag can not + be altered by the client. + + If it is not possible to determine whether or not this + session is the first session to be notified about a message, + then that message SHOULD be considered recent. + + If multiple connections have the same mailbox selected + simultaneously, it is undefined which of these connections + will see newly-arrived messages with \Recent set and which + will see it without \Recent set. + + A keyword is defined by the server implementation. Keywords do not + begin with "\". Servers MAY permit the client to define new keywords + in the mailbox (see the description of the PERMANENTFLAGS response + code for more information). + + + + +Crispin Standards Track [Page 11] + +RFC 3501 IMAPv4 March 2003 + + + A flag can be permanent or session-only on a per-flag basis. + Permanent flags are those which the client can add or remove from the + message flags permanently; that is, concurrent and subsequent + sessions will see any change in permanent flags. Changes to session + flags are valid only in that session. + + Note: The \Recent system flag is a special case of a + session flag. \Recent can not be used as an argument in a + STORE or APPEND command, and thus can not be changed at + all. + +2.3.3. Internal Date Message Attribute + + The internal date and time of the message on the server. This + is not the date and time in the [RFC-2822] header, but rather a + date and time which reflects when the message was received. In + the case of messages delivered via [SMTP], this SHOULD be the + date and time of final delivery of the message as defined by + [SMTP]. In the case of messages delivered by the IMAP4rev1 COPY + command, this SHOULD be the internal date and time of the source + message. In the case of messages delivered by the IMAP4rev1 + APPEND command, this SHOULD be the date and time as specified in + the APPEND command description. All other cases are + implementation defined. + +2.3.4. [RFC-2822] Size Message Attribute + + The number of octets in the message, as expressed in [RFC-2822] + format. + +2.3.5. Envelope Structure Message Attribute + + A parsed representation of the [RFC-2822] header of the message. + Note that the IMAP Envelope structure is not the same as an + [SMTP] envelope. + +2.3.6. Body Structure Message Attribute + + A parsed representation of the [MIME-IMB] body structure + information of the message. + + + + + + + + + + + +Crispin Standards Track [Page 12] + +RFC 3501 IMAPv4 March 2003 + + +2.4. Message Texts + + In addition to being able to fetch the full [RFC-2822] text of a + message, IMAP4rev1 permits the fetching of portions of the full + message text. Specifically, it is possible to fetch the + [RFC-2822] message header, [RFC-2822] message body, a [MIME-IMB] + body part, or a [MIME-IMB] header. + +3. State and Flow Diagram + + Once the connection between client and server is established, an + IMAP4rev1 connection is in one of four states. The initial + state is identified in the server greeting. Most commands are + only valid in certain states. It is a protocol error for the + client to attempt a command while the connection is in an + inappropriate state, and the server will respond with a BAD or + NO (depending upon server implementation) command completion + result. + +3.1. Not Authenticated State + + In the not authenticated state, the client MUST supply + authentication credentials before most commands will be + permitted. This state is entered when a connection starts + unless the connection has been pre-authenticated. + +3.2. Authenticated State + + In the authenticated state, the client is authenticated and MUST + select a mailbox to access before commands that affect messages + will be permitted. This state is entered when a + pre-authenticated connection starts, when acceptable + authentication credentials have been provided, after an error in + selecting a mailbox, or after a successful CLOSE command. + +3.3. Selected State + + In a selected state, a mailbox has been selected to access. + This state is entered when a mailbox has been successfully + selected. + + + + + + + + + + + +Crispin Standards Track [Page 13] + +RFC 3501 IMAPv4 March 2003 + + +3.4. Logout State + + In the logout state, the connection is being terminated. This + state can be entered as a result of a client request (via the + LOGOUT command) or by unilateral action on the part of either + the client or server. + + If the client requests the logout state, the server MUST send an + untagged BYE response and a tagged OK response to the LOGOUT + command before the server closes the connection; and the client + MUST read the tagged OK response to the LOGOUT command before + the client closes the connection. + + A server MUST NOT unilaterally close the connection without + sending an untagged BYE response that contains the reason for + having done so. A client SHOULD NOT unilaterally close the + connection, and instead SHOULD issue a LOGOUT command. If the + server detects that the client has unilaterally closed the + connection, the server MAY omit the untagged BYE response and + simply close its connection. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Crispin Standards Track [Page 14] + +RFC 3501 IMAPv4 March 2003 + + + +----------------------+ + |connection established| + +----------------------+ + || + \/ + +--------------------------------------+ + | server greeting | + +--------------------------------------+ + || (1) || (2) || (3) + \/ || || + +-----------------+ || || + |Not Authenticated| || || + +-----------------+ || || + || (7) || (4) || || + || \/ \/ || + || +----------------+ || + || | Authenticated |<=++ || + || +----------------+ || || + || || (7) || (5) || (6) || + || || \/ || || + || || +--------+ || || + || || |Selected|==++ || + || || +--------+ || + || || || (7) || + \/ \/ \/ \/ + +--------------------------------------+ + | Logout | + +--------------------------------------+ + || + \/ + +-------------------------------+ + |both sides close the connection| + +-------------------------------+ + + (1) connection without pre-authentication (OK greeting) + (2) pre-authenticated connection (PREAUTH greeting) + (3) rejected connection (BYE greeting) + (4) successful LOGIN or AUTHENTICATE command + (5) successful SELECT or EXAMINE command + (6) CLOSE command, or failed SELECT or EXAMINE command + (7) LOGOUT command, server shutdown, or connection closed + + + + + + + + + + +Crispin Standards Track [Page 15] + +RFC 3501 IMAPv4 March 2003 + + +4. Data Formats + + IMAP4rev1 uses textual commands and responses. Data in + IMAP4rev1 can be in one of several forms: atom, number, string, + parenthesized list, or NIL. Note that a particular data item + may take more than one form; for example, a data item defined as + using "astring" syntax may be either an atom or a string. + +4.1. Atom + + An atom consists of one or more non-special characters. + +4.2. Number + + A number consists of one or more digit characters, and + represents a numeric value. + +4.3. String + + A string is in one of two forms: either literal or quoted + string. The literal form is the general form of string. The + quoted string form is an alternative that avoids the overhead of + processing a literal at the cost of limitations of characters + which may be used. + + A literal is a sequence of zero or more octets (including CR and + LF), prefix-quoted with an octet count in the form of an open + brace ("{"), the number of octets, close brace ("}"), and CRLF. + In the case of literals transmitted from server to client, the + CRLF is immediately followed by the octet data. In the case of + literals transmitted from client to server, the client MUST wait + to receive a command continuation request (described later in + this document) before sending the octet data (and the remainder + of the command). + + A quoted string is a sequence of zero or more 7-bit characters, + excluding CR and LF, with double quote (<">) characters at each + end. + + The empty string is represented as either "" (a quoted string + with zero characters between double quotes) or as {0} followed + by CRLF (a literal with an octet count of 0). + + Note: Even if the octet count is 0, a client transmitting a + literal MUST wait to receive a command continuation request. + + + + + + +Crispin Standards Track [Page 16] + +RFC 3501 IMAPv4 March 2003 + + +4.3.1. 8-bit and Binary Strings + + 8-bit textual and binary mail is supported through the use of a + [MIME-IMB] content transfer encoding. IMAP4rev1 implementations MAY + transmit 8-bit or multi-octet characters in literals, but SHOULD do + so only when the [CHARSET] is identified. + + Although a BINARY body encoding is defined, unencoded binary strings + are not permitted. A "binary string" is any string with NUL + characters. Implementations MUST encode binary data into a textual + form, such as BASE64, before transmitting the data. A string with an + excessive amount of CTL characters MAY also be considered to be + binary. + +4.4. Parenthesized List + + Data structures are represented as a "parenthesized list"; a sequence + of data items, delimited by space, and bounded at each end by + parentheses. A parenthesized list can contain other parenthesized + lists, using multiple levels of parentheses to indicate nesting. + + The empty list is represented as () -- a parenthesized list with no + members. + +4.5. NIL + + The special form "NIL" represents the non-existence of a particular + data item that is represented as a string or parenthesized list, as + distinct from the empty string "" or the empty parenthesized list (). + + Note: NIL is never used for any data item which takes the + form of an atom. For example, a mailbox name of "NIL" is a + mailbox named NIL as opposed to a non-existent mailbox + name. This is because mailbox uses "astring" syntax which + is an atom or a string. Conversely, an addr-name of NIL is + a non-existent personal name, because addr-name uses + "nstring" syntax which is NIL or a string, but never an + atom. + + + + + + + + + + + + + +Crispin Standards Track [Page 17] + +RFC 3501 IMAPv4 March 2003 + + +5. Operational Considerations + + The following rules are listed here to ensure that all IMAP4rev1 + implementations interoperate properly. + +5.1. Mailbox Naming + + Mailbox names are 7-bit. Client implementations MUST NOT attempt to + create 8-bit mailbox names, and SHOULD interpret any 8-bit mailbox + names returned by LIST or LSUB as UTF-8. Server implementations + SHOULD prohibit the creation of 8-bit mailbox names, and SHOULD NOT + return 8-bit mailbox names in LIST or LSUB. See section 5.1.3 for + more information on how to represent non-ASCII mailbox names. + + Note: 8-bit mailbox names were undefined in earlier + versions of this protocol. Some sites used a local 8-bit + character set to represent non-ASCII mailbox names. Such + usage is not interoperable, and is now formally deprecated. + + The case-insensitive mailbox name INBOX is a special name reserved to + mean "the primary mailbox for this user on this server". The + interpretation of all other names is implementation-dependent. + + In particular, this specification takes no position on case + sensitivity in non-INBOX mailbox names. Some server implementations + are fully case-sensitive; others preserve case of a newly-created + name but otherwise are case-insensitive; and yet others coerce names + to a particular case. Client implementations MUST interact with any + of these. If a server implementation interprets non-INBOX mailbox + names as case-insensitive, it MUST treat names using the + international naming convention specially as described in section + 5.1.3. + + There are certain client considerations when creating a new mailbox + name: + + 1) Any character which is one of the atom-specials (see the Formal + Syntax) will require that the mailbox name be represented as a + quoted string or literal. + + 2) CTL and other non-graphic characters are difficult to represent + in a user interface and are best avoided. + + 3) Although the list-wildcard characters ("%" and "*") are valid + in a mailbox name, it is difficult to use such mailbox names + with the LIST and LSUB commands due to the conflict with + wildcard interpretation. + + + + +Crispin Standards Track [Page 18] + +RFC 3501 IMAPv4 March 2003 + + + 4) Usually, a character (determined by the server implementation) + is reserved to delimit levels of hierarchy. + + 5) Two characters, "#" and "&", have meanings by convention, and + should be avoided except when used in that convention. + +5.1.1. Mailbox Hierarchy Naming + + If it is desired to export hierarchical mailbox names, mailbox names + MUST be left-to-right hierarchical using a single character to + separate levels of hierarchy. The same hierarchy separator character + is used for all levels of hierarchy within a single name. + +5.1.2. Mailbox Namespace Naming Convention + + By convention, the first hierarchical element of any mailbox name + which begins with "#" identifies the "namespace" of the remainder of + the name. This makes it possible to disambiguate between different + types of mailbox stores, each of which have their own namespaces. + + For example, implementations which offer access to USENET + newsgroups MAY use the "#news" namespace to partition the + USENET newsgroup namespace from that of other mailboxes. + Thus, the comp.mail.misc newsgroup would have a mailbox + name of "#news.comp.mail.misc", and the name + "comp.mail.misc" can refer to a different object (e.g., a + user's private mailbox). + +5.1.3. Mailbox International Naming Convention + + By convention, international mailbox names in IMAP4rev1 are specified + using a modified version of the UTF-7 encoding described in [UTF-7]. + Modified UTF-7 may also be usable in servers that implement an + earlier version of this protocol. + + In modified UTF-7, printable US-ASCII characters, except for "&", + represent themselves; that is, characters with octet values 0x20-0x25 + and 0x27-0x7e. The character "&" (0x26) is represented by the + two-octet sequence "&-". + + All other characters (octet values 0x00-0x1f and 0x7f-0xff) are + represented in modified BASE64, with a further modification from + [UTF-7] that "," is used instead of "/". Modified BASE64 MUST NOT be + used to represent any printing US-ASCII character which can represent + itself. + + + + + + +Crispin Standards Track [Page 19] + +RFC 3501 IMAPv4 March 2003 + + + "&" is used to shift to modified BASE64 and "-" to shift back to + US-ASCII. There is no implicit shift from BASE64 to US-ASCII, and + null shifts ("-&" while in BASE64; note that "&-" while in US-ASCII + means "&") are not permitted. However, all names start in US-ASCII, + and MUST end in US-ASCII; that is, a name that ends with a non-ASCII + ISO-10646 character MUST end with a "-"). + + The purpose of these modifications is to correct the following + problems with UTF-7: + + 1) UTF-7 uses the "+" character for shifting; this conflicts with + the common use of "+" in mailbox names, in particular USENET + newsgroup names. + + 2) UTF-7's encoding is BASE64 which uses the "/" character; this + conflicts with the use of "/" as a popular hierarchy delimiter. + + 3) UTF-7 prohibits the unencoded usage of "\"; this conflicts with + the use of "\" as a popular hierarchy delimiter. + + 4) UTF-7 prohibits the unencoded usage of "~"; this conflicts with + the use of "~" in some servers as a home directory indicator. + + 5) UTF-7 permits multiple alternate forms to represent the same + string; in particular, printable US-ASCII characters can be + represented in encoded form. + + Although modified UTF-7 is a convention, it establishes certain + requirements on server handling of any mailbox name with an + embedded "&" character. In particular, server implementations + MUST preserve the exact form of the modified BASE64 portion of a + modified UTF-7 name and treat that text as case-sensitive, even if + names are otherwise case-insensitive or case-folded. + + Server implementations SHOULD verify that any mailbox name with an + embedded "&" character, used as an argument to CREATE, is: in the + correctly modified UTF-7 syntax, has no superfluous shifts, and + has no encoding in modified BASE64 of any printing US-ASCII + character which can represent itself. However, client + implementations MUST NOT depend upon the server doing this, and + SHOULD NOT attempt to create a mailbox name with an embedded "&" + character unless it complies with the modified UTF-7 syntax. + + Server implementations which export a mail store that does not + follow the modified UTF-7 convention MUST convert to modified + UTF-7 any mailbox name that contains either non-ASCII characters + or the "&" character. + + + + +Crispin Standards Track [Page 20] + +RFC 3501 IMAPv4 March 2003 + + + For example, here is a mailbox name which mixes English, + Chinese, and Japanese text: + ~peter/mail/&U,BTFw-/&ZeVnLIqe- + + For example, the string "&Jjo!" is not a valid mailbox + name because it does not contain a shift to US-ASCII + before the "!". The correct form is "&Jjo-!". The + string "&U,BTFw-&ZeVnLIqe-" is not permitted because it + contains a superfluous shift. The correct form is + "&U,BTF2XlZyyKng-". + +5.2. Mailbox Size and Message Status Updates + + At any time, a server can send data that the client did not request. + Sometimes, such behavior is REQUIRED. For example, agents other than + the server MAY add messages to the mailbox (e.g., new message + delivery), change the flags of the messages in the mailbox (e.g., + simultaneous access to the same mailbox by multiple agents), or even + remove messages from the mailbox. A server MUST send mailbox size + updates automatically if a mailbox size change is observed during the + processing of a command. A server SHOULD send message flag updates + automatically, without requiring the client to request such updates + explicitly. + + Special rules exist for server notification of a client about the + removal of messages to prevent synchronization errors; see the + description of the EXPUNGE response for more detail. In particular, + it is NOT permitted to send an EXISTS response that would reduce the + number of messages in the mailbox; only the EXPUNGE response can do + this. + + Regardless of what implementation decisions a client makes on + remembering data from the server, a client implementation MUST record + mailbox size updates. It MUST NOT assume that any command after the + initial mailbox selection will return the size of the mailbox. + +5.3. Response when no Command in Progress + + Server implementations are permitted to send an untagged response + (except for EXPUNGE) while there is no command in progress. Server + implementations that send such responses MUST deal with flow control + considerations. Specifically, they MUST either (1) verify that the + size of the data does not exceed the underlying transport's available + window size, or (2) use non-blocking writes. + + + + + + + +Crispin Standards Track [Page 21] + +RFC 3501 IMAPv4 March 2003 + + +5.4. Autologout Timer + + If a server has an inactivity autologout timer, the duration of that + timer MUST be at least 30 minutes. The receipt of ANY command from + the client during that interval SHOULD suffice to reset the + autologout timer. + +5.5. Multiple Commands in Progress + + The client MAY send another command without waiting for the + completion result response of a command, subject to ambiguity rules + (see below) and flow control constraints on the underlying data + stream. Similarly, a server MAY begin processing another command + before processing the current command to completion, subject to + ambiguity rules. However, any command continuation request responses + and command continuations MUST be negotiated before any subsequent + command is initiated. + + The exception is if an ambiguity would result because of a command + that would affect the results of other commands. Clients MUST NOT + send multiple commands without waiting if an ambiguity would result. + If the server detects a possible ambiguity, it MUST execute commands + to completion in the order given by the client. + + The most obvious example of ambiguity is when a command would affect + the results of another command, e.g., a FETCH of a message's flags + and a STORE of that same message's flags. + + A non-obvious ambiguity occurs with commands that permit an untagged + EXPUNGE response (commands other than FETCH, STORE, and SEARCH), + since an untagged EXPUNGE response can invalidate sequence numbers in + a subsequent command. This is not a problem for FETCH, STORE, or + SEARCH commands because servers are prohibited from sending EXPUNGE + responses while any of those commands are in progress. Therefore, if + the client sends any command other than FETCH, STORE, or SEARCH, it + MUST wait for the completion result response before sending a command + with message sequence numbers. + + Note: UID FETCH, UID STORE, and UID SEARCH are different + commands from FETCH, STORE, and SEARCH. If the client + sends a UID command, it must wait for a completion result + response before sending a command with message sequence + numbers. + + + + + + + + +Crispin Standards Track [Page 22] + +RFC 3501 IMAPv4 March 2003 + + + For example, the following non-waiting command sequences are invalid: + + FETCH + NOOP + STORE + STORE + COPY + FETCH + COPY + COPY + CHECK + FETCH + + The following are examples of valid non-waiting command sequences: + + FETCH + STORE + SEARCH + CHECK + STORE + COPY + EXPUNGE + + UID SEARCH + UID SEARCH may be valid or invalid as a non-waiting + command sequence, depending upon whether or not the second UID + SEARCH contains message sequence numbers. + +6. Client Commands + + IMAP4rev1 commands are described in this section. Commands are + organized by the state in which the command is permitted. Commands + which are permitted in multiple states are listed in the minimum + permitted state (for example, commands valid in authenticated and + selected state are listed in the authenticated state commands). + + Command arguments, identified by "Arguments:" in the command + descriptions below, are described by function, not by syntax. The + precise syntax of command arguments is described in the Formal Syntax + section. + + Some commands cause specific server responses to be returned; these + are identified by "Responses:" in the command descriptions below. + See the response descriptions in the Responses section for + information on these responses, and the Formal Syntax section for the + precise syntax of these responses. It is possible for server data to + be transmitted as a result of any command. Thus, commands that do + not specifically require server data specify "no specific responses + for this command" instead of "none". + + The "Result:" in the command description refers to the possible + tagged status responses to a command, and any special interpretation + of these status responses. + + The state of a connection is only changed by successful commands + which are documented as changing state. A rejected command (BAD + response) never changes the state of the connection or of the + selected mailbox. A failed command (NO response) generally does not + change the state of the connection or of the selected mailbox; the + exception being the SELECT and EXAMINE commands. + + + +Crispin Standards Track [Page 23] + +RFC 3501 IMAPv4 March 2003 + + +6.1. Client Commands - Any State + + The following commands are valid in any state: CAPABILITY, NOOP, and + LOGOUT. + +6.1.1. CAPABILITY Command + + Arguments: none + + Responses: REQUIRED untagged response: CAPABILITY + + Result: OK - capability completed + BAD - command unknown or arguments invalid + + The CAPABILITY command requests a listing of capabilities that the + server supports. The server MUST send a single untagged + CAPABILITY response with "IMAP4rev1" as one of the listed + capabilities before the (tagged) OK response. + + A capability name which begins with "AUTH=" indicates that the + server supports that particular authentication mechanism. All + such names are, by definition, part of this specification. For + example, the authorization capability for an experimental + "blurdybloop" authenticator would be "AUTH=XBLURDYBLOOP" and not + "XAUTH=BLURDYBLOOP" or "XAUTH=XBLURDYBLOOP". + + Other capability names refer to extensions, revisions, or + amendments to this specification. See the documentation of the + CAPABILITY response for additional information. No capabilities, + beyond the base IMAP4rev1 set defined in this specification, are + enabled without explicit client action to invoke the capability. + + Client and server implementations MUST implement the STARTTLS, + LOGINDISABLED, and AUTH=PLAIN (described in [IMAP-TLS]) + capabilities. See the Security Considerations section for + important information. + + See the section entitled "Client Commands - + Experimental/Expansion" for information about the form of site or + implementation-specific capabilities. + + + + + + + + + + + +Crispin Standards Track [Page 24] + +RFC 3501 IMAPv4 March 2003 + + + Example: C: abcd CAPABILITY + S: * CAPABILITY IMAP4rev1 STARTTLS AUTH=GSSAPI + LOGINDISABLED + S: abcd OK CAPABILITY completed + C: efgh STARTTLS + S: efgh OK STARTLS completed + <TLS negotiation, further commands are under [TLS] layer> + C: ijkl CAPABILITY + S: * CAPABILITY IMAP4rev1 AUTH=GSSAPI AUTH=PLAIN + S: ijkl OK CAPABILITY completed + + +6.1.2. NOOP Command + + Arguments: none + + Responses: no specific responses for this command (but see below) + + Result: OK - noop completed + BAD - command unknown or arguments invalid + + The NOOP command always succeeds. It does nothing. + + Since any command can return a status update as untagged data, the + NOOP command can be used as a periodic poll for new messages or + message status updates during a period of inactivity (this is the + preferred method to do this). The NOOP command can also be used + to reset any inactivity autologout timer on the server. + + Example: C: a002 NOOP + S: a002 OK NOOP completed + . . . + C: a047 NOOP + S: * 22 EXPUNGE + S: * 23 EXISTS + S: * 3 RECENT + S: * 14 FETCH (FLAGS (\Seen \Deleted)) + S: a047 OK NOOP completed + + + + + + + + + + + + + +Crispin Standards Track [Page 25] + +RFC 3501 IMAPv4 March 2003 + + +6.1.3. LOGOUT Command + + Arguments: none + + Responses: REQUIRED untagged response: BYE + + Result: OK - logout completed + BAD - command unknown or arguments invalid + + The LOGOUT command informs the server that the client is done with + the connection. The server MUST send a BYE untagged response + before the (tagged) OK response, and then close the network + connection. + + Example: C: A023 LOGOUT + S: * BYE IMAP4rev1 Server logging out + S: A023 OK LOGOUT completed + (Server and client then close the connection) + +6.2. Client Commands - Not Authenticated State + + In the not authenticated state, the AUTHENTICATE or LOGIN command + establishes authentication and enters the authenticated state. The + AUTHENTICATE command provides a general mechanism for a variety of + authentication techniques, privacy protection, and integrity + checking; whereas the LOGIN command uses a traditional user name and + plaintext password pair and has no means of establishing privacy + protection or integrity checking. + + The STARTTLS command is an alternate form of establishing session + privacy protection and integrity checking, but does not establish + authentication or enter the authenticated state. + + Server implementations MAY allow access to certain mailboxes without + establishing authentication. This can be done by means of the + ANONYMOUS [SASL] authenticator described in [ANONYMOUS]. An older + convention is a LOGIN command using the userid "anonymous"; in this + case, a password is required although the server may choose to accept + any password. The restrictions placed on anonymous users are + implementation-dependent. + + Once authenticated (including as anonymous), it is not possible to + re-enter not authenticated state. + + + + + + + + +Crispin Standards Track [Page 26] + +RFC 3501 IMAPv4 March 2003 + + + In addition to the universal commands (CAPABILITY, NOOP, and LOGOUT), + the following commands are valid in the not authenticated state: + STARTTLS, AUTHENTICATE and LOGIN. See the Security Considerations + section for important information about these commands. + +6.2.1. STARTTLS Command + + Arguments: none + + Responses: no specific response for this command + + Result: OK - starttls completed, begin TLS negotiation + BAD - command unknown or arguments invalid + + A [TLS] negotiation begins immediately after the CRLF at the end + of the tagged OK response from the server. Once a client issues a + STARTTLS command, it MUST NOT issue further commands until a + server response is seen and the [TLS] negotiation is complete. + + The server remains in the non-authenticated state, even if client + credentials are supplied during the [TLS] negotiation. This does + not preclude an authentication mechanism such as EXTERNAL (defined + in [SASL]) from using client identity determined by the [TLS] + negotiation. + + Once [TLS] has been started, the client MUST discard cached + information about server capabilities and SHOULD re-issue the + CAPABILITY command. This is necessary to protect against man-in- + the-middle attacks which alter the capabilities list prior to + STARTTLS. The server MAY advertise different capabilities after + STARTTLS. + + Example: C: a001 CAPABILITY + S: * CAPABILITY IMAP4rev1 STARTTLS LOGINDISABLED + S: a001 OK CAPABILITY completed + C: a002 STARTTLS + S: a002 OK Begin TLS negotiation now + <TLS negotiation, further commands are under [TLS] layer> + C: a003 CAPABILITY + S: * CAPABILITY IMAP4rev1 AUTH=PLAIN + S: a003 OK CAPABILITY completed + C: a004 LOGIN joe password + S: a004 OK LOGIN completed + + + + + + + + +Crispin Standards Track [Page 27] + +RFC 3501 IMAPv4 March 2003 + + +6.2.2. AUTHENTICATE Command + + Arguments: authentication mechanism name + + Responses: continuation data can be requested + + Result: OK - authenticate completed, now in authenticated state + NO - authenticate failure: unsupported authentication + mechanism, credentials rejected + BAD - command unknown or arguments invalid, + authentication exchange cancelled + + The AUTHENTICATE command indicates a [SASL] authentication + mechanism to the server. If the server supports the requested + authentication mechanism, it performs an authentication protocol + exchange to authenticate and identify the client. It MAY also + negotiate an OPTIONAL security layer for subsequent protocol + interactions. If the requested authentication mechanism is not + supported, the server SHOULD reject the AUTHENTICATE command by + sending a tagged NO response. + + The AUTHENTICATE command does not support the optional "initial + response" feature of [SASL]. Section 5.1 of [SASL] specifies how + to handle an authentication mechanism which uses an initial + response. + + The service name specified by this protocol's profile of [SASL] is + "imap". + + The authentication protocol exchange consists of a series of + server challenges and client responses that are specific to the + authentication mechanism. A server challenge consists of a + command continuation request response with the "+" token followed + by a BASE64 encoded string. The client response consists of a + single line consisting of a BASE64 encoded string. If the client + wishes to cancel an authentication exchange, it issues a line + consisting of a single "*". If the server receives such a + response, it MUST reject the AUTHENTICATE command by sending a + tagged BAD response. + + If a security layer is negotiated through the [SASL] + authentication exchange, it takes effect immediately following the + CRLF that concludes the authentication exchange for the client, + and the CRLF of the tagged OK response for the server. + + While client and server implementations MUST implement the + AUTHENTICATE command itself, it is not required to implement any + authentication mechanisms other than the PLAIN mechanism described + + + +Crispin Standards Track [Page 28] + +RFC 3501 IMAPv4 March 2003 + + + in [IMAP-TLS]. Also, an authentication mechanism is not required + to support any security layers. + + Note: a server implementation MUST implement a + configuration in which it does NOT permit any plaintext + password mechanisms, unless either the STARTTLS command + has been negotiated or some other mechanism that + protects the session from password snooping has been + provided. Server sites SHOULD NOT use any configuration + which permits a plaintext password mechanism without + such a protection mechanism against password snooping. + Client and server implementations SHOULD implement + additional [SASL] mechanisms that do not use plaintext + passwords, such the GSSAPI mechanism described in [SASL] + and/or the [DIGEST-MD5] mechanism. + + Servers and clients can support multiple authentication + mechanisms. The server SHOULD list its supported authentication + mechanisms in the response to the CAPABILITY command so that the + client knows which authentication mechanisms to use. + + A server MAY include a CAPABILITY response code in the tagged OK + response of a successful AUTHENTICATE command in order to send + capabilities automatically. It is unnecessary for a client to + send a separate CAPABILITY command if it recognizes these + automatic capabilities. This should only be done if a security + layer was not negotiated by the AUTHENTICATE command, because the + tagged OK response as part of an AUTHENTICATE command is not + protected by encryption/integrity checking. [SASL] requires the + client to re-issue a CAPABILITY command in this case. + + If an AUTHENTICATE command fails with a NO response, the client + MAY try another authentication mechanism by issuing another + AUTHENTICATE command. It MAY also attempt to authenticate by + using the LOGIN command (see section 6.2.3 for more detail). In + other words, the client MAY request authentication types in + decreasing order of preference, with the LOGIN command as a last + resort. + + The authorization identity passed from the client to the server + during the authentication exchange is interpreted by the server as + the user name whose privileges the client is requesting. + + + + + + + + + +Crispin Standards Track [Page 29] + +RFC 3501 IMAPv4 March 2003 + + + Example: S: * OK IMAP4rev1 Server + C: A001 AUTHENTICATE GSSAPI + S: + + C: YIIB+wYJKoZIhvcSAQICAQBuggHqMIIB5qADAgEFoQMCAQ6iBw + MFACAAAACjggEmYYIBIjCCAR6gAwIBBaESGxB1Lndhc2hpbmd0 + b24uZWR1oi0wK6ADAgEDoSQwIhsEaW1hcBsac2hpdmFtcy5jYW + Mud2FzaGluZ3Rvbi5lZHWjgdMwgdCgAwIBAaEDAgEDooHDBIHA + cS1GSa5b+fXnPZNmXB9SjL8Ollj2SKyb+3S0iXMljen/jNkpJX + AleKTz6BQPzj8duz8EtoOuNfKgweViyn/9B9bccy1uuAE2HI0y + C/PHXNNU9ZrBziJ8Lm0tTNc98kUpjXnHZhsMcz5Mx2GR6dGknb + I0iaGcRerMUsWOuBmKKKRmVMMdR9T3EZdpqsBd7jZCNMWotjhi + vd5zovQlFqQ2Wjc2+y46vKP/iXxWIuQJuDiisyXF0Y8+5GTpAL + pHDc1/pIGmMIGjoAMCAQGigZsEgZg2on5mSuxoDHEA1w9bcW9n + FdFxDKpdrQhVGVRDIzcCMCTzvUboqb5KjY1NJKJsfjRQiBYBdE + NKfzK+g5DlV8nrw81uOcP8NOQCLR5XkoMHC0Dr/80ziQzbNqhx + O6652Npft0LQwJvenwDI13YxpwOdMXzkWZN/XrEqOWp6GCgXTB + vCyLWLlWnbaUkZdEYbKHBPjd8t/1x5Yg== + S: + YGgGCSqGSIb3EgECAgIAb1kwV6ADAgEFoQMCAQ+iSzBJoAMC + AQGiQgRAtHTEuOP2BXb9sBYFR4SJlDZxmg39IxmRBOhXRKdDA0 + uHTCOT9Bq3OsUTXUlk0CsFLoa8j+gvGDlgHuqzWHPSQg== + C: + S: + YDMGCSqGSIb3EgECAgIBAAD/////6jcyG4GE3KkTzBeBiVHe + ceP2CWY0SR0fAQAgAAQEBAQ= + C: YDMGCSqGSIb3EgECAgIBAAD/////3LQBHXTpFfZgrejpLlLImP + wkhbfa2QteAQAgAG1yYwE= + S: A001 OK GSSAPI authentication successful + + Note: The line breaks within server challenges and client + responses are for editorial clarity and are not in real + authenticators. + + +6.2.3. LOGIN Command + + Arguments: user name + password + + Responses: no specific responses for this command + + Result: OK - login completed, now in authenticated state + NO - login failure: user name or password rejected + BAD - command unknown or arguments invalid + + The LOGIN command identifies the client to the server and carries + the plaintext password authenticating this user. + + + + + + +Crispin Standards Track [Page 30] + +RFC 3501 IMAPv4 March 2003 + + + A server MAY include a CAPABILITY response code in the tagged OK + response to a successful LOGIN command in order to send + capabilities automatically. It is unnecessary for a client to + send a separate CAPABILITY command if it recognizes these + automatic capabilities. + + Example: C: a001 LOGIN SMITH SESAME + S: a001 OK LOGIN completed + + Note: Use of the LOGIN command over an insecure network + (such as the Internet) is a security risk, because anyone + monitoring network traffic can obtain plaintext passwords. + The LOGIN command SHOULD NOT be used except as a last + resort, and it is recommended that client implementations + have a means to disable any automatic use of the LOGIN + command. + + Unless either the STARTTLS command has been negotiated or + some other mechanism that protects the session from + password snooping has been provided, a server + implementation MUST implement a configuration in which it + advertises the LOGINDISABLED capability and does NOT permit + the LOGIN command. Server sites SHOULD NOT use any + configuration which permits the LOGIN command without such + a protection mechanism against password snooping. A client + implementation MUST NOT send a LOGIN command if the + LOGINDISABLED capability is advertised. + +6.3. Client Commands - Authenticated State + + In the authenticated state, commands that manipulate mailboxes as + atomic entities are permitted. Of these commands, the SELECT and + EXAMINE commands will select a mailbox for access and enter the + selected state. + + In addition to the universal commands (CAPABILITY, NOOP, and LOGOUT), + the following commands are valid in the authenticated state: SELECT, + EXAMINE, CREATE, DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, LSUB, + STATUS, and APPEND. + + + + + + + + + + + + +Crispin Standards Track [Page 31] + +RFC 3501 IMAPv4 March 2003 + + +6.3.1. SELECT Command + + Arguments: mailbox name + + Responses: REQUIRED untagged responses: FLAGS, EXISTS, RECENT + REQUIRED OK untagged responses: UNSEEN, PERMANENTFLAGS, + UIDNEXT, UIDVALIDITY + + Result: OK - select completed, now in selected state + NO - select failure, now in authenticated state: no + such mailbox, can't access mailbox + BAD - command unknown or arguments invalid + + The SELECT command selects a mailbox so that messages in the + mailbox can be accessed. Before returning an OK to the client, + the server MUST send the following untagged data to the client. + Note that earlier versions of this protocol only required the + FLAGS, EXISTS, and RECENT untagged data; consequently, client + implementations SHOULD implement default behavior for missing data + as discussed with the individual item. + + FLAGS Defined flags in the mailbox. See the description + of the FLAGS response for more detail. + + <n> EXISTS The number of messages in the mailbox. See the + description of the EXISTS response for more detail. + + <n> RECENT The number of messages with the \Recent flag set. + See the description of the RECENT response for more + detail. + + OK [UNSEEN <n>] + The message sequence number of the first unseen + message in the mailbox. If this is missing, the + client can not make any assumptions about the first + unseen message in the mailbox, and needs to issue a + SEARCH command if it wants to find it. + + OK [PERMANENTFLAGS (<list of flags>)] + A list of message flags that the client can change + permanently. If this is missing, the client should + assume that all flags can be changed permanently. + + OK [UIDNEXT <n>] + The next unique identifier value. Refer to section + 2.3.1.1 for more information. If this is missing, + the client can not make any assumptions about the + next unique identifier value. + + + +Crispin Standards Track [Page 32] + +RFC 3501 IMAPv4 March 2003 + + + OK [UIDVALIDITY <n>] + The unique identifier validity value. Refer to + section 2.3.1.1 for more information. If this is + missing, the server does not support unique + identifiers. + + Only one mailbox can be selected at a time in a connection; + simultaneous access to multiple mailboxes requires multiple + connections. The SELECT command automatically deselects any + currently selected mailbox before attempting the new selection. + Consequently, if a mailbox is selected and a SELECT command that + fails is attempted, no mailbox is selected. + + If the client is permitted to modify the mailbox, the server + SHOULD prefix the text of the tagged OK response with the + "[READ-WRITE]" response code. + + If the client is not permitted to modify the mailbox but is + permitted read access, the mailbox is selected as read-only, and + the server MUST prefix the text of the tagged OK response to + SELECT with the "[READ-ONLY]" response code. Read-only access + through SELECT differs from the EXAMINE command in that certain + read-only mailboxes MAY permit the change of permanent state on a + per-user (as opposed to global) basis. Netnews messages marked in + a server-based .newsrc file are an example of such per-user + permanent state that can be modified with read-only mailboxes. + + Example: C: A142 SELECT INBOX + S: * 172 EXISTS + S: * 1 RECENT + S: * OK [UNSEEN 12] Message 12 is first unseen + S: * OK [UIDVALIDITY 3857529045] UIDs valid + S: * OK [UIDNEXT 4392] Predicted next UID + S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) + S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited + S: A142 OK [READ-WRITE] SELECT completed + + + + + + + + + + + + + + + +Crispin Standards Track [Page 33] + +RFC 3501 IMAPv4 March 2003 + + +6.3.2. EXAMINE Command + + Arguments: mailbox name + + Responses: REQUIRED untagged responses: FLAGS, EXISTS, RECENT + REQUIRED OK untagged responses: UNSEEN, PERMANENTFLAGS, + UIDNEXT, UIDVALIDITY + + Result: OK - examine completed, now in selected state + NO - examine failure, now in authenticated state: no + such mailbox, can't access mailbox + BAD - command unknown or arguments invalid + + The EXAMINE command is identical to SELECT and returns the same + output; however, the selected mailbox is identified as read-only. + No changes to the permanent state of the mailbox, including + per-user state, are permitted; in particular, EXAMINE MUST NOT + cause messages to lose the \Recent flag. + + The text of the tagged OK response to the EXAMINE command MUST + begin with the "[READ-ONLY]" response code. + + Example: C: A932 EXAMINE blurdybloop + S: * 17 EXISTS + S: * 2 RECENT + S: * OK [UNSEEN 8] Message 8 is first unseen + S: * OK [UIDVALIDITY 3857529045] UIDs valid + S: * OK [UIDNEXT 4392] Predicted next UID + S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) + S: * OK [PERMANENTFLAGS ()] No permanent flags permitted + S: A932 OK [READ-ONLY] EXAMINE completed + + +6.3.3. CREATE Command + + Arguments: mailbox name + + Responses: no specific responses for this command + + Result: OK - create completed + NO - create failure: can't create mailbox with that name + BAD - command unknown or arguments invalid + + The CREATE command creates a mailbox with the given name. An OK + response is returned only if a new mailbox with that name has been + created. It is an error to attempt to create INBOX or a mailbox + with a name that refers to an extant mailbox. Any error in + creation will return a tagged NO response. + + + +Crispin Standards Track [Page 34] + +RFC 3501 IMAPv4 March 2003 + + + If the mailbox name is suffixed with the server's hierarchy + separator character (as returned from the server by a LIST + command), this is a declaration that the client intends to create + mailbox names under this name in the hierarchy. Server + implementations that do not require this declaration MUST ignore + the declaration. In any case, the name created is without the + trailing hierarchy delimiter. + + If the server's hierarchy separator character appears elsewhere in + the name, the server SHOULD create any superior hierarchical names + that are needed for the CREATE command to be successfully + completed. In other words, an attempt to create "foo/bar/zap" on + a server in which "/" is the hierarchy separator character SHOULD + create foo/ and foo/bar/ if they do not already exist. + + If a new mailbox is created with the same name as a mailbox which + was deleted, its unique identifiers MUST be greater than any + unique identifiers used in the previous incarnation of the mailbox + UNLESS the new incarnation has a different unique identifier + validity value. See the description of the UID command for more + detail. + + Example: C: A003 CREATE owatagusiam/ + S: A003 OK CREATE completed + C: A004 CREATE owatagusiam/blurdybloop + S: A004 OK CREATE completed + + Note: The interpretation of this example depends on whether + "/" was returned as the hierarchy separator from LIST. If + "/" is the hierarchy separator, a new level of hierarchy + named "owatagusiam" with a member called "blurdybloop" is + created. Otherwise, two mailboxes at the same hierarchy + level are created. + + +6.3.4. DELETE Command + + Arguments: mailbox name + + Responses: no specific responses for this command + + Result: OK - delete completed + NO - delete failure: can't delete mailbox with that name + BAD - command unknown or arguments invalid + + + + + + + +Crispin Standards Track [Page 35] + +RFC 3501 IMAPv4 March 2003 + + + The DELETE command permanently removes the mailbox with the given + name. A tagged OK response is returned only if the mailbox has + been deleted. It is an error to attempt to delete INBOX or a + mailbox name that does not exist. + + The DELETE command MUST NOT remove inferior hierarchical names. + For example, if a mailbox "foo" has an inferior "foo.bar" + (assuming "." is the hierarchy delimiter character), removing + "foo" MUST NOT remove "foo.bar". It is an error to attempt to + delete a name that has inferior hierarchical names and also has + the \Noselect mailbox name attribute (see the description of the + LIST response for more details). + + It is permitted to delete a name that has inferior hierarchical + names and does not have the \Noselect mailbox name attribute. In + this case, all messages in that mailbox are removed, and the name + will acquire the \Noselect mailbox name attribute. + + The value of the highest-used unique identifier of the deleted + mailbox MUST be preserved so that a new mailbox created with the + same name will not reuse the identifiers of the former + incarnation, UNLESS the new incarnation has a different unique + identifier validity value. See the description of the UID command + for more detail. + + Examples: C: A682 LIST "" * + S: * LIST () "/" blurdybloop + S: * LIST (\Noselect) "/" foo + S: * LIST () "/" foo/bar + S: A682 OK LIST completed + C: A683 DELETE blurdybloop + S: A683 OK DELETE completed + C: A684 DELETE foo + S: A684 NO Name "foo" has inferior hierarchical names + C: A685 DELETE foo/bar + S: A685 OK DELETE Completed + C: A686 LIST "" * + S: * LIST (\Noselect) "/" foo + S: A686 OK LIST completed + C: A687 DELETE foo + S: A687 OK DELETE Completed + + + + + + + + + + +Crispin Standards Track [Page 36] + +RFC 3501 IMAPv4 March 2003 + + + C: A82 LIST "" * + S: * LIST () "." blurdybloop + S: * LIST () "." foo + S: * LIST () "." foo.bar + S: A82 OK LIST completed + C: A83 DELETE blurdybloop + S: A83 OK DELETE completed + C: A84 DELETE foo + S: A84 OK DELETE Completed + C: A85 LIST "" * + S: * LIST () "." foo.bar + S: A85 OK LIST completed + C: A86 LIST "" % + S: * LIST (\Noselect) "." foo + S: A86 OK LIST completed + + +6.3.5. RENAME Command + + Arguments: existing mailbox name + new mailbox name + + Responses: no specific responses for this command + + Result: OK - rename completed + NO - rename failure: can't rename mailbox with that name, + can't rename to mailbox with that name + BAD - command unknown or arguments invalid + + The RENAME command changes the name of a mailbox. A tagged OK + response is returned only if the mailbox has been renamed. It is + an error to attempt to rename from a mailbox name that does not + exist or to a mailbox name that already exists. Any error in + renaming will return a tagged NO response. + + If the name has inferior hierarchical names, then the inferior + hierarchical names MUST also be renamed. For example, a rename of + "foo" to "zap" will rename "foo/bar" (assuming "/" is the + hierarchy delimiter character) to "zap/bar". + + If the server's hierarchy separator character appears in the name, + the server SHOULD create any superior hierarchical names that are + needed for the RENAME command to complete successfully. In other + words, an attempt to rename "foo/bar/zap" to baz/rag/zowie on a + server in which "/" is the hierarchy separator character SHOULD + create baz/ and baz/rag/ if they do not already exist. + + + + + +Crispin Standards Track [Page 37] + +RFC 3501 IMAPv4 March 2003 + + + The value of the highest-used unique identifier of the old mailbox + name MUST be preserved so that a new mailbox created with the same + name will not reuse the identifiers of the former incarnation, + UNLESS the new incarnation has a different unique identifier + validity value. See the description of the UID command for more + detail. + + Renaming INBOX is permitted, and has special behavior. It moves + all messages in INBOX to a new mailbox with the given name, + leaving INBOX empty. If the server implementation supports + inferior hierarchical names of INBOX, these are unaffected by a + rename of INBOX. + + Examples: C: A682 LIST "" * + S: * LIST () "/" blurdybloop + S: * LIST (\Noselect) "/" foo + S: * LIST () "/" foo/bar + S: A682 OK LIST completed + C: A683 RENAME blurdybloop sarasoop + S: A683 OK RENAME completed + C: A684 RENAME foo zowie + S: A684 OK RENAME Completed + C: A685 LIST "" * + S: * LIST () "/" sarasoop + S: * LIST (\Noselect) "/" zowie + S: * LIST () "/" zowie/bar + S: A685 OK LIST completed + + C: Z432 LIST "" * + S: * LIST () "." INBOX + S: * LIST () "." INBOX.bar + S: Z432 OK LIST completed + C: Z433 RENAME INBOX old-mail + S: Z433 OK RENAME completed + C: Z434 LIST "" * + S: * LIST () "." INBOX + S: * LIST () "." INBOX.bar + S: * LIST () "." old-mail + S: Z434 OK LIST completed + + + + + + + + + + + + +Crispin Standards Track [Page 38] + +RFC 3501 IMAPv4 March 2003 + + +6.3.6. SUBSCRIBE Command + + Arguments: mailbox + + Responses: no specific responses for this command + + Result: OK - subscribe completed + NO - subscribe failure: can't subscribe to that name + BAD - command unknown or arguments invalid + + The SUBSCRIBE command adds the specified mailbox name to the + server's set of "active" or "subscribed" mailboxes as returned by + the LSUB command. This command returns a tagged OK response only + if the subscription is successful. + + A server MAY validate the mailbox argument to SUBSCRIBE to verify + that it exists. However, it MUST NOT unilaterally remove an + existing mailbox name from the subscription list even if a mailbox + by that name no longer exists. + + Note: This requirement is because a server site can + choose to routinely remove a mailbox with a well-known + name (e.g., "system-alerts") after its contents expire, + with the intention of recreating it when new contents + are appropriate. + + + Example: C: A002 SUBSCRIBE #news.comp.mail.mime + S: A002 OK SUBSCRIBE completed + + +6.3.7. UNSUBSCRIBE Command + + Arguments: mailbox name + + Responses: no specific responses for this command + + Result: OK - unsubscribe completed + NO - unsubscribe failure: can't unsubscribe that name + BAD - command unknown or arguments invalid + + The UNSUBSCRIBE command removes the specified mailbox name from + the server's set of "active" or "subscribed" mailboxes as returned + by the LSUB command. This command returns a tagged OK response + only if the unsubscription is successful. + + Example: C: A002 UNSUBSCRIBE #news.comp.mail.mime + S: A002 OK UNSUBSCRIBE completed + + + +Crispin Standards Track [Page 39] + +RFC 3501 IMAPv4 March 2003 + + +6.3.8. LIST Command + + Arguments: reference name + mailbox name with possible wildcards + + Responses: untagged responses: LIST + + Result: OK - list completed + NO - list failure: can't list that reference or name + BAD - command unknown or arguments invalid + + The LIST command returns a subset of names from the complete set + of all names available to the client. Zero or more untagged LIST + replies are returned, containing the name attributes, hierarchy + delimiter, and name; see the description of the LIST reply for + more detail. + + The LIST command SHOULD return its data quickly, without undue + delay. For example, it SHOULD NOT go to excess trouble to + calculate the \Marked or \Unmarked status or perform other + processing; if each name requires 1 second of processing, then a + list of 1200 names would take 20 minutes! + + An empty ("" string) reference name argument indicates that the + mailbox name is interpreted as by SELECT. The returned mailbox + names MUST match the supplied mailbox name pattern. A non-empty + reference name argument is the name of a mailbox or a level of + mailbox hierarchy, and indicates the context in which the mailbox + name is interpreted. + + An empty ("" string) mailbox name argument is a special request to + return the hierarchy delimiter and the root name of the name given + in the reference. The value returned as the root MAY be the empty + string if the reference is non-rooted or is an empty string. In + all cases, a hierarchy delimiter (or NIL if there is no hierarchy) + is returned. This permits a client to get the hierarchy delimiter + (or find out that the mailbox names are flat) even when no + mailboxes by that name currently exist. + + The reference and mailbox name arguments are interpreted into a + canonical form that represents an unambiguous left-to-right + hierarchy. The returned mailbox names will be in the interpreted + form. + + + + + + + + +Crispin Standards Track [Page 40] + +RFC 3501 IMAPv4 March 2003 + + + Note: The interpretation of the reference argument is + implementation-defined. It depends upon whether the + server implementation has a concept of the "current + working directory" and leading "break out characters", + which override the current working directory. + + For example, on a server which exports a UNIX or NT + filesystem, the reference argument contains the current + working directory, and the mailbox name argument would + contain the name as interpreted in the current working + directory. + + If a server implementation has no concept of break out + characters, the canonical form is normally the reference + name appended with the mailbox name. Note that if the + server implements the namespace convention (section + 5.1.2), "#" is a break out character and must be treated + as such. + + If the reference argument is not a level of mailbox + hierarchy (that is, it is a \NoInferiors name), and/or + the reference argument does not end with the hierarchy + delimiter, it is implementation-dependent how this is + interpreted. For example, a reference of "foo/bar" and + mailbox name of "rag/baz" could be interpreted as + "foo/bar/rag/baz", "foo/barrag/baz", or "foo/rag/baz". + A client SHOULD NOT use such a reference argument except + at the explicit request of the user. A hierarchical + browser MUST NOT make any assumptions about server + interpretation of the reference unless the reference is + a level of mailbox hierarchy AND ends with the hierarchy + delimiter. + + Any part of the reference argument that is included in the + interpreted form SHOULD prefix the interpreted form. It SHOULD + also be in the same form as the reference name argument. This + rule permits the client to determine if the returned mailbox name + is in the context of the reference argument, or if something about + the mailbox argument overrode the reference argument. Without + this rule, the client would have to have knowledge of the server's + naming semantics including what characters are "breakouts" that + override a naming context. + + + + + + + + + +Crispin Standards Track [Page 41] + +RFC 3501 IMAPv4 March 2003 + + + For example, here are some examples of how references + and mailbox names might be interpreted on a UNIX-based + server: + + Reference Mailbox Name Interpretation + ------------ ------------ -------------- + ~smith/Mail/ foo.* ~smith/Mail/foo.* + archive/ % archive/% + #news. comp.mail.* #news.comp.mail.* + ~smith/Mail/ /usr/doc/foo /usr/doc/foo + archive/ ~fred/Mail/* ~fred/Mail/* + + The first three examples demonstrate interpretations in + the context of the reference argument. Note that + "~smith/Mail" SHOULD NOT be transformed into something + like "/u2/users/smith/Mail", or it would be impossible + for the client to determine that the interpretation was + in the context of the reference. + + The character "*" is a wildcard, and matches zero or more + characters at this position. The character "%" is similar to "*", + but it does not match a hierarchy delimiter. If the "%" wildcard + is the last character of a mailbox name argument, matching levels + of hierarchy are also returned. If these levels of hierarchy are + not also selectable mailboxes, they are returned with the + \Noselect mailbox name attribute (see the description of the LIST + response for more details). + + Server implementations are permitted to "hide" otherwise + accessible mailboxes from the wildcard characters, by preventing + certain characters or names from matching a wildcard in certain + situations. For example, a UNIX-based server might restrict the + interpretation of "*" so that an initial "/" character does not + match. + + The special name INBOX is included in the output from LIST, if + INBOX is supported by this server for this user and if the + uppercase string "INBOX" matches the interpreted reference and + mailbox name arguments with wildcards as described above. The + criteria for omitting INBOX is whether SELECT INBOX will return + failure; it is not relevant whether the user's real INBOX resides + on this or some other server. + + + + + + + + + +Crispin Standards Track [Page 42] + +RFC 3501 IMAPv4 March 2003 + + + Example: C: A101 LIST "" "" + S: * LIST (\Noselect) "/" "" + S: A101 OK LIST Completed + C: A102 LIST #news.comp.mail.misc "" + S: * LIST (\Noselect) "." #news. + S: A102 OK LIST Completed + C: A103 LIST /usr/staff/jones "" + S: * LIST (\Noselect) "/" / + S: A103 OK LIST Completed + C: A202 LIST ~/Mail/ % + S: * LIST (\Noselect) "/" ~/Mail/foo + S: * LIST () "/" ~/Mail/meetings + S: A202 OK LIST completed + + +6.3.9. LSUB Command + + Arguments: reference name + mailbox name with possible wildcards + + Responses: untagged responses: LSUB + + Result: OK - lsub completed + NO - lsub failure: can't list that reference or name + BAD - command unknown or arguments invalid + + The LSUB command returns a subset of names from the set of names + that the user has declared as being "active" or "subscribed". + Zero or more untagged LSUB replies are returned. The arguments to + LSUB are in the same form as those for LIST. + + The returned untagged LSUB response MAY contain different mailbox + flags from a LIST untagged response. If this should happen, the + flags in the untagged LIST are considered more authoritative. + + A special situation occurs when using LSUB with the % wildcard. + Consider what happens if "foo/bar" (with a hierarchy delimiter of + "/") is subscribed but "foo" is not. A "%" wildcard to LSUB must + return foo, not foo/bar, in the LSUB response, and it MUST be + flagged with the \Noselect attribute. + + The server MUST NOT unilaterally remove an existing mailbox name + from the subscription list even if a mailbox by that name no + longer exists. + + + + + + + +Crispin Standards Track [Page 43] + +RFC 3501 IMAPv4 March 2003 + + + Example: C: A002 LSUB "#news." "comp.mail.*" + S: * LSUB () "." #news.comp.mail.mime + S: * LSUB () "." #news.comp.mail.misc + S: A002 OK LSUB completed + C: A003 LSUB "#news." "comp.%" + S: * LSUB (\NoSelect) "." #news.comp.mail + S: A003 OK LSUB completed + + +6.3.10. STATUS Command + + Arguments: mailbox name + status data item names + + Responses: untagged responses: STATUS + + Result: OK - status completed + NO - status failure: no status for that name + BAD - command unknown or arguments invalid + + The STATUS command requests the status of the indicated mailbox. + It does not change the currently selected mailbox, nor does it + affect the state of any messages in the queried mailbox (in + particular, STATUS MUST NOT cause messages to lose the \Recent + flag). + + The STATUS command provides an alternative to opening a second + IMAP4rev1 connection and doing an EXAMINE command on a mailbox to + query that mailbox's status without deselecting the current + mailbox in the first IMAP4rev1 connection. + + Unlike the LIST command, the STATUS command is not guaranteed to + be fast in its response. Under certain circumstances, it can be + quite slow. In some implementations, the server is obliged to + open the mailbox read-only internally to obtain certain status + information. Also unlike the LIST command, the STATUS command + does not accept wildcards. + + Note: The STATUS command is intended to access the + status of mailboxes other than the currently selected + mailbox. Because the STATUS command can cause the + mailbox to be opened internally, and because this + information is available by other means on the selected + mailbox, the STATUS command SHOULD NOT be used on the + currently selected mailbox. + + + + + + +Crispin Standards Track [Page 44] + +RFC 3501 IMAPv4 March 2003 + + + The STATUS command MUST NOT be used as a "check for new + messages in the selected mailbox" operation (refer to + sections 7, 7.3.1, and 7.3.2 for more information about + the proper method for new message checking). + + Because the STATUS command is not guaranteed to be fast + in its results, clients SHOULD NOT expect to be able to + issue many consecutive STATUS commands and obtain + reasonable performance. + + The currently defined status data items that can be requested are: + + MESSAGES + The number of messages in the mailbox. + + RECENT + The number of messages with the \Recent flag set. + + UIDNEXT + The next unique identifier value of the mailbox. Refer to + section 2.3.1.1 for more information. + + UIDVALIDITY + The unique identifier validity value of the mailbox. Refer to + section 2.3.1.1 for more information. + + UNSEEN + The number of messages which do not have the \Seen flag set. + + + Example: C: A042 STATUS blurdybloop (UIDNEXT MESSAGES) + S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) + S: A042 OK STATUS completed + + + + + + + + + + + + + + + + + + +Crispin Standards Track [Page 45] + +RFC 3501 IMAPv4 March 2003 + + +6.3.11. APPEND Command + + Arguments: mailbox name + OPTIONAL flag parenthesized list + OPTIONAL date/time string + message literal + + Responses: no specific responses for this command + + Result: OK - append completed + NO - append error: can't append to that mailbox, error + in flags or date/time or message text + BAD - command unknown or arguments invalid + + The APPEND command appends the literal argument as a new message + to the end of the specified destination mailbox. This argument + SHOULD be in the format of an [RFC-2822] message. 8-bit + characters are permitted in the message. A server implementation + that is unable to preserve 8-bit data properly MUST be able to + reversibly convert 8-bit APPEND data to 7-bit using a [MIME-IMB] + content transfer encoding. + + Note: There MAY be exceptions, e.g., draft messages, in + which required [RFC-2822] header lines are omitted in + the message literal argument to APPEND. The full + implications of doing so MUST be understood and + carefully weighed. + + If a flag parenthesized list is specified, the flags SHOULD be set + in the resulting message; otherwise, the flag list of the + resulting message is set to empty by default. In either case, the + Recent flag is also set. + + If a date-time is specified, the internal date SHOULD be set in + the resulting message; otherwise, the internal date of the + resulting message is set to the current date and time by default. + + If the append is unsuccessful for any reason, the mailbox MUST be + restored to its state before the APPEND attempt; no partial + appending is permitted. + + If the destination mailbox does not exist, a server MUST return an + error, and MUST NOT automatically create the mailbox. Unless it + is certain that the destination mailbox can not be created, the + server MUST send the response code "[TRYCREATE]" as the prefix of + the text of the tagged NO response. This gives a hint to the + client that it can attempt a CREATE command and retry the APPEND + if the CREATE is successful. + + + +Crispin Standards Track [Page 46] + +RFC 3501 IMAPv4 March 2003 + + + If the mailbox is currently selected, the normal new message + actions SHOULD occur. Specifically, the server SHOULD notify the + client immediately via an untagged EXISTS response. If the server + does not do so, the client MAY issue a NOOP command (or failing + that, a CHECK command) after one or more APPEND commands. + + Example: C: A003 APPEND saved-messages (\Seen) {310} + S: + Ready for literal data + C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) + C: From: Fred Foobar <foobar@Blurdybloop.COM> + C: Subject: afternoon meeting + C: To: mooch@owatagu.siam.edu + C: Message-Id: <B27397-0100000@Blurdybloop.COM> + C: MIME-Version: 1.0 + C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII + C: + C: Hello Joe, do you think we can meet at 3:30 tomorrow? + C: + S: A003 OK APPEND completed + + Note: The APPEND command is not used for message delivery, + because it does not provide a mechanism to transfer [SMTP] + envelope information. + +6.4. Client Commands - Selected State + + In the selected state, commands that manipulate messages in a mailbox + are permitted. + + In addition to the universal commands (CAPABILITY, NOOP, and LOGOUT), + and the authenticated state commands (SELECT, EXAMINE, CREATE, + DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, LSUB, STATUS, and + APPEND), the following commands are valid in the selected state: + CHECK, CLOSE, EXPUNGE, SEARCH, FETCH, STORE, COPY, and UID. + +6.4.1. CHECK Command + + Arguments: none + + Responses: no specific responses for this command + + Result: OK - check completed + BAD - command unknown or arguments invalid + + The CHECK command requests a checkpoint of the currently selected + mailbox. A checkpoint refers to any implementation-dependent + housekeeping associated with the mailbox (e.g., resolving the + server's in-memory state of the mailbox with the state on its + + + +Crispin Standards Track [Page 47] + +RFC 3501 IMAPv4 March 2003 + + + disk) that is not normally executed as part of each command. A + checkpoint MAY take a non-instantaneous amount of real time to + complete. If a server implementation has no such housekeeping + considerations, CHECK is equivalent to NOOP. + + There is no guarantee that an EXISTS untagged response will happen + as a result of CHECK. NOOP, not CHECK, SHOULD be used for new + message polling. + + Example: C: FXXZ CHECK + S: FXXZ OK CHECK Completed + + +6.4.2. CLOSE Command + + Arguments: none + + Responses: no specific responses for this command + + Result: OK - close completed, now in authenticated state + BAD - command unknown or arguments invalid + + The CLOSE command permanently removes all messages that have the + \Deleted flag set from the currently selected mailbox, and returns + to the authenticated state from the selected state. No untagged + EXPUNGE responses are sent. + + No messages are removed, and no error is given, if the mailbox is + selected by an EXAMINE command or is otherwise selected read-only. + + Even if a mailbox is selected, a SELECT, EXAMINE, or LOGOUT + command MAY be issued without previously issuing a CLOSE command. + The SELECT, EXAMINE, and LOGOUT commands implicitly close the + currently selected mailbox without doing an expunge. However, + when many messages are deleted, a CLOSE-LOGOUT or CLOSE-SELECT + sequence is considerably faster than an EXPUNGE-LOGOUT or + EXPUNGE-SELECT because no untagged EXPUNGE responses (which the + client would probably ignore) are sent. + + Example: C: A341 CLOSE + S: A341 OK CLOSE completed + + + + + + + + + + +Crispin Standards Track [Page 48] + +RFC 3501 IMAPv4 March 2003 + + +6.4.3. EXPUNGE Command + + Arguments: none + + Responses: untagged responses: EXPUNGE + + Result: OK - expunge completed + NO - expunge failure: can't expunge (e.g., permission + denied) + BAD - command unknown or arguments invalid + + The EXPUNGE command permanently removes all messages that have the + \Deleted flag set from the currently selected mailbox. Before + returning an OK to the client, an untagged EXPUNGE response is + sent for each message that is removed. + + Example: C: A202 EXPUNGE + S: * 3 EXPUNGE + S: * 3 EXPUNGE + S: * 5 EXPUNGE + S: * 8 EXPUNGE + S: A202 OK EXPUNGE completed + + Note: In this example, messages 3, 4, 7, and 11 had the + \Deleted flag set. See the description of the EXPUNGE + response for further explanation. + + +6.4.4. SEARCH Command + + Arguments: OPTIONAL [CHARSET] specification + searching criteria (one or more) + + Responses: REQUIRED untagged response: SEARCH + + Result: OK - search completed + NO - search error: can't search that [CHARSET] or + criteria + BAD - command unknown or arguments invalid + + The SEARCH command searches the mailbox for messages that match + the given searching criteria. Searching criteria consist of one + or more search keys. The untagged SEARCH response from the server + contains a listing of message sequence numbers corresponding to + those messages that match the searching criteria. + + + + + + +Crispin Standards Track [Page 49] + +RFC 3501 IMAPv4 March 2003 + + + When multiple keys are specified, the result is the intersection + (AND function) of all the messages that match those keys. For + example, the criteria DELETED FROM "SMITH" SINCE 1-Feb-1994 refers + to all deleted messages from Smith that were placed in the mailbox + since February 1, 1994. A search key can also be a parenthesized + list of one or more search keys (e.g., for use with the OR and NOT + keys). + + Server implementations MAY exclude [MIME-IMB] body parts with + terminal content media types other than TEXT and MESSAGE from + consideration in SEARCH matching. + + The OPTIONAL [CHARSET] specification consists of the word + "CHARSET" followed by a registered [CHARSET]. It indicates the + [CHARSET] of the strings that appear in the search criteria. + [MIME-IMB] content transfer encodings, and [MIME-HDRS] strings in + [RFC-2822]/[MIME-IMB] headers, MUST be decoded before comparing + text in a [CHARSET] other than US-ASCII. US-ASCII MUST be + supported; other [CHARSET]s MAY be supported. + + If the server does not support the specified [CHARSET], it MUST + return a tagged NO response (not a BAD). This response SHOULD + contain the BADCHARSET response code, which MAY list the + [CHARSET]s supported by the server. + + In all search keys that use strings, a message matches the key if + the string is a substring of the field. The matching is + case-insensitive. + + The defined search keys are as follows. Refer to the Formal + Syntax section for the precise syntactic definitions of the + arguments. + + <sequence set> + Messages with message sequence numbers corresponding to the + specified message sequence number set. + + ALL + All messages in the mailbox; the default initial key for + ANDing. + + ANSWERED + Messages with the \Answered flag set. + + + + + + + + +Crispin Standards Track [Page 50] + +RFC 3501 IMAPv4 March 2003 + + + BCC <string> + Messages that contain the specified string in the envelope + structure's BCC field. + + BEFORE <date> + Messages whose internal date (disregarding time and timezone) + is earlier than the specified date. + + BODY <string> + Messages that contain the specified string in the body of the + message. + + CC <string> + Messages that contain the specified string in the envelope + structure's CC field. + + DELETED + Messages with the \Deleted flag set. + + DRAFT + Messages with the \Draft flag set. + + FLAGGED + Messages with the \Flagged flag set. + + FROM <string> + Messages that contain the specified string in the envelope + structure's FROM field. + + HEADER <field-name> <string> + Messages that have a header with the specified field-name (as + defined in [RFC-2822]) and that contains the specified string + in the text of the header (what comes after the colon). If the + string to search is zero-length, this matches all messages that + have a header line with the specified field-name regardless of + the contents. + + KEYWORD <flag> + Messages with the specified keyword flag set. + + LARGER <n> + Messages with an [RFC-2822] size larger than the specified + number of octets. + + NEW + Messages that have the \Recent flag set but not the \Seen flag. + This is functionally equivalent to "(RECENT UNSEEN)". + + + + +Crispin Standards Track [Page 51] + +RFC 3501 IMAPv4 March 2003 + + + NOT <search-key> + Messages that do not match the specified search key. + + OLD + Messages that do not have the \Recent flag set. This is + functionally equivalent to "NOT RECENT" (as opposed to "NOT + NEW"). + + ON <date> + Messages whose internal date (disregarding time and timezone) + is within the specified date. + + OR <search-key1> <search-key2> + Messages that match either search key. + + RECENT + Messages that have the \Recent flag set. + + SEEN + Messages that have the \Seen flag set. + + SENTBEFORE <date> + Messages whose [RFC-2822] Date: header (disregarding time and + timezone) is earlier than the specified date. + + SENTON <date> + Messages whose [RFC-2822] Date: header (disregarding time and + timezone) is within the specified date. + + SENTSINCE <date> + Messages whose [RFC-2822] Date: header (disregarding time and + timezone) is within or later than the specified date. + + SINCE <date> + Messages whose internal date (disregarding time and timezone) + is within or later than the specified date. + + SMALLER <n> + Messages with an [RFC-2822] size smaller than the specified + number of octets. + + + + + + + + + + + +Crispin Standards Track [Page 52] + +RFC 3501 IMAPv4 March 2003 + + + SUBJECT <string> + Messages that contain the specified string in the envelope + structure's SUBJECT field. + + TEXT <string> + Messages that contain the specified string in the header or + body of the message. + + TO <string> + Messages that contain the specified string in the envelope + structure's TO field. + + UID <sequence set> + Messages with unique identifiers corresponding to the specified + unique identifier set. Sequence set ranges are permitted. + + UNANSWERED + Messages that do not have the \Answered flag set. + + UNDELETED + Messages that do not have the \Deleted flag set. + + UNDRAFT + Messages that do not have the \Draft flag set. + + UNFLAGGED + Messages that do not have the \Flagged flag set. + + UNKEYWORD <flag> + Messages that do not have the specified keyword flag set. + + UNSEEN + Messages that do not have the \Seen flag set. + + + + + + + + + + + + + + + + + + +Crispin Standards Track [Page 53] + +RFC 3501 IMAPv4 March 2003 + + + Example: C: A282 SEARCH FLAGGED SINCE 1-Feb-1994 NOT FROM "Smith" + S: * SEARCH 2 84 882 + S: A282 OK SEARCH completed + C: A283 SEARCH TEXT "string not in mailbox" + S: * SEARCH + S: A283 OK SEARCH completed + C: A284 SEARCH CHARSET UTF-8 TEXT {6} + C: XXXXXX + S: * SEARCH 43 + S: A284 OK SEARCH completed + + Note: Since this document is restricted to 7-bit ASCII + text, it is not possible to show actual UTF-8 data. The + "XXXXXX" is a placeholder for what would be 6 octets of + 8-bit data in an actual transaction. + + +6.4.5. FETCH Command + + Arguments: sequence set + message data item names or macro + + Responses: untagged responses: FETCH + + Result: OK - fetch completed + NO - fetch error: can't fetch that data + BAD - command unknown or arguments invalid + + The FETCH command retrieves data associated with a message in the + mailbox. The data items to be fetched can be either a single atom + or a parenthesized list. + + Most data items, identified in the formal syntax under the + msg-att-static rule, are static and MUST NOT change for any + particular message. Other data items, identified in the formal + syntax under the msg-att-dynamic rule, MAY change, either as a + result of a STORE command or due to external events. + + For example, if a client receives an ENVELOPE for a + message when it already knows the envelope, it can + safely ignore the newly transmitted envelope. + + There are three macros which specify commonly-used sets of data + items, and can be used instead of data items. A macro must be + used by itself, and not in conjunction with other macros or data + items. + + + + + +Crispin Standards Track [Page 54] + +RFC 3501 IMAPv4 March 2003 + + + ALL + Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE) + + FAST + Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE) + + FULL + Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE + BODY) + + The currently defined data items that can be fetched are: + + BODY + Non-extensible form of BODYSTRUCTURE. + + BODY[<section>]<<partial>> + The text of a particular body section. The section + specification is a set of zero or more part specifiers + delimited by periods. A part specifier is either a part number + or one of the following: HEADER, HEADER.FIELDS, + HEADER.FIELDS.NOT, MIME, and TEXT. An empty section + specification refers to the entire message, including the + header. + + Every message has at least one part number. Non-[MIME-IMB] + messages, and non-multipart [MIME-IMB] messages with no + encapsulated message, only have a part 1. + + Multipart messages are assigned consecutive part numbers, as + they occur in the message. If a particular part is of type + message or multipart, its parts MUST be indicated by a period + followed by the part number within that nested multipart part. + + A part of type MESSAGE/RFC822 also has nested part numbers, + referring to parts of the MESSAGE part's body. + + The HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, and TEXT part + specifiers can be the sole part specifier or can be prefixed by + one or more numeric part specifiers, provided that the numeric + part specifier refers to a part of type MESSAGE/RFC822. The + MIME part specifier MUST be prefixed by one or more numeric + part specifiers. + + The HEADER, HEADER.FIELDS, and HEADER.FIELDS.NOT part + specifiers refer to the [RFC-2822] header of the message or of + an encapsulated [MIME-IMT] MESSAGE/RFC822 message. + HEADER.FIELDS and HEADER.FIELDS.NOT are followed by a list of + field-name (as defined in [RFC-2822]) names, and return a + + + +Crispin Standards Track [Page 55] + +RFC 3501 IMAPv4 March 2003 + + + subset of the header. The subset returned by HEADER.FIELDS + contains only those header fields with a field-name that + matches one of the names in the list; similarly, the subset + returned by HEADER.FIELDS.NOT contains only the header fields + with a non-matching field-name. The field-matching is + case-insensitive but otherwise exact. Subsetting does not + exclude the [RFC-2822] delimiting blank line between the header + and the body; the blank line is included in all header fetches, + except in the case of a message which has no body and no blank + line. + + The MIME part specifier refers to the [MIME-IMB] header for + this part. + + The TEXT part specifier refers to the text body of the message, + omitting the [RFC-2822] header. + + Here is an example of a complex message with some of its + part specifiers: + + HEADER ([RFC-2822] header of the message) + TEXT ([RFC-2822] text body of the message) MULTIPART/MIXED + 1 TEXT/PLAIN + 2 APPLICATION/OCTET-STREAM + 3 MESSAGE/RFC822 + 3.HEADER ([RFC-2822] header of the message) + 3.TEXT ([RFC-2822] text body of the message) MULTIPART/MIXED + 3.1 TEXT/PLAIN + 3.2 APPLICATION/OCTET-STREAM + 4 MULTIPART/MIXED + 4.1 IMAGE/GIF + 4.1.MIME ([MIME-IMB] header for the IMAGE/GIF) + 4.2 MESSAGE/RFC822 + 4.2.HEADER ([RFC-2822] header of the message) + 4.2.TEXT ([RFC-2822] text body of the message) MULTIPART/MIXED + 4.2.1 TEXT/PLAIN + 4.2.2 MULTIPART/ALTERNATIVE + 4.2.2.1 TEXT/PLAIN + 4.2.2.2 TEXT/RICHTEXT + + + It is possible to fetch a substring of the designated text. + This is done by appending an open angle bracket ("<"), the + octet position of the first desired octet, a period, the + maximum number of octets desired, and a close angle bracket + (">") to the part specifier. If the starting octet is beyond + the end of the text, an empty string is returned. + + + + +Crispin Standards Track [Page 56] + +RFC 3501 IMAPv4 March 2003 + + + Any partial fetch that attempts to read beyond the end of the + text is truncated as appropriate. A partial fetch that starts + at octet 0 is returned as a partial fetch, even if this + truncation happened. + + Note: This means that BODY[]<0.2048> of a 1500-octet message + will return BODY[]<0> with a literal of size 1500, not + BODY[]. + + Note: A substring fetch of a HEADER.FIELDS or + HEADER.FIELDS.NOT part specifier is calculated after + subsetting the header. + + The \Seen flag is implicitly set; if this causes the flags to + change, they SHOULD be included as part of the FETCH responses. + + BODY.PEEK[<section>]<<partial>> + An alternate form of BODY[<section>] that does not implicitly + set the \Seen flag. + + BODYSTRUCTURE + The [MIME-IMB] body structure of the message. This is computed + by the server by parsing the [MIME-IMB] header fields in the + [RFC-2822] header and [MIME-IMB] headers. + + ENVELOPE + The envelope structure of the message. This is computed by the + server by parsing the [RFC-2822] header into the component + parts, defaulting various fields as necessary. + + FLAGS + The flags that are set for this message. + + INTERNALDATE + The internal date of the message. + + RFC822 + Functionally equivalent to BODY[], differing in the syntax of + the resulting untagged FETCH data (RFC822 is returned). + + RFC822.HEADER + Functionally equivalent to BODY.PEEK[HEADER], differing in the + syntax of the resulting untagged FETCH data (RFC822.HEADER is + returned). + + RFC822.SIZE + The [RFC-2822] size of the message. + + + + +Crispin Standards Track [Page 57] + +RFC 3501 IMAPv4 March 2003 + + + RFC822.TEXT + Functionally equivalent to BODY[TEXT], differing in the syntax + of the resulting untagged FETCH data (RFC822.TEXT is returned). + + UID + The unique identifier for the message. + + + Example: C: A654 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)]) + S: * 2 FETCH .... + S: * 3 FETCH .... + S: * 4 FETCH .... + S: A654 OK FETCH completed + + +6.4.6. STORE Command + + Arguments: sequence set + message data item name + value for message data item + + Responses: untagged responses: FETCH + + Result: OK - store completed + NO - store error: can't store that data + BAD - command unknown or arguments invalid + + The STORE command alters data associated with a message in the + mailbox. Normally, STORE will return the updated value of the + data with an untagged FETCH response. A suffix of ".SILENT" in + the data item name prevents the untagged FETCH, and the server + SHOULD assume that the client has determined the updated value + itself or does not care about the updated value. + + Note: Regardless of whether or not the ".SILENT" suffix + was used, the server SHOULD send an untagged FETCH + response if a change to a message's flags from an + external source is observed. The intent is that the + status of the flags is determinate without a race + condition. + + + + + + + + + + + +Crispin Standards Track [Page 58] + +RFC 3501 IMAPv4 March 2003 + + + The currently defined data items that can be stored are: + + FLAGS <flag list> + Replace the flags for the message (other than \Recent) with the + argument. The new value of the flags is returned as if a FETCH + of those flags was done. + + FLAGS.SILENT <flag list> + Equivalent to FLAGS, but without returning a new value. + + +FLAGS <flag list> + Add the argument to the flags for the message. The new value + of the flags is returned as if a FETCH of those flags was done. + + +FLAGS.SILENT <flag list> + Equivalent to +FLAGS, but without returning a new value. + + -FLAGS <flag list> + Remove the argument from the flags for the message. The new + value of the flags is returned as if a FETCH of those flags was + done. + + -FLAGS.SILENT <flag list> + Equivalent to -FLAGS, but without returning a new value. + + + Example: C: A003 STORE 2:4 +FLAGS (\Deleted) + S: * 2 FETCH (FLAGS (\Deleted \Seen)) + S: * 3 FETCH (FLAGS (\Deleted)) + S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen)) + S: A003 OK STORE completed + + +6.4.7. COPY Command + + Arguments: sequence set + mailbox name + + Responses: no specific responses for this command + + Result: OK - copy completed + NO - copy error: can't copy those messages or to that + name + BAD - command unknown or arguments invalid + + + + + + + +Crispin Standards Track [Page 59] + +RFC 3501 IMAPv4 March 2003 + + + The COPY command copies the specified message(s) to the end of the + specified destination mailbox. The flags and internal date of the + message(s) SHOULD be preserved, and the Recent flag SHOULD be set, + in the copy. + + If the destination mailbox does not exist, a server SHOULD return + an error. It SHOULD NOT automatically create the mailbox. Unless + it is certain that the destination mailbox can not be created, the + server MUST send the response code "[TRYCREATE]" as the prefix of + the text of the tagged NO response. This gives a hint to the + client that it can attempt a CREATE command and retry the COPY if + the CREATE is successful. + + If the COPY command is unsuccessful for any reason, server + implementations MUST restore the destination mailbox to its state + before the COPY attempt. + + Example: C: A003 COPY 2:4 MEETING + S: A003 OK COPY completed + + +6.4.8. UID Command + + Arguments: command name + command arguments + + Responses: untagged responses: FETCH, SEARCH + + Result: OK - UID command completed + NO - UID command error + BAD - command unknown or arguments invalid + + The UID command has two forms. In the first form, it takes as its + arguments a COPY, FETCH, or STORE command with arguments + appropriate for the associated command. However, the numbers in + the sequence set argument are unique identifiers instead of + message sequence numbers. Sequence set ranges are permitted, but + there is no guarantee that unique identifiers will be contiguous. + + A non-existent unique identifier is ignored without any error + message generated. Thus, it is possible for a UID FETCH command + to return an OK without any data or a UID COPY or UID STORE to + return an OK without performing any operations. + + In the second form, the UID command takes a SEARCH command with + SEARCH command arguments. The interpretation of the arguments is + the same as with SEARCH; however, the numbers returned in a SEARCH + response for a UID SEARCH command are unique identifiers instead + + + +Crispin Standards Track [Page 60] + +RFC 3501 IMAPv4 March 2003 + + + of message sequence numbers. For example, the command UID SEARCH + 1:100 UID 443:557 returns the unique identifiers corresponding to + the intersection of two sequence sets, the message sequence number + range 1:100 and the UID range 443:557. + + Note: in the above example, the UID range 443:557 + appears. The same comment about a non-existent unique + identifier being ignored without any error message also + applies here. Hence, even if neither UID 443 or 557 + exist, this range is valid and would include an existing + UID 495. + + Also note that a UID range of 559:* always includes the + UID of the last message in the mailbox, even if 559 is + higher than any assigned UID value. This is because the + contents of a range are independent of the order of the + range endpoints. Thus, any UID range with * as one of + the endpoints indicates at least one message (the + message with the highest numbered UID), unless the + mailbox is empty. + + The number after the "*" in an untagged FETCH response is always a + message sequence number, not a unique identifier, even for a UID + command response. However, server implementations MUST implicitly + include the UID message data item as part of any FETCH response + caused by a UID command, regardless of whether a UID was specified + as a message data item to the FETCH. + + + Note: The rule about including the UID message data item as part + of a FETCH response primarily applies to the UID FETCH and UID + STORE commands, including a UID FETCH command that does not + include UID as a message data item. Although it is unlikely that + the other UID commands will cause an untagged FETCH, this rule + applies to these commands as well. + + Example: C: A999 UID FETCH 4827313:4828442 FLAGS + S: * 23 FETCH (FLAGS (\Seen) UID 4827313) + S: * 24 FETCH (FLAGS (\Seen) UID 4827943) + S: * 25 FETCH (FLAGS (\Seen) UID 4828442) + S: A999 OK UID FETCH completed + + + + + + + + + + +Crispin Standards Track [Page 61] + +RFC 3501 IMAPv4 March 2003 + + +6.5. Client Commands - Experimental/Expansion + + +6.5.1. X<atom> Command + + Arguments: implementation defined + + Responses: implementation defined + + Result: OK - command completed + NO - failure + BAD - command unknown or arguments invalid + + Any command prefixed with an X is an experimental command. + Commands which are not part of this specification, a standard or + standards-track revision of this specification, or an + IESG-approved experimental protocol, MUST use the X prefix. + + Any added untagged responses issued by an experimental command + MUST also be prefixed with an X. Server implementations MUST NOT + send any such untagged responses, unless the client requested it + by issuing the associated experimental command. + + Example: C: a441 CAPABILITY + S: * CAPABILITY IMAP4rev1 XPIG-LATIN + S: a441 OK CAPABILITY completed + C: A442 XPIG-LATIN + S: * XPIG-LATIN ow-nay eaking-spay ig-pay atin-lay + S: A442 OK XPIG-LATIN ompleted-cay + +7. Server Responses + + Server responses are in three forms: status responses, server data, + and command continuation request. The information contained in a + server response, identified by "Contents:" in the response + descriptions below, is described by function, not by syntax. The + precise syntax of server responses is described in the Formal Syntax + section. + + The client MUST be prepared to accept any response at all times. + + Status responses can be tagged or untagged. Tagged status responses + indicate the completion result (OK, NO, or BAD status) of a client + command, and have a tag matching the command. + + Some status responses, and all server data, are untagged. An + untagged response is indicated by the token "*" instead of a tag. + Untagged status responses indicate server greeting, or server status + + + +Crispin Standards Track [Page 62] + +RFC 3501 IMAPv4 March 2003 + + + that does not indicate the completion of a command (for example, an + impending system shutdown alert). For historical reasons, untagged + server data responses are also called "unsolicited data", although + strictly speaking, only unilateral server data is truly + "unsolicited". + + Certain server data MUST be recorded by the client when it is + received; this is noted in the description of that data. Such data + conveys critical information which affects the interpretation of all + subsequent commands and responses (e.g., updates reflecting the + creation or destruction of messages). + + Other server data SHOULD be recorded for later reference; if the + client does not need to record the data, or if recording the data has + no obvious purpose (e.g., a SEARCH response when no SEARCH command is + in progress), the data SHOULD be ignored. + + An example of unilateral untagged server data occurs when the IMAP + connection is in the selected state. In the selected state, the + server checks the mailbox for new messages as part of command + execution. Normally, this is part of the execution of every command; + hence, a NOOP command suffices to check for new messages. If new + messages are found, the server sends untagged EXISTS and RECENT + responses reflecting the new size of the mailbox. Server + implementations that offer multiple simultaneous access to the same + mailbox SHOULD also send appropriate unilateral untagged FETCH and + EXPUNGE responses if another agent changes the state of any message + flags or expunges any messages. + + Command continuation request responses use the token "+" instead of a + tag. These responses are sent by the server to indicate acceptance + of an incomplete client command and readiness for the remainder of + the command. + +7.1. Server Responses - Status Responses + + Status responses are OK, NO, BAD, PREAUTH and BYE. OK, NO, and BAD + can be tagged or untagged. PREAUTH and BYE are always untagged. + + Status responses MAY include an OPTIONAL "response code". A response + code consists of data inside square brackets in the form of an atom, + possibly followed by a space and arguments. The response code + contains additional information or status codes for client software + beyond the OK/NO/BAD condition, and are defined when there is a + specific action that a client can take based upon the additional + information. + + + + + +Crispin Standards Track [Page 63] + +RFC 3501 IMAPv4 March 2003 + + + The currently defined response codes are: + + ALERT + + The human-readable text contains a special alert that MUST be + presented to the user in a fashion that calls the user's + attention to the message. + + BADCHARSET + + Optionally followed by a parenthesized list of charsets. A + SEARCH failed because the given charset is not supported by + this implementation. If the optional list of charsets is + given, this lists the charsets that are supported by this + implementation. + + CAPABILITY + + Followed by a list of capabilities. This can appear in the + initial OK or PREAUTH response to transmit an initial + capabilities list. This makes it unnecessary for a client to + send a separate CAPABILITY command if it recognizes this + response. + + PARSE + + The human-readable text represents an error in parsing the + [RFC-2822] header or [MIME-IMB] headers of a message in the + mailbox. + + PERMANENTFLAGS + + Followed by a parenthesized list of flags, indicates which of + the known flags the client can change permanently. Any flags + that are in the FLAGS untagged response, but not the + PERMANENTFLAGS list, can not be set permanently. If the client + attempts to STORE a flag that is not in the PERMANENTFLAGS + list, the server will either ignore the change or store the + state change for the remainder of the current session only. + The PERMANENTFLAGS list can also include the special flag \*, + which indicates that it is possible to create new keywords by + attempting to store those flags in the mailbox. + + + + + + + + + +Crispin Standards Track [Page 64] + +RFC 3501 IMAPv4 March 2003 + + + READ-ONLY + + The mailbox is selected read-only, or its access while selected + has changed from read-write to read-only. + + READ-WRITE + + The mailbox is selected read-write, or its access while + selected has changed from read-only to read-write. + + TRYCREATE + + An APPEND or COPY attempt is failing because the target mailbox + does not exist (as opposed to some other reason). This is a + hint to the client that the operation can succeed if the + mailbox is first created by the CREATE command. + + UIDNEXT + + Followed by a decimal number, indicates the next unique + identifier value. Refer to section 2.3.1.1 for more + information. + + UIDVALIDITY + + Followed by a decimal number, indicates the unique identifier + validity value. Refer to section 2.3.1.1 for more information. + + UNSEEN + + Followed by a decimal number, indicates the number of the first + message without the \Seen flag set. + + Additional response codes defined by particular client or server + implementations SHOULD be prefixed with an "X" until they are + added to a revision of this protocol. Client implementations + SHOULD ignore response codes that they do not recognize. + +7.1.1. OK Response + + Contents: OPTIONAL response code + human-readable text + + The OK response indicates an information message from the server. + When tagged, it indicates successful completion of the associated + command. The human-readable text MAY be presented to the user as + an information message. The untagged form indicates an + + + + +Crispin Standards Track [Page 65] + +RFC 3501 IMAPv4 March 2003 + + + information-only message; the nature of the information MAY be + indicated by a response code. + + The untagged form is also used as one of three possible greetings + at connection startup. It indicates that the connection is not + yet authenticated and that a LOGIN command is needed. + + Example: S: * OK IMAP4rev1 server ready + C: A001 LOGIN fred blurdybloop + S: * OK [ALERT] System shutdown in 10 minutes + S: A001 OK LOGIN Completed + + +7.1.2. NO Response + + Contents: OPTIONAL response code + human-readable text + + The NO response indicates an operational error message from the + server. When tagged, it indicates unsuccessful completion of the + associated command. The untagged form indicates a warning; the + command can still complete successfully. The human-readable text + describes the condition. + + Example: C: A222 COPY 1:2 owatagusiam + S: * NO Disk is 98% full, please delete unnecessary data + S: A222 OK COPY completed + C: A223 COPY 3:200 blurdybloop + S: * NO Disk is 98% full, please delete unnecessary data + S: * NO Disk is 99% full, please delete unnecessary data + S: A223 NO COPY failed: disk is full + + +7.1.3. BAD Response + + Contents: OPTIONAL response code + human-readable text + + The BAD response indicates an error message from the server. When + tagged, it reports a protocol-level error in the client's command; + the tag indicates the command that caused the error. The untagged + form indicates a protocol-level error for which the associated + command can not be determined; it can also indicate an internal + server failure. The human-readable text describes the condition. + + + + + + + +Crispin Standards Track [Page 66] + +RFC 3501 IMAPv4 March 2003 + + + Example: C: ...very long command line... + S: * BAD Command line too long + C: ...empty line... + S: * BAD Empty command line + C: A443 EXPUNGE + S: * BAD Disk crash, attempting salvage to a new disk! + S: * OK Salvage successful, no data lost + S: A443 OK Expunge completed + + +7.1.4. PREAUTH Response + + Contents: OPTIONAL response code + human-readable text + + The PREAUTH response is always untagged, and is one of three + possible greetings at connection startup. It indicates that the + connection has already been authenticated by external means; thus + no LOGIN command is needed. + + Example: S: * PREAUTH IMAP4rev1 server logged in as Smith + + +7.1.5. BYE Response + + Contents: OPTIONAL response code + human-readable text + + The BYE response is always untagged, and indicates that the server + is about to close the connection. The human-readable text MAY be + displayed to the user in a status report by the client. The BYE + response is sent under one of four conditions: + + 1) as part of a normal logout sequence. The server will close + the connection after sending the tagged OK response to the + LOGOUT command. + + 2) as a panic shutdown announcement. The server closes the + connection immediately. + + 3) as an announcement of an inactivity autologout. The server + closes the connection immediately. + + 4) as one of three possible greetings at connection startup, + indicating that the server is not willing to accept a + connection from this client. The server closes the + connection immediately. + + + + +Crispin Standards Track [Page 67] + +RFC 3501 IMAPv4 March 2003 + + + The difference between a BYE that occurs as part of a normal + LOGOUT sequence (the first case) and a BYE that occurs because of + a failure (the other three cases) is that the connection closes + immediately in the failure case. In all cases the client SHOULD + continue to read response data from the server until the + connection is closed; this will ensure that any pending untagged + or completion responses are read and processed. + + Example: S: * BYE Autologout; idle for too long + +7.2. Server Responses - Server and Mailbox Status + + These responses are always untagged. This is how server and mailbox + status data are transmitted from the server to the client. Many of + these responses typically result from a command with the same name. + +7.2.1. CAPABILITY Response + + Contents: capability listing + + The CAPABILITY response occurs as a result of a CAPABILITY + command. The capability listing contains a space-separated + listing of capability names that the server supports. The + capability listing MUST include the atom "IMAP4rev1". + + In addition, client and server implementations MUST implement the + STARTTLS, LOGINDISABLED, and AUTH=PLAIN (described in [IMAP-TLS]) + capabilities. See the Security Considerations section for + important information. + + A capability name which begins with "AUTH=" indicates that the + server supports that particular authentication mechanism. + + The LOGINDISABLED capability indicates that the LOGIN command is + disabled, and that the server will respond with a tagged NO + response to any attempt to use the LOGIN command even if the user + name and password are valid. An IMAP client MUST NOT issue the + LOGIN command if the server advertises the LOGINDISABLED + capability. + + Other capability names indicate that the server supports an + extension, revision, or amendment to the IMAP4rev1 protocol. + Server responses MUST conform to this document until the client + issues a command that uses the associated capability. + + Capability names MUST either begin with "X" or be standard or + standards-track IMAP4rev1 extensions, revisions, or amendments + registered with IANA. A server MUST NOT offer unregistered or + + + +Crispin Standards Track [Page 68] + +RFC 3501 IMAPv4 March 2003 + + + non-standard capability names, unless such names are prefixed with + an "X". + + Client implementations SHOULD NOT require any capability name + other than "IMAP4rev1", and MUST ignore any unknown capability + names. + + A server MAY send capabilities automatically, by using the + CAPABILITY response code in the initial PREAUTH or OK responses, + and by sending an updated CAPABILITY response code in the tagged + OK response as part of a successful authentication. It is + unnecessary for a client to send a separate CAPABILITY command if + it recognizes these automatic capabilities. + + Example: S: * CAPABILITY IMAP4rev1 STARTTLS AUTH=GSSAPI XPIG-LATIN + + +7.2.2. LIST Response + + Contents: name attributes + hierarchy delimiter + name + + The LIST response occurs as a result of a LIST command. It + returns a single name that matches the LIST specification. There + can be multiple LIST responses for a single LIST command. + + Four name attributes are defined: + + \Noinferiors + It is not possible for any child levels of hierarchy to exist + under this name; no child levels exist now and none can be + created in the future. + + \Noselect + It is not possible to use this name as a selectable mailbox. + + \Marked + The mailbox has been marked "interesting" by the server; the + mailbox probably contains messages that have been added since + the last time the mailbox was selected. + + \Unmarked + The mailbox does not contain any additional messages since the + last time the mailbox was selected. + + + + + + +Crispin Standards Track [Page 69] + +RFC 3501 IMAPv4 March 2003 + + + If it is not feasible for the server to determine whether or not + the mailbox is "interesting", or if the name is a \Noselect name, + the server SHOULD NOT send either \Marked or \Unmarked. + + The hierarchy delimiter is a character used to delimit levels of + hierarchy in a mailbox name. A client can use it to create child + mailboxes, and to search higher or lower levels of naming + hierarchy. All children of a top-level hierarchy node MUST use + the same separator character. A NIL hierarchy delimiter means + that no hierarchy exists; the name is a "flat" name. + + The name represents an unambiguous left-to-right hierarchy, and + MUST be valid for use as a reference in LIST and LSUB commands. + Unless \Noselect is indicated, the name MUST also be valid as an + argument for commands, such as SELECT, that accept mailbox names. + + Example: S: * LIST (\Noselect) "/" ~/Mail/foo + + +7.2.3. LSUB Response + + Contents: name attributes + hierarchy delimiter + name + + The LSUB response occurs as a result of an LSUB command. It + returns a single name that matches the LSUB specification. There + can be multiple LSUB responses for a single LSUB command. The + data is identical in format to the LIST response. + + Example: S: * LSUB () "." #news.comp.mail.misc + + +7.2.4 STATUS Response + + Contents: name + status parenthesized list + + The STATUS response occurs as a result of an STATUS command. It + returns the mailbox name that matches the STATUS specification and + the requested mailbox status information. + + Example: S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) + + + + + + + + +Crispin Standards Track [Page 70] + +RFC 3501 IMAPv4 March 2003 + + +7.2.5. SEARCH Response + + Contents: zero or more numbers + + The SEARCH response occurs as a result of a SEARCH or UID SEARCH + command. The number(s) refer to those messages that match the + search criteria. For SEARCH, these are message sequence numbers; + for UID SEARCH, these are unique identifiers. Each number is + delimited by a space. + + Example: S: * SEARCH 2 3 6 + + +7.2.6. FLAGS Response + + Contents: flag parenthesized list + + The FLAGS response occurs as a result of a SELECT or EXAMINE + command. The flag parenthesized list identifies the flags (at a + minimum, the system-defined flags) that are applicable for this + mailbox. Flags other than the system flags can also exist, + depending on server implementation. + + The update from the FLAGS response MUST be recorded by the client. + + Example: S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) + + +7.3. Server Responses - Mailbox Size + + These responses are always untagged. This is how changes in the size + of the mailbox are transmitted from the server to the client. + Immediately following the "*" token is a number that represents a + message count. + +7.3.1. EXISTS Response + + Contents: none + + The EXISTS response reports the number of messages in the mailbox. + This response occurs as a result of a SELECT or EXAMINE command, + and if the size of the mailbox changes (e.g., new messages). + + The update from the EXISTS response MUST be recorded by the + client. + + Example: S: * 23 EXISTS + + + + +Crispin Standards Track [Page 71] + +RFC 3501 IMAPv4 March 2003 + + +7.3.2. RECENT Response + + Contents: none + + The RECENT response reports the number of messages with the + \Recent flag set. This response occurs as a result of a SELECT or + EXAMINE command, and if the size of the mailbox changes (e.g., new + messages). + + Note: It is not guaranteed that the message sequence + numbers of recent messages will be a contiguous range of + the highest n messages in the mailbox (where n is the + value reported by the RECENT response). Examples of + situations in which this is not the case are: multiple + clients having the same mailbox open (the first session + to be notified will see it as recent, others will + probably see it as non-recent), and when the mailbox is + re-ordered by a non-IMAP agent. + + The only reliable way to identify recent messages is to + look at message flags to see which have the \Recent flag + set, or to do a SEARCH RECENT. + + The update from the RECENT response MUST be recorded by the + client. + + Example: S: * 5 RECENT + + +7.4. Server Responses - Message Status + + These responses are always untagged. This is how message data are + transmitted from the server to the client, often as a result of a + command with the same name. Immediately following the "*" token is a + number that represents a message sequence number. + +7.4.1. EXPUNGE Response + + Contents: none + + The EXPUNGE response reports that the specified message sequence + number has been permanently removed from the mailbox. The message + sequence number for each successive message in the mailbox is + immediately decremented by 1, and this decrement is reflected in + message sequence numbers in subsequent responses (including other + untagged EXPUNGE responses). + + + + + +Crispin Standards Track [Page 72] + +RFC 3501 IMAPv4 March 2003 + + + The EXPUNGE response also decrements the number of messages in the + mailbox; it is not necessary to send an EXISTS response with the + new value. + + As a result of the immediate decrement rule, message sequence + numbers that appear in a set of successive EXPUNGE responses + depend upon whether the messages are removed starting from lower + numbers to higher numbers, or from higher numbers to lower + numbers. For example, if the last 5 messages in a 9-message + mailbox are expunged, a "lower to higher" server will send five + untagged EXPUNGE responses for message sequence number 5, whereas + a "higher to lower server" will send successive untagged EXPUNGE + responses for message sequence numbers 9, 8, 7, 6, and 5. + + An EXPUNGE response MUST NOT be sent when no command is in + progress, nor while responding to a FETCH, STORE, or SEARCH + command. This rule is necessary to prevent a loss of + synchronization of message sequence numbers between client and + server. A command is not "in progress" until the complete command + has been received; in particular, a command is not "in progress" + during the negotiation of command continuation. + + Note: UID FETCH, UID STORE, and UID SEARCH are different + commands from FETCH, STORE, and SEARCH. An EXPUNGE + response MAY be sent during a UID command. + + The update from the EXPUNGE response MUST be recorded by the + client. + + Example: S: * 44 EXPUNGE + + +7.4.2. FETCH Response + + Contents: message data + + The FETCH response returns data about a message to the client. + The data are pairs of data item names and their values in + parentheses. This response occurs as the result of a FETCH or + STORE command, as well as by unilateral server decision (e.g., + flag updates). + + The current data items are: + + BODY + A form of BODYSTRUCTURE without extension data. + + + + + +Crispin Standards Track [Page 73] + +RFC 3501 IMAPv4 March 2003 + + + BODY[<section>]<<origin octet>> + A string expressing the body contents of the specified section. + The string SHOULD be interpreted by the client according to the + content transfer encoding, body type, and subtype. + + If the origin octet is specified, this string is a substring of + the entire body contents, starting at that origin octet. This + means that BODY[]<0> MAY be truncated, but BODY[] is NEVER + truncated. + + Note: The origin octet facility MUST NOT be used by a server + in a FETCH response unless the client specifically requested + it by means of a FETCH of a BODY[<section>]<<partial>> data + item. + + 8-bit textual data is permitted if a [CHARSET] identifier is + part of the body parameter parenthesized list for this section. + Note that headers (part specifiers HEADER or MIME, or the + header portion of a MESSAGE/RFC822 part), MUST be 7-bit; 8-bit + characters are not permitted in headers. Note also that the + [RFC-2822] delimiting blank line between the header and the + body is not affected by header line subsetting; the blank line + is always included as part of header data, except in the case + of a message which has no body and no blank line. + + Non-textual data such as binary data MUST be transfer encoded + into a textual form, such as BASE64, prior to being sent to the + client. To derive the original binary data, the client MUST + decode the transfer encoded string. + + BODYSTRUCTURE + A parenthesized list that describes the [MIME-IMB] body + structure of a message. This is computed by the server by + parsing the [MIME-IMB] header fields, defaulting various fields + as necessary. + + For example, a simple text message of 48 lines and 2279 octets + can have a body structure of: ("TEXT" "PLAIN" ("CHARSET" + "US-ASCII") NIL NIL "7BIT" 2279 48) + + Multiple parts are indicated by parenthesis nesting. Instead + of a body type as the first element of the parenthesized list, + there is a sequence of one or more nested body structures. The + second element of the parenthesized list is the multipart + subtype (mixed, digest, parallel, alternative, etc.). + + + + + + +Crispin Standards Track [Page 74] + +RFC 3501 IMAPv4 March 2003 + + + For example, a two part message consisting of a text and a + BASE64-encoded text attachment can have a body structure of: + (("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 1152 + 23)("TEXT" "PLAIN" ("CHARSET" "US-ASCII" "NAME" "cc.diff") + "<960723163407.20117h@cac.washington.edu>" "Compiler diff" + "BASE64" 4554 73) "MIXED") + + Extension data follows the multipart subtype. Extension data + is never returned with the BODY fetch, but can be returned with + a BODYSTRUCTURE fetch. Extension data, if present, MUST be in + the defined order. The extension data of a multipart body part + are in the following order: + + body parameter parenthesized list + A parenthesized list of attribute/value pairs [e.g., ("foo" + "bar" "baz" "rag") where "bar" is the value of "foo", and + "rag" is the value of "baz"] as defined in [MIME-IMB]. + + body disposition + A parenthesized list, consisting of a disposition type + string, followed by a parenthesized list of disposition + attribute/value pairs as defined in [DISPOSITION]. + + body language + A string or parenthesized list giving the body language + value as defined in [LANGUAGE-TAGS]. + + body location + A string list giving the body content URI as defined in + [LOCATION]. + + Any following extension data are not yet defined in this + version of the protocol. Such extension data can consist of + zero or more NILs, strings, numbers, or potentially nested + parenthesized lists of such data. Client implementations that + do a BODYSTRUCTURE fetch MUST be prepared to accept such + extension data. Server implementations MUST NOT send such + extension data until it has been defined by a revision of this + protocol. + + The basic fields of a non-multipart body part are in the + following order: + + body type + A string giving the content media type name as defined in + [MIME-IMB]. + + + + + +Crispin Standards Track [Page 75] + +RFC 3501 IMAPv4 March 2003 + + + body subtype + A string giving the content subtype name as defined in + [MIME-IMB]. + + body parameter parenthesized list + A parenthesized list of attribute/value pairs [e.g., ("foo" + "bar" "baz" "rag") where "bar" is the value of "foo" and + "rag" is the value of "baz"] as defined in [MIME-IMB]. + + body id + A string giving the content id as defined in [MIME-IMB]. + + body description + A string giving the content description as defined in + [MIME-IMB]. + + body encoding + A string giving the content transfer encoding as defined in + [MIME-IMB]. + + body size + A number giving the size of the body in octets. Note that + this size is the size in its transfer encoding and not the + resulting size after any decoding. + + A body type of type MESSAGE and subtype RFC822 contains, + immediately after the basic fields, the envelope structure, + body structure, and size in text lines of the encapsulated + message. + + A body type of type TEXT contains, immediately after the basic + fields, the size of the body in text lines. Note that this + size is the size in its content transfer encoding and not the + resulting size after any decoding. + + Extension data follows the basic fields and the type-specific + fields listed above. Extension data is never returned with the + BODY fetch, but can be returned with a BODYSTRUCTURE fetch. + Extension data, if present, MUST be in the defined order. + + The extension data of a non-multipart body part are in the + following order: + + body MD5 + A string giving the body MD5 value as defined in [MD5]. + + + + + + +Crispin Standards Track [Page 76] + +RFC 3501 IMAPv4 March 2003 + + + body disposition + A parenthesized list with the same content and function as + the body disposition for a multipart body part. + + body language + A string or parenthesized list giving the body language + value as defined in [LANGUAGE-TAGS]. + + body location + A string list giving the body content URI as defined in + [LOCATION]. + + Any following extension data are not yet defined in this + version of the protocol, and would be as described above under + multipart extension data. + + ENVELOPE + A parenthesized list that describes the envelope structure of a + message. This is computed by the server by parsing the + [RFC-2822] header into the component parts, defaulting various + fields as necessary. + + The fields of the envelope structure are in the following + order: date, subject, from, sender, reply-to, to, cc, bcc, + in-reply-to, and message-id. The date, subject, in-reply-to, + and message-id fields are strings. The from, sender, reply-to, + to, cc, and bcc fields are parenthesized lists of address + structures. + + An address structure is a parenthesized list that describes an + electronic mail address. The fields of an address structure + are in the following order: personal name, [SMTP] + at-domain-list (source route), mailbox name, and host name. + + [RFC-2822] group syntax is indicated by a special form of + address structure in which the host name field is NIL. If the + mailbox name field is also NIL, this is an end of group marker + (semi-colon in RFC 822 syntax). If the mailbox name field is + non-NIL, this is a start of group marker, and the mailbox name + field holds the group name phrase. + + If the Date, Subject, In-Reply-To, and Message-ID header lines + are absent in the [RFC-2822] header, the corresponding member + of the envelope is NIL; if these header lines are present but + empty the corresponding member of the envelope is the empty + string. + + + + + +Crispin Standards Track [Page 77] + +RFC 3501 IMAPv4 March 2003 + + + Note: some servers may return a NIL envelope member in the + "present but empty" case. Clients SHOULD treat NIL and + empty string as identical. + + Note: [RFC-2822] requires that all messages have a valid + Date header. Therefore, the date member in the envelope can + not be NIL or the empty string. + + Note: [RFC-2822] requires that the In-Reply-To and + Message-ID headers, if present, have non-empty content. + Therefore, the in-reply-to and message-id members in the + envelope can not be the empty string. + + If the From, To, cc, and bcc header lines are absent in the + [RFC-2822] header, or are present but empty, the corresponding + member of the envelope is NIL. + + If the Sender or Reply-To lines are absent in the [RFC-2822] + header, or are present but empty, the server sets the + corresponding member of the envelope to be the same value as + the from member (the client is not expected to know to do + this). + + Note: [RFC-2822] requires that all messages have a valid + From header. Therefore, the from, sender, and reply-to + members in the envelope can not be NIL. + + FLAGS + A parenthesized list of flags that are set for this message. + + INTERNALDATE + A string representing the internal date of the message. + + RFC822 + Equivalent to BODY[]. + + RFC822.HEADER + Equivalent to BODY[HEADER]. Note that this did not result in + \Seen being set, because RFC822.HEADER response data occurs as + a result of a FETCH of RFC822.HEADER. BODY[HEADER] response + data occurs as a result of a FETCH of BODY[HEADER] (which sets + \Seen) or BODY.PEEK[HEADER] (which does not set \Seen). + + RFC822.SIZE + A number expressing the [RFC-2822] size of the message. + + + + + + +Crispin Standards Track [Page 78] + +RFC 3501 IMAPv4 March 2003 + + + RFC822.TEXT + Equivalent to BODY[TEXT]. + + UID + A number expressing the unique identifier of the message. + + + Example: S: * 23 FETCH (FLAGS (\Seen) RFC822.SIZE 44827) + + +7.5. Server Responses - Command Continuation Request + + The command continuation request response is indicated by a "+" token + instead of a tag. This form of response indicates that the server is + ready to accept the continuation of a command from the client. The + remainder of this response is a line of text. + + This response is used in the AUTHENTICATE command to transmit server + data to the client, and request additional client data. This + response is also used if an argument to any command is a literal. + + The client is not permitted to send the octets of the literal unless + the server indicates that it is expected. This permits the server to + process commands and reject errors on a line-by-line basis. The + remainder of the command, including the CRLF that terminates a + command, follows the octets of the literal. If there are any + additional command arguments, the literal octets are followed by a + space and those arguments. + + Example: C: A001 LOGIN {11} + S: + Ready for additional command text + C: FRED FOOBAR {7} + S: + Ready for additional command text + C: fat man + S: A001 OK LOGIN completed + C: A044 BLURDYBLOOP {102856} + S: A044 BAD No such command as "BLURDYBLOOP" + + + + + + + + + + + + + + +Crispin Standards Track [Page 79] + +RFC 3501 IMAPv4 March 2003 + + +8. Sample IMAP4rev1 connection + + The following is a transcript of an IMAP4rev1 connection. A long + line in this sample is broken for editorial clarity. + +S: * OK IMAP4rev1 Service Ready +C: a001 login mrc secret +S: a001 OK LOGIN completed +C: a002 select inbox +S: * 18 EXISTS +S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) +S: * 2 RECENT +S: * OK [UNSEEN 17] Message 17 is the first unseen message +S: * OK [UIDVALIDITY 3857529045] UIDs valid +S: a002 OK [READ-WRITE] SELECT completed +C: a003 fetch 12 full +S: * 12 FETCH (FLAGS (\Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700" + RFC822.SIZE 4286 ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)" + "IMAP4rev1 WG mtg summary and minutes" + (("Terry Gray" NIL "gray" "cac.washington.edu")) + (("Terry Gray" NIL "gray" "cac.washington.edu")) + (("Terry Gray" NIL "gray" "cac.washington.edu")) + ((NIL NIL "imap" "cac.washington.edu")) + ((NIL NIL "minutes" "CNRI.Reston.VA.US") + ("John Klensin" NIL "KLENSIN" "MIT.EDU")) NIL NIL + "<B27397-0100000@cac.washington.edu>") + BODY ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 3028 + 92)) +S: a003 OK FETCH completed +C: a004 fetch 12 body[header] +S: * 12 FETCH (BODY[HEADER] {342} +S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT) +S: From: Terry Gray <gray@cac.washington.edu> +S: Subject: IMAP4rev1 WG mtg summary and minutes +S: To: imap@cac.washington.edu +S: cc: minutes@CNRI.Reston.VA.US, John Klensin <KLENSIN@MIT.EDU> +S: Message-Id: <B27397-0100000@cac.washington.edu> +S: MIME-Version: 1.0 +S: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII +S: +S: ) +S: a004 OK FETCH completed +C: a005 store 12 +flags \deleted +S: * 12 FETCH (FLAGS (\Seen \Deleted)) +S: a005 OK +FLAGS completed +C: a006 logout +S: * BYE IMAP4rev1 server terminating connection +S: a006 OK LOGOUT completed + + + +Crispin Standards Track [Page 80] + +RFC 3501 IMAPv4 March 2003 + + +9. Formal Syntax + + The following syntax specification uses the Augmented Backus-Naur + Form (ABNF) notation as specified in [ABNF]. + + In the case of alternative or optional rules in which a later rule + overlaps an earlier rule, the rule which is listed earlier MUST take + priority. For example, "\Seen" when parsed as a flag is the \Seen + flag name and not a flag-extension, even though "\Seen" can be parsed + as a flag-extension. Some, but not all, instances of this rule are + noted below. + + Note: [ABNF] rules MUST be followed strictly; in + particular: + + (1) Except as noted otherwise, all alphabetic characters + are case-insensitive. The use of upper or lower case + characters to define token strings is for editorial clarity + only. Implementations MUST accept these strings in a + case-insensitive fashion. + + (2) In all cases, SP refers to exactly one space. It is + NOT permitted to substitute TAB, insert additional spaces, + or otherwise treat SP as being equivalent to LWSP. + + (3) The ASCII NUL character, %x00, MUST NOT be used at any + time. + +address = "(" addr-name SP addr-adl SP addr-mailbox SP + addr-host ")" + +addr-adl = nstring + ; Holds route from [RFC-2822] route-addr if + ; non-NIL + +addr-host = nstring + ; NIL indicates [RFC-2822] group syntax. + ; Otherwise, holds [RFC-2822] domain name + +addr-mailbox = nstring + ; NIL indicates end of [RFC-2822] group; if + ; non-NIL and addr-host is NIL, holds + ; [RFC-2822] group name. + ; Otherwise, holds [RFC-2822] local-part + ; after removing [RFC-2822] quoting + + + + + + +Crispin Standards Track [Page 81] + +RFC 3501 IMAPv4 March 2003 + + +addr-name = nstring + ; If non-NIL, holds phrase from [RFC-2822] + ; mailbox after removing [RFC-2822] quoting + +append = "APPEND" SP mailbox [SP flag-list] [SP date-time] SP + literal + +astring = 1*ASTRING-CHAR / string + +ASTRING-CHAR = ATOM-CHAR / resp-specials + +atom = 1*ATOM-CHAR + +ATOM-CHAR = <any CHAR except atom-specials> + +atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards / + quoted-specials / resp-specials + +authenticate = "AUTHENTICATE" SP auth-type *(CRLF base64) + +auth-type = atom + ; Defined by [SASL] + +base64 = *(4base64-char) [base64-terminal] + +base64-char = ALPHA / DIGIT / "+" / "/" + ; Case-sensitive + +base64-terminal = (2base64-char "==") / (3base64-char "=") + +body = "(" (body-type-1part / body-type-mpart) ")" + +body-extension = nstring / number / + "(" body-extension *(SP body-extension) ")" + ; Future expansion. Client implementations + ; MUST accept body-extension fields. Server + ; implementations MUST NOT generate + ; body-extension fields except as defined by + ; future standard or standards-track + ; revisions of this specification. + +body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang + [SP body-fld-loc *(SP body-extension)]]] + ; MUST NOT be returned on non-extensible + ; "BODY" fetch + + + + + + +Crispin Standards Track [Page 82] + +RFC 3501 IMAPv4 March 2003 + + +body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang + [SP body-fld-loc *(SP body-extension)]]] + ; MUST NOT be returned on non-extensible + ; "BODY" fetch + +body-fields = body-fld-param SP body-fld-id SP body-fld-desc SP + body-fld-enc SP body-fld-octets + +body-fld-desc = nstring + +body-fld-dsp = "(" string SP body-fld-param ")" / nil + +body-fld-enc = (DQUOTE ("7BIT" / "8BIT" / "BINARY" / "BASE64"/ + "QUOTED-PRINTABLE") DQUOTE) / string + +body-fld-id = nstring + +body-fld-lang = nstring / "(" string *(SP string) ")" + +body-fld-loc = nstring + +body-fld-lines = number + +body-fld-md5 = nstring + +body-fld-octets = number + +body-fld-param = "(" string SP string *(SP string SP string) ")" / nil + +body-type-1part = (body-type-basic / body-type-msg / body-type-text) + [SP body-ext-1part] + +body-type-basic = media-basic SP body-fields + ; MESSAGE subtype MUST NOT be "RFC822" + +body-type-mpart = 1*body SP media-subtype + [SP body-ext-mpart] + +body-type-msg = media-message SP body-fields SP envelope + SP body SP body-fld-lines + +body-type-text = media-text SP body-fields SP body-fld-lines + +capability = ("AUTH=" auth-type) / atom + ; New capabilities MUST begin with "X" or be + ; registered with IANA as standard or + ; standards-track + + + + +Crispin Standards Track [Page 83] + +RFC 3501 IMAPv4 March 2003 + + +capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev1" + *(SP capability) + ; Servers MUST implement the STARTTLS, AUTH=PLAIN, + ; and LOGINDISABLED capabilities + ; Servers which offer RFC 1730 compatibility MUST + ; list "IMAP4" as the first capability. + +CHAR8 = %x01-ff + ; any OCTET except NUL, %x00 + +command = tag SP (command-any / command-auth / command-nonauth / + command-select) CRLF + ; Modal based on state + +command-any = "CAPABILITY" / "LOGOUT" / "NOOP" / x-command + ; Valid in all states + +command-auth = append / create / delete / examine / list / lsub / + rename / select / status / subscribe / unsubscribe + ; Valid only in Authenticated or Selected state + +command-nonauth = login / authenticate / "STARTTLS" + ; Valid only when in Not Authenticated state + +command-select = "CHECK" / "CLOSE" / "EXPUNGE" / copy / fetch / store / + uid / search + ; Valid only when in Selected state + +continue-req = "+" SP (resp-text / base64) CRLF + +copy = "COPY" SP sequence-set SP mailbox + +create = "CREATE" SP mailbox + ; Use of INBOX gives a NO error + +date = date-text / DQUOTE date-text DQUOTE + +date-day = 1*2DIGIT + ; Day of month + +date-day-fixed = (SP DIGIT) / 2DIGIT + ; Fixed-format version of date-day + +date-month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / + "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec" + +date-text = date-day "-" date-month "-" date-year + + + + +Crispin Standards Track [Page 84] + +RFC 3501 IMAPv4 March 2003 + + +date-year = 4DIGIT + +date-time = DQUOTE date-day-fixed "-" date-month "-" date-year + SP time SP zone DQUOTE + +delete = "DELETE" SP mailbox + ; Use of INBOX gives a NO error + +digit-nz = %x31-39 + ; 1-9 + +envelope = "(" env-date SP env-subject SP env-from SP + env-sender SP env-reply-to SP env-to SP env-cc SP + env-bcc SP env-in-reply-to SP env-message-id ")" + +env-bcc = "(" 1*address ")" / nil + +env-cc = "(" 1*address ")" / nil + +env-date = nstring + +env-from = "(" 1*address ")" / nil + +env-in-reply-to = nstring + +env-message-id = nstring + +env-reply-to = "(" 1*address ")" / nil + +env-sender = "(" 1*address ")" / nil + +env-subject = nstring + +env-to = "(" 1*address ")" / nil + +examine = "EXAMINE" SP mailbox + +fetch = "FETCH" SP sequence-set SP ("ALL" / "FULL" / "FAST" / + fetch-att / "(" fetch-att *(SP fetch-att) ")") + +fetch-att = "ENVELOPE" / "FLAGS" / "INTERNALDATE" / + "RFC822" [".HEADER" / ".SIZE" / ".TEXT"] / + "BODY" ["STRUCTURE"] / "UID" / + "BODY" section ["<" number "." nz-number ">"] / + "BODY.PEEK" section ["<" number "." nz-number ">"] + + + + + + +Crispin Standards Track [Page 85] + +RFC 3501 IMAPv4 March 2003 + + +flag = "\Answered" / "\Flagged" / "\Deleted" / + "\Seen" / "\Draft" / flag-keyword / flag-extension + ; Does not include "\Recent" + +flag-extension = "\" atom + ; Future expansion. Client implementations + ; MUST accept flag-extension flags. Server + ; implementations MUST NOT generate + ; flag-extension flags except as defined by + ; future standard or standards-track + ; revisions of this specification. + +flag-fetch = flag / "\Recent" + +flag-keyword = atom + +flag-list = "(" [flag *(SP flag)] ")" + +flag-perm = flag / "\*" + +greeting = "*" SP (resp-cond-auth / resp-cond-bye) CRLF + +header-fld-name = astring + +header-list = "(" header-fld-name *(SP header-fld-name) ")" + +list = "LIST" SP mailbox SP list-mailbox + +list-mailbox = 1*list-char / string + +list-char = ATOM-CHAR / list-wildcards / resp-specials + +list-wildcards = "%" / "*" + +literal = "{" number "}" CRLF *CHAR8 + ; Number represents the number of CHAR8s + +login = "LOGIN" SP userid SP password + +lsub = "LSUB" SP mailbox SP list-mailbox + + + + + + + + + + + +Crispin Standards Track [Page 86] + +RFC 3501 IMAPv4 March 2003 + + +mailbox = "INBOX" / astring + ; INBOX is case-insensitive. All case variants of + ; INBOX (e.g., "iNbOx") MUST be interpreted as INBOX + ; not as an astring. An astring which consists of + ; the case-insensitive sequence "I" "N" "B" "O" "X" + ; is considered to be INBOX and not an astring. + ; Refer to section 5.1 for further + ; semantic details of mailbox names. + +mailbox-data = "FLAGS" SP flag-list / "LIST" SP mailbox-list / + "LSUB" SP mailbox-list / "SEARCH" *(SP nz-number) / + "STATUS" SP mailbox SP "(" [status-att-list] ")" / + number SP "EXISTS" / number SP "RECENT" + +mailbox-list = "(" [mbx-list-flags] ")" SP + (DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox + +mbx-list-flags = *(mbx-list-oflag SP) mbx-list-sflag + *(SP mbx-list-oflag) / + mbx-list-oflag *(SP mbx-list-oflag) + +mbx-list-oflag = "\Noinferiors" / flag-extension + ; Other flags; multiple possible per LIST response + +mbx-list-sflag = "\Noselect" / "\Marked" / "\Unmarked" + ; Selectability flags; only one per LIST response + +media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / + "MESSAGE" / "VIDEO") DQUOTE) / string) SP + media-subtype + ; Defined in [MIME-IMT] + +media-message = DQUOTE "MESSAGE" DQUOTE SP DQUOTE "RFC822" DQUOTE + ; Defined in [MIME-IMT] + +media-subtype = string + ; Defined in [MIME-IMT] + +media-text = DQUOTE "TEXT" DQUOTE SP media-subtype + ; Defined in [MIME-IMT] + +message-data = nz-number SP ("EXPUNGE" / ("FETCH" SP msg-att)) + +msg-att = "(" (msg-att-dynamic / msg-att-static) + *(SP (msg-att-dynamic / msg-att-static)) ")" + +msg-att-dynamic = "FLAGS" SP "(" [flag-fetch *(SP flag-fetch)] ")" + ; MAY change for a message + + + +Crispin Standards Track [Page 87] + +RFC 3501 IMAPv4 March 2003 + + +msg-att-static = "ENVELOPE" SP envelope / "INTERNALDATE" SP date-time / + "RFC822" [".HEADER" / ".TEXT"] SP nstring / + "RFC822.SIZE" SP number / + "BODY" ["STRUCTURE"] SP body / + "BODY" section ["<" number ">"] SP nstring / + "UID" SP uniqueid + ; MUST NOT change for a message + +nil = "NIL" + +nstring = string / nil + +number = 1*DIGIT + ; Unsigned 32-bit integer + ; (0 <= n < 4,294,967,296) + +nz-number = digit-nz *DIGIT + ; Non-zero unsigned 32-bit integer + ; (0 < n < 4,294,967,296) + +password = astring + +quoted = DQUOTE *QUOTED-CHAR DQUOTE + +QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> / + "\" quoted-specials + +quoted-specials = DQUOTE / "\" + +rename = "RENAME" SP mailbox SP mailbox + ; Use of INBOX as a destination gives a NO error + +response = *(continue-req / response-data) response-done + +response-data = "*" SP (resp-cond-state / resp-cond-bye / + mailbox-data / message-data / capability-data) CRLF + +response-done = response-tagged / response-fatal + +response-fatal = "*" SP resp-cond-bye CRLF + ; Server closes connection immediately + +response-tagged = tag SP resp-cond-state CRLF + +resp-cond-auth = ("OK" / "PREAUTH") SP resp-text + ; Authentication condition + + + + + +Crispin Standards Track [Page 88] + +RFC 3501 IMAPv4 March 2003 + + +resp-cond-bye = "BYE" SP resp-text + +resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text + ; Status condition + +resp-specials = "]" + +resp-text = ["[" resp-text-code "]" SP] text + +resp-text-code = "ALERT" / + "BADCHARSET" [SP "(" astring *(SP astring) ")" ] / + capability-data / "PARSE" / + "PERMANENTFLAGS" SP "(" + [flag-perm *(SP flag-perm)] ")" / + "READ-ONLY" / "READ-WRITE" / "TRYCREATE" / + "UIDNEXT" SP nz-number / "UIDVALIDITY" SP nz-number / + "UNSEEN" SP nz-number / + atom [SP 1*<any TEXT-CHAR except "]">] + +search = "SEARCH" [SP "CHARSET" SP astring] 1*(SP search-key) + ; CHARSET argument to MUST be registered with IANA + +search-key = "ALL" / "ANSWERED" / "BCC" SP astring / + "BEFORE" SP date / "BODY" SP astring / + "CC" SP astring / "DELETED" / "FLAGGED" / + "FROM" SP astring / "KEYWORD" SP flag-keyword / + "NEW" / "OLD" / "ON" SP date / "RECENT" / "SEEN" / + "SINCE" SP date / "SUBJECT" SP astring / + "TEXT" SP astring / "TO" SP astring / + "UNANSWERED" / "UNDELETED" / "UNFLAGGED" / + "UNKEYWORD" SP flag-keyword / "UNSEEN" / + ; Above this line were in [IMAP2] + "DRAFT" / "HEADER" SP header-fld-name SP astring / + "LARGER" SP number / "NOT" SP search-key / + "OR" SP search-key SP search-key / + "SENTBEFORE" SP date / "SENTON" SP date / + "SENTSINCE" SP date / "SMALLER" SP number / + "UID" SP sequence-set / "UNDRAFT" / sequence-set / + "(" search-key *(SP search-key) ")" + +section = "[" [section-spec] "]" + +section-msgtext = "HEADER" / "HEADER.FIELDS" [".NOT"] SP header-list / + "TEXT" + ; top-level or MESSAGE/RFC822 part + +section-part = nz-number *("." nz-number) + ; body part nesting + + + +Crispin Standards Track [Page 89] + +RFC 3501 IMAPv4 March 2003 + + +section-spec = section-msgtext / (section-part ["." section-text]) + +section-text = section-msgtext / "MIME" + ; text other than actual body part (headers, etc.) + +select = "SELECT" SP mailbox + +seq-number = nz-number / "*" + ; message sequence number (COPY, FETCH, STORE + ; commands) or unique identifier (UID COPY, + ; UID FETCH, UID STORE commands). + ; * represents the largest number in use. In + ; the case of message sequence numbers, it is + ; the number of messages in a non-empty mailbox. + ; In the case of unique identifiers, it is the + ; unique identifier of the last message in the + ; mailbox or, if the mailbox is empty, the + ; mailbox's current UIDNEXT value. + ; The server should respond with a tagged BAD + ; response to a command that uses a message + ; sequence number greater than the number of + ; messages in the selected mailbox. This + ; includes "*" if the selected mailbox is empty. + +seq-range = seq-number ":" seq-number + ; two seq-number values and all values between + ; these two regardless of order. + ; Example: 2:4 and 4:2 are equivalent and indicate + ; values 2, 3, and 4. + ; Example: a unique identifier sequence range of + ; 3291:* includes the UID of the last message in + ; the mailbox, even if that value is less than 3291. + +sequence-set = (seq-number / seq-range) *("," sequence-set) + ; set of seq-number values, regardless of order. + ; Servers MAY coalesce overlaps and/or execute the + ; sequence in any order. + ; Example: a message sequence number set of + ; 2,4:7,9,12:* for a mailbox with 15 messages is + ; equivalent to 2,4,5,6,7,9,12,13,14,15 + ; Example: a message sequence number set of *:4,5:7 + ; for a mailbox with 10 messages is equivalent to + ; 10,9,8,7,6,5,4,5,6,7 and MAY be reordered and + ; overlap coalesced to be 4,5,6,7,8,9,10. + +status = "STATUS" SP mailbox SP + "(" status-att *(SP status-att) ")" + + + + +Crispin Standards Track [Page 90] + +RFC 3501 IMAPv4 March 2003 + + +status-att = "MESSAGES" / "RECENT" / "UIDNEXT" / "UIDVALIDITY" / + "UNSEEN" + +status-att-list = status-att SP number *(SP status-att SP number) + +store = "STORE" SP sequence-set SP store-att-flags + +store-att-flags = (["+" / "-"] "FLAGS" [".SILENT"]) SP + (flag-list / (flag *(SP flag))) + +string = quoted / literal + +subscribe = "SUBSCRIBE" SP mailbox + +tag = 1*<any ASTRING-CHAR except "+"> + +text = 1*TEXT-CHAR + +TEXT-CHAR = <any CHAR except CR and LF> + +time = 2DIGIT ":" 2DIGIT ":" 2DIGIT + ; Hours minutes seconds + +uid = "UID" SP (copy / fetch / search / store) + ; Unique identifiers used instead of message + ; sequence numbers + +uniqueid = nz-number + ; Strictly ascending + +unsubscribe = "UNSUBSCRIBE" SP mailbox + +userid = astring + +x-command = "X" atom <experimental command arguments> + +zone = ("+" / "-") 4DIGIT + ; Signed four-digit value of hhmm representing + ; hours and minutes east of Greenwich (that is, + ; the amount that the given time differs from + ; Universal Time). Subtracting the timezone + ; from the given time will give the UT form. + ; The Universal Time zone is "+0000". + + + + + + + + +Crispin Standards Track [Page 91] + +RFC 3501 IMAPv4 March 2003 + + +10. Author's Note + + This document is a revision or rewrite of earlier documents, and + supercedes the protocol specification in those documents: RFC 2060, + RFC 1730, unpublished IMAP2bis.TXT document, RFC 1176, and RFC 1064. + +11. Security Considerations + + IMAP4rev1 protocol transactions, including electronic mail data, are + sent in the clear over the network unless protection from snooping is + negotiated. This can be accomplished either by the use of STARTTLS, + negotiated privacy protection in the AUTHENTICATE command, or some + other protection mechanism. + +11.1. STARTTLS Security Considerations + + The specification of the STARTTLS command and LOGINDISABLED + capability in this document replaces that in [IMAP-TLS]. [IMAP-TLS] + remains normative for the PLAIN [SASL] authenticator. + + IMAP client and server implementations MUST implement the + TLS_RSA_WITH_RC4_128_MD5 [TLS] cipher suite, and SHOULD implement the + TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA [TLS] cipher suite. This is + important as it assures that any two compliant implementations can be + configured to interoperate. All other cipher suites are OPTIONAL. + Note that this is a change from section 2.1 of [IMAP-TLS]. + + During the [TLS] negotiation, the client MUST check its understanding + of the server hostname against the server's identity as presented in + the server Certificate message, in order to prevent man-in-the-middle + attacks. If the match fails, the client SHOULD either ask for + explicit user confirmation, or terminate the connection and indicate + that the server's identity is suspect. Matching is performed + according to these rules: + + The client MUST use the server hostname it used to open the + connection as the value to compare against the server name + as expressed in the server certificate. The client MUST + NOT use any form of the server hostname derived from an + insecure remote source (e.g., insecure DNS lookup). CNAME + canonicalization is not done. + + If a subjectAltName extension of type dNSName is present in + the certificate, it SHOULD be used as the source of the + server's identity. + + Matching is case-insensitive. + + + + +Crispin Standards Track [Page 92] + +RFC 3501 IMAPv4 March 2003 + + + A "*" wildcard character MAY be used as the left-most name + component in the certificate. For example, *.example.com + would match a.example.com, foo.example.com, etc. but would + not match example.com. + + If the certificate contains multiple names (e.g., more than + one dNSName field), then a match with any one of the fields + is considered acceptable. + + Both the client and server MUST check the result of the STARTTLS + command and subsequent [TLS] negotiation to see whether acceptable + authentication or privacy was achieved. + +11.2. Other Security Considerations + + A server error message for an AUTHENTICATE command which fails due to + invalid credentials SHOULD NOT detail why the credentials are + invalid. + + Use of the LOGIN command sends passwords in the clear. This can be + avoided by using the AUTHENTICATE command with a [SASL] mechanism + that does not use plaintext passwords, by first negotiating + encryption via STARTTLS or some other protection mechanism. + + A server implementation MUST implement a configuration that, at the + time of authentication, requires: + (1) The STARTTLS command has been negotiated. + OR + (2) Some other mechanism that protects the session from password + snooping has been provided. + OR + (3) The following measures are in place: + (a) The LOGINDISABLED capability is advertised, and [SASL] + mechanisms (such as PLAIN) using plaintext passwords are NOT + advertised in the CAPABILITY list. + AND + (b) The LOGIN command returns an error even if the password is + correct. + AND + (c) The AUTHENTICATE command returns an error with all [SASL] + mechanisms that use plaintext passwords, even if the password + is correct. + + A server error message for a failing LOGIN command SHOULD NOT specify + that the user name, as opposed to the password, is invalid. + + A server SHOULD have mechanisms in place to limit or delay failed + AUTHENTICATE/LOGIN attempts. + + + +Crispin Standards Track [Page 93] + +RFC 3501 IMAPv4 March 2003 + + + Additional security considerations are discussed in the section + discussing the AUTHENTICATE and LOGIN commands. + +12. IANA Considerations + + IMAP4 capabilities are registered by publishing a standards track or + IESG approved experimental RFC. The registry is currently located + at: + + http://www.iana.org/assignments/imap4-capabilities + + As this specification revises the STARTTLS and LOGINDISABLED + extensions previously defined in [IMAP-TLS], the registry will be + updated accordingly. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Crispin Standards Track [Page 94] + +RFC 3501 IMAPv4 March 2003 + + +Appendices + +A. Normative References + + The following documents contain definitions or specifications that + are necessary to understand this document properly: + [ABNF] Crocker, D. and P. Overell, "Augmented BNF for + Syntax Specifications: ABNF", RFC 2234, + November 1997. + + [ANONYMOUS] Newman, C., "Anonymous SASL Mechanism", RFC + 2245, November 1997. + + [CHARSET] Freed, N. and J. Postel, "IANA Character Set + Registration Procedures", RFC 2978, October + 2000. + + [DIGEST-MD5] Leach, P. and C. Newman, "Using Digest + Authentication as a SASL Mechanism", RFC 2831, + May 2000. + + [DISPOSITION] Troost, R., Dorner, S. and K. Moore, + "Communicating Presentation Information in + Internet Messages: The Content-Disposition + Header", RFC 2183, August 1997. + + [IMAP-TLS] Newman, C., "Using TLS with IMAP, POP3 and + ACAP", RFC 2595, June 1999. + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to + Indicate Requirement Levels", BCP 14, RFC 2119, + March 1997. + + [LANGUAGE-TAGS] Alvestrand, H., "Tags for the Identification of + Languages", BCP 47, RFC 3066, January 2001. + + [LOCATION] Palme, J., Hopmann, A. and N. Shelness, "MIME + Encapsulation of Aggregate Documents, such as + HTML (MHTML)", RFC 2557, March 1999. + + [MD5] Myers, J. and M. Rose, "The Content-MD5 Header + Field", RFC 1864, October 1995. + + + + + + + + + +Crispin Standards Track [Page 95] + +RFC 3501 IMAPv4 March 2003 + + + [MIME-HDRS] Moore, K., "MIME (Multipurpose Internet Mail + Extensions) Part Three: Message Header + Extensions for Non-ASCII Text", RFC 2047, + November 1996. + + [MIME-IMB] Freed, N. and N. Borenstein, "MIME + (Multipurpose Internet Mail Extensions) Part + One: Format of Internet Message Bodies", RFC + 2045, November 1996. + + [MIME-IMT] Freed, N. and N. Borenstein, "MIME + (Multipurpose Internet Mail Extensions) Part + Two: Media Types", RFC 2046, November 1996. + + [RFC-2822] Resnick, P., "Internet Message Format", RFC + 2822, April 2001. + + [SASL] Myers, J., "Simple Authentication and Security + Layer (SASL)", RFC 2222, October 1997. + + [TLS] Dierks, T. and C. Allen, "The TLS Protocol + Version 1.0", RFC 2246, January 1999. + + [UTF-7] Goldsmith, D. and M. Davis, "UTF-7: A Mail-Safe + Transformation Format of Unicode", RFC 2152, + May 1997. + + The following documents describe quality-of-implementation issues + that should be carefully considered when implementing this protocol: + + [IMAP-IMPLEMENTATION] Leiba, B., "IMAP Implementation + Recommendations", RFC 2683, September 1999. + + [IMAP-MULTIACCESS] Gahrns, M., "IMAP4 Multi-Accessed Mailbox + Practice", RFC 2180, July 1997. + +A.1 Informative References + + The following documents describe related protocols: + + [IMAP-DISC] Austein, R., "Synchronization Operations for + Disconnected IMAP4 Clients", Work in Progress. + + [IMAP-MODEL] Crispin, M., "Distributed Electronic Mail + Models in IMAP4", RFC 1733, December 1994. + + + + + + +Crispin Standards Track [Page 96] + +RFC 3501 IMAPv4 March 2003 + + + [ACAP] Newman, C. and J. Myers, "ACAP -- Application + Configuration Access Protocol", RFC 2244, + November 1997. + + [SMTP] Klensin, J., "Simple Mail Transfer Protocol", + STD 10, RFC 2821, April 2001. + + The following documents are historical or describe historical aspects + of this protocol: + + [IMAP-COMPAT] Crispin, M., "IMAP4 Compatibility with + IMAP2bis", RFC 2061, December 1996. + + [IMAP-HISTORICAL] Crispin, M., "IMAP4 Compatibility with IMAP2 + and IMAP2bis", RFC 1732, December 1994. + + [IMAP-OBSOLETE] Crispin, M., "Internet Message Access Protocol + - Obsolete Syntax", RFC 2062, December 1996. + + [IMAP2] Crispin, M., "Interactive Mail Access Protocol + - Version 2", RFC 1176, August 1990. + + [RFC-822] Crocker, D., "Standard for the Format of ARPA + Internet Text Messages", STD 11, RFC 822, + August 1982. + + [RFC-821] Postel, J., "Simple Mail Transfer Protocol", + STD 10, RFC 821, August 1982. + +B. Changes from RFC 2060 + + 1) Clarify description of unique identifiers and their semantics. + + 2) Fix the SELECT description to clarify that UIDVALIDITY is required + in the SELECT and EXAMINE responses. + + 3) Added an example of a failing search. + + 4) Correct store-att-flags: "#flag" should be "1#flag". + + 5) Made search and section rules clearer. + + 6) Correct the STORE example. + + 7) Correct "BASE645" misspelling. + + 8) Remove extraneous close parenthesis in example of two-part message + with text and BASE64 attachment. + + + +Crispin Standards Track [Page 97] + +RFC 3501 IMAPv4 March 2003 + + + 9) Remove obsolete "MAILBOX" response from mailbox-data. + + 10) A spurious "<" in the rule for mailbox-data was removed. + + 11) Add CRLF to continue-req. + + 12) Specifically exclude "]" from the atom in resp-text-code. + + 13) Clarify that clients and servers should adhere strictly to the + protocol syntax. + + 14) Emphasize in 5.2 that EXISTS can not be used to shrink a mailbox. + + 15) Add NEWNAME to resp-text-code. + + 16) Clarify that the empty string, not NIL, is used as arguments to + LIST. + + 17) Clarify that NIL can be returned as a hierarchy delimiter for the + empty string mailbox name argument if the mailbox namespace is flat. + + 18) Clarify that addr-mailbox and addr-name have RFC-2822 quoting + removed. + + 19) Update UTF-7 reference. + + 20) Fix example in 6.3.11. + + 21) Clarify that non-existent UIDs are ignored. + + 22) Update DISPOSITION reference. + + 23) Expand state diagram. + + 24) Clarify that partial fetch responses are only returned in + response to a partial fetch command. + + 25) Add UIDNEXT response code. Correct UIDVALIDITY definition + reference. + + 26) Further clarification of "can" vs. "MAY". + + 27) Reference RFC-2119. + + 28) Clarify that superfluous shifts are not permitted in modified + UTF-7. + + 29) Clarify that there are no implicit shifts in modified UTF-7. + + + +Crispin Standards Track [Page 98] + +RFC 3501 IMAPv4 March 2003 + + + 30) Clarify that "INBOX" in a mailbox name is always INBOX, even if + it is given as a string. + + 31) Add missing open parenthesis in media-basic grammar rule. + + 32) Correct attribute syntax in mailbox-data. + + 33) Add UIDNEXT to EXAMINE responses. + + 34) Clarify UNSEEN, PERMANENTFLAGS, UIDVALIDITY, and UIDNEXT + responses in SELECT and EXAMINE. They are required now, but weren't + in older versions. + + 35) Update references with RFC numbers. + + 36) Flush text-mime2. + + 37) Clarify that modified UTF-7 names must be case-sensitive and that + violating the convention should be avoided. + + 38) Correct UID FETCH example. + + 39) Clarify UID FETCH, UID STORE, and UID SEARCH vs. untagged EXPUNGE + responses. + + 40) Clarify the use of the word "convention". + + 41) Clarify that a command is not "in progress" until it has been + fully received (specifically, that a command is not "in progress" + during command continuation negotiation). + + 42) Clarify envelope defaulting. + + 43) Clarify that SP means one and only one space character. + + 44) Forbid silly states in LIST response. + + 45) Clarify that the ENVELOPE, INTERNALDATE, RFC822*, BODY*, and UID + for a message is static. + + 46) Add BADCHARSET response code. + + 47) Update formal syntax to [ABNF] conventions. + + 48) Clarify trailing hierarchy delimiter in CREATE semantics. + + 49) Clarify that the "blank line" is the [RFC-2822] delimiting blank + line. + + + +Crispin Standards Track [Page 99] + +RFC 3501 IMAPv4 March 2003 + + + 50) Clarify that RENAME should also create hierarchy as needed for + the command to complete. + + 51) Fix body-ext-mpart to not require language if disposition + present. + + 52) Clarify the RFC822.HEADER response. + + 53) Correct missing space after charset astring in search. + + 54) Correct missing quote for BADCHARSET in resp-text-code. + + 55) Clarify that ALL, FAST, and FULL preclude any other data items + appearing. + + 56) Clarify semantics of reference argument in LIST. + + 57) Clarify that a null string for SEARCH HEADER X-FOO means any + message with a header line with a field-name of X-FOO regardless of + the text of the header. + + 58) Specifically reserve 8-bit mailbox names for future use as UTF-8. + + 59) It is not an error for the client to store a flag that is not in + the PERMANENTFLAGS list; however, the server will either ignore the + change or make the change in the session only. + + 60) Correct/clarify the text regarding superfluous shifts. + + 61) Correct typographic errors in the "Changes" section. + + 62) Clarify that STATUS must not be used to check for new messages in + the selected mailbox + + 63) Clarify LSUB behavior with "%" wildcard. + + 64) Change AUTHORIZATION to AUTHENTICATE in section 7.5. + + 65) Clarify description of multipart body type. + + 66) Clarify that STORE FLAGS does not affect \Recent. + + 67) Change "west" to "east" in description of timezone. + + 68) Clarify that commands which break command pipelining must wait + for a completion result response. + + 69) Clarify that EXAMINE does not affect \Recent. + + + +Crispin Standards Track [Page 100] + +RFC 3501 IMAPv4 March 2003 + + + 70) Make description of MIME structure consistent. + + 71) Clarify that date searches disregard the time and timezone of the + INTERNALDATE or Date: header. In other words, "ON 13-APR-2000" means + messages with an INTERNALDATE text which starts with "13-APR-2000", + even if timezone differential from the local timezone is sufficient + to move that INTERNALDATE into the previous or next day. + + 72) Clarify that the header fetches don't add a blank line if one + isn't in the [RFC-2822] message. + + 73) Clarify (in discussion of UIDs) that messages are immutable. + + 74) Add an example of CHARSET searching. + + 75) Clarify in SEARCH that keywords are a type of flag. + + 76) Clarify the mandatory nature of the SELECT data responses. + + 77) Add optional CAPABILITY response code in the initial OK or + PREAUTH. + + 78) Add note that server can send an untagged CAPABILITY command as + part of the responses to AUTHENTICATE and LOGIN. + + 79) Remove statement about it being unnecessary to issue a CAPABILITY + command more than once in a connection. That statement is no longer + true. + + 80) Clarify that untagged EXPUNGE decrements the number of messages + in the mailbox. + + 81) Fix definition of "body" (concatenation has tighter binding than + alternation). + + 82) Add a new "Special Notes to Implementors" section with reference + to [IMAP-IMPLEMENTATION]. + + 83) Clarify that an untagged CAPABILITY response to an AUTHENTICATE + command should only be done if a security layer was not negotiated. + + 84) Change the definition of atom to exclude "]". Update astring to + include "]" for compatibility with the past. Remove resp-text-atom. + + 85) Remove NEWNAME. It can't work because mailbox names can be + literals and can include "]". Functionality can be addressed via + referrals. + + + + +Crispin Standards Track [Page 101] + +RFC 3501 IMAPv4 March 2003 + + + 86) Move modified UTF-7 rationale in order to have more logical + paragraph flow. + + 87) Clarify UID uniqueness guarantees with the use of MUST. + + 88) Note that clients should read response data until the connection + is closed instead of immediately closing on a BYE. + + 89) Change RFC-822 references to RFC-2822. + + 90) Clarify that RFC-2822 should be followed instead of RFC-822. + + 91) Change recommendation of optional automatic capabilities in LOGIN + and AUTHENTICATE to use the CAPABILITY response code in the tagged + OK. This is more interoperable than an unsolicited untagged + CAPABILITY response. + + 92) STARTTLS and AUTH=PLAIN are mandatory to implement; add + recommendations for other [SASL] mechanisms. + + 93) Clarify that a "connection" (as opposed to "server" or "command") + is in one of the four states. + + 94) Clarify that a failed or rejected command does not change state. + + 95) Split references between normative and informative. + + 96) Discuss authentication failure issues in security section. + + 97) Clarify that a data item is not necessarily of only one data + type. + + 98) Clarify that sequence ranges are independent of order. + + 99) Change an example to clarify that superfluous shifts in + Modified-UTF7 can not be fixed just by omitting the shift. The + entire string must be recalculated. + + 100) Change Envelope Structure definition since [RFC-2822] uses + "envelope" to refer to the [SMTP] envelope and not the envelope data + that appears in the [RFC-2822] header. + + 101) Expand on RFC822.HEADER response data vs. BODY[HEADER]. + + 102) Clarify Logout state semantics, change ASCII art. + + 103) Security changes to comply with IESG requirements. + + + + +Crispin Standards Track [Page 102] + +RFC 3501 IMAPv4 March 2003 + + + 104) Add definition for body URI. + + 105) Break sequence range definition into three rules, with rewritten + descriptions for each. + + 106) Move STARTTLS and LOGINDISABLED here from [IMAP-TLS]. + + 107) Add IANA Considerations section. + + 108) Clarify valid client assumptions for new message UIDs vs. + UIDNEXT. + + 109) Clarify that changes to permanentflags affect concurrent + sessions as well as subsequent sessions. + + 110) Clarify that authenticated state can be entered by the CLOSE + command. + + 111) Emphasize that SELECT and EXAMINE are the exceptions to the rule + that a failing command does not change state. + + 112) Clarify that newly-appended messages have the Recent flag set. + + 113) Clarify that newly-copied messages SHOULD have the Recent flag + set. + + 114) Clarify that UID commands always return the UID in FETCH + responses. + +C. Key Word Index + + +FLAGS <flag list> (store command data item) ............... 59 + +FLAGS.SILENT <flag list> (store command data item) ........ 59 + -FLAGS <flag list> (store command data item) ............... 59 + -FLAGS.SILENT <flag list> (store command data item) ........ 59 + ALERT (response code) ...................................... 64 + ALL (fetch item) ........................................... 55 + ALL (search key) ........................................... 50 + ANSWERED (search key) ...................................... 50 + APPEND (command) ........................................... 45 + AUTHENTICATE (command) ..................................... 27 + BAD (response) ............................................. 66 + BADCHARSET (response code) ................................. 64 + BCC <string> (search key) .................................. 51 + BEFORE <date> (search key) ................................. 51 + BODY (fetch item) .......................................... 55 + BODY (fetch result) ........................................ 73 + BODY <string> (search key) ................................. 51 + + + +Crispin Standards Track [Page 103] + +RFC 3501 IMAPv4 March 2003 + + + BODY.PEEK[<section>]<<partial>> (fetch item) ............... 57 + BODYSTRUCTURE (fetch item) ................................. 57 + BODYSTRUCTURE (fetch result) ............................... 74 + BODY[<section>]<<origin octet>> (fetch result) ............. 74 + BODY[<section>]<<partial>> (fetch item) .................... 55 + BYE (response) ............................................. 67 + Body Structure (message attribute) ......................... 12 + CAPABILITY (command) ....................................... 24 + CAPABILITY (response code) ................................. 64 + CAPABILITY (response) ...................................... 68 + CC <string> (search key) ................................... 51 + CHECK (command) ............................................ 47 + CLOSE (command) ............................................ 48 + COPY (command) ............................................. 59 + CREATE (command) ........................................... 34 + DELETE (command) ........................................... 35 + DELETED (search key) ....................................... 51 + DRAFT (search key) ......................................... 51 + ENVELOPE (fetch item) ...................................... 57 + ENVELOPE (fetch result) .................................... 77 + EXAMINE (command) .......................................... 33 + EXISTS (response) .......................................... 71 + EXPUNGE (command) .......................................... 48 + EXPUNGE (response) ......................................... 72 + Envelope Structure (message attribute) ..................... 12 + FAST (fetch item) .......................................... 55 + FETCH (command) ............................................ 54 + FETCH (response) ........................................... 73 + FLAGGED (search key) ....................................... 51 + FLAGS (fetch item) ......................................... 57 + FLAGS (fetch result) ....................................... 78 + FLAGS (response) ........................................... 71 + FLAGS <flag list> (store command data item) ................ 59 + FLAGS.SILENT <flag list> (store command data item) ......... 59 + FROM <string> (search key) ................................. 51 + FULL (fetch item) .......................................... 55 + Flags (message attribute) .................................. 11 + HEADER (part specifier) .................................... 55 + HEADER <field-name> <string> (search key) .................. 51 + HEADER.FIELDS <header-list> (part specifier) ............... 55 + HEADER.FIELDS.NOT <header-list> (part specifier) ........... 55 + INTERNALDATE (fetch item) .................................. 57 + INTERNALDATE (fetch result) ................................ 78 + Internal Date (message attribute) .......................... 12 + KEYWORD <flag> (search key) ................................ 51 + Keyword (type of flag) ..................................... 11 + LARGER <n> (search key) .................................... 51 + LIST (command) ............................................. 40 + + + +Crispin Standards Track [Page 104] + +RFC 3501 IMAPv4 March 2003 + + + LIST (response) ............................................ 69 + LOGIN (command) ............................................ 30 + LOGOUT (command) ........................................... 25 + LSUB (command) ............................................. 43 + LSUB (response) ............................................ 70 + MAY (specification requirement term) ....................... 4 + MESSAGES (status item) ..................................... 45 + MIME (part specifier) ...................................... 56 + MUST (specification requirement term) ...................... 4 + MUST NOT (specification requirement term) .................. 4 + Message Sequence Number (message attribute) ................ 10 + NEW (search key) ........................................... 51 + NO (response) .............................................. 66 + NOOP (command) ............................................. 25 + NOT <search-key> (search key) .............................. 52 + OK (response) .............................................. 65 + OLD (search key) ........................................... 52 + ON <date> (search key) ..................................... 52 + OPTIONAL (specification requirement term) .................. 4 + OR <search-key1> <search-key2> (search key) ................ 52 + PARSE (response code) ...................................... 64 + PERMANENTFLAGS (response code) ............................. 64 + PREAUTH (response) ......................................... 67 + Permanent Flag (class of flag) ............................. 12 + READ-ONLY (response code) .................................. 65 + READ-WRITE (response code) ................................. 65 + RECENT (response) .......................................... 72 + RECENT (search key) ........................................ 52 + RECENT (status item) ....................................... 45 + RENAME (command) ........................................... 37 + REQUIRED (specification requirement term) .................. 4 + RFC822 (fetch item) ........................................ 57 + RFC822 (fetch result) ...................................... 78 + RFC822.HEADER (fetch item) ................................. 57 + RFC822.HEADER (fetch result) ............................... 78 + RFC822.SIZE (fetch item) ................................... 57 + RFC822.SIZE (fetch result) ................................. 78 + RFC822.TEXT (fetch item) ................................... 58 + RFC822.TEXT (fetch result) ................................. 79 + SEARCH (command) ........................................... 49 + SEARCH (response) .......................................... 71 + SEEN (search key) .......................................... 52 + SELECT (command) ........................................... 31 + SENTBEFORE <date> (search key) ............................. 52 + SENTON <date> (search key) ................................. 52 + SENTSINCE <date> (search key) .............................. 52 + SHOULD (specification requirement term) .................... 4 + SHOULD NOT (specification requirement term) ................ 4 + + + +Crispin Standards Track [Page 105] + +RFC 3501 IMAPv4 March 2003 + + + SINCE <date> (search key) .................................. 52 + SMALLER <n> (search key) ................................... 52 + STARTTLS (command) ......................................... 27 + STATUS (command) ........................................... 44 + STATUS (response) .......................................... 70 + STORE (command) ............................................ 58 + SUBJECT <string> (search key) .............................. 53 + SUBSCRIBE (command) ........................................ 38 + Session Flag (class of flag) ............................... 12 + System Flag (type of flag) ................................. 11 + TEXT (part specifier) ...................................... 56 + TEXT <string> (search key) ................................. 53 + TO <string> (search key) ................................... 53 + TRYCREATE (response code) .................................. 65 + UID (command) .............................................. 60 + UID (fetch item) ........................................... 58 + UID (fetch result) ......................................... 79 + UID <sequence set> (search key) ............................ 53 + UIDNEXT (response code) .................................... 65 + UIDNEXT (status item) ...................................... 45 + UIDVALIDITY (response code) ................................ 65 + UIDVALIDITY (status item) .................................. 45 + UNANSWERED (search key) .................................... 53 + UNDELETED (search key) ..................................... 53 + UNDRAFT (search key) ....................................... 53 + UNFLAGGED (search key) ..................................... 53 + UNKEYWORD <flag> (search key) .............................. 53 + UNSEEN (response code) ..................................... 65 + UNSEEN (search key) ........................................ 53 + UNSEEN (status item) ....................................... 45 + UNSUBSCRIBE (command) ...................................... 39 + Unique Identifier (UID) (message attribute) ................ 8 + X<atom> (command) .......................................... 62 + [RFC-2822] Size (message attribute) ........................ 12 + \Answered (system flag) .................................... 11 + \Deleted (system flag) ..................................... 11 + \Draft (system flag) ....................................... 11 + \Flagged (system flag) ..................................... 11 + \Marked (mailbox name attribute) ........................... 69 + \Noinferiors (mailbox name attribute) ...................... 69 + \Noselect (mailbox name attribute) ......................... 69 + \Recent (system flag) ...................................... 11 + \Seen (system flag) ........................................ 11 + \Unmarked (mailbox name attribute) ......................... 69 + + + + + + + +Crispin Standards Track [Page 106] + +RFC 3501 IMAPv4 March 2003 + + +Author's Address + + Mark R. Crispin + Networks and Distributed Computing + University of Washington + 4545 15th Avenue NE + Seattle, WA 98105-4527 + + Phone: (206) 543-5762 + + EMail: MRC@CAC.Washington.EDU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Crispin Standards Track [Page 107] + +RFC 3501 IMAPv4 March 2003 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2003). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. v This + document and the information contained herein is provided on an "AS + IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK + FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT + LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL + NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY + OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + + +Crispin Standards Track [Page 108] + diff --git a/doc/rfc3502.txt b/doc/rfc3502.txt @@ -0,0 +1,395 @@ + + + + + + +Network Working Group M. Crispin +Request for Comments: 3502 University of Washington +Category: Standards Track March 2003 + + + Internet Message Access Protocol (IMAP) - MULTIAPPEND Extension + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2003). All Rights Reserved. + +Abstract + + This document describes the multiappending extension to the Internet + Message Access Protocol (IMAP) (RFC 3501). This extension provides + substantial performance improvements for IMAP clients which upload + multiple messages at a time to a mailbox on the server. + + A server which supports this extension indicates this with a + capability name of "MULTIAPPEND". + +Terminology + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "MAY", and "OPTIONAL" in this document are to + be interpreted as described in [KEYWORDS]. + +Introduction + + The MULTIAPPEND extension permits uploading of multiple messages with + a single command. When used in conjunction with the [LITERAL+] + extension, the entire upload is accomplished in a single + command/response round trip. + + A MULTIAPPEND APPEND operation is atomic; either all messages are + successfully appended, or no messages are appended. + + In the base IMAP specification, each message must be appended in a + separate command, and there is no mechanism to "unappend" messages if + an error occurs while appending. Also, some mail stores may require + + + +Crispin Standards Track [Page 1] + +RFC 3502 IMAP MULTIAPPEND March 2003 + + + an expensive "open/lock + sync/unlock/close" operation as part of + appending; this can be quite expensive if it must be done on a + per-message basis. + + If the server supports both LITERAL+ and pipelining but not + MULTIAPPEND, it may be possible to get some of the performance + advantages of MULTIAPPEND by doing a pipelined "batch" append. + However, it will not work as well as MULTIAPPEND for the following + reasons: + + 1) Multiple APPEND commands, even as part of a pipelined batch, + are non-atomic by definition. There is no way to revert the + mailbox to the state before the batch append in the event of an + error. + + 2) It may not be feasible for the server to coalesce pipelined + APPEND operations so as to avoid the "open/lock + + sync/unlock/close" overhead described above. In any case, such + coalescing would be timing dependent and thus potentially + unreliable. In particular, with traditional UNIX mailbox files, + it is assumed that a lock is held only for a single atomic + operation, and many applications disregard any lock that is + older than 5 minutes. + + 3) If an error occurs, depending upon the nature of the error, + it is possible for additional messages to be appended after the + error. For example, the user wants to append 5 messages, but a + disk quota error occurs with the third message because of its + size. However, the fourth and fifth messages have already been + sent in the pipeline, so the mailbox ends up with the first, + second, fourth, and fifth messages of the batch appended. + +6.3.11. APPEND Command + + Arguments: mailbox name + one or more messages to upload, specified as: + OPTIONAL flag parenthesized list + OPTIONAL date/time string + message literal + + Data: no specific responses for this command + + Result: OK - append completed + NO - append error: can't append to that mailbox, error + in flags or date/time or message text, + append cancelled + BAD - command unknown or arguments invalid + + + + +Crispin Standards Track [Page 2] + +RFC 3502 IMAP MULTIAPPEND March 2003 + + + The APPEND command appends the literal arguments as new messages + to the end of the specified destination mailbox. This argument + SHOULD be in the format of an [RFC-2822] message. 8-bit + characters are permitted in the message. A server implementation + that is unable to preserve 8-bit data properly MUST be able to + reversibly convert 8-bit APPEND data to 7-bit using a [MIME-IMB] + content transfer encoding. + + Note: There MAY be exceptions, e.g., draft messages, in + which required [RFC-2822] header lines are omitted in the + message literal argument to APPEND. The full implications + of doing so MUST be understood and carefully weighed. + + If a flag parenthesized list is specified, the flags SHOULD be set + in the resulting message; otherwise, the flag list of the + resulting message is set empty by default. + + If a date-time is specified, the internal date SHOULD be set in + the resulting message; otherwise, the internal date of the + resulting message is set to the current date and time by default. + + A zero-length message literal argument is an error, and MUST + return a NO. This can be used to cancel the append. + + If the append is unsuccessful for any reason (including being + cancelled), the mailbox MUST be restored to its state before the + APPEND attempt; no partial appending is permitted. The server MAY + return an error before processing all the message arguments. + + If the destination mailbox does not exist, a server MUST return an + error, and MUST NOT automatically create the mailbox. Unless it + is certain that the destination mailbox can not be created, the + server MUST send the response code "[TRYCREATE]" as the prefix of + the text of the tagged NO response. This gives a hint to the + client that it can attempt a CREATE command and retry the APPEND + if the CREATE is successful. + + If the mailbox is currently selected, the normal new message + actions SHOULD occur. Specifically, the server SHOULD notify the + client immediately via an untagged EXISTS response. If the server + does not do so, the client MAY issue a NOOP command (or failing + that, a CHECK command) after one or more APPEND commands. + + + + + + + + + +Crispin Standards Track [Page 3] + +RFC 3502 IMAP MULTIAPPEND March 2003 + + + Example: C: A003 APPEND saved-messages (\Seen) {329} + S: + Ready for literal data + C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) + C: From: Fred Foobar <foobar@Blurdybloop.example.COM> + C: Subject: afternoon meeting + C: To: mooch@owatagu.example.net + C: Message-Id: <B27397-0100000@Blurdybloop.example.COM> + C: MIME-Version: 1.0 + C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII + C: + C: Hello Joe, do you think we can meet at 3:30 tomorrow? + C: (\Seen) " 7-Feb-1994 22:43:04 -0800" {295} + S: + Ready for literal data + C: Date: Mon, 7 Feb 1994 22:43:04 -0800 (PST) + C: From: Joe Mooch <mooch@OWaTaGu.example.net> + C: Subject: Re: afternoon meeting + C: To: foobar@blurdybloop.example.com + C: Message-Id: <a0434793874930@OWaTaGu.example.net> + C: MIME-Version: 1.0 + C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII + C: + C: 3:30 is fine with me. + C: + S: A003 OK APPEND completed + C: A004 APPEND bogusname (\Flagged) {1023} + S: A004 NO [TRYCREATE] No such mailbox as bogusname + C: A005 APPEND test (\Flagged) {99} + S: + Ready for literal data + C: Date: Mon, 7 Feb 2000 22:43:04 -0800 (PST) + C: From: Fred Foobar <fred@example.com> + C: Subject: hmm... + C: {35403} + S: A005 NO APPEND failed: Disk quota exceeded + + Note: The APPEND command is not used for message delivery, + because it does not provide a mechanism to transfer [SMTP] + envelope information. + +Modification to IMAP4rev1 Base Protocol Formal Syntax + + The following syntax specification uses the Augmented Backus-Naur + Form (ABNF) notation as specified in [ABNF]. + + append = "APPEND" SP mailbox 1*append-message + + append-message = [SP flag-list] [SP date-time] SP literal + + + + + +Crispin Standards Track [Page 4] + +RFC 3502 IMAP MULTIAPPEND March 2003 + + +MULTIAPPEND Interaction with UIDPLUS Extension + + Servers which support both MULTIAPPEND and [UIDPLUS] will have the + "resp-code-apnd" rule modified as follows: + + resp-code-apnd = "APPENDUID" SP nz-number SP set + + That is, the APPENDUID response code returns as many UIDs as there + were messages appended in the multiple append. The UIDs returned + should be in the order the articles where appended. The message set + may not contain extraneous UIDs or the symbol "*". + +Security Considerations + + The MULTIAPPEND extension does not raise any security considerations + that are not present in the base [IMAP] protocol, and these issues + are discussed in [IMAP]. Nevertheless, it is important to remember + that IMAP4rev1 protocol transactions, including electronic mail data, + are sent in the clear over the network unless protection from + snooping is negotiated, either by the use of STARTTLS, privacy + protection is negotiated in the AUTHENTICATE command, or some other + protection mechanism is in effect. + +Normative References + + [ABNF] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", RFC 2234, November 1997. + + [IMAP] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 3501, March 2003. + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [MIME-IMB] Freed, N. and N. Borenstein, "MIME (Multipurpose Internet + Mail Extensions) Part One: Format of Internet Message + Bodies", RFC 2045, November 1996. + + [RFC-2822] Resnick, P., "Internet Message Format", RFC 2822, April + 2001. + + + + + + + + + + + +Crispin Standards Track [Page 5] + +RFC 3502 IMAP MULTIAPPEND March 2003 + + +Informative References + + [LITERAL+] Myers, J., "IMAP4 non-synchronizing literals", RFC 2088, + January 1997. + + [UIDPLUS] Myers, J., "IMAP4 UIDPLUS extension", RFC 2359, June 1988. + + [SMTP] Klensin, J., Editor, "Simple Mail Transfer Protocol", RFC + 2821, April 2001. + +Author's Address + + Mark R. Crispin + Networks and Distributed Computing + University of Washington + 4545 15th Avenue NE + Seattle, WA 98105-4527 + + Phone: (206) 543-5762 + EMail: MRC@CAC.Washington.EDU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Crispin Standards Track [Page 6] + +RFC 3502 IMAP MULTIAPPEND March 2003 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2003). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Crispin Standards Track [Page 7] + diff --git a/doc/rfc3503.txt b/doc/rfc3503.txt @@ -0,0 +1,507 @@ + + + + + + +Network Working Group A. Melnikov +Request for Comments: 3503 ACI Worldwide/MessagingDirect +Category: Standards Track March 2003 + + + Message Disposition Notification (MDN) profile for + Internet Message Access Protocol (IMAP) + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2003). All Rights Reserved. + +Abstract + + The Message Disposition Notification (MDN) facility defined in RFC + 2298 provides a means by which a message can request that message + processing by the recipient be acknowledged as well as a format to be + used for such acknowledgements. However, it doesn't describe how + multiple Mail User Agents (MUAs) should handle the generation of MDNs + in an Internet Message Access Protocol (IMAP4) environment. + + This document describes how to handle MDNs in such an environment and + provides guidelines for implementers of IMAP4 that want to add MDN + support to their products. + + + + + + + + + + + + + + + + + + + +Melnikov Standards Track [Page 1] + +RFC 3503 MDN profile for IMAP March 2003 + + +Table of Contents + + 1. Conventions Used in this Document............................. 2 + 2. Introduction and Overview..................................... 2 + 3. Client behavior............................................... 3 + 3.1. Client behavior when receiving a message................. 5 + 3.2. Client behavior when copying a message................... 5 + 3.3. Client behavior when sending a message................... 5 + 3.4. Client behavior when saving a temporary message.......... 5 + 4. Server behavior............................................... 5 + 4.1. Server that supports arbitrary keywords.................. 5 + 4.2. Server that supports only $MDNSent keyword............... 5 + 4.3. Interaction with IMAP ACL extension...................... 6 + 5. Examples...................................................... 6 + 6. Security Considerations....................................... 7 + 7. Formal Syntax................................................. 7 + 8. Acknowledgments............................................... 7 + 9. Normative References.......................................... 8 + 10. Author's Address.............................................. 8 + 11. Full Copyright Statement...................................... 9 + +1. Conventions Used in this Document + + "C:" and "S:" in examples show lines sent by the client and server + respectively. + + The keywords "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" in + this document when typed in uppercase are to be interpreted as + defined in "Key words for use in RFCs to Indicate Requirement Levels" + [KEYWORDS]. + +2. Introduction and Overview + + This memo defines an additional [IMAP4] mailbox keyword that allows + multiple Mail User Agents (MUAs) to know if a requested receipt + notification was sent. + + Message Disposition Notification [MDN] does not require any special + support of IMAP in the case where a user has access to the mailstore + from only one computer and is using a single MUA. In this case, the + MUA behaves as described in [MDN], i.e., the MUA performs automatic + processing and generates corresponding MDNs, it performs requested + action and, with the user's permission, sends appropriate MDNs. The + MUA will not send MDN twice because the MUA keeps track of sent + notifications in a local configuration. However, that does not work + when IMAP is used to access the same mailstore from different + locations or is using different MUAs. + + + + +Melnikov Standards Track [Page 2] + +RFC 3503 MDN profile for IMAP March 2003 + + + This document defines a new special purpose mailbox keyword $MDNSent + that must be used by MUAs. It does not define any new command or + response for IMAP, but describes a technique that MUAs should use to + achieve interoperability. + + When a client opens a mailbox for the first time, it verifies that + the server is capable of storing the $MDNSent keyword by examining + the PERMANENTFLAGS response code. In order to support MDN in IMAP, a + server MUST support either the $MDNSent keyword, or arbitrary message + keywords. + +3. Client behavior + + The use of IMAP requires few additional steps in mail processing on + the client side. The following timeline modifies the timeline found + in Section 4 of [MDN]. + + -- User composes message. + + -- User tells MUA to send message. + + -- MUA passes message to MSA (original recipient information passed + along). MUA [optionally] saves message to a folder for sent mail + with $MDNSent flag set. + + -- MSA sends message to MTA. + + -- Final MTA receives message. + + -- Final MTA delivers message to MUA (possibly generating DSN). + + -- MUA logs into IMAP server, opens mailbox, verifies if mailbox can + store $MDNSent keyword by examining PERMANENTFLAGS response. + + -- MUA performs automatic processing and generates corresponding MDNs + ("dispatched", "processed", "deleted", "denied" or "failed" + disposition type with "automatic-action" and "MDN-sent- + automatically" disposition modes) for messages that do not have + $MDNSent keyword, or \Draft flag set. (*) + + -- MUA sets the $MDNSent keyword for every message that required an + automatic MDN to be sent, whether or not the MDN was sent. + + -- MUA displays a list of messages to user. + + -- User selects a message and requests that some action be performed + on it. + + + + +Melnikov Standards Track [Page 3] + +RFC 3503 MDN profile for IMAP March 2003 + + + -- MUA performs requested action and, with user's permission, sends + appropriate MDN ("displayed", "dispatched", "processed", + "deleted", "denied" or "failed" disposition type with "manual- + action" and "MDN-sent-manually" or "MDN-sent-automatically" + disposition mode). If the generated MDN is saved to a mailbox + with the APPEND command, the client MUST specify the $MDNSent + keyword in the APPEND. + + -- MUA sets the $MDNSent keyword for all messages for which the user + confirmed the dispatching of disposition (or was explicitly + prohibited to do so). + + -- User possibly performs other actions on message, but no further + MDNs are generated. + + (*) Note: MUA MUST NOT use \Recent flag as an indicator that it + should send MDN, because according to [IMAP4], "If multiple + connections have the same mailbox selected simultaneously, it is + undefined which of these connections will see newly-arrived + messages with \Recent set and which will see it without \Recent + set". Thus, using \Recent as an indicator will cause + unpredictable client behavior with different IMAP4 servers. + However, the client MAY use \Seen flag as one of the indicators + that MDN must not be sent. The client MUST NOT use any other + standard flags, like \Draft or \Answered, to indicate that MDN + was previously sent, because they have different well known + meaning. In any case, in the presence of the $MDNSent keyword, + the client MUST ignore all other flags or keywords for the + purpose of generating an MDN and MUST NOT send the MDN. + + When the client opens a mailbox for the first time, it must verify + that the server supports the $MDNSent keyword, or arbitrary message + keywords by examining PERMANENTFLAGS response code. + + The client MUST NOT try to set the $MDNSent keyword if the server is + incapable of storing it permanently. + + The client MUST be prepared to receive NO from the server as the + result of STORE $MDNSent when the server advertises the support of + storing arbitrary keywords, because the server may limit the number + of message keywords it can store in a particular mailbox. A client + SHOULD NOT send MDN if it fails to store the $MDNSent keyword. + + Once the $MDNSent keyword is set, it MUST NOT be unset by a client. + The client MAY set the $MDNSent keyword when a user denies sending + the notification. This prohibits all other MUAs from sending MDN for + this message. + + + + +Melnikov Standards Track [Page 4] + +RFC 3503 MDN profile for IMAP March 2003 + + +3.1. Client behavior when receiving a message + + The client MUST NOT send MDN if a message has the $MDNSent keyword + set. It also MUST NOT send MDN if a message has \Draft flag, because + some clients use this flag to mark a message as incomplete. + + See the timeline in section 3 for details on client behavior when + receiving a message. + +3.2. Client behavior when copying a message + + The client SHOULD verify that $MDNSent is preserved on a COPY + operation. Furthermore, when a message is copied between servers + with the APPEND command, the client MUST set the $MDNSent keyword + correctly. + +3.3. Client behavior when sending a message + + When saving a sent message to any folder, the client MUST set the + $MDNSent keyword to prevent another client from sending MDN for the + message. + +3.4. Client behavior when saving a temporary message + + When saving an unfinished message to any folder client MUST set + $MDNSent keyword to prevent another client from sending MDN for the + message. + +4. Server behavior + + Server implementors that want to follow this specification must + insure that their server complies with either section 4.1 or section + 4.2. If the server also supports the IMAP [ACL] extension, it MUST + also comply with the section 4.3. + +4.1. Server that supports arbitrary keywords + + No changes are required from the server to make it compatible with + the extension described in this document if it supports arbitrary + keywords. + +4.2. Server that supports only $MDNSent keyword + + Servers that support only the $MDNSent keyword MUST preserve it on + the COPY operation. It is also expected that a server that supports + SEARCH <flag> will also support the SEARCH KEYWORD $MDNSent. + + + + + +Melnikov Standards Track [Page 5] + +RFC 3503 MDN profile for IMAP March 2003 + + +4.3. Interaction with IMAP ACL extension + + Any server that conforms to either 4.1 or 4.2 and also supports the + IMAP [ACL] extension, SHOULD preserve the $MDNSent keyword on COPY + even if the client does not have 'w' right. This will prevent the + generation of a duplicated MDN for the same message. Note that the + server MUST still check if the client has rights to perform the COPY + operation on a message according to [ACL]. + +5. Examples + + 1) MUA opens mailbox for the first time. + + a) The server supports storing of arbitrary keywords + + C: a100 select INBOX + S: * FLAGS (\Flagged \Draft \Deleted \Seen) + S: * OK [PERMANENTFLAGS (\Flagged \Draft \Deleted \Seen \*)] + S: * 5 EXISTS + S: * 3 RECENT + S: * OK [UIDVALIDITY 894294713] + S: a100 OK [READ-WRITE] Completed + + b) The server supports storing of the $MDNSent keyword + + C: a100 select INBOX + S: * FLAGS (\Flagged \Draft \Deleted \Seen $MDNSent) + S: * OK [PERMANENTFLAGS (\Flagged \Draft \Deleted \Seen $MDNSent)] + S: * 5 EXISTS + S: * 3 RECENT + S: * OK [UIDVALIDITY 894294713] + S: a100 OK [READ-WRITE] Completed + + 2) The MUA successfully sets the $MDNSent keyword + + C: a200 STORE 4 +FLAGS ($MDNSent) + S: * 4 FETCH (FLAGS (\Flagged \Seen $MDNSent)) + S: * FLAGS ($MDNSent \Flagged \Deleted \Draft \Seen) + S: * OK [PERMANENTFLAGS ($MDNSent \Flagged \Deleted \Draft \Seen \*)] + S: a200 OK STORE completed + + 3) The server refuses to store the $MDNSent keyword + + C: a200 STORE 4 +FLAGS ($MDNSent) + S: a200 NO STORE failed : no space left to store $MDNSent keyword + + + + + + +Melnikov Standards Track [Page 6] + +RFC 3503 MDN profile for IMAP March 2003 + + + 4) All clients and servers MUST treat the $MDNSent keyword as case + insensitive in all operations, as stated in [IMAP]. + + C: a300 FETCH 1:* FLAGS + S: * 1 FETCH (FLAGS (\Seen)) + S: * 2 FETCH (FLAGS (\Answered \Seen $MdnSENt)) + S: * 3 FETCH (FLAGS ()) + S: * 4 FETCH (FLAGS (\Flagged \Seen $MdnSENT)) + S: * 5 FETCH (FLAGS ($MDNSent)) + S: * 6 FETCH (FLAGS (\Recent)) + S: a300 OK FETCH completed + C: a400 SEARCH KEYWORDS $mdnsent + S: * SEARCH 2 4 5 + S: a400 OK SEARCH completed + +6. Security Considerations + + There are no known security issues with this extension, not found in + [MDN] and/or [IMAP4]. + + Section 4.3 changes ACL checking requirements on an IMAP server that + implements IMAP [ACL] extension. + +7. Formal Syntax + + The following syntax specification uses the augmented Backus-Naur + Form (BNF) notation as specified in [RFC-822], as modified by + [IMAP4]. Non-terminals referenced, but not defined below, are as + defined by [IMAP4]. + + Except as noted otherwise, all alphabetic characters are case- + insensitive. The use of upper or lower case characters to define + token strings is for editorial clarity only. Implementations MUST + accept these strings in a case-insensitive fashion. + + flag_keyword ::= "$MDNSent" / other_keywords + + other_keywords ::= atom + +8. Acknowledgments + + This document is the product of discussions that took place on the + IMAP mailing list. Special gratitude to Cyrus Daboo and Randall + Gellens for reviewing the document. + + Thank you to my father who as he has helped to make me what I am. I + miss you terribly. + + + + +Melnikov Standards Track [Page 7] + +RFC 3503 MDN profile for IMAP March 2003 + + +9. Normative References + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [MDN] Fajman, R., "An Extensible Message Format for Message + Disposition Notifications", RFC 2298, March 1998. + + [IMAP4] Crispin, M., "Internet Message Access Protocol - Version + 4rev1", RFC 3501, March 2003. + + [ACL] Myers, J., "IMAP4 ACL extension", RFC 2086, January 1997. + +10. Author's Address + + Alexey Melnikov + ACI Worldwide/MessagingDirect + 59 Clarendon Road + Watford, Hertfordshire + United Kingdom, WD17 1FQ + + Phone: +44 1923 81 2877 + EMail: mel@messagingdirect.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Melnikov Standards Track [Page 8] + +RFC 3503 MDN profile for IMAP March 2003 + + +11. Full Copyright Statement + + Copyright (C) The Internet Society (2003). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Melnikov Standards Track [Page 9] + diff --git a/doc/rfc3516.txt b/doc/rfc3516.txt @@ -0,0 +1,451 @@ + + + + + + +Network Working Group L. Nerenberg +Request for Comments: 3516 Orthanc Systems +Category: Standards Track April 2003 + + + IMAP4 Binary Content Extension + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2003). All Rights Reserved. + +Abstract + + This memo defines the Binary extension to the Internet Message Access + Protocol (IMAP4). It provides a mechanism for IMAP4 clients and + servers to exchange message body data without using a MIME content- + transfer-encoding. + +1. Conventions Used in this Document + + The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" + in this document are to be interpreted as described in [KEYWORD]. + + The abbreviation "CTE" means content-transfer-encoding. + +2. Introduction + + The MIME extensions to Internet messaging allow for the transmission + of non-textual (binary) message content [MIME-IMB]. Since the + traditional transports for messaging are not always capable of + passing binary data transparently, MIME provides encoding schemes + that allow binary content to be transmitted over transports that are + not otherwise able to do so. + + The overhead of MIME-encoding this content can be considerable in + some contexts (e.g., slow radio links, streaming multimedia). + Reducing the overhead associated with CTE schemes such as base64 + + + + + + +Nerenberg Standards Track [Page 1] + +RFC 3516 IMAP4 Binary Content Extension April 2003 + + + can give a noticeable reduction in resource consumption. The Binary + extension lets the server perform CTE decoding prior to transmitting + message data to the client. + +3. Content-Transfer-Encoding Considerations + + Every IMAP4 body section has a MIME content-transfer-encoding. + (Those without an explicit Content-Transfer-Encoding header are + implicitly labeled as "7bit" content.) In the terminology of [MIME- + IMB], the CTE specifies both a decoding algorithm and the domain of + the decoded data. In this memo, "decoding" refers to the CTE + decoding step described in [MIME-IMB]. + + Certain CTEs use an identity encoding transformation. For these CTEs + there is no decoding required, however the domain of the underlying + data may not be expressible in the IMAP4 protocol (e.g., MIME + "binary" content containing NUL octets). To accommodate these cases + the Binary extension introduces a new type of literal protocol + element that is fully eight bit transparent. + + Thus, server processing of the FETCH BINARY command involves two + logical steps: + + 1) perform any CTE-related decoding + + 2) determine the domain of the decoded data + + Step 2 is necessary to determine which protocol element should be + used to transmit the decoded data. (See FETCH Response Extensions + for further details.) + +4. Framework for the IMAP4 Binary Extension + + This memo defines the following extensions to [IMAP4rev1]. + +4.1. CAPABILITY Identification + + IMAP4 servers that support this extension MUST include "BINARY" in + the response list to the CAPABILITY command. + +4.2. FETCH Command Extensions + + This extension defines three new FETCH command data items. + + BINARY<section-binary>[<partial>] + + Requests that the specified section be transmitted after + performing CTE-related decoding. + + + +Nerenberg Standards Track [Page 2] + +RFC 3516 IMAP4 Binary Content Extension April 2003 + + + The <partial> argument, if present, requests that a subset of + the data be returned. The semantics of a partial FETCH BINARY + command are the same as for a partial FETCH BODY command, with + the exception that the <partial> arguments refer to the DECODED + section data. + + BINARY.PEEK<section-binary>[<partial>] + + An alternate form of FETCH BINARY that does not implicitly set + the \Seen flag. + + BINARY.SIZE<section-binary> + + Requests the decoded size of the section (i.e., the size to + expect in response to the corresponding FETCH BINARY request). + + Note: client authors are cautioned that this might be an + expensive operation for some server implementations. + Needlessly issuing this request could result in degraded + performance due to servers having to calculate the value every + time the request is issued. + +4.3. FETCH Response Extensions + + This extension defines two new FETCH response data items. + + BINARY<section-binary>[<<number>>] + + An <nstring> or <literal8> expressing the content of the + specified section after removing any CTE-related encoding. If + <number> is present it refers to the offset within the DECODED + section data. + + If the domain of the decoded data is "8bit" and the data does + not contain the NUL octet, the server SHOULD return the data in + a <string> instead of a <literal8>; this allows the client to + determine if the "8bit" data contains the NUL octet without + having to explicitly scan the data stream for for NULs. + + If the server does not know how to decode the section's CTE, it + MUST fail the request and issue a "NO" response that contains + the "UNKNOWN-CTE" extended response code. + + + + + + + + + +Nerenberg Standards Track [Page 3] + +RFC 3516 IMAP4 Binary Content Extension April 2003 + + + BINARY.SIZE<section-binary> + + The size of the section after removing any CTE-related + encoding. The value returned MUST match the size of the + <nstring> or <literal8> that will be returned by the + corresponding FETCH BINARY request. + + If the server does not know how to decode the section's CTE, it + MUST fail the request and issue a "NO" response that contains + the "UNKNOWN-CTE" extended response code. + +4.4. APPEND Command Extensions + + The APPEND command is extended to allow the client to append data + containing NULs by using the <literal8> syntax. The server MAY + modify the CTE of the appended data, however any such transformation + MUST NOT result in a loss of data. + + If the destination mailbox does not support the storage of binary + content, the server MUST fail the request and issue a "NO" response + that contains the "UNKNOWN-CTE" extended response code. + +5. MIME Encoded Headers + + [MIME-MHE] defines an encoding that allows for non-US-ASCII text in + message headers. This encoding is not the same as the content- + transfer-encoding applied to message bodies, and the decoding + transformations described in this memo do not apply to [MIME-MHE] + encoded header text. A server MUST NOT perform any conversion of + [MIME-MHE] encoded header text in response to any binary FETCH or + APPEND request. + +6. Implementation Considerations + + Messaging clients and servers have been notoriously lax in their + adherence to the Internet CRLF convention for terminating lines of + textual data in Internet protocols. When sending data using the + Binary extension, servers MUST ensure that textual line-oriented + sections are always transmitted using the IMAP4 CRLF line termination + syntax, regardless of the underlying storage representation of the + data on the server. + + A server may choose to store message body binary content in a non- + encoded format. Regardless of the internal storage representation + used, the server MUST issue BODYSTRUCTURE responses that describe the + message as though the binary-encoded sections are encoded in a CTE + + + + + +Nerenberg Standards Track [Page 4] + +RFC 3516 IMAP4 Binary Content Extension April 2003 + + + acceptable to the IMAP4 base specification. Furthermore, the results + of a FETCH BODY MUST return the message body content in the format + described by the corresponding FETCH BODYSTRUCTURE response. + + While the server is allowed to modify the CTE of APPENDed <literal8> + data, this should only be done when it is absolutely necessary. + Gratuitous encoding changes will render useless most cryptographic + operations that have been performed on the message. + + This extension provides an optimization that is useful in certain + specific situations. It does not absolve clients from providing + basic functionality (content transfer decoding) that should be + available in all messaging clients. Clients supporting this + extension SHOULD be prepared to perform their own CTE decoding + operations. + +7. Formal Protocol Syntax + + The following syntax specification uses the augmented Backus-Naur + Form (ABNF) notation as used in [ABNF], and incorporates by reference + the Core Rules defined in that document. + + This syntax augments the grammar specified in [IMAP4rev1]. + + append =/ "APPEND" SP mailbox [SP flag-list] + [SP date-time] SP literal8 + + fetch-att =/ "BINARY" [".PEEK"] section-binary [partial] + / "BINARY.SIZE" section-binary + + literal8 = "~{" number "}" CRLF *OCTET + ; <number> represents the number of OCTETs + ; in the response string. + + msg-att-static =/ "BINARY" section-binary SP (nstring / literal8) + / "BINARY.SIZE" section-binary SP number + + partial = "<" number "." nz-number ">" + + resp-text-code =/ "UNKNOWN-CTE" + + section-binary = "[" [section-part] "]" + + + + + + + + + +Nerenberg Standards Track [Page 5] + +RFC 3516 IMAP4 Binary Content Extension April 2003 + + +8. Normative References + + [ABNF] Crocker, D., Editor, and P. Overell, "Augmented BNF for + Syntax Specifications: ABNF", RFC 2234, November 1997. + + [IMAP4rev1] Crispin, M., "Internet Message Access Protocol Version + 4rev1", RFC 3501, March 2003. + + [KEYWORD] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [MIME-IMB] Freed, N. and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part One: Format of Internet Message + Bodies", RFC 2045, November 1996. + + [MIME-MHE] Moore, K., "MIME (Multipurpose Internet Mail Extensions) + Part Three: Message Header Extensions for Non-ASCII + Text", RFC 2047, November 1996. + +9. Security Considerations + + There are no known additional security issues with this extension + beyond those described in the base protocol described in [IMAP4rev1]. + +10. Intellectual Property + + The IETF takes no position regarding the validity or scope of any + intellectual property or other rights that might be claimed to + pertain to the implementation or use of the technology described in + this document or the extent to which any license under such rights + might or might not be available; neither does it represent that it + has made any effort to identify any such rights. Information on the + IETF's procedures with respect to rights in standards-track and + standards-related documentation can be found in BCP-11. Copies of + claims of rights made available for publication and any assurances of + licenses to be made available, or the result of an attempt made to + obtain a general license or permission for the use of such + proprietary rights by implementors or users of this specification can + be obtained from the IETF Secretariat. + + The IETF invites any interested party to bring to its attention any + copyrights, patents or patent applications, or other proprietary + rights which may cover technology that may be required to practice + this standard. Please address the information to the IETF Executive + Director. + + + + + + +Nerenberg Standards Track [Page 6] + +RFC 3516 IMAP4 Binary Content Extension April 2003 + + +11. Author's Address + + Lyndon Nerenberg + Orthanc Systems + 1606 - 10770 Winterburn Road + Edmonton, Alberta + Canada T5S 1T6 + + EMail: lyndon@orthanc.ab.ca + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Nerenberg Standards Track [Page 7] + +RFC 3516 IMAP4 Binary Content Extension April 2003 + + +12. Full Copyright Statement + + Copyright (C) The Internet Society (2003). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Nerenberg Standards Track [Page 8] + diff --git a/man/Makefile.am b/man/Makefile.am @@ -0,0 +1,26 @@ +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +#-------------------------------------------------------------------------- +EXTRA_DIST=bincimapd.1 bincimap-up.1 bincimap.conf.5 + +#-------------------------------------------------------------------------- +install-exec-hook: + $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 + $(INSTALL_DATA) $(srcdir)/bincimapd.1 $(DESTDIR)$(mandir)/man1 + $(INSTALL_DATA) $(srcdir)/bincimap-up.1 $(DESTDIR)$(mandir)/man1 + $(mkinstalldirs) $(DESTDIR)$(mandir)/man5 + $(INSTALL_DATA) $(srcdir)/bincimap.conf.5 $(DESTDIR)$(mandir)/man5 + +#-------------------------------------------------------------------------- +uninstall-hook: + rm $(DESTDIR)$(mandir)/man1/bincimapd.1 + rm $(DESTDIR)$(mandir)/man1/bincimap-up.1 + rm $(DESTDIR)$(mandir)/man5/bincimap.conf.5 diff --git a/man/bincimap-up.1 b/man/bincimap-up.1 @@ -0,0 +1,280 @@ +.TH bincimap-up 1 +.SH "NAME" +bincimap-up \- Authentication stub for Binc IMAP + +.SH "SYNOPSIS" +.B bincimap-up [ options... ] -- <authenticator> bincimapd + +.SH "DESCRIPTION" + +For more information about Binc IMAP, see the +.B bincimapd +man pages. + +To configure this stub, use either command line arguments, config file +entries, or a +.B combination +of both. A subset of the config file options is available as command +line options. + +Note that command line arguments always override config file options. + +.SH "OPTIONS" + +Long options are not supported on all platforms, so if you experience +problems with them, please use the short options instead. + +.TP +\fB\-a, \-\-allow-plain\fR +If set, allows plain text authentication in an unencrypted (SSL/TLS) +IMAP session. + +.TP +\fB\-p, \-\-auth-penalty=<n>\fR +Server will sleep for <n> seconds if the client issues a +username/password pair that fails to authenticate. + +.TP +\fB\-t, \-\-auth-timeout=<n>\fR +When the server is in unauthenticated mode, and does not detect any +client activity, it will wait <n> seconds before closing (t/o) the +connection. <n> can not be less than 30 seconds. + +.TP +\fB\-f, \-\-ca-file=<file>\fR +A file used to list certificate authorities in. It is sent to the +client to help the client verify the SSL certificate. + +.TP +\fB\-P, \-\-ca-path=<path>\fR +A path used by the underlying SSL support to search for files with +certificate authorities. + +.TP +\fB\-l, \-\-cipher-list=<ciphers>\fR +Sets the list of available SSL ciphers. + +.TP +\fB\-c, \-\-conf=<file>\fR +Location of +.I bincimap.conf +file. + +.TP +\fB\-C, \-\-create-inbox\fR +If set, server will create the default mailbox +.B INBOX +on first login if it does not exist. + +.TP +\fB\-d, \-\-disable-starttls\fR +Do not advertise the STARTTLS capability. Use this when running Binc +IMAP in plain text over an already SSL encrypted tunnel. Default: +.B no. + +.TP +\fB\-h, -?, \-\-help\fR +Displays basic usage. + +.TP +\fB\-I, \-\-ip\-variable=<var>\fR +For logging, suggests an environment variable that contains the +remote host IP address. + +.TP +\fB\-i, \-\-idle-timeout=<n>\fR +When the server is in authenticated mode, and does not detect any +client activity, it will wait <n> seconds before closing (t/o) the +connection. <n> can not be less than 1800 seconds. + +.TP +\fB\-J, \-\-jail-path=<path>\fR +Which path bincimap-up should chroot to after starting bincimapd. + +.TP +\fB\-K, \-\-jail-user=<userid>\fR +Which user bincimap-up should become after starting bincimapd. + +.TP +\fB\-j, \-\-jail-group=<groupid>\fR +Which user bincimap-up should become after starting bincimapd. + +.TP +\fB\-L, \-\-logtype=[syslog|multilog]\fR +Which method +.B Binc IMAP +should use to log. +.I syslog +means to connect to syslog. +.I multilog +means to log to stderr(2). Typically used together with +the +.I multilog +utility. For xinetd, use +.I syslog. +For daemontools/supervise, use +.I multilog. Default: +.B syslog. + +.TP +\fB\-m, \-\-mailbox-path=<path>\fR +Path to mailbox relative from user's home area. Typically +.B Maildir +for Maildir mailboxes, or the empty string "" if the home area is +equivalent to the Maildir directory. + +.TP +\fB\-M, \-\-mailbox-type=<type>\fR +Which type of mailbox should the server use? Currently only supports +.B Maildir. + +.TP +\fB\-p, \-\-pem-file=<file>\fR +The path to the SSL certificate file, in PEM format. + +.TP +\fB\-s, \-\-ssl\fR +If set, +.B Binc +will go straight into SSL server mode. If this option +is not passed, +.B Binc +will still advertise +.B STARTTLS, +allowing clients to switch to SSL on need. Use +.B \-\-ssl +if running +.B Binc +on port +.B 993. + +.TP +\fB\-S, \-\-subscribe-mailboxes=<mailboxes>\fR +If present, server will +automatically subscribe client to the given list of mailboxes on first +login. Mailbox list is given as a comma separated list with the +mailbox' full path, for example +.I INBOX,INBOX.Sent-Mail,INBOX.Trash +. + +.TP +\fB\-b, \-\-transfer-buffersize=<n>\fR +The server will buffer up to <n> bytes of data before sending it off +to the client. A lower value will give smoother response from the +server, but is a bad idea for clients with a big RTT (for example +dial-ins). A high value gives better throughput, but a more bulky +transfer. + +.TP +\fB\-T, \-\-transfer-timeout=<n>\fR +The server writes data to the client in bulks. Each bulk gets <n> +seconds to complete before the server times out. + +.TP +\fB\-u, \-\-umask=<umask>\fR +Server will use this umask throughout session. Defaults to user's +default umask. + + +.TP +\fB\-V, \-\-verify-peer\fR +If set, server will attempt to verify peer certificate. + +.TP +\fB\-v, \-\-version\fR +Shows Binc IMAP version. + +.TP +\fB\-\-\fR +Marks the end of options to +.B bincimap-up. +After this comes the checkpassword compatible authenticator. + +.TP +\fB(trailing arguments)\fR +Binc IMAP's authenticator. The first argument is invoked as an +authenticator subprocess of Binc, with the rest of the arguments +passed as the authenticator's local arguments. + +.SH "EXAMPLE INVOCATION" + +The following example shows how to invoke Binc IMAP using multilog, +with an example +.B /opt +location for the conf file and using +.I checkpassword +as the authenticator. Notice that both the authentication stub and +the authenticated daemon must both have command line arguments, and that +the authenticator comes after '--'. + +.RS +.nf +/opt/bincimap/bin/bincimap-up \\ + --conf=/opt/bincimap/etc/bincimap.conf \\ + -- \\ + /bin/checkpassword \\ + /opt/bincimap/bin/bincimapd +.fi +.RE + +You will typically invoke +.B bincimapd +from either +.I xinetd +or +.I supervise. + +.SH "FILES" + +All +.B Binc IMAP's +configuration files use the same +.B Binc::Storage +format. It's basically a sequence of named +.B sections +enclosed in +.B {braces}, +each containing a set of comma separated +.B key=value +pairs. The +.B keys +must be alphanumeric, and the values can contain +any character if it's +.B quoted. + +.TP +\fB.I bincimap.conf\fR +Global configurations file. All entries in this file can be overrun +with command line arguments. + +.SH "COPYRIGHT" +Copyright (C) 2002, 2003 Andreas Aardal Hanssen + +This is free software; see the source for copying conditions. There is +NO warranty. + +.SH "NOTE" +Please report any bugs to the +.B Binc IMAP +mailing list. Before posting your bug, check out the +.B Binc IMAP +official home page for a list of mailing list archives +to browse. + +.RS +.nf +Mailing list: <lists-bincimap@infeline.org> +Home page: http://www.bincimap.org/ +.fi +.RE + +.SH "AUTHOR" +Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> + +.RE +.SH "SEE ALSO" +bincimapd(1) bincimap.conf(5) multilog(8) supervise(8) tcpserver(1) xinetd(8) xinetd.conf(5) + +.B Note: +The first three man pages are available for download from +.I http://www.qmail.org/. diff --git a/man/bincimap.conf.5 b/man/bincimap.conf.5 @@ -0,0 +1,285 @@ +.TH bincimap.conf 5 +.SH "NAME" +bincimap.conf \- Global configuration file for +.B Binc IMAP + +.SH "EXAMPLE" +A section of a bincimap.conf file might look something like this: + +.RS +.nf +Authentication { + allow plain auth in non ssl = "no", + auth penalty = 4, + disable starttls = "no" +} +.fi +.RE + + +.SH "INTRODUCTION" + +This manual page describes the format and content of the +file +.I bincimap.conf. +First comes a summary of sections of options that users can set, then +we describe the bincimap.conf structure more in detail. + +All +.B Binc IMAP's +configuration files use the same +.B Binc::Storage +format. It's basically a sequence of named +.B sections +enclosed in +.B {braces}, +each containing a set of comma separated +.B key=value +pairs. The +.B keys +must be alphanumeric, and the values can contain +any character if it's +.B quoted. + +.SH "SUMMARY" + +Options are presented in the format +.B Section::name. +To set the option, enter the name with no quotes in the section +as described in +.B FORMAT +below. + +The following options can be set in +.I bincimap.conf. + +.TP +\fBAuthentication::allow plain auth in non ssl = [yes|no] \fR +If yes, allows plain text authentication in an unencrypted (SSL/TLS) +IMAP session. + +.TP +\fBAuthentication::auth penalty = <n>\fR +Server will sleep for <n> seconds if the client issues a +username/password pair that fails to authenticate. + +.TP +\fBLog::environment ip variable = <var>\fR +Which environment variable bincimapd should search for the +remote host IP in. + +.TP +\fBLog::syslog facility = <var>\fR +If syslog mode is used, sets the facility to log to. Default +is LOG_DAEMON. Allowed values are LOG_USER and LOG_LOCAL0-LOG_LOCAL7. + +.TP +\fBLog::syslog facility number = <nr>\fR +If syslog mode is used, sets the facility number to log to. Default +is the value of LOG_DAEMON. + +.TP +\fBLog::type = <type>\fR +Which method +.B Binc IMAP +should use to log. +.I syslog +means to connect to syslog. +.I multilog +means to log to stderr(2). Typically used together with +the +.I multilog +utility. For xinetd, use +.I syslog. +For daemontools/supervise, use +.I multilog. + +.TP +\fBMailbox::type = <type>\fR +Which type of mailbox should the server use? By default, only supports only +.B Maildir. + +.TP +\fBMailbox::depot = <type>\fR +Which type of depot should the server use? By default, supports only +.B IMAPdir +and +.B Maildir++. + +.TP +\fBMailbox::path = <path>\fR +Path to depot relative from user's home area. Typically +.B Maildir +for Maildir mailboxes, or the empty string "" if the home area is +the same as the Maildir directory. + +.TP +\fBMailbox::auto create inbox = [yes|no]\fR +If yes, server will create the default mailbox +.B INBOX +on first login if it does not exist. + +.TP +\fBMailbox::auto subscribe mailboxes = <mailboxes>\fR +If present, server will +automatically subscribe client to the given list of mailboxes on first +login. Mailbox list is given as a comma separated list with the +mailbox' full path, for example +.I INBOX,INBOX.Sent-Mail,INBOX.Trash +. + +.TP +\fBMailbox::umask = <umask>\fR +Server will use this umask throughout session. Defaults to user's +default umask. + +.TP +\fBSecurity::jail path = <path>\fR +Which path bincimap-up should chroot to after starting bincimapd. + +.TP +\fBSecurity::jail user = <userid>\fR +Which user bincimap-up should become after starting bincimapd. + +.TP +\fBSecurity::jail group = <groupid>\fR +Which group bincimap-up should enter after starting bincimapd. + +.TP +\fBSecurity::version in greeting = [yes|no]\fR +When set to "yes", Binc IMAP will display its version number in the +greeting displayed to clients when they connect; otherwise no version +number is displayed. This version number is useful for debugging and +identifying the service, but it is also useful for malicious users who +wish to identify versions to exploit known security holes. + +.TP +\fBSession::idle timeout = <n>\fR +When the server is in authenticated mode, and does not detect any +client activity, it will wait <n> seconds before closing (t/o) the +connection. <n> can not be less than 1800 seconds. + +.TP +\fBSession::auth timeout = <n>\fR +When the server is in unauthenticated mode, and does not detect any +client activity, it will wait <n> seconds before closing (t/o) the +connection. <n> can not be less than 30 seconds. + +.TP +\fBSession::transfer timeout = <n>\fR +The server writes data to the client in bulks. Each bulk gets <n> +seconds to complete before the server times out. + +.TP +\fBSession::transfer buffer size = <n>\fR +The server will buffer up to <n> bytes of data before sending it off +to the client. A lower value will give smoother response from the +server, but is a bad idea for clients with a big RTT (for example +dial-ins). A high value gives better throughput, but a more bulky +transfer. + +.TP +\fBSSL::pem file = <file>\fR +The path to the SSL certificate file, in PEM format. + +.TP +\fBSSL::ca file = <file>\fR +A file used to list certificate authorities in. It is sent to the +client to help the client verify the SSL certificate. + +.TP +\fBSSL::cipher list = <cipherlist>\fR +Sets the list of available SSL ciphers. + +.TP +\fBSSL::verify peer = [yes|no]\fR +If yes, server will attempt to verify peer certificate. + +.SH "FORMAT" + +This file format is named +.B Binc::Storage, +after its C++ class name. + +The file starts with an optional list of aliases. These aliases start +with a question mark '?', followed by the alias, a colon ':', the +replacement text, and finally a semicolon ';'. This example defines +the alias "m" to represent the text "myfirstsection": + +.RS +.nf +?m:MyFirstSection; +.fi +.RE + +A section starts with an identifier, or a name. The name contains only +alphanumeric characters, and it's case sensitive. The section itself +is enclosed in braces. + +.RS +.nf +MyFirstSection { + +} +.fi +.RE + +Inside a section, we have a comma separated list of +.B key=value +pairs. The key consists of a sequence of one or more alphanumeric +words. The value can also contain quoted strings. + +.RS +.nf +MyFirstSection { + certificate path = "/etc/path/certificate.txt", + optional argument = "yes" +} +.fi +.RE + +The +.B aliases +that we could define at the start of the +.B bincimap.conf +file are useful if we wish to abbreviate long words in a key +or section name, to save space. Normally this is only used +in generated files, but they can also make a manually edited +conf file more compact: + +.RS +.nf +m { + certificate path = "/etc/path/certificate.txt", + optional argument = "yes" +} +.fi +.RE + +.SH "COPYRIGHT" +Copyright (C) 2002, 2003 Andreas Aardal Hanssen + +This is free software; see the source for copying conditions. There is +NO warranty. + +.SH "NOTE" +Please report any bugs to the +.B Binc IMAP +mailing list. Before posting your bug, check out the +.B Binc IMAP +official home page for a list of mailing list archives +to browse. + +.RS +.nf +Mailing list: <lists-bincimap@infeline.org> +Home page: http://www.bincimap.org/ +.fi +.RE + +.SH "AUTHOR" +Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> + +.RE +.SH "SEE ALSO" +bincimapd(1) bincimap.conf(5) multilog(8) supervise(8) tcpserver(1) xinetd(8) xinetd.conf(5) diff --git a/man/bincimapd.1 b/man/bincimapd.1 @@ -0,0 +1,128 @@ +.TH bincimapd 1 +.SH "NAME" +bincimapd \- IMAP4rev1 server + +.SH "SYNOPSIS" +.B bincimap-up [ options... ] -- <authenticator> bincimapd + +.SH "DESCRIPTION" + +.B Binc IMAP +is a simple +.B xinetd +/ +.B tcpserver +invoked IMAP4rev1 server with support for +.B Maildir. +It is very easy to install and use. + +To configure +.B Binc IMAP, +use either command line arguments, configuration file +entries, or a +.B combination +of both. + +Note that command line arguments always override config file options. + +.SH "OPTIONS" + +As of version 1.1.6, bincimapd only optionally takes command line +options. The default behavior is to inherits options from bincimap-up +through the environment. Passing arguments to bincimapd will override +settings inherited from bincimap-up. + +For a complete listing of options for bincimapd, see the bincimap-up +man page. + +Local options are read through the file .bincimap, located at the +current working directory that bincimapd is invoked in, before it +enters the depository path. + +.SH "FILES" + +All +.B Binc IMAP's +configuration files use the same +.B Binc::Storage +format. It's basically a sequence of named +.B sections +enclosed in +.B {braces}, +each containing a set of comma separated +.B key=value +pairs. The +.B keys +must be alphanumeric, and the values can contain +any character if it's +.B quoted. + +.TP +.I $HOME/.bincimap +Local configurations file. This file has a similar structure to the +global +.I bincimap.conf +file, and it can be set by each user to override both command line +arguments and the global configuration. It only works for a few +selected options, though. + +.TP +.I $HOME/<maildepot>/.../bincimap-uidvalidity +This file contains a version number, and the +.B UIDNEXT +and +.B UIDVALIDITY +values for the given mailbox. + +.TP +.I $HOME/<maildepot>/.../bincimap-cache +This file contains a version number, and it stores the +.B UID +values for each message, along with (optionally) some cached +information. + +.SH "ENVIRONMENT" + +bincimapd reads its configuration from the environment, as passed by +bincimap-up. In addition, bincimapd reads the variable +.B BINCIMAP_LOGIN +which contains a message from bincimap-up with the tag and command +used to authenticate, separated by a +. If the tag and command used +to authenticate were "1 LOGIN", then +.B BINCIMAP_LOGIN +would be set to "LOGIN+1". + +Note that it is essential that the authenticator invoked by +bincimap-up does not clear the environment. + +.SH "COPYRIGHT" +Copyright (C) 2002, 2003 Andreas Aardal Hanssen + +This is free software; see the source for copying conditions. There is +NO warranty. + +.SH "NOTE" +Please report any bugs to the +.B Binc IMAP +mailing list. Before posting your bug, check out the +.B Binc IMAP +official home page for a list of mailing list archives +to browse. + +.RS +.nf +Mailing list: <lists-bincimap@infeline.org> +Home page: http://www.bincimap.org/ +.fi +.RE + +.SH "AUTHOR" +Andreas Aardal Hanssen <bincimap@andreas.hanssen.name> + +.RE +.SH "SEE ALSO" +bincimapd.conf(5) bincimap-up(1) multilog(8) supervise(8) tcpserver(1) xinetd(8) xinetd.conf(5) + +.B Note: +The first three man pages are available for download from +.I http://www.qmail.org/. diff --git a/service/Makefile.am b/service/Makefile.am @@ -0,0 +1,32 @@ +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +#-------------------------------------------------------------------------- +EXTRA_DIST=down run run-ssl + +#-------------------------------------------------------------------------- +SUBDIRS=log + +#-------------------------------------------------------------------------- +install-exec-hook: + $(mkinstalldirs) $(DESTDIR)$(sysconfdir)/service/imap + + @if [ ! -e $(DESTDIR)$(sysconfdir)/service/imap/run ]; then $(INSTALL_DATA) -m 0755 $(srcdir)/run $(DESTDIR)$(sysconfdir)/service/imap/run; else $(INSTALL_DATA) -m 0755 $(srcdir)/run $(DESTDIR)$(sysconfdir)/service/imap/run.new; echo "- New service/imap/run file saved as $(DESTDIR)$(sysconfdir)/service/imap/run.new" >> $(srcdir)/../install.log; fi; + $(INSTALL_DATA) -m 0644 $(srcdir)/down $(DESTDIR)$(sysconfdir)/service/imap/down + $(mkinstalldirs) $(DESTDIR)$(sysconfdir)/service/imaps + @if [ ! -e $(DESTDIR)$(sysconfdir)/service/imaps/run ]; then $(INSTALL_DATA) -m 0755 $(srcdir)/run-ssl $(DESTDIR)$(sysconfdir)/service/imaps/run; else $(INSTALL_DATA) -m 0755 $(srcdir)/run-ssl $(DESTDIR)$(sysconfdir)/service/imaps/run.new; echo "- New service/imaps/run file saved as $(DESTDIR)$(sysconfdir)/service/imaps/run.new" >> $(srcdir)/../install.log; fi; + $(INSTALL_DATA) -m 0644 $(srcdir)/down $(DESTDIR)$(sysconfdir)/service/imaps/down + +#-------------------------------------------------------------------------- +uninstall-hook: + rm $(DESTDIR)$(sysconfdir)/service/imap/run + rm $(DESTDIR)$(sysconfdir)/service/imaps/run + rm $(DESTDIR)$(sysconfdir)/service/imap/down + rm $(DESTDIR)$(sysconfdir)/service/imaps/down diff --git a/service/down b/service/down diff --git a/service/log/Makefile.am b/service/log/Makefile.am @@ -0,0 +1,30 @@ +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +#-------------------------------------------------------------------------- +EXTRA_DIST=run run-ssl down + +#-------------------------------------------------------------------------- +install-exec-hook: + $(mkinstalldirs) $(DESTDIR)$(sysconfdir)/service/imap/log + @if [ ! -e $(DESTDIR)$(sysconfdir)/service/imap/log/run ]; then $(INSTALL_SCRIPT) -m 0755 $(srcdir)/run $(DESTDIR)$(sysconfdir)/service/imap/log/run; else $(INSTALL_SCRIPT) -m 0755 $(srcdir)/run $(DESTDIR)$(sysconfdir)/service/imap/log/run.new; echo "- New service/imap/run file saved as $(DESTDIR)$(sysconfdir)/service/imap/log/run.new" >> $(srcdir)/../../install.log; fi + $(INSTALL_SCRIPT) -m 0644 $(srcdir)/down $(DESTDIR)$(sysconfdir)/service/imap/log/down + $(mkinstalldirs) $(DESTDIR)$(sysconfdir)/service/imaps/log + @if [ ! -e $(DESTDIR)$(sysconfdir)/service/imaps/log/run ]; then $(INSTALL_SCRIPT) -m 0755 $(srcdir)/run-ssl $(DESTDIR)$(sysconfdir)/service/imaps/log/run; else $(INSTALL_SCRIPT) -m 0755 $(srcdir)/run-ssl $(DESTDIR)$(sysconfdir)/service/imaps/log/run.new; echo "- New service/imaps/run file saved as $(DESTDIR)$(sysconfdir)/service/imaps/log/run.new" >> $(srcdir)/../../install.log; fi; + $(INSTALL_SCRIPT) -m 0644 $(srcdir)/down $(DESTDIR)$(sysconfdir)/service/imaps/log/down + $(mkinstalldirs) $(DESTDIR)$(localstatedir)/log/bincimap + $(mkinstalldirs) $(DESTDIR)$(localstatedir)/log/bincimap-ssl + +#-------------------------------------------------------------------------- +uninstall-hook: + rm $(DESTDIR)$(sysconfdir)/service/imap/log/run + rm $(DESTDIR)$(sysconfdir)/service/imaps/log/run + rm $(DESTDIR)$(sysconfdir)/service/imap/log/down + rm $(DESTDIR)$(sysconfdir)/service/imaps/log/down diff --git a/service/log/down b/service/log/down diff --git a/service/log/run-ssl.in b/service/log/run-ssl.in @@ -0,0 +1,18 @@ +#!/bin/sh +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +# $Id: run-ssl.in,v 1.1 2003/08/23 12:53:25 andreaha Exp $ +# daemontools supervise run-file for Binc IMAP Service. + +exec 2>&1 + +exec multilog t n5 s1048576 @localstatedir@/log/bincimap-ssl + diff --git a/service/log/run.in b/service/log/run.in @@ -0,0 +1,18 @@ +#!/bin/sh +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +# $Id: run.in,v 1.1 2003/08/23 12:53:25 andreaha Exp $ +# daemontools supervise run-file for Binc IMAP Service. + +exec 2>&1 + +exec multilog t n5 s1048576 @localstatedir@/log/bincimap + diff --git a/service/run-ssl.in b/service/run-ssl.in @@ -0,0 +1,14 @@ +#!/bin/sh +# $Id: run-ssl.in,v 1.1.1.1 2003/08/18 18:06:05 andreaha Exp $ +# daemontools supervise run-file for Binc IMAP Service. + +exec 2>&1 + +exec tcpserver -c 100 -u 0 -g 0 \ + -l $(hostname) -HDRP \ + 0 993 \ + @prefix@/bin/bincimap-up \ + --logtype=multilog \ + --conf=@sysconfdir@/bincimap.conf --ssl -- \ + /bin/checkpassword \ + @prefix@/bin/bincimapd diff --git a/service/run.in b/service/run.in @@ -0,0 +1,16 @@ +#!/bin/sh +# $Id: run.in,v 1.1.1.1 2003/08/18 18:06:05 andreaha Exp $ +# daemontools supervise run-file for Binc IMAP Service. + +exec 2>&1 + +exec tcpserver -c 100 -u 0 -g 0 \ + -l $(hostname) -HDRP \ + 0 143 \ + @prefix@/bin/bincimap-up \ + --logtype=multilog \ + --conf=@sysconfdir@/bincimap.conf -- \ + /bin/checkpassword \ + @prefix@/bin/bincimapd + + diff --git a/src/Makefile.am b/src/Makefile.am @@ -0,0 +1,30 @@ +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +#-------------------------------------------------------------------------- +bin_PROGRAMS = bincimapd bincimap-up + +#-------------------------------------------------------------------------- +bincimapd_SOURCES = address.cc address.h arg-arg.cc arg-arg.h arg-checkers.h arg-error.cc arg-error.h arg-parser.cc arg-parser.h authenticate.cc base64.cc base64.h bincimapd.cc broker.cc broker.h convert.cc convert.h depot.h depot.cc imapparser.cc imapparser.h io.cc io.h mailbox.cc mailbox.h maildir.cc maildir-close.cc maildir-create.cc maildir-delete.cc maildir-expunge.cc maildir.h maildir-readcache.cc maildir-scan.cc maildir-scanfilesnames.cc maildir-select.cc maildir-updateflags.cc maildir-writecache.cc message.h maildirmessage.cc maildirmessage.h bincimapd-module.cc bincimapd-module.h mime.cc mime-getpart.cc mime.h mime-parsefull.cc mime-parseonlyheader.cc mime-printbody.cc mime-printdoc.cc mime-printheader.cc mime-utils.h operators.h operator-authenticate.cc operator-capability.cc operator-noop.cc operator-noop-pending.cc operator-login.cc operator-logout.cc operators.h operator-append.cc operator-examine.cc operator-select.cc operator-create.cc operator-delete.cc operator-list.cc operator-lsub.cc operator-rename.cc operator-status.cc operator-subscribe.cc operator-unsubscribe.cc operators.h operator-check.cc operator-close.cc operator-copy.cc operator-expunge.cc operator-fetch.cc operator-search.cc operator-store.cc pendingupdates.cc pendingupdates.h recursivedescent.cc recursivedescent.h regmatch.cc regmatch.h session.h session.cc session-initialize-bincimapd.cc status.cc status.h storage.cc storage.h tools.cc tools.h + +#-------------------------------------------------------------------------- +bincimap_up_SOURCES = arg-arg.cc arg-arg.h arg-checkers.h arg-error.cc arg-error.h arg-parser.cc arg-parser.h authenticate.cc authenticate.h base64.cc base64.h bincimap-up.cc broker.cc broker.h convert.cc convert.h greeting.cc imapparser.cc imapparser.h io.cc io.h io-ssl.cc io-ssl.h operators.h operator-authenticate.cc operator-capability.cc operator-noop.cc operator-login.cc operator-logout.cc operator-starttls.cc recursivedescent.cc recursivedescent.h session.h session.cc session-initialize-bincimap-up.cc status.cc status.h storage.cc storage.h tools.cc tools.h + +#-------------------------------------------------------------------------- +bincimap_up_LDADD = @LIBSSL@ @LIBDL@ + +#-------------------------------------------------------------------------- +bincimapd_LDADD = @LIBDL@ + +#-------------------------------------------------------------------------- +bincimapd_LDFLAGS = @STATIC@ -DBINCIMAPD + +#-------------------------------------------------------------------------- +bincimap_up_LDFLAGS = @STATIC@ diff --git a/src/address.cc b/src/address.cc @@ -0,0 +1,96 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * address.cc + * + * Description: + * Implementation of the Address class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "address.h" +#include "convert.h" +#include <string> + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +Address::Address(const string &name, const string &addr) +{ + string::size_type pos = addr.find('@'); + this->name = name; + if (pos != string::npos) { + this->local = addr.substr(0, pos); + this->host = addr.substr(pos + 1); + } else this->local = addr; +} + +//------------------------------------------------------------------------ +Address::Address(const string &wholeaddress) +{ + string::size_type start = wholeaddress.find('<'); + string addr; + if (start != string::npos) + addr = wholeaddress.substr(start + 1); + else + addr = wholeaddress; + + trim(addr, "<>"); + + if (start != string::npos) + name = wholeaddress.substr(0, start); + else + name = ""; + trim(name); + trim(name, "\""); + + start = addr.find('@'); + local = addr.substr(0, start); + host = addr.substr(start + 1); + + trim(local); + trim(host); + trim(name); +} + +//------------------------------------------------------------------------ +string Address::toParenList(void) const +{ + string tmp = "("; + tmp += name == "" ? "NIL" : toImapString(name); + tmp += " NIL "; + tmp += local == "" ? "\"\"" : toImapString(local); + tmp += " "; + tmp += host == "" ? "\"\"" : toImapString(host); + tmp += ")"; + + return tmp; +} diff --git a/src/address.h b/src/address.h @@ -0,0 +1,60 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/mailbox/address.h + * + * Description: + * Declaration of the Address class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef address_h_included +#define address_h_included +#include <string> + +namespace Binc { + + //------------------------------------------------------------------------ + class Address { + public: + std::string name; + std::string local; + std::string host; + + //-- + std::string toParenList(void) const; + + //-- + Address(const std::string &name, const std::string &addr); + Address(const std::string &wholeaddr); + }; +} + +#endif diff --git a/src/arg-arg.cc b/src/arg-arg.cc @@ -0,0 +1,93 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * arg-arg.cc + * + * Description: + * Implementation of standard command line types + * + * Authors: + * Eivind Kvedalen <argparser@eivind.kvedalen.name> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2003 Eivind Kvedalen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ + +#include "arg-arg.h" +#include <stdlib.h> + +using namespace ArgParser; +using namespace std; + +void ArgParser::setValue(const string &name, int &value, const char * a, ArgumentError & error) +{ + if (a != NULL) { + char * end; + value = strtol(a, &end, 10); + if (*end != '\0') error = ArgumentError(ArgumentError::INVALID, name); + // cout << "int argument " << "name" << " = " << value << endl; + } + else + error = ArgumentError(ArgumentError::MISSING, name); +} + +void ArgParser::setValue(const string &name, float &value, const char * a, ArgumentError & error) +{ + if (a != NULL) { + char * end; + value = strtod(a, &end); + if (*end != '\0') error = ArgumentError(ArgumentError::INVALID, name); + // cout << "float argument " << name << " = " << value << endl; + } + else + error = ArgumentError(ArgumentError::MISSING, name); +} + +void ArgParser::setValue(const string &name, string &value, const char * a, ArgumentError & error) +{ + if (a != NULL) { + value = a; + // cout << "string argument " << name << " = " << value << endl; + } + else + error = ArgumentError(ArgumentError::MISSING, name); +} + +string ArgT<bool>::getParam(void) const +{ + return ""; +} + +string ArgT<int>::getParam(void) const +{ + return "=integer[" + Binc::toString(valueRef) + "]"; +} + +string ArgT<float>::getParam(void) const +{ + return "=number"; +} + +string ArgT<string>::getParam(void) const +{ + return "=string[" + valueRef + "]"; +} diff --git a/src/arg-arg.h b/src/arg-arg.h @@ -0,0 +1,205 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * arg-arg.h + * + * Description: + * Class encapsulating one argument + * + * Authors: + * Eivind Kvedalen <argparser@eivind.kvedalen.name> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2003 Eivind Kvedalen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ + +#ifndef _ARG_ARG_H +#define _ARG_ARG_H + +#include "arg-error.h" +#include "arg-checkers.h" +#include <string> +#include <vector> +#include <map> +#include <iostream> + +namespace ArgParser { + + // Base abstract class for one argument + + class Arg { + protected: + int num; + std::string name; + bool used; + public: + const static int OPTIONAL = 0; + const static int REQUIRED = 1; + Arg(int nu, const std::string &n) : num(nu), name(n), used(false) { } + virtual ~Arg(void) { } + virtual bool parse(const char * a, ArgumentError & error) = 0; + virtual std::string getParam(void) const = 0; + virtual void assign(void) = 0; + bool isUsed(void) { return used; } + template<class T> void get(T &v) = 0; + friend class Args; + }; + + // template function to set argument value + + + template<class T> void setValue(const std::string &name, T&value, + const char * param, + ArgumentError & Error) { + // std::cerr << "Unimplemented setValue invoked" << endl; + error = ArgumentError(ArgumentError::INVALID); + } + + template<class T> class ArgT : public Arg { + T value; + T & valueRef; + int type; + checker<T> & sc; + public: + ArgT(int n, const std::string &name, T & v, int t, checker<T> & _sc) : + Arg(n, name), + valueRef(v), + type(t), + sc(_sc) { + value = v; + } + + virtual void assign(void) { + valueRef = value; + } + + virtual void get(T &v) { + v = value; + } + + + std::string getParam(void) const; + + virtual bool parse(const char * a, ArgumentError & error) { + used = true; + setValue(name, value, a, error); + std::string err; + if (!sc(value, err)) { + error = ArgumentError(ArgumentError::CHECK, name, err); + return a == NULL ? false : true; + } + return true; + } + }; + + // Standard types: int, float, and std::string, vectors and maps + + void setValue(const std::string &name, int &value, const char * a, ArgumentError & error); + void setValue(const std::string &name, float &value, const char * a, ArgumentError & error); + void setValue(const std::string &name, std::string &value, const char * a, ArgumentError & error); + + template<class T> void setValue(const std::string &name, + std::vector<T> &value, + const char * a, + ArgumentError & error) + { + // cerr << "setValue vector<T>" << endl; + if (a != NULL) { + T arg; + setValue(name, arg, a, error); + // cout << "vector<T> argument " << name << " = " << arg << endl; + value.push_back(arg); + } + else + error = ArgumentError(ArgumentError::MISSING, name); + } + + template<class K, class V> void setValue(const std::string &name, + std::map<K, V> &value, + const char * a, + ArgumentError & error) + { + // cerr << "setValue map<K, V>" << endl; + if (a != NULL) { + K key; + V val; + std::string k(a); + char * eq = strchr(a, '='); + while (eq != NULL && eq != a && (*(eq-1) == '\\')) + eq = strchr(eq + 1, '='); + if (eq == NULL) { + error = ArgumentError(ArgumentError::MISSING, name); + return; + } + k.resize(eq - a); + std::string::size_type p = k.find("\\="); + while (p != std::string::npos) { + k = k.substr(0, p) + k.substr(p + 1); + p = k.find("\\="); + } + std::string v(eq + 1); + setValue(name, key, k.c_str(), error); + setValue(name, val, v.c_str(), error); + cout << "vector<T> argument " << name << " = (" + << k << " => " << val << ")" << endl; + value[key] = val; + } + else + error = ArgumentError(ArgumentError::MISSING, name); + } + + class StringBoolArg { + std::string & target; + std::string yes; + std::string no; + public: + StringBoolArg(std::string &t, + const std::string &y = "yes", + const std::string &n ="no") + : target(t), yes(y), no(n) + { + target = no; + } + void set(void) { + target = yes; + } + }; + + template<> + inline bool ArgParser::ArgT<bool>::parse(const char * a, ArgumentError & error) + { + used = true; + value = true; + return false; + } + + template<> + inline bool ArgParser::ArgT<StringBoolArg>::parse(const char * a, ArgumentError & error) + { + used = true; + value.set(); + return false; + } + +} + +#endif diff --git a/src/arg-checkers.h b/src/arg-checkers.h @@ -0,0 +1,129 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * arg-checkers.h + * + * Description: + * Checker classes for Argument Parser + * + * Authors: + * Eivind Kvedalen <argparser@eivind.kvedalen.name> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Eivind Kvedalen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ + +#ifndef _ARG_CHECKERS_H +#define _ARG_CHECKERS_H + +#include <string> +#include "convert.h" +#include <functional> +#include <set> + +namespace ArgParser { + + // + // Argument checkers + // + + // check interface + + template<class T> class checker : public std::unary_function<T, bool> { + public: + virtual bool operator()(const T &value, std::string & error) const = 0; + }; + + // Default checker, always returns true + + template<class T> class ok_function : public checker<T> { + public: + bool operator()(const T &value, std::string & error) const { + // cerr << "ok_function" << endl; + error = ""; + return true; + } + }; + + // less than + + template<class T> class less_than : public checker<T> { + T value; + public: + less_than(const T &v) : value(v) {} + bool operator()(const T &value, std::string & error) const { + bool result = std::less<T>()(value, this->value); + Binc::BincStream s; + if (!result) + s << "value " << value << "not less than " << this->value; + error = s.str(); + return result; + } + }; + + // range check + + template<class V> class range_check : public checker<V> { + V lower; + V upper; + public: + range_check(const V & l, const V & u) : lower(l), upper(u) { } + bool operator()(const V & value, std::string & error) const { + bool result = (lower <= value && value <= upper); + Binc::BincStream s; + if (!result) + s << "value " << value + << " not in range [" + << lower << ", " << upper << "]"; + error = s.str(); + return result; + } + }; + + template<class V> class enum_check : public checker<V> { + std::set<V> values; + public: + void add(const V&v) { + values.insert(v); + } + bool operator()(const V & value, std::string & error) const { + bool result = values.find(value) != values.end(); + Binc::BincStream s; + // cerr << "enum check" << endl; + if (!result) + s << "value " << value << " not in enumeration"; + error = s.str(); + return result; + } + enum_check<V> & operator,(const V & value) { + add(value); + return *this; + } + enum_check<V> & operator+=(const V & value) { + add(value); + return *this; + } + }; + +} + +#endif diff --git a/src/arg-error.cc b/src/arg-error.cc @@ -0,0 +1,70 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * arg-error.cc + * + * Description: + * Implementation of error class for Argument Parser + * + * Authors: + * Eivind Kvedalen <argparser@eivind.kvedalen.name> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Eivind Kvedalen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ + +#include "arg-error.h" + +using namespace std; +using namespace ArgParser; + +ArgumentError::ArgumentError(Type t, const string &name, const string &e) + : argName(name), + type(t), + error(e) +{ +} + +const string & ArgumentError::getName(void) const +{ + return argName; +} + +const string & ArgumentError::getErrorStr(void) const +{ + return error; +} + +const ArgumentError::Type ArgumentError::getErrorType(void) const +{ + return type; +} + +const set<string> & ArgumentError::getMissing(void) const +{ + return missing; +} + +void ArgumentError::add(const string & s) +{ + missing.insert(s); +} diff --git a/src/arg-error.h b/src/arg-error.h @@ -0,0 +1,73 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * arg-error.h + * + * Description: + * Error class for Argument Parser + * + * Authors: + * Eivind Kvedalen <argparser@eivind.kvedalen.name> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Eivind Kvedalen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ + +#ifndef _ARG_EXCEPTIONS_H +#define _ARG_EXCEPTIONS_H + +#include <string> +#include <set> + +namespace ArgParser { + + class ArgumentError { + public: + enum Type { + NONE, + CHECK, + REQUIRED_COMMAND, + REQUIRED_ARGUMENT, + UNKNOWN, + MISSING, + INVALID + }; + protected: + std::string argName; + Type type; + std::string error; + std::set<std::string> missing; + public: + ArgumentError(Type t, const std::string &name = "", const std::string &e = ""); + + const std::string & getName(void) const; + const std::string & getErrorStr(void) const; + const Type getErrorType(void) const; + const std::set<std::string> & getMissing(void) const; + + void add(const std::string & s); + + }; + +} + +#endif diff --git a/src/arg-parser.cc b/src/arg-parser.cc @@ -0,0 +1,208 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * arg-parser.cc + * + * Description: + * Implementation of argument parser + * + * Authors: + * Eivind Kvedalen <argparser@eivind.kvedalen.name> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2003 Eivind Kvedalen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ + +#include "arg-parser.h" +#include <algorithm> + +using namespace ArgParser; +using namespace std; + +Args::~Args(void) { + StringArgPtrMap::const_iterator i = args.begin(); + while (i != args.end()) { + delete i->second; + ++i; + } +} + +void Args::tokenize(const string &s, char sep, + vector<string> &result) const +{ + string::size_type p; + string::size_type o = 0; + while ((p = s.find(sep, o)) != string::npos) { + result.push_back(s.substr(0, p)); + o = p + 1; + } + result.push_back(s.substr(o)); +} + +int Args::parse(vector<string> & rest, ArgumentError & error) const { + set<int> parsed; + int i; + for (i = 1; i < argc; ++i) { + const string & arg = argv[i]; + // If we encounter '--' then stop parsing + if (arg == "--") { + ++i; + break; + } + + // Find next argument, and put in next if it doesn't start with + // '-' + string::size_type c = arg.find("="); + char const * next; + string a; + if (c != string::npos) { + a = arg.substr(0, c); + //cerr << a << endl; + next = arg.c_str() + c + 1; + } + else { + a = arg; + next = i < (argc - 1) ? argv[i + 1] : NULL; + } + + vector<string> cmd; + + // Strip "--" and "-" from argument + if (a.substr(0, 2) == "--") { + a = a.substr(2); + cmd.push_back(a); + } + else if (a.substr(0, 1) == "-") { + a = a.substr(1); + for (string::const_iterator j = a.begin(); j != a.end(); ++j) + cmd.push_back(string("") + *j); + } + else { + // Not starting with "--" or "-"; push them on the rest vector + rest.push_back(argv[i]); + continue; + } + + if (next != NULL && *next == '-') next = NULL; + + vector<string>::const_iterator k = cmd.begin(); + int used = 0; + while (k != cmd.end()) { + // Find handler + map<string, Arg*>::const_iterator j = args.find(*k); + if (j != args.end()) { + if (j->second->parse(next, error)) used = (next == NULL); + parsed.insert(j->second->num); + } + else { + // Handler not found; if the argument starts with a "-", then + // flag an error, or else push it on the rest vector. + if (arg.size() > 0 && arg[0] == '-') { + error = ArgumentError(ArgumentError::UNKNOWN, *k); + return -1; + } + rest.push_back(argv[i]); + } + ++k; + } + i += used; + } + if (!includes(parsed.begin(), parsed.end(), + requiredArgs.begin(), requiredArgs.end())) { + ArgumentError e(ArgumentError::REQUIRED_ARGUMENT); + set<int> missing; + insert_iterator<set<int> > missing_ins(missing, missing.begin()); + set_difference(requiredArgs.begin(), requiredArgs.end(), + parsed.begin(), parsed.end(), missing_ins); + set<int>::const_iterator i = missing.begin(); + while (i != missing.end()) { + e.add(argNum.find(*i)->second); + ++i; + } + error = e; + return -1; + } + if (mode.size() > 0) { + set<int> other; + insert_iterator<set<int> > other_ins(other, other.begin()); + set_intersection(mode.begin(), mode.end(), + parsed.begin(), parsed.end(), other_ins); + if (other.size() != 1) { + error = ArgumentError(ArgumentError::REQUIRED_COMMAND); + return -1; + } + } + return i; +} + +void Args::assign(void) +{ + StringArgPtrMap::iterator i = args.begin(); + while (i != args.end()) { + if (i->second->isUsed()) + i->second->assign(); + ++i; + } +} + +void Args::assign(const std::string s) +{ + StringArgPtrMap::iterator i = args.find(s); + if (i != args.end() && i->second->isUsed()) + i->second->assign(); +} + +void Args::addHelpString(const string & key, const string & help) +{ + helpStrings[key] = help; +} + +void Args::displayHelp(ostream & o) const +{ + for (map<string, string>::const_iterator i = helpStrings.begin(); i != helpStrings.end(); ++i) { + vector<string> v; + tokenize(i->first, '|', v); + vector<string>::const_iterator j = v.begin(); + while (j != v.end()) { + StringArgPtrMap::const_iterator pi = args.find(*j); + if (pi != args.end()) { + if ((*j).size() == 1) + o << "-" << *j << pi->second->getParam(); + else + o << "--" << *j << pi->second->getParam(); + ++j; + if (j != v.end()) + o << ", "; + } + } + o << endl; + + v.clear(); + tokenize(i->second, '\n', v); + j = v.begin(); + while (j != v.end()) { + o << "\t" << *j << endl; + ++j; + } + o << endl; + } +} diff --git a/src/arg-parser.h b/src/arg-parser.h @@ -0,0 +1,149 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * arg-arg.h + * + * Description: + * Class for command line parsing + * + * Authors: + * Eivind Kvedalen <argparser@eivind.kvedalen.name> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2003 Eivind Kvedalen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ + +#ifndef _ARG_PARSER_H +#define _ARG_PARSER_H + +#include "arg-arg.h" +#include <set> +#include <map> + +namespace ArgParser { + + class Args { + typedef std::map<std::string, Arg*> StringArgPtrMap; + StringArgPtrMap args; + std::map<int, std::string> argNum; + int argc; + char ** argv; + std::set<int> requiredArgs; + std::set<int> mode; + std::map<std::string, std::string> helpStrings; + protected: + template<class T> int addArgs(const std::string &name, + T &var, + int type, + checker<T> & sc) { + const int num = args.size(); + std::vector<std::string> v; + tokenize(name, '|', v); + std::vector<std::string>::const_iterator i = v.begin(); + while (i != v.end()) { + if (type == Arg::REQUIRED) + requiredArgs.insert(num); + args[*i] = new ArgT<T>(num, *i, var, type, sc); + argNum[num] = *i; + ++i; + } + return num; + } + + template<class T> class mapArg { + T & target; + T value; + public: + mapArg(T & t, const T &v) : target(t), value(v) { } + void set(void) { + target = value; + } + }; + + public: + Args(void) : argc(0), argv(NULL) { } + Args(int c, char * v[]) : argc(c), argv(v) { } + ~Args(void); + + void addHelpString(const std::string & key, const std::string & help); + + void displayHelp(std::ostream & o) const; + + void tokenize(const std::string &s, char sep, + std::vector<std::string> &result) const; + template<class T> void addMode(const std::string &name, + T &var, + const T &value) { + static ok_function<mapArg<T> > f; + int i = addArgs(name, *(new mapArg<T>(var, value)), Arg::OPTIONAL, f); + mode.insert(args[argNum[i]]->num); + } + + template<class T> void addMode(const std::string &name, + T &var, + const T &value, + const checker<T> & sc) { + int i = addArgs(name, mapArg<T>(var, value), Arg::OPTIONAL, sc); + mode.insert(args[argNum[i]]->num); + } + + template<class T> void addOptional(const std::string &name, T &var, + checker<T> & sc) { + addArgs(name, var, Arg::OPTIONAL, sc); + } + + template<class T> void addOptional(const std::string &name, T &var) { + static ok_function<T> f; + addArgs(name, var, Arg::OPTIONAL, f); + } + + template<class T> void addRequired(const std::string &name, T &var, + const checker<T> & sc) { + addArgs(name, var, Arg::REQUIRED, sc); + } + + template<class T> void addRequired(const std::string &name, T &var) { + static ok_function<T> f; + addArgs(name, var, Arg::REQUIRED, f); + } + + template<class T> bool get(const std::string &name, T &var) { + StringArgPtrMap::iterator i = args.find(name); + if (i == args.end()) return false; + i->second->get(name, var); + return true; + } + + int parse(std::vector<std::string> & rest, ArgumentError & error) const; + + void assign(void); + void assign(const std::string s); + + template<class T> void setValue(const std::string &name, + Args::mapArg<T> &value, const char * a) + { + value.set(); + } + }; +} + +#endif diff --git a/src/authenticate.cc b/src/authenticate.cc @@ -0,0 +1,428 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * authenticate.cc + * + * Description: + * Implementation of the common authentication mechanism. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> +#include <vector> + +#include <sys/types.h> +#include <grp.h> +#include <pwd.h> +#include <signal.h> + +#ifndef HAVE_SYS_WAIT_H +#include <wait.h> +#else +#include <sys/wait.h> +#endif + +#include "authenticate.h" +#include "io.h" +#include "session.h" +#include "storage.h" +#include "convert.h" + +using namespace ::std; +using namespace Binc; + +namespace { + + bool enteredjail = false; + + void enterJail(void) + { + Session &session = Session::getInstance(); + IO &logger = IOFactory::getInstance().get(2); + + // drop all privileges that we can drop and enter chroot jail + const string &jailpath = session.globalconfig["Security"]["jail path"]; + const string &jailuser = session.globalconfig["Security"]["jail user"]; + const string &jailgroup = session.globalconfig["Security"]["jail group"]; + struct group *gr = getgrnam(jailgroup.c_str()); + struct passwd *pw = getpwnam(jailuser.c_str()); + + if (jailgroup != "" && !gr) + logger << "invalid jail group <" << jailgroup + << "> - check the Security section of bincimap.conf" + << endl; + + if (jailuser != "" && !pw) + logger << "invalid jail user <" << jailuser + << "> - check the Security section of bincimap.conf" + << endl; + + setgroups(0, 0); + + if (jailpath != "") { + if (chroot(jailpath.c_str()) != 0) + logger << "unable to enter jail path " + << toImapString(jailpath) << endl; + else + chdir("/"); + } + + if (gr) setgid(gr->gr_gid); + if (pw) setuid(pw->pw_uid); + + umask(0); + } +} + +// 0 = ok +// 1 = internal error +// 2 = failed +// 3 = timeout +// -1 = abort +//------------------------------------------------------------------------ +int Binc::authenticate(Depot &depot, const string &username, + const string &password) +{ + Session &session = Session::getInstance(); + IO &com = IOFactory::getInstance().get(1); + IO &logger = IOFactory::getInstance().get(2); + + // read auth penalty from global config + string authpenalty = session.globalconfig["Authentication"]["auth penalty"]; + + session.setUserID(username); + + // export the session data + session.exportToEnv(); + + // The information supplied on descriptor 3 is a login name + // terminated by \0, a password terminated by \0, a timestamp + // terminated by \0, and possibly more data. There are no other + // restrictions on the form of the login name, password, and + // timestamp. + int authintercom[2]; + int intercomw[2]; + int intercomr[2]; + bool authenticated = false; + + if (pipe(authintercom) == -1) { + session.setLastError("An error occurred when creating pipes: " + + string(strerror(errno))); + return -1; + } + + if (pipe(intercomw) == -1) { + session.setLastError("An error occurred when creating pipes: " + + string(strerror(errno))); + close(authintercom[0]); + close(authintercom[1]); + return -1; + } + + if (pipe(intercomr) == -1) { + session.setLastError("An error occurred when creating pipes: " + + string(strerror(errno))); + close(intercomw[0]); + close(intercomr[0]); + close(authintercom[0]); + close(authintercom[1]); + return -1; + } + + string timestamp; + time_t t; + char *c; + t = time(0); + if ((c = ctime(&t)) != 0) + timestamp = c; + else + timestamp = "unknown timestamp"; + + // execute authentication module + int result; + int childspid = fork(); + if (childspid == -1) { + logger << "fork failed: " << strerror(errno) << endl; + return 1; + } + + if (childspid == 0) { + + close(authintercom[1]); + close(intercomr[0]); + close(intercomw[1]); + + if (dup2(intercomr[1], 1) == -1) { + logger << "[auth module] dup2 failed: " + << strerror(errno) << endl; + logger.flushContent(); + exit(111); + } + + if (dup2(intercomw[0], 0) == -1) { + logger << "[auth module] dup2 failed: " + << strerror(errno) << endl; + logger.flushContent(); + exit(111); + } + + if (dup2(authintercom[0], 3) == -1) { + logger << "[auth module] dup2 failed: " + << strerror(errno) << endl; + logger.flushContent(); + exit(111); + } + + session.exportToEnv(); + + if (session.unparsedArgs[0] != 0) { + execv(session.unparsedArgs[0], &session.unparsedArgs[0]); + logger << "[auth module] invocation of " << session.unparsedArgs[0] + << " failed: " << strerror(errno) + << endl; + logger.flushContent(); + exit(111); + } + + logger << "[auth module] Missing mandatory -- in arg list," + " after bincimap-up + arguments, before authenticator." + " Please check your run scripts and the man pages for" + " more on how to invoke Binc IMAP." << endl; + logger.flushContent(); + exit(111); + } + + if (authintercom[0] != -1) + close(authintercom[0]); + + bool error = false; + + // write the userid + if (write(authintercom[1], + username.c_str(), + username.length()) != (int) username.length()) + error = true; + + // terminate with a \0 + if (!error && write(authintercom[1], "", 1) != 1) + error = true; + + // write the password + if (!error && write(authintercom[1], + password.c_str(), + password.length()) != (int) password.length()) + error = true; + + // terminate with a \0 + if (!error && write(authintercom[1], "", 1) != 1) + error = true; + + // write the timestamp + if (!error && write(authintercom[1], + timestamp.c_str(), + timestamp.length()) != (int) timestamp.length()) + error = true; + + // terminate with a \0 + if (!error && write(authintercom[1], "", 1) != 1) + error = true; + + if (error) { + logger << "error writing to authenticator " + << session.unparsedArgs[0] << ": " + << strerror(errno) << endl; + return 1; + } + + // close the write channel. this is necessary for the checkpassword + // module to see an EOF. + close(authintercom[1]); + close(intercomr[1]); + close(intercomw[0]); + + fd_set rmask; + FD_ZERO(&rmask); + FD_SET(fileno(stdin), &rmask); + FD_SET(intercomr[0], &rmask); + + int maxfd = intercomr[0]; + bool disconnected = false; + bool timedout = false; + com.disableInputLimit(); + + bool eof = false; + while (!eof) { + fd_set rtmp = rmask; + struct timeval timeout; + + // time out 5 minutes after the idle timeout. we expect the main + // server to time out at the right time, but will shut down at + // T+5m in case of a server lockup. + timeout.tv_sec = session.idletimeout + 5*60; + timeout.tv_usec = 0; + + int n = select(maxfd + 1, &rtmp, 0, 0, &timeout); + if (n < 0) { + if (errno == EINTR) { + logger << "warning: zero data from select: " + << strerror(errno) << endl; + break; + } + + logger << "error: invalid exit from select, " + << strerror(errno) << endl; + break; + } + + if (n == 0) { + logger << "lock-up: server timed out after " + << session.idletimeout << " seconds" << endl; + timedout = true; + break; + } + + if (FD_ISSET(fileno(stdin), &rtmp)) { + authenticated = true; + + do { + string data; + int ret = com.readStr(data); + if (ret == 0 || ret == -1) { + session.setLastError("client disconnected"); + eof = true; + disconnected = true; + break; + } + + if (ret == -2) { + // Fall through. Triggered when there was no data + // to read, even though no error has occurred + continue; + } + + for (;;) { + int w = write(intercomw[1], data.c_str(), data.length()); + if (w > 0) + Session::getInstance().addReadBytes(w); + + if (w == (int) data.length()) + break; + + if (w == -1 && (errno == EINTR)) + continue; + + logger << "error writing to server: " + << strerror(errno) << endl; + eof = true; + break; + } + } while (com.pending()); + } + + if (FD_ISSET(intercomr[0], &rtmp)) { + char buf[1024]; + int ret = read(intercomr[0], buf, sizeof(buf)); + if (ret == 0) { + // Main server has shut down + eof = true; + break; + } else if (ret == -1) { + logger << "error reading from server: " << strerror(errno) + << endl; + eof = true; + break; + } else { + if (enteredjail == false) { + enterJail(); + enteredjail = true; + } + + Session::getInstance().addWriteBytes(ret); + + com << string(buf, ret); + com.flushContent(); + } + } + } + + close(intercomr[0]); + close(intercomw[1]); + + // catch the dead baby + if (waitpid(childspid, &result, 0) != childspid) { + logger << "<" << username << "> authentication failed: " + << (authenticated ? "server " : session.unparsedArgs[0]) + << " waitpid returned unexpected value" << endl; + string tmp = strerror(errno); + + return -1; + } + + // if the server died because we closed the sockets after a timeout, + // exit 3. + if (timedout) + return 3; + + if (disconnected) + return 0; + + if (WIFSIGNALED(result)) { + logger << "<" << username << "> authentication failed: " + << (authenticated ? "server" : session.unparsedArgs[0]) + << " died by signal " + << WTERMSIG(result) << endl; + + sleep(atoi(authpenalty)); + session.setState(Session::LOGOUT); + return -1; + } + + switch (WEXITSTATUS(result)) { + case 0: break; + case 1: + // authentication failed - sleep + logger << "<" << username + << "> authentication failed: wrong userid or password" << endl; + sleep(atoi(authpenalty)); + return 2; + case 111: + case 2: + // internal error + logger << "<" << username << "> authentication failed: " + << (authenticated ? "authenticator " : "server ") + << " returned " + << WEXITSTATUS(result) << " (internal error)" << endl; + return -1; + default: + break; + } + + return 0; +} diff --git a/src/authenticate.h b/src/authenticate.h @@ -0,0 +1,45 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/authenticate.h + * + * Description: + * Declaration of the common authentication mechanism. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifndef authenticate_h_included +#define authenticate_h_included +#include <string> + +#include "depot.h" + +namespace Binc { + int authenticate(Depot &, const std::string &username, + const std::string &password); +} + +#endif diff --git a/src/base64.cc b/src/base64.cc @@ -0,0 +1,156 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * base64.cc + * + * Description: + * Implementation of base64 Utilities + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "base64.h" +#include <string> +#include <iostream> + +using namespace ::std; + +typedef unsigned char byte; /* Byte type */ + +#define TRUE 1 +#define FALSE 0 + +#define LINELEN 72 /* Encoded line length (max 76) */ + +static byte dtable[256]; + +string Binc::base64encode(const string &s_in) +{ + int i; + string result; + + /* Fill dtable with character encodings. */ + + for (i = 0; i < 26; i++) { + dtable[i] = 'A' + i; + dtable[26 + i] = 'a' + i; + } + for (i = 0; i < 10; i++) { + dtable[52 + i] = '0' + i; + } + dtable[62] = '+'; + dtable[63] = '/'; + + string::const_iterator s_i = s_in.begin(); + while (s_i != s_in.end()) { + + byte igroup[3], ogroup[4]; + int c, n; + + igroup[0] = igroup[1] = igroup[2] = 0; + for (n = 0; n < 3 && s_i != s_in.end(); n++) { + c = *s_i++; + igroup[n] = (byte) c; + } + if (n > 0) { + ogroup[0] = dtable[igroup[0] >> 2]; + ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)]; + ogroup[2] = dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)]; + ogroup[3] = dtable[igroup[2] & 0x3F]; + + /* Replace characters in output stream with "=" pad + characters if fewer than three characters were + read from the end of the input stream. */ + + if (n < 3) { + ogroup[3] = '='; + if (n < 2) { + ogroup[2] = '='; + } + } + + for (i = 0; i < 4; i++) + result += ogroup[i]; + } + } + + return result; +} + +string Binc::base64decode(const string &s_in) +{ + string result; + int i; + + for (i = 0; i < 255; i++) { + dtable[i] = 0x80; + } + for (i = 'A'; i <= 'Z'; i++) { + dtable[i] = 0 + (i - 'A'); + } + for (i = 'a'; i <= 'z'; i++) { + dtable[i] = 26 + (i - 'a'); + } + for (i = '0'; i <= '9'; i++) { + dtable[i] = 52 + (i - '0'); + } + dtable[(int) '+'] = 62; + dtable[(int) '/'] = 63; + dtable[(int) '='] = 0; + + /*CONSTANTCONDITION*/ + string::const_iterator s_i = s_in.begin(); + while (s_i != s_in.end()) { + byte a[4], b[4], o[3]; + + for (i = 0; i < 4 && s_i != s_in.end(); i++) { + int c = *s_i++; + + if (dtable[c] & 0x80) + return result; + + a[i] = (byte) c; + b[i] = (byte) dtable[c]; + } + + o[0] = (b[0] << 2) | (b[1] >> 4); + o[1] = (b[1] << 4) | (b[2] >> 2); + o[2] = (b[2] << 6) | b[3]; + + i = a[2] == '=' ? 1 : (a[3] == '=' ? 2 : 3); + + for (int j = 0; j < i; ++j) + result += o[j]; + + if (i < 3) + break; + } + + return result; +} diff --git a/src/base64.h b/src/base64.h @@ -0,0 +1,49 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/util/base64.h + * + * Description: + * Declaration of base64 Utilities + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef base64_h_included +#define base64_h_included +#include <string> + +namespace Binc { + + std::string base64decode(const std::string &s_in); + std::string base64encode(const std::string &s_in); + +} + +#endif diff --git a/src/bincimap-up.cc b/src/bincimap-up.cc @@ -0,0 +1,212 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * bincimap-up.cc + * + * Description: + * Implementation of the preauthenticated bincimap stub + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> + +#include "broker.h" +#include "recursivedescent.h" +#include "io.h" +#ifdef WITH_SSL +#include "io-ssl.h" +#endif +#include "operators.h" +#include "session.h" + +using namespace ::std; +using namespace Binc; + +namespace Binc { + bool showGreeting(void); +} + +//------------------------------------------------------------------------ +int main(int argc, char *argv[]) +{ + Session &session = Session::getInstance(); + if (!session.initialize(argc, argv)) { + if (session.getLastError() != "") { + IO &logger = IOFactory::getInstance().get(2); + logger << "error initializing Binc IMAP: " << session.getLastError() + << endl; + logger.flushContent(); + } + return 111; + } + + IO &com = IOFactory::getInstance().get(1); + IO &logger = IOFactory::getInstance().get(2); + + logger << "connection from " << session.getIP() << endl; + + // Show standard greeting + showGreeting(); + bool recovery = false; + bool timedout = false; + bool disconnect = false; + bool abrt = false; + + // Read commands and run functions + do { + com.enableInputLimit(); + + // recover from syntax error. There will be trash in the input + // buffer. We need to flush everything until we see an LF. + if (recovery) { + for (;;) { + int c = com.readChar(session.timeout()); + if (c == '\n') break; + if (c == -1) { + disconnect = true; + abrt = true; + break; + } else if (c == -2) { + com << "* BYE Timeout after " << session.timeout() + << " seconds of inactivity." << endl; + timedout = true; + abrt = true; + break; + } + } + + if (abrt) + break; + } + + Request request; + recovery = false; + + BrokerFactory &brokerFactory = BrokerFactory::getInstance(); + Broker *broker = brokerFactory.getBroker(session.getState()); + if (!broker) { + // will never happen + } + + com.flushContent(); + com.noFlushOnEndl(); + + switch (broker->parseStub(request)) { + case Operator::TIMEOUT: + com << "* BYE Timeout after " << session.timeout() + << " seconds of inactivity." << endl; + timedout = true; + abrt = true; + break; + case Operator::REJECT: + com << "* NO " << session.getLastError() << endl; + recovery = true; + continue; + case Operator::ERROR: + com << "* BAD " << session.getLastError() << endl; + recovery = true; + continue; + default: + break; + } + + if (abrt) + break; + + Operator *o = broker->get(request.getName()); + if (!o) { + com << "* NO The command \"" + << (request.getUidMode() ? "UID " : "") + << request.getName() + << "\" is unsupported in this state. " + << "Please authenticate." << endl; + recovery = true; + continue; + } + + switch (o->parse(request)) { + case Operator::TIMEOUT: + com << "* BYE Timeout after " << session.timeout() + << " seconds of inactivity." << endl; + timedout = true; + abrt = true; + break; + case Operator::REJECT: + com << "* NO " << session.getLastError() << endl; + recovery = true; + continue; + case Operator::ERROR: + com << "* BAD " << session.getLastError() << endl; + recovery = true; + continue; + default: + break; + } + + switch (o->process(*session.getDepot(), request)) { + case Operator::OK: + com << request.getTag() << " OK " << request.getName() + << " completed" << endl; + break; + case Operator::NO: + com << request.getTag() << " NO " << session.getResponseCode() + << request.getName() << " failed: " << session.getLastError() << endl; + session.clearResponseCode(); + break; + case Operator::BAD: + com << request.getTag() << " BAD " << request.getName() + << " failed: " << session.getLastError() << endl; + recovery = true; + break; + case Operator::NOTHING: + break; + case Operator::ABORT: + session.setState(Session::LOGOUT); + abrt = true; + break; + } + + if (abrt) + break; + } while (session.getState() != Session::LOGOUT); + + logger << "shutting down "; + if (timedout) + logger << "(timeout " + toString(session.timeout()) + "s) "; + else if (disconnect) + logger << "(" << com.getLastError() << ") "; + + logger << "- read:" + << session.getReadBytes() + << " bytes, wrote:" << session.getWriteBytes() + << " bytes." << endl; + + com.flushContent(); +} diff --git a/src/bincimapd-module.cc b/src/bincimapd-module.cc @@ -0,0 +1,156 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * bincimapd-module.cc + * + * Description: + * Implementation of loadable modules + * + * Authors: + * Eivind Kvedalen <eivind@kvedalen.name> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2003 Eivind Kvedalen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef HAVE_DLSUPPORT +#include <dlfcn.h> +#endif + +#include "session.h" +#include "bincimapd-module.h" + +using namespace std; +using namespace Binc; + +//---------------------------------------------------------------------- +Module::Module(void) : handle(0), ref(0) +{ + ref = new int; + *ref = 1; +} + +//---------------------------------------------------------------------- +Module::Module(const Module & module) +{ + handle = module.handle; + ref = module.ref; + ++(*ref); +} + +//---------------------------------------------------------------------- +Module::Module &Module::operator=(const Module &module) +{ + if (&module != this) { + handle = module.handle; + ref = module.ref; + ++(*ref); + } + + return *this; +} + +//---------------------------------------------------------------------- +bool Module::open(const string &module) +{ +#ifdef HAVE_DLSUPPORT + handle = dlopen (module.size() == 0 ? 0 : module.c_str(), RTLD_NOW|RTLD_GLOBAL); +#endif + return (handle != 0); + +} + +//---------------------------------------------------------------------- +Module::~Module(void) +{ + --(*ref); + if (*ref == 0) { +#ifdef HAVE_DLSUPPORT + if (handle != 0) + dlclose(handle); +#endif + delete ref; + } +} + +//---------------------------------------------------------------------- +void *Module::getSymbol(const string &s) +{ + if (handle == 0) { + setLastError("Module not opened, dynamic loading unsupported."); + return 0; + } + + void *symbol = 0; +#ifdef HAVE_DLSUPPORT + symbol = dlsym(handle, s.c_str()); + if ((error = dlerror()) != 0) { + session.setLastError("Symbol " + s + " not found"); + return 0; + } +#endif + + return symbol; +} + +//---------------------------------------------------------------------- +void Module::setLastError(const string &err) +{ + error = err; +} + +//---------------------------------------------------------------------- +const string &Module::getLastError(void) const +{ + return error; +} + +//---------------------------------------------------------------------- +BincModule::BincModule(void) : Module(), loaded(false) +{ +} + +//---------------------------------------------------------------------- +BincModule::~BincModule(void) +{ + if (*ref == 1) + unload(); +} + +//---------------------------------------------------------------------- +void BincModule::load(BrokerFactory & bf) +{ + loadFunc load = (loadFunc)getSymbol("bincimap_module_load"); + load(bf); + loaded = true; +} + + +//---------------------------------------------------------------------- +void BincModule::unload(void) +{ + unloadFunc unload = (unloadFunc)getSymbol("bincimap_module_unload"); + unload(); +} diff --git a/src/bincimapd-module.h b/src/bincimapd-module.h @@ -0,0 +1,78 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * bincimapd-module.cc + * + * Description: + * Implementation of loadable modules + * + * Authors: + * Eivind Kvedalen <eivind@kvedalen.name> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2003 Eivind Kvedalen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifndef _BINCIMAPD_MODULE_H_ +#define _BINCIMAPD_MODULE_H_ + +#include <string> +#include <vector> +#include "broker.h" + +namespace Binc { + + class Module { + private: + std::string error; + void * handle; + protected: + int * ref; + public: + Module(void); + Module(const Module &module); + Module &operator =(const Module &module); + ~Module(void); + + bool open(const std::string &module); + void * getSymbol(const std::string &s); + + const std::string &getLastError(void) const; + void setLastError(const std::string &err); + }; + + class BincModule : public Module { + bool loaded; + + typedef void (*loadFunc)(BrokerFactory &bf); + typedef void (*unloadFunc)(void); + + public: + BincModule(void); + ~BincModule(void); + + void load(BrokerFactory & bf); + void unload(void); + }; + +} + +#endif diff --git a/src/bincimapd.cc b/src/bincimapd.cc @@ -0,0 +1,206 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * bincimapd.cc + * + * Description: + * Implementation of the main bincimapd service + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#include <string> + +#include "broker.h" +#include "depot.h" +#include "recursivedescent.h" +#include "io.h" +#include "operators.h" +#include "session.h" + +#include "maildirmessage.h" +#include "maildir.h" + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +int main(int argc, char *argv[]) +{ + Session &session = Session::getInstance(); + if (!session.initialize(argc, argv)) + return 111; + + IO &com = IOFactory::getInstance().get(1); + IO &logger = IOFactory::getInstance().get(2); + + logger << "<" << session.getUserID() + << "> authenticated" << endl; + + logger.flushContent(); + bool recovery = false; + bool timeout = false; + bool disconnected = false; + bool abrt = false; + + // Read requests and run functions + do { + com.enableInputLimit(); + + // recover from syntax error. There will be trash in the input + // buffer. We need to flush everything until we see an LF. + if (recovery) { + for (;;) { + int c = com.readChar(); + if (c == '\n') break; + if (c == -1) { + disconnected = true; + abrt = true; + break; + } + + if (c == -2) { + timeout = true; + abrt = true; + break; + } + } + + if (abrt) + break; + } + + Request request; + recovery = false; + + BrokerFactory &brokerFactory = BrokerFactory::getInstance(); + Broker *broker = brokerFactory.getBroker(session.getState()); + if (!broker) { + // will never happen + } + + com.noFlushOnEndl(); + com.flushContent(); + com.enableInputLimit(); + + switch (broker->parseStub(request)) { + case Operator::TIMEOUT: + com << "* BYE Timeout after " << session.timeout() + << " seconds of inactivity." << endl; + timeout = true; + abrt = true; + break; + case Operator::REJECT: + com << "* NO " << session.getLastError() << endl; + recovery = true; + continue; + case Operator::ERROR: + com << "* BAD " << session.getLastError() << endl; + recovery = true; + continue; + default: + break; + } + + if (abrt) + break; + + Operator *o = broker->get(request.getName()); + if (!o) { + com << "* NO The command \"" + << (request.getUidMode() ? "UID " : "") << request.getName() + << "\" is not supported." << endl; + recovery = true; + continue; + } + + switch (o->parse(request)) { + case Operator::TIMEOUT: + com << "* BYE Timeout after " << session.timeout() + << " seconds of inactivity." << endl; + timeout = true; + abrt = true; + break; + case Operator::REJECT: + com << "* NO " << session.getLastError() << endl; + recovery = true; + continue; + case Operator::ERROR: + com << "* BAD " << session.getLastError() << endl; + recovery = true; + continue; + default: + break; + } + + session.addStatement(); + Depot *dep = session.getDepot(); + + switch (o->process(*dep, request)) { + case Operator::OK: + com << request.getTag() << " OK " << request.getName() + << " completed" << endl; + break; + case Operator::NO: + com << request.getTag() << " NO " << session.getResponseCode() + << request.getName() << " failed: " << session.getLastError() << endl; + session.clearResponseCode(); + break; + case Operator::BAD: + com << request.getTag() << " BAD " << request.getName() + << " failed: " << session.getLastError() << endl; + break; + case Operator::NOTHING: + break; + case Operator::ABORT: + session.setState(Session::LOGOUT); + abrt = true; + break; + } + + if (abrt) + break; + + } while (session.getState() != Session::LOGOUT); + + if (abrt) { + logger << "shutting down ("; + if (timeout) + logger << "timeout after " << session.idletimeout << "s"; + else + logger << "client disconnected"; + logger << ") - bodies:" + << session.getBodies() << " statements:" + << session.getStatements() << endl; + } else { + logger << "<" << session.getUserID() << "> logged off - bodies:" + << session.getBodies() << " statements:" + << session.getStatements() << endl; + } + + com.flushContent(); + + return timeout ? 113 : 0; +} diff --git a/src/broker.cc b/src/broker.cc @@ -0,0 +1,219 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * broker.cc + * + * Description: + * <---> + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#include <map> +#include <string> + +#include "broker.h" +#include "io.h" +#include "convert.h" +#include "operators.h" +#include "recursivedescent.h" +#include "session.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +BrokerFactory::BrokerFactory(void) +{ + brokers[Session::NONAUTHENTICATED] = new Broker(); + brokers[Session::AUTHENTICATED] = new Broker(); + brokers[Session::SELECTED] = new Broker(); +} + +//---------------------------------------------------------------------- +BrokerFactory::~BrokerFactory(void) +{ + for (map<int, Broker *>::iterator i = brokers.begin(); + i != brokers.end(); ++i) + delete i->second; +} + +//---------------------------------------------------------------------- +BrokerFactory &BrokerFactory::getInstance(void) +{ + static BrokerFactory brokerfactory; + return brokerfactory; +} + +//---------------------------------------------------------------------- +void BrokerFactory::addCapability(const std::string &c) +{ + for (map<int, Broker *>::iterator i = brokers.begin(); + i != brokers.end(); ++i) { + CapabilityOperator * o; + o = dynamic_cast<CapabilityOperator*>(i->second->get("CAPABILITY")); + if (o != 0) { + o->addCapability(c); + break; + } + } +} + +//---------------------------------------------------------------------- +void BrokerFactory::assign(const string &fname, Operator *o) +{ + int deletable = true; + for (map<int, Broker *>::iterator i = brokers.begin(); + i != brokers.end(); ++i) + if (i->first & o->getState()) { + i->second->assign(fname, o, deletable); + deletable = false; + } +} + +//---------------------------------------------------------------------- +Operator *BrokerFactory::getOperator(int state, const string &name) const +{ + if (brokers.find(state) == brokers.end()) + return 0; + else + return brokers.find(state)->second->get(name); +} + +//---------------------------------------------------------------------- +Broker *BrokerFactory::getBroker(int state) +{ + if (brokers.find(state) == brokers.end()) { + setLastError("No appropriate broker for state."); + return 0; + } + + return brokers[state]; +} + +//---------------------------------------------------------------------- +Broker::Broker(void) +{ +} + +//---------------------------------------------------------------------- +Broker::~Broker(void) +{ +} + +//---------------------------------------------------------------------- +void Broker::assign(const string &fname, Operator *o, bool deletable) +{ + deletables[fname] = deletable; + operators[fname] = o; +} + +//---------------------------------------------------------------------- +Operator *Broker::get(const string &name) const +{ + if (operators.find(name) == operators.end()) + return 0; + + return operators.find(name)->second; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Broker::parseStub(Request &command) +{ + Session &session = Session::getInstance(); + + string tag; + string cmd; + + switch (expectTag(tag)) { + case Operator::ACCEPT: + break; + case Operator::REJECT: + session.setLastError("Syntax error; first token must be a tag"); + case Operator::ERROR: + return Operator::ERROR; + case Operator::TIMEOUT: + return Operator::TIMEOUT; + } + + switch (expectSPACE()) { + case Operator::ACCEPT: + break; + case Operator::REJECT: + session.setLastError("Syntax error; second token must be a SPACE"); + case Operator::ERROR: + return Operator::ERROR; + case Operator::TIMEOUT: + return Operator::TIMEOUT; + } + + switch (expectAstring(cmd)) { + case Operator::ACCEPT: + break; + case Operator::REJECT: + session.setLastError("Syntax error; third token must be a command"); + case Operator::ERROR: + return Operator::ERROR; + case Operator::TIMEOUT: + return Operator::TIMEOUT; + } + + uppercase(cmd); + + if (cmd == "UID") { + command.setUidMode(); + + switch (expectSPACE()) { + case Operator::ACCEPT: + break; + case Operator::REJECT: + session.setLastError("Syntax error; after UID there" + " must come a SPACE"); + case Operator::ERROR: + return Operator::ERROR; + case Operator::TIMEOUT: + return Operator::TIMEOUT; + } + + switch (expectAstring(cmd)) { + case Operator::ACCEPT: + break; + case Operator::REJECT: + session.setLastError("Syntax error; after UID " + "SPACE there must come a command"); + case Operator::ERROR: + return Operator::ERROR; + case Operator::TIMEOUT: + return Operator::TIMEOUT; + } + + uppercase(cmd); + } + + command.setTag(tag); + command.setName(cmd); + + return Operator::ACCEPT; +} diff --git a/src/broker.h b/src/broker.h @@ -0,0 +1,110 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/broker.h + * + * Description: + * <---> + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifndef broker_h_included +#define broker_h_included +#include "depot.h" +#include "operators.h" + +#include <string> +#include <map> + +namespace Binc { + + class Request; + class Broker; + + //------------------------------------------------------------------ + class BrokerFactory { + private: + std::map<int, Broker *> brokers; + + //-- + BrokerFactory(void); + + mutable std::string lastError; + + public: + Broker *getBroker(int state); + void assign(const std::string &fname, Operator *o); + void addCapability(const std::string &c); + Operator *getOperator(int state, const std::string &name) const; + + inline const std::string &getLastError(void) const; + inline void setLastError(const std::string &error) const; + + //-- + static BrokerFactory &getInstance(void); + ~BrokerFactory(void); + }; + + //------------------------------------------------------------------ + inline const std::string &BrokerFactory::getLastError(void) const + { + return lastError; + } + + //------------------------------------------------------------------ + inline void BrokerFactory::setLastError(const std::string &error) const + { + lastError = error; + } + + //------------------------------------------------------------------ + class Broker { + private: + std::map<std::string, Operator *> operators; + std::map<std::string, bool> deletables; + + public: + Operator * get(const std::string &name) const; + void assign(const std::string &fname, Operator *o, bool deletable = false); + Operator::ParseResult parseStub(Request &cmd); + + //-- + inline Broker(Broker &); + inline Broker(const Broker &); + Broker(void); + ~Broker(void); + }; + + inline Broker::Broker(Broker &) + { + } + + inline Broker::Broker(const Broker &) + { + } +} + +#endif diff --git a/src/convert.cc b/src/convert.cc @@ -0,0 +1,107 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * convert.cc + * + * Description: + * Implementation of miscellaneous convertion functions. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "convert.h" +#include "io.h" +#include <string> + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +BincStream::BincStream(void) +{ +} + +//------------------------------------------------------------------------ +BincStream::~BincStream(void) +{ + clear(); +} + +//------------------------------------------------------------------------ +const string &BincStream::str(void) const +{ + return nstr; +} + +//------------------------------------------------------------------------ +void BincStream::clear(void) +{ + nstr = ""; +} + +//------------------------------------------------------------------------ +int BincStream::getSize(void) const +{ + return nstr.length(); +} + +//------------------------------------------------------------------------ +BincStream &BincStream::operator << (std::ostream&(*)(std::ostream&)) +{ + nstr += "\r\n"; + return *this; +} + +//------------------------------------------------------------------------ +BincStream &BincStream::operator << (const string &t) +{ + nstr += t; + return *this; +} + +//------------------------------------------------------------------------ +BincStream &BincStream::operator << (int t) +{ + nstr += toString(t); + return *this; +} + +//------------------------------------------------------------------------ +BincStream &BincStream::operator << (unsigned int t) +{ + nstr += toString(t); + return *this; +} + +//------------------------------------------------------------------------ +BincStream &BincStream::operator << (char t) +{ + nstr += t; + return *this; +} diff --git a/src/convert.h b/src/convert.h @@ -0,0 +1,310 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/util/convert.h + * + * Description: + * Declaration of miscellaneous convertion functions. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef convert_h_included +#define convert_h_included +#include <string> +#include <vector> +#include <iomanip> +#include <iostream> + +#include <stdio.h> +#include <sys/stat.h> + +#include "address.h" +#include "depot.h" + +namespace Binc { + + //---------------------------------------------------------------------- + inline std::string toString(int i_in) + { + char intbuf[16]; + snprintf(intbuf, sizeof(intbuf), "%i", i_in); + return std::string(intbuf); + } + + //---------------------------------------------------------------------- + inline std::string toString(unsigned int i_in) + { + char intbuf[16]; + snprintf(intbuf, sizeof(intbuf), "%u", i_in); + return std::string(intbuf); + } + + //---------------------------------------------------------------------- + inline std::string toString(const char *i_in) + { + return std::string(i_in); + } + + //---------------------------------------------------------------------- + inline int atoi(const std::string &s_in) + { + return ::atoi(s_in.c_str()); + } + + //---------------------------------------------------------------------- + inline std::string toHex(const std::string &s) + { + const char hexchars[] = "0123456789abcdef"; + std::string tmp; + for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) { + unsigned char c = (unsigned char)*i; + tmp += hexchars[((c & 0xf0) >> 4)]; + tmp += hexchars[c & 0x0f]; + } + + return tmp; + } + + //---------------------------------------------------------------------- + inline std::string fromHex(const std::string &s) + { + const char hexchars[] = "0123456789abcdef"; + std::string tmp; + for (std::string::const_iterator i = s.begin(); + i != s.end() && i + 1 != s.end(); i += 2) { + int n; + unsigned char c = *i; + unsigned char d = *(i + 1); + + char *t; + if ((t = strchr(hexchars, c)) == 0) + return "out of range"; + n = (t - hexchars) << 4; + + + if ((t = strchr(hexchars, d)) == 0) + return "out of range"; + n += (t - hexchars); + + if (n >= 0 && n <= 255) + tmp += (char) n; + else + return "out of range"; + } + + return tmp; + } + + //---------------------------------------------------------------------- + inline std::string toImapString(const std::string &s_in) + { + for (std::string::const_iterator i = s_in.begin(); i != s_in.end(); ++i) { + unsigned char c = (unsigned char)*i; + if (c <= 31 || c >= 127 || c == '\"' || c == '\\') + return "{" + toString(s_in.length()) + "}\r\n" + s_in; + } + + return "\"" + s_in + "\""; + } + + //---------------------------------------------------------------------- + inline void uppercase(std::string &input) + { + for (std::string::iterator i = input.begin(); i != input.end(); ++i) + *i = toupper(*i); + } + + //---------------------------------------------------------------------- + inline void lowercase(std::string &input) + { + for (std::string::iterator i = input.begin(); i != input.end(); ++i) + *i = tolower(*i); + } + + //---------------------------------------------------------------------- + inline void chomp(std::string &s_in, const std::string &chars = " \t\r\n") + { + int n = s_in.length(); + while (n > 1 && chars.find(s_in[n - 1]) != std::string::npos) + s_in.resize(n-- - 1); + } + + //---------------------------------------------------------------------- + inline void trim(std::string &s_in, const std::string &chars = " \t\r\n") + { + while (s_in != "" && chars.find(s_in[0]) != std::string::npos) + s_in = s_in.substr(1); + chomp(s_in, chars); + } + + //---------------------------------------------------------------------- + inline const std::string unfold(const std::string &a, + bool removecomment = true) + { + std::string tmp; + bool incomment = false; + bool inquotes = false; + for (std::string::const_iterator i = a.begin(); i != a.end(); ++i) { + unsigned char c = (unsigned char)*i; + if (!inquotes && removecomment) { + if (c == '(') { + incomment = true; + tmp += " "; + } else if (c == ')') { + incomment = false; + } else if (c != 0x0a && c != 0x0d) { + tmp += *i; + } + } else if (c != 0x0a && c != 0x0d) { + tmp += *i; + } + + if (!incomment) { + if (*i == '\"') + inquotes = !inquotes; + } + } + + trim(tmp); + return tmp; + } + + //---------------------------------------------------------------------- + inline void split(const std::string &s_in, const std::string &delim, + std::vector<std::string> &dest, bool skipempty = true) + { + std::string token; + for (std::string::const_iterator i = s_in.begin(); i != s_in.end(); ++i) { + if (delim.find(*i) != std::string::npos) { + if (!skipempty || token != "") + dest.push_back(token); + token = ""; + } else + token += *i; + } + + if (token != "") + dest.push_back(token); + } + + //---------------------------------------------------------------------- + inline void splitAddr(const std::string &s_in, + std::vector<std::string> &dest, bool skipempty = true) + { + static const std::string delim = ","; + std::string token; + bool inquote = false; + for (std::string::const_iterator i = s_in.begin(); i != s_in.end(); ++i) { + if (inquote && *i == '\"') inquote = false; + else if (!inquote && *i == '\"') inquote = true; + + if (!inquote && delim.find(*i) != std::string::npos) { + if (!skipempty || token != "") + dest.push_back(token); + token = ""; + } else + token += *i; + } + if (token != "") + dest.push_back(token); + } + + //---------------------------------------------------------------------- + inline std::string toCanonMailbox(const std::string &s_in) + { + if (s_in.find("..") != std::string::npos) return ""; + + if (s_in.length() >= 5) { + std::string a = s_in.substr(0, 5); + uppercase(a); + return a == "INBOX" ? + a + (s_in.length() > 5 ? s_in.substr(5) : "") : s_in; + } + + return s_in; + } + + //------------------------------------------------------------------------ + inline std::string toRegex(const std::string &s_in, char delimiter) + { + std::string regex = "^"; + for (std::string::const_iterator i = s_in.begin(); i != s_in.end(); ++i) { + if (*i == '.' || *i == '[' || *i == ']' || *i == '{' || *i == '}' || + *i == '(' || *i == ')' || *i == '^' || *i == '$' || *i == '?' || + *i == '+' || *i == '\\') { + regex += "\\"; + regex += *i; + } else if (*i == '*') + regex += ".*?"; + else if (*i == '%') { + regex += "[^\\"; + regex += delimiter; + regex += "]*?"; + } else regex += *i; + } + + if (regex[regex.length() - 1] == '?') + regex[regex.length() - 1] = '$'; + else + regex += "$"; + + return regex; + } + + //------------------------------------------------------------------------ + class BincStream { + private: + std::string nstr; + + public: + + //-- + BincStream &operator << (std::ostream&(*)(std::ostream&)); + BincStream &operator << (const std::string &t); + BincStream &operator << (unsigned int t); + BincStream &operator << (int t); + BincStream &operator << (char t); + + //-- + const std::string &str(void) const; + + //-- + int getSize(void) const; + + //-- + void clear(void); + + //-- + BincStream(void); + ~BincStream(void); + }; +} + +#endif diff --git a/src/depot.cc b/src/depot.cc @@ -0,0 +1,586 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * depot.cc + * + * Description: + * <---> + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#include <map> +#include <string> + +#include "depot.h" +#include "mailbox.h" +#include "status.h" +#include "convert.h" +#include "io.h" + +using namespace ::std; +using namespace Binc; + +//-------------------------------------------------------------------- +DepotFactory::DepotFactory(void) +{ +} + +//-------------------------------------------------------------------- +DepotFactory::~DepotFactory(void) +{ + for (vector<Depot *>::iterator i = depots.begin(); i != depots.end(); + ++i) + delete *i; +} + +//-------------------------------------------------------------------- +Depot *DepotFactory::get(const string &name) const +{ + for (vector<Depot *>::const_iterator i = depots.begin(); i != depots.end(); + ++i) + if ((*i)->getName() == name) + return *i; + + return 0; +} + +//-------------------------------------------------------------------- +void DepotFactory::assign(Depot *depot) +{ + depots.push_back(depot); +} + +//-------------------------------------------------------------------- +DepotFactory &DepotFactory::getInstance(void) +{ + static DepotFactory depotfactory; + return depotfactory; +} + +//-------------------------------------------------------------------- +Depot::Depot(void) : enditerator(0, 0) +{ + defaultmailbox = 0; + selectedmailbox = 0; + + delimiter = '/'; +} + +//-------------------------------------------------------------------- +Depot::Depot(const string &name) : enditerator(0, 0) +{ + defaultmailbox = 0; + selectedmailbox = 0; + + delimiter = '/'; + + this->name = name; +} + +//-------------------------------------------------------------------- +Depot::~Depot(void) +{ +} + +//-------------------------------------------------------------------- +const string &Depot::getLastError(void) const +{ + return lastError; +} + +//-------------------------------------------------------------------- +void Depot::setLastError(const string &error) const +{ + lastError = error; +} + +//-------------------------------------------------------------------- +void Depot::assign(Mailbox *m) +{ + for (vector<Mailbox *>::const_iterator i = backends.begin(); + i != backends.end(); ++i) + if (*i == m) break; + + backends.push_back(m); +} + +//-------------------------------------------------------------------- +Mailbox *Depot::get(const string &s_in) const +{ + for (vector<Mailbox *>::const_iterator i = backends.begin(); + i != backends.end(); ++i) + if ((*i)->isMailbox(mailboxToFilename(s_in))) + return *i; + + setLastError("No such mailbox " + toImapString(s_in)); + return 0; +} + +//-------------------------------------------------------------------- +bool Depot::setSelected(Mailbox *m) +{ + for (vector<Mailbox *>::const_iterator i = backends.begin(); + i != backends.end(); ++i) + if (*i == m) { + selectedmailbox = m; + return true; + } + + setLastError("Attempted to select unregistered Mailbox type in Depot"); + return false; +} + +//-------------------------------------------------------------------- +const string &Depot::getName(void) const +{ + return name; +} + +//-------------------------------------------------------------------- +void Depot::setDelimiter(char c) +{ + delimiter = c; +} + +//-------------------------------------------------------------------- +const char Depot::getDelimiter(void) const +{ + return delimiter; +} + +//-------------------------------------------------------------------- +bool Depot::setDefaultType(const string &name) +{ + for (vector<Mailbox *>::const_iterator i = backends.begin(); + i != backends.end(); ++i) + if ((*i)->getTypeName() == name) { + defaultmailbox = *i; + return true; + } + + setLastError("attempt to default to unregistered Mailbox type " + name); + return false; +} + +//-------------------------------------------------------------------- +Mailbox *Depot::getSelected(void) const +{ + return selectedmailbox; +} + +//-------------------------------------------------------------------- +Mailbox *Depot::getDefault(void) const +{ + return defaultmailbox; +} + +//-------------------------------------------------------------------- +bool Depot::createMailbox(const string &s_in) const +{ + const string &mailboxname = mailboxToFilename(toCanonMailbox(s_in)); + if (mailboxname == "") { + setLastError("invalid mailbox name"); + return false; + } + + Mailbox *mailbox = getDefault(); + if (mailbox == 0) { + setLastError("no default mailbox defined"); + return false; + } + + bool result = mailbox->createMailbox(mailboxname, 0777); + if (result) + return true; + else { + setLastError(mailbox->getLastError()); + return false; + } +} + +//-------------------------------------------------------------------- +bool Depot::deleteMailbox(const string &s_in) const +{ + const string &mailboxname = mailboxToFilename(toCanonMailbox(s_in)); + + Mailbox *mailbox = get(s_in); + if (mailbox == 0) { + setLastError(s_in + ": no such mailbox"); + return false; + } + + bool result = mailbox->deleteMailbox(mailboxname); + if (result) + return true; + else { + setLastError(mailbox->getLastError()); + return false; + } +} + +//-------------------------------------------------------------------- +bool Depot::renameMailbox(const string &s_in, const string &t_in) const +{ + IO &logger = IOFactory::getInstance().get(2); + + const string &source = mailboxToFilename(s_in).c_str(); + const string &dest = mailboxToFilename(t_in).c_str(); + + int nrenamed = 0; + const iterator e = end(); + for (iterator i = begin("."); i != e; ++i) { + string entry = *i; + + if (entry.substr(0, source.length()) == source) { + string sourcename, destname; + + if (entry.length() == source.length()) { + sourcename = source; + destname = dest; + + } else if (entry.length() > source.length() + && entry[source.length()] == '.') { + sourcename = entry; + destname = dest + entry.substr(source.length()); + } else continue; + + if (rename(sourcename.c_str(), destname.c_str()) != 0) { + logger << "error renaming " << sourcename << " to " + << destname << ": " << strerror(errno) << endl; + } else + nrenamed++; + + Mailbox *mailbox; + if ((mailbox = get(filenameToMailbox(sourcename))) != 0) + mailbox->bumpUidValidity(filenameToMailbox(sourcename)); + if ((mailbox = get(filenameToMailbox(destname))) != 0) + mailbox->bumpUidValidity(filenameToMailbox(destname)); + } + } + + if (nrenamed == 0) { + setLastError("An error occurred when renaming " + + toImapString(s_in) + + " to " + toImapString(t_in) + + ". Try creating a new mailbox," + " then copy over all messages." + " Finally, delete the original mailbox"); + return false; + } else + return true; +} + +//-------------------------------------------------------------------- +bool Depot::getStatus(const std::string &s_in, Status &dest) const +{ + const string mailbox = toCanonMailbox(s_in); + Mailbox *m = get(mailbox); + if (m == 0) { + setLastError("Unrecognized mailbox: " + toImapString(s_in)); + return false; + } + + int statusid = m->getStatusID(mailboxToFilename(mailbox)); + if (mailboxstatuses.find(mailbox) != mailboxstatuses.end()) { + dest = mailboxstatuses[mailbox]; + if (dest.getStatusID() == statusid) + return true; + } + + if (!m->getStatus(mailboxToFilename(mailbox), dest)) { + setLastError(m->getLastError()); + return false; + } + + dest.setStatusID(statusid); + mailboxstatuses[mailbox] = dest; + return true; +} + +//-------------------------------------------------------------------- +Depot::iterator::iterator(void) +{ + dirp = 0; + ref = new int; + *ref = 1; +} + +//-------------------------------------------------------------------- +Depot::iterator::iterator(DIR *dp, struct dirent *sp) +{ + dirp = dp; + direntp = sp; + + ref = new int; + *ref = 1; +} + +//-------------------------------------------------------------------- +Depot::iterator::iterator(const iterator &copy) +{ + if (*copy.ref != 0) + ++(*copy.ref); + + ref = copy.ref; + dirp = copy.dirp; + direntp = copy.direntp; +} + +//-------------------------------------------------------------------- +Depot::iterator::~iterator(void) +{ + deref(); +} + +//-------------------------------------------------------------------- +Depot::iterator &Depot::iterator::operator =(const iterator &copy) +{ + if (*copy.ref != 0) + ++(*copy.ref); + + deref(); + + ref = copy.ref; + dirp = copy.dirp; + direntp = copy.direntp; + + return *this; +} + +//-------------------------------------------------------------------- +void Depot::iterator::deref(void) +{ + // decrease existing copy ref if there is one + if (*ref != 0 && --(*ref) == 0) { + if (dirp) { + closedir(dirp); + dirp = 0; + } + + delete ref; + ref = 0; + } +} + +//-------------------------------------------------------------------- +string Depot::iterator::operator * (void) const +{ + if (direntp == 0) + return ""; + + return direntp->d_name; +} + +//-------------------------------------------------------------------- +void Depot::iterator::operator ++ (void) +{ + direntp = readdir(dirp); +} + +//-------------------------------------------------------------------- +bool Depot::iterator::operator == (Depot::iterator i) const +{ + return direntp == i.direntp; +} + +//-------------------------------------------------------------------- +bool Depot::iterator::operator != (Depot::iterator i) const +{ + return direntp != i.direntp; +} + +//-------------------------------------------------------------------- +Depot::iterator Depot::begin(const string &path) const +{ + Depot::iterator i; + + if ((i.dirp = opendir(path.c_str())) == 0) { + IO &logger = IOFactory::getInstance().get(2); + + logger << "opendir on " + path + " failed" << endl; + setLastError("opendir on " + path + " failed"); + return end(); + } + + ++i; + return i; +} + +//-------------------------------------------------------------------- +const Depot::iterator &Depot::end(void) const +{ + return enditerator; +} + +//-------------------------------------------------------------------- +MaildirPPDepot::MaildirPPDepot(void) : Depot("Maildir++") +{ +} + +//-------------------------------------------------------------------- +MaildirPPDepot::~MaildirPPDepot(void) +{ +} + +//-------------------------------------------------------------------- +string MaildirPPDepot::mailboxToFilename(const string &m) const +{ + string prefix = "INBOX"; prefix += delimiter; + + string mm = m; + trim(mm, string(&delimiter, 1)); + string tmp = mm; + uppercase(tmp); + if (tmp != "INBOX" && tmp.substr(0, 6) != "INBOX/") { + setLastError("With a Maildir++ depot, you must create all" + " mailboxes under INBOX. Try creating" + " INBOX/" + mm + "."); + return ""; + } + + string twodelim; + twodelim += delimiter; + twodelim += delimiter; + + if (mm == "INBOX") return "."; + else if (mm.length() <= 6) { + setLastError("With a Maildir++ depot, you must create all" + " mailboxes under INBOX."); + return ""; + } else if (mm.substr(0, 6) != prefix) { + setLastError("With a Maildir++ depot, you must create all" + " mailboxes under INBOX."); + return ""; + } else if (mm.find(twodelim) != string::npos) { + setLastError("Invalid character combination " + + twodelim + " in mailbox name"); + return ""; + } else if (mm != "" && mm.substr(1).find('.') != string::npos) { + setLastError("Invalid character '.' in mailbox name"); + return ""; + } else { + string tmp = mm.substr(6); + for (string::iterator i = tmp.begin(); i != tmp.end(); ++i) + if (*i == '/') *i = '.'; + + return "." + tmp; + } +} + +//-------------------------------------------------------------------- +string MaildirPPDepot::filenameToMailbox(const string &m) const +{ + if (m == ".") return "INBOX"; + else if (m.find(delimiter) != string::npos) return ""; + else if (m != "" && m[0] == '.') { + string tmp = m; + for (string::iterator i = tmp.begin(); i != tmp.end(); ++i) + if (*i == '.') *i = delimiter; + + return "INBOX" + tmp; + } else return ""; +} + +//-------------------------------------------------------------------- +IMAPdirDepot::IMAPdirDepot(void) : Depot("IMAPdir") +{ +} + +//-------------------------------------------------------------------- +IMAPdirDepot::~IMAPdirDepot(void) +{ +} + +//-------------------------------------------------------------------- +string IMAPdirDepot::mailboxToFilename(const string &m) const +{ + string tmp; + string mm = m; + trim(mm, string(&delimiter, 1)); + + string twodelim; + twodelim += delimiter; + twodelim += delimiter; + + if (mm.find(twodelim) != string::npos) { + setLastError("Invalid character combination " + + twodelim + " in mailbox name"); + return ""; + } + + string::const_iterator i = mm.begin(); + while (i != mm.end()) { + if (*i == delimiter) { + tmp += '.'; + } else if (*i == '\\') { + tmp += "\\\\"; + } else if (*i == '.') { + if (i == mm.begin()) + tmp += "."; + else + tmp += "\\."; + } else { + tmp += *i; + } + + ++i; + } + + return tmp; +} + +//-------------------------------------------------------------------- +string IMAPdirDepot::filenameToMailbox(const string &m) const +{ + string tmp; + bool escape = false; + + string::const_iterator i = m.begin(); + while (i != m.end()) { + if (*i == '.') { + if (i != m.begin() && !escape) tmp += delimiter; + else if (i == m.begin() || escape) tmp += '.'; + escape = false; + } else if (*i == '\\') { + if (!escape) escape = true; else { + tmp += '\\'; + escape = false; + } + } else if (*i == delimiter) { + return ""; + } else { + if (escape) return ""; + else { + tmp += *i; + escape = false; + } + } + + ++i; + } + + return tmp; +} diff --git a/src/depot.h b/src/depot.h @@ -0,0 +1,162 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/depot.h + * + * Description: + * <---> + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifndef depot_h_included +#define depot_h_included +#include <map> +#include <string> +#include <vector> + +#include <dirent.h> + +namespace Binc { + + class Mailbox; + class Depot; + class Status; + + //------------------------------------------------------------------ + class DepotFactory { + private: + std::vector<Depot *> depots; + DepotFactory(void); + + public: + void assign(Depot *); + Depot *get(const std::string &name) const; + + static DepotFactory &getInstance(void); + ~DepotFactory(void); + }; + + //------------------------------------------------------------------ + class Depot { + public: + //-- + class iterator { + public: + std::string operator * (void) const; + void operator ++ (void); + bool operator != (iterator) const; + bool operator == (iterator) const; + + iterator(void); + iterator(const iterator &copy); + iterator(DIR *, struct dirent *); + ~iterator(void); + + void deref(void); + + iterator &operator =(const iterator &copy); + + friend class Depot; + + private: + DIR *dirp; + struct dirent *direntp; + int *ref; + }; + + private: + iterator enditerator; + std::vector<Mailbox *> backends; + Mailbox *defaultmailbox; + Mailbox *selectedmailbox; + + protected: + mutable std::string lastError; + std::string name; + char delimiter; + mutable std::map<std::string, Status> mailboxstatuses; + + public: + iterator begin(const std::string &) const; + const iterator &end(void) const; + + void setDelimiter(char); + const char getDelimiter(void) const; + + void assign(Mailbox *); + + bool setDefaultType(const std::string &n) ; + Mailbox *getDefault(void) const; + Mailbox *get(const std::string &path) const; + + bool setSelected(Mailbox *); + Mailbox *getSelected(void) const; + + bool getStatus(const std::string &s_in, Status &dest) const; + + const std::string &getName(void) const; + + virtual std::string mailboxToFilename(const std::string &m) const = 0; + virtual std::string filenameToMailbox(const std::string &m) const = 0; + + virtual bool createMailbox(const std::string &m) const; + virtual bool deleteMailbox(const std::string &m) const; + virtual bool renameMailbox(const std::string &m, const std::string &n) const; + + const std::string &getLastError(void) const; + void setLastError(const std::string &error) const; + + //-- + Depot(void); + Depot(const std::string &name); + virtual ~Depot(void); + }; + + //------------------------------------------------------------------ + class MaildirPPDepot : public Depot { + public: + std::string mailboxToFilename(const std::string &m) const; + std::string filenameToMailbox(const std::string &m) const; + + //-- + MaildirPPDepot(); + ~MaildirPPDepot(); + }; + + //------------------------------------------------------------------ + class IMAPdirDepot : public Depot { + public: + std::string mailboxToFilename(const std::string &m) const; + std::string filenameToMailbox(const std::string &m) const; + + //-- + IMAPdirDepot(); + ~IMAPdirDepot(); + }; + +} + +#endif diff --git a/src/greeting.cc b/src/greeting.cc @@ -0,0 +1,77 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * greeting.cc + * + * Description: + * Implementation of the inital greeting. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <time.h> + +#include "io.h" +#include "session.h" + +using namespace ::std; +using namespace Binc; + +static const unsigned int ISO8601SIZE = 32; + +namespace Binc { + void showGreeting(void); +}; + + +//------------------------------------------------------------------------ +void Binc::showGreeting(void) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + time_t t = time(0); + struct tm *mytm = localtime(&t); + + char mytime[ISO8601SIZE]; + unsigned int size = strftime(mytime, sizeof(mytime), + "%Y-%m-%d %H:%M:%S %Z", mytm); + if (size >= sizeof(mytime)) + mytime[0] = 0; + + string version; + string tmp = session.globalconfig["Security"]["version in greeting"]; + lowercase(tmp); + if (tmp == "yes") + version = "v"VERSION" "; + + com << "* OK Welcome to Binc IMAP " << version + << "Copyright (C) 2002-2004 Andreas Aardal Hanssen at " + << mytime << endl; +} diff --git a/src/imapparser.cc b/src/imapparser.cc @@ -0,0 +1,398 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * imapparser.cc + * + * Description: + * Implementation of the common items for parsing IMAP input + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "imapparser.h" +#include "io.h" +#include "convert.h" + +#include <stdio.h> +#include <map> +#include <iostream> +#include <vector> +#include <string> +#include <exception> + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +Request::Request(void) + : extra(0), flags(), statuses(), bset(), searchkey(), fatt() +{ + uidmode = false; +} + +Request::~Request(void) +{ + if (extra != 0) + delete extra; +} + +//------------------------------------------------------------------------ +void Request::setUidMode(void) +{ + uidmode = true; +} + +//------------------------------------------------------------------------ +bool Request::getUidMode(void) const +{ + return uidmode; +} + +//------------------------------------------------------------------------ +void Request::setTag(string &t_in) +{ + tag = t_in; +} + +//------------------------------------------------------------------------ +const string &Request::getTag(void) const +{ + return tag; +} + +//------------------------------------------------------------------------ +void Request::setMode(const string &m_in) +{ + mode = m_in; +} + +//------------------------------------------------------------------------ +const string &Request::getMode(void) const +{ + return mode; +} + +//------------------------------------------------------------------------ +void Request::setName(const string &s_in) +{ + name = s_in; +} + +//------------------------------------------------------------------------ +const string &Request::getName(void) const +{ + return name; +} + +//------------------------------------------------------------------------ +void Request::setAuthType(const string &s_in) +{ + authtype = s_in; +} + +//------------------------------------------------------------------------ +const string &Request::getAuthType(void) const +{ + return authtype; +} + +//------------------------------------------------------------------------ +void Request::setLiteral(const string &s_in) +{ + literal = s_in; +} + +//------------------------------------------------------------------------ +const string &Request::getLiteral(void) const +{ + return literal; +} + +//------------------------------------------------------------------------ +void Request::setDate(const string &s_in) +{ + date = s_in; +} + +//------------------------------------------------------------------------ +const string &Request::getDate(void) const +{ + return date; +} + +//------------------------------------------------------------------------ +void Request::setCharSet(const string &s_in) +{ + charset = s_in; +} + +//------------------------------------------------------------------------ +const string &Request::getCharSet(void) const +{ + return charset; +} + +//------------------------------------------------------------------------ +void Request::setUserID(const string &s_in) +{ + userid = s_in; +} + +//------------------------------------------------------------------------ +const string &Request::getUserID(void) const +{ + return userid; +} + +//------------------------------------------------------------------------ +void Request::setPassword(const string &s_in) +{ + password = s_in; +} + +//------------------------------------------------------------------------ +const string &Request::getPassword(void) const +{ + return password; +} + +//------------------------------------------------------------------------ +void Request::setMailbox(const string &s_in) +{ + mailbox = s_in; +} + +//------------------------------------------------------------------------ +const string &Request::getMailbox(void) const +{ + return mailbox; +} + +//------------------------------------------------------------------------ +void Request::setListMailbox(const string &s_in) +{ + listmailbox = s_in; +} + +//------------------------------------------------------------------------ +const string &Request::getListMailbox(void) const +{ + return listmailbox; +} + +//------------------------------------------------------------------------ +void Request::setNewMailbox(const string &s_in) +{ + newmailbox = s_in; +} + +//------------------------------------------------------------------------ +const string &Request::getNewMailbox(void) const +{ + return newmailbox; +} + +//------------------------------------------------------------------------ +SequenceSet &Request::getSet(void) +{ + return bset; +} + +//------------------------------------------------------------------------ +vector<string> &Request::getStatuses(void) +{ + return statuses; +} + +//------------------------------------------------------------------------ +vector<string> &Request::getFlags(void) +{ + return flags; +} + +//------------------------------------------------------------------------ +SequenceSet::SequenceSet(void) : limited(true), nullSet(false) +{ +} + +//------------------------------------------------------------------------ +SequenceSet::SequenceSet(const SequenceSet &copy) + : limited(copy.limited), nullSet(copy.nullSet), internal(copy.internal) +{ +} + +//------------------------------------------------------------------------ +SequenceSet &SequenceSet::operator = (const SequenceSet &copy) +{ + limited = copy.limited; + nullSet = copy.nullSet; + internal = copy.internal; + + return *this; +} + +//------------------------------------------------------------------------ +SequenceSet::~SequenceSet(void) +{ +} + +//------------------------------------------------------------------------ +SequenceSet &SequenceSet::null(void) +{ + static SequenceSet nil; + nil.nullSet = true; + return nil; +} + +//------------------------------------------------------------------------ +bool SequenceSet::isNull(void) const +{ + return nullSet; +} + +//------------------------------------------------------------------------ +SequenceSet &SequenceSet::all(void) +{ + static bool initialized = false; + static SequenceSet all; + + if (!initialized) { + all.addRange(1, (unsigned int)-1); + initialized = true; + } + + return all; +} + +//------------------------------------------------------------------------ +SequenceSet::Range::Range(unsigned int a, unsigned int b) +{ + if (a > b) { + from = b; + to = a; + } else { + from = a; + to = b; + } +} + +//------------------------------------------------------------------------ +void SequenceSet::addRange(unsigned int a, unsigned int b) +{ + if (a == (unsigned int)-1 || b == (unsigned int)-1) limited = false; + internal.push_back(Range(a, b)); +} + +//------------------------------------------------------------------------ +void SequenceSet::addNumber(unsigned int a) +{ + if (a == (unsigned int)-1) limited = false; + internal.push_back(Range(a, a)); +} + +//------------------------------------------------------------------------ +bool SequenceSet::isInSet(unsigned int n) const +{ + unsigned int maxvalue = 0; + for (vector<Range>::const_iterator i = internal.begin(); + i != internal.end(); ++i) { + const Range &r = *i; + if (r.from > maxvalue) maxvalue = r.from; + else if (r.to > maxvalue) maxvalue = r.to; + + if (n >= (*i).from && n <= (*i).to) { + return true; + } + } + + return (n > maxvalue && !limited); +} + +//------------------------------------------------------------------------ +BincImapParserFetchAtt::BincImapParserFetchAtt(const std::string &typeName) + : type(typeName) +{ + offsetstart = 0; + offsetlength = (unsigned int) -1; + hassection = false; +} + +//------------------------------------------------------------------------ +string BincImapParserFetchAtt::toString(void) +{ + string tmp; + if (type == "BODY.PEEK") + tmp = "BODY"; + else + tmp = type; + + if (type == "BODY" || type == "BODY.PEEK") { + if (hassection) { + tmp += "["; + tmp += section; + if (sectiontext != "") { + if (section != "") + tmp += "."; + tmp += sectiontext; + + if (headerlist.size() != 0) { + tmp += " ("; + for (vector<string>::iterator i = headerlist.begin(); + i != headerlist.end(); ++i) { + if (i != headerlist.begin()) + tmp += " "; + tmp += *i; + } + tmp += ")"; + } + } + tmp += "]"; + + if (offsetstart == 0 && offsetlength == (unsigned int) -1) + tmp += " "; + else + tmp += "<" + Binc::toString(offsetstart) + "> "; + } + } + + return tmp; +} + +//------------------------------------------------------------------------ +BincImapParserSearchKey::BincImapParserSearchKey(void) +{ + type = 0; + number = 0; +} + +//------------------------------------------------------------------------ +const SequenceSet& BincImapParserSearchKey::getSet(void) const +{ + return bset; +} diff --git a/src/imapparser.h b/src/imapparser.h @@ -0,0 +1,199 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/parsers/imap/imapparser.h + * + * Description: + * Declaration of the common items for parsing IMAP input + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef imapparser_h_included +#define imapparser_h_included + +/* stl includes */ +#include <string> +#include <map> +#include <vector> + +namespace Binc { + //------------------------------------------------------------------------ + class SequenceSet { + public: + void addRange(unsigned int a_in, unsigned int b_in); + bool isInSet(unsigned int n) const; + void addNumber(unsigned int a_in); + inline bool isLimited(void) const { return limited; } + + static SequenceSet &all(void); + + static SequenceSet &null(void); + + SequenceSet &operator = (const SequenceSet &copy); + + SequenceSet(void); + SequenceSet(const SequenceSet &copy); + ~SequenceSet(void); + + protected: + bool isNull(void) const; + + private: + bool limited; + bool nullSet; + + class Range { + public: + unsigned int from; + unsigned int to; + Range(unsigned int from, unsigned int to); + }; + + std::vector<Range> internal; + }; + + //------------------------------------------------------------------------ + class BincImapParserFetchAtt { + public: + std::string type; + std::string section; + std::string sectiontext; + std::vector<std::string> headerlist; + unsigned int offsetstart; + unsigned int offsetlength; + bool hassection; + + BincImapParserFetchAtt(const std::string &typeName = ""); + + std::string toString(void); + }; + + //------------------------------------------------------------------------ + class BincImapParserSearchKey { + public: + std::string name; + std::string date; + std::string astring; + std::string bstring; + int type; + unsigned int number; + SequenceSet bset; + enum {KEY_AND, KEY_OR, KEY_NOT, KEY_OTHER, KEY_SET}; + + std::vector<BincImapParserSearchKey> children; + + const SequenceSet& getSet(void) const; + + BincImapParserSearchKey(void); + }; + + //------------------------------------------------------------------------ + class BincImapParserData { + public: + virtual ~BincImapParserData(void) {} + }; + + //------------------------------------------------------------------------ + class Request { + private: + std::string tag; + std::string name; + std::string mode; + std::string date; + std::string userid; + std::string password; + std::string mailbox; + std::string newmailbox; + std::string authtype; + std::string listmailbox; + std::string charset; + std::string literal; + bool uidmode; + + public: + BincImapParserData * extra; + std::vector<std::string> flags; + std::vector<std::string> statuses; + + SequenceSet bset; + BincImapParserSearchKey searchkey; + std::vector<BincImapParserFetchAtt> fatt; + + void setUidMode(void); + bool getUidMode(void) const; + + void setTag(std::string &t_in); + const std::string &getTag(void) const; + + void setMode(const std::string &m_in); + const std::string &getMode(void) const; + + void setName(const std::string &s_in); + const std::string &getName(void) const; + + void setLiteral(const std::string &s_in); + const std::string &getLiteral(void) const; + + void setDate(const std::string &s_in); + const std::string &getDate(void) const; + + void setCharSet(const std::string &s_in); + const std::string &getCharSet(void) const; + + void setUserID(const std::string &s_in); + const std::string &getUserID(void) const; + + void setPassword(const std::string &s_in); + const std::string &getPassword(void) const; + + void setMailbox(const std::string &s_in); + const std::string &getMailbox(void) const; + + void setAuthType(const std::string &s_in); + const std::string &getAuthType(void) const; + + void setNewMailbox(const std::string &s_in); + const std::string &getNewMailbox(void) const; + + void setListMailbox(const std::string &s_in); + const std::string &getListMailbox(void) const; + + SequenceSet &getSet(void); + + std::vector<std::string> &getFlags(void); + std::vector<std::string> &getStatuses(void); + + Request(void); + ~Request(void); + }; +} + + +#endif diff --git a/src/io-ssl.cc b/src/io-ssl.cc @@ -0,0 +1,312 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * io-ssl.cc + * + * Description: + * Implementation of the IO class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef WITH_SSL + +#include <string> + +#include <openssl/ssl.h> + +#include "session.h" +#include "io-ssl.h" + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +SSLEnabledIO::SSLEnabledIO(void) +{ +} + +//------------------------------------------------------------------------ +SSLEnabledIO::SSLEnabledIO(FILE *fp) : IO(fp) +{ +} + +//------------------------------------------------------------------------ +SSLEnabledIO::~SSLEnabledIO(void) +{ + switch (mode) { + case MODE_SSL: + SSL_shutdown(ssl); + SSL_shutdown(ssl); + + SSL_free(ssl); + SSL_CTX_free(ctx); + + break; + case MODE_SYSLOG: + closelog(); + break; + default: + break; + } +} + + +//------------------------------------------------------------------------ +bool SSLEnabledIO::setModeSSL(void) +{ + SSL_library_init(); + SSL_load_error_strings(); + + OpenSSL_add_ssl_algorithms(); + + if ((ctx = SSL_CTX_new(SSLv23_server_method())) == 0) { + setLastError("SSL error: internal error when creating CTX: " + + string(ERR_error_string(ERR_get_error(), 0))); + return false; + } + + SSL_CTX_set_options(ctx, SSL_OP_ALL); + + Session &session = Session::getInstance(); + + string clist = session.globalconfig["SSL"]["cipher list"]; + if (clist != "" && !SSL_CTX_set_cipher_list(ctx, clist.c_str())) { + setLastError("SSL error: cannot load cipher list " + clist); + return false; + } + + string CAfile = session.globalconfig["SSL"]["ca file"]; + if (CAfile == "") CAfile == "/usr/share/ssl/certs/.crt"; + + SSL_CTX_set_default_verify_paths(ctx); + + string pemname = session.globalconfig["SSL"]["pem file"]; + if (pemname == "") pemname = "/usr/share/ssl/certs/stunnel.pem"; + + if (!SSL_CTX_use_certificate_file(ctx, pemname.c_str(), SSL_FILETYPE_PEM)) { + setLastError("SSL error: unable to use certificate in PEM file: " + + pemname + ": " + + string(ERR_error_string(ERR_get_error(), 0))); + return false; + } + + if (!SSL_CTX_use_PrivateKey_file(ctx, pemname.c_str(), SSL_FILETYPE_PEM)) { + setLastError("SSL error: unable to use private key in PEM file: " + + pemname + ": " + + string(ERR_error_string(ERR_get_error(), 0))); + return false; + } + + if (!SSL_CTX_check_private_key(ctx)) { + setLastError("SSL error: public and private key in PEM file" + " don't match: " + + pemname + ": " + + string(ERR_error_string(ERR_get_error(), 0))); + return false; + } + + if (session.globalconfig["SSL"]["verify peer"] == "yes") + SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE, 0); + else + SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); + + SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(CAfile.c_str())); + + SSL *ssl = SSL_new(ctx); + if (ssl == 0) { + setLastError("SSL error: when creating SSL object: " + + string(ERR_error_string(ERR_get_error(), 0))); + return false; + } + + SSL_clear(ssl); + + SSL_set_rfd(ssl, 0); + SSL_set_wfd(ssl, 1); + SSL_set_accept_state(ssl); + + fflush(stdout); + + int result = SSL_accept(ssl); + if (result <= 0) { + string errstr; + switch (SSL_get_error(ssl, 0)) { + case SSL_ERROR_NONE: errstr = "Unknown error"; break; + case SSL_ERROR_ZERO_RETURN: errstr = "Connection closed"; break; + case SSL_ERROR_WANT_READ: + case SSL_ERROR_WANT_WRITE: + case SSL_ERROR_WANT_CONNECT: errstr = "Operation did not complete"; break; + case SSL_ERROR_WANT_X509_LOOKUP: errstr = "X509 lookup requested"; break; + case SSL_ERROR_SYSCALL: errstr = "Unexpected EOF"; break; + case SSL_ERROR_SSL: errstr = "Internal SSL error: "; + errstr += string(ERR_error_string(ERR_get_error(), 0)); break; + } + + setLastError(errstr); + return false; + } + + this->ssl = ssl; + mode = MODE_SSL; + return true; +} + +//------------------------------------------------------------------------ +bool SSLEnabledIO::isModeSSL(void) +{ + return mode == MODE_SSL; +} + +//------------------------------------------------------------------------ +void SSLEnabledIO::writeStr(const string s) +{ + if (s == "") + return; + + if (mode == MODE_PLAIN) { + // Set transfer timeout + alarm(transfertimeout); + int n = fwrite(s.c_str(), 1, s.length(), fpout); + fflush(fpout); + alarm(0); + + Session::getInstance().addWriteBytes(n); + + if (n != (int) s.length()) { + setLastError("Output error: fwrite wrote too few bytes"); + return; + } + } else if (mode == MODE_SYSLOG) { + // Set transfer timeout + alarm(transfertimeout); + syslog(LOG_INFO, "%s", s.c_str()); + alarm(0); + } else if (mode == MODE_SSL) { + do { + alarm(transfertimeout); + int retval = SSL_write(ssl, s.c_str(), s.length()); + alarm(0); + + if (retval > 0) { + Session::getInstance().addWriteBytes(retval); + break; + } else if (retval == 0) { + /* call get_error */ + setLastError("SSL_write returned 0"); + return; + } else if (retval < 0) { + int err = SSL_get_error(ssl, retval); + + if (err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) { + setLastError("SSL_write returned < 0"); + return; + } else { + // retry when we get this error. + } + } + } while (1); + } +} + +//------------------------------------------------------------------------ +int SSLEnabledIO::fillBuffer(int timeout, bool retry) +{ + if (mode == MODE_PLAIN) + return IO::fillBuffer(timeout, retry); + + fd_set rfds; + FD_ZERO(&rfds); + FD_SET(0, &rfds); + + for (;;) { + fd_set rfds; + FD_ZERO(&rfds); + FD_SET(0, &rfds); + + struct timeval tv; + tv.tv_sec = timeout; + tv.tv_usec = 0; + + int r = ::select(fileno(stdin) + 1, &rfds, 0, 0, timeout ? &tv : 0); + if (r == 0) { + setLastError("Reading from client timed out."); + return -2; + } + + if (r < 0) { + setLastError("Error when reading from client"); + return -1; + } + + char buf[1024]; + unsigned int readBytes = SSL_read(ssl, buf, sizeof(buf)); + if (readBytes > 0) { + + Session::getInstance().addReadBytes(readBytes); + + for (unsigned int i = 0; i < readBytes; ++i) + inputBuffer.push_front(buf[i]); + + return readBytes; + } + + if (readBytes == 0) { + setLastError("Client disconnected"); + return -1; + } + + if (readBytes < 0) { + int err = SSL_get_error(ssl, readBytes); + if (err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) { + setLastError("SSL error: read returned " + + toString(readBytes) + ": " + + string(ERR_error_string(ERR_get_error(), 0))); + return -1; + } + + if (timeout == 0 || !retry) { + setLastError("Reading from client timed out."); + return -2; + } + } + } +} + +//------------------------------------------------------------------------ +int SSLEnabledIO::pending(void) const +{ + int tmp = (mode == MODE_PLAIN ? 0 : SSL_pending(ssl)); + if (tmp) + return tmp; + else + return inputBuffer.size(); +} + +#endif diff --git a/src/io-ssl.h b/src/io-ssl.h @@ -0,0 +1,81 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/io/io.h + * + * Description: + * Declaration of the IO class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifndef io_ssl_h_included +#define io_ssl_h_included +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef WITH_SSL + +#include <string> + +#include <stdio.h> +#include <openssl/ssl.h> +#include <openssl/err.h> + +#include "io.h" + +namespace Binc { + + class SSLEnabledIO : public IO { + public: + enum { + MODE_PLAIN = 0x01, + MODE_SSL = 0x04, + MODE_SYSLOG = 0x02 + }; + + bool isModeSSL(void); + bool setModeSSL(void); + + void writeStr(const std::string s); + int fillBuffer(int timeout, bool retry); + + int pending(void) const; + + //-- + SSLEnabledIO(void); + SSLEnabledIO(FILE *); + ~SSLEnabledIO(void); + + private: + SSL *ssl; + SSL_CTX *ctx; + + }; +} + +#endif +#endif diff --git a/src/io.cc b/src/io.cc @@ -0,0 +1,441 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/io/io.h + * + * Description: + * Implementation of the IO class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> +#ifdef HAVE_OSTREAM +#include <ostream> +#else +#include <ostream.h> +#endif + +#include "session.h" +#include "io.h" + + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +IO::IO() +{ + pid = getpid(); + enabled = true; + flushesOnEndl = true; + mode = MODE_PLAIN; + useLogPrefix = false; + seqnr = 0; + buffersize = 8192; + transfertimeout = 0; + inputsize = 0; + inputlimit = true; +} + +//------------------------------------------------------------------------ +IO::IO(FILE *fp) +{ + pid = getpid(); + setFd(fp); + enabled = true; + flushesOnEndl = true; + mode = MODE_PLAIN; + useLogPrefix = false; + seqnr = 0; + buffersize = 8192; + transfertimeout = 0; + inputsize = 0; + inputlimit = true; +} + +//------------------------------------------------------------------------ +IO::~IO(void) +{ + switch (mode) { + case MODE_SYSLOG: + closelog(); + break; + default: + break; + } +} + +//------------------------------------------------------------------------ +void IO::enable(void) +{ + enabled = true; +} + +//------------------------------------------------------------------------ +void IO::enableLogPrefix(void) +{ + useLogPrefix = true; +} + +//------------------------------------------------------------------------ +void IO::disable(void) +{ + enabled = false; +} + +//------------------------------------------------------------------------ +void IO::flushContent(void) +{ + if (!enabled) return; + + string s = outputBuffer.str(); + string tmpstr; + if (mode == MODE_SYSLOG) { + tmpstr = ""; + for (string::iterator i = s.begin(); i != s.end(); ++i) + if (*i != '\r' && *i != '\n') { + tmpstr += *i; + } else { + writeStr(tmpstr); + tmpstr = ""; + } + + if (tmpstr != "") + writeStr(tmpstr); + } else + writeStr(s); + + + outputBuffer.clear(); +} + +//------------------------------------------------------------------------ +void IO::flushOnEndl(void) +{ + flushesOnEndl = true; +} + +//------------------------------------------------------------------------ +void IO::noFlushOnEndl(void) +{ + flushesOnEndl = false; +} + +//------------------------------------------------------------------------ +void IO::clear(void) +{ + if (!enabled) return; + + outputBuffer.clear(); +} + +//------------------------------------------------------------------------ +void IO::setModeSyslog(const string &servicename, int facility = LOG_DAEMON) +{ + static string sname; + sname = servicename; + if (mode != MODE_SYSLOG) { + openlog(sname.c_str(), LOG_PID, facility); + mode = MODE_SYSLOG; + } +} + +//------------------------------------------------------------------------ +void IO::setFd(FILE *fp) +{ + fpout = fp; +} + +//------------------------------------------------------------------------ +void IO::resetInput(void) +{ + inputsize = 0; +} + +//------------------------------------------------------------------------ +void IO::enableInputLimit(void) +{ + inputlimit = true; +} + +//------------------------------------------------------------------------ +void IO::disableInputLimit(void) +{ + inputlimit = false; +} + +//------------------------------------------------------------------------ +IO &IO::operator << (std::ostream &(*man)(std::ostream &)) +{ + if (!enabled) return *this; + + if (useLogPrefix && outputBuffer.getSize() == 0) { + outputBuffer << pid; + outputBuffer << " "; + outputBuffer << seqnr++; + if (logprefix != "") + outputBuffer << " [" << logprefix << "]"; + outputBuffer << " "; + } + + static std::ostream &(*endl_funcpt)(std::ostream&) = std::endl; + + if (man == endl_funcpt) { + outputBuffer << "\r\n"; + + if (flushesOnEndl) + flushContent(); + } else + outputBuffer << man; + + if ((int) outputBuffer.getSize() >= buffersize) + flushContent(); + + return *this; +} + +//------------------------------------------------------------------------ +int IO::select(int maxfd, + fd_set *readfds, fd_set *writefds, fd_set *exceptfds, + int &timeout) +{ + if (timeout == -1) return 1; + struct timeval t1; + struct timeval t2; + int res; + + if (gettimeofday(&t1, 0) == -1) { + setLastError("Failure in select: gettimeofday failed."); + return -1; + } + + do { + struct timeval t; + t.tv_sec = timeout; + t.tv_usec = 0; + res = ::select(maxfd, readfds, writefds, exceptfds, timeout ? &t : 0); + + if (gettimeofday(&t2, 0) == -1) { + setLastError("Failure in select: gettimeofday failed."); + return -1; + } + + timeout = 1000*(t2.tv_sec - t1.tv_sec) + (t2.tv_usec - t1.tv_usec)/1000; + + if (timeout < 0) timeout = 0; + if (res == 0) return 0; + if (res > 0) return res; + } while (res == -1 && errno == EINTR); + return -1; +} + +//------------------------------------------------------------------------ +void IO::writeStr(const string s) +{ + if (s == "") + return; + + if (mode == MODE_PLAIN) { + alarm(transfertimeout); + int n = fwrite(s.c_str(), 1, s.length(), fpout); + fflush(fpout); + alarm(0); + + if (n != (int) s.length()) { + // ignore error + return; + } + + Session::getInstance().addWriteBytes(n); + + } else if (mode == MODE_SYSLOG) { + alarm(transfertimeout); + syslog(LOG_INFO, "%s", s.c_str()); + alarm(0); + } else { + // ignore error + return; + } +} + +//------------------------------------------------------------------------ +int IO::readChar(int timeout, bool retry) +{ + string s; + int ret = readStr(s, 1, timeout, retry); + if (ret == 1) + return s[0]; + + return ret; +} + +//------------------------------------------------------------------------ +int IO::fillBuffer(int timeout, bool retry) +{ + // Fill the input buffer with data + fd_set rfds; + FD_ZERO(&rfds); + FD_SET(0, &rfds); + + int r = select(fileno(stdin) + 1, &rfds, 0, 0, timeout); + if (r == 0) { + setLastError("client timed out"); + return -2; + } else if (r == -1) { + setLastError("error reading from client"); + return -1; + } + + char buf[1024]; + int readBytes = read(fileno(stdin), buf, sizeof(buf)); + if (readBytes <= 0) { + setLastError("client disconnected"); + return -1; + } + + Session::getInstance().addReadBytes(readBytes); + + for (int i = 0; i < readBytes; ++i) + inputBuffer.push_front(buf[i]); + + return readBytes; +} + +//------------------------------------------------------------------------ +int IO::readStr(string &data, int bytes, int timeout, bool retry) +{ + data = ""; + + bool second = false; + for (;;) { + // First, empty data from the input buffer + while (inputBuffer.size() > 0) { + if (bytes != -1 && data.length() == (unsigned int) bytes) + break; + + data += inputBuffer.back(); + inputBuffer.pop_back(); + } + + // If bytes == -1, this means we want to fill the buffer once + // more, then empty this over in data, then finally return. + if (bytes == -1 && second) + return data.length(); + + // If we got as much as we wanted, return. + if (bytes != -1 && data.length() == (unsigned int) bytes) + return bytes; + + // If we reached the input limit, abort. + if (inputlimit && data.length() >= 8192) { + setLastError("input limit is 8192 characters."); + return -1; + } + + // Fill the buffer with data, + int ret = fillBuffer(timeout, retry); + if (ret < 0) + return ret; + + second = true; + } + + return data.length(); +} + +//------------------------------------------------------------------------ +void IO::unReadChar(int c_in) +{ + inputBuffer.push_back(c_in); +} + +//------------------------------------------------------------------------ +void IO::unReadChar(const string &s_in) +{ + if (s_in.length() != 0) { + int c = s_in.length() - 1; + while (c >= 0) { + unReadChar(s_in[c]); + --c; + } + } +} + +//------------------------------------------------------------------------ +int IO::pending(void) const +{ + return 0; +} + +//------------------------------------------------------------------------ +const string &IO::getLastError(void) const +{ + return lastError; +} + +//------------------------------------------------------------------------ +void IO::setLastError(const string &e) +{ + lastError = e; +} + +//------------------------------------------------------------------------ +IOFactory::IOFactory(void) +{ +} + +//------------------------------------------------------------------------ +IOFactory::~IOFactory(void) +{ +} + +//------------------------------------------------------------------------ +IOFactory &IOFactory::getInstance(void) +{ + static IOFactory iofactory; + return iofactory; +} + +//------------------------------------------------------------------------ +void IOFactory::assign(int id, IO *io) +{ + ioers[id] = io; +} + +//------------------------------------------------------------------------ +IO &IOFactory::get(int id) +{ + if (ioers.find(id) == ioers.end()) { + static IO NIL; + return NIL; + } + + return *ioers[id]; +} diff --git a/src/io.h b/src/io.h @@ -0,0 +1,177 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/io/io.h + * + * Description: + * Declaration of the IO class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifndef io_h_included +#define io_h_included +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <deque> +#include <string> +#include <iostream> +#include <iomanip> +#include <map> + +#include <errno.h> +#include <stdio.h> +#include <syslog.h> + +#include <ctype.h> +#include <sys/time.h> +#include <sys/types.h> +#include <unistd.h> + +#include "convert.h" + +// #define DEBUG + +namespace Binc { + + //---------------------------------------------------------------------- + class IO { + public: + enum { + MODE_PLAIN = 0x01, + MODE_SYSLOG = 0x02 + }; + + public: + + //-- + void clear(void); + void noFlushOnEndl(void); + void flushOnEndl(void); + void flushContent(void); + void resetInput(void); + void disableInputLimit(void); + void enableInputLimit(void); + + void enable(void); + void disable(void); + + void enableLogPrefix(void); + void setModeSyslog(const std::string &servicename, int facility); + void setFd(FILE *fpout); + + virtual void writeStr(const std::string s); + virtual int readChar(int timeout = 0, bool retry = true); + virtual int readStr(std::string &data, int bytes = -1, int timeout = 0, bool retry = true); + virtual int fillBuffer(int timeout, bool retry); + + void unReadChar(int c_in); + void unReadChar(const std::string &s_in); + virtual int pending(void) const; + + inline void setBufferSize(int s) { buffersize = s; } + inline void setTransferTimeout(int s) { transfertimeout = s; } + inline void setLogPrefix(const std::string s_in) { logprefix = s_in; } + + template <class T> IO &operator << (const T &o); + IO &operator << (std::ostream &(*man)(std::ostream &)); + + const std::string &getLastError(void) const; + void setLastError(const std::string &e); + + //-- + IO(); + IO(FILE *fp); + virtual ~IO(); + + protected: + BincStream outputBuffer; + + std::deque<char> inputBuffer; + std::string logprefix; + int buffersize; + int transfertimeout; + int seqnr; + int pid; + int mode; + + int inputsize; + bool inputlimit; + + bool flushesOnEndl; + bool useLogPrefix; + bool enabled; + + std::string lastError; + + FILE *fpout; + + //-- + int select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, int &timeout); + }; + + //---------------------------------------------------------------------- + class IOFactory { + private: + std::map<int, IO *> ioers; + + //-- + IOFactory(void); + + public: + void assign(int, IO *); + IO &get(int); + + //-- + static IOFactory &getInstance(void); + ~IOFactory(void); + }; +} + +//------------------------------------------------------------------------ +template <class T> Binc::IO &Binc::IO::operator << (const T &o) +{ + using namespace ::std; + + if (useLogPrefix && outputBuffer.getSize() == 0) { + outputBuffer << pid; + outputBuffer << " "; + outputBuffer << seqnr++; + if (logprefix != "") + outputBuffer << " [" << logprefix << "]"; + outputBuffer << " "; + } + + outputBuffer << o; + + if ((int) outputBuffer.getSize() >= buffersize) + flushContent(); + + return *this; +} + +#endif diff --git a/src/mailbox.cc b/src/mailbox.cc @@ -0,0 +1,144 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * mailbox.cc + * + * Description: + * Implementation of the Mailbox class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> + +#include "mailbox.h" +#include "message.h" +#include "io.h" + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +Mailbox::BaseIterator::BaseIterator(int sqn) +{ + sqnr = sqn; +} + +//------------------------------------------------------------------------ +Mailbox::BaseIterator::~BaseIterator(void) +{ +} + +//------------------------------------------------------------------------ +Mailbox::Mailbox(void) : readOnly(false) +{ +} + +//------------------------------------------------------------------------ +Mailbox::~Mailbox(void) +{ +} + +//------------------------------------------------------------------------ +bool Mailbox::isReadOnly(void) const +{ + return readOnly; +} + +//------------------------------------------------------------------------ +void Mailbox::setReadOnly(void) +{ + readOnly = true; +} + +//------------------------------------------------------------------------ +Mailbox::iterator::iterator(BaseIterator &i) + : realIterator(i) +{ +} + +//------------------------------------------------------------------------ +Message &Mailbox::iterator::operator *(void) +{ + return *realIterator; +} + +//------------------------------------------------------------------------ +void Mailbox::iterator::operator ++(void) +{ + ++realIterator; +} + +//------------------------------------------------------------------------ +bool Mailbox::iterator::operator ==(const iterator &i) const +{ + return realIterator == i.realIterator; +} + +//------------------------------------------------------------------------ +bool Mailbox::iterator::operator !=(const iterator &i) const +{ + return realIterator != i.realIterator; +} + +//------------------------------------------------------------------------ +void Mailbox::iterator::erase(void) +{ + realIterator.erase(); +} + +//------------------------------------------------------------------------ +unsigned int Mailbox::iterator::getSqnr(void) const +{ + return realIterator.sqnr; +} + +//------------------------------------------------------------------------ +void Mailbox::setName(const string &name) +{ + this->name = name; +} + +//------------------------------------------------------------------------ +const string Mailbox::getName(void) const +{ + return name; +} + +//------------------------------------------------------------------------ +const string &Mailbox::getLastError(void) const +{ + return lastError; +} + +//------------------------------------------------------------------------ +void Mailbox::setLastError(const string &error) const +{ + lastError = error; +} diff --git a/src/mailbox.h b/src/mailbox.h @@ -0,0 +1,167 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/mailbox/mailbox.h + * + * Description: + * Declaration of the Mailbox class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef mailbox_h_included +#define mailbox_h_included + +#include <map> +#include <string> +#include <queue> +#include <vector> + +#include <time.h> +#include <stdio.h> +#include <string.h> +#include <sys/types.h> + +#include "imapparser.h" + +namespace Binc { + + class Message; + class Status; + class PendingUpdates; + class File; + + //------------------------------------------------------------------------ + class Mailbox { + public: + + //---------------------------------------------------------------------- + class BaseIterator { + public: + BaseIterator(int sqn = 0); + virtual ~BaseIterator(void); + + virtual Message &operator *(void) = 0; + virtual void operator ++(void) = 0; + virtual bool operator !=(const BaseIterator &d) const = 0; + virtual bool operator ==(const BaseIterator &d) const = 0; + + virtual void erase(void) = 0; + + unsigned int sqnr; + }; + + //---------------------------------------------------------------------- + class iterator { + public: + iterator(BaseIterator &i); + + Message &operator *(void); + void operator ++(void); + bool operator ==(const iterator &) const; + bool operator !=(const iterator &) const; + + unsigned int getSqnr() const; + + void erase(void); + + protected: + BaseIterator &realIterator; + }; + + enum Iterator { + INCLUDE_EXPUNGED = 1, + SKIP_EXPUNGED = 2 + }; + + enum Mode { + UID_MODE = 4, + SQNR_MODE = 8 + }; + + virtual iterator begin(const SequenceSet &bset, unsigned int mod = INCLUDE_EXPUNGED | SQNR_MODE) const = 0; + virtual iterator end(void) const = 0; + + //-- Generic for one mailbox type + virtual bool getStatus(const std::string &, Status &) const = 0; + virtual bool isMailbox(const std::string &) const = 0; + virtual bool isMarked(const std::string &) const = 0; + virtual unsigned int getStatusID(const std::string &) const = 0; + virtual void bumpUidValidity(const std::string &) const = 0; + + //-- Specific for one mailbox + void setReadOnly(void); + bool isReadOnly(void) const; + + virtual const std::string getTypeName(void) const = 0; + const std::string getName(void) const; + void setName(const std::string &name); + + virtual unsigned int getMaxUid(void) const = 0; + virtual unsigned int getMaxSqnr(void) const = 0; + virtual unsigned int getUidNext(void) const = 0; + virtual unsigned int getUidValidity(void) const = 0; + + virtual bool getUpdates(bool scan, unsigned int type, + PendingUpdates &updates) = 0; + + virtual void updateFlags(void) = 0; + virtual void expungeMailbox(void) = 0; + virtual bool selectMailbox(const std::string &name, const std::string &s_in) = 0; + virtual bool createMailbox(const std::string &s, mode_t mode, uid_t owner = 0, gid_t group = 0, bool root = false) = 0; + virtual bool deleteMailbox(const std::string &s) = 0; + virtual void closeMailbox(void) = 0; + + virtual Message *createMessage(const std::string &mbox, time_t idate = 0) = 0; + virtual bool commitNewMessages(const std::string &mbox) = 0; + virtual bool rollBackNewMessages(void) = 0; + virtual bool fastCopy(Message &source, Mailbox &desttype, const std::string &destname) = 0; + + const std::string &getLastError(void) const; + void setLastError(const std::string &error) const; + + //-- + Mailbox(void); + virtual ~Mailbox(void); + + friend class Mailbox::iterator; + + protected: + bool readOnly; + + private: + Mailbox(const Mailbox &copy); + + mutable std::string lastError; + + std::string name; + }; +} + +#endif diff --git a/src/maildir-close.cc b/src/maildir-close.cc @@ -0,0 +1,87 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * maildir-close.cc + * + * Description: + * Implementation of the Maildir class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "storage.h" +#include "io.h" +#include "maildir.h" + +#include <fcntl.h> +#include <unistd.h> + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +void Binc::Maildir::closeMailbox(void) +{ + if (!selected) + return; + + if (mailboxchanged) { + writeCache(); + mailboxchanged = false; + } + + if (uidnextchanged) { + const string uidvalfilename = path + "/bincimap-uidvalidity"; + Storage uidvalfile("uidvalfilename", Storage::WriteOnly); + uidvalfile.put("depot", "_uidvalidity", toString(uidvalidity)); + uidvalfile.put("depot", "_uidnext", toString(uidnext)); + uidvalfile.put("depot", "_version", UIDVALFILEVERSION); + uidvalfile.commit(); + uidnextchanged = false; + } + + MaildirMessageCache::getInstance().clear(); + + messages.clear(); + index.clear(); + newMessages.clear(); + oldrecent = 0; + oldexists = 0; + firstscan = true; + cacheRead = false; + uidvalidity = 0; + uidnext = 1; + selected = false; + path = ""; + + old_cur_st_mtime = 0; + old_cur_st_ctime = 0; + old_new_st_mtime = 0; + old_new_st_ctime = 0; +} diff --git a/src/maildir-create.cc b/src/maildir-create.cc @@ -0,0 +1,106 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * maildir-create.cc + * + * Description: + * Implementation of the Maildir class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "maildir.h" + +#include <fcntl.h> +#include <unistd.h> + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +bool Binc::Maildir::createMailbox(const string &s_in, mode_t mode, + uid_t owner, gid_t group, bool root) +{ + if (s_in != "." && mkdir(s_in.c_str(), mode) == -1) { + setLastError("unable to create " + s_in + ": " + + string(strerror(errno))); + return false; + } + + // Allow uidvalidity, which is generated from time(0), to + // increase with one second to avoid race conditions. + sleep(1); + + if (mkdir((s_in + "/cur").c_str(), mode) == -1) { + setLastError("unable to create " + s_in + "/cur: " + + string(strerror(errno))); + return false; + } + + if (mkdir((s_in + "/new").c_str(), mode) == -1) { + setLastError("unable to create " + s_in + "/new: " + + string(strerror(errno))); + return false; + } + + if (mkdir((s_in + "/tmp").c_str(), mode) == -1) { + setLastError("unable to create " + s_in + "/tmp: " + + string(strerror(errno))); + return false; + } + + if (owner == 0 && group == 0) + return true; + + if (chown(s_in.c_str(), owner, group) == -1) { + setLastError("unable to chown " + s_in + ": " + + string(strerror(errno))); + return false; + } + + if (chown((s_in + "/cur").c_str(), owner, group) == -1) { + setLastError("unable to chown " + s_in + "/cur: " + + string(strerror(errno))); + return false; + } + + if (chown((s_in + "/new").c_str(), owner, group) == -1) { + setLastError("unable to chown " + s_in + "/new: " + + string(strerror(errno))); + return false; + } + + if (chown((s_in + "/tmp").c_str(), owner, group) == -1) { + setLastError("unable to chown " + s_in + "/tmp: " + + string(strerror(errno))); + return false; + } + + return true; +} diff --git a/src/maildir-delete.cc b/src/maildir-delete.cc @@ -0,0 +1,118 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * maildir-delete.cc + * + * Description: + * Implementation of the Maildir class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "maildir.h" + +#include <fcntl.h> +#include <unistd.h> + +#include <sys/types.h> +#include <sys/stat.h> + +#include <dirent.h> +#include <unistd.h> + +using namespace ::std; +using namespace Binc; + +namespace { + + bool recursiveDelete(const string &path) + { + DIR *mydir = opendir(path.c_str()); + if (mydir == 0) + return false; + + struct dirent *mydirent; + while ((mydirent = readdir(mydir)) != 0) { + string d = mydirent->d_name; + if (d == "." || d == "..") + continue; + + string f = path + "/" + d; + + struct stat mystat; + if (lstat(f.c_str(), &mystat) != 0) { + if (errno == ENOENT) + continue; + return false; + } + + if (S_ISDIR(mystat.st_mode)) { + if (!recursiveDelete(f)) { + closedir(mydir); + return false; + } + if (rmdir(f.c_str()) != 0 && errno != ENOENT) { + closedir(mydir); + return false; + } + } else { + if (unlink(f.c_str()) != 0 && errno != ENOENT) { + closedir(mydir); + return false; + } + } + } + + closedir(mydir); + return true; + } +} + +//------------------------------------------------------------------------ +bool Binc::Maildir::deleteMailbox(const string &s_in) +{ + if (s_in == ".") { + setLastError("disallowed by rule"); + return false; + } + + if (!recursiveDelete(s_in)) { + setLastError("error deleting Maildir - status is undefined"); + return false; + } + + if (rmdir(s_in.c_str()) != 0) { + setLastError("error deleting Maildir: " + + string(strerror(errno)) + + " - status is undefined"); + return false; + } + + return true; +} diff --git a/src/maildir-expunge.cc b/src/maildir-expunge.cc @@ -0,0 +1,89 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * maildir-expunge.cc + * + * Description: + * Implementation of the Maildir class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "io.h" +#include "maildir.h" +#include "maildirmessage.h" + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +void Maildir::expungeMailbox(void) +{ + if (readOnly) return; + + Mailbox::iterator i = begin(SequenceSet::all(), SQNR_MODE|INCLUDE_EXPUNGED); + + bool success = true; + for (; success && i != end(); ++i) { + MaildirMessage &message = reinterpret_cast<MaildirMessage &>(*i); + + if ((message.getStdFlags() & Message::F_DELETED) == 0) + continue; + + message.setExpunged(); + + const string &id = message.getUnique(); + + // The message might be gone already + MaildirIndexItem *item = index.find(id); + if (!item) + continue; + + string fpath = path + "/cur/" + item->fileName; + + while (unlink(fpath.c_str()) != 0) { + if (errno != ENOENT) { + IO &logger = IOFactory::getInstance().get(2); + logger << "unable to remove " << fpath << ": " + << strerror(errno) << endl; + break; + } + + if (!scanFileNames()) { + success = false; + break; + } + + if ((item = index.find(id))) + break; + else + fpath = path + "/cur/" + item->fileName; + } + } +} diff --git a/src/maildir-readcache.cc b/src/maildir-readcache.cc @@ -0,0 +1,158 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * maildir.cc + * + * Description: + * Implementation of the Maildir class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "maildir.h" + +#include "io.h" +#include "convert.h" +#include "storage.h" + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +Maildir::ReadCacheResult Maildir::readCache(void) +{ + const string uidvalfilename = path + "/bincimap-uidvalidity"; + const string cachefilename = path + "/bincimap-cache"; + + bool uidvalfiledropped = false; + + Storage uidvalfile(uidvalfilename, Storage::ReadOnly); + string section, key, value; + string uidvalfileversion; + + uidvalidity = 0; + uidnext = 0; + + while (uidvalfile.get(&section, &key, &value)) + if (section == "depot" && key == "_uidvalidity") + uidvalidity = (unsigned int) atoi(value); + else if (section == "depot" && key == "_uidnext") + uidnext = (unsigned int) atoi(value); + else if (section == "depot" && key == "_version") + uidvalfileversion = value; + + if (!uidvalfile.eof()) { + uidnext = 1; + uidvalidity = time(0); + uidvalfiledropped = true; + return NoCache; + } + + if (uidvalfileversion != UIDVALFILEVERSION + || uidvalidity == 0 || uidnext == 0) { + uidnext = 1; + uidvalidity = time(0); + uidvalfiledropped = true; + return NoCache; + } + + index.clearUids(); + + Storage cache(cachefilename, Storage::ReadOnly); + string lastsection; + unsigned int _uid = 0; + unsigned int _size = 0; + unsigned int _internaldate = 0; + string _id; + + while (cache.get(&section, &key, &value)) { + if (section == "depot" && key == "_version" && value != CACHEFILEVERSION) { + uidnext = 1; + uidvalidity = time(0); + uidvalfiledropped = true; + return NoCache; + } else if (isdigit(section[0])) { + if (lastsection != section) { + lastsection = section; + if (_id != "") { + MaildirMessage m(*this); + m.setUnique(_id); + m.setInternalDate(_internaldate); + + if (index.find(_id) == 0) { + m.setUID(_uid); + m.setInternalFlag(MaildirMessage::JustArrived); + m.setSize(_size); + add(m); + } else { + // Remember to insert the uid of the message again - we reset this + // at the top of this function. + index.insert(_id, _uid); + } + } + + _uid = 0; + _size = 0; + _internaldate = 0; + _id = ""; + } + + unsigned int n = (unsigned int)atoi(value); + if (key == "_ID") _id = value; + else if (key == "_Size") _size = n; + else if (key == "_InternalDate") _internaldate = n; + else if (key == "_UID") _uid = n; + } + } + + // Catch the last message too. + if (index.find(_id) == 0) { + MaildirMessage m(*this); + m.setUnique(_id); + m.setInternalDate(_internaldate); + m.setUID(_uid); + m.setInternalFlag(MaildirMessage::JustArrived); + add(m); + } + + // Remember to insert the uid of the message again - we reset this + // at the top of this function. + index.insert(_id, _uid); + + if (!cache.eof()) { + // Assume there is no cache file. + uidnext = 1; + uidvalidity = time(0); + uidvalfiledropped = true; + return NoCache; + } + + return Ok; +} + diff --git a/src/maildir-scan.cc b/src/maildir-scan.cc @@ -0,0 +1,491 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * maildir-scan.cc + * + * Description: + * Implementation of the Maildir class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <fcntl.h> +#include <dirent.h> +#include <sys/stat.h> +#include <unistd.h> + +#include "io.h" +#include "maildir.h" +#include "storage.h" + +using namespace Binc; +using namespace ::std; + +namespace { + + //---------------------------------------------------------------------- + class Lock { + string lock; + + public: + + //-- + Lock(const string &path) + { + IO &logger = IOFactory::getInstance().get(2); + + lock = (path == "" ? "." : path) + "/bincimap-scan-lock"; + + int lockfd = -1; + while ((lockfd = ::open(lock.c_str(), + O_CREAT | O_WRONLY | O_EXCL, 0666)) == -1) { + if (errno != EEXIST) { + logger << "unable to lock mailbox: " << lock + << ", " << string(strerror(errno)) << endl; + return; + } + + struct stat mystat; + logger << "possible crash detected. waiting for mailbox lock " << lock << "." << endl; + if (lstat(lock.c_str(), &mystat) == 0) { + if ((time(0) - mystat.st_ctime) > 300) { + if (unlink(lock.c_str()) == 0) continue; + else logger << "failed to force mailbox lock: " << lock + << ", " << string(strerror(errno)) << endl; + } + } else { + if (errno != ENOENT) { + string err = "invalid lock " + lock + ": " + + strerror(errno); + logger << err << endl; + return; + } + } + + // sleep one second. + sleep(1); + } + + close(lockfd); + } + + //-- + ~Lock() + { + IO &logger = IOFactory::getInstance().get(2); + + // remove the lock + if (unlink(lock.c_str()) != 0) + logger << "failed to unlock mailbox: " << lock << ", " + << strerror(errno) << endl; + } + }; +} + +//------------------------------------------------------------------------ +// scan the maildir. update flags, find messages in new/ and move them +// to cur, setting the recent flag in memory only. check for expunged +// messages. give newly arrived messages uids. +//------------------------------------------------------------------------ +Maildir::ScanResult Maildir::scan(void) +{ + IO &logger = IOFactory::getInstance().get(2); + + const string newpath = path + "/new/"; + const string curpath = path + "/cur/"; + const string uidvalfilename = path + "/bincimap-uidvalidity"; + const string cachefilename = path + "/bincimap-cache"; + + // check wether or not we need to bother scanning the folder. + if (firstscan) { + struct stat oldstat; + if (stat(newpath.c_str(), &oldstat) != 0) { + setLastError("Invalid Mailbox, " + newpath + ": " + + string(strerror(errno))); + return PermanentError; + } + + old_new_st_mtime = oldstat.st_mtime; + old_new_st_ctime = oldstat.st_ctime; + + if (stat(curpath.c_str(), &oldstat) != 0) { + setLastError("Invalid Mailbox, " + curpath + ": " + + string(strerror(errno))); + return PermanentError; + } + + old_cur_st_mtime = oldstat.st_mtime; + old_cur_st_ctime = oldstat.st_ctime; + + } else { + struct stat oldcurstat; + struct stat oldnewstat; + if (stat(newpath.c_str(), &oldnewstat) != 0) { + setLastError("Invalid Mailbox, " + newpath + ": " + + string(strerror(errno))); + return PermanentError; + } + + if (stat(curpath.c_str(), &oldcurstat) != 0) { + setLastError("Invalid Mailbox, " + curpath + ": " + + string(strerror(errno))); + return PermanentError; + } + + if (oldnewstat.st_mtime == old_new_st_mtime + && oldnewstat.st_ctime == old_new_st_ctime + && oldcurstat.st_mtime == old_cur_st_mtime + && oldcurstat.st_ctime == old_cur_st_ctime) + return Success; + + old_cur_st_mtime = oldcurstat.st_mtime; + old_cur_st_ctime = oldcurstat.st_ctime; + old_new_st_mtime = oldnewstat.st_mtime; + old_new_st_ctime = oldnewstat.st_ctime; + } + + // lock the directory as we are scanning. this prevents race + // conditions with uid delegation + Lock lock(path); + + // If the cache files have not been read, then read them + switch (readCache()) { + case NoCache: + case Error: + if (!firstscan) { + old_cur_st_mtime = (time_t) 0; + old_cur_st_ctime = (time_t) 0; + old_new_st_mtime = (time_t) 0; + old_new_st_ctime = (time_t) 0; + return TemporaryError; + } + default: + break; + } + + // open directory + DIR *pdir = opendir(newpath.c_str()); + if (pdir == 0) { + string reason = "Maildir::scan::opendir(\"" + newpath + "\") == 0 ("; + reason += strerror(errno); + reason += ")"; + setLastError(reason); + + return PermanentError; + } + + // scan all entries + struct dirent *pdirent; + while ((pdirent = readdir(pdir)) != 0) { + // Unless you're writing messages to a maildir, the format of a + // unique name is none of your business. A unique name can be + // anything that doesn't contain a colon (or slash) and doesn't + // start with a dot. Do not try to extract information from unique + // names. + string filename = pdirent->d_name; + if (filename[0] == '.' + || filename.find(':') != string::npos + || filename.find('/') != string::npos) + continue; + + string fullfilename = newpath + filename; + + struct stat mystat; + if (stat(fullfilename.c_str(), &mystat) != 0) { + if (errno == ENOENT) { + // a rare race between readdir and stat force us to restart + // the scan. + closedir(pdir); + + if ((pdir = opendir(newpath.c_str())) == 0) { + string reason = "Warning: opendir(\"" + newpath + "\") == 0 ("; + reason += strerror(errno); + reason += ")"; + setLastError(reason); + + return PermanentError; + } + } else + logger << "junk in Maildir: \"" << fullfilename << "\": " + << strerror(errno); + + continue; + } + + // this is important. do not move messages from new/ that are not + // at least one second old or messages may disappear. this + // introduces a special case: we can not cache the old st_ctime + // and st_mtime + if (::time(0) <= mystat.st_mtime) { + old_cur_st_mtime = (time_t) 0; + old_cur_st_ctime = (time_t) 0; + old_new_st_mtime = (time_t) 0; + old_new_st_ctime = (time_t) 0; + continue; + } + + // move files from new/ to cur/ + if (rename((newpath + pdirent->d_name).c_str(), + (curpath + pdirent->d_name).c_str()) != 0) { + logger << "error moving messages from" + " new to cur: skipping " << newpath + << pdirent->d_name << ": " << strerror(errno) << endl; + continue; + } + } + + closedir(pdir); + + // Now, assume all known messages were expunged + { + Mailbox::iterator i = begin(SequenceSet::all(), INCLUDE_EXPUNGED | SQNR_MODE); + for (; i != end(); ++i) + (*i).setExpunged(); + } + + // Then, scan cur + // open directory + + int oldmess = 0; + int newmess = 0; + + + if ((pdir = opendir(curpath.c_str())) == 0) { + string reason = "Maildir::scan::opendir(\"" + curpath + "\") == 0 ("; + reason += strerror(errno); + reason += ")"; + + setLastError(reason); + return PermanentError; + } + + // erase all old maps between fixed filenames and actual file names + index.clearFileNames(); + + // this is to sort recent messages by internaldate + multimap<time_t, MaildirMessage> tempMessageMap; + + // scan all entries + while ((pdirent = readdir(pdir)) != 0) { + string filename = pdirent->d_name; + if (filename[0] == '.') + continue; + + string uniquename; + string standard; + string::size_type pos; + if ((pos = filename.find(':')) != string::npos) { + uniquename = filename.substr(0, pos); + + string tmp = filename.substr(pos); + if ((pos = tmp.find("2,")) != string::npos) + standard = tmp.substr(pos + 2); + + } else + uniquename = filename; + + unsigned char mflags = Message::F_NONE; + for (string::const_iterator i = standard.begin(); + i != standard.end(); ++i) { + switch (*i) { + case 'R': mflags |= Message::F_ANSWERED; break; + case 'S': mflags |= Message::F_SEEN; break; + case 'T': mflags |= Message::F_DELETED; break; + case 'D': mflags |= Message::F_DRAFT; break; + case 'F': mflags |= Message::F_FLAGGED; break; + default: break; + } + } + + index.insert(uniquename, 0, filename); + + struct stat mystat; + MaildirMessage *message = get(uniquename); + if (!message || message->getInternalDate() == 0) { + string fullfilename = curpath + filename; + if (stat(fullfilename.c_str(), &mystat) != 0) { + if (errno == ENOENT) { + // a rare race between readdir and stat force us to restart + // the scan. + index.clearFileNames(); + + closedir(pdir); + + if ((pdir = opendir(newpath.c_str())) == 0) { + string reason = "Warning: opendir(\"" + newpath + "\") == 0 ("; + reason += strerror(errno); + reason += ")"; + setLastError(reason); + + return PermanentError; + } + } + + continue; + } + + mailboxchanged = true; + } + + // If we have this message in memory already.. + if (message) { + oldmess++; + + if (message->getInternalDate() == 0) { + mailboxchanged = true; + message->setInternalDate(mystat.st_mtime); + } + + // then confirm that this message was not expunged + message->setUnExpunged(); + + // update the flags with what new flags we found in the filename + if (mflags != (message->getStdFlags() & ~Message::F_RECENT)) { + message->resetStdFlags(); + message->setStdFlag(mflags); + } + + continue; + } + + newmess++; + + // Wait with delegating UIDs until all entries have been + // read. Only then can we sort by internaldate and delegate new + // UIDs. + MaildirMessage m(*this); + m.setUID(0); + m.setSize(0); + m.setInternalDate(mystat.st_mtime); + m.setStdFlag(mflags | Message::F_RECENT); + m.setUnique(uniquename); + tempMessageMap.insert(make_pair(mystat.st_mtime, m)); + + mailboxchanged = true; + } + + closedir(pdir); + + // Recent messages are added, ordered by internaldate. + { + multimap<time_t, MaildirMessage>::iterator i = tempMessageMap.begin(); + while (i != tempMessageMap.end()) { + i->second.setUID(uidnext++); + multimap<time_t, MaildirMessage>::iterator itmp = i; + ++itmp; + add(i->second); + tempMessageMap.erase(i); + i = itmp; + uidnextchanged = true; + } + } + + tempMessageMap.clear(); + + // Messages that existed in the cache that we read, but did not + // exist in the Maildir, are removed from the messages list. + Mailbox::iterator jj = begin(SequenceSet::all(), INCLUDE_EXPUNGED | SQNR_MODE); + while (jj != end()) { + MaildirMessage &message = (MaildirMessage &)*jj; + + if (message.isExpunged()) { + if (message.getInternalFlags() & MaildirMessage::JustArrived) { + jj.erase(); + continue; + } + } + + ++jj; + } + + // Special case: The first time we scan is in SELECT. All flags + // changes for new messages will then appear to be recent, and + // to avoid this to be sent to the client as a pending update, + // we explicitly unset the "flagsChanged" flag in all messages. + if (firstscan) { + unsigned int lastuid = 0; + + Mailbox::iterator ii + = begin(SequenceSet::all(), INCLUDE_EXPUNGED | SQNR_MODE); + for (; ii != end(); ++ii) { + MaildirMessage &message = (MaildirMessage &)*ii; + message.clearInternalFlag(MaildirMessage::JustArrived); + + if (lastuid < message.getUID()) + lastuid = message.getUID(); + else { + logger << "UID values are not strictly ascending in this" + " mailbox: " << path << ". This is usually caused by " + << "access from a broken accessor. Bumping UIDVALIDITY." + << endl; + + setLastError("An error occurred while scanning the mailbox. " + "Please contact your system administrator."); + + if (!readOnly) { + bumpUidValidity(path); + + old_cur_st_mtime = (time_t) 0; + old_cur_st_ctime = (time_t) 0; + old_new_st_mtime = (time_t) 0; + old_new_st_ctime = (time_t) 0; + return TemporaryError; + } else { + return PermanentError; + } + } + + message.setFlagsUnchanged(); + } + } + + if (mailboxchanged && !readOnly) { + if (!writeCache()) { + return PermanentError; + } else { + mailboxchanged = false; + } + } + + if (uidnextchanged && !readOnly) { + Storage uidvalfile(uidvalfilename, Storage::WriteOnly); + uidvalfile.put("depot", "_uidvalidity", toString(uidvalidity)); + uidvalfile.put("depot", "_uidnext", toString(uidnext)); + uidvalfile.put("depot", "_version", UIDVALFILEVERSION); + if (!uidvalfile.commit()) { + setLastError("Unable to save cache file."); + return PermanentError; + } + + uidnextchanged = false; + } + + firstscan = false; + return Success; +} diff --git a/src/maildir-scanfilesnames.cc b/src/maildir-scanfilesnames.cc @@ -0,0 +1,84 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * maildir-scanfilesnames.cc + * + * Description: + * Implementation of the Maildir class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "maildir.h" + +#include <iostream> +#include <iomanip> + +#include <dirent.h> +#include <unistd.h> +#include <errno.h> + +#include "io.h" + +using namespace ::std; + +//------------------------------------------------------------------------ +bool Binc::Maildir::scanFileNames(void) const +{ + string curpath = path + "/cur/"; + DIR *pdir = opendir(curpath.c_str()); + if (pdir == 0) { + setLastError("when scanning mailbox \"" + + path + "\": " + string(strerror(errno))); + IO &logger = IOFactory::getInstance().get(2); + logger << getLastError() << endl; + return false; + } + + index.clearFileNames(); + + struct dirent *pdirent; + while ((pdirent = readdir(pdir)) != 0) { + if (!isdigit(pdirent->d_name[0])) continue; + + string filename = pdirent->d_name; + string uniquename; + + string::size_type pos; + if ((pos = filename.find(':')) == string::npos) + uniquename = filename; + else + uniquename = filename.substr(0, pos); + + index.insert(uniquename, 0, pdirent->d_name); + } + + closedir(pdir); + return true; +} diff --git a/src/maildir-select.cc b/src/maildir-select.cc @@ -0,0 +1,78 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * maildir-select.cc + * + * Description: + * Implementation of the Maildir class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "io.h" +#include "maildir.h" + +#include <fcntl.h> +#include <unistd.h> + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +bool Binc::Maildir::selectMailbox(const std::string &name, + const std::string &s_in) +{ + setName(name); + + if (selected) { + closeMailbox(); + selected = false; + } + + oldrecent = 0; + oldexists = 0; + + uidnextchanged = false; + mailboxchanged = false; + + setPath(s_in); + + switch (scan()) { + case Success: + break; + case TemporaryError: + if (scan() == Success) + break; + case PermanentError: + return false; + } + + selected = true; + return true; +} diff --git a/src/maildir-updateflags.cc b/src/maildir-updateflags.cc @@ -0,0 +1,109 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * maildir-updateflags.cc + * + * Description: + * Implementation of the Maildir class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "maildir.h" + +#include <dirent.h> +#include <unistd.h> + +#include "io.h" + +using namespace ::std; + +//------------------------------------------------------------------------ +void Binc::Maildir::updateFlags(void) +{ + IO &logger = IOFactory::getInstance().get(2); + + if (readOnly) return; + + string curpath = path + "/cur/"; + DIR *pdir = opendir(curpath.c_str()); + if (pdir == 0) { + string reason = "failed to open " + curpath + ": "; + reason += strerror(errno); + + logger << reason << endl; + return; + } + + struct dirent *pdirent; + while ((pdirent = readdir(pdir)) != 0) { + string filename = pdirent->d_name; + if (filename[0] == '.') + continue; + + string uniquename; + string::size_type pos; + if ((pos = filename.find(":2,")) != string::npos) + uniquename = filename.substr(0, pos); + else + uniquename = filename; + + MaildirMessage *message = get(uniquename); + if (message) { + string flags; + int mflags = message->getStdFlags(); + if (mflags & Message::F_DRAFT) flags += "D"; + if (mflags & Message::F_FLAGGED) flags += "F"; + if (mflags & Message::F_ANSWERED) flags += "R"; + if (mflags & Message::F_SEEN) flags += "S"; + if (mflags & Message::F_DELETED) flags += "T"; + + string srcname = curpath + filename; + string destname = curpath + uniquename + ":2," + flags; + + if (srcname != destname) { + if (rename(srcname.c_str(), destname.c_str()) != 0) { + if (errno == ENOENT) { + // FIXME: restart scan + } + + logger << "warning: rename(" << srcname + << "," << destname << ") == " + << errno << ": " << strerror(errno) << endl; + } else { + index.insert(uniquename, 0, uniquename + ":2," + flags); + } + } + + continue; + } + } + + closedir(pdir); +} diff --git a/src/maildir-writecache.cc b/src/maildir-writecache.cc @@ -0,0 +1,78 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * maildir-writecache.cc + * + * Description: + * Implementation of the Maildir class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "maildir.h" + +#include "io.h" +#include "storage.h" + +using namespace ::std; + +//------------------------------------------------------------------------ +bool Binc::Maildir::writeCache(void) +{ + if (readOnly) + return true; + + const string cachefilename = path + "/bincimap-cache"; + const string uidvalfilename = path + "/bincimap-uidvalidity"; + + Storage cache(cachefilename, Storage::WriteOnly); + int n = 0; + + Mailbox::iterator i = begin(SequenceSet::all(), INCLUDE_EXPUNGED); + for (; i != end(); ++i) { + MaildirMessage &message = (MaildirMessage &)*i; + string nstr = toString(n++); + + cache.put(nstr, "_UID", toString(message.getUID())); + if (message.getSize() != 0) + cache.put(nstr, "_Size", toString(message.getSize())); + + cache.put(nstr, "_ID", message.getUnique()); + cache.put(nstr, "_InternalDate", + toString((int) message.getInternalDate())); + } + + cache.put("depot", "_version", CACHEFILEVERSION); + if (!cache.commit()) { + setLastError(cache.getLastError()); + return false; + } + + return true; +} diff --git a/src/maildir.cc b/src/maildir.cc @@ -0,0 +1,799 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * maildir.cc + * + * Description: + * Implementation of the Maildir class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <iostream> +#include <iomanip> +#include <algorithm> + +#include <ctype.h> +#include <dirent.h> +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> + +#include "io.h" +#include "session.h" +#include "status.h" +#include "storage.h" +#include "convert.h" +#include "maildir.h" +#include "maildirmessage.h" +#include "pendingupdates.h" + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +Maildir::iterator::iterator(void) +{ +} + +//------------------------------------------------------------------------ +Maildir::iterator::iterator(Maildir *home, + MessageMap::iterator it, + const SequenceSet &_bset, + unsigned int _mod) + : BaseIterator(1), mailbox(home), bset(_bset), mod(_mod), i(it) +{ +} + +//------------------------------------------------------------------------ +Maildir::iterator::iterator(const iterator &copy) + : BaseIterator(copy.sqnr), mailbox(copy.mailbox), + bset(copy.bset), mod(copy.mod), i(copy.i) +{ +} + +//------------------------------------------------------------------------ +Maildir::iterator &Maildir::iterator::operator =(const iterator &copy) +{ + sqnr = copy.sqnr; + mailbox = copy.mailbox; + bset = copy.bset; + mod = copy.mod; + i = copy.i; + return *this; +} + +//------------------------------------------------------------------------ +Maildir::iterator::~iterator(void) +{ +} + +//------------------------------------------------------------------------ +MaildirMessage &Maildir::iterator::curMessage(void) +{ + return i->second; +} + +//------------------------------------------------------------------------ +Message &Maildir::iterator::operator *(void) +{ + return curMessage(); +} + +//------------------------------------------------------------------------ +void Maildir::iterator::operator ++(void) +{ + ++i; + ++sqnr; + reposition(); +} + +//------------------------------------------------------------------------ +bool Maildir::iterator::operator ==(const BaseIterator &a) const +{ + const iterator *b = dynamic_cast<const iterator *>(&a); + return b ? (i == b->i) : false; +} + +//------------------------------------------------------------------------ +bool Maildir::iterator::operator !=(const BaseIterator &a) const +{ + return !((*this) == a); +} + +//------------------------------------------------------------------------ +void Maildir::iterator::reposition(void) +{ + for (;;) { + if (i == mailbox->messages.end()) + break; + + Message &message = curMessage(); + if ((mod & SKIP_EXPUNGED) && message.isExpunged()) { + ++i; + continue; + } + + if (!bset.isInSet(mod & SQNR_MODE ? sqnr : message.getUID())) { + ++i; + if (!message.isExpunged()) + ++sqnr; + continue; + } + + break; + } +} + +//------------------------------------------------------------------------ +Mailbox::iterator Maildir::begin(const SequenceSet &bset, + unsigned int mod) const +{ + beginIterator = iterator((Maildir *)this, messages.begin(), bset, mod); + beginIterator.reposition(); + + return Mailbox::iterator(beginIterator); +} + +//------------------------------------------------------------------------ +Mailbox::iterator Maildir::end(void) const +{ + endIterator = iterator((Maildir *)this, messages.end(), + endIterator.bset, endIterator.mod); + return Mailbox::iterator(endIterator); +} + +//------------------------------------------------------------------------ +void Maildir::iterator::erase(void) +{ + MessageMap::iterator iter = i; + ++iter; + + MaildirMessageCache::getInstance().removeStatus(&curMessage()); + mailbox->index.remove(i->second.getUnique()); + mailbox->messages.erase(i); + + i = iter; + reposition(); +} + +//------------------------------------------------------------------------ +Maildir::Maildir(void) : Mailbox() +{ + firstscan = true; + cacheRead = false; + uidvalidity = 0; + uidnext = 1; + selected = false; + oldrecent = 0; + oldexists = 0; +} + +//------------------------------------------------------------------------ +Maildir::~Maildir(void) +{ +} + +//------------------------------------------------------------------------ +void Maildir::setPath(const string &path_in) +{ + path = path_in; +} + +//------------------------------------------------------------------------ +bool Maildir::getUpdates(bool doscan, unsigned int type, + PendingUpdates &updates) +{ + if (doscan && scan() != Success) + return false; + + unsigned int exists = 0; + unsigned int recent = 0; + + // count messages, find recent + if (!readOnly && (type & PendingUpdates::EXPUNGE)) { + Mailbox::iterator i = begin(SequenceSet::all(), + INCLUDE_EXPUNGED | SQNR_MODE); + + while (i != end()) { + Message &message = *i; + + if (message.isExpunged()) { + updates.addExpunged(i.getSqnr()); + i.erase(); + } else + ++i; + } + } + + Mailbox::iterator i = begin(SequenceSet::all(), + INCLUDE_EXPUNGED | SQNR_MODE); + for (; i != end(); ++i) { + Message & message = *i; + // at this point, there is a message that is not expunged + ++exists; + if (message.getStdFlags() & Message::F_RECENT) ++recent; + } + + if (exists != oldexists) + updates.setExists(oldexists = exists); + + if (recent != oldrecent) + updates.setRecent(oldrecent = recent); + + if (type & PendingUpdates::FLAGS) { + Mailbox::iterator i = begin(SequenceSet::all(), SQNR_MODE); + for (; i != end(); ++i) { + Message &message = *i; + if (message.hasFlagsChanged()) { + int flags = message.getStdFlags(); + + updates.addFlagUpdates(i.getSqnr(), flags); + + message.setFlagsUnchanged(); + } + } + } + + return true; +} + +//------------------------------------------------------------------------ +bool Maildir::isMailbox(const std::string &s_in) const +{ + struct stat mystat; + + return ((stat((s_in + "/cur").c_str(), &mystat) == 0 + && S_ISDIR(mystat.st_mode)) + && (stat((s_in + "/new").c_str(), &mystat) == 0 + && S_ISDIR(mystat.st_mode)) + && (stat((s_in + "/tmp").c_str(), &mystat) == 0 + && S_ISDIR(mystat.st_mode))); +} + +//------------------------------------------------------------------------ +const std::string Maildir::getTypeName(void) const +{ + return "Maildir"; +} + +//------------------------------------------------------------------------ +void Maildir::bumpUidValidity(const string &s_in) const +{ + unlink((s_in + "/bincimap-uidvalidity").c_str()); + unlink((s_in + "/bincimap-cache").c_str()); +} + +//------------------------------------------------------------------------ +bool Maildir::isMarked(const std::string &s_in) const +{ + DIR *dirp = opendir((s_in + "/new").c_str()); + if (dirp == 0) return false; + + struct dirent *direntp; + while ((direntp = readdir(dirp)) != 0) { + string s = direntp->d_name; + if (s[0] != '.' + && s.find('/') == string::npos + && s.find(':') == string::npos) { + closedir(dirp); + return true; + } + } + + closedir(dirp); + return false; +} + +//------------------------------------------------------------------------ +unsigned int Maildir::getStatusID(const string &path) const +{ + unsigned int statusid = 0; + struct stat mystat; + if (stat((path + "/new").c_str(), &mystat) == 0) + statusid = mystat.st_ctime; + + if (stat((path + "/cur").c_str(), &mystat) == 0) + statusid += mystat.st_ctime; + + if (stat((path + "/bincimap-cache").c_str(), &mystat) == 0) + statusid += mystat.st_ctime; + + return statusid; +} + +//------------------------------------------------------------------------ +bool Maildir::getStatus(const string &path, Status &s) const +{ + unsigned int messages = 0; + unsigned int unseen = 0; + unsigned int recent = 0; + + const string cachefilename = path + "/bincimap-cache"; + const string uidvalfilename = path + "/bincimap-uidvalidity"; + + Storage cache(cachefilename, Storage::ReadOnly); + Storage uidvalfile(uidvalfilename, Storage::ReadOnly); + + string section, key, value; + map<string, bool> mincache; + while (cache.get(&section, &key, &value)) + if (isdigit(section[0]) && key == "_ID") + mincache[value] = true; + + unsigned int uidvalidity = 0; + unsigned int uidnext = 0; + while (uidvalfile.get(&section, &key, &value)) + if (section == "depot" && key == "_uidvalidity") + uidvalidity = (unsigned int) atoi(value); + else if (section == "depot" && key == "_uidnext") + uidnext = (unsigned int) atoi(value); + + s.setUidValidity(uidvalidity < 1 ? time(0) : uidvalidity); + + // Scan new + DIR *dirp = opendir((path + "/new").c_str()); + if (dirp == 0) return false; + + struct dirent *direntp; + while ((direntp = readdir(dirp)) != 0) { + const string filename = direntp->d_name; + if (filename[0] == '.' + || filename.find(':') != string::npos + || filename.find('/') != string::npos) + continue; + + ++recent; + ++uidnext; + ++unseen; + ++messages; + } + + closedir(dirp); + + // Scan cur + if ((dirp = opendir((path + "/cur").c_str())) == 0) + return false; + + while ((direntp = readdir(dirp)) != 0) { + const string dname = direntp->d_name; + if (dname[0] == '.') + continue; + + ++messages; + + // Add to unseen if it doesn't have the seen flag or if it has no + // flags. + const string::size_type pos = dname.find(':'); + if (pos != string::npos) { + if (mincache.find(dname.substr(0, pos)) == mincache.end()) { + ++recent; + ++uidnext; + } + + if (dname.substr(pos).find('S') == string::npos) + ++unseen; + } else { + if (mincache.find(dname) == mincache.end()) { + ++recent; + ++uidnext; + } + + ++unseen; + } + } + + closedir(dirp); + + s.setRecent(recent); + s.setMessages(messages); + s.setUnseen(unseen); + s.setUidNext(uidnext); + + return true; +} + +//------------------------------------------------------------------------ +unsigned int Maildir::getMaxUid(void) const +{ + unsigned int max = 0; + Mailbox::iterator i = begin(SequenceSet::all(), SKIP_EXPUNGED | SQNR_MODE); + for (; i != end(); ++i) + if ((*i).getUID() > max) + max = (*i).getUID(); + + return max; +} + +//------------------------------------------------------------------------ +unsigned int Maildir::getMaxSqnr(void) const +{ + unsigned int max = 0; + Mailbox::iterator i = begin(SequenceSet::all(), SKIP_EXPUNGED | SQNR_MODE); + for (; i != end(); ++i) + if (i.getSqnr() > max) + max = i.getSqnr(); + + return max; +} + +//------------------------------------------------------------------------ +unsigned int Maildir::getUidValidity(void) const +{ + // Why scan? + // if (uidvalidity < 1) { + // FIXME: Catch any error here + // scan(); + //} + + return uidvalidity; +} + +//------------------------------------------------------------------------ +unsigned int Maildir::getUidNext(void) const +{ + // Why scan? + //if (uidnext < 1) { + // FIXME: Catch any error here + //scan(); + //} + + return uidnext; +} + +//------------------------------------------------------------------------ +Message *Maildir::createMessage(const string &mbox, time_t idate) +{ + string sname = mbox + "/tmp/bincimap-XXXXXX"; + char *safename = strdup(sname.c_str()); + + int fd = mkstemp(safename); + if (fd == -1) { + setLastError("Unable to create safe name."); + return 0; + } + + string safenameStr = safename; + delete safename; + + MaildirMessage message(*this); + + message.setFile(fd); + message.setSafeName(safenameStr); + message.setInternalDate(idate); + + newMessages.push_back(message); + vector<MaildirMessage>::iterator i = newMessages.end(); + --i; + return &(*i); +} + +//------------------------------------------------------------------------ +bool Maildir::commitNewMessages(const string &mbox) +{ + Session &session = Session::getInstance(); + IO &logger = IOFactory::getInstance().get(2); + + vector<MaildirMessage>::iterator i = newMessages.begin(); + map<MaildirMessage *, string> committedMessages; + + char hostname[512]; + int hostnamelen = gethostname(hostname, sizeof(hostname)); + if (hostnamelen == -1 || hostnamelen == sizeof(hostname)) + strcpy(hostname, "localhost"); + + struct timeval youngestFile = {0, 0}; + + bool abort = false; + while (!abort && i != newMessages.end()) { + MaildirMessage &m = *i; + string safeName = m.getSafeName(); + + for (int attempt = 0; !abort && attempt < 1000; ++attempt) { + struct timeval tv; + gettimeofday(&tv, 0); + youngestFile = tv; + + BincStream ssid; + ssid << (int) tv.tv_sec + << "." << (int) session.getPid() + << (attempt == 0 ? "" : ("_" + toString(attempt))) + << "_" << (int) tv.tv_usec + << (rand() % 0xffff) << "." << session.getHostname(); + + BincStream ss; + ss << mbox << "/new/" << ssid.str(); + + string fileName = ss.str(); + + if (link(safeName.c_str(), fileName.c_str()) == 0) { + unlink(safeName.c_str()); + m.setInternalDate(tv.tv_sec); + m.setUnique(ssid.str()); + m.setUID(0); + committedMessages[&m] = fileName; + break; + } + + if (errno == EEXIST) + continue; + + logger << "Warning: link(" << toImapString(safeName) << ", " + << toImapString(fileName) << ") failed: " + << strerror(errno) << endl; + + session.setResponseCode("TRYCREATE"); + session.setLastError("failed, internal error."); + abort = true; + break; + } + + ++i; + } + + // abort means to make an attempt to restore the mailbox to + // its original state. + if (abort) { + // Fixme: Messages that are in committedMessages should be skipped + // here. + for (i = newMessages.begin(); i != newMessages.end(); ++i) + unlink((*i).getSafeName().c_str()); + + map<MaildirMessage *, string>::const_iterator j + = committedMessages.begin(); + while (j != committedMessages.end()) { + if (unlink(j->second.c_str()) != 0) { + if (errno == ENOENT) { + // FIXME: The message was probably moves away from new/ by + // another IMAP session. + logger << "error rollbacking after failed commit to " + << toImapString(mbox) << ", failed to unlink " + << toImapString(j->second) + << ": " << strerror(errno) << endl; + } else { + logger << "error rollbacking after failed commit to " + << toImapString(mbox) << ", failed to unlink " + << toImapString(j->second) + << ": " << strerror(errno) << endl; + newMessages.clear(); + return false; + } + } + + ++j; + } + + newMessages.clear(); + return false; + } + + // cover the extremely unlikely event that another concurrent + // Maildir accessor has just made a file with the same timestamp and + // random number by sleeping until the timestamp has changed before + // moving the message into cur. + struct timeval tv; + gettimeofday(&tv, 0); + while (tv.tv_sec == youngestFile.tv_sec + && tv.tv_usec == youngestFile.tv_usec) { + gettimeofday(&tv, 0); + } + + map<MaildirMessage *, string>::const_iterator j + = committedMessages.begin(); + for (;j != committedMessages.end(); ++j) { + string basename = j->second.substr(j->second.rfind('/') + 1); + + int flags = j->first->getStdFlags(); + string flagStr; + if (flags & Message::F_DRAFT) flagStr += "D"; + if (flags & Message::F_FLAGGED) flagStr += "F"; + if (flags & Message::F_ANSWERED) flagStr += "R"; + if (flags & Message::F_SEEN) flagStr += "S"; + if (flags & Message::F_DELETED) flagStr += "T"; + + string dest = mbox + "/cur/" + basename + ":2," + flagStr; + if (rename(j->second.c_str(), dest.c_str()) == 0) + continue; + + if (errno != ENOENT) + logger << "when setting flags on: " << j->second + << ": " << strerror(errno) << endl; + } + + committedMessages.clear(); + newMessages.clear(); + return true; +} + +//------------------------------------------------------------------------ +bool Maildir::rollBackNewMessages(void) +{ + vector<MaildirMessage>::const_iterator i = newMessages.begin(); + // Fixme: Messages that are in committedMessages should be skipped + // here. + for (; i != newMessages.end(); ++i) + unlink((*i).getSafeName().c_str()); + + newMessages.clear(); + + return true; +} + +//------------------------------------------------------------------------ +bool Maildir::fastCopy(Message &m, Mailbox &desttype, + const std::string &destname) +{ + // At this point, fastCopy is broken because the creation time is + // equal for the two clones. The new clone must have a new creation + // time. Symlinks are a possibility, but they break if other Maildir + // accessors rename mailboxes. + // return false; + + Session &session = Session::getInstance(); + IO &logger = IOFactory::getInstance().get(2); + + MaildirMessage *message = dynamic_cast<MaildirMessage *>(&m); + if (!message) + return false; + + string mfilename = message->getFileName(); + if (mfilename == "") + return false; + + Maildir *mailbox = dynamic_cast<Maildir *>(&desttype); + if (!mailbox) + return false; + + for (int attempt = 0; attempt < 1000; ++attempt) { + + struct timeval tv; + gettimeofday(&tv, 0); + + BincStream ssid; + ssid << (int) tv.tv_sec + << "." << (int) session.getPid() + << (attempt == 0 ? "" : ("_" + toString(attempt))) + << "_" << (int) tv.tv_usec + << (rand() % 0xffff) << "." << session.getHostname(); + + BincStream ss; + ss << destname << "/tmp/" << ssid.str(); + + string fileName = ss.str(); + + if (link((path + "/cur/" + mfilename).c_str(), fileName.c_str()) == 0) { + MaildirMessage newmess = *message; + newmess.setSafeName(fileName); + newmess.setUnique(ssid.str()); + newmess.setInternalDate((time_t) tv.tv_sec); + newmess.setUID(0); + newMessages.push_back(newmess); + break; + } + + if (errno == EEXIST) + continue; + + logger << "Warning: link(" << toImapString(path + "/cur/" + mfilename) + << ", " << toImapString(fileName) << ") failed: " + << strerror(errno) << endl; + + session.setResponseCode("TRYCREATE"); + session.setLastError("failed, internal error."); + return false; + } + + return true; +} + +//------------------------------------------------------------------------ +MaildirMessage *Maildir::get(const std::string &id) +{ + MaildirIndexItem *item = index.find(id); + if (!item) + return 0; + + unsigned int uid = item->uid; + if (messages.find(uid) == messages.end()) + return 0; + + return &messages.find(uid)->second; +} + +//------------------------------------------------------------------------ +void Maildir::add(MaildirMessage &m) +{ + messages.insert(make_pair(m.getUID(), m)); + index.insert(m.getUnique(), m.getUID()); +} + +//------------------------------------------------------------------------ +unsigned int MaildirIndex::getSize(void) const +{ + return idx.size(); +} + +//------------------------------------------------------------------------ +void MaildirIndex::insert(const string &unique, unsigned int uid, + const string &fileName) +{ + if (idx.find(unique) == idx.end()) { + MaildirIndexItem item; + item.uid = uid; + item.fileName = fileName; + idx[unique] = item; + } else { + MaildirIndexItem &item = idx[unique]; + if (uid != 0) item.uid = uid; + if (fileName != "") item.fileName = fileName; + } +} + +//------------------------------------------------------------------------ +void MaildirIndex::remove(const string &unique) +{ + map<string, MaildirIndexItem>::iterator it = idx.find(unique); + if (it != idx.end()) + idx.erase(it); +} + +//------------------------------------------------------------------------ +MaildirIndexItem *MaildirIndex::find(const string &unique) +{ + map<string, MaildirIndexItem>::iterator it = idx.find(unique); + if (it != idx.end()) + return &it->second; + + return 0; +} + +//------------------------------------------------------------------------ +void MaildirIndex::clear(void) +{ + idx.clear(); +} + +//------------------------------------------------------------------------ +void MaildirIndex::clearUids(void) +{ + map<string, MaildirIndexItem>::iterator it = idx.begin(); + for (; it != idx.end(); ++it) + it->second.uid = 0; +} + +//------------------------------------------------------------------------ +void MaildirIndex::clearFileNames(void) +{ + map<string, MaildirIndexItem>::iterator it = idx.begin(); + for (; it != idx.end(); ++it) + it->second.fileName = ""; +} diff --git a/src/maildir.h b/src/maildir.h @@ -0,0 +1,207 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/mailbox/maildir.h + * + * Description: + * Declaration of the Maildir class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef maildir_h_included +#define maildir_h_included +#include <string> +#include <vector> +#include <map> + +#include "mailbox.h" +#include "maildirmessage.h" + +namespace Binc { + static const std::string CACHEFILEVERSION = "1.0.4"; + static const std::string UIDVALFILEVERSION = "1.0.4"; + + //------------------------------------------------------------------------ + class MaildirIndexItem { + public: + unsigned int uid; + std::string fileName; + }; + + //------------------------------------------------------------------------ + class MaildirIndex + { + private: + std::map<std::string, MaildirIndexItem> idx; + + public: + void insert(const std::string &unique, unsigned int uid, + const std::string &fileName = ""); + void remove(const std::string &unique); + void clear(void); + void clearFileNames(void); + void clearUids(void); + unsigned int getSize(void) const; + MaildirIndexItem *find(const std::string &unique); + }; + + //------------------------------------------------------------------------ + class Maildir : public Mailbox { + public: + typedef std::map<unsigned int, MaildirMessage> MessageMap; + + class iterator : public BaseIterator { + public: + iterator(void); + iterator(Maildir *home, MessageMap::iterator i, + const SequenceSet &bset, + unsigned int mod = INCLUDE_EXPUNGED | SQNR_MODE); + iterator(const iterator &copy); + ~iterator(void); + + Message &operator *(void); + void operator ++(void); + bool operator ==(const BaseIterator &) const; + bool operator !=(const BaseIterator &) const; + + iterator &operator =(const iterator &copy); + + void erase(void); + + friend class Maildir; + + protected: + void reposition(void); + MaildirMessage &curMessage(void); + + private: + Maildir *mailbox; + SequenceSet bset; + int mod; + + MessageMap::iterator i; + iterator(iterator &external); + }; + + const std::string getTypeName(void) const; + + Mailbox::iterator begin(const SequenceSet &bset, unsigned int mod = INCLUDE_EXPUNGED | SQNR_MODE) const; + Mailbox::iterator end(void) const; + + unsigned int getMaxUid(void) const; + unsigned int getMaxSqnr(void) const; + unsigned int getUidValidity(void) const; + unsigned int getUidNext(void) const; + + bool getUpdates(bool doscan, unsigned int type, + PendingUpdates &updates); + + const std::string &getPath(void) const; + void setPath(const std::string &path_in); + + void bumpUidValidity(const std::string &) const; + + unsigned int getStatusID(const std::string &) const; + bool getStatus(const std::string &, Status &) const; + void updateFlags(void); + + bool isMailbox(const std::string &) const; + bool isMarked(const std::string &) const; + bool selectMailbox(const std::string &name, const std::string &s_in); + void closeMailbox(void); + void expungeMailbox(void); + bool createMailbox(const std::string &s, mode_t mode, uid_t owner = 0, gid_t group = 0, bool root = false); + bool deleteMailbox(const std::string &s); + + Message *createMessage(const std::string &mbox, time_t idate = 0); + bool commitNewMessages(const std::string &mbox); + bool rollBackNewMessages(void); + + bool fastCopy(Message &source, Mailbox &desttype, const std::string &destname); + + //-- + Maildir(void); + ~Maildir(void); + + friend class Maildir::iterator; + friend class MaildirMessage; + + protected: + enum ReadCacheResult { + Ok, + NoCache, + Error + }; + + ReadCacheResult readCache(void); + bool writeCache(void); + bool scanFileNames(void) const; + + enum ScanResult { + Success = 0, + TemporaryError = 1, + PermanentError = 2 + }; + + ScanResult scan(void); + + MaildirMessage *get(const std::string &id); + void add(MaildirMessage &m); + + private: + std::vector<MaildirMessage> newMessages; + + unsigned int uidvalidity; + unsigned int uidnext; + bool selected; + std::string path; + + mutable iterator beginIterator; + mutable iterator endIterator; + + mutable bool firstscan; + mutable bool cacheRead; + mutable MaildirIndex index; + mutable MessageMap messages; + + mutable unsigned int oldrecent; + mutable unsigned int oldexists; + + mutable time_t old_cur_st_mtime; + mutable time_t old_cur_st_ctime; + mutable time_t old_new_st_mtime; + mutable time_t old_new_st_ctime; + + mutable bool uidnextchanged; + mutable bool mailboxchanged; + }; +} + +#endif diff --git a/src/maildirmessage.cc b/src/maildirmessage.cc @@ -0,0 +1,1120 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * maildirmessage.cc + * + * Description: + * Implementation of the MaildirMessage class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> + +#include <stack> +#include <fcntl.h> +#include <unistd.h> +#include <ctype.h> +#include <time.h> +#include <utime.h> + +#include "maildir.h" +#include "maildirmessage.h" +#include "convert.h" +#include "mime.h" +#include "io.h" +#include "mime-utils.h" + +using namespace ::std; +using namespace Binc; + +string Message::lastError; +string MaildirMessage::storage; + +namespace { + //---------------------------------------------------------------------- + void printOneHeader(IO &io, const MimePart *message, const string &s_in, + bool removecomments = true) + { + string tmp = ""; + HeaderItem hitem; + + if (message->h.getFirstHeader(s_in, hitem)) { + tmp = hitem.getValue(); + io << toImapString(unfold(tmp, removecomments)); + } else + io << "NIL"; + } + + //---------------------------------------------------------------------- + void printOneAddressList(IO &io, const MimePart *message, + const string &s_in, bool removecomments = true) + { + string tmp = ""; + HeaderItem hitem; + + if (message->h.getFirstHeader(s_in, hitem)) { + tmp = hitem.getValue(); + vector<string> addr; + splitAddr(unfold(tmp, removecomments), addr); + if (addr.size() != 0) { + io << "("; + for (vector<string>::const_iterator i = addr.begin(); + i != addr.end(); ++i) + io << Address(*i).toParenList(); + io << ")"; + } else io << "NIL"; + } else + io << "NIL"; + } + + //---------------------------------------------------------------------- + void envelope(IO &io, const MimePart *message) + { + HeaderItem hitem; + io << "("; + printOneHeader(io, message, "date"); + io << " "; + printOneHeader(io, message, "subject", false); + io << " "; + printOneAddressList(io, message, "from", false); + io << " "; + printOneAddressList(io, message, + message->h.getFirstHeader("sender", hitem) + ? "sender" : "from", false); + io << " "; + printOneAddressList(io, message, + message->h.getFirstHeader("reply-to", hitem) + ? "reply-to" : "from", false); + io << " "; + printOneAddressList(io, message, "to", false); + io << " "; + printOneAddressList(io, message, "cc", false); + io << " "; + printOneAddressList(io, message, "bcc", false); + io << " "; + printOneHeader(io, message, "in-reply-to"); + io << " "; + printOneHeader(io, message, "message-id"); + io << ")"; + } + + //---------------------------------------------------------------------- + void bodyStructure(IO &io, const MimePart *message, bool extended = true) + { + HeaderItem hitem; + if (message->isMultipart() && message->members.size() > 0) { + io << "("; + + for (vector<MimePart>::const_iterator i = message->members.begin(); + i != message->members.end(); ++i) + bodyStructure(io, &(*i)); + + io << " "; + io << toImapString(message->getSubType()); + io << " "; + + vector<string> parameters; + vector<string> headers; + string tmp; + + string type, subtype; + + tmp = ""; + if (message->h.getFirstHeader("content-type", hitem)) { + tmp = unfold(hitem.getValue()); + trim(tmp); + + vector<string> v; + split(tmp, ";", v); + + for (vector<string>::const_iterator i = v.begin(); i != v.end(); ++i) { + string element = *i; + trim(element); + if (element.find('=') != string::npos) { + string::size_type pos = element.find('='); + string s = element.substr(0, pos); + string t = element.substr(pos + 1); + trim(s, " \""); + trim(t, " \""); + parameters.push_back(s); + parameters.push_back(t); + } + } + + if (parameters.size() != 0) { + io << "("; + for (vector<string>::const_iterator i = parameters.begin(); + i != parameters.end(); ++i) { + if (i != parameters.begin()) + io << " "; + io << toImapString(*i); + } + io << ")"; + } else + io << "NIL"; + } else + io << "NIL"; + + // CONTENT-DISPOSITION + io << " "; + tmp = ""; + if (message->h.getFirstHeader("content-disposition", hitem)) { + tmp = hitem.getValue(); + trim(tmp); + + vector<string> v; + split(tmp, ";", v); + if (v.size() > 0) { + string disp = v[0]; + trim(disp); + io << "(" << toImapString(disp); + io << " "; + if (v.size() > 1) { + io << "("; + vector<string>::const_iterator i = v.begin(); + ++i; + bool wrote = false; + while (i != v.end()) { + string s = *i; + trim(s); + + string::size_type pos = s.find('='); + string key = s.substr(0, pos); + string value = s.substr(pos + 1); + trim(key); + trim(value); + + trim(key, " \""); + trim(value, " \""); + + if (!wrote) wrote = true; + else io << " "; + io << toImapString(key); + + io << " "; + io << toImapString(value); + + ++i; + } + io << ")"; + } else + io << "NIL"; + io << ")"; + } else + io << "NIL"; + } else + io << "NIL"; + + // CONTENT-LANGUAGE + io << " "; + printOneHeader(io, message, "content-language"); + + io << ")"; + } else { + io << "("; + + vector<string> parameters; + vector<string> headers; + string tmp; + tmp = ""; + string type, subtype; + + tmp = ""; + if (message->h.getFirstHeader("content-type", hitem)) { + tmp = unfold(hitem.getValue()); + + vector<string> v; + split(tmp, ";", v); + + if (v.size() > 0) { + vector<string> b; + split(v[0], "/", b); + + if (b.size() > 0) + type = b[0]; + else + type = "text"; + + if (b.size() > 1) + subtype = b[1]; + else + subtype = "plain"; + } + + for (vector<string>::const_iterator i = v.begin(); i != v.end(); ++i) { + if (i == v.begin()) continue; + + string element = *i; + trim(element); + + if (element.find('=') != string::npos) { + string::size_type pos = element.find('='); + string s = element.substr(0, pos); + string t = element.substr(pos + 1); + trim(s, " \""); + trim(t, " \""); + parameters.push_back(s); + parameters.push_back(t); + } + } + } else { + type = "text"; + subtype = "plain"; + } + + io << toImapString(type); + io << " "; + io << toImapString(subtype); + + io << " "; + if (parameters.size() != 0) { + io << "("; + for (vector<string>::const_iterator i = parameters.begin(); + i != parameters.end(); ++i) { + if (i != parameters.begin()) + io << " "; + io << toImapString(*i); + } + io << ")"; + } else + io << "NIL"; + + // CONTENT-ID + io << " "; + printOneHeader(io, message, "content-id"); + + // CONTENT-DESCRIPTION + io << " "; + printOneHeader(io, message, "content-description"); + + // CONTENT-TRANSFER-ENCODING + io << " "; + tmp = ""; + if (message->h.getFirstHeader("content-transfer-encoding", hitem)) { + tmp = hitem.getValue(); + trim(tmp); + io << toImapString(tmp); + } else + io << "\"7bit\""; + io << " "; + + // Size of body in octets + io << message->getBodyLength(); + + lowercase(type); + if (type == "text") { + io << " "; + io << message->getNofBodyLines(); + } else if (message->isMessageRFC822()) { + io << " "; + envelope(io, &message->members[0]); + io << " "; + bodyStructure(io, &message->members[0]); + io << " "; + io << message->getNofBodyLines(); + } + + // Extension data follows + + if (extended) { + + // CONTENT-MD5 + io << " "; + printOneHeader(io, message, "content-md5"); + + // CONTENT-DISPOSITION + io << " "; + tmp = ""; + if (message->h.getFirstHeader("content-disposition", hitem)) { + tmp = hitem.getValue(); + trim(tmp); + + vector<string> v; + split(tmp, ";", v); + if (v.size() > 0) { + string disp = v[0]; + trim(disp); + io << "(" << toImapString(disp); + io << " "; + if (v.size() > 1) { + io << "("; + vector<string>::const_iterator i = v.begin(); + ++i; + bool wrote = false; + while (i != v.end()) { + string s = *i; + trim(s); + + string::size_type pos = s.find('='); + string key = s.substr(0, pos); + string value = s.substr(pos + 1); + trim(key); + trim(value); + + trim(key, " \""); + trim(value, " \""); + + if (!wrote) wrote = true; + else io << " "; + io << toImapString(key); + + io << " "; + io << toImapString(value); + + ++i; + } + io << ")"; + } else + io << "NIL"; + io << ")"; + } else + io << "NIL"; + } else + io << "NIL"; + + // CONTENT-LANGUAGE + io << " "; + printOneHeader(io, message, "content-language"); + + // CONTENT-LOCATION + io << " "; + printOneHeader(io, message, "content-location"); + } + + io << ")"; + } + } +} + +//------------------------------------------------------------------------ +MaildirMessage::MaildirMessage(Maildir &hom) + : fd(-1), doc(0), internalFlags(None), stdflags(F_NONE), + uid(0), size(0), unique(""), safeName(""), internaldate(0), + home(hom) +{ +} + +//------------------------------------------------------------------------ +MaildirMessage::MaildirMessage(const MaildirMessage &copy) + : fd(copy.fd), doc(copy.doc), internalFlags(copy.internalFlags), + stdflags(copy.stdflags), uid(copy.uid), size(copy.size), + unique(copy.unique), safeName(copy.safeName), + internaldate(copy.internaldate), home(copy.home) +{ +} + +//------------------------------------------------------------------------ +MaildirMessage::~MaildirMessage(void) +{ +} + +//------------------------------------------------------------------------ +MaildirMessage &MaildirMessage::operator =(const MaildirMessage &copy) +{ + fd = copy.fd; + doc = copy.doc; + internalFlags = copy.internalFlags; + stdflags = copy.stdflags; + uid = copy.uid; + size = copy.size; + unique = copy.unique; + safeName = copy.safeName; + internaldate = copy.internaldate; + home = copy.home; + + return *this; +} + +//------------------------------------------------------------------------ +bool MaildirMessage::operator <(const MaildirMessage &a) const +{ + return uid < a.uid; +} +//------------------------------------------------------------------------ +void MaildirMessage::close(void) +{ + if (fd != -1) { + if ((internalFlags & WasWrittenTo) && fsync(fd) != 0 + && errno != EINVAL && errno != EROFS) { + // FIXME: report this error + } + + if (::close(fd) != 0) { + // FIXME: report this error + } + + fd = -1; + } + + // The file will not be moved from tmp/ before this function has + // finished. So it's safe to assume that safeName is still valid. + if (internalFlags & WasWrittenTo) { + if (internaldate != 0) { + struct utimbuf tim = {internaldate, internaldate}; + utime(safeName.c_str(), &tim); + } else { + time_t t = time(0); + struct utimbuf tim = {t, t}; + utime(safeName.c_str(), &tim); + } + + internalFlags &= ~WasWrittenTo; + } + + + if (doc) { + doc->clear(); + delete doc; + doc = 0; + } +} + +//------------------------------------------------------------------------ +void MaildirMessage::setExpunged(void) +{ + internalFlags |= Expunged; +} + +//------------------------------------------------------------------------ +void MaildirMessage::setUnExpunged(void) +{ + internalFlags &= ~Expunged; +} + +//------------------------------------------------------------------------ +void MaildirMessage::setFlagsUnchanged(void) +{ + internalFlags &= ~FlagsChanged; +} + +//------------------------------------------------------------------------ +bool MaildirMessage::hasFlagsChanged(void) const +{ + return (internalFlags & FlagsChanged) != 0; +} + +//------------------------------------------------------------------------ +unsigned char MaildirMessage::getStdFlags(void) const +{ + return stdflags; +} + +//------------------------------------------------------------------------ +bool MaildirMessage::isExpunged(void) const +{ + return (internalFlags & Expunged) != 0; +} + +//------------------------------------------------------------------------ +unsigned int MaildirMessage::getUID(void) const +{ + return uid; +} + +//------------------------------------------------------------------------ +unsigned int MaildirMessage::getSize(bool render) const +{ + if (size == 0 && render) { + size = getDocSize(); + home.mailboxchanged = true; + } + + return size; +} + +//------------------------------------------------------------------------ +const string &MaildirMessage::getUnique(void) const +{ + return unique; +} + +//------------------------------------------------------------------------ +time_t MaildirMessage::getInternalDate(void) const +{ + return internaldate; +} + +//------------------------------------------------------------------------ +void MaildirMessage::setInternalDate(time_t t) +{ + internaldate = t; +} + +//------------------------------------------------------------------------ +void MaildirMessage::setStdFlag(unsigned char f_in) +{ + internalFlags |= FlagsChanged; + stdflags |= f_in; +} + +//------------------------------------------------------------------------ +void MaildirMessage::resetStdFlags(void) +{ + internalFlags |= FlagsChanged; + stdflags = F_NONE; +} + +//------------------------------------------------------------------------ +void MaildirMessage::setUID(unsigned int i_in) +{ + uid = i_in; +} + +//------------------------------------------------------------------------ +void MaildirMessage::setSize(unsigned int i_in) +{ + size = i_in; +} + +//------------------------------------------------------------------------ +void MaildirMessage::setUnique(const string &s_in) +{ + unique = s_in; +} + +//------------------------------------------------------------------------ +int MaildirMessage::getFile(void) const +{ + if (fd != -1) + return fd; + + const string &id = getUnique(); + MaildirIndexItem *item = home.index.find(id); + if (item) { + string fpath = home.path + "/cur/" + item->fileName; + + unsigned int oflags = O_RDONLY; +#ifdef HAVE_OLARGEFILE + oflags |= O_LARGEFILE; +#endif + while ((fd = open(fpath.c_str(), oflags)) == -1) { + if (errno != ENOENT) { + IO &logger = IOFactory::getInstance().get(2); + logger << "unable to open " << fpath << ": " + << strerror(errno) << endl; + return -1; + } + + home.scanFileNames(); + if ((item = home.index.find(id)) == 0) + break; + else + fpath = home.path + "/cur/" + item->fileName; + } + + MaildirMessageCache &cache = MaildirMessageCache::getInstance(); + cache.addStatus(this, MaildirMessageCache::NotParsed); + + return fd; + } + + return -1; +} + +//------------------------------------------------------------------------ +void MaildirMessage::setFile(int fd) +{ + this->fd = fd; +} + +//------------------------------------------------------------------------ +void MaildirMessage::setSafeName(const string &name) +{ + safeName = name; +} + +//------------------------------------------------------------------------ +const string &MaildirMessage::getSafeName(void) const +{ + return safeName; +} + +//------------------------------------------------------------------------ +string MaildirMessage::getFileName(void) const +{ + MaildirIndexItem *item = home.index.find(getUnique()); + if (!item) { + home.scanFileNames(); + + if ((item = home.index.find(getUnique())) == 0) + return ""; + } + + return item->fileName; +} + +//------------------------------------------------------------------------ +int MaildirMessage::readChunk(string &chunk) +{ + if (fd == -1) { + if ((fd == getFile()) == -1) + return -1; + } + + + char buffer[1024]; + ssize_t readBytes = read(fd, buffer, (size_t) sizeof(buffer)); + if (readBytes == -1) { + setLastError("Error reading from " + getFileName() + + ": " + string(strerror(errno))); + return -1; + } + + chunk = string(buffer, readBytes); + return readBytes; +} + +//------------------------------------------------------------------------ +bool MaildirMessage::appendChunk(const string &chunk) +{ + if (fd == -1) { + setLastError("Error writing to " + getSafeName() + + ": File is not open"); + return false; + } + + internalFlags |= WasWrittenTo; + + string out; + for (string::const_iterator i = chunk.begin(); i != chunk.end(); ++i) { + const char c = *i; + if (c != '\r') + out += c; + } + + ssize_t wroteBytes = 0; + for (;;) { + wroteBytes = write(fd, out.c_str(), (size_t) out.length()); + if (wroteBytes == -1) { + if (errno == EINTR) + continue; + wroteBytes = 0; + } + + break; + } + + if (wroteBytes == (ssize_t) out.length()) + return true; + + setLastError("Error writing to " + getSafeName() + + ": " + string(strerror(errno))); + return false; +} + +//------------------------------------------------------------------------ +bool MaildirMessage::parseFull(void) const +{ + MaildirMessageCache &cache = MaildirMessageCache::getInstance(); + MaildirMessageCache::ParseStatus ps = cache.getStatus(this); + if (ps == MaildirMessageCache::AllParsed && doc) + return true; + + int fd = getFile(); + if (fd == -1) + return false; + + // FIXME: parse errors + if (!doc) + doc = new MimeDocument; + doc->parseFull(fd); + + cache.addStatus(this, MaildirMessageCache::AllParsed); + + return true; +} + +//------------------------------------------------------------------------ +bool MaildirMessage::parseHeaders(void) const +{ + MaildirMessageCache &cache = MaildirMessageCache::getInstance(); + MaildirMessageCache::ParseStatus ps = cache.getStatus(this); + if ((ps == MaildirMessageCache::AllParsed + || ps == MaildirMessageCache::HeaderParsed) && doc) + return true; + + int fd = getFile(); + if (fd == -1) + return false; + + // FIXME: parse errors + if (!doc) + doc = new MimeDocument; + doc->parseOnlyHeader(fd); + + cache.addStatus(this, MaildirMessageCache::HeaderParsed); + + return true; +} + +//------------------------------------------------------------------------ +bool MaildirMessage::printBodyStructure(bool extended) const +{ + if (!parseFull()) + return false; + + IO &com = IOFactory::getInstance().get(1); + bodyStructure(com, doc, extended); + return true; +} + +//------------------------------------------------------------------------ +bool MaildirMessage::printEnvelope(void) const +{ + if (!parseFull()) + return false; + + IO &com = IOFactory::getInstance().get(1); + envelope(com, doc); + return true; +} + +//------------------------------------------------------------------------ +bool MaildirMessage::printHeader(const std::string &section, + std::vector<std::string> headers, + bool includeHeaders, + unsigned int startOffset, + unsigned int length, + bool mime) const +{ + IO &com = IOFactory::getInstance().get(1); + com << storage; + storage = ""; + return true; +} + +//------------------------------------------------------------------------ +unsigned int MaildirMessage::getHeaderSize(const std::string &section, + std::vector<std::string> headers, + bool includeHeaders, + unsigned int startOffset, + unsigned int length, + bool mime) const +{ + IO &com = IOFactory::getInstance().get(1); + + if (section == "") { + if (!parseHeaders()) + return 0; + } else if (!parseFull()) + return 0; + + const MimePart *part = doc->getPart(section, "", mime ? MimePart::FetchMime : MimePart::FetchHeader); + if (!part) { + storage = ""; + return 0; + } + + int fd = getFile(); + if (fd == -1) + return 0; + + storage = ""; + part->printHeader(fd, com, headers, + includeHeaders, startOffset, + length, storage); + + return storage.size(); +} + +//------------------------------------------------------------------------ +bool MaildirMessage::printBody(const std::string &section, + unsigned int startOffset, + unsigned int length) const +{ + IO &com = IOFactory::getInstance().get(1); + if (!parseFull()) + return false; + + const MimePart *part = doc->getPart(section, ""); + if (!part) { + storage = ""; + return 0; + } + + int fd = getFile(); + if (fd == -1) + return false; + + storage = ""; + part->printBody(fd, com, startOffset, length); + return true; +} + +//------------------------------------------------------------------------ +unsigned int MaildirMessage::getBodySize(const std::string &section, + unsigned int startOffset, + unsigned int length) const +{ + if (!parseFull()) + return false; + + const MimePart *part = doc->getPart(section, ""); + if (!part) { + storage = ""; + return 0; + } + + if (startOffset > part->bodylength) + return 0; + + unsigned int s = part->bodylength - startOffset; + return s < length ? s : length; +} + +//------------------------------------------------------------------------ +bool MaildirMessage::printDoc(unsigned int startOffset, + unsigned int length, bool onlyText) const +{ + IO &com = IOFactory::getInstance().get(1); + if (!parseFull()) + return false; + + int fd = getFile(); + if (fd == -1) + return false; + + if (onlyText) + startOffset += doc->bodystartoffsetcrlf; + + storage = ""; + doc->printDoc(fd, com, startOffset, length); + return true; +} + +//------------------------------------------------------------------------ +unsigned int MaildirMessage::getDocSize(unsigned int startOffset, + unsigned int length, + bool onlyText) const +{ + if (!parseFull()) + return false; + + unsigned int s = doc->size; + if (onlyText) s -= doc->bodystartoffsetcrlf; + + if (startOffset > s) + return 0; + + s -= startOffset; + return s < length ? s : length; +} + +//------------------------------------------------------------------------ +bool MaildirMessage::headerContains(const std::string &header, + const std::string &text) +{ + if (!parseHeaders()) + return false; + + HeaderItem hitem; + if (!doc->h.getFirstHeader(header, hitem)) + return false; + + string tmp = hitem.getValue(); + uppercase(tmp); + string tmp2 = text; + uppercase(tmp2); + return (tmp.find(tmp2) != string::npos); +} + +//------------------------------------------------------------------------ +bool MaildirMessage::bodyContains(const std::string &text) +{ + if (!parseFull()) + return false; + + // search the body part of the message.. + int fd = getFile(); + if (fd == -1) + return false; + + crlffile = fd; + crlfReset(); + + char c; + for (unsigned int i = 0; i < doc->getBodyStartOffset(); ++i) + if (!crlfGetChar(c)) + break; + + char *ring = new char[text.length()]; + int pos = 0; + int length = doc->getBodyLength(); + while (crlfGetChar(c) && length--) { + ring[pos % text.length()] = toupper(c); + + if (compareStringToQueue(text, ring, pos + 1, text.length())) { + delete ring; + return true; + } + + ++pos; + } + + delete ring; + return false; +} + +//------------------------------------------------------------------------ +bool MaildirMessage::textContains(const std::string &text) +{ + // search the body part of the message.. + int fd = getFile(); + if (fd == -1) + return false; + + crlffile = fd; + crlfReset(); + + char c; + char *ring = new char[text.length()]; + int pos = 0; + while (crlfGetChar(c)) { + ring[pos % text.length()] = toupper(c); + + if (compareStringToQueue(text, ring, pos + 1, text.length())) { + delete ring; + return true; + } + + ++pos; + } + + delete ring; + return false; +} + +//------------------------------------------------------------------------ +const std::string &MaildirMessage::getHeader(const std::string &header) +{ + static string NIL = ""; + + if (!parseHeaders()) + return NIL; + + HeaderItem hitem; + if (!doc->h.getFirstHeader(header, hitem)) + return NIL; + + return hitem.getValue(); +} + +//------------------------------------------------------------------------ +MaildirMessageCache::MaildirMessageCache(void) +{ +} + +//------------------------------------------------------------------------ +MaildirMessageCache::~MaildirMessageCache(void) +{ + clear(); +} + +//------------------------------------------------------------------------ +MaildirMessageCache &MaildirMessageCache::getInstance(void) +{ + static MaildirMessageCache cache; + return cache; +} + +//------------------------------------------------------------------------ +void MaildirMessageCache::addStatus(const MaildirMessage *m, + ParseStatus s) +{ + if (statuses.find(m) == statuses.end()) { + // Insert status. Perhaps remove oldest status. + if (statuses.size() > 2) { + MaildirMessage *message = const_cast<MaildirMessage *>(parsed.front()); + + removeStatus(message); + } + + parsed.push_back(m); + } + + statuses[m] = s; +} + +//------------------------------------------------------------------------ +MaildirMessageCache::ParseStatus +MaildirMessageCache::getStatus(const MaildirMessage *m) const +{ + if (statuses.find(m) == statuses.end()) + return NotParsed; + + return statuses[m]; +} + +//------------------------------------------------------------------------ +void MaildirMessageCache::clear(void) +{ + for (deque<const MaildirMessage *>::iterator i = parsed.begin(); + i != parsed.end(); ++i) + const_cast<MaildirMessage *>(*i)->close(); + + parsed.clear(); + statuses.clear(); +} + +//------------------------------------------------------------------------ +void MaildirMessageCache::removeStatus(const MaildirMessage *m) +{ + if (statuses.find(m) == statuses.end()) + return; + + statuses.erase(statuses.find(m)); + + for (deque<const MaildirMessage *>::iterator i = parsed.begin(); + i != parsed.end(); ++i) { + if (*i == m) { + const_cast<MaildirMessage *>(*i)->close(); + parsed.erase(i); + break; + } + } +} + +//------------------------------------------------------------------------ +void MaildirMessage::setInternalFlag(unsigned char f) +{ + internalFlags |= f; +} + +//------------------------------------------------------------------------ +unsigned char MaildirMessage::getInternalFlags(void) const +{ + return internalFlags; +} + +//------------------------------------------------------------------------ +void MaildirMessage::clearInternalFlag(unsigned char f) +{ + internalFlags &= ~f; +} diff --git a/src/maildirmessage.h b/src/maildirmessage.h @@ -0,0 +1,328 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/maildirmessage.h + * + * Description: + * Declaration of the MaildirMessage class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef maildirmessage_h_included +#define maildirmessage_h_included +#include <string> +#include <map> +#include <vector> +#include <exception> +#include <iostream> +#include <time.h> + +#include <stdio.h> +#include <string.h> + +#include "message.h" +#include "address.h" +#include "mime.h" + +namespace Binc { + + class Maildir; + + /*! + \class MaildirMessage + \brief The MaildirMessage class provides an interface for + IMAP messages. + + Mailbox independent operations and properties are available + through this interface. + + \sa Message + */ + class MaildirMessage : public Message { + public: + /*! + Sets the UID of a message. + \param uid The UID that will be set. + */ + void setUID(unsigned int uid); + + /*! + Returns the UID of a message. + */ + unsigned int getUID(void) const; + + /*! + Sets the size of the message. This size must be consistent with + the size reported when fetching the full message. + + \param size The size of the message in characters, after + any conversion to CRLF. + */ + void setSize(unsigned int size); + + /*! + Returns the size of the message, optionally determining the size + if it is not yet known. + + \param determine If render is true and the size is unknown, the + size will be calculated and stored implicitly. Otherwise if the + size is unknown, 0 is returned. + */ + unsigned int getSize(bool determine = false) const; + + /*! + Adds one or more flags to a message. + + \param flags This is a bitmask of flags from the Flags enum. + */ + void setStdFlag(unsigned char flags); + + /*! + Resets all flags on a message. + */ + void resetStdFlags(void); + + /*! + Returns the flags that are set on a message. + */ + unsigned char getStdFlags(void) const; + + /*! + Sets the internal flags. + + \param flags a bitmask of the Flags enum. + */ + void setInternalFlag(unsigned char flags); + + /*! + Removes the internal flags. + + \param flags a bitmask of the Flags enum. + */ + void clearInternalFlag(unsigned char flags); + + /*! + Returns the internal flags. + */ + unsigned char getInternalFlags(void) const; + + /*! + Sets a state in a message that indicates that no flags have been + changed. Used together with hasFlagsChanged() to check if the + flags in this message have been changed. + */ + void setFlagsUnchanged(void); + + /*! + Returns true if flags have been added or reset since the last + call to setFlagsUnchanged(), otherwise returns false. + */ + bool hasFlagsChanged(void) const; + + /*! + Sets the internal date of a message. This is usually the date in + which the message arrived in the mailbox. + + \param internaldate The internal date of the message in seconds + since the epoch. + */ + void setInternalDate(time_t internaldate); + + /*! + Returns the internal date of the message in seconds since the + epoch. + */ + time_t getInternalDate(void) const; + + /*! + Reads a chunk of up to 4096 bytes from a message. Call close() + before readChunk() to read the first chunk from a message. + + readChunk() is used for copying or appending a message to a + mailbox. + + \param chunk The characters are stored in this string. + */ + int readChunk(std::string &chunk); + + /*! + Appends a chunk of bytes to a message. appendChunk() is used for + copying or appending a message to a mailbox. + + \param chunk The content of this string is appended to the + message. + */ + bool appendChunk(const std::string &chunk); + + /*! + Resets a message and frees all allocated resources. + */ + void close(void); + + /*! + Marks the message as expunged. Equivalent to calling + setStdFlag() with F_EXPUNGED. + */ + void setExpunged(void); + + /*! + Removes the F_EXPUNGED flag from the message. + */ + void setUnExpunged(void); + + /*! + Returns true if the message is marked as expunged, otherwise + returns false. + */ + bool isExpunged(void) const; + + /*! + Returns the first occurrance of a MIME header in a message, + counting from the top of the message and downwards, or "" if no + such header is found. + \param header The name of the header to be fetched. + */ + const std::string &getHeader(const std::string &header); + + bool headerContains(const std::string &header, + const std::string &text); + + bool bodyContains(const std::string &text); + bool textContains(const std::string &text); + + bool printBodyStructure(bool extended = true) const; + + bool printEnvelope(void) const; + + bool printHeader(const std::string &section, + std::vector<std::string> headers, + bool includeHeaders = false, + unsigned int startOffset = 0, + unsigned int length = UINTMAX, + bool mime = false) const; + unsigned int getHeaderSize(const std::string &section, + std::vector<std::string> headers, + bool includeHeaders = false, + unsigned int startOffset = 0, + unsigned int length = UINTMAX, + bool mime = false) const; + + bool printBody(const std::string &section = "", + unsigned int startOffset = 0, + unsigned int length = UINTMAX) const; + unsigned int getBodySize(const std::string &section, + unsigned int startOffset = 0, + unsigned int length = UINTMAX) const; + + bool printDoc(unsigned int startOffset = 0, + unsigned int length = UINTMAX, + bool onlyText = false) const; + unsigned int getDocSize(unsigned int startOffset = 0, + unsigned int length = UINTMAX, + bool onlyText = false) const; + + void setUnique(const std::string &s_in); + const std::string &getUnique(void) const; + + //-- + MaildirMessage(Maildir &home); + ~MaildirMessage(void); + + friend class Maildir; + + bool operator < (const MaildirMessage &a) const; + + MaildirMessage(const MaildirMessage &copy); + MaildirMessage &operator = (const MaildirMessage &copy); + + enum Flags { + None = 0x00, + Expunged = 0x01, + FlagsChanged = 0x02, + JustArrived = 0x04, + WasWrittenTo = 0x08 + }; + + protected: + bool parseFull(void) const; + bool parseHeaders(void) const; + + std::string getFixedFilename(void) const; + std::string getFileName(void) const; + + void setFile(int fd); + int getFile(void) const; + + void setSafeName(const std::string &name); + const std::string &getSafeName(void) const; + + private: + mutable int fd; + mutable MimeDocument *doc; + mutable unsigned char internalFlags; + mutable unsigned char stdflags; + mutable unsigned int uid; + mutable unsigned int size; + mutable std::string unique; + mutable std::string safeName; + time_t internaldate; + + Maildir &home; + static std::string storage; + }; + + //------------------------------------------------------------------------ + class MaildirMessageCache + { + public: + ~MaildirMessageCache(); + + enum ParseStatus { + NotParsed, + HeaderParsed, + AllParsed + }; + + static MaildirMessageCache &getInstance(void); + + void removeStatus(const MaildirMessage *); + void addStatus(const MaildirMessage *, ParseStatus pstat); + ParseStatus getStatus(const MaildirMessage *) const; + void clear(void); + + private: + MaildirMessageCache(); + + mutable std::map<const MaildirMessage *, ParseStatus> statuses; + mutable std::deque<const MaildirMessage *> parsed; + }; +} + +#endif diff --git a/src/message.h b/src/message.h @@ -0,0 +1,173 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/mailbox/message.h + * + * Description: + * Declaration of the Message class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef message_h_included +#define message_h_included +#include <vector> +#include <string> +#include <time.h> + +#ifndef UINTMAX +#define UINTMAX ((unsigned int)-1) +#endif + +namespace Binc { + + /*! + \class Message + \brief The Message class provides an interface for + IMAP messages. + + Mailbox independent operations and properties are available + through this interface. + + This class is an abstract, and has no implementation. + + \sa MaildirMessage + */ + class Message { + public: + + /*! + Standard IMAP message flags. + + */ + enum Flags { + F_NONE = 0x00, /*!< No flag is set */ + F_SEEN = 0x01, /*!< The message has been seen */ + F_ANSWERED = 0x02, /*!< The message has been answered */ + F_DELETED = 0x04, /*!< The message is marked as deleted */ + F_DRAFT = 0x08, /*!< The message is a draft */ + F_RECENT = 0x10, /*!< The message arrived recently */ + F_FLAGGED = 0x20, /*!< The message is flagged / important */ + F_EXPUNGED = 0x40, /*!< The message has been expunged */ + }; + + virtual void setUID(unsigned int) = 0; + virtual unsigned int getUID(void) const = 0; + + virtual void setSize(unsigned int) = 0; + virtual unsigned int getSize(bool render = false) const = 0; + + virtual void setStdFlag(unsigned char) = 0; + virtual void resetStdFlags(void) = 0; + virtual unsigned char getStdFlags(void) const = 0; + + virtual void setFlagsUnchanged(void) = 0; + virtual bool hasFlagsChanged(void) const = 0; + + virtual void setInternalDate(time_t) = 0; + virtual time_t getInternalDate(void) const = 0; + + // virtual void rewind(void) = 0; + virtual int readChunk(std::string &) = 0; + virtual bool appendChunk(const std::string &) = 0; + virtual void close(void) = 0; + + virtual void setExpunged(void) = 0; + virtual void setUnExpunged(void) = 0; + virtual bool isExpunged(void) const = 0; + + virtual const std::string &getHeader(const std::string &header) = 0; + + virtual bool headerContains(const std::string &header, + const std::string &text) = 0; + + virtual bool bodyContains(const std::string &text) = 0; + virtual bool textContains(const std::string &text) = 0; + + virtual bool printBodyStructure(bool extended = true) const = 0; + + virtual bool printEnvelope(void) const = 0; + + virtual bool printHeader(const std::string &section, + std::vector<std::string> headers, + bool includeHeaders = false, + unsigned int startOffset = 0, + unsigned int length = UINTMAX, + bool mime = false) const = 0; + virtual unsigned int getHeaderSize(const std::string &section, + std::vector<std::string> headers, + bool includeHeaders = false, + unsigned int startOffset = 0, + unsigned int length = UINTMAX, + bool mime = false) const = 0; + + virtual bool printBody(const std::string &section, + unsigned int startOffset = 0, + unsigned int length = UINTMAX) const = 0; + virtual unsigned int getBodySize(const std::string &section, + unsigned int startOffset = 0, + unsigned int length = UINTMAX) const = 0; + + virtual bool printDoc(unsigned int startOffset = 0, + unsigned int length = UINTMAX, + bool onlyText = false) const = 0; + virtual unsigned int getDocSize(unsigned int startOffset = 0, + unsigned int length = UINTMAX, + bool onlyText = false) const = 0; + + Message(void); + virtual ~Message(void); + + void setLastError(const std::string &) const; + const std::string &getLastError(void) const; + + private: + static std::string lastError; + }; + + inline Message::Message(void) + { + } + + inline Message::~Message(void) + { + } + + inline void Message::setLastError(const std::string &error) const + { + lastError = error; + } + + inline const std::string &Message::getLastError(void) const + { + return lastError; + } +} + +#endif diff --git a/src/mime-getpart.cc b/src/mime-getpart.cc @@ -0,0 +1,103 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * mime-getpart.cc + * + * Description: + * Implementation of main mime parser components + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "mime.h" +#include "convert.h" +#include "io.h" +#include <string> +#include <vector> +#include <map> +#include <exception> +#include <iostream> + +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <errno.h> + +using namespace ::std; + +//------------------------------------------------------------------------ +const Binc::MimePart *Binc::MimePart::getPart(const string &findpart, + string genpart, FetchType fetchType) const +{ + if (findpart == genpart) + return this; + + if (isMultipart()) { + if (members.size() != 0) { + vector<MimePart>::const_iterator i = members.begin(); + int part = 1; + while (i != members.end()) { + BincStream ss; + + ss << genpart; + if (genpart != "") + ss << "."; + ss << part; + + const MimePart *m; + if ((m = (*i).getPart(findpart, ss.str())) != 0) { + if (fetchType == FetchHeader && m->isMessageRFC822()) + m = &m->members[0]; + + return m; + } + + ++i; + ++part; + } + } + } else if (isMessageRFC822()) { + if (members.size() == 1) { + const MimePart *m = members[0].getPart(findpart, genpart); + return m; + } else { + return 0; + } + } else { + // Singlepart + if (genpart != "") + genpart += "."; + genpart += "1"; + + if (findpart == genpart) + return this; + } + + return 0; +} diff --git a/src/mime-parsefull.cc b/src/mime-parsefull.cc @@ -0,0 +1,658 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * mime-parsefull.cc + * + * Description: + * Implementation of main mime parser components + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "mime.h" +#include "mime-utils.h" +#include "convert.h" +#include "io.h" +#include <string> +#include <vector> +#include <map> +#include <exception> +#include <iostream> + +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <errno.h> + +using namespace ::std; + +int crlffile = 0; +char crlfdata[4096]; +unsigned int crlftail = 0; +unsigned int crlfhead = 0; +unsigned int crlfoffset = 0; +char lastchar = '\0'; + +//------------------------------------------------------------------------ +bool fillInputBuffer(void) +{ + char raw[1024]; + + ssize_t nbytes; + for (;;) { + nbytes = read(crlffile, raw, sizeof(raw) - 1); + if (nbytes <= 0) { + // FIXME: If ferror(crlffile) we should log this. + return false; + } + else break; + } + + for (ssize_t i = 0; i < nbytes; ++i) { + const char c = raw[i]; + switch (c) { + case '\r': + if (lastchar == '\r') { + crlfdata[crlftail++ & 0xfff] = '\r'; + crlfdata[crlftail++ & 0xfff] = '\n'; + } + break; + case '\n': + crlfdata[crlftail++ & 0xfff] = '\r'; + crlfdata[crlftail++ & 0xfff] = '\n'; + break; + default: + if (lastchar == '\r') { + crlfdata[crlftail++ & 0xfff] = '\r'; + crlfdata[crlftail++ & 0xfff] = '\n'; + } + + crlfdata[crlftail++ & 0xfff] = c; + break; + } + + lastchar = c; + } + + return true; +} + + +//------------------------------------------------------------------------ +void Binc::MimeDocument::parseFull(int fd) const +{ + if (allIsParsed) + return; + + allIsParsed = true; + + crlffile = fd; + crlfReset(); + + headerstartoffsetcrlf = 0; + headerlength = 0; + bodystartoffsetcrlf = 0; + bodylength = 0; + size = 0; + messagerfc822 = false; + multipart = false; + + int bsize = 0; + MimePart::parseFull("", bsize); + + // eat any trailing junk to get the correct size + char c; + while (crlfGetChar(c)); + + size = crlfoffset; +} + +//------------------------------------------------------------------------ +int Binc::MimePart::parseFull(const string &toboundary, int &boundarysize) const +{ + string name; + string content; + char cqueue[4]; + memset(cqueue, 0, sizeof(cqueue)); + + bool quit = false; + char c; + bool eof = false; + + headerstartoffsetcrlf = crlfoffset; + + while (!quit && !eof) { + // read name + while (1) { + if (!crlfGetChar(c)) { + eof = true; + break; + } + + if (c == '\n') ++nlines; + if (c == ':') break; + if (c == '\n') { + // If we encounter a \n before we got to the first ':', then + // if the line is not empty, rewind back to the start of the + // line and assume we're at the start of the body. If not, + // just skip the line and assume we're at the start of the + // body. + string ntmp = name; + trim(ntmp); + if (ntmp != "") + for (int i = name.length() - 1; i >= 0; --i) + crlfUnGetChar(); + + quit = true; + name = ""; + break; + } + + name += c; + + if (name.length() == 2 && name.substr(0, 2) == "\r\n") { + name = ""; + quit = true; + break; + } + } + + if (name.length() == 1 && name[0] == '\r') { + name = ""; + break; + } + + if (quit || eof) break; + + while (!quit) { + if (!crlfGetChar(c)) { + quit = true; + break; + } + + if (c == '\n') ++nlines; + + for (int i = 0; i < 3; ++i) + cqueue[i] = cqueue[i + 1]; + cqueue[3] = c; + + if (strncmp(cqueue, "\r\n\r\n", 4) == 0) { + quit = true; + break; + } + + if (cqueue[2] == '\n') { + + // guess the mime rfc says what can not appear on the beginning + // of a line. + if (!isspace(cqueue[3])) { + if (content.length() > 2) + content.resize(content.length() - 2); + + trim(content); + h.add(name, content); + + name = c; + content = ""; + break; + } + } + + content += c; + } + } + + if (name != "") { + if (content.length() > 2) + content.resize(content.length() - 2); + h.add(name, content); + } + + // Headerlength includes the seperating CRLF. Body starts after the + // CRLF. + headerlength = crlfoffset - headerstartoffsetcrlf; + bodystartoffsetcrlf = crlfoffset; + + // If we encounter the end of file, we return 1 as if we found our + // parent's terminal boundary. This will cause a safe exit, and + // whatever we parsed until now will be available. + if (eof) + return 1; + + // Do simple parsing of headers to determine the + // type of message (multipart,messagerfc822 etc) + HeaderItem ctype; + if (h.getFirstHeader("content-type", ctype)) { + vector<string> types; + split(ctype.getValue(), ";", types); + + if (types.size() > 0) { + // first element should describe content type + string tmp = types[0]; + trim(tmp); + vector<string> v; + split(tmp, "/", v); + string key, value; + + key = (v.size() > 0) ? v[0] : "text"; + value = (v.size() > 1) ? v[1] : "plain"; + lowercase(key); + + if (key == "multipart") { + multipart = true; + lowercase(value); + subtype = value; + } else if (key == "message") { + lowercase(value); + if (value == "rfc822") + messagerfc822 = true; + } + } + + for (vector<string>::const_iterator i = types.begin(); + i != types.end(); ++i) { + string element = *i; + trim(element); + + if (element.find("=") != string::npos) { + string::size_type pos = element.find('='); + string key = element.substr(0, pos); + string value = element.substr(pos + 1); + + lowercase(key); + trim(key); + + if (key == "boundary") { + trim(value, " \""); + boundary = value; + } + } + } + } + + bool foundendofpart = false; + if (messagerfc822) { + // message rfc822 means a completely enclosed mime document. we + // call the parser recursively, and pass on the boundary string + // that we got. when parse() finds this boundary, it returns 0. if + // it finds the end boundary (boundary + "--"), it returns != 0. + MimePart m; + + // parsefull returns the number of bytes that need to be removed + // from the body because of the terminating boundary string. + int bsize; + if (m.parseFull(toboundary, bsize)) + foundendofpart = true; + + // make sure bodylength doesn't overflow + bodylength = crlfoffset; + if (bodylength > bodystartoffsetcrlf) { + bodylength -= bodystartoffsetcrlf; + if (bodylength > (unsigned int) bsize) { + bodylength -= (unsigned int) bsize; + } else { + bodylength = 0; + } + } else { + bodylength = 0; + } + + nbodylines += m.getNofLines(); + + members.push_back(m); + + } else if (multipart) { + // multipart parsing starts with skipping to the first + // boundary. then we call parse() for all parts. the last parse() + // command will return a code indicating that it found the last + // boundary of this multipart. Note that the first boundary does + // not have to start with CRLF. + string delimiter = "--" + boundary; + + char *delimiterqueue = 0; + int endpos = delimiter.length(); + delimiterqueue = new char[endpos]; + int delimiterpos = 0; + bool eof = false; + + // first, skip to the first delimiter string. Anything between the + // header and the first delimiter string is simply ignored (it's + // usually a text message intended for non-mime clients) + do { + if (!crlfGetChar(c)) { + eof = true; + break; + } + + if (c == '\n') + ++nlines; + + delimiterqueue[delimiterpos++ % endpos] = c; + + // Fixme: Must also check for all parents' delimiters. + } while (!compareStringToQueue(delimiter, delimiterqueue, delimiterpos, endpos)); + + delete delimiterqueue; + + if (!eof) + boundarysize = delimiter.size(); + + // Read two more characters. This may be CRLF, it may be "--" and + // it may be any other two characters. + char a; + if (!crlfGetChar(a)) + eof = true; + + if (a == '\n') + ++nlines; + + char b; + if (!crlfGetChar(b)) + eof = true; + + if (b == '\n') + ++nlines; + + // If we find two dashes after the boundary, then this is the end + // of boundary marker. + if (!eof) { + if (a == '-' && b == '-') { + foundendofpart = true; + boundarysize += 2; + + if (!crlfGetChar(a)) + eof = true; + + if (a == '\n') + ++nlines; + + if (!crlfGetChar(b)) + eof = true; + + if (b == '\n') + ++nlines; + } + + if (a == '\r' && b == '\n') { + // This exception is to handle a special case where the + // delimiter of one part is not followed by CRLF, but + // immediately followed by a CRLF prefixed delimiter. + if (!crlfGetChar(a) || !crlfGetChar(b)) + eof = true; + else if (a == '-' && b == '-') { + crlfUnGetChar(); + crlfUnGetChar(); + crlfUnGetChar(); + crlfUnGetChar(); + } else { + crlfUnGetChar(); + crlfUnGetChar(); + } + + boundarysize += 2; + } else { + crlfUnGetChar(); + crlfUnGetChar(); + } + } + + // make sure bodylength doesn't overflow + bodylength = crlfoffset; + if (bodylength > bodystartoffsetcrlf) { + bodylength -= bodystartoffsetcrlf; + if (bodylength > (unsigned int) boundarysize) { + bodylength -= (unsigned int) boundarysize; + } else { + bodylength = 0; + } + } else { + bodylength = 0; + } + + // read all mime parts. + if (!foundendofpart && !eof) { + bool quit = false; + do { + MimePart m; + + // If parseFull returns != 0, then it encountered the multipart's + // final boundary. + int bsize = 0; + if (m.parseFull(boundary, bsize)) { + quit = true; + boundarysize = bsize; + } + + members.push_back(m); + + } while (!quit); + } + + if (!foundendofpart && !eof) { + // multipart parsing starts with skipping to the first + // boundary. then we call parse() for all parts. the last parse() + // command will return a code indicating that it found the last + // boundary of this multipart. Note that the first boundary does + // not have to start with CRLF. + string delimiter = "\r\n--" + toboundary; + + char *delimiterqueue = 0; + int endpos = delimiter.length(); + delimiterqueue = new char[endpos]; + int delimiterpos = 0; + bool eof = false; + + // first, skip to the first delimiter string. Anything between the + // header and the first delimiter string is simply ignored (it's + // usually a text message intended for non-mime clients) + do { + if (!crlfGetChar(c)) { + eof = true; + break; + } + + if (c == '\n') + ++nlines; + + delimiterqueue[delimiterpos++ % endpos] = c; + + // Fixme: Must also check for all parents' delimiters. + } while (!compareStringToQueue(delimiter, delimiterqueue, delimiterpos, endpos)); + + delete delimiterqueue; + + if (!eof) + boundarysize = delimiter.size(); + + // Read two more characters. This may be CRLF, it may be "--" and + // it may be any other two characters. + char a; + if (!crlfGetChar(a)) + eof = true; + + if (a == '\n') + ++nlines; + + char b; + if (!crlfGetChar(b)) + eof = true; + + if (b == '\n') + ++nlines; + + // If we find two dashes after the boundary, then this is the end + // of boundary marker. + if (!eof) { + if (a == '-' && b == '-') { + foundendofpart = true; + boundarysize += 2; + + if (!crlfGetChar(a)) + eof = true; + + if (a == '\n') + ++nlines; + + if (!crlfGetChar(b)) + eof = true; + + if (b == '\n') + ++nlines; + } + + if (a == '\r' && b == '\n') { + // This exception is to handle a special case where the + // delimiter of one part is not followed by CRLF, but + // immediately followed by a CRLF prefixed delimiter. + if (!crlfGetChar(a) || !crlfGetChar(b)) + eof = true; + else if (a == '-' && b == '-') { + crlfUnGetChar(); + crlfUnGetChar(); + crlfUnGetChar(); + crlfUnGetChar(); + } else { + crlfUnGetChar(); + crlfUnGetChar(); + } + + boundarysize += 2; + } else { + crlfUnGetChar(); + crlfUnGetChar(); + } + } + } + + } else { + // If toboundary is empty, then we read until the end of the + // file. Otherwise we will read until we encounter toboundary. + string _toboundary; + if (toboundary != "") { + _toboundary = "\r\n--"; + _toboundary += toboundary; + } + + char *boundaryqueue = 0; + int endpos = _toboundary.length(); + if (toboundary != "") + boundaryqueue = new char[endpos]; + int boundarypos = 0; + + boundarysize = 0; + + string line; + int nchars = 0; + while (crlfGetChar(c)) { + if (c == '\n') { ++nbodylines; ++nlines; } + nchars++; + + if (toboundary == "") + continue; + + // find boundary + boundaryqueue[boundarypos++ % endpos] = c; + + if (compareStringToQueue(_toboundary, boundaryqueue, boundarypos, endpos)) { + boundarysize = _toboundary.length(); + break; + } + } + + delete boundaryqueue; + + if (toboundary != "") { + char a; + if (!crlfGetChar(a)) + eof = true; + + if (a == '\n') + ++nlines; + char b; + if (!crlfGetChar(b)) + eof = true; + + if (b == '\n') + ++nlines; + + if (a == '-' && b == '-') { + boundarysize += 2; + foundendofpart = true; + if (!crlfGetChar(a)) + eof = true; + + if (a == '\n') + ++nlines; + + if (!crlfGetChar(b)) + eof = true; + + if (b == '\n') + ++nlines; + } + + if (a == '\r' && b == '\n') { + // This exception is to handle a special case where the + // delimiter of one part is not followed by CRLF, but + // immediately followed by a CRLF prefixed delimiter. + if (!crlfGetChar(a) || !crlfGetChar(b)) + eof = true; + else if (a == '-' && b == '-') { + crlfUnGetChar(); + crlfUnGetChar(); + crlfUnGetChar(); + crlfUnGetChar(); + } else { + crlfUnGetChar(); + crlfUnGetChar(); + } + + boundarysize += 2; + } else { + crlfUnGetChar(); + crlfUnGetChar(); + } + } + + // make sure bodylength doesn't overflow + bodylength = crlfoffset; + if (bodylength > bodystartoffsetcrlf) { + bodylength -= bodystartoffsetcrlf; + if (bodylength > (unsigned int) boundarysize) { + bodylength -= (unsigned int) boundarysize; + } else { + bodylength = 0; + } + } else { + bodylength = 0; + } + } + + return (eof || foundendofpart) ? 1 : 0; +} diff --git a/src/mime-parseonlyheader.cc b/src/mime-parseonlyheader.cc @@ -0,0 +1,174 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * mime-parseonlyheader.cc + * + * Description: + * Implementation of main mime parser components + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "mime.h" +#include "mime-utils.h" +#include "convert.h" +#include "io.h" +#include <string> +#include <vector> +#include <map> +#include <exception> +#include <iostream> + +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <errno.h> + +using namespace ::std; + +//------------------------------------------------------------------------ +void Binc::MimeDocument::parseOnlyHeader(int fd) const +{ + if (allIsParsed || headerIsParsed) + return; + + headerIsParsed = true; + + crlffile = fd; + crlfReset(); + + headerstartoffsetcrlf = 0; + headerlength = 0; + bodystartoffsetcrlf = 0; + bodylength = 0; + messagerfc822 = false; + multipart = false; + + nlines = 0; + nbodylines = 0; + + MimePart::parseOnlyHeader(""); +} + +//------------------------------------------------------------------------ +int Binc::MimePart::parseOnlyHeader(const string &toboundary) const +{ + string name; + string content; + char cqueue[4]; + memset(cqueue, 0, sizeof(cqueue)); + + headerstartoffsetcrlf = crlfoffset; + + bool quit = false; + char c = '\0'; + + while (!quit) { + // read name + while (1) { + if (!crlfGetChar(c)) { + quit = true; + break; + } + + if (c == '\n') ++nlines; + if (c == ':') break; + if (c == '\n') { + for (int i = name.length() - 1; i >= 0; --i) + crlfUnGetChar(); + + quit = true; + name = ""; + break; + } + + name += c; + + if (name.length() == 2 && name.substr(0, 2) == "\r\n") { + name = ""; + quit = true; + break; + } + } + + if (name.length() == 1 && name[0] == '\r') { + name = ""; + break; + } + + if (quit) break; + + while (!quit) { + if (!crlfGetChar(c)) { + quit = true; + break; + } + + if (c == '\n') ++nlines; + + for (int i = 0; i < 3; ++i) + cqueue[i] = cqueue[i + 1]; + cqueue[3] = c; + + if (strncmp(cqueue, "\r\n\r\n", 4) == 0) { + quit = true; + break; + } + + if (cqueue[2] == '\n') { + + // guess the mime rfc says what can not appear on the beginning + // of a line. + if (!isspace(cqueue[3])) { + if (content.length() > 2) + content.resize(content.length() - 2); + + trim(content); + h.add(name, content); + + name = c; + content = ""; + break; + } + } + + content += c; + } + } + + if (name != "") { + if (content.length() > 2) + content.resize(content.length() - 2); + h.add(name, content); + } + + headerlength = crlfoffset - headerstartoffsetcrlf; + + return 1; +} diff --git a/src/mime-printbody.cc b/src/mime-printbody.cc @@ -0,0 +1,77 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * mime-printbody.cc + * + * Description: + * Implementation of main mime parser components + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "mime.h" +#include "mime-utils.h" +#include "convert.h" +#include "io.h" +#include <string> +#include <vector> +#include <map> +#include <exception> +#include <iostream> + +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <errno.h> + +using namespace ::std; + +//------------------------------------------------------------------------ +void Binc::MimePart::printBody(int fd, IO &output, unsigned int startoffset, + unsigned int length) const +{ + if (crlffile != fd) { + crlffile = fd; + crlfoffset = 1; + crlfSeek(0); + } + + crlfSeek(bodystartoffsetcrlf + startoffset); + + if (startoffset + length > bodylength) + length = bodylength - startoffset; + + char c = '\0'; + for (unsigned int i = 0; i < length; ++i) { + if (!crlfGetChar(c)) + break; + + output << (char)c; + } +} diff --git a/src/mime-printdoc.cc b/src/mime-printdoc.cc @@ -0,0 +1,74 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * mime-printdoc.cc + * + * Description: + * Implementation of main mime parser components + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "mime.h" +#include "mime-utils.h" +#include "convert.h" +#include "io.h" +#include <string> +#include <vector> +#include <map> +#include <exception> +#include <iostream> + +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <errno.h> + +using namespace ::std; + +//------------------------------------------------------------------------ +void Binc::MimePart::printDoc(int fd, IO &output, unsigned int startoffset, + unsigned int length) const +{ + if (crlffile != fd) { + crlffile = fd; + crlfoffset = 1; + crlfSeek(0); + } + + crlfSeek(startoffset); + + char c; + for (unsigned int i = 0; i < length; ++i) { + if (!crlfGetChar(c)) + break; + + output << (char)c; + } +} diff --git a/src/mime-printheader.cc b/src/mime-printheader.cc @@ -0,0 +1,203 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * mime-printheader.cc + * + * Description: + * Implementation of main mime parser components + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "mime.h" +#include "mime-utils.h" +#include "convert.h" +#include "io.h" +#include <string> +#include <vector> +#include <map> +#include <exception> +#include <iostream> + +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <errno.h> + +using namespace ::std; + +//------------------------------------------------------------------------ +void Binc::MimePart::printHeader(int fd, + IO &output, vector<string> headers, bool includeheaders, + unsigned int startoffset, unsigned int length, string &store) const +{ + if (crlffile != fd) { + crlffile = fd; + crlfoffset = 1; + crlfSeek(0); + } + + crlfSeek(headerstartoffsetcrlf); + + string name; + string content; + char cqueue[2]; + memset(cqueue, 0, sizeof(cqueue)); + + bool quit = false; + char c = '\0'; + + unsigned int wrotebytes = 0; + unsigned int processedbytes = 0; + bool hasHeaderSeparator = false; + + while (!quit) { + // read name + while (1) { + // allow EOF to end the header + if (!crlfGetChar(c)) { + quit = true; + break; + } + + // assume this character is part of the header name. + name += c; + + // break on the first colon + if (c == ':') + break; + + // break if a '\n' turned up. + if (c == '\n') { + // end of headers detected + if (name == "\r\n") { + hasHeaderSeparator = true; + quit = true; + break; + } + + // put all data back in the buffer to the beginning of this + // line. + for (int i = name.length(); i >= 0; --i) + crlfUnGetChar(); + + // abort printing of header. note that in this case, the + // headers will not end with a seperate \r\n. + quit = true; + name = ""; + break; + } + } + + if (quit) break; + + // at this point, we have a name, that is - the start of a + // header. we'll read until the end of the header. + while (!quit) { + // allow EOF to end the header. + if (!crlfGetChar(c)) { + quit = true; + break; + } + + if (c == '\n') ++nlines; + + // make a fifo queue of the last 4 characters. + cqueue[0] = cqueue[1]; + cqueue[1] = c; + + // print header + if (cqueue[0] == '\n' && cqueue[1] != '\t' && cqueue[1] != ' ') { + // it wasn't a space, so put it back as it is most likely + // the start of a header name. in any case it terminates the + // content part of this header. + crlfUnGetChar(); + + string lowername = name; + lowercase(lowername); + trim(lowername, ": \t"); + bool foundMatch = false; + for (vector<string>::const_iterator i = headers.begin(); + i != headers.end(); ++i) { + string nametmp = *i; + lowercase(nametmp); + if (nametmp == lowername) { + foundMatch = true; + break; + } + } + + if (foundMatch == includeheaders || headers.size() == 0) { + string out = name + content; + for (string::const_iterator i = out.begin(); i != out.end(); ++i) + if (processedbytes >= startoffset && wrotebytes < length) { + if (processedbytes >= startoffset) { + store += *i; + ++wrotebytes; + } + } else + ++processedbytes; + } + + // move on to the next header + content = ""; + name = ""; + break; + } + + content += c; + } + } + + if (name != "") { + string lowername = name; + lowercase(lowername); + trim(lowername, ": \t"); + bool foundMatch = false; + for (vector<string>::const_iterator i = headers.begin(); + i != headers.end(); ++i) { + string nametmp = *i; + lowercase(nametmp); + if (nametmp == lowername) { + foundMatch = true; + break; + } + } + + if (hasHeaderSeparator || foundMatch == includeheaders || headers.size() == 0) { + string out = name + content; + for (string::const_iterator i = out.begin(); i != out.end(); ++i) + if (processedbytes >= startoffset && wrotebytes < length) { + store += *i; + ++wrotebytes; + } else + ++processedbytes; + } + } +} diff --git a/src/mime-utils.h b/src/mime-utils.h @@ -0,0 +1,110 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * mime.cc + * + * Description: + * Implementation of main mime parser components + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifndef mime_utils_h_included +#define mime_utils_h_included + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <errno.h> + +#include "io.h" + +using namespace ::std; + +inline bool compareStringToQueue(const std::string &s_in, + char *bqueue, int pos, int size) +{ + if (s_in[0] != bqueue[pos % size]) return false; + + for (int i = 0; i < size; ++i) + if (s_in.at(i) != bqueue[(pos + i) % size]) + return false; + + return true; +} + +extern int crlffile; +extern char crlfdata[]; +extern unsigned int crlfoffset; +extern unsigned int crlftail; +extern unsigned int crlfhead; +extern char lastchar; + +bool fillInputBuffer(void); + +inline bool crlfGetChar(char &c) +{ + if (crlfhead == crlftail && !fillInputBuffer()) + return false; + + c = crlfdata[crlfhead++ & 0xfff]; + ++crlfoffset; + return true; +} + +inline void crlfUnGetChar(void) +{ + --crlfhead; + --crlfoffset; +} + +inline void crlfReset(void) +{ + if (crlfoffset != 0) { + crlfoffset = 0; + crlfhead = crlftail = 0; + lastchar = '\0'; + lseek(crlffile, 0, SEEK_SET); + } +} + +inline void crlfSeek(unsigned int offset) +{ + if (crlfoffset > offset) + crlfReset(); + + char c; + int n = 0; + while (offset > crlfoffset) { + if (!crlfGetChar(c)) + break; + ++n; + } +} +#endif diff --git a/src/mime.cc b/src/mime.cc @@ -0,0 +1,178 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * mime.cc + * + * Description: + * Implementation of main mime parser components + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "mime.h" +#include "convert.h" +#include "io.h" +#include <string> +#include <vector> +#include <map> +#include <exception> +#include <iostream> + +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <errno.h> + +using namespace ::std; + +//------------------------------------------------------------------------ +Binc::MimeDocument::MimeDocument(void) : MimePart() +{ + allIsParsed = false; + headerIsParsed = false; +} + +//------------------------------------------------------------------------ +Binc::MimeDocument::~MimeDocument(void) +{ +} + +//------------------------------------------------------------------------ +void Binc::MimeDocument::clear(void) const +{ + members.clear(); + h.clear(); + headerIsParsed = false; + allIsParsed = false; +} + +//------------------------------------------------------------------------ +void Binc::MimePart::clear(void) const +{ + members.clear(); + h.clear(); +} + +//------------------------------------------------------------------------ +Binc::MimePart::MimePart(void) +{ + size = 0; + messagerfc822 = false; + multipart = false; + + nlines = 0; + nbodylines = 0; +} + +//------------------------------------------------------------------------ +Binc::MimePart::~MimePart(void) +{ +} + +//------------------------------------------------------------------------ +Binc::HeaderItem::HeaderItem(void) +{ +} + +//------------------------------------------------------------------------ +Binc::HeaderItem::HeaderItem(const string &key, const string &value) +{ + this->key = key; + this->value = value; +} + +//------------------------------------------------------------------------ +Binc::Header::Header(void) +{ +} + +//------------------------------------------------------------------------ +Binc::Header::~Header(void) +{ +} + +//------------------------------------------------------------------------ +bool Binc::Header::getFirstHeader(const string &key, HeaderItem &dest) const +{ + string k = key; + lowercase(k); + + for (vector<HeaderItem>::const_iterator i = content.begin(); + i != content.end(); ++i) { + string tmp = (*i).getKey(); + lowercase(tmp); + + if (tmp == k) { + dest = *i; + return true; + } + } + return false; +} + +//------------------------------------------------------------------------ +bool Binc::Header::getAllHeaders(const string &key, vector<HeaderItem> &dest) const +{ + string k = key; + lowercase(k); + + for (vector<HeaderItem>::const_iterator i = content.begin(); + i != content.end(); ++i) { + string tmp = (*i).getKey(); + lowercase(tmp); + if (tmp == k) + dest.push_back(*i); + } + + return (dest.size() != 0); +} + +//------------------------------------------------------------------------ +void Binc::Header::clear(void) const +{ + content.clear(); +} + +//------------------------------------------------------------------------ +void Binc::Header::add(const string &key, const string &value) +{ + content.push_back(HeaderItem(key, value)); +} + +//------------------------------------------------------------------------ +void Binc::Header::print(void) const +{ + IO &logger = IOFactory::getInstance().get(2); + + vector<HeaderItem>::const_iterator i = content.begin(); + while (i != content.end()) { + logger << "[" << (*i).getKey() << "]=[" << (*i).getValue() << "]" << endl; + ++i; + } +} diff --git a/src/mime.h b/src/mime.h @@ -0,0 +1,153 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/parsers/mime/mime.h + * + * Description: + * Declaration of main mime parser components + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef mime_h_included +#define mime_h_included +#include <string> +#include <vector> +#include <map> +#include <stdio.h> +#include "io.h" + +namespace Binc { + + //---------------------------------------------------------------------- + class HeaderItem { + private: + mutable std::string key; + mutable std::string value; + + public: + inline const std::string &getKey(void) const { return key; } + inline const std::string &getValue(void) const { return value; } + + //-- + HeaderItem(void); + HeaderItem(const std::string &key, const std::string &value); + }; + + //---------------------------------------------------------------------- + class Header { + private: + mutable std::vector<HeaderItem> content; + + public: + bool getFirstHeader(const std::string &key, HeaderItem &dest) const; + bool getAllHeaders(const std::string &key, std::vector<HeaderItem> &dest) const; + void add(const std::string &name, const std::string &content); + void print(void) const; + void clear(void) const; + + //-- + Header(void); + ~Header(void); + }; + + //---------------------------------------------------------------------- + class MimeDocument; + class MimePart { + protected: + public: + mutable bool multipart; + mutable bool messagerfc822; + mutable std::string subtype; + mutable std::string boundary; + + mutable unsigned int headerstartoffsetcrlf; + mutable unsigned int headerlength; + + mutable unsigned int bodystartoffsetcrlf; + mutable unsigned int bodylength; + mutable unsigned int nlines; + mutable unsigned int nbodylines; + mutable unsigned int size; + + public: + enum FetchType { + FetchBody, + FetchHeader, + FetchMime + }; + + mutable Header h; + + mutable std::vector<MimePart> members; + + inline const std::string &getSubType(void) const { return subtype; } + inline bool isMultipart(void) const { return multipart; } + inline bool isMessageRFC822(void) const { return messagerfc822; } + inline unsigned int getSize(void) const { return bodylength; } + inline unsigned int getNofLines(void) const { return nlines; } + inline unsigned int getNofBodyLines(void) const { return nbodylines; } + inline unsigned int getBodyLength(void) const { return bodylength; } + inline unsigned int getBodyStartOffset(void) const { return bodystartoffsetcrlf; } + + void printBody(int fd, Binc::IO &output, unsigned int startoffset, unsigned int length) const; + void printHeader(int fd, Binc::IO &output, std::vector<std::string> headers, bool includeheaders, unsigned int startoffset, unsigned int length, std::string &storage) const; + void printDoc(int fd, Binc::IO &output, unsigned int startoffset, unsigned int length) const; + virtual void clear(void) const; + + const MimePart *getPart(const std::string &findpart, std::string genpart, FetchType fetchType = FetchBody) const; + virtual int parseOnlyHeader(const std::string &toboundary) const; + virtual int parseFull(const std::string &toboundary, int &boundarysize) const; + + MimePart(void); + virtual ~MimePart(void); + }; + + //---------------------------------------------------------------------- + class MimeDocument : public MimePart { + private: + mutable bool headerIsParsed; + mutable bool allIsParsed; + + public: + void parseOnlyHeader(int fd) const; + void parseFull(int fd) const; + void clear(void) const; + + inline bool isHeaderParsed(void) { return headerIsParsed; } + inline bool isAllParsed(void) { return allIsParsed; } + + //-- + MimeDocument(void); + ~MimeDocument(void); + }; + +}; + +#endif diff --git a/src/operator-append.cc b/src/operator-append.cc @@ -0,0 +1,307 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-append.cc + * + * Description: + * Implementation of the APPEND command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <algorithm> +#include <string> + +#include <fcntl.h> + +#include "depot.h" +#include "io.h" +#include "mailbox.h" +#include "operators.h" +#include "recursivedescent.h" +#include "pendingupdates.h" +#include "session.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +AppendOperator::AppendOperator(void) +{ +} + +//---------------------------------------------------------------------- +AppendOperator::~AppendOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string AppendOperator::getName(void) const +{ + return "APPEND"; +} + +//---------------------------------------------------------------------- +int AppendOperator::getState(void) const +{ + return Session::AUTHENTICATED | Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult AppendOperator::process(Depot &depot, + Request &command) +{ + IO &com = IOFactory::getInstance().get(1); + + Session &session = Session::getInstance(); + + const string &srcmailbox = command.getMailbox(); + const string &canonmailbox = toCanonMailbox(srcmailbox); + Mailbox *mailbox = 0; + + if ((mailbox = depot.get(canonmailbox)) == 0) { + session.setResponseCode("TRYCREATE"); + session.setLastError("invalid destination mailbox " + + toImapString(srcmailbox)); + return NO; + } + + // mask all passed flags together + unsigned int newflags = (unsigned int) Message::F_NONE; + vector<string>::const_iterator f_i = command.flags.begin(); + while (f_i != command.flags.end()) { + if (*f_i == "\\Deleted") newflags |= Message::F_DELETED; + if (*f_i == "\\Answered") newflags |= Message::F_ANSWERED; + if (*f_i == "\\Seen") newflags |= Message::F_SEEN; + if (*f_i == "\\Draft") newflags |= Message::F_DRAFT; + if (*f_i == "\\Flagged") newflags |= Message::F_FLAGGED; + ++f_i; + } + + int mday, year, hour, minute, second; + char month[4]; + + struct tm mytm; + if (command.getDate() != "") { + sscanf(command.getDate().c_str(), "%2i-%3s-%4i %2i:%2i:%2i", + &mday, month, &year, &hour, &minute, &second); + + month[3] = '\0'; + string monthstr = month; + lowercase(monthstr); + mytm.tm_sec = second; + mytm.tm_min = minute; + mytm.tm_hour = hour; + mytm.tm_year = year - 1900; + mytm.tm_mday = mday; + if (monthstr == "jan") mytm.tm_mon = 0; + else if (monthstr == "feb") mytm.tm_mon = 1; + else if (monthstr == "mar") mytm.tm_mon = 2; + else if (monthstr == "apr") mytm.tm_mon = 3; + else if (monthstr == "may") mytm.tm_mon = 4; + else if (monthstr == "jun") mytm.tm_mon = 5; + else if (monthstr == "jul") mytm.tm_mon = 6; + else if (monthstr == "aug") mytm.tm_mon = 7; + else if (monthstr == "sep") mytm.tm_mon = 8; + else if (monthstr == "oct") mytm.tm_mon = 9; + else if (monthstr == "nov") mytm.tm_mon = 10; + else if (monthstr == "dec") mytm.tm_mon = 11; + mytm.tm_isdst = -1; + } + + // Read number of characters in literal. Literal is required here. + if (com.readChar() != '{') { + session.setLastError("expected literal"); + return BAD; + } + + string nr; + while (1) { + int c = com.readChar(); + if (c == -1) { + session.setLastError("unexcepted EOF"); + return BAD; + } + + if (c == '}') + break; + nr += (char) c; + } + + int nchars = atoi(nr.c_str()); + if (nchars < 0) { + session.setLastError("expected positive size of appended message"); + return BAD; + } + + if (com.readChar() != '\r') { + session.setLastError("expected CR"); + return BAD; + } + + if (com.readChar() != '\n') { + session.setLastError("expected LF"); + return BAD; + } + + time_t newtime = (command.getDate() != "") ? mktime(&mytm) : time(0); + if (newtime == -1) newtime = time(0); + Message *dest = mailbox->createMessage(depot.mailboxToFilename(canonmailbox), + newtime); + if (!dest) { + session.setLastError(mailbox->getLastError()); + return NO; + } + + com << "+ go ahead with " << nchars << " characters" << endl; + com.flushContent(); + com.disableInputLimit(); + + while (nchars > 0) { + // Read in chunks of 1024, followed by an optional chunk at the + // end which is < 1024 bytes. + string s; + int bytesToRead = nchars > 1024 ? 1024 : nchars; + int readBytes = com.readStr(s, bytesToRead); + if (readBytes <= 0) { + mailbox->rollBackNewMessages(); + session.setLastError(com.getLastError()); + return NO; + } + + // Expect the exact number of bytes from readStr. + if (readBytes != bytesToRead) { + mailbox->rollBackNewMessages(); + session.setLastError("expected " + toString(nchars) + + " bytes, but got " + toString(readBytes)); + return NO; + } + + // Write the chunk to the message. + if (!dest->appendChunk(s)) { + mailbox->rollBackNewMessages(); + session.setLastError(dest->getLastError()); + return NO; + } + + // Update the message count. + nchars -= readBytes; + } + + // Read the trailing CRLF after the message data. + if (com.readChar() != '\r') { + mailbox->rollBackNewMessages(); + session.setLastError("expected CR"); + return BAD; + } + + if (com.readChar() != '\n') { + mailbox->rollBackNewMessages(); + session.setLastError("expected LF"); + return BAD; + } + + // Commit the message. + dest->close(); + dest->setStdFlag(newflags); + dest->setInternalDate(mktime(&mytm)); + + if (!mailbox->commitNewMessages(depot.mailboxToFilename(canonmailbox))) { + session.setLastError("failed to commit after successful APPEND: " + + mailbox->getLastError()); + return NO; + } + + if (mailbox == depot.getSelected()) + pendingUpdates(mailbox, PendingUpdates::EXISTS + | PendingUpdates::RECENT, true); + + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult AppendOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + Operator::ParseResult res; + + if (c_in.getUidMode()) + return REJECT; + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after APPEND"); + return res; + } + + string mailbox; + if ((res = expectMailbox(mailbox)) != ACCEPT) { + session.setLastError("Expected mailbox after APPEND SPACE"); + return res; + } + + c_in.setMailbox(mailbox); + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after APPEND SPACE mailbox"); + return res; + } + + if ((res = expectThisString("(")) == ACCEPT) { + if ((res = expectFlag(c_in.getFlags())) == ACCEPT) + while (1) { + if ((res = expectSPACE()) != ACCEPT) + break; + if ((res = expectFlag(c_in.getFlags())) != ACCEPT) { + session.setLastError("expected a flag after the '('"); + return res; + } + } + + if ((res = expectThisString(")")) != ACCEPT) { + session.setLastError("expected a ')'"); + return res; + } + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("expected a SPACE after the flag list"); + return res; + } + } + + string date; + if ((res = expectDateTime(date)) == ACCEPT) + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("expected a SPACE after date_time"); + return res; + } + + c_in.setDate(date); + c_in.setName("APPEND"); + return ACCEPT; +} diff --git a/src/operator-authenticate.cc b/src/operator-authenticate.cc @@ -0,0 +1,269 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-authenticate.cc + * + * Description: + * Implementation of the AUTHENTICATE command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#include <string> + +#include "authenticate.h" +#include "depot.h" +#include "io.h" +#include "session.h" +#include "operators.h" +#include "recursivedescent.h" +#include "base64.h" +#include "convert.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +AuthenticateOperator::AuthenticateOperator(void) +{ +} + +//---------------------------------------------------------------------- +AuthenticateOperator::~AuthenticateOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string AuthenticateOperator::getName(void) const +{ + return "AUTHENTICATE"; +} + +//---------------------------------------------------------------------- +int AuthenticateOperator::getState(void) const +{ + return Session::NONAUTHENTICATED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult AuthenticateOperator::process(Depot &depot, + Request &command) +{ + Session &session = Session::getInstance(); + IO &com = IOFactory::getInstance().get(1); + + string authtype = command.getAuthType(); + uppercase(authtype); + + string username; + string password; + + bool allowplain = (session.globalconfig["Authentication"]["allow plain auth in non ssl"] == "yes"); + + + // for now, we only support LOGIN. + if (authtype == "LOGIN") { + // we only allow this type of authentication over a plain + // connection if it is passed as argument or given in the conf + // file. + if (!session.command.ssl && !allowplain && !getenv("ALLOWPLAIN")) { + session.setLastError("Plain text password authentication" + " is disallowed. Please try enabling SSL" + " or TLS in your mail client."); + return NO; + } + + com << "+ " << base64encode("User Name") << endl; + com.flushContent(); + + // Read user name + for (;;) { + int c = com.readChar(); + if (c == -1) + return BAD; + + if ((char) c == '\n') + break; + + username += c; + } + + if (username != "" && username[0] == '*') { + session.setLastError("Authentication cancelled by user"); + return NO; + } + + com << "+ " << base64encode("Password") << endl; + com.flushContent(); + + // Read password + for (;;) { + int c = com.readChar(); + if (c == -1) + return BAD; + + if ((char)c == '\n') + break; + + password += c; + } + + if (password != "" && password[0] == '*') { + session.setLastError("Authentication cancelled by user"); + return NO; + } + + username = base64decode(username); + password = base64decode(password); + + } else if (authtype == "PLAIN") { + // we only allow this type of authentication over an SSL encrypted + // connection. + if (!session.command.ssl && !allowplain && !getenv("ALLOWPLAIN")) { + session.setLastError("Plain text password authentication" + " is disallowed. Please try enabling SSL" + " or TLS in your mail client."); + return NO; + } + + com << "+ " << endl; + com.flushContent(); + + string b64; + for (;;) { + int c = com.readChar(); + if (c == -1) { + session.setLastError("unexpected EOF"); + return BAD; + } + + if ((char) c == '\r') { + com.readChar(); + break; + } + + b64 += (char) c; + } + + if (b64.size() >= 1 && b64[0] == '*') { + session.setLastError("Authentication cancelled by user"); + return NO; + } + + string plain = base64decode(b64); + string::size_type pos; + if ((pos = plain.find('\0')) == string::npos) { + session.setLastError("Authentication failed. In PLAIN mode," + " there must be at least two null characters" + " in the input string, but none were found"); + return NO; + } + + plain = plain.substr(pos + 1); + if ((pos = plain.find('\0')) == string::npos) { + session.setLastError("Authentication failed. In PLAIN mode," + " there must be at least two null characters" + " in the input string, but only one was found"); + return NO; + } + + username = plain.substr(0, pos); + password = plain.substr(pos + 1); + } else { + session.setLastError("The authentication method " + + toImapString(authtype) + " is not supported." + " Please try again with a different method." + " There is built in support for \"PLAIN\"" + " and \"LOGIN\"."); + return NO; + } + + putenv(strdup(("BINCIMAP_LOGIN=AUTHENTICATE+" + command.getTag()).c_str())); + + // the authenticate function calls a stub which does the actual + // authentication. the function returns 0 (success), 1 (internal + // error) or 2 (failed) + switch (authenticate(depot, + (const string &)username, + (const string &)password)) { + case 1: + session.setLastError("An internal error occurred when you attempted" + " to log in to the IMAP server. Please contact" + " your system administrator."); + return NO; + case 2: + session.setLastError("Login failed. Either your user name" + " or your password was wrong. Please try again," + " and if the problem persists, please contact" + " your system administrator."); + return NO; + case 3: + com << "* BYE Timeout after " << session.idletimeout + << " seconds of inactivity." << endl; + break; + case -1: + com << "* BYE The server died unexpectedly. Please contact " + "your system administrator for more information." << endl; + break; + + } + + // auth was ok. go to logout state + session.setState(Session::LOGOUT); + return NOTHING; +} + + +//---------------------------------------------------------------------- +Operator::ParseResult AuthenticateOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected single SPACE after AUTHENTICATE"); + return res; + } + + string authtype; + if ((res = expectAtom(authtype)) != ACCEPT) { + session.setLastError("Expected auth_type after AUTHENTICATE SPACE"); + return ERROR; + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after AUTHENTICATE SPACE auth_type"); + return res; + } + + c_in.setAuthType(authtype); + + c_in.setName("AUTHENTICATE"); + return ACCEPT; +} diff --git a/src/operator-capability.cc b/src/operator-capability.cc @@ -0,0 +1,128 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * bincimapd-capability.cc + * + * Description: + * Implementation of the CAPABILITY command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> + +#include "depot.h" +#include "io.h" +#include "operators.h" +#include "recursivedescent.h" +#include "session.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +CapabilityOperator::CapabilityOperator(void) +{ +} + +//---------------------------------------------------------------------- +CapabilityOperator::~CapabilityOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string CapabilityOperator::getName(void) const +{ + return "CAPABILITY"; +} + +//---------------------------------------------------------------------- +int CapabilityOperator::getState(void) const +{ + return Session::NONAUTHENTICATED + | Session::AUTHENTICATED + | Session::SELECTED; +} + +//---------------------------------------------------------------------- +void CapabilityOperator::addCapability(const string &cap) +{ + capabilities.push_back(cap); +} + +//---------------------------------------------------------------------- +Operator::ProcessResult CapabilityOperator::process(Depot &depot, + Request &command) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + com << "* CAPABILITY IMAP4rev1"; + + if (session.getState() == Session::NONAUTHENTICATED) { + if (!session.command.ssl + && (session.globalconfig["Authentication"]["disable starttls"] != "yes")) + com << " STARTTLS"; + + const bool allowplain + = (session.globalconfig["Authentication"]["allow plain auth in non ssl"] == "yes"); + + if (session.command.ssl || allowplain || getenv("ALLOWPLAIN")) + com << " AUTH=LOGIN AUTH=PLAIN"; + else + com << " LOGINDISABLED"; + } + + vector<string>::const_iterator i = capabilities.begin(); + while (i != capabilities.end()) { + com << " " << *i; + ++i; + } + com << endl; + + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult CapabilityOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after CAPABILITY"); + return res; + } + + c_in.setName("CAPABILITY"); + return ACCEPT; +} diff --git a/src/operator-check.cc b/src/operator-check.cc @@ -0,0 +1,100 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-check.cc + * + * Description: + * Implementation of the CHECK command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#include <string> + +#include "depot.h" +#include "io.h" +#include "mailbox.h" +#include "operators.h" +#include "recursivedescent.h" +#include "pendingupdates.h" +#include "session.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +CheckOperator::CheckOperator(void) +{ +} + + +//---------------------------------------------------------------------- +CheckOperator::~CheckOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string CheckOperator::getName(void) const +{ + return "CHECK"; +} + +//---------------------------------------------------------------------- +int CheckOperator::getState(void) const +{ + return Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult CheckOperator::process(Depot &depot, + Request &command) +{ + Mailbox *mailbox = depot.getSelected(); + if (mailbox != 0) + pendingUpdates(mailbox, PendingUpdates::FLAGS + | PendingUpdates::EXISTS + | PendingUpdates::RECENT, true); + + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult CheckOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after CHECK"); + return res; + } + + c_in.setName("CHECK"); + return ACCEPT; +} + diff --git a/src/operator-close.cc b/src/operator-close.cc @@ -0,0 +1,102 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-close.cc + * + * Description: + * Implementation of the CLOSE command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#include <string> + +#include "depot.h" +#include "io.h" +#include "mailbox.h" +#include "operators.h" +#include "recursivedescent.h" +#include "session.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +CloseOperator::CloseOperator(void) +{ +} + +//---------------------------------------------------------------------- +CloseOperator::~CloseOperator(void) +{ +} + +//------------------------------------------------------------------------ +const string CloseOperator::getName(void) const +{ + return "CLOSE"; +} + +//------------------------------------------------------------------------ +int CloseOperator::getState(void) const +{ + return Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult CloseOperator::process(Depot &depot, + Request &command) +{ + IO &logger = IOFactory::getInstance().get(2); + + Mailbox *mailbox = depot.getSelected(); + mailbox->expungeMailbox(); + mailbox->closeMailbox(); + + Session &session = Session::getInstance(); + session.setState(Session::AUTHENTICATED); + + logger.setLogPrefix(session.getUserID() + "@" + session.getIP() + ":"); + + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult CloseOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after CLOSE"); + return res; + } + + c_in.setName("CLOSE"); + return ACCEPT; +} diff --git a/src/operator-copy.cc b/src/operator-copy.cc @@ -0,0 +1,201 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-copy.cc + * + * Description: + * Implementation of the COPY command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> + +#include "depot.h" +#include "io.h" +#include "maildir.h" +#include "operators.h" +#include "recursivedescent.h" +#include "session.h" +#include "convert.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +CopyOperator::CopyOperator(void) +{ +} + +//---------------------------------------------------------------------- +CopyOperator::~CopyOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string CopyOperator::getName(void) const +{ + return "COPY"; +} + +//---------------------------------------------------------------------- +int CopyOperator::getState(void) const +{ + return Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult CopyOperator::process(Depot &depot, + Request &command) +{ + Session &session = Session::getInstance(); + IO &logger = IOFactory::getInstance().get(2); + + // Get the current mailbox + Mailbox *srcMailbox = depot.getSelected(); + + // Get the destination mailbox + string dmailbox = command.getMailbox(); + Mailbox *destMailbox = depot.get(dmailbox); + if (destMailbox == 0) { + session.setResponseCode("TRYCREATE"); + session.setLastError("invalid mailbox " + toImapString(dmailbox)); + return NO; + } + + unsigned int mode = Mailbox::SKIP_EXPUNGED; + mode |= command.getUidMode() ? Mailbox::UID_MODE : Mailbox::SQNR_MODE; + + // Copy each message in the sequence set to the destination mailbox. + bool success = true; + Mailbox::iterator i = srcMailbox->begin(command.bset, mode); + for (; success && i != srcMailbox->end(); ++i) { + Message &source = *i; + + if (srcMailbox->fastCopy(source, *destMailbox, + depot.mailboxToFilename(dmailbox))) + continue; + + // Have the destination mailbox create a message for us. + Message *dest + = destMailbox->createMessage(depot.mailboxToFilename(dmailbox), + source.getInternalDate()); + if (!dest) { + session.setLastError(destMailbox->getLastError()); + success = false; + break; + } + + // Set the flags and internal date. + dest->setStdFlag(source.getStdFlags()); + dest->setInternalDate(source.getInternalDate()); + + // Copy chunks from the source message over to the destination + // message. + string chunk; + do { + int readSize = source.readChunk(chunk); + + if (readSize == 0) + break; + else if (readSize == -1) { + logger << "when reading from message " + << i.getSqnr() << "/" << source.getUID() + << " in \"" << srcMailbox->getName() << "\": " + << source.getLastError() << endl; + success = false; + } else if (!dest->appendChunk(chunk)) { + logger << "when writing to \"" + << dmailbox << "\": " + << dest->getLastError() << endl; + success = false; + } + } while (success); + + dest->close(); + } + + if (!success && !destMailbox->rollBackNewMessages()) { + session.setLastError("Failed to rollback after unsuccessful copy: " + + destMailbox->getLastError()); + return NO; + } + + if (success) + if (!destMailbox->commitNewMessages(depot.mailboxToFilename(dmailbox))) { + session.setLastError("Failed to commit after successful copy: " + + destMailbox->getLastError()); + return NO; + } + + if (!success) + session.setLastError("The transaction was unrolled. Please " + "contant your system administrator for " + "more information."); + + return success ? OK : NO; +} + +//------------------------------------------------------------------------ +Operator::ParseResult CopyOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after COPY"); + return res; + } + + if ((res = expectSet(c_in.getSet())) != ACCEPT) { + session.setLastError("Expected sequence set after COPY SPACE"); + return res; + } + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after COPY SPACE set"); + return res; + } + + string mailbox; + if ((res = expectMailbox(mailbox)) != ACCEPT) { + session.setLastError("Expected mailbox after COPY SPACE set SPACE"); + return res; + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after COPY SPACE set SPACE mailbox"); + return res; + } + + c_in.setMailbox(mailbox); + c_in.setName("COPY"); + + return ACCEPT; +} diff --git a/src/operator-create.cc b/src/operator-create.cc @@ -0,0 +1,117 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * bincimapd-create.cc + * + * Description: + * Implementation of the CREATE command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> + +#include "depot.h" +#include "io.h" +#include "mailbox.h" +#include "operators.h" +#include "imapparser.h" +#include "recursivedescent.h" +#include "session.h" +#include "convert.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +CreateOperator::CreateOperator(void) +{ +} + +//---------------------------------------------------------------------- +CreateOperator::~CreateOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string CreateOperator::getName(void) const +{ + return "CREATE"; +} + +//---------------------------------------------------------------------- +int CreateOperator::getState(void) const +{ + return Session::AUTHENTICATED | Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult CreateOperator::process(Depot &depot, + Request &command) +{ + if (depot.createMailbox(command.getMailbox())) + return OK; + else { + Session &session = Session::getInstance(); + session.setLastError(depot.getLastError()); + return NO; + } +} + +//---------------------------------------------------------------------- +Operator::ParseResult CreateOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after CREATE"); + return res; + } + + string mailbox; + if ((res = expectMailbox(mailbox)) != ACCEPT) { + session.setLastError("Expected mailbox after CREATE SPACE"); + return res; + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after CREATE SPACE CRLF"); + return res; + } + + session.mailboxchanges = true; + + c_in.setName("CREATE"); + c_in.setMailbox(mailbox); + return ACCEPT; +} diff --git a/src/operator-delete.cc b/src/operator-delete.cc @@ -0,0 +1,114 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-delete.cc + * + * Description: + * Implementation of the DELETE command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#include <string> + +#include "depot.h" +#include "io.h" +#include "mailbox.h" +#include "operators.h" +#include "imapparser.h" +#include "recursivedescent.h" +#include "session.h" +#include "convert.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +DeleteOperator::DeleteOperator(void) +{ +} + +//---------------------------------------------------------------------- +DeleteOperator::~DeleteOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string DeleteOperator::getName(void) const +{ + return "DELETE"; +} + +//---------------------------------------------------------------------- +int DeleteOperator::getState(void) const +{ + return Session::AUTHENTICATED | Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult DeleteOperator::process(Depot &depot, + Request &command) +{ + if (depot.deleteMailbox(command.getMailbox())) + return OK; + else { + Session &session = Session::getInstance(); + session.setLastError(depot.getLastError()); + return NO; + } +} + +//---------------------------------------------------------------------- +Operator::ParseResult DeleteOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after DELETE"); + return res; + } + + string mailbox; + if ((res = expectMailbox(mailbox)) != ACCEPT) { + session.setLastError("Expected mailbox after DELETE SPACE"); + return res; + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after DELETE SPACE mailbox"); + return res; + } + + session.mailboxchanges = true; + + c_in.setName("DELETE"); + c_in.setMailbox(mailbox); + return ACCEPT; +} + diff --git a/src/operator-examine.cc b/src/operator-examine.cc @@ -0,0 +1,71 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-examine.cc + * + * Description: + * Implementation of the EXAMINE command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> +#include <iostream> + +#include "mailbox.h" +#include "maildir.h" + +#include "storage.h" + +#include "pendingupdates.h" + +#include "convert.h" +#include "io.h" + +#include "depot.h" +#include "operators.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +const std::string ExamineOperator::getName(void) const +{ + return "EXAMINE"; +} + +//---------------------------------------------------------------------- +ExamineOperator::ExamineOperator(void) +{ +} + +//---------------------------------------------------------------------- +ExamineOperator::~ExamineOperator(void) +{ +} diff --git a/src/operator-expunge.cc b/src/operator-expunge.cc @@ -0,0 +1,101 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-expunge.cc + * + * Description: + * Implementation of the EXPUNGE command + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#include <string> + +#include "depot.h" +#include "io.h" +#include "mailbox.h" +#include "operators.h" +#include "imapparser.h" +#include "recursivedescent.h" +#include "pendingupdates.h" +#include "session.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +ExpungeOperator::ExpungeOperator(void) +{ +} + +//---------------------------------------------------------------------- +ExpungeOperator::~ExpungeOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string ExpungeOperator::getName(void) const +{ + return "EXPUNGE"; +} + +//---------------------------------------------------------------------- +int ExpungeOperator::getState(void) const +{ + return Session::SELECTED; +} + +//---------------------------------------------------------------------- +Operator::ProcessResult ExpungeOperator::process(Depot &depot, + Request &command) +{ + Mailbox *mailbox = depot.getSelected(); + mailbox->expungeMailbox(); + + pendingUpdates(mailbox, PendingUpdates::EXPUNGE + | PendingUpdates::EXISTS + | PendingUpdates::RECENT + | PendingUpdates::FLAGS, true); + + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult ExpungeOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF"); + return res; + } + + c_in.setName("EXPUNGE"); + return ACCEPT; +} diff --git a/src/operator-fetch.cc b/src/operator-fetch.cc @@ -0,0 +1,681 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-fetch.cc + * + * Description: + * Implementation of the FETCH command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> + +#include "depot.h" +#include "io.h" +#include "mailbox.h" +#include "operators.h" +#include "imapparser.h" +#include "recursivedescent.h" +#include "session.h" +#include "convert.h" + +using namespace ::std; +using namespace Binc; + +namespace { + void outputFlags(const Message & message) + { + IO &com = IOFactory::getInstance().get(1); + + com << "FLAGS "; + + com << "("; + int flags = message.getStdFlags(); + vector<string> flagv; + if (flags & Message::F_SEEN) flagv.push_back("\\Seen"); + if (flags & Message::F_ANSWERED) flagv.push_back("\\Answered"); + if (flags & Message::F_DELETED) flagv.push_back("\\Deleted"); + if (flags & Message::F_DRAFT) flagv.push_back("\\Draft"); + if (flags & Message::F_RECENT) flagv.push_back("\\Recent"); + if (flags & Message::F_FLAGGED) flagv.push_back("\\Flagged"); + for (vector<string>::const_iterator k + = flagv.begin(); k != flagv.end(); ++k) { + if (k != flagv.begin()) com << " "; + com << *k; + } + com << ")"; + } + +} + +//---------------------------------------------------------------------- +FetchOperator::FetchOperator(void) +{ +} + +//---------------------------------------------------------------------- +FetchOperator::~FetchOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string FetchOperator::getName(void) const +{ + return "FETCH"; +} + +//---------------------------------------------------------------------- +int FetchOperator::getState(void) const +{ + return Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult FetchOperator::process(Depot &depot, + Request &request) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + bool updateFlags = false; + Request req = request; + + Mailbox *mailbox = depot.getSelected(); + + // If this is a UID FETCH, check if the UID attribute is fetched. If + // it is not, then add it to the list of fetch attributes. + vector<BincImapParserFetchAtt>::const_iterator f_i; + bool uidfetched = false; + if (request.getUidMode()) { + f_i = request.fatt.begin(); + while (f_i != request.fatt.end()) { + if ((*f_i).type == "UID") { + uidfetched = true; + break; + } + + f_i++; + } + + if (!uidfetched) { + BincImapParserFetchAtt b; + b.type = "UID"; + req.fatt.push_back(b); + } + } + + // Convert macros ALL, FULL and FAST + f_i = request.fatt.begin(); + while (f_i != request.fatt.end()) { + const string &type = (*f_i).type; + if (type == "ALL") { + req.fatt.push_back(BincImapParserFetchAtt("FLAGS")); + req.fatt.push_back(BincImapParserFetchAtt("INTERNALDATE")); + req.fatt.push_back(BincImapParserFetchAtt("RFC822.SIZE")); + req.fatt.push_back(BincImapParserFetchAtt("ENVELOPE")); + } else if (type == "FULL") { + req.fatt.push_back(BincImapParserFetchAtt("FLAGS")); + req.fatt.push_back(BincImapParserFetchAtt("INTERNALDATE")); + req.fatt.push_back(BincImapParserFetchAtt("RFC822.SIZE")); + req.fatt.push_back(BincImapParserFetchAtt("ENVELOPE")); + req.fatt.push_back(BincImapParserFetchAtt("BODY")); + } else if (type == "FAST") { + req.fatt.push_back(BincImapParserFetchAtt("FLAGS")); + req.fatt.push_back(BincImapParserFetchAtt("INTERNALDATE")); + req.fatt.push_back(BincImapParserFetchAtt("RFC822.SIZE")); + } + + ++f_i; + } + + int mode; + if (req.getUidMode()) + mode = Mailbox::UID_MODE; + else + mode = Mailbox::SQNR_MODE; + + Mailbox::iterator i + = mailbox->begin(req.bset, Mailbox::SKIP_EXPUNGED | mode); + + for (; i != mailbox->end(); ++i) { + Message &message = *i; + + com << "* " << i.getSqnr() << " FETCH ("; + bool hasprinted = false; + f_i = req.fatt.begin(); + while (f_i != req.fatt.end()) { + BincImapParserFetchAtt fatt = *f_i; + + string prefix = ""; + if (hasprinted) + prefix = " "; + + if (fatt.type == "FLAGS") { + // FLAGS + hasprinted = true; + com << prefix; + + outputFlags(message); + } else if (fatt.type == "UID") { + // UID + hasprinted = true; + com << prefix << "UID " << message.getUID(); + } else if (fatt.type == "RFC822.SIZE") { + // RFC822.SIZE + hasprinted = true; + com << prefix << "RFC822.SIZE " << message.getSize(true); + } else if (fatt.type == "ENVELOPE") { + // ENVELOPE + hasprinted = true; + com << prefix << "ENVELOPE "; + message.printEnvelope(); + } else if (fatt.type == "BODYSTRUCTURE") { + // BODYSTRUCTURE + hasprinted = true; + com << prefix << "BODYSTRUCTURE "; + message.printBodyStructure(true); + } else if (fatt.type == "BODY" && !fatt.hassection) { + // BODY with no section + hasprinted = true; + session.addBody(); + com << prefix << "BODY "; + message.printBodyStructure(false); + } else if (fatt.type == "INTERNALDATE") { + // INTERNALDATE + hasprinted = true; + com << prefix << "INTERNALDATE "; + + time_t iDate = message.getInternalDate(); + struct tm *_tm = gmtime(&iDate); + char internal[64]; + string iDateStr; + if (strftime(internal, sizeof(internal), + "%d-%b-%Y %H:%M:%S %Z", _tm) != 0) + iDateStr = internal; + else + iDateStr = "NIL"; + + com << toImapString(iDateStr); + } else if (fatt.type == "BODY" || fatt.type == "BODY.PEEK") { + // BODY & BODY.PEEK + hasprinted = true; + session.addBody(); + + com << prefix; + bool peek = (fatt.type == "BODY.PEEK"); + com << fatt.toString(); + + bool includeheaders = true; + bool fullheader = false; + bool bodyfetch = false; + + if (fatt.section != "" || fatt.sectiontext == "" + || fatt.sectiontext == "TEXT") { + bodyfetch = true; + fullheader = true; + } + + if (fatt.sectiontext == "HEADER.FIELDS.NOT") + includeheaders = false; + + if (fatt.sectiontext == "HEADER" + || fatt.sectiontext == "HEADER.FIELDS" + || fatt.sectiontext == "HEADER.FIELDS.NOT" + || fatt.sectiontext == "MIME") { + + vector<string> v; + + if (fatt.sectiontext == "MIME") { + v.push_back("content-type"); + v.push_back("content-transfer-encoding"); + v.push_back("content-disposition"); + v.push_back("content-description"); + } else + v = fatt.headerlist; + + string dummy; + unsigned int size = fullheader + ? message.getHeaderSize(fatt.section, v, + true, + fatt.offsetstart, + fatt.offsetlength, fatt.sectiontext == "MIME") + : message.getHeaderSize(fatt.section, fatt.headerlist, + includeheaders, + fatt.offsetstart, + fatt.offsetlength, fatt.sectiontext == "MIME"); + + com << "{" << size << "}\r\n"; + + if (fullheader) { + message.printHeader(fatt.section, v, + true, + fatt.offsetstart, + fatt.offsetlength, fatt.sectiontext == "MIME"); + } else { + message.printHeader(fatt.section, fatt.headerlist, + includeheaders, + fatt.offsetstart, + fatt.offsetlength, fatt.sectiontext == "MIME"); + } + } else { + unsigned int size; + if ((fatt.sectiontext == "" || fatt.sectiontext == "TEXT") + && fatt.section == "") + size = message.getDocSize(fatt.offsetstart, + fatt.offsetlength, + fatt.sectiontext == "TEXT"); + else + size = message.getBodySize(fatt.section, + fatt.offsetstart, + fatt.offsetlength); + + com << "{" << size << "}\r\n"; + + if ((fatt.sectiontext == "" || fatt.sectiontext == "TEXT") + && fatt.section == "") + message.printDoc(fatt.offsetstart, + fatt.offsetlength, + fatt.sectiontext == "TEXT"); + else + message.printBody(fatt.section, fatt.offsetstart, + fatt.offsetlength); + } + + // set the \Seen flag if .PEEK is not used. + if (!peek) + if ((message.getStdFlags() & Message::F_SEEN) == 0) + message.setStdFlag(Message::F_SEEN); + + } else if (fatt.type == "RFC822") { + com << prefix; + hasprinted = true; + session.addBody(); + + com << fatt.toString(); + + unsigned int size = message.getDocSize(fatt.offsetstart, + fatt.offsetlength); + + com << " {" << size << "}\r\n"; + + message.printDoc(fatt.offsetstart, fatt.offsetlength); + + // set the \Seen flag + if ((message.getStdFlags() & Message::F_SEEN) == 0) + message.setStdFlag(Message::F_SEEN); + + } else if (fatt.type == "RFC822.HEADER") { + com << prefix; + hasprinted = true; + + com << fatt.toString(); + + vector<string> v; + string dummy; + + unsigned int size = message.getHeaderSize("", v, true, + fatt.offsetstart, + fatt.offsetlength); + + com << " {" << size << "}\r\n"; + + message.printHeader("", v, true, fatt.offsetstart, + fatt.offsetlength); + + } else if (fatt.type == "RFC822.TEXT") { + // RFC822.TEXT + com << prefix; + hasprinted = true; + session.addBody(); + + com << fatt.toString(); + + bool bodyfetch = false; + bodyfetch = true; + + unsigned int size; + if (fatt.sectiontext == "" && fatt.section == "") + size = message.getDocSize(fatt.offsetstart, + fatt.offsetlength); + else + size = message.getBodySize(fatt.section, fatt.offsetstart, + fatt.offsetlength); + + com << "{" << size << "}\r\n"; + + if (fatt.sectiontext == "" && fatt.section == "") + message.printDoc(fatt.offsetstart, + fatt.offsetlength); + else + message.printBody(fatt.section, fatt.offsetstart, + fatt.offsetlength); + + // set the \Seen flag + if ((message.getStdFlags() & Message::F_SEEN) == 0) + message.setStdFlag(Message::F_SEEN); + } else { + // Unrecognized fetch_att, this is stopped by the parser + // so we never get here. + } + + f_i++; + } + + // FIXME: how are parse error passed back? + + com << ")" << endl; + + if (message.hasFlagsChanged()) { + updateFlags = true; + com << "* " << i.getSqnr() << " FETCH ("; + outputFlags(message); + com << ")" << endl; + message.setFlagsUnchanged(); + } + } + + if (updateFlags) mailbox->updateFlags(); + + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult FetchOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after FETCH"); + return res; + } + + if ((res = expectSet(c_in.getSet())) != ACCEPT) { + session.setLastError("Expected sequence set after FETCH SPACE"); + return res; + } + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after FETCH SPACE set"); + return res; + } + + BincImapParserFetchAtt f; + + if ((res = expectThisString("ALL")) == ACCEPT) { + f.type = "ALL"; + c_in.fatt.push_back(f); + } else if ((res = expectThisString("FULL")) == ACCEPT) { + f.type = "FULL"; + c_in.fatt.push_back(f); + } else if ((res = expectThisString("FAST")) == ACCEPT) { + f.type = "FAST"; + c_in.fatt.push_back(f); + } else if ((res = expectFetchAtt(f)) == ACCEPT) { + c_in.fatt.push_back(f); + } else if ((res = expectThisString("(")) == ACCEPT) { + while (1) { + BincImapParserFetchAtt ftmp; + if ((res = expectFetchAtt(ftmp)) != ACCEPT) { + session.setLastError("Expected fetch_att"); + return res; + } + + c_in.fatt.push_back(ftmp); + + if ((res = expectSPACE()) == REJECT) + break; + else if (res == ERROR) + return ERROR; + } + + if ((res = expectThisString(")")) != ACCEPT) { + session.setLastError("Expected )"); + return res; + } + } else { + session.setLastError("Expected ALL, FULL, FAST, fetch_att or ("); + return res; + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF"); + return res; + } + + c_in.setName("FETCH"); + return ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult +FetchOperator::expectSectionText(BincImapParserFetchAtt &f_in) const +{ + Session &session = Session::getInstance(); + + Operator::ParseResult res; + if ((res = expectThisString("HEADER")) == ACCEPT) { + f_in.sectiontext = "HEADER"; + + if ((res = expectThisString(".FIELDS")) == ACCEPT) { + f_in.sectiontext += ".FIELDS"; + + if ((res = expectThisString(".NOT")) == ACCEPT) + f_in.sectiontext += ".NOT"; + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("expected SPACE"); + return res; + } + + if ((res = expectHeaderList(f_in)) != ACCEPT) { + session.setLastError("Expected header_list"); + return res; + } + } + } else if ((res = expectThisString("TEXT")) == ACCEPT) + f_in.sectiontext = "TEXT"; + else + return REJECT; + + return ACCEPT; + +} + +//---------------------------------------------------------------------- +Operator::ParseResult +FetchOperator::expectSection(BincImapParserFetchAtt &f_in) const +{ + Session &session = Session::getInstance(); + + Operator::ParseResult res; + if ((res = expectThisString("[")) != ACCEPT) + return REJECT; + + if ((res = expectSectionText(f_in)) != ACCEPT) { + unsigned int n; + if ((res = expectNZNumber(n)) == ACCEPT) { + + BincStream nstr; + + nstr << n; + + f_in.section = nstr.str(); + + bool gotadotalready = false; + while (1) { + if ((res = expectThisString(".")) != ACCEPT) + break; + + if ((res = expectNZNumber(n)) != ACCEPT) { + gotadotalready = true; + break; + } + + f_in.section += "."; + + BincStream nstr; + + nstr << n; + + f_in.section += nstr.str(); + } + + if (gotadotalready || (res = expectThisString(".")) == ACCEPT) { + if ((res = expectThisString("MIME")) == ACCEPT) { + f_in.sectiontext = "MIME"; + } else if ((res = expectSectionText(f_in)) != ACCEPT) { + session.setLastError("Expected MIME or section_text"); + return res; + } + } + } + } + + if ((res = expectThisString("]")) != ACCEPT) { + session.setLastError("Expected ]"); + return res; + } + + return ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult +FetchOperator::expectHeaderList(BincImapParserFetchAtt &f_in) const +{ + Session &session = Session::getInstance(); + + Operator::ParseResult res; + if ((res = expectThisString("(")) != ACCEPT) + return REJECT; + + string header_fld_name; + while (1) { + if ((res = expectAstring(header_fld_name)) != ACCEPT) { + session.setLastError("Expected header_fld_name"); + return res; + } + + f_in.headerlist.push_back(header_fld_name); + + if ((res = expectSPACE()) == ACCEPT) + continue; + else break; + } + + if ((res = expectThisString(")")) != ACCEPT) { + session.setLastError("Expected )"); + return res; + } + + return ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult +FetchOperator::expectOffset(BincImapParserFetchAtt &f_in) const +{ + Session &session = Session::getInstance(); + Operator::ParseResult res; + + if ((res = expectThisString("<")) != ACCEPT) + return REJECT; + + unsigned int i; + if ((res = expectNumber(i)) != ACCEPT) { + session.setLastError("Expected number"); + return res; + } + + if ((res = expectThisString(".")) != ACCEPT) { + session.setLastError("Expected ."); + return res; + } + + unsigned int j; + if ((res = expectNZNumber(j)) != ACCEPT) { + session.setLastError("expected nz_number"); + return res; + } + + if ((res = expectThisString(">")) != ACCEPT) { + session.setLastError("Expected >"); + return res; + } + + f_in.offsetstart = i; + f_in.offsetlength = j; + return ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult +FetchOperator::expectFetchAtt(BincImapParserFetchAtt &f_in) const +{ + Operator::ParseResult res; + + Session &session = Session::getInstance(); + + if ((res = expectThisString("ENVELOPE")) == ACCEPT) f_in.type = "ENVELOPE"; + else if ((res = expectThisString("FLAGS")) == ACCEPT) f_in.type = "FLAGS"; + else if ((res = expectThisString("INTERNALDATE")) == ACCEPT) + f_in.type = "INTERNALDATE"; + else if ((res = expectThisString("UID")) == ACCEPT) f_in.type = "UID"; + else if ((res = expectThisString("RFC822")) == ACCEPT) { + f_in.type = "RFC822"; + if ((res = expectThisString(".HEADER")) == ACCEPT) f_in.type += ".HEADER"; + else if ((res = expectThisString(".SIZE")) == ACCEPT) f_in.type += ".SIZE"; + else if ((res = expectThisString(".TEXT")) == ACCEPT) f_in.type += ".TEXT"; + else if ((res = expectThisString(".")) == ACCEPT) { + session.setLastError("Expected RFC822, RFC822.HEADER," + " RFC822.SIZE or RFC822.TEXT"); + return ERROR; + } + + } else if ((res = expectThisString("BODY")) == ACCEPT) { + f_in.type = "BODY"; + + if ((res = expectThisString("STRUCTURE")) == ACCEPT) f_in.type += "STRUCTURE"; + else if ((res = expectThisString(".PEEK")) == ACCEPT) f_in.type += ".PEEK"; + + if ((res = expectSection(f_in)) != ACCEPT) + f_in.hassection = false; + else { + f_in.hassection = true; + + if ((res = expectOffset(f_in)) == ERROR) + return ERROR; + } + } else + return REJECT; + + return ACCEPT; +} diff --git a/src/operator-list.cc b/src/operator-list.cc @@ -0,0 +1,272 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-list.cc + * + * Description: + * Implementation of the LIST command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <sys/types.h> +#include <dirent.h> +#include <sys/stat.h> + +#include <string> +#include <iostream> + +#include "io.h" + +#include "mailbox.h" + +#include "regmatch.h" +#include "convert.h" + +#include "recursivedescent.h" + +#include "session.h" +#include "depot.h" +#include "operators.h" + +using namespace ::std; +using namespace Binc; + +namespace { + const time_t LIST_CACHE_TIMEOUT = 10; +} + +//---------------------------------------------------------------------- +ListOperator::ListOperator(void) +{ + cacheTimeout = 0; +} + +//---------------------------------------------------------------------- +ListOperator::~ListOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string ListOperator::getName(void) const +{ + return "LIST"; +} + +//---------------------------------------------------------------------- +int ListOperator::getState(void) const +{ + return Session::AUTHENTICATED | Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult ListOperator::process(Depot &depot, + Request &command) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + const char delim = depot.getDelimiter(); + + // special case: if the mailbox argument is empty, then give a + // hard coded reply. + string wildcard; + if ((wildcard = command.getListMailbox()) == "") { + com << "* LIST (\\Noselect) \"" << delim << "\" \"\"" << endl; + return OK; + } + + // remove leading or trailing delimiter in wildcard + trim(wildcard, string(&delim, 1)); + + // convert wildcard to regular expression + const string &regex = toRegex(wildcard, depot.getDelimiter()); + + // remove leading or trailing delimiter in reference + string ref = command.getMailbox(); + trim(ref, string(&delim, 1)); + + // a map from mailbox name to flags + map<string, unsigned int> mailboxes; + + if (cacheTimeout == 0 || cacheTimeout < time(0) - LIST_CACHE_TIMEOUT + || session.mailboxchanges) { + session.mailboxchanges = false; + + // read through all entries in depository. + for (Depot::iterator i = depot.begin("."); i != depot.end(); ++i) { + const string path = *i; + const string mpath = depot.filenameToMailbox(path); + Mailbox *m = 0; + + // skip entries that are not identified as mailboxes + if ((m = depot.get(mpath)) == 0) + continue; + + // convert file name to mailbox name. skip it if there is no + // corresponding mailbox name. + string tmp = toCanonMailbox(depot.filenameToMailbox(path)); + trim(tmp, string(&delim, 1)); + if (tmp == "") continue; + else { + // inherit flags that were already set for this mailbox. + int flags = DIR_SELECT; + if (m->isMarked(path)) flags |= DIR_MARKED; + if (mailboxes.find(tmp) != mailboxes.end()) flags |= mailboxes[tmp]; + mailboxes[tmp] = flags; + } + + // now add all superior mailboxes with no flags set if not + // added already. + string::size_type pos = tmp.rfind(delim); + while (pos != string::npos) { + tmp = tmp.substr(0, pos); + trim(tmp, string(&delim, 1)); + + if (mailboxes.find(tmp) == mailboxes.end()) + mailboxes[tmp] = 0; + + pos = tmp.rfind(delim); + } + } + + // find leaf nodes O(N^2) + map<string, unsigned int>::iterator i; + for (i = mailboxes.begin(); i != mailboxes.end(); ++i) { + string mailbox = i->first; + mailbox += delim; + + bool leaf = true; + map<string, unsigned int>::const_iterator j = mailboxes.begin(); + for (; j != mailboxes.end(); ++j) { + string::size_type pos = j->first.rfind(delim); + if (pos == string::npos) continue; + + string base = j->first.substr(0, pos + 1); + + if (mailbox == base) { + leaf = false; + break; + } + } + + if (leaf) { + unsigned int flags = i->second; + flags |= DIR_LEAF; + i->second = flags; + } + } + + cache = mailboxes; + cacheTimeout = time(0); + } else { + mailboxes = cache; + cacheTimeout = time(0); + } + + // finally, print all mailbox entries with flags. + map<string, unsigned int>::iterator i = mailboxes.begin(); + for (; i != mailboxes.end(); ++i) { + if (ref == "" || ((ref.length() <= i->first.length()) + && (i->first.substr(0, ref.length()) == ref))) + if (regexMatch(i->first, regex) == 0) { + com << "* LIST ("; + string sep = ""; + + int flags = i->second; + bool noselect = false; + + if (!(flags & DIR_SELECT)) { + com << sep << "\\Noselect"; + sep = " "; + noselect = true; + } + + if (!noselect) { + if (flags & DIR_MARKED) + com << sep << "\\Marked"; + else + com << sep << "\\Unmarked"; + sep = " "; + } + + if (flags & DIR_NOINFERIORS) + com << sep << "\\Noinferiors"; + + com << ") \"" << depot.getDelimiter() << "\" " + << toImapString(i->first) << endl; + } + } + + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult ListOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after LIST"); + return res; + } + + string mailbox; + if ((res = expectMailbox(mailbox)) != ACCEPT) { + session.setLastError("Expected mailbox after LIST SPACE"); + return res; + } + + c_in.setMailbox(mailbox); + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after LIST SPACE mailbox"); + return res; + } + + string listmailbox; + if ((res = expectListMailbox(listmailbox)) != ACCEPT) { + session.setLastError("Expected list_mailbox after LIST SPACE" + " mailbox SPACE"); + return res; + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after LIST SPACE mailbox" + " SPACE list_mailbox"); + return res; + } + + c_in.setListMailbox(listmailbox); + c_in.setName("LIST"); + return ACCEPT; +} diff --git a/src/operator-login.cc b/src/operator-login.cc @@ -0,0 +1,170 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-login.cc + * + * Description: + * Implementation of the LOGIN command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <unistd.h> +#include <sys/types.h> +#include <signal.h> +#include <errno.h> + +#include <string> +#include <iostream> + +#include "recursivedescent.h" +#include "session.h" +#include "authenticate.h" + +#include "io.h" + +#include "depot.h" +#include "operators.h" + +using namespace ::std; +using namespace Binc; + + +//---------------------------------------------------------------------- +LoginOperator::LoginOperator(void) +{ +} + +//---------------------------------------------------------------------- +LoginOperator::~LoginOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string LoginOperator::getName(void) const +{ + return "LOGIN"; +} + +//---------------------------------------------------------------------- +int LoginOperator::getState(void) const +{ + return Session::NONAUTHENTICATED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult LoginOperator::process(Depot &depot, + Request &command) +{ + Session &session = Session::getInstance(); + IO &com = IOFactory::getInstance().get(1); + + const bool allowplain + = (session.globalconfig["Authentication"]["allow plain auth in non ssl"] == "yes"); + + if (!session.command.ssl && !allowplain && !getenv("ALLOWPLAIN")) { + session.setLastError("Plain text password authentication" + " is disallowed. Please try enabling SSL" + " or TLS in your mail client."); + return NO; + } + + putenv(strdup(("BINCIMAP_LOGIN=LOGIN+" + command.getTag()).c_str())); + + switch (authenticate(depot, command.getUserID(), command.getPassword())) { + case 1: + session.setLastError("An internal error occurred when you attempted" + " to log in to the IMAP server. Please contact" + " your system administrator."); + return NO; + case 2: + session.setLastError("Login failed. Either your user name" + " or your password was wrong. Please try again," + " and if the problem persists, please contact" + " your system administrator."); + return NO; + case 3: + com << "* BYE Timeout after " << session.idletimeout + << " seconds of inactivity." << endl; + break; + case -1: + com << "* BYE The server died unexpectedly. Please contact " + "your system administrator for more information." << endl; + break; + } + + // go to logout + session.setState(Session::LOGOUT); + + return NOTHING; +} + +//---------------------------------------------------------------------- +Operator::ParseResult LoginOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected single SPACE after LOGIN"); + return res; + } + + string userid; + if ((res = expectAstring(userid)) != ACCEPT) { + session.setLastError("Expected userid after LOGIN SPACE"); + return res; + } + + c_in.setUserID(userid); + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after LOGIN SPACE userid"); + return res; + } + + string password; + if ((res = expectAstring(password)) != ACCEPT) { + session.setLastError("Expected password after LOGIN " + "SPACE userid SPACE"); + return res; + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after password"); + return res; + } + + c_in.setPassword(password); + c_in.setName("LOGIN"); + return ACCEPT; +} diff --git a/src/operator-logout.cc b/src/operator-logout.cc @@ -0,0 +1,118 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-logout.cc + * + * Description: + * Implementation of the LOGOUT command + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> +#include <iostream> + +#include "io.h" + +#include "mailbox.h" +#include "recursivedescent.h" +#include "session.h" +#include "convert.h" + +#include "depot.h" +#include "operators.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +LogoutOperator::LogoutOperator(void) +{ +} + +//---------------------------------------------------------------------- +LogoutOperator::~LogoutOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string LogoutOperator::getName(void) const +{ + return "LOGOUT"; +} + +//---------------------------------------------------------------------- +int LogoutOperator::getState(void) const +{ + return Session::NONAUTHENTICATED + | Session::AUTHENTICATED + | Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult LogoutOperator::process(Depot &depot, + Request &command) +{ + IO &com = IOFactory::getInstance().get(1); + + com << "* BYE Binc IMAP shutting down" << endl; + com << command.getTag() << " OK LOGOUT completed" << endl; + com.flushContent(); + +#ifdef BINCIMAPD + Mailbox *mailbox = 0; + if ((mailbox = depot.getSelected()) != 0) { + mailbox->closeMailbox(); + delete mailbox; + } +#endif + + Session &session = Session::getInstance(); + session.setState(Session::LOGOUT); + + return NOTHING; +} + +//---------------------------------------------------------------------- +Operator::ParseResult LogoutOperator::parse(Request & c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF"); + return res; + } + + c_in.setName("LOGOUT"); + return ACCEPT; +} diff --git a/src/operator-lsub.cc b/src/operator-lsub.cc @@ -0,0 +1,266 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * bincimapd-lsub.cc + * + * Description: + * Implementation of the LSUB command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <algorithm> +#include <string> +#include <vector> +#include <iostream> + +#include "recursivedescent.h" + +#include "io.h" +#include "mailbox.h" +#include "convert.h" +#include "regmatch.h" + +#include "session.h" +#include "depot.h" +#include "operators.h" + +namespace { + const int DIR_SELECT = 0x01; + const int DIR_MARKED = 0x02; + const int DIR_NOINFERIORS = 0x04; +} + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +LsubOperator::LsubOperator(void) +{ +} + +//---------------------------------------------------------------------- +LsubOperator::~LsubOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string LsubOperator::getName(void) const +{ + return "LSUB"; +} + +//---------------------------------------------------------------------- +int LsubOperator::getState(void) const +{ + return Session::AUTHENTICATED | Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult LsubOperator::process(Depot &depot, + Request &command) +{ + Session &session = Session::getInstance(); + IO &com = IOFactory::getInstance().get(1); + const char delim = depot.getDelimiter(); + + // remove leading or trailing delimiter in wildcard + string wildcard = command.getListMailbox(); + trim(wildcard, string(&delim, 1)); + + // convert wildcard to regular expression + const string &regex = toRegex(wildcard, depot.getDelimiter()); + + // remove leading or trailing delimiter in reference + string ref = command.getMailbox(); + while (ref.length() > 1 && ref[0] == depot.getDelimiter()) + ref = ref.substr(1); + + // a multimap from mailbox name to flags + multimap<string, int> mailboxes; + + // read through all entries in depository. + for (Depot::iterator i = depot.begin("."); i != depot.end(); ++i) { + const string path = *i; + const string mpath = depot.filenameToMailbox(path); + Mailbox *m = 0; + + // skip entries that are not identified as mailboxes + if ((m = depot.get(mpath)) == 0) + continue; + + // convert file name to mailbox name. skip it if there is no + // corresponding mailbox name. + string tmp = toCanonMailbox(depot.filenameToMailbox(path)); + trim(tmp, string(&delim, 1)); + if (tmp == "") + continue; + else { + int flags = DIR_SELECT; + multimap<string, int>::iterator mi = mailboxes.find(tmp); + if (mi != mailboxes.end()) { + flags |= mi->second; + mailboxes.erase(mi); + } + + mailboxes.insert(make_pair(tmp, flags)); + } + + // now add all superior mailboxes with no flags set if not + // added already. + string::size_type pos = tmp.rfind(delim); + while (pos != string::npos) { + tmp = tmp.substr(0, pos); + trim(tmp, string(&delim, 1)); + + multimap<string, int>::iterator mi = mailboxes.find(tmp); + if (mi == mailboxes.end()) + mailboxes.insert(make_pair(tmp, 0)); + + pos = tmp.rfind(delim); + } + } + + // find leaf nodes O(N^2) + map<string, int>::iterator i; + for (i = mailboxes.begin(); i != mailboxes.end(); ++i) { + string mailbox = i->first; + mailbox += delim; + + bool leaf = true; + map<string, int>::const_iterator j; + for (j = mailboxes.begin(); j != mailboxes.end(); ++j) { + string::size_type pos = j->first.rfind(delim); + if (pos == string::npos) continue; + + string base = j->first.substr(0, pos + 1); + + if (mailbox == base) { + leaf = false; + break; + } + } + } + + session.loadSubscribes(); + + vector<string> &subscribed = session.subscribed; + sort(subscribed.begin(), subscribed.end()); + + // finally, print all mailbox entries with flags. + for (vector<string>::const_iterator j = subscribed.begin(); + j != subscribed.end(); ++j) { + if (ref != "" && (ref.length() > (*j).length() + || ((*j).substr(0, ref.length()) != ref))) + continue; + + if (regexMatch((*j).substr(ref.length()), regex) != 0) + continue; + + int flags = 0; + + for (i = mailboxes.begin(); i != mailboxes.end(); ++i) { + if (i->first == *j) { + flags = i->second; + break; + } + } + + com << "* LSUB ("; + string sep = ""; + + bool noselect = false; + if (!(flags & DIR_SELECT)) { + com << sep << "\\Noselect"; + sep = " "; + noselect = true; + } + + if (!noselect) { + if (flags & DIR_MARKED) + com << sep << "\\Marked"; + else + com << sep << "\\Unmarked"; + sep = " "; + } + + if (flags & DIR_NOINFERIORS) + com << sep << "\\Noinferiors"; + + com << ") \"" << depot.getDelimiter() << "\" " + << toImapString(*j) << endl; + } + + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult LsubOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after LSUB"); + return ERROR; + } + + string mailbox; + if ((res = expectMailbox(mailbox)) != ACCEPT) { + session.setLastError("Expected mailbox after LSUB SPACE"); + return ERROR; + } + + c_in.setMailbox(mailbox); + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after LSUB SPACE mailbox"); + return ERROR; + } + + string listmailbox; + if ((res = expectListMailbox(listmailbox)) != ACCEPT) { + session.setLastError("Expected list_mailbox after LSUB SPACE" + " mailbox SPACE"); + return ERROR; + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after LSUB SPACE" + " mailbox SPACE list_mailbox"); + return ERROR; + } + + c_in.setListMailbox(listmailbox); + c_in.setName("LSUB"); + return ACCEPT; +} diff --git a/src/operator-noop-pending.cc b/src/operator-noop-pending.cc @@ -0,0 +1,82 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-noop-pending.cc + * + * Description: + * Operator for the NOOP command, with pending extension + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> +#include <iostream> + +#include "mailbox.h" +#include "pendingupdates.h" +#include "io.h" + +#include "recursivedescent.h" +#include "session.h" +#include "depot.h" +#include "operators.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +NoopPendingOperator::NoopPendingOperator(void) : NoopOperator() +{ +} + +//---------------------------------------------------------------------- +NoopPendingOperator::~NoopPendingOperator(void) +{ +} + +//---------------------------------------------------------------------- +Operator::ProcessResult NoopPendingOperator::process(Depot &depot, + Request &command) +{ + Mailbox *mailbox = depot.getSelected(); + if (!pendingUpdates(mailbox, + PendingUpdates::EXPUNGE + | PendingUpdates::EXISTS + | PendingUpdates::RECENT + | PendingUpdates::FLAGS, true)) { + Session &session = Session::getInstance(); + IO &com = IOFactory::getInstance().get(1); + IO &logger = IOFactory::getInstance().get(2); + com << "* BYE " << session.getLastError() << endl; + logger << "when scanning mailbox: " + << session.getLastError() << endl; + } + + return OK; +} diff --git a/src/operator-noop.cc b/src/operator-noop.cc @@ -0,0 +1,98 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-noop.cc + * + * Description: + * Operator for the NOOP command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> +#include <iostream> + +#include "io.h" + +#include "recursivedescent.h" +#include "session.h" +#include "depot.h" +#include "operators.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +NoopOperator::NoopOperator(void) +{ +} + +//---------------------------------------------------------------------- +NoopOperator::~NoopOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string NoopOperator::getName(void) const +{ + return "NOOP"; +} + +//---------------------------------------------------------------------- +int NoopOperator::getState(void) const +{ + return Session::NONAUTHENTICATED + | Session::AUTHENTICATED + | Session::SELECTED; +} + +//---------------------------------------------------------------------- +Operator::ProcessResult NoopOperator::process(Depot &depot, + Request &command) +{ + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult NoopOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after NOOP"); + return res; + } + + c_in.setName("NOOP"); + return ACCEPT; +} diff --git a/src/operator-rename.cc b/src/operator-rename.cc @@ -0,0 +1,155 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-rename.cc + * + * Description: + * Implementation of the RENAME command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> +#include <iostream> + +#include <dirent.h> +#include <sys/stat.h> +#include <sys/types.h> + +#include "mailbox.h" +#include "io.h" +#include "storage.h" +#include "convert.h" + +#include "recursivedescent.h" + +#include "session.h" +#include "depot.h" +#include "operators.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +RenameOperator::RenameOperator(void) +{ +} + +//---------------------------------------------------------------------- +RenameOperator::~RenameOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string RenameOperator::getName(void) const +{ + return "RENAME"; +} + +//---------------------------------------------------------------------- +int RenameOperator::getState(void) const +{ + return Session::AUTHENTICATED | Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult RenameOperator::process(Depot &depot, + Request &command) +{ + Session &session = Session::getInstance(); + + const string &srcmailbox = command.getMailbox(); + const string &canonmailbox = toCanonMailbox(srcmailbox); + const string &canondestmailbox = toCanonMailbox(command.getNewMailbox()); + + // renaming INBOX should actually create the destination mailbox, + // move over all the messages and then leave INBOX empty. + if (canonmailbox == "INBOX") { + session.setLastError("Sorry, renaming INBOX is not yet supported" + " by this IMAP server. Try copying the messages" + " instead"); + return NO; + } + + if (canondestmailbox == "INBOX") { + session.setLastError("It is not allowed to rename a mailbox to INBOX"); + return NO; + } + + if (depot.renameMailbox(canonmailbox, canondestmailbox)) + return OK; + else + return NO; +} + +//---------------------------------------------------------------------- +Operator::ParseResult RenameOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after RENAME"); + return res; + } + + string mailbox; + if ((res = expectMailbox(mailbox)) != ACCEPT) { + session.setLastError("Expected mailbox after RENAME SPACE"); + return res; + } + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after RENAME SPACE mailbox"); + return res; + } + + string newmailbox; + if ((res = expectMailbox(newmailbox)) != ACCEPT) { + session.setLastError("Expected mailbox after RENAME SPACE" + " mailbox SPACE"); + return res; + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after RENAME SPACE" + " mailbox SPACE mailbox"); + return res; + } + + session.mailboxchanges = true; + + c_in.setName("RENAME"); + c_in.setMailbox(mailbox); + c_in.setNewMailbox(newmailbox); + return ACCEPT; +} diff --git a/src/operator-search.cc b/src/operator-search.cc @@ -0,0 +1,954 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-search.cc + * + * Description: + * Implementation of the SEARCH command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> +#include <iostream> +#include <algorithm> + +#include <ctype.h> + +#include "imapparser.h" +#include "mailbox.h" +#include "mime.h" +#include "io.h" +#include "convert.h" + +#include "recursivedescent.h" + +#include "session.h" +#include "depot.h" +#include "operators.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +bool SearchOperator::SearchNode::convertDate(const string &date, + time_t &t, + const string &delim) +{ + vector<string> parts; + split(date, delim, parts); + if (parts.size() < 3) return false; + + struct tm mold; + memset((char *) &mold, 0, sizeof(struct tm)); + mold.tm_mday = atoi(parts[0].c_str()); + mold.tm_year = atoi(parts[2].c_str()) - 1900; + + // accept mixed case months. this is more than the standard + // accepts. + string month = parts[1]; + lowercase(month); + + if (month == "jan") mold.tm_mon = 0; + else if (month == "feb") mold.tm_mon = 1; + else if (month == "mar") mold.tm_mon = 2; + else if (month == "apr") mold.tm_mon = 3; + else if (month == "may") mold.tm_mon = 4; + else if (month == "jun") mold.tm_mon = 5; + else if (month == "jul") mold.tm_mon = 6; + else if (month == "aug") mold.tm_mon = 7; + else if (month == "sep") mold.tm_mon = 8; + else if (month == "oct") mold.tm_mon = 9; + else if (month == "nov") mold.tm_mon = 10; + else if (month == "dec") mold.tm_mon = 11; + + t = mktime(&mold); + return true; +} + +//---------------------------------------------------------------------- +bool SearchOperator::SearchNode::convertDateHeader(const string &d_in, + time_t &t) +{ + string date = d_in; + string::size_type n = date.find(','); + if (n != string::npos) + date = date.substr(n + 1); + trim(date); + + bool result = convertDate(date, t, " "); + return result; +} + +//---------------------------------------------------------------------- +SearchOperator::SearchNode::SearchNode(void) +{ +} + +//---------------------------------------------------------------------- +SearchOperator::SearchNode::SearchNode(const BincImapParserSearchKey &a) +{ + init(a); +} + +//---------------------------------------------------------------------- +int SearchOperator::SearchNode::getType(void) const +{ + return type; +} + +//---------------------------------------------------------------------- +bool SearchOperator::SearchNode::match(Mailbox *mailbox, + Message *m, + unsigned int seqnr, + unsigned int lastmessage, + unsigned int lastuid) const +{ + HeaderItem hitem; + string tmp; + + switch (type) { + //-------------------------------------------------------------------- + case S_ALL: + return true; + //-------------------------------------------------------------------- + case S_ANSWERED: + return (m->getStdFlags() & Message::F_ANSWERED); + //-------------------------------------------------------------------- + case S_BCC: + return m->headerContains("bcc", astring); + //-------------------------------------------------------------------- + case S_BEFORE: { + time_t mtime = m->getInternalDate(); + struct tm *mtime_ = localtime(&mtime); + mtime_->tm_sec = 0; + mtime_->tm_min = 0; + mtime_->tm_hour = 0; + mtime_->tm_wday = 0; + mtime_->tm_yday = 0; + mtime_->tm_isdst = 0; + mtime = mktime(mtime_); + + time_t atime; + if (!convertDate(date, atime)) { + IO &logger = IOFactory::getInstance().get(2); + + logger << "warning, unable to convert " << date << + " to a time_t" << endl; + return false; + } + + return mtime < atime; + } //-------------------------------------------------------------------- + case S_BODY: + return m->bodyContains(astring); + //-------------------------------------------------------------------- + case S_CC: + return m->headerContains("cc", astring); + //-------------------------------------------------------------------- + case S_DELETED: + return (m->getStdFlags() & Message::F_DELETED); + //-------------------------------------------------------------------- + case S_FLAGGED: + return (m->getStdFlags() & Message::F_FLAGGED); + //-------------------------------------------------------------------- + case S_FROM: + return m->headerContains("from", astring); + //-------------------------------------------------------------------- + case S_KEYWORD: + // the server does not support keywords + return false; + //-------------------------------------------------------------------- + case S_NEW: + return (m->getStdFlags() & Message::F_RECENT) + && !(m->getStdFlags() & Message::F_SEEN); + //-------------------------------------------------------------------- + case S_OLD: + return !(m->getStdFlags() & Message::F_RECENT); + //-------------------------------------------------------------------- + case S_ON: { + time_t mtime = m->getInternalDate(); + struct tm *mtime_ = localtime(&mtime); + mtime_->tm_sec = 0; + mtime_->tm_min = 0; + mtime_->tm_hour = 0; + mtime_->tm_wday = 0; + mtime_->tm_yday = 0; + mtime_->tm_isdst = 0; + mtime = mktime(mtime_); + + time_t atime; + if (!convertDate(date, atime)) { + IO &logger = IOFactory::getInstance().get(2); + + logger << "warning, unable to convert " << date << + " to a time_t" << endl; + return false; + } + + return mtime == atime; + } //-------------------------------------------------------------------- + case S_RECENT: + return (m->getStdFlags() & Message::F_RECENT); + //-------------------------------------------------------------------- + case S_SEEN: + return (m->getStdFlags() & Message::F_SEEN); + //-------------------------------------------------------------------- + case S_SINCE: { + time_t mtime = m->getInternalDate(); + struct tm *mtime_ = localtime(&mtime); + mtime_->tm_sec = 0; + mtime_->tm_min = 0; + mtime_->tm_hour = 0; + mtime_->tm_wday = 0; + mtime_->tm_yday = 0; + mtime_->tm_isdst = 0; + mtime = mktime(mtime_); + + time_t atime; + if (!convertDate(date, atime)) { + IO &logger = IOFactory::getInstance().get(2); + + logger << "warning, unable to convert " << date << + " to a time_t" << endl; + return false; + } + + return mtime >= atime; + } //-------------------------------------------------------------------- + case S_SUBJECT: + return m->headerContains("subject", astring); + //-------------------------------------------------------------------- + case S_TEXT: + return m->textContains(astring); + //-------------------------------------------------------------------- + case S_TO: + return m->headerContains("to", astring); + //-------------------------------------------------------------------- + case S_UNANSWERED: + return !(m->getStdFlags() & Message::F_ANSWERED); + //-------------------------------------------------------------------- + case S_UNDELETED: + return !(m->getStdFlags() & Message::F_DELETED); + //-------------------------------------------------------------------- + case S_UNFLAGGED: + return !(m->getStdFlags() & Message::F_FLAGGED); + //-------------------------------------------------------------------- + case S_UNKEYWORD: + // the server does not support keywords + return true; + //-------------------------------------------------------------------- + case S_UNSEEN: + return !(m->getStdFlags() & Message::F_SEEN); + //-------------------------------------------------------------------- + case S_DRAFT: + return (m->getStdFlags() & Message::F_DRAFT); + //-------------------------------------------------------------------- + case S_HEADER: + return m->headerContains(astring, bstring); + //-------------------------------------------------------------------- + case S_LARGER: { + return (m->getSize(true) > number); + } + //-------------------------------------------------------------------- + case S_NOT: + for (vector<SearchNode>::const_iterator i = children.begin(); + i != children.end(); ++i) + if ((*i).match(mailbox, m, seqnr, lastmessage, lastuid)) + return false; + return true; + //-------------------------------------------------------------------- + case S_OR: + for (vector<SearchNode>::const_iterator i = children.begin(); + i != children.end(); ++i) + if ((*i).match(mailbox, m, seqnr, lastmessage, lastuid)) + return true; + return false; + //-------------------------------------------------------------------- + case S_SENTBEFORE: { + string tmp = m->getHeader("date"); + if (tmp == "") + return false; + + lowercase(tmp); + + time_t mtime; + if (!convertDateHeader(tmp, mtime)) + return false; + + if (mtime == (time_t) -1) + return false; + + time_t atime; + if (!convertDate(date, atime)) { + IO &logger = IOFactory::getInstance().get(2); + + logger << "warning, unable to convert " << date << + " to a time_t" << endl; + return false; + } + + return mtime < atime; + } //-------------------------------------------------------------------- + case S_SENTON: { + string tmp = m->getHeader("date"); + if (tmp == "") + return false; + + lowercase(tmp); + + time_t mtime; + if (!convertDateHeader(tmp, mtime)) + return false; + + if (mtime == (time_t) -1) + return false; + + time_t atime; + if (!convertDate(date, atime)) { + IO &logger = IOFactory::getInstance().get(2); + + logger << "warning, unable to convert " << date << + " to a time_t" << endl; + return false; + } + + return mtime == atime; + } //-------------------------------------------------------------------- + case S_SENTSINCE: { + string tmp = m->getHeader("date"); + if (tmp == "") + return false; + + lowercase(tmp); + + time_t mtime; + if (!convertDateHeader(tmp, mtime)) + return false; + + if (mtime == (time_t) -1) + return false; + + time_t atime; + if (!convertDate(date, atime)) { + IO &logger = IOFactory::getInstance().get(2); + + logger << "warning, unable to convert " << date << + " to a time_t" << endl; + return false; + } + + return mtime >= atime; + } //-------------------------------------------------------------------- + case S_SMALLER: + return (m->getSize(true) < number); + //-------------------------------------------------------------------- + case S_UID: + if (!bset->isInSet(m->getUID())) + if (!(m->getUID() == lastuid && !bset->isLimited())) + return false; + return true; + //-------------------------------------------------------------------- + case S_UNDRAFT: + return !(m->getStdFlags() & Message::F_DRAFT); + //-------------------------------------------------------------------- + case S_SET: + if (!bset->isInSet(seqnr)) + if (!(seqnr == lastmessage && !bset->isLimited())) + return false; + return true; + //-------------------------------------------------------------------- + case S_AND: + for (vector<SearchNode>::const_iterator i = children.begin(); + i != children.end(); ++i) + if (!(*i).match(mailbox, m, seqnr, lastmessage, lastuid)) + return false; + return true; + } + + return false; +} + +//---------------------------------------------------------------------- +void SearchOperator::SearchNode::init(const BincImapParserSearchKey &a) +{ + astring = a.astring; + bstring = a.bstring; + date = a.date; + number = a.number; + uppercase(astring); + uppercase(bstring); + uppercase(date); + + if (a.name == "ALL") { type = S_ALL; weight = 1; } + else if (a.name == "ANSWERED") { type = S_ANSWERED; weight = 1; } + else if (a.name == "BCC") { type = S_BCC; weight = 2; } + else if (a.name == "BEFORE") { type = S_BEFORE; weight = 2; } + else if (a.name == "BODY") { type = S_BODY; weight = 1; } + else if (a.name == "CC") { type = S_CC; weight = 2; } + else if (a.name == "DELETED") { type = S_DELETED; weight = 1; } + else if (a.name == "FLAGGED") { type = S_FLAGGED; weight = 1; } + else if (a.name == "FROM") { type = S_FROM; weight = 2; } + else if (a.name == "KEYWORD") { type = S_KEYWORD; weight = 3; } + else if (a.name == "NEW") { type = S_NEW; weight = 1; } + else if (a.name == "OLD") { type = S_OLD; weight = 1; } + else if (a.name == "ON") { type = S_ON; weight = 1; } + else if (a.name == "RECENT") { type = S_RECENT; weight = 1; } + else if (a.name == "SEEN") { type = S_SEEN; weight = 1; } + else if (a.name == "SINCE") { type = S_SINCE; weight = 1; } + else if (a.name == "SUBJECT") { type = S_SUBJECT; weight = 2; } + else if (a.name == "TEXT") { type = S_TEXT; weight = 4; } + else if (a.name == "TO") { type = S_TO; weight = 2; } + else if (a.name == "UNANSWERED") { type = S_UNANSWERED; weight = 1; } + else if (a.name == "UNDELETED") { type = S_UNDELETED; weight = 1; } + else if (a.name == "UNFLAGGED") { type = S_UNFLAGGED; weight = 1; } + else if (a.name == "UNKEYWORD") { type = S_UNKEYWORD; weight = 1; } + else if (a.name == "UNSEEN") { type = S_UNSEEN; weight = 1; } + else if (a.name == "DRAFT") { type = S_DRAFT; weight = 1; } + else if (a.name == "HEADER") { type = S_HEADER; weight = 3; } + else if (a.name == "LARGER") { type = S_LARGER; weight = 4; } + else if (a.name == "NOT") { + // ******* NOT + type = S_NOT; + weight = 1; + + vector<BincImapParserSearchKey>::const_iterator i = a.children.begin(); + while (i != a.children.end()) { + SearchNode b(*i); + weight += b.getWeight(); + children.push_back(b); + ++i; + } + + } else if (a.name == "OR") { + // ******* OR + type = S_OR; + weight = 0; + + vector<BincImapParserSearchKey>::const_iterator i = a.children.begin(); + while (i != a.children.end()) { + SearchNode b(*i); + weight += b.getWeight(); + + children.push_back(b); + ++i; + } + + } else if (a.name == "SENTBEFORE") { type = S_SENTBEFORE; weight = 1; } + else if (a.name == "SENTON") { type = S_SENTON; weight = 1; } + else if (a.name == "SENTSINCE") { type = S_SENTSINCE; weight = 1; } + else if (a.name == "SMALLER") { type = S_SMALLER; weight = 4; } + else if (a.name == "UID") { + bset = &a.getSet(); + type = S_UID; + weight = 1; + } else if (a.name == "UNDRAFT") { type = S_UNDRAFT; weight = 1; } + else if (a.type == BincImapParserSearchKey::KEY_SET) { + bset = &a.getSet(); + type = S_SET; + weight = 1; + } else if (a.type == BincImapParserSearchKey::KEY_AND) { + // ******* AND + type = S_AND; + weight = 0; + + vector<BincImapParserSearchKey>::const_iterator i = a.children.begin(); + while (i != a.children.end()) { + SearchNode b(*i); + weight += b.getWeight(); + children.push_back(b); + ++i; + } + } +} + +//---------------------------------------------------------------------- +int SearchOperator::SearchNode::getWeight(void) const +{ + return weight; +} + +//---------------------------------------------------------------------- +void SearchOperator::SearchNode::setWeight(int i) +{ + weight = i; +} + +//---------------------------------------------------------------------- +void SearchOperator::SearchNode::order(void) +{ + for (vector<SearchNode>::iterator i = children.begin(); + i != children.end(); ++i) + (*i).order(); + ::stable_sort(children.begin(), children.end(), compareNodes); +} + +//---------------------------------------------------------------------- +SearchOperator::SearchOperator(void) +{ +} + +//---------------------------------------------------------------------- +SearchOperator::~SearchOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string SearchOperator::getName(void) const +{ + return "SEARCH"; +} + +//---------------------------------------------------------------------- +int SearchOperator::getState(void) const +{ + return Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult SearchOperator::process(Depot &depot, + Request &command) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + Mailbox *mailbox = depot.getSelected(); + + if (command.getCharSet() != "" && command.getCharSet() != "US-ASCII") { + session.setLastError("[BADCHARSET (\"US-ASCII\")]"); + return NO; + } + + com << "* SEARCH"; + + SearchNode s(command.searchkey); + s.order(); + + const unsigned int maxsqnr = mailbox->getMaxSqnr(); + const unsigned int maxuid = mailbox->getMaxUid(); + + Mailbox::iterator i + = mailbox->begin(SequenceSet::all(), Mailbox::SKIP_EXPUNGED); + for (; i != mailbox->end(); ++i) { + Message &message = *i; + + if (s.match(mailbox, &message, i.getSqnr(), maxsqnr, maxuid)) { + com << " " << (command.getUidMode() ? message.getUID() : i.getSqnr()); + com.flushContent(); + } + + message.close(); + } + + com << endl; + return OK; +} + +//------------------------------------------------------------------------ +Operator::ParseResult SearchOperator::parse(Request & c_in) const +{ + Session &session = Session::getInstance(); + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectThisString("CHARSET")) == ACCEPT) { + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after CHARSET"); + return res; + } + + string charset; + if ((res = expectAstring(charset)) != ACCEPT) { + session.setLastError("Expected astring after CHARSET SPACE"); + return res; + } + + c_in.setCharSet(charset); + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after CHARSET SPACE astring"); + return res; + } + } + + BincImapParserSearchKey b; + if ((res = expectSearchKey(b)) != ACCEPT) { + session.setLastError("Expected search_key"); + return res; + } + + c_in.searchkey.type = BincImapParserSearchKey::KEY_AND; + c_in.searchkey.children.push_back(b); + + while (1) { + if ((res = expectSPACE()) != ACCEPT) + break; + + BincImapParserSearchKey c; + if ((res = expectSearchKey(c)) != ACCEPT) { + session.setLastError("Expected search_key after search_key SPACE"); + return res; + } + + c_in.searchkey.children.push_back(c); + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after search_key"); + return res; + } + + c_in.setName("SEARCH"); + return ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult +SearchOperator::expectSearchKey(BincImapParserSearchKey &s_in) const +{ + Session &session = Session::getInstance(); + Operator::ParseResult res; + + s_in.type = BincImapParserSearchKey::KEY_OTHER; + if ((res = expectThisString("ALL")) == ACCEPT) s_in.name = "ALL"; + else if ((res = expectThisString("ANSWERED")) == ACCEPT) s_in.name = "ANSWERED"; + else if ((res = expectThisString("BCC")) == ACCEPT) { + s_in.name = "BCC"; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectAstring(s_in.astring)) != ACCEPT) { + session.setLastError("Expected astring"); + return res; + } + } else if ((res = expectThisString("BEFORE")) == ACCEPT) { + s_in.name = "BEFORE"; + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectDate(s_in.date)) != ACCEPT) { + session.setLastError("Expected date"); + return res; + } + } else if ((res = expectThisString("BODY")) == ACCEPT) { + s_in.name = "BODY"; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectAstring(s_in.astring)) != ACCEPT) { + session.setLastError("Expected astring"); + return res; + } + } else if ((res = expectThisString("CC")) == ACCEPT) { + s_in.name = "CC"; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectAstring(s_in.astring)) != ACCEPT) { + session.setLastError("Expected astring"); + return res; + } + } else if ((res = expectThisString("DELETED")) == ACCEPT) s_in.name = "DELETED"; + else if ((res = expectThisString("FLAGGED")) == ACCEPT) s_in.name = "FLAGGED"; + else if ((res = expectThisString("FROM")) == ACCEPT) { + s_in.name = "FROM"; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectAstring(s_in.astring)) != ACCEPT) { + session.setLastError("Expected astring"); + return res; + } + } else if ((res = expectThisString("KEYWORD")) == ACCEPT) { + s_in.name = "KEYWORD"; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectAtom(s_in.astring)) != ACCEPT) { + session.setLastError("Expected flag_keyword"); + return res; + } + } else if ((res = expectThisString("NEW")) == ACCEPT) s_in.name = "NEW"; + else if ((res = expectThisString("OLD")) == ACCEPT) s_in.name = "OLD"; + else if ((res = expectThisString("ON")) == ACCEPT) { + s_in.name = "ON"; + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectDate(s_in.date)) != ACCEPT) { + session.setLastError("Expected date"); + return res; + } + } else if ((res = expectThisString("RECENT")) == ACCEPT) s_in.name = "RECENT"; + else if ((res = expectThisString("SEEN")) == ACCEPT) s_in.name = "SEEN"; + else if ((res = expectThisString("SINCE")) == ACCEPT) { + s_in.name = "SINCE"; + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectDate(s_in.date)) != ACCEPT) { + session.setLastError("Expected date"); + return res; + } + } else if ((res = expectThisString("SUBJECT")) == ACCEPT) { + s_in.name = "SUBJECT"; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectAstring(s_in.astring)) != ACCEPT) { + session.setLastError("Expected astring"); + return res; + } + } else if ((res = expectThisString("TEXT")) == ACCEPT) { + s_in.name = "TEXT"; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectAstring(s_in.astring)) != ACCEPT) { + session.setLastError("Expected astring"); + return res; + } + } else if ((res = expectThisString("TO")) == ACCEPT) { + s_in.name = "TO"; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectAstring(s_in.astring)) != ACCEPT) { + session.setLastError("Expected astring"); + return res; + } + } else if ((res = expectThisString("UNANSWERED")) == ACCEPT) + s_in.name = "UNANSWERED"; + else if ((res = expectThisString("UNDELETED")) == ACCEPT) s_in.name = "UNDELETED"; + else if ((res = expectThisString("UNFLAGGED")) == ACCEPT) s_in.name = "UNFLAGGED"; + else if ((res = expectThisString("UNKEYWORD")) == ACCEPT) { + s_in.name = "UNKEYWORD"; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectAtom(s_in.astring)) != ACCEPT) { + session.setLastError("Expected flag_keyword"); + return res; + } + } else if ((res = expectThisString("UNSEEN")) == ACCEPT) s_in.name = "UNSEEN"; + else if ((res = expectThisString("DRAFT")) == ACCEPT) s_in.name = "DRAFT"; + else if ((res = expectThisString("HEADER")) == ACCEPT) { + s_in.name = "HEADER"; + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectAstring(s_in.astring)) != ACCEPT) { + session.setLastError("Expected astring"); + return res; + } + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectAstring(s_in.bstring)) != ACCEPT) { + session.setLastError("Expected astring"); + return res; + } + } else if ((res = expectThisString("LARGER")) == ACCEPT) { + s_in.name = "LARGER"; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectNumber(s_in.number)) != ACCEPT) { + session.setLastError("Expected number"); + return res; + } + } else if ((res = expectThisString("NOT")) == ACCEPT) { + s_in.name = "NOT"; + s_in.type = BincImapParserSearchKey::KEY_NOT; + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + BincImapParserSearchKey s; + if ((res = expectSearchKey(s)) != ACCEPT) { + session.setLastError("Expected search_key"); + return res; + } + s_in.children.push_back(s); + } else if ((res = expectThisString("OR")) == ACCEPT) { + s_in.name = "OR"; + s_in.type = BincImapParserSearchKey::KEY_OR; + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + BincImapParserSearchKey s; + if ((res = expectSearchKey(s)) != ACCEPT) { + session.setLastError("Expected search_key"); + return res; + } + s_in.children.push_back(s); + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + BincImapParserSearchKey t; + if ((res = expectSearchKey(t)) != ACCEPT) { + session.setLastError("Expected search_key"); + return res; + } + s_in.children.push_back(t); + } else if ((res = expectThisString("SENTBEFORE")) == ACCEPT) { + s_in.name = "SENTBEFORE"; + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectDate(s_in.date)) != ACCEPT) { + session.setLastError("Expected date"); + return res; + } + } else if ((res = expectThisString("SENTON")) == ACCEPT) { + s_in.name = "SENTON"; + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectDate(s_in.date)) != ACCEPT) { + session.setLastError("Expected date"); + return res; + } + + } else if ((res = expectThisString("SENTSINCE")) == ACCEPT) { + s_in.name = "SENTSINCE"; + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectDate(s_in.date)) != ACCEPT) { + session.setLastError("Expected date"); + return res; + } + } else if ((res = expectThisString("SMALLER")) == ACCEPT) { + s_in.name = "SMALLER"; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectNumber(s_in.number)) != ACCEPT) { + session.setLastError("Expected number"); + return res; + } + } else if ((res = expectThisString("UID")) == ACCEPT) { + s_in.name = "UID"; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectSet(s_in.bset)) != ACCEPT) { + session.setLastError("Expected number"); + return res; + } + } else if ((res = expectThisString("UNDRAFT")) == ACCEPT) s_in.name = "UNDRAFT"; + else if ((res = expectSet(s_in.bset)) == ACCEPT) { + s_in.name = ""; + s_in.type = BincImapParserSearchKey::KEY_SET; + } else if ((res = expectThisString("(")) == ACCEPT) { + s_in.type = BincImapParserSearchKey::KEY_AND; + + while (1) { + BincImapParserSearchKey c; + if ((res = expectSearchKey(c)) != ACCEPT) { + session.setLastError("Expected search_key"); + return res; + } + + s_in.children.push_back(c); + + if ((res = expectSPACE()) != ACCEPT) + break; + } + + if ((res = expectThisString(")")) != ACCEPT) { + session.setLastError("Expected )"); + return res; + } + } else + return REJECT; + + return ACCEPT; +} diff --git a/src/operator-select.cc b/src/operator-select.cc @@ -0,0 +1,190 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-select.cc + * + * Description: + * Implementation of the SELECT command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#include <string> + +#include "depot.h" +#include "io.h" +#include "mailbox.h" +#include "operators.h" +#include "recursivedescent.h" +#include "storage.h" +#include "pendingupdates.h" +#include "session.h" +#include "convert.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +SelectOperator::SelectOperator(void) +{ +} + +//---------------------------------------------------------------------- +SelectOperator::~SelectOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string SelectOperator::getName(void) const +{ + return "SELECT"; +} + +//---------------------------------------------------------------------- +int SelectOperator::getState(void) const +{ + return Session::NONAUTHENTICATED + | Session::AUTHENTICATED + | Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult SelectOperator::process(Depot &depot, + Request &command) +{ + Session &session = Session::getInstance(); + IO &com = IOFactory::getInstance().get(1); + IO &logger = IOFactory::getInstance().get(2); + + const bool examine = (command.getName() == "EXAMINE"); + + const string &srcmailbox = command.getMailbox(); + const string &canonmailbox = toCanonMailbox(srcmailbox); + + Mailbox *mailbox = depot.getSelected(); + if (mailbox != 0) { + mailbox->closeMailbox(); + mailbox = 0; + } + + mailbox = depot.get(canonmailbox); + if (mailbox == 0) { + session.setLastError(depot.getLastError()); + return NO; + } + + if (!mailbox->selectMailbox(canonmailbox, + depot.mailboxToFilename(canonmailbox))) { + logger << "selecting mailbox failed" << endl; + session.setLastError(mailbox->getLastError()); + return NO; + } + + // find first unseen + int unseen = -1; + Mailbox::iterator i + = mailbox->begin(SequenceSet::all(), Mailbox::SKIP_EXPUNGED | Mailbox::SQNR_MODE); + for (; i != mailbox->end(); ++i) { + Message &message = *i; + + if (unseen == -1 && ((message.getStdFlags() & Message::F_SEEN) == 0)) { + unseen = i.getSqnr(); + break; + } + } + + // show pending updates with only exists and recent response. do not + // re-scan. + pendingUpdates(mailbox, PendingUpdates::EXISTS + | PendingUpdates::RECENT, + false); + + // unseen + if (unseen != -1) + com << "*" << " OK [UNSEEN " << unseen << "] Message " + << unseen << " is first unseen" << endl; + + // uidvalidity + com << "*" << " OK [UIDVALIDITY " << mailbox->getUidValidity() << "]" + << endl; + + // uidnext + com << "*" << " OK [UIDNEXT " << toString(mailbox->getUidNext()) << "] " + << toString(mailbox->getUidNext()) << " is the next UID" << endl; + + // flags + com << "*" + << " FLAGS (\\Answered \\Flagged \\Deleted \\Recent \\Seen \\Draft)" + << endl; + + // permanentflags + com << "*" + << " OK [PERMANENTFLAGS (\\Answered \\Flagged \\Deleted " + << "\\Seen \\Draft)] Limited" + << endl; + + session.setState(Session::SELECTED); + depot.setSelected(mailbox); + + if (examine) + mailbox->setReadOnly(); + + logger.setLogPrefix(session.getUserID() + "@" + session.getIP() + + ":" + srcmailbox); + + session.setLastError(examine ? "[READ-ONLY]" : "[READ-WRITE]"); + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult SelectOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE after" + c_in.getName()); + return res; + } + + string mailbox; + if ((res = expectMailbox(mailbox)) != ACCEPT) { + session.setLastError("Expected mailbox after " + c_in.getName() + + " SPACE"); + return res; + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF after " + c_in.getName() + + " SPACE mailbox"); + return res; + } + + c_in.setMailbox(mailbox); + return ACCEPT; +} diff --git a/src/operator-starttls.cc b/src/operator-starttls.cc @@ -0,0 +1,129 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-starttls.cc + * + * Description: + * Implementation of the STARTTLS command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef WITH_SSL + +#include <string> +#include <iostream> + +#include "recursivedescent.h" +#include "io.h" +#include "io-ssl.h" +#include "session.h" +#include "depot.h" +#include "operators.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +StarttlsOperator::StarttlsOperator(void) +{ +} + +//---------------------------------------------------------------------- +StarttlsOperator::~StarttlsOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string StarttlsOperator::getName(void) const +{ + return "STARTTLS"; +} + +//---------------------------------------------------------------------- +int StarttlsOperator::getState(void) const +{ + return Session::NONAUTHENTICATED + | Session::AUTHENTICATED + | Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult StarttlsOperator::process(Depot &depot, + Request &command) +{ + Session &session = Session::getInstance(); + IO &com = IOFactory::getInstance().get(1); + + if (session["sslmode"] != "") { + session.setLastError("Already in TLS mode"); + return BAD; + } + + com << command.getTag() + << " OK STARTTLS completed, begin TLS negotiation now" << endl; + com.flushContent(); + com.flushOnEndl(); + + SSLEnabledIO *sslcom; + sslcom = dynamic_cast<SSLEnabledIO *>(&IOFactory::getInstance().get(1)); + if (!sslcom) { + // Can this ever happen? + session.setLastError("An internal error occurred when" + " entering SSL mode. "); + return NO; + } else { + if (!sslcom->setModeSSL()) { + session.setLastError(sslcom->getLastError()); + return NO; + } + } + + session.add("sslmode", "yes"); + + return NOTHING; +} + +//---------------------------------------------------------------------- +Operator::ParseResult StarttlsOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF"); + return ERROR; + } else + return ACCEPT; +} + +#endif diff --git a/src/operator-status.cc b/src/operator-status.cc @@ -0,0 +1,182 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-status.cc + * + * Description: + * Implementation of the STATUS command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> +#include <iostream> + +#include <dirent.h> +#include <sys/stat.h> +#include <sys/types.h> + +#include "io.h" +#include "mailbox.h" +#include "status.h" +#include "storage.h" +#include "convert.h" + +#include "recursivedescent.h" + +#include "session.h" +#include "depot.h" +#include "operators.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +StatusOperator::StatusOperator(void) +{ +} + +//---------------------------------------------------------------------- +StatusOperator::~StatusOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string StatusOperator::getName(void) const +{ + return "STATUS"; +} + +//---------------------------------------------------------------------- +int StatusOperator::getState(void) const +{ + return Session::AUTHENTICATED | Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult StatusOperator::process(Depot &depot, + Request &command) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + Status status; + if (!depot.getStatus(command.getMailbox(), status)) { + session.setLastError(depot.getLastError()); + return NO; + } + + com << "* STATUS " << toImapString(command.getMailbox()) << " ("; + + string prefix; + for (vector<string>::const_iterator i = command.statuses.begin(); + i != command.statuses.end(); ++i) { + string tmp = *i; + uppercase(tmp); + if (tmp == "UIDNEXT") { + com << prefix << "UIDNEXT " << status.getUidNext(); prefix = " "; + } else if (tmp == "MESSAGES") { + com << prefix << "MESSAGES " << status.getMessages(); prefix = " "; + } else if (tmp == "RECENT") { + com << prefix << "RECENT " << status.getRecent(); prefix = " "; + } else if (tmp == "UIDVALIDITY") { + com << prefix << "UIDVALIDITY " << status.getUidValidity(); prefix = " "; + } else if (tmp == "UNSEEN") { + com << prefix << "UNSEEN " << status.getUnseen(); prefix = " "; + } + } + com << ")" << endl; + + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult StatusOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + string mailbox; + if ((res = expectMailbox(mailbox)) != ACCEPT) { + session.setLastError("Expected mailbox"); + return res; + } + + c_in.setMailbox(mailbox); + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectThisString("(")) != ACCEPT) { + session.setLastError("Expected ("); + return res; + } + + while (1) { + if ((res = expectThisString("MESSAGES")) == ACCEPT) + c_in.getStatuses().push_back("MESSAGES"); + else if ((res = expectThisString("RECENT")) == ACCEPT) + c_in.getStatuses().push_back("RECENT"); + else if ((res = expectThisString("UIDNEXT")) == ACCEPT) + c_in.getStatuses().push_back("UIDNEXT"); + else if ((res = expectThisString("UIDVALIDITY")) == ACCEPT) + c_in.getStatuses().push_back("UIDVALIDITY"); + else if ((res = expectThisString("UNSEEN")) == ACCEPT) + c_in.getStatuses().push_back("UNSEEN"); + else { + session.setLastError("Expected status_att"); + return res; + } + + if (expectSPACE() != ACCEPT) + break; + } + + if ((res = expectThisString(")")) != ACCEPT) { + session.setLastError("Expected )"); + return res; + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF"); + return ERROR; + } + + return ACCEPT; +} diff --git a/src/operator-store.cc b/src/operator-store.cc @@ -0,0 +1,210 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-store.cc + * + * Description: + * Implementation of the STORE command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> +#include <iostream> + +#include "imapparser.h" +#include "mailbox.h" +#include "pendingupdates.h" +#include "io.h" + +#include "recursivedescent.h" + +#include "session.h" +#include "depot.h" +#include "operators.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +StoreOperator::StoreOperator(void) +{ +} + +//---------------------------------------------------------------------- +StoreOperator::~StoreOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string StoreOperator::getName(void) const +{ + return "STORE"; +} + +//---------------------------------------------------------------------- +int StoreOperator::getState(void) const +{ + return Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult StoreOperator::process(Depot &depot, + Request &command) +{ + Mailbox *mailbox = depot.getSelected(); + + // mask all passed flags together + unsigned int newflags = (unsigned int) Message::F_NONE; + vector<string>::const_iterator f_i = command.flags.begin(); + while (f_i != command.flags.end()) { + if (*f_i == "\\Deleted") newflags |= Message::F_DELETED; + if (*f_i == "\\Answered") newflags |= Message::F_ANSWERED; + if (*f_i == "\\Seen") newflags |= Message::F_SEEN; + if (*f_i == "\\Draft") newflags |= Message::F_DRAFT; + if (*f_i == "\\Flagged") newflags |= Message::F_FLAGGED; + ++f_i; + } + + // pass through all messages + unsigned int mode + = command.getUidMode() ? Mailbox::UID_MODE : Mailbox::SQNR_MODE; + + Mailbox::iterator i + = mailbox->begin(command.bset, Mailbox::SKIP_EXPUNGED | mode); + + for (; i != mailbox->end(); ++i) { + Message &message = *i; + + // get and reset the old flags + unsigned int oldflags = (unsigned int) message.getStdFlags(); + unsigned int flags = oldflags; + + bool recent = (flags & Message::F_RECENT) != 0; + flags &= (~Message::F_RECENT); + + // add, remove or set flags + if (command.getMode()[0] == '+') flags |= newflags; + else if (command.getMode()[0] == '-') flags &= ~newflags; + else flags = newflags; + + // set new flags, even if they weren't changed. + if (recent) flags |= Message::F_RECENT; + message.resetStdFlags(); + message.setStdFlag(flags); + } + + // commit flag changes to mailbox (might change mailbox) + mailbox->updateFlags(); + + // check mailbox for updates, and report them + if (command.getMode().find(".SILENT") != string::npos) + pendingUpdates(mailbox, + PendingUpdates::EXISTS + | PendingUpdates::RECENT, false); + else + pendingUpdates(mailbox, + PendingUpdates::EXISTS + | PendingUpdates::RECENT + | PendingUpdates::FLAGS, false); + + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult StoreOperator::parse(Request & c_in) const +{ + Session &session = Session::getInstance(); + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + if ((res = expectSet(c_in.getSet())) != ACCEPT) { + session.setLastError("Expected Set"); + return res; + } + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + string mode; + if ((res = expectThisString("+")) == ACCEPT) + mode = "+"; + else if ((res = expectThisString("-")) == ACCEPT) + mode = "-"; + + if ((res = expectThisString("FLAGS")) != ACCEPT) { + session.setLastError("Expected FLAGS"); + return res; + } else + mode += "FLAGS"; + + if ((res = expectThisString(".SILENT")) == ACCEPT) + mode += ".SILENT"; + + c_in.setMode(mode); + + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + bool paren = false; + if ((res = expectThisString("(")) == ACCEPT) + paren = true; + + if ((res = expectFlag(c_in.getFlags())) == ACCEPT) + while (1) { + if ((res = expectSPACE()) != ACCEPT) + break; + + if ((res = expectFlag(c_in.getFlags())) != ACCEPT) { + session.setLastError("Expected flag after SPACE"); + return res; + } + } + + if (paren) + if ((res = expectThisString(")")) != ACCEPT) { + session.setLastError("Expected )"); + return res; + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF"); + return res; + } + + return ACCEPT; +} diff --git a/src/operator-subscribe.cc b/src/operator-subscribe.cc @@ -0,0 +1,121 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-subscribe.cc + * + * Description: + * Implementation of the SUBSCRIBE command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> +#include <iostream> + +#include "storage.h" +#include "io.h" +#include "convert.h" + +#include <sys/stat.h> + +#include "recursivedescent.h" + +#include "session.h" +#include "depot.h" +#include "operators.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +SubscribeOperator::SubscribeOperator(void) +{ +} + +//---------------------------------------------------------------------- +SubscribeOperator::~SubscribeOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string SubscribeOperator::getName(void) const +{ + return "SUBSCRIBE"; +} + +//---------------------------------------------------------------------- +int SubscribeOperator::getState(void) const +{ + return Session::AUTHENTICATED | Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult SubscribeOperator::process(Depot &depot, + Request &command) +{ + Session &session = Session::getInstance(); + + const string &srcmailbox = command.getMailbox(); + const string &canonmailbox = toCanonMailbox(srcmailbox); + + session.loadSubscribes(); + session.subscribeTo(canonmailbox); + session.saveSubscribes(); + + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult SubscribeOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + string mailbox; + if ((res = expectMailbox(mailbox)) != ACCEPT) { + session.setLastError("Expected mailbox"); + return res; + } + c_in.setMailbox(mailbox); + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF"); + return res; + } + + return ACCEPT; +} diff --git a/src/operator-unsubscribe.cc b/src/operator-unsubscribe.cc @@ -0,0 +1,126 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * operator-unsubscribe.cc + * + * Description: + * Implementation of the UNSUBSCRIBE command. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> +#include <vector> +#include <iostream> + +#include "io.h" +#include "convert.h" +#include "storage.h" + +#include <sys/stat.h> + +#include "recursivedescent.h" + +#include "session.h" +#include "depot.h" +#include "operators.h" + +using namespace ::std; +using namespace Binc; + +//---------------------------------------------------------------------- +UnsubscribeOperator::UnsubscribeOperator(void) +{ +} + +//---------------------------------------------------------------------- +UnsubscribeOperator::~UnsubscribeOperator(void) +{ +} + +//---------------------------------------------------------------------- +const string UnsubscribeOperator::getName(void) const +{ + return "UNSUBSCRIBE"; +} + +//---------------------------------------------------------------------- +int UnsubscribeOperator::getState(void) const +{ + return Session::AUTHENTICATED | Session::SELECTED; +} + +//------------------------------------------------------------------------ +Operator::ProcessResult UnsubscribeOperator::process(Depot &depot, + Request &command) +{ + Session &session = Session::getInstance(); + + const string &mailbox = command.getMailbox(); + const string &canonmailbox = toCanonMailbox(mailbox); + + session.loadSubscribes(); + if (!session.unsubscribeTo(canonmailbox)) { + session.setLastError("Not subscribed to " + toImapString(mailbox)); + return NO; + } + + session.saveSubscribes(); + + return OK; +} + +//---------------------------------------------------------------------- +Operator::ParseResult UnsubscribeOperator::parse(Request &c_in) const +{ + Session &session = Session::getInstance(); + + if (c_in.getUidMode()) + return REJECT; + + Operator::ParseResult res; + if ((res = expectSPACE()) != ACCEPT) { + session.setLastError("Expected SPACE"); + return res; + } + + string mailbox; + if ((res = expectMailbox(mailbox)) != ACCEPT) { + session.setLastError("Expected mailbox"); + return res; + } + + if ((res = expectCRLF()) != ACCEPT) { + session.setLastError("Expected CRLF"); + return res; + } + + c_in.setMailbox(mailbox); + return ACCEPT; +} diff --git a/src/operators.h b/src/operators.h @@ -0,0 +1,458 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/operators.h + * + * Description: + * <---> + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef operators_h_included +#define operators_h_included +#include <string> +#include <vector> + +#include "imapparser.h" +#include "depot.h" +#include "message.h" + +namespace Binc { + + //-------------------------------------------------------------------- + class Operator { + public: + enum ProcessResult {OK, BAD, NO, NOTHING, ABORT}; + enum ParseResult {ACCEPT, REJECT, ERROR, TIMEOUT}; + + virtual ProcessResult process(Depot &, Request &) = 0; + virtual ParseResult parse(Request &) const = 0; + virtual int getState(void) const = 0; + virtual const std::string getName(void) const = 0; + + //-- + virtual ~Operator(void) {}; + }; + + //-------------------------------------------------------------------- + class AppendOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + const std::string getName(void) const; + int getState(void) const; + + AppendOperator(void); + ~AppendOperator(void); + }; + + //-------------------------------------------------------------------- + class AuthenticateOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + AuthenticateOperator(void); + ~AuthenticateOperator(void); + }; + + //-------------------------------------------------------------------- + class CapabilityOperator : public Operator { + std::vector<std::string> capabilities; + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + void addCapability(const std::string &cap); + + CapabilityOperator(void); + ~CapabilityOperator(void); + }; + + //-------------------------------------------------------------------- + class CheckOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + CheckOperator(void); + ~CheckOperator(void); + }; + + //-------------------------------------------------------------------- + class CreateOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + CreateOperator(void); + ~CreateOperator(void); + }; + + //-------------------------------------------------------------------- + class CloseOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + CloseOperator(void); + ~CloseOperator(void); + }; + + //-------------------------------------------------------------------- + class CopyOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + CopyOperator(void); + ~CopyOperator(void); + }; + + //-------------------------------------------------------------------- + class DeleteOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + DeleteOperator(void); + ~DeleteOperator(void); + }; + + //-------------------------------------------------------------------- + class ExpungeOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + ExpungeOperator(void); + ~ExpungeOperator(void); + }; + + //-------------------------------------------------------------------- + class FetchOperator : public Operator { + protected: + ParseResult expectSectionText(BincImapParserFetchAtt &f_in) const; + ParseResult expectSection(BincImapParserFetchAtt &f_in) const; + ParseResult expectFetchAtt(BincImapParserFetchAtt &f_in) const; + ParseResult expectOffset(BincImapParserFetchAtt &f_in) const; + ParseResult expectHeaderList(BincImapParserFetchAtt &f_in) const; + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + FetchOperator(void); + ~FetchOperator(void); + }; + + //-------------------------------------------------------------------- + class ListOperator : public Operator { + protected: + enum MailboxFlags { + DIR_SELECT = 0x01, + DIR_MARKED = 0x02, + DIR_NOINFERIORS = 0x04, + DIR_LEAF = 0x08 + }; + + std::map<std::string, unsigned int> cache; + time_t cacheTimeout; + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + ListOperator(void); + ~ListOperator(void); + }; + + //-------------------------------------------------------------------- + class LoginOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + LoginOperator(void); + ~LoginOperator(void); + }; + + //-------------------------------------------------------------------- + class LogoutOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + LogoutOperator(void); + ~LogoutOperator(void); + }; + + //-------------------------------------------------------------------- + class LsubOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + LsubOperator(void); + ~LsubOperator(void); + }; + + //-------------------------------------------------------------------- + class NoopOperator : public Operator { + public: + virtual ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + NoopOperator(void); + ~NoopOperator(void); + }; + + //-------------------------------------------------------------------- + class NoopPendingOperator : public NoopOperator { + public: + ProcessResult process(Depot &, Request &); + + NoopPendingOperator(void); + ~NoopPendingOperator(void); + }; + + //-------------------------------------------------------------------- + class RenameOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + RenameOperator(void); + ~RenameOperator(void); + }; + + //-------------------------------------------------------------------- + class SearchOperator : public Operator { + protected: + ParseResult expectSearchKey(BincImapParserSearchKey &s_in) const; + + //------------------------------------------------------------------ + class SearchNode { + + std::string date; + std::string astring; + std::string bstring; + unsigned int number; + + int type; + mutable int weight; + const SequenceSet *bset; + + std::vector<SearchNode> children; + + public: + enum { + S_ALL, S_ANSWERED, S_BCC, S_BEFORE, S_BODY, S_CC, S_DELETED, + S_FLAGGED, S_FROM, S_KEYWORD, S_NEW, S_OLD, S_ON, S_RECENT, + S_SEEN, S_SINCE, S_SUBJECT, S_TEXT, S_TO, S_UNANSWERED, + S_UNDELETED, S_UNFLAGGED, S_UNKEYWORD, S_UNSEEN, S_DRAFT, + S_HEADER, S_LARGER, S_NOT, S_OR, S_SENTBEFORE, S_SENTON, + S_SENTSINCE, S_SMALLER, S_UID, S_UNDRAFT, S_SET, S_AND + }; + + static bool convertDate(const std::string &date, time_t &t, const std::string &delim = "-"); + static bool convertDateHeader(const std::string &d_in, time_t &t); + + void order(void); + + bool match(Mailbox *, Message *, + unsigned seqnr, unsigned int lastmessage, + unsigned int lastuid) const; + + int getType(void) const; + int getWeight(void) const; + void setWeight(int i); + + void init(const BincImapParserSearchKey &a); + + //- + static bool compareNodes(const SearchNode &a, + const SearchNode &b) + { + return a.getWeight() < b.getWeight(); + } + + SearchNode(void); + SearchNode(const BincImapParserSearchKey &a); + }; + + public: + + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + SearchOperator(void); + ~SearchOperator(void); + }; + + //-------------------------------------------------------------------- + class SelectOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + SelectOperator(void); + ~SelectOperator(void); + }; + + //-------------------------------------------------------------------- + class ExamineOperator : public SelectOperator { + public: + const std::string getName(void) const; + ExamineOperator(void); + ~ExamineOperator(void); + }; + +#ifdef WITH_SSL + //-------------------------------------------------------------------- + class StarttlsOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + StarttlsOperator(void); + ~StarttlsOperator(void); + }; +#endif + + //-------------------------------------------------------------------- + class StatusOperator : public Operator { + + std::map<int, Status> statuses; + + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + StatusOperator(void); + ~StatusOperator(void); + }; + + //-------------------------------------------------------------------- + class StoreOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + StoreOperator(void); + ~StoreOperator(void); + }; + + //-------------------------------------------------------------------- + class SubscribeOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + SubscribeOperator(void); + ~SubscribeOperator(void); + }; + + //-------------------------------------------------------------------- + class UnsubscribeOperator : public Operator { + public: + ProcessResult process(Depot &, Request &); + virtual ParseResult parse(Request &) const; + + const std::string getName(void) const; + int getState(void) const; + + UnsubscribeOperator(void); + ~UnsubscribeOperator(void); + }; +} + +#endif diff --git a/src/pendingupdates.cc b/src/pendingupdates.cc @@ -0,0 +1,268 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * pendingupdates.cc + * + * Description: + * <---> + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#include <iostream> +#include <string> +#include <vector> + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "session.h" +#include "pendingupdates.h" +#include "message.h" +#include "mailbox.h" +#include "io.h" + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +PendingUpdates::PendingUpdates(void) : expunges(), flagupdates() +{ + recent = 0; + exists = 0; + + newrecent = false; + newexists = false; +} + +//------------------------------------------------------------------------ +PendingUpdates::~PendingUpdates(void) +{ +} + +//------------------------------------------------------------------------ +void PendingUpdates::addExpunged(unsigned int uid) +{ + expunges.push_back(uid); +} + +//------------------------------------------------------------------------ +void PendingUpdates::addFlagUpdates(unsigned int uid, unsigned int flags) +{ + flagupdates[uid] = flags; +} + +//------------------------------------------------------------------------ +void PendingUpdates::setExists(unsigned int n) +{ + exists = n; + newexists = true; +} + +//------------------------------------------------------------------------ +void PendingUpdates::setRecent(unsigned int n) +{ + recent = n; + newrecent = true; +} + +//------------------------------------------------------------------------ +unsigned int PendingUpdates::getExists(void) const +{ + return exists; +} + +//------------------------------------------------------------------------ +unsigned int PendingUpdates::getRecent(void) const +{ + return recent; +} + +//------------------------------------------------------------------------ +bool PendingUpdates::newExists(void) const +{ + return newexists; +} + +//------------------------------------------------------------------------ +bool PendingUpdates::newRecent(void) const +{ + return newrecent; +} + +//------------------------------------------------------------------------ +PendingUpdates::expunged_const_iterator::expunged_const_iterator(void) +{ +} + +//------------------------------------------------------------------------ +PendingUpdates::expunged_const_iterator::expunged_const_iterator(vector<unsigned int>::iterator i) : internal(i) +{ +} + +//------------------------------------------------------------------------ +unsigned int PendingUpdates::expunged_const_iterator::operator * (void) const +{ + return *internal; +} + +//------------------------------------------------------------------------ +void PendingUpdates::expunged_const_iterator::operator ++ (void) +{ + ++internal; +} + +//------------------------------------------------------------------------ +bool PendingUpdates::expunged_const_iterator::operator == (expunged_const_iterator i) const +{ + return internal == i.internal; +} + +//------------------------------------------------------------------------ +bool PendingUpdates::expunged_const_iterator::operator != (expunged_const_iterator i) const +{ + return internal != i.internal; +} + +//------------------------------------------------------------------------ +PendingUpdates::expunged_const_iterator PendingUpdates::beginExpunged(void) +{ + return expunged_const_iterator(expunges.begin()); +} + +//------------------------------------------------------------------------ +PendingUpdates::expunged_const_iterator PendingUpdates::endExpunged(void) +{ + return expunged_const_iterator(expunges.end()); +} + +//------------------------------------------------------------------------ +PendingUpdates::flagupdates_const_iterator::flagupdates_const_iterator(void) +{ +} + +//------------------------------------------------------------------------ +PendingUpdates::flagupdates_const_iterator::flagupdates_const_iterator(map<unsigned int, unsigned int>::iterator i) : internal(i) +{ +} + +//------------------------------------------------------------------------ +void PendingUpdates::flagupdates_const_iterator::operator ++ (void) +{ + ++internal; +} + +//------------------------------------------------------------------------ +bool PendingUpdates::flagupdates_const_iterator::operator != (flagupdates_const_iterator i) const +{ + return internal != i.internal; +} + +//------------------------------------------------------------------------ +PendingUpdates::flagupdates_const_iterator PendingUpdates::beginFlagUpdates(void) +{ + return flagupdates_const_iterator(flagupdates.begin()); +} + +//------------------------------------------------------------------------ +PendingUpdates::flagupdates_const_iterator PendingUpdates::endFlagUpdates(void) +{ + return flagupdates_const_iterator(flagupdates.end()); +} + +//------------------------------------------------------------------------ +unsigned int PendingUpdates::flagupdates_const_iterator::first(void) const +{ + return internal->first; +} + +//------------------------------------------------------------------------ +unsigned int PendingUpdates::flagupdates_const_iterator::second(void) const +{ + return internal->second; +} + +//-------------------------------------------------------------------- +bool Binc::pendingUpdates(Mailbox *mailbox, int type, bool rescan) +{ + Session &session = Session::getInstance(); + IO &com = IOFactory::getInstance().get(1); + + if (mailbox == 0) + return true; + + PendingUpdates p; + if (!mailbox->getUpdates(rescan, type, p)) { + session.setLastError(mailbox->getLastError()); + return false; + } + + if (type & PendingUpdates::EXPUNGE) { + PendingUpdates::expunged_const_iterator i = p.beginExpunged(); + PendingUpdates::expunged_const_iterator e = p.endExpunged(); + + while (i != e) { + com << "* " << *i << " EXPUNGE" << endl; + ++i; + } + } + + if ((type & PendingUpdates::EXISTS) && p.newExists()) + com << "* " << p.getExists() << " EXISTS" << endl; + + if ((type & PendingUpdates::RECENT) && p.newRecent()) + com << "* " << p.getRecent() << " RECENT" << endl; + + if (type & PendingUpdates::FLAGS) { + PendingUpdates::flagupdates_const_iterator i = p.beginFlagUpdates(); + PendingUpdates::flagupdates_const_iterator e = p.endFlagUpdates(); + + while (i != e) { + int flags = i.second(); + + vector<string> flagv; + if (flags & Message::F_SEEN) flagv.push_back("\\Seen"); + if (flags & Message::F_ANSWERED) flagv.push_back("\\Answered"); + if (flags & Message::F_DELETED) flagv.push_back("\\Deleted"); + if (flags & Message::F_DRAFT) flagv.push_back("\\Draft"); + if (flags & Message::F_RECENT) flagv.push_back("\\Recent"); + if (flags & Message::F_FLAGGED) flagv.push_back("\\Flagged"); + + com << "* " << i.first() << " FETCH (FLAGS ("; + for (vector<string>::const_iterator k + = flagv.begin(); k != flagv.end(); ++k) { + if (k != flagv.begin()) com << " "; + com << *k; + } + + com << "))" << endl; + + ++i; + } + } + + return true; +} diff --git a/src/pendingupdates.h b/src/pendingupdates.h @@ -0,0 +1,125 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/pendingupdates.h + * + * Description: + * <---> + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <map> +#include <vector> + +#ifndef pendingupdates_h_included +#define pendingupdates_h_included + +namespace Binc { + class Mailbox; + + //------------------------------------------------------------------------ + class PendingUpdates { + public: + enum { + EXPUNGE = 0x01, + FLAGS = 0x02, + EXISTS = 0x04, + RECENT = 0x08 + }; + + //---------------------------------------------------------------------- + class expunged_const_iterator { + private: + std::vector<unsigned int>::iterator internal; + + public: + unsigned int operator * (void) const; + void operator ++ (void); + bool operator != (expunged_const_iterator) const; + bool operator == (expunged_const_iterator) const; + + //-- + expunged_const_iterator(void); + expunged_const_iterator(std::vector<unsigned int>::iterator i); + }; + + //-- + expunged_const_iterator beginExpunged(void); + expunged_const_iterator endExpunged(void); + + //---------------------------------------------------------------------- + class flagupdates_const_iterator { + private: + std::map<unsigned int, unsigned int>::iterator internal; + + public: + unsigned int first(void) const; + unsigned int second(void) const; + + void operator ++ (void); + bool operator != (flagupdates_const_iterator) const; + + //-- + flagupdates_const_iterator(void); + flagupdates_const_iterator(std::map<unsigned int, unsigned int>::iterator i); + }; + + //-- + flagupdates_const_iterator beginFlagUpdates(void); + flagupdates_const_iterator endFlagUpdates(void); + + //-- + void addExpunged(unsigned int uid); + void addFlagUpdates(unsigned int uid, unsigned int flags); + void setExists(unsigned int n); + void setRecent(unsigned int n); + unsigned int getExists(void) const; + unsigned int getRecent(void) const; + bool newExists(void) const; + bool newRecent(void) const; + + //-- + PendingUpdates(void); + ~PendingUpdates(void); + + private: + std::vector<unsigned int> expunges; + std::map<unsigned int, unsigned int> flagupdates; + + unsigned int exists; + unsigned int recent; + bool newexists; + bool newrecent; + }; + + bool Binc::pendingUpdates(Mailbox *, int type, bool rescan); +} + +#endif diff --git a/src/recursivedescent.cc b/src/recursivedescent.cc @@ -0,0 +1,1072 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * recursivedescent.cc + * + * Description: + * Implementation of a recursive descent IMAP command + * parser. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +// #define DEBUG + +#include "imapparser.h" +#include "recursivedescent.h" +#include "io.h" +#include "convert.h" +#include "session.h" + +#include <stdio.h> +#include <ctype.h> +#include <stack> +#include <iostream> +#include <iomanip> + +using namespace ::std; +using namespace Binc; + +stack<int> Binc::inputBuffer; +int Binc::charnr = 0; + + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectThisString(const string &s_in) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + +#ifdef DEBUG + cout << "expectThisString(\"" << s_in << "\")" << endl << flush; +#endif + string tmp; + + bool match = true; + for (string::const_iterator i = s_in.begin(); i != s_in.end(); ++i) { + + int c = com.readChar(session.timeout()); + if (c == -1) { + session.setLastError(com.getLastError()); + return Operator::ERROR; + } else if (c == -2) + return Operator::TIMEOUT; + + + tmp += c; + + if (toupper(*i) != toupper(c)) { + match = false; + break; + } + } + + if (!match) { + com.unReadChar(tmp); + return Operator::REJECT; + } else + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectDateTime(string &s_in) +{ + Session &session = Session::getInstance(); + + if (expectThisString("\"") != Operator::ACCEPT) + return Operator::REJECT; + + unsigned int digit1, digit2; + if (expectSPACE() == Operator::ACCEPT) { + digit1 = 0; + Operator::ParseResult res; + if ((res = expectDigit(digit2)) != Operator::ACCEPT) { + session.setLastError("expected digit (day) after \" and a SPACE."); + return res; + } + } else { + Operator::ParseResult res; + if ((res = expectDigit(digit1)) != Operator::ACCEPT) { + session.setLastError("expected first digit of day"); + return res; + } + if ((res = expectDigit(digit2)) != Operator::ACCEPT) { + session.setLastError("expected second digit of day"); + return res; + } + } + + int day = digit1 * 10 + digit2; + + BincStream daystr; + + if (day < 10) + daystr << '0'; + daystr << day; + + s_in += daystr.str(); + + Operator::ParseResult res; + if ((res = expectThisString("-")) != Operator::ACCEPT) { + session.setLastError("expected -"); + return res; + } + + s_in += "-"; + + /* month */ + if ((res = expectThisString("Jan")) == Operator::ACCEPT) s_in += "Jan"; + else if ((res = expectThisString("Feb")) == Operator::ACCEPT) s_in += "Feb"; + else if ((res = expectThisString("Mar")) == Operator::ACCEPT) s_in += "Mar"; + else if ((res = expectThisString("Apr")) == Operator::ACCEPT) s_in += "Apr"; + else if ((res = expectThisString("May")) == Operator::ACCEPT) s_in += "May"; + else if ((res = expectThisString("Jun")) == Operator::ACCEPT) s_in += "Jun"; + else if ((res = expectThisString("Jul")) == Operator::ACCEPT) s_in += "Jul"; + else if ((res = expectThisString("Aug")) == Operator::ACCEPT) s_in += "Aug"; + else if ((res = expectThisString("Sep")) == Operator::ACCEPT) s_in += "Sep"; + else if ((res = expectThisString("Oct")) == Operator::ACCEPT) s_in += "Oct"; + else if ((res = expectThisString("Nov")) == Operator::ACCEPT) s_in += "Nov"; + else if ((res = expectThisString("Dec")) == Operator::ACCEPT) s_in += "Dec"; + else { + session.setLastError("expected month"); + return res; + } + + if ((res = expectThisString("-")) != Operator::ACCEPT) { + session.setLastError("expected -"); + return res; + } + + s_in += "-"; + + /* year */ + unsigned int year, c; + if ((res = expectDigit(year)) != Operator::ACCEPT) { + session.setLastError("expected digit (first digit of year)"); + return res; + } + + if ((res = expectDigit(c)) != Operator::ACCEPT) { + session.setLastError("expected digit (second digit of year)"); + return res; + } + + year = (year * 10) + c; + + if ((res = expectDigit(c)) != Operator::ACCEPT) { + session.setLastError("expected digit (third digit of year)"); + return res; + } + + year = (year * 10) + c; + + if ((res = expectDigit(c)) != Operator::ACCEPT) { + session.setLastError("expected digit (last digit of year)"); + return res; + } + + year = (year * 10) + c; + + BincStream yearstr; + + yearstr << year; + + s_in += yearstr.str(); + + if ((res = expectSPACE()) != Operator::ACCEPT) { + session.setLastError("expected SPACE"); + return res; + } + + s_in += " "; + + if ((res = expectTime(s_in)) != Operator::ACCEPT) { + session.setLastError("expected time"); + return res; + } + + if ((res = expectSPACE()) != Operator::ACCEPT) { + session.setLastError("expected SPACE"); + return res; + } + + s_in += " "; + + if ((res = expectZone(s_in)) != Operator::ACCEPT) { + session.setLastError("expected zone"); + return res; + } + + if ((res = expectThisString("\"")) != Operator::ACCEPT) { + session.setLastError("expected \""); + return res; + } + + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectTime(string &s_in) +{ + Session &session = Session::getInstance(); + + unsigned int c, t; + Operator::ParseResult res; + if ((res = expectDigit(t)) != Operator::ACCEPT) + return res; + + if ((res = expectDigit(c)) != Operator::ACCEPT) { + session.setLastError("expected digit"); + return res; + } + + t = (t * 10) + c; + + BincStream tstr; + + tstr << t; + + s_in += tstr.str(); + + if ((res = expectThisString(":")) != Operator::ACCEPT) { + session.setLastError("expected colon"); + return res; + } + + s_in += ":"; + + if ((res = expectDigit(t)) != Operator::ACCEPT) { + session.setLastError("expected digit"); + return res; + } + + if ((res = expectDigit(c)) != Operator::ACCEPT) { + session.setLastError("expected digit"); + return res; + } + + t = (t * 10) + c; + + tstr.clear(); + + tstr << t; + + s_in += tstr.str(); + + if ((res = expectThisString(":")) != Operator::ACCEPT) { + session.setLastError("expected colon"); + return res; + } + + s_in += ":"; + + if ((res = expectDigit(t)) != Operator::ACCEPT) { + session.setLastError("expected digit"); + return res; + } + + if ((res = expectDigit(c)) != Operator::ACCEPT) { + session.setLastError("expected digit"); + return res; + } + + t = (t * 10) + c; + + tstr.clear(); + + tstr << t; + + s_in += tstr.str(); + + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectZone(string &s_in) +{ + Session &session = Session::getInstance(); + + Operator::ParseResult res; + if ((res = expectThisString("-")) == Operator::ACCEPT) + s_in += "-"; + else if ((res = expectThisString("+")) == Operator::ACCEPT) + s_in += "+"; + else + return res; + + unsigned int c, t; + if ((res = expectDigit(t)) != Operator::ACCEPT) { + session.setLastError("expected digit"); + return res; + } + + if ((res = expectDigit(c)) != Operator::ACCEPT) { + session.setLastError("expected digit"); + return res; + } + + t = (t * 10) + c; + + if ((res = expectDigit(c)) != Operator::ACCEPT) { + session.setLastError("expected digit"); + return res; + } + + t = (t * 10) + c; + + if ((res = expectDigit(c)) != Operator::ACCEPT) { + session.setLastError("expected digit"); + return res; + } + + t = (t * 10) + c; + + BincStream tstr; + + tstr << t; + + s_in += tstr.str(); + + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectListWildcards(int &c_in) +{ + Operator::ParseResult res; + if ((res = expectThisString("%")) == Operator::ACCEPT) { + c_in = '%'; + return Operator::ACCEPT; + } else if ((res = expectThisString("*")) == Operator::ACCEPT) { + c_in = '*'; + return Operator::ACCEPT; + } else + return res; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectListMailbox(string &s_in) +{ + IO &com = IOFactory::getInstance().get(1); + + Operator::ParseResult res; + if ((res = expectString(s_in)) == Operator::ACCEPT) + return Operator::ACCEPT; + + int c; + if ((res = expectAtomChar(c)) == Operator::ACCEPT + || (res = expectListWildcards(c)) == Operator::ACCEPT + || (res = expectThisString("]")) == Operator::ACCEPT) { + do { + s_in += (char) c; + if ((res = expectAtomChar(c)) != Operator::ACCEPT + && (res = expectListWildcards(c)) != Operator::ACCEPT + && (res = expectThisString("]")) != Operator::ACCEPT) + return Operator::ACCEPT; + } while (1); + } + + com.unReadChar(s_in); + + return res; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectFlag(vector<string> &v_in) +{ + Session &session = Session::getInstance(); + + Operator::ParseResult res; + string flag; + if ((res = expectThisString("\\Answered")) == Operator::ACCEPT) + v_in.push_back("\\Answered"); + else if ((res = expectThisString("\\Flagged")) == Operator::ACCEPT) + v_in.push_back("\\Flagged"); + else if ((res = expectThisString("\\Deleted")) == Operator::ACCEPT) + v_in.push_back("\\Deleted"); + else if ((res = expectThisString("\\Seen")) == Operator::ACCEPT) + v_in.push_back("\\Seen"); + else if ((res = expectThisString("\\Draft")) == Operator::ACCEPT) + v_in.push_back("\\Draft"); + else if ((res = expectThisString("\\Answered")) == Operator::ACCEPT) + v_in.push_back("\\Answered"); + else { + if ((res = expectThisString("\\")) == Operator::ACCEPT) { + if ((res = expectAtom(flag)) == Operator::ACCEPT) + v_in.push_back("\\" + flag); + else { + session.setLastError("expected atom"); + return res; + } + + } else if (expectAtom(flag) == Operator::ACCEPT) { + v_in.push_back(flag); + } else + return res; + } + + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectDate(string &s_in) +{ + Session &session = Session::getInstance(); + + Operator::ParseResult res; + bool quoted = false; + if ((res = expectThisString("\"")) == Operator::ACCEPT) + quoted = true; + + /* day */ + unsigned int day, c; + if ((res = expectDigit(c)) == Operator::ACCEPT) { + day = c; + if ((res = expectDigit(c)) == Operator::ACCEPT) + day = (day * 10) + c; + + BincStream daystr; + + daystr << day; + + s_in += daystr.str(); + } else { + session.setLastError("expected digit"); + return res; + } + + /* - */ + if ((res = expectThisString("-")) != Operator::ACCEPT) { + session.setLastError("expected -"); + return res; + } + + s_in += '-'; + + /* month */ + if ((res = expectThisString("Jan")) == Operator::ACCEPT) s_in += "Jan"; + else if ((res = expectThisString("Feb")) == Operator::ACCEPT) s_in += "Feb"; + else if ((res = expectThisString("Mar")) == Operator::ACCEPT) s_in += "Mar"; + else if ((res = expectThisString("Apr")) == Operator::ACCEPT) s_in += "Apr"; + else if ((res = expectThisString("May")) == Operator::ACCEPT) s_in += "May"; + else if ((res = expectThisString("Jun")) == Operator::ACCEPT) s_in += "Jun"; + else if ((res = expectThisString("Jul")) == Operator::ACCEPT) s_in += "Jul"; + else if ((res = expectThisString("Aug")) == Operator::ACCEPT) s_in += "Aug"; + else if ((res = expectThisString("Sep")) == Operator::ACCEPT) s_in += "Sep"; + else if ((res = expectThisString("Oct")) == Operator::ACCEPT) s_in += "Oct"; + else if ((res = expectThisString("Nov")) == Operator::ACCEPT) s_in += "Nov"; + else if ((res = expectThisString("Dec")) == Operator::ACCEPT) s_in += "Dec"; + else { + session.setLastError("expected month"); + return res; + } + + /* - */ + if ((res = expectThisString("-")) != Operator::ACCEPT) { + session.setLastError("expected -"); + return res; + } + + s_in += '-'; + + /* year */ + unsigned int year; + if ((res = expectDigit(year)) != Operator::ACCEPT) { + session.setLastError("expected digit"); + return res; + } + + if ((res = expectDigit(c)) != Operator::ACCEPT) { + session.setLastError("expected digit"); + return res; + } + + year = (year * 10) + c; + + if ((res = expectDigit(c)) != Operator::ACCEPT) { + session.setLastError("expected digit"); + return res; + } + + year = (year * 10) + c; + + if ((res = expectDigit(c)) != Operator::ACCEPT) { + session.setLastError("expected digit"); + return res; + } + + year = (year * 10) + c; + + BincStream yearstr; + + yearstr << year; + + s_in += yearstr.str(); + + if (quoted) + if ((res = expectThisString("\"")) != Operator::ACCEPT) { + session.setLastError("expected \""); + return res; + } + + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectCRLF(void) +{ + Operator::ParseResult res; + if ((res = expectCR()) == Operator::ACCEPT + && (res = expectLF()) == Operator::ACCEPT) + return Operator::ACCEPT; + else + return res; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectCR(void) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + int c = com.readChar(session.timeout()); + if (c == -1) { + session.setLastError(com.getLastError()); + return Operator::ERROR; + } else if (c == -2) + return Operator::TIMEOUT; + + if (c == 0x0d) + return Operator::ACCEPT; + else { + com.unReadChar(c); + return Operator::REJECT; + } +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectLF(void) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + int c = com.readChar(session.timeout()); + if (c == -1) { + session.setLastError(com.getLastError()); + return Operator::ERROR; + } else if (c == -2) + return Operator::TIMEOUT; + + if (c == 0x0a) + return Operator::ACCEPT; + else { + com.unReadChar(c); + return Operator::REJECT; + } +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectTagChar(int &c_in) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + int c = com.readChar(session.timeout()); + if (c == -1) { + session.setLastError(com.getLastError()); + return Operator::ERROR; + } else if (c == -2) + return Operator::TIMEOUT; + + switch (c) { + case 041: case 043: case 044: case 046: case 047: case 054: + case 055: case 056: case 057: case 060: case 061: case 062: + case 063: case 064: case 065: case 066: case 067: case 070: + case 071: case 072: case 073: case 074: case 075: case 076: + case 077: case 0100: case 0101: case 0102: case 0103: case 0104: + case 0105: case 0106: case 0107: case 0110: case 0111: case 0112: + case 0113: case 0114: case 0115: case 0116: case 0117: case 0120: + case 0121: case 0122: case 0123: case 0124: case 0125: case 0126: + case 0127: case 0130: case 0131: case 0132: case 0133: case 0135: + case 0136: case 0137: case 0140: case 0141: case 0142: case 0143: + case 0144: case 0145: case 0146: case 0147: case 0150: case 0151: + case 0152: case 0153: case 0154: case 0155: case 0156: case 0157: + case 0160: case 0161: case 0162: case 0163: case 0164: case 0165: + case 0166: case 0167: case 0170: case 0171: case 0172: case 0174: + case 0175: case 0176: + c_in = c; + return Operator::ACCEPT; + default: + break; + } + + com.unReadChar(c); + + return Operator::REJECT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectTag(string &s_in) +{ + string tag; + int tagchar; + + int eres = expectTagChar(tagchar); + if (eres == Operator::REJECT) + return Operator::REJECT; + else if (eres == Operator::ERROR) + return Operator::ERROR; + else if (eres == Operator::TIMEOUT) + return Operator::TIMEOUT; + else { + tag += tagchar; + + bool done = false; + + while (!done) { + switch (expectTagChar(tagchar)) { + case Operator::ACCEPT: + tag += tagchar; + break; + case Operator::REJECT: + done = true; + break; + case Operator::ERROR: + return Operator::ERROR; + case Operator::TIMEOUT: + return Operator::TIMEOUT; + } + } + } + + s_in = tag; + + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectSPACE(void) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + int c = com.readChar(session.timeout()); + if (c == -1) { + session.setLastError(com.getLastError()); + return Operator::ERROR; + } else if (c == -2) + return Operator::TIMEOUT; + + if (c == ' ') + return Operator::ACCEPT; + else { + com.unReadChar(c); + return Operator::REJECT; + } +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectMailbox(string &s_in) +{ + return expectAstring(s_in); +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectAstring(string &s_in) +{ + Operator::ParseResult res; + if ((res = expectAtom(s_in)) == Operator::ACCEPT) + return Operator::ACCEPT; + + if ((res = expectString(s_in)) == Operator::ACCEPT) + return Operator::ACCEPT; + + return res; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectAtomChar(int &c_in) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + int c = com.readChar(session.timeout()); + if (c == -1) { + session.setLastError(com.getLastError()); + return Operator::ERROR; + } else if (c == -2) + return Operator::TIMEOUT; + + switch (c) { + case 041: case 043: case 044: case 046: case 047: case 053: + case 054: case 055: case 056: case 057: case 060: case 061: + case 062: case 063: case 064: case 065: case 066: case 067: + case 070: case 071: case 072: case 073: case 074: case 075: + case 076: case 077: case 0100: case 0101: case 0102: case 0103: + case 0104: case 0105: case 0106: case 0107: case 0110: case 0111: + case 0112: case 0113: case 0114: case 0115: case 0116: case 0117: + case 0120: case 0121: case 0122: case 0123: case 0124: case 0125: + case 0126: case 0127: case 0130: case 0131: case 0132: case 0133: + case 0135: case 0136: case 0137: case 0140: case 0141: case 0142: + case 0143: case 0144: case 0145: case 0146: case 0147: case 0150: + case 0151: case 0152: case 0153: case 0154: case 0155: case 0156: + case 0157: case 0160: case 0161: case 0162: case 0163: case 0164: + case 0165: case 0166: case 0167: case 0170: case 0171: case 0172: + case 0174: case 0175: case 0176: + c_in = c; + return Operator::ACCEPT; + default: + break; + } + + com.unReadChar(c); + return Operator::REJECT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectAtom(string &s_in) +{ + IO &com = IOFactory::getInstance().get(1); + + string atom; + int atomchar; + + Operator::ParseResult res; + while ((res = expectAtomChar(atomchar)) == Operator::ACCEPT) + atom += atomchar; + + if (atom == "") { + com.unReadChar(atom); + return res; + } else + s_in = atom; + + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectString(string &s_in) +{ + Operator::ParseResult res; + if ((res = expectQuoted(s_in)) == Operator::ACCEPT) + return Operator::ACCEPT; + + if ((res = expectLiteral(s_in)) == Operator::ACCEPT) + return Operator::ACCEPT; + + return res; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectQuoted(string &s_in) +{ + IO &com = IOFactory::getInstance().get(1); + + string quoted; + int quotedchar; + Operator::ParseResult res; + + if ((res = expectThisString("\"")) != Operator::ACCEPT) + return res; + + while ((res = expectQuotedChar(quotedchar)) == Operator::ACCEPT) + quoted += quotedchar; + + if ((res = expectThisString("\"")) != Operator::ACCEPT) { + com.unReadChar("\"" + quoted); + return res; + } + + s_in = quoted; + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectQuotedChar(int &c_in) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + int c = com.readChar(session.timeout()); + if (c == -1) { + session.setLastError(com.getLastError()); + return Operator::ERROR; + } else if (c == -2) + return Operator::TIMEOUT; + + switch (c) { + case 01: case 02: case 03: case 04: case 05: case 06: case 07: + case 010: case 011: case 013: case 014: case 016: case 017: + case 020: case 021: case 022: case 023: case 024: case 025: case 026: case 027: + case 030: case 031: case 032: case 033: case 034: case 035: case 036: case 037: + case 040: case 041: case 043: case 044: case 045: case 046: case 047: + case 050: case 051: case 052: case 053: case 054: case 055: case 056: case 057: + case 060: case 061: case 062: case 063: case 064: case 065: case 066: case 067: + case 070: case 071: case 072: case 073: case 074: case 075: case 076: case 077: + case 0100: case 0101: case 0102: case 0103: case 0104: case 0105: case 0106: case 0107: + case 0110: case 0111: case 0112: case 0113: case 0114: case 0115: case 0116: case 0117: + case 0120: case 0121: case 0122: case 0123: case 0124: case 0125: case 0126: case 0127: + case 0130: case 0131: case 0132: case 0133: case 0135: case 0136: case 0137: + case 0140: case 0141: case 0142: case 0143: case 0144: case 0145: case 0146: case 0147: + case 0150: case 0151: case 0152: case 0153: case 0154: case 0155: case 0156: case 0157: + case 0160: case 0161: case 0162: case 0163: case 0164: case 0165: case 0166: case 0167: + case 0170: case 0171: case 0172: case 0173: case 0174: case 0175: case 0176: case 0177: + c_in = c; + return Operator::ACCEPT; + case '\\': { + int d = com.readChar(session.timeout()); + if (d == -1) { + session.setLastError(com.getLastError()); + return Operator::ERROR; + } else if (d == -2) + return Operator::TIMEOUT; + + if (d == '\"' || d == '\\') { + c_in = d; + return Operator::ACCEPT; + } else { + com.unReadChar(d); + com.unReadChar(c); + return Operator::REJECT; + } + } + default: + break; + } + + com.unReadChar(c); + return Operator::REJECT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectLiteral(string &s_in) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + string literal; + Operator::ParseResult res; + + if ((res = expectThisString("{")) != Operator::ACCEPT) + return res; + + unsigned int nchar; + + if ((res = expectNumber(nchar)) != Operator::ACCEPT) { + session.setLastError("expected number"); + return res; + } + + if ((res = expectThisString("}")) != Operator::ACCEPT) { + session.setLastError("expected }"); + return res; + } + + if ((res = expectCRLF()) != Operator::ACCEPT) { + session.setLastError("expected CRLF"); + return Operator::ERROR; + } + + com << "+ ok, send " << nchar << " bytes of data." << endl; + com.flushContent(); + + for (unsigned int i = 0; i < nchar; ++i) { + int c = com.readChar(session.timeout()); + if (c == -1) { + session.setLastError(com.getLastError()); + return Operator::ERROR; + } else if (c == -2) + return Operator::TIMEOUT; + else + literal += c; + } + + s_in = literal; + + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectNumber(unsigned int &i_in) +{ + i_in = 0; + unsigned int n; + Operator::ParseResult res; + + while ((res = expectDigit(n)) == Operator::ACCEPT) { + if (i_in == 0) + i_in = n; + else + i_in = (i_in * 10) + n; + } + + if (res == Operator::TIMEOUT) + return res; + + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectDigit(unsigned int &i_in) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + int c = com.readChar(session.timeout()); + if (c == -1) { + session.setLastError(com.getLastError()); + return Operator::ERROR; + } else if (c == -2) + return Operator::TIMEOUT; + + if (c == '0') { + i_in = 0; + return Operator::ACCEPT; + } else + com.unReadChar(c); + + if (expectDigitNZ(i_in) != Operator::ACCEPT) + return Operator::REJECT; + + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectDigitNZ(unsigned int &i_in) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + int c; + switch ((c = com.readChar(session.timeout()))) { + case '1': i_in = 1; break; + case '2': i_in = 2; break; + case '3': i_in = 3; break; + case '4': i_in = 4; break; + case '5': i_in = 5; break; + case '6': i_in = 6; break; + case '7': i_in = 7; break; + case '8': i_in = 8; break; + case '9': i_in = 9; break; + case -1: + session.setLastError(com.getLastError()); + return Operator::ERROR; + case -2: + return Operator::TIMEOUT; + default: + com.unReadChar(c); + return Operator::REJECT; + } + + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectSet(SequenceSet &s_in) +{ + Session &session = Session::getInstance(); + unsigned int seqnum = (unsigned int) -1; + + Operator::ParseResult res; + + /* if a set does not start with a sequencenum, then it's not a + * set. :-) seqnum == -1 means '*'. */ + if ((res = expectSequenceNum(seqnum)) != Operator::ACCEPT) + return res; + + /* the first number is always a part of the set */ + s_in.addNumber(seqnum); + + /* if _after_ a set there is a ':', then there will always be a + * sequencenum after the colon. if not, it's a syntax error. a + * colon delimits two numbers in a range. */ + if ((res = expectThisString(":")) == Operator::ACCEPT) { + unsigned int seqnum2 = (unsigned int) -1; + if ((res = expectSequenceNum(seqnum2)) != Operator::ACCEPT) { + session.setLastError("expected sequencenum"); + return res; + } + + s_in.addRange(seqnum, seqnum2); + } + + /* if _after_ a set there is a ',', then there will always be + * a set after the comma. if not, it's a syntax error. */ + if ((res = expectThisString(",")) == Operator::ACCEPT) + if ((res = expectSet(s_in)) != Operator::ACCEPT) { + session.setLastError("expected set"); + return res; + } + + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectSequenceNum(unsigned int &i_in) +{ + IO &com = IOFactory::getInstance().get(1); + Session &session = Session::getInstance(); + + int c = com.readChar(session.timeout()); + if (c == -1) { + session.setLastError(com.getLastError()); + return Operator::ERROR; + } else if (c == -2) + return Operator::TIMEOUT; + + if (c == '*') { + i_in = (unsigned int) -1; + return Operator::ACCEPT; + } else + com.unReadChar(c); + + if (expectNZNumber(i_in) != Operator::ACCEPT) + return Operator::REJECT; + else + return Operator::ACCEPT; +} + +//---------------------------------------------------------------------- +Operator::ParseResult Binc::expectNZNumber(unsigned int &i_in) +{ + unsigned int c; + Operator::ParseResult res; + + if ((res = expectDigitNZ(c)) != Operator::ACCEPT) + return res; + + i_in = c; + while ((res = expectDigit(c)) == Operator::ACCEPT) + i_in = (i_in * 10) + c; + + if (res == Operator::TIMEOUT) + return res; + + return Operator::ACCEPT; +} diff --git a/src/recursivedescent.h b/src/recursivedescent.h @@ -0,0 +1,97 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/parsers/imap/recursivedescent/recursivedescent.h + * + * Description: + * Declaration of a recursive descent IMAP command + * parser. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef expectcommand_h_inluded +#define expectcommand_h_inluded +#include <stack> +#include <string> + +#include "imapparser.h" +#include "operators.h" + +namespace Binc { + + extern std::stack<int> inputBuffer; + extern int charnr; + + int readChar(void); + void unReadChar(int c_in); + void unReadChar(const std::string &s_in); + + Operator::ParseResult expectTag(std::string &s_in); + Operator::ParseResult expectTagChar(int &c_in); + Operator::ParseResult expectSPACE(void); + + Operator::ParseResult expectFlag(std::vector<std::string> &v_in); + + Operator::ParseResult expectListMailbox(std::string &s_in); + Operator::ParseResult expectListWildcards(int &c_in); + + Operator::ParseResult expectDateTime(std::string &s_in); + Operator::ParseResult expectTime(std::string &s_in); + Operator::ParseResult expectZone(std::string &s_in); + + Operator::ParseResult expectMailbox(std::string &s_in); + Operator::ParseResult expectAstring(std::string &s_in); + Operator::ParseResult expectAtom(std::string &s_in); + Operator::ParseResult expectAtomChar(int &i_in); + Operator::ParseResult expectString(std::string &s_in); + + Operator::ParseResult expectDate(std::string &s_in); + + Operator::ParseResult expectNumber(unsigned int &i_in); + Operator::ParseResult expectDigit(unsigned int &i_in); + Operator::ParseResult expectDigitNZ(unsigned int &i_in); + + Operator::ParseResult expectLiteral(std::string &s_in); + Operator::ParseResult expectQuoted(std::string &s_in); + Operator::ParseResult expectQuotedChar(int &c_in); + + Operator::ParseResult expectSet(SequenceSet &s_in); + Operator::ParseResult expectSequenceNum(unsigned int &i_in); + Operator::ParseResult expectNZNumber(unsigned int &i_in); + + Operator::ParseResult expectCRLF(void); + Operator::ParseResult expectCR(void); + Operator::ParseResult expectLF(void); + + Operator::ParseResult expectThisString(const std::string &s_in); +} + + +#endif diff --git a/src/regmatch.cc b/src/regmatch.cc @@ -0,0 +1,62 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * regex.cc + * + * Description: + * Implementation of miscellaneous regexp functions. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "regmatch.h" +#include <string> + +#include <sys/types.h> +#include <regex.h> +#include <stdio.h> + +using namespace ::std; + +//------------------------------------------------------------------------ +int Binc::regexMatch(const string &data_in, const string &p_in) +{ + regex_t r; + regmatch_t rm[2]; + + if (regcomp(&r, p_in.c_str(), REG_EXTENDED | REG_NOSUB) != 0) + return 2; + + int n = regexec(&r, data_in.c_str(), data_in.length(), rm, 0); + regfree(&r); + if (n == 0) + return 0; + else + return 2; +} diff --git a/src/regmatch.h b/src/regmatch.h @@ -0,0 +1,48 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/util/regex.h + * + * Description: + * Declaration of miscellaneous regexp functions. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifndef regex_h_included +#define regex_h_included + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> + +namespace Binc { + + int regexMatch(const std::string &data_in, const std::string &p_in); +} + +#endif diff --git a/src/session-initialize-bincimap-up.cc b/src/session-initialize-bincimap-up.cc @@ -0,0 +1,228 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * session-initialize-bincimap-up.cc + * + * Description: + * <---> + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <syslog.h> + +#include "broker.h" +#include "io-ssl.h" +#include "io.h" +#include "session.h" +#include "storage.h" +#include "tools.h" +#include "convert.h" +#include <string> +#include <map> + +using namespace ::std; +using namespace Binc; +using namespace ArgParser; + +extern char **environ; + +namespace { + //------------------------------------------------------------------------ + void usage(char *name) + { + IO &logger = IOFactory::getInstance().get(2); + + logger << "Please refer to the man pages for bincimap-up and bincimapd" + << endl; + logger << "for more information about how to invoke Binc IMAP." << endl; + logger.flushContent(); + } +} + +//---------------------------------------------------------------------- +bool Session::initialize(int argc, char *argv[]) +{ + IOFactory &iofactory = IOFactory::getInstance(); + +#ifdef WITH_SSL + SSLEnabledIO *sslio = new SSLEnabledIO(stdout); + iofactory.assign(1, sslio); +#else + iofactory.assign(1, new IO(stdout)); +#endif + + iofactory.assign(2, new IO(stderr)); + + IO &com = iofactory.get(1); + IO &logger = iofactory.get(2); + + Session &session = Session::getInstance(); + + logger.noFlushOnEndl(); + + // Read command line arguments + if (!session.parseRequestLine(argc, argv)) + return false; + + // Show help if asked for it + if (session.command.help) { + usage(argv[0]); + logger.flushContent(); + return false; + } + + // Show help if asked for it + if (session.command.version) { + logger << "Binc IMAP v" << VERSION << endl; + logger.flushContent(); + return false; + } + + // Grab config file name + string configfile = session.command.configfile; + + // Read configuration + if (configfile != "") { + + // try to read global settings. + Storage gconfig(configfile, Storage::ReadOnly); + string section, key, value; + while (gconfig.get(&section, &key, &value)) + session.globalconfig[section][key] = value; + + if (!gconfig.eof()) { + logger << "error reading Binc IMAP's config file " + << configfile << ". Default values will be used instead: " + << gconfig.getLastError() << endl; + // don't flush! + } + } + + // Read configuration settings + session.initConfig(); + + // log settings + string ipenv = session.globalconfig["Log"]["ip environment variable"]; + // Initialize logger + string ip = getenv(ipenv.c_str()) ? getenv(ipenv.c_str()) : + getenv("TCPREMOTEIP") ? getenv("TCPREMOTEIP") : + getenv("REMOTE_HOST") ? getenv("REMOTE_HOST") : + getenv("REMOTEIP") ? getenv("REMOTEIP") : + getenv("SSLREMOTEIP") ? getenv("SSLREMOTEIP") : "?"; + session.setIP(ip); + + if (session.globalconfig["Log"]["type"] == "multilog" + || session.globalconfig["Log"]["type"] == "stderr") { + logger.setLogPrefix("unknown@" + ip + ":"); + logger.enableLogPrefix(); + } else if (session.globalconfig["Log"]["type"] == "" + || session.globalconfig["Log"]["type"] == "syslog") { + const string f = session.globalconfig["Log"]["syslog facility"]; + const string fn = session.globalconfig["Log"]["syslog facility number"]; + + int facility; + + if (fn != "") facility = atoi(fn); + else { + if (f == "LOG_USER") facility = LOG_USER; + else if (f == "LOG_LOCAL0") facility = LOG_LOCAL0; + else if (f == "LOG_LOCAL1") facility = LOG_LOCAL1; + else if (f == "LOG_LOCAL2") facility = LOG_LOCAL2; + else if (f == "LOG_LOCAL3") facility = LOG_LOCAL3; + else if (f == "LOG_LOCAL4") facility = LOG_LOCAL4; + else if (f == "LOG_LOCAL5") facility = LOG_LOCAL5; + else if (f == "LOG_LOCAL6") facility = LOG_LOCAL6; + else if (f == "LOG_LOCAL7") facility = LOG_LOCAL7; + else facility = LOG_DAEMON; + } + + session.globalconfig["Log"]["syslog facility number"] = toString(facility); + + logger.setModeSyslog("bincimap-up", facility); + } + + // Now that we know the log type, we can flush. + logger.flushContent(); + logger.flushOnEndl(); + + BrokerFactory &brokerfactory = BrokerFactory::getInstance(); + + brokerfactory.assign("AUTHENTICATE", new AuthenticateOperator()); + brokerfactory.assign("CAPABILITY", new CapabilityOperator()); + brokerfactory.assign("LOGIN", new LoginOperator()); + brokerfactory.assign("LOGOUT", new LogoutOperator()); + brokerfactory.assign("NOOP", new NoopOperator()); +#ifdef WITH_SSL + brokerfactory.assign("STARTTLS", new StarttlsOperator()); +#endif + +#ifdef WITH_SSL + // Set SSL mode if --ssl is passed + if (session.command.ssl) + if (sslio->setModeSSL()) { + session.add("sslmode", "true"); + } else { + session.setLastError("SSL negotiation failed: " + + sslio->getLastError()); + return false; + } +#endif + + session.setState(Session::NONAUTHENTICATED); + + // Read timeout settings from global config + idletimeout = atoi(session.globalconfig["Session"]["idle timeout"]); + authtimeout = atoi(session.globalconfig["Session"]["auth timeout"]); + transfertimeout = atoi(session.globalconfig["Session"]["transfer timeout"]); + + // Settings are not allowed to break the IMAP protocol + if (idletimeout < (30 * 60)) idletimeout = 30 * 60; + + // No auth timeout is not allowed. + if (authtimeout < 30) authtimeout = 30; + + // Set transfer timeout + com.setTransferTimeout(transfertimeout); + logger.setTransferTimeout(transfertimeout); + + // Read transfer buffer size + int buffersize = atoi(session.globalconfig["Session"]["transfer buffer size"]); + com.setBufferSize(buffersize >= 0 ? buffersize : 0); + + // umask settings + string umsk = session.globalconfig["Mailbox"]["umask"]; + if (umsk == "" || !isdigit(umsk[0])) umsk = "0777"; + unsigned int mode; + sscanf(session.globalconfig["Mailbox"]["umask"].c_str(), "%o", &mode); + umask((mode_t) mode); + + // If the depot was not initialized properly, return false. + return true; +} diff --git a/src/session-initialize-bincimapd.cc b/src/session-initialize-bincimapd.cc @@ -0,0 +1,299 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * session-initialize-bincimap-up.cc + * + * Description: + * <---> + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <syslog.h> + +#include "broker.h" +#include "maildir.h" +#include "bincimapd-module.h" +#include "depot.h" +#include "io-ssl.h" +#include "io.h" +#include "session.h" +#include "storage.h" +#include "tools.h" +#include "convert.h" +#include <string> +#include <map> +#include <signal.h> + +using namespace ::std; +using namespace Binc; +using namespace ArgParser; + +extern char **environ; + +vector<BincModule> modules; + +namespace { + //------------------------------------------------------------------------ + void usage(char *name) + { + IO &logger = IOFactory::getInstance().get(2); + + logger << "Please refer to the man pages for bincimap-up and bincimapd" + << endl; + logger << "for more information about how to invoke Binc IMAP." << endl; + logger.flushContent(); + } +} + +//---------------------------------------------------------------------- +bool Session::initialize(int argc, char *argv[]) +{ + IOFactory &iofactory = IOFactory::getInstance(); + iofactory.assign(1, new IO(stdout)); + iofactory.assign(2, new IO(stderr)); + + IO &com = iofactory.get(1); + IO &logger = iofactory.get(2); + logger.disable(); + + Session &session = Session::getInstance(); + + session.importFromEnv(); + + // Read command line arguments + if (!session.parseRequestLine(argc, argv)) + return false; + + // log settings + string ipenv = session.globalconfig["Log"]["ip environment variable"]; + // Initialize logger + string ip = getenv(ipenv.c_str()) ? getenv(ipenv.c_str()) : + getenv("TCPREMOTEIP") ? getenv("TCPREMOTEIP") : + getenv("REMOTEIP") ? getenv("REMOTEIP") : + getenv("SSLREMOTEIP") ? getenv("SSLREMOTEIP") : "?"; + session.setIP(ip); + + if (session.globalconfig["Log"]["type"] == "multilog") { + logger.setLogPrefix(session.getUserID() + "@" + ip + ":"); + logger.enableLogPrefix(); + } else if (session.globalconfig["Log"]["type"] == "stderr" ) { + // stderr is the default + } else if (session.globalconfig["Log"]["type"] == "" + || session.globalconfig["Log"]["type"] == "syslog") { + const string f = session.globalconfig["Log"]["syslog facility"]; + const string fn = session.globalconfig["Log"]["syslog facility number"]; + + int facility; + + if (fn != "") facility = atoi(fn); + else { + if (f == "LOG_USER") facility = LOG_USER; + else if (f == "LOG_LOCAL0") facility = LOG_LOCAL0; + else if (f == "LOG_LOCAL1") facility = LOG_LOCAL1; + else if (f == "LOG_LOCAL2") facility = LOG_LOCAL2; + else if (f == "LOG_LOCAL3") facility = LOG_LOCAL3; + else if (f == "LOG_LOCAL4") facility = LOG_LOCAL4; + else if (f == "LOG_LOCAL5") facility = LOG_LOCAL5; + else if (f == "LOG_LOCAL6") facility = LOG_LOCAL6; + else if (f == "LOG_LOCAL7") facility = LOG_LOCAL7; + else facility = LOG_DAEMON; + } + + session.globalconfig["Log"]["syslog facility number"] = toString(facility); + + logger.setModeSyslog("bincimapd", facility); + } + + logger.enable(); + + // Now that we know the log type, we can flush. + logger.flushContent(); + logger.flushOnEndl(); + + // Read command line arguments + if (!session.parseRequestLine(argc, argv)) { + logger << session.getLastError() << endl; + return false; + } + + // Show help if asked for it + if (session.command.help) { + usage(argv[0]); + return false; + } + + // Show help if asked for it + if (session.command.version) { + logger << "Binc IMAP v" << VERSION << endl; + return false; + } + + char *logindetails = getenv("BINCIMAP_LOGIN"); + if (logindetails == 0) { + logger + << "BINCIMAP_LOGIN missing from environment (are you sure you invoked " + << argv[0] << " properly?)" << endl; + return false; + } + + //----- + + // try to read local settings. + Storage lconfig(".bincimap", Storage::ReadOnly); + string section, key, value; + while (lconfig.get(&section, &key, &value)) + session.localconfig[section][key] = value; + + string tmp; + if ((tmp = session.localconfig["Mailbox"]["depot"]) != "") + session.globalconfig["Mailbox"]["depot"] = tmp; + if ((tmp = session.localconfig["Mailbox"]["path"]) != "") + session.globalconfig["Mailbox"]["path"] = tmp; + if ((tmp = session.localconfig["Mailbox"]["type"]) != "") + session.globalconfig["Mailbox"]["type"] = tmp; + + DepotFactory &depotfactory = DepotFactory::getInstance(); + depotfactory.assign(new IMAPdirDepot()); + depotfactory.assign(new MaildirPPDepot()); + + string depottype = session.globalconfig["Mailbox"]["depot"]; + if (depottype == "") depottype = "Maildir++"; + + if ((depot = depotfactory.get(depottype)) == 0) { + logger << "Found no Depot for \"" << depottype + << "\". Please check " + " your configurations file under the Mailbox section." + << endl; + logger.flushContent(); + return false; + } + + depot->assign(new Maildir()); + depot->setDefaultType("Maildir"); + + BrokerFactory &brokerfactory = BrokerFactory::getInstance(); + + brokerfactory.assign("APPEND", new AppendOperator()); + brokerfactory.assign("CAPABILITY", new CapabilityOperator()); + brokerfactory.assign("CHECK", new CheckOperator()); + brokerfactory.assign("CLOSE", new CloseOperator()); + brokerfactory.assign("COPY", new CopyOperator()); + brokerfactory.assign("CREATE", new CreateOperator()); + brokerfactory.assign("DELETE", new DeleteOperator()); + brokerfactory.assign("EXAMINE", new ExamineOperator()); + brokerfactory.assign("EXPUNGE", new ExpungeOperator()); + brokerfactory.assign("FETCH", new FetchOperator()); + brokerfactory.assign("LIST", new ListOperator()); + brokerfactory.assign("LOGOUT", new LogoutOperator()); + brokerfactory.assign("LSUB", new LsubOperator()); + brokerfactory.assign("NOOP", new NoopPendingOperator()); + brokerfactory.assign("RENAME", new RenameOperator()); + brokerfactory.assign("SEARCH", new SearchOperator()); + brokerfactory.assign("SELECT", new SelectOperator()); + brokerfactory.assign("STATUS", new StatusOperator()); + brokerfactory.assign("STORE", new StoreOperator()); + brokerfactory.assign("SUBSCRIBE", new SubscribeOperator()); + brokerfactory.assign("UNSUBSCRIBE", new UnsubscribeOperator()); + + string path = session.globalconfig["Mailbox"]["path"]; + if (path == "") path = "."; + else if (chdir(path.c_str()) != 0) { + mkdir(path.c_str(), 0777); + if (chdir(path.c_str()) != 0) { + logger << "when entering depot " + toImapString(path) + ": " + << strerror(errno) << endl; + return false; + } + } + + if (depot->get("INBOX") == 0) { + if (session.globalconfig["Mailbox"]["auto create inbox"] == "yes") + if (!depot->createMailbox("INBOX")) { + logger << depot->getLastError() << endl; + return false; + } + } + + // load subscription list + session.loadSubscribes(); + + session.setState(Session::AUTHENTICATED); + + // Loadable modules + + // Not implemented yet -- use absolute paths for modules + // vector<string> tmp_mods; + // split(session.globalconfig["module path"], ":", tmp_mods); + +// string k, v; +// if (session.globalconfig.getFirstEntry(k, v)) { +// do { +// if (k.substr(0,14) == "define module ") { +// BincModule module; +// if (module.open(v)) +// modules.push_back(module); +// else +// logger << "Warning: " << module.getLastError() << endl; +// } +// } while (session.globalconfig.getNextEntry(k, v)); +// } + + // Read timeout settings from global config + idletimeout = atoi(session.globalconfig["Session"]["idle timeout"]); + transfertimeout = atoi(session.globalconfig["Session"]["transfer timeout"]); + + // Set transfer timeout + com.setTransferTimeout(transfertimeout); + logger.setTransferTimeout(transfertimeout); + + // Read transfer buffer size + int buffersize = atoi(session.globalconfig["Session"]["transfer buffer size"]); + com.setBufferSize(buffersize >= 0 ? buffersize : 0); + + // umask settings + unsigned int mode; + sscanf(session.globalconfig["Mailbox"]["umask"].c_str(), "%o", &mode); + umask((mode_t) mode); + + const string details = logindetails; + string::size_type det = details.find('+'); + if (det == string::npos) { + logger << "invalid content of BINCIMAP_LOGIN - did you invoke " + << argv[0] << " correctly?" << endl; + return false; + } + + const string tag = details.substr(det + 1); + const string command = details.substr(0, det); + com << tag << " OK " << command << " completed" << endl; + com.flushContent(); + + return true; +} diff --git a/src/session.cc b/src/session.cc @@ -0,0 +1,545 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * session.cc + * + * Description: + * <---> + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <syslog.h> + +#include "io.h" +#include "session.h" +#include "storage.h" +#include "tools.h" +#include "convert.h" +#include <string> +#include <map> + +using namespace ::std; +using namespace Binc; +using namespace ArgParser; + +extern char **environ; + +//---------------------------------------------------------------------- +Session::Session(void) +{ + readbytes = 0; + writebytes = 0; + statements = 0; + bodies = 0; + idletimeout = 0; + authtimeout = 0; + mailboxchanges = true; + logfacility = LOG_DAEMON; +} + +//---------------------------------------------------------------------- +Session &Session::getInstance(void) +{ + static Session session; + return session; +} + +//---------------------------------------------------------------------- +void Session::initConfig(void) +{ + args.assign(); +} + +//---------------------------------------------------------------------- +const int Session::getState(void) const +{ + return state; +} + +//---------------------------------------------------------------------- +void Session::setState(int n) +{ + state = n; +} + +//---------------------------------------------------------------------- +const string &Session::getUserID(void) const +{ + return userid; +} + +//---------------------------------------------------------------------- +void Session::setUserID(const string &s) +{ + userid = s; +} + +//---------------------------------------------------------------------- +const string &Session::getIP(void) const +{ + return ip; +} + +//---------------------------------------------------------------------- +void Session::setIP(const string &s) +{ + ip = s; +} + +//---------------------------------------------------------------------- +void Session::setLogFacility(int facility) +{ + logfacility = facility; +} + +//---------------------------------------------------------------------- +int Session::getLogFacility(void) const +{ + return logfacility; +} + +//---------------------------------------------------------------------- +void Session::addBody(void) +{ + ++bodies; +} + +//---------------------------------------------------------------------- +void Session::addStatement(void) +{ + ++statements; +} + +//---------------------------------------------------------------------- +void Session::addReadBytes(int i) +{ + readbytes += i; +} + +//---------------------------------------------------------------------- +void Session::addWriteBytes(int i) +{ + writebytes += i; +} + +//---------------------------------------------------------------------- +int Session::getBodies(void) const +{ + return bodies; +} + +//---------------------------------------------------------------------- +int Session::getStatements(void) const +{ + return statements; +} + +//---------------------------------------------------------------------- +int Session::getWriteBytes(void) const +{ + return writebytes; +} + +//---------------------------------------------------------------------- +int Session::getReadBytes(void) const +{ + return readbytes; +} + +bool Session::parseRequestLine(int argc, char * argv[]) +{ + args = ArgParser::Args(argc, argv); + + args.addOptional("h|?|help", command.help); + args.addOptional("v|version", command.version); + args.addOptional("s|ssl", command.ssl); + args.addOptional("c|conf", command.configfile); + + // Override config file settings with command line options + string arg; + args.addOptional("a|allow-plain", + globalconfig["Authentication"]["allow plain auth in non ssl"]); + args.addOptional("p|auth-penalty", + globalconfig["Authentication"]["auth penalty"]); + args.addOptional("d|disable-starttls", + globalconfig["Authentication"]["disable starttls"]); + + args.addOptional("L|logtype", globalconfig["Log"]["type"]); + args.addOptional("I|ip-variable", + globalconfig["Log"]["environment ip variable"]); + + args.addOptional("M|mailbox-type", globalconfig["Mailbox"]["type"]); + args.addOptional("m|mailbox-path", globalconfig["Mailbox"]["path"]); + args.addOptional("C|create-inbox", globalconfig["Mailbox"]["auto create inbox"]); + args.addOptional("S|subscribe-mailboxes", + globalconfig["Mailbox"]["auto subscribe mailboxes"]); + args.addOptional("u|umask", globalconfig["Mailbox"]["umask"]); + + args.addOptional("J|jail-path", globalconfig["Security"]["jail path"]); + args.addOptional("x|jail-user", globalconfig["Security"]["jail user"]); + args.addOptional("X|jail-group", globalconfig["Security"]["jail group"]); + + args.addOptional("i|idle-timeout", globalconfig["Session"]["idle timeout"]); + args.addOptional("t|auth-timeout", globalconfig["Session"]["auth timeout"]); + args.addOptional("T|transfer-timeout", + globalconfig["Session"]["transfer timeout"]); + args.addOptional("b|transfer-buffersize", + globalconfig["Session"]["transfer buffer size"]); + + args.addOptional("p|pem-file", globalconfig["SSL"]["pem file"]); + args.addOptional("P|ca-path", globalconfig["SSL"]["ca path"]); + args.addOptional("f|ca-file", globalconfig["SSL"]["ca file"]); + args.addOptional("l|cipher-list", globalconfig["SSL"]["cipher list"]); + args.addOptional("V|verify-peer", globalconfig["SSL"]["verify peer"]); + + ArgumentError e(ArgParser::ArgumentError::NONE); + vector<string> rest; + + int i = args.parse(rest, e); + if (i == -1) { + string err = e.getErrorStr(); + if (err == "") { + switch (e.getErrorType()) { + case ArgParser::ArgumentError::NONE: + err = "Unknown error (none)"; + break; + case ArgParser::ArgumentError::CHECK: + err = "Syntax error"; + break; + case ArgParser::ArgumentError::REQUIRED_COMMAND: + err = "Required command"; + break; + case ArgParser::ArgumentError::REQUIRED_ARGUMENT: + err = "Required argument"; + break; + case ArgParser::ArgumentError::UNKNOWN: + err = "No such argument"; + break; + case ArgParser::ArgumentError::MISSING: + err = "Missing argument"; + break; + case ArgParser::ArgumentError::INVALID: + err = "Invalid argument"; + break; + default: + break; + } + } + + setLastError("Command line \"" + e.getName() + "\": " + err); + return false; + } + + unparsedArgs = argv + i; + args.assign(); + + return true; +} + +//---------------------------------------------------------------------- +void Session::add(const string &a, const string &b) +{ + attrs[a] = b; +} + +//---------------------------------------------------------------------- +const string &Session::operator [] (const string &s_in) const +{ + static const string NIL = ""; + if (attrs.find(s_in) == attrs.end()) + return NIL; + else + return attrs.find(s_in)->second; +} + +//---------------------------------------------------------------------- +void Session::exportToEnv(void) +{ + Tools &tools = Tools::getInstance(); + + tools.setenv("BINCIMAP_STATE", toString(state)); + tools.setenv("BINCIMAP_USERID", userid); + tools.setenv("BINCIMAP_IP", ip); + + for (map<string, string>::const_iterator i = attrs.begin(); + i != attrs.end(); ++i) + tools.setenv("BINCIMAP_CONF_" + i->first, i->second); + + int n = 0; + for (vector<string>::const_iterator i = subscribed.begin(); + i != subscribed.end(); ++i, ++n) + tools.setenv("BINCIMAP_SUBSCRIBED_" + toString(n), *i); + + map<string, map<string, string> >::const_iterator gi = globalconfig.begin(); + for (; gi != globalconfig.end(); ++gi) { + map<string, string>::const_iterator ji = gi->second.begin(); + for (; ji != gi->second.end(); ++ji) + tools.setenv("BINCIMAP_GLOBALCONFIG_" + + toHex(gi->first) + "::" + toHex(ji->first), + toHex(ji->second)); + } + + map<string, map<string, string> >::const_iterator li = localconfig.begin(); + for (; li != localconfig.end(); ++li) { + map<string, string>::const_iterator ji = li->second.begin(); + for (; ji != li->second.end(); ++ji) { + tools.setenv("BINCIMAP_GLOBALCONFIG_" + + toHex(li->first) + "::" + toHex(ji->first), + toHex(ji->second)); + } + } +} + +//---------------------------------------------------------------------- +void Session::importFromEnv(void) +{ + char *c; + int cnt = 0; + while ((c = environ[cnt]) != 0) { + string s = c; + + if (s.substr(0, 14) == "BINCIMAP_STATE") state = atoi(s.substr(15)); + else if (s.substr(0, 15) == "BINCIMAP_USERID") userid = s.substr(16); + else if (s.substr(0, 11) == "BINCIMAP_IP") ip = s.substr(12); + else if (s.substr(0, 21) == "BINCIMAP_GLOBALCONFIG") { + const string config = s.substr(22); + if (config.find("::") != string::npos) { + const string section = fromHex(config.substr(0, config.find("::"))); + const string data = config.substr(config.find("::") + 2); + + if (data.find("=") != string::npos) { + const string key = fromHex(data.substr(0, data.find("="))); + const string value = fromHex(data.substr(data.find("=") + 1)); + + globalconfig[section][key] = value; + } + } + } else if (s.substr(0, 20) == "BINCIMAP_LOCALCONFIG") { + const string config = s.substr(21); + if (config.find("::") != string::npos) { + const string section = fromHex(config.substr(0, config.find("::"))); + const string data = config.substr(config.find("::") + 2); + + if (data.find("=") != string::npos) { + const string key = fromHex(data.substr(0, data.find("="))); + const string value = fromHex(data.substr(data.find("=") + 1)); + + localconfig[section][key] = value; + } + } + } + + ++cnt; + } +} + +//---------------------------------------------------------------------- +const string &Session::getLastError(void) const +{ + return lastError; +} + +//---------------------------------------------------------------------- +void Session::setLastError(const string &error) const +{ + lastError = error; +} + +//---------------------------------------------------------------------- +const string &Session::getResponseCode(void) const +{ + return responseCode; +} + +//---------------------------------------------------------------------- +void Session::setResponseCode(const string &code) const +{ + responseCode = "[" + code + "] "; +} + +//---------------------------------------------------------------------- +void Session::clearResponseCode(void) const +{ + responseCode = ""; +} + +//---------------------------------------------------------------------- +pid_t Session::getPid(void) +{ + if (pid == 0) + pid = getpid(); + + return pid; +} + +//---------------------------------------------------------------------- +const std::string &Session::getHostname(void) +{ + if (hostname == "") { + char hostnamec[512]; + int hostnamelen = gethostname(hostnamec, sizeof(hostnamec)); + if (hostnamelen == -1 || hostnamelen == sizeof(hostnamec)) + strcpy(hostnamec, "localhost"); + hostnamec[511] = '\0'; + hostname = hostnamec; + } + + return hostname; +} + +//---------------------------------------------------------------------- +void Session::subscribeTo(const std::string mailbox) +{ + subscribed.push_back(mailbox); +} + +//---------------------------------------------------------------------- +bool Session::unsubscribeTo(const std::string mailbox) +{ + for (vector<string>::iterator i = subscribed.begin(); + i != subscribed.end(); ++i) { + if (*i == mailbox) { + subscribed.erase(i); + return true; + } + } + + return false; +} + +//---------------------------------------------------------------------- +void Session::loadSubscribes(void) +{ + // drop all existing subscribed folders. + subscribed.clear(); + + // try loading the .bincimap-subscribed file + bool ok = false; + FILE *fp = fopen(".bincimap-subscribed", "r"); + if (fp) { + int c; + string current; + while ((c = fgetc(fp)) != EOF) { + if (c == '\n') { + trim(current); + if (current != "") { + subscribed.push_back(current); + current = ""; + } + } else + current += c; + } + + fclose(fp); + ok = true; + } + + bool deleteOld = false; + if (!ok) { + // load subscription list. if it doesn't exist - initialize it with + // the values from the auto subscribe list. + Storage subs("bincimap-subscribed", Storage::ReadOnly); + string section, key, value; + + while (subs.get(&section, &key, &value)) + if (section == "subscribed") + subscribed.push_back(value); + + if (subs.eof()) { + ok = true; + deleteOld = true; + } + } + + if (!ok) { + string autosubmailboxes = globalconfig["Mailbox"]["auto subscribe mailboxes"]; + vector<string> mboxes; + split(autosubmailboxes, ",", mboxes); + + for (vector<string>::const_iterator i = mboxes.begin(); i != mboxes.end(); + ++i) { + string tmp = *i; + trim(tmp); + subscribed.push_back(tmp); + } + + saveSubscribes(); + } + + if (deleteOld) { + if (saveSubscribes()) + unlink("bincimap-subscribed"); + } +} + +//---------------------------------------------------------------------- +bool Session::saveSubscribes(void) const +{ + IO &logger = IOFactory::getInstance().get(2); + + // create a safe file name + string tpl = ".bincimap-subscribed-tmp-XXXXXX"; + char *ftemplate = new char[tpl.length() + 1]; + + strcpy(ftemplate, tpl.c_str()); + int fd = mkstemp(ftemplate); + if (fd == -1) { + logger << "unable to create temporary file \"" + << tpl << "\"" << endl; + return false; + } + + for (vector<string>::const_iterator i = subscribed.begin(); + i != subscribed.end(); ++i) { + string w = (*i) + "\n"; + if (write(fd, w.c_str(), w.length()) != (ssize_t) w.length()) { + logger << "failed to write to " << tpl << ": " + << strerror(errno) << endl; + break; + } + } + + fsync(fd); + close(fd); + if (rename(ftemplate, ".bincimap-subscribed") != 0) { + logger << "failed to rename " << ftemplate + << " to .bincimap-subscribed: " + << strerror(errno) << endl; + return false; + } + + return true; +} + +//---------------------------------------------------------------------- +int Session::timeout() const +{ + return state == NONAUTHENTICATED ? authtimeout : idletimeout; +} diff --git a/src/session.h b/src/session.h @@ -0,0 +1,160 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/session.h + * + * Description: + * <---> + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef session_h_included +#define session_h_included +#include "arg-parser.h" +#include <string> +#include <vector> + +namespace Binc { + + class Depot; + + //-------------------------------------------------------------------- + class Session { + public: + std::map<std::string, std::string> attrs; + + char **unparsedArgs; + + struct { + bool help; + bool version; + bool ssl; + std::string configfile; + } command; + + int idletimeout; + int authtimeout; + int transfertimeout; + + bool mailboxchanges; + + enum State { + NONAUTHENTICATED = 0x01, + AUTHENTICATED = 0x02, + SELECTED = 0x04, + LOGOUT = 0x00 + }; + + std::map<std::string, std::map<std::string, std::string> > globalconfig; + std::map<std::string, std::map<std::string, std::string> > localconfig; + + int timeout() const; + + std::vector<std::string> subscribed; + void subscribeTo(const std::string mailbox); + bool unsubscribeTo(const std::string mailbox); + void loadSubscribes(void); + bool saveSubscribes(void) const; + + const int getState(void) const; + void setState(int n); + void exportToEnv(void); + void importFromEnv(void); + bool parseRequestLine(int argc, char * argv[]); + int getWriteBytes(void) const; + int getReadBytes(void) const; + void addWriteBytes(int); + void addReadBytes(int); + int getBodies(void) const; + int getStatements(void) const; + void addBody(void); + void addStatement(void); + void setLogFacility(int facility); + int getLogFacility(void) const; + + const std::string &getLastError(void) const; + const std::string &getResponseCode(void) const; + const std::string &getIP(void) const; + const std::string &getUserID() const; + pid_t getPid(void); + const std::string &getHostname(void); + void setLastError(const std::string &error) const; + void setResponseCode(const std::string &error) const; + void clearResponseCode(void) const; + void setIP(const std::string &ip); + void setUserID(const std::string &s); + + inline Depot *getDepot(void) const; + + const std::string &operator [] (const std::string &) const; + + //-- + void add(const std::string &, const std::string &); + + //-- + static Session &getInstance(void); + void initConfig(void); + + bool initialize(int argc, char *argv[]); + + private: + //-- + int state; + std::string userid; + std::string ip; + char **argv; + int argc; + + int logfacility; + + int readbytes; + int writebytes; + int statements; + int bodies; + + Depot *depot; + + mutable std::string lastError; + mutable std::string responseCode; + ArgParser::Args args; + + pid_t pid; + std::string hostname; + + Session(void); + }; + + inline Depot *Session::getDepot(void) const + { + return depot; + } +} + +#endif diff --git a/src/status.cc b/src/status.cc @@ -0,0 +1,48 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * status.cc + * + * Description: + * Implementation of the Status class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ + +#include "status.h" + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +Status::Status(void) +{ +} + +//------------------------------------------------------------------------ +Status::~Status(void) +{ +} diff --git a/src/status.h b/src/status.h @@ -0,0 +1,81 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/mailbox/status.h + * + * Description: + * Declaration of the Status class. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef status_h_included +#define status_h_included + +namespace Binc { + + //------------------------------------------------------------------------ + class Status { + + //-- + int recent; + int messages; + int unseen; + int uidvalidity; + int uidnext; + + //-- + int statusid; + + public: + + //-- + inline void setMessages(int i) { messages = i; } + inline void setRecent(int i) { recent = i; } + inline void setStatusID(int i) { statusid = i; } + inline void setUnseen(int i) { unseen = i; } + inline void setUidValidity(int i) { uidvalidity = i; } + inline void setUidNext(int i) { uidnext = i; } + + //-- + inline int getMessages(void) const { return messages; } + inline int getRecent(void) const { return recent; } + inline int getStatusID(void) const { return statusid; } + inline int getUnseen(void) const { return unseen; } + inline int getUidValidity(void) const { return uidvalidity; } + inline int getUidNext(void) const { return uidnext; } + + + //-- + Status(void); + ~Status(void); + }; +} + +#endif diff --git a/src/storage.cc b/src/storage.cc @@ -0,0 +1,599 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * storage.cc + * + * Description: + * Implementation of the Binc::Storage format. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc@bincimap.org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "storage.h" +#include <errno.h> +#include <stdio.h> +#include <unistd.h> +#include <map> +#include <string> +#include "../src/convert.h" + +using namespace ::std; +using namespace ::Binc; + +class Lexer { +public: + Lexer(FILE *fp); + + unsigned int getCurrentColumn() const { return col; } + unsigned int getCurrentLine() const { return line; } + const string &getLastError() const { return lastError; } + + enum Type { + LeftCurly, RightCurly, Equals, Comma, QMark, Colon, Semicolon, + Text, EndOfFile, Error + }; + + bool nextToken(string *token, Type *type); + +protected: + enum State { + Searching, RestOfLineComment, CStyleComment, + QuotedString, HexString, TextString + }; + +private: + FILE *fp; + State state; + unsigned int line; + unsigned int col; + string lastError; +}; + +//------------------------------------------------------------------------ +Lexer::Lexer(FILE *f) : fp(f), state(Searching), line(0), col(0) +{ +} + +//------------------------------------------------------------------------ +bool Lexer::nextToken(string *token, Type *type) +{ + int lastc = '\0'; + + string buffer; + bool escaped = false; + + for (;;) { + int c = fgetc(fp); + if (c == EOF) { + if (ferror(fp)) { + lastError = strerror(errno); + *type = Error; + return false; + } + + if (state != Searching) { + lastError = "unexpected end of file"; + *type = Error; + return false; + } + + *type = EndOfFile; + return true; + } + + if (c == '\n') { + ++line; + col = 0; + } else + ++col; + + switch (state) { + case Searching: + // If whitespace, keep searching + if (c == ' ' || c == '\t' || c == '\r' || c == '\n' + || c == '\f' || c == '\v'); + else if (col == 0 && (c == '#' || c == ';')) + state = RestOfLineComment; + else if (lastc == '/' && c == '/') + state = RestOfLineComment; + else if (lastc == '/' && c == '*') + state = CStyleComment; + else if (lastc == '*' && c == '/' && state == CStyleComment) { + state = Searching; + c = '\0'; // avoid ambiguity + } else if (c == '?') { + *token = "?"; + *type = QMark; + return true; + } else if (c == ':') { + *token = ":"; + *type = Colon; + return true; + } else if (c == ';') { + *token = ";"; + *type = Semicolon; + return true; + } else if (c == '{') { + *token = "{"; + *type = LeftCurly; + return true; + } else if (c == '}') { + *token = "}"; + *type = RightCurly; + return true; + } else if (c == ',') { + *token = ","; + *type = Comma; + return true; + } else if (c == '=') { + *token = "="; + *type = Equals; + return true; + } else if (c == '\"') { + state = QuotedString; + } else if (c == '<') { + state = HexString; + } else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') + || (c >= '0' && c <= '9') || c == '.' || c == '_' + || c == '-' || c == '^') { + state = TextString; + buffer = ""; + buffer += (char) c; + } else if (c != '/') { + // Syntax error + lastError = "unexpected character '"; + lastError += (char) c; + lastError += "'"; + return false; + } + + break; + case RestOfLineComment: + if (c == '\n') + state = Searching; + break; + case CStyleComment: + if (c == '/' && lastc == '*') + state = Searching; + break; + case QuotedString: + if (escaped) { + buffer += (char) c; + escaped = false; + } else if (c == '\\') { + escaped = true; + } else if (c == '\"') { + *token = buffer; + *type = Text; + buffer = ""; + state = Searching; + return true; + } else { + buffer += (char) c; + } + + break; + case TextString: + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') + || (c >= '0' && c <= '9') || c == '_' + || c == '.' || c == '-' || c == '^') + buffer += (char) c; + else { + *token = buffer; + buffer = ""; + *type = Text; + ungetc(c, fp); + state = Searching; + return true; + } + break; + case HexString: + if ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') + || (c >= '0' && c <= '9')) + buffer += (char) c; + else if (c == '>') { + *token = fromHex(buffer); + buffer = ""; + *type = Text; + state = Searching; + return true; + } else { + lastError = "expected a-f, A-F, 0-9 or '>'"; + return false; + } + break; + }; + + lastc = c; + } +} + +//------------------------------------------------------------------------ +Storage::Storage(const string &f, Mode m) + : fp(0), fd(0), fileName(f), state(Searching), mode(m), + lastError("unknown error"), atEndOfFile(false), firstSection(true) +{ + if (m == ReadOnly) { + if ((fp = fopen(f.c_str(), m == ReadOnly ? "r" : "w")) == 0) { + lastError = "when opening \"" + f + "\": "; + lastError += strerror(errno); + } + } else { + // create a safe file name + string tpl = fileName + "XXXXXX"; + char *ftemplate = new char[tpl.length() + 1]; + if (ftemplate == 0) { + lastError = "out of memory, couldn't create safe filename"; + return; + } + + if (ftemplate) { + strcpy(ftemplate, tpl.c_str()); + while ((fd = mkstemp(ftemplate)) == 0 && errno == EEXIST) { + } + + if (fd == 0) { + lastError = "when opening \"" + f + "\": "; + lastError += strerror(errno); + } + } + + fileName = ftemplate; + } +} + +//------------------------------------------------------------------------ +Storage::~Storage(void) +{ + if (fp) + fclose(fp); + if (fd) + close(fd); +} + +//------------------------------------------------------------------------ +bool Storage::get(string *section, string *key, string *value) +{ + if (mode == WriteOnly) { + lastError = "unable to read from \"" + fileName + "\" when" + " in WriteOnly mode"; + return false; + } + + if (!fp) + return false; + + string keytmp; + string valuetmp; + + Lexer lex(fp); + Lexer::Type type; + string token; + while (lex.nextToken(&token, &type) && type != Lexer::Error) { + if (type == Lexer::EndOfFile) { + if (state != Searching) { + lastError = "unexpected end of file"; + return false; + } + + atEndOfFile = true; + return false; + } + + // convert from alias to token + if (type == Lexer::Text && aliases.find(token) != aliases.end()) + token = aliases[token]; + + switch (state) { + case Searching: + if (type == Lexer::QMark) { + state = AliasKey; + } else if (type != Lexer::Text) { + lastError = "expected text"; + lastError += " at line " + toString(lex.getCurrentLine()); + lastError += ", col " + toString(lex.getCurrentColumn()); + return false; + } else { + curSection = token; + state = Section; + } + break; + case AliasKey: + if (type != Lexer::Text) { + lastError = "expected text"; + lastError += " at line " + toString(lex.getCurrentLine()); + lastError += ", col " + toString(lex.getCurrentColumn()); + return false; + } + + keytmp = token; + state = AliasColon; + break; + case AliasColon: + if (type != Lexer::Colon) { + lastError = "expected colon"; + lastError += " at line " + toString(lex.getCurrentLine()); + lastError += ", col " + toString(lex.getCurrentColumn()); + return false; + } + state = AliasValue; + break; + case AliasValue: + if (type != Lexer::Text) { + lastError = "expected text"; + lastError += " at line " + toString(lex.getCurrentLine()); + lastError += ", col " + toString(lex.getCurrentColumn()); + return false; + } + + valuetmp = token; + state = AliasEnd; + break; + case AliasEnd: + if (type != Lexer::Semicolon) { + lastError = "expected text"; + lastError += " at line " + toString(lex.getCurrentLine()); + lastError += ", col " + toString(lex.getCurrentColumn()); + return false; + } + + aliases[keytmp] = valuetmp; + state = Searching; + break; + case Section: + if (type != Lexer::LeftCurly) { + lastError = "expected '{'"; + lastError += " at line " + toString(lex.getCurrentLine()); + lastError += ", col " + toString(lex.getCurrentColumn()); + return false; + } + + state = Key; + keytmp = ""; + break; + case Key: + if (type == Lexer::Text) { + if (keytmp != "") + keytmp += " "; + keytmp += token; + } else if (type == Lexer::Equals) { + state = Value; + } else { + if (type == Lexer::RightCurly) { + if (keytmp != "") { + lastError = "unexpected '}'"; + lastError += " at line " + toString(lex.getCurrentLine()); + lastError += ", col " + toString(lex.getCurrentColumn()); + return false; + } else + state = Searching; + } else { + lastError = "expected text or '='"; + lastError += " at line " + toString(lex.getCurrentLine()); + lastError += ", col " + toString(lex.getCurrentColumn()); + return false; + } + } + break; + case Value: + if (type == Lexer::Text) { + if (valuetmp != "") + valuetmp += " "; + valuetmp += token; + } else if (type == Lexer::Comma || type == Lexer::RightCurly) { + *section = curSection; + *key = keytmp; + *value = valuetmp; + keytmp = ""; + valuetmp = ""; + + if (type == Lexer::RightCurly) + state = Searching; + else + state = Key; + + return true; + } + }; + } + + lastError = lex.getLastError(); + lastError += " at line " + toString(lex.getCurrentLine() + 1); + lastError += ", col " + toString(lex.getCurrentColumn() + 1); + return false; +} + +namespace { + //---------------------------------------------------------------------- + inline bool islabelchar(char c) + { + switch (c) { + case 0x2D: case 0x2E: + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: + case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: + case 0x45: case 0x46: case 0x47: case 0x48: case 0x49: + case 0x4A: case 0x4B: case 0x4C: case 0x4D: case 0x4E: + case 0x4F: case 0x50: case 0x51: case 0x52: case 0x53: + case 0x54: case 0x55: case 0x56: case 0x57: case 0x58: + case 0x59: case 0x5A: + // case 0x5B: + // case 0x5C: + // case 0x5D: + case 0x5E: case 0x5F: + // case 0x60: + case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: + case 0x66: case 0x67: case 0x68: case 0x69: case 0x6A: + case 0x6B: case 0x6C: case 0x6D: case 0x6E: case 0x6F: + case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: + case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: + case 0x7A: + return true; + default: return false; + } + } + + //---------------------------------------------------------------------- + inline const string &encode(const string &s) + { + static string output; + output = ""; + + for (string::const_iterator i = s.begin(); i != s.end(); ++i) + if ((unsigned char)*i < 32 || (unsigned char)*i > 127) { + output += "<"; + output += toHex(s); + output += ">"; + return output; + } + + for (string::const_iterator i = s.begin(); i != s.end(); ++i) + if (!islabelchar(*i)) { + output = "\""; + char c; + for (string::const_iterator i = s.begin(); i != s.end(); ++i) + switch ((c = *i)) { + case '\"': output += "\\\""; break; + case '\\': output += "\\\\"; break; + default: output += c; break; + } + output += "\""; + return output; + } + + return output = s; + } + + //---------------------------------------------------------------------- + inline bool writeData(int fd, const string &out) + { + static string buffer; + + buffer += out; + if (buffer.size() >= 4096 || out == "") { + int written = 0; + while (1) { + int retval = write(fd, buffer.c_str() + written, + buffer.length() - written); + if (retval == (int) buffer.length()) + break; + + if (retval == -1) { + if (errno == EINTR) continue; + return false; + } + + written += retval; + } + + buffer = ""; + } + + return true; + } +} + +//------------------------------------------------------------------------ +bool Storage::put(const string &section, const string &key, + const string &value) +{ + if (!fd) + return false; + + if (mode == ReadOnly) { + lastError = "unable to write to \"" + fileName + + "\" when in ReadOnly mode"; + return false; + } + + string data; + if (curSection != section) { + if (firstSection) + firstSection = false; + else + data = "\n}\n"; + + data += section + " {"; + curSection = section; + } else + data = ","; + + data += "\n\t"; + data += encode(key); + data += " = "; + data += encode(value); + + if (!writeData(fd, data)) { + lastError = "when writing to \"" + fileName + "\": "; + lastError += strerror(errno); + return false; + } + + return true; +} + +//------------------------------------------------------------------------ +bool Storage::commit(void) +{ + if (!writeData(fd, "\n}\n")) { + lastError = "when writing to \"" + fileName + "\":"; + lastError += strerror(errno); + unlink(fileName.c_str()); + } + + if (!writeData(fd, "")) { + lastError = "when writing to \"" + fileName + "\":"; + lastError += strerror(errno); + unlink(fileName.c_str()); + } + + if (fsync(fd) != 0) { + lastError = "when syncing \"" + fileName + "\":"; + lastError += strerror(errno); + return false; + } + + if (rename(fileName.c_str(), + fileName.substr(0, fileName.length() - 6).c_str()) != 0) { + lastError = "when renaming \"" + fileName + "\" to \"" + + fileName.substr(0, fileName.length() - 6) + "\": "; + lastError += strerror(errno); + unlink(fileName.c_str()); + return false; + } + + if (close(fd) != 0) { + lastError = "when committing \"" + fileName + "\":"; + lastError += strerror(errno); + return false; + } + + fd = 0; + + return true; +} diff --git a/src/storage.h b/src/storage.h @@ -0,0 +1,100 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * storage.h + * + * Description: + * Declaration of the Binc::Storage class + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc@bincimap.org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#ifndef STORAGEPARSER_H_INCLUDED +#define STORAGEPARSER_H_INCLUDED +#include <map> +#include <string> + +#include <stdio.h> + +namespace Binc { + class Storage { + public: + enum Mode { + ReadOnly, WriteOnly + }; + + Storage(const std::string &fileName, Mode mode); + ~Storage(void); + + bool eof(void) const; + + bool get(std::string *section, std::string *key, + std::string *value); + + bool put(const std::string &section, const std::string &key, + const std::string &value); + + bool commit(void); + + std::string getLastError(void) const; + + protected: + void setLastError(const std::string &errorString) const; + + enum State { + Searching, Section, Key, Value, + AliasKey, AliasColon, AliasValue, AliasEnd + }; + + private: + FILE *fp; + int fd; + std::string fileName; + State state; + + Mode mode; + + std::string lastError; + std::string curSection; + bool atEndOfFile; + bool firstSection; + std::map<std::string, std::string> aliases; + }; + + inline std::string Storage::getLastError(void) const + { + return lastError; + } + + inline bool Storage::eof(void) const + { + return atEndOfFile; + } +} + +#endif diff --git a/src/storageparser.cc b/src/storageparser.cc @@ -0,0 +1,1355 @@ +/* A Bison parser, made from storageparser.y, by GNU bison 1.75. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program 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 2, or (at your option) + any later version. + + This program 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, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* If NAME_PREFIX is specified substitute the variables and functions + names. */ +#define yyparse storageparserparse +#define yylex storageparserlex +#define yyerror storageparsererror +#define yylval storageparserlval +#define yychar storageparserchar +#define yydebug storageparserdebug +#define yynerrs storageparsernerrs + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + LABELCHARS = 258, + QUOTED = 259, + HEX = 260 + }; +#endif +#define LABELCHARS 258 +#define QUOTED 259 +#define HEX 260 + + + + +/* Copy the first part of user declarations. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> +#include <map> +#include <vector> + +#include "storage.h" +#include "base64.h" +#include "convert.h" + + namespace Binc { + + std::string label; + std::string label_char; + std::string section; + std::string astring; + std::string astring_sl; + std::string astrings; + std::string storage_erradd; + std::string storage_error; + std::string pair_first; + + std::map<std::string, std::string> aliastotext; + std::map<std::string, std::string> texttoalias; + + extern Storage *internal__storage; + + /* external declarations */ + extern char *storageparsertext; + extern std::string storage_quoted; + int yylex(); + int yyerror(char *); + + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 1 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#ifndef YYSTYPE +typedef int yystype; +# define YYSTYPE yystype +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +#ifndef YYLTYPE +typedef struct yyltype +{ + int first_line; + int first_column; + int last_line; + int last_column; +} yyltype; +# define YYLTYPE yyltype +# define YYLTYPE_IS_TRIVIAL 1 +#endif + +/* Copy the second part of user declarations. */ + + +/* Line 213 of /usr/share/bison/yacc.c. */ +#line 149 "storageparser.cc" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# else +# ifndef YYSTACK_USE_ALLOCA +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC malloc +# define YYSTACK_FREE free +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAX) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short yysigned_char; +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 13 +#define YYLAST 38 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 13 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 21 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 29 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 41 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 260 + +#define YYTRANSLATE(X) \ + ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 11, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 7, 8, + 2, 12, 2, 6, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 9, 2, 10, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned char yyprhs[] = +{ + 0, 0, 3, 6, 8, 11, 13, 16, 18, 19, + 20, 28, 29, 30, 31, 39, 41, 42, 44, 45, + 46, 52, 54, 55, 56, 62, 65, 67, 69, 71 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yysigned_char yyrhs[] = +{ + 14, 0, -1, 15, 16, -1, 16, -1, 15, 17, + -1, 17, -1, 16, 20, -1, 20, -1, -1, -1, + 6, 33, 18, 7, 33, 19, 8, -1, -1, -1, + -1, 25, 21, 9, 22, 24, 23, 10, -1, 26, + -1, -1, 3, -1, -1, -1, 26, 27, 11, 28, + 29, -1, 29, -1, -1, -1, 32, 30, 12, 31, + 32, -1, 32, 33, -1, 33, -1, 25, -1, 4, + -1, 5, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned char yyrline[] = +{ + 0, 77, 77, 78, 82, 83, 87, 88, 94, 105, + 92, 123, 133, 137, 122, 147, 148, 152, 160, 164, + 159, 168, 173, 183, 172, 196, 202, 210, 215, 220 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "LABELCHARS", "QUOTED", "HEX", "'?'", + "':'", "';'", "'{'", "'}'", "','", "'='", "$accept", "file", "aliases", + "sections", "alias", "@1", "@2", "section", "@3", "@4", "@5", + "o_pair_cl", "label", "pair_cl", "@6", "@7", "pair", "@8", "@9", + "astring_sl", "astring", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 63, 58, 59, 123, + 125, 44, 61 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 13, 14, 14, 15, 15, 16, 16, 18, 19, + 17, 21, 22, 23, 20, 24, 24, 25, 27, 28, + 26, 26, 30, 31, 29, 32, 32, 33, 33, 33 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 2, 1, 2, 1, 2, 1, 0, 0, + 7, 0, 0, 0, 7, 1, 0, 1, 0, 0, + 5, 1, 0, 0, 5, 2, 1, 1, 1, 1 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 0, 17, 0, 0, 0, 3, 5, 7, 11, 28, + 29, 27, 8, 1, 2, 4, 6, 0, 0, 12, + 0, 16, 9, 13, 15, 21, 22, 26, 0, 0, + 0, 0, 25, 10, 14, 19, 23, 0, 0, 20, + 24 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yysigned_char yydefgoto[] = +{ + -1, 3, 4, 5, 6, 18, 28, 7, 17, 21, + 29, 23, 11, 24, 30, 37, 25, 31, 38, 26, + 27 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -13 +static const yysigned_char yypact[] = +{ + 4, -13, 9, 3, 4, 5, -13, -13, -13, -13, + -13, -13, -13, -13, 5, -13, -13, -5, 2, -13, + 9, 9, -13, -13, 6, -13, 9, -13, 8, 10, + 11, 7, -13, -13, -13, -13, -13, 9, 9, -13, + 9 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yysigned_char yypgoto[] = +{ + -13, -13, -13, 17, 19, -13, -13, -3, -13, -13, + -13, -13, 1, -13, -13, -13, -12, -13, -13, -11, + -2 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, parse error. */ +#define YYTABLE_NINF -19 +static const yysigned_char yytable[] = +{ + 12, 8, 16, 13, 19, 8, 8, 1, 1, 20, + 2, 16, 1, 9, 10, 8, 33, -18, 22, 36, + 34, 14, 35, 15, 32, 39, 0, 40, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32 +}; + +static const yysigned_char yycheck[] = +{ + 2, 0, 5, 0, 9, 4, 5, 3, 3, 7, + 6, 14, 3, 4, 5, 14, 8, 11, 20, 12, + 10, 4, 11, 4, 26, 37, -1, 38, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 40 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 3, 6, 14, 15, 16, 17, 20, 25, 4, + 5, 25, 33, 0, 16, 17, 20, 21, 18, 9, + 7, 22, 33, 24, 26, 29, 32, 33, 19, 23, + 27, 30, 33, 8, 10, 11, 12, 28, 31, 29, + 32 +}; + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrlab1 + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yychar1 = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror ("syntax error: cannot back up"); \ + YYERROR; \ + } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + Current.first_line = Rhs[1].first_line; \ + Current.first_column = Rhs[1].first_column; \ + Current.last_line = Rhs[N].last_line; \ + Current.last_column = Rhs[N].last_column; +#endif + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#define YYLEX yylex () + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +#endif /* !YYDEBUG */ + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#if YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*-----------------------------. +| Print this symbol on YYOUT. | +`-----------------------------*/ + +static void +#if defined (__STDC__) || defined (__cplusplus) +yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue) +#else +yysymprint (yyout, yytype, yyvalue) + FILE* yyout; + int yytype; + YYSTYPE yyvalue; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvalue; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyout, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyout, yytoknum[yytype], yyvalue); +# endif + } + else + YYFPRINTF (yyout, "nterm %s (", yytname[yytype]); + + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyout, ")"); +} +#endif /* YYDEBUG. */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +#if defined (__STDC__) || defined (__cplusplus) +yydestruct (int yytype, YYSTYPE yyvalue) +#else +yydestruct (yytype, yyvalue) + int yytype; + YYSTYPE yyvalue; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvalue; + + switch (yytype) + { + default: + break; + } +} + + + +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +# define YYPARSE_PARAM_DECL +# else +# define YYPARSE_PARAM_ARG YYPARSE_PARAM +# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +# endif +#else /* !YYPARSE_PARAM */ +# define YYPARSE_PARAM_ARG +# define YYPARSE_PARAM_DECL +#endif /* !YYPARSE_PARAM */ + +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ +# ifdef YYPARSE_PARAM +int yyparse (void *); +# else +int yyparse (void); +# endif +#endif + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of parse errors so far. */ +int yynerrs; + + +int +yyparse (YYPARSE_PARAM_ARG) + YYPARSE_PARAM_DECL +{ + + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yychar1 = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; + register short *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + + + +#define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else + /* Extend the stack our own way. */ + if (yystacksize >= YYMAXDEPTH) + goto yyoverflowlab; + yystacksize *= 2; + if (yystacksize > YYMAXDEPTH) + yystacksize = YYMAXDEPTH; + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyssp >= yyss + yystacksize - 1) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + /* Convert token to internal form (in yychar1) for indexing tables with. */ + + if (yychar <= 0) /* This means end of input. */ + { + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more. */ + + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yychar1 = YYTRANSLATE (yychar); + + /* We have to keep this `#if YYDEBUG', since we use variables + which are defined only if `YYDEBUG' is set. */ + YYDPRINTF ((stderr, "Next token is ")); + YYDSYMPRINT ((stderr, yychar1, yylval)); + YYDPRINTF ((stderr, "\n")); + } + + /* If the proper action on seeing token YYCHAR1 is to reduce or to + detect an error, take that action. */ + yyn += yychar1; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + YYDPRINTF ((stderr, "Shifting token %d (%s), ", + yychar, yytname[yychar1])); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + +#if YYDEBUG + /* We have to keep this `#if YYDEBUG', since we use variables which + are defined only if `YYDEBUG' is set. */ + if (yydebug) + { + int yyi; + + YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", + yyn - 1, yyrline[yyn]); + + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++) + YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]); + } +#endif + switch (yyn) + { + case 8: + { + if (aliastotext.find(pair_first) != aliastotext.end()) { + // FIXME: ignore for now + // throw StorageException("alias already defined for " + pair_first); + } + + pair_first = astring; + astring = ""; +} + break; + + case 9: + { + if (texttoalias.find(astring) != texttoalias.end() + && astring != pair_first) { + // FIXME: ignore for now + // throw StorageException("an alias already points to " + astring); + } + + aliastotext[pair_first] = astring; + texttoalias[astring] = pair_first; + + astring = ""; + pair_first = ""; +} + break; + + case 11: + { + if (aliastotext.find(label) != aliastotext.end()) + section = aliastotext[label]; + else + section = label; + + label = ""; + storage_erradd = "expected '{'"; +} + break; + + case 12: + { + storage_erradd = "expected comma seperated list of pairs"; +} + break; + + case 13: + { + storage_erradd = "expected '}'"; +} + break; + + case 14: + { + storage_erradd = ""; +} + break; + + case 17: + { + label = storageparsertext; +} + break; + + case 18: + { + storage_erradd = "expected ','"; +} + break; + + case 19: + { + storage_erradd = "expected pair"; +} + break; + + case 22: + { + storage_erradd = "expected '='"; + + if (aliastotext.find(astring_sl) != aliastotext.end()) + pair_first = aliastotext[astring_sl]; + else + pair_first = astring_sl; + astring_sl = ""; +} + break; + + case 23: + { + storage_erradd = "expected second string in a pair"; +} + break; + + case 24: + { + internal__storage->setSection(section); + internal__storage->insert(pair_first, astring_sl); + astring_sl = ""; + pair_first = ""; +} + break; + + case 25: + { + astring_sl += " "; + astring_sl += astring; + astring = ""; +} + break; + + case 26: + { + astring_sl = astring; + astring = ""; +} + break; + + case 27: + { + astring = label; + label = ""; +} + break; + + case 28: + { + astring = storage_quoted; + storage_quoted = ""; +} + break; + + case 29: + { + std::string tmp = storageparsertext; + if (tmp.size() > 2) + tmp = tmp.substr(1, tmp.size() - 2); + astring = Binc::fromHex(tmp); +} + break; + + + } + +/* Line 1016 of /usr/share/bison/yacc.c. */ +#line 1132 "storageparser.cc" + + yyvsp -= yylen; + yyssp -= yylen; + + +#if YYDEBUG + if (yydebug) + { + short *yyssp1 = yyss - 1; + YYFPRINTF (stderr, "state stack now"); + while (yyssp1 != yyssp) + YYFPRINTF (stderr, " %d", *++yyssp1); + YYFPRINTF (stderr, "\n"); + } +#endif + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + char *yymsg; + int yyx, yycount; + + yycount = 0; + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + yysize += yystrlen (yytname[yyx]) + 15, yycount++; + yysize += yystrlen ("parse error, unexpected ") + 1; + yysize += yystrlen (yytname[yytype]); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "parse error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) + { + yycount = 0; + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); + yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + const char *yyq = ! yycount ? ", expecting " : " or "; + yyp = yystpcpy (yyp, yyq); + yyp = yystpcpy (yyp, yytname[yyx]); + yycount++; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror ("parse error; also virtual memory exhausted"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror ("parse error"); + } + goto yyerrlab1; + + +/*----------------------------------------------------. +| yyerrlab1 -- error raised explicitly by an action. | +`----------------------------------------------------*/ +yyerrlab1: + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + /* Return failure if at end of input. */ + if (yychar == YYEOF) + { + /* Pop the error token. */ + YYPOPSTACK; + /* Pop the rest of the stack. */ + while (yyssp > yyss) + { + YYDPRINTF ((stderr, "Error: popping ")); + YYDSYMPRINT ((stderr, + yystos[*yyssp], + *yyvsp)); + YYDPRINTF ((stderr, "\n")); + yydestruct (yystos[*yyssp], *yyvsp); + YYPOPSTACK; + } + YYABORT; + } + + YYDPRINTF ((stderr, "Discarding token %d (%s).\n", + yychar, yytname[yychar1])); + yydestruct (yychar1, yylval); + yychar = YYEMPTY; + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + YYDPRINTF ((stderr, "Error: popping ")); + YYDSYMPRINT ((stderr, + yystos[*yyssp], *yyvsp)); + YYDPRINTF ((stderr, "\n")); + + yydestruct (yystos[yystate], *yyvsp); + yyvsp--; + yystate = *--yyssp; + + +#if YYDEBUG + if (yydebug) + { + short *yyssp1 = yyss - 1; + YYFPRINTF (stderr, "Error: state stack now"); + while (yyssp1 != yyssp) + YYFPRINTF (stderr, " %d", *++yyssp1); + YYFPRINTF (stderr, "\n"); + } +#endif + } + + if (yyn == YYFINAL) + YYACCEPT; + + YYDPRINTF ((stderr, "Shifting error token, ")); + + *++yyvsp = yylval; + + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +} + + + + +#include "lex.storageparser.c" + +} + diff --git a/src/tools.cc b/src/tools.cc @@ -0,0 +1,73 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * tools.cc + * + * Description: + * Implementation of miscellaneous tools. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <errno.h> + +#include "tools.h" + +using namespace ::std; +using namespace Binc; + +//------------------------------------------------------------------------ +Tools::Tools(void) +{ +} + +//------------------------------------------------------------------------ +Tools &Tools::getInstance(void) +{ + static Tools tools; + return tools; +} + +//------------------------------------------------------------------------ +void Tools::setenv(const string &key, const string &value) const +{ + char *c = strdup((key + "=" + value).c_str()); + putenv(c); +} + +//------------------------------------------------------------------------ +string Tools::getenv(const string &key) const +{ + static const string NIL = ""; + + const char *c = ::getenv((char *)key.c_str()); + if (c == 0) + return NIL; + else + return string(c); +} diff --git a/src/tools.h b/src/tools.h @@ -0,0 +1,54 @@ +/* -*- Mode: c++; -*- */ +/* -------------------------------------------------------------------- + * Filename: + * src/util/tools.h + * + * Description: + * Declaration of miscellaneous tools. + * + * Authors: + * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> + * + * Bugs: + * + * ChangeLog: + * + * -------------------------------------------------------------------- + * Copyright 2002-2004 Andreas Aardal Hanssen + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * -------------------------------------------------------------------- + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string> + +namespace Binc { + + class Tools { + private: + Tools(void); + + public: + void setenv(const std::string &key, const std::string &value) const; + std::string getenv(const std::string &key) const; + + //-- + static Tools &getInstance(void); + }; + +} diff --git a/tests/Makefile.am b/tests/Makefile.am @@ -0,0 +1,23 @@ +# This program 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 2 of the License, or +# (at your option) any later version. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, +# USA. + +#-------------------------------------------------------------------------- +noinst_PROGRAMS = autotests + + +#-------------------------------------------------------------------------- +autotests_SOURCES = framework.h framework.cc tests.cc ../src/convert.cc ../src/regmatch.cc ../src/tools.h ../src/tools.cc + +#-------------------------------------------------------------------------- +AM_CXXFLAGS = -I.. + + +#-------------------------------------------------------------------------- +autotests_LDFLAGS = -L.. diff --git a/tests/framework.cc b/tests/framework.cc @@ -0,0 +1,84 @@ + +/*-*-mode:c++-*-*/ +#include <unistd.h> +#include <iostream> +#include <signal.h> +#include <wait.h> +#include <errno.h> +#include "framework.h" +#include "../src/convert.h" +#include "../src/regmatch.h" +#include "../src/tools.h" + +using namespace ::std; +using namespace ::Binc; + + +FrameWork::FrameWork(const std::string &binary) +{ + pipe(readpipe); + pipe(writepipe); + + cout << "Starting " << binary << "." << endl; + + if ((childspid = fork()) == 0) { + dup2(writepipe[0], 0); + dup2(readpipe[1], 1); + close(writepipe[1]); + close(readpipe[0]); + + char *cwd = getcwd(0, 0); + string dest = cwd; + dest += "/"; + dest += binary; + + execl(dest.c_str(), 0); + exit(2); + } +} + +bool FrameWork::test(const std::string &request, const std::string &result) +{ + string tmp = request; + trim(tmp); + string tmp2 = result; + trim(tmp2); + + if (request != "") { + ssize_t res = write(writepipe[1], request.c_str(), request.length()); + if (res != (ssize_t) request.length()) { + printf("test(\"%s\", \"%s\") failed: %s\n", tmp.c_str(), tmp2.c_str(), strerror(errno)); + return false; + } + } + + char c; + string got; + + while (read(readpipe[0], &c, 1) == 1 && c != '\n') + got += c; + got += '\n'; + + if (got != result) { + printf("test(\"%s\", \"%s\") failed: got %s\n", tmp.c_str(), tmp2.c_str(), got.c_str()); + return false; + } + + printf("test(\"%s\", \"%s\") ok.\n", tmp.c_str(), tmp2.c_str()); + return true; +} + + +FrameWork::~FrameWork(void) +{ + kill(childspid, SIGTERM); + int result; + wait(&result); +} + +void FrameWork::setConfig(const std::string &section, const string &key, const string &value) +{ + Tools::getInstance().setenv("BINCIMAP_GLOBALCONFIG_" + + toHex(section) + "::" + toHex(key), + toHex(value)); +} diff --git a/tests/framework.h b/tests/framework.h @@ -0,0 +1,24 @@ +#ifndef FRAMEWORK_H_INCLUDED +#define FRAMEWORK_H_INCLUDED + +/*-*-mode:c++-*-*/ +#include <string> + +class FrameWork +{ + public: + FrameWork(const std::string &binary); + ~FrameWork(void); + + bool test(const std::string &request, const std::string &result); + + static void setConfig(const std::string &section, const std::string &key, const std::string &value); + + + private: + int childspid; + int readpipe[2]; + int writepipe[2]; +}; + +#endif diff --git a/tests/mime.1 b/tests/mime.1 @@ -0,0 +1,69 @@ +Delivered-To: postmaster@cerebellum +Received: from pop.gmx.net (213.165.64.20) by cerebellum with POP3 for + <postmaster@cerebellum>; 31 Dec 2003 19:27:27 -0000 +Return-Path: <> +X-Flags: 0000 +Delivered-To: GMX delivery to l.lin@gmx.net +Received: (qmail 31179 invoked by uid 65534); 31 Dec 2003 19:27:31 -0000 +Received: from mail.cpapronet.com (EHLO smtp.cpapronet.com) (65.165.201.141) + by mx0.gmx.net (mx027-rz3) with SMTP; 31 Dec 2003 20:27:31 +0100 +From: <Postmaster@cpapronet.com> +To: l.lin@gmx.net +Date: 31 Dec 2003 14:22:59 -0500 +Message-ID: <0d5a05922191fc3CPNSERVER1@smtp.cpapronet.com> +Subject: Nondeliverable mail +MIME-Version: 1.0 +Content-Type: Multipart/mixed; + boundary = "CPNSERVER1'b.gK9BWKovjH2.I5hs(9gnvC)-b5" +X-GMX-Antivirus: -1 (not scanned, may not use virus scanner) +X-GMX-Antispam: 0 (Sender is in whitelist) + + +--CPNSERVER1'b.gK9BWKovjH2.I5hs(9gnvC)-b5 + +------Transcript of session follows ------- +mccloskey@cpapronet.com +The user's email name is not found. + + + +--CPNSERVER1'b.gK9BWKovjH2.I5hs(9gnvC)-b5 +Content-Type: message/rfc822; charset=us-ascii + +Received: from node-d-7781.a2000.nl ([62.195.119.129]) by smtp.cpapronet.com with Microsoft SMTPSVC(5.5.1877.197.19); + Wed, 31 Dec 2003 14:22:58 -0500 +Received: from gmx.net (mx0.gmx.net [213.165.64.100]) + by node-d-7781.a2000.nl (Postfix) with ESMTP id B9C014E668 + for <mccloskey@cpapronet.com>; Wed, 31 Dec 2003 13:27:03 -0600 +Reply-To: jbielski@pacbell.net +From: "Clipping K. Emerson" <l.lin@gmx.net> +To: Mccloskey <mccloskey@cpapronet.com> +Subject: Hello, playmates! :) *(*(*C!ALL!S*^** _B3ESTT_ )((**PR!CE!!**] +Date: Wed, 31 Dec 2003 13:27:03 -0600 +Message-ID: <101101c3cfd4$42ae771d$91a97464@gmx.net> +MIME-Version: 1.0 +Content-Type: text/plain +Content-Transfer-Encoding: 7bit +X-Priority: 1 (Highest) +X-MSMail-Priority: High +X-Mailer: Microsoft Outlook, Build 10.0.4510 +Importance: High +X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 +Sensitivity: Personal +Disposition-Notification-To: jbielski@pacbell.net +X-Virus-Scanned: by amavisd-milter at node-d-7781.a2000.nl +Return-Path: l.lin@gmx.net + +Chèapest Cìal!s Ónline! +Töp 5 Reasons: +Cösts 5$ less per pìll from önline pharmacies +Get 1_day shipping. Recieve your îrdår next day +Bööst up your sex life. Cìal!ss wîrks! +Stay röck hard like yîu use to +Làst àll night with Cìalllis +CL*ICK HÈ*RÈ T*O SÉÉ MÒ*RÈ *INFÓR*M*ÀTIÖN*! http://ykZDHJ9DAf7LhqMRpI3iQx5jeqb5vIB32BFTkNiT3oFtPpae9cx1IAiXZu2vbCyebbUu.trans33.com/d12c/index.php?id=d12 + + + +--CPNSERVER1'b.gK9BWKovjH2.I5hs(9gnvC)-b5-- + diff --git a/tests/mime.2 b/tests/mime.2 @@ -0,0 +1,25878 @@ +Date: Mon, 6 Feb 1993 02:53:47 -0800 (PST) +From: Mark Crispin <mrc@CAC.Washington.EDU> +Subject: Multi-media mail demonstration +To: MRC@CAC.Washington.EDU +Mime-Version: 1.0 +Content-Type: MULTIPART/MIXED; + boundary=owatagusiam +Message-Id: <CMM.0.88.687168092.mrc@akbar.cac.washington.edu> +Status: RO +X-Status: U +X-Keywords: +X-UID: 1 +X-KMail-EncryptionState: +X-KMail-SignatureState: + +--owatagusiam +Content-Type: TEXT/PLAIN +Content-Description: Explanation + +This is a demonstration of multi-part mail with encapsulated messages. This +is a very complex message whose purpose it is to exercise software using the +new multi-part message standard. + +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: Rich Text demo + +Received: from dimacs.rutgers.edu by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA21889; Tue, 24 Dec 91 05:52:04 -0800 +Received: by dimacs.rutgers.edu (5.59/SMI4.0/RU1.4/3.08) + id AA09350; Tue, 24 Dec 91 08:14:38 EST +Received: from thumper.bellcore.com by dimacs.rutgers.edu (5.59/SMI4.0/RU1.4/3.08) + id AA09346; Tue, 24 Dec 91 08:14:33 EST +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id <AA28328> for ietf-822@dimacs.rutgers.edu; Tue, 24 Dec 91 08:14:30 EST +Received: by greenbush.bellcore.com (4.1/4.7) + id <AA22222> for ietf-822@dimacs.rutgers.edu; Tue, 24 Dec 91 08:14:29 EST +Received: from Messages.8.0.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.41 + via MS.5.6.greenbush.galaxy.sun4_41; + Tue, 24 Dec 1991 08:14:27 -0500 (EST) +Message-Id: <sdJn_nq0M2YtNKaFtO@thumper.bellcore.com> +Date: Tue, 24 Dec 1991 08:14:27 -0500 (EST) +From: Nathaniel Borenstein <nsb@thumper.bellcore.com> +X-Andrew-Message-Size: 747+0 +Mime-Version: 1.0 +Content-Type: multipart/alternative; + boundary="Interpart_Boundary_AdJn:mu0M2YtJKaFh9AdJn:mu0M2YtJKaFk=" +To: ietf-822@dimacs.rutgers.edu +Subject: Re: a MIME-Version misfeature + +This message has been composed in the 'multipart' format for extended +mail bodies. If you are reading this prefix, your mail reader probably has +not yet been modified to understand the new format, and some of what follows +may look strange. You may wish to look into upgrading your mail reader. + +However, the first part of this message (immediately after the funny-looking +boundary line) is the text-only version of the message. If you read that part +and skip the rest, you will probably understand the gist of the message. +--Interpart_Boundary_AdJn:mu0M2YtJKaFh9AdJn:mu0M2YtJKaFk= + +I have no problem with changing the BNF to permit the period, as Mark +suggests. However, I disagree violently with the following comment: + +Excerpts from internet.ietf-822: 23-Dec-91 a MIME-Version misfeature +Mark Crispin@cac.washing (429*) + +> All in all, it's starting to look like MIME-Version is not really all that +> well thought out and is in danger of being superfluous baggage. + +Some kind of version number is, in my opinion, totally vital -- getting +rid of MIME-Version without some similar versioning mechanism to replace +it would be, for me, a real show-stopper. + +By the way, this message is being sent by an experimental version of +Andrew I'm playing with. I'd be interested in any comments you have on +its formatting, etc. -- Nathaniel + +--Interpart_Boundary_AdJn:mu0M2YtJKaFh9AdJn:mu0M2YtJKaFk= +Content-Type: multipart/mixed; + boundary="Alternative_Boundary_8dJn:mu0M2Yt5KaFZ8AdJn:mu0M2Yt1KaFdA" + +--Alternative_Boundary_8dJn:mu0M2Yt5KaFZ8AdJn:mu0M2Yt1KaFdA +Content-type: text/richtext +Content-Transfer-Encoding: quoted-printable + +I have no problem with changing the BNF to permit the period, as Mark +suggests. However, I disagree violently with the following +comment:<nl><nl><excerptedcaption>Excerpts from internet.ietf-822: 23-Dec-91 a +MIME-Version misfeature Mark Crispin@cac.washing +(429*)</excerptedcaption><nl><nl><quotation>All in all, it's starting to look +like MIME-Version is not really all that<nl></quotation><quotation>well +thought out and is in danger of being superfluous +baggage.<nl></quotation><nl>Some kind of version number is, in my opinion, +totally vital -- getting rid of MIME-Version without some similar versioning +mechanism to replace it would be, for me, a real show-stopper.<nl><nl>By the +way, this message is being sent by an experimental version of Andrew I'm +playing with. I'd be interested in any comments you have on its formatting, +etc. -- Nathaniel<nl>\ + +--Alternative_Boundary_8dJn:mu0M2Yt5KaFZ8AdJn:mu0M2Yt1KaFdA-- + +--Interpart_Boundary_AdJn:mu0M2YtJKaFh9AdJn:mu0M2YtJKaFk= +Content-type: application/andrew-inset + +\begindata{text,1672608} +\textdsversion{12} +\template{messages} +I have no problem with changing the BNF to permit the period, as Mark +suggests. However, I disagree violently with the following comment: + + +\excerptedcaption{Excerpts from internet.ietf-822: 23-Dec-91 a MIME-Version +misfeature Mark Crispin@cac.washing (429*)} + + +\quotation{All in all, it's starting to look like MIME-Version is not really +all that + +}\quotation{well thought out and is in danger of being superfluous baggage. + +} +Some kind of version number is, in my opinion, totally vital -- getting rid of +MIME-Version without some similar versioning mechanism to replace it would be, +for me, a real show-stopper. + + +By the way, this message is being sent by an experimental version of Andrew +I'm playing with. I'd be interested in any comments you have on its +formatting, etc. -- Nathaniel + +\enddata{text,1672608} + +--Interpart_Boundary_AdJn:mu0M2YtJKaFh9AdJn:mu0M2YtJKaFk=-- + +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: Voice Mail demo + +Received: from Tomobiki-Cho.CAC.Washington. (Tomobiki-Cho.CAC.Washington.EDU) by Ikkoku-Kan.Panda.COM + (NeXT-1.0 (From Sendmail 5.52)/UW-NDC Revision: 2.22 ) id AA12299; Tue, 8 Oct 91 07:29:39 PDT +Return-Path: <nsb@thumper.bellcore.com> +Received: from thumper.bellcore.com by Tomobiki-Cho.CAC.Washington.EDU + (NeXT-1.0 (From Sendmail 5.52)/UW-NDC Revision: 1.60.MRC ) id AA27545; Tue, 8 Oct 91 07:28:25 PDT +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id <AA08355> for mrc@panda.com; Tue, 8 Oct 91 10:25:41 EDT +Received: by greenbush.bellcore.com (4.1/4.7) + id <AA00616> for mrc@panda.com; Tue, 8 Oct 91 10:25:36 EDT +Date: Tue, 8 Oct 91 10:25:36 EDT +From: nsb@thumper.bellcore.com (Nathaniel Borenstein) +Message-Id: <9110081425.AA00616@greenbush.bellcore.com> +To: mrc@panda.com +Subject: Re: multipart mail +MIME-Version: 1.0 +Content-Type: audio/basic +Content-Transfer-Encoding: base64 +Content-Description: Hi Mark + ++Pv/d3RydWlnbGtnYWJiaWxqaWxucHrx7erk7X709Pfx6eXo5uXe3Ojw+Px1cXZra2dsbGdr +Z2t5bG1wbWxtf+/v8vPq7O3ue3B19efk8vz3fXl1c3RqcHFsb3x6dnZ5anf4+vb+8nt2+vL4 +8ej5+vN7/vH2dPzweG3++23y6vn6eGlneP37fHB+dm1yevt7ev39d2518evs+Pzw/Hr67np1 +fn7+evp8fP3ycmxucXxtaW58/m94/HNtfOji6e/y8vD67+Xm7P/x+G5naXBwcnl4dHx/c3Bx +eXt3bmJfY2/29v3v6+rj4e3t5eno6/b+8vBxc3JubnNzeWxpaGRnZGZz9vbt6e/8+fr4+vfr +6/bw7PXw+fj3/Pl3a2x5cXFwfnhra3r5em98/Pv0/Xt4fHn/7env7+vt9/748Ozq7ntpZmln +ZWl9fvn7enVu+fH4/3R2fHZv9+v5dnB8//76/fr+fn/4+n3u6u59fHlxem5t/vl3dvl89+/q +5u7n7Ph1aGFjZ25wam13/nt++374e35/+/Lt73lsZnB+/fP38OHj8PL0+nX17vr4b2tnX2dx +dW5x9PB7c/z9fPTvf/9+dP39ePXn9nN6fHV4e3hydv799f9veXtxdOrk8O/i6/vr6u/49nvx +92l1925lZWdoaW5sb3FtcXX9/XF1fXd3eHh47+Xt7ejp9fHu7uvx8vH2+vjv63l98/D4/HRl +YWFhX29+/Xhvb3Bu/+7s8Pn3+Xhs9+bl6vJ+7Ob++Ozv9PDk7G5veWNla2lxcmtqd25ueXx8 +8/J79O7s5u38enN8/HpsbXz87fDr4+jr7u/6+Hj27Hl6fv52cG5ueGxrfff+cf/3eHFvffZ6 +e/Tv8/v7/Pnx+3X/8ft+9ejs7uvx8+/z/Hl3dW14/HVzffv5/v56/PH8b3Fxa2prcXl5/fx2 +8+zs7uzt8fPt93BtcXlwd/708n7q4vLx7Phwcn/y6/Z5efh9efj8+nVzam10dP7+/vjv7fhv +a2xxfPL9eHJ58vlucO7p8vz9+v379/T5/fn3d2hw/fTz7fP6/fr6enny7O3s+P3/dnXu9n50 +cndtb3l8fP/09PHu8X1sbGpvdnx6/fHv7uzyfPz2d29++X5vaWJv8Ojn4+92/O3yfPr7eHx9 +dm1vefn4ePPu7O3x/Gxtffr+a3H++XFq//X6/n54eff3dW94/vv9/Xb66+599/T57Or6eHv2 +7PR2df9ubG5wd/f+cX31+np5evh9dXRvbnB6ffr39O7s7/Xr5N7h7/5ue/n9c29w++97bWtn +Z2tqbmxoZmduaWr76eTn5uXx/ffy+nZ29vP57/119u7v7/r15+nr8Hd4e3p7cGlta2tycG95 +fHb4+3hxa2dlbP72fv15anN9bm/68fXt7/Xs5Onx7+jr7eTw+/X+ffz+b25ua290dW5qZWJn +cHz3/fv++O3u+//0/Pv6fW5oaXX78u7r5+/s6uv8b3ZufH95dXX++O3ufG5ubGty/nh2bW1v +bWpqZ2187uPo7/Lq4OLq7v10eH57fvt+fnx79O3wd3h4a3H5/XlyamNibXVvcm50+Pf5fH/6 ++vz//PTq6+/6d/3u6/Lw6e/48+r1cn16aGx4b29rbX74/H31/2xueHRucnl1cnt4df198uzq +6ufk6O3u7vp6d/98bGZxefrz7X1oZW37dm1oZ2t5fvz3f/vt6uXn5eno8fd+d/r3/HFzdm9x ++3ptanN2bm97fnZ+efjz+n5zb29vePPs/33r5uXe3uj09/l9cXFzb3Bxc3Z0a3F1cHV2en15 +dnZtbG91+nx5fX7v6+ji4ent7/bs73x0fXl4e3lsb/90cvfyfHt+bGZv93tpbHv18nz9fH/0 +8/P48u328/b07+73fHVzdXv+bmZqe/x+8vL0+HtmZG5we/z8dnv08XZ4+/v99/Dv7vDv7u/4 +9fP6+/r6cG7+/W9namlyfHJ+fnduevP+c335fvn6+u/x8vj5/vn1+P57++3t93lyamtsam52 +9fj6fHzy9Hd5eXpubnpxePx/c3j37evo8/7x7fP2+fPy7+/8cHN//3h3d2tmYWZrbPd9f3r5 +8Pv5fPvv7fz87vDr5+78dnx9cmlmam1jZnV67+vr9Pz37u37/v91fPr4+/Xw7vv49+7q+3Fw +/nxwb2hsbHX3d29z/nh1/Xx8//f+b3r19X396e7v9nhvcX72/fh7e3d1bmhr9Pb38vx9/vf+ ++/fu7X13fvfxdm968uzx9X93/37+cm1ufPl3cm9xa3R6fn58+vj29P379Pj79PH5eG1tb3h+ +bn/9/efs7OvyeH79em9ycmpx9/H29P//+O3z9/Jzb317dX78d3Vxd/rt+2/68u3v8O/6+/f7 +e3d5eXFvcX56cnJrZGt9//b47urydG92+unr7O718fT3fG5+8vPw+Pz9dXVxcmZlcGtiaHZ+ ++vLk5urp5uPr6uzv9Pl2dHt0eXhybG5rZ21wfXx9eHx8eW9yfPv68er0dHf2+fPl5ers+fX0 +fHvu7Pj2/HRsb/v9cnBtaWpqdfXt7HZrdX3u7X56fvT5dGr77vD5eG5tanTz8Pbx7fbyfv3y +/nh3+fvz7vl3eOru/Xl6+3x7amRqb3l0cnZ5/+/1+fr89P14e/h9eOzo9v/49XF5fP9xbHx3 +cHT89+zx6vdy/vH0fX768+/u7PZ+/nlwbWpve/R+bnZ5+PX2eX7z+npxeX12cXB/9e339u33 ++fru7Ozo6/D+bW1sbm9tcnZwdWtt9/Hw8/L7/O/w7+35/v7u9/j6c3J5b254fP/+8vH6+vZ2 +cvTq6/1ta2VpbWx1/fvt6vb47/P6+PL3eHd4bH7p6efn6vh/dWtz+/10c3L48P91bHT5//x0 +cvfu+m1tbG1wdfj+8Ojyemp29PLx8/vy7+3xf/fu7XtveHV4bm55+uzs6/xpc3P+7Pvv6Ov2 ++v1ybm30831+e2xjbnhzXmRrZ3F49vh19Obl6+vk6OHk4uzx8e/vev55d3Nwa2hsb21zdv/7 +e/1wdn54eW92bGZpdPT39Pj39PLv7Pdx8ufq+f18f3r58fjv+Hl1b/rq/nd5+/r6+3J29/n/ +/HVlZnFua2pwbG1ra3L88eru+evg3eTt7Onq8nlsbHv67vj6/37+cnFncH3+fHR6b3JpbX56 +evz2/fLq7Pv0/HZ8dWlseXv0ff3v5u339PN2evL+c3J+dG5sdHT/8fj07ejr6+7z7/v5fvnv +/XJzbmt+eG1tZWpvc2pjd/vy7+3r+vr2fPn78urx8e/t73Fvffx1b3lw+uhva3V0bu7s+XN5 +/Pn0ant8//bu7nr79Pn3635oZF9ZbvTm6vXr7ez/3djy73pyWFZeaWZbafj07Ovn8evc8Hll +bv54fert397k7+ro+3xxeW36c/VxZWds72Jia2tgZG/7/fvv3+Dh5+br7/L37+7vc3d4YWZn +eXprdndjZXz//nl1+ur2ffvl7vXk7eXx3t3h83ptbPnxce/yXWJma2Zq9P//a/98aHdt6vJ6 +++jndOvtav/q6vv48ulvae/67/NybXb7ev5oc3Xt6/l0c/R5dmBj+e91+vR0eu/s8n5q7+97 +dOnc6e7t/Xbq7W5obHL4f/Z4efLq82JkYWBlaHr8fX177Xp98e3u7+v55exz5fLtbGd0d/fy +5/12+f9yamJlZmtfe/b9+291b3V67fHh2Nz529/k4G9oYWFqbe/xX29qYmRiaGhsau3ffeXh +8Xdx7//6aPfv7+Pk39/vfHp0Y11tZF9le/pt+nT3eXfi+G5sd+Xt7t/h3+p2bn5wbe7xZXFt +c2pcd3xuevz56+v06vRqcvDpaWFl/f/02OL/dvFsWVxoeP9sfurx8+zw4+/5/mVia3rucm3v +3+f+cnno7H3ofGtja/f4dXPv9HFzY3F2Z3b2/mp57vRveX3w/3h0bGRedN7g9Xfo5/jt8Pp7 +9PX4+Xd+7uz+aGru83Fob2xgb/7zeG58aWRjbfdxb3Ti4e755+Pq9u3n+Xl2cWRhdfjn83l7 +cvbu9e90d2l4b2Np/elpcOrofWv+fvxubvDy39/x7+59fHVraGz46vly9PNzbvX/b3Z3/nr4 +c2tva2757v396+d4bX7v9W98ev9ya+/q7/Lm5vp6fHZzfWxrenByc/h2bG956fP59H77bPvu +c2JfeHV33+bn6ezn6PX86vl8f3l1bnNvbmdld3Zw7vtveP53fPx/c2l+8vj6bGps+37v3uTt +c/Po6+/x+vl+a/J5Y3P2eHP+7e1wX2zzdnbk+Gpm/fRod+/v7fTxf/btfHX08mn6emto/Ob5 +ZvXm7/P17fnwfPPueG1u6PBu+nRxanp5bWtp7uxgavPue3Dr9/By/+5/emjv73Pw3ulv7t3g +7vh/83Jf9+P8anT4dm9zfft1aXJrbmhfa/59eu/p73j25e3n6PHqemlq8HZu+Org+X7tdnBq +be77bnXs6XJv5/dr5+X5ZmzraF198Oz4/eLw8e92/Wxp9X1sbH3mcl1sd3RyZ3bsfO7n+Hrw +6vfu6/Zn/fdq8PHr4+n6cnn7c/j0fXZ+/Hb99fRzc2Zj/vZmau3md2h5dGb2/OTl/ff482v+ +7ejx/+Htb294emt5c2pudPt5cm9t7O5zbvzq9Xh85u537ufh7ufa7GZ39/dvau7x/n1pZ15o ++f1x+fdqbHdyZ29la+/n/Gvy5/p829h89/zu8H3z9uX5efD69G1p/m9pa+v1cPj+8Xvw6ft5 +bfTnd2lo+vhleHN1/nHs5Pr+7+17dvtpZnb+a3Hs7PHq/Or5fOtz/nTu82NxY2vucHxxe35p +b3ns4ujv5+Dz+fJ+fvv1+2tr8vxvdOrufXFxb2r7dWzwb29wdHhnb/Rz/u7w6uzu+ez9Z3z1 +7vrw4OX5aGv8a2n75WtreGhseHzv9W7m2979f+7zfnzr9GljeX1dYnL5aWnu8nB8+nNtff3o ++F7+4fJv6OPl8Pfd82x3/e90a3ri4nVvc/lsX196fFps8f5tbezl+3bi3PD44O/1835sam/6 +9G5rfG9ob3H6dWv99ert6+bj/Gt9fmxoeft46/Ts53tw7OloaftuZ3H59f3q/G364uL6++J4 +/e70/2t8fnd58H5tanN2Z3JtbHp+7P1v8u7ke/3l6vx4e/t5aXZ9bW939e/17uvm5/X3/fj7 +eXt+bHR5a/59Z/Tq9m1w731y9/X+8fP49n929+b/a/Dv93p8e2d67Xl4f/x2fvB2+/bz9Px5 +fWtxe/b2dnnu9WJpfG14fHx+cujh5vZ18Xl58fH37Ozt+n1+a2dq+/n77vdq/fDr/Wd7+XBq +amVnbWt39/r0dmt4d2n36PDr6d7q9+bs8uvuePjxfWNmam12bGhxdG9xbWdqcGx+dP3s6/T8 +4uLp4N7j7357b29oendjafz6+HhuZWFrbWxyfm7293v1+eHl/+rj6/lv+3p2aGv6+/xucO7w +eeXx9exybHv+cvHrfvH2bnJ8fm52cXF9fez6b2/t73FrYnl4ZnTt9Xp7/HNq7+Tu//n+391v +dOTq+Xju7m149XpoZnz29WNn8npnZujrbXb/9nZndOpzXmn983555+p2++fqffD27OL2/+n7 +dvdx8vpsY2j4b2f67XpobnV0am/q/m76fXL8fW9ye/jvff3h6nz15fb37Onpfnzm6Plnc/dn +YW1uZGvl6GlrbflyXGz0bGl+7W/v3Pnx5+zd4+vx5u1rc/T8fG52729ycnr1X1txbXd6eHJ0 +9e/s3+t0fe78c3r35Xpp8+jxZml8b3Fw+nhrcfji6fbn4eZ69O52+nV2/XN4fWps/m5sc3T4 ++mZs/W5pZ25mff326O/q2Nbn7Onq++/3cm9mZ3n7eGBt5/drbeXoYWT0eWBifntqZ+7m83T7 +6W9obW70fvzr7PHq6errcW7p6n129u7/+vHz7ebyb2hgbvz7al5xdHJtb31uc/59/3lvenBo +d/Dydv7r6/p7/ebffX7h5np14eB7aWvj6mdnY29zanT5dWpqaGzu5Ot99+ry/HTz8XN5bWr7 +93B6/nL8f3L15vBy7+V4am/3+XB3fPft//fzZX3q9O16/nttd2lmb2lt++/1ZG/3b3D/5uLp +7erh8vn+7Onq6X5oYmVnbP95eP92b35oa3xtfPZ7cu/m/n/d2/N1++vr+W3+7HtiY3l6aHt9 +Y2Nx+nVrdG599u/e5e37efDv5u978ez8enNudW9uaHh1d3n77n5vd+z1ZG/v8Ht07v18b3ng +7W5rfP5ubvXn7/TpfGtv9O1lXWdy+3x97vXi5fLu7O35dWxvdWtvc27t7n3w4t/rd2/z/HBt +e+9tZnrveXLr6ezvbmhqZGJoenZs/Or3/u3x9Ojv/PL8/f3y8+ni7H579X54eW9x/mxl/en7 +cnL88W17+3l1a3jufGNo9ez58PHq7Orq7OXt6vlwdG9peP14fX/y93pu+Xtobm1udvbybGty +b3hzbnB17Or//O/u6u3t4ebp7e3q9/rt/Xd1fHFrZmN3/m9tbPv3Zmf+93Vu/uv5bPbo92t1 +5uPp/u/r6Of4+PlyY2Bscmtvb/bybPXld2lz/fV8/3vt6Xp3/fD08u3q+P745+t5a3Xq+29r +/vF6cW91ePf3cWxy9uztd3Hw925kaXp5b2x57PR++Ovz9vTu+vz+dHn96e/39O3o/m779P9z +cnBr9Hpuc255dXN8fXxxbHN4//7t6nX87vf1+/ry7+7t9PZ0bm1scfj2e33u6e76eHv4fnB3 +bmZw9PLx7+7ucmRnb3FycGdv7e/v7uvl93fxfHBzef3x+fjy8PRz+PP0eGdpaWdqeO74cHrv +eHZ2c3327nx5e3Tx6Ozs5d/n8353bXP6fnl1bm59+fr47vb4+XRwbHJuZGdfXmZrdHrx9H7z +83x7/PDp5/L46/D68+3s8vb48e33fvPp7n389f14fv12d21pbXFqXl9qbndtcPft8/5+fHx6 +fvj28P/z63pmdfr9dXjq6vf27ufr9fXt6/H4fv/5fXvw9Hl6fPR7aW5+9nh5fX5waWtrZmlv +cXRvbvPl6e/07vZ9/v707nb/93d7fP38+XZ19+98bvro5er0+Pr8dGv473J3+vt99flvdH// +/3h99vr4e3h2cnV2bGp0fXV6+nx1+ers8/T07eXo+nV8fnd3e3hucXhta294ff338O/q5Ot4 +aGlucGt59e/s+Pby9+7u6Ofq6fV3c/zz//r0dmpqa2tsam52dGZpeHB2efjr7Pf++Ozy8/Dz +6ur0eff+cmVkem1qcu3o/v7u8f9tZG/v9H76+HP06vPw9u3qfXFycXFrdP7+/3trZW357+x+ +evv9dnP79/r78PB9dn7y7fPs9O7yenN5/X13bG51+HpscHd7cmxxcWtr/PL07Ovv+Pf//Pv4 ++/339/t///jp7PT9fnt6eW568/v49Xt6/vTw+H/19nxvaWhua25zcvnu8Hz37fD07e92enn+ +7uno73p6d/rz/nZsaGZscmZt//18fHtveu72fenq9/jz9n/v4+bm6vZ5dGhjbnF7+3Fqb31x +anBvd/Lt73t0fu/y+vX3e3v48vPt6e16d/x/cHp5df707PTx8fp+dGtsfflubnxzbm91+Pt4 +d/798+3q5/xvc/x+cHVta3X87+3s6Or8/vDzcGRqcXfy9Hxx+/P++/jv7/T5//Tz/X/9fHX5 +/Hx9bXj9fHb7fm9saWtucfj8amtxffR/+/Pt9e3k5efi5vn+9fhzam1ycXJ6fXx//P17a2d0 +cnH//vb58fp9+vX6dHFpaXzu+frs/fr1+nxvdPXv/nvy7/r67+rv9+17bHJ5b2Zrd/19eHJs +Z2Nren95+u74+unl6/T++fP28ezy+vDv9e7v9u/+dnf/eG9tdnpxe3JsYl9kaW5rcHdrb/19 +++rm6O3r5+3w6+z7eGxqd/r16+js7e9+/f90evv/a2hraWpsbGlteXx4cnF88Pf88e3t6+v5 +/e/v8ff17fDxemtucXt6en359vf3d3JzcGxoa3D7fHP+/Hjw6evq6+739/Lz7/D08+rwfXFr +bW92e21pamt0++33+e7r5ejs+Pj3+v5wamlsd/v6cG93d21udWhs/O/x7e72+/729Ors7eft +9fb07/75+f10c3t9cmlrb3NpbHV4amz5+v59+X577/T7cnN6d313efrq6+nm7/Do6vD27+n8 +c3Jydm9teHZvdnJoYWlvbGlpdnt1//57/e/p7PZ97Of+bm92+uji6Ovm5Oz39vLw8nt5ffR5 +amdfanFsc3FxdGxrbnZ6cG//dmhtfXv+8Obk5Onr7/3+/vf7+Ovn8Pf2/O/weGVueXp2cG5v +aWx4+Ovr7vh9bWhqb3dvcP59eHh7ff92b/nu9Ojo7/L59PR+fnr/8+/2eX1w+u19/vv38u56 +cXBvamFrcGtmZW1t+/h89uvu9PJ5fe/w8Ors9Ht4+fPu8/X9ffr+8vtvcfR8bW1ndPt+dHP+ +++/t+vn8+/f+/Hh5enttbHf79HtobXh5+/Hu7+bq9Xlscmx58vh/8Hx16ufr9Ozq6OLqfmt0 ++m5eXGRtc2VZX3L253xmcPrk2edZVF753Ojt3NDM0N7g29zo7l9Yd/H8XFRdbVxVRUFV+eDu +aGDe1t57VV/l2dnb2MrCxMjR9Wtq/u5kSUlobuNNOD5R5tfvVHfb3t1mUVf51tpz98/CvsDL +1t7g5GNe+PxOS01MRDk+T+DP0t/u3+vq82ZRSVD22MnJy8jBvL7WaGpw1tLdaENAQTowN0jV +wMvj9eXd3GNYTklU793FwsjHycO8xXlnaNrEyutMPjYyLDFUx7vA2evX4vxUS05LWtx8z8PD +w8zOwMDo8urMvcfnVTkxLSgz/ry3vt3jzuZfRj5ER0/e18e/wcfNzL/B6djHu7XCVz00Ligk +Ns61s8Dw3MzpWz04P0BK1sy6t7/Gz9DEyfXHvLW12D8+NigeJFG0q7nXb8vI7kIzOUlDSuHO +sbS+zuvavsPnv7Wrr9dDMioeHCvYrq6618rB2lI5Mz5URj9cwq+vv+pf+MjIyruuqKvEPS4o +HBcp26umtc/OxeZYNS4/b1hOTuayr7bIVE3bysKzraipvT4xKB0UHVGrn6u+z7rNZDQpL1Nm +bWNMurOyv1Y+XtHDr6ukpK9QOCofExU1tJ+ntcq1vmw2JStH2t/VVb20uMFXQVHWz7Kqo6Op +0TosIRcQI9Cjn6q+vLhfOyUjMmrmzNG8sLK9YEFCcN+8qqGhpbVDLSEXDxxbqJ2nr7Ouy0Am +ICpI8d7fwq+uuf5DP1FgyK2in6GrbS8kGQ8UMrOeoaqvrr9KKh8mOVXf0sWurLLNSjtKWNmv +o56fpsoyJxwQECbAn5+qr663cC8fIS9L5PXHsK2wylQ8P0Z8tqWdnJ+2OSweEg4bYqOdpaqu +sM0zIB4qStlu2ruxq6/TPy81VLmooJ+iqso2IhQNFTiqnaOqq6m4PyIdJT394N3Bsq60wGQ5 +NTzPq5+fo6qzzS8bDQweuJ2dp6+pqWAtHh0uS+zOwLavrbbXOi85a6+in6OvtqmyIxALDkOn +oaiusaKpPCMaHz7C6Eu7q6Ssczo4OETBrKGhqayqp7wbCQkYuJyfsrmtqLMtGiIwSkc5wqSf +rMs8OjwzUq+fnqrLvaqjpDoKAA7Ik5S6Rr2pr/0gGyQxT9bHqp+tw0A1SFLZr6Wor7+3pJ6o +WQ8CDCyglqfoxLTH1S0jKy04UsinprK+0nFNOkG5pqWzy7ypoKW6NBAEDz6ima5sy8RERy0s +NTFBuLu4sb6srus6OU6wp7C0tK6oq8JSOi4PCia6m6M/L3BYOzwmL23FveBXtayst1lHVOG3 +pqertsu6tstJQ+7cGg4ix6ewLipCNy47OsyqwlZMVLKsusHW9sO7r6WotdtN6tt04c28uE4a +FCh5sUYfHzNhP1nApKZlKy/OrLDDuq2tt7ivrLxGOUpazLi/tbtbZDgbHSEmPDEvTu9P2r2s +rVsuL0+xp6ikpa7aSlHLw+tZYcq9xd/Jw8tMMyUZHixS3U1Abtc5U83IwU1Ku6yjpbTFa0dK +z7+ys8vYaFnVx8DcOi4uNEE4Kyw7XeZONjQvObenqLHFxcjP5cfAyNLPta+0yU5ubVdRPjdM +anPc8+BOLiowOUU8PkTxv6+wvdZFQ1rWvLu+uLi5wcvebk9JSkVf2NPfVf7Szko1NTI5R09e +Xc3IxF87U8rLf3rHtrzOeMvBy19JZu7O39bjb05GTEzMwt5JXVNVRkbZ4zUsP9K82O3Du8pH +P2zEzOrb1dHZ5s65vlw8QGjO2N3X2/LX0dJdPTo7Pzk8ZtLN0+PYbU5IX8zK3W/8yMnP1si/ +wmBS09912cnL01Bc/Eg6PU9qQDRF+9TZVEdWV2vVxrzA4HHxZ9LUyL3Dz+LJy8/5bnnf7FY6 +R0k/STgwPWRnz+Rj7X7uz93l282+vutuybi3w9vVy9p659HrX1w3LDk/QT4vL0lZ4sDEyNpx +z9Tr0b65uNTbuLjCz+PazF/v0svLNCs1Ojk1MDtIQE7OwLzPWt/jzr++ub3Uybe6zfvVwcXR +wsY9KSsyPTgvPPlFPGHawMdVUdPLxb64r7vbzL26vcTQ1NG/wDYiJzjkVCsnR/7y3d++s+I7 +SdCxr7fG1eXLv8G8ub7Q39MvHCA5xMYzKUZsT+u7ub1SOGa6r6yrt89Zb7uyvcvlarxGHBwo +UsNGKjno2M7hu7jsPD3frqmtrbnU7dC/t7m7v8A2FBYwusw1LT5oOzzNqqvXPEnGr6utrLTG +Xt64sbCwsj4NDC61sFMkPas6Jl2ypLUpK7yppKmsqrZSTb6vp6q5HQYRs6PLKyTIqSwiSqug +ySArrp6graulr0RFt6WdpiEEDN+isjMp260qHTS2pcAnK7ukoqmnoarvS7qpn6IlBQ2+o7g2 +LrCiJRotUbK2LC65qaesrKSpVkC9p5yeHQMSsKjEOEqfqRwbOmLRVTHqra2trKShsT1Ot6yf +xAsIVaDHLC6mlU8UJr3uOTFEraq6r6KgqtRGvayqtxMHIaC1OTezmbsXHcdrKS5jq6nOv56c +p7rbvq2tsiEIEqerMzmwmqYdF0rBIRteoKfoXKaZqV7FrLHJuEwPDFefzzTeoJw7GzLNKRkr +pZ687queqXHerKvAvu0VCiijyTTNoJxZHTPAJxUlp53CdqGYqUZorKzHycweDR6vyDbPoZ7O +JjzDJREfrZ+37KaZpFltra/GwGsdDh+x2zDRop/wJ96vKREbvabEu5yZp9zhr79LuL0eDh2y +0i7Lnp59J+urLRMc3KvI152XpL7Fsr5BXGEfECG9PTGvnaRUL8WuJhUk5L/ouZmXqravr9o/ +5NcfDh+0PCa+nKBMLL6oKBIjz8dNvJqXpbCqq+I85XcdDiOyLyOymaNDMbmsJRUn4nM7t5ia +qKmjq+w8WVgcDiW2LCKymaRFNrawIBYs0VA2vJmZqamepdVC7esjDhyzPB7hm6FSMMOpLRQj +02wvXp2Zp62fn7lU2MwpEBbH6B84npzGNGip5RkaPck7M6+ana+uoajNesxJGxAovzImxJ+o +00DJrzkbIUbyTu2unp2psKyttLppKhgaOj4oMbqrsL1vz8o1JiYwWbu1va2hoqy8ua2tXSAY +IEFALiw/vauqv1pOVUc1MDzNtba0sbCxsa6vttc5JyUzPzQpKjVqtrbCyf5Z4s/O0u9r6t7u +6MvCwr60rrfIytlINy0oJiguP1FIVcq7trW6wMvdfNXIxsm/sa2wus9TPjgvKiYlLUdVTmPh +0sW/v835aOjRz9DHua6ppqq+VktPQTIqJiYrNU1uWV9r28jJzt3qbV3ty7u1rqqssLe/b1F4 +VDwuKSouNjs9P0hRZNPIz9vaz8vHvrS3x8C0sLS5wtv0YU8/LyooLDE0Nj1NTlTcv7m8vbm8 +0eHMx8q9sa2vu8PL129URzIpJCYsLy8zQvTNvrSxu8rL0u75ybi6wL2zrrK8xs/Y/U00JyIh +Ji45P13NysrCvb/Ix7/A0drIyczGurKvs7rDaElHPzApKSkrMDtCTGTgzL22tbW5w9jq5tfR +08i9u7q3u8fiW19lSDUtKScnLjpFWN/Lwbu5uLa4v87mY1/95OPZxrextLzG3/7jVDcsKScp +Lzk/T+/Qxbu3t7q/ze5eXXnj9OfMwbq0tbq/zODhfEMxLSsqLTY+QE7jzMO+u7q8y/tdVE1W +aGzfx7u0r6+2vMji6+JLMy0rKSw2P0dn2dXMvby/wMruUlNeX2Jv4MW6tbK0uL3L3NvfTzcu +KygrND4/TeLT08K4t77L5FxfcF9SWc3Cva+qq7/2z3E8PEQ+MywnKz3dura/4VrnyMHPTj06 +RWzU1OzJr6ehn6OxWycYFh4sOUVPXr6knJ6tTysnLz5FQztDy6+suNpOdraopqipr9I1Gw8U +Ij3fvLS0qZ2dq0wnHyM1U1RSe8Kuq7dUPlDEraWjpam6PRsODx5Gv7Ctrqqem6o8HxsgN9PM +YX6/r62+Py46yquioJ+ksGYgDgsWO7mtqquso5ugTx0ZHzbGuutFfretukEtNcyqoqCfn6rD +LxIJDCmtp6moqaqgnbkfFRsvzrjHRUDGqqx5Ly5OsaKen6CjsVQeDAgR55+hqaioqqOlRRgS +H+u0vl9Iabamr0ApMcuso5+enqKsYBkIBhW7naCop6mqpa8sExAlu63FVVzNrqWyNyU0uqah +npydoq5MFwYEFa2Zn6mko6qtuioRDyeqpts2Tr2uqrU8JC63oZ+fnZuiujoWBwQTqpSdq6Sf +qbrRKxMPJqSezC5BvbOxuksoLbygn6WhnJ2tPBoKBQ3Uk5arr6Kkt1IuGhAbtpmmNy3SrrbX +WDwzTqyeoaafnKY/HA4IDCuak6W/qp2pTCkeGBg5n53ILEWsqc8+Q0dIyKWeoqagocMjEAoL +HKmWnrq1oJ+8LR8aGiiynao+McGotj8zQlfUq52do6elsTEVCwsW35ycq7GknqpKIhkWHt6f +oX0vbKmqXjA878OvoJ2gqamtWBsLCBFHnp2tsKGbo34mGRQaP6KexjBTp6XqLTJlw6+fm5+q +rKvHHgsHDz6fnayuoZuhyCsZEhYypZ68NVyno88sLU/Er6KcnaSqrfMaCQcUxJ2ktqmbmaZl +JhcQF0Oio9s6vqGnSycuW8Oun5qbo6mtVBUGBhmtna24oJaZqPwmFA4XbqGsSFSnna45LDx8 +ya+fmpygpbEoCwMLOJ+m0rWakpq0NxwQDx+6qdo9s5ue1Ss02cvRsp6Zm56iyhQDBRqrpWJc +n4+Pn2AiFhEZOL9fOLqambcsM8G9TUytnJucm58uCAENYas5Ka6Oi5a5Lh8XFh8zNS7Jmpas +MTuwrFUzyKOgo5yXrxEDCSXBMR5PkomOplczJhoYHiMmVZ6Xp0t+qKlKMMGirMWkkpgkBwcb +TigVIp2KjJ27vccrGRYYHTOonKrVuKCoQC+6n7Yz2paNpBYIDiMvGxUvmIuSq7mlpy4UEx83 +TOnBr6ensltXtqe3OTysmJquKw8MGF/jHBe9jI3BJLuYuxQQP5+/Hyijlq4oLKycsTEztJ+k +sLlHGRAcTDsaHa+SnT06pJ1HGyawqzglXKKnUC/dqq30PWi2rrK1vEkgHC3aOx0ivJ6zNUym +pEMkN7CxPy7/rro+N+O5ykVIx7K0vr7DXzg5X+Q/M0u/vmpWxbteLixB4FtCUsnB313ev9lE +SdzCxMG5tsdSSHLXVz1F387m9Me3wT8tMk9pQTpRyMtZTte/zko+ar66wsrEwc94Ym1ZTU5l +fl19w7nNPjM+W1FAQWrQ23Tdxcb5SErpw8DGysnM3XNcUkxNUlxSTu6/utFJQEhMREBKavn4 +08G+zmBPVvXazcO/wszV5XRYSkdGTFJh4MzHzu1USklKSEdMWuPLxcveXlBacu3ezL++x9LV +1vJOQkNOV1Zd68vG2FVMUFZOR0tY7c7Kzd9dVGJ//nfbxr/H0dLO31JESV90WlN5zMvuUFZu +Yk1IU2/k2dHS5F1XeexvWGbYyczW2tPgVUZKX21dW37X1/JiaHplWFRf7t3V09Xle+3d8FpV +Z9/T0Nje2uBnUFBeb2ZaXnjtdltZX2xlXmPw4uPpfW/44t/pe2Vu5dPO1ePj3e9cU2Hn6FtU +bN7mXU9Zev5fXvvp8G9qd+fsc33k3+fi19HW6fro4WlWYfLwXlRn5eZkVVtoZVxm69/+YWN8 +8m5pc+vj4t/a2N7q7eXh7nBz6up1Y2h3eWpeX2Rma/vp7/9wbv9+Z2Fpc3/06+7y7Ovs5eTy +bnDv4upvZW93al5cYfTf6Pv06+v3d33+e/v5fH9+8+zz9fry73tqeOTa4G1ievRmV1dj/vNr +XnXk5HtnbnPv5+zyf/bj3+3+6tbZ9mBfeuftbWv7fmtcVWH54u93+O3zfW9v8v/37v71bm1+ +fm9sbltoeuje7vLt7+Xs9vL+6+bua2vk1tr6bHz8/ltPVGX7b3R07O1/Z196eHRqYmlrbnfw +7e3c2t/j7eLd6PJibOzh6OLven76Y1taXmZy+Pd3Yl5uc2Ry//ntfW3y6e/e3evraV/56uf0 +5eLv62peZvbr+PbvcXJ7efpmUklW0MTWY2Pn2e1sZ1tOR0/e0N778tjS2uHh/ndsWmB06+/1 +9e/v8PDp92jo09X4WlBd5P5MR1/Rze9XZN/sb2hfbGpsdPp2bPLs6+nm7fni2tnk6vtxb2Vk +YV9t9d7W2t/d5ndpdft+f+Xk7ntzbmBXUVJVVFRVVlRYWltdY33r2c/KxMjKw7/BytDg1NDr +6N3halJAPUU9MzQ/QUFKXN/IwMXIvrzH3drX9ldLVO3pY3nIvcHFurG1xMzPSDI0NConLC8u +OlfYwbSusK+vtMLP6UU5OTk3PE1wxbSvsKuoq7a8wUIoJy0gGh8sLjZnvKyko6iloK3dXk4u +JCYpKzJE5rWop6iinqOstr9uLhwaIh8WGSxEQtWqnZucoqajrkYrLCgeHiYuPc62qp+doKCe +pK+70zooHhgbHxkXJ/7ox6idmpufqquyPyMhIB8iJjDdrqupnpudpamrscFbNywnGxYdIxsd +P8PAraOem5ypt7TRLh8dISorLFyrpaupn52ksbq2vlpDRjclGR0wIBckzN92vaudnai7q6jQ +LCcrLS0oNMKssbWooKSytbKy1URN3H41JxweLCQaIFXZ3sesnpyotqyt1C4pND8yLkq6sb24 +qqSsvLy3vlY/SONuRjEeHzQsGyBF287Uv6efrfq+qbc8NE3PXjpIua69ybWpr9xkysloPThY +1mj4Mxww0SYbNO7gzzhVqajg7biutGpA5rnPXeq5sLvXyLjITD9s3G0/RcfB604vK1RAJytD +SFw+L2W0w1/JuK204Oi1s8vNwrq83Ejz201ATmN97l7f0cz451A8QkQ6MTY1NjU2SO3Kv7u4 +sLK6v7y/wcr36+NtSEpJ+PhWa9XPzu1y29nY6GxPVUY5MjU8PD5BaMm/08y6vs7OxMTG2Wro +7VNSWFb/6Vluz9Luy8jb0NbpcFReTjw8UktNWFL51Ob+3ex95eNb6ODr39luY9njamtp+Njn +8dnPz+Tez191dUxVUlBMYGjw8d3c2c/fWnHeXnN2+WpxZlpbak5S6ubsd+XT0uPW2PLw9lBT +VmlUTWHW2t7M2szDd1zP205R+3JYUlVaXFNNXupiWerW2dLP1czI3G30X0xYXlNmW2Tl32bb +1NvX++vxYufqalpeXfxPSWZ7VVtq7cnM29zCzf9l7l9OUFVgc2Rp7e3xaPnf4ebp6ezf1Ofx +3XJeWlpMVGxfY3fyb+fT1u7f1G1dclxa+/hb/Nfxct1veOjde9rT3N3ffmBmWV9dV1tdZ1pv +7Gxk/tPm/+Pj8OrcamzU22By9G5v6nNhb+RsYunW9O/p9F9dflxdbmVxbG1q9u5r7dHPc2rX +3XfiatfqcHLz+WZXXm5x62tjYNnwX2v94PRUaPxubFzp7Xty+efs5+Xr53zl9X3W8drcdfXe +al9o63NmempvbF9k+etZX25+aGx+cvp7eWjz9X1eb+7x53nZz+h41tnb5e1fdt37ZO3weOx8 +Z1x6YF1ga1xm7mTd+uxv7ltd5uheXOzi2Httc9Xu5lnk0Ol+6dzY3WBn/XprUktn2FdSYt3k +9+Pi7NZyUOnVXE3ubuzY4mnh5d53at7p5G3o8u5oZfFqVfFjWmRS2GjecuDP7HxKz93mU+rl +7mVNeXvtWlrm0Vx8dMzZbm/a0nxgbd3pV15t72pV3eD3Xfbx33Ve5O3ucV9reHBjWVnX0WRX +5MzbbnHa0dNtX+nka2RbXWn+W1NcaPpST17gXV5v/n7p2eLd3s3LzsvIzNbT7c/J39zN0Eo8 +OTs7NzEyP0xYYt7LvLzCx8a9vcr+49XW7+3ezsbCxMe9v9hEMzI5MSopLTpKXu/GuK+vusfK +ztP/T1Nm79bt0r+9t7m8vbe8ejstLS8sJyUrPHDnz72wqquvvMruWE0+PENKWerdxriysrK1 +tLjLUzUrLC4pJiguP/nTxLeuqau1wct2U0Q7PEBJWmvVvbWzr7GztLrHUzgsKysqKCgrOm7P +wLyzrKy0vctcTkU+Pj9FW9vOvbaxrq+ztLjE7j8uKiwqKSkqMEjuz8G7sayutsHcY19NPz4/ +S3zazLy1sa6ytrm/y2s/LystLCspKy9BbN/JvbKusLnBzu90VkhCQ07nzMbBuLKxtry/wMv4 +QjIvMTIuLS0zQVVe5Mq8s7W+w8fN0mpLSE5f6dzWxb65ucDBw8TL505AOjo6NC8uMDdDRlHs +y765u768vcPO52/7dG1+e9jGwsbOys3GzdPreE8+Ojk5NTMzNz5GW//dy7++u7u9wMnPzNz+ +eWFr+Ojr1OjV2u/Y1srf3VFGRUhAOTg3PEJNVWf1zsG+vr/AwsfT0upwb11UXl30ZN/44c/W +yM3K3uxcTU5IQD08PUBGSVPrzb+7vcDLytLyWEtPTk9GT13j0s3KzcTHxcvKyc3WcVRNTEM9 +Ojs+Rk5bbt/MxsbO3fF2X01KTlJgZ2nczMfCwsjCxMPJysrO3XBXTEpDPTg6PUZNVmj31M3O +3fVhaGRWUFRZb+rf183GxMbJxMXDxsjKy9p1T01NRj88PUBITU5SX+vZ3XpmX2pdWVVaaunj +4dXLwb69vr7AwMTGy9psVE5JPzo5Oj1ARUhOXevd5vZ1ZWdiX1hf/eLWz8nCvbu6u7y7vb3B +yu5MQ0FAODExNjxCREdOb9bP1ON7bmhrY1tb+dTNyse9ube4uLu7vb7E4kw7ODg1Li0wOEBM +UVzpysPFzNn4eWZZT09d38/Kxr+6trW2uLu5vMHXTjgzNjMuLC41QU1ZaN/Hvr/I2mlbV1ZR +SlXyy8TBvre1s7K4ubm6v9FNMy4uLywqKzFDY9/Yz7+4ucDdUU1MSkVGT9/Evr28s66ysLO6 +usDCfT4sKi0uLCksNU7Xzc7HubO3xG1HR0VHPz9P2MC9vLmvrKywubu6vcxzMyYkLC8rJys+ +3cXFyb+yr7jbRD1GRT05P3XBvL69tKmorbS0s7jK2lIuISAoLCkmLUnIvb6+t6+xwk44OkNE +P0Fqwbu+wrmtqKqxt7e4wONtZTEfHSQrKycsUr23u726sbXMPTJAVlJES8y2tr7Etquqr7y6 +tLnPYGLVaSYbHysxKSMyxbO8z8eyrr4/Mkvd3kVA0La3wsu5rKuywcG5u9FqcM/GzjAcIy4w +KB8txLjeW9+vr89DTce76z9My7e/xsC1rrK/y8C7xfR12tLjbNk7HyUsLi0mL9vC0NLSvL/N +eHjQyudgfc+6v7+/ubS6v8HGz9p06Pbo7lz94TckJy46Miw407/Lc1HMvsdaTNe7xO1oxLO0 +vsq/ur7kbvLU111b82VkU0xf8UQxNjtGPTc+T11MQEPWyuD+0L25wsvFuLW+y9nIxNxXY+bi +a1Nx3tvqYF/k2/5NSEdAOjY0NDxGSU1d4s3O0crCv8PEv72+yuHU0ehrVmr929Lc5s/M3u7/ +/3taS0I/S0o+PEhZYFJKUmZkVGDt0s7LzczKydDq3dbQ2dTNzNTg283jYXvl62RNTl9vXFRS +XF9QR0hOT11o9Obt9tz1Z29rduT+atzT1NHU1tXW3OHl3N/3WGP7ZlhZ9Ovu+Ozc7V9eW19e +Z19dbF1UVlpZWW/Y2eDh29rZ19rZ2eZtb2JWZ2Vabul4cvzo5+Plenzv3+z07nF2aFhYXVlb +YV1i/9zj4t/b5vbwb1da+HJ0697i4uju7P1vfevd5vDs3u1qX11ZWV1mYGBpbvf07eju+N/u +Zv7zZ2Lf32lp3uT67/J9+ub/bXPr7e3t6XViYl1bX21gb+3j7f7z6u7xeWt1a2lv+fTq393o +6OZpXml3aXB+bXzi3/x97OZyaHzx++z3e/nzY2RpZGRtb2xzcP30ce3n937v6Ots89jtZfn7 +/OPf9/js529ifm1ka2pm/HJdb3L9bWJsd+fm7+vg7Wj63Ol39+d+b+3rfvf7TlzSXVDaz/R+ +eXvxflln9+NsXHvib2/f5fJz+3nsbmJobuz6ae/db3bd5u/rbXjmbGZ1dPD8dP3ud29qbnts +Z3dveff/3+dvZ+nv9fD36d/r7+ba2XBj5t1fW2JuWk5PYv1dV17u6Wpg8el/aXTl5+976dne +49PKxs7dz8rN1OPUydJkT1xrPi0vOTYxNkXr1+TOv8HL0szDzOTWycjJyL65vcO+u7u9v7q9 +KhozOBwcLmq4RD+moc1GYL3MKy7Dv1BNx6uwWcipsMnJta65yrixOxgfPB8YKGu3y0iqnbJP +9OJCLS1H91Hmu7a7ycCws8O8r7K9xLWuyiUYKDkaGj+5vO/ToJ7ORsLJNR4ozEwtda2uvd6u +pr3Kra21x8msrk8lGiYzGhpduNDqyaSi4Ei81i8nKTxNOlOvrLa8tKy1xLKtt7m9ta/EMBwd +MSQYLL3CXWmtnrc817s+KCkyUz46u6axvbCqrs2/q7LSv7OzvT8fHS0lGCbTxWLrsKCvS+XB +PyouMztFR8OqsrusrrrFvq2y07+utsJyJxwlKBwiScbM17qkqOZnzlIvLTI/P0TOtLa6s7K5 +xr6vr7+3rbi+yiscHycfHi/Hve/Dp6TFTOviNSsxSV1Lf7iyuru1tr2/tK65v7Cvu78+Hhwj +Ix0mfLjM1q+ntlJP7EAuNktRS+C+t7m7tbfHxrewtbuyr7q85SYbHicfHjy0uuW5p6riPnP4 +NC9AX1BWz727vru7xse7s7K4ta6yubw5HRojKR4nw67O1K2mtkJEz00vN1VZSFXMt7zLu7zM +x7evs7qyrbe81yQYHywfH1Kvu/+/pqleOt3ZNjBFXExW7r2ywMS6xcy9trG0uLCyuMYtGhso +KB4wtbDh2a2mwDlPzUMvOlBYXmrDsbvGu7/Hvbiusbuzr7a+Rx0XISsfItKsvFW+pa1FOtLZ +NS5Cb1tdzrOxyMm9w8u9rq65t6+1udoiFh0tJB9IrK785amm/TFlwkQuMVO/VkW3rMD1yL26 +zrmosb62r7PHKhUaLSYePayr0EuxosUvSMRfMS9AwctDy6yy/f/Dt7zBrKu2ubOuvy8WFiks +Hiyvpr5Hw6OxMTjM3TcqMLq6QMerr89R3rK5x6qqtbi2r7kxFhQoKxwrsaS9Q8qjrjE5zdM4 +KTS5ukrLrLDOUdOyvL+rq7O3uLO1NxQULCwcKrCkujjhoa8vNM/TNSU7rL9Eu6qy4UrGr83D +p6u0ubSuvC4UFS0pGy2rpsQ9y6C3LjzJ5y0kTKnLP7WouFNJua7pv6aptbyuq8YjExsuHxtI +p6v4Sa+i9y5fyD8oKeWsWVCrrNRY2rW4XbOkrriyq61tHRUhLhwezqayUW+pqzs3z9EzIy24 +tj++p6/fVcex1neqp7C7saizORoYKSgZJLSrwU3BpbozTb9UKyc9udNOr6i8/NW7uN6/qay3 +t66tvjQbGikjGSm7r8pWtaS/OuzERiooRrRbWaqpwvDHs7xTuamyvLmtr9QvHR0qHxovw7/b +7q6n1EfFzDssLWPCSNaqrcnYubDD26+rtry4rrnxMx4eKR8aL9jK7OKtqdJevtI+Li983T7J +rrjIw7Oxx8Csrru9tbC+ZD0kHykiHSxW7Fdes6vI17zMSzU29Vg22rXC3sexsci6qq68vLG0 +zeluLB8pKB4lPFxLP8Wuwt+7u9ZMQ+t0OErK3W/Qt7G8uKuruLyzuM737j8pJSwpIyw/RDlC +x7rOyrq5xd3TyVw7TGFOV823tr2xq7O8urzPYFnwSi8sNTQsLz09MzZUzebou7G1u7u90kVA +U05IdczJxr23uL7AvsTO0dPoTz9DQzYxMzEtLTZKXeDGuLK2vL/OTUJKTUxO98nGwrm4ur6+ +vL7Ky8jWe1RDOi8sLSwrMD9k6s+6try+wNFoTU1RSklt083Fvru7v725vMDBxMbL5k47MS0t +LC0xOkZkz8fFwMHI093lXE5OU13s2tXMyMS+vb2+v7+9vL7Kf089NC8uMzY2O05lbO3Y0dnW +ycn1UlNXWFdo393fz8jFwL67uLi5u77E1ltFPjw2Mjg4NzpBTlRa89XT19TW4nRWV11UXvDc +zcbCvbu8u7i8vL/ExMjTcEM7Ny8tLi8xOEFb7t/LwsXEyNbjT0hRR0pYatDEvba4ubW6u7zB +vsLL1l5NPTMzLiwxMjQ8RV/Z0cW/yMjL3eRVUVlJUnx+2cjCvLy6sbe5tb2/ws3SU0E6MC4s +KS0wLzlJa87GurS6vLzS3lVFVkNAWVh5zcG3s7Susbq4vsTCzeFPPzUsKyolKC8vOE7Ru7ey +rrC4vtLqSTRBRThNedvExLavubavubq7xMDE51hMMyopJyUlLDY9VMGxr6+usLfNVU9GLzRO +QEfdxbm+uq2vurW1u73LxLvUSE06JiYkIyQmME1vxK2pq660t8o/NT05LTxsX8vCt622ua+1 +vb/FvLvLw7TPPDwpIyMeHyguP9C4q6aoq7LB7T4uLjIyOGzIvba0r7G6vr7FzMvCuri5tr1Z +Ri8eHh8gISg+vrCtpqKmsOxGPzIqKDFN0MzAr6yyv8/JxNRv076zsbKvrrxMMiIbHB0fJjfO +rqakpKesxTsxLSwtMD/eu66vt7m7z1ZBRN/GxLyuqKipr79KLiEYFxohLELEq56eoau8bzUt +JycuQN66tbaus81hQzxJUPTBs62oqKipr75KKSAbFhshLli7rKOfpKzAQTIrLC80TNe4rq++ +z3dFRTw6U9O6rquqqayvssJkPiomIBseJTPiua+qqa2wxEs2LC02Q/jNx766vcnrRD5GTtjC +urCtrKyvub7HdU86LSUdHiMvUs+7s66rrrj1PC8sMjxcy8S+vLq9y+9NSkxe08m7sq+tr7a8 +xtLrUDwyJR4fIi9Jzrm1s7GyuN1ALSsvOubFu7e6vcDF2mdNQkxvxbKura61uL3M2edLPC4j +Hh4iLUvJtq6vr7G82EMvLC4737qxsrfB0OhOSEJBTuG+r6qqrLO/0Op16FE7LCAcHSU17byz +sLGxs7vURjItMkLVubO0vtRuTk1MSlVwy7eurK2yu83lfdrQekQrHhscJDXhtq2tr6+yu89H +MiwtOX3BtLO8ye9VWF792s7BubSwsbi9xM3S2l9KMCAbGh0pSrqrqKussLvKVDkuKi0967mv +sLjE2/5kZP7cyr+4tbO1ub7Fztb7SDUkHBocJDnJraanq6+8z1c6Mi0uOV2+r62xutBlWFJd +9tnHu7Swsrm+yM/Q1mo9Kh4bGx8ubLSpqKywusnsSzszLjRJz7eusLjFe1tVUWH40L61sK+2 +v83e6NvaaD4rIB0dIjBuuKyrrrW9yNdbRTo2O0zcvre2usbfZlhaaOLLvbe0uMDP7HR739HN ++zYlHRseKUq6rKqtsrvAyM/ySz03OEfiwLq8xtl7bvbfzsjBvLu8wczmfnLt0svNVzAkHh0i +Lm61rq6zvsnJyszmTUI9RfrNv73DzN7649XMx8rIxcnLz9vs9X3q3u5dRDktKCgpM0nZvbq8 +wcbHxs7e7F9eafze3NXU2dHNysjN1drg5ODc1tDU3nJcU0tEPzw6PT9ETFNeZvzh3dLKyc7Z +/WZkcurc1NHT2tfUz8vT3XtgZffYy8bJ1m1ORUJCREhMTldw/3F3enFlYml85ujxbFtefdvO +zM7V293Wz87Zb1VNUXjSyMbN7lNJR0ZLVFpgbn3i2d/g9W90ee/u/3h4aWv559/c2+Dr8PDw +9WxnZV1cZP3f29/lfWhZUlVVYH3g29nb4Op4ev768f12a23z7Ovp5eDe3N3j7m9hYWBhZmlv +cW1ufP1rZV9XU1hfb/Tn3Nja4u97a3bs39zf4OPt/u3f39zd4fVdVVFSV1hbZHvw5d/vaWdv +//Z+fHl88+fi39/h7GxgZXD+8e/1b3L27d/d2drneWddWlVPVl1u7d7c6XpnX2Bn/ertb3Lu +6uXi5vL27eno73pwen51f+Xb4+fi5+7r6f1nWE5OUFdq7N/g7HJfWFtleO7y9O7v6+nm5/rv +4t3d2+Dv/P39+vLl3t/sfXdua2VdV1RSVlxod+rk8HdtdvP48ejl5uno9nx7+v5ubXnr6+vt +7vd99uri4+Dn8XFobGllZGZsbnJ++3Ftd/13/Ofn7v52amhpZmt2fvf37+nk3d/o7u/z7urt +739vbWhoYF9rcHFueXZ3fn9+eXN68erk3t/q6ur0+n17d3ZyZ2hyd3Z0d/7w6uv+/npram5t +bvLxeH3x/v3q5PL7+G9ybWpreP11c21uaGh4fHv2++/w7N3b3d/b3uzx6+51dW9tYV9lYG1s +aW/9e3t1amdlbHBkZXn2dW386+jn5uPpfu/s8Ovk5Ozt+HpwaGVmbP15fvX6efr9cmx37vP1 +6vVqbntudWpocXD3/O/ve2ttcnp6efLzfe/u+P159+x4bH9+fW9rb3xtaGlzd/fl5u7t6Ofj +5n78+np1dXFnau/+ePzz83t3f/xsX2V1b21scnR79e7u7vttbXlqdHV18+7r+m/25enx8On0 +8OTudm5tbmp0eX3yenP36ur+//726/j1e29veXtmaXFybWtvb21+fW9sdfv2d+3t+e3s5ev0 +fHb0fXFwcfn8cO/v7evs8fn0fHh1evl7aG98bGtqbnn6/P7q7fnu6W9oanRsbHhubfn+bX5+ +/O/r5X799e/t7vDx8/d47vxtfXZt//H1+npwdHdyenZ8bv1rYmx/7+3u9vDv7+339/nw7O71 +e2/+8XFvcHBtZWz1bWlrc2948+7s+uzp6/Lu8O/s8vPz7nV8fHFvbft8dG1ydu7y/ejueXJ3 +cWVqbWBif/7n6uzn+P7o6ursbPl4b3tufW9zb/71b2px+fv67+/+bv76e3J+7fr/5e5+9/Lt +e/f79/x2++77aW9tbW5sb2hebXd1d359/vPz7uDm3+v+9u3z7uz09210+f387vxtb2t2enBy +bmpuanB2Zmr4ffzz7/B/eH33+OHk7/L9+vTp+3Z3dnhvb3zxdP/79nb35/H+9eb8bfP6ZmBp +Z19x+Xz8fvHm4uTw+Pn2/nF6+29r7/d08/N0cnZvcW9vcmxkevz28Xv+8/H+8fbw6+339Pru +4u/s5O3y+Hlxb2tibHFyf3VvbXZ0b3F6fvvt/3h88fr46vd77vl+6/h88nf6eP7n8Xzyf/7z +fnRpanZqcHZ5dvb5f+3n/Hb58m/76vb+dHXv+np5bXjz5eXq7/T1eXZucPV9f3n4/f3+/Gxi +bG9oe/P7+Or+8eLx9err83d8+XdmaX12cXb3d3p6cW92+e7wbvb07Oju6/fy/Xvv7vx27npm +b/VvZnR5bmtvfvZxbnf08Oz27Px37fnr7fnvevlvZ21rYGvw8/7n5vXw7vHr7e75d2dkb292 +bfR+ZnZz8O/tdmt/cnl5/nz/4ubp5+Xj7fRua3prd/1wbnj6+vl+/Wz7/XF2+3Fr9fxsaXdv +a3rw/vn36e93fHb4fPz16evw6+z1cG56c3b78vp8e/70c2129nJlb3NveHfv7Hn85+nq6en7 +eHZ+9nxwcmlgbXJsdnD7eX3s7e7y8vr4+3p6/W16+vbt5u/s7fl4eX19ff9tbfv2/HB+fPx0 +c3lybGlucPH57/Dv/fjt8Pt58+n5fvf99/N0bm1zcHJ9/vT9en729O/o8/f76/N2b3lnb/v2 +92xkZXb+dHX28/r48Hx+9vJ+efzw+HH39Pf2+u/ufPjpemz2fXtxamlx/vj+a2pndv54bfjr +9vzz9fbr+33q9/bm6fv+9e7u6+77dWhrbGpuaXR6aGNrdm1zfv10dfvt6+/p6e/s5ubsfPzv +/fH++PHw82p6enRqa2ppfvz0dHj47e3ky8hYTmtmSlRu5tzhaezQ8VFRXVXl/1Ba2tbv3sTH +38nUeHH7SU1bVGne7WPl1ujp4nZuZWhpYl1qaWpmanvf51lT7+rs99HO82h97W5MVNbO1m/U +xtVJVm5dU1tUadTacvvZ3W9ya3pcZmth4O9h89t0dN7o7txg8OdZS1zt9mB46ttpbeLzbGvt +19h+29HYY2J852FXVGbtYmbh6337bm1kW3N7YGfi9Hp97eXm6ubjanba5Gtw7edja+HfZ2p7 ++H1zZWp2a2/s3HJleWZgaGd6/Gx46vT24uv2d/l7ZGt+b+/g4+7m5/3u5Xxob+zjdGz95H5f +de5qYWFoXWF24+L/bPn9aGRu5Xn+59zi9efte19de3JeZ+Lrd3fp5Pth7t3ubHbj73h09/5s +Y2/d1vNt7uhyalxed296bO5sYXrwbm/1ceje5u3s+Ojq6nlnbH9hX2tw9Of9Zv7u7n1q8vL+ +/+fr9WtueHFoaW9ndGvr+3T17er27N7k//jv8e77dvj2+v5ianJlX2Rv8Xdt9+r4Zmn9/mb9 +7uNwduji+mJ7+Xpeaufrbmjp8u3s7ePkeWxy8Ol0euryfGRf+/NcaOjwaWb0fG1lc+z9a/fu +8XX/8u18bvPv7n3j3eVnYG79Zl76+mhf9OTu+PHm919k+/J0bnfv6vh66uvz9/HsdGn4fml+ ++PDrb2J76nlbWWx2Yl9z/HH78Obn+Xrh4WRb79x8Y/be6HF83+pnb/f5cmrv6Ph7e+xybV9q +aGhucn75/350cer09/xrdvPy+X117eRtcnpkYmdv7e5+/vb06+/9+uj4aXL0cnv47+fm5uXv +bWx/7v1saWxvZWR16vthbvjtd3f9dm1sbebrZXn9/X1sZvH4a2r53e396uP3++/zbHvj8/p/ +cPLd7WZ69e58Z2hpbV9fbfj7bXXo9mPv3vF2ffNyannve2997Ov0++ft7vF26fh0e3Lv62li +a2V8/nH8dGt08/x2b/zlevXr7PTs7Pzr+nP25up3b3Ztce72cG9xdvfw9vp6aGt1b2tt/nny +7e3vdf75fHJv9/T+bnJ+bXNs/unw7OXr93t66ep27ePwe/Ll/m598+3wem1zbmdeZ3pya295 +amx36/R3bWzu5vX98eXp7+Xl5ntv+3VocfrveGtvcXf4dm/u73V3fH349PP5en7k4vZ2/fP7 +cm10dXV4dG99+Ht7b3X29/jwfv7v+Pnr5/z27e3zdnp9/W1kcfb5bWhsfe3xfHFpaf7q+Pfr +4uN1cunvffX56+Tz8+bsfmtoeH5sbG93bWFp+HZsdmh47+7vcHP8fG917+Tl7Oro6eLl5e15 +e3x9bWhw9f1ra3H/dmVjb3B3fXXr4fp5fnj67unh4+r29/hvb/f0fWls/XttcP/8dmtraG12 ++ubj7/787+v9b+/s9m/8/Gr99+/jf+7o9353/P9xbn5waG9vbHv8ePvu/Pnv8/Lt8/jo4OPv +8Pp/9nFqbG5vbXV0c3zxemtxcmhobH7v8/54fX7u6+ns+e7n6/Tr5u70+3v2fXb57e32/HJp +YGJubGtzfvX+evf05uvufHb17O39e3VzaGppcu9+6uP3fvn0+Wts/fr79fn+8uzu+Pfs8ndu +aGhrcW9v9/D7e35+fO/l6PBv++v7efz1+/Lq7fh7eXh9/3J1cW5vb/ns7urzd/HvfGlncf/9 +cWtt+3Nzcnb6+/Ds8vLu+Pv4fPDm7/zu6fX/8+ro+3h2cG1pb3dwZnn1eHx7e3d2bWxzeHB0 +fPN4cury6+nx9fPzc3p5d/pwdPDn5evr7vh8/vl6dX75bG10e/V6dHf99Pb6eXR7dnhxanj9 +fnj76ens6+f2fnX6+XF0dXhtamptem50/fn9ffp0bvrt5+jw6N/t8vX38fx0aWxvd/x1dHv/ +enZubXz+dnB3+PXy6fL17+3t8fHu7ftvZmBfam9paWt57u36e3359/d3bm939vDv9PTw+v7y +5+bxe3j1+vnt+ndy+vtvaWhta2pxcG1oZm5ub3v/dXjz5ujs8enh6/Lz7fv//vx0cPrufHP+ +dnF1cWt99vv/cXZ7ff15bnbt8nt2+PR0dO3t9O3vfm9393ttb/338fB9bXr99+3vbmZxfnVm +anN9+Pb6fXr28Pj+/vV8cf/s7O/s8v728/Pw8fT//3Rsev10aWZlam58/29udvz6dGp07O/1 +7Ovr5t3j+f51cG1ranl8bG9+9/Px9vf3+v52cW9vcf19fffv9fbs8npzfXFxeXZyfPTv8/1+ +8ez2/X9+bmlub3Jsbv/19Hh/7vF8/Hdy9vZ5d3R78vZ+fPf7/Xt6/fv39vt9c37r8fvq4ep9 +b2tvb2x1a2JocnBv+u/w9Pby9HtpZmp0/fv4dXN67ePm6Ovm6vhvcXB19vB6cn17b3NxbG9t +ZWd77+/u929u9Ozx+Pjs6On/cnpvenhtc3z9c2hnZ2hpa3F0ff/57e338u3r5+rq4eHt6+3z +8vj48HpucWxkZmhhYmhpa3JuaXzx7uru7u/89/d/9+/y/nx3+3ht//Lt6+fp+HT3fmZnaWx3 +/3x4dPz6e3Fz/evw/nz76+/8/PXy+P5/e252/G9mb3/9dn12bHJ57Obl7fZ8bG568+fm5un+ +a2ZsbW/77XpeW1xdY333eX58/uzm6ent7fTx3uHs7eTf2t3m7nRoamFdaHP5d11WUlBWX3/g +2trg821pbXv9/uvo8nJmbHv77d3p+PTq4+v4e3bz6uDY7Gb382nq4378aWhyXkxHS1jl2Nvi +eHFtbG9rbeff721fVl3jz87T3d7f5uHk7Orb0dHrWU1SamdXTURCTGXi2tjU1NvzW1FXbN3X +3epsYFha8+HUzNXZ33zo1s3L097kfGVeVEpHRUBDTWzTyMvV5mJbYG78+/Ps9v9sVFjy4ODl +fnzh1Mi/vb3F2mlPTE5LSEI/PkBLYuLRyMvQ3XFqb3vf19z4ZmBkXWjt39Tb6dzWyL2+xdJx +ZWRPTEg7NjM2SuLFvcXS9lVTY33bz87P4V9RT1N0zsrM12Vp2sK6vcXO6PlpTEQ/NjEvNlDQ +vbrC1GtMSlJn1MrM0O1YU1tWds3Ky+xTbNC9tLa+0GljaExEPzYxLjNM0b68w89oR0VPYdfO +xsbsc1JKX9nBv811W2vNuLK0u9ViZVFEPTkyLCozUsS3ub/OZkxKS13by8bH6ldOR1fdycPP +bFhk2byyr7G+2npYRD06MisoLkfGtra8zGVMSUxi3MvAw21IQz5R3s3H0HJiatu8tK+uus50 +Wk8/PTkrKC09yra2u8dfR0A+THHPwL7UUD44S9nBustaTlHuv7SsqrC+6E5EPTw3LScrON63 +t7vE7FBIRUlV7r+8zWE+OUbgv7nFeVJMaMe2rKquu9VVRDo1MysmKjfkt7O5w/5NSUdW9dG8 +vMhpPTY/5r63xmNHQVnHtKyqrbvaWD42MS8tKSs55rq1usLcU0pKW+HNwr/OYkU5P+rCuL9a +QkFWwK+qqK2821NCNzEvKSUrPM20tr3KbE9KRE79yrq6yWU/N0PcvrfFWUI/V7+vp6auvt5N +Oi4uLiknL0fHtbm/z2RTTUZS5Mi7vcxmPzlPzb64z1dKRXi7rqmqtMHaTzouKygmKDVqvra8 +y91rUlFOYM7Cu77mTj07asi9u9pVTErdt62oqrbKWEY2LS0oJCo37ba3vcL0a2xLT2PmwLvC +1Us9Ql/IvMPkUkdN57usp6u2y39INispJiMtSMu3uMHI3WdiTVbgzb28y/5KPkvjx73NXEpE +Uc+4q6est9FXRDErKyUkLknBs73EzXVtXlBh6su8v8l8RT9Szry93k0/P1vEsKmnrbzUej4v +KygmJjBOxrq/x8/hcVtWfNXIwcbPZEVBWcu9v99MP0L7va6oqrC+4F49LionIyYzYrq2vsXX +83dZT2bcxb3Bz2dFRu3Fu8JiQjs/57itqKu1wNZfOSspKCYrOfu7ub7G3nRnW2h9483Mz9pX +Q03fw7vHYkU8SNG3q6ittsbfazwvLSgmKjJYwr67wtvjZUxUV3vNysfPX0dL3b+7yGBAO0jT +tauorLTC51Y4LS0sKystQc+8t7vM315SZFxs6N3Lzl5DSuK/usdlPztG07asqauyw9fgQzMv +KykoKTZqxbW3vstgT1pRW97Sw8hwS0vfvbjGXT03Q9y3rKmssL3dVkE3MC4qJiYvU7+ysrfE +81hRSk1o28TE3k1P3MC5w2lAOD70u66qq664zPJOOzMtKSYlKTzdurG1vdJWT1JNcNrOws5f +XtnGvMVzSTo9Y7+vq6yutcfeX0U4LywmIiQwWr2wsbjJa05OTFXr1sjJ3l94z8S/0FE9PE7O +tq6srrC5x+RMPTErJiEhKULBrq2xvdthU1NUX3/WzM/eYuLLx8xgRT1E9byxrq2vsrzQe0My +LSgjIiQy4LiurrfG4FZiY1hgXvLSz9rd2M3I31JEQVfLurOvr6+zvMtYOy8qJB8gKkfEs6+y +ucPN1vhWS0dKVvHm/dzMxcfcXkxP7cW7uLSxsLW+0U86LykjISUvTsu8t7i5uru/y+VSRkVI +TlFVaNzLys7o+dvNw8HCvry8v8ncVkE8Ni4sLzlEUl5qcODIvru7vcXO3fBrU0tMU1pWTk1Y +99fPzcnDvbu9xc7a4/BiTEJCS0tEPzw7P0pZfOrc0c3Kyc/d7fHq8WtZU1vu2dfZ1MrGw8PG +ysvN1udaSkpKQj07OjtAS1JWZ+LOyMbHzNXe29nqYVNYaO/e3N3b0s3Nz9LOy8rO23VfXlZH +PTo5PEVNUVl83M3HxszkcvTzeHRdVWri083P0dDR0tPY2dLT0tr0aGhmWktBPz4+REpMU2Xc +zMvQ2unu3dzl/GVf8dfUz8/Pzs7P0dne2tvlcl5ZXWJVS0Q/QkdIR0tX7tHNzdrz8uXd4/lx +c3Ds2NXPzMvJx8vP1dve7HleUk9XVUlEQkFDRklMU23YzcvP2tzZ293sbF9jeOTY29bOy8nG +xMnO0dnuX1BNUExGQ0A/QERGTFdo4dTT09TW0dHS2ex2d/7v5N3b1tXPyMbIyszT4m1OSkxJ +RUVCP0NGR0xYbOHU19LS1NLP1t3e7P9uafvm3tjRzcbCyMvP2+VnT0tKQ0FDREdJSk1ZbOjW +1dHP1t7g5+rk82xsbHLz5t3e287GxMXHzNXqYVRNQT5AQkVKSUlSbunc2dLOz9bk/W/07fJ7 +e/nj2dXOzs3Jys3Oz+FnWE9JQ0NDQkZMTk9aanjk2NfRztTd4uHc3uj79O307N/U0M/S0dLZ +3e54Xk9KRkRDR0tNUl1oce3i3drV09PX2tzi8Hhv/+7o5N3U0dfb2N7n9HRlXFdOSUdJTU5O +WWh+6eXi2tjY193f4uDe5P555+js6+Hd3Nzg3t3o9m5dWFdSTUpJTVFWXGvv5eDd3t7d2tjd +5+bn3+Xu9PDy9+jm6ODZ2+f5bGReWFhVUk5PUVVYYXf+9uPd3t7j59/Z3d7b2t7m6vpyduzs +/fDm5ubuf21mZF5cWVZTUFFWWmBsbXXx4d7e4N/c2tnd6u7l5uz19ejm6eTt8enn8XRpY15b +XlxaVlZaWl9sbGl6fnjq39/l39rb4eTtevvw8ujh4+Lj7/v1fnBqY15dXFhcZWlna2xpa3rn +4ufp4+Ho7PD7+376/Pf0+PPy8erk7Ovr/25rb2pkZGRlaF9ebPr/dvvu9vru5+jt5ubveXZx +bHFyfv727fTz7Orn5Ov9e3ZsY2RrbGBjb21rc/r5+unp7u3y7evw+3d0cG9zc3J2eezp6efk +3+Xu7vJ9d/5xZGdqYV1iZmltbWt3+fXy7/n+9Ovp7/Py6Ojs5t/f5ejs9Pb5eW1dW11cWlpc +ZGNka3d9/uri5Ofl5+fj6Onq8P797vH77ufl3t/n8XBqdX58Zl9dWVlaWlpdX2RlaHfw5ODe +3t/j6+Xk6evm4ufs6ubo7vLu8XRqY2JoYF9dWFlcX11fa+/y6uPe29ze4+j5+PP+e+3k6+Pg +4d3d4/dqYmNfXFhVVlhZXmhx+nZtbf748Ojr8vLk4ubq5OXn5ubf3N3h5O3v6e12ZF1hXl9e +XWBoaGVmYV5lfHhy+e3v+/v88ens7Onk3uPf3d7Z2+X6eG9tZV1aW11dXF5gaHH39Prz7ezz ++nV+ff3s6eTj3drX09PY4uv9aVxYU1RaWlhZW1tedfH08uTl8f5+cHN59Orl4d/b3NvX1tje +6393aF5bWVlYWl9gXmB2fW5xfX797fF0eunf397e3NnY2Nrc4ux7amdjX1tYUVFXW15eZG55 +/e3r9O/n7u7o39jZ3Nzb2dfa3Onu73liWlJPUU9PVFxganf97u3w8X10+Ozo6ebi3NjX1dHQ +09PW4vLzbVpXVE1NTkxRWl1eZG54eH3v+Xh78uzr3NbV0s/O0dLP0Nbc7n5tWlRXTkhNT1NW +XGVmYWxta3n0/e7a4uri2tnU0M7R0tDT3Nzg++xjV1hYTExLS05QVmNcXGxo+e3o4tjn5d7c +2tnZ09XRysrOz9Pf23pYT09LSEtISklTUVRXbF1v6/B3393f2tnT0s3Ly83Fys3Ozd7f9FlN +SklBR0BFP01JUk5nZ2jv5OTez9TRz8rMy8jGycPDycvL3u1uZU1DSD0+PEA9QUpLVFP9Wvjs +29zOzMvLx8bHx8HGwcHBzsXO+NlYTD5FOT03Ojs9RkNMT3JX1erW0cPJxMjAyMLCwcS+wL/F +xNR490s/O0cwPTM9NEA/REdYc27P1srGv8DCw7+/wLy/vr3Dv8jMYOVJRDk8MTQyNDQ5RD5Y +T9dnxs2/w7y8v8G/wsXAv8G7vcLB2mxSQjo4Ni4zLzYwPT5HU+LN1L2/uL21ur2+v8nGwcHE +vcXKaG9OOjk1Nyo3LTcwSUBO9czAx7S6t7azvMG8ytnfxtXRx8zlRdw/OzU/LC41MDU38z/z +y7jcs6+4uK+3wry96/fN2mjK2Fc//0EvND0sKUIvODzLP867tMirqriwrbnMvspXXNteSO5n +PztZMi4yPikzOzs37NP+v664uamsta+uvsbG0kp46VhN10EyPzkqLjMtLDg6QUnF276wrrep +qq+vsrnBytBgT2pWV+1DM04xKC0vJSo1MzxmvNa4qa6ypKexqq26xcPjR1BsSUzaPC9QLiUo +MSIpLjc2b77ItKerrqOprqyut77FzVtP8FlcXzA6PSUkLiQgLCwxPs7Luamlq6OjrKustr3G +zdxo5uR35zgwSyggLCkdKisvNfPYvq6lqqWhq62vuMHL5c7s3MnJzEE0UiggKyocKy0uOebc +vK6mqaahqq+vvtXX62ni2MXIzTc8RCUgLyceLy8xQMjOuaukq6SjrLW1y+j/6PNyzbzE7TJO +NB4fMh4iNTY4a8C2sqqiqqmmsL+8zOxZ28/cyLLAPTRnIxsnLRopPDk/urWuraKkrKqsytHT +b1llzL7Iua3FLz1JGxkrIhkuRUFnsKmqqp6lsKyyXmrva1vMu7i4rK88K2gfFCArGiZH3FS1 +qKeuo6S3vLlYPlFgY86yrq2rqLYsKTsXEiMmHDPIt8Kpn6ezpKvQ4tk8N0nRzbmqpqeqrE0d +LB8PFiwhLd+oqa+knbO9rss/PkM6POy0sKijn6aswB8ZJREOIC8txamcpKifp17M3T41N0BV +ZbSop6KhpbHPRBcTHhIOK2FqsZ6YormosDE4VT82Psi1xKqepKekq8w8KRITHBMXUMGvqJ6b +qPbG0i8sRNZTWrGpt6uhpq+xuFg1LBQTJhkXfrG1q6WeqTtRwjIsUr/F+a+muK6jqrG7zl8/ +ORsPJSQVLa+6rq+hoVk1vdUvOL67X7uqsK6qqqq8cmBlSSoRGTUZGNq1tbCrnKo9PtJuLjC6 +uNa3q6epsaiq6kVn604mEB43FRrDsK6vqJurMDXNOyYwrqvJs5+muburrkY198ZDHw8iOxUd +r6elsamYryMmVEYjM5+ivq6kqcBer64/NH3DviwPG1EYF9Kjn7Sul6koIi9bMCqrnqyvr6yy +a76u2T0616q9GA0zLg8hrJ2esaWaxyQdIMtAJaSYqLPSs6lHU67JPzrEo7UdDic2FBq3mZe1 +t5quHxUguEQlppWhvFOvqjk2uL1ANr+cph0NIjYUGLyVlLW8nKsjFBrLvyyzlZy9SMquTTLW +wdJexJyZRwwNLR0QL5qOmcisoTMYEx+11U6fmqC3QMG0PTlg1ru7p5mbPAkKJRgVVZeKkc7X +ryoQDx+1rbqdlp7FNDtPNjRdvKahpZ2fzRMDDCIhXJyNiZ8pMycXFRrpm5yen6m+KRwt6s28 +rJ6aqczFvk4SAg/Dz8+llIykGRwvKiIksJScvt9tNyEhyKCjrKmmsT4rXrO+NxkRITssX6Oa +m7MyLywsPWK0q7VbMi442q2moqS6OyctWcuwn5meLgkHHDI7q5SLkzwcJCEfJmafo+ZKPFXO +b7CkukgxLD/BqJqZnaU/FAYFIqmelZGSnh4MEiBDt6SVlvIeGRs12LidmaVnJSy9qqWkqqy3 +OhsLDG2gp6atrbEjFiherKu/srIvGRYivp2Xl5usLhkcP6ufnp+eoas8EQYJKK2kpKOcoS8U +FybLtL2soK8tGhvmnJiYnrouGBYss5uRkpipSywXBQMTqpSZqKSe5RcOG+umpqefosEkGB/B +nJyhqtMtHiA/rJqUmKpBJi4sDwgTsZWcvcuosSoVGDulnKOrq7A7GhYmppSbsUQ0LCIm052S +lapZOTYyGQwPK56YpLi2vDMZFC+lmZqhqr4tGRUd3JuXna1EJyEkNrKcl526SljLRxoNDiui +qbu8q6OyJxwvu56hts9kLx4bI76alpyxPCQdHCfDm5OYo7XgPSARDg8kn5mbnKKvWRgPHEqf +mqGsr1olHBxDpJufuz4rIB0rupmSm6z6ODU0IxsZHq+bpK7DYUMlGi67n5ulv2szHhwhe52X +nro4IR0dJtWelJSfx0YyLi4sLCMhxKissVAzTTstXsmuprVQNSorOk+yn5+tQyEbHSnlp5mT +l6ZMJSIv7ra5SB4dPkhGSV2un7w5MS1N90VbvrisuGBPSE9LMzBgvLK1vrOstuBOarSoqr8u +Gw8TLm6voqSnrDkkJSY/vbKsqbW78zo5P1DR4FL63trN18exsbi4wr2+XDYmHRYcZLClo7C7 +vTInLDLEqq+vscfXPSw2U2rK02tuVlRo+82zr66uuM5WOzEyLx4f4LSqrXVkumo9OTHYr7nF +2lfdUDg+WF/Yztzd1fhVS2C8sLC2wc3P7VU+MSAfRMqyrsLFs+I7NS9fucfMdFLT9UBET2XL +0crKdEpGRdS7x8jIzcDCwK68NiEbJ9S9uLGvqrI8Kio06txf1r+8v1U4Q2XSyebyydBROTRO +zMnBtq6w0js73LC7LB8t07jYP+6urMk2KzZSSjxNuqeryj47bs9MNjzMs8BJO1e8t95LTGfg +ZFDqv7Wvt8HNRCIfKzrFtLqytPZAODRTz8m9u7vITjk5PE3u58/Au79nOz1MWWVbzLGxvdpI +Pz41O/m4q67HXEMrJzRIxLS6tLDHTzoyQEpCXM69t8haT0pXUkBI3by0vOtZX1JIRlLVxNF8 +Wk9hcFz0zca/zWZeUkZIS1F+dmB65tTO5WFVSkxl383HycfI2G1OTFpeUE5m0cTHz+xrTTw+ +Sm7QzM3Fx9llS0JDTGnQxcHG2WRPSUhV79bQy8rO511PSUpKSFfez9Pf+PjqZlxd9s7PfVxd +89fb187O22FJQklbdNzIvsHVTj4+RFJj39DKx9LxXk9QWVtq6djMzuJoWVRYY2nez83M3Wh0 ++G1ZVG7c4mRST1lkX2fh0MzUb1pVVllXcNzb29PS0dtdVFldeevv2c/Y3npcXFJScez35ePp +3ex9cGBdW2Dq2uH+am71dlpRXeLT3vd9+vZrWVly5N3Z19jqWE5TYe3X0dPW3OdrV1hjcuTa +4d/ldV1PTVRh8OXh3N7ofWBYXF9w4dba3/F0dG1pX1xp9uHc3uDi4/NoaGhucvPf4/BoYmBm +bX3+9+Xd3vBtY2Fka3j46/xnYGVu/uvv8Ofe3uvz6+71937+9/z+6ebxf2tdYXL3/Hh+/nFs +aWV2dmhv/nX87fp+/v7u7evj4NfX5/p2aW1xaXHs5uZ9aXBtYmVpZW/+/vF2cO7q8/j27+js +9nprfXlvamv85t7sdm11fG518/Ht4u5sa29wbWZk+t/c4/p/+fz+b2Fea3f+fX7p53lv+vj9 +/v39//Xv9+73/uvn6ujzamp1fHpwa2praGVkann17e95ePt2dXZ67+7p4N/o8nx2dnx+cGlr +//b0cWt8/H5ybHjr7Pp89/Z7+/d5fPl7+uje3eDrb2JcV1dcZnzq6fl89vj8/XNy+e7y+PHv +7urg4+7z9P59enH+9fxxbW1vef14b3RuZ21ud/n7ff17/f317vDp5eDrc21qbnFvZWp8ePnp +6Onr7npu/vb1fW9sfvH27e/5/Ozt/n14a2ludXt6dXd+eXR4enV4/u3t+Xr97vDv73739/Xv +f3V9/X54bnD97/Du6u75enNxbG58dW1x+v/9enNyfvXz8vLz7Or2dXBzb2p0/H7+/3j9eGz5 +6Ojt6+5vb/vz9O7t9fN9dHZ0cW91fnBu8/J3bXF6a2ZnZ258+u77cfXq8/Tr5uXm6u73em19 +/n389+r5b3b8fX73fXZvb2plbGx4e/z0+fL2+vT/dW9se3Rwfn13a2f++fLj4eXp6ejt9+/v +9fLv5efufm1pZmFhYmdkX2lxanf7eX1ubX739vfv+H3u5+rt4N7g4Oft8PL9eHx2bWxvbGxi +XmVnbnn2dmdpb3Bv++rm6uvq6+vn6e35/X56cXB7//T59Hxzdv30+Pt+/fn6e3v8fHpwampy +fXt9eXv07fJ7f/d3dnl3eXX9d2Rld/z4+Ovj4OPp6fD37Obs+v5zam5udfT2/Xh5fHVtbWZk +aWRkZGFu9/Xz7uvt9ube6+3d3vxub3r+eXF8fn12fm508/bo7f14bWls+uvo7fX6fW9sb21r +b35ua2397Pj37/Pu8vN+cX3s7Xxwevl87/N1fHx6cnt+d371f337fHhtbfz5//n0+3739Hxr +bHj39vPu7ubq+ff/e31+8vfx8X1sb/ru9nv8eW5rdW9naWhtdnHw7Pl0dPnt7n77/P757+ns +8fPv8Hl4fv///HZlZnD9d2xv++/16On1/Pbu9PX/cXr7eHn7f318+e36eP3+dG9qZ2Vne35z +cHR9/P/48PHy5+bt6uXk4+bs5en5bWFfYGBfZWpxb2xsa33y7u75efbp9Hn8+PLq6uzt9u/u +eW789nx3cnFyfu3wd/v09fd0anB6cWpvfHl1dHRu+unh4/Lz/Xd6d/p+cHZ5d37x7fdub/75 +//18+PH+ffTw/X59+Xt1+/R+dPvn5+zs+XdvcH92a298fHJ98u57b3V4cf3n5/V/+XdnaXf+ +dG5ueXZ1f/Tu9fHt8P569PHz/vbi5vX78ff1/fb+amlsaWdodndrbXP6+3J+8/h79+v4cXvt +7e3r7Ofr8f14f3R8/29tbmZpbXjq6fN2fu7v7/b1c2729Hl1+/Z7dXD+dG16e25p8ujs8PX7 +8uLt+/j7cWtzaF9teP58/O/6e3n49/jz7u78+e3u8Ovj6Pdvb3t6eHl1Z2Nkb3Z0d/Ls+Hh3 +f3t+/HVz9+7v9P777vj69v51bW59/vl4/fp6++vj7vb39/1vfP1rbG9wcPrueW5zfe7p7fp6 +cGxue/x8++/2+np48/F7fu7q8/328nlsbmllav3s9n51+vt3cmluf/Du6u749/v18/Lo5+32 +89/n8Ovr+Xp5cGlfXV1gX1xicGtoefX06d/ue/fy8fHx8evl6ufe3N7e4fd6d3NtZV1lbWJe +XWZsaXN+/vXj3u17+/D1d/zzeG1v/+3u7ujv/vfv7vn9d3hvaWVpb299+vb9fPX6eG/85d7n +9P12b/7k5unl6O94b3J7d29nZ2RhamZgbfp6dnl2+vHz8+7q6/L3f/jr6uXj8u7h6ffv5uvu +/3ZsaGlpZGJpbnVpanD2/Hr1dHR2bGtna3bv6evt6N/i4+Hc2d3kf2doa2hjX15nb3327+zv +fP90Zmhsdv397+h9d+vl6+Pe5/5tcWpqbW78fnRv7+vr9vr19vV2cGhgY2x3bmx68u7o393c +2dvd6PT9bGFeX11bWVxmb/79/PXw9/x0a21z9+/s6+Hb2trc3NnZ3/luX15bWVtaXF1bXmlx +fvV4bW58/3Fzce3k6OXg3NbRz9PR1PD+cGZdXGBeW1pcXFdqeHD8fmV+Y19vYV1jfOze2dDO +zcvMztTlfGtaT0xNTk9TWF5q/ezp7ff98f1rc3x97uTa1dPRzs7Pz9Pa6P1vXE9LSkxOT1JX +Xm77+3JkZWpramhv9+Db2tfUz87Nzs3Nz9Tc6vxgUUxNTExOUVFRVl5eXmBoaml0d+jZ2Nva +0c/OzcvLycbIztbm/mJVTkhGRkZHSk5TVllaWlpbXV5k/N3b39fU1c/My8rHxMTGyc/Y4O5v +XFRQTEtJRkdKSkxNTlVVUFFZWlTW3dzN4F3Kxce+vL2+vsLKxdPp9FRVSD8+Oj48PD8/RUxO +V2T969/f2c/JysrFx8bEw8LJxMbJx8/a5PR4XEhLQzs8PDo7Pj9BSFZdYt/a5tTN0NDLyMzL +xsfMxb/Hw8LKxdPY7FppUD5JQDY8PTc7PkNITGTsaNvM4M3Czs3HzsvJxcfKx8C/w8K/08/X +WH5POEE/MTY5MTU8PENUXtnc3cTG0cG+zcS/zM3Kx8PGvL7Gv7/NyFZL4D0uRTopMzosMUE9 +QejY18vCubnEvLXEzrzI38i/yci+wr7A1dBlQFU6LDU3KSo4LzBDSlbLx7+2trezu767xNXW +3+rSy8u/u729ucFtRlc/KSswKCQpLjI7QGS6ur+0q62ztrW4xf7y3OV10sG7v762uMlPPVg1 +JCYqJiQnLDxXReiurLGyqaetvca/yEY6S87Y4se0rq61tbdROj0rIyIeHyUkKT/90rOqqqim +qaywv95fRTc5QV/Ovbetqaeprto6PC4gHh0bICEjN+y/raWlpKKjqa/RS0U3Li81SMe5saqk +oqKnujoxKSAdGBYaISc3aLynnZ2fn6Korso8MCspKzA817Onop+enqGuRywiGxoXExUbIzrQ +sKScmpucn6m3bTMrJCElLUHGrKGdnJmanKhNKR4YFxQSExcfOr+qn5uZmpqeqLpHKiQgICQs +PsaqnpqZmZqcp1UoGhUVExMUGB86u6OcmJmanJ+pukInHxweJzRPvaqemZaWmZ6yPCQZFRQS +ExUZJE2yn5qZmZudoazCPScfHB4nOd+2qJ+bmJmbosM0IBgXFRYYGhwnSbKgm5ucn6Opr8NG +LSIfIitDv62no6CdnJ6oyzcjHBwcHB0eHyg7w6mhn6OorbK4w2w5KygqNVzCtK2qp6Wkp6y+ +WzYqJyUkJSYmKjNHzriwr7K6v8bQ+Ew9Ojk+UN7FubGtqqqrrK+3x2FANjEtLSwtLzM5QFHz +0svU9V9VTUtLS09j48+/t6+tq6ytrrO5wt5XRDo1MjM1ODk5PUJNWVxUTUxLS0hHS1jw1ce9 +t7Ovr7CxtLm+y+RkT0pFQkBBQUFGS1BOS0U+PT0/QUNKTlhv1sS8trS1tri5u8DP9F9TTkpL +TVZfb+fd1NbhaE9EPTs4Nzk7P0hb3se8urm5ubu9ws/4WE5KSk1SYPHZzcrIx8fL22tPRD48 +PDw8PkZPbtrLxMPDxMbL1u1jVE5MTlZeaubWz8rFwb/BxMvfa1ZNSURDQ0VKUFtu8OTc4fR1 +bmdaU05NUldi7NvWzsbBwcPHys/V2+X4b2ldYGRv6vptZ2JYUUtJSUdGSU1OT1dp+9/W0c3O +09ja3NfQ0tTPzc7KxsrMz9rzaFtMRkNAPj89P0lMSlb+cvXV1tPO3e/g7//T023JsbnKvrCv +v1Vw0Uo2Ly4yMSwtQFRMX9jLycPDxr/D1dLM6HzLw7+4s6+vr7XNRlVHKCcqJSMmKC1BP0m5 +r8e1oq64qrK/wHdLwdQ9vavDyaqvTErGPiIpKh8eISUtNDTqu8Cxp6eqpaetsbzK2vNi28O+ +vb2wyDLdyR4jSx0XLiocNlw05664raCmoqCvrKvfaL5FPbvKX7u06DnYyiEpVh0ZLykbM1Yu +SbOys6SgoKSloLPEuNQ7Ut5J5cPPvvkusDkYwywTOzMXNNAmQbG2vqqcpqyeosi4tTo8Tjg5 +XV7bvrKsVFGhNh2sMBJHLxQvOh479ma0r6GeqZ6durOrWk7UPj5NR+PZvatFO54uG6csFXQr +FjIzIjdTv8Kxm6avmqPWqLVA3l03QEZFZeC6tbCtS8CuIzHNGx41GxwtKCk+vLzDnp2wnp27 +rKlf4ds9RkM98XC/tL+pr3K+4DEvLh8gIB0fIyszPr+1r6GjqKCnsa242tVUTExJ7ufJsre8 +rLXG0n87Ky4kHiAfISAsOzbdrryuoaqspqqzu7W/T97RTtzFwcC8ucDDwW1jQCwzKh0qJR4t +LS1Xac23u6+rsayts6+5xMLO287SwsLPvsDk0V9SWzk/PSwvLysuLzE5N0NiYMi8wLezuLay +tLu3tr++zd7HePDY6/ZuaVdGSD02PzQvPz45Qj5aWz/f1GjNwMzNwsK8wLS0vbi928nbYP1Q +SlJFPkxKUFFydFrbdkxNQDgxOks1SM1rY763w7art7+0u19nz0Q6YUg97ujSz8e90W7I7URf +SzE0PTc1Mn5KQr2+67q4x8nMzd3gz93/yGJQ7cvR4sW84c/mWPXYX+xxSDg8UC8yQ0c/PGzL +2Mq/xsPd1b9VeMRTWMrm3tTIu8q8tsrOz3XvY05cQTZBOy8wNEdMPVy/cWzFy8Xe2MTtWsHP +3cfVvcDIuL7CyuvJ5kvwaVtFMU9EKkJnMC9LWD4+xsZHwbflzsTKysPMy8m+xMO7zdK+u9nT +xNxeSEw/LTI9Lys+RDZES05PxcVyvr3k0L7Jvbi+xLS5/c2509fEysbP4MpWLy8vLC0sQUAz +R2ZH/PhOy8rDwMa3u8S/uLm7wba/RM+4dvm92dDHPzM7NCMrMik0RT9I+tfNzbnG3Lu7zryw +usC1sLbPVsG7dkh2yEpNukIvQi0nKSY3OTRORta73sC1vOPVu7TBxK+ts8fFvMtozszRTmLM +SkU/MSwlJC88PW3mUU9nVePEvLy7xsm5tLK6rKzFQNi2SD7R2szTQVw7KykqKig4Rj++5Te9 +uF2/t8+/6NGwv7ymqrbK9r7ZSNDhVG1HNC87NycjLj1HSN7T29hOaLS6c7q/0MPBuK6qrMJN +vcc6W7/Czt1CLyQcKTpFOS7fxjo8vrW+y/TS+eu4r66tt7Wu2D9fxM7OvdrOxS4lKSYsLjZP +elY+Vb68R1G4y1vetq2zvK6vx9F83tZe0bbOZsZGJSoqJEBEMspGLtLL6r/N2vlD2bO6tayr +q8M96LrLW82vttM3JSc/Oh8qRjhb0mO82FFnQXXG37uzzLirsLbD4c1sS8a3vskyLzw1OC0t +QmhDPFTGw2FP3tFx6MiwwGC1qrfk08ffQ9mtsUIkKUE+Nzk1SdA7Sbe+3lw/dsTZybGzx8u7 +s8710GBE97+56yUoYTwlJD+sszVCv7nISuK/3Vfot6y7wLK8911HfbS7Ty4mLTg4LC1Rxbvi +SNe8ws/i2MTDxbmttcK7wtrea/2/vzobHjQuTjsp+8dI2si9tMpYz7a4urWvsL7UtKzGYsK+ +1jIZFyg9Tkg3Oj0yT8G8tstHYb6zrKmpsb7Dv62sz82/vbsgDBParMwsKUk6KDuro8IsMs2w +rqqlprtQ0a+jq9+3pLQfBw26obkyJUc0HjmintwfJsutraukpMM+1qigruO+pKApBAq3lqAm +GUlVHiqplq4aHGynpa+qoLczNaybqW1JqZksAAenkJ4nGHP1Giqhla8ZGsmjpbGtnrYuOa6c +otPZoqAPABOVkJ8fGF8qGcaVljkQIKyeoLSsoGMnR6OYplW/nEEAAqWOk00RMckXJJ2RqhYU +ZJyaq8mprTcuvpudxbyd0QAAzo6OthMhyBscopCgHA8tm5SjwLO2TTzFoJ6usp1XAAC7j421 +DyDLGx+nk50bDSqckZ7Lt7dDPMCenKqpnhEADZyKjSYNLTkeX5+XuBEQSJWPplfB1DhCrJmf +rqAwAAPLkYekDhcuJMCen6ofDyKokJS0TmdeUMGln6KceAAAN5eJlxUXKRpVm5ukJxAhr5eV +p77RSUfAoZujoEIAADuVipsTFiwcSp2dpSYPIaiUla7xyGdLvKObnKIaAAe7jomsERgdHqua +ob4ZEzakkpOuST881Kabm5/WBgAbnImNLBIZFzmbm6MuDxnKmo+Zx003M8CimZWqDAAMrYuK +txobFR6nl5nXExMxo4+Uqb0xKFasmZGhDQAKyouJrR8cFR63nperGxIeto+Qo7Y9Kka6nI+m +CQANvIuLtScdEx60nJq9HRkltpORm7QuKTq7l5AzAgMbnoyZTzsjGSbPm5jCHRYnppSUma81 +KDCyl5wQAAxYj4+8LCslKDe+oaK/Ixo0ppaRmrdKKjGqmcwHAhSrjJPlJx8dOL22rKy/MiUt +tJiQlqVOLT6woCIGCRqpjpi7Lx0eM1/MuKmwbjgt7p+VlJ3EN0G4sh0NDhZYoZ6gtjYsLi03 +WLaqrcxBWLSfnKW/T1HEuD8gGxkfTa6otUszNUBZxLi+0U5B77uvrb1IODtXvre6y0Y1QMiu +rc8vKDRYyNNDNDNAzbCvu+VCRV9q3b26xl8+SNDBzFQ2OU3nvMFUNTFNva+yyVNDVe/1V+/T +42pf3s7VW0E8RFDpwMNqPTdYuq632ExF+8/yWldXb/l1083qXFBb3dXW0edNOzlF0Li830c+ +UNnhYFZW8crK0NpfTlT2zMXL1OhfTUZEX8rC0VRKXfbxbmBVUenLz2hLSVTmzcrJz+lnXF5m +79nT4mtrenZVTlJPTmPdz95WTE50z8nK0d9mWWbu3+Dj8NzOz+1WTlhdX/vq6XdeUlFs1srQ +fmNbWV1ia2ZbXdzIyexMSVVp6ODn7fb6fOnV0NHZ6nVeX3vva1BNYNjGxtxbS0hX5t9wXV52 ++vnr3+xsd/bo3eDh5GRVaNnJyudRSU5bYmhmZGpqfNrV42tdbPXl3t/d3OxmZ+zV1+5lVFhn +amhfXVpn59zb4nRkZW/q6Ht839Xa8Xbu3u5lZXzm5W5dYmdveX71cFtVW/XhdVdb+9/b3d/f +3eJ8aXvf2exOa9BW8+the1tF58xw3etp7+ju1d7wflxNUk1pv25V2PBXWWTdz2ZfVUlq1evc +4tfI32Dv2dvh7vrd4PZZYG9ZX3T7b2NQZPz2ffR5fV9WaGl+6eTv3ejj2Ovv6vtp5+x8dGFm +YF9u5t3xZnbu8Ojl2tf4au3s9GxfaVlVau3y8m5w2t3i2u3+5fpu+m5+719ZX11cYl5cWlZc +7t3b1NTOw725ucjMvr/mS0Q+Ni4sKywtLjhMY9u8tLCtrKuop6mrq66wrLgxGygpEBYgHyMk +NKu64qGepqSknqC5rKe8vK+yyh4ZTxsOHyYfJibXrD65n6uqpaOdrbWgs8Wrr7G0KRs9Ig4d +JB0kJj60Ucmiq6umpZ+ruqOu0q+vtq/aIyJCGhMlIyAmKvHJPrOmr6qmo6O2rKC5wKyvsLPt +LCMzHBUgHx8nK07ZSLGosamnp6e0rKW7tau1sLPQMCE7JRQgJyQmKlnOO8OptK+sqai2taWv +vK+vsrTBQCctMBkdLCMlLTLcTz20r7ivrqaosqims7Wyuru+5TolKzQeIDIpKi8vfVY2wLvH +r6+tqLW0rr67wPjA7WrMQkh4RVlPOkY/Ojw5Ozs5R1dj29vQwMXEwsW/xdDOycvIw8bEx87V +3HFPQjo6NjA2OTdGX2Z8X/LPdtrCysO8u7i7vrjAyLzE8XxYRz07Pjs5OD0+OTxMTVXta9TD +3sy7zb2817e0v729vMHe8Gp4Rzg5NTQzLS89PztE1s3OxLyvuNa0sci+18S62srN185ORmpD +MzEuNzktOltMTEzTtsrIsrW2wta4wFnS6MvFaNPA1lRLReNFMjs1NzwxQO5VU1XEtczDt7i2 +z2+4v0baeNfHS8fJ6V8/flo7ODY4ODc8XPlYTHu4xd+4t7S3a8i2UuTLT8TY28Pe10tNbD43 +NzMyNC89al5lXMKz3sixvLvG2brGYtLD6MPCy7ptZ0tRRS0xNzIyMj3sblpi4LrIVbq1wb3h +wbdf3MTMxcHBvMvqRlBbMy4vNDMwM0blaGHezLjIc7e2xsPfyrxx88rLvLvJu79bT1I9My0t +LS8yOFX+8tLfzLbK4bi8wL/mxb33zNO9tMO4vsrsSj84LisqLTAyOk/m2szY2L/G3se+vr/a +zb/VzcG9srK7xMFqREEwLC4qKjI3P/fhzb/MzsPDxs7Nv8hyduPSzta/tLO4wMfOTEI3LC0u +LS80PnLt0L/Czsa8ydDJxMbzU+fjetPBuLGyuMTJckQ4LS0sLDAzOlBp3MbFzs28vM/OxMnb +WF3Z+ObIvbexs7vA1nFINS4uLS8xNj5MdtTOysfKxsbS2tbmYlZZ+9nPwrmyr7G3v9lmTzwy +MTIzNDY9SVhw3tDU1svM5uvee25bWvbayb64sq+xtr/eaU06MjExMzU4PkdPf8/MztDLyuBn +entwaVzy08q9trKvsLW7z3JPPTQxLy80Nzo9Rlrj1dbZzcbb/u3/4/Fk79TIvLaxra6yusx/ +TjwyMS8uMjQ5P0de3trX2d/O1F1dXGPzYXrQybyzrqursLjJ7l49MjEvLjE0OkFGWuXa1dbp +0MxuXlpe/Vdc1cq+sq6rq6+4zVhOPy8tLjAyMzlIVP7Pz8/Q8OvL1GpOT+5rUeTGurGvq6iv +u91CPjctLC0wPD1DY93GvcPK2UY8TVdLRUnPymHfvq+npqOkr79KKCYpJSMmMVf1zLm1srC7 +0Fc0Ky4+SUxM2LrGxLSpn56foq/2NR8bHyAiJzDqvLisrK2tue43JSErPEx737uwvr6xpp2c +nqe6UCoZFx0fJSs5yrWtp6uvr8BVLx8eL1/Qxt22rry6tKacm56s9jghFhkdHikxWLm0qqar +r73mQCcdITTaur/Hubu+u6+inJqermcsGxYcHyQsN86wrqyqrrTGTjAjHSNBwrC6xLu+v7qt +oZyan7JKJhcVHB8oMD/Crq2qq7K6zUouHxwoXbStvci/vri0qqGbmqK6OR4UFh0hKy9Lt6yq +qa23vdk/KR4dK+WwrLrIyb+3r6egm5ulujEaEhcfJzEwT7Spp6iyx8v5PiccHS7Bqaq609W/ +squln5ydpsQrFhEZIS43NFu0qKOnuuHoWjomHB40uKamuuTwyK+nop+doavaJRQQGCM6QTz3 +tqegpLppSUE2Ix0gPLCipbjnVc2vpZ+en6awTSASEhknRUlL2baln6W7Vjw5LyUfJEqwo6e7 +cE3RrqKenaCrvDkdExQbKkZT3cWwpqGovk43LighIC3jq6OtvmhmvauhnZ2irtosGBMWHS9C +VMu6q6Ghq8xAOC0lISE2wqmksMta67Wmn5yeqLdDIRUSGCI1S37Dr6Sfoq9nOzIqIx8nTLSl +qLfaXsetpJ+epK3IMxwSExkpPFDVu6qfnqW8PzUtJyMgLd2spKm53d64p6Cen6m2XScYEhQd +LUBvxrKlnp6p1zsvJyMfJTjDqqetwdvKrqSfnqOsvj8fFRIWIDFI5b6toJyerHc5LSciHyc+ +uaqpr8PXvaqinp6nstsyHBQTGCIwQ+C5qp6cn65jOS0nICEqT7errLfHwrGmoJ6fp6/iLxsV +FBkjLDZOv6udnJ+u2Ek1KiMhKEHFsLC8ysKvo5+eoqqxzjgeGBcaIyouOGK1oZ6fqrzWTzsu +Ky08X9PO9WLRuq2oqa61u8XcTDQvMTc4My8wOU3ZzMnQzsnGyNDU0t1cSD06P1jNvbm6urm5 +vMDFwsDF1VI9Nzk5OjY1Nz1DSlBTf9TK0HdJTF3lzcnKz8i+u7q5trGusbvRWk1NST0yLi8y +Nzk8Pklk3ORlT01e3c/V6m3y2MrEv7qxraywub/Fy9J0TkA5NjIwMjU6Pj9BQkhUc9ve92Ne +buzb1M3BuLGxtbq8vLu9xtH6Y15aT0M9Ozg2NTQyNjxHVmVjXmHq2NTOycO+vb/Bw7+9vcLI +zszLy87Y6n5pVEY7NjU3Ozw4Nzc8R1f42M/Evb3Ax8vNzczO2d3XzcS/vr6/wcfTd1dTUUtB +OjQxMTQ3Oj1MetXIx8nJv8DH0+lpXWT31s3JxMC/vsHCw8PI1GNJQT8/PDg1Nzk8PUJKXdjE +v8PLz8jP3uryavng29DQzcrHx8nP2ODe4OVtW1NWUEY/PT4+RkxPUF/ay8/Y2Nza4N/rZEnG +w/PV3mhpYOO8ydPGyMfI7HFVTk9IPjk4O0ZNUWDr0cjFz87Yz8ruX11XWGFQSD3rwdBiya+3 +wLezt7tSOjs7My4nKTNH3cvHua6xtLzaX1NGOzkzPlJMZdTKvrq5srG1s7nAvtBIMSssLS0q +LDvywbq4tq+vuMxuUUE4MS4yOkJT6su5sLCvrquqr7O7v8FKJx8kJigoKDnFsa6sraytv1s5 +MDItKSs5TvfFvbGtrrCxtq+qsbu8xe1EJR0jJSUrMEK2qqyqqrG1zzcwMi8tLjBHzMG8t7Gu +r7q+ubOvusTA02w9JR8pKSYtMUy2r7Osqq+21DYxODAtMjRLvsbAsK+urrvKwL+8usbKy9tJ +KyUsKyksL0S/tLWyr7G0xUc7Ozc0MzZF2sfIvbi3s7nDxb++uLvP8+lQMi0yLi00NTrsxsa6 +trq4uM9fYks9Pj47RF1r5sq/wMC+v8TCwcW/wOJVbVo+Oz02MzpBSFVq68zGzc/P2N/zaWBt +6djX6+HY4V5QVF9lX23dyMC/wcC9v9JsVUpGRD46PUNHSEhOaPPt39fPyMXM1dje6mJNTVda +Vl7608K+wMC+vcHVbFxRR0I9PD9CQURLWfXh3tDIx8XK2+fpa1FKS09VVFBi49LKw7+9vL7C +ztzibktBQj89PT0/Slde7drUycjO09be62dWXGVaU1RWbdrUzMK9u7u+wcbS911JPz89OTk8 +PkdPWfjYz8zM09LO0/BkWldYVlNXet3Uy8G9ubi6vcHK31hIPzs5ODc5P0VNW2ru1s3Ozs3N +ztduW1tQTk9PYdrQy8K/vLi5ur3CzG5JRUE7OTc1NztASVFd7NHLyMfKy9Dmb2NYVVdZXnXe +ycC/vLm6vLy9xNhVSkc9ODUyMjU6QkhPaOnXycLAv8PM2/ddV1pgZWp839LJw7+9vby8vsbU +91JLRDw2MjI0NztFT2Hp1MrEwcHFy9Xrb2JgY2xqa2ry0srHxL66ury9wMx5TUY+ODUyMTI1 +PkpRb9bMysjIyMnMz+JtZmJmaGBpbubMxcC9u7m5urzF1GVEPjw4MzIyMzQ6R1Bs18/LxsDC +yMjK1u1vY11qfmNg5dDKw7y4uLi6vMLO/kc7Ozk1MjAwMDU/R0z5z8rFv77Ew8DK2upnVFNc +Y1/11s7EvLm2tba5ur7LXD07OjUwLi4tLzc+QVXazMbCvsHCwcrV3P5ZWGFha+LPy8S7uLe0 +tLi8v8f8QTo7OjIuLiwsMDk9SO7Lxb+8v8TCxsvP3GxVWFpm3dHOx7+7trO0t7q8xe1EOTo4 +Mi8uLCsuNz1H8s3Iv7y+w8TDxcrdZFlbXnjdzsjCu7aysLG2u7/RTDg2ODYwLiwqKzA3PlbZ +ysC8vMHEv8DK1v9kXGPf0s7Hwby4tbKzubzA1kc3OTo3MzAsKSoxOURu08jAvsDHycPDxs9v +WF1y3NHNv7iysK6srbG30jUkICEkKTA4OD9vx7qwrq+5y1E1LSw3SvfKxL22sq+vrq2tqqms +tNE/JRURFR03u6inr7i5t7W9fjYjICUvS72tra2vuL/Gzsm9sqyqqKuywEwiEQ4SHlKnn6a3 +z8WxrLpEJhwdKD7Er6ytrqustL3KxbWrqKquueBIJxENER1Qpp6ov9zFsKeyQCUcHixMyr62 +r6uprLvc2LipoqKor8D6PR0ODRMkwaGgr+54vKmoxS4fHitI0MrXxLCoqLPaV8uqnpygq8Fb +SSkRDBAdTqafrlJNvqqjsjAdGypdv7nQ07aopK3SQku1oJ2eqLtqSCsSDBEh1qSfsD49vqej +ti4bGytZz9d9za2fn69jPlawnpyjr77LZiIOCxQurZ2hzy4+rp6j5SAXHTnZ3WFTxqecn7xK +TsGnnqCtwcnLMxMMESW9oKG8LzK7oqPALB0eMEtEQE2/qJ+iuezCrKGgqbre0r45EgsULbGg +ossrMbWjqmcpIio9QDMvRrSjoa3XzKqcmp+t3jxEOhoNECa8o6CsSzF8sLk+KSw/ZU84LjnA +qae19OSunJaapLdcQCoTDBEpvaqorL/MsKv0IBonT+1USVDPsamyTzrVp5uZnKOyvPMeDQwa +Rbq0tLm7qp+oNhobLT4yLj+8qKOr2Dc+t6CdoKWrr7gyEw4aP8VoV8a0qZ+jXh8gPEMmHy/M +rKSnvkBVrqGkqauuvFMjFBUpvLVfQdiupqe6MCApVV4tKEG7r7W+0lzRq5+fpaqyaiUUEh4/ +xs3WuamhpLU/Jyk2MyUmXqqjrcpuY9i9ta6nn6G2LhQNFzzBTDLRoJicrEkmJ0n6Kx0ovKCh +r8lo7bisr7mvoqRqGg0PIU9YMjyumZaeySojNNxEJyrDoqW41sjDv7awr66npLkmDw0cODQh +J7KZl565OSs87j8tOrKgqMlQ1Le6vr+4rKakqkwWCxIsTCoaLKWWmrk9UcG8Sy48v6emuH5u +vrnVW82ro6myxysTEh4uMyQmX6+su8q4tbvMWVjuvayuxfbMvcjdxLWtqamuyy8XEB00MR4c +RKeq7UG7qK/IZ+K4rq2+RlC4rsdF56ymr8R2RTUqHx4pMC4qLmS9x9vLtK++zsa3rbLLV1jf +yc9p4r+5t8FbODVKWUI3LzVNWj4uM+23u29Yx7Ozzz9qtbh2WF1NzLfJaElAx75AM/K1w1JD +SU9LT1FDRem7zUbnv/5H7VtGxMRLYMPpSeZZPcXBPdutwT9usb06Ms26Uzk7xbw/Pk9XVk/u +WtDKxVhPv2s7R/ba09LP67W/P1S5vV8+NL6xPzRLfMdJP1p2uMs3TMfoRDvg0OdPT8Wzzzjs +t97n2tbazdJcQ/69OkjyUtdJPsD9RXpN8kPe20rY3c3J/VTf1MO5Sk+0XEm/TUfcfd88aN1a +eHJETsBBP+5c69E+17fFaVjYxORs1tjNzHdPvkh52D9R0OpPQmDUXDpNwlZE/3PS2G7TY7xx +PPHPzPre2Ly/PcTXVt8+789LWEJN2klM73d90FVOwM/MQFq6X1pO0udbwOZfytbHZGDAXF74 +Tcw+Q09lZz/M+kTL89lpTr9vS9jPTkzN4XPK6WDPvehd491w+19jUm3VSGF1WnpKyeI/w8xB +ys9CVMnhR+3LSODHddJj9XvO60Lt5VDM+0DOaVPbW/3QRN3EaO1L+8tjXOTaWXvJ6091zFLf +a2tWP7u8QUG1X1jOSOph3M1XeGlRV/vMVT1sv3NJXM9o3MxU3Flhydxa39Hk//TdalfTW9zb +TWRpeWnVSFTha2lg7EzX8XXxR83gd8DcYd/J2tpTbMjRWWRpdfBDalVO2VJLZ+JmSt7OR1zc +V8vPa+/C69i+X0XUuF5Wannv5Fhf+ERrzUlg/Evv90rR/D7R1VbZXdzCUvLF6f3f7c/oRNTN +Vm5iUXnu3edGWOJtY2NmSdTVTMxqUMnUy89HXfPfwE1V2vvo2tBbTGvt1+9OUVlibF1s0llN +2sfsXGvY11x22nZVfs3abGPi7mPcde73TGnN5WlbTujvc9llXGR42tbvYl5e595kZWrt0NVs +Yul+3dR/dFZm7n14an5fc/D2bVlrWlvt7vLtbe/a8PHsbuxset9+f+b2annu2utp8e7b8mrn +7u7mfW1kUGt9XnJ9eW5dfedkZnDrcG3u5t3z/XV36/n62fVk4uv8dm7l39vd1/pz6XN1/Hdt +YldYUE5dXl1kZ299fu7hfOro/e3v5dra1MvMycjMzszZ28vV2vFfSjMsKysvOUrn0t/Lvrq2 +uL3Dy8nFy9Tt7tjSzMXFyMO+v/UzJyMhJCw5TvLZw7m2s7O6xcvO1tHU52RNX9fIvru7u769 +ub71MyMfHh4mNUrWvrewrq6vtMV7XlJPau1qWFV4y7qwrq+1ur7D2kYtIB0dHiY1Usa1sa2r +rKyvvfg+MjI5Q1j85NLEt6ypq663xc3WfkUtIB0dHiU3Zr+zrqurrKyvve4/LyorM0btwbez +sa6rq66zusPQ+UcxJR0dHiErQOq/ta+rqqussL9dOy8rKzBC3byxr66urq2usba8yf9EMCYe +HR4hKDJG3ruwqqeoq6+5zUo0KygqMkrHs62rq6ysrK6wucXnRzkuJx8dHR4kLkvFsqqmp6ms +r7fIVDgtKSw0SNG5sK2tra2tr7O7yelWQTYrIR0cHyUuRc66s66sq6usrrfNSjYvLzZCZtDE +vbiyrqytsLe/ydZtRjMnHhwdICk1TM+/ubKtqqmqrK+73kk4MC8xOkzqxbq0r66vs7m+xNBl +PzEoIh8hJiw2RP3LvbOtqaamp6y30kUzLS0wNz9Mdc2+t7Gvsbi/yM7fWkQ1KyYkJis0QV3Y +w7myraqpqq22ylU7MS4wNz5LcNTJvrm3uLq8wcjS6VVBNi4rKiwyOkNQ+8q9t7Gvr7K6xuZW +SERFSU9VWlxu3szDw8TFxcfHydd+UUE6NDEzNjo/RlJv59PKw727uru+xc7pXlJKSEVFSlnp +zsbCv7+/v8LGytNrRDgyLy80OT5FTFZx2ci9uLa2ub/O7llMRkE/QUlZ5cm/vby8vL2+wsTJ +4FI9NC8uLzQ5Oz0/Q1Dgxru1srS5v8znXlZTUFBOTld+1cjBvry6uru7v8rtSTcuLCwuMTU3 +Oj1Ha8u7s7Cvs7nAy99rXlNMRUBBTHHMv7u6ubi6vb/H3VY9MSwqKy40ODo8QlTZvbGura6w +uMTS9VtMQTw6OkFX07+4tra4uLvAwM5bPjErKSotMDU6PkZezbuxrausr7fAz3RMPzs5Nzc+ +Utu/t7S1tbW2u8LI5Ec0KiYnKi80NjpAW8u5r6upq660vM5pSTw0MDE2PlPVvraysLCxs7a6 +xPdGMygjIiUqLzM4QWjDsquop6eqr7vPVz40LiwtMj1b0L22r6urrbC2vMPUVDcqIx8gJCov +Nz9nwa+npKOlqrC93Uw5LiknKjFCfs7At66ppqersbrDz2k/LSEdHB8pMTpDY8OupaGhpKmx +wmlANCwmIiUtQ9S/ubOspqOlqrC7xNBgPy4iHBodJjI+R1XGrKKen6Oqs8tLNy4pJCAkM+K2 +sLa2raajqK+6w83Xb0YxIhsZHSk6REVbvqmfnZ+nsMNiQDcuJR8fK1S2rbC4tKulpau1x9rU +ztxJKx0YGyMyPTw++7KinJyhrsteTUEzJx4eJ0K2qaqwuLGppaq64l3dvrzcMx8YGB8xQjs1 +SLagm5qfrvA/QEY1Jh0dKuiqoqevubSrp6zAT0L9vbnVMB0WGCQ5TD86WrKfmZmivzkxOT0v +Ix4gNrOenaW2v7OpqbHfOzhZvrlcJRgWHS9PWkxYxaqcmJ2yPSstMzApISAtwp+anqu6u7Ct +sMZALzj5v9otGxUaKlbP1tK9qp2Ym61DKSUoKykhHyy+nZebpbO6ta6vyz0vNk72TSoZFBor +bcO/vLGkmpedtjgmISImJiIiM7acl5mgrrq1rbDQPjQ4PkY3HxUUHS5zurCuqp6XmKHELyAd +HyIhHyj7ppuYm6SvsKqpteM/Nzk+OiIVEhgjOcewramfmJidrUklHh8iHx4lQ66dmp2mr7Cr +qKy8Xj48PjklFxIVHjPJsKynnpmYnaxPKB8gISIiJDe2n5uep7K5raaptdZJQD80IBYTFh0y +w7Cqo52am56vOyQfHyAjKDDtq5+eoau3ua6qrbjWSj06KxwWFxkhPcKupp6bm52n2i4iHRwf +Ji93raCen6e1vLWvr7bGZEI5LB4aGhsgMnW4qJ+dnJ2mwzonHhwdISparKGdnaOts7KztrvT +S0E4KR4bGxwkOWG/q6OenJykvEMqHx0dHidNsqGbnKKqrrCwsL1bOTItJB0bGx0oP9Cxp6Kf +nZ6nuUsoHhwcHy3drqCcnJ+kqq6zutVFMywkHRscHSMyTcatpJ+enaKuyDskHRoaITu+pp2b +nZ+jp6qvxE8zKiQeGxsdIS1B2LaqpaGfoKew1DAfGhcbKFGxop2cm5ydn6a08ToqIRsXGBwf +K0Pfu6ukoJ+hqbLARyoeGBcdLs6qn52dnJqZm6O6QSkeGRUUFxslPs+wpqKgn5+nr71KLCAb +Gh4pSbemn52cm5qanafEMh4WERAUGCAwVLajnJubnqm0wk4wJRwaHShFuamloZ6cmZiaobc+ +IhYQDxAVHitIt6ScmJebpLPpOS0iHBsdJT66qKCenp2amJmer0IfFA8PERYdKD+4opqVlZqi +tk0vJR4bGh0nQrilnZybm5uam6K4MhsRDw8UGyEtWbCelpOUmqfIOikfHBsbHyxcr5+bmpqa +m5yhsD0eFA8PFBogLUa+pZqVlJifs1ovJB4cGx4nPrymnZqZmpueqL80HxgTExYaIzRzsaKc +mZmco7HtMyYgHh4iLES+qJ+cm5yfqL4/KB4aGRkcISxIvKifnJyfp6/CWjgqIh8hKj/Jr6ei +n5+hqsQ9KiEeHx8hJi5PuKihn6GnrrzXTjkvKykqMUTRs6mmpKevykkzKiYlIyQpL0fGr6ag +oKWsuNJOPjYwLi82RuK8rqmnqK7JPy0lISIkJy03ScqxqaSho6ivv2Q9MS0sLjVH1LmtqKem +qrpQMCUeHR4fJS5Bxqyjn56fpauyyU81KSUmKzlzv7CppqSlrck9Kh8dHR0eIys+u6aem5yf +pau2zE4zKSQmKzzjuKyopaSot1o0JR8fHh4fJC1QtqaenJ2hpau5z0YvKSgqNEfnu62oo6Wv +2DssJSMhHh4iKDzBrKShoaOkp66+ZjctLS84RV7Lt62npKzMPS0nJiYiHyEnNs2vqqakpqam +rLxvOi8vNDlCUt25q6alrMRCMy0oJiEeHyc37LevrKikoqOqvGxBOjk2MzQ/6reqpqeruWU9 +MyojHx0eJzNTv7SuqaOhpKq31U49ODIvMTxmwa+pqKmtvkw4LiciHx0gKjratq6ppaKjp6/B +bEM5MS4uNUzMt62qqqqx0kEzKyUhHh4kL0vDtK2noqGkq7jOXD41LSwvPfrAs6ypqay5WTov +KSQfHR8qNmDBtqujn6Gnr7zLZj0wLCwzRt6/sqqoqa7HSToxKSIfHiYvPF/JuKqjo6issrrJ +VjozMDI5SPHBsayrrrXIVj8yKSMhJCsyOljIt6ynqKuss7vHVj47ODc8SujEt7GxtrrIVj82 +LSknJyw2PFHVwLStrrCwtbzD4lFNSERHTvzIvb27vsHFb0E9NzAvLi43PUNh28q7t7u4uL2+ +xNrua05PXmDcz9XGxL/HzWxTUEU8Nzc0PD09Q0xk0srOxL29u73HzdHjf1JVZGz36tvIw8vL +18/k309GPTw5Ojo4P0pUXufSwLy+wMbExtd/U1dZXVrkdsPDvri/v8jR9WVGPDczNDQ1OT9L +YunPwby8w8zI6thPWlhZaejRxb+9u7y5w7/tYUdIOjg1NTo7PT9LVerV1dnLz8rL+Odn2u/V +18+9w7zKv8rD1tvtXllESEBDQ0FAQ0NERklLVWZjb+nPy8rJysDGv8bCysve29543/Ltaext +22FmV1NKQz06PTw+RElPZOLbzsK8u7u/wcjc6+1y7Ofl5Nnn1NXa9edm+FZHQD9APz88QEhc +Xmfq3MjIz8/Nzc/O4dXTy9TQ2dPO09r2aFlfSlVNV2ZvXFpgZfxdTk1TUlJPTlB5393Xysa/ +xc7SzNn5WmBeZVhZXVzf38/gy97J73FJUktMQ0FDSl5e/G7RzMbR39XW1O1sa2V47/5y2czG +1M/i2fbzWlpmbmRMSVBaYVZWT3z8dlxeaufv/Gty293b9tjWztbo6eXX3+9me/dp5v3l2c/n +cVJtW1tIRkhTWldYXObX2N7n1s7T7GZ9fG9mVHrs2t/k4dnP2M7Xy87NZ1tRV0xHPT5JWGBW +XO3Uz9d3bG/X6O5Z5+3nX+jmzc3Tx9jEysDKycnJ9EdAPkM4NzM8Sl9OXHTSw8bUeG/i3d9j +ftrP237U2rrHv86+v8DKyMXUVj83OTYwLS01RGvr28/CvL3I3FZfV2BWY/zb183Jxb26uLy4 +urq+vsr7PS8sKyooKS05WNPGvbi1s7zT7ks/P0RO7tfMv728ubu6tbm/vb2/w9dHMSoqKyom +KC9I0r+6t7CwtMTvSz44OjxO6c7Dvbu4tLe1tri5t7q7xV40JyQmKCcmLUHLuLKzsrG0vGNH +OjkvLjh9wry+vLKvsbm8vLa4uby+zkwuIyImKCcpMFS9srG0trW2xlE8ODc1OT/evbi6urmz +srm/wLy5t7u+zU0vJSMlKCcqL0zDtbG2uLe3v/VEOTk6PUVezL26uri3tLe9w8G+vr7DyvFB +LScnKSwsLjhev7e1u726usFtQzs+QEJFVNjAu7u6urq8ws7Sz87R1c3X9UM0MC8yMjM3QvvK +w8nIwLu7yHBLSUpLS01f383Gx8TFytPd1c7P2tPLxb/G3Eg8PT49Nzc6QU1acOXYzcnHzNvu +dGVdX2NoX2v6+vzt3tPLxL/Aw7+8u73D205ERUU8NC4vMzxKWmnlyr+9xNDs6u9rUkpKUFdg +d+HOyMK/vLu5vLu4trrKbUI4NTMvLCwwO0ho0cvFwL/Byt9bTElJTE1KSlvPw8HCv7y6u7y8 +vr23uMDfRzQsLC0uLzM6UM68ur3FzM3O3k89OT9OY3ZgYN7Lwr/CwL28u7u6vMC9usJnOisl +JiswNjxM1LqvsLzPdlxVSDw1OE3PwcTN39vIw8bO1cm+uru9vbq2t8VHLCEfJC05QlfQt62t +ts5XTEtIPTY4Scy3t8bmbuXU2d/r28S6ury9vbi2vG4xJB8iKz9Y+Ni/s6+zw2lJSUdFPjtE +5r61u+9GQ0965unhz8C6ury6trO1vlUvJB8lM1nb09LGuLO4ylhBP0A+OTlF27u1v2A/P1DZ +ycfNz8S7tba4tre5wlQzKCAjLlnPy+Tlwrm2xlo6Nz1HRkVcyrexvGM+OkrYys7b3c29tbO2 +ubvAy3o+LychJz7XydR4z7m0vO06MDhJVlli2b20t9BANjxmx8PM29O/tbC0vMLGx9JROi4l +Ii1Wy8Xdbc+8uslOMzI+ZOXg7dO9uL9eOzhI18XK3+rNvLS0ur7Aw8XOVTosISU8zb7KUE7V +vr3QQDM6TufyZ2fLurrQRDY7XsrAyNjRw7mztbq+wsPF4kYwIx8rXMPEW0FSyb2/Zzg1RP/j +4fbavbS8eDw1RNfDw9L/1ryysbS5vr6/0kwwIR0oYLq6XDxKyri7cTQvPF1yZlfpu6+21jwy +PVHOvcre07+xq6yyur/Izlw0IRwjUbS28zU5eru51zUtOGvb8V1tv7Gyzj0wOtu4uMtcbryt +qq23vsTH3z8sHRon4bKzWTVJyLS2WS8vRdXVbE//tay0/y0qPcu3vHxQ1LOqq7C4vr/A3UAq +Gxsuw666QDROwbO9Qy0yT9nnVEnbsauyTikrWLavwFFUxrGtsru/v7/F3EAkGR08tK3JODrZ +s7DLNy074M9hPj/IrKrFNikx1rS4005fva+usbm8vL3JeTQdGCBWrrDiOkrCsbhVLzFQ1elG +Ply1qq3lLykv6La2xG3/vK+trrO5vsvk8zweFx5NrrFdMkO8rbRNLC9dyO09O/GxqrlGLzBS +w77BzdbIv7eurK++yttoWysZGizBrMQ+QMiurtsyLEPQ9T84S7ers+A8NztP28a4t8bQybOq +q7jO3OneSyMXGzazr2c6YbGqu0AvO9LPQzQ8y66wxU4/Pzw+Xr2utOVOy6ulrMpvyL3cOh8X +H025xkRAvaiueTc3Td5MNDt6vLbH29vnRDQ71K+uzU/hsqmuwMvAub5NLyQdIjnsbk/quKy2 +Zz0/SFRGPEnQyMvGwMJ6Ni9HwbbC79m4rbC8v7q2u8xMOjMkHiY+1XBlx66tzDo5SH1hQD9Y +z8HFw8hhQTtF18fe+M63rq+5vrazvvNKQkEwIiAsTfxM1bGruUw4SfNWOzlMzb7Iysn0S0xi +5uxRTM24t7q7ubCwv+ZfV1VFMyklKjxWT8izscFbR27xPjM5Y7671XJu3MzNak5PS1rNvrm1 +s7OussdaSufjRjInIiw9PkTHtrO/dfnUSC4xT8a+1lnhxcLO3GdNSUdazby2r66trbvpXfnW ++DwvJyMqNjU4zbKvuMnY2D8sNfLOaWTcw7W+2s/oSkdGS868ubGsrbTG3dbOc0xUOCghJS4u +LlyurLe/vslHLTJPTzdptbe7vb283DxG5Vtov7Svsri3tcpSUHxdac85JCkpIik3cbSzxLSz +bDs3NFXLP0yvseDJvcDNQT3KxFPetK+1uru4ykRKVzZxrNFZvC0WKjseKOa9rb43vaw9LtO+ +wchOy7JaP7m2UlTQw7/W4re06G2+v9PTybu+SD3DzjEYG9o3Gy+stts/3qp7K86saUDAscJU +W7ixTEC5tevvvbjBY8mww1HJt+Q4N1r9OzdBIiBaNCM9vtrMTFeuzTfPrsHSxL29+0/BsM7+ +u7jT89HBvuLfv8XdbkxHVDgzTl1DKidBPicvy8rrTc2zyUbXuszdzrzLUnu7utTKtrnqatPH +yNfCvNH/11VDTT85SlpbPC0wNDEvPVzLXX7By2tTzMfE2sW/x+ryv7/EvbjAyNHUw8va09pp +12I/UutRRmhbMy0vKis7QUVbcc7MeNC/ydbGvcTe7cnDw8W9ucPXxsbY1tbQyuBd09xJPnXi +RkNFOi4qLTI4QUlpxs1iz8nQzsa9u8PPysXN18rBxMjKzMfS/dTE5Utt50xP9Xb1+Us4Lysu +Liw749xwys/N0vfXusbZvr7J2tLKwdjjw7/P3cfD0W7qyuBMWNt9VWdrXj8sKzAsKzdP+uzf +xMjU2srExMu/usnWy8bQ3NfN09jIy8/Oz874V+XuSVzuceTbTzYsLCwrLzznzXbSusxmz7/A +xs7JvdZezr7L2tbOzubny8PK1d7My1hY0NROTNjwMSMsOiwpOc+/Yku/teJSzLi96ti4u/71 +vrzaZdjEz1p6wMHW28/ObUZQ5HZc0/QvJy8vKio37b/8Xriz3lbJuLrGzLy78lvMvtV05MjG +9lzLv8zl1L/UREjg3G/pOSIuPSMhOGXLyli5q8pMyrzEz+PEuc5bxbjLdPbQyuJX38PF0NPI +xORj2+xb+zkeKUAlIDlsyLj5v6e9PtzI7c7v/7a3b8e2y9zXX+nKYFnRz8/Gy8rH+XLc+Ghe +Jh02NB4lQ9O0vOSspMU/8cjO2VHlsrphz8HP1W5M08hTVdjMxsrh0czvaXTvz1UlITYxJSo6 +6bS2ybKqt+VXWc3IUVLGv83fbNTB6U3jydXq5tjK1GBc/Pxda9LFxOA5LC81Li0xP9a8yti+ +trvCydTGv99cdGty4lRI7M/Uz9fayMx7XltgdFxX787R8mb7dEY7Pk5cTkdDS2Dx/HDcyMPE +yc/U3PP1ZlVVXfDe39XJzNxzX23o4ejc1eFqYlpPVGN79H1jY21dTUhFS2vi9Hfy69/f4+Xv +9G5t6N/o7H/y3N/6/dvNys/S1eF1XlVUXWNk7+De4XJeZnVubWBbV09LTFFPTFRr+Ozr3s/N +2urp+vbf3d7c19PX63J8e2tt8Obg39ze3tva2uLwdmtoWk5KTUxKS0tOVVZWZevp69/u8+bk +4NfU1tXW2Nrj8evg4+/w6NnX3+7s4OHq9nd4alxbXlxYVlFSWlVQUVNVUVVo6+n58+zq5OHc +19XS1dfY2tjU1t7j5OLk6u18YF1iZGlkX2Bmam50YlpecXNiXl5fXVhUV2JsZ2dw8eXh39rb +3dXZ3trV1dfV2Nbb7Pt5aG7x8XFjbX1kX1tXWmBubWJeXF1dWVlZWl5n//Lw7evf3+Dh6enf +2NbV2Nvc3uDi5uzv/25ycl9gYF5eX2JobWtxff19bmJdZW5oZHZ+fvb9/f/9+v717evn6Pfx +7+vn4t/e5eri5/BtanBoX2VoYmZscn306ejg6u/sfGllZWdmZF9mcHl79ezv6+/7a234+378 +/v3y9XJ0fHr67PJ9+PDw8u7o5uvq4url5Ont/nh2fnhra19bXV5cWmJgXWhvcXv0+//78+nl +5Ofl3t/g4+zv6unu/ndueff07e71dm1ua2xscnx0dGtrY19ta2x0e/f3/XVvb3Tv7Ovu8e/u +6e/q4N3f7/v7fPF1aG/7fW5tZmd+8HttbXl+8X1taG1sV1d65P9n7tzW6Wnk1uD2cXZsc2Bc +bmz65uLu69zq7+vm8+zsd/zvdnPxdmv783Jtb2pjYlxQTFBWUE9TXH7o597QzMvLzc3P2N3e +3dPP1dnPycnN093zVTsvLi4uLjA6V8u/ubGtrrG6yd5YQDYzNz5HTvzIvbi4uru8ws/f6t/i +9+jOz2tRRDIsLS0sLzdIzb26sayutL3WXEo7NDY5Qlj21MG4tba6vL3B0Obe3eLd0M3Q5VdB +MisqKystN0zPvLexra20wutYSD43NjtFW/TVwrq3ub2/v8TM1Nba2NTS0dPdZEYzKyosLS0y +RNG8uLOvrrG81mJVQzg1OUFPXHXUv7m5u76+v8bQ09bZ1trW0dbuVT8xLCwtLS43TtXCu7aw +r7W/0ehdSDw5PEJITl/bxLu5urq6ur/L1eZyam5w9e71Z08/ODc4NzU4Pk5t5dPMxcLBwsXI +0eRlUkxKR0pX/drMycbDwcLHys/P0Nfg3t3o+2ddTUM+PT49PT5ARlBhe9zPycTFytDa6m9a +UE1TXWrk1NDMycnJx8jJyMvMztbe4XtbVVFLRkRFREE/Q0ZLT1JcYvnb1tXa3eDb3/P37uDg +3Nre3NjPzcvIxcbKzdHW3Oj5YVpUT0xHRUJBPj5AR0tPXW7i0M7P09TPz9bj9vh0bG5scuvY +09LRzsnIy9HU1trb3+Di7m5aTUVDQD09PkFFS1Ff7tnT0M/OztHZ8V5ZXmZpYmvn2M/Kx8jF +wsPGy8vMz9fe63ZhVUxCPjw6OTk9Q0ZMWPfWzMnLzM7Y3eV8ZmNtamJdf9jOysjFwcDCxcvR +09HU2uhpVU5MSUQ/PDs6PD9DS1d039LMzM3O0NPc9WpmbmddZO/XzsvIyMbAvsHIzNHY5fNz +bm9eTUZGQz88PDw/RkpNU2nq2tLOzdDR0t71cW5ka+/j3trPyMXEw8LGys7S1t/6cGtfXWBd +TUVIS0Q+PkFGSk5QVV332tnb1dLV2eh8a2z/6NzX1NLNyMbFxMfJyc3Z4fRvb2hcWF5maVZH +SFBNQT4/Q0hJSUpRZe7j39PNzM3Q2dzX19XRz83Mzc7P0c7P1dnb4+5xYV5cW1pbXWRpWUxM +V1lOSUdJSktLS05c+OTd1s/MzMzMztDOz9PT1dTV2/BtzMjwfNHZ6/xiZ2RWTlFYWVRQUE9a +XVdTU1lbXl5cX3b78uTa1tzf3djS0trf3Nnb5uHb49/e7O/q7/P4dXJo/fZpbGxhXVtWVltd +ZGBZWmNqXfvR5n7s3ezx+HpsZPfu5+bl9d7b6dzl4OPq6eT+XHTwaWBv7u58d29sc3VubXVq +ZF5fffD15/L/8+x+fnZofP7t/ffvemh05O31+Gv67m/u5ntrbnf18Ozc+Wt+anzx+ObqZnrX +XV/laX5yZV1vYXXhZ+7y2dDb9N3eamplb1Ra9n90fuzg091mZmlWTlHfaExpytPs9ODc6Gxa +7W9hZWb82+3+3d7Z39/u3+r4X1hiemxhY2rr42lq1ttq4uR5cmhqbGFfYmZdcelqZG717HZp +aevu8vPk3+763tLf3nV33vJ3d+v16nx0X2Z+aWhpeG9ZYO33a2r3b/5jcOX87H3o5u3gffju +/+r2aGd5dnH533ns+2Dsb2vq3Xhq7PT96n1y4eftdWv8d3xacGn5bmLqcut89u11+3x3YWDr ++2vx497z7+Xj7nXx5eT6bffmbF5nd2Fhbu77amj03vvr+3rp5vJmb/Do7P305n52X2Z6Y2p7 +7nbw/Gf47+5safr08/945uT48+jk8+7i/PpxeGlp/V7+e2V7dmRh6u548t3ueHpvdOjpb93d +cG917+7ra2D23/lmZuvodV5deHZcX2nvfXB17u7u3t/t3tv15t/o5G9vZPNtXlpq7W/7+25s +5d5j6+DvZmR88OF8bm/xf3RiaXdtf/byc2rz9HD5433w8mp45Ovw633q6Xbt9Phzbf7g9vDj +b2v263tub+1uY2JmZmbg6XVteWVp82xtdvry9Xpk8t/jeuzs7uf46998aeTj92lf4tZtbfHk +929gdvhva2ltYXplZPj2+Wp9a2xg+996/Hrl4O57697m6O7o+2zs3N5yaON6a2L763xybXlq +bF1lXGNt6f9cXl50fm1nau/Z3ezn09zb3ejo9OTc5u995fV0d2JnYGVlX2h0ZGXxZnbodP73 +alpqd3V5dujteG/g6ezx79vm+n7u+ndwaPb+e+jy+3Vq/3ltbHZrcOby9/N4cn3e6fDl3fFv +dG18YmBm+WBfaXt99/Fw++Do7+v1/W966Ozo7XP54vv8+/Z27PZ7/WjtaV9q5Hxu5+re9Wxo +cvlxbH15bWRvbvPsafjm4vh2afvxd3Tn3uja9f336+1s/vLrZ21kXGNubXfyfW985e723ul0 +Z/7/++Hh6e3o8WFgdXn2/WVffnBk3fX8fuP+dvF77X5mb3Noc/72b/ru5+j4eH507PLocH70 ++et26+7k82n49v1fZPpzaV9fa3R+8Hh4fWfr5u923d7u+1/ZXmjU6ORueGH4SFbL7W3m3evd +fWnt6G1x6lBQ6934atzczdhq9W5fY3tOTlvl22585Obf1Wfo6Vt4cldPb/Py2fJg2dT9ZO/+ +5eNdZubwYfT6U2vsZ+HP6d3N2nxsZldpY1BWa2xy8mdm7ntiXWhvX2Jf5M/W1svJxMrWzMfE +zszKzd88Kio3OTQzMTzcubW1trm5tbzyRjk4P0hQYtrKv73Av73AxMHGzsnIzF8zJyo2Ny8t +MDvft7C1uLe3tbrXPzIzPUdJWd7Jv729wsLCxcjJycjHx8dXLikzPzguLC481raws7y8tbO8 +9DwxM0FUU1Fmz728vcHP1c3HxMjKxb/C6jcqLjw/MSosNlTEsrG5vrevschHNjU9SVNVUWPO +vbe8zM/GwMHL19THv8tNMCswPzwtKC0/4L+2srS5tK603UA6PkI+PERa38i9uLvEw76+x9HP +yMPJ3z4rKDM+NSooMlDMua+tsbeyrbTfOi8zNzlAU1plyrWvtsbMvrq/zdDJyNNVNSorNDov +KSs5872xrKyvtLGvvE0vKy0xOUhi/dO5ra24xsa8uLzFyc7nTDQrKy8xLCgrOW+9rqqprK+x +tMo9KygoLDhczMfDs6mps8TEvLzDxsLMXToqJCcuMComLFO6railpquwtsRGKR8fJzh7x763 +r6mnrLvX18G7vsnU4E0uIyIoLCkmLE25qqOfoamzvt06Jh0dJTjNtLCwq6ensMlsYt3LxcLG +x9g6Ix0gKisnKUO0pJ+eoKq83E0zJR0dKV6xrKyrqKeuwmhMSVbVxL67trZPIBgcKy8lI0Oq +nZucoK7dSj0pHBkhQrqtqaWjpq/GZFBNQz5Rv6yqrbZGHBMaLi4dH8KZlpyforZGMyocFh09 +urStop2grs5MR1ZPODThqqOprrM9Fg4aNCkaJ6SSlp2fqe0wKx8XGjPHy7yhmqCwvcxNQ04+ +LTmyoKSqp6w6FQ4WJScgMqaTkpqlu0ovJBsZJEfQwq2fnaWwyk0/SEIvLE6upKSho7M5HBIS +GB8rT6mYlJeiu0ApIB4fLFPY1bOgnqrEy8dyPDIvMkq8qaGeoa/ZLhcOER4tQLeclZeesjwl +IiMjJz+/vb+toaW61sfJUTMqLD/ErqWenabDPh8QDRcoR76jmJidrUkpJScoKDjHs73PtaWp +w+LByD0pKTjasKafnZ+2RiwYDQ4eVLisnpibp+opISUqKzPOrazB8r6urrzPz+k7Kys/t6Wf +np+r/zYjEgwSMLarqJ6an7kwICItMzRPs6m1SEO3qbbZzspJLCcxyaifnp6kyTksGg8OHb2f +o6ehn6w9Ih8qP1FevauvTzFEvK+xu85TOS0rSK2fnZ+ltvo+Hg4LGM+mp6ihnqhLIh8rQ0pN +vqmtTykvu6auv8DIRisnP6yenp+ltPE7IREMFEmmpKmmoKlPIx8tUXBiwqqo1yciRKefrtPY +azEkLrScm5+osr9AIxMKDz2lpKqnoqflIx0t+9tvyKynzyclbqWjsct3SC4lM7CdnJ+mtvM7 +JRILEkemo6eopqn0Ix8x+9vlv6uo5h8f9qSistDpTC0jN6mbnZ+mt3g5IxAKFcWlpqeopqpP +Hx8732Vfya2pSxwmq5+qsMRWPysl+p6cn5+oy0gvGg0NHL2jpaqop7U5IiZC1m9hv6yxNB0v +pZ6su9lHNCgttZydoJ+p00UkEQwPJ66jpqejp84tJC5T90/+sqtdHyuvpairvWI3JCXcop6e +nqW76TIXDQwY7KuopaChsz4qLUJTQkvFscssMbisq6WtyD4kIkSvpp+bnqzUQywPBw8uvbOr +o52fyysuRlA8NU67aTFcu7CnpamxViUiM8+soJycosxM4B0HCB3JvMCtnJenNyxI4D4sMDFe +s1k+rpudqsJiPigfNaueoamqpanvGwgFE86r2cucj503KVXEPyQcLKSnODunmJ+/z7HGJBss +sqWxr6Ohp+UoGgsMJUM90aGZn8BZzMFIHx7GrU883qujrK6gn8gnICs6VMOxo5ujUjctEw8a +ITHVs6ekruPWvUUy38f7fmBZybWvo52js1MnHytC/bamqbzHxz0fFRkuJiHerLbTzrmtrMHm +v80+QU9Ox62qpZ+m5i0qKStCv7zOt6vNLSQtQTYhJca8OTl0tqu+z7Gt1TpK22pFbbGorbO1 +yDwsL0J+WV6xtUEzPWpSLy9g/D9LRVLEzMe6wsfKfU9SRE7MzMKxrbfFWTY1Rlrc0dreTllG +N0FNbsDndsnWRDbpyHXOvMbkXkNAPz5iyLa+w7r1PDxNcca79Li+Pj5OOjfNa3qz2EvFSTzD +vtLRzddCSEI/YdfH1MC5QjBKRi5dus3ZtsRAeX8yQsrJXsXByrpIdbvnvb0+wUREPjRw5b5d +1rZNOHJBOFxQxNvEYcx3Nbs+TsrKTkurZ0m1cdl4vVPCRE/ONDm7OdW1Sty8SjLcQkXNa8DK +3U7Uy0HN80S8yDrHeMlfT8PE3WDHRUc4UTnZyD212utlUjPESDux+sS/S0yvUV/gW8FaT75D +a9s/wcPVR+bJMzpoQljlUte42EjYa1DdScvK1f3nw+9e+M9x9tVOX0DDL8fBQMLPyy+8OEpW +fEjHy3a9TcFbX2DF6lXFU+Vn00fXxV1tbMxC6D9OzkntwHzn1kD45VQ8v1lwxUrYzMY7wepN +4VTXUMlOyFfJWdVc73NCwi61RerWwkvpujlNwDhNvVBezM5XwV1gzUjPRtljXthOzF3aacVh +Zt3xQlTLTcRDv2pc3k5lV9tJyk3c02DQ6dFFxEbAQuHPVr9FyEnK6nVfSMpUWF3YScRKXdze +V0/MRsVO1WPJX+nUTMhgSsdf6tZd5NT/Rr9aUupnS71AUMXfXXH4195NWclB29pAzcxTdcll +UtFI4/5a0U/ETclOy+dA4M5V2l9ezF5rZMRhd3p5Ze9SzlDRZM5I5ODtRNvJOs/fXUnV3199 +7/PNTcNYd8lTzNz+W8ZWT+fwPsTVNr16SVq2OFvBQN9QdmDa4F1s29rhR8/RUcFOabpWSOrC +WlXtftLjPMNLvT5i0WLwSebs1kTa1lpZx0bP4D7MdcdAUsN+60nOyU7OR9zFSdVNwW1JuURc +4VtkSL03wXVEykXDTs5t2ljc6FLQ1k/L2kzFVH73WfHf+kLM1kpV+sY7zFZayVNV/79Ecm/a +y0zt0r9cT9HT60Te1FjUPfG3PmdbwetG5N29QevkdL9Hb9DuR1DnRW48PshGQWZ41lXjz8rG +Y8vMxNXfvMHNy7zSy8PzwLx2KSpyMh8oSeNFNMqowTjsrso6TLa4R022ruJZs6/G2MS3w2C8 +stcoJuQtGSBYXC85vKTEPsC5zjlAuMNEfrW83cm5tcHKsrPFy7q0xz4mLzkeHTVONTrSr7Zq +x7HkMUi9SDPYt9pXybO64Lmqsb+yrsLMvMAzITQ3HR9BSy48xrfHZb62Vzlg0z4628Xg8rex +wbevsLe4srnHxLzNNi86LiAlODErOuju1cG9yOHuak9CTllM0rq/uLKztLa1s7a+wcPCw009 +QzAoKSwqLC41SvjNvL/Ew8hjX1I6UuHtvrK4uLS7uLvGu7jGzc3L0UlAPy8nLC0oLDI+Y8/I +vL3Gvb/0XGFKWNrbv7vAvrjAwr7FxsLK0M/U3fVWQDMtLCwrLjA6W9TFvLq8vLm+3mNRRk1Z +YNfM08W+ys/FwcPHysPL6tjN6kM5ODEuLjQ3Ok3ZxMHCvbzDys9jR0VLWFtr2cvKzMjKzcnH +xMXLzM/U2OZVQDs2NDY3OUBV7M3Mxr/IzNHdalRQU1FPX+ze2c7L1NfOysXEwcDH0NHR6VtG +QUM7PD9ARkxVbOj77tfY4eLyWE1KS01VcNzRzc7KxMXEwL+/w8bHy8TAzm5LPjk0MjI2PUpZ +deDc0MzP3HlXTk1PT1r+4NPKycrKycLBwLy8vcDExMXQWkE6NTIyMTI6Q1Ju+9/VzMvO0+xe +T09PU1z/2cvEwsTDv7+9u7q7vsnN0tp8STw3My8vLzE3RE9m3dPNy83Oz9t3YGBdYfbe0s3I +xsjIxr+9vLy+wsrS5fVrTz43NjMwMjY5P09139bOycbJysnWdWBeVVBb+N7QzMrJycW/v8LE +xszW6Pzu9VZBPDs3NDU6PUpr5tnOycfGyM3XfFNMST9G3NP36Ma/x9PHvL3Jz8jC0X3bydlL +Qko+NDI2PT9AUtLN1s7Jz97uX0xHR0xa+d/Vdv+5tczqu7S/4s28vtx9xrnmNzpJOSstN0BA +PVHCvtjayc3vX01IR0ZKYdrQy8bAwcTGx8TDw8PAvr/DycTDVjQzOy0mKzc/R070u7fHzL/S +WE9HPD5PVmbNxMO/xMjAwc/IvL29ury9v8jG2TcrLjEnJS47TWn7yLG1zNnQZ09MPjlJ6uzd +xb68vszXycnSx76+u7e4uLu+xEorJiopISY0VtPFxLivuNliT0JDRDk4Xb+/wr25ub/rUPzQ +zsi9uLKvtL3Bv8k3Hx8pKCMqO924s7u5tLziTTw3Q1Y+Ona9uLe7x8fD21pj3ci6tLWyr7O5 +vcdfLx8dJCUkLD/huK2tsbjD7k8+MjM8QEfXu7i2tLzO3nVZbNjJvbWxsK+zvMrT6z0nHyAi +Ji48R2TEsqyts8PpUUY/PDs6QWzIurW3vsvOy8XEx8vHvr7G1WpUVl1fW04/Ozo8PTw7Ojo/ +TVz+3NrPyMTGysfIztvlc1xWUE9g3szDvru6u7/N2dbZ3d/Z0s/lUUI7ODY1NDEyOD5GVPnZ +0snCwMLDxcvQ1+V7feLZ1NHOx8PGztfWzs3MzM7Z4eRxTkE9Ozk3OTo7Oz5KWvHb1tLOy83U +1tbjfXjj08vJysvKyszO0tTRzsvN19rfbV9iXlVLRUJHSUNAPz5ASVNXXGd0ePTd19DPzcnI +ysvNztXa2tfX1dLT1tfS1uZpX11TUllebXJmYV9dWVZSS0dEQUNIU2Ft797TzszKzdfg4NzX +z8/PztLUz9HfbmRcVldcYGN/5t7U0tjg8m5dVUxEQUFBREtVYXf77+Tf29fU1NXY2djW0c/W +3ef5+vn/+3169+be397b5PL48n52X1RTV1ldYFZQT09SVFhaWmFvfPHm3drd3d/g3uTr4drX +09LW2dre6urk5uLi8Hj37O7q6vN7bWRlXFJOSkhFSEtMTVVfaPfk3t3e4d/e29fT0dTY2dPV +2tzi7PHt5+nu6uDf5Ojl5uXn8W1dVE5JRUVERkpNU1llbG/z4Nvb297e2M/S1NTV19nY1dna +3Obr6uvu/WtpcPrs5+9zZ11aWFVQS0hFREdOWVpfafzi2NHP0dPRz9PW1tXZ3t7k5eLl6vDq +4N7j5ubq5ur9bWhgWlZPTUtLS0lJSk9VW2Rt9+vh2tjW1djX087NztTa3eXo5d/f3d3l7vLu +8vx5fnJqaXJoYV1ZVE5MSkZER0hKX3lu6ODa0sjIzc/P1eZXW93T3OfOysHGzMrCvr28vLzK +OR4aHSUtPvrUuqWeoKrBOiotMS0rLkyyoqGtyl5ZdeJ7VG+/sK2vt769tbk1Fw8SHC/Gs7Kp +nJqgtzMeHCo9SXfKvaujq8dIOz/n0VA/S9O5rKurqam3+FY0HBMVGyNNraeknp6qv0EkHCAw +Tb6rq66vs89HPzg4S+9747yxrKenrLfOPjQ4KhkTGilarKSprKanuE8qHh86wrizr6+1vHI1 +MUTm2OhPQ2O4q6ioqKy4VTA2QCgWFB4yv6elrq6lrc4vHxsnv6moqq+72lQ3LTRNzMjbVk/C +raamqa278jc3bUMgFxklPrWutrSoprVmKB0iTbGura+6vNIzKjtr18HKQj7cuq6npqyvukgs +N+w0HBkfLXetrrmwqa7GPyQeLMStra+50tTnPDFPxsPG8zo487etp6esttA8LkTNNRwZIjBY +tba9sqitzDwlHy/FsK6ts8TCxzwsO97RzuQ9Os2vqqSkrbvSOytBxDweGh8pQbu1uK+orcJB +JB0p466npq7EzNRMNzo+QF76VVTEraWfpLLcQjEtUNEzHx0oMVK9v76zqa7OOCIfL8etqqmw +t7jWOCwwOETg3/vSuaukoKm9XzkuNsvGMR4dJS1Yv766rqmwzjMfIDa7qKWrvMveRDg2Nz3u +wtPd1cewo6CsvV00MVe/SygdHSY428q8r6ursv4qHyQ3w6mlqrTAfT41NDhC7cfKzcq7rKKj +rcRGMjNtyDwlHR8mPM/Ku6+qrLRaJx8mPb2opay0wVM8PTgyPf7WysDGuqmhpa3GPjA46HYy +IBwgLGq7tbKwrbC/QSUfJUC2pKGqtc1OOjMyLzvgvba7wb2upaeuzTsuOt1fNSEdIC1yvbOy +s6ysuEgmHiE6uqWhp7biTkA5MSwzXrmts7m8sampsNw6LzzacTQgHB4q+7etrK2trbhCJh0e +LsSknqGsyVBDNy0oLUe5qauvt7Wtq67LOy02WU0vIR0cKuexqaesr668PycdHSvGpZ2erNHo +YzgtKCg4u6upqbC3sK642UMwMjg1KyQgITDfsaalqa631jwqISEsbqyfnaW0zUozKScpNset +pqWprrG1wWs5LSsrKyorKSs90rOopqyzwFE3LCYmL+qwop6lsclFLiopKz7HsKahpKmuueBL +OisjISElLTlK2bywqaitu182KyorL0TPsqeipK3FQC0pKjRQw66noqKlq7piOSsfHBweJjfx +v7aurKusstU9LScoLjpXwa6ln6Gt0DgpKC082LWrpqGhpq7IPikcGBkdJTfUu6+oqaqst/48 +LygoLDJGzbSnn6CpuU8vKiouRMexp6Gho6m44jMbExQZID6/tqukpKSltU0yKSMmLC857rKl +np6ovGA6MTIyN2O4qaKhpq2xvT0cEREVHkS8taujoqChsUovKSMlLCsufK6lnp6qvMlaOjg1 +MUm4q6emqrCytVsdEBQYHUO+2Lain6CgrEkwNCskKScoTq2jpaasu72/TjIxOVa6rK22tbCy +tLwyFxEZIjLfxMm0pJ6jr848MDk3KiQpRL+tqKu1trO67T04PGG8srm/wb28vsT4OyUbHSkw +OUjevLWsqLHNe2pMOTxURj9rxry2sbTH9vt2a3HtysLGxMTcTktbV01n3kApKTtKPDQ9YuHN +vLjKUHa2sc1OWtPIwr3JTjs/7sreaNy6r7jKz1M6PkxMRUhoztROPUJGPDU2P1dv9N7QyMnJ +w726u7+/xmQ/O0Fs5lrav7zAv8VnSlVXTkxKSU9aaf1fTktKSk9VVVrz0cva9NfGw8fWflpS +TUdGR0/uxr7Bx8nM1dnedmZnZ+7c/FpUVVJLREhOVnHe297h59vMxsneXVRRUFJMRUdT2r++ +x9DY2+Pr8WZYY+nb1tXqWUxJS0ZCSFvXyMnZ9evXzM3Y8mhmXFFVVVFae9vOz9DY5vh8em5t +/u3z6eDi5V9RSz8+Uupy/tbOz87N0+z/3df5W15gX2fj+GXq9Hjc1fNbZv3r7V5benlpb87Z +SUF921Jd537g2uDg3e956WJv8nxg8tzg7OzxcXFu4NhpS9nBVUjKyU1fzlpIblhFYnlZ7dTv +7d7x79bT8+vm7vTsZm1dStbDZFnKzFFs215XYlFN1dVXX+RhYudfVXZoUd/UYeTS9v3S2/Te +8HR52uly3N1e3PVYduJadu1Xc+ViXOliXvVwaGJlXG1pU2Pp3V3n0fLg3N774/n32vnb1fD4 +4G9fcd/0ZXNsYWjd6OjtZv5oVlJeXmRsZXHodG7v7uvo5fHudWBi53Lq3uXc1vVy5Ontbvj5 ++2Pv83F48PBfYWBgXVtxZF7k62vk1vff2/z83n5r8uJpaOj1ZV/tcPpyaXFme3f63dp8e+L8 +/WZSWW1hfPPp7uPv2+t6fu5qeN1rZndnY+t27enwfvf3a15jb2r42Nnj3tXbdHBrWmL4YFp0 +8/T64eNxdntmX2tjamBs+vP65eDg5On6aGv1+Wxx9Ozn5+Xn/X5tYV1eZ2Vmanvq7t/f5+zn ++nrq6/r8/W13+Pr77+92/nFlZF1eYmz24+Hf6HhsY1xcY2hw+ubm5ODp93d88etyYfvg4OT2 +3+D4a3JtZGp1/G5raHnt4uDi6XpfWF9dWGL95O583Nxz+PpqbmtmcnJv6+3v4tra6nnr7mtm +9XJlbft8/OLz8uh1amxpZWlqZ/707+vr7v55a3J2cmxr7+/n3N/o8nZtd3/ud3BzaWNxdnX2 +fXz8+HNtfnD45e7z7ff0eGR88evq7O/7e/tvaHpuaW1z//7wf33w7ers6+x7bv/1c21sb291 +/3Vv++p8dX5rdO/ta3P2dHd9f3n3f33p7uzr+P9te/jy6+vn9f92+255e21senVoenh2fff0 +6uz4/mxreHl9/X/8emdzbmppbvv77e/y8e3t6uzq6Oz4fnlsevP5eHJ0ePH1+vZuZGxzbfHq ++Pbz+3l2d3FudXl7fPn6++/s8+/xfXd0cXh0fPn9/fN7a296env3/nf57Ofy/vP59+jk7vlv +YWR3/e30ePjufHfw+Hr9+X5uY2FwdW1qbnn3/Hv9fHb47u7x7urq6enl9vv1e2xseHh4dv71 +8/j78PD9fP97/vV0bm5tanl5bmZeXWRrZ2p6++3u7u/x7Ovr6+Tr7Ofq6erl4uff3uHj3+Pd +3N/odltOTU5JRENFRkxRWXbj29XOzc3S1Nzu4uDm3uPu5+Lf3dbMys7Oz9nZ3OTd411LQj88 +ODU3PENIVO7OyMbAvb3CzvNobl5NTlhdbHb01MrGw8G+vsHGx83e2tFoRT45NDEuLjM6Pkt1 +yby6t7Oyt73K6VhEPz89P0ZPa9nNwLm4trS0usHI0NjiVTw2MiwrLCsuNjxS0b+3sK+trbG4 +wNxOPTg4NDQ6Q1Lyzb21srCurrK5vsbUflQ+MS0sKSgoKzA3Qu/BurKtq6qssrbBakU+ODEu +MjtBSHTEurWvrKuus7O5x95kRDYtKigmJSctMjxX0r2zrqupqq2vuc5WRz0yLi81NjlK3cS8 +s6yrrKytsrzEymY9MywoJiQkJyovPlHYvbStqqmpq663xeNUPDQyMC8yOUZe2L6zr6yqq62x +t7zOUD8zKicmIyMmKi86TM68ta2qqamqrLK9yvFGOjYzLy81PUVxxbu0rqytrrCzus9eSTQs +KycjJCgrLzhL4Ma1rayqqaqts7zK9Uw+ODIwMjc9R/zJv7evrq2trrO/yug9MC4pJCQmKCow +P1LmvbGurKmqq66yus9uTzw1NDQ0OD9SdM+8trOura+zuL3tPzoxKSYmJiYqMTtC6ry2r6qo +qqqrsLrA1E4+OjYxMjk8P1nVyL21sLCwsbe+4U5BNSspKSYnKzA3QurFu7Crq6yprLS5vdtT +S0A4NDY4OUNd7M++t7Oxr7O4vtlbRjctKykoKSwwNj9e2MC3sK6tq62ytLrO9FxHPTs8OztG +VmPWwr66trK1ubzPYk49MS4sKyosLzQ9UfHKvLaxrq2usrW5x9ftT0NAPzw+SE5W4MnFvLe1 +uLq9z2tQPjMvLiwsLTA0PEph1L+4tLCvr7O0t8PN2F9OSkU+P0lOVOfNy766u7u8v9JjWEQ0 +MS8rKy0wMztJWOG/urexr6+ysrW/xcpzTk1LQ0NNUVD60tPIvb2/vcDXZ1NANTEwLSwvMTQ7 +R1Pxxbu5tbCxsrG0vcfL6ldVTUJDTE5OaNfRzL6+v7y7xexfSzk0NC4sLjAwNT9KWNG/vbix +sbOzs7zExNdfXlVHRUtOTmXf3c+/vb+8vcjjbU09NzQvLC4vMDc/S1jawb25sbG0sbS7vsnc +f11RSEdLSkxcZejPyMHBvr7ByuNfTD43MC4tLjE1OUFPbM7Bu7e0srK0uLvC1O9oT0tJRkhL +WmZ+1srEvLq7vb/G71hLOjQzLy0uLzI2P01X1L+9uLS0tLa3vcfL2G9fV0xJTFRcbN/PysS+ +vby+w8nrVkc6NTEuLS8wMjlDT2XPv724tLO0tbm+yNPpYFROS0lMTlZr6NLKwry8vLzDyNdR +ST41My8uLy80OTxIXeHDvbq1tba2ubvBzNb9V1BOTkxQX2/u1svIwL7AwMDL0X1KQDczMS4u +MDA1O0JV+su8uraxsrK2u77K1+hjU01ISUtRXHvbz8vGwsC/vsXN11ZKQTY1My4vMDM5Pk1q +48a8ura1t7a4vMPQ4GtVTUtLTVNdcOzazsbDv7/Cw8jT2l1JQjg1MS4wMTM6PUn/2sO6ure0 +tbe8wcjZ6v1eVVJMS05VZ+fUysfEvr/Dw8nP3lFEPjc1MS4vMDU8QlHu0L+5uLOytbi9wMrd +7l5NSkZER0tWc+bVysW/vLy/v8fO2lFBPDMwLy4vMDU8QE7pzLy3trKwsrW5wM3fa1ZJQUJC +RkxQaN/Qxb+/u7q7ucHR2Ew7PTItLiwsLTE6QEzVxLyxr6+ur7K3v8vdVkhFOzo8PUVPZ93O +wrq7ubS4u7vJ2Gw9OjgrKiwqKy82PUnsv7iwqqusrK62v8xsQz86MTI1NTtIXNfEvLOys7Cy +uLu81FtVPDAyKyYqKSowN0ndybatrammqqyvus9WQDcuLS0rLjg/YMi9tK6sqqyvsbvF0G1J +PDkvKCopJyktMztPz7mxrKemp6mss8Z1PzAtKicqLS8+X8y2rqunp6mqr7nD21lGODE0LyUp +LicrOD9N172vrKympauvtspUOy4qJiYoKTJHcbyvrKakpqaqs73PXEY+OjMwNzAoLzYtMkNa +4Mm5rKyuq6uzwNtNOi8pKSopLTxL3rmvqqampqiwuL/tTUI8Ojg5PkM2Ljk4LzU/WPPTvK2t +sK2tuMxpPzUtJyktLDZl07qtq6emq6ytvtl6Rzs6O0NPSErnTzQ6Oy8xOEXuzMGvq6+ws7zX +RjEtKycpLzhFzbSuqKanp6y4wtRLPjs6PkRM3cDN7NdKMS8sKy41P9C4sKqnqa+97j8vJyQl +Ki4927mqpqelpq+80k9DPDQ2Q1Nnzbu3tLrLXjMnIyQmKjrVsaqmo6Oqvk80KSMgIio7/byt +o6Clqq+/Xj41Mjk/RVrMu7ezr7G4xkwzKiAeIyoxT7ipoqOnrLpXLyYiIyYuSMKup6amqK/E +XEA5Nzc6Us3Cvru3t7zBxM/xUTwvKiUlLDM/2LatrKyyu9tCMi0tMTxRzrWtra+7ztRYPD9I +T33f7cm5vMnIwsPDz9/Q3Uk7LyclKSwyTcezq6qttMBfOS8uMDtS172vrbC7zltYRjo+Ve3W +zs29trzHy8bGyczVz+RFNSwjHyctNFu8rqinr7rJSjEsLTFH1r+0rKy2ylxGSUJASunJwsTK +wLq7xtHRys3u++XzWDcoIyInLTZTvKunqK66z0w1LS44T9G9s66uuN1FQUU/RFPvxLzFyr+6 +vMXT3dvqfGz6ztg+LighIywxRryrp6asudNFLyorMErLurKtrbLPPDU7Q0pi0762t8POwr3E +5lhPb+xm3L262DwrIx8kKjL0r6ejprDCYTgrKCw59r61r6yvv1E5OERbXejJv72+zM6/vsz5 +VFTp5P7IuLzZOicgHyMqON6upaSottNFMSoqMErIs62srLPOPjI4Q1/g0MG5vMfN0MTC2VtO +Tlhe9MW1tPAvJyEeIyo1y6umpam1zU40LC46abyxra2xw1k9MTdQcdLEw7+8ydnNx8LVTkFL +XG/Kta+9Si0jHBsjLUy0p6KgqLvsOSwqLj3VtquprLjYTTQvN0vOvbu/vcPMfmzf0OFYS0h+ +z8O2r8JCKh0ZHCUv0ayhnJ6qxUgtKSktPsSuqKeuvd5CLiw2Tsi6v8K8xdzqZ+TL2k9HTt7D +u7Kvwj0oHhocJjXMqqCen6rLPyslJy5GvauoqK/FTzkwMz1M0rq9wMTT2M3j3sroUk9U8MO4 +rq7KPCYeGhwmOcSonp6grd85KSUnMVS5qqapss0/Mi4tNEvDtbW5v8fL1H3cz9huTUznv7Wu +rcgyIx8bGyg4wqSen6OwVDopJCo74bGoqau0djguLDI/3bu1t7/N7Gpp3c/Hz19QVv7Gtq+v +xTUlIB0dKTzDpp6hprVONionKz3es6qrrrxVOTIuM0vZv7K2vsTdbtvW2MTPZG1s5sG2sa/H +OCIcGhspPb+lnZ6iskQvJiUqPdWupqisu1E1Li0zSsq4srrGz+P049PIvsdnTE/qw7extdMy +JB4aHStJuKSfoaa6Qy8nJi5Ey66prK/DTzsyMDhF27azucHR29Ha4snD0mpMS9O4tbW48jEj +GhYeL2+soZ+eo8U8KSInM0zAq6iortQ8MCwtQ9y/srXBzN5f7M/IubvdT0lL47+5sbRnLiMc +GSAuVK6joKCozkEuJys0TMKtq6yy1Ek6MTNN1r+2vcvP6l3a0Ma8zV9JQ0zVvrOvvV8wIx0b +Hy/qraKgo6vFRC0oKzVWvq+trrXdQTMvOV7NvbvBxtH5edrMv73J51RGTfPOuq+3zVgsHxwb +JD3ErKKiprBrNSspLj/4va+us77yPjY7TPrLw8PDy9zSx767w9xoTkVJXMy3tbi/fUo9KBkY +Ijy/rq6sp67dOy0uQ//Ovbi3ucxNREhKb+Pdxst/eezXvbq+wNJYRTs9ZcC1sbrqWUs1MTs5 +JyU3XL287N29xNf+SGLJy9b4VGfbb+zDvb3C5FZYTlHvy7y4vcjXXEQ/RmnHw8/5Y0pAPjpJ +1b23bCUlKS5LWd2upq63+DxDPjtKzLmvtcbIy99tXF7Y0WxUUnTLxczS23VdUE5ZU0dNZtzO +3tTK4+rtPy4sLTlPYOG/tr9jRURQ1Nb11MbAwNLjxLq4u89wXk9LV+DGvsbhX09HRUpPTVRe +WmJn6+L3WVBqZFdPTUlLSVLb2djZfGfubV5uevng1tPIvr2/zNx7ZG1taXfr3tTfcGVofe39 +Y1NNXHJdTU9q3d91cufZ51dTWFZbTUtc69nX5ejoZlJIT/vb0MjHytPxYm1uXV1v18bH1+Db +2d5tXWhpa3n/5t3zXVZaYvzyZ1ZNSkpNTVf50cbJ1/prX1NGRlPozs3P2/NoY27p2tzZ0c/Y ++W9w9Ov569va5v1tdPl7bvfi3vZdU1ZcVk9RXv/u6uHgfV5aU1hgW1ht697V2tnZ3+fm5enw +dHD87N/d2trpdGlvbWxu/vDo5e34dHZtYWh67+9zamZ27uvu6vD2bVdUVVNabXF95+Ho9H1s +aHnx9+zj3tbW3u3t7fT+fn10fO/4dPDg4en0b2ZhW1ldZXvo6PH+/vjtc15bYm387+nm7vT7 +a2RpZF5aXnfp3NfV2d7l7G5iX2Nx7ujr6Obm6XtyaV5eZnPu5ufn5el+bXJ+/ndqZWNvcnzz ++Pbq8WtiX2Jocfbs5uDi8nFoaG1xc/rq5+ru6e7r5u53b2xmbvzu5uLo6Ofr+Hp0d3V6/355 +b2Rja2plZ2pqefHu+Pbs9/zy+ff09fn6ffHu7fVucP76+fP9c3Jxdfrq7O3s9vHx/25ueG9w ++/n2+H5rbv//+/j09vV5dnN4fXv77+rl6f5ybnBnZ3J8e/Xj3t3f5/TyfmhgZ21sbXRub3Ju ++/h+cW54+Ors6+no73L8fHBubm187+35fvn++Pjy8/NubHBz/ezn4d7m+XJvbWtqb3vs6O7t +8nx8a2huZWJdXmp3+fH8/3n+8PJ8+ujq8evk6PT7fnN9/vzl5fL17fD26fVzcmZeXmhscv16 +efXx8fXr6/X5env77+3+evx7aF5jYWFkZ2/79Ovt+ubl9vZz+OTp5uPj5/Du9Xl0b3Z2eHBv +fn11aWd1+v1++P3+9/t8/P96a2Nmbfbr9/X07e3v8/P9dmtpbn//dPPs8ezp7+9+d/L2fG98 +eP55dvh/dXxtbWx76/V7/HF48/z38Pn27fH7+fb8dHZraX32++fm8nVycWdocWpeZm177P50 +9vDq7P/08Pnn7eni6Oru+H34+ezo8nxnZ3f2dXJsZF5YXWlvePfn4+Tr8O7v7+z1fHVucf7w +fvx9++91bnn9cW135uLo7np5/XVsefl5en12fPhubvbx8O757en7e3V+9WxrbXZ5ZmtqbO3k +6ebq7vl++Ht7+35yZml3fvN0a/Xn6vTx9nn1/Wz8+2x97H7r4X1vcG1vaW7s7fl2d3psaWVo +ZmRqcXv68PHt4uHk6nN88e36fOvo/WdgcPj68e7s6XtvdHBud/lzZXf8e+rrffnx9unq+3J4 +c3tqaXFqbmxpcO7t+/99fX93dvjwcnXv9fL86+Hn4/l2+X16bWn26fr79+rtamdqcv1tav16 +cG1oc/T8++39cerofO/i7Pl+c29ybvvreX5xcnpobnF8+PXv7+98fXZu7+v7ffbq6/Nvcez8 +f357dWZ5+fr2cfTg7WFg/XlvZGxrdPZvbu7u8ud08eL37t/t6Xtn7PVu+2Vn7GhaXmR87O7l +9Pvm7/L39+t8Y3L5cvh7bu3m9XZldvlxcV5daG9s9vbj23Fu9u/z+fvo4+V7bOXi8u778etw +Y2xoYWJhdv7/d23082h4a2jr7/v78ent6/14735k6et0fGlu7/hv+fHw92l47PJ1bvLqdHF3 +9f18/Hd7/PNpfN/4avt8evFhW3R2a3fz3OXsfOrc7HJseezuY2H7+Phxeebtb2b76mpmafjn +cGFv+fp+afvxcGxu/eHfb2fo7GRs9Xvl4f/55uv3cvtt9edreO35YGvh19t7a+rofGxhd21b +XF9db/x8+G1kde99cnf/6v1kb+Dk5uXu3tn3d+/08+/wcfrp7/nodWNucm/x/Vhi/G1ncm5p +7epnfm1s5O5ud3b249748+L5fv1dZO59be9x/+X4dfBwb+TrbG11bXZiY+zo9npoXFxs//Tn +5ebc9Gh+4djV7W716f333OLj6ldWYF1fXWTz6m5ha/tnYlxh+/7r3N99821gb2p98erc1dbX +zMnX9fvs5Nrg5dnia1ZJTVdXVmvh7WJXVVNXV2R96eZrWvPtan3r6djX5tfL13ze2NTbX2Ln +719aaOjm9/t3YmNtaXHm4ePW2ONzcW54e2lsXFpdW191b3hxeXNYYP51fGZj6P5lbvfvXE5b +7d3c2Nff7Oz14NfX4G9s73t2+fXX3l5dX3NeVGhubWZfa+zn+V9hamJt8vzv5vZ77f9z+nl1 ++HFs+XBn9uXt7fBufPb29Wl96+t1ft7n5O7u29/pd3Lw92VdfHFaWFto83dq/P7vdmB54OHr +7ene5PXp/2tvbfbj5e3v395vbfFtdWthbmRmbv3r5+v5fmlpe/nv9f/zfvLu5uPr5u7t+O/q +7+jpc2lucnv1dmN/+m9qX2ZfW1tlam588+jq7vHf3eDg49zS2eTd6vjvenz6ZF9uY1xgX2B5 +b1tmfn/88eXj6/Ty9G1eVltgYmhsend7dfjq8H3y3tfV2t3p8edxa+z0eX1v++br6+P5/XFj +a3vr5u73fvtzW1VZVFRhZmzu5vl0cW5wa11e/+7v6ebc3unse+/e3d/d5PTu6+fo5eXq7/9j +X2ptZV5daWpdXmh1fPbs7Ox8cPnk5vFrbnZ0/vHg3Nzf5OTi7Hp3bGJga/30fGVhaHby5+3p +5fl0bXj0/3BxfHX85ufq6Orr5fX/7PNzb29sffhqaWlscG1sb3J3dWxpduzs7fz87ePl6+fq +9H9zfPtobXl9/3JqbGVdWFhiXlxfanlubPvh3t/d3t3Z3/Lq6n5vdOz2bGZuevZybu3xdnr+ +bWhyam90c/vtfGNp/vBnYXZ8dndu/OXo/Pnr7u30/Xl18/1td3r44+//+f7s92pjZvz0dWFu +c2xpb3r95OPw9ubq8Xxy7n199PHl59zd5uTyeG52fmtpfuv5fPT5b2pqZXJuW15nY2798PX8 +d2VgaXByfvvy7fT+dv368+fo5ep8cvhv8Ojp3OLy9+Dl9Ozh3uv1+Obtem9qb2hfYWxpZWts +ZnJkaXppZWvx6vdsb3bs5nHv2d7ufnDs6nVtbvD9Z2Ry/XD//n389n7y7WJt3+h8bHHl2eTo +5enf+2d24+d7evf7/n9odv5nWmRqW15ecftuXXfvdGpfY2/+avvs5eb28+zh3OLi5ur8e/H7 +/mNo+fn8/+rn5/N49+5tbf7w7vDk5fNxbv7t+29maGxlbG5z/31zb2lf+vducmdu+XZpbHJz +dGtwfHDu7ujf6Ozk4ux+fPDvb2pqbnzy/vn9enf/7fl7/Op4bvHt5uR7b3t0aF5eZ25vdnv5 +7e9uZ+33a3Fta2xbVnP5Yn3xdXRlZO/tY2z8dvp6a3h3aWx9dvnm8/rr6vX18fLl6evj3t3s +5ubw9Oz5+e13+Pz0+nhwcnduc19ebm9kaGJr7vj75+bu5vbw7HRoZF1hZV9eanhvdX3p4vp3 +7d7c7O/f3uLh3eLo4+Tj4u7+5ed6amRrbnNtbXJvcnB38vHu6ejm6fd4e3Nu/vt2dG5fYWNi +YHjx/Xtyb3L07e3m5uv0e399bnl2aW5tfHzy8/nk4uPe5ern+P3v6erwcv7w7+z/bm/3/3l5 +e/H4ZGZvbnV1a2duff736u72b21zcHpyb3dxZGVufn50ev7y59/f5OXs/f/xd21sZm17fvX3 +eXr38e/27OLm4O34/v70/PDr+/j3cmtqbnBqZm1+/W9wbmlqYWh1b3t1bnF5b2ludXf77e7r +6fXy6unv8fD8eG94/f5y+3lxbGp98/H9+H3/7uvt+PH4ev9ybnv+8PT3/HZ7cn779O/6ef15 +eHFlX19fY25vb2xxdfn3+u7v8XZpcXd6+fn+d/l5dPbo5unf39/e3+jt7/x2f3lqcnVzeXN3 +b2ZfYmzx4fdx/XRqbWhibfv9+PHr7vjz+e7yeXz8/fzp7XhycnZ2c25tcu/ye/Ly9frze3j3 ++Ozr6uno6u/u9f3w7vd0bmxkZmxvb2ppbnV59vd4ev72fH74/3xwc3N69vL/b252/Xh6fP75 +7u97fHz48Ozp7vL9cH3u7OXj6vvz9vLt+H1ud3l3b2RqbWhqbGxvbWhwb331f3VxeXt99Pd6 +e/T5+PXz4uLt6+ft7+32cXR8/f11ePV4am1vbn705+L0d+7q7Orz+/Zyam988PX28vx3evpy +cG5vd3n3eGt+9PD4+Hh+dWp0eGlja236+v3v9vz9bfzr9O/yfPrt9nl8dnjs6ers7e/z9e7w +ffX7c21tbnF0bnn+cWt5cWxxcXv5/vvr8fH0/3307/f39Pr4cXN4c294/3h7cv36/fd8fH12 +bGlnbHN88O/u8Pl+/Pb7+fV1cPvr5Ofm6Ofo8npxZ2VraG31/XZ0fXb46O77/e/o6e/8fH73 +9H7z7n58e2xpa2tqa3NvdG5neO3r7Orx9PX09nR69Pbz9PHr6urv9+ztfvz4em10fXJubW9+ +fnz38/54dn368+bl6er4+/5ufX12b2hsb21vbWxvf+33/vfz9/P7/vl4bnt/dnr18/Ho6u3x +9ntxcG91dHb7fWtobHr89PDv6/j8929pbXl5fPbx8evv/nr38fbz9vP19Hp193hsZ2lnYWVn +a21ydXJ2d/nv9vf17vb+7ur9enxy++3y9vX0/PP2e3F5eG5qbXd4b2VoaWpz9Ozy59/o8ff6 +fX36++3r/nzw9Pv1b2ZhZ2lwa2x4ffb7fu/x/v5vZXX19Gxq7+/59Pr+8evu+vl4e3x2bW71 +7vP17O3s6ujr8e/u6/Vw/u59cm9raHn3e3V0cnV++vf7eXlvanF57uzy/fHw7PhvfO3q7u74 +/nX+9Xd1+/H6eXp2f37y/Pt8dfX8cWxpbfz59e7r5ODh4eLr7ut8bHB0cWdeWl5na2138/L0 +6Ov48O7z+PZ2enl4/fT1cHBucWtrbnJ7d3Fy/PTw6uzr6ubs+u7u7O/v9XZ8d3Bvanp2eG5k +aGxsfe18aW5vdHBlaGRt8+78cHV99urm3tfV19ba4etvZGdlX1pXW15hX1haXWJlZG/z4Nzc +7f3u+P/78+ja29/j5t7Y0tLa9mtwd/xtYV1cWE9JQTw/U3LVyc7My9J/Z1pXbfnl3Nzb2+tn +XmpwcHts/vHt5vD38+zo7OXe4eXV3ODf+PP4aVRVTUM/Pk5z3dHe39jeb1xPTV7263hu+dPN +z9fc2NTY7PTq1srIyMzY4fRZUlhOOy8rMEjRvsG/v7/KbEc9SGPd09LLx8bYUEVFSlj+2MzG +yM7U3t/e3+fu7Ozb1tfMy9t9X0g4KyUuQue8u7y6vdBdRDxN/tzMysvL3FlPSk/jysfJzt3g +6fzk08nGytb9XftcUtbP1vE5JyQqONC5u7W0usVdOjc+Vc7CxcC/0llBOT1gycDAxtHP2HVj +7s/JzNz/e+DS19DFzthRLSMfKka/srW1urzaQjY0QfDBvb2+xuBOPThG38a/wsrN1Hxke9HF +xMvZ6OrV4XPQ2dp/NiofHi51tq6vtba9YD40NU3LwL6/x8z3Rjo9Wcu9v8zW4vRzfN3HwMPN +9l9m9NfPxL7MTy8kHR8verCrrrC1zUs7MTdN0r23vMbZSzw7QFfJurzA2V9dZ+vKvLm9yehn +ZFlv1MrG1UQtIxwfNs+vq6+2udBLPTM6fcS7usTbdkg/QE/SvLW9zPFTUVjvy7y6v877XFVW +d9jHw85RMSUcHi/ur6uvtbrMVkE5PXbEu7zM5l9GQD5K0L24vM/8ZFtj1MO6ucr+WktV99nH +vcDIfDQkHB0t6LKtsri7yFQ/Nztqwru+y+RvSkI+P+C/ubvN8nByfs++t7XB2VtMUmZ94snJ +ydg3JBwcLGm0ra+1u8hWPTU5WsS5usHT2etMPkFcxr3E0HJeXu/Vx7y7wM34WVV43szByc7X +RiwhGx412q6rr7e6wGlIOTxsx8XG0tbI01hERWDKxc7f83393tfKwcLJ4VlOZdHEwL2/z9pC +Kx8ZHjLLrKuyuLjE+kI1O/nFwsfZzsPPUDw+YsjEyNDUzM/Oy8fCxNRbSk3nysG6vsnYTjMk +HRoiPMisrLCyutFPPTdK3ci/vr67v/JKPT1g1srFy83V2tvYz8rJ31BCSHbNvrm5v9JaNyYc +GSI8vKeprrG5zVk7MT5ty768wb/HdkU2NkvRwr7J1Nbe3NnPzc/bYFV+zLy5vsHJ2vs1IhoY +JUqxp6msrrTSRTAsOWrKvry+u8daOjA5cb+4vcfL3Gtga9vKzOVgVufCure3vMTNXjQjGhYd +NMWnpqmrsslTOjA7bcq7ur/C0kg1LzVuvre2vcna7Obg2tDN3FlRZ+LOwLu4uMB8NyEXFSBA +r6Omqq+8/T0tLD/Ks66zu8TuPi8uOt27ucDR2u7l2M/BvcTZVExq2se9u7vA+kQtHhcYJ1ur +oqeqscFmPC0vR8q3sra6vn46MDFEybq5wtbd7f/pz8K+x/lOTGLY09G/vMTWPioeFx4xyqak +p6u13j8wKzRXx7ezubq/eT8wNFq/t7vTYFxcWWfbx7/G2eTazb+9vre2w1gwHxUVHzyuo6ep +rbvqQi8uPuC8s7e8vdBTNi44csC/1GFm7NzTyL67vcz8X+/Jv7u3u8HLQykfFxcmQrWmqauu +vXpGNjE/37+1ucTF4kg3NU3KuLnL+u/o2c3KwL/G7FJNUPPNxb68v89CKx0XHS7GpqSorLXP +SzYtMUfSvLrBw8d7RzI32Lqxtsv03dzo1dTKwtpMQUJYzL28ubzLVy8iGxsoRremp6isvndA +MS85TdfEwcbHz15CO0PUt7W82mby5N3SysK+yO9XWt7Jx769y9tFLB8WGCZDrqWoqq662E04 +NkfYvrW4vb3YSjsyLkbIwbzPUXLV3NDO18zK4W/jzLuztbe71UYsHhUYJ0iso6eqsMZYOy0s +PHbCtbi+wuBNPjc87r+5vczd3s/GxcTFzNldSk/fwLi5v8TWPiwhGRklPLmlp6quvnhGNDJA +dcW2tbvDeUU9Oz5Xyr68xORgad3QxsLGzeRhfc3JwLq7vs4+Kh4WGilTqaGmqbLLVjksL0De +ua+zvMpeQjw0PdC+uL1pVVxu4dDLxb/LXEtL9L+1s7e/XzQlGhcfMr2io6aruN5GMCsxUMCv +rra920Q5MjBBxbOwudpdX/vZ1MrDvspcRErhx726v9JELB4XGSdSrKGkqK+/ajouLjvUta2u +u8lkPzcxOVDLuLnG4V9j3s7Kx8TB1WVYVt69tLS20zkoHRccLfiooKaqttpJNCssO+u4rrO9 +zlVAOTY/+sG1usnsWPTOycnIxcXtUUhLz7qwrr5OLyUeGx4v0aefpK29a0I4LzE+1rausLzP +XUU8OTtK5r65wM1pXfDYzMnKy+Brb3HVwri0uu4vIhsXHzPQp6Omp7DMSjMsMEXLta2vucNR +OTU0QuLLv73L3G9efdvMycrP3/zv1cm9t7W5dC8mHhkcKUysn6OotNJNPC8uOFy9ra24x1o9 +Ojg/5L20tcDkU1Zp2crNztTfc2Bd6Lu0trxgNCogGx0pVa2ipKq43FI8MTE937atrrvSUzw3 +Nz95w7u2vdb9UGHj08/T2dXlbPXevrW1u903KCAbHi1hraOmqrbpRjUuMEHQtq6uudNKNTQ4 +RXzHubq/02NVZefPzNPb39fZ3dXDuLe6xkMrIhscKUm1pKass9BNOS4uO+25rq661lQ7NTY3 +S8m4srnO9/p94c/KxcbN42v96c68uLzLSC8nHhshNsWopKmwxlc9MzA6Yb2vrbPJXD02Nz1U +0cLCvcDY6lte18zLz+Po4+Hb1b22ur9gOS0kHx4nRbampKy86UI6NTVA37qwr7ztSDs5PUn3 +zMa6usfPcGXZzMnL4uHV3N/n3cfDxNRNOS0oIiAoSbqmpa+8+UVAPTtJ7b2xsr12Qj4/SW5u +6b+7vsZgU3fjx8fU3eDd3u3d0MjDy/NQOC0sJyYnO8qtqK++9FNNW1Ba78a4t8H2SEFHT2np +xry+yPVSS1Fi0sjEwcnaYl/21cnJ0+ZNMzAtKy8qOMmzqa3IaU5LaltY/9G7usbjR0FOVWH8 +fM69w8rhTFdz5MnExsXQ5+Lu3tPMxvRKODEwLi0oL+a3qqzA4XpfZVBETeW+vMbbU09ZVlRW +bdnGw8bL4/394cvJzNDY7d7d3tfb293+SjouKi0qLUrRta60vcbdfllNTljTyMfE1vL3WVFP +T3HMys3Q/2Rja9rMx8vN0tvmW2Tnzr7G4kcvKykkKT3lsKuusbvQbkc7PUfvzMLDzdnvWEtI +TVVNXGvJvcrLzsjBx+l349TP1NXSxb7JUzgtKiwqJTD6tqquu77H21o+OkR2zMrJzszJ71BK +PkTq0MvHzMzH0OLV0M/R1tXS0tvZ2dbPUjwxKCglKDzZt62usrXC7kg7PERh38vAwcHKa1JR +TU1RedbKyMzT09TY6Gxv6NLR29rQzMLB10s3LyghJTBet6+vra60yU02MjlHWd3IvLrAzOpe +ST08Q17OxMC/wcHK3GVWXHndz8rFv8THxHc9MCcfHis+zLSvq6mtvmg7Njc5P1jOvLe6wcra +aUs9PlPdzs3Qyb6/zmZVXWhfatvYyMDJxsl4TDEoIiAtO9W5saqoq7XORzs0NzhD9MK6ubzE +1WxJOjs+Tn7Vx765vMXealZTUl7fzr+7vLnKWU40KiAdKknJuLSup6m1+DkzNDc2O2y+s7K7 +wcXWTzgzOEju2sa4sbTA425TSkZHeMS8vLu+wMhMLSYeHSw6aLqvqKOot9BGNy8tLTvsvrOw +tLW85kc3MDdETty9s66zwdhpSkVCR27HvL26uL/LRywjHR4rO+67rqeiqLLKSTUtLC08fsK0 +sbCwuM9ENC8uOUr+urCusLnL/Eg/PERkzb67s7a70kAuJB0eKjjpva+ooqaxyUc2LisrN0/L +ta+urbPJWzkvMTU9asm3rq60vc9WRT09VNrSvre6vtVLOCkeHSk0T8q6qaCjrLjvSDUrJyw6 +Wsi7sKqttcdIOzczMzthw7Szs7S7y19DRk1MWdjIwL3Lb0MwJiQpLTpNzbGopqesuMtONSwr +LTVDZL2uq621vdFOOzIyPUv8zb+6ubzH1+Hh+frt2djbeE48LigsMTM6TNG3rKysrrK84z82 +MTEzNT7lvrmzs7S5zF1IRENHSVXoz8jCyMjEzNbS1+9jV0o+NSsqMTY5P07cubCwra2vtMRp +SDw3NDM4RVniyL68uLvGzdHc4+5oamdZXFlSUk1Pae3u3tz39fpdVFdbWFRTU1txf3f76d7b +43NcW19lferg1cvMz9nc4/Zybfzp5t/d3uZpXFlVV2j25dnW1tLV2d/rZVNPS0ZHTVRZYG9p +ZWZhX2FiYWny3c/JyszT5Onz7ufm4N7b2tbU2+l0XVtfaHrt397f5/D1b1xQTEZFSkxNVmvy +7Pl4bWdnXlxi8djNyMnJy87W3ux4c/nx7ufh2934YF5cWVlj8erp2dTW2upfVU1FQ0RHS09Y +c+be3OPj6fr+efPb0dTVz9DU3OZ/enx3fvPn393e3efq6GVVV1tcXWJhanb/eWtfV1NPTVJZ +X2jv3t/e4OPh3uHf29vd29jY3OT9Z19hX2Vy++XZ1Nja3ef6dHJfWVdTUlZcXl9eX2RmbGpp +bnz34Nra1tfd7nd0aGlrbezh4N/h4OHq+mxhY2Ntdf15c/H39PH0eWtsbnj+/O3u6ufre2Nh +Xl5hbXl5d3V1ePf8d3d2+fbr3t3n8vZ3bnN2bWptfO7n3tzf6e3t7vZxZ2RdYmNgbPn1/vf+ +9Xp38uvk73Z6e3h1cHj+8uzs93hvdnhsdP1ya29udPjs63z+8vHo4+9sa2hkZ3H/+fl8+PPz +6ut7e/Ln4+Df5fdscHr9/fP0d2pramZocG5ubGt+/fP8cG9//mhjZWdu/fj17Ofr+PDl5u/1 +fvPq7urq5+nv9Xj+e3Zwa2pseXn47vd3ZW1xcXV1bWRpb313/3x4dW599ufm5unr7+7zcnv/ +c3759/fs5+707er2efx2bW949fpwaGhobHZ+eGxka21ufu7t9/z77d/c4OPn7+3m4ujt+W9j +Y2plX2Bqbm/76+vze3Zvb3R6b3NzcHvx83t6dG5x/PH39/r79ujg5uXm6flwcnd9fHn+8fD2 +fHNwa2Rna3R1dvz9/fnu8fl3dnBz+Pt99+73/O/w7X1ramppaW14+2xwb235729vc/Pd3+Dn +8trY9+nqeWxnbWf983FzZl5XW/fv9O7s397h4+Lc4nR2eHH89vt3bnV5eWxeZGpkbXhyaG15 +Xl5vdG16/fz06+jp6fHq3+Xv7OHg4uPh6nz/7O718/LxcmtnbG94/PN4bG1oaG59enNuY2h5 +bmxnZl9hevL7ee76fHZ+5+vm3+Pk4+Lp+G5oamdxbWxzcXz57e307+r8bX13aWRlYVpfbm5z +8Ofq7ejf3Nzf5evt7Onq6vx4dHBzaGdqaGJpdXRw+H59+nBsePp6bGhkX2tubG5ucfn9/u7p +6Ojp5OTu5+Ld29vf8nl6/fnz829ma2pu+/1zeG9maf7u5+Po7Or4//f3fnR3e3FvcGlsc25y +fvv4/HhsaW93/n9yfP5udv7z9n75+37s39/p9ez1cPvs9f7/eGt2evvu8/Pr7fjv6u18b3p/ +eW1ramxy+O70/fLy9P93/PX/9vZ5fX5vaW1vbm1udW5mampx+nt7/np1/fTu8Ozq7/f6fX7+ +9vLn5OPh4OXp6/Z47+fwdmloc/vv/WxlX2BfXF9qZ2Fobm947u79bWx2+PDy++7t7eXl6O7t +6uvo5+jveGBdXV5obWtsaXbz9fLs6efk4+Tk7fr5+3hvdXZlXmRoam9++Pb/b3r+cXJ0a238 +5ujx/vl5/O7r7fJ5df91fvf9eW1qam9xdm9yb2dt/ejo6+55anbv9fry8u7y8PR4/fP89/Hv +6+n0dXNybnBze29oZGdjZG5tbGxwcWtsffb47ev4/PX3dnv6fHBvb2p1eHj66+/s4eXi4ez5 +9O7v9/vy7/bz93n6+Hh1d29xemtmbnV1c29xeXNuY2ZscP74+3z57Pn38PDyffbu9P59+XN2 +fn17cnV4+fPt7evh6O3s7u7n7nlwaGxsbP75a2RqbXL7/3z9/Pv97e7zdWxtbf399/50bnj5 +8+vp6Ovw8P5vdnFycGhlb3NyfOrn7e39e314d3h1dXx6cHj7/ff39/jv+HR4+vP5+3v+d250 +en1+7vV8/fR2X19laGlkeHFrb3jg5OXi3d3r+33+b2tgXmJ1fvH269vh5ur9fXl+dWhpdfv1 +83P97/1xaWxsaXh2aWz7+vnx+fH3fnhsevXr4d3g39vkd11ZYmptfPzq2dXZ4nNpZltUUVRb +bX/v4Nnc/F5UVF1rcv7g1c/S2+j+fG9pY11f8NnX19fc6vJwWlNZYl5ke+/f0s/X4v5tYV5e +XWBy6+Xo72taVFBPUFJd8eDb1dPW3uj8bnhvd+/j2NLS1dne4X9dXFxdaW/53NPY7WJVT1Zk +dn196t/e6FRFQ0z+z83Y3uHd33dXTE5d6ODtbmzj2d/d1tfPytHpbV1ifPN99evk3NbZfkg6 +PUFP99/k3NLTzddqT05Td97t/Xzm2NbzXl1i5dXb5/R839LeZlxe8czFxtJdSkE6PD9N7cjB +wMf2bFhMTVBXftLMytDvXlVY+djOztv0cm/0293sb1tWX3Ju9trX29PiQzAwNlDDu7rD12Xv +/lxNS17cx8fQaFBY3crGzW9WVmTf0drxb9zJvru+zUUqICQt5K+qrb/2TVNQST4/X8Oys8hK +OTpK3szR2OXWztLhaWvaxsTLaERJ4rqvte8qHh8q2a6ssMTuY/RPPzI1Tr+sq7hZNTI+e8LG +1N/Xx8LH4Ftc2svGxMjM21A6Jh8jL72npKzNPjpHXOhaVn3Gt7jKSDY3TsW6vutDP0/RvrzA +yMXBwsvN20MxIhsmO7KfprJMMTNK+9TrUt/Ft7jZQzY6/L+4vmdAP1bKtrK0ub/R5eLLz0Yr +GRckSqCbo8AtJy9iw75xWNi/sL1cOTFDwbGyzDguMla2qqestb/hTFDyTjkeFR0yqpabqjQe +IDbGr7tabOq4sto8LDHZraiyTSsrPbmmpKi2zllS8MzOPh8QEyS/lJSd9B8dKfe3tmFezLas +wjwrKlmtpqp4LCgyzaiipKzCaUVdwdI9GwwTJ6uNkZxKGhkr4K+yRPbPsKvuLSIrup+fry4f +IUKpnJymu01DTr68OBsLDyytjJCfPRoZLruvqz9UyrmudSYjL7yanq4uHB88q5uZoK1MMTV2 +wPAtDwwdWpSOnM8eGSW8r6fLOmlow2EsLFysmJ7IJxkeOqublpymzDEvNz4rIBUWLrCXlqU+ +IB4uvq6rt83SSzQoIjutmpaoNx0aJ/SpnZueqNc9SD02KBoSGkKnlZqvNyMmN//LuLmstU8r +HB9Un5OWtCkaGy/JqJyanafPSDkwLB4PECevkJGkOx4eLtHWyMa0qbJCHhsnrpWToT0eHSpS +sqWdm6O6XTUtJBsUDyaslo+gRyclLVJPWLmtqa87IiMss5ybpVkoJTJWtqyooqqvuT0gHRYN +GU6hkJiySy4qOzk3zbWqptgsKCVIqJ+eqUcoKC+9pqSgq7zCSCAcGQ8WRKmXl6vKTS4sKyrc +p6Wr6SstNTy8qaOgszgrK0qrop6esd82HBoWDhdXp5iar7i+Oy4kIE+pp6vIND86NM6vpqK1 +Qjk88rKqoJ2nzi4dGhQNEzaklZemr7ZJLCEeNLq2u77Hw9g5P7+uq7VvT+LTvauhnaJmJyId +EAwUK62anJ2bpdYrHB40UE3auLCuxF/Atb/RV1vGv8m5ppydsDsqIxUMDxo5raOdlZek0ywf +JCknLny3r6+6tquwyN5VR0pT26+fnJyoTSYZDgwTGi29p5aOk5urRigfGxkeLD+6paGdnqiu +vE06NDAzT66enaS6LRgUExIZJD2wnZqWlZynvzwsJyEdIC9fuayvqqCosb88LSooN+LCsq61 +wOlJPTw+QEZOVF3q1tTybWtaTD01OEBO8ci3rauwxFw/OjpC57ywrK+5yGhLQT5AQ0FAPTo9 +SGDU0e1YSERFQT5H/sCzr7K6wdlUSE7hxsC9v8viT0NEUdrHyuhLP0U/M0XWXFBHPEtOSExH +wLHHvLG8U0dAXLO8yKmqt7fEXjsuKS8vISIpLDlbwKWdoqWjrshqPC0rJyMqMDZP0L+upp+b +nKClrcVEKx8aGRoZHCUvTLupnJeZnJ+v4UkrHh4eHicyWLKrqZ+dnp6fo6zLRjcpHBgcHRgc +MVFdv6WcnaCeo7xcMyglHiAsLzvBsKqhnp2dn6GluGJKLBsZHRoWGSg4Nuaon6Gdmp+ut9k3 +KCImJSIvXd68qaOfnpyeo6q0zTolHh0ZExceHidUu6+jm5mcnZ6u1E8vJSMgJCctUci4p6Cf +nZ+ipbPN8S4jIBoZFxgeIylfua2enJqYnaKp3EQ1JyYlJy44XL24q6Sno6OssL1LOysfHhsa +HB0kMES/q6aenJ2dpK66ZTwxKywtMkt8zrOsq6mqrLtvcTkmIiEeHR8mLDX4vLSooaKfoKat +udZEMi4uLTdR98Oxr6qqq6/KZkAsJCEfHiAlKy9Dz76yqaWlpKKor7PHUj00LiwyO0nZuLGs +qaqtuNN0OComIB8eISYrNlPYu66qp6SipKmsss5dQjItLTI4Q9y/t6ypra65y2E1LSYhHx8i +Ji09a8q2raelpaWlrK645lI9My8vNT1G1by1rKqusL/wTjIrJSAfHyEnLT32xLGqpaOio6Wr +s7vnSzsxLS40O0rpwLivqq2vss5fRywnIh8dHyMpMk7FuKmhoJ+eoqevvNY9NC4pKiwxPV7N +t66qqKmrsMRPPishHx4cHiQqOHG6rKSenZ2eo6y02UM0KCcmJSszROW9r6qnoqOpq7ZbOC4h +HBscGx4oNUy/qaGem5udoai47josJSAgIyYtRNS8rKOhoJ6fp6+9UCwlHxkYGhsdKDv4sqSc +m5mZnaKqwz0tJRwcHR4lMk3BrKSenJycnqWqu0M1JhoaGBUZHSMveLumnZuXmJyfqr5LKhwe +GxYeKSxJr6mim5qbnJ+jr8brOCckHBkcFxwlJTHFr66dmpyanaW44TkhGxwcGyQ6Xbuqn52e +nZ2hq667UkQ6LCUfHx8dGyU4LUatpaefm5+krcRPMyIcIiMfL9i7raShoKKpq6y+zb/4R2E/ +LykiIyAcHiszOcapo6CfnqKuzkk4Jx4gLC0y0a+qp6emp7DBuLv628TfWN38NSIkKRwZIzI2 +TrimnZ6loKG5PDkzIx8nMj5pwa+mqrOvr77QwsjDuL/Qyr9JIx0jHxgaJjvSt6qblpujpq15 +LyUgIiMjMsu9uKuoqqy74s7H2tvCtq+5x7vPLRwbHRoZHi7HqKKdl5adqb9DLSQcGiAnMGu8 +rqWkqauvxdrT1czBt7G0vcfoMhwYHBsbIC/XpZycmpedqcM0IyAeGhwoNdCtqaahpKuyx09Y +7OfOv7evr7zIXy0cGRsbHiU1y6Sbm5uco6zZLB8dHBwjK0K0pJ+fo6mttutBPkNuzMG9trW9 +vu0uHRscHSAoNtCmnZubn6iy3DMiHBwfKjRls6Wfn6SsuM9UPDk8TOK/sa2wuLvjMiAbGhwg +KDjVraCcm56ouF4yJh8eHyk53a+moqSorrnZRDg5QF7KuK6rq620wEsmGhgXGR8qPMCnnZqZ +nqi4UC4mIh8hKTJqsKekpKevuslpRz09UNO8s7C0t7jATyodGRgaICs9yaugm5mcoKzPOSok +ISAgJzber6aipqyxt7zG3WZd6szBvLq7wNVILB4bGBkeJzfPraOdm5udpbVXMCcfHh4jLUu+ +q6SipKirsLrH2fRWSlBs0cC7xG00JB4bGhwjLUO/rKCbmZufqLtOMCQeGxwgLVS4qaKgn6Ko +rbK82E46MjQ8WMi8u8NaLyIeHR4jKjRTwK6jnZucn6nBPiceHBwiLk6/raaioKOmq7PDcT8z +Ly82Q2HRwb/Gx8DDTCwhGxoeJzzOtK2opaWjpq28TjApJiozT9e/uLm1sK2ttL/Vb1xaVEpD +Pjo7P0xaU09Zb+nUy8bCzl5EOC8vMTU/Tlvq0s2/uLW2ubzD0uvq3NHLy8nGy9DiVklGRURH +SUpPa9zNyc3e2dza32NSRD5ATFROVmVaaHt3ZlpffON5dvdsbeLS0tzm2urrzcTDzdnl39XQ +y8TF221qTUpZX01GTlFZZV5fYXXzdm9damtga+NqZGpXVk1MYfxfYuz04uTYz9HR08HI2tr6 +7mFYWtvx7tbc1dRaXObebE9k7uFVTV/cfklgcUxSZlVNTl/t1szNx87Y4fHoX1NGTXdsdFd5 +1s/O1srI4fdoX1pbUU1iXm101tV80M306mlbYOhXTvjh52bY3n5udXzsWVfs43ln2+be8+Zm ++OpOUe/xVlNe+P7v8Hn3/u3q9u75Zt/c6tzb/dzb3F/7zs7x+t5cVV1579/b71pcSUFKVlFQ +ZHr35e3e1OPf6u1WYetv+/fW1dfVz9vZ0vhbb2Vldmzo197g1tjZYVNWWE5HTUpITvfS2NPY +0eNbc+BlT11bWWrs3tzOzdPR5Xj9c2vubm/vYOrX4GpvXFx5dW9aXl5UXnx94s/T+Ord/P39 +7+9rYlxfWmrudu3199jX6OPf5vrocm31bV9fX1NPX/Dp7ODe9fXp5/leZ21sZWpkafTz7eHf +4ePi5ujp6/z83uB5duvxbWRsX19eZGZsa2N55/Lx4uDnb/59Z2Vp9WhkfXNz7uLf4Nflfvt8 +9W/05fZrZ2Nvamr3/Pvs2ef3fvZ8aWxtZV1odX/59/798efpdHh+eGtn+9/n7ODi7O9vdf1f +Z3F6dmlfbHp66evy+HFy/HRoYWdhY/fo8O/p7vF74d17/Ofk6+78eW1vcmtsaXn8d/f26elt +anJ0dGt6cHJp+u118PPzfe/x++ttYm3w+3n8+vr1+f5yeXtqcPTycXn8bffm+ejkfm94+/tq +afD4e93d933y/n97ZP3f9GFr7u9tZ+rrfnVtaW5oa2r6e3t3fvz7dHX0afnq+23y7lxr43// +3d/e5dzm4O5s8uR+ZO5qbvJe+25fXfJmXWtlXVzr3+x5cnPmZ+LSaWdvd+za4PPt6upueeHj +Z3t4a+j4dexoWuTga11YV2/feGVw6F1X291mVO7P7FnSwF5L6c75W1hs7F5Z7dz7X2/Y/uxo +4tlcWXbecHTu4njxcXd1blhRWHPbdv/j+encdvXR3GPj32pjV2xocvv95vtfY2leV2rb6O76 +9f5w4u7p/Xjw5/BZWl/o6mV55eNnW/rW7Pre0t/l+W/5Ylhg7mJQXmX44XH71dpnWuPiZ1hp +6PteYNnYb3N5fvZt8+x8d3Jo9t3o+Nzd3/lcaffvc/f7aHX5cXNu8ejv5/NgaHxlX+92ZmBb ++WVx5e7edfzj6+Hs3djn3eLo4G34YFxtaXNYbV5VYVpnXF9zWV92bXr03tLWz9XW09bHy8jK +2dDb29HOyNNdOiwpJSYtPM+5raqutctfRDw+QE/uy76+u73GyM/Ny8S8u7u9ye08KyIeHyQv +VbysqKitvXM+NjAxOEZ7x7q1tbm/yc3LwLi1sbK2vu48KR8cHSIuV7ippaivwFQ7NjU4OkBP +6Me+uLe6vcPGvrm0sbG0ushTMyYeHR8nN9yzqqmtvPBDOjg5OTk+TG/KvLSxtrvBw723sa+v +srfCWzIlHhweJznataytts5ZQj0+REc9P1Hsxbmxsba7wcC+ubSys7S5v/I4Jx4bHCM15LWv +r7vZXk9YYFVJOzhBbcSzrKywusTNy8G6s7OytLrNPScdGhsiM/i6srfGf1pt1s3qSjgyO+y7 +rquttMHP08u/urWxs7S0vF0sHhkaHixXxLu/zdvRwbu//DwwLjrPtK2tsbvHzsvJyL+6tbKx +r7DENh8ZGR0oPe/U3dPBuLO0vlY0LjNEzbOxtri5u7/Hz9/XvrWvrrCxt2sqHRkbHyk5V+DK +ua+vtcVgPDM6T+HDury+uLa5xdrn+sy3rqyusbO8SiYcGhsfKTtrz7+zrrG7y11BPEdv/OLM +y8G0r7XKb/nYv7Gtr7W2tLtLKBwZGx8oOVzQva+rrbrOfEw/QUlDQvK9sKyut9RQbMy+t7O0 +urasrNMnGRcbHyc3WtK7q6SputlkSz08Pzw6Z7WrrLbGZUhlw7y+vrmysayqvysZFxwiJi5L +zLmso6W4fmJjRzk6OzhPuKqtwuX6af/JvsPKva+trq21QB8YGh8lKTzRuq+opa3HbWJLOTY6 +PEHbsq660NHN08/EwMnCtq2ur7PSLBwaHiQmLUzHua6oqLPR5+RNOTU4NTjqta+4vr7G0MzE +w8e+s7G3t7TcKx4cHyQnM1/NwbSpqLG/yuBFNTEyMTjqsqyyv8zOz8m9v87Nu7Kxr7DZLB8e +IyYnLTtP0rOmpa25xudFNTEvLTFZuK60vcHHxLu3wt3Wv7i2trjOPCsoJygnKS47Z7utq660 +u8ppQTgxLzJA0r28v8K/ura1vdLd1snHxb++z0s3Li0sLjA2Pk3uyL27vMDO7ltQT1dhaO/x +bGjxzsPCx87c08jBvbu7v85kS0VEQTs4NjY3OT9KUlVd9dLIwb/Ez9zpbl9j79bW3NvUysa/ +u73AwsDCzd7oXkY6NTEuLjI3Oj1EW93GvLu+ydXe4e/y5tza4t7XzsnIx8fGwbu3t8DQ3mdN +QTgwLSssLjE5RF7XycHAv8PJz9PS1Nnm6trW0czT1M7Hvru3trm+zellUkQ4LisoKSswOkNQ +6crBvbm5vsbMz9Tk/Wr66uDV0M/MxL68u7m5ub7a/1Q+Ny4sKSgrLzlFVd/Ivrm5ur/M3O7p +5On2ZW7l3dXW1MzGv7y5tra2uM5LQTsvKissLC42QlnnzL+8vL/Fydbtbmjz+Hft6+7239zd +zL+6t7a0tLS3y0QyKyoqKSsuN0/QxMbHw768w+NTSkxXU1bz3Nzc0c3OysK8t7OytbW3vLvF +OSMhJigkIy1OvbW4t7GvueRFPURKQT5Py8C+w9PIvtJRacG3ubq6s661xsLMMCIkIiAkKDXI +srm6ra/F5FdIRkE3Pt3HyMS4tMdhTlftZ2jGsa2ys66uuL3OLiAgHR4lKji9rbe2rbjcXkVC +Tkc6UsDGw7y6uM9BP1VPQ/24rq+ysa+wvM/KSyUgIx8mLDPbrrPGtbTVWEZHZl5BRca908fA +ycpMMD51Ul2+r6uqsrevtszQyTwmLSQbKDUxZbS5vLLH5chSPWfrREnf2cvFzdrP5zo/b23e +v7GrqrS6tLrL3eJlLycnHyc1M0O9sL3Cwc/USjpRfElFXNW+xNbCyGpCO1Td6NO1q6ywvLy7 +yOx6wMIvKjUkIzEuNb6267+8bvNTOk7gRD/dx8C/vbjcT1E9P2XWxLGtrqu4zb29296/vzoo +KB8hKyk5vrbKw8Pf108/bt1fZNa+ucXMvtFBNTdFddbArKeqsL3ExdnhzM7PPykpHx0uNy37 +rb7Jv8zCzDxEv85GYcW+xnXV0DouSWhRxrGqqbC4uslc5768xN5JPi4bGy40Lke/rq7XTLy7 +Qjxa39RPR8K27FjIeDk7T9q7trOsrbbDz9DMyMS9v+I8LCQaHCw0Pti2ra/XWsXjQUBZzMTy +aMK50Gja50s1Nce0w7aoqrfdVsjI5MW3u10vJx8XHjI6bLWsrLVpV89YQVnezMfracm+03Ld ++0g7QXe+sbGvrrfRc+3Xx767vVYwLyATGjpMT7+poqxCOcfLOzn2tLLvRsq5+Uxsbmc6M9+5 +urGsr7bNVNfL1bqwvnI6LSMUFjRiR8Wno6pZLlzHPzfTr67HQ1+9cDlO3XVJO1K2t7utrLXK +VE7+dcyur9dHOC0fFBk7weC/pZ+tQS1G1kE31quqykBQ1k87Q9fA7T9Mu7LAuK2uwEs9WNxs +u6u20TssIhQULcnBs6SfqE8nMVVERMisqLhFOFVZPULcu8VPS8a4vLu2s75XPEFOZb2qrL5P +LiseERlisLuuo6KsNCA41UZFu6inwDc6d0cxPM68zlD/vLbCyrmywUg+Ze15v62suzwrKxsT +JOzOsaSjpLYuLUY5MlG7ra7OTGdLLy473b7LyrKwwMzOv7jTSuHaTFnFsa2/e9ktEhQnP0XK +ppmcyzVFPSckNryrtsi8vGw0LkPbWlu8sLnDv7Wz0FHZ2EE517S4zN2/vjsaESC7NSepmJ+2 +TErELxssvsTU1bmovi890U47S8GssMu4rb9Z/MzRQzjXulo52L1o6PknHTk2IzHLs629zayx +PzpvYz4uOcLEZNOyrbrhzbvMWW7T09jPxsxfSVPpUDpUzE078cXLyk0zTlApL0lKb+pXy7xq +Sv/QxM3XvsJ+cXtkaX7LvMfZxL3F2mnx4VQ/SfLiX1jx1N5PQ0lRR0BR5dXV0tDsTT8/RERS +3szH1eJuTUdEX9LExMq+v9vle1re1GdVxsLK3cu/4U1TUUdDP1zR3tm8vdxQSD02Mjx0Z+i/ +xe5LNzY/P1nFu7W40NP1TOvL0sjGx8dt9cHE1MvG3URDTj5CYMrHf1f0VjlDTFN2fG3C3T9R +Ois+2FZiuq6/UtvIaklbvLfNyrzLbWzdzt3e12VERERa5GrFyU5PPzhIXX/M5WFdWTw5RfZi +c8DCcOzHd0/fxtDQw73G3dLH3UdQWkVET+rOc+rA1k9x2XFVT+FgQE5LREdDSebbcuvZyNVD +679hYsPI49jLv8v74stiRmTOV1DP0ubw/vxUUONaTVFNWEg6U8vzW83ZPDx/Qz/IxsO45fDE +XEzPwsPCycPSTVH1WH7W0spiSF5uU3zh08tOTVxANz1NQj3ev9tHa8JLOd3BaPG7xtjb08rU +1L/J2MnhV1h71OhkzcpMP1tYP0/GxvhUe2A/Rkw+Rz063M3x7M7I+D9I4dPuybe3ysvD1Wfz +z83Xd/LL2Gbi/URc7UpBf85UUFvnTT5zfDk/WGZ2QDtaXkncwcK7xs/P8GHlzL7Axb7D9G/d +3+HZ3kZA2ts/arXaNkrSWTIv/Mk5S7vOOjBBSzdEtK/KybtvPT7ZwdC3rLrh0sLMYl/gXT49 +TUlatbLJxH08NS4350xJyVYyO09FRtC3xOjL1VNV2L+9wLm7ytrSztLfWeXQQT9oS03Ry8nh +PDU7LjNM8n5NWt1CRszJxra+xtNW+8vHt7S4v9vyW0LRuVJFzOM7MUe7SSlG1DQrPHY+OeDO +4sK6u8HRzdhY3ru6vbS0vszX7PlYQlTe1P5CQlQ5Jyo5PTk/bMrNT++6v9W7s7zf3r/A1May +tdHx1dtdRVu7utM6JR4lKSIwta/v17nKPTvStcDFrKu+dcOxu8u4udZb6PZCabe9LBYlORoZ ++aarzcKpxSQsvrzovqWl3E61sM3QuLbZQWjB0M+x2hkZLB8ZLqqeq8KtuyojNOm/xq6fr1bM +tsZk6Li3ZkHGr7/FuSoXHR4cJ9qhm6q1uTcdJDjwuK2kpb7oxNJa7b23xuPFr6+0uR4UJh8W +Ka+dm62yrC4VHUJq76+bnctGvb5ANtitvErJpKetvh4YJBkVMa2dmaesqTEVFiVkzsadmKxZ +YexPMDa0rM7Nq6GhvxwTICEYJqqVlqavqkEVEBxEw76jl5/ZQV9NLCraq7DKr52dsB8NFywa +Ga+Pj566rboZDRU3u8qtlpm8R1pOKx82q6vArJybpiULECsdFtKPjJi8sKsfDBAqt7rFmpKv +OUxNMiIosKC6tp6aoDgODiUfFC6XjJOrtKkuDg4d3LHIo5KeUDxBNSYh35+quKOanV4UDhsh +GCKijY+frqlvFQ0YNL+6rZiXtzw+MiUiM62ir6mcnLIeDxUeGh3PlY2Yp6a1IxASIUvDsZ+X +nsk5MSgjK/Cqp6ignag3GBMXGx4sqpKSnKCpTx0RFClfwqqcmJ/MLysoJi/YqaKjoqGwLhgT +FxsgNaeUk5mfr0ofExQkTtCvnJaezS4rLCcp5qSfo6OfrDsaEBUcHyqylpGWn6vCKBUTGytK +wqCVmbFLNzAoIjaso6qknKDMJRUTGRocQZ+VlJidp3MgGBYXIEW4oJqdqLhKLywtP76uqJ+f +r9ctFxQZHCVFsZ2WmqOouDwiGBkqRj3NpaGovGbJyjg6uKemrLjB1y4ZFyIuMTjgq6GnsLW6 +2jwuLjlo8kZVytNlX+nFvsCxpaaxx1Q3LisnKTlt6lFTyrvSQjxiw8XQwLm+0D8uOVA/Qdm6 +rq+5sa/PSVhcXe19T0Y/PDQtLTI5RWnKsqmrtb9hPz4zLkTJysW4ubvB28ayt72ys81XNCIe +ISIhKku3qqipqKe1SjQvKSw7R2y0rLfBvL3Cw7+vp6y8v888KR0YHikrLlytpquxt7e6Vy8z +PzY4W+nfv7vDuq+ztrOzsbPB9WlENTAlHyw8Mis6xbi/vbOtq7lUQ0cvJCo7T8eup6Kkr73B +2Ug9SW3Sx8e93SshKCYdHS7MtK+ooJ6lwTouLykfK8mvrqmhorBsQkJEQkXQrqmxxb3WJhoe +Hx0eK+6xqaWjpKWv+zo5Py4lNb61vrqtrMBl68vLeHvBuLvEzMToKBseIx4bIk6zq6Wempui +tl05MyoeIES5wsyrn6rbWNXVRTlZvrq9vrm+Nx0bICAcHzy0qqaempqgrss/LCYjHyQ/v8PO +rqGp122/xEw/2Lm9zcS7w0YmHSEpJR8qxaamq6Odn6/kSjsuKiclLErfXO6yp63Dvq+3fEzY +yl1DWca+y1o6NDk0Jh8pWcHOxamdn66/w+wyJCAiJjFYyLSnoqm5w8ZvNzd0xdTPr6OltNpM +LR8dHh0eKlfCvKyem6GutLd3LSMlKSkrO+i+sq2srq+yv+Pnysp77Lqus8PcYTchGx4hHx8t +x6yrqJ6anq69yFAtIB8jKTBF1Lmsp6etsrG67kFCX/JSUsmysMLs9UcnGx0lJyIr06moq6Kc +navC0GYzJSMoLCw0XMC2r6yrrLS+zv9WRz9CUenEuLO2vc1QLyIfIiQjJ0K1qqqnn5+mt8bV +SC4oKSoqLDlS4MOzrKurqq++3v13Sjs+UPTRwrm2vuRBLSMfICAjK024qqSem5yirsZKLiEe +HiAlLk3EsaegoKWrrrjkQjo4NzpJbtnEubnLYEk6LCMjKS8yOX61q6qqqKisuNlNPDIsKSku +O1bYva2mpKirrbjqPTMuLS0xPFfGsq6ztLLHOSgnKicgJDnPvbmsop+kq7G/azwwKiUlKzlL +ZsSup6esr7C55jwzMzMyNkTZuq+sq62zw0wtIyEjIiAnP8W4tKmenqWvucJULygmJyktN1XF +s6upqqyvtclNOTY3ODlDbMm5sq+usLvYPislJCQiIipEzb2zp5+fpKuvvF0yKSYkJCk0Sdq4 +q6eoqamtv1g+OjYvM0Fgzbuwr7O2vOk3KSYoJSAiLlvKwbKln6GprK67WDMrKScmKjJA+MCx +q6ioqa6802RGOTY8SFP6ybm2vcjN8jsrKSsqJSUyYdLOuaihpq2tr71QNjAtKSktNkBsu66r +rKqprr/a61lAODpASWjVzcq/vdc+MTMyKSImM0ZKZbqppqmqqay1zk46LysqKy84S824r6up +qay0v9ZUQjw5NzxO7tXS1dLWSzMvMzEqKTh12tm7qqarr66uvGtDOzMtLC0zP3XHvLKrqay0 +usDnRz4+PT9HYu7w0MbiRT08Ni0qLThASu68r62trKyvucxeQjgxLS01Pk7lv7Kurq+ytr3O +/lZKQ0RRaGFe39hNODU5Ni4rMUFMTfm8r6+wrqyvvNdbSDkvLjM4PlDYvLOvrq6vtMDWeFJB +Oz9OXl5gfNjzPDI6OywpNktBRcu1tLSurK+4wtdlPzMyMzM5R3PIu7SvrayuuMLSYUQ6NThA +Pz1NzMTySUXw2DcqOUw7Nz/qv8PMu66vvcq+wV49Ok5iOznXucnfva6zysm+yk89SFc9OEtu +U2/Iw8viSEBSPCwuPzwvN2/M2c67r666wbm601Vv2GJETu57YPLHvMjZvb1fX81bSVxEOkvw +QD7ZzlXawltD7lE1Oz82OkQ+S8/Rz7mwt7u1tb3U1M1PTk5LSO9cV8zMccq76ujR3Ul9S0VK +UkRNbPTp8Orf/VNPVkg/RUJLT2Ff1svDx8S+x8jJ3OV7SnNrZl9izNLS3Lve0ddfb19TP9xD +Xj/YTt5O8exd6UjaRtpJWnXubVa/9szdztXV527lTvlLalB152Pa39DT2tVn2tlWYON4Wmnm +d2neUdBd51Zs4EbeRs9J6Fnd31vJbsVd0+/zamBs6lb0Ud9Mz1DZV9xw5PVWyUfJRb5DvUy+ +T8pO5XBX4D7CPcU4u0LCWtPZ7sdJv0zFQs5PX1Rd2UnTUc9W3Fjn9VbjV/JZ5GPp6vrf2vPl +/Pps5W18W3tfeGL43O7V8MhmymjSWOZmWOFO90zZWv5a6Pz8YO9tfG1t43DkX+b98X5l/l5z ++Gxd4W9zZO162vbf0NrV69Jz31TqXW1O8VbgXfpi5uls5nPr8WR8etxT0F3SZv/tZtlS3FPW +U19pW2Rj8Gjid9r00/vX6+P1fHtdZl5kZuPp6efw2Ovo4ujna/tgc11mam7xauhy3lTrXWpf +XWBrbWD77uzn19fQ5d3641xtX2N4Zvl58mHyZdl+6Ofo92j3XHZrbnXtb9710e7abdlf615g +W15fVuBV3m/VXthn7WzsdGb3XOVW5mfcZ9zu2e7j6OjfdOxvcGb2YX7qZeNm5VjoVORRZXFf +72Dcbdl35N/03Ojd/e5mXXtT3Vntc9xi6PbaeOBq32TqaHLvdW7u+/l293j9XHpl62HyZeh7 +duxu317uaud2Zf5q6W55dnp88v777e/83/bf9//u5/75/+dvbPT1aHtma2Vuant8e2d0+9ze +5uf15HRp4HNuXPlsfWx+aOld/1/9efrr+Hf6Zu5833z37nTf8dd75Hh3dmvxYOhi4V/mbPf5 +c3Rs+FziXepg7XRt3fDke+X+33PmeO9cfmZudfJg21/kW9dU11DTTNJI00zSUttjz3jZ5uTd +/d5h1mDbTtVM3VLcVuRbbett6mDcWe1nd13edHF24/Pp3OPf8OlwZvdo6lpzZut5/9jy7fdv +f2n4WWdmX2Jpc+3jY+je4X7r9e3fbelv4Wp3YvhvX21u22T4ZNLp3vvd53Z5buZwaFv9cHVs +6+3i9fhp3u9oVFtcW1RUWnZtX37d1Nfa1c7Z5+7ibWpaX3FuXmT76ebd2tPV3tvm6vxlUVJK +SUdHTVp2e9fUy8/R1tHi6GliXFtRV1led+nb19TQ19zY2up9eGdfV1ddaWFhZnRu+P3pfmtj +aWt+bXLzf3Zu+Wxwb/D27PLd4Orn29fP0djp5/FkUVFUVE5NWPrs2dXP1d36d3puUk5YWVZa +fuLZ3tjY2uzo+n1eXV5jY27x+OXd1dfQ2NrscmNdXWdqaHhvc35qbWpqY15iXFpcV1d+3+je +0tja3ejf0+b1+PXv/Gz79Gtr7+jta2Rsd2RebvXvfm/96/5oYnX9al1offH28/jr83D029t+ +cPHm7nx1+HV9e+z1+WxqdfDy9/Xp83N38PV2b3lxbW5qZW/3e3fx9/zt4+DofXj483Zva2Fh +YHDu6/bu5+nu8Pn8+XP//m9se/n6/uvg7e7t7vTy9nd3eG1mY2Bobm5senB28O/2+3p7+Pnz +6+jh/Gf/7fj87/V7dHvw7n1md+/vfPj2/WRfanVvbfPnfG/9fXxvenx8dX7s/vrv8PPt6u/r +8ff3fe7l6fD5/G9mYm9mYWFpdu3t+vh+enR3al9eZWdv6tva3+bm8Xp5+PZ2bu7o5vHr5PB4 +a21ra2FjbG5t79/i9XR6cGFs7Wxh7OV6e3j99Wdh7ON58OXv+2946/BsaXZ7bmt89XVrd/N+ +9unk7f5rb/H3/vT4d33x+Xz19XZubG95eHdtcXlybnNvb2ps7t/h5t7ob217e2prePHv/PPh +4v7y+mtgX2t8cGX03XZd5dh5Yv7o5X504+VoXnFtVU9ldG733dHZ7urg62RhaGZbXOfa+X7V +3Wnn3Px0c2huYlzu2+pye+X3aH7k/15oe2xaVXDqZF7s43r93934a/jjfmN36O/15t7fdG7u +4+/z4N/w7uZ4TkptW0FQ2Of+08zP52rm21hMaGhNT/nfff3Y0ed629l5buLd9eXR1ezr09Zz +5+JGQFA/OlJ8XuDNy8XN9eVvSElVVldw283N08zN6mJva1Nb5evuz8zU2d/qb1dWXFpcbOr9 +++H6e1NGX1c8TNtgXs3IzNLe1d9VUHVeTGrb5NrR1NLaddrhUF7gbGLe2eTb59zOcGLR7VZT +SEA/Pz5MbP7Yx8PJztPkbVhOVF1gbNzQ1M7Q3upvXF9mY+bT3NvP1uXi8G5pYfzc5uLaVkdB +O0BBP1vQ3tG/xs7V6GtXTlNcW2bl19vY0Nni7G37+W7b0d/Z2uvkflzi0V/myN1lVkw8Nj1A +QlLUy8nCw8nTd11VSktXZl/o1NbS3dnbXW7hbG3W0dfP0czaZdLMY9/I9FtNPzg0NzxFU9nD +v8LGy9txW1FJSVr259fJyNbs9XFaT/HQ4tvCwtLMxt5t6urxYlxbSD02NDs8PF3Gysa5u8nU +8lVJQUZPVnbPysvIz9fcXF/b7eHFy8/Dxc7O3OjSZE9wRzgyLzY3Nk/Kz8S2ucTI12lOQERL +SlHYztnIx9rX7Vby23HRwMXEw8bEzeXVz2VIRkIyKjI5Mz/PwcO6trvMeV5QPz5MTE7vy8rO +zdbd/Vz84dXJw76+xMTD0ObPzmpQTEc2LCw0ODNNvsDGtrTF3XZURTxEV01ZzMfbzsfX6nTo +3+7OwMLAv8jHy/HZ1WZ4X0A+OisqNzc1Z7q9vbK0wt9kWkM7Q09IVczL2dLO12Fb2+L9xb3D +vrzBxM7j2e3oakFESC4oNTkvPsW8v7evts30d0k4O0ZFSOfGztPIxOxS7d5d7b/AyL64vc7M +ze9qbURESDMsLjo3Nme5v8Kwssjd7FBBPEBIR1POx9zSvs1LcM9gU8y8w8a5tr/Lzs/6VkxD +QDotKzk4Mk+8wMO1tb/Q6WVKPUBMSEjsy9HUy8bZW+bQe+zDwcO9vr7D2NzPX0dKQTgtLTMz +NUzMw7qxsrnF22ZKP0NFQ0lk4trY2s7WWGLa+/zHw8G9u7zAzdzW6WBSR0c5LS04NzhfxsC9 +t7W+3O5mQjxAQ0JN7s/W3c/L31ni0OnUv73AvLu8xt3Mz1RLSTs1LSgwOjJGvLy/sa+6yOBh +Sjs9RUJH+M/U1czK6V565Pjjyr/Av7q6xNDM2WZTRUdCLyowNzM6zrm/u6+zyNfrTj07QUZE +T9vQ4NbI0mJc3dxq2Ly9wbm3vs7a1uxVT0Y/Oy8rLzs4Q8i4u7izucpzWUw/PEFIR1nX1eva +x9lW38zu4MLAxL67ucLa0dFXTFFBPDIrLjY2PtO+u7a0uL7XaE8/PEBDRljf1ejhxdNMdc5y +7cO/v726uMDYztFRTVJCOTgvKjI9PUrAtbi2s7nSXVBNQT1HT01lzc5+3slfS/7s8NnIu7m+ +u7XG6NBvTVZKPjw1LS42O0nnv7e4ubnA311NREJARU9Tec/c7tHPWlTf3d3Jvbu8vLm9493I +blFPOz88Kio0OTlevrS1ubS52VhXST8/RE9PWs/Mbe3Te0xizs7Txra4v7u6zXvX6VZPQD0+ +LiovOz5Gy7O0vbi3y1hOTEY+QFhiVuTL4vXN401f49rNxbq1vL62wHLe111TQjg/NigpOEI9 +X7euuLy4vftGSU9DO0zta2rOzfxg5vVKX83Exb23t7u8vtZ++V9bTTw/PCwoLkVAQ8Cttr+5 +us1MP05WPkH77FrlzeFbWvFRT+DJwr+6uLi+xszc4OtcYVQ7OzwrKzo8PtG7ubO8wMF7QEpO +RElOZej12s5pW+JrT3rLwsHCurXAysHVZX5nf2pEPDsvJys8RE/Esq+1vsLIWT5FTUpKWdze +79bqXepYRGXS0MO5uLm9v7/YVePdVWr9Rzs4LCguOUjXu7CutcXM20xAQ0pMS1Xi29bSblpd +WklP1cG+vri0u8XGz2df8e3ba0E9OSwkLktN7LqtrrrZ09ZANkBVU01c1MrV7PftZElJ2sK/ +vrm0ucnNwdtSZ+rvakw/Oy8mJTNLVM+yq7C/2tPvQDxMa15Z4sXE0XRaX1lFSdnAv723tr7U +1s9lTWvPzk9DTjgoJC4/RmS8q626ycrWSDlBXFxRYs/Hzdf+VVJKQVLGvLy7uLnH7NrRaVz6 +18zkTD02LCQpP13Wua+uttlbfks9Q1N45e7QwsngXkxKSkhbyrq0trq9yPxr+lln0s3N6kpB +NykkKj/x1bysqrjbW2JROzlO9mhc3cTH31VFSlFCWb6zsrW5vMhiatj+Zd7Ov8dUPTcrIiM0 +9tTBr6qw2UZPWTw2RuLO2+DEvMpjSEFET1PSsq+0u8TO/E9a/33VyMjR4Us0LSUiLlPbvq6r +r8NSTVA9OkNi0s/TwLzOcUM5RUlI2revsbrCxm1IW/t+0MLBvsVONi4nIShA7L6xra25XkFG +Pzo8S9fL28u+xdxPOTtJTei4rayywszZT0pg7NjHwr7BXDUvKSAlO2fGtq6rtO9HST85O0nX +xs3FvMTaUjg7SUj7vbKutMbK1U5NeufQx8O7wO48MiohIjFsyLatqrHZRUJBOjlF38jNzb7A +6009PEFNcb6vrrG7yO5SSlrm3ci/ur5pOTMuIx8u4tDCsqmqxT5BWD02Ptu7xNnCus1NODdN +SkjLsayyyNDNWT9M2MrKy7y3yUMyMCYfKUzKuLCsq7tNQEZAPDxWw8PSyMPQZj02PkNM47uu +rbnK0nxLTejPxry7v8xaNi0nISo8Wr+vray4cElEOjk+T8/N0MO/z2xJPT8/UMq5sa+1vspp +Tljr39rCvMHNajktKSAkOFLRta2rseVLSz85PEzRxtnIvcntUkBBQ0jevbKvtLzMfFJQaOHP +w7/BxN8+NCsiJC8++76wq67GXk5EOzpE48vPyb7C1FtERUpETcW1s7W6v89cUHzs6M3Fvslf +RTouJSUuP2LItaytvO9fTz05PmbP19vKx9JlREpRQ07Qu7W2vL7I5ffl7d/OxMfQ1kUwLSUm +MjxYvbKursLe80U8Oz1WfnDNwsjOdU1TSERg1by2t7W3wtLg4+1w3MzO1VM6NSwkJjRFZcq2 +rK7A0tlfQTo/XHFf5c7GyllWXU5MWtW8uLu5u77E3uvU093j6+lINTIrKi4zPuPEuLC2u8Tx +UUU+R0pP++vfzONr5lZVcvnMwr+6uby8wtXR19vVdl9KOTcuKS0yOVLZvrGzubnG6FdBQUhG +TVZV3dlj39tk63XvxMPDvLu7vczPzeLg62pPRDwxLi8vNz9M0L27t7i8v9hVTkhFSEJEV2Nj +9N/Uy8vJwL6/wMLK321US0xPWHfi3dna5G1PRUFCREhPZfb36+bt9X1tc/L7ePvt8WteXF5w +++fTzcfDw8TJ0NnueuTa2Nfj62pPSUVAP0FCTFJRXfft73lt9XFma3nt5PDy5nhpe/Pg183E +wL/ByczN1d7n4dfed3NaSkM8Ozw9P0dNXH324N3k4e94fnZ/7Pj/9fTx6eje1c7KxsPCxMrO +1tvd4N3g+l5STEdFPz0/Pj9DSlt46drZ19TV3uXj3uZxamNfZmZv7d7TzMfBv8HHys7Z3+rt ++2phVExIRT8+QURJSk9cdOng2NXZ3N3h6fJyZl1bWl9ufOnd1s7Iwr/Dx8jO1tnd3+lvZVxR +S0VAQUA+Q0lOWW979uTd19bZ2uju9mFYVlVXX2zr29PMxsTAv8DCxMjN1uPsbVpQTEU/Pj5A +QUNJUFtz5tzc2tjY2NvudGpeWFJXXl9s6drPysbBwsTFyMnL0tvmd2xcTktIRURDREZITVVa +XX7u8+Db2dTW3OT0fmlVUlddaXTk19XPycTFxsfKzMzR2+T+X1dQSUZHR0VER0tNUl1sev3s +5tjY2Nfd5PN3XVZVXWZq897Wz8/KxsXGyMrKztnj+2tdVE9MSkdGRERJTk9VY3Z7fOnb3Nvd +6fH193hnaHnu6vh469za09HOz8/Nzc3O1+Xm6nloW1JPTUpISktMTE5WXG/25Nre5+z3fX1t +Z2Vree/o4tjT09ne29fX29zb2tLX4O7+/3ZrZmJdWE9LTE9OTlRaX2h78PXs5+/s6Oj3fX56 +6+zz7ebm6Ozm3d3b29jS1tXV29/n6XdpZ2RcVk9NT1JVWVlaW1xaW11jYGr58+/o4ebi3dzb +1tba3uPd3drV1tjd4Ofk6ebl/Pn7aWhkX1pST09QUlRSUlddXmJseH78+PHt7d/b2uDp3tzf +4eTo39/b2d7f4N/l5Orn5evue31+dm5gWFNQT09NTlFVV1pOR0/03+TPwsPLysjQ3t34ZFhS +T1lhb3bby87PxsXP2dfxVktFQEFDQ0VLVGHg08/PzczP1tzo+2ZbXWFXVV977OPSzMrIysrM +093k+FtTTEdFRUZFR0tXa+Xa1dLSzcrM1eD//mteWVZVWGBqbu7bz8vOysfJzdPd91tPTUZD +RERFR0xVbebZz8nGyMnM1+P4bF5WVVZTT09UW3Tg0czKyMTEyMzY/15SSUZGQ0NESE5SbeHZ +z83KyMjMztbg92leVFBVWFpibfzh2dHMysvQ1+JsWlFMSEdHRUVITFht8tzUzcvJyMrLztPc +73RkWllZWmNw9eHW0M/Q0dnpfV9TTktJS0lISktNVmd85dfSzs3Nzc7P1eF3dnxtbXF5c+7c +2NLOzdLa4flkVEtJRUNGSUtNVFphb+7e1M7O09ba5e59+vr47OTd2dTQzc3LyszU6W9aTUdF +QkNERktQVl998+zf39rb2dXZ2t3k7Hdoav/v6uTd2dbNyMnLztj0XE1HQ0FBREhJTVdibHfh +2tbS0NHV297m6+7m73Rqdejc1tPU08/Pzs7T3vtjUUY/PT0+RUtLTlhpe+/h29fPysnKzM7U +3OZ+al9fYmz34djQysjJys3S3nlaTEI9Ojk7PUFLVmjq2NPPysjIysrJztzkfmJaVVRZW2H+ +5NfQzMjGxsjN1uduWks/Ozk3Nzs/SVjv1czIxcHBw8TKztbi/mFaU09PUlhh59fPzcjCwsPH +y9X6XUxBPDk2NTY5Pkpc6s/Fv76+vr/Eyc/X7WldVlFPUVRaX/fZzcfEwMDDx87daVFEPTk1 +MzQ2OT9NbdrJv7y5uby+wsbK1OtdUExJR0hKUWLiz8fCwL++v8bM2mRIPDYxLi4wNDxKdtHF +vbm1tbe5vMPM2HtXSkM/P0JIVHLYy8S+vby6ur3H2Fo/Ni8sKysuMztIYdPDurOvrq6vtrzK +c01BPDs8PT9IWuDLv7m0s7W3usPQdkY3LSglJScsNUR4yLu2sq6trK2xuspeQDk4OTtAR1Fq +2cW7s6+vsLS5v89kQTIqJCAhJCkyQ3vHuLCsqKioq7LEZ0E3MzM1Oj9GUPfJurCrq62vtbvG +1mJALyUfHR4hKjdWy7y1rqmlo6SquN8/Mi8vNDg8P0VV1bquqqmqrrW8wMjSZjkpHxwbHiUv +PmzJvLCnoZ+fprTxPDIwMzU2NTc9TdC2rKmqrLC1trW4x2M8LCEeHh8iJy44VcOwp6Cfoqix +yF1FOzUwLy82RHDNvbWysa+vsbGyt8HqTTstJR8eHiAnL0HZt6ynoqCkqrLGYUA6NDExNT5T +387Eu7i2s7Cxtbe4vttRPS4mIR8fISgyRtO3rKmmpaest8pZPjk2ODs/SFV03Mm8tbKytbq8 +uba5x3g/LSQhISIlLDVDcMCvqqenqbDD9E1APkFGRkZMXfjTwry8vbu8vLq1s7nF5kcyKSQi +IyUqMT1Uz7murKqrsL3SbldNSU1QT1Bm5tPJyMfJyMnHwb+8vcLM7k08Mi4tLi4wNj1IXNjD +vLq6vcbNz9HX4PtmW1haXGZ76+TVy8O9uLW2u77J5ltLPjc0Mi8wMzg7QElWaurUzMvJxsPE +xMbL09fY3d7a1dPNxsO/v8HEyc7X61ZDPDk0Ly8yNTg8Q0pTdtXLysnGw8XHx8jN09HR0tTP +y8rGxMHDxsfM1eR3WUhAPDczMzU3ODtASFJv4tbPy8fJzMvKzdHQzMzMycXEw8DAwcXJ0OLv +clZIQDs1MDA1ODo+SE9Xd9bNzMnGyc/QzMzSzcjKycO/wMC+v8HHzNhxVUo/Ozo3Mi8xNTg+ +S1pw4M/LysrFxszR19fW1c3LzMnEwb+9u7u9wszfXUk9ODQwLi8xNTo/TmXm1snExsjIytLX +0dDU1tDR18/IxcC+vLy+wsjTbU0/ODMuLC0vNDk/TF/qy8C/wcHDydDTztHTzcvLy8fFwb69 +vb/HztXuU0E6My4rKy0vNT1LW/fPwLy8vL7FzM/O0tXOzM3LxcPBvry6vMXM2GRKPjk0Liws +LS80OkRY7s7Dv768vL/ExMbJy8zQ1c/Jx8bAvLu+xcnUa0s9NzAsKyssLTI6Q1Tjxr++u7m7 +v8LCxMrKyMzNy8rKwrq4ur/Bx+BRQjoyLSoqKisuNT1IZtnLx7+7vb6/w8fHxsjDvbu4trOw +r7G7x2s6LSglIB4jKTBE5MCzqqivvMfbSDUyNT9PUOe5q6mpop+foKjHTVgjEBMcGRQfT7qp +pqGZmaxP7XQjGiIvOj/XrJ+mr6aeprOto6xNOUkjFBkcGh8pP7SnrqabpM5XVC8hISpCVmWv +oqeuqaSstLCoqds69ToWFiQdHClDuayyq5uk0dthMiEfKjg+Ta2iq6ukpKuuq6eryURsORcV +IRsZJEO4s7Kimaa/vN4yISAoMDBIramtp6Klqquop6y3Xz47GhIcGxgdOsO3raKao6+z3jkp +JCkvLUqws7Klpqmnp6SmrKy1PC8jEhYZFhkqVNCtpZufqq3KTzglKTMwP8O1taqnpaWmoKOr +rrXkMh8UFxsQFi9CO7SdnqSoqbFOKkFDJi7OzE6/rK2vp56ipKKtuW5IORIPKBwKH6srNp+a +r7ujpT41uFYsRcdXO9qwxL+ioKefnqy6ukooGxgeFRAqMib7p7O5qau00rq1XN++ZFHiWlnI +ta+rpaClraarXCcYKxkIHi0XJqrN/J6ht7WitlqyujxGz0o3V7rFu6akpqejqLrHLhoyGAwl +HxYuwUS5pK2rqqi4vK/JQ89fN0hQ78q4r6akqaSor8JIICUiDxwmFiTPMU6lubaoq7q6rbhQ +wL05TOJf6s69raysqKistsxlQB8gLBgcLiMi+E0zt7XivKy5vbG0vrzD7MzSZNi3v7upr7Sw +vdhVPjMuKiopKDEvLDxMNjzfWmLEwb2ysrSyub29xcO8vLe2sb7Sy04+Ojo2MDlGOz1OOjw/ +OjVASDtXzdfKu7u9ur6/uLi5tLG3w7rMTUdCNjc6OEFLe1lKX1M/PkI5RUVO98rT2LrG2cK7 +x7mxuLa5wNpkSjs6QDQ8WT1i01Fj3ERGU0c6TV9W1dPM0MjQ5LvDx7ayvbu50VlUQDc3PDpA +S1BdZFlsZUReT0Rfb9vd0c7F5NnE4c/Eu8G8vMLL21xVQDtAOTxVTUN29ExcXktRTWPcb/TM +zXTN1vja1srGwr2+u7/Z3e1FP0xDOUJNO0ttRV7lXnDdaNbS2u/OZnfoTuPufc7Axr26yb/G +Svd0QD9GQjpIUz5WX1pbftZvzPHU2tfeXc5a99nvzcbDz77G2c1rc1NNSktMQ1FOPlBORlRJ +eVD239vP2cnN1t3P1tbRytDEzNDW0F9veWFSWldJXkVGSklETklYWFX28Nr3z83S2M3S49DN +zsvM19TM6nndUVlnTFRmSk5mQlJVTE9c/W3m2XTb7nLk3+Lh39vO19/IzePL5t98ZHtRXVhP +TmRSUmhZUWRgXul4dtxt9efb6/Pe4d3T0s3T3dLbcNlubGtdWVlaRltSUVtYVWVbaXZ96Hnf +6tji6NF609LayNbQ1uPb/+r37GhdfFRVW0xNVU9OW1BXWV1oaGfm8fTg3e3U0dzP0dfQ0djY +1eXk3nLZ5G3X63jY7mlyXUNBRjM7PjY+SkZV29/MvMG9t7y7ur/ExMrOycvMy89bVU8vMDsp +LT0uO+JHfMN5z77Zwr3Mwb/Kwr/IvrzDvLu/vc9OWDcrOCwnNy8vYk1Lwtbmw8TPw73Pwb7X +x7/PvbrBubq+udFaWjAsNCYnNC02b1jiv9HOyeDRy9HJys3K08zHyb65ubW0uL/bXzstMCwn +MDMzTmleyszuzdL81tTrzczWy9PfysfCubi2s7W902o+LC8vJzA5MU3oWMnKa8/bW9Le/s3k +etnk7cvIxre1tq+xubrUVTwtMy8pNTkzVftPzc9c0+Ra3v1m4Oh36vNs18nFuLO2sLG4tchx +ZDIuPCorQTE42FZnylht31Pp5HLh+OPhbd7b0r+8t7Czs7K6usZOTzsqNTQpNT0zSndLW+pc +WuPV4NrO6+7Z/dzMyL25tbO1tbi+vsPMaElELi47Kyw8MzVQS0NZc1zyyc/axM3ryMnPwby9 +vLa3vbq/zcHI1M10Q0M4LTMzLDA4NjxES01Q2czawLzMwL3Fvby/vL29u8DEw87Uz9r59PFb +SDw7MywvMC0zOzxBSlz75ce/v7m1uLi4ury+vr/EysjH0dXadmBmVlBLQz85NDMxMDM2Oj5G +UF7l0Mi+u7m3uLq7ub3Dv8TIydLb3X5ZVlNTTkpRSz8+REFAQEdJRkZQWk9o2c3Hw76/xcPF +yc/l6drZ7fx49XhabHNfWl5XX2tNT2FgSFP+3uZp3MjR7N3U0l1S8ehVUnfdaU9xz/loZs/Y +VlDy501DbM5UT+nAz/vNv8Lc7sLOUFLd9UtJX9tRQFziWj5U3NlMT9nZSkfp1VxUbsfOZna/ +vt9tv77qadXJ41xd3O5LSfljSkJcaE9IVNtpUF7gelle9u1x59vO1M/Oxs7izM7d+eTa9VVg +b11bTFJhUl1OV2BdXmlsZ2xd9Nvc+uTQz9zZ1dLS7ODa2f755X1vWVlTT01NWFdbX3X1ZGr5 +6Hro29DX3dre5Ovg4uzd3N7n293pbmN1XVVMUVhNUF1cWV1ncfdu/dzP2ezZ0dbu4dTQ+mrd +2epgcO9uXFxp6F5bbHtzXl9/alBWZGlgc/fp3NzZztDd4uDd63h1fPxoV2ZzZl55dGhmXGZ3 +bF9i/3Zr+/Z/dunk3djd19jU29vl8Pbr9W1yYl5eYGNiXlNdamFaYWZlal969/xj5+Te5eDY +3ffs1dfj4ubZ6HNx4eplZVtqZ2RYWmtoWFhh7mxhbO/aeffv5OB6dn7d3O358Nz4bfTn6Gls ++d7vY/zf9WdhbW9zVVhk7GVcZfZxaWr86d/s+fXy7Hx66eHg4dvq3d/f+3r//3BkeGtrXWZ8 +929fcPPsX1x29nVabPfqdfbv4uXr+PTW5P9h/P59eHDwb3hiavng/GL/49/5cHro+WVz5uPp +8v326HNu6d9kWV1taV5eYPP0b2rr4nd8/nv75uf85t7e7+rg6nNz+fp9a3N0eWlzb25na2Vi +Ymlsd3Nr7u54bufc6Prz6O3s7ezk3+Ld1dbZ3Njc3uTd6ObnaUo8ODs9OzxGW/HsfN3KytPW +0cvGztzUysjHyMnCxMvNxsPEy1Q1LS8yLy40SOTW3M3Avsh8SktebGFg5sa+x9fSyMHDxcK9 +vL/FxMLPQSomKy8vLzZNy7/Cv7y9xNJWRUhOUlhi28XDztfKwLu8v7+/vsPFxMPlNigpLS8v +LzZMz8O9vb/Ax9lfRDxATl/eyL++v8TAvr/Dw8XIytDQxb/GTy8pKy4vMDM8T9jEvr6/w8rY +dVVLTFly1sbGyMrIw8TM1Nba2NXSzsnGydtNPDw9OTQ1OTs9RVBw18zJx8fKz9XY1+ptbvDe +1M3Q2NbUzcrJxsTFytLW1+9LPDg3Nzk6OTtIaeDUzc3Ny83W4OLmbmF54t3d4uHc1tfa1s7K +ys3NyMfIy+xKPz89Ozs8Oz1CTVr02M7Mzc7W397U2ux7ZWNqd+vh6OPVzMjFwL/DxMXHzNZd +Qj08Ojc4OTk7RE9k3s/Nzc/Pz9LX4XFdYWxxd/3q3NLLw768vb7Aw8rV2uZqTj85ODo6Ojw9 +PD9IU23azs3Ny8zP2uDl6+7r4t/WzcnIycfExszS1+Du7XNdV1phWkpAP0A/Pj9DREdRaPDa +z8zMztDT0NHX2t7i497b3d7Y197m49za29rY3+7u9W9jX15PRERKS0ZGTExKTmFxcu7e1M7O +zs3LzM/T3nxjYGtx8t7U0dXT1tne4+Xwd2NiYFxdX15eWFhSTk9QT1JXW2BldvXu6O318OLm +7OHd5eff2tjX1NLR1tbV2ePf4u97al9aW1ZTU1VZXV9dYWx5dW1zdm9obW1oamhqaXrs3dfb +3uDh4N/c3N3j83l4bGdnX11eZWhhZnD9+/jr39ve3+HudXJ9f294++7s8fPwfHFzbWZgYm17 +cWxzfG5vaWJhZmxsZWj85N3c1dLZ2t3i6OjvfHttZF5fX2d+7/Z4f/X9bWhubXHx9HRsa3Vv +YWNjaHB47uTh4Obl6f797Ojs7ufq7/73/W1tb29rdHh4fHj77/doZHh7bnF7eG798fH7eHj+ ++/337vL98url6Orq9/z0+3duam52cGx0/HN09+7y9vZ+fHNz/PZ7fvf7dGpsa2hse/57dHbx +7Ovp7vDp5e3v5+bm3+ft7/L5c3lzcHZ0dHdvcXRvZ2RjZF9fYl5fYmhsdnH77enk4uXn4OXo +6Onq6OLf4uTj5vDv7X5wcGhhXV1jZ2RfZWdfX2RnYmFzffLo4+He4OHf4eb19fT9/nn79PLq +7vdwcX15cGtvaWZoaW1nY2h2d3P35ODe3d/k6+fsfW59/P94a21w+/5xePrveXlpYHD48/f9 +bW1vbHR9eXv273Rw9ft88e3r5efs7/V0bHr+dXh6e3x7e/3v7efp7PN9+3lua3B1ZWBncGxs +/v5vdXb+9+/r6efn4eXj5ubl7vl2ampoYGFpem5pc3V0/vt3bW159355eHh2evDo7fL09vb8 +7+jud3B1+/Tt7n5tbfb3b2pz/vnt7/Dr8PTf5/j49/1tbG1ta3Frb2lfZWxfWmvu929q/fdr +Zurb6OLd4ePuW2jT1N/e3vHv6Onr/W9sb2ddW15UWX1oXHTo9WxrZWV16en8XmnYzsrPbWPn +7Wt1a1pt6tvkXmvxd+/b8F5eXXJfceNyYX7a73bf+lxv4+1gWPrwY3Pj2dn+ft7c5GpccG9k +ce5vfuP1XFvt1+hy3Nb6VE1Xa/fl2d7pf2x6X23g51xt2v5sY2Dp1Obo1+VyamRVW2f97uLq +Zmds+3fw7e/tem5saGbv7Whv6OTm5O/6+/Ti4vJ86OxiWFhfbOzf6mtv+Pf5aXZmdPp7dWxs +Y+jY2dvd5nRz8Ov6/3ZmXGXv4v1hYnnt93t7bWFhb3t+eerqdn3m3N96X1pcXm/u+3H24NvU +1Nnd2dDU4Xtib9/V1NvvWk9IPzgwLzU/VerNv7/DxcTGz9fWz83PzcvKxsG/wcTDxMTEwME7 +GhIYJC9Tt6qtvruqrWswMj9X0ri0zU/ZtbS+xsLJ3s++wNvTvbKv2R4PDhgpbq+lprG4qKKw +SisiJTi8rLZ/eL62tbW94FfeurvV5sm9sqmuKw8LEyNEtKKhrrSknahkKx4ZHTuyrrmwqKmw +uL9RN0q9t9B5z7+2qJ+4GgoLFSX9pp2jraacnrQ+IxgVHkyvq6ukoKavxkIvNmnGx8rFx7up +np7gEwgJESW2nJqfpqGepL4yGxIWKNCtpqOhoqazTSsrO9y9usHb2relnZ9PEQcJEiytmpuj +p5+dpMQsGhUbMMuvqaSioKO1OyYoO9O7vdtfy6yfnKM6DwgKFjapnJ6mpZ2cp9wmGBUdO72u +qqikoajJNCktSr22zEtbvKmenKgqDgoNGUGmnaCinp2hsjscFRknWrKrrK2npbBXMCov2a+4 +cEn7uaadnbEjDwwPG0uon5+enZ6nwC0bFxsre66pra6pqrlVMSs5yLTAYVjOr6Kdn7YmEQ0P +GzusoJ2cnaOv+yobFxsq5Kylp6qtscNIMCw+wrW//WXOsKOen68tFw8RGSu8p5+cnKGwaikb +GR0u06ykpauwvdNNNzNDyb3SW1jQrp+dpLM3GhIRFh9gqJ6ZmaC3SCgbGR4r3aien6q1z05H +QkFP08x6VVnYrp+eprhEIBkWFhopvKGZlp2wRSkfHB8qSbCgnqa6ZUFAUXTj5ObvXm7Uu6mj +pq7IOCAZFBQbP6ialpmnZSwjHh4oO7+lnZ+w3D82P+zO1dHMZ07pxLKppaq8YC4dFREVKLOb +lZeg0S4jHh4kNMmlnJ2sUjAuOta+vcDF1UtGb8Oup6etwz8lGhMSGk+ilpObtDYmIB8mNX2u +n56ozTIrMXK5ubzE3k8/RXG4p6SnsNMyHxYQEiitmJKXpj8nIyEmLUG8o5yguzYlKT67r7S5 +xnhAOD1rsaSip7VbKx0UEBc5opaTm7guJCYnLDdat6KdptYsICz1rquzuNJNNSw21qien6W2 +PSMcFA8Z7p6VlJ3SKSYpKS49c7OioK9AKCk7vaqsuMljOCsvSbafnJ+qwjYeFxERH7OZlZim +TikqLCssOsurn6PPLCcy4a6or8DTSi0nL+Cnm5qgr1gnGxMOEi2kl5SbrjssLysoLD+7p6Gs +SCwvYrKqq7zYVjUqKUGxnZqdpsEzHhUPDxrGm5WYosI3MS8mJCzoq6GkxTAqRbasrLPE50Uu +Ji7NpJqan61pJhgRDhEnp5eWm6jaOzcqHx8xv6iksEs7X7yztLfG21s4KyxSrZ6bnKa+LhwU +Dg8a0J6ZmZ+s2kQvIB4nULOrrsTdy7u3vsHK3l09MS5BvaeenqCsSB8YEA8WLqyempufrdU7 +JR4iL2LAuLW2s6+1vcfN3lVBNjM867Gknp6nyCgZEw8UH9qonZmaoLJeLB8fKDZKd7isqqqu +tsLI0FpCOTc6UsOuoJyfsjEdFA8SGzXLpJmXmqK2PiklIyQnMc+vpaeqrrW3yN9PPTg1O0i/ +pJ2dpHQhFRITFyM5tZ6Wl52nvU8xKCEcHjPQrquoqqyprrvcVD40MjVJuqWdn7E0HhoYFxsh +OLqfm52fp6687jMfHCMvU866tqukpaqxvvhGOS0sPMetpqa4PykkHx0fIy5Ltaqqqaenqa/a +MiwvMjY7Rlm9rKiqrbrPVUM3Mz1ywLOvtuU/My0pJyorNELy3L6yrKuutc/fVU0/PENRy7qv +s7rLZkQ5NjM+X8G3s7S4vtZSODAtLi8yNj1b0b27ub7CydpmT1fwyL24ub3H6009NTI1P2nI +vLezsre9z1s+ODQyNTc7Pk1jz8nK13pjVWnjy8W9uLa3w+JMPjc1Nz9Z0L64tbm9wsjWbk5A +PDk6PUpebHRYWVFORUVNb8u9t7e6v8TPYEM6Oj1MbtPIv7u8wcvbcWtjW1NQT1rv2OdcUUQ9 +ODc5P1Xdxbu4ubzG3lpOS0xPX+DPwsC/xs/hdl5MSkhRXd3Kw7/FzG1JOTQ0NTk+TnHNv73A +y9Pmd1tda9zNxsHFytHW6WRMQz9ETWTVyb+/vsPPYkhFP0A+P0FIXfTjc21pZ29+3dHGwb/A +xMnS3mNORUJARk1y2M3Hx8fKz939bG9fWFlTT05QTUVCQkZNXHrg0sjAv7/Ey9LlbVFLSEpY +dN7TzMzNztPT19rf3trb3O5kUkg+ODc4Oz5FUGTbyL++v8DHy9DafmhuaWtqePTr6+Xc29zY +1NLMyMTJzdxxSjw3NjY0Nzo+SGPRyMO/vLy+v8XL1uR5W1FNTk9XWmby2crDwL/AxsrO2fJf +U0o+ODg5NjM3PklYdM/Hv7u2tru9wc58W1FIQkFFR01l1sa+uri5u73DyM/ob1pLPC8sLS4t +KzA8VNfAtq+sqqquucXcTjs1MzQ3P0xl0b+4t7e3uLu/yNPh5+d9U0E0KykrLCosOmHLvrGr +qKiqrr3kU0Y3LiwxPEZS5cW7t7e5uri3vcvU19bY3fJVRjUpJyosKSo3ccS7rqmpq62zyVlK +PjMuMDg6QOrGwb2xrbK5ubvJ2+RpWnrQz+5dZ0gsIycrJyMtVMa8r6ajpaaqt/BIPC4nJy44 +PEXPtq+ura6zucDgTUVJS0teyrq8yNPyOiMfJSgjJT28rqqinZ+lq7pQLyonISEpOlrNuK2p +qKqvt8DaSzo6P0VIWtG/uLO3zWNeNx8aICwpJkWsoaOhnqCqvFQtIyMkICRBurGvp6CjrL/e +b0MzLzU+SU1kzr66ubm7vL34OTQ2Kx8hMUhATrSlpausr75gOywoKzQ4O32vp6qtrK27b0Ex +Ljo7ND7QvMrewrq9w8TV1r/BUEL9YS4hIy82LjLZrqmrq6qrt2gzLjEzLzRhurOzsrC1wWg5 +MTs8Mz7Iur64sLXDztxSS15UTNa/zW11cC8dITc1KTuuoqeppqm0/i8lJywrLEe1qKipqq24 +YjEsMjYzQM65t7e4wtz8UkFCUGHtyr26tbTHSzwqGx0uMypLp56kpqivyUIpIScvMTvDqKKk +p669YjMmJCs4QeGyqauxvsj4OS0zRVRgzLWvsLS6wcs+JBobLTEoOaicn6qqrLs7Ih4nMi83 +vqKdoamwvWArHyMvPUzUr6aptsbeSjIrL0ffzr6uq6+6yeFhQi0hHyk6PULGp6Orur3AbS4l +JzM+Rv+ypaOqt8pkOiomLD91y7WqqbDHcUc2LjRHcs67r66zvMzk5U4tJCEoNzw9z6eiq7q9 +yVEtJic0RlfNrqSkrb3ZTjUqJy1G3sGyq6mvxF5DNy8zQFjPvLOvsrzR6V9ONiooJCs7S1i4 +p6attb/XRS4oKzlDWsSup6iwxGVDMywsOF7GurGtr75sQzgyND1Uz7mxr7O60FlMTUU3KiYq +Pk9J6a2mrLvI0m01KCkzS/rIs6ejq791RTYrKS5D1Ly3rqywy047NjY5QHG+sbCztr3eUEdA +Pi4gJkBPQW2zpqa01ObtOykmL0rdzbyro6m+W0M6MCsrPce2s6yqrr5YNzAyNT3zu6+ur7O7 +2U9ENiMcIzY4P8qsoqKuwshwLyUmLj5d0beopKu51k84LCctRta+r6morsJPPTcwMj30u7Kx +rq+61FEvIR4gKS480qyjoqistNM2JyUoLjlSv62nqKy2z0g0LC41ROy+sq2uu8vbRjY4PEBY +1L2ytLy+0UIuJiMqMzhNvq6qqq60u9s9MjAxLzNXx721sLG0xlRGQzo2O1DJvby6uLzOak1C +PT1FXNLKyL/G2eJPPD5KT0c6StnuVX/OyM9sctbtTkZKWmdw1sO7u8LNzdxTSExb6+Hp08fK +2OT2ZlNNWP7p5dnR2ltNU09GOjdFV01Nat7N1u3bys71WVr7YVFpz8bKycLBzOf85vlYU2vW +0NbTztF7U1ZhXFRWaenqaVdYW09FSFpZSEhMT1JRWuzb4NrMzdXg4dvX1c3Fw8jNztHcclxY +VVdk7vji2ut9Y1ZYXVxeavjg815bY1tVUFFYY2tmXGX88N/k393qfPt5bXVqftvc19LQ1tjm +e2l3eevj3Obi3vtsX1dcVFNdbW7h593c1+11ZF1ZUVhf+9/c3dvX5nV0XE1NT05ZaG740tXW +2dr8fGptd3zo3tfR1d7d7/txZmJ4/XLk2Nnr8G5XXldQTl5iZu/f29vZ1+VzX1RRTU9cfW3p +2Nvm42xia1xi/fLs19XY2tfl8d3Y52vt6HDv337s32ZbVFlYWWRl/P74eXR9Z2VgZ19i7mz8 +4m134+jb3nDq62h64+Dma+/VenZkdF1eaPX66uTo5N7scPtsZmhi7n/n8/B67fF0aGv5cGhp +6ex/8W53aGlkant1X2n15d7f7ObteGVfWFxm/PN729r68en/9Pnq5Ojy69/f4uDk4ndscW5r +cGxnXmZgX2drZF9ifX1ubXLt7vD34uTh7mp5/3L59+nr8ubi6/v1dV19aW3153V37d3o4+nq +7ffx6W5lfGb78mZoZV5saVhebl9v6m53+evp49/wbvr5furj493Z4Obv/vN+d29sb2Zkb2Je +Z2lwZ3Fybfv46Hz3b/71/PLi397n6uzq+f389PL28n1nfmdqaHdr8/P39PN6enR5amBmZGJp +b/nt7uXl/e58dev2bP334t549uX7fX3z7vhj7n5teufh72j16XBeX21iYWB1fup7duv47ufn +8O1w/OV/8O599nVpbn/+/23u7ul6e2j8fl13c2J5efLu9ezv6fZtZ2RrXXvs7uPm7PTp9Ob4 +cnlrbfh+enJz8OTlfXX2dXNhcuzvd2dv6eN+e+ZyXmR1+HV67/J+X1547XF67Ozzff789ndu +aHnk5e/54eHv7eDg7ndka+/5bXvk9nPz6nReXV9fXF5eZnZ0fv1/+P3s5OHo7urs6Hxobvzm +3+Hj3uP78Orj9GxtZVxYW2RoZF9jbXzy8+r0eXx4d3fr93H79fPx5uPr49/e5O93cXRua2x3 +dm1ubHL6fXFuaWZre31zfPz2/3z8d/v28O7p5ert8+/393V6+X14em9vbmdoaWppaHvv7uzm +8/d+9+7r8PD3/f1+9n5xevrx+3lqbW5vcn3v93Vva3X79O/v8P78cXh6eX/66+jn8O/r83Rw +cnZuc31ubHN3eft/8vR8/fL4dmprbnrz5ubs9f39+f5veuzx9+34eXFt+Pl++PH4enJvc25m +ffpxe/t7/fnt7ff37+rzfHt+fPjv8fDv7Ox8b29yfP77f3lzaGx5bmp19fPz/nl1cnH98e/y +9vH19O7m7Ori6f90bW9xXl9se3Vz9n5yfPHy7+7s933+fvN1ef/z9XNyfH94dnFtZ2x7ffTu +7vHy5/N0dPz9dG1vf3x2fu7k5e/s6+99eP33fGhobmZfYWVnZG/5eH368v3z5uPi8Obg7fr/ ++fT5ffbw/3j6+X72dHN9b2ZnaWZfXm52aW19Z3H+9/Dv6+7x6+Pk6/h6+PZ77u749+/s8HD7 ++Xrz+Hb0+WtxeWRfbnR+bmhzeHhrdunybfzn//Pt8uzpff7ua2Fq+nZ9fPnv73psfOf5c/Xq +63NqfvL1/vTp8nr3fW99eG73eGh0dfV/YGzc63R39+h2XW/tZWf49G5sa/XwaGX03/Fkftzn +bfva4O124+X1efzo6l9f9HdfeHBzfmJt5H1l8vhvbmhe//5l7t3gfHXz2upj++Dvb3rk6XNo +8fP5aG12/G5x7OnvaXRtZWt2fv/q8/vr9G14+X5ke9/09O5rbHNpaPt89OHm+G375+3j4X19 +82tgdv/849/q/Gtfb/thX39sX2p8aGjt9G5t8Xzk3Xfp3e/n8Gp24u97bWb172Fu325s4v1p +5/lr5Ptid+X6Y/58aut4Xfvda2399/rqd3Dk82pmefh0Zujp/O5tY+D6Xf7mev/t3+Pk7Gl6 +7WFX93Z/325e5+1f+91vXnZ59Xdd9939cfDj8PJ55Xli8+jq+Xv97e54ZPPuZF1nW2n3bXLy +6+vn7Hhxdm597H556vP+e/1vZW/uZmng5PTu7Xf3b2Lv72no2/Ntef/f71nu4mNlcnP6b2Zp +b19fbuV9Xubc+XTseWb0/HvY52Xj2uvw4fZu7nd55mpp+m1ZXnl8bGh2fP7v7fnrcvx+aXTu +4ulrduXkblxtefZ2ZezoaWf1c15t+fR67fvv2vR13uLq9uh89d9tbuxed/5dcnFtdWhx7GBu +3mdq52547G9k8uVrdNpsZOn0/dpvZ/DtenHy9W9obHbf5Wj33vn9/GtqdXZ87Otq7nhf7uZt +79hmZfRtaW/v4nNe/X14b2Dm0Ohm7ODq/GdiePpqbm1oXmn2b2bu6vHuaHHe5Xvf3Xlq+v1k +aHno4Oh57tPxZO7mcX5lXHNlXG3kcmhs8PtqdvTwdHlv+Xlv+9/g9u7k+nx35Nx0bH378mlY ++/xWW3P2fWJp1d1a7tF1YeLyaO959uBrYePbc1/r5+5zbNn1bW1662tkcfN7aPpwbPJxX232 +ZGrt9/fwbfZ2be/v/nXu6/x6+e/b32163evs/mH4enRjX+/9Y3xueuNz/uZoZP3v+mBs6fXt +73v25/ry6ev0b/Zvavf0cPfnXmD3bejza+7iXF3pdntxYOHfaPbndmJ93/b54en19/bx5Xle +3O1UY/tfXG3t3/lm2tZ4XGff5l5d79t1XXbt/WV8eOPnU3PdamZteerzW+fTXVba2Wv73+7p ++2H+5+t4Y+LjVmfcf2rp621gdO//aGlseXhfdeB7a/Xd5XN48uLyb+7ra3xtYfF4ceLya2fw +22Rn3+d9bXDc5lxifm9faezxaPntbnFtdtnoW/fvavrx7OHhY+/Vb/vc5urxbP50W216a3pq +amtgZGxpc3lkbftvd/J64tffdd/X8uXjanheXfV7bXX+7+1rfdbhc+76XPztZ/5qXOzkZGzn +7PFqbN3rb2x+7V9e+F9ieGvi5GDo0u9o/uX6dmdg3OFfb9vq6+h4ft3jbWj4fnVgVuDdUl30 +YmJqZu/tc/nj8W56697/fdjraeh79+JpbN/uYubgYW/9ZPLkaV5acnhlcGZ13/Rd6dD9aObp +6vNsaep5VnHb/P5t+3lie33w8GNu3/do6PBp9urseW3q4Otl8Np6/+Py9WZXc21e73lqc1tf +5m9t6OvufPL2aW316+Hx7dnj7nl0dG53dPn4feznam/w82dv9fBsXf7tfnvj33tZZt9gVXPk +b2by8Ov7XXPU+l/s6+3r4fdkZ2tu+Prk3dvs5/5162dt831sam5uamBr7Gdp9PltZnhybnxm +3txs79zq/Xfr4+JsduXiafXmb/hxbeToXWttemtfbHpy+3ZpdmDu8XTl5+bo8ervZv3vb/ns +ZWv7a215+nPs+nTr8nh5b3ziX1rX2mzs7Xje6mry4ntiZnZze25v+mJYfndq7u/v+nh3+2xu +bvPr7uvm7uzueOfq8uTke/PuW2b3bWJqfOz//Ph1dW9f+uZfdO9obXduc+DwZe7bb2Tz8fXv +afzf8+n+e+vp/vDf9Wv17V5u/fTv93T1fmppbnBYXezpXW3Z5ltp3/h3f37p3n114fVcXvb7 +/d7n++/6b/XoanblfWv7dml7fPpnYerxbvPpaHzx8+PlbnXzcW5s4ux67fJrcnH35XFobe57 +WnbdYV7u9O3ubPbuZm/06vRn+ud2+/j59fDx+f1udud3XvzgdGno8Xn+7e/y7f1oeeh1a+35 +aHTzZGTr9F1iYGr3+vbk82l56u5t/ejo/nLq5W12e/zudvTr6PRy/999bvHx7ndhbe9paXZx ++3dx83hz7Xtt7ultaHj78+ruc+5vZ3795OJ9eX779nht8vdpcG9iYfbo4+L77ur4bGx49vf1 +cWpw8fZpeu3q8XVub/hza3fs4vxq++t+eHHv/md56+zt7nxz6nZbaW9taGVufPHo4+ftfXjs +7nh8+Pj8b2pscG9janPu6/3s5fT3dujgb3bj5/F4a/7zcG3w7Px3c2/1cmByfWppbHr1cmx2 +8Ppo9ed1d+bs/nl17uhv7tzl/vjl7vtxdPH6cmdxfvFsc3ltdPT98e/++3V29en9f/bu7Hf6 +7HdubGpxY2VtcHp9/25u7unx6nt763347O/w+fvv7ejq5eL6+2xmeG1iY2l7+fl49/h98u79 +ZGNkd/x98+DnbXj17fxtcu73dG365PR/7+Dlc337fvR2cnFva213dnp8fnl0c/5zdf11dG1q +/e7r/Xt7+Pp29N7e8Pfy+v3r5nxy+XZ2eXp9/XdtbXN2cX19cGllaGxtfPj9evHu7+zj4Pdv ++vd5/Xh193ptfP53f/z5cXF1b//18fb/ev7r+nT+7ntyaHjzfvty7vD1fern+W9t/vP+c/v1 ++HhjaHT18+zr7PF0bHz6aV908XFqanbwfWlv9flyd/T6/vb5fPny8O3yfm53+n7z7O3r6f55 +++7v/Xx+/G9r++77b2/6/nJv/fn9fm5obW5kbHX89+7rfv7z/nf88PF/dvvw8vPq6/H/bW1v +aWhtcWtxd3n17Ojj5ezk5/Hv6u51ZnB/b3J+8vh6dv19bGVta2dqZ254cHp6b3Z2ePv3+fD7 +eOzf5ebm5u729f95dn/9fn/+fHx7bW57e/vt4/B4eGpjY2tsaW1tbHR78+j2efn9/f12/vH1 +/X758Pny731tdPbr6+75ffL7f/d2eXd7dG1ybnFxcHr8+u7s6PRyePX7+O7w/W5jYWhve2xu +dHz08PLz8/t4/Pb39fbs7fV7ePXq6vz19fv6/np5efnwd3Z6cnBubG/8f3psaGtua2v98e7t +6uf08+/9+fLv/vvu6ezp6fd2cm5nZ2dsd2xubG57bXl+/H1+9evs7uzr7vLr5+vq7Orq6v5v +dnJzcXlxaW1tbm97+/p5evl2bXNvenhuefd+//V9/vTm5uLl6+12cG909u/s7PF4cv/99/lx +bHFubPt+efx/cnzy7Oz5ePp7b25rb/jr6OXn+XR2bGt0emtscn7y83p08+/v8/t5bXrz+m93 +7/p8ffnw7Ozo6/B9dW9qdfr+cnn9//Ty8enn83dqZGV88PptYmh5eP/1fHX69fr7+/r3e37n +3+736vLx73hubWxreXFnZHDn5unj6f959/52/fL6cmdrfPLo7X1ubnj8fvpvY2ltbfXq/Xp4 +a2lqeeXq/fvv6+ru7+3w/X3z8fnw7vT/aGt0c/HvfHBsaWlreX359WxnaWdqefttaG50++7v +7+bn8Xn9+uri5fh3cWx37+ri4fdiXGV3e/Z3bXv6bXF8a3Lv3tvpbO/R095+XV94bXPyWkU9 +R3TRzM/X9F1MTmHZysvZbU5LU2/NwsnfZ1NVb9rFvsbc5HRe7OBlTz0vLTvlvLS7zl1FOj9p +xLa3y1A/PEVry769y1s/O0Ne0sG/xNdNRWfa1s3Oz83dZFhd/9nP5dnVMx0s0L+0scfP1C4r +Qcq1rL1dSjYvOu+4q7HeRDs+UM66r7THXkhN6czIt781IRwhX6ysq6m/PCgiMbysrK/ASzQq +KkS4rK6+Szc3OEq9ra242E9DOj/Grqy40tjjQC4oJyQvuqy0sbb0Py0nPru1s6+61kItKTlp +v7W3ucJTPUhg0L62sLxSP03iwbu9uu8pHhobNa2mop6rai0eIUbDtKWirfQqHyg5U8e0ra3E +PELVyM/MvbC03E5g1c7P1+NULR0XHUK6raOdo74tHyQyR7ymoanNNSorKzHrraexv8DPRj1x +tq69zcPOTEbvvuUoOWIhGylJvqy4qaG/LS0yOTdJqKO7ZXRJOi4wza+40LyvuXhkxLrH2sbA +0Es+Q1XvOiIdJjMvPLGfpLTIxn8yLEDZxcrHtMI8Ps7JVEjPuMBs17ezu762ue09PT8wNG3N +zrzPHxksKihmqp6fu8W+OSYsQM/O1K6qwFBW2ms+SMa4vMK9tLvMx7zMR0s2Lzw7TcC6vy4c +LSodMLenorC5r1IpMPm+y8atrcxQXXZfVNm/v768vbrUWNJKQ1AvTLpITMpiMh8fMTMtTq+o +uMKwuE1F683Wase2zvW5ssdPT95nRuS5s7fAfUw/Mz93VFVa30cvNjosLTU6Zfzjtq63t7zE +3ktd0Nzfvbi7xNbT7VdZ+czFz9rsWk48OOXXTFFrV2Q5L1FOLj7dU01ly7m/x7m711VVdO9u +3MrNzsTF6Fv0aFtu0MC/ytLdZT43RmNQU+DXX0FHUUg+R/R4Q1HJw9/pw790TFtrY1/SvMDS +y8f4SVPb1uPNv77ZYWhTQD1LTVRcVWleXN7uW2V5cXle2sjR2db1WFRMSEhUadDL19rQf1lb +U3ne3srCyc/bZV1JTGfb1dPL6mJbWl5kY3zqcFh09257c9/bV0lOVU1a8dXS5+TcaF3p32t/ +2dvbb+feVE5eX2xu39rMYOLK4efU2N9efetqa2xqXk1IUF9W7eR44XBpX2zncml87ufu5NrZ ++3xuam5fdO3Xzc3U3X13XVH+dPL/7+9fVu9SSVlSWNrf/9zYdWB4/fV7c2/r4G7t6/7meu/v +bnnf6unk6OPm+GTr2e/mYP5yTFVTWF/2fnHqbWloa2Re7fT75+Lo+W/e7XHc5N3X2vfp2vlc +52FRXWnj6+bf0/VYXl5cUFVkZ+/sbt3cWnv3eeddfNdxdmvs3l934+rc3d7e8d7lYW9y/H1d +/t7s+1plYk1PXGpvbPvX3eD08+dkXWpi7v5o191x++DY2Obb4t16+mrxek5Ob25bYPHZY+7n +3V9bYFpe4v7673thZOb17NnX0dXyb/BnWGhfU1x+9t/c5d/e7Ovd82vx9VtgZV5WaXJiaOP5 +/ebv+uLiaefpa2J99mpo7exr9fV049/e2d766OpmY2VYXnNaXvvq8t/f4OXddFpvXVVedf98 +auncdXnf3+fj6udubf1/Z+P1bN3yeGBs5ndoZn5092dp425bb3Fqem94d357697a3+zf62J+ +523j4/j2b2lnb29pdG/77+3s6ef1+F9bXmdbX23raWHl4vduf9/edurr6fNoffb+aOXc5ODz +3dvs7PF0YlNVVl1lZ2ns4N/obezrbWVt43Vbberq//fe4HPk3OX0a279Y1t18flraGrnYmD+ ++Gpt++l67vDx6ftf7OFk3vP96+N/cOzf63jy9Plse/R7/nRqYHlnV2Z89m9/5/B2dnvy8mx9 +4u796vFuZO/vfubh8PLpa2Ru/nDh53P57/77dmT26+T1799sZ25qZXJrYW5taGX87e199ePo +715sbXtmeeDy9HDs6vvp3dvb2ePt9WRpb23+YXb5Y2ZzfnZ+/fXsd/dnW29sdml+92le/fp4 +4N/h7ejoemT54PP5597zcWry5/zz++l2dWlWb35baPt1XV9tcvT96urq2ud2cO3j/vt3evL1 +7+vi6n7v7/tkZ2hjY3JrY278/v76eP51/f749vX1/Ovz8u3t63Tp4WleZ3Bzf+Lo4+ly8+1r +/25u/WVebWJo6/fz6vf3+n11d/3n9XfsfGRmfWxl9e5xcOvq+/Lo8PDt7e3tfmZvbmxq9+h7 +eubu+uDs3eZ9eG5rZWthaXN3+29xfm7l5F3v5/l2a/5xdXZraG11ePfm4ujrafXc7fvj3u91 +av/7fvPq7fF7c+/2/117fmZmaW99b3Lr7u51bHtoYm9ucvPt6ebj5O308eLyc3h1bWtlYmxx +6d/p8vPo6ufr4eX+d29wY2ViamxmaWl18/J/eOnq/Xrs+nnyeXlweXx8fmhteHdtc/j+8ezs +8evj5ebq6e3u73Ft+Hx+/nJvb3N3a2RhXV9dZmdoZmRtZm348Ork4eXc1dbTzc7Pzc7U7VxZ +WUtERkxNSEJIV15h+tzT0dPRzcjKz9DLyszO0M/eTklPRD08P0lLSFvl/WDu2dvc1czL09PL +y9nMxMjHwcj0P0BQNS85REZARc7KY2DKyOxgz8XS07+2t7+9ub3C3D0sMzEkJzpQVFHCrbl8 +1b7lO0HOymXIray2tq6wwd48JygpHSI1XNfLr6WvztnSRC0zXGVavqinrKuor8RYKyAnHxso +RtnQuqSkuN3dXS0qPU9OzqujqKijqLvrNSIjIBoiNFTNuaemsMHdVi4qOUJHyqylpqWhqLjK +NCAkIRohNVfquqSnucXQVywqPT89zqmmqqOfqLzaMiUmHh4sOEzTr6autsH8PSouODVLvaup +pqChr75YJickGiY5PVLAp6q2tchPLyw7MzbLr66roJ6qtsQuKCgbHjA8Q+2sqrWwvX46Lzoy +M/63sq+loaqtuTYsMx0cLzo3Ua+tvrGw0D82RDEucr++sqejrK2vPDE+Hh82MzNPtLbMr7HZ +T0VJMzN9y8i0qamtrL89STcdKD0rL9m5zsauu17i1UI7deZjwLCzua6xSkTPKiBGOihBv9/y +srNkbcdYPeXFeM+1ub22tGE6wTshV08oPr9RRby9TWPCXD/Iv2/Is7rKvL1JO+M9JlXqLFG5 +S067zkxczFxFyL7Su7S4vL2+TjdvOiZPci9euk5cvfFFT2tKQtXI07myt7m3wFg/TTAoU0cw +yr5ZwLnhZ15MPT9jac63trW3trxbR1AtK0k2NNPY77q8z9jcVT9GWkxyv7q8u7O+XuJZLTJJ +LjXfV/+8vsvMw9xXaW1YYMy+y8a3xF/mVDA6STE3VkdayMjNzsTL+tXP/ujOydfKvMvi3lI5 +Q0k2PklAVOjm6OXNzeHOytvWztDd0MTO29tQPUlIO0ZPRlb8/+X618/gzMnZzsjU2MnFytDU +X0dKRj5BQkRQU05YU2je4tTL0MzGzc7JxMfMznFPSkJAP0RKUGJfX2V939/Syc3Oyc/QzMrD +ytZ3SkhBPD0+SFBWamFYZe/cz8vJxcbJzc7KxMPL31hGRj88PURNTlFbVll45tDPzsXIzc7P +z8jDw8v1UUc+PDtAS05VVlRdcurTzsvHyczX3dDLx7++xvNNPjk9P0BIU1ZPUFpi9NvNycvO +1tva0s3HxcjEymVKR0FAQEZLSEtQXmt12tbW1tve2c/NyMbFw8TDz2BMRTw7OzxBR1d+/PPo +3+bl3NPOysbKzs3Pz8zLz/xUS0E8PD9DTmBnffxubGzu3NXLycvJy83O0tLR1djzU0tFQUFE +SE9bXFZVVltr3dPNy8rHydDX1dnV1NrY4PhsWk1ISUhGSU9PWGxtd97V1tHR19zf3Nzn4NvW +2NzheF1QTEtMTldkaXPz7/D9++zi3NfW2Nrc3t3j6ufxaVxXU1Nba37u7+/zdXNfV1heZmz1 +4tjQztHQ0+NsXFlUVFJWau7n5uPtb2BiaWlmdfrf1s/O0d3v+WtbVVVUV2Nt6t/f9GxubWZc +X2lrdOPX2d7c2trk9XZyePnu+HlybmlkZWJhZ290YG70dHjr8/rn7Pf08/j4fvzv8v94bXf5 +7vZ8bmhtcXh+7PDn3e35/HlqZW1uaW1vXVLz09/55e59/fXr397v7O5nWlVYZH3w59jX5vh+ +d3BsXGJmXWl87ezv9O/t7fX27/bv7fPu93lyffx9enRvZ2ZjX3x1c/Pt9n98e/j58efj7Ht6 +fvv7+e71+3j7+3z4en16++/q7Pp+fmtmbWprffp8+n9ucnl9fm/28vbp7vbu6evn7Hx2/vV8 +/vp7c/fu9v9vW1tnanf5735+7ufw7Obl6P5rX3H07+/p7fj18fJ2aHB4aWxsa21yamJubPDe +5+/g3u7j3+Tp8vx6fHljYm1iYGd1bGNtbHP27ubk6ezo6O7x6ujt9HtudXBz/nJ2enb/dm9t +bHz/dPf4dHz/8PHr5Obt7ep5cHlqamr4fHhubnn5ePPn+3BlX1tdZv3i3N7g29re5fxsamln +YV1bYGlx7uvl39vf7fT8bGRhXWJrcPLq393f5P/w6X1uZF9canv97O34/OP8Z29zdHB3dPnr +fnf37/T+8e306/T67v9v+e/z+H98a39xbXh5b2t3bm59a2348ff69PX76ezq4/Dw7PX7d3J+ +cGtne+/u/fl+Z3f2+3J7fvTzc2/9/331cnjr6/X5/vzq6uz68+r2aWlpZHjx6/fq7Xt0bGxr +7O55cnd0cWlw9fZ893Nu/Xj77P1yd3zq/unu9eh+9O78b218cm7t53z37nt5/G5vbmZpc311 +8Oj0bnF1aG12eHN4b2/78PHh3+bu9v7zdW55b3FtfP9vevXv/vDq8XJvb/76d/v4f+rk3upu +ffhvbWV693l0XmpzZ3X0d2t79/71/e3t7+Lf5/F4725kbvt5//92dXRvdvD1+P54ffL37/Z5 +8npe389fZtnhe2x282piUXzQZFfmeep+YujR5Xp+3+Jna/5vaWpr+/d2em16cG9nbG5Ybtpq +ZtHP5v107nxiXN7dVVjb2W9g6dr7Y3zk3vFffOBkZm138GliefdmYl9fc2t43tze3OXf0tPS +ysbM1+pfUEE3MDAyNj5Q0b65trm7vcbOz8m+ubmzrq60Sh8fLhsUIkXVv7yfmq3Wu8FBKSv0 +1kDZramxzbalrsPBeT4hGCMlGynZuqmtrJ+tSks7LyspW7S+r6SlqLO7rbPVXzYrHxsnIRs0 +xcywrqifsErYTy4uLl63ybSlqq+7w7XLUcTIPjgjHjMjGjTL2rexp52tZ9tWMyopUsDPtqiq +sM/bt85IzbG43jggIigaGTnMwK6lnZyv7d8+Jh4kQtDGqp+muHtQWT89w6qotMs8IyAfGR4+ +zrKloJyeu1s8Jh4eKG+6r6Ohr95CQURIyqukoaq3ThwXHRgXL8Gon56amrg5MiceHCT6sbSq +o6rFPTxOUsyspKCpu9UkExgeGh9sp5yeoZyiTSgjIh4eMbSpq6imr04vO+jNuKaen6zDRhsQ +FhoXJbeempubmqotHyAfGx9Iq66vpKW2TDVV2W6yoJ+iqrr1Gw4XHRkhvp2Ynp+drCkcHiMf +IUOtp6yspa1IMEB01LynnJ6orcUyFg8aHxonrJuan6OjvR8bIScmKt+lqK+trLtCLUvO1ryn +oKKsrbBHHRMZHhodwJ2coKCksyscJC0mKUmvpbG/rrFRMTzMusK0pKSvs62xTiQZGx4bHE2m +o6upp7E6JCcsKytDtquysausv1JSzt5U1rivr6+opLFOKRsYGBgcOrappaGkrU0rLCspNGu5 +qqysprJRPD9JR03Gra60r66tr8RYJhcYHBgcSqyioqSfpkooMDUsLD+4p6uxqKvpP0Y/NS41 +1ry5p52coLE7HhEPFRgfy56ZmZyfqTkdICcnM76gmZ6pr+cqHh0lM0S+p6CenqOrvkYuHRET +HiUs0KObnaesskwoKDlUTm2ypq/2We08Ki1KxsLFtKuyw7uyv9pWLyMcHSctNL6jn6Cmrbo9 +JykuNkFmuquuwsjLTjg0O0dDTcm9vLavrrW90DomISMqLjm8pKSnqrTWNigsNTlJzbKss8LN +6Uc2MzhBSmnFu77DwLizvMG81TInKi0sMvmvqa+3uMc+LjE7Pj1Jy7a7w7u2wU41NDo3N1LB +trS2sq+2vrW7RDExLSstMlHEy8u4tr3VUFZbOzU9R/3Lx7q3xvBQQEFFQVXIvLe2ube6vrO7 +NC08LSYpKD/KXsOoqK24e29eLys0O1fPzLOqsLzJa04+MDVJWfLKvLCvvdT/RTgzMjpNd9TL +x8DPST8/P1R90Liwt8DaXlpJPERYZvRveNPbYWRaWmlr9tTW53Bo7dzc2N5+bmllYWr41sfF +z+hfST48P1Ds1ci/xs3fYFJIPj9HUebLycnN2vZgW2zsfmby2tLMy8nAxNpZQjs7OzxN4se8 +urzB2VVHPTg9Q01s2cnEyM3R42FZVldodvDUysjExtDlV0dCPjxDU/7YzMK+x9Teak9MTU5b +bv7b0NXV2OhyWExNT1Nl5dLIxcbI1WlVS0JARExt29bPy8vY9WlnZFlYYHzr6OXh3eF6bndu +b2pgcPjt3Nzg3ej28WFVWVZWXWr14OPj4PVvaVxZZvvr5d7f2+P8+f9ze3x17uvv7/Z7a1tR +Vl5gcOzp5ujq6u7s7vdwYl1ifPTf1tPV1+l1YVRUW2fv2tLU2+lvWktGSUxUbt3OysrN0+lj +VlBOTlh33tHMys7b6GZWUE9RWmP729PP0+H2a15bWVdcfd3Z2dja5XtkWllaX3H45+Db1dfq +al1ZVFhfa3L15uXl5el2Yl5l9uPh3OH09X1gYGZnbXfu5+Lc2Nrh73RfXWFeaHF79+/r9XBj +a/9zfOrm39zb5HtqZmJia3ns39/t/m9mZ2VhYmtu+e99fPhzZ2dpbnf27Obe3d/e3+Tq8f18 +fG5iYWJgaHn77O93dXVudnt9+nj38Pr5em92em1sdP3y6+nf4enp7vprZGFlZXXxfG98+vXv ++vPu/XNnbX36+u7j5e3u/mVaWmJu9O/m6/Hq5+n1/XVqZnLr6+3r921rZmZyff/27/L8d3h7 +b2Nha3ZtbX3t6N/c3+Xt+n1vZWl59H737O/08P1vcf35d3l9dG12+vL1+Pl6eHZ0e/Xw+X38 +/XVubnt1aG50b3L783BxfP7y//j0fv726d7f7PF8ePjr6uzw+3RvcW9rZGdsdnZ2dm1lYGNt +8+rr7fPz6OPd3u9vZ2BgbXv58erm6OHj8WxfYmVkbP/t7e7zffj+dm5vd3n5fnlvdfv9dWz/ +ffz5+Pbu4/NsYmd37OTt+3BpZ37r4d7j92ZdX2589ezxff73+HRpaGp/7ero7X17dm1wevfz ++nZvbWptdPrs5tzZ3uxuXFZaafXj2t7s/XFrampvd/Tv7uz7dXFye//p6HJWVFJRZtrHytXi +XE9SX+/W1OT5bGD529jc5HRbW2T739rb6GRPS09WXvre2tbV4H51XFBXXWfey8rR51xOTVBc +7t3l6uni18zO7VNISFrUw8DH5E5GSE9+0MvQ3G5XWFpgXlZPTlVo4dDN1fxaVVdbbff45uTg +1tHX63leUVzjzsG9xeBPPzxHcc/FxdJrVE9Y99rb5WNIPD1BSXLJv77C1lhJRUhZ2ci/wNFg +SUNIaNDCv8fXW0pKV+vRzM3T/llb9M7IyedCLikrOc+up6m1XDEsLjzmurS4vt5KPjs7QV/J +u7a5yl1EP0/Tvbm8z1xGRW7Cur52MiQgJju4paGnvjspJy1EwK+tsb7mSz46ODtI3LuxsLrd +Rz0/YcW3tr7aV0z7xsXZQCceHylwqJ2eq34qISUy2K+prLXQSj88Nzc6RN63rq610kM7P1vF +uLe7y/T03drgRysfHR80tZ6anbA4IB0iO7emoqi7UTgzNTs/SufAta+wvm9FPkbkwLm6xN9x ++uH8SC4fGx4wuJyWmqw7HxshObmjoKi8SzEuMTY9SvvDtrG1wepVWvDOw7/ExcXL1OlPLR4a +HSy/nJWYpkIeGh8zvKajqrlYODQzMTZH78C1uMHPePXGubi8z1NN48bDxE8iFxcePqKVlZy+ +JRseLcamo6u8VTY1Ojk3Qf7Ju7zVYWHbuaurscVMPk/lyLraJBYVGjOllpadyiEaHjC6n5+o +ukgvNDg2ScvCvMNGNz1VuqShqLRZNDlQ6sTcKRkYHTeomZmgzyUdITC/pKGntkotKyw9t6Wk +r0IgHCfanpSWotgsJCo4STYhHCE+q5ucrjceHSzDpJ+nwkY1MDhEb7yspqm/MiEgL7edmJup +5S4kJSYeHCE1tZyYnbkqGRklaaacnq5LJx8nRK6dnalUJR4qy6Ocn67Kakk6LR4VFSO6mJGa +xx8VGTarnJ2uTS0oKjNIx6uho7c4IyE8qJiXn7VALS0rIxkVHVCdkZWqKRUTIMmemJyvPSUc +Hza1m5ae4x4VG1uckpSfwTwvKyYYDhElp4yKlfMVCw8qrJaSnLY3HBggP6OTlqsuFxYvpZSR +m7swIB8lHBceOauVladCHBUfVK6enaa2PR0YHkWdj5SnLRUXMqmXkperLxoUDw8d1JyPk7Ql +FhUotKGepb7fUicfKlWhlZqvMhocO6uZkpWkQB0TDAsX4JiMjqkmEw8beKSYlqC2MBYVIsiZ +kZy7Lx0myaSalZzDKRkPDBU+oJGRpi4XDxQst5uQlKI8Ew4cxZaOmL0sHiFqo5iSmbslFQ0J +Ek2ZjIudLxUNDx9cpJWTmrYdERczo5SVotAqJkKwn5mezisZDQwWTJuNjZxHGQ8SHj+qm5qe +wSYgJjizn56lwzI/sZ+an2kjGA8OFzumko6YtikWExwtxKSfoLU9Oj89RvrDrKm7w7Wnmp3D +LRsPDBEns5aOkqFKHBMXIk6rnp64PT9ETtXOy7zL77OknZqm2S8ZDg4ZNaybmJupTB8aHSpU +t6apydb7RWDPzLu+bMSon52kv0clFBAYKFqpmpibrisZGR4v06umrbLIPzk/RNu8vratrqed +nqwsEg4PHDK5l4+UpU0kGxgXIcOfm5yp40MwJzBZuaamr6ukrcQsFxcdHB9dnpGPm7xWKRQP +FSm4nJmamqwrGxwn462on5uht/ohEBQcIC+/n5WUm6avOxkSFB06xqeXkpu2OCIeHy+wnp2e +pb8iExYcHiVJqJqZnJ2guikaHCAfKsWinZ+nseAqITB32Lumn6s7HR4pIR86r5+hrK6ruz4v +OUU+NTpqwrKuvU04LywvP9isoaavuuE4Kik0aL+9uq+uvks0Ly8uLjVN18jExsO9w/JKQk7R +xMa7sLPFVTw7PDxIzre3w+VfZk86MTE3PUlkzry4vs/y+epzYu7Hu73Dy8zaTT49P1DzafDc +aFBGOj9GPVLXy8u7rt5St9k/YcTG3cS9wsbeQDxKNCoxOzw9RcvC18K6vL/KvbS/zs7UTjY8 +b+nTt62uu18tKCYdHy04Sty4rbCup6zC0MrCc0Hx0Ovd2c/abdG+7dTNNzctHyIlJjBOtqmn +o6WqsLm/eUVKTlfvzL3AzMTSTkcsKTInJi4xOUFYy8e2qqimpaervuZtPjc8StvBtK252F0q +KCgcHyotNELNusi2sLOurqussK60zM9nQT9DUmhpwuE8+DAgJyUiKDbszLSjqq2psbu9xL7F +vrfIzcvZ/ENJSiouPycrPjMuMkE+OsOxvamhqayruPNe5VRVwb7Hv8LWRS46LyAsLyguQU9J +0rC6u6mtuq+tvr+zwFz8+Edc1O1o9z8+NCcrKiotNkZT3cC/t62tr66tsre70HvoX03q41nY +3Tw/Ry4rLy0nMEE7XMK+ubGttLOtt76zuM3N2E1LT0tHbmU/X0swODgrLDY1OF/QyrmtsLas +ssK4vdDWyt5Z4fFRVl8+OV4/NUE+NDNFOjdlY/a5travrLC1tcPQ3vNWV+JZZf5eST1LPS88 +PTA6Szw/635iwrrEuK61tq65xb/PYF1lTUlUZVVJW0w5OjozMzw/PGjW/Mm4vruxtr23vM7F +yOLy411OXFdUS01uRTxCNzA0ODY/anzdure+s6+6urXDz8bTY/j3VV/v9VVSZVM9Pj0wMDc1 +Nkxv9Ma1ubevtr24vNXOymlb8l9UX99/UGNbPzo+Ni82ODVCX/fVt7K5rq68vLnN8MrkT/jk +XnDR3lxVXU43OjstLjYzNkt36sSztbSsr7u3vejl4lZQ9d19z8HRX2tmOS84LyoyOjE+5urc +ubG8sKu3vLTHatlxR1Pc7W3Ev3Vz1E0xMjcpKTY0NF3N1cKusrutrsG7t91b31VEVtxt+7rC +YO3gQS4zNCcpNjE138DIuKmutquuyMO+WktpT0BQzt/Tt7r2bdxAKSwwIyU2NjTVtry1pqm2 +ravI5MZaOkdYREjFxs+ys9Nve0EpJSwmHy4/Ot6urq+no663r71PWFU5NUNRTty4ubWtu+RV +QSwfIyYgJT1R4K+lpaejpbfCwEwyOToxNU7f0rWrrKqtw0s+Lx4bIR8eLWfIsqOdn6Whqc5b +SzApLDA0Ove5saunpaWtyTksKBoVHSAfML+ro52ZmqOtsfAtKSgnJyxC4sywo6OkpaWnxyoi +JRkQFiQoLsCempualpy6UkYrHBsmLy5Dtqusq6Cfp6+urtsfGCQdDxUvSEu8nJGZopydzCUg +Jh4YIGG9xbSin6y5p6K04bu6MRkaJxsSH1+4sqqZkJywrLIvGRojIiA2taaqrains72vrLW/ +uscqGhwhGRgp4a6poZiUn7PBRiYZGB4nMd6wpqGnr7a3sKyzuLK1ZiYZGh8aGizKqZ+dm5ie +uUQtIRsYHCtQt6ymn6Kxzsq0rba+uLHALhoZHx4cJkyrnJyfnZ+wSSYeHhscKFavpaSjo67K +68axrbC2tLdcIRYZHh0iMMigmZ2foq3NLh8dHRwjPb+poqKkqbvf1berqq60srs7HBMYHCAp +N72fmZyfqrxZLh8cHB4sYLmrpKChqbzVybWrq7S/v8M8HBQWHSYxPMqlm5ugr9xAMSgfHB4t +2LCoo6CiprPpWMmvqa7IzsRkJxcVGiIwP1a7o52dqc1EPDIqJiImP7yppKirqa7Dcmy6qaqz +wsnXMR0WFhsmNkrGrqOeoKu+Xzo0MSokJzy+rqyrq6yxucC7ramuve9OPScbFxkfLEB9xLWq +o6KpuuhQQDUsJiYuU7ysqKioqa2ws7O3yFlCPT4xJiAfJy47P0RUyLCpp6y1xnZJOCskJC9k +sqaio6ess7zE2FxOUOu/v1guJSEhISIkKTfNqZ6cn6evxFAzJh8gLFewpKGlrra7v8bS3sa5 +tLG9QygcGBgaHSMuUa6fmZaaoa7YPi0jHh4lP7anpaiutbu9u7e2trrCyes4JRoVFxwiLDtq +sZ+alpifqsFMNikhHyAqSbmpqK20t7evrK62ylxXZEUsHxkYHCApM0bLrJ+ZlZierM1NMyUd +Gx0rVbKnqKyvsq6rrrfJW1b15UssHhkYGyIrNU29pJmUlJmjt1YzJR0aGh8wy6qjqK60s62r +r7vM2MjDz0onHBkYHSYsNl29pJuYmZ6rvOs9LSMcHCM1zrKyubuzqaSlq7jN4nZrcD8uJiEj +IykuLDZOxKmfn6ClrbPKPSwhHiYwTMvBurGspqSps85KQUNDT2PPvOY7LyQgIyMnM0fEqqOf +o6y2xWZINy4yP27Gws/IvLezvelSTnfKxdV21MXDxFwtJSQkLTczO1jQt7HB0dvNurW4vMTN +zdfvcmJu/v9wbOfPwbu6wsvX5u53+ttdLikrJycoJy1BV9y9tq2oqKmutbu/zvlRREhRZPht +8+nu4c7JxsjSyb7A2FRDOywpKykqKi45VNnDurOura2wtry/ydtXT1lq71FBSu7NzdS9tbnM +6W57d0QxLTpLRTo4RV9eREBW09Dc0NjIwL6/ytfOvsvpZGVj7Oj31c7CddvhbzxFTUpKT0Lw +wtPj9MFu+UXtRkhJRGrX62HdfG1RWtXW2s3Iv7zVaVZgWz88Q2971enOyL/Ov8LGv2JGTk5K +P0NLY3dFUFBK4FNt3ta5Y719vsFKZ0FWT0BFR9901/XDvrnUytvC4kNXSlhM30bUUW9YT2Z0 +XnlP3dXAw8zD68lCXT1PSkRhRMlhvOPB5sZgTFxa/VLcctL9x0fjSmVAVE7Vb9fTysHfxkjD +RXFCaX/V6+HX2WnY7floamdJdl7N49p33lJdT1ZS70hZ7Mb4b9JX00p4XdVv3NTN2sTbW9Na +3lFaSu3uT9395cpfWvlbYVnmWM9h6Fn5699W2ldfUPhyz/Hk4M7h42zVeHD+Y91lXmxhw0z2 +U89U1U3dX+JudGt83EpxTdtaW1j83t3p0ufZ8G7v8N338lvZaOh6497f3vpt2OTwemvxXlpp +WmpOZlFmW3HefHns7V1sbXrw7WjQe9Tz5NX8z2rTXsxb0VfXZfruSdJBxzzbX1DSUMhPzV36 +fUzmQ8dGymPtzUi+Prc8t0vT0mnBRLg7tjO/Ocs9ZuxAuTm0OLU/x0flek7NQsE+wT7IUe3e +R7s8tT6+Wc/NS79Auzi9PMhD0lNZwju4PLk+vlNkzj+7NLw/0FZLyzq7OMJIz+xrvUm3QrtA +x1FSfkbPObg7wFDKaGLCPbQ6tT2/T2/XQ8I5vDq/P9P0S789tTq4PMFL7u9EwTm9OL8+yF9f +xUi7PbtCxGN91WfOSs1Px0fISMxT3VRi3k7JRMpEyUPMRthMz1LVW2/bWc1Ov0vBTsNJyk3O +U9hs1PPl62z1am1Pz0LPStNP2Gtg10vJRsNAxUTJS85addRY1FrlXtxi+eXlfNFjx0/FQshF +zUPVSf/eTtJIvjy/P8JNz+Vh0VDEP71CwkTMUN3zUMlIxUHERMhX2fVo407aTuFJ01roV91g +eW3wfdJmy1vSeObiXM9Sz1XPUdZm417iYV/fT9VG11rlXV7ZTctN2FDbXHjrZ+T+3GfSfNl4 +1tlazVLMT9Jd/X1c203aT91L5l9ja9nnXnB71k14btXmXOzvz2P14PfXXuFw935t7WHZVtpX +9VLYRnrvzWJj2dbfSOty2FX8Y9zoeGfw4t/hW9x201jYXGvvZVf7deZZ7GV731bNStRPy1np +52rZ6n3f799l3+li21TeXF1r+mB2cGXv++Fa3l/hbfJY8Pt5W9xt/dj/a+Ln52nhatx9XNxT +6V/u+XbbXdVU3GH4a2V2YfBa42Lv6+Tu8vRw5Fvq8/X3deRu6F3cXunjX2xkf1t4aF/t+1vg +ZeXz7e392XHfaed7cX5l+m1ve+777+318uBn/Hn2+XB2/mZ4emxrYXxm4Hb6bur+/e189+Z+ +8nTn+3Xrbmrx6Wn38XHybOVi/mX78HxyXnf+altd4eBp4M7Y+/3ZY1pt4vNe+nTveXHd+eJ8 ++WH7WWxdc1xu6nBuaetv5Hnqbent4nj44vz2/Nt7/3Xw+fvuaelrcXpy+mtoePVp7l5d1l/z +1X3l4mvj8mVpbe3r/mDYV2XIY1L91WBXX+77X13scVh+YuHbV9fef+Fk6N77de3g9+rd29PZ +2tbe3NDOzs7iUT01MDE3P0tX8dnIvb2/ws7b+G/3cHBq69jWz87LyMjJycfBw9xGMSspLC87 +Rlhy18O6tLW3wNVxUVFWUFNaXO7czsjGw7+9vb2/wMTkQC4pJycrNEJl39fCubGvsbfCd0xA +Pz4/R1TpzsO8vL29vby/v72+xmU1JiAiJSs7YcnEv7ewrK20v186MC8yO07qwrm0s7S8xMzO +x8C9v77JUS8jHh8mMUrRvLmzrqytssRPNSooLDdPxrSurK+6xd1m99PDvLu8vMJTLR8bHSU3 +z7axrq2sq7DJRS4oKS493r+1rrC2w15KXti/tLS3ubi3wzofFhQcL8ysp6ipqau3TyceIC3l +sa2tsbi4xFk9OD/RuLe6wb+xqqq/LRgRFiE/w6+qpKCksUIkHSM8vqytur+9xNlOPEbWwL/P +XWDLtaqoq7w/KBoUFx44tqCdnaS07DUnJS1Ovq6wwtHd6O1cTm/PztZaRmW7q6WlrMY6JBcQ +EyD8o5qbn6rDQiwiIi/YsKqxzWZnTkVJWce3vu5JR+i1qqaosMc+JRgPEiW2npqdp627SCke +Hy+9qaix+Do5Pz9ay7ivt/0+OELCqqOiq8hAKx8WEx1Vpp2do6u4TCkfHy3Oq6mxzkk3PElf +vq+uuGIvKjThrJ+gqbnrPy4eExMjvZ+cn6mtvTkiHSNCtaitvvhLOUB0yrWuum44Kis/vaad +n6q4z0ArHRQUJbyfnqCrr8YxHhwnW62lq7vVXz0yP3q5rrdbNy0uSrqmnp+rt8VGKyAZFB/l +p6GhqbPJMh8eK2qtp6690GJALjPgsKmv7TYvLjfPrJ+do7PVRDEnHxkZKsClpai2xlIuIyhG +uKustsjWVzsuQLaqrc47MDMzPcKmnJyn2TMuMS8sIR4r3bS3usTAxkwzN/6/u8TO2M3XXj5e +r6y7TS8qLzRFs5+cn65vPTxCQjkgFhw1wbKtrqqs9y0nMErEvbu5trrKRDnSv+tANjNDW2y0 +op6ir188PkxJOigYGSnWr6qoqqnNLiEmO8Ovr62wuNU8KTBf19ffU0liUditoqOqwEY+TeBP +Mh4WHj+zrKSlqLczHx41yK+ur7K31jspJj3Eur/JfltPRs+qo6auzT82QHn/Nx8ZIlOxrqyt +sdEvJSplt6+ztLbCTC8mKWuvr7zJXUM7OdWpoKWzXzk7f8HlMRsYJWa2taysq8I0Jy7mu7e9 +v8PZPzItN8Grr7/gPTU0PryjoKq4cUJVzr9+KBcWI1+zsKijpcItIClnvb3Gvbq9VDUuOr+s +sdBWODI4R7ujn6ezcD5J2clPKhkWIWCvraajpr8sHyhPwb+/tK+1UzAsNcqutdtfQzk2O82l +nqWx3UA+YehMLx4ZI16ysKuoq78uIytixcnLurK6TTIwO82zuM7eTTczPMeln6avxlI/S+h0 +OCIZHTa8s66mqLE9Jic8eGptwrKzykU9OkzJusDNaTo2P9asoKOruWI6NVHFei4dGyVdu8Ov +p6nGNSkuTUs9c6+oq8FHNTVG7s7QznZDQFDAq6SnrsdANkjLx08sHR0uVlzXraSnvzcuODgt +McinoarLPzQ6REdVzsdvRUJqtainqq7DRj1Jar/KKxwcJjE5XqubnrRKMSwnIiu/oZ6ltmhC +PTEuQdjS42fft62vr6212kM7Ozlxra0wGx4lJC5jqpueul9MLiQmN8Cnp7S5tMs7Kys8b/XX +ta2vtbu7vc9cVU89YK+osx8OGS0oL7Gdl59JN3A0ISdAv62wuqmsXTw7OkJIRtG0tbu2r7G9 +705MPTzFs7m3VhgUJSgkP7Ojna5pvr4vJC1Rvba7r6i7REREOj1nvLK+y7e20U9txb/O49Fc +Qj5ISi4bJDstLdawq65m17ZtMz68rL9nvbTOQjhPvshyxrvUTV7Vzci+trXSQDxCNTZOyNws +KTo0LjpG3bzVvqu32MvL3WlJT9LJ19HEvsTP+FVLUtjEvry9wcpVPkE/OD1GRdLJTkdGOC4u +MT/NtrG3uL3qSUZX0cTIysfDyN7z9Nzv39Rru8fH1mXbRkI6Nzh6TNrWYdpnRT9OUEbfzczj +bF5VTFXZzcbPbcjcd1XWwHztzl7D8MHWV8NLWl1OUnB+bVReSljNaOlk41/f81HZV9BTTllk +cHb37m1x2kze3drO19VvwEfdX1DWP8lS7NBKzD3U3vbCTMHgYOJH7mRjeUW5P8XdWMxqWXJj +Tldl2uPa4d5dX0ddYWhP3/nqy0LdXlngatrJ29/R32nfUufT7l3DVMZP4t1R00zTRORgU8VU +bFXYR1dMSlzfW2a0P8JhVU3QTt+8YcbKTMxcR9fbUsXXUctMzE7MR+3aRe5H3cZU7M3xRk1p +PdJNz9zIdXTY50Dk5uDY781twk92eW//aGjc6e/Rfs1h51BeQlBO+XvfVMFPXd44uTbU4uu/ +WrxOvj3IQdbcVL9+yWhAwe85v2ftx15OxEZI1j7ITz7AXk3dxUa+Vz69U1VPvkv2zEG5R1PL +U/js4le4aEjP1Wr1YbhO231HyENQ5u9k3kzny0TlXMpRZ1Dl2VB8adFJWdFmac9L1sQ/xH7N +Y+5rzG7z/cvaSsZDxj/VTPvTPcRDzXxExlZmYNBOzF3iZNJN79tPvj9s1/1dfcdGxlpvxEvT +TsVQ991S0mZM5PVi6W9Hxl9MyVTi5FjNTNruSsvXWGLNXm/dWN3c5EK5XVPJSM1V2zzF3Dm+ +PMPfTMzr5F1uWXHSTeXVdmDvblTNTV3KcW//xlR462f5Sbo/e71H62a+NMO/L7rtP86+QlO5 +Oky5P1nHRctaaOb5TNPoRs/LTNfW/V3hYMzzTMB+Yc1eXMNST+TuUl5bZ89KauNxeknZZ9rQ +PsHURMhPY9ngP8bLVtblZezXVWff6Et1x1Jo1W3aZ3HfWdVS1krjzUDh0H5d5fBX1mFKx3lO +39JRYMhO59B78mPPSurcWGvq7VTr7Vvs0FFtx05n3WVcdelkb9h/Wu7d7X/r+/LVbPXl9N3x +b2XbeFhczmRPbN56R+LVW0/j6lXy+edv83Tk6nRubddhd+ns5Ojv59Z/6vjmbG/za+lealv4 +9lpqcGX/8V5oduVfZOz03m7o1eL+/utkbfVyc2/37nfr5mn57fDtdOlq93V8a2/yXO5bePln +9nzt9Xr26m5qdvLgc+nk6+146nB59nbpZ3T8XHZ7c2lv+WH8ZnxmX2xbb3Pnfejc/dzn1Nnc +2tzW5+bf7Of77PL+bWNWTVVLSEpGSk1QWW5q7tzk19TP0M/O287e2s/b0tPR2N3Y3t/d6ePp +5u1XTkY/Pzw6PT5ERl5od9XazM7Nzc/Q29jc29ra2drU3NPNzdTPydHS0djo395rT0VAPjs5 +OTk6PkZQa9/Uz8nJzdDW3Ojk3ePi393Y1NPNyMnFwsTFyMzU3unk8VFEPjk2NzU0OT5IVG7d +083KxMnJy9TY9PLx++/m5e/azs3Kx8TFyMnM0tTb3NxuTD48Ojc3Mzc8Pk1h8NvNysfFzM3S +3eZx9nx+9fnm29bMxsO/vr6/wcfL0d7h8U8/OzczMTAyNztDUWTt1s3GycvL0NjZ3t7Z3t3c +3NTQzcnFwb+/v8DHz9bb3uFaQjs3MzAvMTc7P09o7NnMxcXLy83e5ubo5urr4NrY0svIxsC+ +v8DCwsrS19ndY0Y8NzUyLzAyNTtJXnrezsbGxsLGy9DV2+Tu5eDn4NLNy8O/v7+/v8XM0Nrf +9lhDOzkzLy4uMTM5SV/+2MjEwb++wsrKzNLb2Nvn7+jc3dTJw8LBwMPHyczV3OhZRT46NC8u +MDI1PUpUadzKxsW/v8bMzdHX19bX4uPj3tTPysjEv76+v8PHzNpfRz04My8tLi8yOEBKWt3I +wcG/v8PIys3R19jY3t7b2tbQzMfBv769vsHHy9xYRD05Mi4sLi4xOT5GVuPMyMO/v8PFyM3O +zM3T1NHU1M7NzcnCwMC/v7/G0N9SQD86LywtLS4xNzxKatzNw77Aw8HCyM3OztDR0c/Ly8vI +xsnHv8DEv8DR7PFLOjc0LisuLy40PENU3srCvr28v8bEyNnSztzk09LXzcjGxcK9vcC/w87p +dU09ODQvKy4uLzQ6RU/rycXEvbzFx8LKzs3N2OPQ0NfOxMPDvb/EwsDH19dpRz03NSwsLi0w +N0VKW9fKyMS8v8fCxM7Zztbv2M/Tz8G/xb69vr++wdThZE87NzUrLS0uMTVER1vZyMjCu8LE +wsbU3M/e7dzS0s7DwL+7uru6vMPLfEs/NDQsLC0sLzQ7Ql3fyMPDu8PCvsjOztHe3drU1c7D +xr+7vLm6vcLO/U49NS8rKyorLjM6RWDjw7+5try6vMTFydTf3urr29DHxb68u7q9vMtyXj85 +LysrJyosMDVJbN6+wre4ubK7wb/E29HS6tTRy8nGv7+9xcTPU29BODIuLCctLDE4QGVnxcW5 +uLmyvLu8v8vIxt7Ix8W/vbq9u8bMd0hGLy4rJyYoLSs5PlXfyry8tLqytb63v8jKxdHSwci7 +ube0uLm/5lY+LyomJCAjJyovOU34xL+1srWtr7a1uMnFwtPMxMK6tLW1tLnifVgwKyomHyMm +JSwxPkn8zb20uaystK+vvMm6xs+8uri2tbi2w2nXRiwrLCQfKikoMjxCS3vVvb66rbS6srPD +wbnAv7exr7a3sMpCf0UmJjMnHysvLDJATlttzba6v6+uu7y3v86/u7q4srC1sr9ZVjwqKC0l +HyotLTVEVOXMxra0trGus7u6wc/PycG6t7q3tdJdYDssKislJCksMjc9XsjCv7Kur7GvsbrB +ycrM1su+wL/C811cOC0wLigpLjE6PUN1x8PFt7CysrGzt7zIxsDI1MrG9EQ/RjcsLC4tLTA5 +TGr0xbeys7Kvr7K4v8PJ2v7v2d3rYkI4PjkrKiwrLC8zQt7KwrWtq6qrq6qstLy+y9jsZlRU +TzUrMTMoJScnKi4uN2TJvK+qqKOipqalq6+yvs3P+kY/OCspLSgjJSQkKSwtO2DVva+rqKKj +paWmqquwube6zfBUNCosJyEjIh8jKisvPUzsvLGspqOjoaOoqaqzur7K3Wg8LS8sJiYkIiYq +KjE9P1rAt7GrqqilpqiprbCxuczhVDYwMywoKSYmKy4wO0RN2b67sKytq6irrq21t7fB02Y+ +MDEtKSknJSguMz9XW9W7s62qqqqprK+vtbu8xNX5RjEtKigqKSYnKy02S1/iwrivqKWlpair +rK+4u8PUfUc1LSkmJiYkJCgsNURP9cW6s6unpaWnqautrq+3wNJONy8qJScnJSUnKjFBSm7R +w7asqqmoq6ytr7Gxt7zLUjoyLCkpJyUnKi04R13Mw8C1raqoqa2usbi3uL3A0kc1LyooKyko +KCktO1Lhwr25sa6qp6irrbS6t7q8wOc+LyslJScnKCkqLz9szLi3s66tqqipq66zu7q6ur3b +Py4oIyIlJSgqKi89bcW0r7Cur62qq62vtbq6uLm2vmk4KyUgJCUmKCgsNkrVuq+ura6wrayv +sbi+vry6uLfMQjAoIyQoKCorKzRJ3ryvrq+usLKusbe7xc7Ivru4vWw4LCYkKCopKywuO+q8 +sKysrq+vsbC1wM3V5828vL3ETzErKScqLisqLTA+zbWwrq6wsa6us7rG6V1p39PMy95bQzc0 +NzY4Ozk2NjxN6MzCw8zV1L2ws73DwcXKy8TCyMTA1ExBRz41Ly0sKiktOElx29jMvLKtq62u +s7q9vbu8v8vU4mRENzAvMC4rKisuOERzx76+ureyr7C0ur/Ew76+w8nKytFyRzcyMS8tKysq +LDNE7MG5trW1s6+ur7S5vsnW19fOysjNXj80MC4tLCooJik0Tcm4s7Cwr6yqqay0vt5gaP7d +zczR2f5LOjQwLCknJycqNUjdvbSvraupqaqttL/ab2FXX+vY1NLZcUk4Mi0qKigoKSw2S8mz +rKioqaqrrK+5ymdHPz9FTmPk0s/Vdkc8MSwsKikrLThPyLStqaiqqqyvsb3ZVD87Oj1KV+PF +vrvAcEQ4LiwrKSkoKzdQv6+rp6ipqqyvtcV1QzUzMjZCXcq6tK6xvOhCMisnJCUmKTBD27qt +qKWlp6yvuMbuRTYuLS47Wsi0rKqprK67LSIuIhokJSAwUsimnZ+dn6qy2jstJSIjJzBMv6qg +nJiYnKK8KhYPDQ4VHjG3pZqSj5CWpGcmGBQUFBooV6abmJeeqq+6tK23xlwuIRkUFhkhPsal +nJmXmaGyRiIbFxgeKD62p56doqm9X17fuquqq6y88ioXEA8UIVqqm5mZm5+s1yoaFRMaLOar +n56fpK6940hK3LesqayvtNMzHQ8NDxlLqJqWmJygqu0tGxIUGzKzop2fqa+5wNlXRUntu6un +p6iqt0oeDwwNFTaqmpWYm5+vdCoYExUeV6idmp6prsNYPC8vOmrDtbOxq6KcnapNGQsHChMx +p5qVlZqdqlAkGRMaK8CemZmcp7hbLSIfIS7ptqqqrqqknp6sPh0TDQwSH0SlmJWTmKCxRSQd +GxwtbKucnJylxDYmHyEqN+a9uq+zsKyrqrXcPS4vLiUbGiA4qZqXm6rMPS8oIyEiMsejmZme +rVYqHRkZHzHCopuboK7D0srPeTwzU7+6Sx0WFx/RpZ6hsOP72k49KCIxxp+YnKxDJiAiIiUs +Qa+empyr2T5D2bSvuLm1r7E9EQkJDTeaj46VqLzNNiUZERo6o5GSnc0pHyYqKjZLsp6anKpf +Li43SeVb1rGkm5yzHAgEChutk5CUnKy8+ScZExY6nY6Nlr0mHBoeIyQ8sJyUl6lKKCAqPlbJ +u66fnJ6qPhQIBg0ko4+Okp7AQC0fGhoku5iPkaI6HBcaJDdWxa+loKW5Py4vSL6xsrvEvK2l +p7kuFQoKFzqfkZOapLj7Ox8YGB/anZmdtDUoLz9WTDo76bKmpbPc37+vq707KCc7taGepuUf +DgsQHr6YkpOarzQiGRkhOq+bmJuo5yoiISQtSbaim52q6CsmKzhc7VhW37amoqSowzAbDQoR +K6OOjJKkPyAfICAoOb2dlpmoPR0ZHy7rtKypqrDNOSopOcutqrdVNjvLq6OhqcMvGA0OG0md +kZSctDQkIB4hMNSlmZmhxCkbGyI5tKSfo7dILCYrUbepp7ZrPztUt6qop7NOKBcOER/fmpCU +n98hGRsgNb+mnJidsi8ZFRsyspyanq9AJiAlNr+qo6W0XDQsMv6uo6CktEYhEgwQI7aUjpao +Qx4dIypJuaqgnqjKLh4dK/mtoqm8XDUvNDzfr6moskkqJSpZqJyboLRNNCMVDg8ftJGMkqsp +FhglQr6ysKmiqLwvGxgj66KZna5LKycsOuq1qKSqzjEmKEetn6Ct1j9EUzIaEBUls5eVn9En +Hy/WuLncV8Wxsco1JClvrKGnyjQpLUXKwb60rau0SSYeIkWpnJ6ou9vdeCsQCg8io42Ml7km +HCg4Ozw77aOZnLQpFxo1s5+ivT83OkxoSuizp6W3Lx0cKbmblpqnz0xBLBcLChi5joiNpyoV +FiM4UsqwoJiatCUUEySwm5qmZC8uMjxK7rWloa09HhkgW5+VlqDINC0uKRwPEiylj42aTB4Y +H0m5t7avqaOtOx0ZH9+em6PKLyszPUFDUbqloa4+Hx0sv5+bobROMjdJYj4fFBxFqZmcvTgu +L92yzkZP77eqxTIpLFGpo6/XODJBSTtAWb2lo7JDJB8s366mqrW6u8bR6E82HREYLrycmqrJ +aDtOcC8oNuKroKx1OTRAy9VEP1TEr7hZQ1HArbRfMi02fr+9x8q8rq/LPzdFa0QiFR06sJue +st/tR/JMKytMt6SkwDovMj3zXk7PuLG03zc9Y8rGcklxx8XhOjJKtqanu0Y+5rWyQxcNGT6m +mqPEyrvJxjMeJFOtnqXeNzU4TnA9T72wrrpCMj9Ib8rFt6y9OiYjNrKipK7PWsi1vUwcDhMw +r5yfuMCwtsg8Hx40v6mow0hk83JYNTbauLK4Wz9ZXWbRyr+zwz0sKj21p6mvv9O8ts45HREW +Lr+op7Cvpq3+Lh8hPb2ytMHHuLpjNCovbrazu87d0/ZKP0rQt7XOPjI49rq0tLS3trjLOyIY +FCBLuKilpaKn4i4kIjD7zMK4r6qt4C8pLULIv8W+u7zDZjs8W8i3v1E7PVLFuLe2tri9zj8o +HBYaMsyup6ejobFFLSUoNj5ZvKuiorg/Ly82PTo+17Ksrr5NQEha2d1XSEvivbW3usG7vMxI +KhwWHjj3ua6nnp60SC8oKy0tOsGpoqa5fEo8NTAuPsy4srK4v9NMRlRpaEU+e7iwsr3JvrrQ +Nx8XGyk84L2rnpyowkQxLiklLFS2qamvtLxkOC0tO1Ne17murbfqTV5jTEFBacG4t7W0trpZ +KxwYHikvVLKjnJ6ss8U/Kh8fLVrMu7KnoKfUNS0uMSwuW7Goq7W8udI7LjBGzMPFt62psek1 +Ix8fICEteqyfoaSlqLZLKCEnLDM8U72moqauwW9ALCQqOOK+vLGpqrXnPUBTTk9d07avt+Is +HSIrJyox4aagq6qmqrVCJyotKywsQrKprKytrrNlMS4wNDtDfLqwtLe5ubnSUlhQVFRHRTgm +JzAtNkzls6qysauus807PEE0LiwyXcXBurOuqrXeZ1tEODE2XNLXz8a3rq+8wL/TTzQrJSAj +Kiw0arepp6ysqrC/bz48PTUuLjdU5NvHtKustb/Axu1GOTpCRUVV0Lu2uLi0tr9fMCUjJCIg +JjTpt62moqChq7rJaD0uKSsvLzI/b7+4uLCsrbC8zNF5SD48PUlUa8/Fvr3UQzo9OS8qKjI+ +Slbcu6yprK6vtb79Rj86NDMyOERm0cbFvrq8vL6/wcjX61xMST49RU5ffGhYZl9ORD48Pj5F +Uv3Pwry4tri9xMzqUEY+PURNZ93NxsbJzNjt6e3u3tnS2NbkZFZMSElST1BXVlNMSUxOR0ZN +beHPyMTAv7/Ezd3mb1NJSE1TatrNycXK2WNYWF1nbtbMyc7P3upmVUxFSUlIQkhNT1FaXV1y +2MvM09HO1NHM1N7p62lWTWJeaufZzc3P4OtxXGFZVffhzs/X29zqX0xGRENAQEdPYXnj2dDO +z9Tf59/ybn7n3uTc1tns62hpaHD49Nje1PjseXlrZvb62ufT5Ndvd1tPSENHSU9OWWnr3dLY +2uLtbl5kYG9+4dnNzsnP293e7GRhWnhie+/h5+bc6eFz6PHu925dVldNTEtPWF1nfObl4+7u +7OXta2t+dWNod+PZ183QytjW9PZ5VmRaennr7djV1dns5+3ra1tSW1hYVEtRT2Jgamvt5+zp +6N/p9F9oXlxuZOTc1NDMytnc3eJfWVNmYP3r3szQztrrdlhcVFtZXGBoYWVeYFxsZmfu8914 ++3l5b3xhXltw9e7j3c/OzdfZde14aGph7HHe79Xb5N3uZVNUVVhdam19bHNlX2tedGFsf//p +9vh2e3p+bXRt7OLZ3d/f3tjp7PV7cXd0d3vs4+Lj5/pqZFpWV1deb3x1++/u7Pl88XJvbmv8 +eP388n91/3Vvfvbh3dra4uLzaGtqYGBpbPfu5Nzm4+ToaGRcWl9eZW10e97f+314bGhiaHl+ +9ffx8/N/dXx79Pr57Ont6OLq+Pl1dnx+/m9ZYdbM12tafdzuVUtVd+P4dPvrblhr5N57WGjf +09nkfXn6/nt4Z2N2fXz87nhnZ+rY7G3+2dDfdnD77XVgWGVuYlpk9PRgXPre5HZo9dzdbWRz +6/h6ZHT1/mdw8+/q4d7i1tfb62l372JadHhsbl9ZVmXm6F5r5dXce3rY1XtqXmpjWE9m+2hr +8OLzdfvg6Wp85+tsfuPS1vHq3NHX3+rc193k7eXqZlJNSEI9PD0+Q0tT9tLRzsnFwsrWzMXP +3tza1+1kZ93O1dTSx7y9yMbG3lk6LiwsKSctN0540Lyvra+0ub7RVkQ/Oj0/RFffzMC7uba2 +t7q+v8C/wdFURDYsJyUmKS44U827sq2tr7fE304+NjQ3Pktrz8K7urq8u7u+wsDBwr67vcxt +SzUpJCIlJys3a8C1rq2tsbvWTz08OzlAUNjDvsG+vsTM39nNysW/vriys7xrQzYoIR8jKTA+ +47qxrK2wusp9UT02Oj5FXNHDvL7Bxtp07dzZyr+5t7ayr7PHVDwtIyAgJSw1S8+4sK6zucLc +Wkk9PEFQctfHxsDJ3PleXW/ZzMO6s6+vsLC1x005LiUgHyQsM0PaurOvsbm/021TRT5ATPro +3dHJydTsaune08rBvLe0trq8vsLlSkU3KSUlKC80PGnDua+vt7vG4FxFOzxFUnFld8/JzNDX +zsjIx8XAvr/J0NPZ3994ZlhEODMvMTY2O0hs2MbDxcPEx8nP1+Xr6XRcTktLRkZPaOvPxcK9 +vL2/xsnJy9PZ1drrYUo/PTo4NTY7QElYZH7XysO/wcbQ5HVZSUFETFNf7dLKxb+9vb/AxcbF +yc7P1ub7XUs/OTg5NTQ4PUVT+9jNysTAxc3fX1pZVlFOUnPf39rY08zFw8K/v76/xMrU3+9h +VlBMRT89Pj48OzxDUGNsbXbo187O1dfb2dXY7l9UW3FsVkvmvcXHtbK5vMDMztjk+GRQSDwu +KisyODtEZcm6trm8xMXK7EhAPT9JVFRYds7Bw8vNxr++y9fe1M7O3tjFvcHaXUw7LCYlKjU7 +TtW5sKywusLPbk09OTxEWObp+NjEyd/t2MTBz9TIv77Dz9DFwsbhS0k+KyMjKDQ/SteyrKuw +vsrNXz45Oj5Pefvmy7/D4Vhi3NDY5Mq5tbm/wLu7yPRPSk43JCAmLTY4Q8Ssq660ubzNRDQ6 +Qz8+UP3Nv8jb6eXd13Rpy7u2t72/vL7GzuReTkMwJSMnLTM4Vrusr6+ws73uPjpAPjo/TVzN +xtDRztHP1PXcxLy5ur++vsXL0OBpRTkvJSQqLCw82rqvra+trr1rTkI8ODk+SHPg2dLOzcvO +0s/Jwr+9vr7DyM/a3N97WjsvMyskLDg1Ssa+tayytLLIVFZHOjw6N0hoY93LycC+xL+6ury9 +yMrJ3l9UTU1OSktbYkU4NTI7PzdCzr/HxMK8u81o8/ddTElUet/s4NXPzNDRy8rR2drV2PdX +Tk9KR0hNWWJnb+jd3NXQ0dPQ2e9tZFtTTUpLTExLVW/s5uXm5+bj3tXT1NHZ29La+mBVU11b +WGT869rX29jU0dPX5/xxZ2ZkX2BdVE9NT1Zgav7o3eHo7vLs8fd3a2pmX2Fia2v04+3q2dPR +z9Lc3eTv7GRebWthbnlqd25ZXmFdY2967uXo4OPs7epuY3JlWltcXWhsbX3r6unh3dzZ2d7s ++vx2b3r5e3f6fXFza2NqeG9xfXj8+Xd+f3lwa2hnbHRwfPnv7//w39zc3N/k5fx+e/v/eP7+ +enp4amRXUldZXHLz7e/t7n5vbGtrePTu7ern4err6e7l4uvm3uDk7/x7b3d+eXHy7XZlXl5c +WFxfX2N48ezo5uz5fXRyb290fPjr6fV5bW5+8GZgyMxuXt7QalXW2GBRbN1vU/TR91ZSTtDU +Tn3Kz2Fc9etmTU1n2vdZbWpT18tmWerO4l9e29V4XG/X1XFd/dvc63p8+3ZlYGFsenFq/ep7 +ZnXk6l5d+H9gXXPm+mr429rheHLj3+Te6XL68+PI0zMsy6hrJDmopkkqV6y6Mi3stWgwRbOx +SzXossA9OmHM3VtVSWPKw8zQz8nVak5ebmRKRlLp6XRf79LY9/z/Vk1VYPLxZe/bys5pYurj +5l5ZXuTR51VrzdVoVuPXX1ZlfnhYWG/i+k151OHf19ze2+ze+ExO7uJORPDJYEzfwMtLStbH +bkRVeNXdX/3TzPh8eGf6Ylv53e5YVvba83Tm3dnqXGJuWE7f1lNPfczaVVffzWdSWt7TcUvj +xN9WZNfPaUtd3NhlV+zK2F5u1NZeS1jv6FJV5dnlbmr+5F9gc+9uXFl829nj7/vg2PJUU+LS +aWh079pzXH3jfer1Ymbbe2RXY93Ybk9Y1c9rUnfl8/1ZcdTP32Rb19tbV/NkXlJa9+3x++T2 +8d1+WPrYy8xkTV7Q4U9H79Dhcm3nzdpcVn7YaEtP/+HuYv3X8GVo6+JkXVz63+twZODO4F1a +X3Xd5HFreWz72vZq3cvNdVlx29feXnPX/lFPWO5lT+5oSENJ/Nh1Ymdh83Nc+dfOytf65cm/ +wc/X0Nbvf+rm1MzYdczEdTImJzE+Q01o7NniXXjezMPO8NfEv7u+wby+ydLi4srKz87Xyr2/ +VB8bKDpCPTrkuMtDNT/Twdps3MK2t7q8v8XG1vHjy7q5ws3Syb/BVyAVHj753E9mrq/bRTMy +TdDS1dTAtLjE0NrX2GlPfL+yrbHCzsa+wEMdFRwyz8Z20rKxx0Y1PF9aRkrlvLW1vcXL0NpZ +S3O9r6yvur+6s7oyGBMaL8rA58+7tb5PNTpS6Fs+O1W6q622ws3N41FdyLOsrrm8uba6OBoV +HC/e01Blw7q7zkg7P1bqVT4+brywrrG6yPlQU9+8r7C4u7i0tvcmGh0pNjk1Pti5sbPEYk9P +VFZJP0BTyLOsrLHHWkZL4sK+wL64sa+z3S4hHyEkKC5GyratrLTJdE1NSkA9P07Ot66rrr30 +RkNb3c7Du7Swsra9XS4gHB0iLDxtxbevr7S6v8z9Qzo8QlHqybu1tb7aXGDWxcPJ1NfOwbi7 +cDAnKCwvNTk+RFbZvrSvsr3L0s7ZXEVDTu/S3Xxz4MzEyeBiXv7UysjIze1XTU9RTUU6MzU+ +S1ZkdtvHwcXM0NXo7N/yZWRkdeHU0Nbo38zIysvJxcbXd3jrcU9CODMzNjo+R0/51szJzs/L +zM7V5v7o3uHl5ufv8eTVzMnJysnEw8nS4WNLPjUyNDg+REdIS1d/0MfFxczV0s/a5dzo6uXv +9/Lp2MrDvr2+vb3MeVhWTkQ9NzQ2Ojo4OD5O9NTKysa/ws3X19ja7l5bY+LOycS/u7q+w8rJ +w8n4U1FOQzkvKysvNTo/TPDIvr3Cx8fJ09TR3+3f2tLLys3T3NzPycPAwr+9v9FWQj03MC0r +LDI+S1deaOjRx8LFxsHBxMTIz9Ta62taVV/p0ca/v76+wMPG1lM/PTw7OTY0NDk9QEVMXtzH +v76/wMDAv8PVXE9PUFplbPvcy8K/v8DBxcjJ0XNUTUpDPDYxMTY8QENHT3LMvbq6vL/HzdHc +Z1RUUlRZZH3fzsjFxsfFxMTGyNH3WFFPRz44MzM3PEFJUWvXyMfGycnJztPbdVteZWtub37t +4djOysnHw8DBwMHJ2/9eTUY9ODc3ODk8P0dZ6tDLzc7Kyc3R1eHv8O3ve/ns5t7Yz87OzMbE +ys7P2OPxaFdMRkM/Pj0+Pj5AR01c9tzSzMjIx8jJzNXg8W9ucX/n2NLX2tze29nW0c/Rz8/Y +7GxZSkA8ODg5PUFIT1hs6dXV1c7LysvO19bR0dXb6fj+fOvf29jUz87MzM/Y6HtrYVxPR0RB +QUA/QkRGS01TYuXSysjLysrN0trh6vB9fvzw6uLc2tTS0NHU1NLU09Xf/V5RTEhCQEBBQ0hO +U1hbYHfs39rb3NjV0tnd5Obg5ujm3tfTz9HU19nd5OPm73Bpdn52Y1hPSkdFRUZJTVRgdfXi +2+Dj5ufg3tzb2tzZ19bU2Njd6O70+vPm6+7q5+Pm8fH/ZV1aUExKRUNGSkxRV1df69TOzMrL +zc3Q1N3y+untbHHn29jOyca+vcLCvsXvQSshIiYnKjZ2sKSiqKywvlYzKio0PUTRr6qrssjw +XkA3PWLCtLKxrKuvvkgmGBUYHSc7uJ6XmZ+t4y8hHR4sbq+noqWqslcuLDM6S+q/r662ubGy +t7rIRC0jGRccJz7Dq6CcoLJSNCooLDNqr6Slrb3OdD4vMUri1+7OurCxsayss8pYNysjFhId +Os64qJ6bplsqKispLuuqn6CsvFUvLDE2Vbi0u8LmW+fNu6qmrrnFXjIlGhIbPs/Ur6Cdpkon +LTgtL9+on6S51kosKDTuv7rH53BBNE2voZ6irbvSRisnIRgaNd/Pt6mkp+YpKjMvMtWon6e/ +fFIuIi2/r7zO1dNcNkatn6GptcluQDMyMx4YJ0NO/ryqoK44LDw8Nka9p6e8T006KzO7pq7N +UE08LjO7np2msbzWPi8xPCcZHzvd1s21o6lHKi87PkjQq6a1ZkY+NjLLoqjPRDkzMjXPn5qj +ss1hSzQvQjAdHjJwzufMq6jdLi88TFbQsqy17UlAOUC1o6zVOyspLTu8npqgr9hIOzQ4VjEd +IDjay9O+qalkKiw5RVHltay5XT9EQUy2pKzlOCooME+1npuhsPA4OUVTTikbHjHTxcKsoq0+ +JiczQk/FqKa2aEE+Pj+/pq5dNS0sOtqunp2qy0o2M0DN9CQdLDxLw7mtqL8uKTU7RNSzqq58 +Oz88Pe6wp6zgNS0vOt+toaKuxlo8QO26VBwYJjzWurKjot8nJjFGXcusp7dELzA9T9OoorRP +LykuRsOmnqa31kY2PN3ALhseK1q5u6+gqkAnKDjXzb+ssNw8MTFGzLKorMo/Lis15bSnpbDI +9Es8SMj8Jh0hLdWzuKqjvDMpK0TEvbmzwlk9MDRauKqtwnE+LSxCuqajrrzHWTk7bdAwHh8r +Ybi6r6WuRCsrOs67u7m++zwuMUnCray9204xLT7HqqSsuMFlOTde0TUhIi1JxsO1p6xXLiw4 +2Ly9vbrDPiwuPb+str+6XzAwPM2qp62vvkw1NlL4OCgnMFjfdr2rr944LzzNvcTAvcVJLio1 +vq22u7p6ODA6xamrr6y5RzQ8Wj8qJS9O3Wp2uq6/Rjk888LEysK/ZzIqM82yvLy41zwyOc6r +rLKur8s8L0lHLS0uLm26Z9Wwul9MNznKu83As8dBLS1SvMfJt79KMS9brqy3rqq7RzQ8TzAk +KULd0dzMtbVbMzdKzsTZwa24Piw44szkzrm9TDNCxrvCuaupvj4/engrICY0SGXrv6uubjQy +OmXfXr2ksTxC5WlcV+25xjo628PLzLuustd3SjrOwyofKjE6T+awo65PNzo8Oz3Sray8zMTU +WEhbxsxJPlbW0My8trvMeEE/T1u/sS8PHqs0IaWWo9QoK1csIrqan9VUudgtM7mqvTk09uNE +2qyru2hEZE4sVKmqMg8buTUguZmbzyIoU0g1zJ6bvzdqzFVD0a2xRjBL2FJMvK3OQN3JPzfr +uK5LFxxbNSPrnaDuN0v/ST2/pKnoZcXmR0fKsbx63NZIR3jh5d9ZRMa9TPC95C4eJDMvM9qo +p8RHW85YTb+rrMlXfupRXb63vc/o1GpBQU5HRdK4ucneRSciLjIuN9O4vsW8uM1S3L29z9bE +z1puxsbNx8fQXl7k9WJKRlRzbFZ16T8xODY3QERP2djMvb7Cvr3DztHOzu5f8NjncNLMbH7t +Xm71cepiP0ZVSkhW5OJPSE9NSFH62/Lzzc7Rw7y/z+rf6lhQZvBtX19bWXbU1tbM11ZFRVBy +afLU2WlYdN/wX3PebE1b8tfX1MzVbk5Vb3hnaHZmT0xs0cjK0+ZXRkVVctzLydRsWWvj2Nzg +291pVmz4/+rX22tPSFbveFpXWldOTF7WyMrP4mVUW37i2dPP3GRWfNLR2tzdfl1jZmxvYF5j +XFJd6dzialRWT0pT7M7Hx8/nY1Rf4+Df1dv7ZV9pbnr16er7dXttXl9odG9peuTm6+14aV9Y +WWnf1NLQ3HJcWnPi6H3p/VtVVWBocO/b2OL2c2NkdX7t6ubn4u15dvD7cWdnb2x97eju8OTs +/nBrYmNfWmBu7vh97+rs+u3f3/L87Ot7+ubm+mdfa21lYmhpbvvu5ebt5uP1bWtsbWhn/+vt +6+De6fn8dHN/e3jq5/V3cv5vXl5oa2RbXmz+6d/f8Pd2aWhueHvy/XJx8OTl3NXW4f713t3f +3tzvXlVZXFhYYWlrY1tkZmBt6+v6b2xz7+Xf3ePv7uPe3NjX2+l+b2x+5+Z8X1RQT09bY2R3 ++vXub33v9/Pm3uN/c/v56+Pn6/f04d7n6ODp9nJoX2x0c2teXmFeaf5qbe/y7WdWd85pYdrm +/fJx5ub15+t/bnBu72jx2Wrd7Vj6fV3t6ml8eHZ8eHf4cHz+9+rv+mVsa2xuW01y1mjT0v7f +ZV3hS1LNYePP9dfYbNXq7vRG/M9G9+pc31hl02XjamToeul7aXxk8+1+eHXodPl+cfvwb3xy +b+Zl79pJ5u1M2f1p2t53e+v37eB6a173/F3r5+7Y5e5+/WZdbWNu/ONtfm/qbndkVdteYOfz +3d7k0HTq7Wh2aWNmZ2xiavVt73z05WznfnjzfOn9/fpo62594fj14HN4cl1qcf96Ye9taN92 +/3lz6XrW6OPN5dHX99j9XmJVTEk/REI9TU1KfuLeycXEv72+wb/Ez8vG2dLM1NpTTlA2MTgw +LTM5Ok7d7Mm7v7+6u8TJy+Tw3/dp5t/hy7+/v7e6ysfnQjYxLCsrKy83RFvbx7u6tLe5usPL +zd/z7Gdic+/Zvr26s7zI3E43LSwrKSsyNkb2zL+4tra5t8TV1l1QWE1KXG7gxr+2r6+ttL3X +SDoqJiknJS82PenDvbSvsrm6v15uXkFCS0RJadrJurGtraysu8diNi0nIyYoKTY/YMW4s6+2 +tsbS7EJAQz1IYl7dx7y2sK2rra2wy9c7KywiHicrKT541Lyur6+2t9xGVjsvP0U9/cfLvrKu +raypra+wy1M9KyckISMrLD5yyrqxsa+5xNBDPz8wOFVL5Ly8ubGvrq+trrS4vVZCMCkkIyIp +Ljhez7y3sbS3zeFPOTg+MUHb48OytLGvrq+vsbC5vtJKOSooJCIjLzI7+8C/t7K3wfDtSTc+ +STZew82+sLK0tK+xt7SxvcLdQDUpKCUlJjEzPubGwLu5vMX66U04Qlo68Lu/u7Gytrmys7q4 +tb7EekM8KCgoJCQwOD5Zyby+uri/YPZfQDnoTlm7trq2s7W9vri8x727yNlWQi0rKCYnKjU7 +StO5vre8vc/5X2I4StlOyrS5u7m8vdHOusPLvLm+dmxIKysnJiQsM0VLybe4uba3y+dw3zpM +y/DZtrzCzM7FdXjEwMC4tbDAbUkvKCEhIyYuRWvFsa+utLW+3E75PTnc5XDBvcPL4NHdcMm8 +ubWyra/iVzYkHx0eISk5zr6uqKess7zOSjlPOzjvyezGvMHOaN/MX9e6trWxr67NQjUgHRwe +Ii5OuqyooaWsvMxfPC83PDo+yL3PwbzE8VV30fXct6+ytK+x/jYxJB0eIi45c6+mq6eqs9dE +PjwvMEZPS2G4udvMvtdYUP7M29G2sbe5vbjMODgwIiQnMUNzvqmttrO/cj83PD8zP+DdXtC2 +tMzeyO9GPkrp1tm9ra60sayuUjw7IR8hJTZKVLCsvLW95005OFE8O97Ayse3r8RGTVc9OELV +uLexqKasr6+z2TArKRwcICw6SMusrby9wstKOUnbTUPdur9jzLLKPUhoak5JvqyzuK6rsMnG +tl8rLiodHiAqT0zTqKe5uL7Oajs56U46+L61usPJudcvNFJYSGC8qay6s6y46U/RXystMiIk +Jir30mCuqLu8zGvKSjNo70j0xbmww0x94zctQs/K0sKtq7rOvbnYTGq80zMxLSUmJC/rzr+r +rri9dUpRODleVujCwLS6Zn7qMy45SOHNvqqnsLO6wMlneb7cQFM7IyYrKTlARryy3cG92dVh +Qc/JR/nCzMVdPu5gLzf+x7y7sKatwcPHy9lax7XNT0k7KB4eJC81PcKpq7a3tLlfNj39Qzpa +w7nDYFjJ+zY8zbe9w7aqr87awL/fS3LE1kk2LCwiHCNDRF64qqarw8S+TDE6TVpWT72vvexi +4W83NNm6wsS5rbLX4b/NUkfpyepOUT8zJR8nLj1Oy6+lrrm9wXw+MkrrRk3HvLzTU2ZLPUZF +zbW6urGxtMdr9+xTUPPN2k9EPiogJis4TfyzqK+8u8HaSThAeUVBbsC8zlvSxVg8Ur65ycq1 +sMhf+NDyREfLvdFo3fk7KCIpMi031LCttbuus+s/P0JANDjPucjWxrfEPz7NxeVlyrS65NO8 +xl5T48zoUmZeRDouKi0uOU94wa6zu7jBz2E5PEs9QG/Kv87sw8dcTvTPyefivbzPzcvJz2Rq +zNfnzNhQPi8pKi01QljJtLa7vL7MYUBJVkhFWO7O417YyP1g58vByNXFws/V1NPLyc7OzszI +60k9OTAqLDZCR03dwcHKzMfE03ReX1xPTVFMT2N608W/uLa6vsXV3/FcT01TWllf9eHh6N/Z +2+b9b2VJPTw8Ojk8SF537+Hb08zMzdXa1dbv3s7O2ORydvfh0szPx8PM0M/Q19/r5uLwXE9K +Pzc0NTc4O0Vb49jZ0s/U4N/c5efa09Ta3dTX7Xjq3tHOzMO+vsLKysjN3OxrXE9HQT04MzM1 +NzpCWOzZz83Nz9Xf1954cdnP19nQz9ns7+fa1c/Mx8LEys7Pz8/b7PlvVElBOjc2NjY5PEZX +7NLLy8nKz93l6mtgbv378dza293XzcnFwsLDw8bJz9jY3u91XVhQSEI8ODc3ODs9RFb34dfP +y8zV4OTxc23o4Onk1M/Oz87Jx8XDxsrLztLU1dzj6e5kVU5FPzw5Nzc6PT9FT2nhz8vIyM3U +3m5cYXV6dfHa0s7MyMXExMHBxMjM0NPU4O3udVpORUE+Ozs7Oz1AQ0hSY+/d1M/P1NfZ73F9 +5ed899nPzszLxsbJysrLy87W1dfi5+11XlFNSUM+Pj08PUBER05f69jSztDU1Nv9X2Z4bGL5 +2dbTzsrJxsPGycrN0dTU2d7j531fVk5JPz0+PTw+QERKVmf23dLQ0NHW5nf3+Wdmbuvb1MzI +xsPBwsTDxsvU2dvk7/puWU9JRUA9Ojs7PD5BSldn9+Pb1M/N0dvo29jtanzk3dfT38rEyMG9 +uru/xcbO521rXkY8NzU1NDA1P0pSWeDLw8rOztXk5/9TUmF+YlJmzsrPx764u8HAvcDN3d3O +2l5acPxTNi4uMy8sLkHm2NO/srC6yszO30o6PVRZTFzOvsfkzby7xtLGvMDW7NfJ4lFcfV1L +Qk1ULiowMz9DSMG0vr/Dvr1+Q0ZJU0pE/MvMy9PLx9/x08rFzNHCw8/i3tDZYE5YVktGS0tN +OTFDTUdJasjDfG/R0lxCS+HiZebLwM951MfP59zEvcvTyMLKcljt/E9GS2BfUUxOXVRDQ09d +UFBkfHJeYO56W2H4bmt03MvP2c7JytLczsfM0Nvf42dq83JiWFZsYmVvYF5ZUV5lXF7t3flW +WHt6W1NddGNTT23Y2d/c1NTkf+jj8frw6X1u6u3x737k3/D6f9/Y6Obb3OR6et7f/m5hXVpP +UVhVUVFZYV1geO/vbGfs6vzu6+XscnDt5e/x5tnY5OTX0tXa3Nve8PLtfG5lW1tZUlJZWllV +WmFfaWt7/Pjr4Ojp3+bl6vPs7vTw7+3f3+Xm6OHjfmttcXp5dHr3+XVvcWZobG1jXWJkXWVo +evV37u397OXp6ff+9PXy+f3v6ezu9Pbs5+PnfG367uft7v9rbHNoWlteZmhtbXJ1b/18a2Rk +ZW386uXm4+nu7fDv5d7d3+3r4uPo7/P5dnJsamZgYGBja2psdXlyefnu9mxnamZgXmBoffz2 +497l5uPj5+vd3ODo+PTt9X789/Ht+W9ja3FqZ2FhbHhsa21vdG9tcXh2a2tqZHnv93p86u71 +6OLf3dzb3d/l7erqdmv+83hlaXVxbmtgYGdrbGxvdHBx9/53fvPtenz5//14/enq8/Hs7fHy ++n55dPTf5Pz793Jrann0em159/977/5oamds+O1+cnZvZGNx7u/v7Px68vDq5e/r7urueu7q +5ubr7e75cmVeZnVnaXNrfHRqbm1lYGz+cHVzeez/ePLq4+f0+eXl5uTj4On+dPPs+Pnv7/L/ +bGtuZFpfbHdbXHr6b2Ft9H1t/uvm6+jf7Hhodfbs7PXt9Pbn3+rs6fFqa2t1bmbx3up3Y2z2 +aF1662xgZf1zXFt863hu/ev8a//f6/Tp3eR47tvo5N7p8ef2eWtndu91ZHfucV5qb2BqdmRc +XWl9cmlv7uXu39/49N/ucXB8+O7w7u3u7PPy8Pn8cnD5fezt/f7v9PFxbHNpY/36aXJ1bW1j +Zm9sYmFv73966t3uePbv6HNq6uro3fvp4nd73/Nv7eXzbnj8/Gttc/H3bHD5aVtcd3xcYO9+ +Xl13fW128t3h/PDv7+996d1+7djm7/j69n9jYHZuYHPu+3P/9+b0a/XldWlse21kavT5amv4 +cWj79v789m149/N49+vl325y4ux7ferwaHh5d2xq+m1ndXnv/Gv++H50d+36anvl4/vp7Gz9 +f3X6e3n9ZV1t8ff55uR+au3oY1j05HRdbeZnXuzr8PLg4/VmauN0Wnbh+Wz57fnv/G1lXWxv +df90d2//5vDu6Ofh83T38/NobG918H/66/34eO57ZXtv8O9v/O95a2N47XNoaXpfWmxyc3f5 +8vtp9OTf4ODv3+doeurv9n567PN0fvR0b2hte25s+HVranf5aWNp6+dv7+np72ht5Gpl7P1o +Xujl8vb82+FfZubuZPX5b/lr5ulbX+rtZF/23u9naeDjbWre2mVo7fJ8f+7u/n5xdv1haONn +Wnb8+HJtZ2z0dXH89+Dpf3r47u1x+Nfb9mfw7mp5ZmntZGLs4G5rfvl6Zv34cnVybnL0/O3s +/+jobmlt7OPxbPbZ6Xb3c2xjYnb++m/963pda/RuYH/meGj27OZq+eRxZHHl9mx86eH+8d7/ +bvzx/P16au3l+nZ9bfL2XWzsanDvYXLtb2xv8e5fcH5s93L06mVc5tz76+TmeWh39H5sfNz/ +b/DqfXzg9G1r7u1jXPng/F5h+H1lauje83Fy9+9+Z27vdG/98vn8eXXsfm7p7mL132hffHF1 ++/vf5+z57+v05up9X3P2Xlrt+mJ4au/pXXHmZG/qdPJtZXnk3uHt4+f44ft54/bxam9uXf/s +bft5X/j/ZHhlcW9nbHr8dX76Zufi7edi8+vu7v7t6PJ16drq7/Te6V1o6m1dW19rWmh7anfq +4ezscf3wZ2T9/vHi4+3/4uLj7ffvfG1bWXNsdm5o+fZga+x0Xu7dfOje7Hx37+798+vr+W7i +6/tuc/FuZl7z7nxhZ+VrZ+r68+75e/xub2Zo+uzr5/fx6Wz29nrubWLy92B77urz9vbu91x5 +8WZpaXXx6Onu83jm7Wbu63N9dXBl9fthbvLjbn7l7PV89v5+/vbt6O13fu5pZn1jeN/t92xv +aV9ibfz+dXBoa3N07dzmZPLm/urs5Nroe+nif2/n621oeHJoY3L3735pdvdtaHR7aXbhfWt8 +c/Lz5+r333xm+/bt+3Vq62pq6m5ydWh942dmdX/36+3p6frq+Hjs3vFq7npva2nyem9+bWxg +WfL3X23i73Xp8fHp8vHl7Hby4OV6//Hrc2RvfH1se+1hVXfsemT24+9++ur3fO/l+mtme/Rv +bvXtbWFx+Gdy9ebq8/Lv3HVm8en0am9+c3Vs6OX+eunjb2h9clxhdW76+vDv73dy7fL2dfTp ++Gj24+/5//vp7vP/eu5ybnZhWmxwZ2l6/HX6bW7uefjh8Hzt8/H37u396uT98urp8/788vd6 +fWJgaF9tamnq5nf+cm36+fHw+vp9/vj77fHm8XBscWxo9fFue/Nyam/s7Of5Znf7e2x4+fTu +8PLn8u/k5nJy9vh7bvnv8G1se3Npce51ZWZ38WxhbXliY+x5aP7y9Xd8593o8uvqfe7l83jy +6/rr8PTx+HNqePVzbmlsfHJx/v5gY/ptX15pdPL1/eTo8/ft73vu4uH7evB8ennv5/J1d/xz +/vX9eGt0/WxpbP72b2t1eG18f3RtbHB6bXPt6/j9925y/vHt7eXi5O1y+O/8f/vy9Pbw8H5+ ++fN4Z2NjaXBoYm1oZ3Nvam1/8fF9fPLr6+7x7Ozs5vN19evt9fh6+Ptud3l2eP13b3h0ev18 +bm/+cmpreXpvc29teP18e3d77vl6e3j15uLl6uvp7O/7bXP8fXF3efp2cvn5+31+fXv/dnl0 +ZWl2dm5rb/r/efj0emxvdXP98+bh8m91d3F87ezt7PF+dX368evm5ObzcWhneHVpY2/3ff53 +b25u9vltbfp/amhqc3X37PTy9O7tfP95+/j3+/7t6Or+df947+zyfXf9dmlt+O/v7fF6a2xt +ZmJo/e7u8vH4enL6fnZ6fO/t8fLy+nFpde/0dnx7bmhscW9vdv5wa297eXf9+/X47+br7enq +7/b39ez6/fbs6O76cWlmbW1laHX++3t39Ovx9Pp8fn76+XVreHx8dGdmZmRhbPr57+3u/H/4 +9vT07u3t6+7x7/L6ff/88/P2e29/+u/0enf99Pbv8HpxcnNmaGpscXf89fP9/nV8f3/0/nz9 +/2lncnn/+fJ6fuzs6ujq8Ovp/mhncP3u9H789np89/z293n/f3p2fHRw/3tvbHBvbPPo82tu +6O57dfPq+G1z93Z58vp8cnD2/WtmdPv++u7s6fNoc/X77Ofn6e/7bm9+cXz4bW9sYWJv+Xv3 +4+t+a2Nv/Xn56Xxvcnvv+/7f2+5s/+xvdup6bvt//H52cGxoZml7e2Zpcnrv7O/2+frv4Ort +7fDzc2Zq9ux1Zm1pY2ht+/rz7vJ0ZXTw7+jm7vPu8np+cW19eHJz/e7y5t37bvf8deDZ59zd +Z2ReU1VneV9UXmZSTF3n4Pfr1NltY/7r5+re2OF7feDd5ebg4PPu19DX18/O0uJvXVBFPzo2 +NEB07M/Gx9RtVmj5/uLUztLi7+Hp5+Pu8mZdXl5i3tTV2d/jc2Be+OPf3t7Z4f5s79tv5MnP +7k9QQyUr81Z0v7a5zD5F5FdLXc7C2l7e29bZ4dPcW09WZ9TNyL/G0eNuZ2/l0crMy8nQZiwg +Jy5BbcCtqb5RR0hEOz/Pvc7h38THYUzz5kQ+RdW+xL62u81dTk5ESOzIv72+wtBoV158WT86 +NisnMljbzbqxttlOT2dfTl/W0ubv1sbM2NnnVkNCUO3MwL69wtltU1dj/tPLxMPEvr/WVDQu +KyQmNVrXv7WvuND86F1GPkdj/nnVv77I2m9vUkdPddbGvru8wsjP5GtYbN/p3svNz9JTPTwv +JSkzNjpbwLS1vru4wORdae9cSUdNaG171MjGycrK03BeZmxlafTb1dzf2Nvt7N/Y0tnu6utf +UE1KPzo5PD9FTWHr2dDRz9DX3ejs4+Lh299+fPfw493X087Pz83R1tPS1dPPzM3T6n1uT0E9 +Pj45ODw/QkZHTmjn2czFxsvPz87R3ODh5v1fY/ne083Jw8PEx83a4OPe3+Tf5PFfT0tGQT06 +OTs9P0NJUGHi19DKw8PIy8/U4PR2c15YZfDh1s7QzMnJx8XDxcrO1eR3YFldW05FQkI+Nzg9 +Pz9BTF5y993NyMjJysvS3O7v397e29XX3OLc2NDKxcHDx8zW+G9wY1xiW0xEQT45Nzk8PEJP +YvvYy8nL0NbV197m5uHf5OLa19bX1tDPzsvFxsjJys7X33doX1VKQj89Ozo7Pj8/RU1VYO7a +zsnIys7O0d3q5+30697Y0s3Ix8jKzc/S2t7b29vY3OpwWUlDPzo3ODo6PkhRXe/c1c/NzM/R +0tff7unk4+ro4t7c5vtnw7i9t7C1wMXNbEQ7NDEuLi40O0BP+8vFwcnIxMfqXFBSTEVKcPpn +4svHycnEurq+vbi7vsG/vcRlQTYpICMpKSlBw7W3sauqu2VYakMwLTx1Y1/AsLbP6MzRTUjJ +tLW3rquwwsbGRyomIh0fJixBu7Ctq6y0w0s8Q0s9OWPDw8S9tr1aQko/OT/Msa6rpqOptcTZ +RiQZGBwfJja0o6WurrXVMCs6bE8/1qqx89u3uT4wS3A9Nl6xr7aro6i4x8HDWDgtIhgaHytI +wqifp7zNUTwvMU7Nzse9r8j6xsBLOTZDSEL4sKamqKervvtZYVc0JxsYKCcsbaqmqNPWwkcu +OV6/z0/KrchB2bfKPzVJYj9Bv6Wkqaalrt5Pbi4lKBobNTM7tK+qrFpH2zg1PVW9wEjLrN1L +x7a5UDZRYTY+u6GiqqSkv1s5KSkjFxxMPj62rq6wPj/PPzVJcMHiScW+ybu5s7biTEA1Pd6z +pqajn6pJKSAiIBghzcJexLWvyjE1zt5DR+/Jdjs7wa6zubW0yT867bewsqulqbxLLCMfGhw9 +y/HCs7rCSDjvylNc5e5cMi1SvrmxsLLDOjBNu6qmopyexisgHhkVH+mvsa6rr+IsKD5qZtO+ +uNoxMW2+u7u5uW4uM9ayraidmqpsLiIZEBcwzremoqOxOCkxNztM37m9ZGDNvbe7u7l+Oj5r +xbmrn6OzRSUbFRkhNdOpoaGqzT8zLS03WtfQtrG+w8fIxs9rxLnEv7SrrL7Mvz0aDhpLJh/G +npyrS8irSyEnM0JbVrmfn7W9uclIOV6yq7q9r7TG0VMxKBwYHCIpPbyrqK65v8dGKy9fy8++ +ramvv7+7yNa/r7LcTl/15dHHQyssKh8eJzZMZ+W6r7zfzsLJzse9ucTh3M/P1827uLm+50lH +UU5Pd8e+az9CMigoKzJGTVu/u9XOv769w8e/wsvc9+tdZ9fOyt94e/P9U13rzs7dX0hEOjU5 +SFzW1dXYalVbb+vRxLy+xtHqT0FBTWb/2sa/xttQTk1JTFxYTk9LVu/dzMXJ22nk12hf1MjK +xMncflpCOz9EUfnSxcHO+VpOSEFETmBjYH7h2NjVz8/M0+nZ1dfPxcHH0m9MPzw8P0dc3czJ +zOxZS0dJTFVu3uppY+PPz87Kxs3c++7b1dfUzNXzX05GQkRMX3hmd+duVUxRWl5aauzt3dXT +ysjMycTJ3PdiXm9xceje/lpRTktOU1xu8+jwbV1ZV1pfY19ad/Lr5NPGw8LCx9b7/Htja33p +2+VdTkpIR0dMWPPp3d7y9G1sZGBha2tx6dfMycTKy9HpZWJYXvjq1M7YeVlKRD89R1Zv69PN +2epxdGxkYfXa29bNzM7N2ej0YlNVXV9c/tnW1OlqVE5ISEpSat7Uzc/uaP13bGl82M7RzszT +5eZtUE5WTVRabPzh4N3yaV5XWFRj8+rO0d7u73lkX2Lm29LP0s/b6N52ZF9dVmFZVVx2YmRi +W25sa2bx6eTY3ud4dW5cXe7v2c/O19bZ3N7vaX39anNvaWd2WU9UWU1cXmrk6uTd7ObvaFhg +afXr//XUy9fs2Nvg6e9iZuvlZ2vu+21fbGNRT1vt3H3v6OV1aXBgWF5xbfjc2t/j6ebq8Pxp +aXJpYWdsdOvf5/Hw9XdudX707enf5fXu6fP+ZWL9f3r9/nh0ef10a2diX1lbaf3o5ubp8n5x +amFsfOzf39vU1dXZ4vR1Y15qa3T07Ph4enBcVFJcX2NtdvTo5en17e78//7y6eTh393f6O/5 +b25kZGtwent/eftxYmFfWVpmde7g3tnb6/J2YmJ5fO3t7N7d5H3/emZeZGhtcnrv5+fv+3Vx +ef9ye+7q6/t8cvvycF5n+/Pxf/XY0vtMS+DM/UlO3c/+V3jP1mhVXvB+XWLr293r+uTb7lpi +9G1gb+rc3+3t6X7u615Ybet4XGDg6Flm5XpZZ9PXbGrY0upfYn5sTFLn4Wr408nQVEjSxUk5 +973dQU/FxVtK9snfRlPV6ldh39Pfbe3P0vtn7+9eVFph+nx8afDg725zdWBOXuTjaGDr0Nl3 +9t7ja1tr3O5x7/Zv1uNTatbdXFTkw+tMaXdxZU5a3+5ZVfXZ7GLv3ebs79jW0s/f2tHh9vRh +UEc/PTk6Pj5Hd9jOyMS/vr7Bxb+9wcXEwL++vru/NyQtLB4gKjX+aVavp7O9xs/JZj9K5c/b +f8y5uLu6sayutLOx/SQeJSMdHilXxvfIraqx0j9S70I8SNe1tsvFurm3vLqtrK6ur8MqGx4i +HBwmTrS1v62mrsBSNjY8ODxWyLKzxc/Jxb25tayqq6urvisZGyMgHyM7uq+7uK+vtMw/NDlI +UkthyLm3xvDdwrOrq6yrq6yuZSIaHSYnISQ4zbe5xsS8vMdONDM/UVtf7cGxsrvCu62oqK61 +uLq+6TIlISYvLywwPU/n5/Xe3M/Ezm5dbG1cXX3c2dDRzbuysbW9xb+9wL/D1fxhTjwvKyop +KCowQHve7Mu9urvOce7SyMfMy8W+urzCw8G9uLi6vMp1Sjw0LikmJiguO0NKUXDKvr6/w8rJ +wL3Azc/Fvbu8v8G9ubm+w7/JYkQ7NjEqJSQoLTc9QlHfwbi1usHCwMHFz97bzcfGyMnEvrq3 +ur6/vsXyRTgvLCgmJigsNkNLX869t7S5vr28ws3W3dfQzczS1MzBu7i4ub7ExdVJODMwLCgn +Ki4yOkBP3ca8t7W1t7m8ytrh6v1hYPXXx727urm6vsXKz18/OjYyLysoKy41P1Hhw7qzr7O5 +wtTvVkxOVWvb0MjDwL2+v76/w8bGxNFYPzc3LSYpKy0/XHbKvruzusbN9vt3TVFj7c7a5cjD +y8TDs6+0srO3u1IuJyMoJiIoNUbGwcGvra+vz2/WPjc7NEh4SP3IybS0ua6tra27xsvWxVst +KCQpLSMjNk7Pws2ypquzyVzUQSstMUPeWfm5tLG0v7avtbe9vrS7v8o7KiUiIB4gLEjkv7Kq +pqm0yWlYOCgqNU/b2M61rrW5vbuzuLm2tbKwtsJGKR8hHx0eKDnqw72tqKqwwllMPysqNUva +zM22rK+0uLivr7e6urSyvMRjLyUhIR8fISs7Ws68rqqssb/sTjktLjlK38u9r6uqrLO0tLvA +y9PLytPVWzouKSopJiYqMUP0zb+4tLK3yPRQTVRVY+7Ovru7vcfNz+Z4/9nCvL2+wb++10xB +PjkvKyosLzY8QU95187IxMDCw8XJzMrKzNLX2OTy5NjKv728urq4ub7OWUA4LyspKCosMDlE +VPfKvri5vb/BwcjO1Nnc3uF3c+XXzsrFwby6ury9vclmPzgyLSopKi0zOj9O4ca9u7y+vr/E +ztrc5XhkX2R/3dXKwb26uLe4ury+zltBOTItKSkqLTM7Q1ffyMC9vb/DyM/W3vb+/e/j5d7R +y8a/u7i3tri9w83aWD01MzAtLC0wNT5GTmbhzMPBxcnIxMfUdGd2eW5969jIwb26t7S1ur/L +5H1kRzo4Ojc0MjEzOT9BSFvcycTDxMTDxtRsV2T8+2553cvCvry7uri7wtHg4t5vRj8+OjQy +MDE1PD9FVOzJvr2/wsTHzuZdXmvw7X3v2cjAvb6+vL/Hz9nb2NtcQT48NTAuLjI7QEVS78u/ +vL3Bw8PJ1m5dY2l7++zczcfGxsfDvr7BxsjIzOZMPzw1MC8uLzU9RlBv28rDwcXMy8/V3nxy +/Ovk4d7VzMrHw8C9vLy+xcjK2VhAOjYwLi0uMDpCTGTfzcW/vsTGyM/a+nNlZHb66+DPyMS/ +vLq6vL3Bx87mUz86NTAvLi8zOkJLXOvUyMC9wMbK0918Z2hnZWx4693Pxb+8uri4ub2/xNJj +Qzo1MC4uLzE2PUZPZ9rJwL7Ey8/Z3vFeUWzf8e7Xyr+6urq3trW4vL/J+kg3Ly0rKSksMDhF +Y9HBvLq6ucDT3HFWTk1OWnb71MjDvbm1tLOztLi9w9tPPTEuKCUoKSovPk3dv7+4tLe2wc7X +Xk1WUURa73PMyMa8uLa0sbO1tr3E4FI4MC0iKCojKzk4Qr/Dx661ubjGyvJaYldJYuhL1sfj +v7u7tLGysbK4vMt9TzAwLCEqKCQtOzdMwdK8rre0ucDGaWVuTUxdVlfQ29a+v7u3tbSzsri8 +xthMNjkoIiwkIjA0MnnB0rWuuLK2wMzg6lpOWFRQavj7zcfGurq5s7S2uL3K2VE0NykkKyQl +MTQ45cbQtK+4sbi+xt54V05PT09ZbPnPxb+6ubSytLO2u8/dWy8zLCEnJyMsPDlcvMO3rbGz +u73NaX1VRExeTV3X786/wbu3tLOxsbi8x+JBNDIjJCkhJjExPMrEx62vuK+4yMzgSlJYRlxo +YNrQyMG8ubaysbK2ur/haz4uLiUiKCQlNDs9yLrCrq62sbnG3XpRS0xPV1p83t7Fwb62t7Sx +srW5vc94PS4vIyIpIyQ2Oj3CusWurLezuMfvd1xJTE9SUWTh6Mi/vre0s7Kyt7q9x3ZKMi8q +ISknIy5CNnW3yLqrtrq1ydJyUkxNSFpeT9TP1b26u7Ows7Gzuby/70U+LSsnIycoKDJBRs67 +u7Sutbe8y9tWTU5LSV92Z9jLyL+7t7S0tLW2vcPKVD86LSooJicrLTRKYs25t7WxtrvBzf5Z +TUpWTk/65NzLwby4ubi1u8C+0OniTkE+My4yLy44NztSYN7Ix8q/vsjI0uzsXFNYU1VsdW3c +0svCwLy6urm8v8XM0d5tST49ODQxMTU3PEBHU3PazsvKzMzU5Xdnb3/s6eXa0crFw7+9vLy+ +wMTHzM7XeU5EPTkzMDEyNTk/SVb12M/HycvJz9nj/njw8u/a19DKyMbDwsPCw8PFx8nHy+5S +RD05My8uLzE3PUFRe9nLxMfGxszP1uTh2tnU1NbVz87LyMO/vr/AwcbJzNZ2T0Q9NzAtLS4v +NDxHUG3d0MjCxsTDyczLzdLT09bZ3tzXz8rGwcDAvrzAxcTK4VhDOzUvLSwsLTM5QEtZ9szB +v8DCwcTFxcnR3mxa9MzH0N3Nvbi8w8G+vb/Fzf9IOjAtLS0rLC42SGB438u+ubm+yc7S1dne +82xwf+nZzczMyL+8vLy+vsDIzcvPXDwvKystLSwsMT5Z2Mi/vbu6vcTM2vJqZ2pu/vnt4NDH +v7y7uru8vL/HzMzM029DNS4qKSkqLC84Q1/Nvbm3ubu9x9jtdGZkYl5q79zOxsC8ubm4uLzA +xs7X2d7mX0AxKicoKSouNj9P5sa6tLOztr7O8mhiXl1bUFJg9NXFvLe1tre4u8HKz9rq6+9W +PTEqJyYoKy86RGPSxLy3srK2vtFsU09VWFhbbPvmz7+3srGytbm9xc3X63/3bEg2LCgkJCcq +LzpKdsy9t7Cur7K3x+pbUVNXVlJVV2rZw7izs7O0ub7G0er0fXRtTDktJyMkKCw0QlndysG6 +s6+ur7jKdU1GSk5TWlRQVPrJuK+urrK4vsjX4ubo5W9EMikkIiQoLDVCXdjFvbWura2vuMxr +SkFDSEpLTFJe38O3r62usbe+y9fh4+XjfEs2KiMhIyYrMkBW2cK8ta6rq621w/VIPTs+QUVJ +TmXOvrWurKyus7zL3uru+vdlQjAnIB8hJis2SvXJvLavq6mqrrjVTj05Oz9ERUhOas28sqyr +rK+2vMbX7372/VY6KiEeHiEoLz5dzb21rqmnp6uyxVo9NjU5PD9CR1Ldv7Otq6uts7rAytLb +5PRgQC4kHh0eIyo1S9m+sqympKSpscNcPDQzNTc7PURc0byxrKurrbK5vsfV6OrvZEUxJh4c +HB8nL0TbvK+poqChp7DJTTkwLzI2O0JS5cC2r6yrrK+0ub7J3O/j2uNKLyQcGRoeJjJO1rus +pJ+eoKq7XDYtLC42P0le0r+2sK+vsbS3ubzCzNjQxsPQRyweGBcaHys/3Lqtpp+cnaW6Sy4n +Jio2SW3SvbOur7K4vsfKxcDDyszBubSyvEUkGRMUGR8vabyvpp6am6CySikgHyQvTcy4rqqp +q7C+6U9Ob87Bv766sq2qrc4tGhEPExwsdLetpZ6bmp6vQiQbGyEvbbesp6WlqbXpPjIyP+q+ +tK+tq6mnqLE/HhENDhUjT6+mop6cm56tRCEYFh0t1qmfn5+jrL5FLikqNPq1qaWlpaeoq7Fr +IxQNDBAeQK2fnp+go6eyRyQZFxwuv6Kbm5+ot+Q7KyUmL2axpZ+foqaqr79iLBsUDxEaLdKm +nqCjqLC+TiwfHB8v0aecnJ6ovlg2KiYoMWC0pZ+en6auuNxNOiUaFRIXJUytn5+msMRxQTMp +IyUy1amdnaGtykQ3LywuNla7qaKfn6astshgPCofGhUXHy++pJ+jrMdRPTIsKSoyda+in6Ks +yE45MDI0OEzJr6eioaOpscLhTi8iHBUVHi2/op6kr985NDAtLjE70q2lpKi11V9HPTw5ND/h +uqumo6OmrLjKUTYnHRcTGynOo5yerNgxKywsMThHxq2kpqu7Zl1OTEc8NTdZwKykoqKmrrvQ +WUApHRcRGSfDnpqdr14tJiwtNj5RvKukqbTFUV/f3ftBMy9Cya6ioaOnr7zXd0opHhYPGCi7 +m5ectT8mICovOUr9u6mkrbzeP13QzNBGMy9CwqygoKSqt8vUz2QyIRYOFie4mJWctTMhHykx +PVnbu6umr8xjP2e+wMtHLy0/vaefn6auv9ro2OYzIxgPFym5mJacui4gHio5TN3OvLCqs2dN +P1+4uchMMC5BvKaen6i47lbexbxPJhcOFCG1l5SZuC4fHio9XOvYwLOsuGJCP/m4tMZILy1C +u6Sen6m8bU7bvrb+KBQMESKpko+ZyyIaHi1pxc3p3Lu2wmdRWsWwt904KS5ZsJ+doa7KVE/L +u7fTJhMMESSoj5CZ0R4YHS/Xsr3q3NLL00ZS1LqssnkwKCtzq56corRkQErJr63OLRcMDyC3 +k4+ZvCYYGy1wsq/IbeDY70xH2birrug0JilPrJ2cobVQPEDHray7NRwNDhxKmJCWqy4aGClW +sqq+aVBadEtux7eqruAzJiY/rp6boLZKN0DGraq3PyISDRgso5GUnk4eFiFCuaawbD9AVk1e +yrysqsA7JiEvuJ+Zna9LMzzTramyTSccERYnUJ2YnbI1Hx0yXq+qyU9BQj9cubisqchBKCAq +06Wcm6njPDhvtKqvVigfFhcrQKmboLFEKB8xZb6txU49Pj5DuLKtpb8/KiAnbaiem6bMTD57 +tKms2SsdFxUkQ6ybn64/KSErWsqyvFpHREQ52bCtoq1RLSAkQ6qenKPFUkXwta2v3i4hHRce +NNShn6nuMiUoUdC3tPBKUFNCTbyyp6bLNCMhL7egnqC5WEpjuq+wyTYmIRwcKkSuoKS4Pyok +NW6/tc9bbFtQP1+7raWySykiKmuon56qyWhSyLSvsGgvJRwXHi/CoJ+tWy4kLVLVvsb938l1 +PTvnsqWmxzElJzq4paCjsMPm38LBv81JNSUaGiI9rKOqvUk1NklIU1xSyrnJTDlAvqqotkYs +KzNUtqmkp6270tH37sPxPzMfGh8v16mqvM5YQEVCNjpIfLi2+z8/3bOstOo+NTc9dLaooqWt +v9PvUf5xVkwvHhshLcasr7TE50tMNS82PsextcxfT8q0u8RmQT44OFi3pqCirLvhQT5ay9JI +NyIcJClHv7yxr7PPZTQrMjVlv767u8bEvdrgWz4+Nz7itaiho6ux0k0/OlH7Tz0oHyUpNU7o +v7Csr7ZbNi4qN0/gvr21rK++5EE1NzdB0rmqpaepsshsSUVXbU5CLiEjJSkxPGi+rKWmrsw/ +LSwvNkdywq6prbjlQz8+RFPgvLGrqq61v8/Pzu9QPS0lJSMjJis76bOopqSsvV83MS8xNkbh +wbm8wMbGxMbOy8fFvL7H0d7g28vLxsfWajsuJyIgIyo2dbyuq6+1vsLDwcfTXEE8NzU6QmnL +vLe2tba4vcfZXlNTYtXBu7zLVjsyLi0tLzhIbd5qS0RL7cK5uL3GztfuVUtOYejXzczKxsXE +y87Pzsa9uLa5w+xMOS8tLC0wOUNGQD49RF3Yxr6+v7/Ey9nl+vv/7N3Z09HNyMrMzcrBu7i5 +u7/Qc0k6NDQ1NTU1NDM3Oz9JddTKxMPDwcLHys/W297j3tvc3OHa18/EwLy5uLq+xt9QRT89 +Ojc1MzIyMjM3Pklp0srDvr6+v8DBx87Y39/t7PBx8uLXzsjAvry+v8bN2PteT0pDPTo2MjAx +MTM4P056z8jBvr7AwsPIzMzN1NzqaF5q7tzUy8a/vb6+v8TL0dtoU0xCPTo1MTAwLzM5P076 +0MrEv7/CxMTHycrP2uDu7+nj3dvTzMS/v7/CyM3P19zta1ZHPzkzLywtLjE3QU95z8jAvr2+ +vr7CyM3Q09bY4uz17+XbzsbCwsLAxMfO2N7wZE5EOzUwLi4tLzM6Qk9y1ce+ubi5ur3CxsrM +z9xrVlZaaPraysK+vLy/yMrMztb3Wkg/OjQwLy4vMTU5QE5v1ca8urq7vb2/wcnT4nZhVlZV +ZeTVyMC9vL2+wMTIy9l5UkQ+OTMvLi4vMTY7RlncysO+vby9vr7Ax8/c82hcWWVv49LJwcDB +v72+wMTJzdd1UEE5NTAtLCwtMDU8SWLUxL27ubq6u73EzdTh8mdeZG3x3dHLxb+9vb6/wsXK +ztRnSj44Mi0rKystMjpCUejMwb65tbq9vb/L1uXn5WRXbevr18i/vru5u7y+v8LF5ExENiwq +KSYmKi8yPlnnxLmzrq2vsLfAydxtWUlMTUhPW/7RxLy6uLe5vL7Eyc75Tj82LSoqKCcrLTY+ +VdfEuLGurq+wt73G221OTEdCR0tbfdbDvbm2tLe5ur/D019KOzErKSclKCsvOETszb21r66v +r7W7wMvYXVRLQ0lMT1zmysK8uLW1tre7wc3UUTk2KSsoIygnLTI/XeS+ua+ur660tb3J0Whd +TkdMTFJk387EvbiztLO1ub7O7kg7LykoIiIlJSw0QG/NurOurKyusbO8w9BxbUpJUU1detzK +wry4t7e1t73J6086MCwnJSUkJiswPU7TvLivrK6ur7W5v8fdZ2RPTE9XaOnJwr+4tLS0tb3R +4U02MCslIyQjJysyP0/Vu7aura6tr7a6wM/dcmFeUVhrdNjIw7m0s7C0ucPYXTouKyUjIyIl +Ki88U9a9uLGtrq+xtrrAz9r5WVlaXHrUyMG9t7KzsLS/xfA9MywlIiMiJCkwPE7bvbizra+y +trrC0NPhYmR8Y2nZycG8trKvrq+5vNBAPTIkISQfHyktL0jTx7qwrq6wtLjE2NXmTVNmT2rN +x723sa2sra+zv1pINygjIh8eIygsN1zPvK+tq6yusbfF1exXSk9QS2PYycC1rqusra66a04/ +KSAkHxwhKCs0aMe5raupqa2ztMLv+l4/QlRMWNPBurCrra6utvVLPiwiIyIeICctNU/Quq2s +q6irs7O40m9dSkdMTXLLwbmtq7Gxr89AQDEiHyAeHyUqNmzTv6uorKmmrbK3zOZlQ0BUTVLL +u7euqqyusMlJPy4hHh4cHSAlLkvWvq2np6Wkqq60x993RTxGTFzIu7Ssqaytsc5aQiwhHx0c +HR8kLkRgw6+sqqanqquxvsjdUlNbW9O+urKsrq+30ldELyUjIB8hJCcwRVbVvLaxrq+2s7a/ +xsvVzsrIvLWxrq2vtsdXPzMoIiEgIicqL0Bsz725tK+xuLzAz9t/YvvRwrivrKmoqq+/aT4x +KCEfHh8kKS89X8q3s6+urrG2vc71V09ZddO8sqynpqmtvXBCLyUfHh0fIygxRG/GuLKsq66x +s7rG2VlITmnYvrWuqqmpr8JgPS4nIh8fISUrNUJvyb61rayurrS8w9RsU1Vrzby0rqytssH3 +RTUsKSQiJSkuOUdc0ca+uba1trvEztzzcGV8zr21r62us8L4RzUvLSknKCs0Ql3cycW+ube1 +t8DS/U9GSlJi5ce5sa6vtclfRDk0LisqLC85V9PCu7u8ube2uL/aW0g/QkZO98y/t7KzuMxN +OTAuLSsrLTE+98G2r66xr7C0t73TVDsyMzg/X8y/t7CwtcFjPzQsKSgpKy05WsS0rKusrKyv +s7jNX0MyLjE2Qe3GurKwsbneQzkuKSgnKCs0Rde3rampq6usr7S9e0M3Li40PE/PvLaysbS+ +YzwyLCkpKiouOVjFr6moqq6yub/OWUE9OjY5PENm0Ma/uLGwtLnKX0Q6NzIvLi0vNT5T2sS+ +vby6uLe4vcfZfV1VW2Fm/9rIvrm5wd5OPDc1MS8tLS40Q3PMwbu6urq2s7S5wthjT0xOVWnf +yLy3srG2xWQ+Mi4sKyknKCs1SN/Buri3trSwr7K8zmdOSklPctXHvbawr7G4yVU5Ly0sKicn +KCsxRdvDu7i1tbSwr7bC31xPTFNy2s7Fvbawr7K3xWQ8My4qKCYmJiguPGTKvbe0srKvr7S8 +yd9gVFdj99vLwbqzrq6yucdaOS4pJSQiIiMnLj17v7SvraurrK6yusx1UkdERU1a5Mi8s62s +ra+54T0uKCMhICAiJCs4WsKzq6mpqaqsr7XC31RDPj0/SWvLvbavrKytsr5yOiskHx4eHyIl +KzZVv66no6KkpquvtL7ZUz85OTo+SGHUwriwraytsb1wNyojHx0eHyInLj3puKujn5+foaet +uMhkQjYuKywuNUR3wLGrqaqppqy+Yy4bFhoZGB8rM2GxqJ2Xl5iapLpTLyQfHh8lLkbJrqig +nqWoq7zL6UdDPC8pHhcXGR49vamcnJyanaGo2C4eFhgcJ1+3qaSmp6qxvm06Ly0vPHPCta2q +qKq14SoZFBMYKdSonJmZmZ2nsz0gGBIUHC2/pJ6epa6+2k08My4vPOy3q6Wlp6eqrrtYKhgR +EBQlz6ebmp+krb9TLh4ZGRwvvJ+Wl5ytSS4oKTE4UMu3rKWmqrPK5PbRw8xgOiYZFBUXIkyy +n5qbnaKuyDwnIB8mPr+poaKrw0QwLC5EzLSopqq2Uy8pKDBNw7Osrra88TsfFhQVI8Sek5GY +o7w4KSQfHiIoV66emJymxzYoJikuOUPkvLKuscH4RkfdvLCxt7q8urrMPh4QDxIfs5qSk567 +UzEvMykiISVDqp2ZnrozIiUx1bCttMPYzL7GzUs0MzlJyb3AvMO9sK2ywkMiFBEXH86knZuk +tsfPVVs1KCkuVauenaG7Pi4qMz9GQUA/Xr61sLvMWEhNSFNQR1DYvKuora/IRzkuHxgcHjSr +nZaYo84+KCUsKC06T7WkoKSyPygiJDLntauorbS/Xj4yLDI/7by0trq/wb/DzOJMU2Fp2DUd +GRohzaCamaPbNSomMz0+a9G2p6KntE4qKCs6zrWwsbrKzGBCNy4uOVnNvcfc1ce5s7jEZj4/ +6bqxwC8YFBgupJWSmrMrHx8jNj5GzralnZ2sTSQaHSviqZ+hq7lnQDYtLjE9dr+2tre9yNBc +RDUyPOy1qaWps9QjExAUJKuWkZSmNyEdHSw8W7Won5yftjUfGR41vKKfqb9FMTM/RV/y5MrI +1HdNSvTDt7S+7EpARFT2yby8vMMvGhoYKq6dl52zLSgoLdHVzcLItq6vyUYxKz/Ir6m5aDcx +O32+v7/fRD46PFTbwbKvtsdILiszXa+kpK5nKBcUGii5npmaptEwKycsPmS5rKmqtGIvKSg0 +zq+psMlOOz1LftjIzP5lRz4/SXPJuLS2wWhHRFrPxMLQT0RGSn7SRSgjIC+/qaCrwzcwPGa1 +t7/WSk1kz8zK2V7bzcS8y31KPz5P7NbI2ltSR0hmy7qytclYODA74rqwvz4gGR8stp+epMc/ +LT5i0b9eWfjMur3hOC81WbGpq7pELzNSv7S2zkk7OUJQaN/Swb/E1Ug3MDl6uKusuVw0Ky06 +a7u5SC8pLfiyp6y7QjNG6Lq2xmRGTuW+vNFcQUP1xL3GYz07R1Tazs3N53tXTklR38a5ub3T +Zl5u1VU5IRokMa+cm6LKMB8pO96vtru/zdtgRDEyRdSuqq/CSDY3TNy/vtH5T0ZEQ0ddyLix +ueo7MDA+2LivtMNROzc4SG7K1jcxMDnMs6y3zD86X9a5uMxfR0hT1tDq2+DVwcjcV0A/V9nM +xt1oe3FnXk5O68y+tbfA0EkwKyEeKES2oJ6owDsoKjtvvbe8u7vD2UgzLzpus6equU4uKzNf +vbO4zWNDPz9CX+XKyc3fXl1SXHrZzc7bZVNSV93Evr3LPiIhIzW4pZ+ntT4vMTb8yr+8xMre +eUU8P0nUvLvA11JDU1/91NvW0tbm83Rt2M3Kx9DU2U9BNyYfKDq9pKKrxTsqL0P7v7q+vsLQ +/Es3NkPVsqmsvU0wLTldxbm6y/pVQD4+TNjBu8HiSj1CV8q7u7/cVj85P07SvLm82TAfHyVE +rZ+fqME2LzE6Xs/IwLq8y2w7MThMwbKyvWxHPkt118nLxcnZa01S78m9u7jMRTUpHxwrTq2d +n6rwMSIoPPOyrK60v3Q9MiwwWbysp63FQzEsNk/RvLm/0GNCOjtOzLi0u+JDPUNb0cfEx9Jt +UEM+U8++trlQIh0eKr6knqa1RjI5PVnd4M+9t7i/ZjkxN0vFubu/0G5YVFNe6dPIyu1MQ07b +v7u6vsxYOyscGidJp5qbqWkqHyk+2bOtr7O40z4uKS1atKekrdw3Li04Ysa5t7zXSDUvN2y4 +rK6+UzYxOlrGtrG3yF1CPEBa2FMoJis8tKeovk8uL+jAubzbZ9vAyNhONj3mwLvIUj5D/7+2 +vM50TkxLS01kyLWvtMZOOzY2LiAiLu2mnKC6OiQjPcSyscP868XKcz4uNOayqKzLOC8zR8G5 +vcfmXlVLPTxF67mvt89LOj5hzL+/yNTX2M1YIBkeK7CbmafHLR8tOlfMv7esp7ZVLCAnT7Cn +q8BJPj9Nc3XTwba2xVU6OUbauLK0vtZfPy8eGB0xr5uYpM4uIyo7Y8e5s6ysvT4pIilqsKeq +uvJHPjk/Uc20rrbRQDI1Qe+/ubvJ3+1rTUZKX85rLSgtNuWvqbK8WT5KTkhRW0tp29fIwcbF +zWZSR0daz8G2sbjHVTgwNkfQvr/Cz/tMRUVNY2nayc7O2UIsJzBVu7G6w+dMPT5JXMq+w81c +SFvLubW96FFOW/Z8Z/rOw77NTj9EU9zO23NOT0xe1s7W529IPzw4RevY09dmfOJUUVdZ287f +3Nfw2tLWx769v9RKPj9E8L22t8VdR0I+R1JPaeDOzNFmQD49TtjKxtV9Uz88RVzfyMPLyelK +RUNM7sjAvsHMdU5NSlvUx8DA5k1HSV7i19njeOTgZ0xDS/bSztDifmFbVFRaXmlz+3VldW18 +9uHa395hTEhNY9DAwsvbdFxWT1Bg3szHxsveX1JRV1hYZv3e0crfVUtFTWJq/trT0/JXU09Q +Yd7SysrT8VpZYWdlXmju397n8H56++Dd82lbX+/k63dxdvTt6epiUVJg3c3V6/Lk6W9YUVlg +b/Tq5uTb2tjfb1dNTlBSWu/Tztfq9XpgVVps6+Xl3tLQ0drs+WlWWWF06+nn4enu8nh2Z1ha +ZPfa2uP5ZVxdZvHn+PX5aW1nWFZZa9/V2O1lXmFhct7a2trf6e7/bm91/OHg7vZycXzt3+Pu ++/xmZF1j9ev3dXNnYV5fa2VnZGBo+Ofk4On+9+np6vVsaHHy7err7u3z6+Tj92Rnbnzu5up8 +bm99cGtpbPz58vx4b2ZjXl9q7N3e3t/tfGNcZO/q8/NyaG/u7/357Ovu7/Dv9Hpz+/j2fGtn +aHvl4Ojp8Pd7amFfX15kbnL97Obm6/Xv5ubo6O77f3Z6cGdzfGpobXvq4uX7bWtkan/3+Pf9 +dvns8/H39Ojm929nYWVy8/b3/Pjy/e3p7fX1eG13b3J3cnf6em9oa3/z7PX97u3m5PVvYmJp +dHFyeHZ6b3R1dPfs59/i5On29url6O/1fXNvZmJiZGdrbG51dH13d+7k4eX2dn3y7fl2dHV9 +fm9yevru7efpfmlnbnV79/V2aGNoa2r57enk3eX9+/dzfu/38+vr++vj7H1oY2JkZmppZGZ1 +8fZ8f/F8e+/t7PLzfm5zdnj17vDj3uvv7vl9cnT19PN5amdobnFxcnjz83pvcH53eHRxdWxq +9e9zdevm5uXm9HV7+/H68OTj6Pj57vV+e/b9eHtsbG9ubm1uaGZ0/XF4/Wtsc3ZpZmp17uji +4OLr7+nh4+3r63t68P9zd/vz8HtvdnR6cHZ4dXv09nn+end6b3BxcHJuevr8dHhzaXPx7fDp +5u728ffx8PLu/f3v7O3x+vj19np0efx8bnt+cHF3dGNodW5rbGttfPDt8evq6+vy/vPn5vR8 +f/nv9vfy/np+/X198vhqZmVnaGh0ffjx7O/09nz67urv9PttZmp1+vDy+Hh5/X/57uzl5vZ7 +eXhzef98eu7xfXJuc3z9fHX7eWlubG3/9/v+9eru7fZvc3htcPrw9vn48/f19ff++Pnz8npv +c375fXf67ufs8e9vbHB8dGtwfX59c2hnbW1qcHx4cXlub/7s5uzp5u7o5Obn6Obw7vh9+/N2 +aW95bWpoaW96fXZ6cmpubmZod+9+c3d1c/fq5OTl3+Xu8O3s6vL18v55cWxjX2dz/nFoa33u +/W5sdG5v/nH+6efo8vT19vT6+ft9dfrt/n7w7/1y/evo+GxufGlpdXt1cH17b3/z7vD9e/fw +dG9sdWlu9vh4e/T08+/18fz37/HyeXzz9vLt8Hh3/Pvw9HVz/vtsZXBnYW1xbmv96e348vXw ++Ht5dPrt4OL+bvjr9m1sdPv6b219cm7z+/bq6+7q6ur2+/VucX53bv5ubHZqbWRydHhxaWtp +aP3k6u7y6uXt6+jn6Hz26uzq5fX9+3N683tvcmtdXmNmc215fXZ3cnft9/787uXu8/fv7Ppo +bH36dm5ve3L7/Prz73197/L3+Pf68eTr4+hxb3l5anH19XpuaHZ8dm/97m9udWhla/fu8X/+ +9/768u32fuzycWx19/B7cnR8+vzu8vFz/vH+7ezh5P337PHw7npsam1nYmFz7vdqX3Xy8/j4 +bGl1e3xwe+zq93x9+fTp5+3u6d/q+vv4cHf2bmr7+G5raGtveX5y/nb88m9mb/jv7fP89/X6 ++vx359/3evB67O1ybHb9dnRoam54/nnt6vPr8HBpbHb48m9t+PprZXTu639t/evnfmd67fX1 +7OPk6e/m5X51eff5cnhuZ3lna2NteWv7dWpia/xsZnJ6e33x7ejl6eHZ4Hxx/ebubn3u9m1z ++u93Znjs82t+8XBv/vz6fGt8+PHx8fl8a2htdGxebvt3c3ly+f797n/2/fTx+Op/ce3p83lu +++Tk9e3g7HViY29/cn7q5+zt631qanZqaWJl+XFoa33x9nF08n37+fv/ZGVv+et76enz+HZy +7u/m7+3o7nNz7+rr7+zm7nZ9+/J4Z2h5fG9y/fN/Z2R6amBqem9ub2109Ozp6Pfn7Pbm5nxz +cu3ybfrm6evv/Obl73VmbP1bYGRaYPpsZ3Fr/O3o5+Tv6u34fHD08+5+/+Xs5ery7fL49fhm +W2vu9vxs6+hyY2xoa3d+eGZgYXNzdXPt6/3/9+bp/f31fP30evjo3+Pe53h0evh1dHf96PRy +/XNsb25nbO98aW9wbnRpZvfq/mt4cunpfOjse3p+6+js9/nmbG3s4uvv8nvuamP49mpgYWxs +aXfw9nR9//jrfv344+1q8vvr4/dtdXhocnJ39fH77eb6cv/v63pqa2dicXl0b3r07eT5+unt +9Pfp/mNpaHLwcfbj9G948PHs9G///nRtcf5+aV9u/v/v6P37eG5v+vDx6u769+v0evDubWRq +eHlqavfwdWtv7H3q393md3b1dmn34uz48nZ1aHvqfm9pfHBla2Zsc3129ujg7fzw/mVfafPu +c2/97e1/7OPg5Ht48fF6aXXpf3Frc3t5+Xt7cHPr9n12+Pb7+O7ua2r68v11Z3X4enx1/H7m +6PX0b+vvc27573h+d3h8bGx6bP9z8+Pv5/Xr8XJseP9vdH5mc+b7+OrscP36eHl79vn6bXDv +7Xl1+/L4fe/f6vZ5dnBpeO32fXZ6729w/ez4dvP6dn38ePd+ffnseG16a2BeeXX65+7t+v10 +dPb39ebl6+3v6/707fzy8nlr+flsaWhnZm13cf3rfWVp9ujq6ff9+mdl/Xxv/e309e36dO/8 +d/Ti7nj2cPf1dWj+6PZ0b/7+Z2f683N4fu/teP76d2dkYe/xaWz75uLq5ufz9+vp/f1rcHNm +Z3zt93p97/H99Pd1c/NsZXV7f3t++uzvd+3r9v97/P/0e358e/35fXtzaWJsem16+X7q5/Hq +4u3t8evv7+Lw73xkZW5uZ2tze3Bqde77ZWbz8XD+7fdta/zx7/x+6Oft+fv48vf3enp67e35 +fvn1/nx59/55b3T6f/js9//u7vp0eXx1ZmBnbmpqevj+cXfx6OPf4/D5e21qcvrx6fdvfXN4 +9Ovo6fv473Jxd3z4b2p4/nF08fd8/W1vcnL97vbv6vTu7PD39P5/fnt4f3VxbXXw/G1od39y +evTz8fl+8PLv8/X5eHL++W1//Hh0a3T7e3z3+3Rsen56+n347/bu5+ny7/l3b/ry8+3wdm52 +cXd2amp+93h77fF0eHJwbmpmYGVufPXsfHHw4Obq6urt+/3z5er4/nN79/v4/Pr9aWl9dG1x +Zmpwa23+8PlsZvPp7PJ+/Pny8ent7vd5e3vz7/xzc3n493t5eP//fHx9dX55aWNnfO7p7vjz +cm53+er5+O/2/unu7+l9fn54ev15fXB47/l9f2tlaGz+8/f5fPvu9PHvfnRrbXp/+Ojs7+/5 +7unv+fZ/d/vudGhz+3pyenR0fW1laHH8+n5tfPPv7/jw7+/z/HVxdv/0fHT26u11anJ59OHn +6/Z0bmx6eXv5fG5wc3r49/nw83x/+f537+1+dPPuenBva2twdHBvc37t6eXp7fJ5ev3z+ffu +8XFvfG9xd3318P16e2trb2lpdXv9/X716ubl+nVzampy+fn/fP5+/Ono9P/97vP6+vHu83lt +bGptd3FwbP7v9Px+eHp7d358e/j3cWtvff71+P/v6Ojm5O5+dXh5efv6fG5qcHpxbG1vc//w +7vn49v15eP9+9Pr99e/r7fh9/nf97O/r8PxybnFzeXZzcGxsfn78dm9wc/73+f317+/t6Ozu +7O98fH16cWlreHn9+/x7e3d/8u/t8P1ta213+/v8+Hx3cv/t9vL0fG98fXl8cH7v8vd+//18 +/vX57fd8eWtre+79bW1xb3D88u/3/npvfO7u9e3u/vTs7v18dXR3fvV98vJ0/PHy8fhvbXtv +bHn7aWlvbGtqc3x6dH339/Tv7vH57OTi7Pr07+/v+X53b29yb3ru7+/7dHBtcmxpd/l0cX38 +/3vu9Pny8/5vbfru7+nv/XV68npnbfZ7b3V3dnzr3+f1fnVvdXRsdXB0/vDwevrq5+zw7/N8 +ff75+3P9/mlkaW989O/4emtqfXp2dHt5c3p6/H727PFwa3p+/H766ufp5/Dv7fHt6ezs7vb9 +cP769/Z+b2dhY2pnY2hrZWRucHZ7du/p6e32fnVxf+/9+ezs7vH37Ons7vjzfnD7/Xj37fP0 +9v5zamZkZ3X+fn13bnf1+Pn6dXZ8bGpsbXj98uvm4+Xn6erw9Ph7fX16c290fH1+9ft3fP3+ +bWhtb3j09u7zdmxqbHFvcXl99PD7+3519Ozn5Ofm7P9++XRz7Ox/e/73/P1wbG92/fj8b2pt +bnB6+vbvfm/99m5ue3X66+b4ePr2+Hz29+/s+3R8fHjx6/589Pfy9vXz+Pn28/x1ffd5b3Bu +ZWFqZ2pta2psc/DxeXd68+rt9/787ebl4d/f5/D9fXvy7O/t4d3g3drd4ujvemxkW1dPSkhF +QkFDSFV22czHxMXGx83X4vRqXltbXWBs+Orf2dHNysrLzNLc4ePr+H9zXEtAOjQwMTQ8Sm7L +vbq4ubu/xc7b7GVUS0RAP0ROZ9zKv729vb/Gys7Y7nJoYmBlaWxhT0I7NTExNDtI8se9uru9 +v8TIy9HjcVlJPTs8QE7wzL65uLi6vL/Izth8WE5UWV1pZVVBNi8tLS87T9e+uLe5u77AwsPJ +1G9IOjMyNT1S2sS8t7a2t7i7vsnhXkxDQkpY9dfP3Vs+Mi0tLjZGatPFwL69u7i1trvKXz4z +LzA2P1XgyL66tbKxsra+0VxHQEJIVv7f0tHhYEk4LiwsLjZIb86+ubWxsLK2vdFROzIvLzU9 +SfHGurKura6wuMfzUklDQkVMXeDMxcXWVTksJygsM0Jn18S5sa2rrLPGWTwwLi4uMjxO2Lqu +q6qrrrW+z1pDPz09SfTNv7i6yXxIMSckJigtPXHJt6ypqamtu+1GNSspKiwySc67sKuqq62x +v95XQjs8Q0tnyry4trXETDQoHx4kKzJNwbOqo6GmrbnpPC8rJSQpM0rEr6uqqamstcVaPDg6 +P0RX2cW5sK60xU81KB8cHiQtSL6spaGgo6q37DgqJCMjKjhpva2npqirscVqST48QlBh78e7 +trKxuM1FLyYfHB0kMk7Aq6Kfn6OtxEkxKCMhJCxExbKppaiss8B8SEJEQ0zoyL65tbW3uL3f +Pi8pIRwbIzVWxayhn6Glr+E5LichIis82Lasqaiqts9hSz8/S2Xdx7y7vby7v8vR6EUyLy8o +Hh4teM7GrKCgp67FRDIuKSUoONW3s7KurLTfRUNLWG/kz763ub/Cw8rY4NnvSzkxLiYcHTXS +88ymnaKuts09Ly0nJTPWvLuwqq/B7Uk7Pk5Zfb+zucK8usXe6t3NzPVLPDkwIxwfON1eyaSc +oq++3D0tKCUpPcu5ta2qsMpNOjc/TVPWt6+5vrm5y3Zu1sHHa1lSOy8lGxsv2k1gpZqitL3L +Py0nJCtIybyyqqq53048OEBLXL6usb+5s8FaT2zgyMTr+9g+LSofGSJd7EWzm56tucRJMCol +Jz7Bu7WqqLb5UkI3NkL2u66yvbixyUdK5dnUx87ayngtKCofHCdK8c2qn6Oqt+Y+MSsoLkvH +t66ssL/kTTw7P1bLt7S7ubXBX1R06OPbzcbG5DsxMSUcHy5L5r+poKOvyHM+LSksNFG+srCv +s8hvSjw9Sue9tbi6tLfOY2np3tbayLrQRTszKx8dJS060rKoo6Wuv2w0KiorLk64r6+sr77T +VT08T9XGvrq0sbvT39zcbVFU0r1lPD0wIh4iJitZt66moaWuwEIuLSwmLfu4tq+qrLbRSj9I +VFrZua+zt7e90HVSTUpLXetGNjUlHSUtKz+3qqajqK20cC4pLCkrQsa0qaetsrxbOjk+VcvA +uayrtcTMz2E/NTpKOS8uKigtLjP8tq+sqayxu180LSsoKzvct6yoqa6830tCSmLQurGvrq63 +zdZeNS85LiYqKygqLz7ewbispqmvvMlkOi4qKy89Xcm2q6uvusfL12h+y728wL24u8nW7kY3 +MyojIiQnKjFauq6qp6aosMxaRDQsKi44Rl3OuLCxtri3usLHwb7G1NnZ3eTY2mBRTzgtJx8g +KSgtX7mtpqSlpq7CaEA2LCktNjxN1b+3uLq0sbW1tbW4xetfTEBDTElJYXlIOzYtKysrMEH4 +wLKsqqqut8TnTTs0NTo7PEdo5NrSwbm2sq+trrfIekk5MTM8QkhxzcbH1GpJQjw4ODs/Slrz +39POzc3U0cvHyc7R3WFNSUVFUefIu7a2t7zH7VJIQj9KYvXsz8TL6fhxTENFQj9ESUtKPz9F +SU5e2sW8u7u9xM/pXVFYaP/c0cnKyc/b9WZeW2d22s7Iz9J26WFaSUlMUE1NTktGQkNDRlD6 +18zJxMDI0dp+ZFlcbOTl3dLU5Ph8aO9p7tbIw8G/w83Y5FZMSk5KSkhISEZGSEtNT1x76+XX +09zf7Oj3eOzw2d3X29z3/fzk9OPjzc/LzcbMztTe5GtuXF5NTENFQkxGSlBaamdfdOtwbWt0 +++Lm2t3a39rl4frj5uLf6tPZz9HS1NTT0N/a4t9sX1dRS0ZKSVFQV1VaU1FPUVlZfXfi5tDQ +0c3U0tzm7N/u6frfft/p6ujX29jV08zb3e51TVFGSktOREtUT15WXPz1feLa3dvZ7N3j3ev2 +YPnl+uvz3und5cva09nP0dbQ3M178VJMP0Y9Pj9ARk5hYNfTyc3M0M/l8vxjWFxbVmX939XR +z8nIy8jHyMbGyNpmYUg9NzY0Nzo8SGPUyb27ubu9x9hcR0Q+Pj9GTV7q0Ma/ure3uby8vcZc +SEA4MC8tLjg+WtLHvbKxtrvL4GRFPTs5PUhX58zEu7e+xMva3ex+1sxaSEw7OD86PE1T2b7C +wbrExspeSkM6P01KX8/Iv7zGy9JwdFlMVnPfv7nHZFc9NTkzMj5T3ry5ube6w8phQz05PktP +cNLLvrvBzntQTlRSZNjIurK0zUw6LSstLTRJ2berrK+51FtFNS8wN1PJu7e3ur3KZkU6OkVb +0r+6t7O0tsc8LigjKjI82bqwqau510QzMzY5SvnGtbCzvN5MQTs7P0vdvraztbzJ09HuOy0s +Ki9K4MG3trW4z0w4LzJAY8y+vbq6v8ttQjg3QWLXysK/wMTM2uDPxNBPPDIsL0Viybq6vMDZ +UD05OkR0xr28v8zXfEc6NzxM3MG8vcDIzM/PycPOck06LSs2Tc64tb7KekdAPDpG2r6zs8B/ +Sz03Oz9Jb8m6uL7SbG/Ww7i1u81XNychKDVvsamttcxJPjo0O27Asay220MyLzY/V8y7urzK +X0xZzriur7fLQy4eGiM1w6Odp7VpLiwyMUTArqenslIwKCczV8a2sLfFdDw5UcCtp6m20T8v +JBUYKmGhlpuuUygeKThFuqekoatYKiAfLdKvq6y7VT43N1m6p6Cks+4/NjcuGBMiOqaUmaxG +Ih4sXcS2rKmor3UoICIwtKaqu0kvMD9cvayloqnEOzI4ZbrfGRAcKKmSmKlaISE4WtzJvaqg +p70sHB0uvaOmyjwuL03Jtamkpa5sLy08u6irMg0NGTaYjpqtOR0lNDdVt6mcnLQwGhQe0KCa +odguKCxCvaqgn6rRNS1Fv66r0hoMEh7GlZSfsy8fKDA5v6ehnqw2HhkbQKGZmqswHRwmZKec +mp6zPy4yVr21uUMUDRgnqpKWpMQmHSgvT6ufn6TjIRwcKquYmaU4GRcgV6KXl52xNyYnO7iq +pqwrDgwVK56Pk57jHhoeKHqkm52oPiAcHEOhmpy3IxgcL6+al5qnTCglL8CnqapBDwwTIaiQ +kp28IhkeI0CnmpeeeSEYFyymmJekLxsZINyfmJaf6C0lLr+nqLkjDA4efpiQnL0uHB4tNuSm +m5mjQBkRGE+ZjpOtJRQUH8eakJShTyIiMEu2rSoVGyNtnZ6v1C4kO/Rqv76/qq5EJR8pwZ2a +nrQuHh8tv5+bnaO2Mx4fKSksPkZF0bixscc9Ly85zaqnsk8pIzm6qqm9RkBUzrautbi4x8rI +USwxPhwXL96vnKg0Kyovsaa4vc9DTlEvL1DBp6CyRy0lMbWem52qwkksISQqGBdOrp+Xpjkq +Ix4yzrifm6fPKRoeO62dnbBBJx8tuJ6bnarCZDQnKCcVFUG3pJqpTVI4IytA8aSbqOApHinu +raShq9ovIydfpp6dorJSLiAfKRkVRbqpmaN0XzUcJU7Ln5qozS0iKC9fqp2dqTscIEqrnZ2i +q+QrHhwqHxMncsKcmqyvyiIdJynGm5yeqy4kJyE9qqSmrkA1XOS+rqWdouYmFxslFRc/xKqd +pKys3iklJTS8sa+sr7DDNSo6dMnA6863sq+zr6ap2zYqJSgaDhg/sKSfn6WvVCclOl9a68e9 +q61sQ82zwUsxMF65rKahn6i+NycgIB0SFzLTvKyenJ+tPisvLyosOc2trLm1qKi+PC85Xs++ +tKifprLYLicoFQ8eKSJJqqGZmKWwr9YuIyEhJzzgvqugo6mw5UNi2dvOxsLrOC0zQfXORTxU +Oy0zPU3Iu8a9tLvMalJe2NduY+LRaUVCV87G1M2+u8hIPEvex8LJyb3ITz0+SVpNPENsUT85 +NUReWXHCt7vNTT5KeNrLu7CttdJdT1Nsd+3X1ehq/9bJzWJFSlM/NC8tMT1I+cG9wMTT/mZO +P1evrb2utk5NTj5O6unVxcPCyc/OfVxMSVRHPDQuLjQ4RtfDwLq/yshvXtDHytHbyt5FTNnD +u7m3rau1vcBLLSwnISQkJy4uOMu2r6ein6GwxcNELS0sLTIxPV9vvaupqaeko6uvsck/MSMc +Hx0YICknN+68qaejnJ+nqLPNOigwLiQrOT1O3Lyxr6efo6alp67LUTYhHh0XFxweJTN9sayn +npyeoqWry0FJMycsMi8uN1rY0rKnp6Wjoqe6ycosHiUdFhofJCo1ybSyo5yfoZ+lr77STDQv +LisqLjc/V8Oyrqqmpamvtsk4KyoeGh4gISk1X8i6p6KkoKCqr7O+7kY+Ni0tLy81S87CuKup +qqqutMVAMiwfHiAgIyk2Uuu+rKypoqKmqay2y/JNNC0sKywyQGXOt6yqqaqut8o9Ni4iIiMi +JSkyRk3Br62ppaOlqaqvx+FKMi4tLS82RVzUu7GwrKqwtblaOjcpIyEjJSQqOUNhuq6ppqOg +payrteNOOjArKy4uNlToyLWvq6qrrbW8fDo3JiIkICElKjREd7atqKKgoaSqsb9TPjErKCkt +MD1lxriuqqenqq2ywlg3MiceIx8fJCswRte2q6efn6CjqLfNSzMsJygpLDVI1ryvq6inpqev +tchVMC0qGx0hHR8sNk/BrqOin5yfp6m8Tz4uJiUmKi48Zsa3rKinp6apsLjNXTIlKR4ZHiAe +KTxkua2hnJ6enqezvj4tLSIgKSswUs26raqnpampqra9yU02JyMkGxgmJx89vsSwoJ6en6Sm +suE1LC8hHzE5MfW1urGpqKerrqm05MvcMCImKBwZJCsnMsqvrKifnKGqqbVIMycqKSAtW05r +sK6zra2srLa3rcJQ2WUpICgiGxwjLzlFuaKjpJ6dpbPBVTcqHyYvKzLQu7qvr62rtrmttci/ +wd9PNygoKh4aJy8oOLqvqqGgn6CuytA+JycqKzI/VMGwtLevr7e4ubi0ucTadFguHiYqGhwv +MznBsaqdnqmmpcE9OCsoKicu5MjWtq20ur6/urnFu7G7yMjpMyYoJRwcJS071LaqoJ6ip627 +3DwqJiosLTvjwrqztLi7xca+vr+2sLe8u9Y6JyEhHBwgJzjBrqeenJ6irb9hOComIyIsPlfV +uq+trrW/w8G9u7y5tbK40k01JB4dGhwiLEa1qKGbmp6iq8s/LiQfHiEpN2a7sK2rq6+5wb65 +ur68tLW+1EgrHhwcGh0kL/mupJ2Zm56hrto6Jx0cHiEqPs6zqqipqq+7vry9wL69v8PM9Dsm +HRwcHCApN82qn5uZm56ms/kyJB4cHCEsRcGuqaWlq7G3xNPOztPU1cfB0186JR8dGx4kLEyz +pJyZmp2irs09Jx0aGR0qRsSspKGgo6qzv9loWE5KU+LLysrXOSYjHh0hJi5ps6admp2gprTo +NiMcGxwlOdWwqKSho6qyw/ZTSkdIUvDFuLW+3zknIB0cICcvYrOmn52fpKq47zQkHh0hLEbD +r6mmpaetvNZcTlFZXWnVwbi0trteKx8eHR8kKTfgs6ijpKivub9YNi8uM0XtyL27u7u9yN1p +YO7XzcrHwLu8vsLUaFJMV0kqHh8jJi4xN/u5raqstbi3tbfG2utrbFJCQkZM/tDJv7mxrrG3 +v8/xUj42MjE4QlRodF5ZTzszNzc5QUvzxL68uri4v8nR525aSkdKTvXLurKvsbW9ydNmTzw7 +OTk9Tmpe329HRn5qPz5R8cnMYUhLaHxZTElTdtvb3svAtrS3vc3d5/FabeJeW+jU0eRjXH5X +T0RDTU48Tv3tzM584sDdRE5T+1xmSU5cyNH60eTI1+hfa+3Ybv7PynXK3k/kQfJWXExO5+vc +2se/V8fq5mM9fETeVk3P1stv1PNlXF1aV0rYWeXYesLJ2WXdRms+TF1CWeBd38/RxsrlycNJ +22TazUvk31XZXd1N7Vxh0UHaYO1X3GHJ4EzMQtY92UR0V0/bVcBOvE/Dz/rSV+t6y1rMY9vZ +XsxbbEHtX1HrWchoX/Z02/NPQcM8yDfTUU/JUL1Hvd7J1W7N+N1V3FXXUXVX1WrR1lfIS8hC +b0x4Y0nNVctS51xYbVBeS9xjeOrSWsHken3NxWHcbdrYVlj769le5/3EWtfr82NnTvtPUuFU +WXp9S9RL72VJ11rYX+nq2PHSW71Kzell0lrt5OLh9ezWW8x64nHm2V/dRdpFaENI2UnhTdZn +vlTU8ObXStVN61h6Y/vJRcBOyOZy3Nvb9W/W+dNS2Wv57F9N6l9t6UvaUmNm/tpfeH7Maftf +6fhZTl9eX2Buau7eWb5hzfnL1u/T39d+3GH+aU/4S2tV5GPtXfxe3Fr+Vtle0FZ4Zd7bUstI +ylTjXdt85WPpeN/Lac5d0nH3alfpTPNS/lhsa97ve9pu1GTb6Fvtc/Vwd2Xu32TaUs1f4OBe +9WPPX+NS/m/XW1rhYHRN2k/tX+H78dd029/841bqbm5Z4fBv1nnk7ubc7F3YVNZV1l/n7X3p +fGlU+F5Rcl72W/lo4N7/y1vZd+xi4mdZz0nRT99bzfLf8lnQ7mnZY2Xu52tj7mDbTfZd3lrn +aGfc/91Y2Gbaat9s99xX3FnnYuFg2v5q/nBl/+xlbGvfe+Ze61/ZXmHdbelr9Xbs7WDY9HRl +dO5e5lzZW2bcX/d+7GzP/ert63Lu3lXman1o+GRpaP3tYuBu/2hd4/nk2uJ25Vnn5FhfXuhv +fPLtdOvf83To3vl6XfvzWW3+Zmpv+F/8V+5ffHZw4+vm7Obn7uPu5G3u8eZycPn/cnbg+Oj5 +5eNxdmr8dmtycGNddWRtX29senLu7PHrad7p8Xh9/G/vc/T+6+ju5nT2bOtsdm19bfR0+Hd7 +b//q83/r7mVl7vxp+n3vZPNfbPd/ZfbybtvY9fj07Gnk+WfhZV5162D63e7d+XNqamN8X3Be +6+Nz+upmdXFf8F1Y33db2+vYzN7Pz+7o23vt32x4XlFJRURCR1ReavP739fa09fa29nc1t7i +393V5tDY5NzSycbKw81qPzMvLS4yOEJO4sC2sbGzvMPeW0o/Ozw/Sl/g0MvHwsHAxsvHyMvI +yMXI70gzKicoKzE9UNa/ta2qq6661k45NDIwMz1N4MC8ubq9vsLFw8nJxsO+usH1PCohISQp +MT9zwbStqKitt9ZHNzIzNjlDc8u7t7q+yNLQzszGxsXCu7W3x0wsHx0dICxE17esp6OmrsJH +My0tNURQ2r60r7PGX0ZBW9vPx766s7Gxr7hOLyIYGBwlQLqpn56lrMs3LCgpOFjIr62vs8Bz +SDg4RFDbysjFvru1sre1tLlcLSEZGB4qa66noJ+puE4sJygrRcq5q6ivv209Ozk4SGHcxL+8 +trWvra+1vMNpLyEZFR0u662mpqOqvUgqIig126+trKu5XTouMz9L78nHx8zTwLauqamvvNP2 +OyQaFBgqTrWnpaChsU8qHyQ26LCqra2xXzEqL07e1s7SyMHNxrSsp6m31VBJajskGhYeONm6 +q6Sfo8IvIiEu/7uvrK+zwzYoLEjDvc3m1czsTX2ypaOrykpLcc9KKR0ZJDxG3K6inqVuKCIm +NuPEs6msuO4xKTfQucBqS1lZQ0PPqJ2hsWc+TF/Pz0ErHRskKTuzoJ2fuzEnJClByq6io7Nz +QTEzWs3hTUFDT1FXwKieobNdOj1K3rq5fy0ZFBsp5KKanKTXKB4fKXKsn52kxEQ4Kio6UGXq +7u/X4dKxpJ+oyTovOFS/q6a4KBIPGC29pZ2cp18mHB81uKOdn6rdMyskJT+9uLvFd+fj5rSk +o65NKixKvauips0lDwsVLb+fmJugviMaHzW2n56jqu4qKCUm8Kmvw/w7P1dss5+gtT8pLeqw +p6CqYy4VCQ4rw56Um6W0JxcdLcWdmqCozCkiHyFspai54jw9TlS7o6O1TC811bGso6HEKBkM +Ch7BppaUorM9GBcsyqKYnaq/LB0eJFOgn7pcOS45Q9OmnqnTOjRVuKynpb0uHhILFU+qm5ef +tWYiGSfcqJydrNUzIR8r4KagtkU0Li49w6Obo8s5NEPGsKmlyiYhGg0VTaydmanT7SodLMSm +m5+8TTQoKDF3q6O5OiwrNey3p56kxzs0OOGvqKSrNhwbEw8ntKSbnLpTOyIm6ayjn63mRi8m +KUC9qa1OLjM7TcaypqGxRDM8YrWop6rZIx0cERZIqJ+bp99cNiIq2K6jobVXRC8mLUu8qrNK +Oz9CX72spKXEOjlVyrerqsMrIh8TEi2zpp2ht8JNJCNFuKeirt1qRConMcmorl89QkNLbr2m +n65YO0Fex7Cps0QrIBUQHuisn52pt2gnITLMrKSqvMhWKSEvx6ywzlJQRTtMu6afqeE9QEZV +vKiuNyotFw8eSrqfnausty0kM0XEqa29t8sxKzVVvrvrU19EPV69qqCozV1bPkS/rrBKLTAa +DxxEzKaep6esNSMuOmyvrrmttT8vOkJYyuBScFFF3720qKi6zt48PMC0wkw7Nh0SGzdxsqOk +o6lNKi83Ps+9u66v40dOP0FXRELu39+/t7OrrcDJz09dvLroPzs7JxcZLUzuuKumpbZJP0I7 +PlnXt7DI0sFcQEs6Olpe4q+surWxxNvuSGe9z1ZlNzq5ThwfOi0oO1+vnqrErq9JMzc3a8pl +y7PCV0s/SFxNy660v72+xcx91re8YUZHOjU5TrrKHho5MiE5uaicpse3vi8qPkhZxr+6ssZY +YO7j52Hkv77K1tLBur/Ne0VEOy0vTbu55s7fIh40Li+/t6+kvkPL7DhM73/HxurdzdPJwc/U +2mH1zM7NwL/J515JOTs9SmLuetZ9UE1oWkvQ1k1MQjZLdFVs/OjJXzlnvLa3yse0zjxG5dS/ +u/S9/to6Pck6Vt5ibdZMZd18SmnZSltEylfi22vH/W4/P0xZQHa+0c+8SeTcRlnFcsfk/tdK +Zt1aXM9+1M5Py9nRZ9Vtb25T+9bV3/xd3kRQQXZsYuNo715bSN9MembczdJm2mL6SeZd6Phe +y8/721nR2mhT0+jTz8LQzdNLYkg/VU3Y3c3c1HZKR0FPTk3Zz83O0HvcW1JO10vf1trQzNBd +01Jcat5Kzcf/w/Bb7l5BSlVO3/DL2NheXEdeSvhH1sFav87xW74+2/bm4s57zlTn7FXvXl7O +V+NPw1L21U74Tto72kTwSL9U7dze7FneRchIzd3M38neV/1NWGLMU8Xced7kae7XT8ZK3VTc +VMpJxkPQTFBiTFj7b2PIYOjrSu9O5kzH2+rO5c9R1WtP4990zm3eznXkdlrZXVvt10vW9Gtg +TVtHXE9xec7m6tLY1+NY3WVQ6eP7cNf/WPb3Wdn0Z+3N6/HQWe/kVudJ0WL/5WhczUvRUPBf +X+9wb3V25v1q3mnIV3Jy6EvfZ2vNaODf7t3ia23lXlLN/1nQ9GvPVNtV6ETUQMV13/3h71lj +X2zYb+Hc3nDtWl/oUmB0yVjTZdNq3FvUV/BO1Vzu6n5sx1DeUdhG33ZaylnIUtNNYFToW9Vn +x1jbcWP9+uNodvds4eXycNtMzk3jYOda0mTq/eBeWv9saGxe03XUVtH7TctKyVj87XDYcnTi +bNBY5PRr+E984mVp+PRXy0tt0m5s1VFv31hczHj64VXZ+F121VPTdmvb4Fxp/mp7WVjpb358 +6/ri4nPYbW7mauBobfd76/PZfOz+bOPt6e5pVlhXYk5defDpb9vdz9/g4eN2+WXmdmdc7+5e +5Xvy5GdiXWJTTVFT7fPfz8rLy9nR5epUWE5PWU1v2+/e48nd2PfX1XlvZu9vXVROSU9NUV7f +1NfX2cnY6Ghwb1lPVHjvfvfd1dF89vB9XWFu6uj439Hj8e5s3/9gZ3R4altkbG5kbXlkYltb +Y2r739fPzt946ulTT1v+fvz2z8jX4e3dbFdUX2VUYXl8c33SaeLa2ePr5t9rSUpwW1pl3MrY +4tjP7FJSWWVWVOre0uTg0tBtWVxfX1xe49fk8t3maFJWcmpq+9rO2ePj3vJdWmJsZmlz+X1u +8/f5anny7N36eN/rb2Z19/p3fubu//P06mlqa2ZdYvpkftTq9+Jy+3pee+fs/ODf4epq92xi +XFtfam/u3t3z9238Z2RoavZ27ezk4uruenv49uz68+fn7/T8ZlpbY21oa/Xk8fhuZGhrbfjt +6eLZ3ef49PltX2hvY3ni3e3x4fpdX3B5b2xx4upsZ/jsaWz+9v5w9N7jb3fy83VmdPN0eevs +8m9+9nts+fLq/u7oeGtqdGx1/XJv5e9q6OBlamj+7HBv6/dxfPft+Xjq5u7q5/J0ZV9janFn +euLd7Xt1dG1hc/Ry/NzY5nvz+mZv6n5ydl1mbV514OHh5OrhdVtfa2ZiYHre5Pfi4vXv3Nhp +TF7kT0/QxsbObXl4QT5c+Xjez8nWXVtvWE5o3/P929nvX23deU9n1+tn7M7SZ+jP+lZ36fdv +UExNS11k58nJ0t7uZVdWaurq5NvW6lxZW2R+6+Xm9OrgXU1rfVVi1cvM1tndXk1Yb+TQz8jQ +RThAQTxZw7q9ydPqRztEa9vPycjOYUlMXVZR0cbVzczcWkZPZ+3JwcjIyPg9KS1OPkO6rK/F +aXBHMDRuvry+t7xROjc8S1fLu8DeX1xQS2XPwsHN1dFtT3PMv9EyJjxCK0GtqLbNy8w5KjnT +xMq7r7pJO0I+OEXLwNHCvtnyZ1VjXuC+w97JwcvGVDAqIS5IP7uiqLvTSjwtKki7tLCwt9k6 +MDY+P3DGxbzLb/vf72vgxbvF3cy+xtnVSy4eHUg9NqqdqbvvTzokJ2e3tK+treYuLjUxNXG6 +rrS+vM5USFjZyMfBvbi71uM+KhoXSUssqpehuepNPyIfTbKvraqlvi4qLSorSrqqq7e5xUs5 +Sce7u7awtcO/Oh8bFyc6LrOXnLC61DsjHji/xLKhoLQ/NzMmIjLbta+yrLVlTc+/wb65tbvP +cVQwEw9KPhm9kJq0srH9HxgsxdXYo5enP0hDJRwnaMm/q6Kvz8q8v8vCuLfTQt/FHQwluhgd +mpGstqWqPhkcTkUrvZedzdOx9yAhP0YvSaypu7alpbnBxXRLPVBGGhFbXxEvlqPboJyuRiQo +Oycfy6Ozrp+v2V4+LigtO/HPsp+fpqWqvlstJjQhDyGyJB6jnd+zoK7GRS89OB8m4c69pqCm +rb3uOCcoNj1jsKKen6CrvEcqKRcNIiwYPpqot5ygt7xSMjYpITRCPrmlqaeosLnfOjc0MErW +1bOjpay94swuFxkmHxkxrrS9p6Ktusfr2kUtPk88SMK5trCysLXH7VY+NTpAXc68t7fG9l0+ +NDQuMVBHQL3CPvPsOEraaM+/y7u54OrZa2J84M3L1HlUT0Q9Scy9u6+ww9pOOTg1NlLXzb+4 +vtxNPz4+PURj2tnOyedST1ZSXdLN19HhYElETlxjyre4v77KYUc/QUtQe7+9w8LTT0VAPUNR +WPfP2eHX5VtXb/f34ePvfF9RTk5Pbs/BwcXG0WFOS0hLWt/KxMbR3/tPRURESFZWWtDI2t3P +0ebv29f8d+hhSklgf/zbzs7V2u5iUU9gduHW3tPW9mBbST5DSkhL/tDPyMPI0NPT3X5dYF5N +UHzi7+DP1/fm4F9dbGVkbnr+5OHq7/5dT1JNRklf7NzMyMnP1tHdaFpdVU5We+Pw6tbV6H3v +cVpeXl947t/W3Pjv9l5SXOZ/TV7R5VfbyfxZ9ePudmBZXGJvau/Qz9jd2dt0XFteVVJp4tfU +1Np4YGBbUU1XdeDg7uHf6m5aXGNmdPju3N50feZu7NfY2d3c2flSW9biUE3autI1P7q/Ojbj +vV43UsHcRErazG1N8srO73fXzuFbX+zT1e/cytdqXGlvT07f3GFPT+vZXVvnc0pPzMF+RUpv +znpAVcHEWEjGt9JMV9DI/klZ2uhcT2V5c/nzz83iYnvtVEtX/lVV5+Zq8nDd2mlO5exaYvHX +2mjrz85OacrJR07c2XNL89PPZVXcx3FNSc16Plxn8OVqaMDi51H7y2dK6vDX7lxr4u5i4ljY +4VZ4dtrtS17OX+9GzsziP/nMUXVVWc3TU1LDx2hByeNlXslP5+pU3thqTc5YaG3sVufOXFbv +ZN1tWdbjzlxd02r4XlrdYGh/62PdY1/eeWH6zGFY4VrP6FFv1dxrWPPJ6U5bxc3fSeV9zl5G +Xu/9T1he2XFd7tLaXFTL3Wli5nvv4ORa59NQYVnW/Fxn5eHhVO7J73D901/nXG1VeGds3GvZ +X/1X1d/oZFzmX19MzmXlXXTj/t9b4nbjaWvje9Xa2mTd1fN0VHJ99Et8fNRoUfXZ7lDoXNJO +WmT9cPFt2Pve2mrk5dFk7Wvc83pt7Ph0fGd9bn9S7GnpX2T96etn3m7ebFxbdd7e6e3e83z7 +d2v7+2BwZXDrcVvt6Odr+9jXaGbd62pg/OV7+Vvj7/D0ZmF6YGXva/P6ZOx28nV71+zr6Xrc +7fdyZeptdmp+4mVtXWZgZWPudPZ86t7fffj59/n79fRy3n7W7OPe7W77Z2tfaGtvbVtsaWtp +Y2pl/n708nJw9Pr86PPa/eDj2+l16Xbl7vLy2+Rr7eX+3Pjw2Nzc49XsVk5WSkBBRUtOTExo +4+v028/MzNLO08/a3drn2N/j4eneft5t7PLi89fz5N3Z8lZRTFM+Pz9EREJLWdrf19HMzM3b +1tXd3W/k7Onn8ebq3O3Z0tjT3tnS2+je6t7q+mtWU1ZRQkA/QUFDSFRq7eHSycjJ2tTM6tZW +X/th/1LieNZu187ZydnNzdjX2N7V/trvYWxOWlpdTUhMRkxESEtYY2Tm39rb2Gls72r1b3b+ +4vPZ09fIzc3LztHLx9Po8udbb2hfX1xlVmhSTUhMSExPUVlmcG53fenq7PHx7u386+Pn4dvX +3t7b19PX09La2eHk5v186+7n9+v5fmx2WlJOTExKS0pKTFBSaG379fv3aPzs4uPg3Nra19HN +zdjc29PV3eLr7OXh/u3i3dzh4uV5c2VbUkhHRUNAQklKT1RbZGz96tza4NfUz9LW0tXU1NjU +19rW2djb19vg4d3keXP9a2JfW1pVTk5LSkpISUpMT1piYm7y3tvY3dzb3Nva29XRz8/W29vh +3dTW1t7d5u3yeHRvb2tpcm1eYWljW1RiWEpNTU1NTlJaZWpu7d/m39rQz9DW1NLY3+3f3mPX +yObf2Nl0SVTDcVjTx+Zh9+DYaVtsdV5JRkhFQ0FARk9OatrZzsPGxsXYZGReSFJZbNLIzb68 +yc3V1cjUdtvR4tXHw8LQY049LiooJiYrMj1lx7OppqinqbPFXzYvLyopNkdXzbmuqKqsqa28 +ydBrT0VKSz5ERCghLyceKzY9xLO0oJ2qqqjDSD8qIScpKT/Nvayoqaeosra7ytZzYs3M48tp +P0wtGh8oGRozU3avpZyXnq2nsS8kJyEhIi7Cs7amnqayu8TSPjjbxWfIrq+1t8BQNyEWGx4X +G0W6taKal5mktbtIHxsfHyMu76aiqaGfsmhGPDk0P8exr6qlpqy04y8mHxQQGyIgOamdm5qb +m6hELC0hGx8uRce2qp6kwMHJMigtNlPKsqGfp6erweZVOSsiISQbGTBMMuCenqWmqq/eKSU6 +LyY/tre5sbe5zzI3VDk5yLOwrKuprsf1fUlFcFtGQzs5IxkjNikpsZ6nqaKhtD0qNjcmK864 +z8W6xtdINF3NVMOrrrGzvLzWSmTh7MvE30c8NycXGS0yLdeamKKppq42Hh8vLipPqqi0vb7X +SDE50sXDs6uwu8zh4lRIV97PyL7OQjc1HxYfPEBKqpeaqry+Qx8aJUNR6ayfpLrkSTExMkC7 +rrCursZcT0NLaHf839LCsr1GTz8fFx42R96rmpquXUYyHhwrz6+spaCq5C4qJypH4LCip7S/ +Yzg4O0XMvcTHwbyysMZJOSscFR5L772gmqG8PCwrJSVLrKarq7FpLycmL0G7qKqss9s3LTRK +5ci1rbLP3bu2uLbgMigeFho7w62em6C3Mx8gIyhGrJ+hqbpMKR8oOnK2paKy2Uc4Nz3msq+6 +x9RqTHS/r6yyzDQiGhAazLWunZqlVh4dKS46tJyYp908KR4cLK+lp6Gn4S0jKUjHsqiquks1 +PVDYs6qorMAwHhkQGMGsq5uaq0ccGCg3W6mbmac+KCQfIT2mnaSuxD8oIy7DqKeqs+MzKTTa +sqmmpKzbJhoXDxuwp6aanrU1GBgvW76gmpyvMSEgISrbop6ms+o1Kys7tqepr8pCMi9Evayn +qa29NR4aFA8vn6efm6fOJxQbTcSsnZqevyQcICgxwJ6dpsBCNCsrRK+kqb37SDEwXrirq7i2 +yjEgGhIXsZ+yn5yvPRoTKcbCp5mapjsdHiUpP6ibnqvuOiwlK3OrpKzDeD0uN/q2p6mvtVgo +HhYPL56uq5ukxSgSGlzGtJ6YncEkHSIoL76fnaC8PDAnJTe9pKCwzV40Mj3zrKGrt8MwHRIM +J6CxrJibrS8TGUBK+qSYlqosIicmJDusn6Cu0kkvJitjraSruchKMjBAuamqr8wvIxkOHK2r +rp2dpfkaGDBKS7afmJ5RKSwpJS5LrZ2mwMVaNC0u26quuri9/Dg137O1u9s+LxcQKMjIs6Gc +nu8fIzQ1NmWpnKbeR0k4KiM8q6i2trHCPSszzL3Itqu0+T9L18jCw8lbHhAdRDhRrJ2aqTYu +OyomL82lp7W6wFk4KzDMwM22rrbsPEnx6826tLpxQ0xDPE7Szvn6ynVAKyJI4DNJxMXISUK2 +r8XDx9JOKy09Rf2+qqKsusBUNCwtUb++s6quy0E7Nzc8Rs3HfOTV2M/HaDU4NCcnLDrduq+k +pbPPRD02Lz/VuK+yr7X9RUNATH3VwcTW21pIWvj4ftlQVEk9UVPMytDCyE8/Pi4+SE/Pur/e +TD8/PVL8vLa4tLniUT9EXVXDvby/79BIQ05tV9O/QHHYQD5oztTMeNddOj5AOXu547G6TmVQ +NT9PSbfBw713WmYzSdZBxrnayN1PZuvo12zL8kZ3SkjKzlO3y1LNSTlJOEfG+MKyw3ppQDw9 +ZFnNsuK/0us2Xj9MyvLdu2Rd5U/mRlvvbmrNU8pk6NHGWNndSmxMVGjd1Wu729FIRnE7Tutp +wMPRX8zuOdZYVdHe6uLVXX155l81uUhHwjq9w1POwFZSZ0TJTj7Fzk6/VE7HPUXuyGruxrvM +WWz03T9T0t3L723H10Y+zz9PWlv22WPG5s9TVW5RRnVg6ODjxdLfT89OQtJqWLlDucrs8OBb +7Dpz0Nxb4sFg2WH5f0o+RvTNO8HJS79R0eNWPcpQT3jDVc7KWM9cakjMW1DEadjZ69lf6mxp +Xl3RTtltXctX3WtOw0XnZGhZ28lMzfZfaXxh2lfZd13XbndN31D3anzMVcjNVuvjRspK1dff +attZzNI/0PhZaVtf1UvSUelwVE/BTml43NvpUsjpa9FWTtdIeevV2/rNv1HY3T/KP+5vZmTO +X9j9aGps8VNW3lNm3mXRdNtPwWZkdc5W60rHS9VgXM5mWF3Qbe/63dBd2HLh7eBd9WF09vHv +5lfaT/1ifE/qW1pp4l1h1FzLU+LQVeTw9ctHyV/NbHrj89ZjctpgVF3z/U/wVs56UNJaYOhc +3UzNVc5azmFh29pTxlTpbudi/u3oXORG1+BiU9JqZGru29pO4tH+X1jLVNRZ1F3UStxjdE9q +VdR99ebdWNdWUM/zTdZh11bT8tX3b+Bu9WTi3OVfz23NWmfjXmhUX115Yl/PV9ZM4VlfVOLu +5Ol+2d1m7mxf72jtz/Dl4ufhYvBZ3FP0WfLeX29v3u/ye+xS3lzSXNBe3uHoa+l7d19eYXpZ +fPr7bmnyc3Js62rh7PHl6Gb2fOZ02VnYdWXs7Ot55nf4X21+al/u+27uWd587Gn25WjdW93+ ++F3Vfehy6XxvZm1k+2L7XOl19/5h4nlm8+ll3WPd79tn1mn2+O5f6GzrbW3d71nzXO5zb2H0 +ZOL7Z+V8dWfnaO97den7bvLm+fZk3fHTZmfpbflt72b9al/y/nJo/f5lc+ls5eVu9Nz3dur1 +6u15bO1rYnxq62Vzdmn2dO5m7vth7ulydvv/Yfna7vft3fB97/h7bHZ3bHlh+n5993llduts +d/Ppfv1u+/ln7fzx5/Z6cHd4eHDv6u/x/P7u+nbwbnVx+2jxavVub+p9f/JnafppZevm5fDf +7+zqenvr+Plv5HhXcl5ecmxb8edpbvbod/nr5fXn9Wru7WBt9t/offLl53947e3jX/V3cm9z +/V1XbeP+ePTcdf3naXRs8Proe+5o+f1XZuXja2fQ1nBsbNtvd/jp5W9tZOplYltyXXJ1e957 +6Nvp7fX79exjf3lcd/J04953+W3i3vFe1nn07vz15GtX8G9tZ2p531174n5m9lpobW52b2bg +/2zt3/HTzd7P0M7r8HTe/O5dXE9MQT08PTxDSVvdzsa+u7u+vsbGy83KzsrFxMG5s7s2IiUt +KCIeI0K8vriupqGnv+JYRDYtLDv1zsi/samprq+urrO8wtQ1HxobHB4eIji3pp+fn56iuEUp +ICIjJzbPsKalqKiqs7i+vru8xNE7Jx0bGhwgJj+5o56bnZ+nwy8fGxwiLE20pqChqa6zxdXG +vbi8vbC1OB8YFxkeIyvhp5ycnqStyzcgGx4tRc+0p6CkrsfZztTNv6+rrrCrqz8ZDxIdJCYt +y6CZnq7L8ko0Ih0qzK+xurKlqMVIXb+7zt66q6qusau9KBUPFiItNVKxoJ+u7z5BRTYrLlG0 +rb3JuKqsv3XVvMBrVsSsqa62rapQGg0OHjM/QNCpnabIOzRGXzs3SOe4vMm6qqetzktYVkZC +366jo6qvqa8sEwsOITZM1bmnnqzbPjRNzU08Qk66sbu5r6yzUi81RNrAtqefoaq7xrk2FAsN +HUu7vraroqjTNi5DycxDQknYur2+s6+5ZzA1Zb61ta6mpa/PXMvUKRQNFTG7rrvMs6ev1zg2 +zbbUOC8zVcDBua6vulI0Qsu5vMm7qqq1zNe1uSwUDhYzv7fIvaefq+ozNPbTPCYmNN6wq6im +r9k4LDjyz8m+sKeptr3Cta87GA8QJbyqq62vq7U/Kik1YPA5OVHMrqqvsspAPDE19sKzrK6t +r7mzt7q44CgWEBtHsqm3yMHETTguOtDHXzY1Pl69tK+tve9JOU/Iv7u+uKyrq6uutcYtGxYX +KErKsbe8xVA6Pj5VaTs2SVpd0rippLBtPzk+U+m9s6+rq6mpscfhWioZExkzx7TM6NnJ005D +T9PSTi4vS9evqaypu0Y7NEbNy766uq6rq6ewwdE9KB0VGio2yMfTtLm8v1ZGSzYwMT/Eu7Cp +qqvCPjk2PlNsybetpqWmp7LFQCogFxceLlG+vbe0xslqTU1BPDk+58G6sK2rsHk5NDpMX+fA +sqimpqetu8lBJhsWGSMxTcW5ra+7xHlZTz42MDnlwrmwrqmzXzYxPEph3L6tpaOkqK222z8m +GRUXJTvsv72vr7bKTkBBRzszN1m9sK2tr71MMjE8WMy/taumpKass7zOQyUZFhsrPEn207my +usXpW2liQjQ0R8i1sLK4v2xCPkNW38e6sKupqauutc49LCEcHSQvPkVM3ry2tr7V4OdjSjU1 +TOG8usPEy+h2ZV3dyL+3sq+trrK2vtVXOCYeISouMS8xT8O2sbjBw8XPUzo5RVn519DMyMnM +ycbFxcW/vbi5wcnf5flXTkQ8NDM2MzM2OkRg29Xh4M7Iwb7FzM/bcU5BQEhVcWb8z8C5uLi4 +ub7G3OvbzcPKbkQ8Pz43MjAyODo9R13Tw8XJ09ze9VdVYO/a/2/41MK8vb/Bv72/v7++vMHU +a1BFPT4+Ozo5NC8xN0Rc/vH11cnM0dLQzM3rVk5d28zKysfFyMfCvbi3u8je7tvT61lPTEM4 +MC0tLzU6PEBOdNLFv7/Bydbr6trRz978bG/22si9uLa3vL/Dys3Qz8zWWkQ5MzEvLi0tLzY+ +SV7bxbu6vcDDxcrO1t/4Y1dUXuLIvbq6uru9v8TJycvP12hHPzs2MC0qKi0xOkpp18rEvbq6 +ur7L5GJTUlVp6NjRz8vIwb26u7y9v8TKy87V5lA+NjIvLSwtLzdBUF/kzsjAvsLGzNrobmh4 +7/R6/vXw1L+3s7O2ur/Eyc3S193xVj4yLCkpKy43Pkpd6tTHvLm6v8vX719VVl985uTh3dLG +vry7uru9wsnNztDPztRpQzYuKikqLS82P1Lt0Me/u7m4vcfad2BcWltgZ3fk08a8trO0uLzB +ytbf4NrRztxNNy0qKCgpLDI8SV7byL22s7K4v890U05YaXf36+jZyr+4tbW1t73G1ePo6+Pd ++Ew4LionJigsMT5X48zAu7aztLe9yuVbTEtPVl5sfeTNwby4tbO0ub/N4vDu6+LoWj8wKicl +JisyO0/jy7+7uLWztbnH6VhJRUpOUl5659HEu7WysbK3vsvg+nfz3dlqRDQsJyUnKjA6SGjV +xLy2srGyt8HoTUI+QEdOXHLr1Mi9ta+vsLa9x8/c3+Pk43xPOy8pJSUmKzI+VODHvbi0srG2 +vc9dRz8+RU9cc9/Rxbuzr66usrvI2/N18+ni6lk9LyomIyUoLTVCZ8++t6+srK62x2dHPz5A +SVRp/eXPwbiwra2wucTW/Wp3593b+006LSckJCYqLztN68S3r6yrrLC94Eg8OTxBSlNv3c/C +urOura+0vs3ncGl74tnZYEEzKyYkJScsMz5fz7yxrKqrrrbFckU7OTo+RlBo3cq9trCurrC3 +wM7rZGzo4NzcX0AvKCQhJCctN0rbwbWuqqiprbnQTTkyMTU8RlJz1sW6sq2srbC5xdxrYnPj +1s/WXz4vKCMhJCguOE3XvbGsqKirscB+QDYwMTY8SF7fyr62r6yrrbG6yN9kWF/l1M7eUDks +JiEhIykxQHTItq6qp6irtMVcOzAuLzQ+TWzWxLqzrqurrrS+z/9dWmzczc3mTDUqJCAhJCo0 +ReTEta2qp6msuM9MOC8uMThDVuzLvrixraurrbO/1WxYV2bk0MzfSjMoIh8gIyozRte+sq2p +p6iststOODAuMTdBV/LOvravrKqqrbXC41pOT1384N9tRzUqJCEiJSs3TNjAtK6rqaqststX +PDMvMTc/TnDQwrqxrausr7a/zvZbUFJcf+D1TDouKSUlJyw1QWjMvbavrayts77lRjo1MzY8 +RlL+z8C2r6yrrbO8yOReV1xfY2puWUc7Mi0rKy0xOEFU7M2/ura1trvC0WpORUE/Q0xe5MzB +u7a0tbi8wsnW+WhkX2BjYFxLPzs3Nzk7PUBFSk9WYHXm0crJy83V3N7e4+vl5d7a083Hw8LB +wcHDxMjO1OPscF9YTEU+PDw8PD09PDw9PkRLV3rVy8XDxsnKyszMy8zO0NXX1c3Kx8fGys7P +1dvh63tiX1ZNSUdEQT89PTw6Ojo9RlRw18nFxs3Ny8vOzcvOz9TZ29vSzMfHxsfKzM/Z397i +3+9kV09LRj8+PDk1NDY4PEFNZ9zMyMXGx8bGyMvLz9TZ5urb0s/LysjFw8THy9PW3ersbFZM +R0E8OjY0NDM1OT9LZ9nKwb/CxsjL0NXX3d/f6Oro3tTMxsPCwMDDxcjMzdDZ43BURj88ODQy +MjEzNjo/S2TZx8HBxMXLzc3R1NLZ3t7g4NTJxcPDwcHAwcPIzc/R2OlgTkQ9OTQzMS8wMjY7 +Rlrlz8S+vsDCxsjM1d7j3+Df3+HZzsnDwMHCxcfKz9PV1NTcak1FPjg0MjExMzc6P01u3c3F +wb/Cx8zR2d7p6evq3tnX0szHxMHAwMHGy83PztLZ41lFPzw3NDIwLzI3O0NX6M/Gwb++wMjM +09/r9nd9dfjr3s/Iw7+/v7/AwsXJzc7U32tQRz45NDEvLzE1OT5KYuTNxsO+vsHIzdfl9HFo +YXHs2s/PyL26vL+8u7y/w8fFzGZAOTAtKykoKi41PUv3yLm1s7Kzt7zPZ1lLQUBCR1dx6Mq6 +tbSysrO1u8HCy93fcEg8Ni4pKCgnKi0zQW/YwrWzsK+zur/P6W9NQ0VJSVrr0cO7trCws7W3 +vMHEzdrZWjs4LyYmKCQlLC82T9rGtbGyra63ub/XdE5HQz8/TFv4y724sq6vr7G2ur7Ezdta +PjctJyglICcrKjdZXMqws7Grr7e3wdlzSklIPkRRT37FwLyyr7Cvr7W5vcbM3klDOisoKSQg +KSkpO1xewK+1r6uvtbjBzWlMUUA8TEtF3sfMuK+zr62ytrm+x8vfTEE0KSknICUqJi5GQGq3 +uLaqrbSvuMnMZk9UQEFNQE/U38m2uLStsLOyuL6+wvxVSi4rKyQgJiclMj5A67q7taqts6+5 +y8xbTU5ARVFEV87cw7O3s62xsbK5vMHLYUw9LSsqISAoJCY6O0LBt72uqrGxrr7Sy11LTkZA +SUxf18y+t7SxsLKzt7y9w87uVj0vLSgjIyckKTY2R86/va6ssa6uvsbFUUtYQD5RS1LQyMC1 +srKvr7a5uL/Mx2JGQi4sKyQjKCUoNTVG0Ma7r62urq65wsD6TlhEPE1LRt7IzLmytrGvt7m6 +v8bB3ExRNystKR8nKSMvPjdbvMa5qq+yrLPJwdNJVlk6P1hDWcPIvq+zta60vLi+ycPLZ1M/ +LS0pIiQnJSk6OkjOwr6vrbKurr3Dw1ZMXkI+VUpSysvJtLO3r7G7ubzIx8npVVI5LS4pIyYq +Ji08OlDHxL6urrOuscLGzE5MVz9AWEhSyszFs7S1r7K6t7zIyMn3VFQ6Li8pJScqJyw6OVLK +wr2vrrOvssXNzEZFWT1AfU9bwcfEsLK2rrO7ub/Ozc/pT1M+LTErJCgrJSw9NUvIyr+vr7Su +sMHLyktCVEA9ZFRNyMPHsbC3r7C5ubzKzdPsX0dBMi0uKCYrKik4PD/eyMq3r7Wzs7vLyPZH +V1A+Uu5R2b/KvLG5t6+6vrvJ29LkaFRKPC8wLCgrLCkuPj1Ux8S+srG2s7TC0c5XRVpFPFhU +TcvCyLWxuLO0vr2+zdPX715PRjgvMispLS0sNkI+dcXIvrO1ubW5zNrRUEhdRD9fXVjJxMS1 +s7eytL2+wszS3OdkSkc3LzItKS0vKzhHQHbHyb2zt7i4u9Te30hGWUdG72lvwsHAtbS3tLe+ +wsbO2t3dWU1LNi8zLSovLyw5Q0Bgysy/tba7ubvT499ORVpOSHzr9si+vriztri5vsfKzNbl +62hMSD00MTAuLTAwMj9HTODGx7y0ubu7yOTxW0tPUE1acd/Lw7+6uLe3ur7Ezt3udf76aU1J +QDc1NTEvNDQ5P0ha3s/FvLy8vMDM419UUVBXYm3w1snDv7u5urq9xszZ9HVwZXP1Z1JIPjo5 +NjQ1Nzk8RFFm3c7Jwb/Dx83leWtkYnzx7t/X0MvDv729vsHEzNTc5O/683zzblpPRz47OTYz +MzU4PUdTa97QycPDxMfL0tXb7PXv6+HVzcnDwMDCwsbKzdHa4OPu+/P0bFtPRj46NTIzNDc7 +P0ZPaOPRzMnGxcjLztXa3d/f2Nvd0s7Lx8PCwsbJy9DY2t/j4d3ceVpORT05NjIzNTY5PUBL +Yu7WyMLAv8HIzNDW4ezr7Ond1tHMyMbEwsPFyc/X6Pz38O/1alxbTEE+OjU0NjU3PEBKXuzU +xr+/vr/IzdPd7nd5ffHl2dDMxsPAvr7Bx8zT3ef3fG1oX1ZMSEE9OzYzNDY3PENJWd/Nx7++ +v7/EzM/X5fJ7bXrv5djPx8HAv7/Dx8rT4O36fHF3929YUEk/PDk1NDQ0OT5FTmnhz8S/v8HF +zNDX4/1tb/7p3NPLxL+/wcDAw8jP2u7x7O34+v5eUEpCPTo3MjQ2NztASVXt1cvBv8DAxM3Y +2+V6d3j969zOycfFw8PDxMjL0dvj6ubp6uPvZlZLQT06NzU2Njc6PkNQdeLNwr/Bw8XM1dze +4urk3ePf1c7Kx8XCwsTHzdfj7e/29fvwelxTTUdBPjo3ODg4O0BET/jZzMO/vr/Cyc7U2Njb +827+5t7d29rOw8PI19LL1OH+z87c+W7iXkI/Pjg1Nzg4NTpGREJYzcS+vL27wc3M0dXr8G9k +cHR6b+PJwL/FxsTFyszP3OP4+nZPRkU+PDo4NjY5PEFETWFz18vHxL69w8vV1NTncGttanP2 +6NzRysPAwMPIzc/X4Ot0Wk5MRT06Ojo6Ozs+Q0lQX+7e2tPJxMPEzd3e293q/Wv25dvSzcnI +xMPDxMjMzs/X1uJ4alZIPzw7OTc4PEBESlRu5NXPzMnIy8zP1NrsaW1taHjp5N7UyMXFxsjG +yM/S091+al1PSUQ/PTs6OzxAR09cZe3Y0M7Ix8vO09fZ4uPi5eDa2+Hd1dDLy8rJyMfKztLT +2t/i/VpKQD07Ojg3ODo+Rk5j5tjXzsfHy83P1+DpfXnz5N7b29bOysnKys3NzM7X2Nvi621c +UUc/PTs6ODg7PUFIUHTaz8rFw8jMzM3U2d3r8Hj2+33r2dTTz8rMy8zLztHP0NHc9G1dT0U+ +PDo4OTs9P0hPYPPZysfHxsvO0tjk7X5jbnNvf+/e2drWz87NysvQ1dfZ19nb3fdgU0lCPjw6 +Ojs9P0hSY+rPx8O/vsHGy87W4/VtYmNmZ2z+7N/d2dDOzcvLzc7P09LX5HpmWEtFPzw6ODk6 +PUFKV2vr2c3Hw8HDyMvO1+f6d21ucW3y4t7a1s/LycfJz9bY3N7l+GlcU0pCPjw6OTk5Oz9H +T1r41crDwL+/wcXJ093l6vV/dmly7+vo3NPRz8rMz8/V3uTi5Ol+a1xPRj89Ozk5PD0/RExa +bd3OyMTCw8jKztjf5u757+3q5t3a19PRzsrJys3O0dXR1Nvl629aTEE9Ozg2Njg7P0hVXfjS +ysW/vr/BxMrV3t/t9vb67uvh2tTPzMjGx8rMztHY3+d7bVxORj86ODg2Njg8P0ZUcePRyMXC +v7/CxsvT2d3o7e7s7Oje2dLPy8rJyszMzdDZ3el7X1NJPzs4NjQ0Nzo9Q01bdtvNxcG/v8TF +xczX3tzZ3ufh19LT0s3LysvNycnLzM7S3GtNRT85My8uLi8wNj1IXtPDwLu4ubq6vcPK0O5t +c11bb2/22c/NyMLCv76/wsbK0ORlTkY9NTIvKywuLTM6QVfhyL+7t7S3urm/ysvga2piXV9t +c+TSycHAvru9vr/J0N/xYj86Oi4tLSkrLi43Pkzky721s7Gvtrm7xs3aaWROTlJPWunUyL+8 +u7i5urzAydbrV0E9NiwsKiYqLC42PlDexLq1srCxs7a9ws30clxOVVlj9NrOxL66tre3trvD +xtxOPjozKCkqIyYrKzA+VufFuLKvrq2utbe5yeTccktSVE9b6dHJwrm2trOzvMO+5EJCOiko +KSMiJiktM0Hmyryyrq6tra+6ur7a9u5ORlBfYvnNw8C5sbOzsbi+vuw/PDcoIiUjHyQrLDJJ +3sm6r6ysrKustbi5z2puTkBGUE9Z08bEurOwrq+7uLhJN0cvHiEqHhwpLik218zIr6uqqqqp +q7i6utdUXE4+P1NYW9TEv7ivrq+0tbdyNUk4HR8tHxolMikt78nOsaurp6isq667wsN7QEVM +QkVi+9vEurawrrC3tLZcNEM0HR4rIRsjMi0vbsrJsK2tpqeur6uyzs3MSkBSTEZU7NXDuLay +q7G+tL8yL0IoHCIoHh0qMy9Fz8u1qK2tpqaxta24/On3QkldSUvXydC9sLCvr7q4uzsrOC4e +HSUkHiMvM0DUzLqop62rpai0s7bP82ZFRVhWSvy/wcOzrq6yurbINC02KB4eICAiKC01bsDH +taalq6qnq7W2vWhcZz86SmJTccK8uq6qrLS6tcswKzIoHh4fHiIrLjBau7q1qaWnqKittLfA +XUhKPzxBTVvdwLm0rKiprbi8xToqLCceHR4eHykxOFe6s6+opaeoqay3v8RfPj89OTtHWd/B +ubWtp6WosbfAPyosJx0cHh0dJS85Vr2yraajpaeoq7O9y1I9OzU0Oj9P2L+6tqympKattr1F +KCknHRocHR0jLjpaua2qo5+ipKasucXeQTU0Ly01PkvWu7SvqaWioaazvmsqIiYeGBocGx4r +O1+4qaijnZ6io6i1ynQ/Ly4tKCs1P2e9sK2ppKKgoKq3wjohISIZFxsbGyMxRMaopKOcm6Cg +oa3C5z4tKikkJS43RsGvrKegoqCeoq/DTykeHhwWGBwaHi5C1qqgn5yanKChqb/yQCwnJyMj +KjJAzbKrpqGhoqGhprbtPigcGxsXGR4eIDRfx6ien52bnqWlrM5MPiwjJigmLT9S1bStraqn +q6+sqq+6yVI5KyQkIh4fIh8mN0XlsKmrpaCmqKauvspVNTAvKiswNkLXvLOrqKimpqaosMhT +MyYhIR4dHx4fKDRFvqupp6Gjp6Sntr/UPTIzLSsyNjhXyr2uqauppqiqqrbVYzckIiQeHiEf +HikxPsKvrqqmp6emqa+5zEs9OzU1OTY5S+nDtK+tq6urq62yveo/LigkISAgHx8kKDJaxbWr +qKinpqeprrbIaUc8NjUzMzpFY8a2r62sra2srrO87zktKCIgIB8fICMpO/q9rqmnpqWlpKmt +ttVNPDQwMTE0OUbiv7Ssq6yrqqutsL4/LCokHBwfHR0hJDPXsaqkn6Cio6SqsLxONS0oKC02 +R+zaxq+opqWpqqutrLR7Mh4VExYaHiInNFOynpmWl56nuV89LCIdHB8rU7mooJ+fnp+ip7d0 +PjhI1dlPNh8XGBceLi5I1b2mnJmZn707KB4gJCQrNFWsn5uZn6288HDbW0hEPl60pJ2fsVAd +EQ8NExsjRbahlo+PlKBaIhgUFhogOb6flpSWnrZQLy00PEjoxLGknpucsUMeDQoLDBs0vpyW +k4+SnK4wGBAPER47rpuUkpWeuzsmICQvTL2so56dm52myioZDgkKDhpypZeRk5mer00mGRMU +HDKvnZWVmaTINiIeHypFs6Sdmpyeoqu9QyIZFhUTFh4pvqObmJ2qyEksKyUjKjjQqZ+eo7hm +LyopLT/Sr6WfnqGosMDzTj4uJyoyLiEcGR89sp2cobttPTk7LCoqPLqgm56vPisoLkbYva+r +q6qvu8bQ19bb3mHdz8tYGg8NEiusl5qbufxsPD4nIiREqJuXn/stJCtB08fNu76zr7Svr7G4 +zk9ITs+urVoYCgkOLqKTlaG+P2NaPy0iK8+flpmpOR8dLVzAuczMxLi1rqmsq7dGNTRzqqao +0hoJBwwcqJaTmqzdP1gxKCYuxZyUmKM+HhwdLGDGs6+srK+wtq+yw0ItK0SmmJerKxMFBQ0e +ppOQl5+/PC0gJSpqopqXndQmGhgfP7epn6etuVxg/8e+00A4SbeakpauIA4FAgseqY+Mjpiz +LB4YHCzOn5aXofMiGRkkS6uhpKvURDxDzK+qrb5OQeavnp22MxwODAwVOKSPjpOmMRoXHzG2 +n5ybo78vHxodM8yhnKe1Pi443a+kpLVvMSw7yaahq8gnGhEMEiW1k46TpUQdHSg2v66noqS1 +OSAbH0Sqn5+zPSwuTbKlpazLNywqNs+tn56rajIZDgsPK6WMjJKuJRYYIzu1pp2co80kGBsn +waGiqdU3N1HJsqyvuV8uKStFr56Zm684Jh0SEBEftpKMkqkgFBYmy6ekqaqvwTYhICZYpqGn +wjMsPcyxqbDCYjYwOF24pZ+gq0wqIhsVFB1BoZOVoUgfHSdJv7Gxrautzy4jHy28q6m2SjpP +yLetuth0Qj9DS82soJ+jwC8lHBQPFyuuko+ZtiobHy8+1762pp+oeCgcHTu5q6m9VFzFvLO8 +VktDPlXfybGmo6e5OS0lGRIRG06bjo+cVB4ZHSU01q2dlpmtKxYTHEypnZ+twGhNPDo5Tb2y +rrjYeMatpajINyQaEw8ZNaeTj5m7KxkZHy34qp2YmKc0GxMYMrOdnKK0bEAwOD/msqmotGYy +NsWqo6tdKhoTEBkqtpmVmKlIJB4hKEO/p5ybo90nGhooWauhpKu//kVDRV++sau02T49vKaj +rkEfFhIUHjbSo5udnrI+KiMgK1e8pp6jrustJSMpP72qpqWvvudBQlHVuLK4xse9tbLOMx8W +EBYiO7Gen56jutg+KiUoLmOspJ+kvFgvJSctO86tpqCktuc3Lz/curK1t7i5vOIyIRYRFx40 +raGem6aut1g3KyEhLUqyn6CjrksyKSYtP8+toqKksHI/Mzx1y7WvsLS/WTMjGRUVGCjHqZqZ +nqKyyFU1KiEfJTfEp56eordKLyYsOWW2rauts7/da09W2b60sbhdLx8XFRgeLdGuo56fo6eu +vvw7KSMhIy5Mvamioqi04kI9P1nLwLy8y+JvWHrGtq6rr9I3HxYTExgkSrWjnJyen6arstU6 +KR8cHSEub7Kkn6Cmr8Ln5+TUy9xaRz08S+e8r6urstgwHxkWFxwnQMGspJ+fnp+iqblZMCQe +HR4jLUrAraalp6qtrayutslPNy0qKzNHzbavssNTMiUhHyEpMUfOvbKqqKakqK642EY6MCws +LTA6SmvWw7qwqaWlqK687T8yLS41RXvSyNFZQDMsLCssNDtM0L21r62vsre9v8rcZ0Y8Nzc5 +PD0+SHLEsKmnp6u0x21GPj09RVN83d9pSjsvKyopLDRBace6s6+ztbe6vLu+xthdSD84MzEx +Nkbgu66qqKqvuchzSUJDSlVcYm51YUs7LyooKCwzQPXCura2t7i2tLSztbnC7UM1LSkqLTla +xLKrqamssr3L2m5gU0xKSU5YZVlFOS4rKSovOkhy2MvFwb26tbCtqqywvWY4LCgnLDNH172y +raysrrS6v8zzUEQ/P0JOXGJTPzQtKysuOD5PcuXPyb+5sKypqKuwvlc5LSkqLTQ/XtC9tK6r +qquut8lzTEI/P0ZMUEtANi4sLC4yOj9JWGrgyryzramoqay2y086Ly0tLjI8UNS8sKyqqqyx +vdFhTUtGRUNCQ0NEQTszLi0uMDpCS1z20MC0rKimqK69eEM5My8vLzU/bL+vqaiprbK4vctr +RjcwNDgzNT9KccjMZkk8MjI7Ojk8Oz/iuK+qqrC1uMHXZUE4Oj5T1snEvru7trW7xtpoWVlN +Qj46PEpt7+PXysT+NSooKCswMTRB9burqKyur6+vttBJPD1Pb1xZX9i9trrJ1M7IxdNOPj5D +SkpHRVB89N/V1NjVXi8oKywuNDY78cHCt6+vrKuvt7zJ4nBPSEtNTmnm38y/u7m7ws/lX05J +Pjg5PD5DTV/v6WZeTTw4Ni4wPD5J4NDAtLKwra2vs7vH3lRGQ0ZMVG3Rwb25u8XO0+tZRTg4 +Oz5BPz9YcUxLR0FDRENGR1Dv2trPxL26vLy4uL/M197tXU5SedjQ19fQ0c7M3HdhVUlEQT5G +Rz9NaX3+ZGVwWUA/S0xJSE/oy87Ovrm6vb++v8nb3utqdG5v7fVhXl1aXV1aaV1OTU5QU09U +Z+Xk3+Rsb2dncvdeVlxdYfLj39jU0tPb19bb3+dtZ2ZibWzn7O3f29zf3nVeWVZUWFtm6+jx +9u7s8XFpYWJaU1dTXnLw49HM1Nnb397e7nxkWFVcZ291YWRrdHrv59/g6fx49f5yfvvx6+js +6OTrfHtqaWlfX2Rqeujc3NfW5+jb3uh2Y1hVW1hUX19deOv7/Phxal1veHL28urn3tzV1djd +7H9vb2d1b2pleHBg++LZ427o2f5z4vVfanhxYWNeWmNeZvb3aXzsd/p0burx9vb429nZ2uF+ +Z3ZoXGdiWl5eXHXf4t3W2NfeeO3hd3t0aGj/bmxybnpu+/v6b/v0c/7/bmp3bXP3c2Bi+Op+ +bG1sZ2xvffjt79zY293Z3ePc4ORvZ15eZ2Rqbmly+fLo73v99HZ2bW5nYGp38ezr6Phydmpl +bH1xamz5+HXz6u3m6+vu6Pjtf3d3aGVscfzf7fx47vn6fGtwbfvq3OLi3N3f6nZtal5bVVJV +VlpdYG7c2+jl6N/a3uTf3+xgXFVSWnDp4N343tj3+e5+b21fZWxma/L07e/s7v/77Od67fJ6 +dHD8bnJ+/Xr8bF9uT2DX1lxf1uBpbnx4bWZiaW9gau7yfHbn91ZK2sha4sLO29rk8eVqa2BV +TFjw5HZI7r3XVvvS1P1OUP9eT1FJUdjyaO/b0tXvZ+h7b2ZeeOt9bd3h6Oj19Pjr9OrucP/o ++Prl3Njd7Ojd3t3e6ehuW1NDOj0/PURLUuLLysG9v8DD12RYVk1ISFFq6d/bzcO/v7++vr7A +zM/X7Vk9NC4qKSstLzxZyrixrqyssLrJbkg7MzExN0Vg2MK5tLO3vL3BzeDxfurf4NLNzMTQ +QzArJyYmJio6bMO0ramkpau0wnpDNS0rLDE7SurBta6srrG0u8xqTExWWV1v2cXFx8JfMiom +IyQlJzNlw7GqqKWjqK+9dUM3LCgqLTZHecKxrKurrrK6z1xMQ0BDRlfh19DKxMXIz0ksJygn +KSsuRca4s66sqaqxvd9OQDUtLC87W+bGs62rrbS7vcp8VUQ/QkBDTmncy8vLytp8d/PpSS4q +LS8zNDQ/6si9ubmzsLS6zWRgWEpMUm/OysvEwMDBydXgbVJOR0lJSVFf9d/S0M7PdVpbXlhL +R09jX0xFSEpMTEtVet/e49jOy8rR1M/T09je3NPY397c3NvV08/e1tH0XlBYXlZOTllfYlZP +WWRfWWhx3N1scPju6VtSVFBPVlZUd3dq/XHez83Pz8zKzc7S1+zh0uH3enPt4fx8bV9rZFNZ +6H12amBxWlxXWn9qa3fr+mlYVlp+5n505N57X2xnYXlmat3h6u/b2tjQ4NTice/sa1di/W5r +5+bc0+nd/fL+cHFdXWNfbm36b/92dOddbub3ZntwYGpcW11qX2Zu6Pb+2tn/ee/t3PtdX/P7 +6fj25N7x+dLc4+3c9+9wZNt67+3lb/tpUl9hZl5bZvpnZndcbuhrXPpmcXhZcGjmZuj459zm +59bP4fH+2+pq7/xoZdvm7/v639n3dGbkXVVPdVtRZlhk5tXh2+3e7WJoVFheWlRf9eTa49PP +1958127fYHhmfWBieXvtWeF+3f/n42xzXPNk43zraOricfLr5/HkaXRqa2BbWPp9ZeXf733o ++nXwa35s/mVman9+7ev3+NLh3fnf6m9oYWB0eGrhffr26P328ebhaHNvX19pdvdd49xmY3jv +3eX05etlXlNw/Gpa5N7x3n7X7nxeZlzlaV3qbvDv2uvn4vV+fuXte2r0bnxc89htYPH67fjs +8mp462hlbHlrcWdp7u9+/evu/G3v+ebxefX06+3z//To6v59ZnBnbPF0Z3jn+ntlb+zt8Xvz +7Ot9fGJteHdjdfno3ur7bHF47evcZ+PqZGT+8Gzs7XBtdV97cHNn29z27Ptva/5z73bs8HP9 +eH9o/3z6emZ7+Hl3amZt/evp5fLtfnr9ffH6+PJ8+XZn8u3zdNnp6/RsbP59Z2Vk7W1nXH7x +ZWf34eTrb97+8Hvte/lpb297c2bv4+1t5ex3d1x94un7bHjm8nTo3tx9eHZ+emJpaWV5ZnXo +82Nl8/tqWnRzZW9p7uHf7f7l2Obi6vNx8e94/ez9bOp+fvVn62v2am5taGV1e238YHRvc2Vg +anhv8t7e5Obs6N3t6f7d8u954XRnc3d+c31gc2d1evjudXH3cG9t9fd85+3/Y2Tz33T4ePP2 ++GZs6Hvtetvx8GvmeXf5cG5742bq3+h2cnp8al92/PNs9m5ndfT0a3j0/mjofe/+a2t27PTv +7NhzfN7xaWP/bvf1ZWrl9f5r8u7uaH7qZ2hwfPd47Ovy7vh6Xuf9Xm5l8e/3ffj+/25y5Pf8 +ee3/dXvr5n5se27j/vpv+3nv3/V0d/9nYGXwae3+6Obi6fbteWxa8ltbVOxubnbv2NnTYu96 +1Ft98ORtaXRd1+rkatbj1/7/7mddT11Y6m1tYmFdWFdZZlpdXWVr9uLRy83KxcrQzMbIzMzK +ycrJxdVWNykpLS0sLjRWvbKvsba1tcDyRzk1Oz5MWu7HvLq5ury8vL2+v77AwL7kOisiHyIn +KC9By6+oqaquuchnPC4uMDtK6MO8ubq8wsrY3dnVxru2tK6tsNM2Jx8dHSQpOnS4qqaqsb9a +SDk1MTxI586/tbO4ws12XktUdc68s66trK+0v0cqHhoaHys57b+vqKixyUo7Pj5AQk3bubi5 +t7vB3ks9PkBZy7uzrq6ytrq+xGIyKB8dICo+/MG7sbC5x1lDP0lNXV3kyri5xdLy+Uo8Nz1W +ybixr7K2urzCv8LFXDUtIx8kL1HZxce7vMbeXUhQ+v3gZfbYwcLaWU1KPzs+Zcazr66us7rD +yc7NxsLPRzMmHR4pQW/f27+3tb/cUUxnWE9DSt68uMJxT1ZTSUNdxLSvsra7wM//XvTJvba6 +5T8lGhwlPWZ017mvr7v2RD5NVU9IWsqzr7vfTEc+OjtUw7Ows7i5vdpi/cm4tbzG1E8wHRYb +LOzL1dC4rq/CTz5G6NLcc+rEtrrTSDs7Oj5LzLavr7a5v9NcaNTCv8TGvrzxMh4XGyhK0drJ +sqqsvFlFSmTpVT5F+7+5yGhaXFJJRWq9srG2u77G2OTaz87Y39vDwD8nHBsqPlBxzrOnq8BL +OUJmY0k6PdS4sbjKYU5JPD5OxbCusbi+xN1ZTlBffuvPvK+3PikdHSs1PEXcr6euy1VR0s5T +PTdCyLu/wszR5Uc7QG69tba2vcHPb2P45dnazsPIwds2KR8gLDRBZcavrbfM/WvuVT8+RGu/ +vcG+x9dhQj5K5b+7ubrByNXoe2Nf5s7GvsO8zD0uIx8nLT1lxrKtsr7Q6mxJPj4/T9zAu7m+ +3FtGP0dky7+8vb/DzdHX+mx31svHwL+++zovJCAoMEhp1by0tL7ZbV5XWEtIT9/HxMXWem51 +aW/50MXEyc/LxsjU5OfXzMzMxMTMXjkvKScvOEBFX8u7vMbMzczYYUlETV3i71tcaNfQ0dHJ +wMTO1dvMyMnO2drY2dzQztLbc0xGQD09Ojg1NTxGUF3rzsrN3OHWysXL2Ovp6/f5bf7g09jo +1svDw8/me/32eHjezs3N0NDT42JLQUI9ODg9QkdFQ0FHWerPzcrFwL/I23xfZ1xMU3TVxsLB +wsLGy83Q0tXW19nX19naa0lCPTw7OjxBRkM9Oz9NXnns1cS9vL7DzNnf71NKVu3X1NTMx8LC +y87Pz9Lj6djPz+D6Z1ZMSEJBSEg/PD08PkFAR09u08vGwcLDx9T2cHh2denX0tHQysfK0dXV +0s7S08/N0OpmVk9XUEpNTk9ORj07PTs6PENW7NnQysS/xM3W5+ra3Xtu4dTU18/MycjN0s/L +y87U1t1qWVNSX/d0XV1dUUU8Nzg6Oz0/R2Lj18/LxsXKz9rf1tLZ3d7T1d7k2s3Mzc/LxMTJ +1uXyZVdWYWz86N9sT0xNRTo2OD4+PkNObd/m7+/XzcvR1czIy9vi39/f4ODVyMbIxcnHvtNi +6u9pW2/r3utrc3pPPTo/ODQ2Nz9IU1tw283Ky87JytxjadXP62vWxcXQzsG8wczJxdD7XnLk +6Gpv2c9+RlPP5Vo0JCc3LyoucLPAT8uusXFB07nDT1q7schey7fATUvGvOxM373HU1DOzFNE +XORPO1XZS0VQ49tUVsVAJTdHOTM1ybZVSL+1vlXZsbtfX8W5zF++sr5ibMPGXU/Nx3dPa93t +Y2htS0xOR05MTlRQSV1PNTo4Oz48QWRv+dfCtry+v8PIzt3Kv8fMzL++yM3IyO5h+fFlYnXy +b1xaR0VNPj9GSEZPTkk+PEI/PUPz083Zy8PLzs7Cw9LHvsnLysvI52bf4O/67dja8trdXV9o +U2tuT2JMRXtQO0pWPjxJbnx5Zs/VT1Hr1t/bw73V6dbI1lzlytV30svXbXTR3Ors7/JdWvZe +UHVeaVlIWP9MSkZGWUhN8NTU19vsZmnY2evWysjeedzS3eHSzd5s3NNuU1z+7ldMZ25SW+rq +WmDfZFlc5ttPVfxYUUz902j6zt5dVenXdO7IzN/Z0ehl9NXTemnV03x2z9NiYuxZTE5SV1Bg +7Vht1d5sXfZ6SERUe29Q99Xebn7a5WHh1Nzt6cnV7tHM2X/Uyull3d9gWezmV1vl3GFGX3JM +SmjvYVZgcVBKXdtaSu3RbWfl319p2d/j19DT1+Xj4+3j0MzS0dbxbmVndmNnePn1Zm1d9PpW +bUpJTExKZNn2Wml+TFFv3OLu4trdaF/mz9rj1dHg3d3n3Ozaz9hrY+ztX+nN4O3r+GlOSFtv +TU7e1VFb0XRP8FRLTk5SS1zedeft49FhWNvR4dzN0t7Sys/Z0dbf2uj03err5lpf3GhHUltP +XujtXFJOSkxLY9f2cVlLT2xTXNzQ2+Xd2N/x0c7U7N/P1/ney83PzM/b+F9xbFDrUkviS07N +6Wd5TlE/OmJYU3Pw4E1CWmtVZdbEz/naz+X008vO49jL1ebTycfL0tHsaGT+dOxlTH1dPU7W +/1c/TUkxOVVXXnzh03tYZV5gzsPOz9LZ4fncx8HN1dDR3NrAxM/R7OhORVFez99a7u1FODA4 +PDZK92/7dmprXWHk3NPPysrLysbFy87P3fHRyMvIxMDOWVzoTDVavWdG2M8/Ly03OCw60uxR +07y/Z2TBzGzhx7zJ1ry3w8vBvupT7M3Vbc2580NW9s9HQD8tKSovMTrjyt/9zcdtWdbHv8bA +vMLRy7q4v8m/x+Jz29n22NLO0GphxtgaGl8tIS64p80vyLBJL0ewuUvNq7pu67Ou52rBvl5J +y7bHY8S8y/3cxz8VF2ouHjmon8UxvbQyK0G0t0/HqLpX0LCt40zHzklPy7W20MW/2XnTyikQ +G1UpIPment8+srYqHUSpzzqwn7M+dqmsQjfDuz43v6m02bavz2XISxUOJUsjKqqUnzs/rcwe +GzuouEStna1HXK2uPS5svX1Fvaquxb+3vbw5Ew8hLyAvpJOdaU+zbR4aMLm//q6fq25ptLBJ +NFHmZnS7qKq2uLa4Uh8UEh8uJV+dl5/BXMU7HyA0ybvIraKxd2G9uE01WdNZermpqba5r8cq +FxIaKyw0q5eaq8zfVCYdKUvDurarqL5Z3MDLRjvowt7PtKeqt729NBUPGystMrOYmazb0E4o +HivSubmvqqzCTVvIz01DYsPCz72vrbG5zSwZFxwkLkC1nJ6tvc9IKCAx2My7rKmxcU3MzXt9 +2L/J7L+xtby9srspGRofIyYzuaClsby77SsiMP3QzK+kq8lsy8NeP2rAvszDsa6zt7/PMhsY +HCcsMt6joK7GyNU0JSpNxM29qam45+TF7D0/07u5uLGrrra/9yodGh0kKjTOpqSsub70NCUr +QerSvqqps8PDxOs9OmvGv7uvqau1u9cqHRkbIyks26Sip7K6wjsiJjZY5M+soqy+wsbaPi9E +zMW9r6qorba7MR0aGh0fKEinoKKlqLNOJSEsNkFVsqGksre2yT8rMl/V27yqpamvr/YmHRkY +GiEvxaOenp+nvjYlIigxOHytn6Spq7njMigxR1Dltqijp6uuUyceFhUaHyy+ppyYnKW2PSYi +ICQySrmfn6Okrc43Jyk3Pku9qaOlpai/Mh8WEhYZH0CunJWWm6K0OyMcHCMrN7efnp6hrMI/ +KCkvNEbKr6akpKSySyIXFRYWGyvBn5mYmJifujcoIiEfHi7EtrWppqeryeTIUjg5P/DI0b21 +xWIyJiotKy03TMu8vLSur7CzvcPOWEI8PUVEPlHRyMziV1NNQkNW3cnCxsnIy8rExsnbWElG +QkJJUfjb5GFORT4/SU9i5M/Aw9HfalZdWmjX0NXS19XPyr67vb7J1/FQQ0lVUUhAPzs4ODk+ +UOvczsbCvr/S3M/Z69t+UldQSU1bTl27uc24r7u6sLi/wuE6KCImKSIkMV7Au7+0p6eutri5 +zT0uLC4xLi5Mt7a/r6aptsnWx947OVNdT/u7sLXMPyolJB4cITjDrqegnJ2mvlxDMichKDz8 +zb+xp6i65N/qPS0vRX7gx7asrLa8uMBYOisfHB8mKCtYq6Cfn5+hq9E2KiknIyY8xba0tLCv +vldFUUw5NlPKx8e+ta+1wsW9wm1GQjQkHiApNDlMtKOfpKqstHwvJiUqLzU/0a+qsLy7uMlL +O0Jk9FveurjNWF/qaElK8cW/ycm8x0EwLCUjKi8zUrWpqqunqrncRzcvLzAxPtK2sa+trbTZ +RT42LzE4RfXLvrm4trzN7Hnv+O3W0dztTjMoKDEvKTHPrqyuqKWsw1I5LisqKzNeuK6vrKmu +xE47My8uLj3LuLm1rau10OrpUEBEZcrNYF5YMSIjLi4oNLunqamioa3YPzEpJCYrNGqzqaip +qK3CTjw4MzAxPl7GubzCu7jJUlHd5F3cubPCWU9GKh4jLy8sQ62ip6upq8FFNC4pKC89Tsis +pamvs7jcOzEzNjxP7NC+tr7T1NJYP0R51vLnxbexut9KPCwhICouLz+5paWrqqmzWzUwLSkq +OGfAr6ekqbC71D8uKywvOVTPvri1ucb0UElBP0hf387Du7Svsr9eNychJSsrLVCtoqappqe7 +OiopJyQoONq2qqOiqLDBTC4mJikuPtm2rKmqr7rWSzo1NDdCaMq4r66ytrzxNCQdHygsLTu+ +paGorKy0dDIsLS0wQNi7r6ilqrfJbzssKSwyPWnDt7Kvsb7kU0Y7NThFXd7DuLO0t7nJTDAl +HyYvNDRSrqGlrq+wyDssKywsNl7Btq2np6/F7Ew1Kyw0P1XMuLOys7jJX0g/OTc9UfTbzL63 +tba71TomIiwyKSU5tKitr6motWM+OC8tNEZc1LWqqrK5u88/Ly4zOD5X1cK4s7W/2GJNPzk5 +Qlb/zr63tLe6ur8+Hx0uQCkfNK2irLGop7dfQDMoKDZLQ0+2pKezurfFSDc0NDdEft/Tuq6z +zl5zXz42PFB03ce+vr29yHQ8KyctNzMvQL+urrCur772UUE3ND5Vbti9srS8v8pgQDs8PkRW +3M/Kv7q/3lZSTUVES1vu1cvGw8DD02ZQSDgvNUFBPEfcwL2+vcTZ5OhbQkFX+H7gx76/yM/d +dGBYUVNn29fm28nF0VxMUldORUhm39vf3NDM1HdPRkdHPTlDan1o28O/xs7S3vxuXE9SYuPW +zsrKztPdbVdXXF9l7N7l3M3M319QTU5NSUpZ59bb283L129YUU5PTk5UaeTd4uDY1t78aWhu +bmRfbeTR0NTW5vH9b2VjY2f549je69vPz+VoXFxXTk1XcuTe6N3X2uxeTUlKTU9SWe7X19/h +1tPZ4ej6eHNsa3zd0tbc3+bwdGdhWlhkd/74+/v05OpvZmRiXFpf8d7d29vd3udpVU9SWVpa +X3jh2d/s49ze7H1uav3t9m51597f5uv4cm5lWVRbanBvduzc19rj7PD2dWFdYnDw8vno29vf +82tmenleVlRfbm5nY3bp6f5z9ujp6vTu6Orx7evt5+b4b3n98+7s6/Pw8vP2b2l0c2hkYV9k +d313ffrxel9caHfy8e3k4eDo8H//fG1hYmlucn3u3tvf5+7zfvv9eHR7+/Z5bn776+Xl5ubu +9O78a2VkaG5kZnBrZWJgY219+/zt5+Ho7+ro937/9e/n7W5panjw+PXv+HBqZ2Nq/u7u7unk +5Ov/c2168/99fvTo5urn5vZwa2ZdXl9laW305N/k6unuf3Zva2t0fX5vcPfy/vf7/fR+bm93 +f+/q6/Hs5+bs9fp8dGtscW1te/r88+7z+W1ueHFub3BxdXd3enhvcXX19O7v6ur27/Lu7fV7 +f/Ty7/R3bm5vcG19/Hv76+317vd6bW17d29rb/x+eGxpZWxtc+3r6u3r4d/f4+54/nRubmdo +dPp4fPPx8+vyef9va2tpdX999fV8bHr3fnpte394ffbq5uHl6/T/cW1sYWFtbm9veuzt7+3y +6vJ1cHlucf14eP71e3bz6+zr9vn0c3r/c/78amp4c2pyfXN6eHz9+Xz87/T28O9+d29/9Pfu +6e7s73l1eW1sc2txdHVyb397fv3z+3zw9HtzenR7/H18ffX4dXd4eX57e339+O76fvP5dvv4 +/u/s6Onp7PDx/W1rcGxmX2Blb31wdX//d/Hu/n756/T4df7u6OLf4+jm6fP8921nZmFnamF4 +7ft59Ppwa2Jlbnpu+Onv9e3t9Pj25un8e/57/Pz/+n7y8PN3b3Pz83j38/T+cnJ8b2v8+m50 +8vVyanv9dHrz7fH69u90bXj5+v777+7v7PtxfvX07/t3+/J4b3x+eWx7+3j9evl//PL8+vrz +9HVxfG9vc3V0+vvy+3D8ffz8/W1t7u9zdnZ37+3k4ez5+PF8bG39eHLzdXz5fXlq+3Z5du3q +am1+cW789H/7a2/9eW15/PLn7O34evTl8Ov7/e57cWt0dGt3dHd/d21qd2xsfXD58+rt8Pxt +dnvn5vvz9fP8/u3x9/PwemptbGpr+3t3+fFydvlqbG1v8/Pt8n7u8/J0bHl3bP37bm99efDu +5eDu9Xh1cXJsZW1udPF+9vrw/f7q/PbRylBOeHdNX9j0f/nm4drpfu3PzE5hcV9KVfpo6F7t +wtBHT937SV7tfmb7xNVcVexeU3LV2fTUyc9qXl5fW9vKy19N+WhYUuxaS09h7+todN3P3Pbq +729ZYfXc4N7c5Hb96+zsbHnp6Ob5ZV9fXmxxfGjo+/5tX2FWY3Vzd+7U0dfy+O/s6+FvaOne +ZlZ4d25TZu3rfl/+8ejd2e9ta21kXX5v/vbZ8O7nbP/v6WRs7+R6Z3rneWX43O5c6/N+Zmxb +aFxa5vfvb9re6Pvy3uxyZ/rsf2luf+Fzd/ro5nb2XWV0bnfy7nv+5uB0/uvc+F9lZ+ZjZ3t4 +b15reXn1f+1waff08e3j8u7h+mZ862lr/unvcevc7WN7/+35a+P353ju5HtqWnFxZ2hqaV9t +Y/5rdnjk3+zxduD8bmz32efq99zsc21q6Wxi/uV9a2hyfPppYv71eG979vtu9Njc8fp+aVNq +9fR8b+Zx6/f9d2vkbnB8+vN47P7+anPrffZs6OlnafXzeHnz3fZxcO1zX2vt2HNp+2ZramH+ +9Gpl5udr/fDc7XTq7958/vL5fWR8Zmxxaurr+XPp5mJfePN7cn/t/mVmZuPqaX/j2Gpv3eVv +Wmbi+mxk6dj0bnne3/1fbu5iZuXsdF9pefZuX37ldW147fP96Pdt7ux2Znbr4PPv3ulwZWrt +Zln13+JvbOPga1d7721fXfXv7mvy3nb83uZeY+3ocX7/3dvr/mne13Nm79n3TmXfelhMXuZg +U31xadtkXt/a5ezq/ODZen/vePrg6HLb22ZfdfNiX2/m32Fa9eH7XmH55d9kWOnaeldm3eVr +Xnz8X2t86un9aXnY5WNm69v1bXj74e9hZ3dy/PVoYunbd3P34NLhXWrX5WFederuYFbx23Nb +a3l0X1hf5Hlc3uD88X7s4Gxf++bud37a7GTn393uZ+rt6upsbPX3ZmJ0bXxqbm1g/ebqYlj4 +62Rfbm1qeG5i4eLi2dfa29Z2duLebF5r+/piWGh+9OX8cV9h/G1lX27w+/Jv6uFv6e34emTe +3X9r8e958W1ueGx43Od78fj26Wlf8OjZZlFu3uNcbd7tcV5eb3bs7G1ic/r1cFZr3O71Y2XZ +0G9e9v7a1OpdfupmdPBx8fpfXvx5YO7l5Ov04OfudFlu2epmXWDu33lba+/p+2Zo+/tiZPf0 ++nr62thtVn3cemVqcNvYW2fT1e9eW23e71ZWeejxZl356Xb66Pdz/drX9FVf3OljX37e7HBq +7t7tbXDp4uhraujr8/N+efN4b2VtcHhuavTvXVZ+7/N8Xmze/W14Y+nd/H3mee7W5+NsYOv7 +7eFmau3s7vlyXWvr8l1j7fZsXWnu4mdY89jjaHP06ehqZ/fg8G3n6XD+8Op0b3b373hmXefU +91xy5+Z2ZGJo9HFqdf7xafvncGVo93jya2fl4PRi++bk3+7p7Xt4dnxucHNd/XpeaO/aenpt +fdnfdVxq6mxt4X1reePrduX8c+nibXBmZvF2XnLo/Ov0Xn7cc2ZwfvJteW37+WVo695oXmvZ +1Wtg9ebm6F9m1tz1cmzvfG5oYv/y8WR932lZau/pbmXq4eL78uTuel525WZaX3fi7nxu6uPt +/mdwZ3l0Z/T03dt5cXru3u59fv317O1bUWDi3W11+e/9b/lyaXH5737weWXy6Oj1Zv37Ymdx +Z1/o2/lpZt/V52xw5OjpfmV87H1s7eVkXvntfXXyfFla3NpbV1/r2G9aXXDn6Hv+8nv75/h0 +8ujl8evgd/Hj+enp8XB29G5eZ/358W5navfe5l1d5e1eXfn5a2Fh7epnbPLp8P5qbvf6fufo +7+zq6efb8Wz59/b6+vjv+3N8fHP8/e7vYl5ec/lpaG7u5uh3eHJmcXN3fWhdYvXh8G7r2Nnm +6/by7PDwfF9ma3x+eu7xcWlubHt8YWbo6mFZYnn0/e/j6O7o3N3wb/Tq729od/Z+aWV3/fP2 ++v54dWZpdnFka+/j5mti7dzkdHLu+HV0+25pcPPt6uXr+PDv9HhlXGf0fv3w9fvz7fhvanb7 +/nZrc/f68uj+eu13aW9+e3xxeebr/fT7bm55/Ofi/Pv07W9eX3bt929v6Oh6cf706/H/7evx +9fh+dPz47Pt4eG1saWNpanH093FqaWz+4t/l7Oj3eXhpZ2l28e75d+7g73hxcvny9HhkX2r9 +5un9dn/l3uHvcWFkeHz073dlau/s9nl4d27/7X9gX27w8356cnf18HNnaWh77evv9vHt6+rf +5/Tp/Hx+/v39b3N19nlmbX59aWl/+/1+dmVib/Tu/Pvx7e3x+W//8nxsc/Ln6vLz5eXr8fZ3 +bGhkbm9waGtwb3z59P1xbG18+HlrbnZ5+e/l4N7k5ebg3/N78u98a2ZkY2V4+XNvd//8+3dh +Ymxve3Rzd3Rxbmh16+rt7uvk3uTt5+Pk5OXr9P766vJ5bmRma25jXl9jZGRwc3h9b3T88PT1 +7/jt4+js6ev/fX39ev/ydnl4fW5tfHJ2/PL08fb4+Xp27+3y9uvp7+3u+H5xcG1sZ2hwa2dv +bnfw7urs7vl9cW52e/jv+fLr8O3t9vzu6O36c2lmYl9jaHjv7fl1dvbu5unx7/L2em9wc3/w +6OXp9nFraGdmamlrZm179/H56+nv7OXi3t7k63V3+3psb3NpcPnt/mxsb2tgaGprcW5vdXV4 +ffjp5+rl4erk4et6fvt5bnZ7eP12fX5xb3ZzaWl3+Xx2cW56+Pfs9H307uzu6ub7eHRy+ezu +9/L7ffb0e29pa/58d377fXf++21t+PT9fn/47/D+dGdnbG5vcG95cXFvc/3y7/fw6+3z7Ph0 +bGVpcXr4+nt0+eLj6+zt7uvu7u3w+X94e3Ruem9w9Pjt83h4cHd6eXn++/zz+/zv6+75dXZz +aWpqZWNobnJ1cnV3dff1e/35+vn5/vvv7/Z6fvX39+zyentuaWluevf3fvf+eHj07v315eLg +4ObveXR//nt9c3n+em9v+Pb3+vv29/H0fG1ueHJpcnBnbG9yfG9xent9d3x0cnf+9PHm5+v1 +/v19dXN1c3hybGxtevf+d//u6ev1fnzy+nl/9+/u8vj09fb2+3157eX1dHx7cGp0dWtzfGtq +d/7v8f31+v55fPt4/3t3b29yfPN6aXDz7u/0fvr58ufm4NvU0dPW2udvYl5XUE1LSEZGSExU +ZfPa0tDPzc3NzM/U2uH4fvDn2c/LzM/R2eJ4XVBFOjQwLzI6SHXSxL26uLa3ub7OY0c7OTo8 +Qk9t2s7Gv7u3tre9ydHc+3x1YVBGOzAtLi81PUhW58i8s6+wtr3RWUU+Ozs8PkROddC/ube0 +srOztLi+yvBPPjcwKygmJyovPFLOuq+qqKirs73bTDoxLi4wNj9Y1cO6tLGvrayutLvF2PxX +PjIrJiIkJysvPFbKs6uop6issbfITTcuLC0yNzpEX825rqysq6yur7O7yPBWQC8oIyAgJCgr +M0rPtqumpqanq7LGTDk0Ly4uLjNB7ca6tLKuqairrbG6w9VfQzQpIiIhHyEmLDvuvrOrpqSj +pay6zOpCMy8uLzg/RFLOvLOsq6upqq+1u83uWT8uIx8iIB8gJi0/5sm4q6Wkpamtr7nkS0c+ +Nzc5PEZZ78u7sq6trbCwt8rPaU0/OCsjKCsnIScyQEdOzLKsr7GurK2wv2LMy01CelZHQ0bl +/E5fwsPJxMDHytDvXV1gSURFQ0E/Q0tVU09f7er7693b4fn56uHc6v3/9+5iW2Tu0crMyMLC +wMXKztHeblJLQUBBQUVIS1BVWWNve+nX19vTzczT1d9kUk9KSUpJS1VbaeHPx8bEvb7Fx8vY +6nRcVE9MSU1MT1hZXe7e1tvv0Nrc2nXo8WJPTVNKSltXW/zwzdPQys7Mzsra9PtrW09IUE1D +TFFTc/z+5NHNzMfKx8bM2+NtWFJPRkhZTVZZ+ex03Nbb3dnk3fV4/PZzU1RaTk9kZlP28+Ts +2NrOy9DK1OHZ21lr6k1SXF1OXWN06mDS7ezt/9zzbVr7bHVTbmFt1kzZfH3ZX83Z39ht7d/c +V3HgaGNV6WNR3WR52/ZT49N6WuBu4O5Mz15a2Uvr815g6NhZ/c1p8djp6t1w999Ra1fN3DzP +z0nawFL8wkZg0OdVUNRmXlr/W0/sXl994v973XPb6WXR2uNmzfne623w8NtN0+1R2/v2Wcpy +Qs3cRe9e6FN9XE7HQl5s+P5N3VTa1U3R297e59Ta2vvZxkzgzGpT1G1Vz1pK089DWclnTmzd +UmteSuD0RO/KWE7fy2f69XnAYFTIzWNJ0tteX1rWzkxx29/JP+/D0zrTvj3y7lDMSkrp6V9M +1vHaT33Ca0i61UTK9XrcUkW8Ri7HtDVPtm7ObGK/00fnYM3eOmnW91VPVr/FLN64V2w+07tf +PsnbaMhEPbB+Nc5+3HRfTNPE4EbjucQ3cbzoU2hK3b9ANc7CQktW3Mtdb9bfy+xYV8paU9lC +z+xKVMFL6chJacPEWljAvT/t0vFWXExd6kFV1E9O2Hzj31vV0mbtX9vvWmHe3FdN2NhdcPJJ +vL5JSLy5QEXMyURi9UJO2XBAXM7e5m1qV8nLUm3Sz9NC3M5R6nJkV8dOSuFr+Gdw3Ndo5d/S +XVndzWZF199ybltu1/dy4Vxa19rdX+7XVu/tTVRtdWbheE/x8e1jZefO3ktkz9BzW3fjcm5e +9W9jbu7M5Gtv38zZ79Pg7d3e4uLpX9/QbG5PSU1KPjs5Njg9TV1d3MfEtbK5uLK3t7bGz9DP +X13/W+/ZXjovNTMtMDEuMD1M+crHv7i5s7Gzt73CzdfO+VJcauXRwsrEur++vnw8LSclKCkn +KC06T8q3tLCurK6srrjE4HVUSkc+SG/Vx764uLi3tLrqPS4nJiUlJSgrMEbNt7Ctq6yur7W8 +yulXRkFCSFf1x7u1r66usbS4x08tIx8fHx8jKCw3abuuqaipqq6zu8p+V0xGSEdezr+2sq+u +rq+xtb3tOSgeHB0eHyMqLz/StaulpKaqr7zM7VdIQkJCSnnIurOvra2srK6xt9g8Kh4bGhse +JCszR9i4q6Oho6izyl9HPz09PkVR4sS1raqpqq2vtLm9y04uIRsZGh0kLDlO276up6Ohpa7B +Vj03ODo/TnHfzbyzraqqrK61ubzD1kctIRwaGx8nLztUz7mspqKjp67FTTkxMTQ5QU5pzryy +raurq66vtLvD0kswJR4cHR8mLjtWzrqtqKSkp66/VjgvLS4zPUx5y7yyrauqq66zuL3F1Vo6 +KyIfHyInLjlK6MW3rqyqq6++/j80Ly81PlXhyby0r62trbG4vcLI03pKOC0qKCktLzM4P1Pc +wrq2tbi/01tIQD5CS13lx726trS0t73DxsfEytHfWkU6NTIxMjQ1Njk+TG3dycLBxMvd7vH+ +9OfZ0svGwcLIztXY08rCvL2/w8rnV01FOzYyLi0uMTY8RFTv1szFwsLBwcfLysbEx8nP2uPd +z8jBvbu6u77F129URDkyLSopKiwuNz9O7cu/u7m6u77Dx8fIztPb4u7t28zFvrq4uby+xddu +VUE3MCwoKCotMTtHXtLEvbq4uby/x8zP19/g63nt3tXIv7y6uru9vsTRe049NC8sKCgsLjU/ +TnrOwLy4t7u+xszX2dba2+Hq39TOxr++vLy+vr7D0nRKOzItKygqLC82QVPrxr27ubq8v8PM +2Nvc4uPi39/d1cnDvru6uru+x9VfQzgxLCkoKi0xPE1o08G8u7q6vcLK5uba4e7a2uDMysrC +vbq2tre7yFxCOzUtKCUlKC43RGrNvLOvsLa6v8r/UUdFUW/z18nAurWyr62tr7jMbT4sKCcj +HyAjKDBA/byvraurrLC2w25PRDs8RVTfxL65sK6tqqqsscDmPykjIx8cHiIlLDppu62sqaSn +sbm//VRHPD5JR1XDubatqqqpqKy2vuovJSQeGRwgISUzS9G2r6mjpq2usthMUEA5PkVQ38S4 +rKmppaOqs7nIOSgmHxkaHh8iLkbsva+ppqeoq7TJW0g7NztBR3nDubCqpaOkpqq0yFAuJSAb +GRsdHig5Scqtqaijo6uvtdRSQjg2OjxM2cO2rKimoaKorrPZLismGhccGxolMTnjr6qoo6Cn +ra+9XEQ+NDM8Q1TMua+qpqKip62vyjEvKhoYHhoYJi8taK6uq5+fqKmru+VlRDY0Oz5C3723 +rqalpKaqrcY8NSobGh0ZGSMrLFO3saygoailqLrL10E2Ojk4Q+7Huq2mpaOjqqzAOjkqGhse +FxklJipvubmroKSnpKm6xM1MOz09OELmz76tqKijpquv1D87JRodHRcdKCYvyr65p6Kop6Wv +vLzeQkREOj5X+tO5rauopamssGU9OiEbHxwXHygkOsTHtKOjqKOlsbq9b0JGQjxEXvnLuK+r +p6qpqr5MSjEdHR8YGCUiJVjHzqygqKifp7eyvE1LXzo5V1Vcwra1q6WurqjCPWE1Gx8kFxoo +ISTzyNOroKionqe4sblKS2o5OVxNTsS6uKynrK+rvERMNh4eJBkaJiQkUMrerqKnqJ+ntrC3 +VlLoPTpZTUzLvLiuqqytrL1vTzUjHyAbGyAjJT3s3bGnqKehpa6ust5a7D43TkhF0cPAsqut +rau1xmJCLiAgHxsdJSMrVfzHrKippaKpsq++WXNYN0BTPU/MzLyurK2rrbjOWDwpIiIdGyAk +JDVk3raoqKikpa2xtd9X/D83Sj8/7M3Ita2urayzv+JQMyYkIRweJSQrR2DKr6qpp6Wpr7G+ +am1SOz9IP1DZz7+yr7Ctr7nH8kguKCUhHiIlJzJH68Cwq6qpp6y0tslgWkc7QEFEXdzLvbWy +sK+zucVsRjcpJyciJCosMkvkybatrq2rr7y+yl1UU0RCTlJb2cXEvLO2trK6ytlTPDItKign +LC4yRFzpvrW2tLO3vMHRcFBIREhQV2nWycW8t7i0sre7v9tRQDgvLS0sLjM6P1Tkz8O8vL6+ +ydzuVEZGSU1c7NPKwLm4trO2uLi+yt5YRDo1MC8vLzQ4P0lf3svEv8HIzudlVUxKU2D008vE +vry6ubm5uru8ws79T0A5NDEwLzI2OkBMX+fSzcvN1uPsYVZXX2zsz8jCvry8vLu8vb28wMXM ++U5AOjYzMTEyNjk9R05h4tPPztLj4/Z37djTz8fFyMXAwb68u7q6vL/BzHVOPzYxLywtLjA1 +O0VR69DNzMTKzsvQ2dXNzszJyMrIwcO/u7y9vL7ExddsTTszLy0qLC0uMjtGU+DMyMK9wMO/ +xs3Ny8/NyMnKwb/Cvr2/v72/ys9lTDw0Li0rKiwuMjdFVPnLv7y7ub6/v8nPzs7V0dHPzsbG +wb69vby7wsnfV0c3MS8sKSssLTM8SV/NwLy4tbu+vcnY0NXk28/X3c3JyL66vLy6vcTKbVNB +MDAuJygtLC46Slfdvby+t7S/vbrP38/fYe/W6eXIycy+ury5tr7Cz05JPC0tLicoLi0vPlJe +zbm1ubKvvcK61GXX7VFt3fjnyMXHvre5urm8ymNORjIrLyskKjEtMlNtdb2ztbWuscHHvuZM +5uJJUNt3Zsm+vrqysbe5ucVRQkIvJSkrISMwMC9ZxMq7rauwsa+50dPWTkJRX0tZz8nLvLKy +s6+wuL3LRTo5KR8lJx4hLjI1c763rqyqqa64t8NcU1RGQUxabtfEvbiyr66sr7u7vz8tMioc +HSMgISo0TMm9sqWlq6qqtsTbUElCOTlKVFTYvLezr6yqqqy2v8FLKykoHhodHyIqMEa/r62m +oqOmq7jE0EU5OTk3PUpmyrqzsKuqqampr7/OSSkhHxwaGxsfKzZKvaqnoZ+go6exweBBODYy +MDlJX868sa+tq6mpqq2+1UgpHx0cGRobHyk2Wrqpo56cnp+kr8DhPC8vLCwxPEjYvrWuq6in +p6iptdlPLh8dHBgXGxwgL1W+qZ+dm5ucn6m52EYwLCkpKi88Vsm5r6yopqSlpqu+5j0nHhsY +FRgaHCY46q6gnJmYmZygrMFVMiknJSQnLTp7v7KrpqSjoqOlrL5nOSUcGRYUFxkcJz3Lqp2Z +l5aZnJ+rv0suJSEfHyMqNVPGsqmjoZ+foKKntOU9JhsYFhQVGRsjN9qsnZmWlZebn6i7XDEk +Hx0cHyYuQdS3qqOfnZ2en6StxU4vHhkVExQXGx8uTbmjm5eVlpqdprHLPyoiHhwdICg0VsKv +pZ+dnJ2foqez2kEpHBcVFBcbHiU1VrqlnJmXmZygqLbSRy8mIR4fIyk0TsevqKSioqOkpqy5 +2j8tIx8dHR0fICYuPtO0qqSfoKKjqK65zk06MCwrLS84Q1zZwbixrq+ytrzAz9xqRzkxLi4v +MDE1Oj9O8c2+t7W2ub/K0tz4YFpXUU9RV2X138/Ix8fFwsK/v8PGzNX8V0tDPjo3NjY4PD1C +SU9deejg3t/b083Jw8HExsrP0tXb3t/h3trT0s7JxcDBw8fWfFFHPzs3MjAvMTY7P0RPXXza +y8C8uLe6vcXM0N37YVRUWGHs0srGwb28u7m6v8zlXEk9NzIvLSwtLzM7RVjpz8S9uLa2t73F +z+VoWFJQVFZe+9vOx767ubq9wcfR5XFXRT05NDMzNDc7PkZa/dbHwb69vcDI0+tlU0tKTE9W +beDSycK/vr/Bw8bL1uJ+W09LSUtLSkxOS0lKTFJebf18dnxnYWNiYmFgYGr+59zUzMrIxsfI +yMvO1d7te2xmYGtvb/3v73hpWlVVUk1KSEZGSk5TWFtmd+/l3/3TytvV1dHa2dzY1d3a2dPV +3Nrf39/p6Ofq6vP1allWVlFLSUdGRUlOU1dg9O1/5+fu5/14fn3v8PHkzczk0ci9y+LEv9Ps +z8rN1vLX1FRIRkM7NDU3ODg6Q1di+82/wsbFwcDGxsjM2ur0dm1u7t/f2s7GwsC+xcrE7UBM +Sy8uNy4qLzg0PVpt076/vLGxt7Kyvb++z2liVElNT0pV7dXGvb3DubtUX903LDItJikuLjM7 +SN/SwbS0ta2ss6+vvL7F0elWVldNTFptb9LE2sq6S07WNi05LygtLy40Okd+Z8e0u7asrrWt +rru5u8PWXu9aQlVlVPLLydDRvP887kEqMjQoKS4vMDRJa1DLtL64rK6zrq21vLi70N7Mfkpt +cU1zy8/PzcHrO29BKjIyJycsLi4yS2pSwrC9t6uvta+tt7+7v+rr1VVM+vVV68C/xsC4yz5f +XiksNSYkLC0sLkhtSceuu7uprbmvrbnDvMZTXe5IQV15UNm6vLu3sblS2s8tLTomICkqJik8 +Tz/Jrb65p623rKu6xrvNR09cPDtQWEzlubm5r6ux3cjDLiw8JB4oKCMpO0k+y629tKSrtKms +vL+73UFLSDM4TEdH0rm3tK2psdXDvy0rPiIdJyYgKDtGQL6ru6+fqq+kqrvAvWM6Rj8uNUk+ +Qsi5u7SrqbjWv9knLTgeHiklIS9LTF+uq7Sln6yrpbDDxMk/ND40KzhEPF25tLOtqKnG8bo7 +IDIpGh8pISQ991m9pKmqnaCsp6q73uZWLi04LC1FVU/IrauxqKK5UMnfHyAxGxgnJx8wx83O +o56qn5qorKa4/kpIMSYvMSk47W7JrKaqrKGqY0vYKhglIBQbKiEozbG6ppmdoJqdrq+0Vy8u +LiIjLy4z3ru1qaCgpqKlyDk8LhgXHxYVIyknYqurpJiXm5ycpr/NTigiJiAeKjc+yK+ooZ2b +n6SlvDEpKRgPGRcRHC0vcaadnJaSlpyepdE5MiMaHB8dJ0HqtqWenJuYnKeovCsfHhYOEBgT +GDFPx6GWlpSPlJqhrmcoIR0VFx4fKuG3qp2amZiZm6e3vi4ZGBcNDRYYFzG+taCTkJKRkZuq +uUUeGhsTEx4lL8CmoZuWlpiZm6jb7jIVEhcOCxUdGCuvq6KSjpKSkZuu0TseFRkXEh4uNL2g +nZqVlZmcnahlSDsXEBgQCxQfGieyqaaUjpOVkpu06kUeFBkXEx4zPLqenJqVlJmcnapoRDYY +DxgSCxMhGyaxqaeVj5SWlJy1Zj8fFhsYFSA1QLafnJqWlpmdnqpJRTYTEBsPCxghGC2srKWT +j5aWk569yT0cGRsXGCU1TrGenJqVlpudoL1NRx8RFRYNDh4dHdmprZuPlJaVmqrKYioaGhoX +HCs9z6ecmpiVl5ufrehLJxQVFg4OGRwcSLCsnZGTl5OXqrnJLBwdGxYbKC9cqp+cl5WYmpyq +zGYmFhUUDQ0YGxs+sK2dkJKWk5anvckuHB0bFhsoL0+soJ2YlJaZnKrDTh8VFxILDxoUHs+2 +rJaPlJKQmam13iUcHhkVHSkscaegnJWTl5meq8UtGhcTDAwUEhcy57eckpGQjpGdp7Q0Hx4Z +FBkfJja6pp+Yk5OXm5+uNB4dFQsMEw4RLD5en5SVkY2QmJ6m5SYiHBQXHR8pfrGkmpWTlpqc +qzMnJxILExELFy4qaZ2amZCOk5mbo/QzKxwWGh4dKua8q5uWmJiXntw1PxsNFhULEyUfM6ij +npSRlZeZnrNuQigdHR8dJDhXvKSdnJuZnsJV0R8QHRgMFSMbKrGtppiWl5mcnqvYXTskIici +JjhX0ayjpJ+dpMFbzCgWHx0PFyceKsK3q52bmpifo6XBSEQuJSsrLD//yq6nqaWjqcI9STMX +GiMXFSUqK+m1qp6dnZqeqqm1Tzs0Ky0tL0ze1bClqKinqrM8KjohFBseGR0nLc61uJ+YnqGb +oK6300g4KyszMThuxraqqKalrLHCMSUpHRYYGRwmLDS5qKifm5yenqm5xHE6LiwtMjhH3buv +qqenqK653TMjHxwaGhoeJzJRtaqnnpyfoKCtvsZvPjk2MThJb9LBv724ubvQWFA4KyoqKCsz +ODxKdtLKu7C3wr2+ycO/yMa+wcTBxdh7XlRJPj9CQUxpZd/EyN3Tz2FQWEk5ODo3NztDUe3O +xr+7uLi5ub3EzeZlVk9PTFNzcWTcys/Pw81oXVtJRUQ7Ojw+QE5818zCvcHHydH9amFPSk5e +Z3Lh3enSw8fNys/9/tz2a+huUlleVlx96+bf3OprbFlKRUA8Oz4/QU3zzsjBu7u+v7/I2t7i +al9iXvXZ08nAv8HDydZ3U0U7NTMwLzAzNz5OZ+DKwL27ubq9w8nU8WdhdPjw2MzHwL27vL7E +zN5dST44MzIyMjM4PUNPetrMxcPFx8vS3ODw9uHl693OyMK/v72/xs7gaVZLQ0FCPz9CRkxY +X2x59N/f7Hp9e2ZdXF9dXmrk2tfLxMLDxMrP2vdyaFlQTU1PT1pmbHbr3dbSz9Lc5OpxV05M +S0tOU1RaavTl6OPg5uzv+nRtaWx87e3m3trUzs7Qz9nY1tze8HzvfF5gZW15b/1eUUtKSkpJ +SExOUFJXb2td2tTpVmm5usrMwsDDxsrI2XjwfNza7dLQ6mhNPjo1NDg2OT5DVfHc0M7MzszG +yMTFzNHUzsvNzcrHw7+9vL6/wMXtQS0jIB4jKi07SG+6q6aipq255lFAOTk2NkFW07q0sbCw +sK+yuMLl69z+TTQlHhscISo2R3a/r6SenqGqu1o3MS0sLi84T9O2ra2srK6usbzC1/fq5f09 +Kh8bHB8nMDtD5ruqn52doq3AVTo2LywtLjVJ6cG2tLGur6+zvMXS1szO3EQuJB4eIictNjpU +w62hnZ6hqrnOWEQ5LiwsLjdFas/JvrSvrq6zub2/vL7GajYoIB8iKSotMThhuaqlo6astLjF +9VA9NTQ3O0NFTW3Uxr21tLe4t7m3uMTMXTwxLCoqLSsrLzhI6Lu1sK+wtLe8xtR/V01KQUNC +QkdObVVOvbrFs7a3s7i9vcpuTTs1Ly0uLjI3O0NSb8vAvLq6ur3DzNHxXVNKR0lIVmBv3NS+ +ubm8vL3GxtDb7lNCOzs5Oj08PDs9Q0533c3NzcvKx8nR2/103trZ3NXb29DRz99pU93mauHk +2/Db29PS9GhTSEE+Pj0/QENLUmPw2s3NyMbGxcXIy9Pjc11aTkxSVF7d3dfMz87Ox8nN0dpv +U0xMTk9MSkdHRkZOVlxjfNzPyMXFyc/Z8WVPSUhIT13619HOzcfFxMbKzNzwb2BXVE9NTU5Q +UFFTWWL77+Hb3t3i8HlkWFlQSUc9ZcJc3MXMxsnLy8vPzNjhc1tiZFxaUk5FRuX4Xl3ZytHK +0d15Wk1KRkZLT1pRWHfz1c/N0Mrd18t70G3m4WnX9d7ee9ti0HDM5tLTbNo/SD06PDo6OkhY +0cnIvr66uL3Fz+b4XVZKSEpPVWHn1dnT0tvZ5dXQ1tfl29bJ2NxQOTczNzY0Nj1Q3MC8trGw +sLbBzm9XQzozMzk9TFfiz766trW6vMLGytDZ3uvcVkY1LS4uLi0vNU7Uvbayr6ysr7nM8UxC +NjEuMztEYN/GuLGxs7S5u8bf/l5iavBTSTcvLi0uLTE0RvjDubGtq6qvtb/YXEk4MC4tNTlC +X8y6sK+vr7O2vNTfc+12ZVVCQjIwLC0uLjQ5Ttu+ta+trayvt8DcTz40Li0vNDhJdse2rq2t +ra+0xMdi11dbUUNMOTgsKywuMDM9SN6+ubCtq6uutr/RW0M2MC8vMjlFb8K4srCtrbG4xcr2 ++1tMUEdHPTYxMDI0NTY7SGXQxb21sq6us7rD1lQ/ODU1NzxCW9XFvLa4ube/wczR619QT0dQ +SkVLPkdETU5JS0laVnnh4dLMw8TK1t9jW1NKTlJVb+DZzszIxsXJys7P1OLnXlVMSUtMVWrm +49/X1N3ie2FZTEhFQ0VHSkdJTlp57tvQysjGwsTGx8vM1Nfa4P9iXVpZWF1iaW356t3Z2tje +4OX6ZFZNSURAP0BER0xVau/d1M3Ozs3MycvO0tff6/h+dHBram1w9Ofe2tvc3OHo9WphWVpS +T05OTk9VWWNydOrk4t7a2drd4uTt9Pt1b21iYl1eY19pbG/3593d3NnW193f4+fq/mdoZmz/ ++3pqbG1wcn9wb29ra19jY21uZmprb2ptc25+9Ozy7e738+zl3+Do8Hzz6+bh4+fn+H53Z2tq +a2Jlb3R5bm9xe3l2+nv+e25qb29+fnF0++fg3+Tv+3d8eXx7/vD8cm1uev37+nRubnP9eXVy +a3F4+e95cXX78/b2+319/Onk6uff4/Du5unvfm5haHN8+/72c2xsZmVqbmllaWxpbn54b3nt +6O39bGp7b2/88+fk49/f4+Hj7O3r6e/6+Pj+/Pl+fnx3cWZjZGltZWdkZWpsfH99e/3x8vx4 +enFtaW738fHq4+rq5+zq8/Lr7Xtv/PH/c/v17Ovo8W9rcHBvc29qbG99+fj8ef37d25pZmJj +bnZ69vPn4+bk3uTi5O5+fHprb2xpcHt+ef7z8u7s8nh2d3lpXmVvfv378/bz7vpxd3p68358 +d3z07/B/e+/o6/L8e250dHL86+726urp7fL6b2NiaW1qZW1zaWz7+/ns8X/5e3vw7/Pz8+zr +7/Hy+3398/j17Ozv+Pn7+/78/vv+cHNtYV1dXVteYW52dvDp6ebk4eTm6+no8f/8/nX77+3w +8eri5e76+XpvcXh6aWVlYU87zrw+4npRyOlfyd1L8tBMWV97wkdV68NYZmK6VDSwfElb6cLa +5szB3kxbbPo+dvvh4Fri1uZQzNtN2EZrX+5D0ml0YETBR8tvZtTLQc7NTdbMRsD/Uenu31xx +/8dc2e3jZtJT9WPVUU7aUFTXeN/cStDd/k7KSNBOyk2+bOt1Ztv56Erc1lD5ccxJ6m3GS8g7 +xV3fT1/HVHVO2dxmb2TLTEjQ5lfkXM3XUd7az0/KTsNK5XBi0Vx51FxeyvBJvz7j2kdsy0tj +61vJakza1k/q+sdlSvnKVUzPyUddcsVzVubD2EJzwE472Ndkel7RvTd0v+pedVbKZT/sxVpe +X8XsV//CXETWzUhG3MnaP3e/2UPv2cpHR9nTSFHbzdJJ9cz2Tl3O10pfzt5uUeTKfVDvzutg +XeLmXVHb0E1c2kpY/GLP4FzG3Wz7WeJXYdHnUs3ST9rXb/lJb+5KXW3ozFhe1+5V5F7a3FZ3 +U1nZWGbK1dbWY2r2VXHk3dJebs1WVs9Y7NtW2XFJ6G5O4Vx7z0VS1vJXe83GXVvM0FtLVstn +TPLQ3N9f9NriYdDYU1TwUknmfOr83ddx5OjfzVtc9HRYSVTk9ml6+tHbcW/dXUlUcV3y2+79 +0dDfZNjV6OnfyuRozMthUG9NOTzh2uzd0cXdO0njTkl2xN9ASdZSTMXBw2NJw9BEwLnczd3u +9UxUzMZ46mZZTTk61s5DTNxjRjc+yWxY1k7h00ncuMDH08u7+1y8usNt78BWRtDbe1E57kwv +PkBLUDg7ZFVPT1XBzenDz9rCzc2+v8O9vbnNfclePvHIUc/AT1o+LTEuLT0/P2Jp29ZfyL2/ +vODkxd/exr63t7evyFfKVz7tyMb/NkdEIR4sPDIvS8G51mq4rsRdwbHFaMe2ucbMtKu+UMe2 +2EJdvc8sGhkkIB0yx66rvMO630t1zri1v7ayvL24r6y1z+TExExcsq0mCRU9Gxgto5O2LbWj +7yMtqKNJTq2osVG8nqnYU1rI1MisqboSByQlEiTUl49zK6mwMSQtpqU+W7KprVy1oLdWUFvG +u7qpo7oVBxcpGSLLl42oLPWxPxwgtZ+0TnWqqGJks6+9UkfTrqanpLQQBRQgHDK8lYqdOz04 +MSEZSp6gr2fKqbw9SL+uvUj7qp2cokMJAhckIsuhjoieKy0nGxgZPpuWpb/AuM48LVSsteLD +qp2XnCgCARoyN8KhjIWbKSQeFhYXMJiPnLbVcNY9Ijitqrq9qJyUnhUAAxtKx7ifioeaLBkU +FhseNZuOmK89L+DhKS3Cq6irqJyUrA4ABRj6qaOZjYuZOxUOESFAcaWUl6dWKDbcOjRUw6ee +oJ2Zxw8EBRJOppuSj5CbZRkODR3Zq6GcnaW+LykyO2HJw66jnpycTw0FBhF+npeSkJObzRwO +DBnLn5uep664RCcmM8OttLSspZyZTgwDAhKwl5GSlpqexx4OCxi2lpSfwV3GyjkpK/mqqa+4 +sZ6ZzBADAQ/KlY6Smp6itS8TCxE+mo+Ztz1Sws49KjW9pqGqrqSjcxgIAgssnY2MlaGz4Tgd +EBAhs5WSntA9THplODJtr6Sjop6jVhgJBAshqI+MkZut+TcfExEbRKCUmKjLSkE/MzJqr6em +o52duh8LAwgZuJCLj5mnyU4sGREVI7uYlJyq3TgxKy56r6ajo5+erywOBAUPR5SKjJan1Uw2 +HxUUGzihlZedsjsrJipfrqahoaKiq0IVBwQKH52KiY6fWTExJx4ZGB/TnJOTntUqHyNFsaSf +n6SnrNgfDAYHENKPiYmSry8nIR8hHh4uuZ6UlqdFIh0sxqacmqCsulgnFQsKDR+ljomLl74t +HxsdHyApTK6cl5y1NiIjPbKfmZuktU8oGQ8NDxhFnY6Ljpy9LRwaGx0hLs+lmpqlzi8mLfWq +nZqdp8IyHRIPDxQjwZyPjZCctTEdGRcZHi+4npiaqOkwKjXNqZ6cnqnXKhkQDxIYL7ackY+S +m64yHhcTFRsytJyWmqXNNC872a2hnqCq5ikaERASGi+5nJKPkJeoPR0UDw8XLrSbk5efuDwt +LkG7o52dptApGRAPEhouvZ6Tjo+UoWAgFA4OEya7mpCSmqtGKSYv1KWbm6C+KhcPDhAaLcSf +k4+Pk57EKhYODBAd1JuQj5SkaisiKl+rnZqerzUYDg0OFCjJnpKPkJSeujUcEA0PGTqfko+Q +nsg0JihHuKOam6fcHw8MCw4ea6GSjpCVnbFMIxUPDxQprZiQkZyzSSwrP8mqnZufszIXDQsM +Ey6smY+OlJmj0TEcExIUHnykmZabqcg/NkHfsqWfnqfWKRUMCw4XN6qakZCWm6f+KhwYGR4z +vqugn621wk7ru7mro6eqr2QoGRAOEhksvKKal5qfq+0vJyUmLkfgw7S1vr7F0ruwrqimq7TL +QzIrIBsdHhwqWteqnaesq+47aUI2b+1I58pc+cLJwK2pq6eqx0c6LzHwvOZHNR8aHiMr67K0 +rKq+zsRyTt/Z7tfV4trKw7qvrrS9z1dKZ9zezsnqUTstKCUkKTZNzcTU7Hxx0b68u7m+w7/B +ys3X3dLJvr2/xmtCPjk6TF3qx8PL3Uk0LSorLzlN7NTMx7+7u7e6xsPDz8S9wb3F8Eg/QT0+ +V2NuwsTNz1w8ODQxOkFN5MbAx83uX1xr0MG6tbvO4GJNSE1MS1Je58i/xMjaSj05Nzk7Pk72 +x7a1usPwYFRO0by8ubvYUUA9Oz1BQ09718G8yc7PRjw8MzI8SUvLtbm6u8puYWdkyLezu7zB +6Ew8LzM+P13GyMrJ2WtNRTw4OUFM7M2/usLY2FxNXerUyb+6vL3Nb0M2ODtBXdDNxbrH8FpF +Ojs+PlbFv8PEyt1OVVBKZsnFybS+181yQz5NQkFh7vLe2P9fY1ZRS0Zd4NjFxsDJ6lhQTT5M +ZOfIvbrBx9xSRUZaVvzV0M9iR0tIPT9OYWrV0s7EzvDi1O9Wdmdk1c7bx8jb9ltXRUxP683N +yd/ge00+OzxFUHnTxM3b3P9YUGfq3OnPy8rEy9Xd3VdNU0hKY+Pn3tHcXlpSTUdJUlrVydrb +1lZKW19ufd7LyNLKx9N47e9XXmZPVPtgYnj4W1RQfG1ed+jW2eBr8PNUUV3j08vO0svU63Bb +W3ReYWro6m1gXVdbW1FabV57e3Ds4/TzW2ruX1/RytbFytvR2lJt7WBebubielppXU5ZXFRW +aedZVNvZ7WP823lY/M/s3OD03s70Yc/pVe/b6mFh629WU2htcHZS9fNnYl7Q2PNd79TgWW3M +2VZR7NjSWmPS0FRI1N9QV2Rs6l1g4dDrVF7p5uR1aOndbVXg1fBgd93ifGpj+25ee+Ld+nbc +Z2p85F1n12Bp5Ohi++xYa9b4X9veXG3xXlJf1NflX2rg51hs4fb95vR27FpZbOr8XNzc7fBo +V2BoWXPj3Xr63t972NxzaOvlbmpf79fqftraaF5edWVj+Pbsb2Xq3lxWam1tX3/mbF5gXldY +XV5SUWnk0srIyMzOy87JxcXFx8W+ubm/TCYaGR8tO0b4wbaspKCqy0E6Ozs+S1pry7Sus727 +sbG1s7C5QCAZFxsgLD5vybKln5+nuVEvJykvO0Tgs6iqsb3Fxbuvr7S4trxDIRgVGB4sU76z +qqGen6nHOSomJis4asK1rauvvs/KwLy1sLGys78+IhgVGSM27764rqWfoq36LygoLS81SM+6 +rqqstMLDu7i3tLW4tbPENx4WFx0sRO7KvK+opKm8QCwoLDE0NkjHsauqrre+vbe3u7u6urax +u1EpGxcbJTRJds27rqWlr941LC43PjkyPc6wqKittLu6usTZ3c+/sKqv7SwcGBsjKzA6Wbuo +n6CrxT4vNDg0MTA+yKujpq+9x8nJ31dS27quqKe4QSUaGBsfJy9Jvquhn6Wvykk8PDcyMTZJ +xa6prbO8yNT8U1Lrv7Gtq6y5USscGBkdJTFPxbGooqOpsstRQzw0Ly81Trysrra+xcC9v8vf +6c6/ubS22jgoHx4hKC0wOlHFrqWipq2702tOOy8rLTnwvru5tK+us8VeR0/szcjHx8ndVzwt +JycpLDRD6r6wq6qttsxdQjk3ODxEX9DGv7y9xNRfUVzlzMS/vr28vMTfSTczNzw/PDk5PEhg +59rY0cnCv8DK715kaXNuX1dVWmhvamvmyby1r6+ytrzG4E8+Ni8uLi0uMThGbM/Kzs7P083H +xcbJzdxpV1BLSU5m1sO6tbS4vL28u7/O91BAOjQuKiotNDtDTV7u0MG9vb6/xczV8GBYYu7g +4uro2s/IxL+8uri4usHcUD83MzIxMTM3PENGSU1XctXLxsPBv72+xc79VlFXaXRv3szCvLq8 +wc3c3+98bGhmZGhZSDkxLi81Oj9IXdrDvLu9x9Tf7HX+b2dz59bPzM3P1uDs5NfPx7++wMPI +zN1fTT83Mi8vNDk9RVBf3tHOy87NycvN0dbO2OTmeGFfW1xv6s/Ewb25uLi6vsnjUUQ/OzUy +MTM3Oj1DR09p4NbOzcS+v8LI1OtrVlRPTlx+2Ma/vLm5uru/xcjO1epeTUI8NzMvLi8zNz1D +UvjXy8S+vbu+zOx6ef9zeurg2NLPzsjEv76/wsTDwsbO3WFLPjo0Ly4uLzQ7QUxf5NDKxr+/ +wb/Cztna4XddXV9jb+zb08rCvr69vsDEy8/fe1tJPjs2MjMzMzg8P0la3snCvru7vb/I1/xk +VU1MUV5w3tPNycO/v8HCwsPFyc3fb1VHPjkzLzAwNDs/S17ozsXAvb3Bw8fR2OVlWFdaXGNl +ed/OxsG+vby9vsHIzudqWkpAPTkzMjMyNDg8RlbxzcPBvru/zLvVfvxmXmz8a+Hh2c3Lx8fG +vr/AwMfKz+JoT0Y9OjQxLy80OkFIUWni0cjBvr6+vsPK2PJyXVVWWltr6dbKx8G+vr/BxszP +3m5dU0c/Ozg1NTQ1OD5IWfLUxb69vL3AxsvZfGJZV1NWXWJw7eDb0crHxMPCxMnN0dz3Z1pO +RT89Ozo6Oz9GS1p479TKycjHyczP1Oh4Y1pbVFlhZ+nZ1M3JxsXFx8jKztDY4/pnW05IQz48 +OTc5PEBKWPLVysbDxcnLzdHedWZeX1dXZW7439jWzsjFw8PGx83U2eLudllNR0I+PDo6Oz5F +TFx53tDMyMbHyszS3vZlXVlbV15peO3d083Lx8bHxsfKzNfn9G9nVUtIQz08PD0+Q0pSYvPZ +zsjFxcbKztbsYE9QT1BTX3N9623qvbvBvrm8w8zR0d/6XEc6NzQ1NzY6QFV80MrGwL6+xs3h +eGFZT0dCRExXZXne0cvK2cy6ur6+vcDJ2dXX6WdYRDcwLzExNTpJ8sq9u7i4t73Jf05EPT06 +PD5GUeLKxb69u7u9xMXIz9Hf593R0NXg+2hGNy8wMjE2O03myL66ube3vct2VEc+PTo6PkdT +5c3Cu7q5u77EyNDb3vHy8d7Z1N35bEw7MzEzNTc9TunHvru5uLm/znFSRz49PT1CSUhgzcK7 +uru7vcjM0N/f3uXi1NDMztrkVTw0MC8yMzdAV9nFvbu5ur3H31tORz8/Pz9FT3XOwru4uLq/ +x8zQ3fTz4ef30srO2tjfSTUuLi8vMDhQzr24t7Wzt8JySkM9ODY4PUlTZM+7tbO0uLy/zflu +eerd3NHEvsTK2nlINCsoKiwuNUXbvLKysbO1v+ZEPTs3Nzg+SGnZwrm3srG0u8TY5Hhic+ja +0MfDvsPO9UUxKScmKCswP+K8sq6srbG93VJCOjMwMztIc82/trCvsLa6wMvdYlpy/+rSxL/B +yuJXPS0oJiQmLDZQyLmwrKutsr3gTTs0MjEyN0P2x7uzrqyutb7HzuNbUl9t7M/JxL2/1lE4 +KycmIyYsN2G9tK6pqayzxGRGNi4sLTFBdtO9sa2srbS5vMbfZ15gcGbuy8PI0XxOOSsmJicn +LjxpwLSvqqmutb71RTkwLi4zP2LPvbKvrrG2t7rH2uZya2xy68/N2e5XPzEqJygpKzNOzLiv +rKurr7zRUDs0Ly0vOUriwrivra6xt73C0e9wam3x4tjIydVqRTcrJSYnJyw99ruurKmmrLfD +cEE2LywsMT1b0760rq6wtbi8xtfxcf3p39XOycfWUT8yJyMlJygzTciwq6qoqK+93kM1Lisr +LzhO0L21r66vs7u9wc3Y3e7e3eLSyMbNbj4vJyMjJSkyS8Svqqemqa+9Zj0xKikrLzznwbiv +rq+xusbIzNHS2djLzM3MzMPNSjcqISEiIixBfLKnpqOiqrPEQy8rJictM0bEuLOtr7S2xdnP +1NnLy8vCxczHwuNDMyYhIyIiLkbOrqimoqOrt+U6MC0pKi83XsC8tq+zuL/e28rOzMPCvLi+ +w8BqNSwiHiElJzb0vqylpqWlr8VhNywsKy06Stm6t7u7wc/W/uzFvbq2trOzv+4/LCIfHyEo +NlG9raqmp6y0yk07NTEyOEbsybu3ub3PXkpHSmjKv7aur7K310AvJCAkJis6/L2tq62tssdc +PzQ0Oz1Nzry1s7m8wNtOPjo+UeXKvLCvtr3KTzAoJCYqLz7duK6tr7S/20s5MjU9RWvGurOx +t7/F50s/PD9a1cW6tLW+y/pINyooKy84S9a6rq+0ucZvQjcwMTlDWsy6tLGzusfdU0M+PUdw +zL24tLG30V1KNyonKi89VeS9r6+0ustxTDkyMzY/ZNbMvLO1usPZdFhHQ0hb4M/Iwr25t7/m +V0w9MCwtND5NbMm5tri+zu9cRjs4PERSY+HLwLy8xNDT1OFlUVru497VzMbBw8PD50lGPC8u +MTZCW33Kubm9v851WkY6Oj9IYdjKwLq8wcTP8V9NSU9dZ+3PzsnEx8nJy872Qj0/NzQ6P03i +09bIwMfO2V9SV09IT1hr3tzfz83Y2Nfn69zj+PDw8ujg5dzS2eXf4HxgU01LSEZFRUtf7dnN +zszGy9rzXFBNS0tPXv7j2tLNycvV2Nje4+vt1svO3XRaUUo+Ojs+Qk972cW9vr/Cy9xkSj8/ +QURNZdjHv7/AyNf3YVJMV2Bn5dTX08/W4XFXTk1JSE5YZ+nX1tfa4+70aV1eXVtlenVv+vbv +6vLr4uLj3dvc1tbe6PdqZ3NhW3Pt6OTq+XNeT01OT1VebfDVzcvLz9nqblZQT1BWXWt859jS +09bb3upyZ2JbV1VdaW368Ori6uvt9P1udH387+Tl5+Dg5u98c2dfXVxgYWru6+/17Obt9314 +c2tnZWleXGBpZWzo4eTg3uPn7+vq9P11efr06uPt/3VtbW5mZW958ePe5PZzaV5bYGZqbnNz +eHZ67eni6Ovv7ebr7erq+/3ycWdkaGhve3d6/n76fnr97erx+fp3a21gYWpqc+nl6eLo+P/9 +dm1rb33n5efl6+30fW1tdnBqamhtdXZ3e/rv9W5pY1xham5sc/Dm3t3d29/k5ujxfvrw8+7v +/f5uYlxZXWZtbG557uXi7Ht+/G9kZGNhZ25ze+vk39/g4eLteWRiaWlub3b+7+rm7fX07+57 +c/zv/vvt7O7u8v90bnh+cWtvfXZvd3VubGxxb29z9+7z9+7v+vrw7vl/8+3t7+/z/frz9Pb8 +dGlgXFxlY2hz/fPq6OXl8Pvt5fB2bnN0+u/9evn39vz7dXvx+3r07359fn17dm9sZWZrdnZo +aHR1fOzh6fbp4uju+vjw/m1w/fD28/d+dXv27/r/9fv0eXV6bmpoZ2Zmbv/+fvry+XX+7Ort +8fn7cnjt8n/38/l0cGxqZ2hu/e3w6+rr6vTx7/d1cWtqdnV89+7t5uju+fT1dnR1dG13fPfy +f/z+d3F0/npua2dhYWp5+/Dq6enp6+/w9Pn6dHJ1d/Tt7+zq6er7e3lzdnNzaWJpbGtud/To +6+vr8/ry7e34ffn5d290cnF1fm94eH32+Hz8fnJ7bmx3/X1/+vbx7+/67+/q7P/99u7q9Xp7 +dXp4/n5ye/n59e35e3l1fnp4cnNsbv55dXBx+/T9cHf7fv769+7t9/L8a25+/v5+/fH5evrs +9PPp6Pf9fXzz6/L4fnZpZGhpcXl6dWx1d3xzfPD5/PbxeHL+9vf7ev9+bm5w7up/ffD2+vV8 +c3x5+fP38e30fHd+6/t7fX57dvv1f3FwfHxsbXBoYGFla2597OLm7vLs6+/w5e51dHz4/v78 +emxv+/T08n1ua2xreP1ucvn+dfTo8frk3t/o/n30+fL4e3JscXVtaXFzcG9tbWxvdf5+cXX7 +9frv5uTx9+3u8+/k6vX58O3v/W52eXN1fHNvdmxhaG51e3dxcX329/ru9Pnt6+3r6+/u6/d6 +/nhubWxpaf/08XxudvLq7evwdXV6e3t++H92bm//9vR7bnZ8+/n8dG95+vt9efXo6+/u6u73 +9vF4fvP0e3JzbnP9fHBvYmRsanD67+30eXL6+nd2fHt+8u32+fbx8/X7+u/w8vn08fXx/G5p +d/X5fPrw/21ubnb9+v91bXj5enFvbnh6/vHu9P/2+fr6+fDze3328vR99/F7dvr59/r8fnZw +ePH2ffh8enN0fHtrZ3P7+/Tt8v1xdPD1fvX1/v767+jr+3Jtb3t9b1xSWWj76ufe2djW1dzr +7vhvY19iYWFgbH1xd/Hq7+708n5ufPL+amlxffj1/nltdPHo6/zv9nFx7+9wb3Fza3N59vZ2 +fPh8fPDx7e9+euvn7vTn9Hh783hvdnN0anby6fdyd29rbv77e2trb3X/e/vz/nl69fl5efpx +b/x9+/l6efP7+Pr7b3jv7e7n6O73fn3w7vt++n59fH5ub21taGZsbm1sePnw9/x0bm9wavjt +8vDw9mv4/ent6urt/fH89/fv9XR1a/52/XR3fHv5anBeY254e395+Hzu9ezs7/Ly8Xt3dex+ +end+fPR9+HtxfXN6ZnNvcnz4+Ovf5Xhr8/D56+10fGxpb+3z7urz+21xb/1u9mtuefh+cX19 +8mjw/e5xcWx0ffnyb3x9fHpveOTq+2l38fno+ez4dmrv8f975vp6/e/3fHVqdm5lYGRvbnLq +4+Pl7vZ8/2x9/fd4eHzt8vd1Zn18dXD/e31w/Xx5be/ve3JpbP/x/fXr7/v97+576+vq/HJ9 +e/9qZ3Lwc/5ya2Jv+Xd5+err9Hn57/p75vZw+3d6cG587ff47OB7aG1uZG937/V3Zmf3/u7u +7nXp6eF4d+9t/HT2cfdnbmdta/Fs+eft63n7+Ovv7nvy8Ph2fO/yfXv6aPL5/HR5fHJ8Zmpy +/2787enq73dzb/Rwbf5o8/j37+/9dnn06nh3cnnufmfz5/7u9f7f+Pnqc25sbXJ09vfubnT4 +cPx89m1scH9+d35ydv/6fnb77X3z9ursePp3d2997Pn+9vTu9fXrfnVtam5sa3TnfHnwd/d4 +8/j3cGbv+nxocHFsdv/q/fn76vJ7/+z473728PLp+fzv/vp3fXhraGRmXm54/fzu/HHv7vf4 ++vd8fP/49n1t/O/t/vLh7vH76PV9/u56fe/5cXJ1a3h++HhuZHBiaf/6a3B1aW7w6/Lq7eR9 +d+3w6/rx8+d95/trbHdwb2h55nd39e7t8efq6XV9+W1oa/Vzdm/9/fP5an1ram3z+2dpbHv8 +9vXn7eLr7/Tu9X1/eux3cP7++XJh9uj3fHf4e3n7bmlvf3Z/+fP24+p2bXj67Pjx+Pn68vJw ++3NzcGx1bHxm7/Lu9e3n7O3q9vb2cnVmdmtm+nT0be5zfH3+eOztbmtrb2d+/Pbp9+b18urf +7/r2+Op6cPt4++/3fG90cXt+bG/q7nZod3btdv1wfXN4+/zw/H9ufvj+cHzo7O7td3x1fe/4 +7nL7ZWFlbPpnd+rm5un4+e75fO3q8+jx7vf8/nv97PVzanl4b2Rlb/BxZ3pq/3b89PFxcvX1 ++m/u6H538evr9vfp6ep3fX5q9Hh87frz/m5ubF9wa290am/17+3p7urzff7q5fD4fuh+anXv +9fb17Oxwbfbqd2dkc3ZkYntuZ/xz8+18a/VsY3/z8unpauZv7+7ffvHo59fl7O/obG7q7Wli +d2hr+e9RZ2hj1+376/Nzb2d6alxuafLOzeng4XxdcF9ud+9kamp+YnLrbODz3m1j/3Ro8mvm +3+BeY3xwUXbVzcvb4N3dWVxa+mt2b/hsc3htcXtuY25QVnJgZNHm299s//5QbN345tHX3+vl +3mdTWGJ43uXcy7/Fw8PL0t5qRCwnKi0vNjxTwLezsra4trvAydLKxNDTxr+5t7i3u0ggGxob +ICYtY66ln6GorsA/LignLkbXtqyqqa21ta+sq7K6uMcuGRAPFh8qQbegmZidqsY2JRwbHjK2 +npman63NPDZMvKqmqK3ZLR4WEhIYK7+impeanqtSJRgUFyBKp5qWmaPKMyct9auem5mfWB8U +DQ4RGUGhlY+Qmq08HBQSFiHeoJeXnKvjMCgqP7KfmZeZsSoWDg0PFzOmlI6PmLAxGRITGSZu +oZeYn7g/LS0yWrGgmZaYpTMZDgoNGSmzlo+PlK8sGxQXIDHjqp2dpcU6MDM+37OknJiYn08b +EAsNGCe0lo+PlK4qGRIWIj+2pqOlr3gzLC9Nv66knpiXoGIeEQwPFyiumJGQmLcrGRUaKPeu +qqSlt2IzLDFNv66lnpqdsDUcDw0UH2melZSWokggFxYfP7atrquuu9g7N1LLt62noaW1TiAS +DxYhy5+amJqlzCwbGSA7vq6npq/HVDk7Zb6wqKSqs+omFg8RHVCkmpicpLw6JBweK1qvn5yh +r3szMUTRtKuprLRYIRIOEyHbopybnaS3RiUcHihCsJ2Zm6O6Sjk4T761v8vdNx8VEhkutKCe +oqy5yU0vJiAkQ6qcm52lrrXCzsn7OTUyJiAdGyVZtaimscz2TDw3MSkqTq6hnqGrrq2vrKq2 +VjMjGxgXHS/Lq6KircVPODAvKiUx1auenaSssbm5rq21yT8gFxUXIEi1p6Ops8dWOzMrJCs/ +ya2in6GkqrCzt8PfPSUcGBgeLt+uo6Clrcg+LyojJzdZvKynop+gpqistso/IxgUFRolOdav +pZ6cn6zSMiUkKS8/6Lqonp6mr7/Gvb5vMSQeHiEkJik0ZrOloaOrtsTnVUdDT8uwqau6VTMt +Lz1+wbq8y3ZALyspKzRI1722srK78z0yMj/SsamprsB+TUxZ2sTAws5kRTkvKyotNlLKvLm+ +1VlEOzpF772vra+1vcze73hs7NrQy9VZPTUyNTxGT1ZcaGtfTkdGTWbXyMG9u7m3uLvB0eXn +2trnZEtDQD8/Pz49P0NOZO1xU0xPZ+DPy8e/uLKwtb3N6G1sb2RcUUlEQkE+Pj5BS1dcVVBT +XXZxcPLYxry3tri8v8TKzdfuZlVQTUtIREBAQkVISUdKVW/tdGVk99XHxs/Z0se/vL7DzNHW +2d3pbFxUTkhBPT0/RU1PTU5aa/z0b2lt79nNycnGwsLAvr/Fy9LX325USkdEQ0JAPj9FSUtN +VF/15+Pe3tvX1M/LyMPBxcnMzM3P1NztaFdOSUVGRkVHR0dHSlJg+/Dv/33y4dXPysjHxsbF +x8zY+V9XWmBx6OLlb1RIQkBDSk9bYWNeXF9n/eXYzsnFwcDH1HRaVFvt1MvJzdbsX09JRUZL +VWd+e2FQSkhHSlFu2s3L0OxscfHZzcnFwr++v8jZcVtWWl9neHBcT0Y/P0JHS0xPUlJQT1Jc +bubTy8O9u7y9wsrP0tXX193k7XVeVlRPTUlISUhIRkZHR0lMU2Dx2s/MzMvKx8TCwsbM0dXW +0tno1fVRQUnuWEpMUUxKQTxETU8+RcrKdMm7v8PD2P3Kv9DiycDV4M/abnzpUUZPWEU8PkJE +Pjs8R2BnZNrAusDKwbW52Om/t+l02v36+EdT7kxCRl9MPj9VUD9O7FdAb89mcsjI4tzKzNbN +ysrHysvKzNXe6m5aU1FTUU5PS0pOT09WXGFld+rt6e5zc+3t6N3a1djZ19vc4eff3u72dHv9 +aWpoYlxdZV5ZVVZYV11rdvvm29nY3eHi3d3k3tzb6O3v9fHo6HZueGVYUFFRT1BTWl9t7PF0 +7OTq5+Dr8Ong2NjU0tfb1djh4u3yZ15bVlJYXFhYXltYW2Bqcfj7e3/w7Ozf3d3e3Nzd393c +5/Xo+G1nXmBoZFpfaV5ZXWBiZ2du/ezr8vTm5e3m3N3e2tnc29zo+//5bWVjamZgYl9aV1la +WVtlfu35f/vs3+Hq8ufn6ubk4OLg2dXZ3uDpcnF5XVVXWVpZWlldZmtsanFzbv7w5ejn63Rh +ydRSysvo4Od45v1fanFZSM3XPX3LUFXtYWZoWmt0dm3/3ufu5tzdz3nh3Ftf3NPz5d34+Plb +Z1paVVZCPdpo1lxdt27f2Ml84v/o6FdHdslR8FC/4UjU4vpfeF902U1pTdZPTnDPZGzYWs9r +YeHUUU/T8rtD7sHcy0fm3MxKQVxfXzzJOezZR8i723y7YNxRRd9O20fJW9BKxfHNzUzDXV5i +Ss9M10Pc6UTQSclf++/QdEzbPMBTWHXUU9Hkfb5n3uZjx0nXYf5sdVpfzExO0+xZ1l342FVc +x0p45ErBWUzLbVfORM3kW89nzMpfd8dB0Vk/4eRF3vfV8mP76mlbbnnedVtmy99U5uH06E73 +xFpZzWDYUFHQ6E17ae7MSNS+ZPxXaP5eSNrv32BN089kePZu6U9b6P3W7l7jaupi9erO1N/j ++mJPS15m2t/e4thkWmJjbm3c5NNRUOZa9VDay+n3YPFu6+Rv3eRrXflrWF3463VhW+/fXHXb +29tdXNbiXu72y8tq7eDn421j2t9rSkVKUGtl3dJ5a1lKT1Vd7Hfz0n7o1+vh0trN4e/P0M7N +6dnOcnzme9VeVfNm/E9S2Ek8RDk5Mi08W3DEurq1wdzVeOLJxby9w7/EyMjG0NdmWFM9S+5s +z7u7QygkHyUuMk29uL3C017gzsO9u7e6w9HPw7+9xMXEzmNXeFlg4lj5ur3AzxoOGyc4yrSk +nK8wJy5Tv7uxpqq/RTpQwbC0uMHdT0Jezr++xtRZP1/F1xoOHy1Hubmvnas9MiwtR72rpKiv +yUlAVsO6vM7kW0VMZMGwrrbIXD05W80jDhMs+K2stqekxDwsKT+9tbW4u7+8us7O7U5LP0Rb +1MzAtK+vucPbTDUsQVIgFh81xaqys6euyEgpJjfYr6auv85dUD0wPdm5uO4+QnDBtbSwr71a +QEBUuquzMhcRGi/JqKKhorFBIxwhQa2jpa22xjslIDDHrKvLPDpZ08G4rqq07Ts4TMawp6au +TSIYERMhaqaZmqXILx8eIz2qm5qjxS8kIiYzyaqlqr1KOD3WsqutudhGODpXwK+nqr8wGRUR +FS+wnJSZrFcjGRwn/5+Wl5/zJRwcJk6xoJ2p0zYsNFbLuLK2xFg6N1DBraquvk8oHBoXHGqo +nZqkzT8qICk6vZ+boLYyICAmNNevpqW2Ry0rQb6rqbDPPi8wP8quqKmzzksuISImIDC4rKOj +v0Q3KCgwP7qko6vKNCwuMkDdvq2mrs49LjjNtbK5300+MzdSwayps8DS3dg4JiMcHku9r6aw +yM47KS872quqr7XuPzwzOP23rK7aOissRuC6q6y11DUqLT2/qqmvv/xdbs7rPT49JR4pNc6r +ra+tx0U4Ky9kuayszUA5Nz1T6cGytcNGLDFH2rStrq7BPDEzPsWvrq+7z9H9as1cLCYdFiBP +waegqq27NioqLm+1r6uuyF8/Lzl4wrGw0mFHNnTAzb+7yt8+Ki086rWsqqu5aT83O1FwTD8v +ISc7RtOvqKSpXS4rLT7NwLSssb5VNDE/bsSzr7XFSygpPE6/sLGtuzouLS9Zx7WmqbnMV0ZU +SDo0Jx8tS03Fraairz8uLi83Ql+2qauvvexINCwvRcuwrbK32TEtLzf2xb+4vnhPTVDZwb66 +vs7Iu7rISjEmGh4vOseinqCpUCwrJiAsXbKjo6uvxDcsKitOvbmzrbvZdDguOkRbyr27ub/t +Xl9VZd3Lwbm1srLNPi8gFxsvRdSpn6Kq3y8tKyIpW7SnpKeorlcuLS81Q2fAr7bFv8tfSD46 +PkvsysG/wclzSklnz760s7rFRy4sHRg70S/hnqCssNZYViccL8vjzqmgoqzcSksvISc+W9a3 +ray0bk/9PC078dzNwb65v3F1z+Pdwr7B5z5ILRgoWCMpqqS0qKe0vzkfK0ouLLqkqqilrb9N +LSktKipYu72vqa+92UE+QTIxUPDjvbW2tra5u8djQzwzHRpCNh1Fn6q3paOtzywoPCwgOrK4 +uKajqLV+UUgqIi06P3u1qKeutbxcNjI0NDlOzb+5rauut8xdPCgaGi8nHE+irrOfnaW7SkQ+ +JSA2Uz1qrKerrauuyDktLygmNlvJt66srb7Sy2Y5OUlMTOfDubfDy8pFJygzJR8422DFqqap +sLe1zjQxOzIrOGHbxLmuqa67vdc7LzA0OUBjxre2urq8xdlqXG77WV3Mz0s+Mi8xKCpAYF68 +q6uvsrjKTTg3NC41W+7dvLK4vbi4v9r+3lc4ND4/PVXKvLi0sLC6ytVuPjk9OjUzNkg+Lzxv +R0TCsbSwrK235EI7LigsNj5dva+trK61vNJPR0M/REdGTmXn39LHvLe5uLW4xls9NisgJC4o +Kl+/yLSoqayzvMJ4OjpBNC45Pz9ZzL2zsLGsrsnZ00c4OTo6PUFY2M/Et7a4uLrBzFxAOSol +LCkjL1le0aympqWmq7PaOjEtJCYuMTv5xryvrK6ur7nE2lI+PDg1O0hUbNfLwbm2t7jD3mAz +KjcuIitAPTvhu7Osra6oqbjcaUYzLSsuNT1Ccr+9vLeztLrAzOtbTUU/Q0xRYOjUysnOz9Hz +W0g+QUNAQ0td6uLd2NbX3dva4/P+al9YT01PW2/mzcG+vb3AyuFdTkhBQ0lRXnTh1M7Lyc3T +1uNmWldPS0tJSlRbZ+HW3NvY3uj5ZFpVTU1XWltqe/Tg3dTMy8zKydPc4XpaT09SWF5839jP +zc/R3PhjWlZOTFFbX2JhaXvt4+fo3dro+XxhWlZSUlNcavnt4tTR0M3R3Obk83dzal9ZWFhi +b3Xq3tjT0tPV2+1sZV9WVFtbW1xeX3Ds4d7c293e9W5iV1FQUFl76d/Yz9PZ19vsbF5fX1tZ +WmBgZXPv4OHd2Njb2tfd8P56bGdfXFxhan7m3drTz9btb2NTUFVUUVBQVmV07dzV19nY4v9l +X2ZsaXT2dW999fZ98ODb29na2Nzh4ut3Z2lmXl5mbnz06+bseW9sbmVeYFlUWFtbZH3r5enk +3uT17+/+/vXu/Orc3uLi6Ojp9Pf2dmt7/3NpaWZjbv78/fj9+P90b2dmaGZlbG138O7s7Onm +8X/t5ujp6Ov2fv50X2V+fPru7vn6+fl7Y2NrbGp0c//+furl6+/r93draG1xbW38+/3v6ufn +5/L8fHN2bm5/7+nt7+3y+Xl3Z2ViX2VnaW12+/nu9fd5aXD39fDq7PDu7e3w8vTs6e/t7e/6 +8/v+/3VoX1tZYWdkbGts7uXo6vF9evr9eHN4+3pvdvbr6eTi5eXu9X51dXj7fnN7+X1vbHP2 +8/Hw/m1rbm9jYmtwbm5ud3n65d/l6uXl5fh0+vv3enb2/216+n798eTqdW5ya2lt/Xlwe/bt +8/b6+/319vD9amhobW139v599u7y9/Hv9Hf37vd7c/99fXtoU+vcYmnh6nz5+NzoZt7oXurp +ZGFhXmjufG91/ubs6e56cWdz+3xnXGT54uLp5Ob44tzf9+/q7fNnXVdaYmluanL3eH316OL1 +eHz1fW52em575+fr+3/k3/f7dGVpamJfaGlncvP29/Hp5e59+evt9vn19fbt6ujufn3r6nVq +b3X5/mxjX2h8eGlvb2/36+/9/vbt8vn7bvzq+fns7+/o6Oz5eXN1a2hmYWpvd3V1dm18f/Xw +8v97+vHwb3Bvdvz58u36eu/w/f76fP55fvjw6+ft/nFobG9vffn07e7u/HRqbX17bGloamdr +amx48+jt+Xv99Ph98vr7/fDl5+ji5u39+vd0e25mYGZrbvv7dnl7bmhsdnJmZvnwffDw7O7x +5u/79Orzb291+e71eWxpc/719HJucP39fv1vcHL55Ofz+/Z+eH13a2p8+H1+evXw9Pb5d2xt +cXZzbWx0+vj56vB4+O/3/Pnt7fry731wfHxtaW93/PltaWhrdHv7/3T24+Do7O3u7/P2e3z9 +/Xt1am96dGZocHFudfZ8cXV2dG92/P1yb/z39+vk6O/w9Pr4/Hr/fntydXVwdHJ6+XFvdXd8 +8ero7PP7d3z59Ph4b21rbWdndXv88+no7vN8dXV29frx7n1xb3d3+n1xdv/y9nz78nZ2/HFt +cXRyd3J6+vvx8ff1+PDr6+z7/P/79Xt4cG51/vr29Ph/fm1laGx97u789f74/W929PTy6Ot9 +bnBvbnd9+f1zbm97c2508Pp66ePp7PPx8/f3+n54eX57cXX1/mxvbGZteP16fHp+8/T18fP7 +7+/t/W589Xt7dPnwfHJ6fG9sfet0Z2lu/3h3ffbz+ezr8vju73X/6eXu8/b//nl2bWVhbP19 +aHT7d3R/+//26erw7n9sc/h6e3prbndycXB1e/l0be3sd3nu8H7/+O3o7P326+73f/94e/p2 +a2prcXFsffx0eHX4d2zz73v59fn17Oz0+ezk6nRfau7pdl9t5fd4e374bnf77/F7cnRuanHv +8nLx6u/w8nj/7vlzdGt1eGR97/J6b/j8+Wxh++t/fuz09HZi7uDv8+fv9+vy8fX1/3V9b2xt +fHlra2xkYnFvamZu8PDd72F08d/c6vLf3nv9d//+a/Xj8XJsbvHvc11bbnNpZm178vZyd/Bw +ZXt57eP6++t7dP9ofeV5cfn47fDv9n/r3+lw9ufq5e9v7u/z+WVpZ11cXFtz7XBgZfDje2R3 +7+z6c3Hs6f/17+ff5/V8cP18amzs9Hfs5eTn/mx4+Xhob/Nzc/lv7+N+b3H5eXJvXGtuWl54 +6eZxWnDb61xn7drb921v5dzg5e/v3PBobnBydu/zfnB18/lpXF1kbPl9aWhld97i/nrn+Wlk +ZW3v4+nZ19zd7Wdy/XxzdXn1/GFg+e318Wlda2tnc2p76On4ePt8bm9z8fN39ebnfWj14O7z +dGp97Ot5a2z9eWr7/n/1/W165unm5uz5d/1tdvxhaejrdXRrbOr6aXn9cn5+e3Jtdn3t7fLv +7/5ucOfe7mJl7urqbXXtdfDmeGP23u53a250c3Rtc3b+63hp+O9tam92+uzs9uTs+e99feve +6vT7b3P5fGdx7Pl6c33ne19w3exzbWT66mtmZ/vj9mZ093dscfv093V17eXrc3Hm43Z4///3 +eHn0aWP36vJmaPnq4OptfOr3fHBs7OJ0/nFndnp2aHr6bvP2a//n62774PtuXmft7vv+dWN4 +8Pv0fm3m3n5kbOf6eWxlanTg6Gdibuzb3Op5/P1193xpZPrz7vFgY/nt9XprafPj/m1pau74 +amFv7vv2fHdubPPn8e/z7ebm/H3t7efqcWJz/WZfduzvbGVr8vR0cW1o/+Hybvz/8ej+bW/r +7PTwZ2Vz7Od3ZWVx8ul9bHX76OZuXHvk8Hdv8eXh7P14b29u/fn9cm757/ZyaWJfa//68XV4 +7Oz3+Pj17/Du9Hn16/T9eH729PX9cWpmanN6fnVre/B+b2tmeO58burp+PD7ffTk6ujne3H2 +73p/b2Ts53n7/mVrc2FgfvV0bnR7dnPj3/5uePv592pr+X3x7ffx8fvr5vXo4ervb2lvd3Jp +bG5scmNea/75em9mbeXm5ObxfnjveGds9vHw8ft4enp6cXX+7+Poemr06Hl+4uh9ZmJx8vlu +ee77dfx/aWx+bnFxZWVoZmb76Pj36vHo3+52f37u5/H9++7y8Hlucnh0fHhra2p2dXVve+n3 +9/b29//7dG76/XPn2+Pu7/Lx+XRla31sYW37cm1obHj7eWt1d3n9dHPv7nv75uHo7fHw93z2 +5vR0a2ttevJ/fP7t8HR+e/vv83BmanF1dfTz8vZvb21veGducnJsbmtq/Ozj6evy9e3h5+7r +9u/+bm/36+76cG1rbHJ1Zl9qbWlycHvu6urs7/Px8/328/386/NyeP517O17/nZsam9hXGVz +f/d0aXz7d2x18uno5+j09Ort7On29fDx/fv3fXRpZmxw+nlsdXb7eHBtc/11b3vv6+/v8vby +7+jte35qY2Robm5tdX59/fP+8+989uzo6vf/d3V+dX57cXD59Pj59/rz6ur0fX1+fHFse/pt +bnv6eGJkc3hwbmduef7zdXb18Ovg6vn09f757O3t4ODy/3h9+vn4/2Vfcv9vYWdxbXx+bv70 +dmtqb/nw/3T6f/vq5evt5O367u70dWtzanF9e3L8/HZ9dP/5f2ppe3dvePX6e3p0dPTs6/P+ +9e/v7Ort9n5yfHxqa355bWv88vp2ZWlwcmx5+W9kan718/Du4OPw7ezr9nhz8/n883RtfXll +aH72829qe/n59PR2bvrv9H5z+e3t6un79u/zem52/nx7cW12e3hvdHxtaW947vh3dHF+/W9p +/O12ePfp4+fu7fL49ern6/l6/vb8cXJ4+vh+dnBzdG5ucnR9d3Jzb3F79+3r8PDw9vP/7/58 +b2NibHp3fnz76/R3fvz68Onr9fp+dW9oZWd49fn+/P3x7O7u6+Xf5/n8ff7++/54cW9sa3Fy +bG53bnNpaX5ubHh8eG9ufu7q7vD3f3Z5/vPo5uvr7fHv5+rz7fTw83VwbnNteHdqaGxva3Pz +9Xt6b3/+b25vePD58Obp6+z1cWxu/O3p6vr29XZyc21z/Hxxev5ucHZt9ujv9vXwfHf5/Xf3 ++f7zenB7bm52d292+fl9b25z/H1wcH33+vXt7evp5OXk5O7s7f9uY2h99u95YV5iZWVsb2lq +bW53efX47OLj5eft9Ovv9/Dp6fLq6/Tt/29vb3FqaWtrb3Jta311//l7dGptfH1ydH7u7PL+ +/nZ2+fXu6+Ll6en2/PT7+/Pv/mx1e3x7+Pv9fHp9b2hoeXNpcfz2+PPq93l9eGx4fGhpeHr9 +6u/+9+fi6/t9/f1xfH1+fvPn7vPu9/xwZ2pxcXR8c3J5f/Ls8Xh0d3Z4eHd87fhy+HVy9/1z +eW5u/3d39e7v7ers9PDxeXp5fvrt5vt2e/jv8/X7fvT8bGZnaWprbG14dm59/vz9/vh6++3t +7+/p7f77+H5+/ffu93B2+Xt++m94+vnv9v98cWttdnR5dnJwbHR59f35+e7n6vPy8nx8/PNz +amltbGhy9PH4+fT2fn31/Pvt7/Ly9+nu+uvwdHFydv98d3Z2/HNqbm9vcHJuZl5pcm908Ojo +5ujm6O/56+388u7+e/v/d3p+b21vbm5wd3r+/Htwcfj7+/f38/P78u708u3xe23++nv3+vhq +YGRvfWxs9Ofq7nZ3eHZ2fvLz6fN6+u3zenZ1bmZfZmtyfHjt6uvw8u73+fPu9m989fXx7vV1 +dHVuaWZpbXp5enxufPN8ePbu6OPv+v54fH14fPx8en54bXD8entvbHt7fn75enV3c2118fd5 +fP58e3r+6ujm6Obo8fP39vvzfWpoZWNncXN2+n10bm92dGds+fju+Xt9+/Tx+u7s7Ojo7Px4 +a2p49+/v7Ojr8nRvdXhvZ2RnZmltdXf68/Ps7ezt+nx3cWxxenV6dHh8fnd67+vn+HF4+315 ++PXx6+br+P3/e3d4eHV79vd9b2tveHBze3R8d3t8cG138/Lv6+33fP39d3R2evr6/n3z8O3t +7/j7+vh9dnp5bG/v6Ot4cXt2c3Fxbmx1//99fXd7fHn3++3m6/l7dnF+cG12+vP/eXf78efg +4unu7Oju/377e25uZl9ganl0cnR+fXBzffv89/D4/v3v8fXv9e3s8fr5enn29+r27+54c3J7 +eG92bW1xdnt4b2x5ef35/X58dXn09vfv6evq7vHz8fH8dnp+f/ru/XFub3Fud3Nyf351b3/x +6vJ88+7z9/Ps83t3+PxrbWpgY2dzfnx3cWt1+XpzefH39O7u8e3m5OPk4ubv8f389/z2+XRq +bWpmZWdvb3l1c29scGttbnvq4OT09+ja231QRUhf183Lz+FtYF9f8tzT1PBhT0pNXeDYfVhh ++3lv6tjNytPleWxoWVdn7t94UUdGTm3d19nVy8nJy8vO3m5eW1NYYFxQS1Voe2lfaXH8b3Bz +aGz64ubq6f1jXHHf2d9oTk1OXO3d3NLQ19je/F5bWllfd+fp9uXPys3W63RramprdvP2+et0 +YWlvYlhdanx9c/3u2M3J0P5bUE5QWV5eZm/99HpjY2NfXVpaXF1jbW7r2dXU2dfT1t/6ZlZS +U1dn9ubg3dve5d7W1tba29re2+hxaGBgX1xXUFJZYnhvZGRo8uDZ1Njc6nhvbW9va2NfXllb +Z2tpbWlu+Obh6O77/Pf5d2Ribfnu8O7zZlxifuHZ1djrbWx8e3x2aXF9++/u93R69/3v6+vz ++evc2uD+XVZaantrZ11daGt+9e3l5ez6/PV/f3373tzm+2tcWmRyaWxpZmZq8+fr/3v46efq +5e1x++5+fW9ha/3y6+/x7+7v7OLf5v1iW2Bo9u31fXP56Oh3YlxaXGBqcm1ub37p3tvkd2Vl +aW7+8nt68ebd3N3f5evv8PdsX19kc/zv7vl4eGtmev1+c2htcvjt+P15/XF57ezi3t/j5u30 +/2xpb3J9dWx1fvvu6u16fHprY1tcXlxdXFhZaPn3dXf47eru6N/d29zf5vT36ePi5efo7n5z +bHF6ev77cn7wcXv9e/t/cWNdWmBt9ev3b3Z0dPLw8uvi2tnf6Or4dn73+ndrbmlfXVpYWmJ2 +6vV08u3ybWh38u3k5/f46+Ph3NfPzc/U2+pjWFtgX1hYT0tJQD9OcNHBx9HcaVtgXWrp3c3K +0+tnV197+e3o9Wv/fX3m593W2d7p+W95/enedF1gXF92am1rXl5jSUFOW+DIyc7dblhdWVZs +cOjb7f/z49zW3N/e/Pfj4tnNyMjM32pkXmdsSz4/OjU7SXm/ur2/1lRNS058183FytjrWU5P +VW3d3npcVmbf0srJztd9VVBXc9XKys3X63VfV1Ja5NzuSy4sNkPGtLe7wuFkUz0+UOS8uMTa +VkZVZFNy3dzK0WtlVmbLwMTMfU9XX+TNzc3K0O1OMSYiKUO+q6qvv2A+NTU6Xb6vrLXYRTg5 +QV3YyMbHxNVqVU1d08K/y11JUWzOwsDEzt5NRlJMSjwuKS1Cx66vucxlX1lLQkfuvrS500o7 +QmzNyNzn2dvifVtd2MW/xmBKS1TlzcjHycvWe05BRD8+NyosPdKzrLfP+ExRX0pO6sW3t8tS +Pz1U1dLX533f0dbe3t/OxcvvTEJLdczDv8PO4GRZX008NCwkKUPJrKmyxWY+PkVCYMa6sbXM +TDg3R+bFvsPad1xUXu7OxcXO70w+P07Rvbq8xeFidNP6PDMuJSU347GmrLXDSTg4Nz3swbay +w20/NjpO3cK9xc3abnD+5cvIyc1uR0JO3r+3usXgVEpg5E47My0kKT/Tr6itt89EOz49Tc++ +s7XMTTozPd/Jvb7fdX5dZnxxzb/HzGw/P07dvbm+x31Q69LWVzQsJB4rY7mlpLC9aDc4ODdh +wbSstvA/NjRKz8i8xezcfFxfYOfAvtF5QDpFY8K0tr7N+F/Rz086LispJzXetaqrt85MODo/ +SOC/t7bHVT86PGzGv7zRZ3RVVHLtzr/ByeFDO0VyvbO2vcr88d1kRS8pJyAseLqoprHCXzY1 +OzpYybuwt9lGNTQ/2by5vtXlXlJdX+vEu73MTjs/T8+0sbrJ5fDb2VYyKSYfJVW+qqOuveQ5 +Mjc0Rsi4rK7JTjcwPF/LvLzN1dxfZV5mzb28yGY+PEjaubG4wtZdZOd4Ri8rJx8sXL+op7O/ +dDg3OTddw7Wss9BLOTQ++sq7vdDP5V5dXe7Hv8PQSjk/Usu2trvH+mfd6VU8KyomJDzOs6er +ustMNTg4POS+sq68X0E5OFXPw7nE8GxaXvnmz76+ye0+OEJfwbOzutBdUm/sUzguLCgmMF27 +qqivvlg6NDY8ZsCzrbPNUjw5Q2HMvsDfZVVQYmzix8DD3UU7PkzKtrW4wNfm/GVNPjcwLCcs +Psytqa267D83NzhH1rqusb9ZOzo7VcfAv878aHFy89XLv7/XTTo4ROm+trO6yuBvXUo7Ly8s +JyxFxq6orbzkQDg5O0zNurCxv1g8ODxY08a+xuldWlx508m/wtxPPztAer+1sba/4UpCSV9O +PzUpJSw80K+sr7XLVkI3NUPtu6+0v+VNRkBLdOPR0dXT2Nzh39rP0XxMPj9P3buzsrfHbEg+ +Pjo6PDQuMEDQta+0wNlZTkhGSl/MvbvF8Ec+SV7WytDieOnT0trn39TP1f5MQEjsv7i2ucz/ +VEhdT0Q8LSYpN1q2rbGzvt5lQjg6RvG9tbvGakQ/QlT/1c/RyszR2/V67NPX3nVLSFzZwbu5 +u8xeTU1JSTovKiYvUsGvrrnB0mZSRzo/V8+5tb3VWUpUdfTm+V7/2c/O3Hp53djcX0hGTOfD +vLu8xc/bYEZESD03LCYtQ8muqq+5zFpPQzc5P12+tLe/50hIVl92Y1Vwz8O+xNr5cfXdc05J +SmfMvbm5v8zkaG1aPS4lICc41bCtr7S7xNZKNC4wP9G3srbA0dzddVBBPEBjw7i4v8zqaVlQ +SkRFVdnBurq8wMx1TUhDOzQsJSs7/7Srra+5zN5ZOjIxMkTRu7KwusHI8VVDNjQ8Uci3s7S9 +z2dIPTw/S9/CubS1u8XkXFZHOzMrJScuQsewq6qtuMllPzYwLS87bbmqqKqxy088My8zPFnB +sayttc5LOzc7RlrTvri0tbzOX0s/NS8pIyYsOdGvqaapsb3aSDozLiwvOmW1qKKhq79MMCss +MD5oy7mvra+8djwzMjtZybm2usDM3eZcQzcpISEmL2+0qqSlq7G94046LSknKTTys6Wfn6e4 +TzItLTQ/VdjCu7e4vs1nSD9FV97Hxc3iYE9NRz0yLCkpLUHKsKilp6y3x/pIOTEuLC45WL6t +p6eqttpGNzI2PU3+3M/Ly8vM0Nne3tnQzdHfWD82LywsLS84TdC0qaWlqbHDZ0A6NjAuLzI6 +U8q2raqqrrrdSjw4OkFNX3r03dHKxcDAyMvN2O1WPS8pJCQpM03Br6qnpqirsb/mRDUuKyos +LzhI476xrKqqrrfIaEM6Nzc8SWXdysLAv7y/yd1SPjYvLCsrLDND57yuqaeoq6+5yHxFNy8s +KywxOkzZvrSurKyutL7UXUQ7ODk9S3PQxL+/wsrUbkU6MS0tLjI7TO/IurKura6zvM77WEtF +Pzs4Nzc7SGnPvreyr6+zusbkUUI7ODo/SVbu0srFxcvyTDw1MC8xNz9U2cC3sK6vsre/1G9S +SENEREJBQkNIWuXJv7u5ubq9xM3jWUlAPT1BSlZi89zQy8vYX0M4MjEzOkNd0sG5tbKxtbrC +029SSUNAQERJTllu3s7Fvby8vsXQ6GJTTEhCQEFIUmLm1c7P0NtgST84NDM2Pk/exLmyr7Cz +ucLTbVBFPj0+QkdTc97TysK/vry9xtZ2V0xEQD9BRE1f69TOz9bjX0pAOzg3Oj9Mb8y9t7Gv +sba+zXtQRT8/PkBGUWTt183KxsK/v8LI0eZiT0dEQUFJWu/Tys/qVkM7NjMzNz1M68O4sK6u +sLnF3VpHPjs6PEBJVXjdz8W/vbq3t7q9yeNcRTw6Oj1HWHvb1d5rTD00Ly4xOk/Quq+srK6z +vMt/T0ZAPj4/Pz9BSFfixLevra2vt8f7Rz06Oz9IWvXd2utPPTUuLC4zPWfEt7CvsbO3vL/E +zuhVPTMtKysvPu66rKalp623yV1KSUdKUE9PV1pmbk05MCkjJSs34bGqpaOor7bF3+lZPzku +JyYoLki+raWhpKqwv9bf/mj3WEdISVDq2mQ4Jx4cHCY+waefoqSnrq+vvek7Jh4dICpJv7Gt +rK6tqquutddFPz5M0crKxNBsaEEoHhsYGypctqCcn56eqa62QCchGxojLkG+rKuloaerr8xN +S0dTycLHwsbMwsJjNSEWExgfMrqsp56bm5mduDsjGhsgJSxDYsapn6KjrM5oV0NM/O/Fsa2v +sbvRYDsqIBcQFR0qxqWfm5aYm6C9Lh8dGx0lKzvEq6GepbXWT0dMU1X5vq+ppqqyvNlKLiEd +FxIZIyzrqaCalJefrc8wJiMdHCQwWrGpqaiuvdRbPjpAYcCspqWmq7G+60UuIRsVEBckM9+r +oZyVlp+rxzUnIx4dJjlztaeoqqu421g9NUDvvq2mpqaruc7tPiYcGBETHSg6u6SclpSbpbNK +KyIeHSMvO9+tpaSlrs5WQDc7W8izqaSlqq297UYrHhgSEhkfKk+tnpaTl5yjt0EpHxscHiQ5 +vqujnqGqtd9LUlhez7i0r62xur99LyEaFRcaHCQ+wKicmZmZnKa5SiogHBsfKjrIrKWjpauu +r7jGysrT1d5fbmhCODEmHyInKCsxPt+2rauopamts8VnUkc7ODtCYc/f/+Pd29fJwb6+xMnJ +0u1kTkZDRkZBPT9DQkVIR0VLU2Dq0MjBvL7DytXjbllJPz9HW9nLx7+5t7e5vcLO/FdUVlhk +eFxPTUU9Ozg3Oj1ASlru08fFyc3P1eVcTEdIVvnazsW/vbm4u7/F0uzl4NnU331rW09NRz49 +PTw9QkNGTmD04t7o4dnlalhVWnLt4drTy8W/vr/Gz9rf3NTV29zX0tj6WUtCP0FESE5UVFhm +a3B9a2FeWFhYVldfZ3jf2dTMx8jMz9fk6OPk3c/MzMzR3OdlTkdEQkdPX+7XzcvN0ehnWU9M +SEVFRUdMVGRz59XP0tDV3urs6N3Z0s/MysrM1/xmX2FeW23s2c/M0NTa6XZWSkNBQD9AREtS +X/jf29nY3e99d2xnbHTe0M/Nzs/U3eDl4fDP0Nl+1cXT7PDRa19PS09MSkRKSktNUVdadHZ5 +evv57vH05Gpc38/d3tDR0unYw8Lc1MbGy9PGwL3L1PFZPy4pKiwpLDE/5by4s6uprbO/ZUtE +NC8zOkBW8c65sbGyr66xucXMxspePDo6LSIfJCksLTrasKmopqSlrLtZMiwqKCYsQdK7ubKq +p6uzsrK4wNPXz85oOzMrHx4hIiEqPeizqKein6SuuNc9LSYjKjI4UryvrKutrqyzw77Ayc7Q +xcXYTDwpGxwgHh4pPciqo6SenKOwwk80LCUgKDtMW76tq6uwubi2wunLvsvbx7u91k00JB0f +Hx0hL028q6ajnp+pus5VOC4nIys9TF/Fr6ywtrm5ucDZz7y8w7+8v8bkOCgfHR8fHiQ7xLCr +pJ+fo6zEdk43KiQjLT1GTs+xqq2ysq6wusfGvr3I08zK0GE8Kh8dICIfJDq/rqumn5+krcJX +PDMqISMvQEhiwq6prK+vrq+2wMjExdzu2vpZUTklHh8mJiIqWLawr6mjpay30kg9OzIqKTzp +5vbIsKuxvby5uLvDzMi+u77ObGBYMx8aHScoIilyramrqaWlq7jfRDs6NiwqNujH7ny6q668 +w7y1tbvFx721udhOVk0uHhoeJiUiL9+wqqmmpKesttxBODc0Kyk0XO1c7bmtrbO4t7Kvtb7H +vra64kNGSjEfGh0mKCUscLCpqKalqa61z0EzNDMsJy5VzNDKt6uqsLm5trW5w87NvbnQR0BF +NSEZHCcqJSx/raiqp6Sor7zOSTEuMi4qMmfDyMezqquyt7a2uLzF0c/AvfI8OjwsHRofKisr +Pbysq6qnqa+6v947LjE6ODI83b7Exbmvr7i8u7m4usDHxb/F8Eo9MSYeHSEnKi9Mva6rqKeq +rrS+dDszNDUxMT30y8nAtrCwt7q6urq9xMvGv8FuPTw+LR4bIy4uKze/q6utqqituL/NRy8t +Njo0N1jFwMO7sK61ure1u8LFx8nP325MOi8oIiAlLC8zP8uurLGxraywwfVPQDk2NjY8Uu3b +y7yyr7G2t7S4wtX19t72Tj88PDUqJio0OjQ1Wry2vLyyrK66y9TkTTs2Nzo/R1TZvri4u7y7 +vL7E0eDp6+5wV0tJS0E3MDU+Pzs8R2Taz8/Ivrq9xMzW3mtMR0xOSkxo18vMy8O9vcDDxsfK +ztnwX1hVSkA8PD49OztBS0pMZODXy8fNzsjL3mhfYWllXHLXz9Xc2c3Ix8nKycfGydLe6f1c +VVFJPz08Ozk5PUFIWfPf08zLysbJ0dXX3vZpZ3fu7Hx76tvX1c7JxsTFyMvP2/VoW1FIPzo6 +PkE9O0BR/e3k29XLw8jX3drZ6V5TW3n/YWX12dnd1snAw8fHw8PM5f7q7WtSRj02NTc7Pj4/ +TejPzdPOvrm+z+Pp7WNKQUVVYF1y3s/KxsS/vsLJyczX08/X82dhVD8wLC85OjQ4WcO6vb63 +sLPA2GhPPjY1Nzo+UtLEwL24t77FvbnBz87BvMLcVVpIMSUfICs4OEe+rKmorba+0WRLOC80 +O0jpz8m7u8TU/VddYO7EtrKytba0vO1IOi0mHhsgMUvou6yoqK253khDSD48R15v0MLDy83c +UkNGVGvWvbKsqq24wMjZVz0vKiggHSQ7+Mu5r62us8hMQUtaWmXwz8jP5mtZW1hGQ1rVwbm1 +sq+vs8Hd5dPPeT8xLCkfHSU6ZcSxsK+vuNZVTkxX4tjaz9BvXGZRTE9PXNjAu7axsrm+wd5e +bt3Gwc9TNSYbGB80bL6tqqusuftHRElQ89/n0dH2fPNTRVFVU9rFvLOutb3F3Xv76d3Et77j +Ry4fFxkmQ72uqaqsscpaQjtJ3MfT73xeaeFqRkRUXfnSybmtrbfG817t0NfavrW9YTcpHhkc +K/uyq6mtsr7rSDs8St/O6l9ccN3X+VZXZ3rdyr61rrG93FJPfdPT1cm8tLxGKB4YGSvbs6yn +rLG7TzQ1PE/TzGpX5c7Ewd1IQEtPXNnEtKutu+JLQ0/k2dnOvLCvvj8nHhkcMcivp6iyw146 +MzpK3cbHdE5l3cjEdUI+RVbZvrWtq7PUQTg8TtLBwb21rrDAQCoiGRgn/q+kpbLFWDo4PVDc +x8PgT1ncwrvKSDY0P+q6r6+vuN5EOTdF1bq0usO9tLTKRSseGRovvqmjq8J5PzU6P1fFvsto +SFXNurzePzI3Uci0rq+1x1E5OD94vra0u8vKurW86C8dFRcyuKehr8jsPC4vNV61r75fPkrJ +usFrQkVTfdDFurO5zEo6P1Hry8G8t7rFxcK7tvQnGxMcxqyoqcdu/TMqM0y2qLRaPDxrv8j3 +7tTO2kQ/esK2uMzr3exYSEvaurK40ODEt7dhKSAaGkS9va2zv79GLThew7O+aG506NFsbczC +zFw/O07WyL25vcxcPTpQ08G5trO8yMXI5DgpHxkm1r+uq7jBbDMvPvLAvszKzt54QEXYx8rW +ZUxj4t/Twrq8y1NAR2bhy7q0tb/V00suKCAfNb25tbTB5VQ4M0/HxcnIz9LXVkJWz83R4G3/ +81BO3b+7yOFwZu1fV9S/uLrP/M9eLyglKEbN1MCwt95cQUDf31Pyxcrc3mv+1e5YdtPccVpQ +bdzn39TP2Otva+3d2dro18PCwPYwKy4wNkXTubO6ysrL70ZAUFJPUGfCu8Xc6dziWERJYP5r +e8rFzszQ0MtfP0pbT1nLu7e0vD4nMTYoK1G8srG6ubHBQDtGOjM9+MG6w8i5u+lKT1lPQUFh +y83OuK+9Z0pHQTs88Le1v/V1ejIlLT5BQ+24rrPCwbrPOjM/S0xO3r69zNLEwdFnYmVNPT1T +79nOxcPO5+flX05PZN7a6vrxdU4/Pk5eV2L7c/jXztrr4tLL2WRXUkhCU93MxL66urzEztpW +QDw5NjU6PkVO8MW7trO3vtFRPz4/Rk1RWm3t3dPT0srHyMzY7WFOR0dKTE9b7dHMy8vS3npe +YG1nWFJTVlFT7tDKyc/X4FxRXnnwZVNRXnNrZWbv39zY1tfX3+v7Y1plaWJ86un+aWdzePLe +0s7Mz+L9Wk5TVExHREJETGja0NPPzcrN19jZ5v1x/e53ZmNYVlpUX+re1tPX2+hxZ2Zw5NTP +1dbc7/9oan9jWFdKSEpKTU1KTVtccNfP0NLMyNbi2t3e9G/z6fLo4NrV4eX8WFVbZ+XVzcfL +0d5pWlNLR0A+P0BDTl937PXh1tTPzMnJy8/V2/P6allWU1FRWvfa087O1eD7aXrp2s/MzM3R ++GleSkRCQkE9QE1SXXbw3tza0M7Pzc/R1N3a2ubn/2liXFpfZPjZ29nZ3tzZ29bR19zf/19S +SkZBP0A/QUhNVGvk1c7KxcHDxcfN2O13cVtVWFxeZ2Z36Ovp4eHb2NbPzs/M0eDo+11SSEFA +Pj4/QUZLUmVteOTUzcrHwsHHys7V4vj7alxdZmFidP7q7ObX19PP0c/R2eD3bl5PR0I+Pj08 +P0VJVWV95NvRzcvJxcXGxsnO1+Lp8WxqaV5cXF9fae/m4N/a0tLWz9He4PVgWE1FREI9PT5B +R0tQXnPt1c/Mx8XCw8fIy9Pa3+x3cXZwaWZucmdt9erh2dPPztja2OxsXVZLPz5CPDo+Q0RG +TV545c7Ew8bAvMDJyMrY5+79aV5qfWZj/3Zga+/o593PztPNzNXb5GNOTUM7PkA7Oz8/QUhU +ZuHQysLAwL2+xcvJzufv5Hxhb3xkYXT2cm/q3d3h187U1M7R2uhlVE5IOzc+PTY7RkRAUe/8 +5ci+v8G9u8DJxsXU8uDgY1ds815XfvBhZeTb393RztfZ1tvc9FpNTUc4Nz89NDlKSz9O09Xq +ybq9xby4v8rFxM/i2txrWVxeV1ZbX21sb93T29/OydXh0dNcTlNNQjo3Ozo2N0NXUFTXxs3O +vrm9v7y9wcnP0Nj+XV1mV0tOWVlVctfZ29DNztHSz9LZ52JNR0w/MjY8NzI7U09HdMbFy8K7 +ury9vbzB0N3R2VtNYWtMSV1wXFzk09rUzszJy9DS0eNeTENEPjIxOzsyNElbSlTKvsLBura5 +vL2+wMjd9fVgTUxaWExPa/Xy3s/LycvIxMfP3998T0M9PTsvLjY4MzVFWl3zx7y6ubiysri+ +vr/K8mltV0pJUlJOVnbr39bSzMfK1NvOzftaVkNDPjI3PDQwOU1JQGLKycq/u7e5vby7vs3g +1NZdVWNoXV7t5d3c9tvP2H114u1ZVmtUSlVVSUpZ92BES+BmPUNoWUZKanpccNrTycvOwr3D +zcW9yOfTxtZdbXBp9VRFec1QSc7SRdvLPVfBUDr/40VPX0ZXzU04074+PMvISz/ext5qesy+ +zl3TusH4YcG2UD/JyU4/Wc/eS07WwlxC57zaOk27bDBMwe06Q9DVSFp63MVEScG/Tk3TwmNF +2eNk6lxb1/ptZG/a3NzV8HW60zzMtmE63L1YQVZs1FpESsVjTEvMxlZf+cR+TE7dwkNV4nLm +SUvwv1I7zsJyTEjEwkp83dzQa0/RyUZmvllEzsNNS8jiTFHGW21h5V3y1F1d28pO3tp+/Nlq +al5y4EXt2UlQ1E9U0/A5z787TbVkPbzaS8FzX9/Ke1DOztY6usc69b1ZNMDHPk68VD282jra +rzU7q0Iuu7wsXLFEObRXM63EKtOoOzPKvmE+zFFfvT5HxcFHTc7CaFLC21DO52fSVXnGTEi/ +TU27OubKTEjY0j9wyk5V1OZCy9FLdNlwdOlJfM73RNbMbnLg0mzJ6kK52Dbfsk85xsVDTVa7 +Qz2+/VppSmKtLUKwwzRvw37TOtDMvjRMrPMuzbZLP8xv98NBPrTQLeuqOTKsaja8X0HK0zfP +xU9LcrE8P7H/N7FVNaxlM7fSPtVPwts0xcs90k5Csvstt7oxzcw1sE84tlo9u01SvD7VvTlu +sjpPsztuvUZFuGM8w3pLymJJ4MRYOrhsUHlr2VldvT3ovT/P6XJf3dJMYNvEM9e9RT+xOkqw +PUXFyTzM2VDJTM1P2NVIyNw9vT7KS1rTTbw+TMC+Me/MvD9Dskhjwjrmrzg5vbg0OK/GLc26 +OM3HNtq1Rzy9uzlOvtY/4H3x31RPyuNSS8rCNtLNSWPNTtvMP+rU7FNgd8PmQ2Cz8zHEwGY7 ++b1Jbc49wb01Pq7LL2W/bULXU0u6ZzfCtTlgvXptVNnPSlrHR33DO9rN8T/NwUM/sU00r0FK +wWI4xbo3V7ROU3jLbP3q4+/fzED5ymBIzU7FSUjNzj7GekK9TltexNg42q83PK9HRrpNO7jG +Okq6xThOtE9PzT9Zv1s3zLw/bNBYu0Vvulpdxl5my0p24HjcQdjPPGnVUONC5b8+XrxKY9NI +zNVWWv3FVmLpwUdywlPZ/Va/R2VFat7I8kbB10D2zlDyRMzYTOB47MdPV8TbW17LUOBgVOdi +1UPkzVJO59R0UcxLzdRCYb5gTFXfyEzcTtXHXkPJvl5QWcRb/kHLvjlNxOVAwU1Ju1Y/ztft +SH3DTM9HzNVSXW7PWdNJ97g67749zcw7W71jO8fWQrtPMq3HKby6K8a2MUusXDS3vjLbszhA +tto12LpS/NzJTL/8Qs/I50zs2ttnWl7XU0hCOVFANztWYk/W78y0vOW2s8LDvsDLuuvZxNbV +47vCNCU57SUdKjs0LzJEtqvE1Kejtry7ycDLPjdS1ExtwbKzrqyuq6+6OCgpIxsYGR4mLzdV +rKKioqOdobHKYtw8KCksNj9Dx7GkoaOfoKWtfCoiHBkXEhUfKzV+rp2ZmJqdnqXBNygkJB4d +JjzYt6qhmpeanZ+ksT0gGxYRERIRGy9IwaKXlJKSmqOr8SobFhcaHyQys56cmpaTlJqiqrc+ +HRYUDw0PFBgo6bOhlZCRkZahtUomGhMTFx0oW7Cfl5SWlpeao7C9VCAWGRIOERMXKFbEqpiT +lJSXobDRKhoXFxgcKUS1npmZmJaanqOwzOU7HRcaFhMVFBw47sOom5aWl52ns1grHRgaHSQw +X66em5ubnJ6jr7/PzkciHB8XFRgXHCtUzq6dmJiXmqOrvy8fHRoaHy1AvaSfnZqdoaKpucrA +zy4hJxwRFhgYHzNKwJ6ZmpaVm6SvSyEdGhYZJDd3rqGfm5mepKWsvMTMTSYiJBYSFhkdJTvX +qpmXl5SVnKnJKxwaFxUZJ0PCqKCcmJqfpqixw9ldPyohIBgUGBsfJz2+ppmXl5WWnrFZJxoY +FBQbK1i7ppyZl5mfpai4+UtHPCYfJRsUGiEhKFW9p5mYmpaWobpWJRkYFBMcLU65oJqYlZig +pKrHUUI6NS0iIiIdHyEfLUtus6Kdm5ibpa7KKh0cFxYfKjq6pqCbmJueoq3GbUU4OjgyMioh +JCEdJS0ydLCqopycoKOtXS8oHxkdJCg+wLGknJ2en6awus9LSmVPRj0rKCYgHh4lLzhlt6ui +n6KlqLPPOy0nISUnLUnXu6unpqOmq6yzws3e4v1hQC0wMSQjJCUuLyw80MG4sa2nqbW7usPi +emld3txjbFM+QUE5aVs/vbbZv6u3xrS52NDpOTI5LyovNDM/WGF2xsTHvr/Lycl3W11KSEQ/ +SGLu4Mq/u7SysK6vtLzMeUo+OTIzODw9P0pWWFhZX/xfU1VWWV9bWVplb15aZuvc3c/Aure1 +tba5v89pTklGRUtTfNjLyMvIyutRSUI9OjIvOTs6Q0VJdGxW2svKw9y7rc3DtV9J09BD7MpW +1bm/ua23yM7FxVs82MctJkY1JCkiKFQwKNqyuq6uq52mw76/YD0qKDo8L0a5rqqrq6SowtzH +9D0tLj45Lzjnv8k5JEJRICU7SddrPbWn4fO1t7K/6bWu3VPSzedTX7uzxcKxsr7P4XpHMTEz +LDU1OMrGd9U7MlcsHzA5MT9G1q2vuaehqK20uL5dPkdXR0favbW4u7C44k5OQjI0PDtCRjlB +31IyMjk2KiUvVW9btaanrK+srMNkzcTeSk7Hv33dvb3I08C+Z0ZPOj47MDpOQjlFMy8+MS5Y +YlW7u72xuL62u8K7wsvSZ37O/uHIxcXb8NzwT0heY17tRT5BNzAtLTphSV/X187ZdsrEzsK3 +uL29vL3T1MHG61rgcEFOSVu+y0dOxfw4Lzs/MzU8ec1LPtTWQEPdvcLLvLC4zsW6vr66wMb8 +T+reTj9rvz0w59VUPzNQVCEqX0I+/cK3yTtYvMtW0a6wz9S4ssdguq/ITU7j6TY+t7xLQbvI +NDc/My8wLT7nS1XKb1fR12Taw8XJzL+3wsy8vsnka91UWdLOwtfNustY63k5NTArPC8qUfVW +2+xVblJK08LPur7Lu7/azbvM3szH0mh7zr3Ebsa3zUdO7UIwL0s3JC5dPzE85LjJSc6xvkxG +yLnfY8CyutvWwMZtcc3D38+9vcnUv9A9OUEsLT09Oz5t5TsvOD5OSV21rb7szsDPX9K2sr/L +v77QW9y7wFtvz9dN/c1cTFtCSfYsJjssIzlMX73PS7u192/Rv7fF1721x+vSxMHNz766ynXa +1NjX7tDVU2tOb1wUDjpWJECnnp9iJs7FJSW8o6y9zLWzQDm9r89NVdzSTWqyqKu2wmxFOCxJ +z97CuKwzDRQ4JiraqZmfLiu+/ikpXKKfzmausEs8VMO1XjzKt8bBsquux1poRy47V3m7rr0V +DCE6LS+xm5m6Jz26Rio5va27zca4utTZ2FdPXU1c0riurqyvxlhDOj1BPr+qsrIfBxM9NDu3 +m5amJiDoxC8rvaSpvi5DrLx26sa73TY6xLGur62sv040OWBOV724vLM1CQgnVt+0npeaShsq +8/I7/aiepkYqPnXk6My3t946Qta1rq+uvVlDPEblyrqxx87FIggJKcimpKCZnzwdJjj0zcGn +oa1hKStF5t7gvrjIPzzBqaiwyFlQQkFgx7OvvOxTQikSDh3+rqOkqqW8LikvPOG5rqy370Qt +LGW5tsFfYm9LbLGlp7pGOkNDQ2++rKvVRGBaKBEPIsCqp6ulptkrJCxLtauutdFNQCssxqmu +yEg0PmDMr6mqs3gzLTNPx7qxq633Mk1KGhIbO7ajo66mui4lKjvIrrW5u089PTJRr6/LTzo9 ++cy7ramwbzAsN13Fuq+stddBOsS6Hw8VL7mjpq6or00nJC1tsq+xvNToQC89zLzXTkJqvb7E +vLbGVj45YsTHw7u7vs9KX7q4SxsOHFW6qKmnp7woHiYwwKqrr73NSDEsOM2+vsDCwM7wUHjN +v7jC3mrWyfdvysG/vtlUVVEtExUvwKerucnKPyg0Tb6srr7T6DUsPcWvsbnCyN88NEy9rq21 +y9t3RD9E/cK88UtuV+fW1ugmGSM5/snDv7C0QDE6UMjDcVm3tPpPWMuzuNfjx9T8WE/RurfG +2tXsXUU6PuvF0GNZduDlUCcfLztAS0XbsrJ9WdDv1M/j3MG4zuXm2bq2u83ldU1IQVfJvL3P +8FhKRjtBT0tKQUZWzLu/yHpMPi0pNXTDvMDd5NtdSVjLvLrGefjU19fMxL/M715VUFFdaevU +zNdfRkNJQkRi3crG21pFPz1GVfXGvsDOdlVKTEtU3Ma8v8xnR0hMaNDKztPdd09QWmb119He +bVRHSWbdw73Ez91cPjxFS1/T0dzY2+xqWVZce//UxMXH1VxPT0xU79/Y3VVJSExX9tbZ53hf +XHx4687Nx83fZUtHTXTNys7h6f1tbPnga1hSVuPV0djqaFRRVn7k3Ohw7e5gWuttT0tb/ODd +68/N+F5ufeL3U2jk7OXsan7+e95/4dr+XV9r7Mrc5t9lWWFhauDgeOlsT1JOTmjaycvT721Z +UUxP3NXe4fx+/uhr7NxmWGRhXfve7NrW9Xp44G9hefzW2vD53eRpfmVTTVJY7dXf187rUlZm +ZXn96915VFNiaujm3+v76u3689bi43RWZWz+/X5+5n1cbWds4tnp3N1eXmJgW//ebGnwXFjs +597r7f9q+9vra+DZaVHe0ktPwH5O7d3S637a2Uvf6Uv1xVRE18r9Pk3GSS/OvT8817h8Q87B +4V5f1MJjQ+PGbEnpzu5b6Nfkanfc62nr5GxeXe3sXmp6Z2daV2lub/v7d21rc/Pq49Hfbf7o +eWt9fPL48+5lWnLr6uPd2e9menNtb/BqXW90bGtnaXVn9uN7d/NvfOzi4Ors5e5z9n9reep3 +cu7u6+9ze3Vn8+9r8+5vb2hzdWNpbXBgYXFr+OXm7PLm5WZ64/Lk29ve/nP7e/Tz8nV77WRi +aWt5fXpvbm3272ZrfW9+eH338fb79u72fH1sYWJ66u/u7/N9cO3i7u7q59/n8OtxZ3N1fnVt +eHloanh1bHTu7nF38u9zdurscXvzdm97c2Jfbuzv5t7id2n8/nzy5vZ1b2psbn7z7fT6dWt3 +9P3z3dvh93x1dmhvfW9uam9qYGf/dmppbG979G987Ovy7OHtdXb5+fvr3+Tv7er6bnV7cW/6 +7n56/W5oaWZnZGZkZm14enX28vHq6vP59PZ+dPTf5O3t7+7s7nt2dm5ybm5uen5tb//7bm19 +fG1ybGpwcPDu/v718O7z8fDwfHr+b2dsc3r2/fjxfW/48Hx4eHlxbW5zd3N88PV/ffPr8PPq +6Pb9+vX2dfXvdWx0em9rbXv++u3+bGlpam5xcn39fXR9fVPazErO7Wv8TFvDxVd7v9pkXlvq +TF5r92R0aVzadu3NUV3d7V5ay1fiaFrYWdxjzdTg7vHdZWTVTvfuU+JgZmHldV7rb+ZX9V7w +atVlbNtX2ljaXuja7dbq3eN53frrau7hXtlW6ltwflXSXFj3Zmrmal547WZS1GVmz03d/O7Y +XdJo1Ovu6dZgyWLY4FrMRcdMW+tNclBWT1NRUFx0Wf5q/Nfm19rV5MjrzdXgzOTR2drN2dTc +3cr+y194RDkxLzgvNzhD5crBubOysbrEz/1GPzg5PEFIWtzKu7y6vL/Gytz1XFVfXnN+09XF +vdDeXDkvLiwsLzM7X86/tK+ura+6w/ZKPjYyMTQ4RvvPvbWxrrG5vNRtT0ZFTVtZeNfLwbu9 +wkw+MiksKikuOUfVvLiuq62us8POYD87NTAzNjxR1MS5srOwtLvF2F9OR0JKTld35dTEx8nF +yc7VSjAwMC4uLS8/Xu3Fvbeur7S3wddzRz4/PkFJUXrNwL67vcC/ytdyWU1PSENYXGjU6uHF +5N/ecu9bTU9nZGRFPkdHSkdJW9/m4OTYztPb5O/87dzh4tTd08/azd3M5Nbb5td0eOpw92bz +fW7sR/FPbF1ba179Tl1YX2hd/2FfXl9ccmh8cu5t/Xhz+G/d49PZzc/wzezd017ddOtb4Oti +cWhg33F43+zcdtxX3u5k3VnmXG5RZmRbX1jfWGv9a2L+UnFYb2li1XXN7NjY3c5s0nXvX2T7 +Xlt8X2ziedPf0urU5e9gaW9lcV1iam9n7Hnr5v3xdXL+6PpeXmNYYVxj4Fzy6eXu99xwZHp/ ++3JrXen06OX83X3ieOTv3O1ye9/nbvBv+Ohpfe1sZWx3bG/t8t/rfeRsdl1scPxXXV1fXFlt +X+tqdPze6+Ll4+fq2urgbNjf6uHl/ObY5959/3Z3X1xdXF1oc/h37Ofo8v37aGZaWlNdX2lb +aXzo4tza2ubb5XlwavZ7eW/v8d3z5tzv/efqevlz/HJseGxsb2fqfWXi8nVt42N3bmtdanRx +cv19/+/r4N/vbfXsZF9ranhtb/fq7uf+//N3eP30YHL5f/nu+Nrl3njz7Gr8+3xmdGzreWfr +7+Zt423u8t7r/Wx0X2hdaGR6aGvmZFx4ZGzteH7e7m32b+jg9uDc9XXq9O7lavx4a3tkent2 +4X7429/m73Dwc/xda1pfa21lbG559X5l6ffwb+7/YOR17N/u+f7n6eF87njf/W93b/5ecGf9 +dnd05mr+ZHJv+tx07uj472Bz6m586/FufXtb5nZqfPVf9n9eed9+d+Fv6uR0ZebjbPTh2//f +8ej3/WFqalp6XWT5V/hlY17m7Pxy+uvn7mHe9ORz6edz4ftwdfHn9Whv7n7qbXbj8Gru/O5t +aHFibfX+bfTranf/6P9ofmpt7HVlbn3xbvx9+ufq7Pni+3399O7oZd1iZu593+ft4ejtYO9i +c2xmcup6YGh8Zv3u9N7xaW35Y2jwYffrfF98XeP1ddzlduvX9Pj4cOB24PPp9HJd517mV938 +7vlofWbPXu5e32Fq+1tnd1lo4Ptr6ubve+vu6fn9+H3i+GPreXB87mb++/ni//zp713ha2R5 +aGvtfHxj9u5c2mXZbdj9cNpl7mLk9Wj+4llzfWnaad9efmXrZm1/W+Zt6/b3X+3vcHp+9vHf +e2948nlpdWfkW+J37OfudW3peN3tXt7j32BPzW7ezu7O32/tc2V3SV1jSmNWXUvs4O3S5NNj +VmRYVeNy9Nzo19vU2N3U6+7OafT4S9dX9t1qX/d8dPlmYV9eVf5cZWJcfWFj5W395Pv97+fb +6/v55eLe2tba2M3i6cvVdO3PXHpgRj86OjpGTF5u7dnXysPBvsPN22xXT0tNT1Vdb+fb1s/M +zMrOxc3Ozd3Q3+NnTjw0MC4xN0JR5NDGvLmzsrS6yPRIPTo2OTo/SlPlyr25uLi8v8PL0dvk +4+Pb62ZPPDAtKiwyPlbXxr24tbSys7vGaUA4NDQ2O0FOZtzJu7SwsLW7yM3lcW9ibPzucVk/ +NC0qKS04U8+8uLWzs7Ozt8HxQzYwMTQ8SFR918i+uba4u8LM193f3+bg0MfDyeU+KyQhISg1 +cbqvrK2tr7O4wvFANC0sNET2ysbHycjEwsPIz93o7tzMycjIxsG8w+09IxsZGyZTraKeoqmw +vMlfOSslJTBkt6inr9JANDY/VN/Kvrm1uL7P5OTXy8PCyNBSOSobGBslXaadnJ+ux145LSon +LEy6p6KnuVAuJyowRsq0q6mtudZMRVzQxcjRzsKzrcEsFA0QH76blpuir7/MOyIaGyyznJul +5DMwNzUxNkW5pKGpxj88asrC1ExH5Lisqa1LIBUOFSjCn5ean6TIOSUaGirRo5qgtEkwMDMv +LT++qaOryFJKa8zJ6W9qesq4r6urfioaDQ8jxZ6Vm6Wp1TQkGho0r5yYpO0vJy08OTjxr6ur +xUhP68K8v+dwY1nlwbewqrM0HxAMHPKjmZioqrsvIRwcOqabmqVLKiYpP1NXzrCvutk9UM23 +r7PMRTk1RMesp6qt0CgYDQ8orJuWm6mzOh4ZHS+pmJqj3ikiJDBWx7murclGPEXIsK2xxD0t +MEe9qaWmrMI/Hw4KFWGck5ais14iGRsrsJiZpNMtJSMoSb+sqLD5NDBCva2orME8KSpJuqqm +qKmz5ioYDAshpJWUnLdkMx0ZJmehmJ67PCkjJz/Eq6e8SDEuSbWrp6i9PiglObyuqqenq8NH +KRcNDCudk5eizkc2HhwsxJ6ZpXAwKict6rWprFYuLTbPq6enre0uIydTrKWlqK+9fEAuHA0M +LZqVmqhqSkAfGy6/n5mmUDQsKC/ZtqqxOSowV7OmqKy4RCgjL72lpKuwudBxSS8aDQ9fmZic +rFVGMxscObKdmqpGNComM8irqcMrKEHEraerr8QwISdYqp+mtr3ISFTNOyobDhyrnp6hyzVP +LB4qz6ianMUuKSYr1LK1tVEzVMvCr7C+3zwsNc2vqK7I2dBXW7jCOB8QEUOhnZ2rU0c5Hx9D +rp2arDUmJSdLtrazzj1T1uS+srzGdjc43bqytMjYzGVSrqxIKxQLHqmenJ/XO1QnGiy7oZid +TSMnJjS7s7ayyUlBQvOxrLnoSkFa08vIxcXI10vKpbctGw4RRZ2do6p/QDkhHT6onZyrNCMo +L0nGtLKxwToxTryztL7a1dlORF/Kt7TJb7uqwCweFRAlrp+fpck5OyskN7iooaXPLSkuOdy0 +tLa7QjFKxrautMvW70E+WdO5sLzNu7b7Kh0XEyatnp+lzTM4MSo7xK+mpL0xKysu27Kvr8E8 +MkXpuqyuusP5OzU/4rOss7e6zjMjHRAXvqCenq8vL0EtNdnNu6KkXzAuKDS7rrS2zT0/VV/E +rKuxvkUuNEbyvrGztMUyJly7KBchPM2lp8tj2lVS00k437W/0947LWavu8rTU27F907Btb/E +w9plXEg/XNfX1uRSVM/Ju7gzGhwkL9evrKipwEE1LzBIxrSvtddGQ1D/z8C6t7jTSUBEYMe+ +vsHQW0k/PEBM4M3o9W5STEpGSti6veZJPDMwOEFgu6+2wNZPP0NSctXAubzI401IWvTY1exx +2s3W2Nrn5+bf51ZGRD9CWNjFwMlkQDo9R1TlzMbH1l5OXODW33RfT1T229bW3vt3ZV5s6dbL +ytXzWVvj09prSURT7tDIx8/vTj06QWHSwr/J61RKSlN529ngc2Vw6tvT0eZfWl9fbeTc4uz1 +8tvZfU9CPURk0cW/xtthSD0+S/rFubnC02NHQEVV9NbNyczkWU1MU2js29Xd7XdaT1Nj6tXS +411KQkZc08G9wNZOPjs/T/DJvr/N+VVNTl16993Oy83Q61lUYGZr7OPo6XtVT1vy19LhWktG +R1nt08rM311OSUVIZdTFwsrgXlJZ7NXW2+X9euzsePvt9W5t9+bc5HFgW1xfZWpmX11dZezd +3OZ7bGVhXmVlcOfc2Nv8Xl5v7uDZ3Pt3cvve2tzobV5bXm546+V9fOzqeGtfWl984t7e521k +Yl9eYW5++Pt3feni497h73FlX2j9+u/e3ebufGVudHTz7Ozr6Pjs5uxpXV5gdfHr5+r6alxY +XGvq3+P8amZm+ufq6u3+bHPs397e3/ZpZmNkanJ4/e/s/m9qZGBue29y+e97dvr38PHx7/jv +5ebz/Pj17OnueGJjY2j07Ovt+21oZWVtbnBwbXn6+nZv/PTv7+/u/m9sa3B+9ujj6e3w/3Js +b3v08u/xaGNxe2568urw+Hdud/nr7P74em5uZm735+zuc2RmZV9eX2D/6/x67Of689zb3+Ln +5OZrYHP/9fb2/Hh5+XhlZfrwcG/v7fd/cmxiY3Xsem9qfuzx9vv/bfFwcOjpfHH359/r8OXv +6P5q9t/m9vrt4X1z/fVxX2JnX2z7cP5jXFdfWVtkeOfl5uzwfOHY19jb2eHp6+3l5HNmbF9X +X2hgbn77+Ovx7O7+/vbq6fR+b3V6fXB7/Gr6fm549nZ6+Hv673lk6uRlZv17c+99fPh2cHX0 +8vvu7erv9/z49Pfs9Xv6f/ttdPZ/+v9zZWpqdPj76O97d3F4+n707PT7fnXz6/jr7+zvdm5r +dnn48u3+b2xmZG33+fNvcW739W9xefl9cfZ+7+ju8/Ht//p++u7s7+7v+/T18vR593ltcmt8 +dWxsamxuanB4d2tt/35+8/B7c29re+zm4eT48/X69errd/x8dn/9+fDs+W5oZWNlbm33e25+ +e/1+8/jy8PT5fHV+fnX5e3zv8+38fnJvcm5sZG5ycHdxeuXx7+nu6unq7ejo5Ovh19vf3+xu +X1NLREZHSU5VZvjf3NXT1tba29zf5Ovy7fLn28/JyMnLyMbIzdldRj44KycrMj1P4b2tq661 +v9BfPTMyOEZc8cq4srS8z2pQSD09SfjNxcTAvMHReu3V1/nlwr7HWzkvJSAqLC1IzrClqa2q +tc5ILSwzNDtW0bOsrrO70ls+NDc+U9zJv7q6xddrXPTg7NzNx8LKUT40JR8rLjdnx62kqK2u +wWU3KSsyNT/1vaysr7fE9EEzNTtH3M2/uLi9zGZlfWLp4NzMxb++0GI8LyAbKS40dr6pn6Ww +rb9ONCYpMzI+yrOoqK+1vk82Ly46Rl/Kt7Kzu8ziV0NDTVrs1sC5urq71TstHhsnKy3ytKWf +p66qvkUwKC0zMD7Ita2ttLjLRjcwMj9J+MK2sra+xttYSkBOXnDUwb++vsTMTkw9KyEgLjg9 +9bKnqLK+vd45LzQ/SEfuvLS3ur/L5UM8RVhnacy5t7/O0dBjRkdfc1ho0sPK8c3NXFpd4843 +HiM7KitEuqSszriu3jgyTsxbR8evt7/AvcRaRFN2UU1r0MnV0sC/3E5ERz86QebGzsnG3llH +Wuxy3MXC/Uo2Ki4wMUhrvrS7x8/kWkpL2MPBu7i7xmxm8Vhtct/X33Xfz83IzsXKX0VKPj5F +Q9HPTnXYbHBNTuJKOn7d38ZVSUY8NzZP32bcu8nFyNS6vMzBwtrkbOrS6uvN2dvPX39uT3Bi +VFpTUFFZbXZ81OBabGVSRUJZXE/+zN3v6ks9MjA/WH3CubS0vcnSfF37etfQzsfTz8vJ0elZ +SFRPRX3Wyszc2l1RTD5ATUtNVG1n9M3Lv8rV20MxNjUyM0PEury6tsRuTUxeV3DHub7Ev77J +823e0m1adWVUWWbez9Tx73lOPjk8SlRayr/O4OZeYl1GUVg+QGhMPEvVw8zd2tJVQEfsyMK9 +uLPE1dJvS01+2NTbzcXSc3zn815TaF5OWU5KWWdpXeB7T01lUUhlTE5XVVxYZ2FrTUdJSF3i +3Ma8u73HwMTS+8/I4tXLydPi0c/vbV9UVExLXFxU/O5dTEdESkRK1dHj4PTlU0Fc31FR2GRb +TzxDS0Nzvb+7uMra3m/q08/Dws7Q197T1c/L1mZOUFBHUtfPb1lgVEE8UeFm6OZm30hAWlV3 +1m50YEA9RF3c5dTS3O9NYdDHwsS/wN1adPXXycS8wetfWVFdZ23OyN9+XlJYRkF4205RYUxR +Tl/ZX9fmSVdHP09zZ1JTS1h+TWrQ0s3LycXAysvGy83X3eFp+9jUyszN0ef1XU1KTVZ5X1vg +8kRIZltNTd52UD9L4dxfQ2NJMzpMXunky7a82dLJy8/ezb/MztHfzeZnzdHezdDg9V1ZZGFt ++lpLVfFXQ+rSTlRPS1ROTm0/N0s8N0dc5OvnxcHN0s/QyM7VwsfOycrIys/Pytbo39bM2dnO +9GlrUUlSREVeTnlUSldnTUs9Kj89LzzowsLL3LvGT0/hytTWv7rEzMnBxdv41dv9YN3I0sXC +xMx3V11GNU//Tk1r2drQzyofUiwiSMm2scrNrNo1YV9gUE6+utjPvbrEZezD/Eda4Mfa5bm1 +w8/X1F89SHpST9zHvjkcJzwoKE2zqa/UurBmNTx22FtfxL3fTujBz1BwvsT8XuLN6FzbwMPK +w8PQ615t0t5PYt06IB4sMC5Iuaels8C2zTozOlFtXtm5tcNZSlxLQ1rpzsLTy7zH09Dk7Nlg +XMnMzr3Gvb1SOi0nIiIsOma8rauttM57SjY2PlnTx727vsbaTj1KT0rmyr+7v8nK21daWmHf +1tHGwszGvOE1LS8oJicx47u5samuv3tBPj05P9m9ubvCwc5KNz5eWWXOu7bA4/LaXEthzb/J +5M/Axs7OQzc5KCMlKkS+v7WkqbXKRzw/NjRiwbqzusvOYTowNFLp7MCysr3fVPbwSVDavrvP +48e9x9xbPy4nHx8xRHu2qaaosW5KOS0xQG29srm4uGFLRzU2T9jPu7q6vOJQV1xTbdvDvMnU +xb++xEgzLyYcHS9YwrKpoqK0Rjo2Ly40X7Stt7i6zmo9MThe2NHBubG52FdYXE1N+8m+xdXF +u8LPcDUtJxsaLUpwsKagnq1NQjwsKzFJt6y2trS7zUYwM01OTdu7sLTM5c5/RUJP0cPa3b+6 +v8DIPysnGxopOE+zpqGep9ZaPSsqLTjNs7awrbe93Tc0OTxDV9G1rrjCx9N+SkBO5djh2L+3 +ubzKOCsiGBwqLkivpZ2bp7rBQionJy1Ie9iyqqqque1SRTIuND7nwLuyra+5zldMTT07T93F +uLa65T0pGx8nIy72uaWepaemtNtLLikrKSg0W7+pqKyoqrvrPC42OTNDzry0tsO/wl5IQj5M +UExZXlZnVkBIW05OVUxU3+Hgxb6+vsx0UklIUVpt2MzHxc3Z52tdUk9aanPt5N7X4nP1enTn +e2p1aVxhau7SzcvL2XxVR0hVU05dWEtKRUVbfXDh1tXLz+HW2N3R0dLP1+Tm/lpjXlVofN7U +297vaWRrbfrXzs7LzuNmSj9JTz47QkNJW2H1y8PJzNLe2+lfZmVk6uhmYm/24urz29bbzcvb +1c53TlDs0eLawb7Ey87M1WlCLCQxPiooQc26r7Czrq2z5z4+PDMxLzJQy8nFvLKtsMHc6vpQ +PDlDWvTp0ruytLzDwsPRYkc7NiwhIS87Mj3Lsayrq661u8VSNS8xMzEyQsm3tbOxrq+931hI +Pjs4OkZm1sa8tbO4wcrK0lE7NzQpIChHSzhMtqqssrCutsfcTjYvMjgzMUfDu8O/tK+4y+f0 +V0I9P0RL/M3Hv7WutMLCu8o+MDMtIB0qSEE536ukqq+sqrpoTD8vKCo4PjpNu62xuravtNBU +UU0/Oj5KUlrcwry6uLm9wcXaSDcyKyAfK0JDPX+toaWtrKu13z82LigpM0BHab2tq7O7uLnP +SkBGRjw8T+/8/cm4t77Ewb6+z0s3MCkhISw4OT7Rq6KkqaqsuHE6MSwmJi5GdNS7rKitt7u9 +00s8PT88PE3r4+rNurO5xsi/v8xTOS8nHyErNTg92qyfoaiqq7TeOy8rJiUsP2/Uv6+nqLG9 +v8pdPTg5OTtGYfxx2byytL7Nyr/A2k06LSQgJzM3NUDAp5+jqauuvVg5MSokJS9N2c7Cr6io +ssjW3Fc9NzY5QVTq2tbGt6+yvcnIw8TQVzcpIiEnMTc4R8SqoaOpr7nFYzwvKCMnN3fKyb6u +pqevxvlgTzw0NDpDVPDNw7y3tba8yuDk3ORdPi4kHyU2SEM+c66goKiyvcl9RTQqIyQwar68 +vLGopazCUkdDOjc7QUZKdMG3ub2/vb3J4/x4X11RPiwfHi1QXD5BvqOfpa66yWVAOTEpJSpI +uq6yt6+qqrhVNjI0OUBKTVTjvLG1w9rUxMTYXlhl6+ZpQCsfHy9YVz9Lt6Kgp6+850E4OTQr +Ji7Vraqvt7Swt9g+LywyRuTX7d7AtbS9311l7dzX2u3i08zcTTEhHSY+Y1ZYwKihpq28VzYw +NTkwLDjNraaorrnO/nNKMCgrRcK5vsC/wcbM6kY7RNW/wszEuLfA20UnGRkpTlVKyamfoqaq +yy8mLTgzLDXes6mioq5jOj9INCorOeK2rK2829zPbj86RfzKvLW2u727wWk3JxsXID/ZzLWn +oqWprtcrICQrMT7auK6noaW2VzYuLjI7RVHMsKqvwOxLOzc9THLZyLuzsLa/ydhQNysiGxwu +3rqroaStsrjnMiclJStNu6+sqamuvO09LSktOXa8s7a6u8LqTD0zN1XEuru8v8LBv8TYakQ1 +MC8nHydG1LCgpLS/zUo4MismLFS3qaGjrr/jPjMxLi463rWurbbWWVFIPj5ATtS8tre9ytvX +0NbncVREODEoHypA5a2jq7vKTDU3NS0vR8OtoKCrv1AxLTE0OU/RvK6qr8VOOTQ6S1/73cy9 +ub3I4F5Z88zO5X1eRz0wHx8yRruiprjMSjY8QDc5W8OvpKSx1z8tKzREbMW5trK0y04/NTE/ +b+DFvsbIxsvW2XZUVWn53cvAv9ZKNiEaJzjjp6Suttc/PD06OEnZvq6or8dVNDA/asu7u83b +5WNSTEtMTe/JycveX3bn383P4/X24tHDvcHTSTIrHhwtP7ygoqmxVTExLzJG2r6wq6y11EQ0 +MzxQ2MC+xsvO0eVWXFtNW15MTVXyxru3ucf8VEpO7s3CxN5YPS8lHSQ31qSepbFLKCguPsm1 +sq2us7v2Oi0tOPK2rq+72U1ER0NOY13d409JTmnJuLO40UQ4OELnwbq4vM5YRj0pHB4tW6ec +n6xdKScxSsa0t7y5vc1mPzY8ZsGxsr/uPzpEWOTW4uv9bllGP0T9u6+yxEs1MDztuq+vutNT +OS4sKCIr/rajn6/mNScrRcy0rbW/yupoT0VHWNG9ur3RT0FATvHY0GFHSU9h9W7bxMPI9EA6 +OkbOubS5ylZEQEVX+dLKy0EoKi08uKussM89OUBP08LKyMfOz/9KSFjVvrvJXj85P17OvLzL +Sjg5PEnWv7u6v9ZgRz5L+Mu8uLvFTTUsHh431aedpr4/KSg5a8y6vcG7v8rtSD5J2cC6vexD +Oz9qxbzA3kY3NjtM0762tcL+QTY2P2vIv7/I3V9XWldjeGnx3eTTy9VwNiUoMV2up6u130FA +TVPpz8u+vsx2ST9HYtzHx95oUE1RYOxoTv7P29ZbP0hf2L68yNbpdu/5X2b80cDFUikeJz22 +o6i8TDI1W8jHyNnaxMvZVj5J78C6wOtCPD5P1cjFxc3jeU89ODxlvbS52UM6PlvLwMbbX1VP +TVVj3cbBzOxLPkpv2thMLi5A7rSttsduR0pk99/P0MzTZ01MWN/GyORaSElj3tTT4GddSUBO +WPDN2tPG0/ppUFTn3tLI1dzjc+HyPzQ0LjzJu7S521BRSkv3eta/wMLPV0ZLY9fDzXhURUpa +b9/OyMvRXj87QWXIvcLTbktISU1r2MrFxtxYSkRKV2vZz8/M0v5bTkhV/OXP0uNiUF3o9EZI +XPbGx9fvX2TTx9PmYExOVFl32s7IzelbTUdMW2vXzczM3VhAOD5WeMnAy9PqanHz7tbLzcjR ++efU2FI+QUA3P1Zc08nNyMTfbmRITm581dDa3dzY19tsVkxMaN7U0Nr8X19YW2pcYGFw39bZ +eFtUW/3Zzc7V4vp2aGp69+z3enRub+3d2tThY1RLS1///e1qVWNxX21scdzO0+ZoVVlqc/p+ +b+rZz8vUfFBHTu3OysjO3n1tfOro5Ofx9+3azs5UPTYrNVtpzsXJv7vZXVlGVulkcerexsHO +2+hmZ1hFSFbsy8fR3+TzW09NTV7v4t3Z1NnvV0tMVfvZ19rk73pjYG/h2dvuYVhceOj3fe/4 +dF1fYmdxfPD7em1obmps5Nfe7PBybW1lYmBv4dXT1t7ne2BjZ3Po4uDf5N3Q1tnW7Ug4MjhG +Tlzy0sG9xtPrdfhuUU1SadfP0s/W295tXlxYYGhr897c3+Df3+9dWFhXYXBx+v7//nf35tna +6XdeV1to++7m3t/p6PtoZFpXXF9bXGX1297q8G9s/Xt28uvf2Nvf3+z68O3o5u/5e3d7/+zp +49/g8mdjY2r14dzV7VlaVkxKS0tSVVFbaPvY09fR2NrV4Ozp7+jn8nl3bXD5cmZ65NfQ1Nrn +9Hx2cW/37vZrXl9fZGFbYHfl4erw6eDk7XNgW1hcZV1bXF5qemxpavzk3NXQ09nf6fLv6+Pn +c3r1enNzd/js7+95ampqevLx6/Jya25oZ2tq9ud9YW71bFxXVVRaXmNoc+Lc4+Dd29rZ3+38 +9Ofl5Ort6e3o5uTe3uXs7Xl0cWFgZm5/+/37cGpzb2psdXf07XZeWmddT1RUT1FSV1teeejr +597n5uXf3NvW0tXc3uDj6e30b3D67+nh3tze7O7z/3JtZ2pw/+/y7+72fnFrYVhbYFRRWFRP +T09UW23w7/Tn4+bn4N7g4tzd5uPf3dvc4OPo8fh3e/Lp5ufv+vx0+/t2/3r89X5sbf13Z2Jd +XV1fX2FkZl1cXVtbXmNqce3e5enl5OTr7eri3N7l4t7Z19/t9///cGxxfX58/nVvcHX99/p1 +dPX5/n5+bG92Z2BeYV5gY2BhYWJmYmdocvvq3+Xm39/h3dve3Nze5u7n5+vv9/z8fnx3bmNg +ZWxqaXj6+X95dGxkaWxqbGtsbmhkcXBsc/b48O75e3P29u/r6urn6vX36N3f3Nne6Orx/nh8 +dnt9e3p4dHV4a2lu/Xh6/np3ampnY2Voa21vbGtnZ2dodHVwb2tsd+7l4Obv6ero4uLv8eno +5efk5Ofq7fJ9b2pqa2xuaWp1bnd2dP32/m9obHh9eGxnZGZpbWxqcvXw7fVzeX718nxydXL7 +8PTp4+Pm7ex/cXp+d3358e7v5uru/v7vfG1xbmltcGpkaW169vrw7/p+dm9iW11nb2xud/51 +dH199vfz7X1zb3B49e/p4eLi39/f5d/i7Pj7+3hvbHd1amt4dmdoamBNWNlsb93t8PBtbHht +avvy7Ot8evT38e3rd3r+9Xtv8+x1cfNuevPw/ffvfev7cXFx8P3v6nz77XT3+Xz5+3ZdcPn3 +63lwd3BveP55aW15fmdv9Gzmenb4b+Zu/PXp5Pnl+HPtfm54d2h7/m17ZnH/deH36uPu6vTj +8On7731tfmrsZux0/etj9G1gam5ta2fybW5392xvfGzu/u91f/b/5n7472/h+fn0/vN56vdq +41rk6Hjo+fP37nT8ZltnX2NtaWt7bv7dcPF57H9v7+zhdc9f53N96mH9X2tmbXjubN9p3/p5 +5vrjbOZm6WjrZvB+fV3tav/vdtle3HP942HvZ23uYtxp89xd53lq6VrvX3Fp92nobe5f517i +eeRj4/Rp5/nv53nw5Wnf72ffYn3491Hu72/Uftne591aZ2tZRlpdTuB03tfZ2tfjbelkZn1e +Vvpe+fBj3mzaYuL56eVe8WRvdvrx8W7nc+z1eOpj4F335WL/7GFk8/Jv7O9m2XJc3+Rd6mhU +5/xn4nB55Hlz5Pdm4F9b4G9361r65V5+f+nu/mR93nDpZFjf+mDsZ+vk7Wrm3eDtXv56/m1m +XOrm9e/p8+h4YHNlZ3VqanhnffNra+Pw8f1memxw63785n9m+Hf87frz3t7j3+715+vq5n7z +/W93amNbW1NLT0xOYmXu/d/Y3NPe4t7r7efq4+Hd3tnZ29Xd2c/O0dPV1PFOQDgwLi4xOkzx +yLizsbK5wtlcTUM/QUdV99HHw8XK0OJtY1ZYbnDr6NzY297d3+LX2+H67uvn1ug0JSswN1NZ +Vr+wrqyyzXtgTEc9NTlPzb26v8jLzdlpTkdMbt3Z297f1M3Q4uzez8vQ71hDLiYpMz95xr2x +rK61y0c3NDM3P07cvbSzuMXtUUY/PkJez720uL7PX0pBPUFV3MW8u8LHxcPKWjEfHCY2TMi+ +uamkqbVNLCkvP2bs48CxrKy5Zjw1Nzs7Q3a/srK70VhHRkNBSmfWwLm8vru4vlwvHhokOv66 +trKnoqq/OSYnL0fi3tK7r6yzbDQyOU18V0zevLi73E1UetjiWVFp0sLG1NHAt7K/QyodGidD +br6xrKOjslstJCk0R2vPuq2qrsVEMzpGUF5c/r+1vt1VTWvZfktDSnDQysfBubKyuNc8LyUZ +GzNiuaiqqKOsfS8iIi5rvrezra633TMqOExfzcnHtrf3RkhS289dQ0Rd4vDv17yvrrjF2V9L +PyYUGmi4sau3r6CsOiQgJ1O5vsO2rrPLOyw0T+DWzsS7vfNESeTN13hcX/JdQEPftausutLe +9VxEODQfFjewy7y0uaWlPyQoLEa+ztOyq7LZPTRJ4mNW4r22xko5RtLPa/bTzt1HNj7SurKv +s77SXkJITT4/LBozrWZVuLaopjojNURHbFHXrarATEhN12U0PMe0vm9JXcfHRjtixM9KO0HL +t8LDtbG+WEJS1r7KQCgaLMc3NL6poKVGK0M/LjJBwquvzeLD2kg3NFO9u8vKvsJ1QjpB9Nde +XNfVz9Ns1cndaVp2zsK9sq+9RB4VIDk666idnalAKy8pIypHrZ+msrm/TS0kKmK6trazsr1I +LzRFUW/Zz76730lLZ+DnZ3DLvsHL1MvFTiYeLFdc3bWqqrw/ND44LDTVraeuv8PJQiwrN+a7 +vb+3ufE7OUhRTk7ivbrOWFnw+FtR7sXG09rTz9jYxMg5KTRFOTNHxbC00/fWTzUyR8G1vMXD +wuI8NkPfyc/Lu7rmRkJCTmRi3L++01JDRE1OTeDDzON0dtXWaOjHwcp+VmJdMyY20dvZwsK9 +zD45TVxqy725u9ZLTFpOSVHgv7vE2Hp+Y0I+TFh+2d/q3eRlWF3kztRxVWTXdFvWx87nXltb +T0xk0dHq7tTJznU6KzluSU3FuLS9VUZaS0FayLu6xd/k8Uo+Q2DSysrKzN1TRktf7+ff1s/j +VUxNUlBSa9vS32thbHh/elNK6Mt3Z9DK0WJHVdbcbt7JxNhectvPz/VlYzs3SkxRzsjLxNxR +Uko/RmnOxMPL3O1bSktk1MnM1N95Y1hQV2/ezcnaVkVGSlB72M3FyvNVT1VeX2vUyNDqXlhd +Xm/czsfJ32ZRSk1g5NbU419IPj9CTO/Nwb3B0mZLRUtb5Mi/wsrpU01NUGb79drb7uLtXVxc +WXDse3f659bc8u7c2PhDRG559tbazsp2TEtNU2vx2c3M1GxVUlBNUtjIXnDF71TZ4mTT1WT1 +3v5mX2FgXl5ueGZy7evf2eP5bV1bWVZj9eDa3/R1amdve/Lo3NbX3nhZUlZi++Tl6eb7YWN6 +4uDr6t/rY1tXWWv16t/W3WlVU1RWXG/k2Nbb7nb3fGVu/fDq5u1//ez3aGx1bG14bXL06+73 +f3drZG1vZml8/Xr97ujqeWl35t/b1tjX2/VhXVxYXWRoZGRgWV1qd/3s397j4+HsfmtlaW1z +7+bh3Nvj59/d4u79bV9UUVVca/1+cvp4Y19fXnLj2tjY3ep8YV9qdvPj3uft7vf+/vj+enlp +ZGVoaGl4+fv19n12bGh0+e/m4ebk6flvb3N5cWt88+39c2977O/9+vZ9e3Bna2t5/Hf47ut4 +Y2RkanBubnV8e/nu5uL0+355dnd9+eXf5OLe5nFlYWRz/e/v8vpvY15gZXL28enueGJfav7u +fPnu8/T47+rt6ePn6+72dG5sb2xnZWFjX2VxbWz+5uHg4eHl7+/z9/n4dHNxb/7+8O/3/vr7 +d3VrZ21sb25naGNnYGBx+vDv5uPm5uLg5Ofp7vH57vJycWlqaWpyamlpbu7k5Op+bGljYmVl +andycvfp6u/1fXb26ezs5enwfnFwaG96bW98//Z8Z2V47+fo7vT+eW1wc3vr5/T7fvv7/W9z +fHX4+f5ydnZvc3n7dGp0/XV47fJxZ19jaXX//+vk5OXf4Obtd2pnb338fHl7/v7++Pf68+zr ++f3zeWVlaGhoaW78fHR4/vP17e3o6urr6uvv/nl5dW5taWdtbmpqd/91cHZ4/n769uvq6eXs +eHR8/fP9/u/u+vp7cv/u7n/0fG1zbXF6//n19fb1c2dqcWtncvv4ffX3ffbw9f5+fvfu6+z0 ++XVy+n96fP949O7y7Orq9ndtaHV4b3RyfPbz+PPx7fl8+fv7fvduYmhtb3N2//Hp7Pj3+HRq +amv++/v0bWh19XtvePXx9f58+One4uzu7Obw9/x2eGxpZmVt++z+/3l6en3+dXR0dm1yZmL7 +8+3p6uv0/fn3dvvueu/k7+rxbmpoaG5qZ2Rmc2x+7+/l6en4d/d68vb+9fZzb3t+8PN8enbz +7f74+vP7eGhdYWlocOLo5+3x/m7v+vLt/vp5eXnw6Pn38HZpbF9gbmNn+P1tbfL66Oj//e3t +6On9fPP48m9u8/90+en0+PHu7XlobnRuZ2ZobGxzb2xxamhta3Hv+33s4Ojy4Oft5+rk6O5/ +bHH29HR89m9vc2Vxcv9+emtlZGNpcHt5ffp3ceztbnP6/XJyfO7w4erz7nzu8u7vfPj5+Ovp +9PL7cv7++nxlYGJrcmpeYmlteW9v++r67+348Pf2d2/47vHl6efm9vDx8uv1dGdudGhtbW5u +bG51dG/8fH3v8Ozo7u7r+Pn38Hpw8vv8/37993NjX2Flb3T583747X92++vs9vxyb/br6ePo +8Ofk/GVkcW5tfPlvaWh5dGT/8H57efnx+H9z9+3m3+fj73P//2pnbW/78251cXfx7Xpq/O9+ +b21ia3Fpbfru7Ov6fe3e3er0ff75ZWPx7nxxbXf+dHD1eHH88O1pX//n6uji+2nf3fh6XGDy +b1lZXFxpbG1+69zaem7f297mdvji6u94bXv4cePfY17+fGRhZvZ0Xmv15Odyfvh26PVv6PBt +dn1t+H1p8eR7cGVadenv/n599u/3fvfq3t/w9/Z1d+jo+2VecnNob29faP7t7m746O37W1vj +7f3k79/b+0tIWubLzdnfVEvp7NrM0+3yaEtWfe/e52NZV1Rd7ene3P1sYW/z7Ofv7fV9/Oje +297pdm5sbP7s+G9xY11gbn92bG96bmltbnRvU1bLzfbxaHPc32Xy3PTi9Vpm6+bg4Pb9fWRl +Z2xkVOHM3XhaV2rofnLj5fpeUlv33eXua11sZ2/s+Ofe62566evb4HllZvvxfWzv3uR2YGXn +2Plvd2J7725xempqaFhWX2pv/Xz97vLz7ezv6url6O38eXlxe97kVmD+bertbP7Y3t3ceWtp +Y2D57fvvc2JiZV9o8ubra2lkafLf5PbrbXjzZXXc3eTf915aV1d77f3v4e5uaGX+4t7ramRh +/e7r5eXpc2x1/e3o7P5vamdxbn3qaWloYvLm8/vteW3x9eve6ftya2Jhe+rr9X9mXmjy6Xlt +aGF3fmpq9uv2+WVm4Obr0tP8Y1pT995obt3f8XVYWOba5PxwZm3xeWz+d3J6Z1lba2n84uVv +6tt2Y3jueu33ct3g8ejq93Z9cP7u6e90Zl5fZGdlY29wcH7w5vXv4OxydG723WxWYXNx89/f +39t8Xnbv9e3lbWdzcX7n7Xzv7XNpZ2ZkXl5k7exvbWdYZN3a4eLw89/a3+Lk+P3u8WpfZmNg +Z19ebOzk3+Dk3NvleU5BSFvrz83mZWhaVv/X29vZelxaWmLl2Nrf9WFbaPnl19PY4W5WUU9i +3tbZ715ZY29s++Hf3t/oe29dWGtvXmd6fPjq7Xb/6d/Y09/072lNRUlPdszG0m5WTlT26OTU +0dnnb1ZRa9fNztpnUVBYbenc3eduXVVXd+na199+ZmRbXG3kz8zXblVRU2Xu7n35dnnl3uTf +19re4PlaRzs8Se/EvcToVEpNd9rX2tXW6l5PSk540svN4FxTWHLj29rd3/BcTU1a6NHN319X +WFxmdvfk09Dde1VMUF3739nc4ub7dHL03tjV2GZBO0JT3cG+zW9TTUxad+jVzM7fZU9LU3fX +zdHjbV1Yaunf3d3m92RVVFr13N/l+GpeWVte+dvV0N13WUxOXvfd0dDS1+V3aXbo3Nvi/l5P +TlFSWPnY1uR1V01QYe3f3Njc5vVyYV302tLV3/1eXF9w7+Pf4elvXFVd6uDZ2u5gVV5u+NzU +2eLvdltSUVhs39nkdGVhZHjq6e3weHfv53lXWGP46vPy+/fx5N/vbGzr6PLuemdy6dzc5O18 +cHl1bWRi/u30cWdeZnh1bmBfbO7o6v5t/npv//v759zV1+J0X15pffLr7vb8fXd0bWz25eHo +/nZuZ3jo+mJfb3ZzY2Fs+eXc3u1tZWZr8ujq8HdrbmZfb/Pk3t7tcWpx7+Tn7/f88fZ3bG55 ++/v2/2xqaGlubW10eP7x8PVzaWZt9+73+O/p5ufk6Ozp6PJ5ZVhVZuXvYF3p1tvmc1JGSW7a +1978X1/02tve5Ojj5OXq9vv08Gtpb1xVXGxu9N7jem75fGZjfung3+prWVtgb//48/l/fHdw +d+vh6O/5cm/29Gdifejt9W9daOjVzdHtVkxSYfri5e/27+bh5ebp5efqb15191FJWGhm9Nfd +e2x+dV5t5ubr+2VXWHDu5dzV3fF2Xl565N7jeVRZ2MTOT0pu39jU7Vlk3N5mTUhY08TOaUtI +XtPJzupqavPqbFRNT3Tb+2nw4Ot8e1pQ8tDd5/BcWPDe7+fh/Gz8/GJhVkzpxsjXbVpf89ze +7PHd2eBYPz5exr/LZ0hN8dPT09ZfOTZKYMu5wHVMS0xm19rMydpPRkxezr/D21tJS1/k6U5O +yc176mN5y81v89n4/fxMP0JO4MbM6fzq6eza6UM3P2+/uctiTVJXcNri287cZVpQTd7J2Nn8 +UE5cWFlPaM3LyNX05+x+593v0cvc70A2RuTEwupp73pfWk02N+PExMR4T1lXTGPPz8vK41Na +7d3p4snW2mtHR0o+WM/JvcbjW1FZ1srP1eZ1Z31YS09Sb8vK2d9KLipE2s+0u87TTjg9Zc27 +usjgaU1EWMS97tDRQ0c5ONTQ58TEystsP1HcyLvNZHNYWGH82dl36NtHLCM2wMa5vc7Bzz0x +QGC+r7vReEtER1rCs81HSENFR0/PurjC2VxLTV/jyby6wmpLWUlLa2lqQzIsL0zYvbS5v89U +PDpBXMm7vMTMZ0FHTV7g3s3J3nNeXdzIx8TOd2l5/OHHyXjrxc86MjorKjtL2K6uu7vQPDc6 +OE3DvLu4x15LPzpL3d3aztLRzvNu2dzYz97fzsfGy9Tex79UMDArIipC67ysrK+xzT44NTVI +18q+tr3U/EQ6QUBDbd3Pwb/Jyczh5+rozsTFyM3Nv7rcMy0lHic4PtCuqqinuUw8Mi44R07N +s7Czt89HPjw6QU9a1b26vMHaaP3qfuvNx8jJycbHbTssIR8oMkrBsa6qqbC/8jovMzg8Tv3a +v7W3u8DYUUpFPkVW+Mq7ur3F2fPRwsLK035OQTo3LioqLjlbyL24tLO1trnLXEU5NDlASVvk +zb61trvF709JR0xTWFZl2sm9tbS4vMHcSjw2LSclKC9Fzby3s7S2t7i8ws1ePDQvLjRAWdu/ +uLWytbzE1GNOST8+RE/wxrq2tLS4wNhMNCkiHyEnNmC+r6ytr7GztLS60k03LCkpLDVNzrqv +ra6vtbzC0mBHOzU1PE/Qu7Kvs7nMTDUsJiQnLDVK28C3sa+urq6wtL7sQjIrKSksNEffvrOt +ra6wtr3L7U4+OTk+Te7Lv77CzG1BNy8uLzM4RVzmy7+9ubOwr7O7z1E7Mi4vMjpHZtXDu7e1 +tLW3vcjjU0dDQklWa+HP1vlgSz45NjU3Oj5GU/DMvreyr6+zuspaPzg0Njo/Rk9q3szCvLi2 +trrC2V9QTE9UW2nw6OzxblJEPjk0MzM3P072yru0sK+xtrzKfUxAOzk6PD5CSVXkyb23tra3 +vMTN7VlNSkpRZOLR09p5SDw2Ly4wMjlGXc+8sq2srbG6yGtGPjw6Ozs7PUFQ6cW6tbK0t7q9 +x9pkUEtHSFB13uv3XD84NjIxNTY5RWXMuK6srK20v9NaQDs3NDQ4PEdr1sa7trOws7m+zfBb +Uk1NU1db4t5qXUU3NDIvMDQ1Pm3DtKyrrK2vusd/PzUxLi40OkBkzL60r6+vsrnB1F1LSEdJ +Tljt0dfyXEY5NjMvLzQ4RuXGua+trKyvu8phPTcyLS0yOEbqxrqwr6+usrvF31RNS0hNVnPS +31plUjs3NC0uMzU/fs6+sK6vra+7wttIOzcvLjQ5Qm/NvLCtr6+yvMPcWE1JSExYcs7QbPNf +OjIzLi0wLzde1sq2r66tr7q+yVpAOTQyNDc9WNLAtq+ura+0vMjdYE1HRUVFSlVSV1xDOz0/ +PTs8P1Bs/NnLyMXJ0M/O0NPT1NXSz8/Q1NzsfV9ZWFheZGRod+zf2t7m7PT2bmtu+Obd2uTt +e2BVTEdFRENCQUNIUGvo3NPNycTExsbIzdXe/W5ybXzv5trSz87P1dvocmhkWVhdWlhbVk1L +SkdFREhNT1Vieenc1tHOz9PQzs/P0tzq7nhsa3Ps39fV0M3Nzs7W6ntfV1dSTUxPUlhfXFxX +VVdWU1RaYGdteu3b2dvb2tfU1djh9HVvcnT38PXu3NjZ2dve8X91bGpjX19fZG344u3u9Phr +Xl1hbGhtfX1ua2dmYV9mamxpaV5ZXGFjaf3v5tzY1dPU1dTW3OPp7urq6erp7/t5al9aXl1b +WVhZW19hZGl19+7m5ufg3+v0+/52dHhwcG5x/nVpZGRnbvbx/PPu6+Li3tzh5eb2+Ptpan35 +eH79fXl0fPft5uXvc3dwZmZlZ2Rrb2ts+vtvcXV5fH19c3F2+u7r6uTt6u55cm9ycHhtdHn0 +7O/t497c2NbZ4vtnXVxfXl5gY2x5+vl9dv57aWVpa33o4fJ/8O37cHJrbXr3fGhocG5naX3u +6ePh5OPd2tzj7vz7/mtkaHZ4/fZwbmRpa2NrcXJoZ213d3X//f18fX/zfXfp4ux1e/tub/Dm +5+7r4t3n7erz/3xxaWdnanX8fHv2dXF2dHd8eWlzc2/w73Zwffz/eH5+dXtxbHNpY3B7fu3n +5OXf3uno4ebt7PZyZ2VdWmZqbHX+cv7s6+/+//37bGl97/v07e369PxzcmlmdfRwbX7t5eLo +7/R8dv3+am19b2dvbm169u3p9HF1/nFrbv/3+/bt8fZ4ffHs6ejvd3J0Zl9u7Ojv6+Hl6O94 +dGxue3dtbWRhZ2hmbH5tc/34+fzs7+rp6t/m7+jq+Xv9+H32f318bGxnY19kb3jr7u/t+nt0 +dW52+3h5bm9vdXt+8O/t9Pb3fXn0/vfn6efp9nn+7/b+eW9nbm9la2xxe/bw8O/y9HNqaXb7 +f3N9cmlsXm9tbXBWXMbjYdrT6+rf5Nn1a3P2ePJubntsbGJqZWprcnp0e+9++/zzc2dpe3Bt +eGFc0dB6X9LieG/nzfJXS8/bS0bCvz9YzUxI+1La11zRzO/edXfO307k3FNbaflndWvubFJZ +ZmNUXVVgc2dhec/W2tbL2t7P083QztHLysXLztB5PzU4Ny4qMT4/Qnu+uby8s7TB4N3TUDxH +cVpLYci/wryvrbK0rq3FRkouIB4eHB8mKEW9s6qfn6Kmrb1KMjIuJi09SlHMtKyrraalrK+w +t9ZDMCIeHxscJi441rSsoqOnpqzOSTosIyctL0XLtq+sqaiqsK+wt76+vd1IPCkiJx8cKDEs +Qr23rKmrqavVVlowJSw5M0HAsrGvrKmtu7awvL+1tsBIRUwjHSceGikuLeW4uKWjrqer2l5Q +Kyo1MTnzw7ivsa2tuLu1ury0t7rESDw3IB8pHRw0NS/Isbaopa2rtGz5RiktOzI61MS9s7Cu +sbu2tsC9s7/HvkE9ViUeNCoZLfkrQK20taisrrBmW+0tK0g5MnbD0L2xsre8t7rOx7q+yLq4 +bExxLiEvKBwrPys9uMK9rK2xtcPH7Dk4RTo5Xc/ZzLy8ysy+xcy8ury2s7S20PLdLSQ1Jhos +NiE6t2/Mpq67rLPX5VE9Pjo7VE5Iz9BhxrvGvK+0s66ws6+14mXsKiEwJBoqOSM5s+HeparK +r6z+W81DMz5ANz5SV3TOvbq5sq+zsq+2uri+zfREOy4mKyYjKjUzPMrHyrSuubyxv/7TXTs/ +RTk9V0xkzsy+t7azr7W2uMzc5EtFXEo8T0o0PD8wMkA7PG3je8W7xcW8xd7R6UtMUkVCWmRu +0MXDwsHFxs/ZzdTdy8nTycXW4fhTQDw5NDQ3OTxDS1Rq8tbLy8K+wsXJ3GtaSkJEREladdXF +vLq4tbm8vcTa4PpZVl9lVE9OPzs5NzQ1Oj1GV9/Nxb28wcTMfE1JRD4/SFt/1b+8vLe0t7m6 +vsfN4GJYT0hGRkRJT05MSUVCRklGS1JPU15jYXbi2NTRzdXg4Ox4eN/b08jCwsDCysvM1+lt +VFBPS05UUVNnffPVz91vXVBGQkE+PkRMTFNt997OycrMysvU4+3t797c1tPX1tbZ4Nzf6+fu +b2rv6/jj5O7q6n5ua11PSUhLS0ZHSUhMWFtYa/Hv2MzN1tLT2tnV2dze4t/m5tzW1tTV3t3d +6H13dmxveWpsem5oZmVhaGxraV1ZWFlVU1NQUVNWWVxibHV56N3g2NTV1dDP087N09ra2Nvf +49/f4t/nb2NhWFVaV1lha2JcX15fZWFeXl9iZ19bWVxgav3t6+3x7uXe3NrY1NXV0tnb3+9d +W9DI4kpH3MXUXmFtZ1RWbl5LTFlcYGNjZv3k4u309/zr29fa3e3v6fD6e3n89X138ebafmL3 +eWdfYl1lW1pjaXRzZGh+9N/o/ujc2eTo3PN76fNw+2xjYlhf8eLq5+nj4Onf3fVtdWdYWVhU +VV9cXuTjeu7X4Hne0+5e4t9aVXb/X1pm4tzd59ra6nr40tx55/hu7HRfWlVpa1tcYWJvaGTs +7G9t3eN6aWb7b3Vu7uD1evLW3m7a4HP97Hjt2vblf2l77u1ubnFxff1zZFpdd2ZeaGdfdnd7 +6v33cnJ9e3VxbG7r5uPj19jd3OHg7m/1+F1ZZ2Jca2NcZm9hbuz0/ObrfPPt5vh1eW1v/vzv +5+377eZ+ffD9eXfq+XJz/GNjY2Bma25iZn9yeO7q5OTt+PPw/Hp2/Hl743724ufu6+Pwdmps +ZFl8aWhqZHl6+fx8evn5+3Z48u/3a/1xfeHdbWjmbE5Y1PFb7NHmeepv1uZcbc7eU2nqY2Ne +WtB7at7UaFX/bW1kWlxtXFXf2+rt3dvpbml9YGRtbl9k1dd55s7N2O7m0dR758jOb/XOzX5C +MC05PC80X8TAwb+7tbt9TFteSD5D3L/K1sO6wdjjyb3C18+8vsbJwsozHBolKB0jdqqmqaqj +oLQ6Lzs3KCg31rGvs66quVZNV05MWuzBt7u8tbK6vbVlKSMXEh4pJz+hm5+gprLWOR8eLjo6 +7aukpae561M4LC9Abci1raussb7CxXNIT149LiEXHjQvML+fnqWuuslDJx8s78G6sKiltUoz +LzIzNEm2q7C0tbW7z11cbF7/yLm/3EgdEB06LS6vmpmfuExIMB4ePK+oqqywuv8nHShGe860 +qaSr00pm3W5e79PAvL28u8BKHg8UNU03u5qVmq0xJSojHjCvoaCltmU5LCQkMsutqaqtts4+ +Mj3qx8jDvLq+wr++2zYmFhEnx2XJnZeerEEgIi4uNLmkp6iwSDAxKyo+zrmrqbXJaUI+WOTy +2cnYbuPQyLu0uuM5HhIaZL6/pZyfqLwpHCMtME6yq6agrz4uLSktSceyqKm8XktAPkA+TMm7 +wczNyr+6ur29y0QkFhw6Tl22qqqork4tLi4vTry9u7C938z2PkzPz3tPPj5hy87Nw8XIwdRR +T1JY3sm8ta2pyigZGCM33rm3squpsdg7Kyk0Ys3JznTzuay030E5Qn1PODpcwbOtsL/VWUZI +S0hR3L+vqquz6yobGx4jO8O7s6qloqW7NiknJi5ASlu/sKymprXYRi8sLS42VsW1raqstM1G +NTA2PmjJwLqwrLHZLyEeHyc1TMuyqqWlqrHESS0lJCgyT8u1q6mrra+/WzwwLC41OkjRubG0 +v87Sy8TNUzw4OUXewb+/y11EOy4qLDFB1LarpKOosuc2KygnLDz2vrOxs7a6vcDNUzguLC46 +UtTAure6xN1WUV5y5NPNyb+9zV4/My80OEBSYPzf2cu9tbCzvNpIODAvNj9dzsK9u7u/x83Y +Z0k9ODpGX+ba2NnPxr+/xtDtZHXOv77NTjctKCkvP3fGvLq5t7S0u85TPDQyNz1LetTMxsC/ +vbzB1HROPz5CRUtYZHfayb64tri8wc77V0U6My4rLTM+Xs/Auraxr7G5xulKOjIuLjI7Td2/ +ta6srbPAZz84NDM3O0j7yLq0tLe9w8jQ2+B3TD01Ly4vLzE3PlbCrqeio6q56j0vKygpLThP +y7SqqKmuu9hNPjc0MzQ4RG3Lu7a3uLi7wcnMz99aPzEpJygrMTxL2bmspqKlrLjWQzQtJyUn +LT7TuK2pqKqss8ZQNy0rLjM7TebEt6+usLe9xtXe4Fo/MSgmKSsvOUbvu6ympKetucdfOy4o +JCcwP+S7saunp6uzzEw9NzIxMzQ9XM+/uLW1tLe9yNd4UUM4KyQoLS86RlTEramnp6y2u8pE +LyklKDJBVc25sauorLa/4ks+NzI0OkRUedXGu7e3ub2+xdT0UkA2KSUsLiw2RF64qaqrq660 +uM08Li0qKzU5PtG3sq2ssLS4ylpGPTg4OzxAYdnOw728t7K3wMzvVEo0JScwKyg1PUa9rbGt +pqqusMBNPj84LzA2OkbszMq+tbW5wM7Y22xLPz1HU0xIVfHZ1s/Mz9TT0dPcbV1v+WJPSklM +T05NTFFcX19gYmrv393e2s3Hx8zMztDP1fhhX1RPUlRdbW7x2MvGx83a531lYFtXXGFpXVVQ +TUlISUpNUF795+Dl6vtvYW7z7NzSzc3JxsnIydTqa1xWWWVrbvTq6d7Z2uDi3+toWltkc2Rc +VU1NUU5JS05VW2Ro+t7f8HBiWmHx3dXPy8fDwcPH0OZvXFxWT1JXYXbq5OLa1dPT2eLr83Zv +Y1hPTEdHRENHTVNj7OHb1Nff8GlcW2Nt+t7RzcnGxsvO1eV5Y1xaVFVbaW1s9ODc2Njn7uHh +5OLvY2VmVkxLSkhJTlVZbefc3N/mfHFmXF5dXmT74dnPzcvLzc/V3unl7vn0+Xx6fv57eX76 +8+99f+be3uf7aFdNSUZDREZFSVJhbvTp5t3d3uTj3tva2tXPzM7U3t7f4N7b3Obj4ePi4e1/ +dG1rZWFeX21vZ2ZhWE9LSkZFSkxOWnf36d/Y09HV2d3f4N/d4OHj5ubo+Pbv+O7c1dra2NjX +2N7o5fh0c3Z4/O78YVNSTUVBRENBRkpNVm7u2tDNzczLzc/S2N3f7nhmYl9haX3o39/Z1tXR +09PU19zf4+bv/O/6b2ZYTkpGQD4/P0JJTldp79zQzczLzdHV1t7s7f1wZmz4+n3s39vW0M7N +0tLQ0tfa3eHub2xrYltTS0VISEVEQUJGSk9dbPnc08/NzM3Ozs/X3uj6amp3bWZu9ubj3Nvd +29TO0NLV1tTW2uXs7/ptX1RIRUdFPjw+QkZMWGZq5tTNy8nJzc7P1eN+YlxfYFlbe97Tzc3T +087O0+Dq5eLf39nZ39XacVdHOTQ7Pjg6R1b+zsXDwbu7x9ToXVVQRkBETEdO5+XPwsXDvr/G +z+FsWlZSXO3YzcW/v8fO1mBHOi8lKD8uK2W7uriyq6qzf1DqSjAuOlJXWNy5tL3JxcLsRUta +T0hL9cvS7trAxN3bxcXY1eDn+klLQC0kO1UmNry+yb6xrLJtTcNXLjNHYEVHx6273rS0z1hN +WGI/O9bMUXnGyNLi2cnhZM7Hzvx74G1AMCovRigqxsN7vKqrssXWwU4tNUI6N0rFuLq/sK7N +9ttgPTxKTVFb3cLL4MjG5Ove4t520sLnauDxOiUy+SQly8hIwKytrb/ItVwuOUYwLknOy8O2 +rrHBysVpPT5HPT1U79DSyrzJ0MTJ29rN5drVZeP4TDQpPTohMstJR7Ovta64ubxHPkg2MDxB +WsvNubK8u7zT5HZJRkVET05O1s/jx73IzMnFx9Hg0dxMe1AtKz4yITnnOle3srSvsLK8alxH +NTY7P0Jp0My9u7u+w8nlZmZPSEZOXU9b6tfNycS/vMTJv85s6GtCMSw/Lx49VS5Us8S8qrGy +uMbJRTpCODU7T1Rfy8S9vry6xMPN2eNmVUtNS09ja/bbyMDDwb7NycpKPjM0MiAvOyk6x9DW +rK20rbK4zn18Pj09PUVDVVXpztLIwLzMv7zX0t1lV09KTlRa6+DLw9O+wW3AUzJLRCMvVScw +cExMwLW+ubG3x7+9euzdaV5MbFJCVlJEXttf0cLVxb/DytDN4F9uelBsfljv33nl2mNJQ2gz +L2szNXVVRuvH8dfFxMzNucjZu8jfy9BdW3tJR1hKTnnq6t3Jy97KyePY0Hb+3O9jbHhYYmFo +Wk9VR0tMREtLTU1SWU1dX1t66uDXycPBvry/xcXR3e33YlpuWVdpX1Rr6mR91d/p3NPgfO9+ +WVdPT1NLT15QXXxgb957a3ReVk1UT0xZXWjc1M3IyMXEycnIy87P7Wl1V11bU1RUYGNjb+Tb +3OHb73n/bVpUV1BYY1xedfbg7fzwdW1aXFVOWFVjYmn189rf2NLPz8zP0Nja3+59bnJmcHN7 +/+nl7+fb4W3sa1ZWXFpSXG9jYvrre+3h7fh6YV9VVlNTWVZbWGhp6ebX2dbO09LV2N/h7n1r +dGh38+3k7ODc3+Lg3eJvbn5fWmxcVVtfWldbXVleZV1eem909e58cPvr7ezd4+na4+Pg7OPr +7vB+b2Fkb/fp8O7x5Nvk5uj7+G5iaWRnant0b2x4e31tbGt8fXD9aGlvZmVsduz0e+Xu7/fv +92l+evj/7OTr697i7+tzb3J8fevs5OHj4eju7Pb37XNfX2NgYm9nXWNhaWFqamz9b3556+j6 +7eXu6+Xv9Hz44ex7a/j27Obo3+rr5+pu83JzaG5zeHBt9276+vDy73vxfn5ud2plXV1aX2du +eXx7eOfq/Hnv7/D49+fu3+Lk6+rw+Pd99mlfb3b44u3+cG74/vp3b2FqZGVzbX717vDm6Xb1 +bmxpcXHy7Hz7fP5hbWr8bmltZXZu6+/o8+/x8Ojm7P7ye3xx9n17d2H5fvXw8Ofn5vLz8v9r +Zm9tbGhqeXF7d3v+7efk2+Tx6/lvamNeVlRcUk5RVldefOjg3NbWz87OzM3U2ODq5GpiZ1xc +XVtcX2Z97Onk3tnX3d/g4unq5VpQ9EY+UT89SUpHUWlxd9/MyMy/vMfEw83T1uFcWGZLSVVS +S1n6WmvU1tbOytDWzdbp4t/scnZmSERWQjQ+Sjc6WlRG4sHRyLW4v7m4xc3K1GZNT0o9PkVB +P01UWf7az8nFwsDAxcfL1evr9WV09l5id0I9bz4tPlAwMOz1PfO5xs+4tMC9ucTNzeFgX08+ +RFNDR1tXXt/V18nDx8fI1Ojf52NqcGD83OXq50o/dEcuNUU5MEN3Xd3Fw7u0ub+2ttXo0HxJ +R0pCQ0I+TfBxfsi/xcK9w8jM33JzXU1TX1/93eHezOU/SWc4Ljg8OD1MTuO/wsK2sr3Fwc3n +6lxGQ0dEQ0tNVtzOzsC5u76+xc7X9lpOTExNVlzwzsrNy85hPz08MC0wMzZCVGDPuLe3sLC2 +ur7RemRNPzw8PT1CS3LMxL+6t7m9wNF9YE5IRkRHVP3czcK/wMbPYkQ4MzAsLC82QmfTw7au +rq+wt7/K50o8Ojc2ODtAVtPAu7i0sbS7ws9tS0M9Oz1FT3nPyb+5u7/I2Vk+Ni4qLCwtNUFg +ybexrqysr7fC4U5AOjY2NzpJZNvAt7OwsLa+yudRQz06PEBHT/nNwcLDvb7I2ldGPTYwLzAx +MzxJX9G/ubW0tbvC0PdZTURAS09f2MrDvbu8vcPP32xRTkpGRkxXW2Xr2dLP1N/v+2pbWlBL +UVZVRj1AQj9BSFHu0s7LxsbFydTa1d1tb+Pl29fUyMTIy83S5f5dVVZST01QWWN9dvLZ0dZ+ +bvBWR0tNW2lt29TY3nlOREI9OTk8SGXt28e/v7/AwsHGzdDP09rV2uPe6vbg2NXW9VdTV09K +XO906Hxb91RAQkhMZPBt087T0+/yXjw1NDM6Rk/bu7m6uLrAyNHa1szO08rJ0t3ua1Zf5X9j +83Nk519PamtQSlBJREtJZN3u+tHH2O5ra+ZPNzM6PT1EacC1uL6/v8vpdefT0NDMyMnK0vDr +0NxfWVlWW0hH69PZZk1NUkw8Qlrn2mnly8nORC8/Xjw9b8/IzHzpxdBa48jMyMPNy8Xk/MzM +09PwYmpNR13X1/b038/dTkhNTEVBVN/o1c/pXzoqMEE8Ssq6tbnN3N9YQ0pf0cbSx73I1dDM +zs/ncuHo8+fbz8x2UmxQSE1KbO5PYdlkTe7T5XxNOi4uNztSyrqztcXl42JLVW7OxNTl7PJv +/97Oxs3e3+J0XmTYwb/I1PlYRDtEVFTvzs7Yz85bTl9FNDI3NjpTyru5vcPK+0dDU+jZ08zL +1f1aV/f8W+TNz8/Y2s/N2ePZ2nNffftcZtjb2szO119NeUg7XE04OjEpbLXwzrO63VA7PG91 +Ts+6vs/Z/lv/b2nTws1g2srU1N7XyNNaUVlSV+XLw8nM22dsSkJ91kdCYUAiHMqxQsWsrrpS +KS7UXjvNrq670kdNzVVF3Lu8y+FX8nk+WbvC2exVTEtDT76zvc3tWkc+VdDKw8heRzUYGbS3 +Va2jr8U6HyrIcEGypK29YzE69kZIvrC6xls9TnBQbMTXz8hCOlrYyb7Gy8V/RUpc0bu+SmjL +NjpUKxcon7VYr7TNyy8ePq3Bz6ysu9E5JzvD1My2tMPWPDBP2dHHxc/rPzxOY8/AvsTiSk3e +09fNyMjlSEpQWW1YLRkkq7pDwa62xTojOq66Wryuu8dLKjy4uszCv8DeOS9BzcTKw8TnRTg6 +Ss+5vMPJVkJb/W7Ov7/dRz9Sb0AyPzseLai35LO/T/w8KVaut7quunZROjBetra7vdBl8zwt +UL3AxNZAPlM/OeG3s7xsQk/6XvvXzcF/OjlhwlpMcDkkJMy0ybu8wMFSLTPNu7+4ucbWWTk7 +zrm7vsnebUAxQMzAx87fVUc+PlrFusDmY1xVVF9+zsLlRujbPjxDPjYnMa+ru8DB03xELTy6 +sru+yursVDdFwre/evHsXkU2RtPIzdHjY1NJSvjGv8HbXGL372TsyONc21Q7QmpNOSYmw6y8 +wr/Az1YvLuu7urm+zsvRPTVTw7q9zXXtUDk9Te3NwcHfZE5HUGjZwLrE4t59TUdOVXXL008/ +PEs6IifOsbKwwdO/3y8uSs63rbfNxsxHOD5hwbe/1uZOPUVIQnjFxMfuR0VUT07Qu7m8zWNV +TUpdeNjAz0o/SjgkJkfSt624v7nFPzY2OGi8u8G+uMDSaUpOXW5famhgz8bcW1VealRISmXQ +z8/LycfO719cVFv282zp6FpKQTQsMT5T1MfFvrm6v8vxT09i+2Fl6OHMwMPM1d59Xl1kcWxP +R01aWVVx2M3P7l1YWlNQWF/tz9Di+e3x8+Hf3dfzV1ZXUl3ve2l3aV1cUlV9397pc37d2N79 +bfv65dXRz9v/a21uX2Pw19T1aG5vZ2d9fXLg5lpOTVBc797j2t9uY2FaWm/o59zZ539eVlZc +df/u393a3eP7b3Jv79/W2fV1aF1ZXHPf2d/s7nFbXWl1693f5/JpWFNceu7i3+r3bFtWVmTz +4d/l4X9cV1hcY2l169fP2Nzkemp67Ojl4ufweXR49eju73xyaFtZXm3u6/JuZmddWWB069nX +3ud8X1xkannj4eXe52ZaXWZocHd349fd4eTqd2dhYGptffH5Z2vx7e/zd37q7n1vbu/f5Ptu +cnlpYGRs/OXg6+75cW1tZGRudHn57/R7bG1sYl9kbvHm4Nve6v5wbW12++rj6e/r+mhjZ255 +7+v5ff7z8W927OxxZ2px+evu8Xtvef50ZWZzd3717u3s73pfYWp68+ze3fbj5WVjWmN85uf0 +9O3u+WZgdHh7+f9ueejh6vbr6e35aWVqevXt9Pzv4/FlXWR6YWPc2ezx6OZ6XVVdZ27v5ezx +7PBya256+X11dunq+/Pn6fLu/25oZWpucXDt5n3/7OLl5+Xvfnttand8bnP19urm3Nvo2tX2 +UEZERkNDSlTwz8zJxMHDydLvaFxNRkpPV19oaXTaz9zaz9PT3Pb86v9cauTm8+Paz8nKzM3l +VTovNzctMEFV38S7ta2tur6/6EE6NjY7Pj9cv72/uLW5v+BZUEk9NztITFPqyb++wsXFz2lY +X1xWVWrg08vX7nA6PFUvLElUQ17Bvbe0v7qxyFPt+zw4P0BHVVF8vMLzvrjdXd35UE1FTGZL +UNDM1su/wczX2s7fUtPNQ1T6NC5IOys8VkJpycu5sr68ssVsz99FRk1HS09Q6c/dy7zE5NfM +eVJXT0tJSlRteeXOysrGxcrK0Pjh01ZTb0Q0N0gvLEdGPmjJxL23t7S5yL/LUU1XRj5MUk5i +/dzKyMfCxc3O1mBPV01GR05WWWPo08zKx8fK09PNXU74Ti44eCoqf0E0dsXWwLS1tLu7tM1m +2mc/QFZDQVxwdfLLxc/OxMjq9+JYSEpMR0dXaX3czsrPysHP3cXfSdZlL0BYKjFeODfw3evA +u7a0vLa1z9jNVj9JRzxDTkxQ+c3Vy8DFyMrV6WpXUkxGTVpXXena0MzJxsnPz9B0X1o7Pkov +M0I2OldlZci9u7i6tbfDvsdcT15IPEVEP0xfavDQysTFycTK3d5+VVFRUk5NXPjq4dHOz8nG +ytzpaT8+Qy8zPTQ6SE9qzcO9t7i0tb68xu/rYUQ/R0BBSlH1dtjAyMy/xNjQ2lhWVk1QVl1b +Y/L/4dfX1dTW5eBlMT/MJzK/LjPDc0W+udG5uLnAzrbTTsxwPkpzPT93UVvoy8/RvsTY1tBn +TW1TRFpqWF7m8u3P2OTc5WltXVFOSkpDREhLVlhc7+De0s3WycLNy83Y2tvq+P53/Gzz6vPW +29/b8GBnb1FTXVpaX2xcYOju7N/b7njhbVZja1VWW1ZXW2dzbmze2fXk2fLg3X7n5Gz/42n+ +2/vX2ezO2NvU4uzo+F5gV09XVVJaVlr1dmfu3+7j2ON5afxqWmtuXWlmXnDs+OzZ39/c5+/v +cmpuXlxkWVpqavTe3trY2trZ1dr4+PJhXV1bXV5odG//9P3e4nnl5313dGJZXV9fX215Znf1 +bn7i4+fv8O9nY2hmaXT1c3br6d/h4drW1dbX5unobG5pXlxcYF1dZnV5fPD3fXhuYlxmXF52 +aGJr/fXx39jc29ve4Ofr9vlybm1fXF1hZWt7ePHn7unm4uj37vhtd/tyamx57u/w7fR+dnV/ +bHD4e/R0XmNoXWN2bXT97+jv6Obu/Hb5fvp7bnp8b2xqZ21669/t+P3t4ubj4eXu8f1rZmRm +X2Nra3dwbHV4dXX9+XluenJgY2py+Pfv5+jq6ezu6evq7Pb69uvxbm/7eGlteWxrevv5bGZt +YGJub31+cXn98e717Ont7Oj3fPDv83n+eXV4c3h3//3+9Xd4fft7cnv/9HZudv9+fPr9b2lv +fXpx//b3dGlrcnl9//jt5+fz/Xr76+/x7ebo9Pf29P5+8P1sbvXte212/WlhdW1hYmZqbHB6 ++Wdsd3zm6ePe5+3w6u/17+nuYmZ4aXXp6OLnf+7ufHj79nlxZXNvYGJhd/nv8/T7ePTl6Pp1 +8/RtanN79OXtc3v9amp7//P0+vJzffb7/3X5f3VuZ2Zibnl97vX77evx6+zq5fRsa2hr9vv0 +4u/87X/8/PPt8Pf8eGpjaW94bW1mX2htcWxv8/J1bu/7bf3s7fXs6vf7++70+/B39O9v/u3t +/Pj3cl9faWr35Xdz8urj7P7l3+r7endtbW5nYWhvcWliZP3ye2/0/mp2cXF6bWbv8Gn35uzm +3+vu9Xb9+X7z5+91/OrufPLz8OP+aXB6aWRtZHFuZmxjY2R46XJv7OXzdu3t7W1x6/j49vRu +c3t47nr+6npk6uL9eGJz6/1x6+36cGR9f3B+7Pxma256dGj07Xd17Nvi7uHzanX5+HP06vP3 +dW9r+mljfW5ma+TwbXHudV58/PTsfGl/+G/p8Gxue/DwYXnr6uj4ffTx7fX56ejv5OV8/Wz5 +8HV4eWNYZ/VpZGvy7W727337b/Tdfnz0cGr1a1/29G7p/md4cGvm3m/vb25yXfnsft7S52rd +623c8Pvxamt+b3X2cmVdaW5oZXLu4/VgaOZ8ZWv67Hfl2e91bHDu+/Ls63Rr9fl7+uvv6+ru +c2/t6X/7eWFdXGl3dez6++7o7mJ89v7xfXjq7Hnp6W7h911++/l8+/FuW1vxd3zzaX7q+fjr +4vvu3uXr8nbtaWJ0/ut7Yufub2hoa3R8bfNq8t/7du/jemhzfPJ9+u/n7HHxc3XyZmlieO/m ++3R7am5gZmtuZXLj8e3sa2P8/WFg+fDf8Hr3d/j06+Dg7uDU6Ovva/PsbXn+Y2r0f2lfYWhg +ZmZldfV6bvt0YWJfZ3F7avjl5+Ls7O/m4dza5uDd7WBebVxUa2xmfPLf3ft95d59/d5xcWlg +bXB0dOLf5uPr6ffyaWN3XFdhYV5fam14+X7t8+n26dvp9v31dWpsX3b7ae3r7uTf7O3j5u5+ +72RoeXpvY25ne+HvZ+bR52vq7G5iaWFeZV3r6XJz/vVv9+j17O1s7/VkX2ZxdHL+8uff9PDq +X2LveG10enZ5fXj49Obs5d3e9n3rcGv48Xb6521x/H7t7PZpZl9dZHT1/nF9aW1oZ3pr7uLi +6uzq7PZ4b15idPNxYP3o7PT8/Pjq/fzlaHB4c2Rddnj/8Ozl3dbb7f57+mJpbGTtcWhvcnlx +ePLvZ2Xv7mh27mteU1l0X27c5Ob47dzX3fzj3HNldW5sa2ptae/wdO9q6+V4d33/bGxwZGdu +fG/p62Le3Onp6N/uZ2BweGtkcvT9aG/u7vLobXj5X3h9Y314b/j9bGf+6eXl5uHzffZue+1h +ae1zbX38cvp5cnluZmfvcWPo6Xnv7Ovk5nR96OV/anJ8al70em3g83Hqa2dqYv13+PN58H32 +82zt+21s+/ZuePHm7/L98PJvdP/s82n/7/50/+Ld7/vyZ1xfX21vZWv78PDo5N/oefvi4vBz +em92a2Rxfmx+63P06O3idW/0bnJmZW9ncHf67e/o6+1+7+v9a25sZGx+bWTv8O7n3d/g53zs +73FeY29pbWB34e79++p4fOr073tueHJlXmxwb2hifOz07eje2+hubHdsaHBv/fFpburt9/Pl +5ex6bXthWGv09Glu9/p5eeTe4Ont9PlmW2Bsbl1fdOjs++nl6f1u8PBsZm54amJn6+x2fu/c +6fv67vNvaWBvdmlo9O7vfujh7unt3/Jr8HBfW1xdZv14b2/66+zu6uXc3fRqaWdiZGt07/xs +9O/77+Xq8eb38vlcbGltdWVibO3+e/bn4Hxx5+l4fXNte2Ffef7xaO7f6N/d2+p+aPn8XmJt +bmllavf08f578ORvef50b3ByXm38bH7f3OTj4PPseXVxdPJoXmloaHd06+b7297v8+zd/W9q +ZX5mYHDiZWBybepwbfV3bHL6a3FwbG905e3u3eDo9HX45fP5dWp5Z2zs+ft5aW1tfO7pd/rj +4m9eXmDs6nX27fzt5+5vY2ZsYl1t7+3r6Ontc23+/XX7efLvZXHsamBqdfp8/vnr53H37Plt +bOHoZmn97u/0b2Xy6vJ79vXu9Wh1bWBhdO33aXLc4Xfl63N7XV/q82507etjWnHyd//97enx +duvnfnb692x0bmr8aGr9f+rn7fDd4mVgcP5ue/ny6XZv+ejub3L+cmty9Gtm9uz1amj15uz+ +8u3x7/B1bWpnam5zafp1Z//4cm51d+7m6u/37Ozu9W9q+evy5uLu6uTl+v5uZHj6aWp+Z2vy +fl9eX2Bwc2N45/d1dnT24+/r5d7i7eP28//86ezg6HJubG1tbXhuav99939vb3L6cWl77vZt +8Ot4cXf5/3jy7ON9XmX17W9vffL/eO7v7ufq5uT3fHR89flx+un3fnpsZmr/b2drbHh+9fN7 +cm55ffbp7vLr7n5783119n3y/Hn66OHv9XRpb3Z9d354fvz98P5tcff09vT57X50+nVtZm5v +a2dfbv326u59fvju6uvp3u7u6e7l73lvbGlqc3r8/PXy83VoanR4Z2ZpfHVvfmt68uzo9Hx9 +7uXleWvr7PX3dW5ydnj57fx3bmppZGlubW598vJ+8evy7nxvfPj3/Onwc/Ht9ft3e/Tx/nn8 +9O3yent4a2hsb2lrbG9ubnh4bnj4+/Ln7vv97d/h6/n49WppdXRtb3FubnH99+/v9/n+/nBw +//r7+fN/dv56dfjs5/B8+unn5urz8vj6+v1rY2ZoYltfb2ZpfPn2e/rx9fl7c3duc/Py7+jn +7u3r6Ort5+Pk7n9rZ2xmZmdreu/u9vjr4+14bm/16Oz2+3dobHN+e3V0a2Vqd3597enu9fp8 +b3N4+n5ubHT6dm1rbvjv6+/y9O/x6+js7O/v+H7x9Hv+en17fHh8fHZ4d2Vjb/fzeW9ue31z +bW1ta3T7dn3+eXj/6OLh5Onn6PX97+vx+nxrX19ka2lpamz9+fr0/Xzx5+r3d/nx8+zv+3p4 +enh+fvbz/PL07fp0a2tpY2ViX19fYmp1e/Pp7/717u/j5ejs7Ojt+vPo6Oz69+jm7Pp8dGdj +Y19dYmVjYmZse/T+ffx7/vPq8nZ1+fDt7PDu8P1/f3t9fnhtdHp2eXhrbXR4fHd/fnrt6ezv +6unv+ft+e/748fh1cXH9/3l+amJpbHRqZmt18fV//fr2/ff49O/z8Pd6endxb3jy8PTw7vz3 +9nx6fvPn9XVqanZ0fPj4fvju/mxnbHd1b3n78/p4d/Xz+PF8bHj9dXZ5fvX3dG1x9H366PT4 ++vTucWhsbWxrbf3x+/vq6Onq+Hx3b3f++fp3dXNscvbr7/rw8fT++Xttc3p2bWpjZmdkb/36 ++O/r7O3o4OTr7e/0dHN9fnRubmRlb3l+eXJ7+e/x/nxydPn0/vvv7ezwfHz47vRyb/1tanN5 +enr29H1ub/f5fH56cnN2cHV4/u3q8uzl7H379v5xbF9dX2Fvev939uXf5OLf5ut/b2ttbWhq +aG14/Xdod/7/8vX87ur2dmhs//bxdWp49n13bm9wd/Xm6Ozn6fp89fTx+XVqaWRjaW1vc35/ +8/Ds6ux3bvv9+3x2a2pydG50e+/o8v3z8O5+b3FsbX71b21yefxvcvry+nvw8fDn5+389u7s +8nxtbP5vcPf1dm9vdHP77/p/cnp+bW1tbndtb3t7ePP5fHZt8/L/+PTs7PX5/H/05uj3/flt +aGlp/PTwfnF4dH3wfnR7/PR6bG7w6fj67ejr6OXweXB5cmt3bWNdXF9leHhvc3b36vL2+vbm +5OXq6u/x9f3z8/r89vf37ufs+XtzeGtod/32fm1sYl9we3FxdHV8fvv18+ro6e35+n78eX3v +6u3ye3l3fPf07fj9/WxlaHZza291e2xrefj28u3v+Xt8+/fy5uLd3OLw+u3+fP15dHB6bmp+ +/vxtbG5teGpkYF9oa3Bva3r19/Dr6N/c3uTo6ejk4+Pq6ex5b2tqZF9fX19gbG9qbHfw7/D7 +8+97+uzn6/Lu8PT2+vx5bnrv7vn98O3u7Pz+ev12bGddXWFeXmVr+/Hj3uTvc33x7OLg5Ort +6/B+f313+u37fHb96Ofs+XdvaFpQU11kaGJhaHLx5OHs6N7f7PX4fu/q6+zr5unt8PPq6ep3 +bHBtaWlnYWdz9/R2bmx1cXhvb/15/3dsZm/t8PXt7fH+b213bnH6+fXv6fD9f+/s9/j17ev2 +9u7q6uzm3+TzemhfX19dW1dTWV5k/erk6ejufnFudPHu69/j8Hp2b2xtcfr2/Ozi3t/f4Ojm +5urm6fPu8XdpWUk+O0Fb387LzdPdd1JOUF/czs/X3ev27/fv5uft7/P79Pr06ez0dF1SUE9T +YHTr4+d6Zl9hbuzd29ra3uj6ffHl5+zramJq7uN9XlRWXWh3c2NleW9hXV9y//zq5ufj3N/t +8P3t3drc4uDe49vY3eXr8Hh98/lnTj42MzpO1r6+w8ziXk1KSlzXxsDI315bYnLj4vHv7u9/ +cGx56OLs/2xbYXb57fp+6+bxcGJmfePZ2+P58enh5O33SDAvOkrJuLrDz2FMU0lN4Mi/v85d +SkxOat3b2OB8YGVvfdvLxsncWUxSYOXR0dnj5vNgWllvfVtfXU86LjU/3rm1u81pSU9aTFnn +zb67xv1YWmfk8Hb6dG7y6vDf3NrU2mZNS0ti19HP0tPY62xYXuLc72dXam05LC83+7azvtRk +Um5rSUlc1Lq2vulSTVJt+nhuZ3zZ1Nrb1dLQ21tLSVXfzcvP3et7bVtZeebV2l5NVlY4LCw1 +6bOvuNBVS19jR0NUybOvu+JNR1Xo2OPw6uXb8GJt5szF0Fg/PUh719DQ293T31pUd9bCvtVO +SFpONSsrNdy0sLzWXVdyTTw8Vb6urrtlQkFY3dba6OjOx9dbTmXLw9VbR0ZU7d3s8OjY12dN +SlPYv7vDYkdHVTolLDjZrKu012JDP0w5P9G6r6+/Uz09QfjK1etmatXH0N7T0NPgUUVLWujP +z83O0dPfblxr2svTSiwgJjrLrKyyx1w7Mzk/a8O8usPsUUhR3L+7yHlNTGD/7dzMwr/E3Ew9 +O0vTvbvMXUhIVWJ94M6/wMn9SENGXz0jKDBMrKisx0c0MlFJTMy9raq3WzUyPNi6wtNfTeLG +ydlmXdvF100+P3K9u8hiRE7cysrR3NHZTzQkHyxXsaesvlJCOTpCPVXAtK66Zjw/9sS5xFxM +U+vL2U9O1725w1Q5NULXwMTuV13h0PFTTl7IvL7KV01NVzkgJC1Oq6WqwFg6NEk/Q866rKm2 +UzIyPtm8x9v1bsvG5VlOXs++zkk6N1XAvcdnSVTaytDR3tHG+T0oHiY/uaWlrtlFOzdAPUrJ +ua+zzkI6RWnGxN76aF91ak9Q3MK6vnxEOj9uysTVZmHuz+FhXXzCvL3IVUY/YV8lISw0uKep +ufdJNEVCNFPJrqSqwjovMknCw8rL2sjA30s9Q3+8udNRPULn0M9vTFvNxdXbc1/Ux811Pywh +JDJtrqirt3s+MzQ4P9W4rKu210M8PUzPxMbN3fHo715g28nC1Us9PU9j897ZwsLPbEVKfMe6 +yOFaRUo6KSIqPsKqq7XJb0I7NzJBxaykp7pHMjI/2snDxsnByPVBOD7vwMHRVkdITlhXYd/F +v853W2Xnyr/Ya009MyYnNv2vqq3BWUc5Ozs+5rytq7bcPTU6U83KzdDZychrSElmzMnTXU1b +XWVYZNnKv8TWb1Re08zTaklFQi8jKTPorKmuxGw+OkA2POq3qKeveDUxOWPKxMbOycLTTTs8 +W8K6w+xMRkZMT1nfwbq+12JKU9TLzd1cRTsuIyg51a2pr8lgQDo+OUDbtquqs3I3LzdbxsDJ +zsjDymFCRmnNxMruVk9LTE9p3MrEze1STXPaztFrU0g3JycwRrKqrbnqTT1COjVRx6ylq75E +NDRB5M7M09bEwdROP03mzMjfV0lJTE1VctDDwM3vZVt+0snRWEhBNykqOF6yrK28d0g8Qjo6 +XMSuqq7GQzMxROHQyNLTx8XaS0FCYszFzOVyUkxQW+HLwL/P719dfubP3elfSD4pJS0+uq2s +tstnODc0M1G8q6itxUAzMz1zzcnIw76+2Ec/RmfNwspvT0VGT2bTxsG/zOhZT2Td09Xfb0cy +JiYvTbisrLjKXj03MTZQvKyprL9GNDM+ZMzGxsG/v9tGPD5az8HI5GRJRElQ6Me9vtFwSkhQ +ZMzDx8x8OygiKDXLramrtdQ9MC0uP8Wup6i2YzcvNUrUxb+8vL3NTT07Q3fJxNV6TEJKVe7Q +xsTK21ZGRlTbwbzD1l02JiQpN8Krpaiy7TQtLDFeu6ymq75NNC40S9nDu7q8x2pHPDpI4cTD +01A/Qkt+zcTAxc3tTkdLcMa7vsxzPSgkKC/nsaeorb8/MSssQM6xqaq03z8yMTtUzry6ub3X +Tz89RGbNx8jeUkxLU37VxsTM51ZLSV7Ow7/K00opJCUtdbWpqay6UzorKDRrtamosMxINzY7 +RF7Mu7Kxv1k7Njxb1tXW197eb05JV9e/vcZ1R0VX18bF1GpKLScpLVe8rKuuuFw+MCszT72s +qK3BXz45PEJL98S4r7jbRDk6RXHl3tbi3f9RSkt1z8XD03FbadrKyNX8Sy4oKi9Ov6+srrbv +QjEqL0q/ramtvfBFPDw8P1bPuq+0zks7O0FYe9zMzM3bWk1OYdnMytbu/XPi19LT7UQrJysx +7bqwrrG53EsxKS9Gvquorb3nRT48NzhJybOrr8dUPDo9SVJp0cvI1VdKSl/h1MvP29vX1djc +6G85KCktPsS1r7Oyu91NLSgvSLysqrDA205CODEzQsyzrLLE8khAP0BIaczFxc9tUU9ZZ+vZ +2c7Nzs3V1eQzJSgpPMCzr7Gwu8xvLygsOMmuq6+4wONVPjAvN1a8rq64xuBMPjc1PnPDvsLP +7u72Y1Zb+9e/vsnc7lAsJykrTMW1r7KywctZLywtOtm1ra6vus90QTIuNUfNtLK1u8ntSTYx +N1XQxMHL0dTff1VPZ9PCv8LNPSopKi9M0byzrrG7xks0MC84U8e4sa2vuMtNNi40PVbLvLW0 +uMB/PTEwOlXRxcPHxsviYEpNYNjHy8vePywrLTRM07y1rq22xE81LzE6T827tbCwtsZdOzAy +N0d81L23tbrOVz06PUJf3MzEv7/Hzdfp2OJNOy0oLDdPzry1trK3yH4+MjE1PlPMu7Wvr7nK +aUI7Oz0/V9K+t7W7yW9DOjk8RVXtz8fCxM3Z7/xoXFxw2s98NSwuL0Dfxby1sbe9zUc5Oz9M +79rdyr26ur7oQj0/Q0tVWXLNvLrC3F5abvLpbld308jCyfpLOC0uMThJ9MvBuLa6usLhWEA2 +LzM9T867tK6vtb/RWEA8OTo/TuvOwry+wcvtWktDPTxEVevOxsPBv77Dze9ZTTotLC0vQPPL +wbmzs7O72VNHQ0ZRTkdQe9PFwszl3NHO0HRMSE5v4+Xy9NPGv8HP6X3r3PRTQzgyNz0+RUpW +btTBvbq4vL7H80Q6NjM3QVjXv7azsbS7wtJjSkI/QEZKT2X439LT2ulzd3ru9GpnZ+3V0c7O +1N9fRDw4Njo+R1Ft18rAu7y/ytHX19Da5vhhWVJLQkBJWOjRysbEv7/F0nJaWWV0bF1VV2Jx +cGNXTE9bX1ZMRUFDT1/12c3Gv73D0OFnXWhsb/vl4tvT2eF+W1RRVVlk9+HXz87T3/1mVVJb +ZWp09fLf1tDR1dnf5HlUSEM/P0BBR1BccNrM0tXT19fOy9La3uDd4exsbHj76+zv9eXb4Hhe +WV775ePi8Xl883547urq7vX/ZllOSUdGSUlNWGfr19nk8ff7+vXx59vRycbIyc3W5/htYFhU +X27x5OLj635kXlxZXWpze+PZ2uLu8fPxeW1mW1FNTUpJTE9SWl9h/uTd2NTS09PT1tnX2Nzf +2tba5uzu+/j2fm5tc/f2b2NhWlhbXGZxd/Hd29zc4elvXFRNSUpLTVdib/nq5N/d4fP15uPk +2Nbc3Nvb3t3j7f797ujm7XxzdWx/9m1jYWp58efn6fRvY2h3dXZ1bWpmX1pSUlRWWVxdZHF2 +/ene4une2NjW1dne4uLk7Wxhcvnu6ufr7eLh5e79+O7r7+zi5ev2+nhrZltOTE1NTk5NTlFY +W2Z48ubm3Nzd293g6+ni3d3a2+Pi3d/h29vb29ze5ezpfWtnaGJgaWtsZmp3bnV9Z1pST0xK +TUxNVFtdbOrd3tnU19jV09XY3d/a3ePc5f5/ev11bnZybHL46uDf4eTh3+Dk73Zub2pfV1BO +TE1NTVBVWl9mZW346+jc2Nvg3tvZ2djc4ODj4uPvb3js9f3v6Obn5+Pu/nb+eWhtfHp8f/x6 +bmVdXlRLTE1MT1NYXGh979/b3tzV0dTU1Nvg3t3v+vt6en35+v/27+3h5fT7dmxufv17dXt7 +fvh+a2VhYmdkZWlua19bWVtaWlpZZXzn3t/l4NjT2Nvb4eLh5+fp7PHv/nh3e/3+5+t97u7x +9fd+b2dlZF9rdWhofG5namFmZ11eXV9gXl9fX2V7+uve3Nrb3Nzb293d3t/f3uTxfn14ev7+ +fHJ1c3BucnP78fZ3enxubmllaF9iYVxcX2ZiZG98a2doaW5tbG786+Pg497f3dne6u7i3t7g +5eru6ef3+/Xx8W9ta2xlYWhlZ3Fydvv7e/D9Yl9gZGNhX15ja3V1a2/1+P96+vl2/+3i4+Pm +5uDm6uXp7O/t7e7z6+Tv9vzqf25wampgZ2JkZ2Jt9/dsaWht/O3r9/zw7v5ra3Bzb2Joamhm +bnd0fnh2/e3r5+Xp6+jg4+vm6ffp4+p8/Xh99vf++uzz9fZ3ZGJtZl5dYWBjYmhyem1vbmZi +aXJrbv3v8+zi4uPk397g5urs7Ovs6+jw/Prt7vl9fHR0cW9+d2x7d2NfX2BfXltofHl+fv91 +aW1ta3bt6u/p4Nzd4ufs6fF2dHt2f3/+dG9yd3ZkX2dtb/fy/v7v5fDz4uTl7Pl6/f57aF1f +Z3V9d3Zye3x/cXFtamxvbnP18Onsevrr7Ovq8f59eH19fnf37PXt7vh9+u7r8m1qcnB4fHv7 +enR6cW7/8u/6dHV5fHByc3X6enFxa3Xv7Hl2+/P6/vd2dndzbnh4+uvvfPbs5uLn5Ojv8+32 +eHVrZmVm/f35dXju+Hhwa250c/p7aW5zdm9sfnt9+O33de3o7fp9+/X1+/n+8vZ9e21obnt+ +fnF+/mho/+z5d3p+/Hb68n/46+Pn7/Xt6/H08u97cv53aWpxcHpxaHF+enZzbm5783tsbWVi +Y3N9+fb89+nf3+fl6v15eX5xcf77/+zp5+Xy+Pv47e38bWdv/3Vv/vbu9WtscW108HhnZ2pp +anD56eXsenr69/jy6u7x7u91bHV99fn9+nRna3b9emx6+Pvw8P3//vn37vDu7/d6dnn87Ono +6P9v/u3w+nlva2NiZmx2eHBoZnN/8vR3a3D8fP3+/vnq5fDq5uv1+ezn7fV3Z2lnbnZvbHLv +5+35fnt49v91dXR9b3F8eHzw7/f2+Xxtand0dfh/dvzu7+/t9u7q7u7x+3txZ2dvcW5wc3B6 +/H188/H+fHn8f/34+nd09Pv9eXf07+z5dn/y7e/o6f15fntpZHH/eGxufXZ29/tzdndvbm1y +d292/Org4eXo7fb37uv1end1b2ZqfPj8+H979e/r9XNwanh8dvl0al9v+3tubnh4e3f0/mhy +d3r08enm4+Df6e/u8Pd3eGptd3f+8PD58u7s7f5va2hobXJyZ2RnaWVrff/6+f1++fTp8f9+ ++evo6+7r6urn8XpqZ2lqa2x7/m1ucnl9/Xz2f/zv8v737Onu+Xp+7/L6fXVxfvtzam50bnNu +ZmtzbGRmdPfy9v1wfPDo6ezo6OPm6Onm6e3v+W969HxqbnFvcW91amloZGdvd3FvaWv+6+Tk +4+3u6u3s9Hxucf/17/Ls9mxmc/T+e3t7e3Jyb2198u/88u719Plyb3f+/nx7cWp0/Pj27+76 ++PP6//z7/v5/c3V2dXN+fnZwfnxzdGxx/Ojg7Xz+/X54fvz9dW15fPLu8vfw9ezm6fN0evv+ +aGdpaXX8e29vfPb+bWFibW95/nz48ezi3uTr7vZ0/+/6bmx5//70/ndxdHJtdnd4em9lY297 +efv19Ovp5ujx8u3n+W9zfnFqdXBscXZ1bnR87+z7+fr8+Xl7+vh+c3Z0efr6fXBvbG1wc318 +e2/+e3j99Pj88u7s+nb88X//8+rz/H5vamVrbXBtfPf4fXF0d3z97u74+H3/c2xvd/rs7n35 ++PPr6vP5e25veXv59n12fPH2fP35enp3ef79/vx0bvnx9H1+fX7/dnVsaGxybW978uzu9PTv +7/P+eGpndfn4/fr08+rn8Ozv/nN1f3Jxdn5tbHnw8fr5fXdvc3Vuand9ffvv6ezv7PB9+/v+ ++vd9cW9vbnn5/XZ0enNvcX54cHv5+XxvcX379Orq8fl4ef9/9fLxfm96fnN2931tdft8/3pv +bf348u/zfXL08X787ez8cGdrd3t6/HFsfPT+cn/5/f79fH58cG/8e3vy+mxz7/L78Ons7fPv +9H3z9/H5b21udHFveHt7fvz1/3349nFqbW1wa2z7+Xv39PLt7fT5+337/HVvd+/xfHl3cHJ9 +8Pl4cf/3e3zz9X178evu7O9/fe7u8vF5a2tmYV9ocW5saWhufPf2fvHo5eft7+vq6+jq8vj8 +e2hlbXj5d3b58/dxb3x4d3t1bmtsaWlmanL87/Hr5evu+fvu6Onyfnn47ev1dnn9+X99ent9 ++/xzc21qZV9fZm5va2x2/nv07PXq397f6Ozp6/J+fXh7fm9sdHJ1+3tz+PD2fv/s6fpwbWZk +a2xnZHnv+n5zcf7zem5ud/l+fnvx6OHl8evq6+/9dWtqb3BuaGl5fvry8O/9cHF4fHd2bW93 +evj0+Pnu6+zu/vXu6+39d29nZF9ham91fPft7vP4dn369ezz+HR/7fJ5b3p7dXVuc/12b3t3 +fvbtfmz58vnv6ev28O/u6+vq8PtybGtua2RmbXRubm1rZmhlZ2Fgc/p0cvDm5d/i6Ojf3ODn +6enn5fF5/f9vdW9mZGNteG9tdnxwa3R9dnB3cGlrdvRy/fDr5/N9d/T6+u3u+m1vcnN5dO/t +6+3v6n1+8PLz7+rs7OrvfnFtbW1uY19qZ2Nud3hqampsdn7393n66OXk7e7o4uHj6fj9dHFv +bnhydXFsdfbvfW5pZmVrem1z7+7s8O7o4+Xs+HZsbG9wZWhwampsZ2lwb33v6eXk5/T+ffft +6+7x/Pp8e39tamdoaW90/v14d/Hq7Ojv9HtwdHx+/fv57n79/HZ0bHNvbnBqbnN4dHf6/e7u ++urv/O/qfXd6c2pn+ft29+vx9evr+WtjbXR7+n1//fx0e355b3Fua3r87+58fvH3+fP+eHL7 +7/Z3ev5yc2xncHv48Px3/u7s9f789H57ePzs7fB+/XJ09u52a29sbHB5ent+fPz0en31f3b6 +9Xt7cXr5+fry9/vt5uzwdnl1bW9wdmtqcfrx9vr5fW90fnx0dO/t8vl7+O/v6uvw9n7//nx/ +/ntta25sbXZ5dm54fn7/bG/08fj28fp7ePrv9fv4eGlpa3r68+rp8/x++/78++719u7q9GVk +Z29z+efw+H57dmxwd/1+fvzv7vb5ef5va25rdWxpamn47eXt/fDk5u7n6Hh5+/z+bHH07/X7 +enZzcn5zeHNqbGpvdHbz9ffs7fZ9dnr5+3x7bXrv8/l893388fh3+PF6dXd1ePn1/v7z+nhv +evp6cHJ0fPTu6vv78efk7/P7b3t1bHlpZmx0dG11+XN3eXnv7/Pp6+/3+O/z5+X6eWxy+Pv8 +aWRmaW16+3x1+3xx+Ozvent5fvnv9/16e/x3/vvw5ePrf/d99+t3bWlse3Rwc330+Pf9fXx6 +bm1ufn5scHd96N/tcnV/evR8d3tv//708+rk7f9samhqY2j77+bt7PB8//f5b2hz9Pv1eGVo +bv7xeGtz+Pf18+3o9f3k5/12eP56bGp3cWxxfXp1+ebvdnh99vHo7Xt4dXx1/v/49/5xc+rp +7/lvamlu9PNvaW55c3h++3j58vh7bu7r7/h+bG/v/Pby++zy/PdzbG9sb/Dt+HF17PV4+/38 +fHt++/3r7/11cvvw7e3/dW1mb3N7cmhycW/9+v7+d/359fP/evl49+jw7+38bWlsef367+/z +9Hj++Hz08fh3cnbw9nR98uh+ffd78Pt2/X9z7+/+d2l2b2NfanJzcmxya27u6+/4+uni7G9t +8ubq7/Pn5+He6PdubnxzaWxvZWptcXn+/HVqbGpp/3z6+vvy6u/r83zz9v/37e3s+397dXF7 +bGhsbv98e3hy9+Xg6v3y7/BtZ2995vZ19Ptqc/5+f3Vu7/h9729xePjt7eri7v5+bnLs+nj3 +bW5qYW9uavb2bG9ue/xuZ3Tu6+ns5Ofu5ef3cXl5f/Tr5vNpZ2lx7/P6fXh7enFte+7i9XFu +dG9qb3R9a3vq4+v39PPu7nJsb3X393Fmcft7bmp3eX33fnJp/Ovi6+5+ZGxu6ub59Xvz6en6 +cX/98vf8a3T6eW9ocHf/9Ppybnv76u9wbHTu8fl8enz9735pamFhbF9tcW94/379/3z36OHi +5Ojq8eHd4ebq6ul6YW93b3ZoYWFs+XJhXGBtam1sfmxz+n3s/f7+/Pzn3+jvcHrs9fR1/PNs +dPf3+Xx3+vx68Px6fHr+9+3u83V4/XR3dmlpeP18dG9rY2ZtZXnx7ubl7err+vt0ff11+/t+ +7+39+P306ntvb3t1X2JjaH7t6PTy+Onn/H5+++55fff+7/d2dHr37+9qaW9pefzv+XRtcvv4 +/2pv+fXj53T98fbv8H5v/v7q7O/8bunqd212cG5sZmxqcvLp7H1+5eTw7fVyaW725vFz+fT3 +9HhtYV9x9PljXmn+6/rv7OXm5ep5bHTw7OP0bm1p79zmcmp66/JqZW1rbvf2Z15m9/R4fG90 +9u3ufXZ09Ovp8Xno3t/5dG1s7/ZtbXB99PLv/Hl2bW56bGh0eXhwbW50d/re3uPn7fN99fp9 +dfxvcftxcf318fb37X1vbW3//nN2aGTw8Wlvdffr+e92ZvLf4O1lZ/L/8en+fPJ9++n5/nVl +/e//7HVhcWt/emhzaGP+6n1z/O7n7v3v4uXm8n3k9Gp4dv37cWt0Xl1vb2VnaFxr+O7mePjo +6uPj3ex7fXD79uTi73hwbm197fl7/HJeaXdnZnT1+P/59fz+cHr5b2j46fV8ZVxk7eHl+nzr +5uzu7/B9b3bxfnp9aXj++fFyann58vj57vz+b3Xrfvvldmpxc3z76eJ0ZW1uff5obHl+8PHv +8nXx8HBua2717vftdWlpdX3p4O7k6uv5den/duDjeWxpaGZldG1ma2r8/v/9fXdtfnl5+Xv9 +9/F/c/fm5ebr7vrp4ODuc/75/Hj3fmp1dm9t/31xbGluamFeXm/y+m9t7+3y7unq5uDo+n/y +/e/6fP57bv3p9u7we3JzbnN3/vv7/3n8+/n9e35uYmJw/PLv9uzy8+vt8u/o3+x/aWZtc3L7 +8fX5bWVjZ3H7/vn8fHz78PDt9fZ3cP71+fv8dft+e/lsa3R69+7z7+fv/fr++fbz8PLs+f9y +ePN8c3BtZmRrevv39e/y/ffz/W5tbWx2bnNtavz77Ojp8O/t+Oz4f+73/fF1ffNxe3p++f97 +/Xh2b29nbPzu4uzq7nd78H939v74eHz4/vl3bWx3+X1vb3j3em988vl8/Hv7/fDr9u/06+t4 +fXZyem76fWpxeHN/e3z493596+z18XZ0+nx8+/r//X19eX7y+HpsbHR5fv7xfmz8dWFmcnp7 +/Ojg5O3yfH359nxub212eHJ8eH1vaHzt7Xp8eG51evbm7Hp2/u/t9PN5cvTq/nJtdnxranVu +bXVvfX1qanb98Oro+nTp5/Py7/14f/Dq6PL/a2NqePHw7e3t5+b7Y1xTWGJmb/rs6vpoZV9q +euvf4Obr9HX+6drZ3drX19vk6/Ph3N3oXExISEU/OjxK3bu0t8lWPjpG37+7vtVeTExUZenc +297c62ZWT1Jv2c7M2nlVUlx72dHW2tv3YGd73dDO1OZnWVI4Kiwy76+mqLpDKygy6LOrr81E +NzU+eMG3ucHpSkJM27yztLvTWVzVwMo/HxQYKK+VkJrMHhMZL6qamqdUKSMrPc68tri7w2Q9 +LCswXa+ioq5UKyYu/q2kprL/OjZJvqut1yYPDhc7mo6QojAUFB/enpmetDopKzVa0MK8u7nO +SjIuO8CooqnPMCUqR7SmqK27y+5PJQ4OEiyYiYiQ7g4ICyGfjYuUvx4VFSFEs6iprL9bNDA4 +1a2mp7s+KixEtKOhqLxaNDElEBEXKp2MipDFEAgKG6eNiY+uHxEQHmmmnqOv6kI1OlLHta2v +wlI1PuSzqquyzzovIRAPFyefjYqOqxkMCxbGlY2PnzgaFBos16qhpa7XMisvWK2gn65IKCYz +waiiobFKJhELDxnHj4mKlT0RDA4grJeSl6w/Jx8hJjjVrJ+jskcpKEKvn5+uQycnNLafnaRf +GQwJDiqejIqPrCMTEx5Qqp6fqr1pPzMpIic+r5ycp00gHjGumZWe8iIbI+WinKNJEwoKEWOU +i4uXYRsTFynBpZ+hq7ryNygfICvZopuerT0kJj2vnpymvzkrNF7Qws0nFxYTILKckpKlQyMb +Hz3Br6mttbt2NCkmKUazpqKq1D00PcCooKKwUTAwQNbNPR4SEBg9npGQmsMmHB4vy6+tsLm8 +u8lFKSMnPLOhoKnTMCsyfKqdnaO6NissN005HBITGV+Yj4+bSB0bIjm3r7q8wbmwu1UtJCIv +2q+jpKy46URJ2LqtqrHLWjsuKxwTExYrqJOOkaE3HRoeNMy1sK+ztrTLRzgsLTdD3byvqqan +rLTLWEdFS1rR4EEkGBIRHEqhko+WpfIsISIkLEPJqqCepLhJKyYoMEvWt66sqqqrr7jHajwr +IR8hJi45P0ZJ37iqpKSrv0cuKSw39bepqK25ZjkwLTE8WMWxqqinqrPK7WJJQDcwKyMhIB8o +OeevpaOkpqy91T8tKSoxV7itqq261WdQTlNeec26uLe6wcTP+Us5LScjIyMlLTpfuqymoqKn +rbpmPjIsLDA9XMm/v728uba4v8/p6tPFxcxoRD9DXXRPOysiICYvQ9TEvbm0rqqprrjPTkVH +XW9ZRz07PlTKurSzuL/Fy87TaUxGRUlc6WlENSwqLDVDY9jT0M3JxcG8ubm6vcXT6VlHQj1A +T2rMvry9v8PGyNvraFhOaNPQ3lQ+NC4sMDpEUmzr6Oje1c3Du7e2vMrpU0U6PFjbxb6+xs9y +UGzX0snHytDa4NrU+VNHPDk6Oz5JTlVXVU9PWGjVy8fAws7mXk5MWfbOwL7AzOFx99/QysXI +yc/oW0ZFRD9CSE9f5NXQ13tYTEdISk5QT1Rb+9zT1OpuZ+/Qw8DG0ehmYPXUycbCxc3eYU5J +SE1TaPd7dGFfbeng3uVjUExMTlVaVVFQS0tZ/NTLxMbO3XZfa3fp0tHX2d93ZGludvfo4OLj +3d7U0NTV1c/X6GVZT0tMSUZEREZJUl1peGxeWVtk7tnQzMrL0+huYXLu49zW0dXhatvA2+7W +yc/LzM/N5mxZUUxFPz8+Pj9FR0pUVVxt7dzQz9ja5fr4bU1D6NN41sLHxrq7vb7Bw8bGyM7d +6N54TjsuKikqLzU7QVrLubCvr7W9y3xKOzIuMDtYz8C9urezs7i+x8nBvLi7wcv6RTsuIx4d +HSY66LeqpaKfoqq4TS0mIiAiKTXtsKagoaivvuRPQjxG+sSvq6+zvmozHxgUFRsoWq+hnJmX +m6K4OSMcGxwfLEi3o5ybn6nBTDguLTFDyq2ko6asu1MpGBIQEx02vqSbmJWWnKxNIhkYGh4s +ULmjm5qdp8g6KyUnKzfbrqKcm6GqvTofEg0NEiBcqZuVlJSYos4qGhUXHChGvaidmpuhtz4o +IB8kLUq4o5uZmp+uzjomGQ4NEBg0rZ6YlZeZnbI5HxcVHCc+vKuknZygrGkrIR8jL1q9qJ6b +m56nv0AsIRsUDxIcMrGem5qanqKtSiMaGBwtYbmqpaKfo7NRKx8fKTfos6minp6iqrxJMy0q +KB4XGB4q06qnoqCkparMMCQeIC9UzretqaWnuE4uJSYwSs+3raeioKWuxlE5NT87KBwWGCA1 +xK6qpaKhoKreLiEfJjdczLmwrKitxUMsKC08eLytp6Sgo6y8fkE4ODEhFhQZIEevrKafoqGf +rk4sHx0oPPu8tLmxq7TMRCwoMEXOsauooaClrLpZPTYrIRgTFh0vv6umn56fnqbMMSQeIS9H +27y4s6utvOs5LC88aL2wraikpqqw0Es/LyMaExUaJV2yqJ+dnZygtj0mHh4oN03Qu7Gppau7 +Ty8sM0HpwretpaKjqLX0QC4fFhMUFyNStKObmpqan7dEJBobHyk9z7qsoZ+jrdc0KyovQt+8 +raSfnqKuzjkkGhMRExkmWqyemZeYm6O+NSEaGR0oPsivpp+fpK3VNyspLj7qvK2moZ+lr8o8 +IxkTEhUcKmOtn5qXmJujuTojHBodJjVvu6yjoKKrvk41MDZEfMCyrKinq7THTCgaFxUVHCs/ +uKKempeaoa5cKB8dHCEsOOqupaCfpbPQTT0/T/fIuLKwr7TBWzMhGxkZHCY1abOmnpuanaa6 +QikiHyAlKzbls6ehoqq2zGpdbXjdxru0sbTA+T0qHxwbHCErPMqupp+dnaGpvz4sJiMlKSoy +Wr+tpaarsr7Jx8LGyMbFvri5yk0zJR0cHB4kLUDIrqSfnZ2irMBELiglJigrM0/Crqemqa+7 +w8O/wMHCxcbCyl89LyYfHh4fJi4/xa2noJ6fpKu4XjctJyUmKS9Gy7OrqKmtsLW6urq9v8DH +32pINy4kHh0dHig2aLerpaGfoKWtw0YvKigmJys1TMayrKmqra+0t7e4vMLExuVQQjUqJB8d +HSAoN922qqOgoKKnss5GMSonJSgvPfW6r6yrrbCxs7O0uL7Cw9FcRDgsJSEdHR8kLVS/r6Wg +oKGkrLvqOywoJSYsOVjCtK6tra+wsbK1trq/v8PTWT8wJh8dHB4jKTfouKujoKGkqrbaQjAq +Ky0yQ3jRv7m2tLKztbW1uLm6wMTG31E9LSQeHR0gKDFIyrOqo6GiqK/EVjsyLzA3Pktg4M3B +u7i1s7KztLa4vL/F2GlKNi0nHx4fIicxROW3q6ejoqWsuF0wKikrNEvlwrm3tbGvr6+xtbnB +7lBOQDk/S05aRy8qJyQpMTc/WPnItKupqrHOT05UX9rbdGBiadjDv8LCv720r7S7x19CQEA/ +SE5ISz0pJCclKjtBQ/nWyrOqrbCwusa8vc/WYkBAS09p0s/MvLOvrK241VlEODI1NjlNW1ha +OionJikwPUlU+c/AsKmop6mts7nB2lU+NDM5Re2+t7Sysra5vt5NST46PDo1LigiHyEoL0LN +vLSsqaelpamtsr3aaks7NTQ3RefCu7m7wL/BysvnRTAmHx4fJS07/cG3rqyqqqussLW8x9hZ +Pzs8R+zFvL7L31tOWlRHOi0pKCkuO07dxrmxrauttL/TdVxSVFBOWGbexLewsLa+3VJKSEQ9 +MCciISMpOFjMubGuq6mqrbC4wMrZY0c7MjI8Wcu7tLe+y9z4fXNSRTsvKCQiJS0/8b60sK6s +rK2trrW7wttXRj06QF3by8HH71dPVWFYSDkvLCknKi41Q/e/squoqamqrrO2vsngWUY+R1vx +zsfQ4+h1aWBJOCwkISAjKjFA+ce5r6qmpqanqq2zvdlOPjo/Unncy8nP0NntaE06LSgkHx8i +KC9G0LerpqWkpKaqrbK+1XJLP0dj3srAxcbC0HVPOCkgHRwdISkzS8y4rKSgn6CkqrC5xuVP +Pjk8RlTiw7q4uLvGWDQnHxwdHiMrN1PBraWgnZ2hqK+6zl5EOzk+PkJY28C0sr5XNisjHx8g +ISgwRsaup6Genp+fpK270kw5Nzk4OUBPft9MODQvKywvLi4yOkzJs6yppaWmpqmxvMl8VFxT +Qz9ESDwtKCopKi81ODtK+8CtqKimp6qrrLLE/01DS25xUk1JPzMqKCYkJiouNkNpxK+moJ6c +nZ+jqbfoRjkzNDk5Nzk3LSkoJyYmKSsuOEzZt6iinpuanJ2fqLLEb0tJSkU7NiwkIB8fHx8f +IycvP922qqKenJubnZ+mrbnRXVhs/WxSOy8pIh8eHRwdICcyUMKwqKCdm5ucoKevv+FbTFDp +0/BPRDkuKigkICAhIigwPmi8q6Sem5yfo6u2xNxXR0tXYVhJQjwwKyonJScpKzFAZMeyqKOh +oKSpr7nOY0xFQUdV+9nU3d/1RzUtKCIhIyYsOGC+raOfnp+iqbC710o6MCwtMTxhw7i1sa6w +v1UzJh8eHyIpM0jVtKiioJ+jqa+83EMzKiYlKDFLxLCpop+gpKq7RSwkHhwcHR4lMVC7qJ+d +nZ2iqrf8NSgiHx8iJy9GxayinJmYmZuhr+UvHxsYFhYXGh4sTrqnnpubm52krss6KCIfHyMq +NEjMsKaem5mZm56ovkUpHRgVFBQXGyEuVrinnpqZmpygqr5FLCQhISQqM0fQtKignZubm5+q +wT4mHBYUExQXHCU20q6inZmYmZugrMY+KSAeHh8mLz/Qr6WenJubm56nu0YrHRgVFBMVGh8t +cbCknJmYmZufq8dBKh8dHh8lL0bPr6Odm5mZmp2lu0ApHRcTEhETGB8sXLGjnJeVlpmdqLxN +LSAcGx4jLEDXtaeenJuanJ+ovEcrHhgVFBQVGiI00aygm5eVlpqfqsNCKx8bGhwfKTlsvayj +n52dnp+krco9Kh8aGRkZGyEuU7yqop2ampyhrMZBLiUdGhwfKDZcv66knpycnZ+iqLdjNykf +GxsaGh4nM1K+rqihnp6jqrXYRTEmIB8kKzdP07qtpqOhoqSlpam16UAxIhwcGxocJCw72rWr +pJ6doKWpt+1DLyUiJiktOlDbvK6ppqSkpaaprb9MNi8mHh0fHyAoMDdTvK+spqKlqq21xlg9 +NzUyMTY7Pkrfv7i1trKur7e4uL/N7EYzMzo1KyktMDExOFPPyce6srO3t7S4wtV+Wkk+NzY5 +PEVty7+5r6qqq62vuclePjIrJiQjJCgtN0J0xby2sq+urrK8yNxZSUQ9Oj1GS1vbxbuyra2t +rbC7yvhGMywpJycoLDA5RFzWxL27trS3u8LO4G5PREFDRUtd682/ure0sbGytLvJb0M4ODQt +LDI2MjdJVlXnxsnLv7/R2thjTVlbSk3+3dvKwb22tLi5t7q/xNBzWko1LS8xLS87Pj9s1Pje +wsPJwMfh2N9JP0xKSWvn69LBtLO6sq2xsrS6u+BGQTEnJCEiJCQqPVrHr6qmoqOqr7rmQC4l +JCcpLTt4uKumo6KhpKmzv8PLSzEsLCofGyAoJixD77alpKWhoKm5z0QuLCgfIS07Tc63raSh +qa+ur7zN7ei/uv4+TlkuHR4jICUsLlyrpqmjnqOvv0UtLSsiICo4Tci4sqiiqLG0ub/BytXG +s66+eGdbOR4WGyEeIS9qrJ6fo5+erOA6KiYoJyUrSMS2r66sp6q78H3Yz8vTzrGkp75w200g +ExUaGx8uU62bmZ2en63iNSIeIyknLVm3q6ertK+w1z9CXsu2s7SonqCw9T4tGxAQFhslSLmj +mJWaoKvdLyUdGyAvQuO0qKKirMR5VkA1NUrBq6Skop2fs0guIxgODxgeLcKonZaWnqzGMSAe +HB0s9LapoqOmqr86LSwtNEbasaKen6Cip7FTJx8dEw8YISvHpqSdmJ+11zUhIyclMcKrpqCn +ucdrLiQmLDzMs6uhnJ+mq7XAzD4oJx4REh4pNb2rp5yZp8lkMSUpKilJrqilpbhZTzYkIyw5 +zaunpZ6fqbTC9trLRTNGORoTHSIoa8jCo5qjs786KTU2LD+6rqajukZENScpLjbKqaamoqaw +u9BZ2b3F1/Y/JBURGCIyebemm5ies04vLC0sLki3p6SszUAzKygrOPuvo6Chpa/D2WNa0r3E +3dNNHxIRFyE53rmimJierk8sLC4tME+9raiv2zksKzI9TMuvpaCjrshtYvvcxLm1t849IBEO +FR8zyKygmJWbrGArJCcpLDvWs6enukk2MzdDTWy7q6Wmrsbl1MzKu7nG1Wo8IxQPFSEzxayl +mpWapswtISYtLDVvu6ijslY+OztFRD5xtKmmqbjIw7/Hyc3xQjczJBcUHCtKtKmonpqeq9Ys +IykvMD/vwK2rvl1JPT9XXF7LtKuoqrXGztHKzPs/MS4qHRcYIT68p6Sjnp2luUAnIys1PmzE +tKyvx086NDxMYNzAsqmnrsLh9d/MyvdLPzgtHhgYIDvAqqWinp2kuD8nIyo0PVfLtq2vwFY7 +Nj9PYePEta2qsMpncdO/vMbqW1I4IRgWHC3ysqmknpyerU4pISYvOj9av62pseo8NjpMZlx6 +wa+prLx6W9e/ub3M3+pmOiQaFhssT8CuqJ+bnatxLyYnLjQ3Q9eyqKq+Uz8+RUtAQOq4ra22 +ztzIv77Czut2/0ovIhsaIzRYvKylnpygsHoxJygrLC8/2rSqrbnMXEZEQUFU1b2zr7O8x9Tc +ycnX5lhEOiwfHB8pO8asp6Gen6m7PygjJSgtPFvBq6asudw/PERMU/LOvrGtts9bTWjFvMPT +2OpJLh4aGyM+uqqjnp6fpr8yIR0eJjA9/rSln6OwaTc1OUFPVe+9r66210lP0Luysb9dWGsx +HRgaHza7q6ihoKOntTkjHyEnNkxsvKmlqK7PPz9MTmF9UmTEvcree3DFsKytsspOPSsdGBke +L8SrpZ+gpKi0SyskIyg1R1bOtq6tsb/6Y25bVk9BQmHX0M7Gv7etqqyxxUg+OyYaGhwiPbqv +rKaoqamyXTcwKy46OTZLzr6zrrK4t8J0Tj4yMz1K47qyr62sra61ykk6LyUfHRsgMmS5q6mq +qKituuE1KCgqLDZGasCspaWptN5MPjUyMTRCzrOur7K1tLK4w/JCPTotIx0bHy1KxbStqaOf +pK/cOCooKSsvOWC6q6eorbjLZUQ4MjE2RerEura0srCvs7fCbEw6KB4bGx8rSMqxp6Oio6i1 +2UAuKCgrLz1dyrWsq6uvu9BcRDs4ODpCc8i6sq+vr66xuM1DLyYeGxweJjjPsKmko6Slq7h7 +NysnKCsvOVTHs6qnqK22xW9IOjAuMz5iyLixrqyrrbPGUzksIh4cHSIuSsGxq6eko6SqulMz +KicnKiwyTcGvpqKlqq+97EMyKigsOVjEtq+rqaqstM1POiwhHBocIi5KzLispJ6dnqW3WjQq +JSMiJCxDxK2kn6GkqrbXPi0nJys1Tcy5r6qpqqyzwek+KR4bGhwhLDzftaiempmcpbdPMCcg +Hh4jLk66qqKfn6Orunk5LCgoLTZH47+2r6uqq620zjomHBkaHCErO9OsnpmXmJ2qxEAsIx4c +HSMuTrqpop+foqizz0IwLCssMT5VzrmvqqiprbtOKh4bGhseJzNqsqKbmZmep7XsOSsiHh4i +KzhwuKukn6Ckq7npQTUuLC0xPF+/sq2srK66Zy4gHh0dISgvTLuonpubn6aux0w1KCIgJCoz +S8+2qaOhpKq1y1w/NC4tMDpPy7mzr6+wu2MvJCAfHyQqL0m9qqCdnaGmrLxtOiokJCgqLjtg +wK2lpKeqsL3RTzcuLTA8WNS/uLOxsLh0LyYkIiMmKC1Fv6ykoKCjpKm4+jssJicpKSszRsmu +p6epqq61wF03LzA2P05tz721sK+67zcsKScjJCYsQMmwqqWioaGntuc+LysqKSYnL0rKtK2s +qqiqsL91RDw5OTg9U9XBuri5vtw9LywmIyUoLT/OuKyloKCiqLbVUDsuKycmKTFCecCyrKim +qbG901VDPTc0PVXhzca+vML1PDIuKicpKzBA372xqaSio6m2xntBNC0pJyozPEzSua6pp6uv +tb3SYkM4OD9OVl/22szQTDg4NS0sLS42T9vHtayop6etuL3NUDszLS0xNTdC+Ma5sK+yr7C5 +wtVaRUNER09TXOfX+E1EQjw0Ly4vNj9Kc8W4r6ysr7Gyucn/TUE+OjQyNj9Nd9bKwLmzs7e9 +xtHqYFNPT1Ra9NnkVEVDPDczLy8zO0RT3cO5sq6tr7O5vsfVaEg9OTk8PT5DT/3PxL++vb7A +xM3oXlteZ2323drhbVZPSUA6NjU2O0FKXdzJwr69vb29wMnY9GZeWVBNUV5w9dzQz87S2d/t +eGVqYGt14NzX1Nrh3ndbTUtJQ0JCRkpTXF1259vS0Nbf6+zu8/Py7vbi3d7Z19XU2ePn7Pdq +bPt+5tjZ3eTt73dqYldUWFlYW1tq6uHtbm1mYFtVT09PU1lfY2vk19XV0M3Oz9re6uXp+fz5 +6eHV2N3e4/78X1NST09SUlZu4tzUy8zLzdPiemBSSkRCRkdISlBedePd39jZ39/l6n/q3NfY +0s7Tztfc1uJ6a1xXW11QYmvu6OHe1NLY1t7u+nNbV1RNS0lPU1JZXFVXYF5fYGR2buff2NDQ +zM/N1M/T1eXb63xoY/B+6GTi7Nvo59/wb2p1XWBWWFBWY2X86+nraWNdXFBTS1FRVF/yfuLd +29jc09na2+nnctvz39/Z1ezQ3NLX291p5WBeUVVXU29UcWnvb2/9/Od2cGN7WlxmaWNaaFVj +Ymdebu5m8H7r79ze69Pj0OLN4NbP5t5r+W5k/VdyYHVvatxY0V3e23PYVX3wXPZ3YvRpb/D+ +WV9PUlhKS1dQVlnzftnVy9XS0NXc197w2uxz7fT94WrXXvnu2XTV4V3Wa99W21L1a2DbR89c +XNpK8FRRUVtNTGVM+F56fO/y2d7e3O/p5ep0y+L7xtva5NDzzevoadN/9nvtWulRXv1fculH +0Edf51N5WvRaaXVgTGtWb1nsSdFc99VQznvsxlrJcM/u8shb189c3dxlYdnmbtZv2t9b2/hW +3HZO2XpP0fpc2lhseU5cTUlRQkxQRf/4Wcvg4sbP0NPa1N9b3t1g29xwbdnjX9rYXN7c/Wz8 +3e711+9t3c55atB8c9/uUUpHQkU8PkVBTFdg8NrHy8nF1M3L4NrtXnXbXWvY4ePa2unPyN7a +7tjaXu52aGxsa3P319bya35YSzw7RDo6QUJPbM7Nyb/CurzMzu7qUk5NQk9OVWtt08jDxcLA +xsjT2ONbcmFbbnjc1dTX3uNkTzguNz4wLjpKeNHLvbW2s7C5zt94UEQ7ODs+TGv75sO4uri3 +vb/Ncl1QS01cWG7f0MTJ0dlxQy0qLzUuLDlTzry1rKyurq+55Us+OTMtLjE6VNbAubOurrC3 +xORRRkJCQkNR38K4tbvGz18xIyQuLyosP8y0raimqq6vuOE2Li4sKywyPWC9r6usra2yvdtO +PTc5P0tZ7si1raywwmRDLB0cIScpMV24q6WfnqWvutM8KiQlJik1VMy5rKWlq6+76kU5MzEy +PFnPvLayrq2stNc9LCIaGSErL0q4pZ+fn6Ct0ks1KCAhKTE/ya6qqqmqsMhWPjIvMztBUMy3 +sbKztru7v8pPMy4oGxgmPkjrtKaio6Clxzs3MCklKjlRy6ylqrC5x3xANzEvOmDSycC8ubu/ +wdF728jFzu5XRS0cGic5PVu8rKahnqfUOzUuKyotOE63paWstMdWPjkyLTNewLq4t7m+xMxt +TVnk08S8vsn+OiAWGy03QcSup56cn7w6LysoKi41WLKhoaq13T8zLy4uONOzrq2xvc30Tz06 +U97Pu7Gytr52LBYPHTM8z62lnZibsDQpJSIoLzX1q56fqbdqMi0pJy5JwK2pqa6+11A6ODtS +z8K1rK2vtNwyHQ8PIUR8s6OdmZqoPyQjIiQvPeyrnp6ouf00KywpMOm5sK2sr7/vRjY5Rk/i +xLmtqq63yTsfFA8WMcuwo56amaLoJx8hIy1A6q6fn6m7ZDcrKikv6rOvr7C0veZFNzpSX2/I +uLCsqq/DPCYbEhEffrGknZycn7osHx8hKT/OsKCep7jzOiwoJy7+sq6ysrG5zE86OkhdX9a+ +tKyrr71MKR0WDxlasqmcm52fry8dHiMmOsKwoZykvVU5LCUmLF+vrLGzs7nEaj07S2di+sa3 +rqqutdAtHxoREyu5rJ+anKGqSx4dJCYt3q+lnZ+1XEYwJSIoPLeprbaxr7xnPDpES0hPy7Gt +rq2uuk4oGxMQH8m3q5uZnaXWJR4kJSU9tKWenq3ZZT4oISYz3LKztqyps9hIP0g/OD/PsK+v +q6y3dzEiGRIVLb2zp5uanq5DJSUoIydMsaahp7a8wT8nJSw/z8XJsaWouu1eWkQxLUe8tLiw +qau1TiYcFRIbPde1npibobU/LSkgHivetKqjp6qrxjIpKCkzRmW7pqOrs7vQRjArNV7UybKp +qq/EPCkaDxQuREKtmZebo8FBOycZHTVtxa6no5+n4TUzMyonMe21rq6rqa7RPDU7PTlIvKyw +t7nNPh4RFywtKsKdmpyfrLXALhwfLS4z3K+noaa0w9U/KyozO0jww6+prr3DzmtKPUnPwMTM +yslCHxYgNCQnvqChpKSlp7suIy4xIiZbt66srKutvkw7Pj02O1zRwry7t7vM3tTV29TLzldG +SiwaHDMsIk6noqSipKSqSicuMiIfMs6/uK6pqbPQY1M/MzVHYGnPubK5xL+8ztnDvs5PR0It +Hh0lKigvyailpqGepL9BODAlHyU4Zsq4qqWqrrjPVjsyNDtAUs+6tba0t72/wsnXV0A8Khob +LiYcN7OtqaGdmZ2/Td42HBslKStKvKmgoqikpdE4PzcpKTRE2b21q6qusrS/Xj05Lx8YHSkf +IlG0rqiem5mfsr7dKxwdIh8iOMmtpaKenKO40GQwIyIqMzxftqemqaent14+LSAeHBsfJy9W +taihnJueoanBOighHxscJDL7t6ufmpyipq7fMygmKCktPsOuqKeopa9ILysgHR4cIDJDbq+g +n5+dn6ex6DstIR0eICg3VLqln5+en6i1zEYyLCkqMj9UxLSur7rOTTMpJiUkKC85Wr2uqaSi +paiuvmo6LSUjJiouSsG2raaio6euu8xVNjE1NDVBWNLBxMbaSTk1LCktLjE+YtC7sK6rqa20 +ucdLODcyLC46SmbRva+srayrrrvNekc8NzY7PDlg5D1xzz5ATTg0UD4x8MZf3ra3vLbAwLzi +UmpaQEpYTe/X2cW+xcS5vcrK1WdSSz4/QkJGT3rz1tNeYN1TPD0+ODg8QVPfzsW5try9vcHH +z+f16W1ba3pWXWxga3fv6djS3tjP2u5uVFJeVk9k4ufz5uL/W0pESUdFTF3q3+HWy9Dl5OH+ +W1ZWWXD8dPvl4N7W09HOy8fFxsvW42dWU05LTVZbYejd5fBrXU1ISExWY+jWz8zJy9joc1JP +T0lIT1ZTZufy7Nrd39jX2dnT1uh1a2RfXXfk3NDPysfO5PZkT0tLS1VYYufW09HW1/FeT01O +S0pOXFrz5Pb82dva3tb9dHZbTV1WZmvO3vHT/L3Q1MvV2E1ST2RRR+Lr6fjJy83b/d9iXkpF +WmJCS/bW3+XSz8x3WOZ3UUhU8l9bXPPV5WDlzehbdenrX1VdXFtUX9TVzMjDvsvK6d7kT1FP +ak9l3l/N0vXZ4NxSVGZJTlRTZFhGTV5KP05VU1heeNzN5N/Dw8vLwMTLx9bZz/pcZuxuW3rs +08/S0czI2HbebVxQRzovOTwvMDtERlFl1Ly8wbu0t8LJ1v5pSz9FU1Vd38/Fvr69u73JzMne +X1ZSVFZRUH3a6E01MT88Kys4QkRJYcCvsryxqrC/0/BbSDQvO0Y/QeW9uLe2sa21ydTO7kQ8 +PUdPRkzSv8LMXz06Oi4oKzE2PEnfta2uramqrr16Rz81LCswNz5ixrWtrK6trrvUbE0/OTQ5 +T/Dtzruzsb1aOzIuJyAjLDU9Vr+rpaapqKmy3T0yLywoKDJK3b+xqqaorra+10c4NDU4OkXc +vbW0r6ywzDwrJiQfHCAvR9+5qqCdn6mut+80KCQkJyozZbutp6SkqK/HWj82Ly82QXHMv7Cq +q6+zx0cyJB0eHx4mPtaxpqKfnqOxxFYvKCQhJjFE0rOqpaOosLzcRDYwLzZEVdK4r66usrm/ +4jwtKiUfHyQuQ9u7rKOhpqy0yUwxKSgtND9rw6+qrK6yu89MOTQ4Oz1M2L22tbe4t73VXUo/ +Ni8pJCcvN0PuwbKrq6+1vNdNOi8xOkNU1r2zrbG5vcfnTz88QkxOWdrCvLu9wMHRdFxNPzky +KiUoLzxUz7uuqKmvuclrQzYuLztQ5Ma6tLG0wNpkT0U+PEZu2c7IxL+9vsTO3eruaFlXTDUl +IiwzN0V6vamlq7G5zV4/LioyR1/Ru7Gsrr7YaVFIPDU7VdzHwr+9ur/fWV94+fhpbtnTazMg +Ii84PEzqtKOirLfC60w4KSk4Uty+uLKts9NWSj89OzlJz768ur3CxdpSSU1Z59nRvre88i0d +HystNUjtr56eqK/AVT0uJCUzSc61sa2qsdFVQTg4OTtUxbq2tb3M1WNDQEti3M7CuLe8+jMi +HiEqNEHXr6KeoavATTctKCcsO9m1rayttMP/RjczOEFkx7q1tLrL900/RFrmz8jCvr/K5zwi +HCArPHXMt6WeoazLOy8wLSktPsytqaywuc9tSjg0O0Zry8S/ur3N3FxJUnB42cTM3MzJ3T8l +HCIxStjJu6mfo67NPTE0MSwwQtGxq661vutQSjo1O0f3w72+vL3H12dFRl7s4tvPysLAzUMl +HSMuQubTvamhpK7NPDMzLy0zQN6zq62xvN5aTTw2OD5jw72+u77JznBEP0pV+M/JysK9wvUx +ISAqOVLey7Smoqm4WjUyNTEvNUnDr62yu81yb0w5NztNz72+vbq+xtlMPUJWeNbO1MS7xe0+ +KSAnMkL4ybuspqiyzz80NjYyNkPguK+zu8LpV1xHOz1IdMe9wL68xtZcQEBY6NrLx8S9wc5W +LSAhLDlR4M21qKWsu1c4ODk0MjlNx7OxuLzI5uZbPTxFWc2/w8O/xdH5SkFOcODOxsnGvcNT +KR4iLD5ZZs+xpaSqvFE8OzgwLzRHx7WytLrDzuZXQDxAUNrGw8HCxs/mUUNGXdvHx8zDu7hg +IhwgKz9dWOCsn6Cnu0k5OzErLTFLuq2ur7S+xfA+NzY5RXXOv7a3vcbkVExMT3Xd1Mq9trlB +Hh0lLUBPSM+nn6KpwEhBPi0pKzBWt6+urbG6vd84LzMzPnDbwrOyur3STktLR1V8XefBvbq7 +Oh4hLDFGTULEo6CkqcpCTEUvLC4vVrSyt7W7vrjUNzAyNErf/M64trm9+URZ7WFsaW3LvLq8 +UyUgKjA7Pz9mrqKkqbhzU1M3KyssOsu3t7W1t7S6Vzc1Nz5baO3Ft7W5zU9P+PZubVte1MbG +ykIlJS81PklF7q6lpqu7bl9kOy0tLjzMu726t7ezuVg3NztFWllT2by3usTvY+LeZU5LTurK +zMldKyk1NjtHRFqzqKmrtd1k9kAvLi42a8XCurS1s7lzPT4+PUZJTNi6t7vG7GrZ0X1jZmXp +y8jgOiosMTpERU7PsKmprsDtZ1M7MC4uOnjFvLm3tbS+/kc/P0VQWmnTwby/zOpt7N7md2JW +ZtbYRCsqLjlXYlPzu6ypqrt0T09GOzUvNFDJvLm5vLq92E8/PD9NY2rnyr+9v8zo79zb5urq +49RMKygqLj9mXF/Br6qmrcpQSUE7OC4tO968tLS8u7e810k2Mz1SaO/e1MG3u8vsW2Df2Xhe +WVn06DstLzM//eNq2bqxra7FVE1RTEI3Lzdcyby8xse/vstvSUNPe+Lj7/rYxL6/w8bH1kw0 +KScqMT1IYseyqqirtsr+Tj0zLS00S8y9ubWztrvE90M5Nzg8RFPly7+6u8DL1nRZUUtQY/3e +09XY31c6Njc4RVtf78q6trO51WJaUktHPzxGauDPy9DOxsPK1eJpXW397fPt28zGx8bfPDMy +LzU8PUFazLuvrbTAyN9iVUU4MjhFb83DxcW9u77KbUhGS0tIR01d2sW/wsjO1dvwWU1GRk9t +7fv67m1MSU1KVGpiW1/fy8K/y+fo7PX6b1NIT1tefu3gzsjKzM3a4NjT2+nn39zV7kU2MjA3 +Rk5XbdbEu7W4xNLoaVtUTEZESk9b/ePTzMjIyMzX53thWVFPT09YceLWzMrJy9PoaFRJSExU +WV9x8t/oYVhbUE1UVVVp3dXLxMfMzdHe+G5fXFxcWmDt3tPP1tvX0M3MztTY22hDNC8uMz1M +WurMv7ezs7vL5F1PTEU+PkJNddbP0s7LycXHz9zwalpWWFdUVFtr3M3JycrP2u1fT0lGSUlH +QUFJS1L53dvPzMrDv8TP3PllbWdVSkxVXenQz9HMzc7P1Nnl/nFt+9/c5VxCOTU1OT5ETFzZ +wbavsLfB0OpeTUU9OTxEVf7YzcfDw8bN3fxoXVlWV11jae3c19DNzMvO2uXueV9ENzIvMTpH +U+zKvLawrrK7xd9SRT04NTY6QlzRxb+8u7u8vsXVe1pMSktTbeLaZkk/Ojk+Q0dPW3DUvra2 +uL3N3/BeTkc/PD5JXffVzcvKxsLFzdxyU05OTVBXaeHRysbHyMzV1eFJODIuLjU8QlLix7iu +rK2vt8XfWz83Mi8vND5X17+5uLa2uLvG21xKQ0JFTW/SycreUkI8Ojs/QUhW9s28trS3vMvx +WktFQD09PT9IZNPHxMfHxcTAxdT5UklGS1x5283LyMG/vr3EYDovKyotNDpEWd6+r6qprLPE +7E8+NzQwLi84SNm8sq+vs7i5vcnwTkA8PkRT78zBwtVQPjg2Njo+PkFU3MC1r7G3vs19WUtA +PDo3Okd+zMK/vr+9u77I21lHQUBGWuLOx8TFxcC9vsxFLysnJy42PlfeyLarpqeqtd9IOjEv +Ly4uM0L6vK2qq662vsjZaU8/OTc9Tt6/ubi7ylI3Ly0sMDY4QGLKtqypqq63ymJHOjQzMC82 +RG7Huba1tbm+w91RRj89Pklj08K+vru7ubq/2TsqJSAiLDhF4sO7saeipKm3VzYuKysuLzA7 +Xcewp6aqr7/ZdVRHPjg0N0J3yLexs7S+/j0uKCUmKjA/77+wqaamqK+/ZD0wLCwtLjdRyriv +ra+0usjiT0E8ODY8S3XIuri5uLu9v8zpTS8kISAjMEvgv7Stp6GgqLZ1LyknKC00OkXiu62m +pau2zU4/Pzw9PDs+UNO9sq+ytr3JZTkrIh8iKTn2v7KrqKWlqrd9NiknKCw0P1/Jt62rrbC+ +6E5BOzs8Pkhpyru0sra6vsbQ5F5HNCcgICQuT8q7s6+rpqSquVUuJycrMj5Nasq0rKiosMZj +Pjk9Pj5ASVjZv7q3t7q+v83qWj0sIx8iKjzZvbOtq6inq7lnNSspLDA7S+/BsqytrrrbVklA +PT4+QVTVv7i3vsPGyszbXEtEOzApJSctQ8+7sa6tq6msu1ozKiktOERU9ca0rq2vu+VRRT49 +QEZR+NLIv7+/v76/xthbSUU6LSUiJi9Oybmxrqyqq7PMQzAsLTI7Sn7Dta+vs7vI6k9BOjg+ +TuvMxMHCvrm7xd1SSEpLPi8lIic1c8G8uLCqp6ey7DkwLy8yNTtevrGutby+wcn3Qzc4RXbV +1dzYx7u3u8vvaGV+X0IzJyMnLjxnzb2vqKapr8ZePjYvLjI8XMe7ury7usDNbUQ+QEld6eLd +yL69vL/N09f1ZVRANSwnKS89Ws28s62sr7jIXj83MzI4Q2bNwsC+ubm+zGpKR0pLU3ngzcTE +x8XBw8fQeVtbRDYsJyovOUn6w7WurK+1vs1uQzMvMjlJ78/Mv7a4vcTadWNTRkZTYuPMy8a9 +u7y+zd3nVj4xKigtMTY+TN67r66vs7e/zlw7NDc7P01efcy+u7m4u8LN61JMT01OTk9acOjh +0srR3NnkbVxSSkA9P0NFSFX/28rCxMvS3N/qaFhYbubp+Xt33s7R619ebufc3uLd1c/R297d +3eLo6uPkaExDPj0+Pz1AS17v3NrXz9Ha5O7r39fY3efe1NHZ7mpfa+3p39XPzMnLzc/S1+V6 +aF1aVUpCPjs6Oz1BTFr92MzIxcbO2+j9c3ZybXrt5eHe3+bl5ODm6ufe08/OzdDV0s/T3OX1 +Xk5JQTw7Ozo7PkhY+NLKxcLHzdXld2xsa29/8unj29bU19zf3t/g3Nzb3NfW2+Hk5ODd6mZV +S0U/PDk5PUFMXuvSyMPDwsbL1/JsXVhZXF1meubj3NfZ3NjV1dbZ2Nvm/Pfq2tnZ3ex2YltP +Rj8+PT0/RUxZ79bMyMjM1Nrc4+zp7erl3Nzf4ejg5PN3amhy7+Xo7uTd29jT0NPX2+hfTUhD +Pz9AQUVMV2jx39HNzc/X5Ov07fN5dvfh4N/d3eLi4vJ5dvjo5O5+7d7Uz8/Q0tbc3/FcTUhD +Pz9BREZMWWru3dze3dvc3ub19Ofc3+fh3tjZ3uxua294+XVudvzm3Nva2dnY2tnd8m5gWlFO +T01MT1JQWGNod+fd7vfq7uzr6e72/Ozm7vPu+2hgam5scPjo3tbT1tPPz83O1t/yb2trYFJL +R0lLTlFOTFNdbtzT0tXY3NzW2+Li7GpdXV1kbG5rbPzr4eTp4N7d3ODv5+Pt9Pnt5uTi7mha +VFBMTVBSU1laXnvh1M/O0tfY3ePse29kW1lfaWpfYWpy7N/e4tvW3OHj6/v67Pjt5+bpdlxX +WVNUVVFRUFdebOrZ2NfR0tfc5u3v9/5pXlxfZG14dvz8/Pb17+ni4OTn5+zs6Ojk4OPm729h +XFhQTU5OU1xiZ2t3/e3c29vZ2+fw7PV6eXxtbPfx9O/p4N3b3NfV2eDu8vTu+GZYT1BOTU1L +S1Jeav35/Ojc1NPS0NDS1t3o+21ma2ldXV5dXV5eYmZ+6N7a3N7c2tXS0tnd3+5+d2tcV1RO +S0tNTlVbW2N1+uvf4N3c3N3f4e39e2xt9+3s5ePm5ubf3trW19jc3NjZ3+9uYldOS0ZER0xO +VV9sdX379O3m3NzZ1dXY2N/ze3j7fGppamJhY29xfezs6N/b1tDS19fa4OXp9W9jWE9MS0tK +SkxPV2Bv+/Dm3NvZ1tfW2t7j6/n3dmdia/r17Ovr5N3c2uDn3drd6fHq6ObsallTTkxKSUpN +T1dYXXrq6Ovr7u/p8Orj6Ojm7e7r93x28+Hf3NfW1dLR1NTW3eHq7vDz/HhvbWxeWFFNSEZG +RkpPVVtke+Xb2NjX3N/i3+Hl4+bu+PXt9vZ+dn5weO3o497c293f3Nrc2tjb3uLp/mRaUE1M +TEtJSUxVY37m3NXY29zg5enxdmlganJze3z05+nr7Orj4ujq7PPr5unt7+7+9/Ht6PD0dVxR +S0dFREZNWGnp1szKx8fKz9nc8W5fWFZXWlteYXL35trW1dPT193j6+v4+fn98eXd3d/j8V1L +Qj05ODk8QlfjzMG9vL3AyNDialxWTk5OT1decuLSy8XBv8DHzNbncGNeZ2x56eDe3uL5W0U6 +NC8vMTdEbMq8trS1ub7J3mdVTEVAPTw9RVXfxbq1tLe9x9j+XVVVV19+59zTzcvO3Vo/My0q +Ky86Vse4sK6vs7rD0P5WRz03MzI3P1/Gt6+usbe+zvVaTk1OUllk8dbJwb2/ym88LCUiIys4 +a72xrq2vsrS4vtZOOC4rLDA+472xra+zuL/Kz+FhTUA9QFDewri2t7zNWj0uJiQjJi9G0rau +rKurrrXCez0wKyotN0vOubOwsra4vcjeWkY+PUJP3MO9u7q9vcLjSTQnISEkLkzHt7Cvrq2t +sL1vOSwpKzJI4Me8ureysbW+3UxBQEZWdeTazcK9t7a8xWw7LikiIykwS8u8tK6tra+55EE0 +LS00PVHaxbqzsLG2wNhfUlBVXVla786/t7e+ydh0Xks5LSYhJi9Ezby5trSwsLjNRzYxMz1M +W+nNw7q2ucHR/WT08mRYTlH7zMXDwMLJys3f9ls/NS0mJy896ry6uLW0s7jGTzgyMjhGUWPS +x765u7/Hztt6Wk9MU2Xiz83Nx8HAwsfS9VZDNy0lJCw5XsO+u7SvrbDBUjg1OD1FR0r7xry3 +uL7Jzdl/W01KU3bk2tnXyr25u8TZb2dYQzUqIiQuP/vGwbyxra+41kU7PT8+Pz1G3L65ub3G +y8fObVFKTu3W29vczr+4uL/P53NuVj4wKCMnMD5b0cW5rqyuu+BNQ0M+Ojk6Stm/u7y+wcDF +1GFLS1Jl6OXn0MO9ur3Hztze22hENSwoKC47S+DGvLWytbrD5VNHPjo6PUhezr+9vcHKxsni +XU5LVXTr49vPyMPDyM/U2+fk7VtCNSwqLz5Pe93hybeztbrLbFdRSEI9PUdc2MfIy8nKyczt +XF1h/uN6XGndzMXEy9XU1tzo93hONSosMTlNaVBfxrqzrrfK1+JsXE0+O0FPd9fY28/IwMDL +53JoXmJmYFx83dnPzMzKyMzV7Uw4MDAyNTxGTWbOvbi0t73G0+x4XUk/PkFIUmjs2c/KxMTG +ytLnal9eX15jafncz87O0OH78m9URT49RE1dcmZdauvi2+ZjXvDQyszhZlxmd3RzYVlabu7f +3eHZ1dDQz9Pc29TR1d12Y3P0c1tNSU1UXF9aT0tLTE5TXGd83crEw8jS53ZsZV9TTU1Xa/Dd +4Ovo3tjW19rd3NXR09noeXRvZmBkbH77dXJoXVpTSklLT1dg8uPf3ebw//fr7H5fYHvo5/tp +X2F44tva3NXOy8vM1OpqY2x5b2BbVlhebWxaUlFSVFpsb2166ujf09Xb6XlpbHBnZ2NjaHF+ +fPbi2dja2NTR1NrpeGhmcndwcXBteOzk7mlWTUpMUFlcW19fdN/W0NXj/HPt2tbY4/5jZ3V5 +e3ru5d7b2NbZ2dztcHBwb29iV1FMSk9eZ2ReWVhw2s/LzdXc4OLo5uP2al5TUVdcXFtkcffm +2tXPy87T2t/i7PZ4Z15fbXNwee/t93JcT0pGRktVaXBueO/c0cvM0dnoe2ZfYmNlbHr26trT +0c/Q09TZ3ut5bWFbV1JPS0hJTE9YZWpveeve2tHQ0dXc6PF8cm1hW1dbY2JeZnfu4d/f4t7e +3Nze3drY293b3+jzfW5mX1BIRENHTVBQV2V57+fe29TS1tna3unp+GpraGhscW7y39rT0c/P +0tjd4/F+b1tPTUpHSUtNVWP95uTv6t3b2dfV3/J7cPr3+P5zZGRvcG1vdezh5eLf3tjZ3d7l +4+Hi4u3n625eVE5OTEpNTE5UX2Vq9eDb29rW2dfV2+HofV9dW1xp+uvq5dzW09DP0dLU2uLq +7vTzdmlaTUpHRkZITVhlbPTn4N7f4uHf4Obp5vNzZl1fYmZrfe3g2dzf3NbS0NDW2tbU2N3e +3+Po5nZYTUdCQUNHSk5YXWb34+Lm4NvY2tzmc2ljXlVRW2hy6d7c1M/Oz8/Nzs/T197d2+Ds +6uLnZU9HPzw9P0NJV2/15NjU0s/OzczO0N1xW1JNTE9fe+XTzMzNztTb3N3kfmxiWlpidO7h +4uh8V0g/Ozk7P0pd5M/JxMPEw8LFxsrXeFBEPz9FTV/q2M3IxsfKzM3P2ul0XVRSV2Tu1c3N +0eNbQzkyLzM6Q1rdysLAv769vL3D1FpDOzg4PEVa5c3FxcW/vb7ByNLrYlZUXf/Yy8fIyszP +8kw8LyspKzND8ce8vL29u7m7wttQPTUzN0FX2cfBvry6ubq9xdleS0dLU3jXzsvGxsXByPZA +LSQiJSw9bsi/v7y2r62uts1CMi8yPExe9eTUv7ewr7bG/kpITFRhWlFa8ci6tri+1FM9MCom +JikvQuO+tbCurq60v99INzExNTtHZdTHvbe2uL/N5GlfWVFSV2HhzMW+vsDFz/lKNyslJSkz +SdXGv7myrq2yw10/ODY5PT1DWNW8srK4wdLh4+9hUE1NWODLyMbFx8jHz1k8LyglKTA6TPHO +vLGtrrK92FlJPTk5OTxP18C4trm9v8bX+1pPV3nr5dXMx8G9vsPSVjwxKiYoLTRBX9a/ta6u +srrLZUw/ODc4O07Xw7y3tbW3vM1tXFpcamFf6c3Cv7/AxtBpPzMtKCguMj1a27+zrq2vucbx +T0A3Njg6SH7Uw7y6uLq9xNji9lZRU2jXy8bCw8LAynFBNS0nKS4vOk//xbWvrrC1vdZeRTo5 +OjpFXObJvry5ubzDzdLca1lUTlnr1snDxcXNdEo7LyoqLjA0PlHWu7Kvr7K5ym5NQDs3OD1I +ZNXHvrm5uby/xMrW625oX2z458/IzN5eSj82Li4wLzE5Ql3Mvbi2tba8yNlfSUJDQkRTedrI +vry7vL7Dy9HZ+FxQUltj89fQ5GZgTTsyNjgyMjpATuLHvru2t73Byd9dUkpDRk5Zat7MxL+9 +vL6/xczR2e5sXVtiaGhub15MQTw5NzQ1NzpATvrPxby6vL/Cxc/e8mZcXF5o6NfNysnIys7X +3OxoZ19ZWV1iYGZwd2lnZFFHR01MQkVPTUxe18/e2M/a39nb8vvh7mZ329XX0M7R0s/R3uHe +4+3o7PxzdmdcXFZVVE9NU1lWVFNST09ZXFVbbGxhbezm3tnR0M3HxsjNz9TX2eLr5+R/Z2x8 +7+3rem5lY2RcV1daW1hdYGttZWlpYm15a2hiYGlpY2Vx7u7q4tjR1dvk8vDm3+fh4d7Z293d +4+rt7flta21gW15wcWdoamFpb2tqbvxyYl1gYmvx8PXt4ePn5/NkW1xqaGZyevbr393b2N3p ++Pd/bm1y/vLn4d/k4uPr/mtqZV9fX1lcZmz+5N/l6u/4+O/0/m1paWlubWZt9+rr+m1qbmdg +Ymh1+O/x/e/i3Nvc3uTm+HR0bWlqbG7v5unq7/Dw8fZ1Z2BfaWpse3xudmppevj3cHFvanT8 +7fHs6+zv7+vt9/j6e3X+9nhma31tcXj8/fv6+n357e/v+/fw8OXk6fr77/txYWRlX2FncPfu +6+/t5+DqeHFramxtd3j99nloZWt3eXVxde3n4fB1TUC7t2FESsbHY0rvwPhXac/+S19xeVtp +2G9ZaPnpYVZd2n523eRnXePd91pmcFRK2M/W4tzN2N5q1/BiW09MSFDcWk3fztnfy8nS9VDb +z/5QTvBgTVb2/Utb1uzg2uPx4Hh92HhbWFBSVV5fYtzQy9fb5Mzc/Ox9eGdqU09cY0xc6uXy +7tjT2ubv693tXlllXl9fYPvtam/r1dpx7+14ZGJv+GNXYvNsaG3v6Ovt5+Pm5ut4aGdfevFp +/vD06uvi5OV8bPf1ZF55fm5ic9zbdWvo1Nd+YX3pdFtt6m1uYFxeb3JbV15lXF92bF999t/W +3d7d3Nze3ubf29na4Ofl2NnYzcjR4trb719sXkc7MTA4Ozs9SWNr+t/Kv7/Cxr++xtbr39rk +4NfIxMbLzsfEyNTd4+TuWE5UZFUwIyk1MzI3QmjLyNzItbfI2dPKxNBZVM/CzNbJvr2/zObS +yeBab9vf4u936c/O1tZMLScrLi0vNTxWzsO/t7CzusXlZGZgTkpSYNnLysm/ubzBx8zQ0+Fc +UWT06d/e2dnhe0U0MS8vNDc4PEd5y8G8u7q5vMDLeE1NWVZTWG3lz83Z2tTPzs/T3Nrd5dzg +4uPl4nBZZ21SRkNHSkhGREBGUVdeaH3v4NbV0c3O0c/Q197n49zkbmP43OTs3tnRz9fp6uT6 +dHB18uHZ7lVIRktKREFCRkxRWGTh0s7PzsrN1uRtXGhuWlhp7t7a2d3e1NPY2uDc2t3U3NrO +zcvK1Oz9Tzo1NTI0Oz1BWeHQv7i5ubvC1HpOQD4+PUVbe9rKw8G/xM3X7GNdaWzz1sq/urm9 +vcVbPTAkISYqNFPZxbWtrKywv3xMPzg4OjxL58u9uby/x9T5V01KT27k18XAwLy9xMfK23NO +OCwkHyUxU7+2tbSwr7PBWTo0OT9JVnPWw7y8v8z0Z19YUlBd3cnBv7/GyczNycvo99r0Wz8t +Ih8mMuy3srS2t7m93D8xLzhM283QyL66u8jzUE1WcO707NTEv7/H3v7s3d/d29rHvL3PSy4f +HSIv+bWwtbi+x812PjQ0OlDIu7/DxcW+xf9JP0Jox7/Dx87Px8vrWEpFVdXGvrq/w7/aRi0d +GR4uy6ijrb/V39HMVjcvMkq8rrC/bkthyshcOjM57bavtshhWt7X5VpHRvu9trW8zt7KwGsv +HBYaLLufnqvLS1TIuss8Kig2w6urvUU1Qcu0t+80Lj3Jrau5eT88UdLL6lBO47qvsLvTYuXa +QCkcGB07rp6dqtlCR9u+x0IrJy5psauwyVBGa8bDdDswMlC6rKy4dT9AW8q9wuFf88m1r7XF +Uy0hHR0kPMauqKu2v8nU2XtALywuPdC1r7G6ydriY0U7ODpVw7WwuNFXVGXZyc7taF9u0sK7 +trxYLR8aHSlurKSos83nyri1zjgmIihCu6mpr77Z59veUjszMz/QtK2uu+ZKP0Vb39Ta9WD0 +w7Wvs/IrHBgbKG+rpKevwsW5sLHGOycfJDHkr6mqsMX7U0xOVlBMUmjZw7y+y2tFQU7avri5 +v87e1M1mNyUdGyAzxqukpq66w7+5vNg9KyQlLle6rauvvdJkWW3d2eVqTkdLV3TazszLycPA +wL/Hz9rpVDssIx8iLEm+rqyutLi3tbW+bDYqJicuQtm7tLW4vMDDxcXNdk9BPD5GVe3Qx8G9 +uri3ub/L3l0+LSMeHSEuVLyurK2urKurrsFDLCMhJS5F1ry3uLe1s6+vt8pRPDQzNz5KX+HN +v7iyr6+1vstpOiogHR0hLUnGtK6tqqakpKq8SS0lIiUtN0jxzcS5r6yrrbXHX0M6Nzg5O0JP +7MO1rq+yucTKytdHLSEdHSMzZsK7urivpqCgp709KiUnLDI4ODtMz7KopqmvvtPj+VpCNS4u +N1DKuLS3u7u2sLLHPicdHSAqOEZIU82voZyboLJoOTIyMCslIyg407Cqq66wr66vufY5Li0x +Pk9YWGrPvLKusrm+y04wKCIhJy43PkvZuKienaGrvW9EOzEpJCMoMU3NvbeuqaemrLnXUj86 +ODY1OUrfxLm2tbO3xHw7KyYlJyksMTtcva2mo6KlqrPITDUtKigpLDI++r2xrKmoqq63zks8 +NzY3Oj1FV9LBu7OwtcdMNCwsLSwrLTNBdMKyq6aipay4xnU/MiomKC00PUnqu62qqamssr7m +Sj06Ozk7Rl7cxr65ucHVRjEvMC4tLjY+Tte/tKuoqq6xt8tZOy4tLi8vMDxfyrqyrqysrrnB +zWxIPz5AR0tSfs7DwsnMXTcxNDIvMDg7QWnOv7StrK6usr3ZUzw1NTMuLztEU8q3srGurrK0 +uc9cTkc9PktKSWba2NPOVzI0PjQvND0+Rt3JvrKwtbKtssXWe0Q7OjYwNz87RNXBwbqvsLSz +uszR401EU1FET298dXFmSDo5OzgzNDo/TG/Pvbe0tbGus7zK7VZGPDY1OTo8S2vcy765t7S2 +u77F2GheWkxLT1lhXFJUTj04Ozs2NTxDTHLUwrq2trSxtb7K2n1OQTs7PT4/Rlfv59fHvru7 +vL/Aw87d7WlUVl5dW1NTT0A5Oz05ODw/RE9u2si+u7q1tbrAxMznZk9JSEdEQkpVVFz518nB +wMHBwcXN0t1iWmFeWFFNTU1FP0NFPz5ARElTZuvQxcLGw7/Bx8rQ4+1+XVJWW1VTXmf93tPO +ysbIysrN2O1fUVFRU1JVYmZdWldRUFVMRkdLTU5cXmHi0tbXy8jO0NHPz9Ph8eTg6Xz88Pfx +7eXk2N/v7PR2W19nX1pYbfPs8unk6/ZwX1VNSklLS0xPVV9ha/Lh18/Pz83Ky9Db2N3o9W36 +8+vs8Off3t/p8np1XV1taF9kevH69e/q6u9uY2ZfWlFNTEtMTk9XXGZz8d7Wz9HOz9jb3tbc +4t7b3Nzc393qc3piX2RkXF1kZm557OPg3d/f63h4cHpfWFpcVVJRV1VVXGF17Od++ujp7Ovq +5N/i7evh5Ovl5uPz/ebt9PX/fe3f397s4N/n5nro/G5xXWpiYVtZXltgWl1jV1xiX15n/Gt6 +cGl2du537vfq4+bs+OPk4d/V19Tc4OTl3tbY3uJ88X56b2V5am1vY2FeX1pdX11eXl1cW2Ff +YWdy/HF8bGh2+3lpa3b86eTg3t3f39rd3NjU197b3+Xe3Oz5+mxdYVxYW11gX2d2cHl5dnj5 +fWZoaWtqaGZqaWloaXH++vn+e3bu6OPf4+De5/fx4+Xv8n568nxnaGhma/fv7uzq7fZ+fPTx +8vH7//n4/HFlZ3FhXmZkZWViZW91/Ht4eH9//e9zbHZ2e/PxfvTt7PPv39/k6Ovt5eTv6u3u +7PlvaGprbXdqaGpta2RkZGhrb2doam1ubG9vbnt5dvnt4uPo7vD27+vq6e7q6n356unm7X3+ +eHBuZmpvdHRuaWdqaGRq+ezp8/9zdvHp8HpzfHd19/r0+3f5dW98dm1oa3b/fvf1/O3u/u7l +6vP27/L58OnteXR+e3v7eGpvdHpvZnFua2tz+e3s7/t9+n1+/PH7fXJqYWJxeHt2/vzu5ubx +fHr+/fz19vvy8vz97ebs7ev5/3Zta2l+8fX9emxqbGpqdPrw73lnb25qbG97en15/evo8P7y +7vR+/Hhyc37y7uzu+Hd3/PTy7+/4cG94/e5+/vn8dGtsd31ub3Bpanz5eGxz9/J7dX1tcX7i +5vvs7u7+fOzu+3Bydnl5f3plZnN5dG568u7v6err5ul5amZu//B4b3VrY23193v28vpvbvPz +/Xv7aOPjeef35Ofs9fZ4cGZmcWpw9PlrYnrsbG549H9pX+nedHV9cHr09nfi33H88+Xw/vN9 +amxran/wem1+9XN77/j7/fb08uvyee9/aGr7fGZs+e306OT3cuz5cd/X1c/W2Nvf33hYVVFH +Q0VDP0VJSU9i/t3OzMrEwsXIyM7Z2t18a/15ZGr78eLa2c/Oz8jIzt1aSUk+NTc6NjQ6QUNM +b9rIw8K7t7q8urzDytPqYU5HR0M+QElKSFBw6NvNxb/Bv7q8vr6+wctlR0RCMy41MCwvNTxD +TurHv7+6r7K5uLW7yc/c/0s+RUQ6OkVIRU/12tHMxL2+v727vcK/wsrfXko+PjItNTAtMTc7 +QFrvyr2+t7G0uLe1vMfP4HNMQkRDOzlDR0FKa+Dez8K+vb67usLGvr/O4eNZPDw+Ly8zLi8z +Nz1QbO3FvLq0sLK2tbe8wtXnfEs+Pj47OD5CP0li4tbMwr26u726vMXExtb7bFtFOj05LzMz +MjU4PElv69G8ubu3tLa6urzDz3xvWEM+QUM8QE1PVWrg0cvGwb2/w7/Cx83P09t5YVQ+Oj82 +MDQzMzY8Q1J6+su9vry2tLm7ur/Hz/RzWkdKS0FCS1NVXujXzczKxcTGycbJ1trZ6GldWkc8 +PTw2Nzs5OT5ETGrs2sS9vry4ur++v8/e5GhZUUlKT1NUcN3z4cvGysnGydDb3+NzW1hYTk5X +VU5ESUk+QEVHRUpSVWrs4c7Dx8zDwcrKys3Z7u92Z2No+HRu69PV3dPS3ufwb1dSUExMT1pW +bejt79jU3N7R9Gj8YVBPVEpJTktPWFpcf+L82s/a28/P29Da2NPf3urw3e7v82R88V1e+H5j +cebo9/Xf3tzm7d3dbGJyX1VWW1hPTk9TU1RaYfxcYOxv4dzc5PXg3tvr59jj3/7mc+vj/drm +3N7k4nLu3Pjd6+PifnJlW2VVVlxXWVpWWGdgbHfq92rt8vrq+ezh8ev8/m366On4a2xaaHtr +cft6cPju9+HZ4uDV3Nzk6uPv9npkcXhaXl9dbG5z6vJo7XBt8WVseGpeWmf4+Gl6d2326P9t +8fhw4PZp7Oju6OTs7t/d6Pvr4uTifvJxZnxjbWheY2luX2l1dP3u5+/w73ZjbmlubF5tcWpx +ffjr4uTt6+bg9P7l7G1h6XBqc/fm7v9q6/Rmb2x3Z/h5aOvo3eTo63z47vPwbWl5629hcGJf +X2BkX/5uYml1/fnx8eff5d/w7nf95ebs8+Bvb+Xi8evz9ex7dX5cZmTu6mlpaub+W2T5a3Nv +bm5+aWX7fnp649r6bWrt8fTpfOt8fndrfmb+Z3v0+/Htf25zet/p6efs7uPuceb0dnn0b3V3 +avJf63Rqc/17aGhlVFlgbGL+0NTT7PPob/3s++5lZGx+bP/3e+7r3/T4b3Rf8nXma/tuXPNw +9XXwcWjoenteYv5m7PHw2vTl8Ozh4fF/3mlnemHudfRvXehqdXnl8OP0ZPFkZ1NiW1tmYXlu +2GXa9ePZ3dRq6XpvemTceedh9+li+nrz8nDdZPnuYvFk31t+bFZ3duJd5PpmznFrc3Z1WeBe +6OJv7vfP7n7Zatl8fWll6E/r92tnWvpl3vdf6F9rWm3tX9327d/y6n/b7vbq8e/sfGNu/2Rn +Z+vq+3Zg7vB+9e/0bvT1e+557ex3anBrZFxcVVlbWlxnbvvq3+zn3d7c3tnW1dba1dfi3tDY +4+bm39neeFVWRDs+Ozk8P0NK+93Pwr+9vLvDy9HqUkQ/P0RJSVH9z8vHv768wMbJz9Lc5+rz +3+DfZFFHOTQzMjI1OT9Od82/urS0tbi8xdlrTT87Ojs+RU9r0cO/v7y7vcDFz9/tb2FZXn7l +2+BqXEg5NTY3Nzg8Q07zy8S9uri4usHK1PpYS0VDREdKU1v51cjCwMLGx8rQ435sW1pZYmtn +fuvr7H5gU01KSEdGQ0RITlpdaOnZ0MrLzc7V2eP1en3z/Ord3dvc2Nnc2dzmd29mXl9cYmz+ +9nd4+97i+XZ07PZ8Z1xbVVdWWVlWWVpeX2x6dH9kYPzc6/Xe3N7g4dvY3t7W1dvc3N3rZ/vn +8HNgX2hrXGfn7/5tfu15anPm921jZ3RpYF1qaFxcV19oXF1ne/jy8t/a7uzf3tnl7d7f9XL7 +7fBsbXt1d/vh2trf4t/k9HRxeW5nX1lbWlRVXXLy/vrh73v+9et0X11ncl5favTt79/d3/Hz +6t/jff3p5PxvfO3j6vPu7+zr7PXxeWNsaWNdW2lwbGFre3T/d3p9cGxscPH5b/nf2+Le3Od0 +bn1+cWhhaG9pX2n38XJse/Tn6OXe4+np6/x4cXT18fR7dPXzc2z57vn+8+37cGzx7nJgXWtn +VVRfY2dlfefj93vl3uDo5uLl+H3s6u758uPl8u3g4+v/d/lxYGFoa2VkYXJ9/Pf9+nt5fnlt +aGpub2588+vm5Ov87+/0/m9z+fl2e/x+fnJ+8vZ+ef79bGn67fl49uvt3+Du6unl9f5va3Fi +ZXD/d3v8bWb35+3+9PrsemZqbmlfefpvdPn07GZtcGp3aHR1b/nk7m7x5fzv/fLi4+Tg9vPi +7PRuae99bHv65P14/nt29utgXmVoe2dt83Zt+nhvafbs5nJhdWF45HFz7uzm63/83XVt3fll +Z2vv7OLi+3ju6fl89nnw/G9sZF9rbX3xam11bW7z9+ft7/X+dV9j++zm8W5t7N3ubnX1+H32 +7XRp8OjyeHlnXmju8WppbPvve2tqc/nf6vfj6vH+ZFpi/uXb3evq6ebf5u55bXL56+5rXl1c +ZF1QTEpQXF9jc+3h2NfX3uXb1tzm7e/n3+Pf29nU19XOys7V2Nzd6fP+aUIqICMuRmby1Ma9 +tK6tt9JiXlhFOThAVtjBubi9wL6/z2FOTlNRV2b72srAvsLP2M7XRCsfHSAsRNLBvLKrp6mx +wXBGPjo3NTQ6Wca5tbe5u8LSZElES3PW1tvRwru5u77Hzu5VST8yJx8eJTbhvbexr66sr71s +Pjg3NjY5Sdm+ubm+xcXL2mNNTl/czs/X2M/JxsjP2NHMzczUZkg7LiMeIC9mwbawsK+ur7h9 +NS0uMztCZsG0r6+6zeJzY1JNUlnz0MnR6+nVz87O0M7Hwr7GdkM0KB0aIjvJs6ypqKiprtUw +JSUsOlrLvbaurLPMSzcwNkNf3869uL3L+l1i8dvg8tzJw7+6ubvOOyMYFiBAu62rqaimpbI+ +JR8lM07SzMayqaq4ZjsyMzg6SM61ra64zVtLTEc/QmDKvru8vbq0ssguGA8WLb2oqK2spZ+m +VCMcHy9vx9bcs6OirmIvKS4/SkBNxK6qrsVNQk5TS0hU2cC6usLPxb7BxkciGBgoerassbiv +qazRMCYmNPbJ19+9rauy4zQtNk/vaVRpvq+vvPpLSElIPDtPyrq6v7+8uLnMakIjFhoqXK6m +qrSvqK/vMiMiMOHCy8W2rau0SCkoMUrZzNTGs62vxkw2LzY8P23CuLOztbS0vlY2OksvHx0l +S6+jq7++s7PNMyIiNse5v8fAtK6+OicqQc++v8vKvba/TTMvOlLl1c+/tbCzvMLMb1BHRtNh +IRkkRLmnr+jYr63KOSYjPL2+2ubMt627Oyw2Ws7G0tvFvstpQTtL++jj1MvAur3Mz8W/yNnd +5es9IBkfOtGytcK1qavIOSoqPP5hTPm5ra29SjpFXFtPWdu/vMTM2erfdklBTmXqysPDv7y9 +xM/oVVtBHxgiPMuvtsm1p6vMQS8tQFU/Qte4r66/TEp3ZEM/S9W6vc3IxM3eSDU3RVjovra4 +trS7xvA+PT8pHh4oVryxuLitrLTVPTI4QkFFYc25srrVW1hoX0lDWdHOz8nKys1vRD4/SffI +vLm5ury+zFxOTTAjHyEx3r64sq2ssLxQODk4NThI3r+1t77H5F9tTj9FTm/NwMHKytV+VkE9 +S9nDvr29uLK4x87uMCMcGypH1L6wqKeptl48NS8uMTpkvLOztLnN+lpFQEA9Ss26uLnA1N/l +Sjg7T9fCwL+4srO/zeo0JRwZJThTxbKnoaKsylc6LCotMELPvLKsrr3VYEg/OjY7Y7+6u7zA +xc5aQkNR89TOx7y0sLG/Si4iHB4kLEbEraahpKu02zcoJyktO1TNsqmpr7vI7kg3MzdG6s/G +ura6xupnaVxYW2vez8O8vMhNMCMiKCkvQcuwqKepqa/ASjArKy8zOE/Crqywt7u90FE9PENK +TlHiysjO28/BvMPb5enl3GpEPTkrKjA3PmTLuayrsba4xlY8Mi83OztG+MO4uL7CwcjS5mNY +VFNWW2l+anvezL67vMTBvsvoRDMoIykqLjlPxK2mqamqscNjOy8vLi0xPWbIvbq0tLnBytXd +7V5NTFZjYFRU+8y9ubm7vLvJTzkvJyQlJSo2SNeyqKakpau1yUc1MC0rLTZEZs2+uLOytbi9 +xNLtXk9HRENCREhd0L66t7S1vNtFLispJiYpLTrnva+opaWnq7fLWzkuLCstMjlO3MrCuLSx +sri9wcPSelZMSEI/PkhbdN/Tz9DsWVFGOzUzMTU5PlfPvrevra6vtsHdVkVCPz0+R1BefN7N +x8HDxMLDxszS43xcTkA9Pj9BSFFf79/e2+VyWkpAPj9BRk1tzL66ubi6vcLO5W1cUVFVU1df +eO/i3eDb3f3v3urv5nJiXFBLSkxKTGHl0MrFxMfO5mxVRz48PkJLV2Tt1c/Q2Njb5O51fnrp +4NrW2tTSz9ba3Obb3OHy+nppXlNMTFFYYerc2dDKzdPlb1dKR0ZFRUhLV2vv6+bl3dzram5r +af145djWzM3PztHY493a3uDmb2ptZVBOUU9UX3zd2dbOzMjY7GpPTEtIS1BSXnZk+dbc3Oln +aGNfcXl593d4b33q8+/y5dbP0c3S4eDp719cU1RvZ/Xa1c/O0Nh4aFZWT0xLTk9ZVGf5e9/f +9+Xc5Opnc21ueGdhX2lea3/619bT4NrR6OtoZWBjW251+dzm2NfU2eDld/BgZ1JaTlZTUfVs +6nzg5+rg8fBt9WpvXGdgXmde+vHr3N/b2+Ls+mpob15eWWBke+v039za1dvY5d9ubmFca2Rr +bnN0fWzvZnnqaXxfYVpaWmRe/3Do6vT68eDa4d7v4urzc2xnbnrzfnzt6d709nh2cm1uYGdf +ZGl89Pbo+ubs6X73bGVlYGtmZWZve3P6fO3v+Ozv9X3+dXZ0Z2RnaHR4/+zv6eHh5eTr9f99 +dHJ1+Pj7d//+b/14eXZ8+Hl8e/n/+/H4d2VnX1ljae/u7Xdwbm79bnhv+v36a3p39/F+8v32 +8X967vTf3+zgd/Ln8+b08vH39mtlX29YX1tcbmd7ZnJ6XO1y7dXn8d1sfOxn53l88W3h337n +7XDl82Xtd11qcGjs+vHoZe3qbe7sY/fmXmHrbWDzZ2lzbfPwbPLvevlmb27+7PPq6O/g5ffr +/H15bGxtbHJuanrs8vXu/nP6fXJ7cH33+XZ5/vnv7u3q/Xvw+fHu/fl6anRxb3x4bGx0fnxr +ePjx7ufr7PB9dWx4f3b4+nt0dnn4+/fv/XFzbGVtc/309/Xs6vHo5u38/Pn1+m5rbnp89+39 +c37/fvz57/b4dmlmefv/+Xd09PHt7/7r7fZ8bWtqY2h2cHP0/Xf58O7v7+vs7+zu+vjy9Ph8 +bnf6/P3xfHJ7fXN2b2tvc25oZmltb/7y8+3q7ezs9fr7+/Hx8X93/X1++PX9+3hzeH97++vy +fPj58v5wbm547+7y+P769vV4b2dtaGBve/j5+Hp773/t7vXq6Pt4bGzy5fbr+fXi6ufv9/bl +8mllal9fWlxmXG/o7Pl/7+n7//Zvb3t+397h4Obd3er29WRaZu9eXXt1c/t67vToeVl5fHrg +3t/f2d3+e/JlXmNhW19kZ3D75uvm5/R9eP5oaf5yeeXh7uzl3+Lm+nbs6+vo39jc2dXc3uVp +VEI7PD0/SE9c8cy+vLy+xc7afVNJREE/SV352MrDwsLDytnn/2pjXGngz8rIx8zlTjcrKCwx +O0diy7WrqKqxwHVKPTItLTNF07y1sa+vtMB3PTIxNjxIXNrAt7S3vcnY6lpGQUdLYdXL4jAo +NDY8aUxNwa2nq7O/UU1XNi0vNUjPuri+u7a9yOhEPD9GTlNf69K/u7/CwsTJz+ZbSzosJSUt +OlzLwLWrqKu220I2NTIvM0HeurGwtLrA0E85MjQ6RvnNwrm3u8PXW0hITVZ6z8jEv8PBwM5v +NR4eKy894sy5qKGlt9ZPNDAwKSk617q0rq2xtb9JNjU3Pkxxy761sbvJ1nllZFFNU2T379PO +WTsuKCw3Pkf/wrKsq6++1lxCNjAxN0Lovbe0s7q/yO5JPjw7P1rTysTBxdT39W1cWlRQcczD +xcvMx8LGQyIeKi82S1jcsaOgqrnFWj88LSUpOGbIubCwr660zVU/OztBT1FY28fBvb/M1drd +8V9hXk1COC0qMkRc7dDJvbKus8DYVkNAPjo7RV3Twb3Aw768x+FbRD5BR0lOYOTWysfLzMzS +2/teXmb23Onsz8jyNCswNjpUbVfduqyrsLbLT09POjAuLzdPxru+u7S2uLvWRjs+RkdIS0zy +vLKztr3FzNPeUjktJyQpM0Bp0cm8r6mnrLnYRDs8OTQwLzdPy7m0tbOztLfGXz83Njk7QU1i +2se9uLm7vs72b19YTkZJTz82NTM1Q+XHwcbGxb+2t8TsRjg5P0tKQUZR7cG3t7m9xMTM2XxO +RT89R2Tcwru9vr++vctaOSsmKCktOUvjxr22sq2qrLTEVTw4Njc5ODc4QfLCt6+vs7W6v8vn +UD83MzI1QVzSvre0tbi9xczVVTYsJyQoMD5mx7m0sq+usLK2w2k/My0sLzY7Q1fdwrWurK2v +tb/pSjozNDlCVd/Ivru5ubzLUDgtJycrLzxZ0r64tbOzsrK2vdRMPDg2ODs9QEdY5cq9uLi3 +t7q9wdhPPzs6PUVOYd3Mx8LAws/8VTwuLCssNUrYwbu1s7Oys7i8yetdRzs2MTE1PEpx08e/ +urOys7a+02NJPTk5PUhk1srHw8PJ2l9CNzEvMDhHY9zJvbm3tre7vsfYXkQ8Ojk6PURLX9nG +vbe0tbm8yNx4UEE+P0ZQaOXf3M/N0+hRPTQxMDM8S2XRwLq2tLO1ubzG3ldBOTU1ODxGWOPI +v7y6ubq9wMvsXE1CQklUZXvk4dzU095YPzk0MTU7RHHOwbu4t7a4vMbZfks+OjY2O0NPedTF +u7i3uLq+yd5bRD0+QU582MzBwMLEyNZWPTIrJyksM0vVvbCtra2tr7fF9z8vKykqMD1eybu2 +sa+usLa91048MzE2PVHVw7y4tri7vspZNigiHyEqPNy2rqyqqaiprbpfMiciISYvQ9i/urKu +q6iqsshNNy4uND1LcNzKvbWurK+820cwJyIgISg0VcCvqaWio6etwkYtJCIjKDFF372xq6io +q7faQTEtLzU/VPjWxru1sbG1wfFFOTg9QTovLC0zVr61sLG3uba2vnk7LCgtOk7Wyc3HurGu +ssJNNC8yPWfm7+LYyLu1uMXgX1NVVktKTV3QZTk3Mi9G183Bv765s666bEMxLjpBRVBc272v +rbfMYD07SUpHSUtkzby5wtTsZuXXXkY/Q1zNvbq9yUMxNDM0QEdL9L2vra600ldPPDc4NjtP +zby5t7rDw8Z1Rzw3O03u2eTm6NPAv839TkhX4MjAv8xZPTY2OT5CQ0/Ru7CtsL/iUUA6NzU2 +PlzSvra0tba801E+NzlEU11k7M/Fv8PR+VVGQ0dNaNzX09TOy87Q6lVMSktVbOXgblpdWFZc +WFdo6dzc3djSysXL415RUVlocXF6dHHf1dTW3/V78NvPysjkRzs5ODxESU7nv7i2ub/N3XhQ +Pzo5PEdYfNTAuri6wNFrUEc/PT9FT2Xj0cW9vcXXZE9NTUhDRk1f08fLy8/Sz9h7U01MS1Bf +aurT09LP1uP3ZlZUWl9aYXJ069nS09v3ZF5dWlxpaFhZZ2702tfa0s7S3ePo7ujqZFNPT09W +Z3B56d7U0Nbc629eVldXUVFUV2Ds1c3LzNPb5HVjW05OWF1fburY0NDV2tzY1drf6vhpV1FU +V1VUUk5UYXH87+Xl39nd+nB6+Onl3uDf2tza33JeVlBOUFlfbeve2tXU1trl821ZUVVbafLp +6OPh4+LrcWdlbnb+9Px9+uvh3+bzdWllZ2lrbG9yfH1saXRwbP73/u7p7fv56ufvb1xYXnnp +4t3f39za3efyfG9vdnb+f/Lh3+n6a15aWl1ZWFpj/fb39ujremdmcXvs7O7s5t3c3un1+/H1 +/P5uZmtycW9oZ2Zqb/bl4uDd2dXR193pbFtWVlRTVlthZnPv7Pl5bmdrdHr9/fTm4uTf3t7n +9G9tdnhxbnJy/ert+fju8Xn8+ebf3eDo8PX1/HJraGZob21rZ2NhWlNQVVhdYGNz693b2trd +4+Pt6+rs5uns5uXm5Ofs+PTt+vju6u3j3t3f6fhpXVlVT0xLTE1SWFxfYGh3/Ozd29zd29va +2Nze5ezxcm5z+Ozn5uPe3N3j5Ofo7Pnx7PPz6e97Z15dU05NTExPUlZWV19rb3vr4d3d3trY +19na4uvi3+T2bmx49ujj6e7w6ePi3t7l+/zx6uXm8HtuZl9VTkpISUtOVFtpdn3s5N/a2djZ +3d/k5evx9Pp0bm989v99fn3w6ebk4ODj3trZ2NXZ3OP0/WlbVE5LSktKSkxPVl586tzZ2t7n +4t7f4+nv7vHw8/Hx9fX48O3s5uXp6+LZ2Nfa3uLk4Ofq925kXFlTT01LSUdKT1ddZXzk3NfX +2t7e3d7h4+jl5+3zc/z5fX95eXvz6+Ha1NTZ29nZ2NjY2ebzblhOTElEQkNGSUxPV1/83t7V +zM7Pz87P3fV1YVlYU1BXX27q2c7HxMbIyszS2t3d5+3r49ndYUs9Njk6NjY7SGrVw724tLi/ +y+RgTUA8Oz9KTl3czMPByMjEyNV5X19cX2du4szHx8bBv8TK3VVEOC0rLi8wOU3av7azs7C1 +wt5ZRTw4NjlFXuzNv7q4ur/M1ehMQklLTVJe6sq/wsO9vszZ319KPzctLTU1N0b3yby2tbOx +u9hfTkE6OTtDXm/uxru+wMPRfmFVSExdVlfv2M3Hw8TDwMrc5PxpWEM7NjM2NjZAXdrKwLm2 +t77O2nhKPjs9QElc6My/v8O/w83Y62RYVlRTYXx369HMysnM2n/o6GJeUEI6NTY2OENOeM7A +ube5vsTK6UtDQT8/RFB638/Cvbu/ys7U8F5STk9OTVrt3NTKyM3MzNjh4OlaQDg0NjMyO01c +68O3tri5u8HVV0hDPjs9R1Jd4MO9vb6+vcXdb21bSkZMU1lj3cnKzMjH0NnT3WRDNzM3NTA6 +TlNdy7m3uLW3vs9nT0lAOz1ITE3+ysnHvr3ByczP415MR0lKTV/h1tTKw8XHycfLWEFBOjQw +NDw7P2PNwb63sre9w835SkBBPzw8R1de28S/v769wMvR3mdVSUZKTFP81tTNwb7Cxcz+TD47 +NDA3OTtDWdrMv7i4uru+yN5nVUg+Oz5ESE/81NDMwb3AxsbJ3GJeX1JPXWtt7tTNzMzZ6mJP +SDw6PTs8QE9l/tLGw8C/vsTO2eR7WE1KSEZGTllf69DIxcTAwcnP1eJ8bm1gWVxgX2X56vdj +XVxHQEhIQ0FMXFZf2s3Oy8HBzMzJz/Bqc1pKSlBSUFv57uDPysfHy83T2+doWFJPT09TXm/r +3d3q/d3yTVJiTUFLfVpM+tHqbM/H3fnW0n5t3+haVXV5XWrtfN7T09rb0dbe7ntfUU9PT05X +cPvp2dDQ1trf+WVdWVFNUVhVWGl2evvp4ujs4ur39ev5d/J7dfXo39nT09rb2eH+bWJWT09S +U1leb+vf2trV193g7HloYVpYVVBRWF1mbfjn7+re3eDn6OxubHb9fPnr9urk4N7g5ezudGJZ +W11YWV9odunk6uLa19jZ3/BzbWNZXF5eXmJqcOzg5+ni3+ju91xVZ3pnWGfxeGVw5N7d5vbw +fmlmbP5zbnb28u3f3tza3+bi5ef1bGBjampdW2V2cGjx3tvkfPfudV9jXldaXF1gc+vn6PPr +3Obw6vJ8dGhq9Obm5+Dc4Ojm3N78bmdsXVtbWWNraGx26d/59+vl5nZ4YWxrcfNbe/h8993p +2t/w63h39Vt0ZWdpU/lr6OVb299q6N/j7ep972DgfFzpdPL6efvi9fxi79lg5WpcafZaXHd2 +bG937eva8nfgfW15/Hn25Xts+fvueGjd/n707Xxf+2r/X/VwffTs92xx597x+e/s9HL2bXL5 +Z21x9m/z8/7+6PhkdWNoaWl0d2585+d35/3n2e/9bHxrbXT67+l67m3m93Rx//p+6PNsZ31o +bv756mxua3j99vj8cX77Z/j143by5+7feu5+fX9tdX7te/9ode79efXmb2vseeX36vRce15t +cn79/Pbn7+lreWr4+3P7cOhf/W/v5Oji7PXx+Ofu4XjmdHFva2l8dGlmZmz7cGhtemr6//Xv +eezv6f3m3u3uaOP7999p+19wcXdqeGvucnjrevh0aPFmZ29ycH1z7t/j3enr7H717O/p8H1t +ZmptfW9sbWhxbnXs7/f8f3Bycf53b3x89fv49vP9fe7v6evyc3J57+n3/3d17e/3+/5yc21k +aG93+Hp4+ubodnR59/jzcnBtdnRucHP68vZ6fu3p6PHv+/Tz9Ov+8Ox+e2hyfnhubW9oZmRu +eXl87uft5OPi53359O/5+Xlqa3B5+Hhv8G5+fnh+dXRvc319/fp2bGhzeXj3+nX2+Ovh6/P3 +cXF9/enqcm56b3F7+fTwe378/fDufGtqcXRucf39+fv78Ozq7fl5cnd3bGllZW/+8vDt7Pxw +b2948fF+cW98fXn+//Tz7vDt83Ju/ndxf/Hye3JydvD1+fh3c3Zwb3JubWVlanj79/R4+fB6 +9fn67e7u7uzk3+bu9fj1/v9uaF5gbm5qbG9pcXFtbHJ4bWdodnv/e2p47vX47ODd4Obo9n17 +dHZ2/ebg6vV2dHNpbWplbXVub2tpcHpybG12/nr89XFy9PTw6PR3evjp7O3s9nVsb3d9+Pf4 +fX709vTv/21qbnp9b3Jtbfj4fW5zevf9c/Xu9nRsam148erp7fR9+/H29uzufH16fvTz/vf+ +/fF+cG5zcWllbHZ2bmxscf727fdz//Pz++/w93f48XBpePbt7/5++vp6eHX88u9l59V+4uzz +6d5yYWRob1NH7udNX+bi/s7fXNHicOnq7ndw9WZ+3XN16910Yup8ZG7semnl3v7/4/BscG5q +ZmhfXmheXffuaHfe7nH1+m9renZ86HB46vDu4t7n6OT0dufj6ubg6tvT49rT1tzh2OJtXEpD +RDg2PTs3PUtSatfKx8G9u7u+wL7F2N7vX1paWFhmfurWzsnCwMHEzdleRDw1MC4uLi8zOUJY +5sW8tbOys7W2u77H3XNfTURCQUJFSU9f6M/JycC9vb28vsvN0GNAOjoyLSwvLy82RE9fzby4 +t7Gtr7S1t8PW4FdBPj08Oz1AR05r2MzGvry7vb29v8bM2l9HPjw4Ly82MjA7Qktc18XAvrmz +t7q4vMfP3WNQRkRGP0BKTU1YdunRyMG/wL29wL/CydHdaUtAPzovLzQxMjo/Rk1+zcnHvbi6 +uri6vb/E0vxnWk5JR0RARExOV2/n3M7Hw7+/v73Bx8jS8lVEPjg1MjIyMzc6P0xr1Me+ure0 +srO3ur7M1t9tTUJCPzw9P0JHUGXj1Mm+vby4uby9wMbQc11JOjkzLy8uLzU3Pkxm5se8ubSy +sLK3ur/M3OxbS0U+Pj4+RU1VZ9rPzMO/v7/Av8TN1OH6ZFZQQz09OzY1ODk4P0lOXN3Jwb67 +t7i5t7m+xc3gWk1LREBCQEBIT1h43dHKxsPCwsTEyNPX1/NqZExBP0A7NDk7NzpCSU1t0MrE +vLe2ubq7v8rR1PdZVU1GQUZKSU5Za+7ezsjHxcTHyMrV4uN7WFJQTEQ+QD85Oj5CQEhjdfLV +x7++vbu8vsHHz995XVFOSkdJTVBbcufVzcrJysvLz9fuX1FMS0lISU1OVF5nd+nf6ufh3+Xy +8v5lYGNjXV1mamZfYnjq5t7a19fV0M/Q0tTS1tvp/mhZWFlVUU9RV1haYGv44dfX19XY1NTd +7HJoW1hWVE5PU1RVWV1bXGh96dzZ1NPV1tTOztTX3Ojz/v9/bWBfX1tfbWllbnz17OXl6ODc +6e/7e/xxZl1cXVpYVlVXXGx/8uno5OHg393d4unm6uTm7f11dXF1/ftydnVvbnnw6OTn6+rl +6/Hr+Xr9fXVtbGphXF9ma3Rta2xuePLr9fXt6ezx7+vq7fp7/X5+/m9ma//69f55/vrw6+jl +6PT++v9+fnhpZGp3dHH9+nJ9eH34/ufe5PPx5ut5a2hrZ2Vsbm987u738O7r+f1uZ19dYV5i +bvvz6eXi393d3dva3ufs+WhnbWxvcm1re31tbGtobW5pa3BuZWFkZG/8/frq7vfs5ubj393e +3tvd5e/6e/L2f3h3bWdtbm1wbWpoX15nbnBze3p7fvr08Orr7eji5OLr/Hb69HZtc29wdP/x +fnrw9G9ucnV5bGZqcHh89+3l5+Xf4uXp7XlsbHV8+e7q9m5z+nhwd3trYlxLX9xq7+3p4ujq +6vBsWHLV9/l89ujt5OPyZ19PVdjma1Fe0tjV5d7Z4nVjdWZgX2ZibXj5eWlgXO7y+/H65Ozo +dP/r6/lubHf7fHBzef3z8Gxt8+rldmdvfvZ8cHD47O3w7Ojq4/dlXW33fGtv7+nn9HFpZ3L4 +em9ofu7+eHNxdv9zbn99d3VvbHb06+Lb19vi6vDv5O12amFma3n3fu3sfWxaTUZDRElSYd/P +ycXHxsjO4mdWTEpNT2Tb0MrHy9LW2eF1am5ubvjdz8vK1GA9LyspKzVKyravrrC0ur/NZUI2 +Ly83Ss+5sa+1wNleRz48OTg8SGbHubOzuMXjV0hHTE9Zbu3VxL25usdEKyMeIC1LuammqKyz +vsx+PzErKCs71K+lpKq26j42MjM3PEZmybqwr7fHY0VET3Pay8jExNH3Si4lIiErS72qpKas +ssH+RzYtKywzXLqsp6iwwnxCOTcxMThJzrOtrrrzPzk9VNfM1PJq7Mi5sbC9VTEhHB8mPrms +p6aqsrrWPC4mIyk52q+mqKuyxmpGMiwsLj7FrqensM9IOTlEUV1649LBvLq6wc7WYT4tHx0i +Ld6sp6est8fZTjYuKSw82basq7K8yN9pRDQvMUPCsayxyVxLTFh9al1YXtXHx83Qz9XQ1VdE +Pz04KSUuPbump6y+SDg+QUNDOT1dw7Gtr7vJX0E+PEJtz8jE0Prr1M3I1VxLRk/jycPM4WZR +W3H+6t93Tkg/Pkk/OT9M9r+6vcxZPTs9RvvHu7a4wNDwWV1uaXh18NjT2ed3+ObZzt1tU09a +Z/Dn39/u7/fc61ZGQEFGXGniyMjbTD89P0NFVnrVzs7PzsbDxtN4U09YcNLEv8PPeVNKTn7Q +yMfL2mVUT0tLVfnS0uVtXlFVT0xp4910X1hPVk9HPjY4R+rDuLi+xd5XSkpU4Ma7t7nEe05M +UnXZzszW2uBfXVxs5GtNTE9OTExb58nFzXxORUpaTl9lWEs8OD5c0Lm2u8ZfPzk/acW7ur2/ +xNhcTmLSw8DOZUtNXuPKxMluQzw8R1ZXas/KwshTQEFAREZHWtvaXEtPWvDkaG3SydbpeN7G +wMHDw8rcaVRedG3p083IyeFbUFdqbl5PSk5SVVhe+tbNzdVvQzU8S1nPzfBZPzhF7c3Fx8/Z +31tT3L+5uL3K605CTOXFvsXV519YWlZd9uJsbmBJP0Rsz8O9zGVENy0rOlvfysS+v+w/Pk57 +2MnDv7/O9+vUycfQ3Nh1TExb18G8v85gQDxGWV7nxsxhVG996NT7RS8pLTxS0L23t8VaQ01u +5enc1t7f4t3KxNDk4ufyal9639XNxMDH3mBTTkxOXnzVzd9edtLeTzgxLzM+S9q9usbnXFFW +XmvrysHL3/5qX1pQ+cnCxtluW2zq0MLBwc1lSEtt3szEytdkTExcUkJGPTMvND1gxsDAws5s +WFta78vIy87U4XdXUl7u6HV+1NDb2t7Y0959Z1xOU+bGvL7H2mZc7t9USEtCOC4uOnfGwL29 +wt5IOz1P9s6/vMTZWUE/S2jWxsPK4F1aYPLPxcbUb1JPWHvZyb6/zHZZd87CyV86LCYoMlC7 +rq2yxFo5MjM+dMC3uL7iST06P2vIvbnA+EpHTevEvb2/z1A+PUrcwL2/v8HlR1HNyfxHNSso +LTVZt62utspGNzU5Ss+8vL/NW0dCRl7IvsDI0n5NSVPcxMLF0vRVRkJM3L+6vcjbZVd9x7zM +QC8nICk+zrGpqrrmOS0uPWTFtLfC11RAQVPbwLy/z25ORktlzL+/yutOPjxBaMe6uL3JZ0hP +zbi72kU2KB8mPcGsp6271zstLTtuvrO7yt5QPT9S1b68zGtTTEpU5MW/w91OPjtBXcu7tLO8 +30pH9MG7w+FOOCYeJkW4qaivv+c5Kys497qzvtLeXkRBWNHAvcpeTE9Ta82/vsb1Sj8+SG3F +u7q7y1pGTe/HvMdgQzcoHylQs6enr8juPi0sOHG8tMLf2ONMQU10ybzIXU5o8N3OycXH60Q4 +OkzTvby8usFvRk7bvb9POjkvIiM03qylqrnLWzcwMT3ftrbJ1dttTkxP+sG/21dUZN7Ny8vH +0k89OT9twrm5u8LgSkRpxr9rOjkyJic3arSoqrnIZTs3OT1eu7S+zvtZVl9ZWNbI3F1UX9jC +vsPTb0k9OTpMzLi3vMXbZU9W2tTpfFc9LiksO86vrK+3x1Y7MzE6c7+7vsvke2BPTFn02tDP +0tPRz87dfmheU0hIX8u+v8PCws1sSD49SVM+Li06Tsm5ury9wOBTQjs+XtXW0tba1t5gTExZ +3crIzMrHzdb7WldsblhWYN/KxcfIvr/WUjw4Pj81LS5A8L23vcLAweBOPTg7P/u/vLy9wd5P +R0JLbNvMv7q8xt5TSEpNTlrk0svJzMzIxdVQPTo+REg7MzhCWd3OysO8t7nHXzw5QEVKWd7F +u7a6yNthTUZJV+DFwcPM32lRS0tPXPXn49LMzNxeTktQWFdVVFFNS0pKT2rcz87P1t3obFNK +T3bSycbEwsTQcE9GSVnd0NPV2+dhUE5PW2r59Obb3N96aHbs93v1+nRfUVFVXXDf1Nja3Opr +WExISExXdNrOy83W5WRXVVzw1c7M0OFwW1VWYe3WztHZ3+trW1RVX33q5vdlX2JnZ2lra/3l +3t7qaldPT1NdZezWzcrO7FdMSVJlfeXTzs/ZdVdPW+zV0NHU2tzmal9ibPby/2tfX2xvffV7 +fHJtcGphX2htZ15bVl/z2tjg6nxhWVxdZfLY0NDcemJaXHTi3Nva19vd7GxobO/q8mhVUF7+ +5+bn4eLtfmhXUllhY11eZW7s3Nvc5/x+c2pnanrn3+Hn9GtiY2p2fu7e2NnidmRleu73b2do +Y2Nrcu/j3dze4eX7bGZobmpfXGt1f3X4+XVnXVxYXmvr3N3c5Ovy/P97/PLh3N/pfXJvcPjs ++nF0bmtmcfnu8f5+c2tmbv/37vDw9HNoa2x+6OHn/Wxtbmtran/r9G9nYGRye/Xy7+z1bWZo ++uzu6evx/fXo6d/a1djh6PNqXl9paGlrZ2VmZGpmXmRpbGtkX2l09e/g5PNleNTj19bU2nRb +eOxzTkzb2fbs4uHh7Vpm6PB1aWdfUlj77Nfb1dje61ReW1ZZVFlba/h+4d/d2urt/P57ZnB6 +8OLo7fr7+u3d3d/j6/D36+/35eTo4vtjanRbST8+QT9ES1bo0MjBvbu9w83ibFxOQz9BQ0pa +/trLwb2+w8vR3XFcUlRXVV/y2dDMx8HC0VA7MTIxKy42RWrOu7Grq7C2ucVbPTYyMzU4Q/fH +wLuzs7a7xddsSjs5PT9CS27Owry7urzCz+ppUTotLzUuLTlT2sS7tK2rsr2/0Eg4MzAxNjpI +18K+uLCyur7F0PtMPz9CQUdX7NDHv7u7vb/B0k0+NS0tLCovPEtywbWvrKyvtLvXSj85MS8w +N0FR3MK4tLKytbi/z31OQTs5Oz5IWu7Lvru7u73EzvpOSj0sLTouLTxKV9q+uK6ttbOyxF5a +SDc0NDc/R1DVwb64sbS5vsfbVUE+PTs6QlZw1MC6uLi4vM36RjQzLygrMDQ7WMy7s6+tq665 +w85UPTk0MjQ3QFb8yru2s7O1ucHdXUs/Ojg7PUFP6cu+uri4vMLK1GE+MzgzKjA5OD9c0MC4 +trCut729y1dHRz46Oz5HTFPYxcrCvL/Fxs/ie1tRTElLXW3/0MXHyMLD1mVUQjw3LzM3NTtN +d9TAubWztbe7xd5hUUM+QD9CSE5f+tDGwr/BwsjV5HxXTU1OT09WcOPZz8vJxsvQ031RQEI+ +LjU9ODtO4tzLwLq4vr68w9r581dMSkpMS1J+d+/Ry9DRxsrZ6/5xW11+92712tng3Nbc9Xdu +Tz8+RDo0PkVFT3HRxsXCvb/JyszlbWleXmNndvB25Nz23NHZ4+XmcmRveGFUaPlvfOnf29PS +1Nt1+fJcUkxCRkE6RktGU+7p69LNzMvO0c/T39/fen37bPV4a+fh5OPh293d3+r2cGxlZ/fs +9+/s7fTzcXv7WFxiUUdGS0tESFpYW+jX29PNysvQ09bfb2x3YV5y8vDo3tjX3ODf+XL+aml6 +c3Dv5eTe29vZ2eLqeFhYU0xNTU1KS1tUS156Znri3eLg3+LzdO3d3ezh2N7d09LY29fc7v56 +emxlbfv78+Hf7fHi62hhaFlQVE5MTlRdW15y6+3s5+n2/f5vYGNueHZ68Ofa19POztLQ0N7o +7mddV1NVXWh3//nr5uTp5uPpfnFrYmRbVFpeZGtrb2178efg6u/tcl5jcGpncX1sc+jk6+nf +2N3m6vL+eGxkXWBud//z5eXh3dzj5uPr+mxeYGJfaW5w/O7p5+rvf2tlXFhYVVVVWmFv+erk +2tDR1tve4/F7cWhhX2VrbnH24d/k6N7e7vjzeW5vdnNnZ3BqaWl49u3s6P1lfndnZGFfXV5o +bnfx6uzv6d/k5eHm6ev09/B2cHtxbXb3fnd8fnVtffl7d/75dW56e25z9+/z/vbt8vnv6/1u +b3Rsbnp57+Xm8nh2e/v+9/xydHh6dW1scG1r+enq6e//ePj5fXlv++/sf298+37y6evz9vp8 +b253+PDzfHJ5cnn1d/nx+G5qa2x2bG388fDt8Xdwfff1+nZ77e3w6eDg5+fn833+/HV3fXZ0 +amppa2lvamFoaXR6dnR2fv55cPv08uzw9ezo7e3t9u7q5eX18vV8dX16bnJucXNuc3d48eTr +9nxtdnpyeH9uZm9rZ2x0/Ozq9/Ly6+v9eXP7+Pv8ev3u6+/37fB0b2xndPH7d3z87ev2d37z ++P52a2Rla2tu/vLs6/Pu6ujs9/5xcXBzfXJ8+XlwbXD47357e3F1dPrw8u7t8nt0+OTpdW18 +eHd+cGpu+/D0/P3t7fR+c3l2c3VzcHB1/fh2cnj7fffw/XZ3fnx+ff32d3zu8O709u7u+nV9 +fH3+/nlvcHx9bXF5+/X6enny+O7u7e3w7O/9/XttZmBnbXNucv33d3z1fPjm5vJ4b3Z4cXz7 +/vt+/X16fv358u30+PLy93nw9Pz17Oz19H7+fG19bmlpa3Jx//11cHNsbv35/fX8a296/ft/ ++/Dr8/b2+O7u7fDw7+96c3Z+8fJ+dHl/9fj7c25vbmlkcP37+e72bnz183598fJ7c3Nrb3h6 +bGv6/3Z5eH707uzr5ubk7XtvdXn06/x4/fr8b291dm9scW9yZmdscXz2+u7m5+Hk7vX37vN+ +cmlpY2JfYGVtdvbx+Ovt/Hl9e/16d3h7fu/v8vh79e/r8Xlv/fpva2tqbHN4df72fnpvd/X8 +cnJ2dHv283Rs/vL5++rs8PP3+W9vd/p9cXz7bmloanRwcW5qbG94cmhr/u/u73zv+fv9ffPw +6ODo9Pvv8fx4d3Rtampsb252cG1xePT5fW5tendtcm9kb/15++/6+fT5fvR4bXX77e3t/fb7 +9u/9bXB/fXZrbHx0eOvz9+3v8vH49ft1aF9oYmRiZWxvanj8eP7v7+jr6OTw8fv07ebn7fX0 +9fh9emtpbm1uaWdobmx6e3v07n1vefns8fx2/fv/dXrx6uxzb2ptfXp5cfbo4+ju7Ptxb3Fs +Ymh7f3R3dXl2/X/z6vDs8/n7/f94bnrv8Xxucnv/9u/99/P0+mVr/u/z9v77/HN1b3X48PX5 +/np8fXNy9u3+cv/38PT5d3n9cW9qdXl1e3z97unt9vTr7u/y7/l8fnz2+XdubnN++Px4bmlo +Zmhse/H19vh/cP3z8uzt6/x7dHh9dHrz5uPn6vH3/Pj99u75dm9pa/V+b29tb3J3b3V6dvr2 +d3J88PR0eurn7/N3c/vu9Or3df37cXF6+PF3b290cPjp+vX08fD2en9+dnZvcWxqeHFt9PHp +3evwbXf8c3j3d23+7/f69P9wfe/x8vP6+21qamNlZ25scv7w7efm6efq5+7v9/n+7vB9/3f7 +/X51dHf/bWVnZmlia21sfnJ4efrv7On3793d4ubqen3573ZqdmtoY2Zrdfr5e3vs9vl4d/x6 +9/X66ujm6fDs5uv++/1vbnRrY2BlaXL/e//2b3FwdHn57+/7ee/u7fnz9ffs7Hx4dW9xbXj3 +7+56am5ve/f2/e7293xrdX3z9vvv6/H36vf3fG56fmxpa2Rta/31eG1tb3z4d/p1aHFyb27+ +7O55fO/q6ur+d/369fL3+fft6vl+7u/2eW5sa2dtbXBqb/T9/3f89vDueXtwe/H8ev/3+P39 ++/t8bG93aXFxanV6/nj+dW717+/26e717nh4dfby+Xr3+e7uc2hx9/T083lyeHzzeGtscW91 +/H3ye212dfX1efr7f3j793p+e3R7fWxvbXB7f+/u6uXt/GpwdnR+7Pd5+XV9fnnyeXr9fvR7 +c3j3bmh/8u7s7X319O/v+vn0c2l2b/59fG9veP14/fd3dmJpcm5qcnpodXF49uvh5ePc297k +6/Z99fT89/xybHBtc29tZF9fZm12cHj7+/t/e25vd/T18u3s6O9ycPN2fHt+d3ft6fhwcPn4 +dvny8/dxdXf/+vx9b3J+9Pt2fPX8+39ubG92/Hdrc/Xr6/P5+/rr6+rt8/r+d2htcGtocnx2 +enx8fH/+7e5+/fL3an309O77+/x/f3l8cXF+9f3+7+3teG5z6eby93v67Pvu+XV7cW1ua2xv +Z2xs/nZ67n3z8u348H715eXn7evw7/z9cnp+fPx1cWlsc2xsd3RqZV9kZm/u5/L76+Xv+uHd +4+jp8PPt83pqZG5uam9tcPz8emxoZGd5/376/O/p7OXo8Xxv+f3w+/vs+nv+6uz0fvZ0Zmds +f/r+/f1va250+fLu7fT8/nlyb33+73p09n//+PJzbGz9fG1xbvXs6O3t7/fz7+r39uv2+H7y +8Hxvb2t7+/97enRtZWdmZnn3fv73d/n79fjx9PfqfG9y9Orq6uPm6u/7+3ZxbG5tZ2z18375 +9u3zef9/fvz4+npu8Xp3bWp3b3RxbWxocnlwc3Tp7Prt8efo6erl7ffp/HNsb3p6cXl7fHr+ +f3t9+f11amT+eG77e3d2aG7u9+7u8Pfz697j6uvt+G95eGxpZmxlYGZodG1ke/B5efl+9vzy +++/tffr/9Xz36u716ubm7+3x925oZmhsefP+e27683ZvbW92/nVwdnr5+vz38/z+amZman7v +7fn8dHj4d3V96eV/+Pbtcnj3fvzw6Pn7/fjxfn15e3hnbHx47/f7++Tfbm50cmL3/3doY230 +4u5/bnhuaGxmZm9+bvD33uH39+3raevr5PL41svafmtcT0pUXV5j/Nva1drh8eFxXFxUYl1h +avTl6+7v3vL37+nocP7xeGl5eH169vXy+W9/eHRpbe32dG198nH6/Ozzdmh992hv+/t7c2v7 +c29q/9zd7np5/HZs+3D7+274dWpcZuv57G/65+Z2dHp5eWh+/3D+Yf/q9Pr13uXu3dxjZ11a +X1x0b/bg+m/9cvzr8Ormenvl7fhgeulsXVhobWr4e/H4fnh4/Wl+7O5+9ub06/Lx4ensdXJ3 +c213ePv+dWxvZmd6eXfx9Xbf/v3va3lsaGB0aHFubvLs8OLp7etlaHt4ZGPd6fbv6u98c2xv +Z3V8fuppb253d3P9YGZp29lq2dlr3+pt+PxaXmZ18XLm4vTo93RmbmteZmFkbG12++94ZWZs +bXrZzXpj6uLraF/wWsWzRdrY11xZVPnyQ0xN71de4s/o8en94131YO52XfT17mPz8OV9fPjw +7Gb5cnp8cnDl6d/b7+Pv+GxqYmz99W9f+Wzldvfy8n1w7fPyeXtrXVxk9vRzffPv8PNxee3s +bXZ0b/rs9O76bvB59vbidmVv/Hp66Hns9O3x9fr5fG13cnZt/15ob258bXr9cnvwcm/q8Pv8 +/nHpePri523v2+Pmc+987nvn53VtW3JcZl9ob2Nsc/78ePd9eGhq4ePj5Nniefz87nxs+Ofu +fv/nb2d5bur9Y3v9bl1aaX9zZHR072hv6u/e9+zm3Pbr4Hj66+Hu5+117npqaXxuX1t08G54 +dfNwYmn38XL7bG56eW5qbm58+m5/6enh2+d/6f79eW/9fuvi8v/yfW/9/u74b2x5cu3oc3pg +an55a/vx+vVqYGRzeu7s/HX5+3969O5iZnV2cP/x6+3r3OPy9OzvcHRv+XJ68vV2dv516+5t +cfH2fHz/Z2R3de38+fR++Xj293hoZ2lrdWxt8/R5/vrv497xb3v57P7t5+Xs5eP5aGJrdndm +Z/p9X2hw8uxx+XJmZnH07vjy4udzd+r47/l48+rv9+nu9XF1e3t7e3ptYlxneXZub3j8fG5w +fXlsd+ng4ePl6Ojv7/Xw/W1pbvZ/cHf5+/t1fu/3bXF7Z2v87fZwbnvq73hra21y9HN+8Pj9 +dP/76+XtdGRve3x8/fX86+7x6+73ffl17/Do+G9wa3Pu82t6eGtnX2JoZmpqdPf68/jz8fPu +59/o7vF4cmRs9+fp8er+/XlvfPz8aPzt9nZ4fv778OPq/WtiYmpubnZqbG58enrt9PV7en7t +5/LzfHL9fv1vbHJ77ezd3ejq9337eHB6dW5zfvt0bXTzaV9tcG1ucm719G769Wph/ejz7Onk +3ePq8urud3Zqanp3eXry6+17bWhtfWlxaWZ58nxoa3zq7vrg2+t1/ezs93z99Wpobnzvb2hw ++29t7u/tbmvp4/Nvc21ubW/5fvnx7+3p5fDo7Pb+ZWFqZmry9vvu6+/76fj+/nv9bGhxb2Vt +/Ozvd/r4+ev4eXZ09fR89O3u7+96+vT3dWt2bG1v+355c3p3cfvs3+59/n78/vf2dfvu6u93 +7eZ4bmtlZ25vb2hq+ur3enJtfu3u/nr9+fr9d/Lt7+3z5+rr5O37fnNzc3Rub3x6b/Ds/PVt +b25t/vxvZ294eHF96Of/evt5ePj99XVy+fXr73559O54ePr1/Hv/++v3/npobnD89fz58P1u +aW51eXv89fTy8PptbHhtb+v0+ezxbnb9ePf0c/Xt7/du+evs7vl+7vB48+9tbP52bW1mb/1t +bnJ68PJ/aWv293NzcWx7ef3xcXzu5ebr9O/qevb2+up6b/p49uvtd251d29haH5/c3Bub25v +7vV6f/Lu/3R66/f+8/96b3t9c/f5+fJsbe/q/Xd9en96fn78fW76eGlseO37b3fu+nv37/Hv +6vD8//58fnhueHxxb3rv73d993lrcX9yY15r/nfy6ers+f17e/zy6fducf1vanP34+v88PT0 ++Xzy8mx2dWlkbPb7/P5x8+vu+vhyfvB3d29y+/P7e/16+/pwfvDq7HRlZGtqbnT+9Px9eG5s +eunf5uzs5ej17Ony9/x+eWxhZm1gXm96bGxxfX158uzw7/P89Pz96u3+bH/2fPLv8vv+9fV+ +aG7x+3t3fv92+/Pz7/X7dm1pcX90fvt//ftzf/txeHRudP78/3H85/F0dvry7Ptv+/f+9fFy +bvTu7HZ36vVwamz09ntrd3VnaHX1ePz/9fFzfu7w+fnx7fL19v54/vz37vltbm1qam17+/pz +bXL89vL+df16e/HueXzz7fd59fL7eXV+9/H9cnR0cX72evn5+npybnf9d2tvdHj8//r5+OTl +7ezv7Hh4e297eGt0dHX07/Hz7fNva3Rydndvam969vt1enr+9urq+fz4/f71+fTv/f7x7/t1 +cm5oZmpu+vn5+Htvc3J59f11e/7/8/336evy9O3v83r97P9vcXVvaGx5/XVsb3h3df739fr0 +8/z97efm6+/49O/48vF5cXl5bGlpa19fbmppa2VuenZ19Ojq6uTq6d/c3d/z9/N8b25rYWNw +f/v+9v17eW1la2pmdXZ7//jn8fvz8uzp6uzv/HNubGh193txc3Bsdf77fHzv7fL9ffH0fvjv +7/H09/p9dX3/8/lwbW1rbWtpamx1+/d5b3j2fPru7urm5ufq5+Tm9W9pam5sbWxlZm5vcnN2 +/nJtffjv9X199/Xn5ufp8/Z9eHVue359cmpqeHxz+3Z+9ntua/3t7e327/P7eXh+b3Tv63xy ++/l+cHj/dG92fnF8/Pl0Z3b47/f++X7y7fbp6e3p6fH79/v/dm1pZ2dsdGtoaHL89ff2/XV5 +/Pr/cHP39Ovq7e3v7/Pq7PL1eGpqamp3d3RxbXH99PH/dHd2fH3z7Onv+/n09Xn6935w+u33 +/H7+bWtubnJ3fH1yb/18dHBscX339Ozo6u7z6env7vZza25ze337+v75+PT2+3JydHV1d/58 +b3F8fPr17vJwbXNpaW1xbWVz7e/q6/L16+jn6356/vb+/vPw+Hn99fXs6Or2/m9vdnV1dW5o +aGVlZ2hia29++fvw9ff29PLv6ebs+/vx+PPt73V0fn35eX37+Pbr7P50aV9iZGt2dXt2ffj7 +++7u8fZ2b2929evq+Pju5+fs8PL2enVzcm5qbnVyfvr6bmt3f/h/eXlvbXr4/Pfw7e/w7fL3 ++HxraGxrfe3w9vH0+379f3tycPvv+P99fnV77ez3/fD9+XVoc/j39/N8dm90b2l29vPw+nZs +aG596+nl7PP4fnv7+np3amZtdXJ5fXBs+ers7O74ef35enL/8frx8vTq6vl2b2hteHNzb2tw +dn//fXx4dnl6eO/t8v788e7q7/r38/z47+vv9v11a2drdXlrcf56fHJ1b2xtevjv5+r1bnB+ +7+v4+/vz8P58eW569fL+fHP5eGp2/PDo5fBxbHL++Xx++3j/e252dfj0e3r97vh1eX317+/8 +9X51fHp6bnv19v3u7n94dHBzeXhzc29zb29vam7+/X397uzr6unr9ezl6vHs8nNuc3j+eXJu +bXFrbHV7fH57/f538+jxfv13bXZxb3n87/B9d3FzfPv8+PR9a2Zsb3f78Xp96eHg4unr6fj5 +f3R1e3ZsaXL39vpzb3R3fXR5eHr2+Xl0b3J4eXt99319+fr99vL0+fx/9Pj87ujufmxucm94 ++/1vdP3/e3Zvdm9vd/rs8fnz/Hnw6/F+fvf193z37uzv+ff3bmp/dGhxeG5yffX8fHlv//L/ +dHBtbv7vfHT+/XVvbnft5uDm6fF87ev5ff79fn/5/Hx+/3p3fHd4dXlzcGpsc37v7PN7e/r6 +evr8cf79fHJu/vr+eXb++3x+8+zz7ev3/P34/3Nrbvz27+98/H5wcm50/+7v/Hp9fHNzeP/w +9315a2p97Or/dP3+ffz4/P759X51cn33eXl7bWtxbXZ4bXV3bnZ48+zu6ebk5uvt6u/2/f59 +eP96a2pva3R8fXxzb212dm5ybW54eXF2c3F9/fny8vT//fTx6+Tl9nj+/Xj79vjz9/H3/X79 ++Pfv73xxeX1tamttcXR8dnX7/v1tanB4fXd1e/p4bW9zdPXr6evu6u/s8/vv93h9+vB+d/t2 +cP3u9PtqZWxpaW38+PDn7/X57OP4cHj+9/l+dG9mcX1qaWxwdXlu+e7x9vHs7e368/x2fe7v ++Pt+fn1+7OLn7PV7al9gZl5bZ/d1bnr48P149O/u6ePh7Ojg4+Hc2Nfe7Xxzc3ZmX1hWWlRO +V1hQbOz78ujo5/Jve/tpavPr6t3Sz87NzM/Z3e7v/V1dWkpCSk9HUfbi3dTOzdPr83JSTlFO +TlFn4t7czs3d19Pf3trY09bb19fqZV1LPUJHQElf893NycXL3OVrTkdHSklMX+He1cjFz9DN +2Ovp1dnSzMvJy83kSjo3NS83QE55z7+7vcLF2VVNREBERFPt2Mi8vL+/y933aHbx3tTSzMbJ +Zj43Mi8uNEBU8cW3tbe5vs9XQz89Oz5M+tLIvLm/x8rUf1153t/Pwb6/we1dPScsMSkuTnbQ +trGuscDG0EE1Ozk0PW7Hxruvs8XLyPpQYtvKxL26wdJrPCcpMCUrTWnkvLGtrcHKyEAwPDgu +PtXLvravr7/Oydti2ce+vtLEwUouJi0uISx47ve2rKyuvL7POC43LyxD6s23sq6uvMa+y9DC +w83NydxEKyQvKyA23FvXsKqrsb68ZzAyLyoxRV7HubGqr72wrrm+u755a0csJCUtJiZJ9n69 +rKurtL7ATDMuLi4wO+vDv7Grr6+pqrKyuczgNSEfJiEdL21nza6mqK66ucc7LS8vLS9MzNS/ +rq2up6erqK++2i8eHyMcHS9La8OtpKStt7XUMy4xMC0yX8nKv66oqq+spq26wkQpJSMbHSUs +POC5pp+nqarCPzcxKiovOVPQuaypqqanrrC/PS4wKh8iKi01QOm0rrWuqbC/zd1XPjU5P0Jb +/vvJv723uMDFxd9HOzcxLTM7P1jYx7++v7u+3f3ebFFn3d7gz8bBy/5fW01BQktSVEtJWXBX +SE9+YF/gycDCwbi2vcLExsvhRTtFPDAvNDg7OkDNwODKsbLBxcC/zFFfw89my7u8xOlTbEMq +LTosJzE/UGtPzLK+x6+uu7evr7jJubPTeNo+MTYqKC8pKD9LP+LN0L7d2LXF/bqvt7y0q627 +vMZJPjQoLC0mLT4/XtXOusDfvsFo2b/DzL6xsrq71UJMOCgvMSkySUzUwr2zxdi801nLvsDE +t623v71NOEAqJDItKjxKUc/Lu7vWv79qzbe6u7Ktr7e66Dg5LiMrLyovRFTp17+5z8+/3OK/ +uby6r7C5trxEP00qKTguLD1ASG7Vx+DXu9l2trXGvrC1v7e+Qz1HKic1Liw/Y37aubHGzLbT +Wb6+1MO0s7+8u0c5SiwjMi4oOFRNX8O0xdO1w3e4s8K7r7C8u7tINVMvITEzJjVdQUzHucnV +trxsvbLGxLKzvbq36DhPPyIrPSgpUlE+5Li/2b6339e1vdC6sLu9sLpIReMtIzszIzNbOUHG +vs3Ourv9wLLAw7Oywbu0xzxDYCkjPjIjOeA9S729zcu/webWwL/Iv6+xvLGufjvcPSAsPiUm +S0k65sDDxsq+uttevrXNxa2xv7SyVz1nNiUuNykrP0xV7da9utXYvMpVzre/x7Wusba5zEA9 +OSgmLSsqNkFPzMXGuLnTz8DK1Ma8t7S3s66zwls7OjQoJiosLzQ8/MTYz7++w8fGw7+9t7m7 +s7G4u7/nOTQ4LikpKSw2OkBd6s29vL+3tru7ub2/urW6u7a5xWs8NC8tKyckKTA6SfXTybqz +s7S4wMPBxcnMxLi1trK1yE0+NiwqKCQlKi477cfGvre0r7C9x8vb0cO/vbWxsrO1w002LCcm +JycnJys788G2tLi5tK+0uLvG3t3Mxrqzt7y8vtZIOS0nJiYlJSkuOmLDtq+tra+ytLi/xs/1 +XezKwbqzs7rB9z0wKyclJCQmKjNKybSsq6utsbe7vsXO6VRKSlrQvLWxtLrIXTsvKyYjJCcq +MD9sw7Kppqerr7jAyuVXRj47PUjqvrKtrK20xU8xJyIgIiUqLzlTyLWsqKeorbjG/E9KSkVD +REJK576wqqeqrrjoOCojHyAjKi83Q33GtKqnpqiuvdxOPj4+PT09PUXru62loqSpr8JHLSQf +Hh8kKS43SdO3qqShoqevx003MC8wLzE1PE3Ns6efnZ6jqa/EQykfGhcZHSIsPf27rKWfnZ6i +rcBONCsmJCQmKzJMvayknpycnZ6jrLnzMR4VEA8SGSAwbbuqnpiVlZmitUQoHx0cHSAoNtSu +op2dnqCkpaaqt2gzJx4aFhUWGCA316ygnZqYmZ2lvDkmHhsbHyQtSLunnZucn6e0xvZJRUpR +ZvPc4EspHBwbHiwzOmW9qpuVmJ+tTy4uLCYmJig8uammp7G9uLi+2joqKzVWu66tq6mnrPcf +ExMUHS44Srqhl4+Pm7VIKiUlHRcaJUupnaCstLi3u1UqJCk30be2r6WdmZqgujEZDQwRFB88 +z6aVj5CUn/QuJBoVFhokz6Kdm5yltc88JyUqMXOyqaakpaqqr77LVjMoHhQNFCUuz6qjm5KU +obVVJh8eGBcnzqydmqGkorA6KiUgLWHcw66uvLu/z7m0xMK3uMPkLRMNGiUjN+WwmY+Xqa3A +MygfGR75treln6eruC4dJiwsQ8e5p52jsrjRRFJyTunDznXoYyIOEiwuPrGlm5KVrs7RKBkY +GBxOq6+kmp2rtPUnJCwqOLyurqapxGY+LjNxzNKypaCks2ojDg8dGhs/p5qWmamrqTsbHCEm +PcG3p5qdsLm9NyYoKTLhydCwqb5YV079u73OsqisvFo1IQ4OKCUe4Z2YmZmipaU8Gx4rJSM9 +zqucn6+vsTgiJyknMVbAq6WvuK21+1/O39/F1NW5vj0fEx4uHSTEpaehnJ2ftDEqLiAXH0DE +taqinp+3Ojw9KCEtTde7raimrsTEut5AcMfN3md4PBkUKyYaMbGtqZybnJ6+NToqGBgoOD+6 +op2cobS/zC0eJy8uOsuvqqirray34NvfRkBHQjooGiA9JSFsr7Sqn5+fpsdeOx8aJDIuOLWj +oaGorrhJKiwvKi9MyLSurKmqssXNzfFOREJJMhwbMCYZNbS9tJ6bnZ6uv9ooGh8pIinMq6qm +oaGrzkVBMSQrP0ZwvrGur7Gxt7+8v+1dRiwbFyQeFi6/xq+alpibpa7dIxkdHRklUbmooJyb +obO75y0lKi0uPPy+trOuq66yr7jq1z0fGRoeFhc5zcqolpOXm52kVyAcGxYXIzvPrJ+ZmaGn +q30tKykjJzJE5b2tqKmoqa6zx0wvHhcdHBMeQEfFnpeVlZqbpUMkIRoSFx8nR7Wim5ucnKS8 +bjwqJCcrMEzHt6yop6aqu2w5IRsfGRYiKi7Pp5+ZlpiaobZULB0YFxkdKj+5o56Zl5yhqc82 +LCYiJy43Xbuvq6iutOUsLi8bHSwmJ0q/tKmhnZykqavFMSooHRsfKS1LtKegnp2ep7bKRy8r +KywuQtK+ubOvZzfdMh4uNSUsWeDFt66lp66rrMtRWDYqKCcqLC9Zv7mqoKKmpqy+ZkU6Mi42 +WltLzL0/Odw2Jjc7Ljps1L63squxu7K8Vk9mPC83OTQ3P2Hcy7itrK2sr7vMeU5CP0JEWl5R +5GA3PUsvLT44NFbNy72zrq61uLvTVklDPDI2Pzs/XOfPvrmzsbOzucrcak9KTU1RZExMWDk2 +STsvPEo/XMrAu7m2s7a/xMxaR0A6OzY3T01U0cfGvbm8vL7Cy+N+YFxYfs7UcVpUPzU5OS8z +PUBO3MW6t7Svsrq/y2VGPjs2MzNHTD7Dt8i4rra8vcrWW0pjTD9U3vjfw2dE2kIvPzoyPEZL +4czFs7W6tLfDzNhPQDozNjY1Smrnv7e3tbO7wcr+V0xCQEhKT+HSzcHCV0/PPzNHPTM9UVjh +z8S2u7+3utDh5Uc6OTk7PEPszcy8s7m7ucTab05FQj1DY+zVw9ZLy94xR1UzOk5MXc/Ou7bA +u7fH7NpgPj09PEA9Stra2L23vLy5wddgTUY8OUJIQ1/Oz8i9vb/J4GpNPTs/ODZHTEnwyMS9 +ur29xtvuWEdKUU5e2cu7s7nBvsdEMzg0KSkzO0fouq2trq2uvv9QPjAtMDQ3Qu3Aurawr7a/ +zfZCNzc1MzhDYc2/ubOxtLzH1kw6OTk1N0BU7s7At7W+x8tuRz87Njo/QFPfzsS6uLy+xtj9 +VEdERERLXO3Xy8O/wsfH0vJvXUk3N0Y7Nk7e3Mq/vbq8zd7fUD4/Pz5FU/nPycK9v8jWXE5S +S0lV9t/Uxb++wsfL31pSRSwqQDYyZtbFtrm/tLdfR1ZEOz1DVtDLybu6xtdnUlZNRlrcz8jD +xb++ycPBVC8tLikrNkjaurKvrLDG/0k2MC8zQta7s62ssLzfPTEvLTFBa8SwrrS4wmpJPzk+ +V+rTvLO0srvWfCUXKC4mQc63n56vtrBWLyslKEd8YK+mrKy6Tko+Kis8ReSzsLKst/hrRjhE +TkvJtri3yTIiICgvPfm8pqCptsxONSwqLT/LtK6vsrjjOi8tMD5YxrCtrrjRU0I9PERxvbO1 +srC0ul8pHRcYLVrFqaShn6xLLysmLDVBxqikqrPSRjkvLDNO0rqwtLm++UlJRkzlyse+ury5 +ubjJOikgGRoxbLajqquntz0vKyg7a9qyqq2xv0w3NS82X97ItLXAzGdJV/Tr19zSwsHAvLu7 +tcM6JhwSGD7WrKCrqKS6PjEnKE/byrCvtbPFPDM0LkfS+r+1wsTPSVPX8tnIefbLz8e4sa2r +vzEfEg4iTbecpKmfqWw2JR0v2sStrLOutj8yLiY81/29t8zAxlBmzsq9vd1gZFvUvLOqprU8 +JBYNGDJunp2ro6fISi4dJlnJram3ur9JPTIoNdrEs67K0tNMYOL1yrzJ295V78C2qqi7Nycc +ERQlQKiaoaWqzUs6JiM357KmrLrKW0U6Mi1GzbyrttjhTlfNyNXGyvnjWU/TuKumrzwnIBgW +HS3FnZykqMFIRDQpL0Pcr6q3x9JQSE02PevnurXP6XReyrrBw8xVUGRf6MG1rKe/NScZExcn +UKicoqWs0Uo2Jyc5a7qssbfAcFw/NjhF3bq1wM/zYtLFxcjTfl5kZ+K/ua6ouj4pHRgXHTS8 +oJ2iq75aPTQtL0LNsKyuvWhaPzlBO0jHt7e5zk5p4dzJ3Fhg9uDPxr+vrLxPLSMfHRwmTq+d +nae16T89Oi8yRdSwqK7HST80OE44Xbi6rrHzTHde1b1+XNx42MTHv7OywFksHhsXHDzDpZ2j +q7HcPDUrKj/Staqstc1DOTI1OUK+tLCwxGlPVV7TzPjV097OzMW0rrteLh8dGxwvbK6eoKiv +0EM6MS45U8uxrbG9WDU5OzxT3sK2tcHXc1Lz1tnZ//TVzc29s7O3zzspHxoYIkG4n56orb1p +SzgpLDp3sKqutsw/NUI4OG3xv6+5ydBuZ8vWZF5KY8W/urOvsb5QLSIcGR0v3amfpKq03Eo8 +LSs1ScKurbK8ajxJPzxWSH26ubm91nLT0OPgTUXzyr63tbSzv0ErIBgXITW+oqGlqLLG2z4q +KS4+wK6trrjTTj07MjZDT761urzGzs7UU0dFROm/t6+vsrS8TSwiGhcfMMimo6enrLnHRiom +KTL+uLGusLzqUks3Nzs+2b69ubq/wcDlU0g8S9G+ta6wtbzyOioeGBojOLqnpqWnrbC/Pism +JzXkvrq4v8S8v99QOzhJdOXU09fCubu/0Fha5dDKycvIwtVcRS0hHiAqQsS1r66vrq6530E1 +NkJVWk5DR//Et7a9yM/T32tJPD1J88a/wsO/vLq8yNhsSj03MSsoKjNI07y5vL2+v7/H3G9r +Z25hRjk2OUnjyL66ubm6v9JbRkZLWHjm18rAvr2+x9xeRj46MS0vN0FVb/Tt59nNyMfGwL6+ +wcvlTz47PkRPYe3Txr6/xdR5Y2h67/n/7+DZz8vT8VxPTFBXWFZadPl3W0xGRUdKVW/ezsjF +x87c8WdZVl539Onc2Nnd43Vla/fazc3Pz9LPztXmXk9LTVRcbHd0dPh1VUlBP0FGTl596djO +z9TY3eTk5ujg3dvd3eDg5/lvb/Ha0NLR0M/Qz9PjYlRQTU9bX19eW1NST0dDRUpUZvTm4tfS +1Nbc39/e3+Xn+29yfu/r4+Di39jPz9ff4ePe2t7ifGNfZWZnYlhTUk5OTElIS1Jbcf17fP3o +5N3b19DP1djg8Pj28O7t6+Hf3tza3N3m7ure4Ov6bm586udyXFRMSEhGRUhOV2fm3eLn9Wr8 +4N/h4eXe1dXc5evq4+br6uTl6OLf2dfb3+Hp8XhsaGdu7vRmWk9KSUlGRktPV2rp3d/b2tnU +0NHe7fTp5e3vfHB/6ufs8//05t3c2djX2N/n7XtrbG1yb2ZZT01MTU9PT1BSWGBrbvLc09DR +1dvi+3Z4dHzu597a2tjW3+bh3+Tm4d/h4OLh7fZuXVdQUExKSkpNVFdaXV5mcnR97uTc0s/X +2dXc7PJ+a3nx5OHh3dra4OLd3eDl5Obl4uTn/mlmX1RMSklISUtPVl1keHhr+uno393a1dTY +3uLg5+zt6ufm397n597c19jc3uPl497g6fhpWk9LR0ZFQ0ZLT1Vfc/rt5N/h4uLh4t/c29fX +297b3NvZ2dzd2tjY2dnb4ens9v5mXVxZU0xJR0VGSElMT1lr9ebg393c29vf4N7e3t7c19fb +3uDf3Nza19TT0dHZ3uL0aV9aU05MSEVHSUpOT09SV19t/vvq3tzc3uTh3dnW29zW19nY2tbR +0dHS1dfa4ex3ZV9fW1BMSklISElMTlFWXWNu7Oju6vn36O/k3tza2dnZ1tnRz8/P0NHX19LT +0tff/l5VTUtHRkZERUhKT1JSXGRsdPfz8Obf3d/n5OHb297W087OzMvMycjKz9DR1N3zaVlS +TkpGQj8/P0NIS05WXl9jbHZ77+fh39vZ2tnW0M7MzMrJysrKyszLzdLZ5HZeVU1IRkdEQUFD +RkpNUlVXXWZzdPzo397f39vZ19XU1tXOy8vLysnIy8/O1N3j+GVWT0lEQkJDREVHSU1QVFxx +eXh5/vHu7+vn7HpbOT60sb+xrK+wtr2wuGA/PDcvLSclLTEuMT5MzrrFuaustre2vcR0Q0hX +RzxP08O/wbivsb/QbkQ4LygkJygpLjhPzLy5r6ipra6zvMbsSkZBO0DswsC4raqrr8ZFOTIl +HR0eICUoMOazr6uin6Gkrba67TkxMjA6WmvBqqanp6/fUkwpHR0dHB8kKlm7vK2foKOhqrKx +0zc3Ni8/bmG4p6uurdBDbC4cHiIdHygrTrS5sqGfpKOqtrPGOjY+Pkjvx6+qtMZgT00sHh4j +IiImMtOztrSlnqOrra+yykVJ0f5Mybe+yFovOEIkHCQnJS0xPbOqvq6eoqeptrWu3EbHzP+/ +y0hONyQpKx0eKSYpPkvgrausoZ6ioqavsa++0b+7101BLCEiIBscHyIsOz5durGvqKWkoaOo +pKOsrqq0z9I9IR4fGxcZHCMwMzy3p6uooqGgpK2pp7O4rr9+1zcgJScdHCAfKjw3UbGurqiq +p6Cnrqutrq69UllLIR0kHxwhHyZcT0G1p6ihoqWdoLK0rrW/4DxBOR8dIh4bICIpUm/OqqWl +np+ioKeysb1gZk49TDQhJjAqIyYmOWY1R7Ksr62tpaGzw7G9XFNc4c3lLi5VQiolKT5jMjbA +r7TBwqunvvvFvu9YQt6+REfF1kE+STs/NS9FTT9Hy86/v9e3tsXCyN7N1u3hc8b561NTX0RB +P0M8Q0RYZU1Yctzo5tvKt9C6ur7Cw8DdzFDnXEw6Pkg4REZHWUo7SVRc+ubW3cDHvLu1usfA +087SZ1BXUEM8Q0pBP0ZcZk1K3eLvfd7DxMrJycrV1/bgbVzpb+pvVEFOR0xJRWn/U1jP1cHM +ybrH3/bvaFNWTmr7e01m31xYSl13V1JZ39ff68nEzM/EzOvrT1lfU0pcU01+ZG7442N7WVTd +6Gpx3uXo3Obj421c6dlxzctbfehe4f1ITU9KWGZuXmzo3/7f3Nvv8NJy3cvn4tDe3uRm81Nz +blNcW3dcYlRPYFhea+dqVul1/eLTz9jS4s/Y4vdoam55enHm51f8Y1JeT0vy4m9/+dLQ5eV1 +c+lqYmjvXFppbN/c3ezh6mZ37F9pcWza3Hrv3OHlYFldbV5eZX5r4+5n2t343edkfV5WbOjf +3Wz73fbvbHZqWlX17P15aXDw2N3e09t+bGFpembo6VdjeFxqX+vsbW1aX3B499/o3txw3ePu +69rVfVn05n5jVHFq/17/9HVbXVhm6WHp1ebg2OTrztfaXFTaZldcaHl8anXjZ1tefehnT2Bk +Yvls5dx+2tbe0ur/2c7Z8fv8cmtkYV1XaF9oT1Nwcm1Z8m7/3+Pi0OPn3tzefV9b7V1aeXLx +cvTh517zfX7qed/g53Xb729ganJdaF1kcmJpaOfeenXl2m5sV+TrdH7d2Gje/enj+HFXZX9b +XnlhfmZn+vLt8HB34uHr62d/2Wjd2W/uZmrp+mZpWnFyWFd4d/h6ff7u6WD55N32bm3q5H55 +bex9aubj7O5zfXbi/OTq2+5wZWrj7PxbaFpwYFBOaFdKUVhjWVlh3Nfd1cnFyMbFxr/Dy83P +61VLSUI8ODc7PD1ATGLr7OfGv8LKx8DH3d/OyMfVysLBxsrPYF5XQDs5NjY3NDU9R0tZ99TI +xMS/vL/Av8HFyM7Kw8XMwcPFz1hGT0o1Ly4xNTIvOFpkXOXGu7m/yLu3xNXPzM/cac66ws/D +u73LUUFYUDIrLjExLy03/OJX27q1tbvFurLEbd/V5mJJWL+6z865tLnOTE32PyopLy8tLC9G +035nv6+yuL2+tbjqTe3kTUJE7bq8z72trbTEfu3gOCYoLSonKCw8fllfu62vtbm5s7rxXNbe +TkdR5sXCxrmur7W2vvxPQi8pKCckJyotO1Fhzre1tK+yt7e8ytHXcGd0YnTTwr26uLSytb3N +XkU7LiclJyYnKi88V+3QvbOxtLa4ur3H1NPP2e7p0cbAv723s7a8vshYPDguJyUlIycsLjld +59O7s7Oxsri2tLzIx8fP1uNv3MfHzce/vr7G12hHOzUtKCcoKSouNUJx08O2sLGwsLS2t7vC +xcvZ5PNjatfT2szFysvN4F5HPDo0LCkqLC4wNUTvy8W8sq+xsrO2t7rEzNLlbVtVW/Xf8O7f +4tjS9H1yTz4/PzYwMjM0PEJI/8fFv7i4urm7xMPD3W7pb1xuamXf0+971N3j39/p6e5XS01L +Pjs8PD9GSUpl2tfWzc7SzMvQ1NDW1dHU29fY7ejc5GReaF976tTPzc3V4fHsXE1DQD4+Ozo8 +Q0lLWHTf1s7MzMW+vsHBxtDha1ZQVldqaOHWz8bBvb28wcjic1RAOTUzMTIxMjg/Rk/x3MvC +vr+8u73ByNLp2etaXvXa59PMxb/DwMK/ydXsWEdCPTYzMzQ1ODo+R1VfetjOycXFxL+7vcTO +0cnL52vv2d3r39Xh2N/r6HlsXVZNSUxLRz9BRUdGRUdOXvPq69bKx8bEwr/CzNLQ3NXtX1pS +W1laZGtff+Td2NXPz9Pf721vVEhDQUJAQ0NGUFhieN/XycTIzc3MzuLv7f13V1NhfHnw6tzN +xcXNysjJz8/b72NTSkNBPjs8PT5BR0xXftnTzczN0dXX4tro7f5r6+HU49bQy8vNx9fJzcrL +093k7E9IQkQ/Ojk6Oz5CRk1a8N3Qz87JzM3UzszY0Nnc1tvb1tjV3tbV2OX00ufe/mt5WVhP +TEhLS0RCQkVITVFaZObXzc7QzcnO3Nng2+n68H7f/9n929bdz+rR5dfi+uZea2Njak5OTU9M +R0dHTFFSX2nm4tXR19fXzNXe5vrkaXRq6+bp4OzZ2dfU8tfZ6MzS4Ofu2nFoSE9LRkI9Pz9P +UUxXcdnYz9DVyszM3N17cn3xamfa2eLm6tzPxc7Yzs3X2OXkbO1NQkRDPztDPz1LTVNV29nS +xMbMycXO3dPs5e52cFnqcu/j28zTwtXOz87L5tBvZ049Pzk+NTM6NkRLXW3ewMS5uby6wb3Q +0dJpbVVWS0tcTmZ82cvNyMPCwMXT1e1bQTU6OjMzMjM4RFZW6sq+t7S0t7W3vcfT6lhNST4+ +RUpSXOLMw728urrDycrnTDwyNDQuLi4vN0RV8s6/tbGurrO2ur/J4lNFPz1AQkVKTu7KwcHB +uri5v8vTcU46MC8vLS0vMTdGXdjGvLi0r66vsrjAzd5gST89Pj9ETVJ3z8XBvLu+vr/FznVV +RTYvMTEuLC40Okddzr69ubGtra+0vMfTfFhJPzw9RElOVuHQx7y8v72+xcfJ2GJMRDguLjAx +Ly81Pk1h18G7uLSwsLC3v8bUfFVLQz4/QkdPV2/Rx8XAv7+9wsrKydxdTUc8MS8yNTY2OD5K +XN3Bubi3t7e1tb3O9VxQR0E+PkNJTlvxysTLy8C/w8HDyt9lY2hhT0I7NjM1O0BAP0dd48y/ +ube5vsPBxMzdWklFQERLTFNu7d7OxcPDyMrGyth+4d5rXllYWU9FPTw8QUhMS0pRZu7cy8TD +yNHV1tbS23RbWl5p9d7X1M7Q1tLS2e9vXl9//VxX997Z1d3i/1hJRkVERERDQUROYOrZzsnJ +zMzMy8zW6Pz6+Htubvzv+nNw/v576t3a0M3PysrQz8zQ3mlMQTs4Ojw9PT9ETFd32crCwMPK +0dLP1eJ+aGFfXGN88Oje2t7c1c7NzMrMzc3R1dXcc2FVRz45Nzc6PT9DSFFv4dXKwb/Eyc3Y +297h8mlmbW508enb2tva2tnQyMrM0dTQ1ef75+1bSj86NjY4Oz5BRkxWaeLLwb28v8jMztLW +3fB4Xllhdu/o4N/p39HRz8vM0dbZ1dPa53pdSz86NzY5PD0/REpZ99nMxL++vsLJzdHe7O9v +Xl1iYW/44dTV2NPNycjOzMnR2dffd1tNPzgzMzc7PD1CR09l487Cu7u9wcbJy8/b82tjYV9j +b+zi3tTPzc7R0M3Lzc7W9GVYTUM7NDI0Nzs+Q0lVctvKwby6ubzEyczR2+xlUk9OT13r2dXS +1c7Ev8LEy9bU2uxqWUo7My8vMzc5PD9LY97Nwru2trm9v8XO33ZfUkxIRUxg4NPOysO9vL3B +w8bN1d98WkY5Ly0tMDU3NztDTnbMu7Sytbq7vLzDzuZaS0I/Q0xaW17sx7q1tbe6vcDEx9T9 +TDcrJygrLS4uMDhGd8a2rq2usK+tr7jMYExEPTs8Pj9ARmrCtrCvsLOztLi+z083KyYkJiYn +JyovP//Bs66rqaemp6y3yN9bRTgxLy4uNUbux7y2r6qoqauvuctPNywkHx4fHyInLkLYvK+p +pKGgoKKotM1eRDguKikqLDA+bcS3rqmkpKWorLXGVDQmHh0dHRwdJC9H1bWooZ6dnJ2gqbXH +VzQpJCIiJCctOVe8q6alop+foqmyvn42JBwaGxkYGx8rPtqypZ6cmZibnqStxz4tJyEeHh8k +Kzh2tqqkn52cnqGossVOLR8ZGRkWFRoiL0nCq5+bmJeZnJ+ltVgyKSIeHB0gKDRbwa6knp2c +nJ+mrr1dLx8ZGBgWFBggLEXDq5+ZlZWYm56mvUsxJyAeHB0hKjxqvqqgnp2cnaGotNo9KRwY +FxYVFhslN9WvopuWlJaanqOzUzMnHx0dHiEqO9e2qaCenZydoaez+DcnHBcXFxUXHCc5x6yh +m5aVlpuirMU8KSEdHR8jKjrrtqifnZ2dnaGpsMRCKh0YFRYXFxoiM9ytoZyYlZaZn63LOCYf +HBocIis9y66knZqZm56iq7nkPCcbFRQVFhgcJTu+p52YlZSWmqO7SiodGRgZHCEuWbSknZmX +l5mco6/HTi4fFxERFBcZHytYrJ2YlpWVl5yq6C0dFxYXGR4pQbqmnpmWlpeZnqq8aTQkGREQ +EhUaHytHtqGZlJOWmp6qyDgfFxYYGyMtP8KnnpqZm5ydoau7XjIkGxYVFhgcIi5gr6CbmJiZ +m6Cv0zEfGxobICs3a7uroJybnJ+lrbbKSC4gGRYXGB0lLUDFrZ+ZmJqdpLDFRyoiHhwfKDJ+ +uKyln5+enqSuvGw8LiQcGRcZHSY1Yr2tpJ2bm52jr8s/KyQfHyQrNmC+rqSfnp+iqK69czoq +IBwZGRofKDVgu62knpydnqStv0ovKCMiJSszS9G4rKSfnp6jrLvhPi0iHBkZGh4lLkq+raSf +np6fpKq4dTksJiMlKjJA/MCwqKKfnqGptt47LCMdGxkaHSQuS8KupJ+dnZ+kq7jePS0nJCUp +MEBvwbCooZ+foqu43jssIBwaGRseJS9Nwq2ln52dnqKqun47LCclJiowPXS+rqWfnZ6gp7Pl +OSceGhcXGR0mNWm6qqGdm5yeoqu9UTAnIiAiKC9B17mqoZ2bnJ+mtOI1IxsXFRUZHSc45LKm +n5uam5yhrMBILSUgHyEnLj7ftqefnJudoKax4TIgGhYUFhofKz3Vsaafm5qbnaOuyT8tJSEh +IyguPPG2qKGenZ6gqbdqLyEaFxYZHCMuScKto56cnJ2hq7trNywmJCUnKzZSxq+no5+fpKiv +wEsrHxsZGRwfKTdfuquinpydn6WwykcxKiYmJysvPfa6q6ShoKKlqrPMOyYcGBcZHSMtPtay +pp6bm52hqbxZNysnJSUnKzZRxa+kn56foaart2YqGxUTFRoeJC9Mt6CZlZWZn6q39zYlHRob +HyxGzLWqoZyamZuhq7tVKxsTDw8SGB4oSrOelI+Pk5mhr9guHRYTFRsmOdOxpJyYlpebn6ey +2zQeEw8PEhcbHi3EopaQkZOWmp+yPiAWEhQXHSc5wKadmZiZmZufqr1MLR4VERITFhsfLr6k +mpSTlZaZn69DJBoVFRcbIzXTrKCdmpiYmp2lsc49JRgTFRQSFRon3KqhmpWSkpWcqcU5IBgV +FhkeJDXGqZ+bmZiXmZ+ru2kyHxYUFBMTFyA4v62kmpOSlJidqL01HhkZGBkcHzPLsqedmJaX +mp+jrMw2IRkXFhMTGR8qQ8eqnJiXlpabpK/pMyofGRodHyc2XbWkn52amp6kqrpoLx8dHRkW +GR8lLDzSraGfnZqbn6auvWI0KiopJCUsOVvJu6+npaqrqq/HSDk3LiMfJCYkKTdNfc+8rqqr +q6qssbm9xmpAPkZHQUpt7c+/xsvCyWFHSUI3Mzc0Mjc+SVp53cfG0MjByse+xcO/w8bGzc7D +xsvMyMjT32NKOzQ2Ny8uMzU1Plrr3MzEvry/w8zp283e5tHU2M/Nx8DBv7q5vsXI1mZPQDo1 +LisuLy0xP0lV38q/ubu+vMTaz9Rm89Dj7tPTzcTAu7i7v8DJ3+b2Sj87MC4vLy4wOT9JX9TG +wsHAvsfPys70e9va39PNx7+9vcHExcfLztTyVkc/NzIxLy4yNzxO79THvr2/v8Tcc2xfWmb1 +4dHGwL++vLu/w8XJyc7gaUw/OzQuLi4uMzpEWt/Mwr2/wL7J3eB0WFZVatvRysC+v7y7vr6+ +wsXG1nNOPjkyLi0vLzE5RFX9z8G+wsLAytve6nBuZvXh2s7LysvGwsLBwsPBwsnV+05BPDUx +MDEzNjtDS1/dzcfHx8bJzdDU1djb19nY1dfX2dnQzcnIzMvIzNn9XE1FPjs5ODk7PkJGT2Pz +5N3X0c7NysnLzM3O09ra3uv45tvV1M7JyMbFx83afmFLPjo3NjY2OTw+RE9s5tTLxcG/wMPI +ztHU1tXd6/Du49/c0cvGxMTIzNPrWktCOzc2NjY3Oz9LX/LbzsjIysjHx8rM0NXa3ef6fv/q +2dHMxcO/v8TK0elYRj03MzIzNDg+Rk5j59fMx8bGx8jJzNDW2+Ho933z5dnTzcnEv7+/w8rW +81JCPDk3NTY4Oj1GTlz84NDIx8jIyMrP0tbf5vR5d3Xv5NjNy8bExMfKztTfd1xNRT89Ojk7 +Pj9FS1Zs6drTz8/O0NHT3d/f3+np4OXj2tTPzMrKysrMzM3V3uxdTEQ+Ozk6Oz0/Rk1Yb/Lh +19DOzc3MzdLY2t3i4eLu8Obg39rUzcnHxcXJy8/iWUdBPTk4ODg7P0hNXvDhz8jIycjJzNLb +5O9vZmBganTu39jOyMfFwsLCxsvT7VlKQz46Nzg7PD9GTmDw4drPzM7N0dXc3uD09/Ly7OPb +2dPNy8nHx8fEx8rQ3npWSkVBPDk5Ozw9QktSXHvo28/Nzc7Q0tPU19zg4Ovt5eLd2NHNysbG +xMTGyc/fX0xCPzozODo4OkBKUF3r0c3LxsPBydLNz+d2bF1aYWhea9bUyL67uLm4ub7N41w+ +NzAtLCsuMTY9Te3TxLu3uLa2vL/D4F9TSENGSEtVX+rOyb65uLS1uLm7ydlePzYvLCoqKiwx +OEdt08C5tbKzs7S9xcljTEw+PUJBSVpxzsO9tLKyr7G2usDRWj44LiopJycqLTI/WdS/u7Ow +sLC1tb7O0l9GSz88QkBKfurMvry1srOvtLq7yOVWPDcvKigoKCouNkJO4r+5s6+vr7S1vc/Y +YEZEPj0/QUthfM+/vbi0s7C1t7nH0+9GODAtKCcpKSwzPkzoxby2sa6vs7O3x9RvSUQ9Oj4/ +P09p5Me/ubSzsLG1trzL4VM8Ni8sKCgqKSw2QFHawLm0sK2us7O8y89fR0I6OTo6Q1Re0MO+ +tbKxrrK1tb7N3U08Mi0rJygsKi06QVTPv7ezr6yvs7K8ztNeQj86OTs7Q0xV08a/trKzsLK1 +uMDM5k0+NS8uKygsLS43Qk/cw7mzsq6utLe6yuZzTT88Ozo8QUxe6cm+vbi0tbS0usLJ2GNM +PzgxLzAtLDM2N0NY6Mu/uLi5tLa+wcLgW15PRURLSEZW7+7Vwr/Avby/xsbI3upyUE5LQj06 +PDs0O0E+R1hm39LGv8K9vsXH183YWHpcRVJQSlVb/ODly8jPx8TLy8vJz9nU5fD2WUxEQj83 +Ojw3PEVHUm7Qycu/vsbDxNLL3G7oVVBkV1ptZmf/3NLZ2M7U1MvJy83EydvX415TSEU9NDs6 +NTw+P01c4tDKvb3DwMDLzs/e5mZeZFZUVVRWX/7u5t7TzMjExMC/wsfM0NjuXFFFPzY0OTIy +Ojs+TGrU0su+v7+6vsLD1dHbYf9oU2JWS1ZaXX3y2NPYx8bJwsPEyMvK1eDuUEZDPTU2Ny8z +OTpBT+3R08S9vru4vL/Fycvvb3lOT1VKS0tYaFzf0NXJwsHCxMPEzsvN+HlrTUM9PjsvNjsw +N0NETWjOxci8uL69u77Hz8zfYnBfUkxRXE9PcH552MzO0MrI0c7J0OPn5n1meXBUTEdIRTY9 +QzU+SURWZdnN28K9ycK9wMfOzOH081x3XE58XVj0aPrm/uXj5NLY18/Y2dfe3vxz+mhjUUhP +PThJPjlERk1WZc7NzL27wcC+w8zS0u1cdHJPUmFbVlpnY2Tt5W1/2dbe3NXieu/p/m7z3N9c +V9lbQGFRPEVPUU9U399yzsXTzsXI29/P22Jz6ltSXWZvS1HXUE7S4XzZ0N/+19Df7NjV/enO +3v7S1FXy3T9LXT1BSUNLVlZu3fTRydnOytTZ19nt9P55aV5qXVNdY1li6Xz409jTzNDOy87P +z9ji1Ntmd2tNSkZBQD9BSE1MUG/k5tvO0NXSz8/W29ji+frp4Hxp/Hdqdu16XnXvX2zp+vXp +5/F/7+bm7fTm4Obx+HR39fn+bm1dVltZV1tbW1pbYGJncXL16OTe293a19jX3+nr6uT9e/1m +/H997vvp4/r+cGJx8fr79vj1c3NwXlxnamZwfmhlbGloaW5yb29++3Pp3+bm393i4N3f3+Tf +4fz3/mtpaWRfYGZeYG91eHx4bGx28en6/vh++OLi7ero7XlvbWxpZGprbX7z8O7l39/f7Pnt +63tpXl1iYnJxam11c21taP7r7vDr4eLl4O9+9nz+d2p37PL67//68312dnh/6+32//7z9XJz ++3RubmxiXmZnYWFpcXVycXT56/Ht6unj3t3e29ja4uru8/txZ2/6eXz8dnF2cGphX2FmaGVr +b2tpa29vfu/s6vR/9/Dv6+Ph6uru9mxcavjdy/Ph3FJP9OhH591s6M7f48ZcZsjgRlR7SVJO +Rk/sXEnk0Wr209ndzdrtzNFo/NHyXOlpW/ZlU3fdW1rocGvf62Tw52Rw4nVl/flv6fdj+ufy +9eLm6eR1Y2prWFxsZWhycW99///m3ufm3+fh525kdnZjbvlya3/7c/H58uv1dXvw+3Ztd3B3 +enLr8Hf27vf27+7y8O77/vh2/nNvdGz//XF3/WpncHR5eHx8++7q7e7p+nFuYmhsaWdv7Ph+ +9+/07+r//O/98uDsbvXn+XFubmtueHn27eze1tvg29rs9PhoXEY8R0xBR2ruz8PLzcTMb19f +UVhVVGDXyc3Kx8rM3VxNTUlJT1Zv3tLT2t3hc1pNSk1SXHzb0s7Lzd3i/F1TT05UcuXe0s3X +5u1dUFVZXGn13NbT1Nze6mJaWVpdZWz35t7f3+tmYm1rWlxk/uTl497h6e/0fm9x+e198+bt +/vdyYfnranH5dm1wbWr07/t6bfp+aGVvamv3bHTzfGro4fHg4np/9GFk7+nh2d3i3ut8fPX1 +9Pr/fnhuZmReSz9JWl3t1NXPy9pkWVZWX2Jb/dnTz9fi4N3m9fj/39HV3d3X1dbd7X5pZE4z +Jy5N6sy/vru2yUc9QkdZ3NnQvr3J4F1MT11aWGplZtjY/vPpffLpZF9vaGBvfd/EwNNvc9vV +4+/j3udrXDUnOd/izsHNzb75OTtITfTG0eHFyu99VUVK38fW1MjN1ttlaMa9xtXW0dPkZlFM +RT4uITTIz8a6xNzA4jc8YGbevcjvyM1PT3tnbc3mR11kUsfB6s++zmdjTEnYxs3My9XS0vTu +6WVjWTgmHirXyMC0r7W43jU1SmD0ysjQvb1jSmZb/czrQUbd2unSxsC9z0RBXHLx08jAu7nI +VklDOzEoITW+v8W8uL2/3jw+YFZGWe7av7/kdtFrQmzUUFDO0Nm+v8jAx08/TlTrwr68ucH8 +Vk03KywuJyvGt8m+s7zLykY2Wc9aUsvKzrzGXnTfTUx4RzzhvczMu77Jy2RBVOtV/725vsHO +6HY3JiUjJ1K+ycCsq7rHdkBGXj42UM/MyMHIytZPTks7P+jH0sOysLnWS0Ng3mte47+yt81Y +QDYuKyMhPrvBx7evt7vVP0BwUzpB/9DDv83hzb7PPThS2f1a7b+xsr/v+9t+YFpsybzH7Fs/ +NzYpHCjN0FLGrbG0s9FR2MtFNUNMUtjIfWm6s+I9TtTuT01xxbq+zsvBvsV3SFPU13RvUkZD +NSQgN1pFT76xsa+1zuXK2j04RFhp5udO8La8bXvMzOB3XFzWxMzc1MrHz35k28TG31E/OjQr +JCo8SE7bu7WzsrfC0c/kS0JJSkRNWV3azOTqyMHM1MvLzMfP5drMy9pmU2DX0vpaT05NPC4u +Nzg3PVXayLq1ur6+wthiaGhZX+bxY+3nXl7z/ltv0M/RycXFyNLzWlleWFZq2crP41tLS0tF +Ozk/TFNUZ+TZ1tztcOnS1+rdzMrT3/tm69xoU17k19HV18i/wcra6+vlel9t5u1cSkJDR0I7 +O0FJUVpeZe3b2dze2c7N4fPZ0d7l3efn5eL7fdzb18/JxcrKzdzu9uRzYV9YVVJIQkJDP0FI +SUxVaff46uPWzs7R1dja0dd0buvc4e/y++3h3u3k1c3LysjO0M3V8mBhX1NNR0RDRUI/QkhN +Vl9kYvni39fOzM7O1Nvb3O/23t7q49jc7ODc597Y3OPVzNDSz9z3eW5fUk5HQkA/P0FHS01W +XGBr8ubf2NPT08/T19zj39nS19jW3ezq3N3c2tjT1tTS1Nzg4vZmVU9LR0RBPz5BQ0ZMTllf +bu3n28/Nzs/QztTW2N/j29re4+Lm8Ovn5ODc1c7NzdLW2uj+b2BVTkdGQj0+P0FCSVBSW/Dg +2s/LzdHU3OXo6vvz4djQ0tPR0NHY3d3i3tzh3Nvf4uZ9al9bVU1MUFlWVVZPTk1LSk1UXGJx +e/Xt7e/k3uLe19XVz8vMzczNztHY4O7x8Hx+7uzn7HxuYGReVlZWVFNZXF1eW1pbWVdPUVtc +Wmj+d/rs7Ofh4eDc2trY09LU1dfbYkf+2dbozsnEv87d49pqUk9LTk5LSktVWWFebPzxeWpr +Y2ZoXVRPTUxPVFtf9+nb0MnHy8fKxsvR0tTX9ejw6u99aWp4XVl2dVpYYGxlal9ra19jXlxa +ZF1e/m5xaV9TWmZub2F44N3r5dzX2tnW2NbX2d/f3+X79enl+e9v9fBjYfPoWlheb2lbVf13 +bm3v7fDvYWpsfVpk+Gjb6efv5mlfaXXx/mxr5Wpi7uv14+d87+nk897b1uTp3eb4eOll+nJ9 +7O5q/3Zdbf1mX2hqbl1ab2Nybv1gYWZtbGt46t7k5uzt8W3p7vPv8/P06nbu7tzhfGRt52d0 +dd33but4bnboeH117vBp63b1ZF5UbmhkeF9pYn5sd2xsYHjle/H5+fvg5Nve6eP07u7f5O35 +6mRu5mxw7fFlb2Bq7vHwdnxsZXBjXu37d2xe7+3fdHzw7HBc5/FpZuzp/O/z9uXnfnzxbHt0 +ZnjiX2re7Xnq/Vjm+Wxx3eBtfnrpamFo4etocdbe5uti+Xz+bmpubPhkb2zd8Gh5ZWBmZmvo +b+zj6vfn8nL8YXl9bnfu5ez5ft7x4Gl2d+fw7u7v3W986nXv/mxnc31uaHZXXG5cWF3tYXF2 ++OL07G3l6/DubOve3vff3+B96vHq42Z1cnds6W1u7l5bXW1f8G/u5fTpfPZ0b2pob2pzb/vu ++Wjv6uJ5++fp73bvcHX8f/1x8Pp0ZW3o63194+Xubm3y9XPu4u78aGxq8XX7/3x2cGNncXts ++/NvdPj+7fnu6vL38PDf2OVvc+z4amv/9/toe3R7cvzf+nvsfnhyeHfrbmnqdXRgb+r0fnvp +d/hq8mj7del7ZOno6PLxaO13/HV/3/HnbvV37n37bPxve3Rs+GnyY2v48Ox+/3V2a2/weHDu ++HTv9vvv5u776HT67Gls+PlrbfXxfPZzdvJyfndx/+1n8955aPDy9vl7+W5ofWtvaHx3Yl7/ ++G72+Ozt2v7z/Orr+u9x5G75Z+9uaGz6emznePp73293+ed0ce7n8mtudW77fG/59mhr7W9l +7vB//fdf++ht9Prk5+/r6XNs8XFocOLvbmfq+Hdnb/968fTv8Wtya2pp7X7883l93Pnu7PX0 +8ulRfXlpdO7x99p16+3vbfXk5X9f5Xn7VvJ4YWlgbmf8X+vf5WFx2OTf+3fz8ml76WZqfO1l +aG5j5+ds7dt9/m1mY379Yn5tePfmbuXn+vvr9/Rx6ONq7/duYV5oe3lu3/pzdX17b/pc+2/1 +aelod9p6ed/gZvXl/3ty8Xv3b3ZuY3Tr8GJia+f1fnDk1+Tt7edx9Fpe6G5fZHxr5PLz1Nrd +6uRqdnns2/t+X+5uXVVMV09PTVdQTmJg6+3SzsnDyMvLwsjI0MjHzcnGx8bEYDYqLC0qKSou +PdrCt66rqKaptchVOjItKiovO1bMvLOrp6aoq6+2v9DpSTEqJB4dISQnM0vIraSin5+mrbtP +LyklIiYsMVG/squnqKuqrre7xNHHvcdSODAnIR4cHiMtQcSvpJ2cnaOuyz8sJCMhIy1HzLSq +qKeorbjE3m/33M+8tMB1RCseGxscHyg316yfmpmbn6q7SisfHh8iLUfLs6mlpqqwwN5wVVNh +2r2ytsRfLB4cHB0fJzH1rJ+amZufqr5EKx8dHyQtTb6up6SnrLTJX05MTubFubK2v3cvHxsb +HR8pOP2wn5qZmqCuzz0rIB0eISxYt6ynpqmsr73qT01W07q0tbzORSofGxsdICo8zKyfmpmb +oa7QOikfHR4iLEy+r6mmp6qut8XNz9LHvry9yF8wHxsaHB8pNUi+ppyZmJynul0xJB4dHSEv +Vb6tp6emp6uxsrjBwcDIz9tLMSAaGRodKDlVxKygmpeYnq3aMCIfHR0gKTZ7sqiko6Wpra2v +s7a8y+xPOSofGxkZHCQ2+7ipoZyZmZyjt0EnHRscISw6XMK0raekpaeqrK+ztrzKVzIiGxgX +GR4nMVS7qZ+amJico7NQKh4bGx4oNl7EubGsqKWkpKaqrrO800QsHxkVFRgdKDrhtaiemZaW +mqG0SyofHBseJjZXybiyrqqnpKOlqa650kgwJB0ZFxgbHyxGw62jnZqYmJylu0EqIR4fJCs6 +Vs28ta+rqqqqq620xVY0Jx8dHB0fJCw6Y72tpp+dnJ2grMc+LCcnKi84R+fGvLe0srGxs7rK +WzksJiQlKS00O0NPbtG9sqypqKmts7/eTz88PUJMad3Qzc3My8vN31A+NS8tLjQ9T+rOy9Do +Zlxj4si+u7q7vb6/xs3X7HVoXF506d7d525YTEQ9ODc5Oj9MadvOzdf9XVlm8t/WzcbDwL69 +vb7Ez/ZdWVpedOnm9G9dUk1IQz89PD5ETmD02dLa+l5YWWrh19TLw7+8uru8wMvX729jYWFV +TElJTFBVU1NQSUVGS1Jm6+5sYVdNSUlMVvzPxr+7uLa3t7m9xdD1U0ZAPj0+QkZMW+/e3dzb +3uPj5/RlU0g/Ozg5O0JS6su+uri1tLW3u8PVcFFHQD49P0RNXHbs3tnU0M7Ny8vW7VxLQT09 +PkBHVGze1MrHxsPBxMrR5WtXUE9QT05UYHzg3NjX1tPPztTX3nhTSUVER0lOWWj46uDc19PO +zc/S1NrzZ11dXF5iXV5p/e/56uXl4OTs+WxdWldVWGN56ujn7PDp4t/a1dXV2eX7b2ZjY2Ng +XFtdWlpfZHTq5ODf6X1pY19eYHHx59/f5e3v7evp3dvf5ez58u36cl5aW1tZXWJu+e7k397h +6fR9dXt5a2hpb2tqaGl79/L37+zk19jc3tzf+mlcVFFQVFlfae7l4uLl29vl6/Nwa29udG5p +b338eP35cfvt6+Ti6et+cnZtbGZeX2VpZ3bx7+no6Ofl4t7f6393/vt7+X5vbGxwb2xtdnVx +f+nuf3h0bGFeY2Nka2tvdurj397c2t7d5up2fO/v6vL+b11V4Pph+vLscP58/nhvampqX11g +W2ZobPH44t7f3N7tU2HT0OLf3N7p8uPqdlxYW1BPZlJd09TL3mr49MjfSz5JbF5NWtHf2Vvn +x8nJz/Dd4WDqbV5eUl59Vl95WO7nY+nj7+n5bWltXl5dYnNpd3rq6ejb5tp75fDh0vnvbXJ8 +7u/w/f93cXh4cOptX15f5l9Va1va3l/4cO7dXePxYNTxeNtbU95599jx7tBd4N5o82vq7mVp +fFroZX97YXP+bmP4Y3Hi81/gedjq+dpkY+9aX+h+5XZz1/7o4mDv2nDt3/reXm5sXl1rbHhk +YnVg7uDm5Obo3eb7emhoaPDmaH58ZnVoX/p+8OTi/HTuX/H0/fb77W1jdn556vjq5Ozq+H7c +/XRnWPtgbnJdbV1Rdf3j0+PU53X+bevu9XroaW1ZZNx0ffFibuVj4ujl+fnfdP5kWV5lVnbu +dm/27eTs2tz55ufn6Gfy6GJiX1xX+G5+6+3i3nzl7l7hb19oZvdvWt7fWNzifu3vbmzveXZr +9OlmenV1bfN879/kfl/kfe3k53nq53Z9+f9ienJfXWNddmxw7eP65tzi6fTe3X5gdmxvaW3+ +7HZp61/s3l/9bmbsat93deHh8O/Ybu3V1uLn4fl26mVuWVFMRUhDQkZLVWvfzs/KxsLAwsPH +ytDS1+R338/Sy8bE2Uk6LSgpLDJGV2Tf3M7EvrezubvBz9zvaV5nWXfp3c/EvsG9v77H2j8x +KSQlKC46TW3Lxb61sa+vtL7L/FtTTEpLTk950766tbi3ub7GeEIuKiUmKCw0PUx3x7uwrKuu +tsTpWk5LSEhITVN107+7ua6trq+0wmM1JiEeHiImLTlOzrCnoqCkrb3bSj45NDM0N0jivbCs +qamnqauuv2AzIhwZGRsfJC1MvKedm5uepbDIPy4mISQpM0/JuKymoqCjp6uvuddFLR4ZGBkb +HiQv7q2gm5ubnaGrxjgjHh4fKjRFxLCqpKOlpaesrrbjPjgqHBoaGh4jKD3Gr6KcnJydoq7P +NyUiISAqNULBr62no6Wmqa+wss1JOikcGxwbHR8jNcy1qqCdm5ufq7reNSooIiQvNEDTvbKo +p6mmpqiruN9dOSMeHRkZHB8pPF3CqZ6bmpudoarCOC4qISAkJy9DfL2spaGenqGnr73sMx8c +GhgYGR0oNEi+p5+cmZiZnqi2azsrHx4gICIsPc+uqaSenqCkqa/GPikjHxwZGR4kKDH7s6qk +npubnqGotts5KiklISMqL0DUvK6opqamp6y63z8zLCUfICQkJC0+Tti3q6Wjo6OnrbfI7UQ0 +MTIyNDpEW9/Bt7i3r7DGftr3NSw0LycoLjc6PXK8ur2vqrC0r7jBxelaUz4+TkpN9dDLyL+9 +w9L41nk0Lz0xKC45NzxM3r/Cw7SywLyxw9PE1V9mWFJcTVXPztC+urq6wNbe+TkuMi0lKC8w +N0RqxL2+sq21tq+6y77KX1hLQUZIS/HQy8G6tba8v8xePDQwLCkoKS0zPlXTv7myrrGwr7jC +vshxXVVKSExXaufQxb68urzJ2+VGMTEtJygsLTM8StbBvrKtsrWvtse+vt9tb2JiXGfm4N3L +wcPBwMr5W0Y1Ly0oJyssLz5V7cK3sq6vsa61xcC/7VpyXlZYa+LZ0cS8vLu9yNVaPzcuKiko +JysuMkBn1buxr62srbG3usDXcWFaTU5bZvfYzMS/vL3G1W9GOzctKispKS4zOU3bwriyrqus +rrC2wc3T+1JJSE1TYd7RzMS+vsbR2lQ9Oi8qLC0qLTU4Q+/LvLCvr6yttbW4x9XuVlFPSE5i +YeTJyce/xc7N+z9BPywqLywrMDZAXm/Nt7SzrauusrW5vdJdXlxIQ1BYU2Xp0M3Q0s1+PU1K +Ki09MCs0PkFeXti2tLevqq60tLq+y2xmdEdESldVT1521tnu183gZ00/TTwrMkI5MjpQb2Zg +zbW2vrWts8DAvsrkVWT0WURMeF9TXtzQ22ttz9dWU2JSQ0JJRUdHRk5QSE7x59bPy8i+wMjG +xcrP325y61VQYmBnam7q8mFvcGxlfHre1N3n2eReZ1JSTk9MTlVMT13l+nDZ5NbU4NfS2HnX +3/p1/ellfVpqz17V0MjQ2dfe/l1mTExVSGNWTdxKcNJd7+br+PVs3GD+6lv4Xfv2delt2s7W +39fR5f1sX/NPWV1S3Uzy5H7fbNrd7dvy1fTy8W58YXdoY1/6+unx4u3lfPP3XHJPU1NOUU5Z +/nPw1crRzdPVzt7b0uPo7u5fXmdfbltpZmX4/tnn8d7+XltWVl1XVFtjZW7f4OPa1tfa2eLS +4Ph4bGhcWVdXX2lfbf36bWhdZv7e5uvuanx5/2p89Pfh6uHc3tTX2drb3Nfce2dlUlNVVFZO +U1xdVU9XbFxhaunpceHc2dTU1dfX2enq8XB539rj3+DjdWxnWl5qbXpuY11fX1dZaVxXaPvu +8nny3vPr3Njl+N7b/O3l4OHi4X5mZWly+XH+9HRzaGXl6ePvcvZ1b/78eXfp4/318/toe/F8 +cGF0cW7z9vR1cfl/93Nv/Hd69fv1+nZ1a29qafLq8nl27d/a1tzb2eLg5fX3c2x0bnJrX1tb +XF1eXm9vdGZqdf/o4+fp4+Xl6OPrfHFsb310d3J8/fjt9PV4fGpkaGdqc3307u7x/n52bmlw +eu/s4+fs6Ofq7O/5fvF9b2188Xd6cXNrbf7ybGlmZWZka2ttdPv67d/c3+Tn7Hd4bmVmXV9o +a29wbHJubXPz7Ofh3drc5O3y9fv6/Xd5/XpweHN1bW5nZmt39+vtfvh+am5paWxtcHB8e/zp +3dnc3N/h6Ovz7fpubHlscXVjYWNra2lfYnJzcnvu4Obq4+Xo7ezzdP309P5waF1t0v5f293t +421h6G5eXF5cW2F5PFm8XFzKyWzJ2ObJeWJsa19bSVBcZUnZzffUxd/eetngT2xQamlCTv1a +WW9pYdzR3t/FzezV4nrOb0/x+FhaY/v+805W2u52W/na52N43NrZV0phUFVT8tvL29nW1dxv +7trV9Vtr7FdTTeJuWudm3Wb8Xmd+Xm9wf2jr/urofOrn2+jb7f185HLb5e110GntY1nu8Vts +6Ofn8HPn7fpY5vdtdGhd5VRNVVpNSVVNb2NR+OHT7tDJzcXTxcnKzczY0tnY9c7kztDv3047 +QEU1LjU4OD1ETtC8ysG0sbq/wsXN80xSVkhGTk36z9LKvrq7v7/Dy91PPzs3MS8uMDM5Pk3j +yby2tLO2uLvI3+VjUkpISEtSWmTl2dnNzM3Jz9XV1tzwXl1SSkRCQD8+PkJLWGHs2dLOzMjI +ys3T3eTucGVfXVpaX2rv39/a08vKz9LP2N3uZF9WU1BMR0VJSk1PWV1e/uTc2tjW2t7i7OPt +cGZjaXzv+Ozg3uDY29fSztPd2t3e62tvXVlTUk5LSkxNT09abXFvfu7o3t7e5ebs//j3dvvy ++evdz83Oz8/NztDT2uX8c2NcWVRQTEpJSUtNTk9QVVts+fbv3Nra19bW193f3drY2dzg5/jv +9/vy8vT+bnF+5OPo8mxjX1xUT09TT1NZX2l779/d2dbV3uTv/Hdxb2ZqbHB6897e3d7m5e3e +3+d2bHNraHBtcf/v9vrr7fL3d2dlYV5aVFZYVFdfZmhsZ3Ry9d7b3d7Z2NfY2N7j4+jm3dzh +7ejq8+jg5f98/fV+bmJeWlFPTUpMUVNUWF1nfPf27N/i3drd3t7d3uDg3t3r++nn5t/d5fTs +3+nu6ejj6Ovrd298bl9XUlBRUlBPVVxcZG57fnzt/n/t5N7h6eLd3N/g4urx5+Lu9Ozp7e/t +3Nna2tnX2drd72paVlNMSklLTExNUVtlcP3/+vPn5fTt4N7d2NXQ0tjc3Nt9TtrC5ljky83R +1dPS3fhmXlRFQURDQkJERUZMWG1sf9bQ2dfKyM7Pzc/W3efr7en3dfjy/efY2NHO1M/HydTW +23tNQkc+MjM6ODQ6TVpT9MvGwby7vLy8xs3L3WBfbVdKTl9cW/DZ1s7EwcPDwcTP315HPj00 +MDY3MzdDS0plysXHvba5vru7wM3d63pVS01OS0tZ8eLZy769wL67xNbbfkk7OTIvMTAuND9D +S+XJyr+3tre2trm+xc7zY1NIRUZGSFN34dTKwb29vLm7ytTaTj09MiwvLysuOz4/XMvEvrWx +s7Kyub2/zO9bTEU/PT1DSU5c6M/GvLa4uLS3xczXUT86Ni4sLy4sMz1BTt3Evrq0sbOztrq/ +zNh6TkZCPj0/Q0tZ9drNwbq4t7a3usLP/Es7NzErKy0rLjg/SGnKvbexrq6vsbW8xtJ5TkE/ +PTc6QURHV9/NyL+4t7m4tbnJ0N9BOTovKSsuKiw4QUvgwLayr6ysr7K0vtZ8WkY7OTo4OD5M +UmHXwby7s66ztbS5w95XPjQvKycnKyssN0hV1LuyrqyrrK2zusDcUEE9My40OTY8WdrLvrOv +r6+tr7m9vtJLRjsqKisnJSkuMjxbyrqyramoq66uu9hsSjcvLy0sMDtFa8u7sa2tq6uvs7a/ +1/ZaQDUwKycpKiUsPz1GwbKyrampq665wdRDNzkuKCw1NDVZv764ramqra6vt8XT3l1APj82 +LSssLCwqMldlarusrK2rq6+8z2NJNiwuLysuP0NJxrOxrqqqrK+5vcHjXm5dTEY/NjEuKSoy +LTFkzMq4rKysrLS8v2Q3NzMsLCwvQlRNzK6sr6uoq7G7wsHQVVBpWEU/ODMwLCkrMjU+8r+1 +rq2srK++2mtDMS4xLSw1QUrkvbavq6utrrK7xM3d+2lbUk8+MS8vKygtNDtN1LuvrKyur7XG ++0o5Mi8tLTNESFrEtrSxr66usbvAv8tuXfN6T0Y7My4sKyotOUVczLavra2us7vKX0A3MS8t +MT5HUte+uLOvr6+vtL3DyulqZ01JRT06My8yNTU7R2TZxL27t7W6wMnoV01EPz9APUBKT1r7 +0cS9u7m4uLq8v8vfa1RMSEhJSUtLTE5RVFFQV1tbXnbu7O/v8HhvZ1xTT1VebfHf1czGwL28 +vsDCxtDkc19RSkpMTlFTVFhXVVNPUFZZWl50/fvp5vH+a1hPVl1cbOvf2M7NysfGx8fIzNHY +6GlkX1hYXl9cXnfv739fXWlcTU1UTUpPUE1OUlRbcern08zOy8nMy8nN2NfT2efp6Ox0XFtZ +WVpicm1ven/9697f5+x6ZF5bVFFPTk5OT05UXm7+5NbS1tTP1dvb1NPY2+Dm+W12+3ht9ubp +4uHd2+D1/PRwZmRmW1lcW1RRUE5SV1937/f76Of08uXl5N/g6O78/Xzw8fjn3t3d19ni393l +f3R+//P29351aF9eWVhYWFZaYV9kfPP2fHV+a1pMT8TAT2HM1dZYT83AXj/1t9A5W7bbQc/J +ZFTb7Uffyz4+vPZA3dZCWthL9XpAeN1MRey16EK7vmxazlRPvlI6y75IYMHgdMX7Tm7PYTpo +z/pITerAUzjA1E1+fE7ny19HWr7vPdnE5lBc4u9j2OBhx8xS38Zi09RUTdPDQEa/6z9/7lBw +WXh9UPHfRG3EXFDS01tO6tPuWuDZfeHib2Ha127l39p4ZH7eb9p1TvXKUUnS21taVfvTWUzu +3U9V2+BV887pUl3b3E920vHVe1nP1l1YzdtN3b9QUsbcT2bcXVZbW2ntYW75XWnSdkXfyGdU +bt3acGza4F9v3t5c+upZX+vk2+5fc8/NWVbb0OxdVHbSWk7c71fx4+7qZnZzdGlu62NYbdrt +UVzS3FZr1u7t2GtY1s1dSfHG505m1t9vX+/cZF7b32do7eFRVs/OV03p0ehcX/je6lxb8m1a +/eNuaPjr4OPlb2fj7Hb3fGp74u9ZX+/f52T54eTi5GtTcN5xZGppbnV1bH7r/v/j3vVy/eXv +YWjn7WlubWv06nD26uzs4u9fZu/2YWn35/pr7O55fXH75+Pj92R4fu3o5uX3fO7e1OtVUllr +Wk5OS0pUa31kcOPYz87Ny8/OztLvde1wduDb6OPQ0NfPzMvJ7TosLDQ8OTM1Ss++u7a0tbi5 +ur7gQjc6RktFRVjcysK7ur/M0MnF1VhKU+3UzM9xOiwrMD09NzdG0Lm0tLO1usDBwt1FNjQ7 +SVVTUWTRvra2ur/HyMTL32dXXO7OzHg8LCcrNTw4NT3vu66srK+3vcDF2Eo0LjE6Q0ZIUt7D +ubGwtr7IzNHca1RUbN/Ny9doPzAqKi84Ozk+Y76wrayusbe+y/9JOjEvMzs/R1Hbvrawr7G3 +wtv6ZlVMR0xu1szJ0fFINCwrMDs9Oj9+vLCtrq+xt8PnTz0yLi41P0hMXsm0rayutL3O62RW +SD49SPDEu73H0144KygqMDg7P1+/r6qpqq22yGJDOTIuLC43SvLNvbOtrK2zv91OQ0A/PTtG +4L60sra9ylAtIyQtODg1Psutp6eprLLHVD83LyklKTVgx724r6qqrbO/bkE8PT08O0Hru7Cu +rrK93j0oHh4lLTM5XLWno6Olq7f3OzEuLCgoMFa9sK2rrK2xus5KNjI3PkBASHfAsq6tr7bG +Zz8rHRofLkdt0LSmoKOor8VDLCgrLi4vPM2uqaiqr75rSElFOTI6Y8vN2Mu/vb26tbjIXk9W +PSQaHTFt9ea7qaeusa+7PiYlNEo+Ol+3ra2urrh0OTY6OzpE88O9v8XN2t3MwL3CycjGze9D +JhgZKF3JzMGvqqqpqLoxICQ6Xk5N07qzrair1S8rOlRKPU7Hu7y5uMxGPne/v9HXzcfAvcZA +HBEZOMPEvK6prKuiqD0cHC7pycS4u8q6qKnzKSMtQ9y+t7/dzLOy4Tg2R9m+t7zkVsyxt20t +GBAbXqypqquwu7Wu2SUbI06wpqayTzlgvck9LC1Avamqw0hG9cG90kk8Tca6y1VM4rqvtvYq +FBAju6moqa/M57i2RCcnNsWpoatPLDFTx7/RRjdesq/NOzQ+4LKswj41PVDbxL29uK2rvjwf +EREkvqegn6jPTdrgOi0xSsCrp7ZHLy8857y84UVI2cTaSDc5yKmqvUUtKTXEq6qtsbnByl42 +HA4TM66dlZizMC4+OjlFQD/EqKi8TTMqMM+tr8dNOjdB+c3FubG2zkUuJy7ZrKOiq9BBP0VI +PiITGkaqm5adTx8jNVXFvlk/zKyqukMpJS/Cp6e+OSouVbisrbvaZEs7Ly9Bwqqipbo9MTxP +0L8xFRY0sp+Yn0siKUPhwc09Nsiop7VJJh4rvqOivS8rPM2uqbNiQU5PQjo2QcCoo6vQMis5 +ya+zMhQTJsafl53oKCo4W8XNP0C6p6m3RSQeK8aln603KDrPtauvYDg+Qz0/S3+8qae0YTMx +ULmxxikVFiq6npifbygmL0vHwOXTsqyuxDciHy3HpJ2m3i8tPOq8udFIP0VMTmrLvLKvvFg7 +Pte0r7wyFxIeXKaZmq45KSs46MLP176ztcFHKSEq9qecn8kpJC5Rtqq1Uj1FTVvp3urHsq63 +2lBOXWo6HhggP6+bmKdDJyUu7rG2ztrQz8bRPCkqQrein64+JSMwzquotNk/OD1Mcc+8srG6 +ytpVPTssHBwuzamdnbE6KiowWbu5ycvDzOJgPS8zUsKwrLhIMTVD17Sttc5NOTVC3ryvrbTC +1GJENiIXHDW+opmdwi4pKjLivczavLa9xGgyKjFawbSwvV5MV2TgxsDFwsb8QTxJ27WopbBR +LB4UFSbXqJuYoeEuJSMt+7W1urrAxsHWOigmNNCspKrKPjY9YsC2usbMzedWTFTUt6yw1ywY +ERYlyZ2WmaXLNCYmMEvaxr29ws3+TURMbM+/u7zNXkZCUc+5sbTFX0A7RGbY13BSWP1YQ0U7 +Li46WtDAu7/L0sq/v81TPTc4RG7b2Me4r6ystO02LC06/by1usbW3OZfTD01N0brx7/C0l8/ +OjtARkZJVnzYxr/E03ZZWObKwcTVaFl91MS9xHxIQUJO7srAwcjX/FtIQEJIW9PEyf9KQURW +eG5VSkVP2L67wdNWRElrz8nO51hLT2bez8vM219KQkRfzL24u8hiRUBBSFb62dHNzuJaSUVI +T3TSzMzQ2OtpU0xRcdPFxNJZQD1EWtPCw8/3VkhHUu3Nx8XL22dSTU1SW3zdz8vM4VJCP0dm +y76+xttdS0hNV3rUysjM3lpIREps08jI1mRLSE1WX/vwcG/+49/h3/5kbe7l4fdcUlBb/tLG +xMfS+1VOUVv40MXFzvhRR0VLXvXf4O9oYmpxdm1jVVJc/d/V0tzweHJsb377f3T35d7e4ndh +ZXvh29rb6O7s+mpbV1dZc97X2N97Xltia25rXFxp59HLy9DvW09NUFVfb/fi1tbhdlxRTlJd +ft7QzM7R2/hpXmBkcuff3tvX3O1+aldOTU9WZenW0tXd5XxiXFpZYnzu5N3b4O1vXFlgbnvx +5+nn5OTqeGZdXmJu9ejs7+Xh4+twWVBRWnrd09DY5fT89O71/Xdubvfs6fxpYmBiZnvr5ejv +831teO3ya11bWl925dvd5/J3bWxqaGRk+9/c3u5oTFHPzez219ni6vHtbVhYafv6e+7i7O/3 ++m9eXGJnbH30+fns7OzzbGJo+u37fnJjde3l6+7ufXJ06efz/v15bW7x625ne+Te+GtrZ2pv +7Ofve/vxcW726v52dXXx7u//bGRqdH3v9fXt6Ofr93Zxamhqamdo/fbr6Ojj7vH5cG1sYGpw +ev3x8nx6bnzu6/Tj5nJ05d/v+mZfXmd+b3Pw6uDl/vd0XmJr/Xvu7ejv7+Tq/W53anhnX3js +8vjz7/Vwc2Zod2ZaZuzv49vj/Gttc378/enf3t/k5ufpfGtqcunrfG1ycW5walpbX2l5dHN6 ++Ojj6v1oanR4bHXo6PHu6PNxaWZwbWv8+Xzz9nl2aGZ27ODc2tnY19XT29/d3dbR1uDf1s/Y +Z0MyLS0yODo8RWDOvbOur7a8wcjjTz86Oz1HZNfPzcS6tba7w83Z+WpiW1dbaVxDMisqLjU3 +OkNjzbquqquvub2+yl0+NC4uNUVddOjLurCvsLW9zNzqdFlLR1Hgys5iPSwmKC86NzM85bas +qKeqsbq7vNg6KyksMTc/TVzcuKqnrLa+xM3jXUg9PUvbxcbW+1Y9LigpLS8wO+27sKyopqqy +vMLvOSsoKy0uNVHNvbKqpqmvt7/cS0BCQT9FXNvKv7u/7zkqJCYrMDQ5Ub2rpqWnrLW/00sw +JiQpLzhAbL2uqKWmq7bF3FQ9NTc8QU3kwLi1tr3iPiwjHyQrLjZftKekpKWpsMRfOSkkJiwz +OkjNsKilqK21v9dNOTM3PEVc2si+t7G0vdZMMSUeHykyN0y6pqGjpam13UEzKSIkLDlH1bOs +qqipsL7PdT4wMj5JSl/IvLu3sbTA7lhDLSAdIS89Pm+voqCorbTGTzUrJygvRmTXuaqnrru6 +wGM7OT4/Qlbt4sy8uL7Gv7zG6FVNPi8nIig8RzlMsaOpurmxvU00LzA1RFRN5LSttb69xv1f +Sjs+WfBWWMe91e3BtbvTzr3FbkY9PC4gIDlYLzC4oazJtaeyTzs9OTM0OT5quLG8va+txD06 +T1A6N1LKyc7Fura7wcPJ2PZlT0hNRDMnJDNBLChirK6+rqGnveRrSzYtKy9FzsvBrqitwtfP +SjAxOj9Jbcy9t7a9xL3DaUxs3FVN2t8+JyE8TSAixqu91aidq83N5Ew3KCYyWX1MwqaosrW4 +yFg6NzxFU0tXzsHE08zAx+Z218nTfGZHOC4lKDQwLU+1r7Sto6a3zfZLOCsoLz9TXs6vqrK7 +trruPTxCOzU7U9PN2MSzsLm/wcPLYkVMRTQtJSc/Oic6srHAs6Wks8rO7Uw0KC5CPTVOt665 +t6+0vNxITlA7N0BTWVzXv7y6vMK+vdxc41YzLy4mKzguM8y0vLSopq26wMlpOi0sMTMuN+vJ +wre1s6uuysq93kA7PT47OkzYxb+7s7C5x9RwOyklLTAkJkfT9cazqqartrGvxEs+QDswLC46 +VFZNy7CyurWyt8BnS15NPEVYWmP97dTL5fHQ3FlNS09IOz1TU0dU6N7X1djQzN1mb+Z4XWT+ +2snGyMjIy9XyZ25dTU5SUVBUXm997tzc39LLzc/P2+L2U0lMTUpHSVZoa2xo9+B9XF9tbGVf +bOPT0tDLzM7S39zZ83vs6OxwZWxqZWdpbfTw69TS3ebd4mNQT1BKR0tRW2ZgWmn6eXb+6dzd +7t7Nztve297d4Whx80tR2O/axM3Xz/d54VpTXGb/1+LkzdfubEc8Qz8xM0FGSGXcwbK1vbWu +ucnM3mRHNzU5NDQ6Q+TGybuusLe4vMXbTENLQztI+X/zzsnU+j85XDkmMU0+PebEsK24s6mv +3Hv4TTswLz1JNznJuM/CsK+3x9TBzj08Z1M+RWDKw9zPub9TPjU1NicmO046Wbatq6ytqKrL +TFNALCotNDxDWsewr7mxrLvg8V1IOzRCc01Pxru7vcW+yE4/MioyLiU22Vpvs62urba5s9o5 +PkQvLTpFVubMvLOzvL++zFxLSkc/QE545s6+vb+8vtbsbks8MywyOisx0c1bva6ytrzCvNc7 +P084MURcW+LMwLm7xb++1nB4XUtLT1zs6tvFw8zHw913/ko9OCwvRS4q2MFI0q2yvrq7vMdL +Rm1DLz5zTEnWv8nHu7/Dw83W21ZOZFFLbOft1cvMztPT4lZOQzEsQDknQ75IQbSuxr2wusrl +XGRONzpuWj7yvt3Zt7zSxr/V/3pTTk1JWH7858vJ2MvI3d/qUTsxPUQpLsxZM9KtxeKvr9To +yOJJQkFHTUZPzc5sv7fVz7nHZdbZS0ZYWk5a4tXW08rH1uvpaUk6OUQ5LUPeQ0G/t+vPsLtl +2b9qQlpkSUlUXfPx9snD0MnAydjc23teYl5WXXRvdu3o39ro8+n5Sz5MRTQ8Z1E9Zr/S7r+7 +z9zJzW9YXWVdU17l6X3fzsvR1cjM7v7uXk5SWFhWXGdket7e4NLN3uvX9kxGTUo/P1BcT13b +ztLQzM3X8f51X1hbW2Tx4dzTzszP2tzf/mtqY11cXGV7/+jZ1NfX2ODob1xgZFZMTk9KRklQ +WFz539zZ29zc2t3m7u7ud/Pk9/ze3Oz27fpmX3rq8n7t5ff02tnd39vhfW9ua2BpfnFnZWNa +UU5QUVBZZXH26Nzc3d/c3+fp8Ht38nZnbHt+a3Xe3erp3Nnd2tzl7+vm6vb+fnbu5Oz7dnN3 +92pVUVFNSkxMTldlfebc2NPQ0tbX3Ox5dWxlbHR+8+re3d/d29/t/nhxbWRqa3Hw5NrY3t7e +3+n0blNKSElFRk5WX/fd3dfS1dPX3e1uY1xZWlphffno19Ta2tTT3Ox+/Wtcd3j95tna2NPX +09ft92lQSkI+PkBETF963MzN0NHY2t/tZFxUUWJbXVriz+bN283P1tvh2uX57WxcY/nr39Dc +2dzf5u9zXFJMQDs8QkVM+9bOycnO0tXf4+xlU1BUU1t+38/Nz9Ha5v1xc3p48uzve2x59ejc +2NPW2tzf6u3m3dztXUM4Nzg8R2fWy8XGzNTd4ubybFRNTVFb8s/KyMzS3/VnWWd6/e7o6evn +5d/b1Nfb2Nzk5ePg5vRrUT01NTk8SubKwr/Dzdrp7vxtWk5LSlNv1cfBxczgbFtVV11u8e7q +5enq4tzb2tXZ3NjZ1tHR1/FcTTwxMDU7St3CvL3BzOJjV1dcW1NNS1J7z8O9vsjfYFJQWWzq +3+5/++zg2tTY3Nvm8Ofb2tzZ1NbrXU89MC8xOETswr28wczdc2ZiY19ZUVBj3cq+vcPP81dM +Tltodu7r7vLt39jc3dvb3d3Z2dze3NbU3HhUPCsqLjtpwre5wN1nXGzi3HFQRkZS2cK9vMLZ +a11VTlNg8N3Uz9R6UlJe8M/JzNbg7+Xc2M3DxM7pTDcnJSw627avt8ddSFBaYnBaTVBr2ca+ +wcTI0t73VERATdu/u8LZWUdIUW7f2dPOzs/V6mdk38i+v+A9KB4lOdSuqrLLbEhMaVNMTk5f +1s7e4trSv7vE70c7PVjUwLzG2uh4UkhHT+DAubzKZ0hHZsm6ucNbOi0gIzVZva2uvtVPPUVP +T/za5N/Y8/XMxb+8ymNKRUNNbNS/u77K8EI4O0nZvLnA2FxOTWDWxLu5wls8Lh4fOtq0qa7N ++E87SE9AVNDOzcjlXM7CwL7STUdLSFT+2sS8vctkPTQ7X8O4ucHbbVRNVm7LubS9XTYpHSBD +zrasscvVYTo9QDxywcXNz+b3w77FzO9PU2hNR1rewLi91Fc8OER2ybu5wMvsTEdNccW5u9NI +NCIdMWfRsay7xMdCOEA6Q8vJ2s3O38q/093fYGrfXUBO4s/BwNHkX0NDU3XHurq/yOVVT2HV +xMPNUzwqHSpcXcivuMG35jQ6PTvsw/NvxsPHu8ld8Nxz5ulBRdjXz8HH2ulaP0Nsz8G6vsrN +3FBg0trkbkI2LSAt1+bctLK9t8w2M0RBS9rmWse2wMfG7mDja0pQeuTe4eXOxs5rTUdJaM7I +ycPAw85z7NTa60s6NiYfRcdM16yvt6/TMTlJNTZu4nG5sMjHudJLUEU7bcZ3Xs/HyMrfT1RZ +RkrszcW9vcjOzcjNYEY9PTklJFLKTtyvsLW00js/TzYwSvF7wLbBvrHBSERMP0JXTV3HvsPF +wNVXUk1Ld87Mx76/yMPD5EE/TTciHjbfPkixqK2yvu52XDEpNVtNUcW5tq6xzGniUzk8VFZq +y83Mu79pZ99RSvDd+c7CzMG//mDWXjEnKTg3Kzq2rbu5r6+78zs0PDkuON3Ex7uvr7vN7VJO +TkRGbeNh48HAys/W2M/YWmTO10w7Q8p6MDjP1zAu6MJPTMS6wdDp3cloOUvJWzz1wdDf187C +x2FXzs5dV3n5bV9fbN3S2tzU1NnXc0pOb1ZJV3ri2Oluee9uTUtPSkJJXk9K6dpe7srO0sjO +18vRbGns+fvr3NbQ0t9x/N7mcH7b0tHdevl3UkpNTlJdbmlu6W5h4+Zfc3JOTFtSR01eXmL/ +/eXV1eXr2NDb4t3X1M/Kyc/X3P1iXlZafube3eL6ZWthUlFbWlxtYVVt5e3o3dvqa1tNSlBa +V1Rn3dfd3drY4PZ293pcX/Lk69rS09jub2hgX3bb1N7k3OZ5X1xsbVtXWmZrZ2/23d7n5vpq +ZFpVXGVkZ27v3N3r8/Rya21kXGF67O3u3dvb33ptef/9++fd2t3y+PH1c2xzdmpfbH5zY2jn +2+xz//9oWlpgX1xj7+j5/+7h7W5183FjaHJ18+br7+nl83N6/vDf2d3f5312bGz49fbo5Op8 +am1waHDy9nlwbWZoYVtaX2VfZHF69e7q3+x7e/ru9/Ti3ebs5uPu8fL77ur/bmdjaXz+ePDp +7O7u/HVvaWhnaWx2+H53+n5zdm5oWllfZvrf2t7d4O/1/vbo8Xfy6fJufOryaW3z+29qampq +cu7m7Ofj8np1cmtv9+n3+ezp/2tqb2dRX+hpV/zX3+vj5Ol8ZWNydmBe+u1t9Nzc6ebg5ej2 +9+vza19neV5j6u9jaPTu8/R55t1wauftZV5obGhy7+719/Tu5v5s6u1oZ/RsZG//eXp+c3bv +/nT/7PF++u3o/vfub/fw/n92b3rz/f3t9fTv83NxdHz6bPrtdnB0dW1manD5bmh7d2717ezo +7fz8+XVkb/5udvR/+uzr8vj16u77+/78bXz6enNu/3t3ePn8+v1x+u99cm5xaG72+fN+6+ns +6ujqdXn+aGlrdXFpZ15s/vr46e5wa21zc3jz7fbv6OXl6ufi5u35cWprfnp883p8+WxnaWpv +cXdtbv35+ff993N29fv//f/19vT07ejw+Hzv7fL5+fD+dnFpaW54/Hh08vnxfPv/bXJ4bWZu +eXJ2+O7q4OLq6Ozvd3R0aXD7+H7q+er49f/wdHn7c3t76/N7bm9oZW9sc3FnanD/9O/u9Pv4 +7PPz7+rt8e/p5fh8dGxkbX52anL56unvbmVrfn11+v9+fe7+d+/u7uzu/nBvb21iaXzu+/jv +8nh29nR9/353bG1rdXr77uft9/n59fHt7vP9/Pv9cm1tcHJve/X8evPwc3j0fH54bW75fXF/ +9Pb67O//7ujm5+jq6+z1eXD1emtnXlhZXFVRV1lWWmnx5uDh3NTQz9LS2N3e3eh9fXN6+ejb +3Nzf393f7G5lTEA8Ojs7Oz5NfdLEvry4t7vBytlnT0Y/QURFSlrt2M3IxsXGydLuZltVU1Na +aP7f1M3Lzc3P1uw8MT88LjI+QVzFx7+urbi6u85tWz0zOjw5PlJ3z7u6vbi4ws7ZXU9RRkNV +bGjdysm+vPBBQEI3Ly81QW7dzbqvr7O4w8/zRTc0Njc6P0rgwLu4tbW4vcn5VEs/Ozw+Rl/j +1sa/wcPEzdzc4l5SWVlDMzU/OjtIS3q/vsW5tb7Dxu1UV0k9QEhJZd3b0cXHzs3W3972Wldc +WWL879PEwMjKyMvRTzYzNzUvLzpP1sfAtq6ut7/L3W1BMzI5P0FIYMy5tri6ur7MbklCQz46 +PU1t4dvWyL/F13r78V9VVWHfz9vfzsvK1U46QUY2NT1AVtPWzrm1v8PG1Nj7Rj5HSUxbZePF +wsvJytXV7lZcbVpZfOjVy87Py83bYkM2NDYzNDtN4cW9ubOxt7/VZk5AOjg8Qk750MG6t7e7 +wtB5Sjw6Oz0+SF3cxsDAwsfTbk9LSUlMT13ezs3Iw8bIz9x5Vk9SUE1NUlBFRFBOS1/u2sbA +xcLBzNnoXVNTTkpPVlr26f/Zy9DRzdvc1vFu9HVp7fZy5NHOz/JNPzk3NTQ5S+vLvbezsra+ +zfJNPjs4OkFNZ9TDvby+xMrWck1DQUBDR01q28/KxMXK0PhjZlNOVV1x287NzMzW4mtPS0pE +RExTV2f13M/Lzc7N0N5uU0VDRkhLU2zWyMS/vsDGzN1qVktISEtPWWdw3M3T393d63VhWmV4 +aWju2M7NysTAympHOTY5NDE6TffJu7eyr7bAzX1NPjY0OkFLfMzBure8wcjXa05EQkZMTVre +0s3Gytnc81FKSURIVFdj3dPV0M3P0uJsbP5+fX1ubfP6XUdFVEtFTVt3zsjLv73Dyszee1NA +SE5FTm9ieM/OzcXT8uRvXGVZUWnvbd/Nz8rHzs/UeV5KNjQ4MzdASG/HycW5vcK8wc7P8lBR +TENNXFh73N/Rxc3RztjzcVVIS0xPae/o1M7RztHi4N55XVtUWGNZVWJXTFNZT1FeW2j6cnbq +8ubZ2c/M09nZ6XJ79+zj6erZz9PY293kfWhpfH1oXl1lcnR0aWReVE5QV11hZn3r/Hl9ZGr9 +WlJaXGh3a/3U0trT1tfP0+fe1NXa3unk6W9pYW18Z2Fmauv+WWDuenB8bW5qXmRxZl1wa2pr +cOzt3+l+bFlYXVZWX+7j3c/Qzc/a3ed4bX1nXGz1fe7u8OL17unrfnJ1aV57+vTzZ1xo4XZ4 +6eju7X1ra11jY2pna/Bvfnf8emFtfWtu5uZxYXd3f3Vd6+Pl4NPR19vk1eF7buV5Y/Tzfn32 +XGFhYFJVWVr9X2bu4njy4f77d2j+4nX86uHf6/Hp2u/k4+vs/3lbal1hYltcZnVu8n3m4ORq +df5k9HDzfuzh3eXy4OPt6OZw7+3za2ltbW5g/GZe/vr0+P5tf3ZmY3NwafJ5eHL1eXlw8+/x +4+p06vP73+jl6fd7/Gvo5/T953xpbGJhZnhbZvp1enFubXRhdef1/vH06tzr7en89Glpaex4 +f3j05H7+aXlh/WRz+vvv7N5zcm/9aO57Z/nj6ure23106/llaWlmWWd8++r4bv5nfm5tb/ns +6nT6fnP4+Ont6t7i6e5+d218/mFjY/JrYXfg7Pf59W1sfmd39P1r8uX4+uHneu51+Ozv6+13 +9nhjXmV2dfjq8e7z9/1ia+/6dH7/a2j5fOtzdGzydnJ09uLv8ejofPl0am1+d2ny5e37ffRx +cnvp7vzp3uz79nf+/nReaHxubW/wdW9i9Pd8bvXg53Vz6nnscPBubWlndV597/N+3vj8a/zp +/e7l3PHu4OPv72j8+25pdmZi9P5ma3FyaV97/f3w6en4d+rufvX0cHfxbXjx8XF1d+9obXfs +a/fa6u94cG/rb3Xs7PPr221tavR1e2NneGf4efD55vvy+2dqX/Z19vf7dOTqd+p633n89On0 +avHu72R0Zntvb175e27hZu39d2bo6Hv7aet9d2vo9vvt9ebx/mjq8uZz9HJ7al/ucXRo3+jq +/fbxc+pkdnP9X/n4c/J15XLqXXn39Phk9Wz0VOrs5/v93WvoYNpv7fRt32/uWN7q32np5XX5 +WfBY+F9o6fhkbdJ0+Xx7bO5+XuN2b3vrauXraOze+2rfc2/9X/fvbVn092t+em7h53Tt3nde +2f5q7uF5cvNZ4Gxtcn1oYuBddnV5X3X/Zd/99HzaeeHf9/HjflvYbGXs/mle6mvxbWtv8Wxo +4mh98Oh77vB05t91aOf3aGrqZGRravXpb1r5415t3+tu4+N98uBxctz9aN18YuDsYP3pYGl6 +dnDra13d+1z37l9cdmjwdGB62e9e4td+897z9Ox1edp+aNneZfn4aWrxVurdUVzoZ1Pa/ljc +6mrn4WXu11d712Fb33Rk1Ota4dhg5tlX/9xkX2ZtW+t9YNftZ/7nf3zv9/vg5vfl/vbr4PV0 +dGj/d1xo8l9c9HFva3R3buhuduvu7np87fXu7/b4/e3799bi79/2am/eY2Tjdv7u92fh/WTd +dWTs6md95WZ1bldWV1RXV09ZbVpd5uLm1NLUzs3RyMrRz8/h7+Z4bHzw7efrdnxiU0VERDg4 +PT49RVhr28vDu7q9vb3BzdDdXlBPSkJFS1Zv+9nMysvMyM3a2NjpYGHo6F1t4GlDQk88Mjk/ +Pj5OdtTMyry0u8C7vtZndllEPUFOR0Zoz9XUvbrCx8HF1nVk+WdOWvN9WnPPaDs/WTktO1A+ +O2HKx8jAt7O+zsHAXz9OVD03RWlYTNy8vce+tLnOz8TTUE5oa09Q79HgYd/MTjM9XzMoOl06 +Nue9xsi8tLK/3Mu+bTpEZ0M3R9vkX9W7usbFu7zOZXPcYkRN4/JX+s3U8djfTT0/RzYvOkxD +P/zBwcO+ube90eLWbUI+S00/RF/u7dXHyMbEyszM1On+e1xYb2th9eD47tbT3OV6Y15PREBA +Pz9ETE5T9dbY2c/LztTX2+Lo4/lqaX71//fk1MvQ18/O1+Xt/3FxbW109+3q5PF5a19PS0pE +Pz5ESUtTaPnp1szMycfJ0NnqaW1uY19o++7k3tnW1NfZ3ens9u/6dXNucXF7/ejh5OHr/l5P +UFBJQkRISk5Zb/zn2tfU1NTV1N/v9398fe7r5dve4d/e3trX3uPe4vl8+3F0//Dt5u726+1r +UE5OSUI/RklITV5octfJy87Mzc/O1Of3eGdiZWVp6N/n4NfY3mxe0M152MLOedrNzs9uTnbo +RDU0OT88Nz5z19nKwb24u87dzdtPR0VFS05JU9rP1cjAx8TAze/t719fbv/j1MzHwsDIaU5q +SSojMUYtK224vr60sq+xz0tdazsvND9U8d3aw7W3x8m9xvZbT09cXVJsx77LzL+/xsh6PkBG +LiQoNT05Rca1s7S3urnEWEBAQz89RFrRwsHFwL7K6PV0W2JxX2nk39/WysTFx8fKxtNIRls7 +KyksMjs+TM23s7e6u7zLXUQ/QUNITmbOv77EyM/a7Vlc+OXc0tni3NrYzsvS29fNyd9MRko2 +JyUvPD9Oz7qwrrS/ydJsSD89Pkpt8tjEvr3F21lOUFh0487EwcfP2uXaz9Pi7N3Nx8zqTUIu +HyIzNTX8ubWuqrDAy+1EPD46N0jdyb+5usjY3mlJSmzozb6/x8nN3tzcemre0NPR1N1iRjYi +HCg2Ol+5tLCpqbnN/kI6Qkg8P2LTxb22vt1zT0BFXGvcvri8xNJmZtjX9PLe18bBzeRbQS4e +HiszTrmvs62pr77PRDEzOzxFc+jQwbi0wOxLQz9CYeXSvLa6vsz57dztcO3WzcnFz2RIOSUd +Iyo1za+urqyvu77YPjQxMDdYzMK9uri8xe9IPj1O7s29urq9yN7q1tj9Y19ked3PbUU5KR8j +KzPhsKurq667w9FIOjQuLzxixrays7vI7U9MS01j/NPBvbq6v8/e4Hxr+V1MXe5cTD8tISQn +LF+1q6iorbnG40pFPTQyMjpev7GsrrzlT0NGYN3W0NDPwrq4u8ThW1RccmdWSj0zLScmKzBF +xrKrqq2zvdVbRz04ODw/T93CtrS3vdRhT09cfN/Z19DIvr2+xNhvX1xdXEo9Mi0qJy04Scq1 +raussr3SWUI+PT1ARU/vzMa/vMPM1XxiX2X+5+fr1sW+vLzG1vZaV1dSSUM3KiQlKTXWr6mm +qbLC5lBKSUI7PD0/Vs+6sbG4zlA/Pkhf4MzLz9LPx7+8vsjfXE1PYmtaSTYoISInNs6tpaSq +ts1jTU9PQzs5OkbevLCttMxXPjtHdM/Kzd1w/t3KvLu+xdXvbm/x8Uw5LCAeJCxMtKekp66+ +3F9HPz86Nz5S3Luwsb3sRTxEa8/DxdlyZm3Tv76+wcrPzsvZZFc+LykiICczarSopqqwxGpS +RDw8PT1Ozry2uMdSOjhBbr+1tbzPWk5TZ+DOx8K8u7y/z1tDNi0oIiEnNNqtpaSrvGdAPz4/ +Q0peyrextcFNLCozRrysrK+75ElERENwxry0sbjD12JJPzQsJx8eLFO4pqKpt9JHNz09Ok/O +vLKuuGQ9NDA4RmXIta6us8pFNzhE2ru1tri8wcvrWjwtKiUgIi9Vuaejq7n3OjA3QVfEtbS1 +u9tDOjc2PWnDvLe3v8jcWklESmHGuLa4v8jZ9+9TNysoJSAqW7urpqq+Yj0wNlLewrW0v9Fv +Pzg9R05fzb66u8HSZlRMS1ravbS0vd1kYejLwM07KikmIidCxLGprL3yTkFE6NXdyMTT3dpj +SVdYPUjPzL++1dPVa0xT3su5tL/fV1D2vra5xUwsIx8fJEHIuq+tsLrFVTtAT2jaycvPxstb +REdYX1p+zs7NxNRs18bHxMpnUHd0fsa6trW8UiwnJR4gLUjGraaprLTrOjU2OEvMvrm3wP5L +R0Q+QW3Gx8zCxMrEx9be709Q7uLYv7e4urvWNignHhkfPcuuoJ+nrL81Ki8wONW2trCxzkZG +Qy4z8N3Ovbi1ub/+XW1OSlzLwsXAvri5vdg3KCMgHRw0v66ppKavu0UrLz1JVsS6vbi+aU1Y +OyxUx13Kr7HCvM5K4t1KXr7Cfs2/xby63jIpKCIgHinJsq+so6ey1jQwP0c+RtDAvLzMzs/f +SzhAWe3r18O8tb3Nzs/VVk9m58S+v8PPUzAnIyQhIT6/tauioqy15Dc0Ni0sP+7TubO4tK/C +Pz5BOjxHfb+trri1s8RNPkNMcNttTHvXOikqKCUtS13Fp6CorK/ITUQ0Ki49Pj/ZubOtrbnK +0FM2NT1DaL2ztLCvucnX/D8vMjYyMDg8Mi89SlHeuq+tq7G+x9BNODg5PVBsds64try+ws7e +a0hBVunay766ur3YSz01MTQ1MzU8P0VKTlnfxr63srG1usXvUEQ+QEVPbdPHycfDwMDI1nVZ +T0pKVPXazs3Y4PRYRDw5ODo8Pk5l/vPf3O/q0sTAvry/xdJpUk5PVW3m5d7Wzs7U1tvscmBU +U2Hw5t/e0s7eWkhDPjs6Oz9Lfs7R6t3X7mNp583Ly8fFytj09+ns8OLb2tnb4PHf2/xXVFhZ +V1RWbeLn3+NiSURMTklLUVxjd+/3ZmFfYG3v1c3Mx8DAxc7X29zp+PLr3tzh6u95aFlPT1BQ +UVt8497k7H5tXlBMS01OU1ZcZ2tqXFpjdfbj1M3HxMXH0tzh8mdmdXH139XOzNPb43lWTUlN +U2P3/+fb2epiV1NPSklPVm3m5uHs/W9paF1m+ezk29TZ5+ftal9se+/a0srHyc/Z4H9pX1xZ +XnDs4+7o6nNfUkxLSk5VWGbu4/f3+Wxpa2pse+7k3N3p9XFtbW3w5N/b1NLY2t/ycPvxeHH6 +5tzd5ud1XFZQUFVXVF1x7env6/Xt6O98a2hqevjs929xbnJrY3ru9O/r8Pr1eGprcGl+39rW +09TZ3eL4Z11fZ253++7yeG5sZF9oamZrcvj07/T7cmpdXmZt+/33/Pfzfm5maWdqePzk2tXR +19vc4/Z7cWRlcHzu4+Hm5/p0cGdfYWtqa217cWZoZGRjb3Rsa25uc/978O15evxx+eTi5OLh +4d7f8nBvdnP57Xn33+Xn39ze3+Hu9XZ4bGdgXV5aWlpWVVRUWFpcX2h+5uLj6O7o5enl4t3U +09vZ2Nvm5d3v7Ojg3dvd6eHue3txYVhPTE1JR0pKTVBWXWZ5+OLb2tjRz9zY0+Xv6evg19vf +0tLc6ePtZW357tzc49jQ2vT4W0hDPjo4Ojs9RlBf3MbCv7y8vr/Dz+H3W0lGRUVJTl7qzsfD +vbu9wMTKztTm29heTEs6MDEuKisvMT1s2r6uq6upqa60wXJPPS4sLi4uNkV4xbqxq6irrbC5 +xN9LRENBPjc2OjIsLC8zNzxJzrm1sKuprLG7x9hFMjEvLDA5P2fDvLOsrK6vtsHNbU1JSElU +ZtzSVU9JMissKikyN0HHtrWrpqqsscrvTTEtLyssOEFTv7SvqaqtrbLA015EQD4+S2XnysHS +blc4LCsqKS0xPda9u6+pqq20xNNaNS4xLi83RO7AuLGrrK+xucPUWURCPz9KWurJxcXN31Y6 +Mi8sLC4yQe7TwbKusbW8ws5POzw5NDc9WdLDurGurrK4vsjfWUxISEVJW+rWzs7a9kw9OTUx +LzI3P01qzby5uLi7vcXdYlVGPz9DV/TdzL66ubu9v8XXeGVfX1FPW21rcfpy7v5LRElDOzk6 +P0ZFSWLq2s7Jwby9xMbK1edzaHFqc3Vw9Ot+d97b49/b1tTQ0tXR0dTV2+TzaVBJQz08Ojo9 +Pj5CTFho797QycrLyczNzM3Rz9DX297e3NbU0M7OzM7Q09TX19fd9l1TRz07ODU0Njk8QEhW +dejVzMjBwMTExMnO0Nbd7Xx+e/Pk393X0c/Pz87Pz9TV0c/S4mZTTEI6NTQ2ODo8P0hUbPPb +y8bExMbGxszW3t7d4u7w4d/e2trTzc3O0NfWz9bc2t/s7X1eT0dAPTo6PD09P0RNWWPw2tHN +ysrLzM/U1drb1tPb393c3+Hd2tfW0s7Nzs/V3Nzb4vJsV09LQ0A+Ozw9PT5CSExWWmXe08/K +ycnHyc3Nzs7N1NrY2Nzc3+DZ2Nza1NbZ3OTm92NsdmVXVFFLR0RBQD88PUFDSVNce9TPzcjH +xsTFyMnMz9fk6+76fn548+Hj3dPOz8/V4t7f7Ptwa19gXE5MR0NCPzw9Q0RETVVn3tLNycnG +xMnQ09PZ5X3w59/g7OnYzc7NysvQ19zr/ftxXlpaWVlUUE9NSUI/Q0I9RE1MUW3u1cfHyMLC +ycvO1Nzk4uvv6+nx7d/c29rZ2dne8f9wamhiWldYVVlcXmZwaFhTV1RKRkpQV1te9N/S1N3Z +09Xb3+vo3uH889rO1NjRy8rP1NbY3XtlX11cV1RUWFZTV11fWVVbXVtYWF5qaGNfYW50duze +3d/k4dzY3uvl2NLY3tzX2d3f6Oftb23973xjZ3VrZ2djaGxjXVxeW1tfYFxdaGl18frw3t3k +7Onl8fj3+PF7am389/599ufo7erp5OHn5+zxenZyanBoY2tramJoef119enj3OPx6ud7c3Rt +bGxoZmRgam1qam59ff30/X/29+rr9e/xfH70+Hj/e3v3e2188u/q4OHg3t7f6e95d3BvbGpp +X2FlX19obnL/e252dm9ubnb36+r0cP33f/t1aGn4+frr4eHj4ePs8+vv9fV++fr8dmZlam1t +cHl3eHZtbGNkb2psd3d9+Ofj6Ont7fz+/nZ3eHZ69Pd09Ovu+e7t9/Dx+H7+dnBqZ2thZGtx +eHN0eHRx+/L//O/z+ebf7vXp5efs7+/r7vB8dm9wbmpqY2Vobvl3bXd/dnj+dn/5/Pr78vd0 +bnhxeOro7+/m5ejt7e7x/v97dHd3c3Fwb3z5/Xh1bm5raXf9/fPx/XJ2dHNvb/9vbPV4dnl3 +8vHy8e7u6+fi4+Xm8377+XR8/nR5eGdsfHhrb3VpZWxwbmxobfj4d2188Xh29e9+bnN+9PHt +5uHo8+/0/W567O99ff7v7/nv7unu9vl3Z2RvanV4bnv9b2779e93bnluam1lX2poc+3y+fTq +6vPx5+bo4OX1/HV66O927fF77n557Pd4bmtvcmZscXNua//w+m35+GhxePr7d27s5u7x9/r+ +eWlz731z8u377/B9+e/6dvLubHj9bXr07vz68H92dG926vF0cWlrcmtv6up8avrteHP35vNz +d+jj72xu93pzbv94fvh4Z3LtbWBn/Pzq7/Pe5+zt7+lvZWpoYl5m6Oz96+fs7Ov9/vl2dXJv ++vtsbP/v8/Pq6v5nYG56ZF967u/8efv77vj89PX6++1zcfr3/O3sdXny/2Jx8Xp3e3T89W96 +83598Wtsb2zu73Rq9ur16O1u7+xp8OZ4cv3zb2Bke/92av7a6GJ34O1yY2jueGZz5N/7+97b +4fx15+diWW7tb2hpbvl+aGv6al1u6/pu+uri9Xb65OtrbOrj8F5j4ehna+vm9Hl08/lveePk +9/vvdGp7b3fj8mp9bWBpfvby/v1waPr6bmvr7HJu/vp56+7+3+D77/xr+PFpZHRn9+9pdnr1 +bm5kdfN28ur4aP7o8Oh3bOjtYG/l7W5k/+3ydefc8WVn5npkZ3n0Y2F64vxp4+T3cX/z9Gxq +8O37aWpvaF1fe/R6+e3u8Wd253ttfvf4a3Tf6Obwbt3ea3rodmttbvDsb/rb5nr+/H5hWWVo +XmhbXfZred/t+Nvof/ttffN+7+jl3+Dk8uzzZXdwYmJfZG9xYW37b296b/Dxam9xbm7t5urr +59Pfduvp8/VxYfr6YOznaWz2/O/lfHztf3N1XmzvYmn4XmL+bW3x6uvxd/j6bv5/9ebq9Xzz +395vb+z3a11i/nxcX/nf7/588Odkafbu9ffx4eR8833+5Ov1+W9v/X9taGxu+nxtfvhseW9g +a2NX7u5i+ePd1+5v3dRtb+l6/ft4en59Z3F5XmHr7mV06u/s63z/4uv8+Xj23nxh6eVhY292 +/XJvfHZiaHf5dfnvZ3rg8XnmfHrobe/sa2/06e/r++vp/GVh7e59cm187F5c6udwbOzt9Wx2 +73pgd97eaXXq9nhlbPPvaGb893d7d+jhc+3pcXJ4a31tZunve97b4/Ry6eVlYGdne2li8+5o +Yfrv935pc/ppaP3v5vD169/t/O7l3u/57utmYWtrXHf3afN5cerqXWF6cWdibvXvfu3c3uDa +6Wv/6Wtt7+3m5/zs5W1heWVeZFpfX1/y9XD19Pfu/vDn6uvtbPvi73ns6ev5aW73eHj4+mj+ +fmphX3H8/P708fXo8H72+u3u8Hb76PtsdX56aGV4cnjwZm/9bmJuc//sfO7id33j7/3i5Xnv ++Wp982tx/X58am5ub/1vb+zraHPr/vb2+evu9fPqfPn3fHlkZX59dPtyb/XqfW1vffr3Zl9z +enj3fP3k7n7p5/Tt7PL3fvPseGRn9+t0cnN+/mZg+vlmdffv9nl79/pu/2586n5rdvPz39zo ++PPyb3hrZm1ma+x+b+f9b+/tb/P0aHX1fHr2ev/r73P25P7+enJvbHd2dWl3+fxyef3x5vvq +6fT9Zmf6+WT07WXv52995/357ffudXNpZ2x0bXvufvPy++3sdX79dvRoYmr+73Bv/n7z73jt +4P558ftna/7v7/t57/P9efvv5u/28vrqe2f763Nvc2l0emdmavb6dW9iXnD47+rf7fvvafbf +dmR9/Hnv+erpe/Z8aHDw9Xb0+vf4cWl68HDxdWbs/nvvdWf+5+3zduLlY2/k9Wjt4eh8ZmF+ +elpf7Oxs9e59bGf+7vj37PV4dPP/bW1+7OTp6+fp+Wt0fGtuZm18Ymt6eXX3/3jv/nv77v5z +99/e+/r38e18a3zo9m/26O79+ejtaF9qZV1cZ3dvbGp2+mZabOvs7/Hh3uns3N377+L3ZGd+ +eHH6++jhf2/i6mpsa2ZoZ2L862976PxeZW16/H7z933v+ffsfmv23+bsfvfrfF9kX2jyePXf +5Ov5+Ormemb49WdoaGBo+292+PTtbmZ5emF87evf7fDk5ezufXF69fXu3+D9/G1pZF9ybl9o +dWVmfnp973ZlcH327ufu7N/t9+98aPTrePrm3+XueHD4bl5mcH5vcvNtZXJ0/u99een1d2pq ++3hv7ej6d+L1cvtv/Ov3aXXn9m7l5m9ybmt4bGnr5+zq7u/1amNx7PllcXZrbm9ufvpv/Or3 +8OT59fF57/H593Fu9/d26/F09Gxg6/12/nj+dGxsamR5ePHs9t7f8fHvcXtnae91eft6+vRt +fu316Ox2+vhvdGttdPz4fWdxfG75cGJiffXq5url7+bm+vrz8H1wa/n+bnt0fXtoduvzb/p8 +d/JtZ35qXGb8cm5x/ODq6N3g+m/x73Fu+Pjz/W5t7u3u6fvyfG1ma3xlX3jpbvv8Z/59ce/k +6Oz9fHv7enN45+996uLs7OpvX2JfX15eY3vs9nd6/GtmdXH+6PDv3Nrf5+TveXN18nFo+/Jo +a+v8be33++n7cvnveWZjY2lkYX3r7nb57HZuevf4c2/w/nz96f5t7/jr6e7x6fFv9XFndG5y +5uf39Or7amh+/Xh/+flra3n0/3br//rq/v7q+WlqZl1bZ/5+f+zd4/Xz7Pbz7Hn/6uvr8Xnx +7X54eWxvfXV2eHl+8/d3fXJzdGllcWxzfXTx7PPo7G/+5epwbuvj73p2/3Jpfvf89HNq8/Z3 +5vZt+O9+ZWNwev3o7Pfr5+v2dGZdZWZn+Pdq8Nzi5+z87Ovy6Hp3eGZtamRmfPTr9O3mcWNv +b2NudPPr+Pzq7/3p7+js8/D98PdnZGRm+/F8eO/p7Pn9bGVrc3hs/3X74fJtePd5be/k6+rs ++Obf8m1//WVr925pbG5oaWBdbnz+7e/q5f5x92to+O7o4uXj6d/b6fDvfX19a2l7a15lb2xh +a/B9fe7tdmd1/W5faPHz8vH66/dvcvjvfWps//p+73pv9u3w7Ofp3uHo6ubqZWZlYGVn/PJx +bX5vbOj3aHF3b2v9eGl5+X5sYnDv8u/s4ePr5+r+dnZz7+vqfPT/cHp0b2poYV5iaWhu9+rq +6enq4uju9u/z/Xx8/n148/hventmYmRkZ2xqeeZzZufg6ebh9e7ydm9s//d8df3n5fX+/XJu +dmhlZWd0cG5ufvl77+717PDy5eTp6fDv93BydW1y7+9+fnBnYF9ne3JfZ2Rpd3Z+7efq6d7h +5+318vTr7/Bwa3FxbXT07XtmevZqZHj/evbv6e96fu/8//zz6/D5fG94bHb7a213a2ZtaGVt +cf/v8u3k3+v99O3zdu/x+u7u9fP9cvp2dPV8d3Jqb2ldZHh7+//v4OHm4utqaW1wbG39+nb+ +6+j7ffF0b3v7cvl8a/16bHF0dXr88+ji6O/x7X968/Pr73tvcm5ubG7+b2Nxc2prdOzu/fnu +6+3x7fJxbv99fn9qcO/1/n18+ndtef1ydvZ3cXdvfu9+eO/m7Obl4up+cHr1fG5sbnZ6+ezx +e25qaWReX/nrdHR5+Onw7uvv7vP/+HRvcnh4fH5+8vb7e+3qdnRyZml3fPr1/39/7+nu6vPw +7v9ucGxofvn3fXFucWlmcXt6ePTv+Pn9+Onk6uzs+XJvbnh7fPd9dX3/e/Hw9XxucXF4aG18 +fPHv/nBucHzu5/N2c3Vtcf97e/rt83R59fPt8vTx+3x6/nFtdv3x+fjy+npwefp/fnh2Z2h7 +cmRmef73ff706uv16+vx7ery7+3y+3d+e3d++/j6/X5ucW9pb3JkYm5vb3f//H/88fPw8PHm +6fzv8Pj18f5saXjvfnJud3J8fHJ6fvX/9+707+v7bnV7c3N9+fF9b3NweP369/766e15/fT3 ++PN4a3BsbXVy//jt9G1xend59/Z8+/n6/vzw7u/9fv75e/Tv/3p//mpkcWtmbXN3/f50b/nv +8Ovr7e/x+vTu/Pb1eXdz/359+/p5/u54a3p2evzv9fbwfnt9/P7v8O91aXx7c3fz/Hp2d3Fu +dXX3+/36a2tteHFrc/Tz+H7z7ezv5+Xt7O7q8vXz+fNzeXz6dWtua21rbPxiX2dla295+vp3 ++O3f5uzk5vp47fHu9fHyeP/xfn3t73n8fm1yal5kXm5yde9+am919nRpd/j9ef3x9+vv5OP6 +feft4+n35en8/ex2dOjp+W1qdWxrZ3vyb15ibmJm7+9tav7r/nd58G1xbP14bOPn6+Pg7Nfk +buXs7/Z6ZGZtd3n+Zf9/ZvHo8Hrs5vx2WOv/Ymfu8vhkfn/5dmr7bm79bW/vY23p9nTe3OHs +4vT8b2z4d3Vu32hl++ls7uf3/HZ0bm1vdHpuZV/0Z2lv9vj5+fTa+v7l5udv6unjev19am9s +e+vr62v96Gt1cPZoZGxadHVx9OXl6uJobutmdf1ybGV3Znn74eTr7/HoffHjbX53Z/VxYmp3 +5Hvhb9znavPmeXBw9e1uanhxY3P57O9sbPx2f2tscG9ofvVydfR9d+bb7HX67Xz6+fXc7XPt +8/b37HZ2fmdj/vJoWXxzX2f9935v9+9883Xn7H589Hfr531s5HRr5X//ZXlq+Xtm4v91ZV99 +6Xd58uTpcuvz/fDua/zm9vh67/FlW3llc/Jy9fFpf21uem14/+r+8/Z76et+8fT39Xn0/nV+ +5nVkeWRk9nJmb2Nw7vj56O759uvv7+f17Xjve2Pv/mb25uxkeOz4Yn3lbW/6evT4Y2FscXb5 +/3bxa2ps79/19OXpZH59aXtv9vxv7+9u+uJn+97n73z+6/Zmd/X+b29y/ml27XPz9H17XnVu +b3ts7fT93evv/uvtcXj07HRf7fJobW14ZWxfbHnp8Hf7aWF39m1t8uHk4eDr5/Xq5fz94+n4 +629nbW5dYHVvXHZqbm12bu599eT84OXt9mfsbW354G/65Hz+6evzbnNv+WhoWmx0bvxue3h1 +cv3t7+jo/uX7auh7fW52ambp6eVfdH52cmNg7e5uY9f27N7v2/3v9+zsaet1/W9p/Xll/mNc +ZOp7ZfHs/HP3bOxxYXrs8Xrp3e9s/v99aO3rbf3y8XT5e2v7fm30fXBtcfrzbmvl7/tsevtt +7uFxdl9gYnFr8+/n6dvi3u7z9XTm/fH7+PdraOnha19vaGRuXnVsY2Zi/G5w5fVmd+Nv5t5g +8fjw9t/k6+Tl9Hx2/Gj/dGFtYujsaOrrd+/7bm5ubf1pa/R6+uD5eXR7499fW+hoXnfj19h+ +X/f9YmXo0d9obu1yUmV+aHVgamjp+vXb5vTya29laGXn6N57cebi8uLXd3T+YGxxa2jd4fLy +429i3PtSYV1o+99eXdPfT+bP8WRxXlfke27r3e9n6/RZX3NOW9Ro3MvOzvFh22dOTk/Xz2JZ +0spbU3vT2extcv5fYlVn3d91WPbpbGZn6tpcXuzd9lht+2pobO3p6ev678/LzMvFys3W09t4 +WUM3NTo2LzI9QUFL5MW5t7GtrK+ztbq9wcTBxMjlRzMoKyoeHiYtMThKtKSnqaSmqrxLRE43 +LjRE1sfFrJ+foqKnujseGhoSDxYdLEjYpJWWmZmcpcEtKCojICg6v7CrnJWUmKW9WxsNDg0L +Dxgrrp6XjIqOkp/JLxkPEhUbLWapmZeTj5CVneQlGAsICQkOIDyok42KiY6Xpy4WDgwOFCDO +n5aSkpGTmaO5XCUSDQ0ODhQovKKbko2OmKm5OBcODxcdKruZkZaampyr0dPOUiMYHR0XFx88 +wbysmpacpbO5PxcUHyMkRqaWmaikn7RXbrm2yTknKiAWFx8tQtyumpieoqq5OxkWICQlUaOY +m6mpqMs/0ay0wcg+LB8ZGBwiL+avoJubn6u/RB8XHSgsRKqcnKevrrpkzqmtv7lAKB0WGBwf +L8WpnZqbnKjKRB8XHCEoQbKfnaasrbrJwK2stKxHISAZFhkeNLyzo5mbn6vI4yUWHCUrOMGf +mqezrrTM4K2kvNdSLyEWGSAjLFOwn56jnqG4WCgcHyAkNr+koKiqqrXLz6+nwsPMLB8aGh4d +Jlm1qKCenJ+1zzgeHSAlL1+toaOqq6+90LyqttHLNSggGh0fJDncs6Sgn5+qt1okHyQiKDu8 +p6itqqy5yr2qtMizWzEkHCAdGypBx6ypnpqirbc8KSQfJy0+vK6tra+vtb+vqrSuuT4xIR0d +GR0sPM+1qZ2dpam0Ty8oJigrOe3Au7iwra+tp6WnqrlNLh8cGRcbJDNuvKicnKClrMBMLykp +KSw4UNzEtrKvrauqrq6w7D8xKiYhIS02PGTIta60tbfFbD42ODY4P03vyMS/uLavrK2rrbbF +XEU4Li0tLjQ3PU5s5XxYZU4/PDlGbvzMurSzt7u0s7WxsbC0yPRmQjQuLC4vLzQ/VfpXTVpM +Pzs/XtbMvrWztLq9ubq3s7aysLvQdFM+LyotLy4uNEJPQz5CR0hHT9m+ubq7uLe+ysO6ub25 +sK+zv8/ZUzkwLzEzMC8zNzo2Nj5KXuPJura7w8bEzXv3yL69urStrLC7w8xqQDYxMjItKywu +MDA2TdjKwby2utHv3tx1YtbAureyraytr7jEzPVGNzEyLSclKCwvM0Phxb69vr7F7lhm6et1 +1b21srCsqqyxuL3Jb0Y6MS0qJSMoLTM5S8/CwsjKxs9qXe3P1NnIvLe3ta+tra+yt7zKWzwv +KygjIicsMThE5s3Ozc3Mzetr48/O0Mm9urm2sK2srK6yucZnOi0qKSYkKC00O0Bc1tXq5dPQ +3vzmzMrU0cS5t7mxrKurrrO6y1Q7LisqJyYqLzc7P1X073Z16N7j7t3OzNLUw7m0sa6pqKmr +sMbbdjYnKSsnIiUwQDk5er7UU9+8yE9U1NNMScm3urSnn6Gmoai/RTQwIRodJiQkLta7z7yo +rsd0z900LT4+NzvfubqxoZ2foJ2dr1U8LR8XFx8eHSpyvr6zoqa4vLz2NCw3Mys458/KsKOf +n52bnqe7XiwhHBgaHh8oNt21s6ynrbbLXEUtKzQvM0rdv7msoZ6dnJ6eqtY7KiIZFx0eHSpL +xbqvpam3t8ZMOS8vMS07VHXCsaqjnpydnp+u0TMpIhcYHxwfMVrIvKulsriy4Uc/MjAvNEVE +8rmzrKKenp+dpLnlNSceGBweGyY8Scyzq62zsbxtXUcxNTo2PWrQw7Goo5+enaCpsO4wKh8Z +HR4dJjZI37uvs7W2wd9hRjk7PTpAY+LIsqymoJ+en6iv3DgtHxwfHR0pMTdjv7u7sbbFyN5G +PEI/OEZpW8uwrqifnp+fo6/LQy8hHR8cHCYtLk/Izr2vuca8zE9KTj85TFlMy7W1qaCgoaCi +rLnpNiwgHyAdHyoqNPfvzre5xMDFd09ZTEBTYVzKvLitpqWjoqSqr7tINywgIiEeIyoqOFdP +7sDA0MTEW3/STlzVbebBvLmtqKmloqmqrsVbPy0kJCMeISwqLkpJSM7A38u85efD6l7K0/W/ +t7uvqaqopamtsL1vPTEoJCUjISgsLDNDQ0/P1d7BxObLxfPZwcvEtrSwq6mrqaqwtLzmTTwv +KyknJSUnKiwyOkBJ/c3Rx77IycDGx7u5ubGusK2ssLGyu8XH1k8+OC8rKiYjJSgpLTQ8Se/L +xr+7vLu5urq2s7W0tLe3tLm+vb/FxMniUkI4MSwnIyIjJiovOkVtzcS+uraztLOysbGxtrm6 +vsDAxMnFwcXGyeRJOzIrJyMiIiYpLjdBYM6+uLWzsK+wsrO0uLq+xszOzMvIw8C/v8bN5Ug1 +Ly0oJCQkJiovN0Vpybuzrq6trK6ytbrAyNHl7ObVzMnHw7/Ax8zWYT8yLSkmJCQnKi46S+G/ +s66rqqytsLi/xtXta19bZefbzcTBvr3ByMzfTzoxLCglJCYqLjtQ2b+1r62rrrCzvMjR3nJo +YVdabO7by8TBvbu+wMLWTzoxLSonJigsMT5V5Ma6tbCxtLa3vcfO1un7fmBd6dLHvry9vb3B +x87+RTkzLispKSsvNkBNdc/Bure5u7m7w8rN2eLb3+fXzMnDwMLAwMXJydHzTT45My4rLC0v +NT5GVN7Jv7u8vru+yczK09nT1+LYzcrCvby9vL7AwMTeTkE6MiwqKSotMTk9TurNwb2+wL3A +zM/Nz9XNztXNxMG/u7q6ubq8vsfjUkA5MSwpKSorLjU6Q1/ZycC/wr29xMTBxMnHys7LxMC9 +uru7urvBxMv4TEA6MSwpKSkrLjU7Q1vYyMG/v729w8O+wcTEx8vIv728urm6vcPGytduRzs1 +LyspKSorLjQ6QlrcycC9vLm6vby7vr++wcbCvr/Avby+wMTJztZpRDs1LyspKSkrLjI4Qljf +x728u7i4u7q4u72+wcTDwMDAvr2/wsXIztxdQjkzLiopKCkqLTA2P1bbv7e1tbS2urq4ur7A +w8fHxcTBvr6/wMLH0/5NPTYxLSopKSkrLTI5R/PJvLa0tra3ubm5u77Cx83NysTBv729v8PI +2WRJODc0JygtKigsLi81Qvu7r6ytsbS7v76/wsrU6uTOvrOtqKeoq7LcNiMZFRQVGSM6zK+n +oqKjpamuvFkuIx8jLVK6rainqq+xr6yrrK+5yv4+KyIaFRQWGylXsKKdnZ+mq6+52zwpHx0k +M86spKKnsL/Oxraura60v9hNOSsfGRYVGSM/sJ+dnqOstb3F004vIx8lOMWmnp+ovmFRcMGx +ra63wsnbSjEiGBISFiFTqpyYmp+ruMfRaDkmHRwlQq+dmp2q2z08X7qsqq67z/lbRy8fFxEQ +FifAnZWUmaO01/heRi8fGhsm8aOZl56xTzlDyq6oqrTeSktQQi0fFg8QGC+rmJGTm6rPTk1Y +QSoeGh0su52XmKHAPzhOvKuprslLRUpdSi0dEw8RHFCgk5CVn7lPQEhLOiccGR44rJmTl6PL +OTZYuKurt/E+PFBoSS8eFA8SHnCek5GXpMZCOkFHNiYdHCJOppeTmKbVOjpoua2vwEo4N0bl +WzMfFREUH+uek5KYpc08NTo8MCQdHinjo5iVmqnNQz/xvLK0xV5IRFNfPyscFRMXJsyflpWa +p79RQD0yJx4cHzK3nZaWna56RlDLtbG+UzcxPGjQXC8eFRMXJsCelpWbqcdYTkQ4KR8dITi3 +npeYn7PdVm2/trrORTg1PmFONiYaFBQcNq6blpedq73ZVDwtIh0fKuGmmpidqsD86L+wssFF +LigqNkU/MyMZFhkl16GXlZmktdtIPTYtJyYrRbejnZ6lr7/Gvra2x0swKScuPz4yJRoWGB9H +p5iUlp2ty0g8OjMtKyw36q+kn6Gor7i5uLrISzUtKi06Oi0jGxcZIDutm5eYnqzKTENKTkpC +OjpI1rWrp6aprrS7y189MS4yPU1NLyAZFBcfN6+dmZqgsMvjzLm0utk9Li462rGnpamwwedO +RUNIWmNbSywfGhUVHCn2qqCen6eqq6qlpq2/QisnKTjRr6inrcBrQT9NV0UzJxwYGBoiOM2s +op+fnp+foaaruv06LSsrLjdH5L64t7vXRjEnIyEgJy5BybOrpqanqq+3u8nO1W3+ZFxfVV5W +SkY6NDExNz1Lb29lZGZ92cS8trm/ydXKzcPR3XZYdF7z1MjP83NOSElEREhCOzw+QmTYzby+ +wMPZV1Jt717xx8xPaN1iVVN9997Hw7u4vMLLz0w+Pjo2Njk7Su/IwsvC20dLPkNQUnbZ4NDE +yMO/wsPGxsPEwcrL3XdXSj02MS0xOjtR1tm/sbx2ctdSPET63NvNzcC9ytHLxs/h1cvY5d1h +UVRHPj08ODY5PUd0y7+1tsPP3FtJTWzaz8rHx8vQ2djc7etuYltQU15eX19PRD46Oj5M7s3E +vr7DzeN+4dvi1M7Kztnd7mpu8vhoU1FNRkFFbGpY7WJNTEdGTvTPyMC/xMrLztXQztTk82pi +Z2Bt5eFzWE9OS0VLUFhhZWhwZk9NTlNf/9jHwsjGxsnIzM/X4u5kU23va2Rlal5YU05MT05V +W1xy6m1kYFdaZPLe1szKztHW2NbY1tvY8O/ma2L2+l9ZSkZCQFnbWj7jydPS1cvO1uhuYWZk +7vNyb2jh1cvU19xnYlpYTEtPWFBOWHLf2ODi1dLh9Ovf6PRjbm9oeOnY0+7r197peuxoalpU +Tk5V/eB1cXr87O3s5ej89W1v8+zf39zvcWb2/mxsZG9u5t304XhpXFh1a/b9Zm9cYmV+a2jm +2efs9uns3Nnbz9z2WvpmbWNj9t3g8+v1a3JuTlhfWFVoYXJ0W97c8vLW9uzact3a4+njX2jn +Y/r3cfznd+XaZ17nYU5lZVhXXlzl7P7Z1e/b4uXv4eHj1/jv3+nzW1l2Z11bW3By/m369WVo +WF1ZUFpu63bZ59PR19/c0drb2dja2PRx6V9YWlhSU1JWWF5ea1VS4dftbef+4+Tk79v3+/LW +2fXX0Njc5tzuXl1YWU9VWlNdVmVoaW1443rZ9eXh6mjl2F/k7N776uf+8Wfd93ZV1t1i8vvl +XGJff1RS8eBnb9Vr9m30bmpZ69dgZtXZX3Ll62Vk/+t6XubjenPrcGdganlxavTafHrh6Wzs +33LubX3ic/z7a2jtfWhy9mZv6u3f7evxcnztZ17yaV9tZV9caWx+Y+/Z6t/Y7HzjbXjpc23d +Znze9O/o53/Z7/H0dmJoaVtdX3BbXmxqWGvaZOPp6+7n6uPbddbg/d7maX3oYfvufvBgU11Y +TFFSUGFdZuXu9dDQ1sXJx8HExcfJy8jbZldHOzQ2MS8xNjk8R1nfzr+5trSxtLe3vMLHx8/V +0MnNzt1OWD4uMzMoKzAuMjtGVGvJuL22rrO0sre9wcbF0MvCy8nAwsnOVEw5Ky0sIyYsKy88 +SF7pv7W0rqqur662vcbM1PHaz93SwsTFyWRVOy0vLCQoLSswOkNa88W4urOssLCutr3Bytrl +2MvMyr+/v8LTZUg2Ly4pJikqKzM8QVjUyb22srGvr7W7wcnY287NyL27uri4u8r6VDktLSkj +JykoLjo+TNrIwbqzsra1tb7Fw8na08fDwLezt7a0vNVpRjYsKyklJCktLzdJZ+3LvLm6ubm9 +wcbJy87PycO8uLazsrW3usfmSzw3LyspKCkrLTM6QFb738/JxcPCxcTEwsC/vLq3tbO0tbe5 +ur3Cz2FEOzMtKygmJigrLjZBUXbUx8G9urq6ube3t7i4uLi4ubm6vLy+xtLqWEM6My0pJyYl +JyotMz1P7su/u7aysrOysbO0t7q8vb/AwsXHyMjK1eFrRzw1LisoJycnKi40PlLgxLu4tLGw +srO0trq7vcXIyc7PztDPysnN0+NYQzs1LispKSkrLjU+Ut/Jvba0sa+vsrW3u8DIzuN67O9y +++ji2NDQ2ONtUEE7NS8tLS0tMjlBUd7Fu7Ovr6+wtbvByt34fF9ZX2pq/uHV0s3IzM/ReExB +OTAuLi0tMzpCWdLDvLWytbe3vcrR1+xqfW5ebfLz59HMycTAxMvO7k5CPDUwMDExMzpASV/Z +zMS8uru7vcPJzdTf5+33eu3m5NrSzMjGxMPGyttbTEI6NTMxMDI2OD1O9tbHv76+v8HIzc/V +2dve6OXX1s/KxsO/vb2/xtDc2ng2LTMyLC0wNDpATG/XzcbAwMPHx8jK19rU19jZzcbDvru3 +s7W5u8DnST41KykoJycrLjM/W+LIubW1srO3vcPJ2O7wd19v4NjLwL67tbO3ub3NY1A7Kyoq +IyIoKCg0RUzOtrWxq6uurrW/v8/561hRaF9i1svIuba6uLW/4HVMLyssIyEmJiYvO0TjvrWv +rKmrrq62vcHa9m1QVVVQaOvcxr69ubq9yfNtPS4xKiImJyUrMzxPzrqxrqqprKyuubrD6m9U +S0pMVWF02MbAu7m6vc/gUzUzLiUlKCYoLzdAesO3sayorK2stry91f5gTEtKS1dm3sjFvbi6 +vMTU6T80MiklJyYmLDI7Us27s66pqq2ssby9zXRiTkhISU9c98zBvri3ubvJ3GU6My8oJigm +KC42RXfFtLGtqa2urrm+w+VnTkVKREZbaufGv7y2t7m+0/1LNzItJycoKCwyPFLbvbGxrauu +rrG7v9P2XUlJS0RPcfXOwLu6ube/z9JbOzMvKSYoKCkuOUZax7SzrqqtsK+2vsvgb01KUUZL +7+fWv726t7m8yOhePjMxKyYoKCovN0Nty7ixsK2sr7K2vc7ufFRIVllNZ9rayL68vLu+z2tb +PzEwLigqLCwwOUj5z7yzsq+tsLW1usnT2l5NXF9OXd3j28fBxsnJ2llSRDY0NC0tLzA2Pkdg +2Mu8trizsbe5usTM0u50b3tz+uPa2dnR2vX5bldMSj88Pjs4Ojk7QUhPa+LVx8LBvL3Avb/J +ysjS08/U2t3h7Pl0cXdwb2NZU1BLSUdBPz49Pz9BSE9aftrQy8PBwL+/wsTEyc3O0tvb3OXh +4+76em95a19fT0hHRD49Pjw8QEVIU3nk18vFw7+/vr7FyMfL1tfU6vTyeWVp+eXo4uLteG5l +TktFPTs8Ozs9QEhX+tjMx8O/vb6/vsbMytXx3/Fdef5s3Nno0dDT1Nrh/FRIQzo0NTUzNjw/ +SW3QyL+6uLi5urrAzM7cZmZfUFz9bubP0M7DxcrN23BYPzg0Li0vLzI7QU/ezcG3trSyt7m6 +xMrL+2Z8W1p09ujdz8bKx7/O2uJKOzkxLCwtLS81P0pfy767tK+xs7G2vr/F5Wn+YVN15Xzb +ycjKxcTWcVxGOTQxLCosLi42RU7wv7q5sa6xsrC1v8LJ5+/sXFd97u3XzszOys32b1M8ODUt +LCwtLzQ8SmTRvrqzr7Gysri9wM3b5PRrYXHn38/Fx8vEx/hlWTs0NC0qKywsMTtJY827uLOt +rrOys73Cxdb7/XJdZOnd3MrFzsvI7F5jPjMxLSkqLC0uOUdT0rq3s62trrGwtsLEzmlfYFVX +deHgz8PExMHMfFpJODAuKygpKy0yQFjiv7a1r6yur7W5vc/c709PVlJo3tHJwbq8v7zC7V1B +Mi0qKCcnKiw0RmDOuLCuq6uur7W9yelgUUdJTUxh28zCvLW1t7a/32M/LywoJCMlKSwzSvHF +saysqaitsbbD2WhMQzw+Q0VY38q9trCxsLC9ze0/LiomIiEkJys0TNy9rqqopqeqsbjHWEo/ +NjY5Oj5O4ca5sK6ura61weFGNSkkIx8gJSkvQ9u8rqikpaaor7zJWD45MzI1Nz1M8cS3r6yq +qqyvtc5MOi0jIB8eHyYsN1e/r6qkoqSnq7TIaEE0Ly0uMjtL68O2rquoqKmssLrbPy8qIB0e +Hh8mLj/YuaumpKKiqbC/XkEzKy4uLDhJWMSxraqnpqerrbDKej8qJyAcHh8fKDRDxrKrpKSl +pau3zEY1MSoqMjM6dsu8rqyop6mqrLS/x2Q2KigjHB4jIyg4a8KyqqKip6isv2o/Mi4rKjM+ +Qeu9t6+qqamrrq64y9B+NysqJh4eIykrNGe8s6ylo6itsLt0OjMwLSwzSFjmvbGvrq2trbG2 +ucLM2UUvKygjHyEnKzBC1LWsqaalqrG710EyLi8wMT56z8K2sK+ur7Gztru+xdluRC4oJiIg +IicuOk7NtKupp6iss773Pjc2NTM6S3HRxLu2tLO1tbS2ub/Lzd9CLykmJSMiJi46Tc+2ramn +qKyxu9RMOzk4NzpBTnDTyL65uLi4uLq9v8PL12M+MS0qKSkqLTM9WM+8s6+vrq+0vMnrUEVB +OzpAQkJKX+7Uxb+6tLOzs7O3vcn2RzkxLSsqKywuNT9Z3Mi8uLWztrzByd9dUExHR0tOWO3Q +xry3tLKytLq/zWhDODQuLCwsLjI6Qk/yzMO9uLi6vMDI2XFcT0xQV2D52s/Iv727ubq9wsjQ +a0pAOjUyMC8wNDlAS1/hzMK+vb29wMvbfV1ZWWBo79bOx8C9u7q6vL/Izt5bRD48NjEyMzEz +OD1AS2jdzcK9vb6+ws/g731z+ufXzsrGxb++v8HCydPe8ltKQz88OTY0MzQ3O0BKWu7QxL6+ +wMPGytDe397q5dzb1cvIx8TAwsnN097f4WVPTEY+OTY0MTM3Oj9MXurKvr29vsPFyNDd5+fw +9+rj3dLNzMnFxsfEw8bLzt9dTUU8NTIwLi8zOD1IXuHLwL28vL7Cx83X6Pd2dPXs69zT0MvF +wr++vb/AxdNtTkM8NC8uLS4yNjxEUubMwr28vL3ByNHf7PR3d3X47d7PzcfCv729vb/DyM7x +VkY+ODEuLS0vMzg+Smrayr+9vr+/wsbN1dzl8uzg2c/MysbBv7++vb67vtVPRT82LioqKywu +N0BRfcu8trO2u8HGzO5aV1ZVWmbu08bEvba3uLW2urzH+Eg4LSooJiYpLTVE7L+0rq2srbG6 +0k0+PDgxOEROadPDurKws7Cws7i7wMzZaDwtKikkHyMpLjVHyrGrq6ilqLO910IzMC4tND1A +WMi6ta6sraytsrS3vs5rUDsnIygiHSEtMDVvt6yopqSiqbvI4zYrLSwoLkBHb7+2r6usq6ms +trW2xd/mVi0kKyYcHissKkK/saunpKGms7vAPSouLygqPUtO0Lmwra6rqKuysrK+0NdXLyYp +Jh0dJyopOMu2r6qkoaevtbxNLS82Kik5XVLkt62urqqorLKzsr/p69w7IiUsHRklLykwzLOu +qaWho6+/vHQpKjkqJTrvV9a0rausrKiqtrevvVvf7CwjLSYbHiwqK0bGtKyqpaCpuri/OCkv +LygrP2X7yK+pq66qqa+3t7rKaVhMLCIpJRwfLi0xbbqtp6elo6zBzP4vJiwuKjBP5s67sKqp +raypr7m5vOVT4DsfJS8dGis3L0bBr6WmqqSlumHvQCclLC4vOnHCurqxq66yrq+5ubrE3/JZ +LiMnJR4fKzhH2LeooKSoqa7KRTkuKCktM0LtyruytLSxtbi4ubq4vse/4y8kJSMdHSYzTNe6 +qJ6hqaqvzD4uKSgsMDpiwbq4srK3uru+vb29t7W+zcxGJB4iHhshL0q9rqifnaWuvWk8LiQi +LUhO77atrrO9x7/A2trJvK+uvMi6YiAaHx0bHyxVrqWln52jrss8LiwlIStPx7uxrK2ywujp +2uDYxbuup6vBUjwkGRkaHSc7166gnp6hrcNWNCkmKCw9xrCura2zv/VGSmnjzryyqqesvW8w +HBcZGh4sS7qlnp+fpLToQC4nJis1Z7mxraywvtlLPkpf58e1rKilrMhEJhgWGRojONmtn52f +oqzCSzIsKSsyRMWuq62xvc9rQztBWsu5sKqlp7VcMB4WFxkeLEq6p5+en6e46z0vLCstOuCy +q6quucbpTD4/TW3JuK2opqvEQCsaFRgbJTv5s6Sgn6Grvk4wLCwtN0jMr6qprsPxU0dHT13p +xLWrpKOs5TAfGBcZHSk50q2jnp6krshALywqLDdkuK2nqbO+ekxLSE1Y6cGxqaSnukQqGxcZ +GyQ0SL6rpJ6fqLLiNSwqKzI95ritqKy3xm1cXVZmed/ItKqlp7lHJRkYGh0nM0fIrqKcnKKv +7TIpJycsOGG8rKmqrbzP61ZUUU15ybisqa6/PCIcGRofJzjovKuhnp2frdg2JyMjKTr2vK6s +qquyu8djRkRJ+Mi7r662zzwnHRoaHiY09LeqoZ6eoavFPCggICYyc7quqaiprbK72E0+PUrn +vrOxvV01Jh4eHiApMUy7q6GdnZ+qv0IrIyElL0/AsaupqaywuMhiR0NHX8m8vc1MMSUfHx8l +LDZku62jnp6gqbxKLickJiw6fL2vqqiqrrS9z31kWmHa0NjmTTUqIyAhJSozR9G0qqShoqat +vmI8MC0uMTxUzru0tLi+zNXb3t7XzczMzuJgRTkwLSsrLjY/Ut7Hvbm4ubzAxsvQ0dPY1tre ++1JHPzw9R2vOvbe0tLe6wtVpRzw4Nzc6PkZNT09NTE1SXP/r2czKxsTEydDmWEpIS1vgyb67 +uLi5vMHNe01DP0JIT1pfW1FIPzo5Oz1BSVzlzcXBvr/J22ZNR0pc3si+u7u6u7/G03VPRUFI +XN7Nx8vXbEpBPDo4ODo/Sl/j0s3P3WxUTUxSatjGvbq4uLm8wcvdYk1GRk5p2MvKy9X9XlFN +SkQ/PD1CSlFZXFVNSElOWHvVycC8urm6vL/K311MR0VLXOvTysfKzNLb3uh1XFBLSUtOTkpF +Pz4+P0ZOXfXbz8rEwcHGztz9aVxebuzZ0M3Lys/W1M/O0Nfj721pZVtUTkdBPT0/QEhOV19k +afzh3Nrb4+js5+Ha0s7Mzs/R0dDPzs7Oz9Pc4+r5bmNbU1BPTUxLS0tJR0hJSktPWWH539XQ +z9HW2NrZ2dbVz8vLzMzN0drj7G9pa2lrcfjq5exvXVFNR0I/P0BESlFebe/e3d7c29/d2NXT +zsvl173N287P8mBg0NLm1svO1t73ZU9IQj8+Ojg6PUFHVmB61c/Vy8jIwr29vsPS5flmWFxe +auvf08nBvbq4vdBgQjAqKCcoKy02T8y7rqmoqKqzy2dJOjU1MzpLbNW/uLOtrLG3ub3BzmJO +PjAkHR0fJis4W72qoqCjqK+82jonJCo0T9C/r6eor7jDy8niXNzIxru+YEAuHxwdHSArR76o +n5+hpbDsOSwkJCw8x66opKStvu1EQkpMWMauqqusuOk+HxIUGBon/LqlmZqgpr83LyofJDNN +sKKkpqi6VT0uL1LbzrSqp6Souug0IBgSFR0pWa2jnpugsdI6LS4tKznSt6yqr7i+YDo6QFnK +v7+upqq0v9FKKx4bGR0sOtirpqakrdlPPzU1My5HvLe0rrK5wko2P1V+zb+2qqizyN5CNzgl +HB4pOFDFtqmlq8dUQ0BFPjM6vrS8vrq8veg1PF3WycLEubLH9WZMPEpcNykiLEJDTcWwq6vA +XWPaakU3PL+3y9K8vMByOEDq0/Xl1b62yX/MxXBNS0cuHSNASE68tLGquUhJfkVCRkbCssDO +vMTTZj0++c/pzMfHvsDPzcbPekhLLRcdPEZRt7CupLU8OEs+R2n7uKy23d5cVltJSti8xcnL +zsrBwMfS5dVIOjcbFzD2VLqqtK2tTS5GVUN+yb+1s+pFU3x83MrQw8dkSF7Nwbu7v8K/Yz07 +GxEmfl28p6+sp2wrOk1B7sXFu7DNQFPQy8bBfWnlSz5Pzruur7u+w0s4PxwOHm3rvKSrrKTc +KS9GPtu6w7+tvUBMz8nLvv5MYExEW8a3rq6/1cj6OTUcDRrMwsunoaWjySQlP0Z6vLqzqbhA +T7u1xOVAOUZBQOKxrrS8xN5EStO+KgkL0KlMrpyfn7ccFjC7uq+npaOvLibLq7xwR0JKPTRj +rqasyz5AWDQuy7AjDx/hTlSvqKasMB9VsNnEqqytsUM3uq/nZd9SWVk3Pbux22vP2FhP91Ms +HiAtODpJuKiy5khKz7y8uLG4vr3K2MbD4HFqRTw9Xbu9YEXdxEk85s1JKiIpO0Y+97W62eJ+ +6rm0vLe62ebOxreutWw4OD81L/TBzsTNPnW2VTIyLSssO8u2vn5TVmDYvrOvs8diVEhpu7G0 +wtFRPDo9SUZXyOBexsHSSTY3MjE/XXVi+tDPbVbHuLzL7cq+119dyLa81VBYflRFR0Y7Ql1p +2b27vM1DMz1MTkjs0NzQUUNd2+Pb0d/W5V7639TD11hYwsPc50NeUDxAPMSxvcxbXVpJT+zG +zOjfSlNMSmRQ19xe2/FVTWDebtPUSfLKxNhFQEFOXlXEtr/S1+pGPVjJxdHVzsxfQkv1zdxV +W09Valxq3OLh7mx9ZVxbUVRKSFvay8i+yNVnREZZ3t3Pwc9lZV1fXnB4eNTpXF9q9PxzaurV +319ZWmdjVVvv1d/ezMzfV1JVVGbYx8xtWltoXEtZ3tx3WvjV3/753HdXZXX68V1efO1raOXj +3t/Z2v19dO/c5+XdelZMWGxdbuvZ2/149+PnfXlzXV1u6f5tZl1wbmV84s7abl913+5ebH3m +ZFR27nNn6tnpb+v5dfdx3M/aa1tt3tbgfW5oYWdaZN/yWF7oXFzb7F5e6910ZnVp4dT25NTb +ZHPr6lVR/+BlYdzX8Flc/WhaaO/p9HFgWV9weO7m2tra2NvqcujjeWX25/ff4UhF0s1OTNbK +Xj9Wz1tEeszlXXrycGxh28nYfc/M515rclxVXnJsZmR6887GclPZ105Me959Wlvd5GFn9eFy +etzwe3Za6tz6eN/f/ltv/l1e59jiXlPoy+BDTc/xR2fjzd9a7tLoYlhu32dd9N96cuDg5/jv +5Ox7/N5rVXzuX2ZscXni+2jf5F1x23Rc69x6XnHocVZg09xOXtDmUVzW1uR56t5uUFRfcm9f +79Pf7+HY7Ghu83R48fv1/nBp9/Lo4nvq3d56ZuvX81Ro7GFPUVxrUEpm7m9yfm/nc1Ff2n5Z +2MrS3tTT1dLg4M/S5tvQ2NvU2OhzYHzg295iPjI0OzQzRFtPT1BZzcbjzLu+xcXJz8rGyMnM +z83N2tbU7GhuY0tIT0tGYeFbSkVGSkxIR0lHS1ZlYPbc2dPOy8rHy9TTzsfHz9rd29zn/uvd +3dXW5OXf9mFm/+tTPj9MPzU4PDxATU9Z7Ojp0MnMycLGycbExcjS5N7b3NjZ3NfW2tza3/xu +fPHz9mZHP0Q9NTY7OTtHTVX97e3PxsnFwMTGxsfKytPo5uDe2Nnh29DMzNDa3+R/aHN9ZUk+ +P0E8ODk4OT9LTVns49zPx8TAwMLCxMfFy93s4NzU097c087N0Nrr8HddW2ZfVVBCOzw9Ojg7 +Oz9MV2Lt3tjJw8G/vsDBxMnMztLb5Ofm5OLi29nX2Nje7enn82NdX2BVQzo8Pzg2PT89S2pz +7dfPysLAwMDEx8fLztXi6+He3tPS3N/f39vW4/39cWxfWldaXk5BQEZAPUBCQk1eW17u29PN +ysrGxsnJzdXX2+Pn3uLe1trc2M/O0tvqem9zY15bVFBPTEVERkVDQkhJTlVZYPTf2czGxsbE +x8rL0Nvc4+7p5uDe2uHp49/h7Pp9a11bV1FOTk5SUlRVV11qY2n4/Wdu8vHx6t/k4tzb4ODj +6ebj5u70fWtv4tzZ0tfd5uzv6f5zbVtWWVxXYGFjefNvcef7fersc2tfXWdpY2NrZ2d4f3d4 +7ebr6d3g7t3d6+Th8+vm9/Xt5uzq6ez67u1/amBhdvVnZmdXXGhfXnNoW1pebnp7a3b27+La +3OTl6enf3u91/P5ubPn67+7o6f3s+ujq/vfo+/pnXnJpZWdpa2hja3Nrbm1qdvnm7Xz16vRm +bnZsevru6NzmfOfp5+nl6N/d4/n6fW9pZGNcW15gWVthcnNu/mttePHr3uTs5ufr9N7c4d7i +7vfs+OblcGX19Gd0fWtkZ2lrYl9qX2JveHRpaGJlbXf573xy7urf2ufi2uj/6dzs6+/s7v3u +5Pr372lpfG1faGZ6bFtldGlefnlmaWdlcH9icO/m7env6eHy6Of27Ovo4+Dj6ODednV6bXr2 +bl1iYktQ0N9gZ95faGvx5Gteaed8/3nw9m/8f+br5+vy7Oz2b3199v7t9nN77vdnb+nu+urp +bXD9cG/9e2nuaFpiXlhj4vZ46uDo5/Vw6uDl6OT4/unmferc/k3uzWpb39thdF51+2VUXnFa +Xl9maulnX/X8/Xvr43ru2uJw39ri3nzs2uPm5X5oaOzkZ2X99uvkbGlrU1Ht8VhpeFxV9f5g +av7re/Bo/Gnf3Nra2fH+4nLt4OZv395w4fz4anxW9+JgW+/pUVlqbWJwXG1uYPp54d/2Y+XW +42lja3Pz8n9o83/p3dv98tngbfvsb3fzZlv4fWNn7l5X5Nxv7N9mYHFiXH/x7nxnbH717fp3 +723m09zycuTt9+v8XWpwZV1v/HB1Xmnk2PRoc+vpbWdtbVVa38/f8nd73udndN9+WV1ubWV0 +4N3q9Hvq8XVudO7o8Xp8eHH7emNlfXx47OJ4+N3pcfPqaV5//nJnZnBqZG7o5vdvd3tmXGBn ++Ovp3t7l6enr6Ozt/ffu73F1e3t9cXH34vJsbPR4ZG50ZWv6dnfw+fl77uTn6+rf5OHo/nRp +W1JPSEM/P0ZMXOXPysK/v8HFxszR197j+ODY1czHwb29zUkyKSMgJC06WMe5trWzsK+xt8Vb +PTUzNkFm0sK7uru5trS0trm/zGQ6LCQfHh8mMUzOurCtq6imp66/VTQqJys1StbEw8S+uLGt +q660vs/nUTouJiAeHiMtRs22ramnpqapsNA8KyQkKzzevrq6vby2rqurrrrPYVhcTDkrIBwb +HilBw7GsqqqppqWqukQpIB8mO8m0srnDx7uuqamuvvVMU9XKbjQiGhcZITXbvbevrKafnJ6r +aiofHSU507zBzt3LtamlqK/DaFJpybm8SiMZFhgdKkfe582uoJqYmaDBLiIiJiw5T2b1ybix +r62sr7e9yOBdbce8ZygaFhgeKkTxaF66oJmXmqPCMSUmKiwwPV3Ww7m0s7Csqq/BcEtIWsez +tzobFBkhLD1YSTzWoJaXnam9Qy0sLSgmMOq9vr+6t6+mpK5lODxczr+/xmktHRwlKigoLjtb +sp2Znaiss/s0LCspLUXe2M+6rq2trbHGYV15VkpY5si6uUEeGiMvKiIpQMmtn5+qs62v2jQw +O0BDVHTyyrGssru7vvZGT+TffvPkz7irtSoWGioqHR86v7avp6Soqqiv4T9KZkk2NU3IubzK +1sW2uM9NSWjVysvXzbmuvyAVHzUkGSFtu8Szp6epo6e+3r7COy4/dU1H0bu7u7a+6F3tzczL +3FRdzL2/TyYbIC4pHiFBvb67rampqauyvL/LVT9BTVNryru+ysrK0tnV1M7PUTtF3eQ5KSkz +MScoO97S1cOyrK+4ubKutsfW2lY4Mz1qycHIyMLLblzj1l5ESEU9PDo4ODs9PkzVxcjJyNLb +v7e6xL20utxGPT5FR0ttz8O/x9zYvr5PMzg9MzE/Vt/lYWrPxsjT9eDbX0b6wcLNxr7G2E5B +QkxNRlDUx8S6utJt8GRANTQ9VXFLSsm50l/LwtZdVXfVXUBnxr7F41voz0I3VFlIesnPwbne +5MXhOD9ZOTxi0lrXxNLgvr37fdFvQ15TVF/W2OTlaVFJbnBNR//d62vn1MbG7WZe2/lifvrn +32VV6+Tf2uRmU1dP6G1hf+7eYvT+4FlhVGlWX+vi3Ovu89TV3N/PzNlqTUpYem9fWWrZ2H75 +6WPz3VtNY+1p+dbT315UbGZaYuDnfvzs3dbk2tLZ4HJWTExSXVVa8d7T2t/f4OhuYmR1ZnXp ++Xzl2/plY2dufl5Tb9nv4tHZ5Oj/6uBeUVdRVWD52dbd6efrfG999Ortf3Zub/d+ZWn6fG1v +dnd46/h07eb29G1ZYPrtfWRs5tnb1uLl5eV5amltb2FcZG1qcHl0bnTw6vxqX2FvamR+6ODd +6PDn3tje6uPl5ubt7vfs+nZqYl5aX1xaZGt59PZzZnZubnZ6/X5yZGvp4+Pl6N7Y1dnZ3u7s +6eru+nBfW1dWUlRcX3Dq8Ofd9G7z9P5sbXZ2cGFlb/R7+ujb2d3e5ODe6vVw/ux8bWFbWF9n +ampnbnN66eXs+/j4eGhkev78cnpybP3t497e3t3e5+7reWVma2tpYF9nb/ju+G9qbPz2bHX8 +/e/s7vXt7/96bGZgYGZ09u3x7uPe5erufnJveX3++/D9fPnz7/f5+PHw8/D6amhucfbr6/pu +amhfXV1eYmd9/PL973Fx+PXt3+Lm3uvm7+jo737v8PBu/OXv9+30eGJi9/JeXmxgWGFoZW5i +Y/L3cPbk7+Xy6Oz2+3h46eDl3OTs4vP98+32eu5lffJkZHlmXVRr32Jb+fxu+nNr6nZq4+vd +7Xbh2V1Na+ZV6s/n2cz89Nb4aeBmcnVeUmRUXmb5Wmv/YXT53/ba/NvudmTUeV7t63Ra+mvi +/uNV3d952ePc5d18XlFUbXpLadJGe9Nybc5uU8jV7fNb2dxPTtbdTl5+4N/4T9fLal7x1v5v +SvPOYUv+2WbmWm/F6Exowl9V32nP6E1fv0xT3190z1BJwP5KbdRR6HtW2M5SUczkaF9/8tH4 +a+/c9ujO1c3Y1tLF1N3Y+f1nTTg5MS4zNDRAbs6+urawsr2+v8rP0dTKv8HCvLe2umYxJx8e +ICElO8azqqKgoai58TwtJSElMEbRta6sqaqvtLi8yM7E2EA4Ny4mIyUtPEVsuKqpq7C6yGc+ +NzY6SGbs2sa9xt/veXzaxr66t7a8yd5NNysmJS48Qna5r6+xu9BnSTUyPEdV0L67t7fF/11L +Rktp28O4tbOzuM9LNy0nIiY0SO28srCvuN9LQTo5PEfQurWysrvKez83Oj9K5srAubGxtbrJ +TzIqJyUlLUngv7Ctr7K/YUY/Oz1HVdi5tbvB0mNNQz5CVd7OzMXEzdDR4fzx6mxNPzcyMDZI +7Mq5sbK3v9xYSD8+Rk9hzsLFx8jdUkc9PUVNXuHW0sjDxszLycnNzdH6TzwzLzE7UNjBube7 +xOFKPjw+Sn7Sx7u7yutRPTg8RGLUxLm3vcTO6GNRTVPszcvHyNZROC8sLj7uxry1tb3YSTg1 +O0hn1cS9ur7VU0E+SXvRxby8yuF9T0lLTl/YysTAvb3QSTguKSs3SNq6s7W4wHBHQ0dQ7MvG +v77I31ZCPkZTXFhLXMvJ083Q2c3L3m3kz8jMYUM3LiwzQvW7r66wudFRQz08P0750sbH0O1V +RkVPUkplzc/LwcnTysXMy8fPzsxsPDQvKSw9Ycy2r7K1u/4+Ojk7S3ThxbvByNdLPT47O1TP +yryytrq7xNzuX1Jfdl5JQjorKz9k1ry5wcDFXz8+P0zVwcvKvsfYdEE3O0NN1768uLa8yM3Z +8fns18/U/EMyJh8oO13EtLOzsr5eQjw9V8vI0sK9x8pwPDU4RWzVxL27u77Aw8TI53nn62U/ +NCsfIjRNzLKvsa+09z89OUrGu8fEusjmUzYtMENh1b25t7a8x8nGzNvg3dXIzEEsIB0nPVzE +r6yrrL5CMzE4VsrJxba4wdk8LDFBQ1PMvrSts766ucPPZ07tybzKMiEdHik7T8qupqSsyzsx +NkFOX9bCsq+8Wzo+Rz48SeK6sLO3s6+2wmBASf3NaTUlHR4qMkPBraaiqcFLOjM1PEVyvbe3 +sbnMcEAyMjpNxLCtrq6us79lPT5VZEctHh0lLjvpv7Onpa/JTDU4Q0RM7s2yqbHByms+NS4z +5bOurq2trrHBUUE7NjEjGRwqNFq+vrGjpbPROjVXTz9DUNK5tbi4tLfMQzIzS8O4tbCsrLTI +UzM3USoaGR0pTMbIt6ijp6/cQT08MSwuQLyqqKmqrbhzNCwzVcy8tK+qqrTdSkk5IhYTHClK +v7OspKOptno+NTMvLTbYtq2qq62uu99OQ0NGRV7Mu62rrbbCbzAfFxQZIC1YtKWdnaCrv0k3 +LicpOG2/s6+tq663xd78cFNBPETpwLe4tq+y3CsbGBodICtItqOenqKpsLtlNSssOEhV6Me4 +srS5u77F3Ek4NDQ+WWvgwrexssNHNzk4NDI1PmPV19bc6ebxZ2Rx4tHOz9XOyszV2tTT3l5M +TVhx0ci/ubKyusp8STs4NjQ1OT1CS01NVVlVXW1f8c/Lwr/Bv7/I0+B1ZFxdcPXt5dnEu7m6 +vcLN41VAODc7PT9BSU9RTkZBQUNHSFXvyrq1tri6wttcTU1YZG1/3cq+urm7v8nY/VhKRkVG +RkdMTUpJR0VEQD06Oz5L7cS6trOzt73M7VdJRkdNXufNwr29w9Da4OduW1heb/91a2Nsb1dF +PDc0NjpCWdXCvLy+vb7K/U9HRUhMVnXWzMrJzM7S2dzj+ePT1NDNzcvP6VlKPz9BPz9GTldj +bHT/6Ozwc11ZWmV/7uTcy9DTy8/g+G554NnPyMTBv8bU62pWTEhHSk9TU0xIR0ZKS0lNXHB4 +49jV0c/W08/YZ07vxH5jxsfU0dTBvtXb2mZTcmFt4XlZUT89Pzs1OTtAWm3pyMK/ur3GxMDH +ze5cW19QTVJZ+9PNyMLDv8HR1c/R/lpDMSwsKCgrLTl6xLaqp6Slq7LDTz86Ly40PFbZ3cm4 +tLOyuLeyu8rYTkJDLyEgIiMnKi5VubCppaShpLC/aDYvLSksO0rVvLmxq62usbq8vcva1U48 +QTAkIyQjJigtT8S3raikoaawvO86MCooMDpB37yzrKywrq+6w8bHxs7sTUU7KiQkIiIjKDVf +wbGoo6GiqLC+ZDUrKCctNz/et6+sq6yrrbe/xsrK3FtJRTkoIiYlISMqNmfBtqujoaSpr77s +OysoKCoxPmHAr62sqquutb3JzMnS+HNMPjEoJyglJCkwQ+W/sKejpamtt85GMSwqLC81P+K+ +uLGura2vtbu+w8TJz9xfPCwoKichIio0Qmy9rKalp6irtMxIMi0sKiotOFLTxbmtqqqur6+z +vsPDyNFpPS4qKiYhICcvPFTDraajpKapsMBUNCwpJyktMj1dzLuwrKysrK61vcfLztDW/U8/ +MCooJyUlKjZN1bmspqOlqa68eTsuKikrLzU8T866tK+tra+1ur/L1tjQy8vVXjwvLCkkIyYu +O1DJr6ejpKituc9MNi4rLTE3PVDTvru6t7e5v8XCwcXEvru7v+0/MCsnIyEkLDpVyLGopaWp +r7rOUTowLi82PUVQ/MzDw8O/vb29vLq4uLm6vMlYOCsoJyMhJjNJYsmxqaeprLG80Vc8MzQ4 +PD5EUGjczs7OycG/wLy2tbe3tbvSWTgqKSgiIio8T2S/rKipqq24zGtBNDE2Oj1HYnreysXG +ycrMy8S/v724trvJ50kxLCwnIyk1P0zJr6ysq621yWRFPDg0NT5c6fDVwb3BydLb1M/e3se8 +u7y9xnU7MTMsJSk0PT96uK+vrq+0v/VBOj04MDts1OLVu7jDys7b6PFnYNG/v724usV3OzM2 +LCQqOj087LOvsa6utstUPTg6NjNF09Hfxrm6x9nZ1PVMSmTc2dG/t7i7w/09OTQpJS45N0PE +s7GurbG6zFI9OjczPGVwccW5v8nCzHR6ZEZL+/lzy729urW621NBMyooLDE1P965s7OvrrXL +YUtAODY8SFN0zcPBxMfC0FZl5lxPfNbZyr++u7e7zlg5MC4mJCw4OUq+sLCtq6+4xPFKPjc2 +PEFIZtPLxcbJw83t3/dWXvTr2sa/vry7wNxFMS0rJSUwO0DPsK2sqKmvvNpPPDEuMTc6StXI +wbq6vsXV7WJQUl1728zCvbm5u8xROSwqJyMqO0J4saiqqKatvedFNi4qLDM8TMy6t7WytsjX +3U5CTVha6sjAvr27u8ZbPi4oKiYkN1tXvqenq6erv+tONy4tLTRAUc+4uLq1vNbS2kxKWVJc +29DJvL29uc1WSCwnLyUiQXFEu6WrrqWsxddNNjEsLTg/Sda8v72zu8vJ2GRpYFfv1NTEu7/F +w9ZOLygwKB0x7zpgqKiwpaS3ydg+MS8sMD4/VcG9vra4xMnaXnNcSnzM1cm5u8K+xlRDLCQv +JR47fjnFoqqvo6i/yfU5Ly8wMDhP5tbCub3CvMLn7N5dWNfN0cC6u7zG2eA+JScwHh5NZzm4 +oayuo6vFz184Ly8wMDxRcc69u7+7vM/Y0vNdd9PJxr+4ur++z1JAJyAuIBw89Tq/oaqtoqm/ +xXU6MjAzMTlX8tvAu7++vc3b2Xhl6tfLxMK8uMHGxFA7LCApJRwv20POo6SspKe7xec7MS4u +LjJCXOjEvLu4vMPDy+fb1eLLv8jBub/Lw+U8LB8lJxon0kZWpaGspKKxv9s+NC4sLDA9T9HA +vbazur7A0+jZ19vNyc7AusnHvFQ/OB0fLhwe1s5Dqp2pqKOwxes4MTIpKjs8Psi7x7avv8G7 +z93N1trIx8q+ub/Jwtc/MCEdKR8bR75JtZ2jqqSsxO47Ly4rLDRDUtG9u7a2vcLG0NXRzsfD +x8S8wMfE1GNFLx4dLB4bVrxQr5yip6aywugzLjcsJztRTMS6u7K8zb7JX87B0MW8vbq4vsPH +6UU0KR0eJx4j177Lp56mp6zC2UwtLjQqL0lOzbrAtbPKzL/e+8LAwbm6urW8y8XvOjUnGx4m +HiTjv76poqSlrsLIUi8xOC4zSVvKvsm4tdnfxN1vxbu8trO2tbjK3mo2Jx8cHyIfLsO+uaSg +pqiyxM8/LzY1Lz1V4LzCzrvGUWTa+tS9trGvsK+xusniPyoiGxohICROt7OqoqOmsc7+TDEu +Nzk9V9O4t9LJyVBNZV/Yv7mvq6ysrbfcX0QoHRsdHx8ncLOvqqKgp7bN80UwLTQ7SGPMr7LL +w9FFPj5F9cW7raeoqay5y2YvIRsZHR8hOLyvq6Sho6/P/U8zKzE4PlbVsay6vL37RDw7TubP +s6ioqKiuvdkzHxoaHBsfOsWwq6WeoLHP4ksvKi44S1njrqi0ur3iWT41T9LWu6upqKmwttsq +HRoaHBwhSruyqqKforHUckYtJyoyR2XFqqetr73cWzs3S/XMs6uqp6u5vl4nGxkcHBwoW7Ws +qqOeo7njXT4tJSczSGG9q6anr8HMZDw8TuS+sa6oqK26TjIiGBocHCM6z6+opaGfrMVpPzAp +JSs5T8u2raWnr7jIblBITtW8ta6ssLnIQSIaHBwZHi1nr6ypnpymttRLNicgJi4/bc6vpait +r7a91EtW0cnEubSwuOFGLR8gHhofLTzPtaqfn6artdk7KiUmKTI+Zbmsq6uqrK+81NbO19rI +xcfMZDsrKigfHiYuPWnJrqOlqauvvE4xLSwtLzNJy7y0r6ypq7O5vcPN7GJWVVc+Li01Likq +LDlWWN22rautsrK31Us9NjQxMj9W3sW9t7G1u77Czdnuc2757+jZ3WtURjszLzExNj1HaNDH +vrq5u8DO+1NJQ0VNX93Lv7u6ubi7vb7IzNTtX01JQzw3MjAvMDE2P09+08S9ube7wMfP7FdH +R1vt5dK/uLe4ubq+xc/qWkpCQD46ODo5ODY2OT5KWHjRwby7u7u9xdPuY1ZUWmbizsW/vLm3 +t7vF0f9MPTc2NDM0Njk8PUBJT2L52szCv7+9u7zB0OprWlRUX+PMwb26uLa5v835TT01Ly8u +LjI2PEZVdtzRysfHxsjIx8jHyM7c73VfYXnt38/Fvbu7u7/J408+NS8uLS0vNTxKatvLwr+/ +v7/Cx8jMzMrMz9Ld7P7t5d/b0svIyMvQ5VpJPjcwLy8vMzg/TfzQxr++vb2+wcXJzM3Ozs/R +09HP1NzZ2d7j6uzvblpRSUA8NzU2OTs/R1V1283IxMPAwMLFys7Q1drd3NbY2tnb3d/n3+Tp +6PhiVk5JQj07Oz0/QklWYvXbzcnEwMLFx8rO1uByWvfGxfVmzsXlYtrPfFBe7VlFQ0pJPjw/ +RUNGTmDs1svExcfFxcnQ09PkdPHsaWTv1tbl4M7P3+Lb3OtvZ19USEA+Pj5ARUhOXX3d0M3O +z87M1evm2+Ht7u3Z2/7u19tqb9bL2u/Ox9V1bGpXTUhDRUZDQ0hMT2Rx7dbOzdDPy83u9s3P +XVjg2mpQ/dfnaN7J2GzZy99n29xUT19SPz9MTEZHTl1nYfrT0NPOys/U1eHc1+heaN3qW3rb +5NXY2tHN093V/Vx2cERCVEs9RExEQkxgd3LjzczOzsvI1uva4F5fcPfw7/jhzM7M2uzLxt5X +28h0S2dmSUVFPD1EQkBFYuHq7s+/wdDTwcbmdN3ZW1pt/vF179vU19bI0tfT2dbV5U9JUUw8 +NThAPjtEdtXb08O7u8DDwsXT6/J5W01QUl/yZF7GxNrTxMHHyevpcEY8PjsxMzk6O0BX2MzG +u7W1u7u7wNX99l1JQ01RVlpk08zOyMPBvsLPzc1QOj09MS0vNTk5PFPTx762sa+xtrvAz3ZY +S0VBQUJGXezdzL+7ubi7wL/BYjw7PzMoKC42Ly4/z8XNva6rrbO1srnRXFZPQTk5QUpNWN2/ +ubu5s7S6wtFaPDc2LCUoLi4sMlbLzMGwqamtrq6zvt1TRz84MjU7REtfzby4tbGur7W8x2A6 +MzIrJCUqLC0yRdnFvLCqqaqrrrK7zlxHPTYxMTY7QlnTwLiyrq2vsLS/dkA2LyslIycrKy47 +98C8tKunqKutr7XFeUg+OTQvMDc+R1vNu7SvraytsbrHXjswLigjIygqKi5D2sS7rqinqaqr +r7nG/Ek9Ny8tMTc7Qv3Cu7Wuq6yur7XGXz40LighISYoKS0958e/sKilp6iqrbPD9kxCOjMv +MTY5PlbOvrmzrautr7K72Uo5MSwlIiUpKSo0T9fIuq2oqaqprLG6xOVWQjkyMzc5O0JpzMS/ +tK2usbK0vNhNPTQtJyQnKiosOE7vz7uvrK6tq662vL/TYU5EPjw8PD1HXujRxbmztLa1tbzO +W0c6LyopKyopLTlDTPHAtrazrqywuLe3wuH2d04/PkBAP0dc793Ju7m6uLa6zmtcSTguLy8s +Ki45PD9VzsPBurKvs7ays77Ozc9nR0VIQj5BS1FZ78e+vrq1uL/O2XlENjI0LystNDc4QmfW +zcW6tba2tbK3vsPI5E9KTEY/QEhPXHfRxcO/ubm9wsvcYEM4NjMtLC8zNDlFXuPRxbm3uLaz +tLm+w83mal9WTEhITVJe8tzPxsO/vb/DzedsUT42NjAtLS81Oz5K6c/Lwbi3tbW3uLzEytDr +YVhOTk9QVVxr4NjNxcPAv8LK2XRfSzo1NC8tLjE2Oj9T1MrFu7W2t7W3ub3GyNHyZ15QS01P +Vl9r6tnVysfIxcXJ0WhQUT00NTQvLzI3PkRQ2crIvre0tre4u7/HzNNzWVZOSkpQWV5j383N +xr6/xMbJz3xQTEQ3MTMwLi82PUZR68a+vrq1t7u5ur/I1+VvT0pOTkdKUlpn4MzHx8C9v7/A +yt9cS0Q5MC8xLy82P0hO/8m/vbq1tLm6vMDK3fZjT0lJS0hJT15t6NDLysG/wb/BxtFjTkk8 +MC8zMC81PkVMbsm9vLu1tbq8vL/K2/B3VElLTUlIUlteetbNzcnBwcG/ws3mWEpCNjAyMS4v +OUBHXNHCvry3sbS4ubvCz+L9WktFRENCR09cZubQy8S/v7+9vMXea1dGMy4zMCstOT4/T9PA +vbqzrrG3tra+0d/7Tj8/QT48QEpNVOjJyMS7uLm5ub7QX1JLNiwvMSspMj08ROK/vLuyra60 +tbS6ydrlWkA7PTs4O0ZOVP7NxcK5tLe3tLnH5FZKOy0rLiwnKzs/PFbAuLu1rKuwsrC2xd/y +XEI6Ozw4Nz1KUWHSv7y7s6+0tre93U5HPC0pLC0oKDNCQk3Lt7e1raqtsrO2v9ZqU0Q7ODk7 +OzxEWnrWwrq2tLKxtLjA1VJCPi8nKS0qJy9DRUXRtLG1rqqtsra3vtVeS0I8Nzc7Pz5EZNvP +w7u3tLOztbnC31NEPC8pKSwqKC09SU7aubK1r6usr7S4vc5qTEQ/Ozk8QUZHV93Mx761sbW4 +t7nG+0tEPS4oKSwqJy5CSUnWtbG0r6qrr7S3vtZkS0I/Ojc5P0REUtXGxLyzsba4trrJfkxB +Oy4pKy4qKC9FSkfft7K1r6qrsLW4vs9tTkM+OjY3PUFDT9vJx7+1sbW2tLjF5FA/OjAqKSwt +Ki07TE/9vK+wsKyqrbO4vMbfTT8+OzY0O0E/RnfKxcO5sbK2tre9z1lDPDUrJyosKys1S2N+ +xbKvr66rrK+3vsnfUz88PDk0N0JGRFbPv766sa+xtLS4xHdJPTYtJiYqKyktPVZh27qvrq6s +q62xusDK6kc8Pz43NDtGSU3wyMC9trKytLe6wM9bPTU1LCUlLC0pL0n17cqyrK2trKyutcDN +021AOjs8NTU+Sk5d18K7uLWzsrW5vMXeTTkzMSokJywsKjJR4djAsKysq6urrbS/zd1POjc6 +OTU2PkdMYNHCu7aysbG0ubzJ5Uw3MS8qJCYsLSszVtXOva+rq6usrq+4ytzoTjk2Ojk1OEBM +YN7IvbizsbCxtrq9zl1DNC4tKiUmLC0uNlXVx7mvq6qrra6vudDj7Uw5Njg3NTpEUnvTw7m0 +srGxsre+yt5WPzEtLSolJCsuLzVPyr23r6qoqq2urrbO8mdHODQ2Nzg6P07908a6tLKxsbO4 +v8jdVEU4LiwsKSYoLzQ3RdzDvLWuq6usr7G2xuloTTw4ODc4PEVOadTDvbm1srK1ub7L2mhI +OzQvLSwrKi41O0Bazb+7trCur7K1uMDc815EPDw8PEBGTmfcy8C5t7m4t7vCytl3WUE5NzUw +LzIzNjxCR1zPysq9tre6uru/zNrxX1JKRkZOUVJo3tHNwr++vMHAzMzlWFtTSUA+PTw5PD09 +PktNXPLj18vDycnCw8/Ny9Xmd3BfZ2pmc9zY5dDKycrNztPWcWxcX1VMTVVNSUlJR0tIRE9U +T01XbH7l39PNysvNyczZ18/i6Oni4/ng387X1tjX7n9uamVfXm5sdWT9cHxfVlhKSkVHRUND +Sk1PW+zb1czNzM3KzdHP1MnW19bc0XrU9d9qX+tZ3Wln4vrk/9zl2nneXF9LTEk9RD1HPkVJ +T11j+NLOyMnHyMrJ0tDV2Nrl3vvbcu103fXq9N3d2OXj6d707m7rWlVTUU9JT0FIQUpGTUxc +YPLf28/KyMzMytjQ597d5N/99Gt49ejb2tjY4NXt8HJ2cHhjWl9eZmZfXmFVY1hZVk9VXFxd +aXFq+/r95+vi5d/i3t7g2PrX5NTZ3NvT19Xh5uru/Xf2dGZiWWdfWVdUaVtpWWtlamRrbmte +V15canb7duvmf+bk29ja0trR2urm3/Lt9OP64vf3ce9tZmxlbmd+an5rZmtv72ZrXl5fcGVj +aGRYYWJwbX7p693p2OLW3+Xufu13/XDyevh06fTddO1v3/Z74Wrva254aNtc3Wbma/HwWnFf +amtlallsY2Zq6vtt329xaf5hbtxd7edy7F3c4+Xb29P94X7e1Fz47dhsbudk1Wn173b9TmdX +dVZZT1tjWVZkYNpx/vnt0fb2edDy6OX/1e5w7O7ceO5q7mZ9+/F96+vz7+dq1FzV8m39W2Ze +bFNTb0xoVVl+Wdle097p12HeXtf0XOTucFnvY/zRdtTh1dZeyN7n4tn5cc39fONjbmdjR05T +Sz9IS01QZV1x19fVzsrYzNbv6dzyXn78YP7jX97Z5H7P0+bY3OzTadR759J+WvHzWUdKVT9H +PkJFW0xQ6tHTz8XHyMXOeNLfZl5jZln2eVnp3t3b19nTy+Pg2NN539Ly6Pb7WFRaREBRPjk/ +R0JEZvHfysLIvrjDzcjP9mxZSkdPUkhW/n3618zPxsPKyMTV2tLc4O1meW5KPz1EPjM1PkA/ +SFPiwMXEvLa1v8bFztdiR0pORUBDTF5l7tHFvL/Cvr7Ez9HP+HBcT1BRQDc6RDwuNEVBQlFe +zLy/wLmvtb/BwszkYUdESkA7QExQV+3PxcC8u7m3vsnJye1QUVxRPTk3NDwzKzVLRD1S07+9 +vLizr7TAxb/NXEtHQ0A7OkBNVF7cxr+9uri3tr3Dw8tpUVJNRjw2LzE8Mis1UUk9VMy7ury4 +sa61w8m/x1JHR0A9OTlCT09V38S9vru3tba9wcLH8k9bXkI4ODUwODQrME1IO1DMu7q6ta+v +srvHw8hYQEFBOzc3PEpPU/fGvby7trO3vL6/yH5TVVpKPDs4MjQ6Lys6TT4+88K5uLixrayy +vr++00xAPzw3MzY7P0ZR38q/urm3tre7vsHK61loWUZBPzs0Mjw3LTRIQj5gzr64t7WvrbG7 +wL7RT0E+Ozg1NDtAR1zlz762tra0s7a9xszmW1FLSkY/PTw1Mz84LTVGQUfvzr+4trSvrrK/ +w8ToTD89PTg1OEJMUl7Rvrq5t7W0tr7IzN1aS0tIREZEQUU8ND5DMDA/Q0Vf9M+7tre1r7C8 +wsLXYVJDPT49Pj9BTPbbzr+4tre4ubzH1/dXSElEPklMSERIRD5EPDZASz9FaubLvr+7tLS5 +vr/H31tKQ0JDPzxHZWNl0b+6uLq7ub3N4H5WRUdHQktMR05YTUZOVUU6PkRGVEtaycLMwrq4 +uL3Dx8vzS0hPQz1IT2Lp2M3AvL7Cx8XNa19STUs/PkhJTE1p72r1y9tL6tBSSlpNT21PSeDN +dXPMydvd6PjT11h1z9323NPVzcDj3r3sV+pcUmBNSlBlUkly319c1O3Z5Odq4N5HUGBQTEtG +TVpeX3Lb2Pzg3+HM3tzY1tXd0tHK3M7Y2dxoe2Z8eEx3TFZqTuPtZ9lc1ON63mfzUttIYeZH +akzpT2RjV9x5Z1rv31/v3OfN6+rfz9hfz+TbZe1h4t1dZuZyenRk2m3a3OXg42xtZ2RdTXVd +V+lTflrbUOhl/m74Yept1m56ylXfb/lZeHxr6Oxg01/Ueud33d/r/eHZ6+bv2WDiWF5q9FT6 +Xfls+mH5d2XaTdNP1VLUUM5V4Opb2vNqZfRjfl/2WuZZ6ubr1vTccs1o2WvYdnvSVNRVdE7V +VeZU017NYuTs+OFLyErOWeBvbnFda/RU+kxuZHFVen5g5eji79zt5NHhW9Bi1k/ebWXoXnx1 +2/l31fzZae7vcu9rdmriXmhX3/xndvdV3E7aU9NM9k/WVvveaNxm8fnvXN1u3917Z9td5+5t +ZNz7b9zq6mjaXOzm8k/ne0veZm5ZyEzW7nniX8xO0uhU3WhsY2h4WepTYOla33Ju8+fwZ+Nn +7+LsX+7e/WvY41jNaVnQX1TXaV7z5GXy0Vzy215rd95Pd/Na4OtZ8d5aUdp4SdvjT+rNVFzI +7F/b69Vr/tpPy1tKdsxJ79NSY8pnWNXJT17IaUzWcV5X2Vhf79ZsScL4UctmYcxObfXj52FY +2NFV6mZny0p2yEjRbWLcbmX+1Vpa+dz7V9boUNveZlPf1lxoaNvv83R14+9gb+Lfa3rY7ONR +2W1daN5bWNfdSeXTWerO81LY2E/n0VtB2NFLXeTSWerbcWbc81/p22pX3O5PyF9R089bTNry +b+Jcd9f2W3DaZ2N6Z2t+eupZbOPrXlv/4uR54dF2a9ZobdRuWdfWUGfq51tc32dwbOHhcuht +9WlufGZ4Zuh5Zu962e1SZNnbTPLPelbe31znfF597mFlWNn4X+zs52DW+HLn0vhl2N1h7mNi +0d9RatVnWXxkdmN5elpWb9p2XeHf62rybWba3Fx8395q791g2//kZ+DiWGrqam3wWFnV9l39 +e25i0OZl9uHqfHdt8/Bub1Dv72zx9HjV32ps2uVfbv9nY1145F9o2+ZX9N/o3Ol8997scPR+ +7GRr3O5wZ23zYlZ95vRfYNvcXH3w3dxsY2/3VnLkbP3oeGLu1/5f4fV81e777np34/VebXV2 +dmpt9vXsZ1n34l5q3OdxXej4a1lY7N3vaeTteuXz3ev61vf27O5vWvx8b+lZ+eRtXefaeO1j +VOzkZl5Wan3qXXjnZ+r052lk5dj27v/28W9y+9DoePDpd+XZXmzrfF5reVpkYvjiXV5q4flp +9393bGHl7e9979nr4P128Pjv4WZs22pN9NFvWfrkXF7z82fm8Wvk6Hnh63breF/v3HNdcevi +62tca9nhZV72cVlvb2lqcm/v+Xno6/Xw6OX6aXj27ft19t/teens9n7xcWJoZGD772Ve8Nvm +93zr9Hpua3tjd2pedXRvePni321r7OXn7f5jeff35erd1tPc5eT07HdmWk5LTE9MS09XZWtq +bvDb19jWz83T3djV2+zs29nc39fT2d3Y2er7aVJCPT8/PDg6RlNZXuDIv76/vr7E1OflaVJM +TE9OUlv/2dTSzMjLzM3O0djc2d3d3+Tj7Fc9OTw9Ny4vP1ZMTNq6tr27srG80NjTbkM6PD49 +PURa3tHMvri3uby8v8jY/WhhXFhRRj02Nzs2LzE8Tk5O2Lm0t7iwrrbHz872Qzk5ODQ1Oz9L +68jBu7Svsba3ucPZdGxfT0pNQzw4NDo5Ly43REhEZL23vLuvrLO/vr7RTkBDPjU0PUFCUtnJ +wrq2tbe4usLO1ehYTk5SSj8/PTY6PjAvOUY/Pl/DvcC7sa6zubi5yflZVEU6OT9BPERy3d7Q +v7m7vr68wc/d5fNeV2ZaSUVBPD07LzQ9PDc9WOXb0b2zsbazsLfGzs/sTkNBRkA7Qk9MUufO +ysi/urzCwMHK2ePnclRLTks+OD4+MTU7Ojk9T+bc0b20tbi3tbjAxs3lX1RMQ0BFRklMU2/f +1MvDv76+w8fGzdzwb1lPSkI/Ojw3NDo4Oj9JWHvayMC/vbq4vL/Cx8/adl5kVlRYWFtaYuze +3NfPysvNzc/Y4PP6Y01MR0A/PDs7PD1CSU5f99nNyMK/v8DDxcrS2ODyfGdlaF1aaefg493W +1NHQ1dDQ4ODe+2hlV01DQkA7PT49QUFNU2P23NHKxMLAw8nLytDR2t7ofn118fDq5+bn7/nz +5eDe5uPj73Z1bl5cVU1MSUFEQENDSldXXGni29DPycfJyszV2trc4O3e4+Xj4eHs5uDi5+jq +7+7k3N3j5Ov4Zl5TTExEP0I/QkJITVNf/+Pg0c3JysvKys7O1Nzc49nf29nc8W5vdv957njy +5uXg4tje5HVmXlJOSkRDQkFCQklLVF1+3tfQycjKyszO0tLX3NzX1+Pg3ujs6+71+ezl63/s +3+bh735iXl5TTExFPkNCQ0JGUVhj9trYzsrGyMfIzNDY2d7j4d/o5t7m7ezvenru4uz13+fl +6ufufm5mW0tMRz9BP0E/RU1NV2ri2MzJxcrIxsrNzM3W2dXT5Ort+nf+9HV08unv7uro5OTj +7nt2WktHST8/QD9AP0lLVGXd08zJx8fJxcjL083P2Nna4PXi6/L58/P+8PD6b+rf4OPh5/z9 +WllRQUM/PD09REJIVGBu29LMzMPAw8PFyNPV293n4+H2+/nx+/Ls6ujf2d3d1dnY3u9qV1RE +QT47OTo9PkNLWmrw1szKxsLGxsXEys3L0dfZ1+Py7fD6fO3p5+708ebl2dnk/GNoUUM+Pjk5 +Oz4/Q1JgfObVzcfFwMbFwsfLzs3V2Nfa5u/n7H578vbv8d/f4trc3+5oZVtHQj87OTk8PEBM +W2/m0M3MyMPFyMTGy87N1ejn3/Lv6Or19+Dg39zVz9DO0eRvWl9JPT47NzY4PDxCWXDp1cnH +xsHAxsXEyMzP1ODt3+D8/uro+e7d2drV0tfQ2Nv8U1ZMPj07Nzc3Pj1CT2D108nGxsC+wsDC +x87V1Nvr7/pkZGn75ebUzs3IyMjKz99sVEk9ODgxMTI2Oz1LXujSxL+9vLu9vb7CyNDW7n5n +X1xXYWd77NjOy8jEw8fT3WtTRDo5MzAyMzc4P1Ft2sm/vLq3uLy7vsPL1uZoXV1SS1FbYGnj +zsvHwb7By9LdX0Q7OzUwLzE0NjxKWefKv727tra6ubq/ytHZb1dVTkdLVmNp6MvOx729v8jT +2ls9OzkxLi8zMjQ+TVrhx7y6uLG0t7e7v8rW51lOTUdCR1BcX9nIyMC6vMLO0uFCOjoyLS0w +NDM8U3Tmyr26u7azt7i3u8fX4GJJSUpCRU9aYefNxb69vMXO1GtEOjgvLi0vNDU+UvbVw7m2 +tbKztbm8wM3be11NSUlIS1Vh6dLMwb29w9bfbT81NjEtLS81NzxU4djGubW1srGztru+zOBv +U0lCREVKWGnax8K9ubq+z+zgQC8zMCspLDM3OEzOxcC0r7Cxs7K3wsbOeU9LST8+Q1RgaMy9 +vrq1t73ZdPo8LC8uKCgqMzo7U8S9vLGrrK6wrrLG1t5aPjs/PTo+XOt8xbe4tLO1ut1RVjgn +KismJSkzPT9furGyramorLSytdVPUEk4Mjg9Oz59zci4sK2tr7K65kdEMiUlJyQkJzA+Tt61 +qquqp6Wqtrm89T05OS8rLjc9RuK/ta6sqaisr7fYPj0vHyAkIiEnM0VrzbKmpaemoqa2v8F0 +NSwvLSkqMkBM6buuqammpaiuus1BLy0iHB4hISMtQ93AsaWfoKOko6vFdFQ5KSUoKSgrOFjZ +v6+noqWnpaawxuM+KyYiHBwfIyQuSc+3rKSenp+kpqrCSTo0KR8hJigqMl+/tqykn6Ckpaar +wmE+KyIhHBodIiUqOsyvqqWem52hpqm0TzEuKiIeISotL0TBr6ynoJ6fpaeqtPg7LiUfHhsZ +HSMoLEa6q6egm5qdoqevw0UsJyciHiArMjpZuaqmo5+dn6arrrlkNSslHx0cGRwjKy5Guaik +oZyanaOqsshFLSckIiAhJjBF8L+so6Cgn56jq7W80jwqJSEeHBocISkuPMmtpqOem5ygpqu8 +XzwtJiIiIyMoN2fLvKuhn6Khn6SvvMDiOSkkIB4dGxwiKzE+y6ykop+cnJ+psbvpPCslIyIk +JCg1Ycu8q6CfoaKgo627wc5FKyYkHhwcHB4jLDpbu6qin56dnaGqssNQNyoiHyEiIik+1r+z +pp6eoKCfpLDAyXQ3KiYhHhwcHB4kLT16uqmgnp2cnaCqtcVPMCkiHx4fJyw4erWqpZ+cnJ+j +p62+a0I3KyMfHB0dHR4jMEJfwaugnp+dnJ6ns8H8NSckIiAfISk6YsqwpJ6enp6fprDA2Uw0 +KyYlIBweIiMiJz3mzryqn56fn56hrL7YTzMmISIiICQuQvG/rKKfn56eo6y4xn49LywoJSAd +HyYmIypNyMS7qJ6epKSfo7LXYk4xJCEjJCImNE/Suqujn5+foKatu9VSOC4sKCYjISMmKSow +RtS/t6ukoqSlpqm1y15GNCklJScnKS5Fx7ivp5+foqanrL19SkE2LisrLComKS4vLzZR1c7A +sKmoqquqrLjNbEw5LioqKystOFHNurCqpaOmq66zxV5IQjwzLzM4NiwrOD8yLD3Q1lLesKmu +ubGqrsTn2uo9LSsvMy0tPNG/xLaopKiuray22lRiWz00PEM3LisvNy8qL0JmVVq/rq2xsqup +ssfa2lk2LS0yMS0wRdzEv7Wqpqqur6+521lhZkc5PUI+OzIuOT8zLC9Pf0RGy7Gyvbisq7XO +zsxfOS80OTYyPeDEx7+xq6yxs7G3y3ZtbEo+Pz9APDAyOTsvLDtJPj5ZzLy8vLOsrre9vsVs +RD5APDU1Q2ds7MC0sLK1s7G4w87T5VRDQEE9ODM1NTQvLTM5Pj9D0Lm6vLStq6+8vbvPTEA/ +PTk2O1J278u6s7O0srK3wdPZ+E1AP0A9Nzc4LzdHLi5HTUVRXtO3vs64rra8v8TBz0xIXEs+ +QExs3d7Mube7u7u7w9l+cFNAP0RHQkZHUFlEPkRBPEE7OkdQUGTZyLy7u7WxusLIzuVUSklO +TEhS483Nx8C8v8nIztz+UEtJR0NHU1ROavpm3tt5VmdMRD83Oj4+PEhh7NLJvre2uLi4u8fR +4WpUSElKTVFm6dnIycTCy9D29lNWWUhGV01HU1dOZGpV8+ru997k+fdhaFpYSVFWTU9UXG7j +8NfQ0MrMysvGzsrQ3M3g9n98bF1wZ3T1Y3Jq+lxpX29sZW1veWprYnBebVxp8Fv1ZG5fZFpa +eVxrZHZyf+nm7Pdy9d/86N3W09/T4tPc6djv9flr/ul37ubo/erue9p27+9naVhmUl1TWXVV +Z1tqWXV1dmBvXvtmYGf+eO7q6evj++Tf6O/s5Ofp7PHn3eLV1NrX1trc4ux7ZWJcU1JWXFxd +Z2997H1x6XtkXmdhXGJfXmZgXWt+ffby5+Tj6/Ln+fB+7tzg4OLZ293c4drg4+fg6fXvc2ls +a15fW1daWWNcaWp3am14anZsb29gYGVub3Tv5enf3eHa29zh3t3k3+x9am5tbWprbnDs5+/t +9f7vbGtubW5ncn5+fPPq7ffsev32YmJiZF9kbnls9ebx5d/i7t/e5/JvZWxrW2zvcGVre3Xz +9/365+fs5N3m7erd4+Hq53j2aGZjW1paWmN5eG54dXns4t3g6+vzb2BoX2FkeW5zZHHv9fT8 +8erp4+3x6uru9e5n/G3/9+Z15e/vbH384ujtbX1u6mn2/u5UYF1pYF9ifnhhanD1bGJsdd9/ +5PXl8er33drg7ejvdvXvbfP8+XxseHL6YvR89uH38vpqYlteXVhmWflr9e3Z2uvU5+hz63H1 +aH/seWdeeGFwYGVfX2hp8ffr8eXf3ejq7uze7X1w+m1rc/b++fF1bf13XWJfY3Xv+/To8+3q +6+327XRxZ2FnZG1rd3z48fjn3d7f5/J6a2pqcGlvbWZoYGRdYm5sc+7m6uzt7Ori3dzf3+rt +6uxxcWtfX2RnaG1zcPz07Ovn/XZ1fXh1fP3++3VwamlqbGZjaPd9bGdx+/vn6+Tk6eXyeHt4 +enp5ffXy+uz3+/Du8Ozv9f3+cWxsampnam9oZGh1cXl+fnv//vP7/fHm3t7g5+78cHL3d3dz +dGtra3j7dHl8+fz/fnr9dG90+vp8d3f+eP339PX/9355d/nq6+ri6OXg4ub5d29maGtnZGZl +YWdpd3r/8PD3+Ovq6+78e3n39H9zbXZ8+vr0+3v5+ff8+e7o8Pfu6ej+b3NraXz1enH9+Hx1 +/u/z+X59enRveHx7+u709/52eHV0evv2d3Bwb2939flxcv317uXk6eXq9vr5f/r4e3j97+vr +WXnUa1555ml5e3rxdHJvZmRmb/H1+nVzYlRET727ztnQ29bbWE9MSFVxSz0+X9DL0M3Dw8bP +zNH4U01PUE1JRUXVzXzj2eXczd/x8Vtbfuzpa1pg9t/p+Vpl7fb9b3Ts3+v883RnePd89+5t +b+/z4tHLztXU1tbpU0Y/PDw7PEBHVOHJvru7vcDByNxTQ0FFR0pMVejKwL6+v76+wMnXdWn/ +cWBLPTcvKi00MTRAWcizrayrq660wGE8NDAuMTM5SHnHt7Ozsba8w9pURkA/RlBy08S8t7W0 +vv5CNCcfICYmKz37taaioqGkq7bZOSomJCUpMUHctKqnpqiss8NYOjIvLzQ/Xcq6tK6rrrna +SjYrIx0fJyw2X7uqoZ+ipau57zkqJSQmKTFGzrGopqiprLXIUjs0MTE0PV7Ju7Wyr7G4v9pL +OC0qJh8jLzI94b6upqeqqay73UczLi0rLTdG7b20sa6tsLfGa05FPDw+RWHYxr68u7u+xcbX +U0tCLikkIywwLjnZuK6srKimrLnQXD8zLCstM0Zk37yvrK2wtLfC+0xGR0M/R1zhzMzGvb7N +Z1FfWT0uKi01MSwvRd/Kxryvq622u7/I4kw+Oz9DRFTaxb64s7S5v8/E+UVcOTlHRzhGcm9a +VcLwP7/POd7OS1PpVWzZWXnhbXJfefhseXl6bXV9/+7mzM7Uzs7L0NnX4GtobFhcaVVUc3tu +5fbs2dze83D2f1lTUlhqX1pldOzp7v3z4OtubGFiaFxYXF52++7X1dbZ39/nefjudXP9am1w +fXRy3trW09jd3t73aGNpY1lcWl54/m927erj9Wl1Y1lbT1NpWmN5dufY1tXd4tvk8vZraGNa +aG525enf0tXV1tfX6n5rZm5hWVtdafxsZ2xveGdcZmdfbHD76+vn6+Xf4+5sZHBqX2pmcu3u +5t/b2+To72xoZl1pdmtx9/Pk3O3q5+bscWlkXVdXWVxz493b0s3R1+V3XltVS0lKUVZc/Ofd +18/R2NbefGhqZlxdYGZ09ujn39zk3trc6vl0eWxfX1tbX2dqfe/g2Nrf5/BqWlNSVFlaXXP3 +9+Hc3d3a2d7u/nJiZmZiZ2Vu9fXw6efo7Xxxbm5xbXd2d/js49/a3N7ub3NsaGhoZ2BdYGVl +bfn17/B7eX51enl8fG1tdHJw7uHg3uDk9Xz+eXV//vvz9fx4eG9qb3FzcHZ8dHNrbnFz/3Z+ ++fvr397i4+1xa2RqZmNqZGpudfXz+Hz473pqaHNvb33x8O7t6ebr5env/Pv+e3RnZ2Joe3X8 +9Pjs5ez8dXT9bmpvamVmZmNmbfTq6+rs7O/5/v7zfv7+fXZ29XdtaGx0fu/p6Pj58Xl7effv +7uXo7/PzeXJrZ2dmamVbYGplYWhvcHvy6ert59/e4uLveXrw6vvw7O7n4/F0/nhoaG9rY2xu +bGdnb21qaWNXUM/SP7/d+/nScvrdWehnaVX3WuxT3Xrf71x14cnudNzY1mbe0V59Vn1420db +4U5SVN/+a1Fl2HJt9tjk8G3Z1PpaWGXOeXxN/c1v2du/9vr363NOS1NzTURc9uXl9snE7O14 +0/VTZNfyWVp18etKetx/bVfY9+JP1tTve/Hf5179e/1+ZF1tZfzxYN/p/d1j217cT2vdTmdU +0VB3aOHnfezZzl3Z9Nr16tdu2VPTVtVtYXhp5EvWTd9SX+xq3lzh7fH6aefk5ln+cn35bOln +zlrp72/kXuHpfGJ45OzwZeLy32TefN/6WNdf3VTUeP7dXMx8a1hrbVReW3NTV2H1eWRo2tZW +2d7P39/l3slZ1tDX2Nnb28pd3815+el95dJEN21IMjg5OkA7OPnNYNa8uLa6uq+yxMq/yX5P +SmpfRk3b0uPRyr+/03tHSkg1LCwyLi8vOm/v8sSxrrCxsrK1yuTVcElAR1BeXFvPzM3MzsjL +2vXc42xsTUxUT0M/Q0JBPT1DT1Zc+dTIxsXIxMTKzNbdfe7sfPdydu/Z3dvf29vZ1dnX3t/m +6uByYFdUSUZCPz9AQkJJVWDw287MyMfIy9DT2+VtZlpYXGV5eN/Z1dDOyczKy8zLzc7Y3/hi +V09IRD47Pj9AQ0ZJUF1r29XS1Nbc6uXv8Ofd1tfW1szLzMjHxcjLztrf4mtnXVpVUlZOTUtL +T0lISEpNTlBQXWz9f+nU0NPb1NHW1dXU2NjW0tLa4eng4vF79O/+b2dsdW9memplZVhdXltT +UVFTWllZX2hqfvXt5fL8+m1v9eXj3trY2dnW09LY2+Hn7vtwamdq8PPp4t/d4OHv9nBcT0lF +RENFRkdMVl1y6N3V19fW1NXV2dzc4t/e29vf3d3j7N7b3N3e3uTr4t3n9WRWVFJJPz9BQD9E +SE1cX27ezczNx8jM0Nrb3Ot/4t3u9+fj6Ozg1dbPysrLxsrX1O5OR0c9MTI0MTA1PUZZ6cq6 +tri3tLi+v8PgW09JRkVFQ01de9DEvLm2s7W4ur/bRzw4LCUmKScnLjxKasq3rqysqKiutba/ +fEpAOTUxMTg+Ql/GurWuq6yrr7rNTjsxJyAjIx8jLjY/1betqaajoaWrrrTTTUQ3LSssLC83 +ROrCtq2pqKapsLfOOzcuHh4jHhwoMTJburGooqGenqWqrL9TSjcqKCkoKjA7V8y5ramopKKr +trV1LDArGhshHRsrNTrGsaqgnp6bnqiqrupBOiwmJSUmKTBA8MKupqWkn6Kts7pCLC0kGBse +GhwqND+/raaenZyanqaos10+MyYhIiEkKTJJ0Liqo6OfnqKqsL5AKikhFxgdGhooOD6/qKKd +mpqanaWqu0o3LCIfHx8jKzZYwa6kn56dnaCns85GKB4gGRIZHBkfPVHKpZ6cmJiZm6SvvEss +JyIdHSAkKj3Vt6mfnZydnZ+puOk4JRwbFxEXGxsgP9S7oZqZlpaanKS66zomHx4cHCAoMmK5 +q6Kcm5ucnaSuxEQrHxkYFhEXHR4p4barnJeXlpedoq1eMyoeGhscHSUzULqon5yZmZudoam/ +QTMiGRgXExMcHyRCtamfl5WWl5uirN0uJx8YGR0cIjprvqadnJmYm56iq7w9LCQZFRcVEhoj +J0CxpZ6XlZWXm6Sv8SsgHhkWHCIkN8KupZyZmZibnqay0jcmHhgVFRQVHSUt3amim5SUlpid +rMBCIR0bFRceISl+s6mdmJiXmJ2jq79CKx8aFhUUFBsiKkqtoZyVk5SXm6e+TCYaGxgTGSQp +OrOmn5mWl5iboqq5PykiGRQWFRIaJSpJqp+clJGUl5upxkYlGhoXFRojK0mxp56YmJeYnKSs +vTsoHxgVFRMUHSQr46eempOSlZedrdQ5HxgaFxQcKzBkqqGcmJiYmp+or9QvJB0XFRYVFh8q +OL6inJeTk5ebpcRALBoXGxgZJDdLtqSfmpmbnJ2otL5HKh8ZGRkUFR8pLf+onpmVlZaYor5P +Mh0XGhoaIjNctqegm5mdnp+puc5PLiAaGhwYFh0sNlKvn5qXl5iZn7s/LyEXGBwcJjh4tKOf +nZqdoKStvt5LLyIbGx0bGB0sPOizopqXmZucorc+Kh8ZGhsdKkfHraCenJufpam01Ew6LiMb +Gh0eHB8sR7yro52YmJufq8E9KR0YGx8jMFu+qZ6enp2hqa7CWUg9LiUeHB0fICMrPMiroZ6c +m5ufq8w3KR8bHSAmOsy2qaCgn56lrbfOU0s/MiojHh4fICUrNFK3p6CdnJ6hp7ddMiEcHyQq +OmXGraSioaGnrrfOW1NOOjEsJCEhICMqMDdfu62knp6fo6u9azopIyMkKjpfxK6qqaenq7C8 +4E9GPjw+PTgzLywtLzE2P05+ybuzrqurrrfD6VBHQ0RMWG73eHb56H9iVUxUX2fnz8O6tra5 +v9NZPzQvLSssLzdDac+/ura0s7a7xM7eZFZPRz8/Pz9FWevNv7u3s7Kzs7fE7kk7MSwqKisu +Nj5R4se8ubi2uLzE1HFXTUxPUE9PUVzu1MnAvb29vLy/yt5kT0Q+PDo7Pz9DSlVv+nvu7vn1 ++311cWRdYGnv3tfV0cvIw8DAwcLI1eRpVUtFR0ZLXvHa1tve625eUUhCQUFDR0dKUVxv3szI +xcC/wMDAwMPK4WVQRj8+QUVNYeXOxcK/wMjO2O9ZS0ZCPz9BRENDSVBectrLxL++vb3DzeFd +SkM/P0JLXubPyMK/v8HGzNv7Y1tWVldVUExJSEdGR01RWWnj1dHOzs7afV9UUlBb/uXYz8nH +xsbJzdbn8WxdZvfh3tze4e1iU0lDPz9CREdMT1pqcW157Ofq4tTNycfGxcjP2Nvld3b47+3q +3dzW0Nja2Nz4ZE0/PDo6OTo8PkZNXN/Iv728vr/ByNHY33dgXWFsZnHr7fzNwsjMyMjO2d7c +bEE2MS8vMDI2OT9N2761r66wtrvBydh+XE1HR0xWa9zX3ufn0sPH82rZ0d/0bllKQD09PTw7 +Oz5FWeLNxsG/v8PIycrO4nd87+Xf7G9eYGVy6uTe3NvSzsnEw8rpVkpBOjc3NjU0OD9S8tbK +wL7FysC4ucrb0MnM2vxeTUlR/Nvi7drKv7m5vsb+PDM1MiwpKCotOWLBubexraupq6++8E5E +QD05NTQ6SffJvbm1sq6tr7O8yGw+LygjICEhIygwRsuxqaOhoKKlrLfaQzErKSgqLTVF3L2v +qqakpaessrvG90MyJx4dHB0fICUvT7qnn52cnZ6iq79LLiUgICIlKzhpuqymoZ+goqatutJf +SzsvKSEdHh4fIiUtSb2roJ6dnZ2gqbxGLygiHx8hKTdaw7CqpKCfoaatt8XqUEM7My8qIyIi +ISMmKznUtqijoZ6eoKey9zwwKSQjIigvPFzCsqmjoqOlqKyzw+9RRj41LykiISEhIiUrO9S5 +rKahnp2fqLLRSzkrJSQjJy41Rsu2qqOjo6Kkqa/C8FhFOjItKCMhISAjJSs8a8Svp6GenqGl +rbzZRTErJyUkKC42U8azqaSjoKKnrLjM9k0/ODEtKSckJScoKCwzS8W0rKekoqGlqrLC7EIx +KiYlKSotPGHEr6qmoqKkp667x/RANzAuLisoJiYpLC0xOlPOuK+qpqOkp6y1v9xINSwoKSwt +MDxfwbGsp6Snq665yfs/OjUvLzI0ODk5PT9ARUx6zsS+u7u5u8DOdlVMR0RDRUpd69rLwb25 +ub6/w8zQ6lpPTElIR0ZMT1FUT1vm6Xbq3drX3PZiVEtGQz8/RUxVXnrcz8rHxsXCv76+v8HI +zdnoelxPTEtNUFdmeejc3t3h82paTEVAQENAP0JHT2H77OLX0s7OzMjGw8PExMfM0t/1+mZY +VE1PWF1p9NvLx8fHztjlXk9IPz49Ozw+QEdMWGzv3NbPzc3KysrJy87T3+/o6f55dHb36uLg +2dTSzcvN1Nzqb2FXTklGRUNAP0FFSU5VXGb+6t3W09LS193b2tXU2tzY1dLQ0tPQ0tTX4fPw +9v9xY2ZtbmdnYV5iW09KRkVGR0ZJTlheYW177t7Y1tra08/Q0c/O0dHPz8/Q09TY3+zvdWJf +ZG/75+15a2FcWFBOT1NPS0pLSU1UW2Ft//Ls59/a3N3d3NjZ29bV1dXV19vf4dze6eDe3+bj +3uP6aGJZVldVV1paYGhmYF5cWllXV1FOUlZdYm/26+Pe2NTW1dLS1dLOz9LT09TY2+f6b19a +VVRVV1xha2959ujo6ubsb2ZgWVNSU09PVlxhbPPp39nY19bW2t7q+21nZ2FfbPDn4ebr3t7c +19jb293k+XdsamZgX11dW1teYmRlbndydnxza2tyeW5saW54bGlqeXx69/Dn39nb2dnc3uPu +fP/o5+np7vp5cm1sWkJWuFk9wslN9c5q22ZIWltGX09F4F3j3HrbztvO3dfbW9pNbWl65Fje +V+PFU9PL7MfLy/W/vWrOzk0+RDswMzAuNz49U9HMurWysa6xu7vI9nhLOj09ODxOTXO/072y +s7W1usTF0EczMi4tKCMoLzc7QOW5r66tqaeorrzG0m1ANTEzNTQ2QG3Pwriyr6ytsrO4w9NU +Ny0pJyMhISUqMz5mwK6mpaSio6aruM1lPTIuKSctLzVF78OzrKqpp6itsbnQWD8uJiMhHx4f +ISo4TdKwpqCenZ+hpa2+Xj0vJyUkICUuOE3FtaujoqKgo6iuutpCOC0iHR0cHB4fJTNfw66l +n5yanJ+kq7lmNCkjISEfISs5X7+vqJ+dnZ+ip6253kAyKiEcGxsbHB8kL07BrqSem5qbnaOr +uPs3KSMgHx4hKDRXw66ln52dn6GnrrvaRDAoIBwbGxscHyYuT7+upJ2ampqdo6u3WTAoIh8e +HiAoNlzArqSenJyeoKevvP0+LygeGhoaGhweJTF5t6qhnJmYmZ2lrrtMLiUfHh4eIis+1rWp +op6dnZ6kq7XFVjYpHxsaGhkaHiMtTb2soZyamJmcoqy+TzAmHx0dHyMrOmy7q6KenZ2eoaiw +vvk9LSMcGhoaGx0gKT3HraKdmpmZm6CsvU0vJyAeHR4iKjvpuaqinpycnaKqsL53PSwgGxkZ +GRsdIS1NvKifm5mZmp2jsN08KyMfHx8gJzFOwa+oop+enqCmrrrPUjYpHxsZGhsdHycz+a+j +nZubm5yfqsBGLychHyAiJS0+2bSppKGfn6GkqrbKaD4vJR0aGhwdISYuSrqon5ybnJ6gqLhb +MygjICEjKCw3bruspaGhoaGkqrLC7kY0KB4bGxsdICYtQcCqn5ybnJ6jqrh9MycjICIlKS88 +6birpaGho6SorLTFc0QzKR8cHB0eIigvRMGqoJ2cnZ+lrr9YMiciICInLTdNy7WqpKOkpKer +r7nOYUMyKCAdHR8iJyw1UbuqoZ6en6OptNVCLiQhISQqM0flvq+ppKKkpqqvt8XcVz0vJh4e +HyInLjVBzq+ln56gpqy1zkozJyEgIik3Udi6rqmlo6WqrrbE1XZIPDUrIyIlJys2PkrOtauj +oKSqsL3yRzgqJCMmKjl1xbatqqelqK2zvdJtXko7NzEqJyssLjlET9K5sKunqK+1wWY/OS8p +KCouO23GuK+srKqrsLnGdE1NTU1HPjo1MjU6Ozw/Rl/KurGtrrS7w9pYQTUuLS81QGDPwLq0 +sbGwtL3PbEtEQ0tZ6+hhXFNGQEQ+OTo8P1vLvbi1ub/Cx9xhSjw2Oj9KadzVzMS/vbq9xM3d +c2RgVUpJTV/Pv8LXa0k7Oz48Ojo6O0rgxry4ur6+v8G/yHJKQT0+SE9SV2bpz8K+vb/H1N/m +cVxUTUhHTVr2z8bQblNDOz0+PDw/RFTQvbWvrrO4vcrlW0E2MzQ2PEpe38e+u7i4u77F0v9X +SD07Ozo8P0FGVu7Ov7m3t7e8zvRVQDo2NDM4P0/fxLy5tbW4u8DO/k9FPz08PT9CSFj92crD +wsLDwb69wdJhRDg1NTU3OjxDYc+9s66vs7e/z+tXRj47Ojk9Qkpb9+DPyMjIy9Pe4uPn8WhZ +VlhbZ+7j5ujo3dbNys3Zd1xVU1RTU05NUFljZmZiW1hWV1tn9uTe4OXaz87O0Nrj5uXh3t/e +2MzGxsTFy9R2STo0MTAxNjtFXOLLvbe1tLe9yNpqT0U/PTw+QUhWedjNx8PAv8HEyM7a6mdW +T01LTFNcZvTc0czIytf1VEI7ODY3O0FKXd/Mv7m1tba5wM7oXE5KR0VFREVKVHXazMbCwsXL +z9PZ4uzzb2NXRz04Njc6PkROZdzLwLq2tLS4vcfYaVBGPzw5ODk6P072zL64tbO1uLvAydT5 +VElEQD9CQT89Ojk5PEFMX97Lwr25trW3ur/M311LREA+PT5CR1Fz1cjCvr2+wcbL0d3qfmdf +XVxeWk9MRz46OTk7P0dTfNXGvLe1tLS3vMbbXEg+OTc3ODk/SVbhx7u2tLO3ur7EzNt6XlVO +TExLSUhBPDc1Njg+Rk5r08O6sq+ur7W/02RLPzk0MjIzOUVsybu1sbCwsra6xNdjSUE+PkFN +Xmp+bVNDPj06OTo7PEhoz7uzsrKzt7y/yOZLPDYwMDY9R2DZx7y1sK+wtr3I4GdVTEZBQ0xl +3dryTzkyNDMzNjY3QXjCsKqrra2vtLnGTDEtKiouNDlEc8azqqeprLS7v8rrSzw3OUFMU195 +aFVFOjc0Ly8xND/6wratq6qpqq631UE3LyorLC01SN27rqurqaqtsL3iTT45OTo5P01e+dno +Pi82NS8zNDA86sK0q6ysqKuzvOA+NzUsLC8xP9jBt66sq6irtL7XT0Q+NjQ1NDVH7+nvVDtG +ZEA9Pjg7Vm94xb67r7K6u77L1/5EPUA8QlNg0r+9vLq5u7zE32hOREVBPT9ISlvi7mJv1d9M +Pj09PTw2O1BZfMnKxbe2uba7w8DKZWJfWHFcT1zf0NDP3dnN1vNrWFNZUklMT1BgZ2Ju7uvu +2k88Qz8+QTw+T+7u0MfDt7a8vsLGzNtfU1xaZ2Zabt3Pzs7P18/O5GlcWFVPSERMSUpPVltX +WV5senno3Njk9e7o3t7ucF1iY2BfXnjyfPX45tLPzszO19PM1drV3nxpb2BcV1dYW1ZVWVxf +bG9udvDi8f729HdkYWJnaFxUV2R88Ozw6tfR19rc6d/l/334fX5yd3d45+Lp9ejn83JrZl5e +YW53fvP5d3F86uff5vX8Y2hrYl5jZ3zn7eTm6v1xa2dfXVxhX2Pr6O3f3dza3+zo7vJvZmNp +cXr09O7n2NHS1OP7bWdqV1hXVVtjZG7w/fD0+/twa2VuaWpfa/z45vr47+jv7eTmeXVvbnz9 ++ufn/uTd1tvm+e35cGxlXFhdZ3xt/+bi7nJ9e29wbWx6/XV95env7Op9aF1YVFNZW2l5dn73 +6N/S0dXT1t3f5fN2bmFmZmdr+fDs5u71/WhhZGRiX19eYm98cv767+fs73t+cGhwcnBue+Xl +4eHd3N7h6u1ybWxdXF1nbWxtc35z+O3p5vF+dGpkaG778Onn8vLu7e59dX58+Xtob/5v+vp5 +eHF4eXp6dm1qa3J4evr58v589PHr5Ono5enu7XZpbG58fHVtbGtrdHpyfPb2+nNmbffx7Obt +fn5zbm1pbnNvcXv87uvw7uzt6ObyeXj8cG9vcm9t9Ons5+j57v1tbvXvfmZeX2ZtbW1panvn +4/Lu7/z98vj/+/1++/T4+vb09PXv9fj8eHJsenx0enZwc29rbvbz9/Hu8vHo7vLr7vTz8XR+ +/GlpcGtpefltZGludPHr5+Xt8fDx7OXi6fn/cW39fW5wcXVxcff6b3zs6uzt/W1nZGNhXmFq +cnP26Obx+O/p4t7e3+Tq6/l0cXB/9HJrbG52/nJoam96+ndtcvbt/nZ+8f76fnJx/Ozt9nx4 +/fd9d3V8//58dXnz9/v89/Hp6fn/+n559fB/b294e3d1dXd2e3l9/Xb793x4e/l9df7z/Hj5 +7/T2fnx4c3h6c29+fvzw7e79fnRz/fN4an779u7u/Xh2/ezt7u3v+3Jtbm9yf/R3bm93+P51 +bmxra3P9emtv+vPy6uZ3YdXZbmT36ujlZl302HNn4ttmX+VxX2ns725fV2FkUExyxs5LQ7mz +RDq9r1o46LZ4MWO4dDVSvOU+Vr/KRGG/1EhfxflKXtZrRVzXYUhmz+lf/tjYcV7b0/1Y49Zq +W2rT91ju2OFt7O7k/Hv5eXT7b2v+W1jrfFhs4+xmZuLhbfrtem/58+7t9+Xk8mdy6vF5c+Hl +83ju5mtx8HtwaVlqdVVi9FxhZFdtblRk6mtb+9LgfNrM2t/KzNjY1tLa3dbX4erZ3NrT4UJd +3C0xSC4qODkvQWXk4cawtLOqrbOvsr/M1PVRSlBHQ2Bsa9PC00XOzi00TSokMy8qN01fbL6v +ubGnrbStsb7J1GpDSFA/ReD7ZsK8wLzBw+VJSC8qKyYkKi0vQVfKu7WrqqqprLC1vtdaTEk+ +PEZKR3XPyrqysry6vV5CQC8lJyUjJiwyOVfGvreqqaypqa2zs77qblg/PkVEQFLf2ci5usO2 +zk9UOi0pKyUkKS4wO/vPvbCrqqmmqq6utsza9Uk9Pj07Pkxj8ca8vr62xmLlRi4rLCUkKi4v +OvnUwq+srKmnqa6ut8zaXkY9Pzo4QEVM5cXDuLi+utRkWzotLSsmKS0vNknfy7qvrayrqq60 +tb/bZlY+PUA9P0hPYNHGvre7vrzZXlA4Ly4rKSsuMTtR4cq5sa+trq+yubzI2O9aS0hDQkdL +V3rYzMS9vcnBxFBKRjQuLiwsLzc8Ru7Nx7q0tbOvtru8ws3f6G5VVlFITllf59bNyL/C08XT +TUw/NDIwLi4xNz1D8tjWwLy6uLa2uLu8wcrL331rVVJUT1ly5s3JwL7VxMlKUEk0Li8sKi0v +NDtY1s69tLWzr7Cztri/zM7dXFlgSUhYW1j2y87EuczVu2o9TjkrLS4oKzA2PUvOx8KysLSu +rbK1tr7M1t9aR01EPUhRU2XQy8e5u9zGvkY7SDQpLS8pLDg7Q+rFwravrq+vrrO7vMjleFtF +QEI/Qk1gdtrGwru3wtnF2zs2PC4mKy8sLj1OZs28ta+urq2utLu/z35bR0BBPz5GVWnx28rB +wcfAx9xoV0E5NzQyNDc7Q1H+zcG8ubW3ur3E1exuTkhJRkdNVV5359jR0s7Mzc3Oztbi6epu +WVZUUFJSTEtNUVtcXF9iaWdkXllfbXzx6Obc09LQzs/P1dna3uPf2uL57Ofh6vDteXBrX2Be +XmljVFBTTktLS0xSWF5y+/Dd19nY1NjZ2dva3OHq4tzc29ja19Tb3OH3eX5oXVdVU05OTUxN +TE9YXGb35t/c2t3f3Nfb5ufv/u3c3dzb3+Dl6u91cnRoZWlmZml0bmJfXWJfVVlgXWT/7uvl +39ja2tjg4t/m+H52a2d1cmptcXRtbXH06/916Or+/nduYmp4a2VmaWx88ung4ODe4N3d6Ptv +ZGRoaWhka3BpaGlscW726O7p5Ofp7vp8c2tnZWVjaXh7fuvj7O/u7/X59H747n1zf/X28PJ7 +ePjp5/R8/PP3bGJiY2JfZmtsZW5vdfDs4uLq9f1ybG50amrz6urq39vc2dnh5+z9bGNjX2Je +Wl5iYU9PzthLbsfcXXrT63Ne8v5kXV9zamZP58bV6tXN29ne5+p3WVtdY2ZlX2JjXWBhaHR2 +dXF8fnL55O5sa+fof+/g7vnr4dzc5ebm4Oj9bWhqYmVWSFXd1W9ba+Tb3t3rXVFWX3ztd/zi +39/Qzs7P1NTec1JJQT5BREhPWW3f087Jx8vN0uZ2Z3r6aGVsam9/593VzMvGw8TEyMvaWD00 +LywtMTdCUf3Lvbaxr7K4wd1VRD8+Pj9ASU90zb+5uLu+xc3SzcrJy8/WdU46LisnJysuOlPU +u6+rqaiqr7nTSDcvLi8yNjxGWtC7sKurrrK6wsvZ8HxqXlRDNCsmJCQoLzpXy7etp6Oho6my +y0gyKykqLC4zPErovrCrqKqtsbvH1vBlY2VeU0AyKiUiIykvPXm/sKmin5+iqbTeOiwmJSYp +LTA6S9u4raejpKitt8bZYVBPUVdOPjYrIx8jJCo9UMeyrKWfoKGkr8VHLicmJigsLjQ/acCt +paCfo6qxv9xbRT05OkFNVko6MSwnJysuO2DTua+uqaaoqq6+30czLispKSwvPH6+rqejoaSp +r7/1STw4NjY5P01q08xdQTcrKSwuN0lMac7AtKypqKmwwHFANC8xMjc+SfW+saqmp6qvvM5q +Sj43Mi4uMTlK8c/CvsTlW0c2ODg0OTw7R+rQvbe6uLe8vL3G0/hSSktX8MrBwcHGycnL0+Jc +R0I9PUBGV19y3tzQysTD2kk5ListLzM8P0Nn0b6vq6qrr7q+xdfb/0tDPz1GX+DOx8bLzMfF +xMnabFFHREI+Pj5ATVd02dx6UUc/OTxIRkpOS1ThxbevsLW6vcDEzO1RRUFJWHDk187Iv728 +v8vkXk9JSEE7OTo9RmLZydxWRDs6PkNGRj5AVuPFt7a2tLe3trnC0WhNS0tNU1df6M/Evr2+ +xM7X81hEOzk3O0NTWUw/OjxCSlFNPzxEWc+9uru8vbiysLO8z2xTVFVXT0pNW97DvLu9ydbd +blNHPjs9REpIPTUxNDtGTU1NXObIvbu8vb26tbK3wddeWV1WUEtKUOvGvr/Iz87P1d1dQTs8 +QEtUTj41MTE4PkRDQUdny7mxsrW3trOytLrJe1NNSkpKSlB21MjDx8rLztPmWEQ8OTs/Pzw3 +MjI0OkJKTV3eyr63tLW2trW1trrC0fheW1tPR0pZe9XJxsjLys/c+FtIQD89OC8tLC0xOT5D +TFvQu7GurrG0tbW2u8hwTUpMTVVXVF32zsG9vr7Ey9Hc/lRJRkc+MS0qKSsvNDtFT9+/s66r +q66xtbe8xelSQz49P0NETGfUxbu2tbe8wcvV/1tUSDctKSYmKS0wNTtM2LitqKeoq6+xs7nJ +ZEE4NTc4Oj5DT+7HurOvsbS5vMDJ2HVNOS0oJSQlJyosMj77vK2npKSmqauvt8dvQTUvLi4x +OEFU6Ma3sK2srK+0u8bS+E88LygiICIkJysuN1LFsKeioaKlqa2wu9BKNi0pKSotND1M2L6z +rKinqayxt77L/0IzKiQhISEjJiovP+O7raejoqKlp6uxv+1CNC0qKiorLzdCbsGzq6moqaut +sbnEe0M1KyYiISEiJSkvPvq9raejoKChpaqxv/VBNCwoJygqLTQ/ZcW0rKmoqKqsr7fB4Ec1 +LCgkIiEjJyowPm3BsKmloqKkp6uyv+BJNy4rKikqLTM+Wc+8sq2pqKiqrbS+2FQ/NCwnIyEi +JSovOkzYva+ppaOkp6uwustvRzoyLSorLTI9T/bOvravrKqrrbG7yONVQTctJyUkJSktND9b +0r2zrKmnp6mttL3PcUo8NS8tLS82P1Ply7+6s6+tra+0vMngVkM6Mi0pJygrLzc/T/DLu7Ou +rKusr7S8yOJfSz44NDM0OD5LcdPGv7y6trOzt7zF2XZRRj86NC8uLS81PERU8dLIvbaysbC0 +u8XT7GRTSUI+PDw/SVj71czHwr68urq8vsfV72FVTEU9ODQxMTM3PEROYOvPw726ubi6vsTK +09/6Y1RMSUhLU1xq7t7Z0szIxsPDxsvO1N57YlVJPzo4NzY5PUFHTVz83M/Jwr+/wMPFy8/R +2PleWllXW2JvcXLu3dnUy8fIx8jM0Nvh72lRRT46Nzc4ODo9QUtaaebPycO9u7y+vsHEytTa +429fW1RPT1RWXGzw3NPPysfFxcfKz+JtWEtBPTg2MzM1OT5ETmLoz8e/vLq4ubu+wsnN1ON8 +ZlRMTExOUV138+DTysXDwsTGy9DaeU9COzYzMTI1ODxCTV/w1Mi/vLq5u72/wsbM1eH4YVdR +T09PUVhdbOnXzcrFw8LCxcvV7VdFPTk1NDU4Oj5DS1v72MvGw8G+vr/AxcrO2ODrfXVvYFdV +WFtidPTf2tPOysrLy8/aeVBFPjs5ODo9P0ZNWG/g0svIxMLBwsXJzM/Z3+f2f/t4Y11fXFte +am785uPe1tHS1drpaVhNSUdDQkNER01ZYnTk1tDMy8zMz8/S1NbZ2eH7fPd0Z2tsbG36+3Zy +e3p1+PTq4t7c4vxnXVdVU09PUlNRUVhdY2366+Xc2Nfb2dTU1Nna3Nzc4O75dm1ydmdla25q +cPjv4dza2+P6bWZeV1FQTk5QT1NYXF9jbXvl29jZ1dLW29rX2tjT1trh9HBsY2Nua2NjZ15p +fXV6b2lnaW1naW54cGx4b2tkam1qbf7r6ufn6Orx8uvp6+He4+36+Xhz/H5zcXBub3Jyefx9 +em//9/Ds7/R7bWltamVpa2RlbXjy5ODl5ent7PP49/56b2xpZGlscHF++/Dp7Ozu6+Tj6err ++nhybW1xa2diX15iZGlvcn7+d/fu7OLe4eju8/r57Onk5eXq7/d5/fj+c2xqaWNdW2NmZGVp +b2767fL06Ov07evv9/Z6efLs9vvw8Ozh3uLj5+rxfGtua2JmYlxaXGNnanj6f/Tz+vfw9frp +5uzq7fB2cPDv9/fx8fj4+fj2+PTv/vv2fXRuf/x4dG5x8/t1d/50cHtyamRobG1qaWhs9/v6 +6ufq9u7z7d/d4evv+XVveHt4dXp5eGdob3X66eXp7fb1/fd4cXVraGhtaWFlamdla3X57u3t +6urp4eLs+Pnz/nr++Ht4fnv26+vp7HpueHpwaGp0dG1vdXT+eG5tcnZ5eHJ4/ff8+e7s7+bf +4ej09HtubGxsbXJvbmNhaG5xfu/t5+br7vH3+/Du9PP7+nRwcm12dnVzcm5qeevo7uno7u/3 +e2tnbGxoZmtxc29scvLm4+X3effx6OXl7fLu+29tdHNlYWRlZGdqam397+32/uzo6ubm5erl +6vt+8/Hs6nxpZmhqcnxvZmx9bXD59vb49P37/GtjZm1zfPv7+/f79fX06d7h8fHve/jr9m5p +fPn5+nxtbHlue/t9ffTx+3F6fXd+8u3+dW1jXFxhavPj39vc4uHb29/m925nXVhaXV5hY2Fm +eOrr7ufr9fb16eXq7vd4b3B0/HNwe/9+dHL48Pbu5+bs7fp6dv/v+nVtbWlreHJtbm54+fb8 ++/Ds+mxwf3FpbWtsd/bo5+zp6uvv8fZ7eHl9cm92eG1ucH/t6/R8+Pt3e/fs5ej2/vtvb3Np +Y2luZ2Voa3P57eLe4Ofte25we/n8dXRraXR8/fT0/P/29/bv+XlufPp3b/r7d/nv9n50dnZu +efz6fHD97fF88vD8enVyfHVtbnl+dfz0+n397v346+708fl1bGtvfP1zc3nx8PLt8nZu/vf+ +Z2FobHJ4/vD4fv357efp7e3u7Ovs7PPu9G5na2xscG1nZ214+31udH7y9P/6/P3n5e/y7Oru +73dnaG9ubnVxa3ryd/jh4ebofmtnX1xaYGZqbnN7+fLl3N3d29vh7Ontfvvv/mtqeXhscn5q +ZWVeZnL/fu3m6+bc3N/p7m1cVVFKRURIT1/u187KyMbGyMvN1OVxW09MSUhLT1hn69zWzcjF +xsrP2epuXVdXVFFOTE1PWmhqYmNlXl1gZ3Xz7//67N/T0tfb3unxfGxlbvjy6uDg2M7KycvL +z9jjdmBXT0tJSUdJTFRhf+Dd5nBjXFhXVE9NTU1WX2Xv2NPNycjJycrKzM3S2+Pz9u3f5enk +6vhzamBcW1lVT09QU1dZYHPw7/d3aFxQTEtMTk9TWV9l++LWzcbCxMLDxsrLztnm8XRgW11s +/e/s6uzs7PVyaWBcWE5LS05XXWJgVk5OT1RWYXNpaGpt/d3SzMjGx8rMztHV1tje+Xhxa27r +2dPa4+9vY2RlWlROT1FSUlVbWlhUUU5OUVheau/q4t7c3NfPzs3LzNDV3Orw5dzb2trZ2+Hl +3t7f7HpfUE9UUk1PUlNbaF5WUk9RUVFQUVdcY3jn29fPy8nKztLV3OTi3t7c2dXS0NPY3dvV +1tnrZFZUT0xNTk1NUVJLRkRFRUhOVVxlbfDa08zGxsfJzNHT09fZ3N3i4+Tm3dPQ0tbX3PBn +W1thX1VQTkpLT09LSkpIRUZGSlV15dvW0cvIxcTEyM3V3+xtbHV3fvvr39bRz8zM09re6nZt +ZVxZXF5USkI+PDw8PUJLUmTr2s7JxMC/wMTJ0N5wY2RcXmpxfubaz8jBwMHFytHjaFdWVVFN +SUI8OTc2Nzs/SV3m1cvEwb+9vL2/x9PoYU9IRUdMV3Td0MjCv726u7/FzN9pVE1JQz46NzQ0 +NDU4PUpn2s3Dvru5ubm7vsTO7lVIQj8/Q0hQb9PFvrq3t7i7vsXN3mJMQTs1MS8uLjE1PEZZ +4czCu7e1tLW4vMPN6FRHQj48PkBIWt/Lv7m2tbW3vMDGz+tYRTszLy0sLC0xOkVc08G7t7Kx +srO2vMPSbE0/Ozk3ODtBT/XLvreyr66vs7jAze1PPjUuKyopKi0xO0z3yLu1sK+vsLW6wc7y +VUQ8OTU1OT9KZ8+/t7Gvrq+xtrzG5lBCOC8rKCcnKi43RW3JubGtrKyusLW7x+xUQzs2MzEy +OD5O3sW6s66sra6yucDSX0U4LysoJiYoKzE9WM67sq6rq6utr7a/0mdJPDUxLzAzOUFb1L+1 +r6yrq62yu8fhUj41LikmJSYoLDRBeca4r6urqqutsbnD2lxFOjMvLS4xNz9bzbyyraurq62x +uL7WUz80LCgnJiUoLDNA9sO4r6upqaqtsbnG51A+NjEuLS0vNT9Y0760rauqqqyvtb3RWz80 +LCckJCUpLjdK2L2zraqoqKqutL3QXkM3Ly0tLC4xOUd0ybqwrKmoqaywuMTnSDctKCUjIyYr +MT5rxbWtqaenqKuwustnQzgxLiwsLTA4QmXKurCsqqmprK61wehHNiwnJCIjJiszQvLAs6yo +pqWnq7C6zlw/NzAtKystMDlJcsm6sa2rqqutsbnG9UU2LSgkJCYpLjlN2r2yrKmoqKqttcHf +Tz42Ly4uLzE2PlHgxbqzsK+ur7W7v818TDwxLCopKi0zPE/Xv7ewraysrbC3wt9RPzg0MzIz +NTo/TfHKvre0s7O4u8LO6GBYT0Q7NjIvMDQ7SG/Pwbu4tbS1tbq/zO9PQz06OTg6PkhOX+vV +yr+7uru8v8nZ+F9YUU1KRT8/Pz9DTVzy2c/My8rGxsjJy9TjaE5MS0tLTU5OU17+3tLLyMfH +y83O1t3f6nZdTUM8Ojo8Qktb7tHIwby7urq9yNduT0hDPz8/Q0dPX37k0srGwcLI1etxYVtU +T0tISEhMVWrh0MvKycrMy83W4fRtXVlVVFZXWVtgXVlZV11x7Nva2tbZ3+Tl7nZpX1pWWmJs +amz8497b1NLR0dPc7HdjX19dXF5nX11bW15lfO3m7vZ6cXH77/V0bG5xcXH+8e/q6ez4+/rv +6ePc19Xc4uru6ufreWFaVlJNTE9VW15pcfHp4dve3djX3ujyeWhhX2Jrbm93/fXo3djZ3uDk ++GxnYF9eW2JraGdzfPbr4+LwdWpna3Z+9e3xevvt7+jg3ef98vV1YmFfXV5nb2djZ3jy59vb +4unrenBwamptbHNxef717uvq7+nm4Ox79/5ubW5qYV9kaGtrefP17O3z6ODn8fD1e3lvamlt +d2xscnL3+fXy8vH17er0//t5b2ZjZGlv/vLl5OXk73f57ft7entxdvz5/nf0+/v5dX18bGhq +dXv5+3h6+/r98+z07en5dXJ9+3dsZmJma212cXTy4uDa2d/k6en2dWpmX19mZmNmb3P77Ong +3uHn8XtvbWtvd3JxZmxtZWluamX65+bl5urs6d/e5Oz3e3Zxa25tZmllZ29udvHr7ufj6Pp4 +cmpoZGVgXV9qanf97NzZ2d3h3+Tq8nttYmlnYnr0/XhvcX7+bGx0b3R78vDy5eLo6vt3bWNb +W11fcune39zW0tPW2+TyfGxmZF1aW1JLTExNUVxiYm7o3NTKx8nJzNXe5/1tbW9zal5dZGhu +eG9tb3H+6OXc19/r7/p4fGlYV1pcXmp27ej5c1pRVF1famtkbnltcvHt4tfY29vd3drb2dXV +19na2dfU1tzo9G9eU1BPTE1OT09XXF5ra3Hh193mc1dPS0pMVV1fYmVndODPyMK+vsDFy8/S +19nn+21fW1VbbOjh6O9qVlBOSktOVVxcWVhYXW7z59nW2+hqWVZUUFBRUVddY+/Wy8fCwsTE +xcbL0tvm+XZmXV9z59/c3ur5b1xVT09OS0pKSUlITFhk+OLc29vb4+j0bmNdWVRTVl5t9N/Z +1MzJxsLCwcHHzdTh7mxgY2ZeWVxhYmZwcWVdWlhOS01SVFVZXF5t+e/u6eTo+WFXVVNSVV5l +c+vg39jRzMjGyMjIys/b4Ov99/Tt+/zl4+r0+PtpW1dZV09OTUpKTVRbXWnz7fz/a11WU1NS +Vl1u9O3s6eTYzsnGwsHDxcnP1trn7u78dmhlbHR49+p5al1RT09RU1tjY2NeYVxWUE5OS0xO +UVhodnfy49rUz8rGw8LGzNPc5uvr6ujc2d/k4eTg2dnc3ul1XVFMS05PUVhXT0tFPj1AREpT +aPTm3tfTzsbAvr6/xMzS3Op+bmpkYlxh/enYzs3P1NXY4ntpX1NOT09KRUA8PD0+Q0pXet7P +yMfIx8XGyMvO1uPzcGJfYmvz3NTQzMvJyM3Z5/JvX1lVUFNcXldMQzw5OTo8QUxg59XNx8K+ +vLu8v8fV8F9PS0lKTVp83c/Jwr69vsHIz91oW1hQUlJJPzgyLy8xNj1Ld9HDvbu5t7i3ub7F +029OQz8/Q0ZPa+HNwr26uLe5vsbYbFZLR0Q/PDYwLSsrLjdCYsy8tbKwr66ws7jC3VpEOjUz +NDg/Te7NwLizr66vsba/1GlPQzw1MC0pJycqLTRD9ci6sK2rq6utsbnJb0Q4Mi8vMTY9TuvH +ubCsq6qrrrW+zmxLPjYvKyclIyQnLDhO0Lmvqqimpqmssr3XTDkuKigpLDA8V865r6unpqap +rLO90Vw/Ni4pJSIhISMpL0HZua6opKKipKmvu9VJNSsmJCUnLDVJ1bqtqKSioaOorbjNWz4z +LSgjHx4eHyUtO+u5rKWgnp+hpKq21UUxKSMgISMoL0PZuKyloJ+foKWsudNLOS8rKCMfHR0e +Iis83raqo5+dnZ6hqLLLRy8mIB4eICYtO/q7rKWfnp6fpay40E89Ni4rJyMfHh4gJzNVwK6n +op+enqClrb9QMichHx8iJyw1Tcewpp+dnJ6krbzfTT87ODQvLCYhHyAkKzpgxLOrpaCenqCn +stw9LSUhIiMmKi45V8Cto56dnqOrudNYRT48PTs2MC8tKCcoKS47W8WwqKKfnqGnrr9RNCok +ISEjJy05VcGtpZ+en6WtutdQQjw5OTs9P0RDOi0oJyYqNlvEsKiin56fpa7GPywkIB8gJis0 +TMmypp+en6Otwm9GOjY2NjlFbsvDxN46JyEgIis/3LytpJ6cnJ+szzclHh0fICUsOuywo52c +naSvv/FENi8tLjhVyLavrrPFUy4fGxsdJjvGraOcmpqdpb44IxwZGh4nNeWuop6cnaSvwVY0 +LSoqLTzmvK+rrK6us8hAKh4YFx0qPsaso56amZ6uUigcGhwhJzbWr6KcnKKvxlI6My4pKTRr +uq2qrri8vLy9yE8zKSYmJCUtPmq+rKWmqKu2ZzYtKCcsOkviua6srK2430k+NzQ7SV/axL2/ +vbW0usHGxs/cdkIvJyEgJy86Sde3q6WiqLhtPzcwLy8yPH67sbCvr7fJZ0EzLzlHUGPPvraw +rK64wsPF12xHNC0pIR8nLTVFy7GsqaWos8XgTTUtLjAyQtG+vbatrbrO3lg/PD5BRWbFu7eu +q664urzTTzwuJiAfISgsM0XOs6qlo6Wpr79XNi0qKSkuO1rBr6qqrq+wvVw8Ojo7QVbdvrCt +sbWzt8tPPDAqJR8gJykrNvS2rKWgn6Opr8dFLygjHyMuPFm/raaioaartMtINC4vMjlH+Mm8 +tLCvsLXEUDctJB8fISImMW+7rqSdnZ+kqrlaNSsjICMnKjjVt6ylo6SnqrHJb003LC01ODpY +wbq3s7G1yj4uLygdGyIsLjnFqKOjn5yeprHEUC8nIyIlKi40UrqtqqekpKmwvtRXPjYzOD4/ +TM/F7Vz9RTIyMCssMTg9Yr63tK6pqqyusb39R0A3Ly4wMy872u/ts6uys6ystsDD019TT0hA +Pzw8PTUzPTsvNEE9PE7Zyci/ta2tsK6uuNN6bkEzMzg3MTNL+1Hrure7t6+ts7y7us1pYlpE +Nzc5Mi84PTYzOD5BP0nYzNHAs7Cysq+xvcfF7VNIQUhCO0RFQUdMXdvMwbq4t7W2uL/N31pE +Pj47NTg5NjY2ODs7P1dv6c+9t7e5trW4vcPFy/d75XRRTE9OR0lKUVZt1szGv7q8xczR705M +TEZAPz49Ojs9PT1ATFxz383Hv7++vr7DyMfK2OHe7XhmXVtPUFdcburPyMO/vcDJz+BcS0dD +PTw8PD09QUhNTV157+Hb1NPX0czU09HNydDPyMza4/NsW1RZWFxv5NLKyL+/xsrP4l1OTUY9 +PT4+PT5DSEZMX37+ft3U3eTU0NXT0MrKzMbDyM/Z2+taWmlcWmZ+8+bZz9TWztLh+2xfT0pO +SkA9PEFCQEdPUl3z2tra0MzOz9DQy83Mys/X2Njf6vj0bWRv++/f2tLS083U29zwcV5MSkk+ +Ojw7PDxCTk9Y79XPzsrEx8rIys7b2tTl7uDg7u/f2/Jw8fZ77d3Rz9HJx83Q2N1YSUpAODU4 +NjU3PkZJXdjNycC8u7/Av8bS1dt9bnV2YmPl2+Pd197v6t3a4djLysvSz9xOT0o5NTU0LzA5 +QEJM3s3Lwry5u7y4usXGyd7+aGBXS1ZlVWPn4NzbzcfPzMPK2NTVYU9PPzc1NDIwMztAQ1fb +0cm+u7u8urm+wsHN2dvrZ1dbWlVbbe7t5c3LzsS/yNTO50lMRjMwNTAtMDc9RUrnyc6/tbm7 +tra9wr/J3OP6Y09PY1paed/g5czHzcnBxM7P1VJGSjYuNDIrLjY1Ok/z0se+trS4trG4w73B ++G/4VEpNT09daenU2cu+wMa+vMnY0F4/QjgrLDEsKjc9Ok/PzMO6trWysra3vsjK3FZOTEZD +SEtPW+nVz8W+vby6u8DGymtCQzssKi8sKC8+Oj7cw8O8s7GysrO3vMbP2XxNR0pFP0VVVlrc +ysfAurm7ubrFzt1NPDoxKSotKio0PkBZysC8s6+wr7C2u73H/l9cSUFGSkdMWmjmzsfAvLq7 +u7vAzNhePzk0LCksLCouPERM38O9t7Gxr6+zur7E2GBXTkNCRkZLVltv1cfGw7y5u7y7v9Ds +Tzw5MiopLC0rLz1IWdXAubKvsa+wt7zAyN1aSUVFQ0FIVWl37szDxL+7uru8vsjbZUs8NzMs +KSwuLS89S2bQwbm0sbOzsra9yNLnV0hHSkpLUFz669/NxcHAv7+/xsvP3WhPPjo4MCwuMzEy +PU9m38m+uLa5ube5wMrO3VxPTk9MS1Jl7eDZzcrGyMrCxc/a1eFoUUdFRj03Nzw7NjtJU1p0 +1cTAw8O+v8nOys7rXWl+cGBkau/o4dvMy8vOzMvQz93r829TT0tMP0JAQT0/RUdITFjv4N3T +zMjPzcrO19/i7/Xwc+Tq29vW19XRy9TP3dD7amNvWlpMfVvwUeB0bFVZWltMTkdNS0lLTmpu ++PLd1d7r4dXU19fP1M/jzNTH1s3K1dZ63/53amH8XmdaaWdtbe1z+FpeTEhHREZFSEpNVVZ6 +/NnU1MjOzNbOz9TU3trS3uzj2ufn6PTo593o3enf6Obo7G52XWtZU09TT0tLS05NSk5OU1dr +dunZ3dPOztPZ1Nna393k59/j2+Te3Nbc4N7c5PPwbnRcYlZYVFtYXl1kXlhfempeYHNrbG5s +Y19qXf3p7H7i4Nvk3ufe3OTk2tjZ2NnX3N/r/nhiWltUWVdZWlxsZ2Zv+ex5637d5Or38m5v +ZWdsdGpk6Ptw/nrvfP9v6/R7fH1s+Ph8avNx9uPh5+jk5+3r/eZ63ObhaXNeZGz7+m1rZl9f +ZGL0dPZ/6vb3+vvx/vx6cvxsaWh8bGxt8vj/e9zteP727fL+bOvr7Prteul0debs+mvn3ers +7OTibGN5eVxZXmVtWlprZmdge3Jvb/jn6OXt5vbj9e393nvv/eP23uPm4fjhc+lz/m1k8l5o +V29pYmFcc+1fa17hV3hi8npzeNLy4XvZdtNt3+D+9uTm5OvnXuJrbvx93XPfWGjbVGRa81Bh +X1NqXFJ49/Nl0ubh5N7ffORl2/Vu/dvcZ9PeeNxv42PaZHbfWvzl9mbd3FfpW1VnTk9NbUdU +81Vp5eTnz8/4wuPs289mZtNP6W1bfd5yY9Xdac/8z97X6NvlcN97au9PWU9PPUdLPklJWmVz +79bB18zCys3b1t70aGLyVFdqd1/30+je09HP3NfW2Nfn2eHcb/BpRklMQDc/Rjg9Sk9b587H +vcTAusTVz9BiWF5OUEpMbHZ03MrOy8PIysnIztjd3eBodutbPz9POy87QjU1UFlP3sW/wb66 +uMLPytxTUlpIRFJOT3Pi1srFx8K/yMXH0tLS7XvrdGxYT0s/Pjs1ODg2PFVOVsjEzL+5vcK+ +xdXnY2FRSk9VT1P4293PxcPHxMTNzM3r5eFxau/vUVhTPj8/ODs9OTtQUlXLx9TDusXJvcnr +2txaUFRWT09f7t7eysnRzMnN1c7Q4OLe+Xrd5H3tbk1ITT85Pzw2PU1JSeDZ9Mm8xMm8xOXW +1Whj8WZZZmdh5tfa1szMzs3M1Nrc4PLz+2lpamJoYVVMSkE9Pj07PUhLUOzZ1Ma9v8TAxM7V +1uRwe21gXWZqZ3z25dnX1NDT2tzc3+Xf3uz5/PdzbmZPSklDPTs8PT9MV2LqzsrHwcPGx8jR +6+x+YF5nXVxzdnjg1dHOy87U0s/S3N/m73lsZW1lYmhUR0VGPjo+Pz5IXmj6zsjKwb/GysnQ +5+nmeF1dXVxkd3Xq2djRzM/T0NLY2+Dx8fZ2/fxudm5aS0pHPjs+Pz9IV1tk2szLx8TL0szS +7uvlZV79f2zn3N/Xz8/Qzs/V09Tk8+z6e3xwZmloWVRNRUNEPz0/RUROaX/mzsjJxsTKz8/W +7nl5amV69vPm3+Dd2tjSz87S1tXc4e1xal5cWlpXVk5JRkNCQURGSE5c/ODVz8zJxsnO0dvl +6e7q8vbs4ujo3NrZ1tja19fd3d3i+GpmXldXWldUV1RRT0pJSEdJSkxUZXnr2dPQzsvN0tLV +29zb3+bp7ePd29rX19zc3d3j7vVyZFtYVlJPUVRTWV1iZmRfZWxoZmhmX2JoaWVv9Ovg2t/f +2uTq3dvk5+Xq5drY3Nza2trc5e93cWdcVlJTVFpdXl1hcHpyeP/07fxoX2Vv/f5tZ2z05+74 +7vN7eHd6d+vf5+nj4d7c29zc4+31e2pjZmJeZGhkaHFvcv3z8u7seHr3/HFpcPh6cf/4c256 +fHRvffh+b259+v/67/f7fHhxffr06vdrZGptb/bt8evp5uXp5+Xm6vD8eW1scnFtaW95a2xs +aG5tbmlqfHj9fW9/+f56fvPq5+30/HxtaW9pYWz98vn49fjx5uXo5OXo5e74+P5vaGZia21q +c31vfO3r6/F8fHRyen1saXB++ndqZmVqcmpna2x96ejn5+vq5d/j7vLp6f9veGxsdX7z8Pfz +6/P/dW5maGxrbXBsZm18bXL2fnv463xyeH13df70+fLs7ebm6ur1cGpudmz59/v4d3v97+7u ++3V5+n9yb29wb29vbnDt6Orn6ff/b2ludP5taG1vbn7v/vzx7u/07vr/7unm7flyXkzkxEh5 +1txfamhMw0xSz+jyVuDr319QY79OZf/Ibk/eYc9H8NnTSdJ7+lftzF/qW+zOU2vqzEvtTshd +b11ya/JlWk2+THVqysxF2PvNSl3celRbXcZcTcrIZVG/e19ads5oOtvN9zvU39FKT8XYzznJ +5cg/asBH0UXEdk/JVeJhyl9Zw03W3kPK91FK0XlR10nF811c3NVM6mDe2FTi6tlmUnrm3E9G +3sxpT1jE1FZL3cTsUF3JzE1Q0MpXTP6/b0xpyNBHUuPPTkZ309hPSdzD+0VoztBcRGfD2UpR +zNRyVufM011SbdxaS1Bs23pc6NbI8V/fyO9PYP71T1P3y9703tnScVVY8mxOUF/k62Bt29rv ++t7gd1pldnJibNzj8evv2djYZW1iZF5Va3VzbHzr7d3u629sfmNdXmt4evf64eLp1+Tz7Ovs +5Gtmb216YnNn+Pb87uDocG1+/l5jcvNs/utvb+Defu7xY2pdWmNdZezT39zZ2u1++u1zWWFo +a1x/6t/g49vb7GVYX29iX/3m6Xt46ODudnFv4/VkXVpof3j69unx6+nd9mz7bmdu63Zr/X50 +aGty4Nfr/erj7OtdXfXsa3nu/9bsXFv54HzuYWr67npu6u/nclhXXmZv6NfY6V5WYf3r/W98 +3djpaFts5N3e7vVqYm5r/9jP1NHZ8mxpZ23h5vD7cl1iY1RNVVRWT0M+QExScNvTx8PEycrR +2dXb29XO0c/IyMrN29zd8WRldtnAPR4hKi47X09ss62xs8xDTNzf5c/r6r+8wsXL6NPIzNXc +81762ce7uMEvGhskKDRVWdOqo6eos3tOTzgsLzhMwrOxs7fB08/O2edsWfrIwLy3r65IGhQa +HixYc2qwoZ2boMc0LSwqKygqTa+joae2zsrGy/1FOT7bua6qqK9LHxgZGyArOFC4pJyZm6jW +OSojIiMmN7ynoqKrub/CzOdINDZHzbGopq74KxwaHCAnLTjrq52YmJ+xcDgqIyAfJjrAqqam +rLO3u8xcPTM6V8axqqq3UCYdHSAkKjE7zqecmJmguE41KyUjISIv3LCopquxs7jF3EY3PFLS +uq+zwEgpIiEiJiwxPcapnpqbo7blPi4qJR8fK0TErKanqay2wtFaSkxPXc+9u75eLCMjJSox +NTvfsaOcnaSxzkQ2LygjIyk0a7Wqp6ist72/ytRtT01ozsC/ViwlIiMpMzk/27eroZ+kqbTh +PjArJiYpLT7Kr6mmq7a9vcbJzO5aY9zJyFAuJiIgJi40QOG8raShoaSrv00xKSYnKi06YL+v +qamtsLa9v8LO2d3f6WE+LScjICIpLTnvuq2kn6CiqLfoPC0mJScrNE3JtK2srq+yt7q9x9PX +2N11PywlIh8hJis1Xb2soZ2dn6WwzUcyKiYkJiw937uzsLO0sbGztr3Gy8vN3EktIx8dHiQr +NVHDr6SenZ6hrMJUOC0oJicqNEvOu7a3t7Owrq2vuMDK0d5SMSQeHBwgKTJMyrWpn52dn6e5 +6UEyKygnJy06TtrAurmyrq2rrK+3vs7rWDYmHx0cHycuO+u7raKdnZ6ircJiPi8pJiUnLTlK +5se9tKyqqKissrrAzndBLCAeHR0iKjFB17epoJ2dn6exwX1BMikkJCYtOEr4xbivqaalqK2z +vMjWXjopHx0eHyUrND94uqqhnp6gp667zlY3KiYkJSoyQGPLuK2opaaprbXA02dHOS0mISIn +Ky8zOUzXu62npaittLq+ymM+NjQ2Oj0/RE5w3nhvtKituMG9trXHSkJEOy8pKCwzNzU4QmrL +v7ivq6uwusPL1G5JPjw9PT5DTv7Ov7m2tbe2uLzF/D80LiopKy0yODs+aL+0ra2ur6+zvcrm +U0A5NDY7QUtV+cy8trS0tbm+yNRrRjYuKiotMDE1PErsxrmvrKutr7e/zPFMPjk5OTo+RmDT +x7qysLG0usDL22dENCwoJSYqLjdEY8/At66op6istsTuT0E5Nzg4Oj5Jbc2/t7KvrrG5ws7k +TzwvKygnJyouOEztybuyraqqq662wdxUPzk4NjU6P0de08C2sK+vr7a+y+dNOi8rJyYoKy85 +R2jJurGtq6ytr7W90FtFOzY1Njo+RlbdyLyzsK+vtLq+zGNDMywpJygqLDI9S+3DurKtq6us +r7fA309CPTs5ODk+RVnbxbiwr6+wtbm+0lc8MCsnJykqLjU8Tt3GurCtrKutsbnK/E9BPTw5 +ODo9R1/Xv7ayr66vs7a9020/JyQsLCcqLi8+XtW4rrCvqqyyt8HhZUo8Ozo2O0ZO68zFubKw +r7K0uMftQTAsKiYmKCgtO07Hsq6rqKmpqrTHbEI0Li4tLTQ6S8q7ua+srKmqr7bE3N1mNykj +IyUlJictQM+3rqiloaClrbzsQTQsJSAlLTU/V86vqKampqiprbzZYk9PPywjIykqJiQnNGDE +urCmn5+iqq+31z4vKSQkKCwtOF+/r6uqp6Okqq+7xc57RDkwKCQnJyEiKjVJ28KzpaCio6Wq +ss4/NS8lJCopKjdJ3Lexrqajp6mqrrLBZU9JMyooJiYjICYwOUHRtqulpaShprC9z1k5KiYr +KSUsPVjWwLOppainpamvucvuUzkuKCUkIx8hLTE1WL6wqaakn6Cqr7jQRzcsKislJS84PXK9 +sKqoqKSkrbK2x/dSPzMpIicnHB8vLy9QxLWqqaWeoa6srsxRPy8qKyYjLTQ5XcG4raenpKOq +rq++6mBCMysiIykfHCouKjvIua2npZ6epqiot3BENCgnJyElLjE90LmupaOjoaasrbbdV0c1 +KyUgIyMcIDIuL/20r6iin52gqKuz/D82KyQjJicpM1HHua+ooqSnpaq3wNBnQjYwKyMjKSIf +LDUyR8azqaWmn6Csr6/VPzguKSkoLDg8Tb+0tKypq62yubnD331lTz84LCYtKB4nNy820Lqt +pqqkn6m5t8Y8MjItLS0uRFdKz7Cvsq6ur7bFwsDlffpv60c4MCsqJyElMTQ52Laspqamoqq+ +z949Ly8vLzEyRd7rybKur66wsbbM28vvUnRrYVxBNSwrKyQiLTo8Z7qtpqeqpae54/RFMC0s +LzczOujHxrWtra2yuLjE7vdsVFJWVG9VPzYsLy4lJjhFSNS3q6SpraetzGBQOTAtLDQ9OkrO +xLqxsa6tuL/D5VhQR05vX1/p/083LTUzJik5R2jJvqujrbCss8pcPTY4MSwzPkdd3cCxrbKz +sba/4FpaWEVAUGTu5l5gQzI0NS4uNj1lysW0q66xtbzF30s6PDo1Oz1FaNzPvrWzsbW+vsd5 +VVNKSkpDTvllX1tJP0RBOj5GTXvb1MvDw8TDztrW3u50WE9RT09UWm/o2dLNy8vOz8/a7fHj +7/ru7+7b2Of/Wk1KSEE9PkJIT1Jh6uDX1dbT19rb91xoeGvv29HOzc3MzM7Nz9zp//vu8Ozg +2d3q7W5PRkZHPz0+P0NKT1hn7tzY1tjV1NfV2+Db3ubc2NnW1dnc4N3b4erj3eTn2dPV1dfb +4mNPTUtDPjw9Pz9DSk1SY+rXzszIxsfJzNLW3O94df5xe+/z+fTq3NbW19XU0NLZ19je4eZ1 +ZFlKQj06Ojo8P0NJVnvc08vGxsbHx8nO1tvl+21s+PF8eOjW1djT1NXS1tve3t7sb2pvaFxR +SUE9PD0/QUZOVlp53NHMyMXHys7V1+D4f3d97Onq3N3c1dbZ1dnk6efs/Ofu9e31/vlsVVZT +TUpHRkZISUhLU11dduPg3NbQzM3SzszPz9DX1trf4vF7b3J2c/z9/O3s6uHo6+bucHVyZGFn +Yl9bUktIR0dHSU1SWGX65NvRz8/T2tnT1NnZ2t/k3Nzf3drW197f3ud9/3ZubWhqXl5nYmJr +aV9XT01LSktMUlpga/je19fa2dbX2+Lf537x5+ju7eTl6+rh393Z3fFybXL4cWh37O7s5e5+ +bW5wXVZST01NT1NVV2BxeP7o39vb3+Dl729OUcba38rMxM7c3dbvaldeYXdKTtLg8PTQ0NXb +ZHzfWj5DRDs8PDtFaF39xb68t7vEu8DWf2NOTUo7P05LT3fbyL+/w72+xMjS2NDZ8ujuUToz +NjMsKi02P0xew6+rrKyqq7DA7FZBNy4tLi84PlDVvreyrq2vs7zM3WhLQURDRUtOST88PTw2 +NDpDTnLdybiys7S0trzH6FdKPzs3NTtGTFzOv7q2ubq7wMvbfVxQT0lGTU9OS0c/REpBP0ZQ +WnHe183Dv72/wcfL1vdiVFNPTlNe/uzk5d3Y29/k5PtrYGp8bP3u6tzh8P3z7v15aHRiV1BK +SEVKT1BPW/l8/9/c19TT09LNzMzNz9LX2ub+a2VfXW5qb3z99+rp5t/o7fh5cmFebF9VTUpK +SkhITlVaYGvl1d3h1c/U1NXX2OXi5+304uLr4tza297T0dzX1tve82RqXk9RT05PT09SUVhn +Xl1pZ2bw7fbr8vbq92hqZWZxZGr+8eHb187LzcrJzdLW3+Tpb2hlW1tiX1teZWhdWGhuYm7z +fnFrYmluZWpgYmBdX2doZP1+8+r04Nzg39jY19ff3+Xp39/u7+78bG5ra3FkZmheW1xdYGVv +7+vz+Pnw5+325+n6d3doZ3j98/V+cnjx/XF47fpybmNlaG9ve+/27vTs6nz26uz18vXr5e/p +5ubh5vp4em5wfHRnW11hX2/v7efo7u3n73dhX2NdXmRt++7y7vT17/z4/29u//T3em/v3uPj +3N3p7/D+/XxvZGZkXF5qfPzm4ebk7fx8/mtgZmtte/Tx7ufn7fl9dmhfX2Rub2/7/Xj56+Tt ++Ovo7/Ps/PP6aXj19+3i6H98+PRuZ3B7cHTx6+/u6eb4cfDtaF5pa15ec/hqaHx7b3nw7+/v +6ujz+/h3df35d3P68XNjd/L65+tT99bu2t7S3dp78u5iWl1xX05LRVzN51R5yMvQ6WzU11RO +alRQVlVN79vk49DJz9Z6b93ZYFh7cWBvYVny4mhnfund72Nq3eNrXl5kXF9fcefk6nft5+z/ +/eTj72VZb+fyaH7h3OVzfe/3YFxv9ndoaW7v7vXm29fl82xi599jUmD4aFto+f766+rt3eDx +7/VzY2JeY2pjXnvc2fJvfWdcXmVw8fRu+OHl6uPsdN7b7err7/j19mvw2+jl82536fF76PFf +WVpUTkpGRE1OSE9o6+ni3s7FzNPN0NTR2uHSztna29zS0tvX3v3m33tub2VcXEotLDo3MzZI +1LzGd8G2xmxV+9LdVFbIwMzSyL3C1PHWxtlmZNnJ1f390tX6al3733g4ISlGMCcy6rq33Pms +q/VGX+55TT9buL3exbq9zW9b08HxWdPEx9/p0MbSXnzT3mFUKx0sNycoP8Kvss+3o7JPTeNy +OjE5+cLZ0rmxvedq2sTUX+nEv9Di1cPE3eXbz85kRC4fJC4qKDbQs667uKmu109SUUI0M07J +2uK/s7fUUeq7v3Htv7rF8G7Gw/t42MzI20wyJCEqKygvbbWvtrOoqr9ZSUo/MS4+3NnNu7Wz +w1tcz833/NC9veJ0yL/Q69rJxutKPC8mJSsrLT3Rt6+wsKyyz11KPzgzOFXQ1se5ub/fb8/J +7GnUycfS+c/Ez+XZzc7OdEE+LyQpLisyVsSzrbauq779U0I7OjE2Y9brzbu5vtrmwcDo7tTN +zWxf1MvS18zGvslYTEcuIyktLTI/2rWvtq6sts9UQD88MTZU6uTjzby6yM7BvcLYYvLeXlBb +3s3KzMi8v9TlYz8tKiwsMDVG2sC+urS0u8jXalVHPzxASkpLWdzHwsC7trnHz9TbZk1SW2B5 +4+nhz87d8mNJQUNFQT9FTlhWU1t54t/d2M/Ozc7Y63BeU1ZdaurY2dzd3M/R297a0tjh3dbZ +497Y19zs9nZaVE1BOzw9Ozw/Sl7+7tfJx8fJyszU2t7m5ed3X1tr6+Pb08zNztDOztja2eh6 +/vHr+2RYTEdDPDk7PkBJTU5j29HSz8jEw8fMztDc82dcW2Z5Z27f1NXY1dHMy8/T09nh5uvz +eWpcUEdBQkVBPUBFRklNWmvj09HJw8LGyc7a8WRdXWRrcXbj4l/XxtfKwL/Jzc/L0Oth/fZf +TUhKPDg8OjM2PUZZXei9t7q9vMDB3UtGR0RARUvzzNfPu7i8vcLBw+tOXVtMTlNw0tbZwr/K +1n0+Li4uKCguPmDayrCprbW2ucN1PTlAOzU9U83Av7q1trvG5djoTUFGTVZVTuHCxcrDvr7L +42U+KiswKCgvRO7DvrCmq7m5u9RQOTE8PzE818jBvbywsMvlx+dLRENPWUVOzs3UyMG7vtbW +z35EMCovNSopPXXPy8Supq6/uLfXRDc4QjswPs3HzsG4r7fa3cv3REFLZVZHZ8nQ6s7Dv8XX +ystuRzItPDMmLUpbfNK+qqi4ua66WD45PTwvMU/e7ty9s7bAysPPaEtJVlFITvr09tfMw8HH +xb7E9ks6NTstJzFDRE3Vu62wvbOvw11RR0A6MDpTTFXQvbe6wL+7yV1hZ1VIQk1rW1LfyMnL +zcW/w9RKP0E9Lis4QkBAab+1ur+0r77i9n9SPTU8TkRCa8vBxcrAu8Pc3NXfXEpOXFNKU3zm +497SxsLO5n1vUT84O0E+Pk3x1tHMxL7Cys7V321QTE9OTVZeZufa29zW2t3W2d3d6X1xaGVu +f+3e087NysrP3X1YS0VBPjs8P0RKUHHe1s7Nzs/S3ez1cHri5ezf4t/X2NvZ1dzn7fXv6vB0 +b2xv8N/Z19rb3/ZYS0lGQD4/REpPVmnc1dDJy8/S2+p+bm7v4ujr5Obj297g397g5OTl4er2 ++vB5a3P38Pfv6fZuXE9LSUNCR0pKTllt4NTSzsvMz9DT2dnX297i7nRubWdeaX58//Hq393f +3Nvf829ud3737+fwZFlVTkhEREZJT1pedd7T1dPNz8/Q2eDg4N/h6v52/m9lb/b69O/s5N3Y +29na4/Lu73RjaW9vaFpQT09LSUpOUlZdYW3r29bQztXd3N/q7enu7ev8+e7s7vP0/PDk3NjX +19rd3OtqaGZbWl5eXFxfZWhqbGRYUlNWWFlfZ2ppevv36t7e6OXh5d7Y2dfY3t/b2Nvf6O/3 +/vV5eXhmZV9dXF5iXWJvcW1xfHv29/52//T8eX5tZGpuaWpud/5+fP7z+/nu6ezt6vt++Hxv +eM7if9Pp5OHqcnBtaGdlYWdjZGhrfnZ7+nl3+/H7/n706+nk7ft8enRtbmt38/RzbGptbnf1 +7fp77u7x7vJ9dW9zc2ttb/727eDe4eTs7er+bm90aGRsbWtqdH1wefX0+/t1/vV/9ern7HVt +aGl6/fp+/HNsbW1yenJ0ffHo5uXn4d/g4Or1ff72dGhv/25lZGZkZml2fHf+/3lzd/p8e3l4 +cWl0fPn6+OXe4Onu7+nn7e/0/H56ZF9kbnp5b3T3+vn//e9+/fB+//t3c/327unv8vn9fvv9 +dmxoaWNpbHd1fvV9en3t8nlubXB87ubk4uLo7O/t7/P3/nl+cGpnXmdve/rx6/B++3l48Obx +93lraGRpa21yfHz/cW17eWp28ezo5/H96OPm7fZ///3/eG10b3P/bW7+7+7v+G9vdG94+vH6 +endvdHt3b3zu7vDs7fzu7H/7emNqcWxuevF7dP14c3F6WVTG2kdczs9SQfew7TVAsLEyLsGp +VS/drc4yQrrCOz3QxEk95sVtRvfJ11xj2l9m4GVc09hdae3bcFZO+9NzUm7V1ezj0WRl8WBv +X09QamnO5+jNyOlQTFbY505VzMjjatvM40tN5PlITt7ccWjfzth45X1gX19XSFBm+N/fYt3E +6F7cyd9hcNfaVE3311pMbdpvVHzY3nt6z83ud+f+UFJmXFFk5/Zz4NnhdF/g6VJa53ZaZ+jp +4u3Z221d+/NsZl5d3ude/9Xldd3obnvs5+F3YPLnZ1li591oUuvWdl9d69prW/nueXpkZejs +Y3H/avN0V2Tq9Gnq3vPd2t/f4Pj06+1/XVxqaVxdbOn+X/fi8/bk62/s4O1maWpt6l5R6dRr +XNvY7u9p59xfWvvlZVlq/+p7c/3e3/7+bPXsX1Ro+nJqeuLY3Gz85ORqWnvj8Gdj7d7v/Pr+ +fX1sbvz04/1oYnN9ZVlmfP53a+PkcvTd3u35fXx5bnT+729p9/107N19eOp5ePd9b/XvYmXu +fF1u7OPndFxq3u5t5uHl3PZRUvpnWWZmbOVuUV3h3unp9PDf3+/85+Tn82/97+7u5dzWz9Pa +4+nf2NTee+jw7m9HLig2OjQ6Ss+0sL3Cub3aWU1PXvd5ednKxMLHz8/Jy9ba5e7e0trhzcPK +Oh4dLCwnLUC/p6Svsquvv3E3LTU8NjtaxbOtsby/xc/xTkJH/8vGxr+6tra/0D4fGR4lIic7 +wqadoamoqr1LLiMjLDU+37arpKaz01hIPjk5P3S+ubu5uLe2vd9MPS4kHh8mLjzYsKehoaWs +u2U0KSUmKzd1uKyrrLHFXz83Nj1R58e6tLG2vMLL1N1oRTs4KB8lLTRJy7mso6SqschCMCwo +KDFIzbKssLq7w11CPj9cy8TFwL7Av8PaWnnU9llOPC0lJSovOVHIr6Wip669Zz4yKycrOV/B +ta+usr3M90pIV2No7NHJwsPN1M/Kys3oVF1NKx8hKi86X8WuoZ+mrb5VOzMpIyg2WL6ura2u +uNJcQTpCWmfyysPDvsDO29XU0tRcRUg6KCIoLjhkxLmro6SqteA9NS8oKC8/3Laurq+zvuVh +UkJHVVdm39bW0NPu4MzJycXGzt9LLCAkKi45U9i2pqKor7vtSz0tJikyQ9O6trGsrLbE1l1E +QD08RVlm78/KxLq3ubrD5Es7LCAfKC43WsW2qaGlrLPJTDwzKikvOUvKubaxsLi/xNdNRERA +S19cVfrNw7u3tra4xltDMSMfJCouP+a/raSjp6u330s5LCcpKzJQyby0ra2xs7vnTktCP0ZD +QlPfzL61sbGxutRbOSUeHyMkLUXfs6OfoaKpu99KLyYmJyk3a8y5raqrrbG91FxDPDs5NztJ +bsm5s7Cur7XBbjUkHR0gJS4+8bWmoKChqLXF9jsrKCYnLj5cy7auqqapr7rNV0A6Mi0uNUXb +vbOtqquuuuI9Kh8dICMoMkXWsKWioaOpsLrVPS0nJCQqMj/kuKulpKeqr77mQzMsKy0zP/vA +tK2srK+4yUYpHh8gIScsNGyyp6KenqOmq8NBLSQfHyQpNWW8raSfoqarufZDMikoKy47bsm8 +r6uqq7DKPiojIyIhIyk14bCnoJ6en6StyzwqIR8fISgzW7qqoqCipqy20kUyKyosMTtM48Cy +q6mqrbphLyYiHx0eIitJuamhnZydnqa5Ui8kHh4fIy1Az7KopKKhpq242UM1LyspLjZI1r2w +qqiqtOwxKCYfHR4iK1W1qqKenp6fqL5UNygiJCIkLT1mu6yopaKnrbDBTjkwKikuND7ivbKq +qa21yjkoKiQeHyQqP72vqqCeoKCkstpNMCUlJCEnMT7vt6yooqOqrrXYSTwvKi41OUzNvbKr +rLG43DIqLCUfIyYqQsO4rqShoZ+kschpNSkoJiIoMDhQwLGrpqWpq66870U1Li80NTpP0by1 +t73B/jw9OSknKy00T+zQtaqop6ars7vLRTIyListMTRC2MfFubKyr6+6yc7oUUlGQD9KXVdM +UnjnelJJWPFVRVVxXFBq4Hhp2MnVbfva3eDf087b5dPP7GNgaWVaZeze3NrX1Njd6mhXVFNQ +UFNg7drPy8jHzdjlZU9JRT89PkFDRktW7c/My8nKzNLY52tp/Hn72c7JxMLExsrP3WRRTEhG +R0tPWXXe0MnKztLdblFHPz09PkBESVX52M/OzcrM0dvqaWb4+vDf1MzHxcXFxszT6l5YUUxJ +R0dLVV924NLNzM3P2epuV0tFQkJFSEtSX3Dr29XW3ObueXn26eDZ0M7NzM3Ny8/f92tbWFRR +UFZkcu/h3dnV1trh+WhfXVpZXGRnaG5tdG9oXltZT05PTk9WafXm3NLPzMzP0djf6flnXmlv +e+bW0M3JzdDP3v5xWk1KSkE7astKXcDL1cXW5stsRExGPEBEQEhXaObd2s/EwsrQ3N/hb1le +YWna2+3Zzs7P2enh33BaVFZebF9+3M/NzszNztHuV1A/Ojw6NTc8P0/46cu8vcC8vMHBx9/p +7ltMSkZCS0xIVfPa1dHMxb/Ays/KzNx5bXByaVpf7N/felhIQUk9MjQ5PD5FSPK+vb63sbG1 +vcvT3FdAPT09QUBBWenYz8i+ubq+wcfO4VpMS01KT2jl0M7V2epKQUA2LzAyNj9NYMm5trGu +r7S4w9p4VkE6OTg6P0VP+dXEvby6uLvAx9h9X1BLSU5ZYfTa0M3Q3FZDST0vLzMzOEFH7L68 +u7Ovs7S7zNbbUz9APz5GSEhd393Rw768vMDHyc3mYFdTUU9OU2fe3Pbm2WBIRj86NzY3PUVJ +as3Dvbi3ubq+x87Y/V5US0lPT01OV/za3OHTztTa2NXV2+r9+PV+fnHc1Njf3dv4UUtLQTw5 +OTxDRk1819bNxMXEw8fLztPe5e5vdH5saf728/5sfOzn8fvu7Ojo93H97+/v8eHa5eLf3+Zy +VE9OSEA+P0FHS01Vb93R0s3IxMXJyMnMztXe4+dwbWVhXmFaV19pZGZtbG/09e7h5PTr2d/d +3ef37/tmZ15UVVpWTUxOT1FSUldmbnjm3NfQzs/QzczP1dPX197sdmtmaF9cXmJlZ2Zs/vD6 +/u3s/fLv9/rqfm7z/Xz4emVjalxTT05NTk1MV2Zr+t7c3dfT2djOzs/Q1NPY4+np731tX2Rm +Z2hta/vm+H3l7/xqb1tjcWlzb/n78+9sbnJoY1xWTlRRTk5SXGd28+/d0s/T087Oz8/X3N/q +829veuzm4uXg6fX6b2NgamVeYHdyefN0dH5xfXNtXFdbWVlWWl5cXGlnZW7/7+ji3eHc3t7d +3N7c29/k4N7g6eXk4en85ebm7vJxaV1dZFtfaV9fXVlcXF5eZ2xrbm5laWZqZ19p+Ovg7+bX +19ba1tze3d7h7X7s5n52bOzt9vfsfnJqbWJpamplYWxsamNfaW1nbGhvYWllbGppcPzu9fl8 +fuvp597j5tfc5dzf3+Xs7u758315eG5u+2l6dHn8dG1qbWFaXVheZHh9e/d35/Xu9HZvev5v +ZWx8/vH78eji5Ozr5eTr4fLre/lzeu317nf7/vTw/nz+Z25uZWFjaHJq73Ru/f5vc/93/e78 +bGl0dHFnau328fz87u/v6+bs8Ojz8Pp99ezteO37eX9t+W995uvqbHj3939ka2ptZ2JydnFq +ZmZiZmxoaW7t6Prt8uPo5+Hm4eDb4+3n7fX4ef5t73x3fe9vdfz/aG5oefZrYVtbXVxVVl5u +7Ovk39ra5efh3Nnoeu/v+f39c2xubHJ97nzx5eno5Oft6ed8cv/tc2RqZVlPTUxNTk1UX23f +0MvKyMnNz9vz+vxlXFtVUFNZXmP75d3Y19bb3eH093lvb/729ujb3eDg2dfnW09TTkQ+PkRL +UFpz2MvHycnJzdTpbWFiXlNSWlxgfuPa0s3P0M7P09nm8e9rW1pdaHbw5NvZ3OVqXVVNRz8/ +QEVITVv+3tTPzsnHyMvQ1d7o+mtfX25xaXr6+/P39/Pl39/j7uro4+bl3+De3dzd2drj+mNY +TUY/P0A/QUVKVWTt3tTOzMvN09rZ2trZ3+jn4uz07Ork5ePe393e3+bp8O/r/Pjv7+vs/Gxn +XU5NS0A+QkJCSE9Uad/YzsrNzsvP19Xc6ung3+Dg39zm5dzc3t/d6O5+Y2BoaGdubH3u6N/f +5envXE1MRj8/QkFGU1321tLRzMrMztTc3unx8Ptuce358uPj39fZ4+Db5vH6c2t67ff5d3X1 +6ODf5elyUExQRT0+RENIV1tk4dXQyMfLycvY3N5+anZycP3z8uji5NjV2drc3+jv+nJnZGht +dW917uHm7+jvW05SS0BAR0dHUV1t49PPzcrM0NLZ5O/6bGJz9PD68eTg3eDe3HZe3uFr6tHN +0tTUzMvS2dr9W0g0OUAyMzlETXbs1be7w768xND3SUtXQD1OX2Nz3NHBwM/HwcbR2/d1dU5N +XWFq6+PSx9bqzsrmXVNKODI8NzM8RVjqzsm5tcHAvct1WExITkhEXuPj1MbBwb/JzcvuW1lT +U09MUnh+/tjRy8nVz8XXb2BTRTIzOzMzPk5f18m+sba/vb7XU05KREdBSnPyfdLCxcTHzczS +dV5vWk1UZvPs+NnIydPRzM3qdvNURTc2PjIvPE9PYMrAubzGv7zPV1dWRUJFT/Tv9c2+w8zG +xsvbfXf+YU1TZGBddNTO0NTRzMva5+JeRDg4QTMuPE5LTtnCur3Eu7jKZXJtS0FDTF5ZVuPK +0NDGyMnN2drZdVJfaFtm9NnOzszGxc3P2VtOSjUyQjQtPklDU9rNvLnFvbjPW/hsRERMTF9x +Yt3Gycu/vsXKzdrz/VleZVVXae3/5NHS0dLc6WhYTDw7PjU0PUNCTt/OwL7BvLvC1tTVW1JS +UVlbZO3Y1NPOz8/V2drg5m9iZV9eV1xmZPXj3N7a2OXw+mVSTExHQkFHTU1Y9uPf2NTY29Xf +9efo+u3h49/f3N7f4ufg4uPh4vL67O7p39ve5drc5t/c4ev/al9NRERDPz0/Q0dOZXVs5NPU +1c3P29bV3eDY1tvV097d3OTk4uLz8u349/v+e/f9/uLk+fb28e3v+3NoUEpLRz4+RkZDVu3n +4s7L1tDM1eDd3/zr4ffx3d/n393d3t/f3+jq6O96eHd2/e/o5+Pm6errf25sXk9ISEc/PkRM +Tlfz5N3PzNDV09nb29/g6uvq8eze5e/h29/j3N308uTqfX7w+XV2fvvq5d/l7X5iX1lMSEdE +QURJS09o7OPUy8rLzM/d5d/l9vPxen7p9Xrn2t7k39zc3d3s/XRye21oa/nn3t3e5OjuaVpQ +SkZDQkJDSVFfavrb0s/Pz9DU2dzl+fns7v766uXf3N/i3Nvb19rf5fF4cHV4cHNwcffl5fhu +XkxZ+0M8RkhIVVJSdu/dzdDY09HR0972f3386fP06Ojp4tza0tLb4eLl6+z3a21va296fnzr +6+z5/ntaUFJNQUFHR0dPYm7s3drb2M/Q2Nnb4Ofh4uzo3Nff4tvc4N3a3ebh3O53/Whdandp +ZnFpYGRoWlldWlNTVVJRWl9cY3H7fvvq4eDh397d29rd3Nve4eTl7uji4eh67uzv83huZWBk +X2BmZ3R8dXP5/3X9+Pj8/Hpub2tiaGZeafn9eHZ8b21sbWpu/vx9cHvr5OPl4d3c2d7g6O3c +7W3q7WlxeHDv/WtsfnRqZWZtY2NqbWtpaG1+eHL76uPu9v92e3VzbXZ/+Ox6b/7w9vbs6ez7 ++nxx9vL2eXBxeOrp7O/r9vzy/HV89/5zbHX38O74ff37fGtiYWl0eWhlbmZgYGl1ePTs6vHs +3uL68eXq6Ol+cHV8e2p57+rj6/7v7Pp6bnF8+3Ztbmpx/n1wdPf2/Pp9dHl5bnF4bm9za2dh +VX/P4W5j/d7gfGB23+5ub2307+307+9e5NLd4n365tjua3t7e2xmXl9qZ19ZYvT5ZV5nenfr +53Vvae7gbU9V4NXb7W/u2trn7/bv59fXeE9V6t3sZ2V26+v1d2p39HZnYmZhX2Zja+7r7uft +8PDtcmty7+Xs6+7x8en1d21o/vR4aG55bmtrc/vf3ev+bmh46/Rv+/L4fn5+cfbp9+bk7Phn +aHD7aW5oY2lv+nf7a3n37XBm++fe7/P773liZPPse3du9OXk3eLi5+jc4/plW1VdXmJdWGH1 +29jW4Pj04+NjW1pya2lqa2hk/nLy+37o3+rr5eLm5epye9/c+WdZXnftc2h5+efe3eh3bmNd +YGRdWV1kfNzX7mZvfOrhcF9m/+3a2uB1bfvs2997anh48/n7ZmdrYGB9f/Dj+G167Gxnd/Rw +du7kcl5s7/bu9X15bn5qbnr+++30eOXzYWre3PVoXmvp4e7sd2f96fpjaGtuX1z82tjo/Xvq +5O3k3m9XWmZpZllUcNjY5m9u6dfkbmFZW3bk9mpxePrf3NvncWv85N3ef11bYPbtcWxfWvvZ +3/l1Z/rqbXToe1tq+vptfujzeHNy7unvcWBt8uro+W999fxtYWHw3uttbezo7uXr/n7/dWd8 +dG5obfbt5vluZWF44uJvaGtodOvd4+Tn/f72+255dHB59nh27eny7fVwbXR4a15cWlts7v1u +bm1+6+rs4extbPDp+nV+7uni3N3d4+zr6uf0b29uZ2VwfG5ramtsaGNra1xbW1pXWGF76fd9 +493Y1tPS09Xa4OHc2tvb3M/JztbUy85oPjAqKCwxNjxXvq2qrK2usr7hRjQtLTA4QmLJurKv +sbe/zeRURkZJT17nyr24u8DQQicfJS8uKTHHqKWopqSrvm9ALSMjLDk9R8SrqK61trnKXkg/ +PERy2t/MubG2vsTVTi0eHCUvLy9ZrKCgo6WqvFE6LCEeJjpk0rutp6mwv+tOR0A7O0zWw8XG +v7u7ws7X3WpKOioeIDdcPjrAop6osrjAWTovJyEqVMbRyLGqr8TtW09TXlNIYsC4w9rb1dTU +0dv13s3VVjYkHitNPzFQqp+msLa+/kI2KSQtcsHMwa+rsMDhTUhRW0lCXMW+zebc2d7b1s/O +zcrUYjogGy3sQy5ppJ6lrrrbS0IzJCIyy73Ct66uuNBHOUBdbVRixba3yHBkfmZaad3PycHK ++FAxHh88VjM4tqOlrrvXYVc/LCg22b3EvrSvttJLPkhzfGBl0b68zlZQa/Xs7NnFv8zY1l08 +Kx4gPFg4Ra+hpKy661VSOSkpPdK/wbqyr7frPj1LUElP5cO8vsvc6OR3WmrNwM3TyNVYQS0c +Hz9NN0mvpaarvF5qazkpLD/hwL6+ubK4Xz5MaFlX5M/Fv8vtdGpbV/vWyr/Bz87TVj8wHx43 +aDw/uailp7T2dNlEKyo1R+HMzMK1ssZ259pmUVZb3s7V5N3PzdHY0svL121d8HRINyUhOGQ3 +NOmzrKu2zsO3zDkvMjpJV0xouK60vsPAye9OP0NXWVPvy8O+wMjLz/JdT05NQ0E1KC5SSDRG +0L6wrre7r6/LSTswLzg3M0vBt7Svr7a8xlY8Ojs8P07lwbq8vbq+0OLnWEI+MyovQjYuPlzn +ubG6taurtcZmPDc4LyszR1fNtrKyra69zthdSEhGREpRUFNVUVlsdvrVyMzR0dd3UkY8O0FK +S1F30MTH22vr2ONpau3WysnQ1s/P3vtqaW/t7m5vZ1pWTUtSZvTczMfJys3iWk1GQEBERkpV +aOfW2nBSXeva1NfWzMTK7mhiYHD5am3m087W6PH2b21kYvnh2tTP0Nnkc1dQTEFASEpLTUpN +XGVZV3bYysG+vsHFzNv4Xk1HRUhUYfnazMjKz9zf3tvY2ODl09He8O9xWFpRRDoxLzY9PURc +17uuq62us73WSzQrKy41QljavLCtr7a9yOVRQTs9R1V53M3Bu73HztDZ9k86MCgnLjg5R8y4 +q6SmrbO+eD0vKCUpMkzcvrOsqau0x+pNPzk4O0Zt0srEvLu9wMnU6WJFNC4pJSw8Q1XEt62n +qK+6zU45MS0rLj3txrixsbGzvt1aRT4+QUlW3se/v8HBwMzm72hPSD0zKycsPEdW0cK4rKmt +tcPwTD84MTA1PFXPvrm1tLW7w9BcR0JCRk9g+tfKv7y/x9Hb6WBIOi8pKC42PE300LywrKyt +sr3N71E/NzAvMjpHcsq9uLWxsLS8z15NR0JDQ0ZOaOba1tna3fFeU01KSUpJR0hMU1dm6NPO +zs7OzMzR2vNhX2386+Hf29PO0NzteGhiaWZYV15fYn15cuzY1tzd5u7vcV5WVFhaWVtdXltS +T1VdbPVxYm/u3dbW3vHe08/O0tjf3NnW1trd4uxvaF9ZW1teXlpibG98f29pfXhlZGlcUlBQ +Vlxkbm1qcuzb1dTQ1dnc3eL8/3764drb1tbX2uHyfWxhW1dWWF5mXl5q/uvf2Nvf5vtmXlxd +WVBOTE5YX3zj3NnZ2+Pp5ejt8X388+7p4NjU1NXV2uDp/2thXmReYGpv7eXh4OT7a2hjXFlY +U09PUVVaW15dZW7t3tvg7ePj59/h3dfa29nU09jZ6HJucW9oaXF/8ezt73xtX1xbXWp2/Ht6 +9vd7cWxnXllUUlNVWV5dX2dw+erb1c/Lzc/X4e54ZF1gbfjq5trUz83O2ev/aGJjZ2ZkY2Nr +en5vZWBeW1xbWldVUEtLTk9aaP3f1tLQzs/S1dzl6u3t7uLf39nV1drd4fN0eW5pZ2NdX2Rq +bHR0bHr18+frb2VcWlVWU09PVFZacPjw6+jq9+3o7fjs5d3b3NzZ1tTS1Nje5O52amNhaH34 +bXr3f+ztemtsb2tvenFnXFpZXWBeX1tZVlRYXGFjav7w8Orf3t3Y0M7NzdHX3eDi6Ozq7+zv +fPx6bWlnZF5eX2hjY2Fna2dw8eTz/PHydG1uXVRUV1teY2FibH7o3tze3t3h5ujn5+Le3Nzb +3N/e3+Ts6PJ1bWlkXFxjYV9oaW599+zt+X50bmlob3hyampxb2VjXVdVWmNtZHbl5Obi3d/j +5OXj3tzg397f3dvd4eXm6npnZGVpamdpa2llbG1mbX15fO3s/WhYWmJgYmJkY15cZGj992lp +fff47Ofaz83P0dDX2+bq83Rxb21kYGdsdPfs4+nr5d7Z29zfd11cXGNyd2tWS0A5NzY4QVfd +xb25uLq7vMDM6FlHPjs6PUVb3Me/u7i5vL/H2PhcTUdGSE1Z/djNycvN22pLOC8rKSsvO2LF +t66sra+yusXcUj44MzAyOkjqw7iwr7C1vMncZk1CPTs7P0dZ3Mi/vLy+xM3V3V0/MywnJics +OWi8rainqKuyvdNRPjQuLC0yPWPHtq6sra+4xNpeST47Ojs+SFzbxLu3t7u+yulOPDErJiUm +LDdYwK+qp6eqrrfH/UU1LisrLDNH2bqtqqmrsbvNaEk+Ojg2OD5Jas29ubi4vMLL6E48Lyon +JikvP964raimp6uvvNNZPTEsKSksNUjQtq2rq66zu8xvTD87OTg6PkvjxLu0sra6wM9sQzMr +JiMlKjRRxbKqp6eprbS+1005LyooKi46YsKzraurrbS9zWdJPjk2NjpBY9TCu7q6u77J2U48 +MyooKiszSO2/sq+urrK4vMrsVD83MzI0PU/jxLu3tbW3u8PV/k9DPz0+RE1XbN7OysbIztfm +b1hNS0tKS09TUU9NT1NWXm/z5N/a3NzV2tfOzszJy9DW4O7/b3B2e/7z/m5oa2NjbHzu5eXo +5u9xXFJST05UXmRob/NxbO33bm5taG5tYmtu/d/p4tva2dvc4eTl4N/o5+p2bnpmYHv+dOzr +8O9zdvj1+3Fvb3dx+3p1c3BiYl9bXV5mbHf87fX4/HFycfvxdXx3dP/s7eHW3OPe3ux8e29t +Z25vevnw+u3q/ejo9fj4fmtuaWhraWZu9+no5OLo4ef3bWJaV1VWVlhfaHvn5/Xr4Of79fdt +cnX49Ofh39jX2tjb5d/b3uvu/GhlXFpbXVtfe3t8+ubwen1pXltZVlRXU1Zp+eDa1dXU1dXZ +6vN+fG9rbWhmanv+5ODq2t735/L+eHf6dWNoaGdpdO716OHi63poYl9ZVltdXWRrbXjl5Nzb +7u30feztdvrx9+7z+/LpfvbmevTmeG5+aGR1b/nl6fT083z1fHlka3JuaGh8Z2bu9HTq3d/r +9P5nbm5iaWZ873pz/+ru5O5s4uVhXmhve3T++P79+Ovx6ujf3+zr+25vdG1ndG5+7vfs6ens +7XdjXlpfY2NiYGdub2/57Orq6erz9W9s+u7o3dzo6ePg3+ft73/zdW5pZWNlbW5qZ2lnZ216 ++35+bGdhXWt3evzt7+7s5N/f3eDg5fX8+Xt4//x9/Pf6dnlucXfyeG1ybF9U3+tg/ePr9e36 +4edrb/lzbV9jb2Boanh1e+7r5e3v4uP17u98eXN6b3h+dXX/7+vi5P3r7nt5dHJqa3Tv7Wxt +8uz78u5saWplZGZrePltcH59+Px3+O/x7u59d/v9e3T65ero5Onr6uzt+Pf2fHtucXV8b2dw +bW7+8v5pbmRodnD87/H8/err83tw+vry7fZ8fvb5ee79/e3/em51aGp2YGBtfO7s5+ru7/np ++vzu7vjy9HTtfXl5dHr89/f/bGphYWFq/nFu+vL+8+96d+3x/X76fHbx//v39n35/Xl7cPz3 +dv/u7vP89Ov193Zudn11a3Budn7wa2RscP74f/nz7+t8aW5+d/F3Z3N28nj19Xjz+/l2enhq +eXju4OXqdnl7fPHv6nt+83Z77fLy+Pf5bm1ye2psbmV0a3h0aWp29/f58HxvcXV5efLu597h +6enp73tl5Nly9O13ZGtjduxybXhtZ2dlZ2lqdfvy8+jl6Ozf4e/wauXsbHn59nzfemFkXVVt +cmD2++/b0/v65m1qXmheWmh6+NzU09PU7f3e4/1kXmFYV1NffOzj5ef+6ej3fGtlZVtdX2Rl +Y3h8+/Te3O7q6Obi5+bu6Od17+zw/Pnr/ufk7m5u+W1neP94/Gpofe17ZWViXV1aWlxla2Rf +aHFu8err3tzc2Nfa3tzh6uPh4u5zeP7t+3z36vJvdvDy/fd5ZW53ZmRaTkRHTktJS1Nh6drQ +ycXGycrN0NXldmJWTU5QVVlk7NzUz9DMy9Xi4N/3amlpZV5jaWtv9/J0WUpITUxDP0NKVWXz +3M/Jw7+/wsrQ2ehuXlxfX15fdd/X2NjX1dbe7vl5aV9eXVdWX2ly/PD5ZlhOTElGR0pOV2X8 +38/LycXDwsnP1+XseF1RTU5RV2Ny89/XzcrKzdHX5GlebW5bWWBucHL74d9mUEtKSklFQ0ZL +VFz918zIxsTBwcfP2ul5ZltVT05OV2T95NrT1NHNz9fc5vptcmpfYWhz8eDf4uVpT0hGR0RA +P0BHUl/mz8nEwcC/wMbR5fRtWVJQTk5SY/fj3dzXzsvNz9rv/G5eV1RXXGXz4N3a19vkZk9L +SkdBPj9ETFr32MrExcTExMbO3e52ZldOTExLUmbr2tLOysXGyMzW53VkW1dWV1pdcufd3fVa +SUE/QUI/PD1JYNzJwb27uru7vsndZFhPS0dEQ0RJVunSzMjHxcPFy9TiaVROTU1OUl3r1srE +z2dCPEBGPTQzPFLmzsS8t7a3trnC5lVNS0M9Ojs/RFHhx8PAvbm3vMnfe1xNSElKSk9s08nH +zNbqVT85OTo4NjdF4svGvreys7i9xN1VRD49Ojg8S1xx3sm8t7i6vL7K5V5PRT4+RE5YYd3G +vr28wnw+Nzk6MyssOWXTy76yra2usrvUUEQ/OS8tMj9NUGrFtLCytra6xtxqTD47PkZOVvHL +vru6usZzQTQvLi0rLTdTyLy3rqqqrLS+3Uc4Mi4sLTM/Yc+/tK6srLC7x9lYPjU1OTxCUOrJ +v7q3t7i9xNc/KictLyomLWS5uLetp6aqssJSOTUxKyksPO3Kwreuq6yvu9RrWkU2LzE9UWLn +xrq2tLS5xM/vPS0nJSkuLzBHxLCrqqqoqrDFSzQuKyssLj3bvrevq6qsssVaRDw2MDA3RFzg +xr28u7m8w9f4X01NVVhBKyg9WzkxQci0tbSwtry5wk80MDo/Oj5Yz7mvr7a7vMZvTEE7PEVJ +SE7dwb/BwMbHv8hZTWFHNDQ0LSw3T15sxa+srrS4wdtcQTMuMTtGWdC5sK6wtr7PXUI7NzQ7 +TF/nyb++vsLFzW5QT09NT1/u18nEzkcsLD09MThNzrSrqrC8v8dfPC4rLz5ozsS7sq+wutZU +QDo5OkBP9ce4t77EydDeYE1OTklV7WhFQTwvMUNKSPDGvLCts7/R900+ODExP+bFvLWztbi/ +7kE7OjxCS1zgyb++xNJ6X2xlTUdQa9rNy8rGw8vbcFA/LSQqNz/nvb+6ra2zu/84MDY7P1H9 +2rqur7S/ZT8+QEBDS0xbxre6wtJubuLqZVth59TPz8/NfjwxKCYuPErWurWuqqy2yE40LS4x +Ok/cv7Gqqqy240E4NDQ2O0jtv7e4vs15TUI/P0ZX4s/Hwb/By91wVE5QT1BZa1w/Oz08SvLa +0MjKzMXGz9PkWVFfff3c1+/p2N7z7nBhWFJg6M/Iyc/Z39nc6mJSUFZsZWR3/+HoTTs0MTVB +ccm8uLm9wcnXZUg9Oz5Ke8m8uLe8yOlaSkFAQ0lg1sbDx8rZZ1ROTFBj+Oze19HLxsvV315P +T1JJODIvLjlYxrSusrm/0m1dTUE+PkRXzbu0tLrI+E9CPT1CVPfay8bGydDqaltTVVhe8dva +2djY29nb9GVSST0yLi4xPnjAtK6vtb7VVklEPz9GU+PGvLi2uMLiTT07Pkdd3c/Ly8/b63hc +T0xOWfvWzMnM1N/2bV5XTktOTko/Ojc2PVHOurGwtr7OcllTUlRZXF133MzDwMLP+FdJRkdQ +ceDb2eHw93Nsdfrs5t3a3N/k7np1b2hcVFNbY1lLPTc0Nz9Zybiwr7W/1WxRTEtNVGB+4dDF +vry+yOVWRT4/RE/329LR1Nvf7G5wbmFpZlxmfX578PF0eHpvYUc5NjAyPVfItKysrrXG9kxA +P0BGSlj4z765ubzF7ks/PDs/SFry29XP09ja3uL8a2phanz06d7Z3t7ifF9UUUxBPDk2OUNi +ybixsbS90G1NR0VMVmnh2c/IxcPGz2tNRD4/R1rr0szLzt75Y1lZWVpt7dzPzM3V3/dxaWRl +aVE7NjEuN0bdvbCvsLXE4VpGPz5AQk7rzLu1tbnA2kw/OztDTnbaz83Lzdv0ZFpYVltjd+bf +2t/i5nxpYmBfZGFTRD06NjxJesa3s7a6yN58VU5SUlRf69vLwb/Dyt1aTEZHT1x76+Ho7u3y ++2RbYGVv/unn5OP5e2RZX2hucG9eT0I7PT9O58m9u7u/w87peVlNS1Fj7s/JxcXM225bVVFZ +WVdaX259597g6vz9dG1sb2leW1xeXWBcTk1YVWji39zb5Xf57eLR0tnZ625ubm/r3NnT0tPW +3vBtamBdYWBmbnduamxseXtval5bWlZYY/Tp5/FfVVZYafDe2drg6O7x9H1ubnv04tra19La +3eD7aGloZ33l4uLucHBsYltdXFxhZnnz7/F8d21nZmRmbHfw8/rs7HpvcWxx++3n6Obg5e3+ +enP88vbs7e99cXdtZWl0++vm3+Hu8fR1ZWJlXlxibHPs39/h6vlrYV1cX3nw9Oz18fFyamZn +b37m6e3g29/t+m9ud3h1bG11+fj99eri4+7x83/z9PtuXltbX2Z09/Xu6+3o7fp1dWtxfnz7 +++/u7XVudm91bnRqdOns7397a2pvdf3v6ern7X759PPs6Onn5uru9fdtYmBeXmRve/Hp5OHr +/H1sY2RlaW1v/u7p4+r7a2JkaGpu9eXg6O3r93x9dnFyfe7z+fh7c//v8f7+6u7y5/P19Pt0 +bHr+c/ns7vx3fGtmYWRramZrcG5wd3ZveHd99PDn5OPi5en0+nJ09vjn3d/l5Onv7npqamlr +cHBsbGFhX19jZWlrbXL27PP++/Dx8ens5+Xo6ezs7ers7fP0fGpqbWx69H5sZmlmZmptd/f8 +cW52ef3y7+3u6/N7/O3p7/z7dHvu7e3u+PT3b2poZGv783t3+PD7dXh4fHp4bmt3/n3+/ezn +6/d6cXP+bGp3cHF5f3x1+u9xanX59+/t6ur69PPz5+Hi397reHFtbGlnanZ9bmlmYmdnbW1n +/vD1+PN9een6dHv+7Ovu5uTr+nJ09f1ufO3v93xsa3f+f/948Pd4+nxzdm13end5eHB8fvzu +6u/3dnd3amd58fz28O3k7Hp9+3n79HTx6PJ3cm9wbm138fdtcm1udGVq/Obr8erv8fJ77u33 +9vVxevLz/fz+cHF2fntyc3h4d3l2b3h9/vr0fu3h7Ojq9vzn7WRof2x7+2dnb3Bzb2dpemhr +7nvp5+zv9Oj67O/k3u90bf7v7XVu8vZ6b3L3fHxucPduYVxfd21s/vbu//n3+PHv5+Pl6ex7 +/O95aHv+8/pu+et3Y2Zic+9yc/X8/vh5bm14/O/p6/lmavbw9vTx5/hmZ213+Ov5/Pn96HBu +e3vu6+n/d27++G/6ePF7bfVvdOrtbG95fP9z93z7/W/7cGzn5O7t7+93eWtfevt1b315/PFu +9/p1933w6fD/9+ny+2xr8nX66O31d/Hn5/J+6ux3ZGF1bFxbbPt4bn3g5PRuZXTx7vP9+/Zw +fPJqZnrue3J8+O3q7ezp8Xl87f109ud1c3hy+nR+8X5vbnxuZ3JpYnV7ePbvfe/j7Pv5+P93 +9n1s9nL8+2fx4XtscW5u9en7evPu+Xp1ZnPs725u++nneX3z/nhv93Vu7fVtbGto8Xdg//Vu +8OHrfPvr4uh89ndlfelpZfrr8v15+ezf+Gt2Zf3uaWRwZ/LmbV9u6eT3amh2dm3+8e7s7+j+ +dun1bGxvZ3vvbvrz++fh5upucO/r8Xpv831q+nJcZ/v2/21t8ubo73N96OpycnF1Zl/xeXT7 +dfP9ZmVq7+RfZOnr6erw6eB9dd/1ZPtycvb+/Pdz9+ZxaefmZm38+OJ1XWr0emhqdnB+925u +ZGRueOnw8Onr6+bx6en39XVrfnxtfnB56ehya3Z2/XB+7fDnfG79aG7yb2r27PX1b273b3h3 +ZHB+d/p5Znn5+vp4cHjn7f7i5P5+a3ru7u/rfn3tfXR0eXV58nlyamvv9mty8u72amFv+flf +YO//dnl67O989evy9/vu4evv5+zxfm9y+u9tamtvfP1+a2Fn8eplaPJv/u516+Zra+vz7N7w +a2xueevveHp5cOrwWmLx6er5aP7g+GViePl/dXZ6dvT3+uzd7nt9cGlv8e3+enV07/1odHR5 +bWBz5m9f+t3o9fl8+/Px7u/w/ennf3P1dv7ua19/c279/vPvc2/6a2FhamxoamL33X1w8Pfl +3vJ45uN45N52+N3fc2x47exrXVz9/V1eaGf5a2Nt831y9mxze+nd733z797ffP/m6+98a+Xq +eW50///7/Hn1dGFtb2Vjfn59eGRo4exvfu7j7mp83elvcPt9X2B5dHRs+dz29d/0++5ya/Vm +X/t+bXPz9fb28Ozr73/65u3873Zs+3xtev14fnZqa213a3Dd9mj14+vo6XHz73teXnP8Z15v ++Oz6cel+aP3ubm59duvh+Pjg7P3z6Ob/++94ZvTt+efuZHT3bP3+Xmf6Z2pja+/y6vl7a3B9 +7/9o/3ptb3L9fW/35On49e3q7/Tq7u3i9P3n7P3+8fhv7Hlh7HFY/XRcXWVmaV9cdfX+Y27u ++Pru4ODj3d7t9efd2+Lv7/n0eWBtbGBpY2XvY1luZ2BmcP7s/md43eH43/hj6+l76/Fx6eht +e/1q7N5vaG/v6vFja9vha2/0d/Loe2j99njmbV5vdWpoXFho+3pqb3j8fGlw3uh83uZt7+3+ +2t115tfi5Op87d3vW1l6eVxYY/hsZWxkXvN/cG5oaW3reGT57vXg5PL35eR6duzq8Xl/8PDk +7PPkeGzn521cX3/rZFh+3Xtid+7ecF7/+11c+mxo7/P773t+6tvf729cc/H49P557t7kePfs +53Jl/nxx92pm8u708m5kdun3WGfc5mJr5uL3bfDjaldt6PBqYvXc6Gr843r07W3s7m76cmt2 +cnD15nP+7Hx6b2r0fmRlbe/kdmN3dG9rae7j+3bs6+z87tzi4Orp5e5ub/H1eWdncHlmamlo ++nxsaWJq9u/27uhydO38b393dvxwb+zn82xf9+JfWe3p8ubo3dv/euXr/m529+1jWnV0b3Fo +9d53/eVvZur7Yn10Ze57XWZ7+vxyeuDld/ru821t93hpfvPv5Wxn5O7r7+/e+WT/8XJw7u74 +fW52+2hm92dv925zbF1v63Z6693f/v/veX1xZm5rdvF7env07n37d+fmZnvq+v5mY+3sb2fw +3O7/9/bp4ntx5PtfafhtaG1dbuZzbu9+/el2ae3vb+t8auLxaH3q7nBjZWxvfnZ57Op2eOrm +7vx16e5nefN06uRycOJ9Xv3zZ2H+5f9lbu3d433s1+Jren1qbGBcaXdgad7rbWz273Z2ZW7v +eG/x/ujodPXj5P15++/3cnvza29++nly8PduZPzwa3D37/P7bXze6X7k7WluaGZwaV9063xt +9d/k+ujndfr6b/j7a3jueW/0fPryde19ZvP6aHD6fvrq7vX9+fxvbGthZfPpfnHk5vv0bGj8 +8vp1a3jt6/9zf3z6/W3z5+z58uju7fT4/GllaWZva2Z37t7e/Xrl8nXvfm52d19ke3FnbfTx +fnNydPv7ePbw/u3z/+Tq+vDt7O3z+/fk7XJ0+vNsamtpa2txaGhsdXBt739p+Ot7c+vwbm7u +7G/z6fb28PTz9nV5+nlr7uX77PH16+9vbfp8amVxcnx+/vtyenl4+/T/dnRx9fL5enf78Xv7 +5+/9eGpp8/lrbXn5ffrw/ObuaPnrdmjy6n7y7fd39H9+6/J1/fpjaHtva3vv7fj7cWpvc3t6 +c3H27H1sfv1w+fR+8/57fvjl6Ono9X7w/G/48Hz98GdieH1wa2tt/P9zdXxxdfX1fG5t9vdv +9uzs6PJ97Ob8fe12aWxv+/r9fnJucm/17np99/L3eG9tb3h7+O95cvf2eWxmbXn66+zo4Ov+ +/vH1dfrp7X56b2ptd3rz82tqc3JpZGt2f21udnF9efno7/nk4u3z8v3u5+nn8f3+8fJubHB2 +bWhte/78cGV3+29x9/d8+vh3ffH19vp0bnduePtzc3zx9Xzy6urq8Pbt7PTy6e1ycv78cGRp +a2tpbW9tenJwefn+/354/u3p9ffyfvjz/fb7/e7o6+fp+nRz/fh6bXN0aGRkaXj3/v73endz +c3h3dXd6/vD4e/pxanr08vL19+rt//7u7PTs4fB8fXdudHN69PD2dnNtbnh8cnF1bm1vbGhk +cHx2c3J98vd4c/Lt9u/37+zm6/zr5eXh6O/s6vT+fG5iYm1xbXFwbWhvfW5qZGFoeff2/nd0 +d3p8+PPs5+no5eTvcHH+/e3m4ej9+O/7dHr39Xh2dnJyd3VqYWJpb21pbW1wefj38PTx7PDy +6+fr+/Lu8/bt6fr3em9++vz08nhucHt4dv18dnh9/X17/u/t7vjx+XNzdHFvfXtuZ2pwdu/r ++fr8fm53/Hd+7Pl37u/18vDq6Ovt7/JxanRxZ2lxcnh88/Dt6/h3fn93c3n48/52bm99enFy +dm589H7/9f588PH+e3h6d2x08+7y9fl8d3vp6HVv+/d4bHLu82lkbXVqafbj6e7q7f/7b23q +5Pd2fff8d3l8+ux5ZWVua2dqfvX9bW57dHj77u/u7O/w8PH3fXx+9OnteWpsfPH1e2lqcW50 +/f5oa/76fXbu8Ph4au3k8evsfnZ4b259fW1z+X9ye/v8/Pz76ePx+Pb3+/tvbHRxcG13fv/4 +7Ojt7eHm+3F5bGx+cmVjZWJjbXb36v587/R4bHr5f/z87ubn6vHs7392cnbr4+rp2dLY6ubl +em9+YFteVlFOVlVHSnPsdeHR09LddOjdb2T77+jmbmvd3fZ0/+zsfHHq293k5dnV4Ojl7XJp +cWFsZFpbVEg7OFjuTF3Gv8vXcOrRbE1q2vx3fHnazdneztTrbmfw2d7x4s/Q5/z26nxQXOxw +695ILC9QSDlbvbi6xtnAwkg7U3xbWF7qyMne591qSURS5tLNysK/y/NfX15ZXfPa1NDPz9np +Z1hfWD8sLEBTO0m/trnC49XA+T9N6O9lYnvHwdvh0/FkV0liz9zlycTN32NdblRMZNjPzM3L +xsnpZkAuMC4rOVD3v7a+vrnRVVhPTF9kXtPGz83Jz95oTVLydvXPx8jL2WxiWlFTZmv41s/N +zM/Nzf9QRTAjKEFCRcSurrHC9c7nPTlPYFVaa9C+xPlk1tdPRW7HyNnPvbvOV1bh9k5P38DG ++9PE3ElLPS4tKiw95NrHsLW8xdRVWUpBTt3m2cjCwcl+Udf4P0jezMnP28C/XUdeYlNOUvrK +z9jIxczL0vDqUC4uMSYrXddvtq23usdTZt89OVzj/M/O076831hjSkhhWu69u8a/xndVRj1N +++nPwb65vs/N9zw2LywpIzW+4FW0qLfFbU/jYjQ8y8r23tfFus5a6thZSVrYw8rdzMDPUk5d +XFdW78bEzM7Ex/BaPzQ3NSQj3sRE26ytt8JN3MFHLkzcYFnqzri57HvO4EtFTPbM5urAvNRc +V15iUUrhv8LJw8DE2E0+NzQyKCNdwUf3rq25ulllzk8uQ/VVTu7RvbnO2c3UXUtOa9P55cW7 +xtrg4+hYSW7J0OXZycxsRT4+PTQvKzbc7knMsbO8xuHFyUs7T3JTUGL60MfKysS/zvNq52FT +Tmfd5nvXx8zX5NznalJW/HZTSlhnTzw5SFdFP03h1+nl0MfGyM3O0dd+W1Nbavnr3s/Kzt7q +5+R+YmVv+vlsb/Hi5ePt5tbb5Ojj4+pfUUlKSkE8PERKR0lg2MzKxcPFytXyaVxYbfj+59fP +1NjZ0NHjdu/n8fbq2NDP2/7r3ed9dvp0aFtLPDY7Qjk3RWtf+dnMwb3Ay8XL13xbTFdoV1x8 +2tna3MzFy9XX1drraHHu7P7u4N3wbuPS3V5dX0k1Ljc8NTVH383Av7ivr7zK12hHOjY3Q0tM +b8W+wL27vsbTdl5TTEtXb/LXy8TEyM7MzPVbU0g/PDkvLj1EOUTRwLy3urSwvnhoX0I5NztI +eG7bvre6wcfEymVFSFhOR1Pey8nLwbzH8fvT5U0/QUs9LCtLSzdByr27u7+0scVPe2VFOjo+ +W3JP4r67xcTHw8tdTmt1R0xq19DQzb28zNzV019FPkI7NzItOvhCRcK3wr27vrnLSEzsQzc8 +SFrmadC3ucbIwcHMX0/0805N8NHN0dHFws/x3XhEPD07NCwsP0c7Tr22ube3sbTOS2pdPzY7 +SWpwWM24usXHwsLdTlRqVUdOX2z04s7AwMrMys34RENGNCswOTQ6T+K/t7ezrbPG0PFNPzg1 +PkhIYsi+vr27vcTdXnhYQkRPTVVeas7F0NfDw87T1dh4QjY4PDQuN0/+58u5sLK8vr7NWkI9 +PT06Pl/X2s6+urvAzM/ZX0lITEpLTVfv1dPLwcPKzcvN60U+SjwxNj4+R1FtyLy+vba6xNXt +XFJEPkJKS09s4czIy8rHytTj7eR1UVBfamFreu3h4OTb2u5hZHJSTE1PTUxRXO7s5tvV193c +3vF1Z19lberk3dnb3Nze3uZ0alxXW15fZnjv39rX0dLU2+Pz/mZVTUxLSEhLVmnz5d/a0tPW +2uj27vxmZ3X9/PLl3tzd3+Pzb2xwbG9zamrp4+/08PH19vru8XR8cGlmXmJkW1NWXV9eZX71 +eXvz5Nzh8+3l6ujs8eTc4+je2t3h397X1tva2v1WUk9LSkpKS0tNV2r88OHX1dbV1NXZ4u/3 +7WRQW21kafbo2NPU19nf9mxkZFhXXGZtdO/k2trk6OfzZ1tYU1RebnBvbnvv7fP+9nr/fnj7 +8erp8/f0/fPn5ejl5N/i6O90amNcWFlZWWBz8efj3+d9/nhvZVpgZl1eZ2t87e7u4dnU08/N +0dTY3ODn9HNiWlVRUFFST1BSV1xcX21vePLi3dvV0dTb3eXw9P38bXF9bWpjY29+7eHf4+ff +3d3e5uvxdWxqbWpmbnh4anl5aWNbTk1SUlFWWmBrfefe19jb293h397d3t/f4Nja3d/c2dnY +2dvd53dZUk5JSEZGR0tPVl1u8+Pc2dTS09TY3+rq6PT/+XtqaGxmYWJv/XHy5N/c2tze2trm +6/D57eji3d/sfnNfUE5NSEVHSElPXWT53NvY0s/Q0NHW2dfa5/huZmh09/Xv9vf47d/Y1dPR +1dvh/WNWS0dFQ0VHSk5XYnLp2tbQzdHW1tnf4uPveG9rZmlv+XZsbHR//O3n3tjX19fa2tzf +5OTo7m1bUk1LSkhEQ0RIUVxn89rTz87NztHS29rc5OLc4fb9enh4/HlpZWhqcfPp4t7m493e +29zk9HBbUk5KRkZFR0xSXGlz7t3Uzs7Oz9TZ293m6e338vl2aGhsffz4+erd29rY3N/d2dXV +2eP4dVxQTEhBPz8+P0ZMUVx94NTKycrJys/Pz9fa3efp5/R1ef5sZ218+ezm4+Tf29rd4uTi +4eh8Y1lQTEdDQUJER0tPWm3s2tXQzsvMzdDR0trn8fb8fXNsa3zz+O3s5NrW0tTW2dnd4uDp +7vV0XFJMRkA/P0BER0pPXvff18/OzcvJy87W19Tb4/Nyb25rZW13e3zu6efe2dna1tbX1dTX +3eH6YVFLR0A8PD4/P0ZOWXfZz8zLysjJy83W3dnje3d7f312aWBi8OHs893OysvMzMvIx8zV +5XJOPTczLy4vMjdCaM3BubKvrq+2v8zwSjw5NzQ1OkFY28u+s6+0t7m/215XVE9MWN/X1tfV +1E0tLDktJCxJXnnArqinrbKuukg3OjMrLTZL997Dr6yytrW830xCQTw3P2zj1b+2tLrIz9lC +LScqKyUpPN7JvKykpa2ztMZFMzEvKyw5XdrItKuttLS50k5FPzo5P09v1r62t7i4vtRlSTQq +KCkoKjNK076zqqersLXBVjs1MS8vNkzbyruwr7S3uslcRUU+NzxRZXHLube7ubXA2OpJOTMp +Jy4sKjrl2cOvq6qttLe+WDw9Ny4wO0pa3L2ytLm1t8j1ZU89O0RSUmLFvL++trjI4/ZYNysp +KigmL0RS3LesqaqqqrDJaU45LSwwNTlF2726tq6uuL7B3khDQz47RG3g38W4vMK+xW9CNy0r +KycsOD5Wva+tqaaprrfGZj0wLS0sLjlIbsa1rq6ur7TA2mRIOjk+QkhizL2+urrCy1s3MjMn +JC81LkDAubWrp6mtsbbHSzs6LyouNjdDzMK/r62vr7K+zPBIPz48P0dQ78/NycvRTDpIOCov +OjAzasvKuK6sra+wtsloUkAyMjczNEdkaMm5uLe0t73E0fZlUElMTU9g7GzfzVlATFAzL0A+ +MT3a3Pe/sri6tLO+z87iSDxDQjk+WU1L0cbOw7m+ycPCzdbW4l9ceVlNXltPVko8S0cvOWc/ +NHHGWW65u9G/s7zPxsN8Tm1lSkpWWk5V6+r83MrJyL7Ay83N2WZcVkVBQ0RDSl5ST/dhTFn0 +U0lrb1Bi19Xh0MbK0s3K2OfY2vr+/VpYb2dm6dvc08vP3+Hb7GlfVUxJSk5WYGpy5dzi39/g +7ltWY1lLU11PVXBzdeba3dzT1drZ4+7t9P325t/c29jX19nb6W1fWlZNT1RWUV73dfvr4uDk +293r8OjqZ19oX1xreF9p821gXF/m61Zh2/Jb5tNoW8PDXdu911Pn2lZKXWFPTmvo/njh2d7Z +09flcGVeVVhdXGBpaGR24t7m6ftraG9tV1Rka23r3NnX1tTd5Od8bGhaVWFoZ/jk4+Dh29ja +3uB8X11bWk1Lc9lYU9bPdHDSzfNb7t1oUl7+Zl/v2uLs4+f1/GtmYlxaW2RkafPm5eTc1dvj +3uP7bWtvbGRdYPnp+Ora4u7i5XdqcmtdWl1n+H/07WlWXtbNa09t1+xUXeb0WVrp2+X899zd +8nXr4fF2bm/5+Wx84+Ty6OHf5PpmY25uZm/0bF1p62xZavd1ZGj7fl5ca/drXnra2uve1tno +3tnneu/vaFhf+GhaZHvv6mxw5+t5ff3x5fljX+Lf/vtyZXJnX/Lr7v743m1e395vc2Vt7FVh ++GPmdn7k6P9q6O9W+NZu5edPf894XGRe6uZkfc/SbWnv5t5nWWrSW07XYnHmXO5u3WVZ6OD1 +UnLdZ27seHr1/2TZbGrZ+PtyX9j0dHb+/WbpX2vz+W9izvNqd+zea2rdX356V+/YbV3U7WFv ++tFpXe7p8mZtbnz9YVXs52jgaGDn3ldt42pa6udf/NPi++xn33702Gv3c9lccOLkb2TifnFv +Y3v3aVRh3/JX+310anRu7dxvWOfb+HLk9+B2325z1nhe3ONe8Pt473FmVePjV1zXbW3d9Xrg +aWbseGRp3Gxkbm7rePXq6+3d5vxv6uV0WGzqdGL4d2H+cHl9du5s9HX1/nx1cenrcG/l/PR7 +9+h84fVt6etxYG/pbmBw/HV86/hfZXz9afTu+3PmcXzmffn9d/p2aOrl5u7s6/5r/G9fcnPv +5mxq7Hpk5vN4fe5mcuphYO/67fHncfneeG1m7fBk+fJj/vprafJn7+94enD57nT3cuno8ezl +53nn7Hj4b29vd29h+XXudWTu4WJo/GJ+b11l+vh+7u3o5/jv4/f+fvb27P18/Xdpa/zs6OP5 +bu3qYnd7Z2xp+Pv7e2Jw/fVtaHXs+G1wb3f5b3fq8vbo/Oje6Ofnc+vm9up9eG14eG5ucW37 +fHFoW2ppbnJq7/t7bvt66+tx8OTq6PRv7eLp6unpe/x4dmJtY21wcHf3eHx+6/V9+ej3+X99 +e3J3/Whje/5y8PRue/57+nx5+X/n/Hp+7u3s5+/8cnVud2l4/fHpaW73+Pd88mx3fmdtdmXz +/X3tfefu6urt6en6bGhxe3dqZmt3c3Psdnvr7fz18fv9bvTj/njxeXF4bWdxbGx7/f31b3vx +9fF1dOv++fJ27OXh+Onr/njv7vVv9O9wbnZpanFtc3N5bvBvePNvbGlraGlpbHf99uPh7u7n +4ufi7Ojnf3z2fm98YG/vdWdsdHH58/r8fvXu9nl8eH7y4u9rc3r7/fF3dHxmc35haHBvc3v0 +cPX3eejz6vPt7/Hn3+rt6eP5bGdrcWx4fXP+aHN+aW9udWxodPj+bOTg+Pjf8Hj7fH54c31/ +eG56f/L17err9XFraGh3b2hoa2198ebh6OHjfu/mfW5tfnT+7vtybnFxcnr2anZmZ/t8ePfs +dfPse330cf32fHr1cnX/du/t+u7s7W97e3Rr/XFx9m5qe3J17O736fpqcP5ycfTo+Pjr5/l8 +9/D+6PRnanBwX2R9bX7o9nJ69HJucmxucePne2757uvr5+X48fJzcHry+mFmb3Dr6+Z47u12 +fvL5c/tsbvz9/nFpfG9uc21obXdtbm128/157fXv5OPs5+zi5Ono8/j7f3b6/nhza3FybnR4 +cGhjYFtsdft2em987vvo3+P98O79ff/7/erm6+nm+2hscm328Xlobnhtcv59b/t+bf56fX10 +c3717u/29PL27+rn7f56dXVvevxyb2hvb25+9HBubGv27fLs3uHm6+zs9+z/cH50bHdkZ2pr +bW36fHjv8Hlx+/52a2hrfX/17/Xq5uzl5/nv6m9mcP566+T+cf709nZsaGp2b2t4dmxla/Pu +8+rr+O/u6un6f/F2dH14dPj5a235fXp9e2tqbWZsefh7fffy7u3q7Or1cf3u/3X0fG739v55 +eXBtevrz4OT09n5sbHN2cnx58fj37v5wdW9xffL1cHJzdnN0dXp0bnB+7ufj5O/u6vL063Zh +Z25jcXR3/vju7/Lv7/d5ePLwcnVwbXJxbnpy7+308ffx7Ob5bWtue/no7PH7/3tybnJkY2xq +Ynb7/nd7cnbr5u3v7/b77vj++f39/fv3b/n7cHp9dXN8dfr2+/bn6nt28vry7vX1cGpucGtt ++35za2/9/Xr3+W9rdHx9fXf0+e7p7PL59fp/+u/y+PZ9fPb/dnz9a29vb3n++HxtYml5+nzq ++3L87vDw+ert7e9+7erxf3t7e3twdm5ue3t5eWtvbnV9b3tufePt8PXn7Hp+/HD/8enx+v5z +ev1vdPt5amZye3jy8Xdy5/bo4+/t8Wxtcn5kbXdzeuz57W75+/p3fPfr9/b8/H/86PBx9vv9 +9PV8835ufnRvcmRmamp+dnjvd2p+6vD87+19fvnw8ero/Ozt+/179nR2aXp5d3n893V4ZW1n +bWltbfr9dvvn6+/e3u7b5np8fHxtfHlvcn1+/vp1//RrZXBqXmN1aXb95O578/5sfXF8c/Dl +6/rh+f/07+r1/Xdw+3RhbXju+3vq8Ht2cfLv/PD/ZWv6fmt5cH1z9Hx3Z/7t6vb19PLw+XB8 +bXp7dm5tcfDy6+rq+/Tu6efr/vd3anz8bGRmamxdbG1qbnNvdfvv7+/5duTf4uHf5+7sffhz +92xy7Gdu+PFsZ3dvam99fH1renNobH/o6/f05u7l+ut66vd+/f5+bmVhX2J3/Pr+/fzydevz +6+Xp63ft9/h5c35ufX78anT78v75b/1xbm13/nL89/n6cf/rd/D2ePz1+Xzt7vP6/Xn9bGtp +aX5rcGh3ZHnk6u7n8Pnq7vn3+P/q7+rv5+z0d29yb25nZ2xvbXNsbG37d3Jt/X558O/5+Ht3 +6evm6ujv9ufl+/f79WtwfnBddG53Zmp3ffx7cXL8evF28/vp6uX27e7te3V/+376d3ttbH72 +e3JqdX31d3H/7vrt737u7vluenf+/vH+d3Bvdmxz7/X9/Pz5+3h2fXR6d+f28ezv8PHs7ufv ++m1lYW9ub216bnx4eHj4bezv5nzlef9rfWzx/Ox38v3w9/T77u/0fXdreWpnaXJ7d2537vf6 +8u9/7OzxePt16u74b/1z+f7r+/r45Hl1a3Zoc3V1am9z8O17a/vt8evt+XZ7/W17bnhze3v6 +//5rdvnt9/Z693Dt7vF07P3mdXdq93v2/ed77u/x+O/8/W5rbHFuYGtmcm33++945ujm7Oz7 +7XB5bfB09+nv9XT+fHZwc3ZsbXBtbHdo6H7tcuXq7eTf53XsZndlfW75Zfhn+2pwZ3tu7+vs +/u397vzyd+t78Wl+bvd97+rj7vDrdPtl+Fx8aGlpaH1m8mbuef195Xfj9Ozlc+Jd5F/naO1m +8/b2dl/uZuT6+m9e7nZy62Bt+OHT9urfd+3521lgTFlsXH7w7vHf3N7s8HNrbG9eXmho8vfm +7Hri59787HB6attw/O1sc3bi+X3iY/vrauNUeGZpYvFnaGbrfHrwef74/ODsc+Ff9exY3m7f +eezW699nae1t9/pe72j/5Wpqc2D3b2r2aGz+bvj3dfrn9PV+buV67OZ2+ft+4t3v625u5XVp +c2lpZmx5bX5qbm/1bWLvbnB5bPbv5uHv8ePu7+js7vl+bWn47vv7ePj38e59+vru7m54e3D6 +dmZeU1hWVlNWZF1tffLa2NHOz8/Z2tv6ffj1/Pji39zUzczIycfL5FY4KyksLzFCZfDGta2s +ra+702BKPjY0Njk+TuDHv7q3ub3Dzu1RS0dHTlnz2crAvry7v9dKLyQkKS0zSPjXvK2oqKux +wmhCOTMvMDQ7TtC8tbKxsre/z2hLQ0FDSFbozcfAvr69w/05KB8jKy457sfBr6WkqKy5XjMt +Li4uNkdc0LqzsbK0u8jvUEpIR05VWPzOw7+8vcTHy+pELyEdIi48abq2tqujpKu5VC8pKzA2 +PEtvzrqvr7e7xexZU0tCQUxfcuHPycW+urzHzdZtWlAzIR4oNDt/t7m+raOlr8VMMSsuNjU0 +P/3Es6qsuMjQ41pRTD88RWLd0MnEw8C+wtTq3t/j1/MzHx4sOThVxNvYrJ+jrcFNNTI4OjIt +NVS+raiuv8zJytdfPzU3SN3FwsTKzcnDyN14d3Tp3V4yISEvOzVC2tTAp56jr8JuSUI8MCon +LEe+r660vby1tcBdOTI4T9zS723iyr/Bz29aW2jk2utMNjA2Pj08P0dcyrWxt7y7ur3NUDs2 +OD9TbGdq6Mu/urrIa1Rr2NHjWk1QZeLgaFlm/ezc1Nnj4nFNRUlTVE5KREZRaeHPy9L8W2Ht +z8nJ0+r13NDP0dr3a3bo53NdUk5OYuzzbG366dzW2u7z3djvW1FNT2BzVkVET/vY2nZbYOHN +yMXO7l1i4M7Rf1NLTF7f2upraf7YztTxZGRfX3/rbmjnzMbGxcx8S0VHSUU/PDxEVevNw8HF +yMXDy9n9U0Q+P0ZNUldm38vCv7/Ey9HW4XRWTVBcbebXzcjGwr2+cTIpLDI1OD1CTdSzp6Wr +us31UUA6NC4sM0zIt7O4u7q7wtZXPjk9Rlzo5/Pbxru5vMTQ1crBYCoeIiw2TsW/yb2so6Sx +XTEqJyozPkZYx6+opam37EA4NTMzOEbkv7OvtsXad19o/nJcZMu1r/AoHyMpMu67v8y4qKSq +uk8uJSUvRV/fw7ewra237zszMzY/We7Twbq5vMrwVlBX/tficd/Csa5ZIh0gJje8rLS+t6yq +r8FDKSElNe+8sbC4v728yE43Ly44Xr+4u8XR29/pZU9JSmDUysvLxLmxtj0gHiIrWK+rs7q4 +tLS76DYnIypDwa+ttcTOy9FgPzYyOFLDtLS9zex6/XNUR0NIWtrIw8C7t7jPLyAhJzPPray0 +t7i9w9RHLyosOd61rrXG4H5tXU1BPT5O0ry4vdNeVF1093pfVFrxzsK+vsXO1GgyJyowP8iw +sbq+zPJ8X0M4NztIz7i3wNL4XFtydF1XYeDNxsfUcV9dY3xuXlxaWGrTxsXIysrSPyooLTX/ +sa60ucXpdHVOPjk6Qfq7tLvLa0xMWWlkZm723MrGzeBuW1ln/vT9Zl1m59DLzdTb39/3Pi0s +MDdXvbKytb7YYFNKQkBCSnrIv729xNlpVEpIT19kbt/X19DP2eb9XF1n69TFubO9QyojHyZD +uaunqrjTb1FAOjYzNk7Cr6qrt2E2Li899cG8vcfka2ZcV1FJTHLSysbNbEtHSVrZxL/By99m +XGJnVTwxMjhMxLKwuM9IOTlCWtzMycrKyMrbXEc+PD9S1Luwr7fKWj89Q1fMuLCvukklHR0h +NLymoqWswllCPDY0NDhIzLKpqK7POywpLkTJt7a5wM/l8VxIQ0BEaMvBv8jtTEZPc9PIy+Zf +YO/Mvrm8QyQfIiltqaGlr9s3MDtO8s3PeXzRwry900Y1MzpSxLW0u8xaREVOW+zTzsnEydXe +1sfCfzIkHh8s4qqgoKi/QTAvOEhhaF1t0ruvrrfrNykoNPO1rK6/ZUdFV9jM3GJWWm/azNZx +ZPjKtayyRSMbGR46sJ+dn63ePjY3Ojw4NDpfu6qio69RKiEhLFi3rKuyxfhaXF5VTUlMXtS/ +uLOytLnSOCIbGx8zuaKdn6rLOy4uNUFNTEhR3ryuqq7DQy4sMkzCs7bC311Y4cjJ3GNOR05t +49rKuq6rr9QsGhUWH0eom5meq9g7MzM1NTc4Qdyzp6SntkcqJCUvXrivsbjIcGX/4edlTkpU +7s/EvrqysLl7LBwYGiJKqJyanq3tNi4vNDtBQkveu6+rrbxOMy4vPd68uL3Le1Rb4szHzuZd +T01PX9q9rqquxy8bFhceO6ycmZylvUIyLi0vMzY/3baqpai2XTQrKS9Ky7u3usjb2tjV2f9W +UF7s08jCurKzvV0qGxcZIUSqnZqdp8FENTAvMTExOVq9rKWlr88+LiswQvDEu7vBx8jN1+Bl +UE5XaOfOvra2uso7IxsZGyjkp52anae9UzYtKywsLjlcvKqjo6q6UDIsLDFF27+6uLu+wsnY +ZFBKR0xbz766t7t+LiAbGh4vxqacm56pumo7MS0pKCo0VramoKGqvEowLC00Q3jOxL+/v8DE +z+xeUEtS7c7IwL3PQi0jHh8nPb6on56gqLXVRjQsJyUnLkTDraalqLDHUTw1Mzc/TnzPwr26 +u77G1HFaWl5q49fySjYrJSMnMFa5qqWjp622w+hJOC0pKCs3bLyuqquvucbWdFNJPjs7P0v3 +yL68vsXN2unu7u1fRTkvKSgqLz/hu66qqaqtsrzOWz0zLiwuN0jsxby5ubu9vsHJ3GNMREBB +R1fv2NPW2+nw4dXQ1udXRTs1NTc+S27Sx7+9u7y/xdJxT0Q/RU1e28zKzNHW3Ofz92ZfXl9c +aO3g29rf92VdZvLXy8XHze5PQTs4OT5GTFRp6NvNx8jM2PFgVFRi7dXLxsTJztTd5fFyaF5V +Vl5lcu/g53NfWFRafN7Tzs7U42lQSklKTU9SWFxt7+bd3u9jVk9PXH7bzcfDxMjP3OPr+3Fm +cfjq3dnY33ZZT0tJTFv53c7LzNPkaVRNSUlKT1dfdX3q3uP5X1NPVmro08vHyMrR4nhjXlhc +a/Lg2M7Pz9Tc7l9PS01PXPLa0M7T3Ol4XlROTUxNVFxnd/lrX1dVWWbu2s7Kx8nM0N94YVNP +U1hp6t3VzcvLz9t2WlVTU1FZZ/3i2drY1N39Y1xYWl5eXV5aWVlSTVBXX3zd0dHR1dvd3+d8 +aV9han7o3M/LysvP2vhvZFpaWlpfbnN+9HxvbmhgYF9haG1xbl5VT05QWGT76NzW0M3Mz9jl +eF9bXGNrfuLVz87O1+Xxdm12dWxfYPhybere8X9/b2RdWllbXFdSUE5RWFxlduLl/NHJ0uLW +1eJsXf91Zmfhz8zP09Xe5HhoXFdZbenZz83LysvP2fxSPjczMzU2NztKbMy8t7OxsLK4xONU +Qzw6Nzc5Pk1vz8C7t7W2u8LRfFROTUxUauXSy8bJ0l47NC8uLi8zPVfTuq+urK2vtL7bUz43 +Mi4vMzpFZ8u8s6+urrO8yvpKPz09Rk5tz8a/vcXZSTgxLiwrLTJF5b2wrKqpq7C6zVk+My0s +LS85R3PKvLSurq+zu8fiUkM9PD5JV9/DvLu8w+c9MS4sKSotMkfXva+rqaiqr7vPTjwyLSwt +Mj1O6MO3r66vsrjB1VpGPz09RU9p0b21uLu9yE81LSknJygrNlDIs6uopqaqrrzrQzcuLCwt +ND9W1r2zrq+xtrzH51hGPj5ASFBxz722uL2/yUYwLSgkJigsO2/ErqinpaSprrr6PzYtKiss +LztO6r+0r66usri8zmJKPTo+QUVX3Ma9vsC9xVY0Ky4vKyswOl69tq+rqqqpsMXwRzg0Lywu +Nz1Q59K/s7G0tLi9w9lUSUZDRURGXN7Zz9XUxMPUYUc4NTY1Mi81SezPxLq0r6+2vMPP8VRC +Ozo9QUZNbc/BvLq5urvA1GZORkM+Pj9EWHHr3dTMzcvU5vr3cVNKQ0BDR0VCR1Vr4NfSycTE +ys/RzszV6/39ePL5b2313d3Z5PDu/2RQUE9TX/V8+dzY2+fzev9wbWBbXl1bWlpcduHuav/n ++2JfVl1hXGV67eTOzM7Q0NTc3f5rXWNlXmJYXGXo6NzY3tzWz+Px+GlcVVFPTFhlfvTi7eTm +7fJuXWFrWFtfaGz66tzZ2dPY5+7+eXVxXWVqbGv9fvjX39TX29/fdWpoXGlqYF1pZmL+/vjx +6/7vdGtebvFvfHJ+/330amVrc2pj7G/17v/v6erh3eLb2NfgfW1lVlRcXl168uf12tfg3Ozx ++mtgbF5iafLw7d7k6n1vZ1lZXVRRXVlZbP/56NjSzs/T0dvn7n1dUVhYV1x17uDd2Nbc293y +aHppWFlcXGlv8+Df29/i5vVvX1tYT1FXXmtw/+nb3eDa3+Lh629rXl1ka2zs3d3f4OLc6vJo +YmxrbmphYnbl4u3j3uXxblllaV9fZ2/w/e7j4d7t9e5xeGdpZWlfYmxwc2z47ujv5ev4/Ov0 +bfHt9O/w7eXp6+jt83N7dWJiaWJefmZlcf567tzl5+nudmd7+3RnZ2hsaGlr8uHq5/Dq7f9s +9Pn8e33q5fzz7XV9c3lr9/ljaPtzbHl+dHf3ffHkfnbl7Xtof/b8cnBtbG/9eeno5+fv7e/v +9f50bmt4d2BeZXxzdvzs6u708+/yb/7/ZXJvdHHt733o4unx/Pb7ev9nZXnveHP/aWz0c3Vt +d/3v5OnuefLs++ru937s7vXv/mZtb3FtaGFod3F8fffv9vr3+e94cf3yfvB08Hhx8XxtY3H/ +f3x59vdtauz0a37w5+jd6Ozk3+Hm8/TufXFvaGRtc2xoaf5qZ2x0furybmhy/HNuefft7+/+ +6uLs6+v6/nB6eW1zefr7am3s9H378fN6dmZfeXl+/3L3+P3o7OLe6Obe3Ob+fWtob2h5al9g +bm1qemZy9Hv8dm5r++758un5ffDsfvtvdXT3+nzz//z4fXzv6fX17fF++Ox1evF2aPv0cfxx +X2b8+mp0dnJ96fx5d276bG5p+vPr7OPn6PHu7HXt5+d593Fvb2hmaG52cmtzaW18eP336/Pm +8O/y/vh8+e/39Pl28fr3bX12Y3P/eWpva2r6bnF3eOv1duzs7/H18+7q9HHu7XB3a3T+9Prw +8GZpYm5vcnX67fr56e7+8unw6+/6+Gz+/f1rbfx7df359ftsanH9bPPzbmxicmT88Pdt++D3 +9fzu/ubvdvTu5fDw7PHo4eN6/G5qZ2NpY29tZWpzevXqe2VveW1sf3F09G5o+2998ubn6+Tp +5ebu5t/n+fP+bWpuXmZ293V6e21scnzk+355YmlobmVtaWp19/rr6Ont6uDh3/j86/fs7eh0 +amxpbXBpa39vZ3JuYG/s93b69Px1c33v/Pvi4Ojq7e32eHH/ff9vdnpmfvv4Zm5we/p++Hp5 +ZXN3/3xtdvxwb+jz+O/o5O3r6uv8af1vaHT+/mn1cGho/n11dmv5au/v63168/Tq7/Pr7Glx +/e1z92xfb+7+dvV0fnj0fun6ZmduaWrt/Pf7fH5v7ubr7+/z9/f3bm1+b3B/7e/5eHR2fvj+ +7fz2fPpwb3JxcWZ86e59e3x2eu56f/R9dP709+fr/Xl9bGj56/Z87Wxpd/fv9n78+fx++fNx +en38a3B/9nlwentp++/28vb25ef98Xx0dnb6ffZzeG5kYvh6fflr8Hr26u91bfjo+nv5/n5o +Znzz8e7j73768vNrb255dPfvbn9//vnq6OPudn9scHJtb/94/HBybnN8//lrdvjt7vl9eH/5 +7P12ePzv9/f47nVyfvr7+O/2+Hp+fm5tfnR9+n735/Z0fnB2dG5rcWlpdHt7cvrv+3rk4e/1 +8nVp9nv5/vnv8u/07+zv+ex9amr7dm5tfXV+921793NpbnZ5fHFtcn387eHi7Hn56vP68PZ4 +enJscntxa3N88e7r+//+7/H6eXb7dXJvampyem1tbXRr/eXrcXLl4ebv7+bg6n359n58bHJu +cvt68nh7dPx+/XlsamVhX2Z6a/r26+rp7Hv8+OPo9fD6eP359u/38e7r9H36a3tx/HRxdm58 +fHZscPR8b3pzZWdpb3Bz//Pw6ejo5ePr+/x9cHR+dG50/Hh4fOrs7ev5/nf9fnFmZW5qbGly +e3j68/N+/3VtdG179/t+/ezz6eHf3+Dh6ftydH7+/XN8f3RwZmJoZWRpZmtycnNrbHj+/vTt +7e3q6uzx8+zs+/rt7fP8fW9sbG9wZ2t9fHt98/D68ejo8fb6+nt56+bud29wcWpwf3lycnV2 +bWttaW559Pv68uzr5+nr7vd+fnz8ev/0+XVrdnVub3pvbXn/+nR4f/79+X11/vL1fH79+fn7 +9/bv6/l/+fPv9/P7bm1uZV9o/PL48O769fz6cXr89Pt3eW/7eXZwcnx1b3V9/Pz19nVvevn0 ++35+/e35eHH47O/z+fz79/Hw7fr3/m94efxtbXp3dHF+bW12dXlxb2509vH28PD9/+7u+O7m +8Pjt7/D7b2lmZm14dHXv9Xd4/PDu7Oj2eHhucnJ0ef39+n95c3Bta2hmZ25sce/w9v57/ezn +6ufm6uzr7/Pv7Phuc3r8+fp5cnx1b3ZtZmv6+H94bnB7/35ubnR3cmprfe/u7+3r6vP8+Xh1 +/PLw9/n2fmly8e3x+nxubG96fnd+/nR4fn7//PP79/b17fL8dnZ9c25qa2//8/h+fn11dv72 +8PLs9O/t8u7r7vfv7v1mW15iYmdrcHF1ev739vfy7317+fz+8uPl6ebs7e/u7vP29ft2bGVp +bGhqaWxvb3N//HX48350ePr06enx+n18fvb3fnd9cG17/PTs7Pj5/Hz1fXh8en15+e/7bWVo +bHz4+P90//18fP788e3s9vDp7vDw+/D0fH96c252fXJteu/09vZ2b2lkZ2pr+PDx7Oz6d/v8 +8uvp/mv/6+z07/psbGpxc3b8+vT17vZ7dXd9dffs7fP9b2hven717/R5eHd8ffvz//92enFx +c2/58ez0c3Fxbm9+/nl3evv++vnx/3l8cm91+/Tv8Hz99evs8fL68e3q/m1sdH17dnZ7em9t +ZWFod/3+fH307+rz7/Vwcvnt+fbucG15+u/49e3+cvrx8vp8/X16df76dnNxfHx2dGxrZmT6 +eXJ9Yj58uFlUzdNUWXb6xtBj2+1SXWJfauHnWmLp3udn3c/vYVhqeGRhbeDtWv3o6+JpfOzv +Z3HoeO/vdujya2v9/P7vcWz4fufydPV7amRvbPn5bG1kXnP26OHn637x9vHt83/+7eX5eXxn +bV9c+Xr37fx4aX7u4vlt9O1t/fju6GR75+lle93t9Wzv8V1ie+p4eu7vbFpk6uXo+Xvdc1Vc +9Obq9GxqV1lu/u7d295pVfzsVOrM/+TY5ulaWndkZtvb9OlaadZmeNztW05ceV5g3+NpWV1v +927n0fBf9u/tffXQ2/re32VeaGhp8frp2mNc5ftYfudp5Hxk8+laTXPka/HM1mtjVl7+X9zN +fmdeX11Lccp+98fhZ3pg+Vdj0tne4tH9R1TqZlrXyPlW6e9QTWrmcF3j5FFTbHJt7NbS3PL3 +bmlp5N1k2dlT7d1e7Mvr+9NyeOtXVPB9WeDdXVJcWU1Xa+D4ZON8Wlt2ZV9q69jp2crc4NXe +187e2s7t/dj0ZvDq615s7FZQflhJ310+Q1I8M0xNRWHPz9fKv8HJv77Lz83a6d7a2+PVz9LV +4ub5WURe40hb2nPWTC/pPyQ9Vi9Bxu7Hubu6x9HK7lZp+Xp32MfN08HG3dDO6vrg5PNj3tZc +dMlu7Lt7LjxOHyNIMCzYucezq6yzvLvTPkRJODxQ/vDNvcHLvL3l2ctcVNfrVfDU6/rSxt7e +5DkxOSgmNzY157y9r6utsLjFYkY8MzI4P0vrzsG9vbm5wsS/zN3Z5l1e6+/sysXO1Pc9MTYo +JDIvLlHCybSrra+0utNHPjkvLzxATMq+vbWwtbm4vczS3FVLWE9U7eXSytHgWTw5LiUtLiw/ +3NG7ra2ur7TDbU09MzM3PEZ+zMW4tLa2t7/KzuRdUEtJT2XqzcDMzco9OD8nKDItL17MzrSt +rrKyut9eTTcyNzk9UtHPwLa3uLa5wsrP+E1PT0hZfPjNxOPL5zQ/NCYxNi1C1Wy/r7O1sLbL +6vRHNz48N0FYata+uri1s7i9w89jTk9GS1lU3sbN38JpNEg3Ji44LDfmadW0sbiys8Tv6E47 +P0I9RGj90764uLe0u8HF1FxUS0JLTlfWytHPxk8+TS8sNi8uRV5QxLe9u7W8y8nTS0hJPT1H +Tlbax7+7tre6vMHZeG9PTFhZadHKzcvMTURKLi06Ly1MV0PKusi8sr7Lw8tQTls+PUtITd7N +x7y5ubq9xNPgaE5OV1Zn1s/R0s18QEw/LDg+Ljn3R1C7xM22t8zHwWZOXkU9Q0xLYczJw7q5 +vL7AyNvvb1JOWlxr2s3X085ISVUwL0AxLU5NPc6/2by0xMe/02NjTkZHTVpl28rBvr26vcPE +yvFnZk9OWF9p2s7i2d1LRUg3Ljk1L0JPSdzAxL65vMHE0+5eSEdNSkz86N7FwcK8vMXFyNzu +6mNZ+fTe09XY3fhNREQ3LzY4MztHTnzVyr+9v8TFzexiZlhPVmH96NrKxcS/wMfIy93u9mJk +/G9r6ebe3/xeTUM/PTk4PD5FUFnv08/Pys3WztDl7vhgaef699XU2MvLz87N1NbT2t3Y3OHd +19/o5H5pWktEPjs5Ojk6PkVOaeHczsjJyMrO0tXi7u/66Nza2tXP0M7N0dXS1tva29/a2uHe +3ut9Zk5BPTs5ODo5PENLXnjh0c3KyMjJzM/U2t3d293d2dve3dXQ0M7O0dPY293p+/vzdHtx +WUxFPjw7Ozw/QURMXfnd0czJxsbKzc/U2OPt8P3u4+rt4N3Z0M/PztHV19re2t/o6e9+XVNM +RD08Ozk8PkBHUVx92M7Lx8jKycrN1eP47ujv8+Xg3drSz8/Pz87U2dzd3ufw8O5+Z1tRSEE+ +Ozk7Pj5DSk5d7NrRzMnHx8jKztXY3+rx7u/p3dzY08/Nzc/P1NjZ3eLsdGtuXlhdXU5EPzs4 +ODk6PklTZd3OyMC/wcHCytbjeWVjZ3rl2tfSz83Kx8jL0dnd4u7u9G13cGBaVkpBPDg1Njk7 +PkZObdjLwr++vr/DyNHa6WxgYF5i+N/b0svIxsjLz9jd5vZwa2tmamtpXlRNRj87Ozk5PD9G +Tl7nzsO9vL2+wsfM2HldWFRUXm/p2M/My8jIycrP2uTubWdoaW54c2lYTEU+Ojg4OTs/Rk9d +5szAvby7vL/FzuNqV01MUl1r6tnPycPCwsPIztTfeGJgYmJoXlhXT0lDPjs4ODo8P0hWd9bG +vru5u77Bx9DnXk5MTFFba+LSy8jEwL+/xczX63poYVxVVU9OT0lDQDs1Nzk7PkhTb9PFvrq5 +ubu9w9DhZk9LSkhOYu/XzsnEwMDCxsrS3/NzbGNhXFdTTUlFQDs1Nzs6PEVPX9vJv7y4tri8 +v8rccU9FQ0NDS1v+1snDwL6+vsHFz+hwZV5dWVNOTkxGQj86ODs6OT9MV23UxL24tre6vMXV ++ldKRERCRE5l6dHGv727u77ByNf3blpRWF9dVE1OTURBOzU5OzY5RVBY8Mq/ubS2ubi8yd1s +U0hDQ0ZOXu7VysO/vby+wMTR6XNdVFBSVUxJUk0/QUQ3NT87NUNiV2jIvLu2s7e4uMLkfGNI +Pj8/Qk9pdt/Jw8O+vL/Cx9Ld62pcXF9aUFRbS0NFPDQ8PzU5TFVT7ce/vbi6vLq9zuPzWklE +RkVKXv7oz8bEv7y9v8bP3e70Xk9WXE5MV1FFSlE/OkBEOztGTVB9zsnBu7u+vb3G0tlwT09P +TEtSWmPo0MvIxsfHyNDc2t/waV5iX15hY11UVVZKPj5DPzw/RktZ89fOx7+9v7/CyM7ZeFtb +W1JPW2np1MzLzMvKzdHc82lhXVVTWGFhaWtnaGFcUUpFQEFCQ0hNWXHdzcbCv8DBw8rX6nte +VlZbYnP249bPz87NztHf82dhXV9dVlRfZmh0amBfZVxRTktHRkZKT1pm79fOy8nIycnO1uD9 +/X94eHJ/9ejb2NjY19nZ4Wtkbm9hXmxxZF5eZW1wa3F0bGVaUU1LS0xOUFNfavTe3dTR0M/O +0dna3+z37u/v4eHg29jc59zY7nru92xqXl9dW213de7p+v3x9WNUT0tIRERFR05ZbfHd0MzI +xsfLztnm83FrZ3j48urf29fY2dbc6Ol9Wltuc2Ru3tTd4drc7/puVElCPjw8PDw/R1X708jF +wr/AwMPL0eB8ZGNfXF5n/Ore083Q2Nrd3d3xaXHu397h393h+WZYTEE8Ozk2NjlAS1/cyr+7 +ubm6u7/K22lOSUhFREhPXPHUzMjDv7/Cw8jP2OtlYGpvZFxcXFdNQTc4PDg1OkNLW9rIwbq2 +t7q7v87ccU9FREJASFhv68zEwr69v8LDytv6ZFdTVltaVFpdT05LPjxAPzo8S09P/szGwLy6 +vL2/zt/sZU1KSEZNXn/sz8XGxMHCxcjP3vF1X1RTWmJcV1lZVFE/OUJDOjpLWk1Z1sjFv7y9 +vb/M3tzsVkxPT01TZnXfzsrHwb/FyszS4n1uY15cUk9TVlZPT0xBP0RCPT9MTVN21svHwL+/ +v8LKz9vxX1hYU1BYYWvs1M/NysjM0NDX3+txaGVjZWFmYmFiWU5KSEdBP0NHSExaa+zYzszH +xMbKztPc7vj0dV9ibn7q3NjU0c/LzdLR1N97bWldWFpdXmpnXlxdVktKR0FAREhHTF5859XL +ycjFyMzO0dvv/Hhrfe7u49jV1dDO0tvX2+v5eGZdXFhUWmNobG1nXlpWTUZEQ0FFTE9UcdvU +zsjGxsfJz9jb62xsfG1p7+fk1M7U1dHX3+DieV9dXlxcX2Fu+vt2a2VbVE1GRERCQ0tRVWjd +1M/Hw8jIyM3X3N/6ZmtoZXvl3dva2tnb3uDq93Fob25jXV9sevfj5fd3YlhPSEVGRUNGTVNc +7dbTzsfFyszQ4uvvbWJnamJn+uLb083Oz87R2Nvi7fVyaGhzeG54fHttamNXT0lAP0FAQElP +UV3h19DFwsfKyMvZ3uF3Y2loaf3k3tjT1djY19jc4/1qb29jZG18+Ori5Op/XlJNRkBBQz8/ +SU9UedfQycPEycrN2+55cGJnfHNy6eHh2M/Q0tLT2N3j9/x5amlveXd5/fh7bGlcUklFQ0BA +RUhMWnzl28/KysvLztbb4/J0d29n+uXp5dnV2dfT1tvY3e94bWdgbG5sbHhvanFxamZcT0tJ +RUBBREdPbeHb0MnHyMbFy87P2+33b15aWVtcVVnZys3c7Obd3up3XllhaGlw+Orl1s7U3vlc +SkZFPjo8P0VT6c7Gvr3AxMrZeWRXTEpLTE9g6dTNysnKys3W3vhoXl5fX2h3ffTc1M/Q3Of5 +dFxMPTg6OztASlTlx768u7zDzNZ7TkRAQkZNWGTmzcbAvb/K0d37aWJZUVFa/tvNxsXHyMnO +5l1MPzcwLi8zOUNb2sC4tbO0usTaWEU+PT0/SVziyb25ubzAydb+Wk5LSkxVdNvQzcvHw8bK +z/FNQTouKi0yNkrWyb2zsbO0us5iRTo3ODxATGXeyr66ubu/ytb3WlZWU1di/dvLx8fGyMnL +2G9VRzswLCsuN0V4yb+7t7e4u8XgV0M6ODxCT3TXzMa/vb6/xM/qX09OVFpj/d/SysbHyMnM +z9j7UUM3LSkqLjdNz7+4srK1uL3K90k6NDM4Q2LRx8LAvr+/v8XR7VpNS1Ns7N7Z0s7Ny8fF +ys/eWEU8NCwpKy84WMi6tLGztrnA0l5IOzU2PU7iyL+9vcDDx8zQ319MSUpQZOTQzMrKzMvJ +zM7Q6VFFPDEqKSwwPfrBurWxs7i7xN9UQzo1Nz5Q1sK9u7u+wcLGzutUSUdITWPp3dfPy8rJ +ysvM0XlPRDswKystM0LhwLqzsbW5vcntTz42NDhCW9LDvru7vb6/xc97VExITVx26N3Yz8vJ +yMnQ2+9VR0A3LSkqLjdPy7u2srK1t7zJeUs8NjY8TPbOxsTAvby9wczuVUtKTFRncXbo08rH +xsfL09jZbkpBNisnKzA7Xce9u7aysrW6y1pAOjc5QFF52crEvru6wMzgZ1RRUE5PUFhv2cfB +w8jKzMvM1mpMQTguKiwzOkrXxb65s7K2vMh8Rj05ODxGWeTKwr67u77EzeVgUExKTFRn7t7P +x8XFx8vS3uhpTUM6LyosMzxP1sK+urOwtLrHf0U9Ozk7RFBn1cO9u7m8xtPrXVBNSktSX33a +ysHCw8PJ1eHl/1NGOy8rLTU9SXTWzb+1sbS7yO5SRz88Oz5JZNPCu7u8vsPL225VTEpMU119 +3c7GwsTIy8/V4vVdRzw0LSwwNzxJ882/t7GzusDK4lNEOzc7SGLlzL+9vLq8xtTpYU9NTE1T +Xnjh0MjIycnP09vrflVCPDUtLjU7P0zkyr62srW8wsv1TEE9PD9MXu/Qw7y6vL/Hz+NpVEpL +T1tjcd/RzcnGx83Z3fFTRj43Li83OztCa87CurW4vr/D2lRGQD0+SE9a3cO9vb2+v8LL3Wxa +WFlYWmjt2dDNy8vR2u9dSz86NjEwNjo9RmTPv7q4uby+w9RiTEVDRkpOX9jGwL++v8HH0eth +WFNRU1de/dzX0czMz9jpZkxBPTgyMjg6PU7nzse+uLm9w8zeXU1HREdOXHjTxr++vr/DydHf +ZFVaYV5gavni2Nfd5u5hUEhAPDc2OTo6QFrezcS7t7i7vsXQflJKR0dMWGf108jFx8bDx87d +92RXUldcavjn4OXp7XZXTEpDPDo8PT1BT3DfzcO/vr7Axs3b9WpYUlZhbfDazsnEwMPKztXp +bldGQklNTFZxc2tu/OHrcmhcTUxMQTtDVkhG9s/f1cK/xcbFx8rQ43X3fGRo4tfXzsvO1Nnj ++mRYVFNQUVZaY2Jfb29eXF1VS0hOTklHS0xNWm7o2s/Mx8XDw8XJ0NXb4ens4d7Z0c/Q1tbY +5XhdVE9NSkxNTU9VUlJYV1ZZYHh1bvzycmt9cGl6/W535eHo39nT1Nja19fe3tjZ293b2+v6 +8fptYl1ZWFpcWmZqXFxhdXlvaGReXGloY3H27/Hu6fl+7ufu+uTm7O93cWpiZnH57d/c397b +3OLt/XBjZGVkZml9/n7p5+zs9W5ob3loaHJ3c3D48v549vD48+7t9HRqZF9kdXhlY3rz8e7t +8fR+/Xx3cmxpe+3h39zb4+r5fXJ1+fp1c3Zsb/bu+Pjx9XB4dHFvanBybGNobXV5+ezv9vn0 ++m5v/3xrZGZlYm/w6+rm5efk4uHt9vn59n1yfe7s9fPu7n989fv67+x8Y2JlZGdqa2tuefn7 ++f318ndpa3ZycHhycXrr4OHn6ury9v3y7Px7enr78/X5+fbq5ezv8vx6bmdka2tsa2dsefz9 +fnh7+/Py+/50cG1qbvbv8d7e5OLf5fZ/dWxgafxueHlmVlr4W13a3Prb1fr183P8+Wt94PFu +fO3q4d/42u9ld+f8aetscV5UXGJdVFv+bGZ35OZt+ejp5d7Z5u/o/Ori8297XnfsZWvY6W3a +8nprcnzx9Wru71ts729fe3v6emR97V9e5N1vX+vkYWrffF5fcujndnPZ4n/j2+h339vbb27e +eVtz415Uc21nb2Ze+vdc7+Fdft5vddvpZOZ2Yt3uXf/bYV3Z9lvb613m32D51ln/2WVj33hd +7uJX8+Bn6uBiZNt1W/ttW2l9XXXs/uLj/3zubuzkdHzYdfd+9eztbv/p/njgcFp2bGb6fmDv +8lz582v3dm98f39v72xl/Hxv7u/r7+zu8tps9dT0VOvlbW3sbHXuaWXqeVfv4Ghv4mxv//r/ +6d9u8+trbN1vYN7uXO34XPPnafbocnj6bW/7ZGbkcWrg63Py/2ppcejr+2Lm23xv3+xf8d3h +Xnze5F9a8OtoYuZwbHL293ZsZm1oemJo4t9qadvcbefe+HLe42dx6ntsffZpavr3bWzc43pj +fO52Ymz0c2Z353xy8Ph+53Zf++ro+ffs6u57e3Rv+vpsa/Xsb3nm6PDs5eTr8/Pl8HxvZmBd +XFRYV1NYWlZZdX7/6+Lc1c7OysvOzs7W3+Hf6nh6b3Lr6urm9W5aTUhHPzs6PT9ARFH52czB +vby7ur3Ey9Tma1ZOTEdLT1Bbb+XX0c7MzMzNzMzS2d/m/mZdUEU9PTw5ODtBRktW/tPIwLu4 +uby9wsva/19UTElLSk1UaXnv2M7LycjKzM/U19rqe2ZbVk9IQT8/PTw+QkhNXezVysTAvry9 +wMbO42BWTkhGR0pPV1/w18/MxcPDwcTJz9rn/WdbUlBQTUtHQkA/Pz9DSEtQXPrYy8fDwMDC +w8bM09/2YldUUVJUXnV76tzX09DOztLW2uDudW5lXV9fXFtVTEdDQD8/REtOU2D02svDv7/C +w8XKz9PceGJaUE5RWF1hfujd1NHPzszNz9fj8v54Zl1bWFNQTkpGQj8/QUZJT1p439PMyMO/ +v7/CytPd8GxbV1VTVltp+d/X08/S09DR1dzvb2NcWVZYWVhfX1RLRkI/P0FITVd449XNxsPB +wMHCxszW43RbVFFQVlxr8fDm2tXT0NLX4O79c3NoZmZfXltaWVNMSERAQUVKVF/53tjMxsTD +xMXIzdTe8GxkX1pXVltoe/Lh2dfV0NDU19re6XBjXlhVVllWUU5LRkNDRUpNUl772s/JxcXG +x8jLz9DX5nxqXlpWVlhdb+/c19nUz9DV1tri9nJpYl5XVVpaVFBNR0VFRkdKTlx34NTOycbG +xsjKztHU2+P/aVpUVFZbavfo3t3a2dfb3t7s+/jz/nBsYFxfW1VOSkVDQ0VITVRcfN/UzMfG +xMPFyczP2eH3a1tWVFNZZXzo3dnU0NLT2Nvg7vhrYV9ZU1NWWVZPTEhFQ0RFR01WaeTQycTC +wb+/xMjN0dzqfl1UT05PVFxq/Obc2dnc3+Hf3+3+dmVdXFxgaGxtaFtPTElGRkhKTllu5dbM +ycfGycnLzc/Y3eh8XlZVU1pldn3o29TU2Nfa3+54aWNdXFxcX2Zybl9WTUhISEdHSlNh69jO +yMXEw8THyc7S4PFqV05JSkxRXHjj2NLSz9HU1dHW3e5rX1tXUlhcXWVlVkxHQT8/RExXdN7Q +y8bEwL/AwcXK1fNiUkpJSktPWnTr49zX1dHOzs3S3u9xY11dZ2tpaWNSRT48Ojs/S1tr59XM +xr65t7m7v8ztV0tGQkBBRUhLWP7Zy8K9vb/Fzdbh825oYV9mYFpXWVJIPzw7OjxDTVv81sjA +vrq4ubzBy+JZSUM/Pj9ARUxa5svBvLq7vMDHztrzZlhQTExRW2Rsa08/Ozw8PkFITFNq18W8 +uLa3u8PO3HBYTkc/PT5ASFflysG+vby9v8HG1G9SSkhKUmb27/9tWkg+PT07Oj1ES1Hux726 +t7a3vMPK12RMRD87OjxCTmvYx767ubm6vcXQ62JQTU9NTFNhcvpzTj06Ojo5O0FLU2rKubW1 +tbS4wcrVZ0Y8Ojo6Oj9RdNbCubW1tre8xs/tWklDRElNT1Zma1NBOjk8PDs9RlJs0r21tLe2 +tLe/0ehYQDk4Ojs9R2rUx764tbe5ur7Nc1NNR0NFSExQXH1nSDo5PT48PEBQ+9K/tbK1t7W1 +vtH5U0I6Nzg8QEpqz8fFvbe2u7/FzehdV1BJRkpQVVJUTUE6OT0/Pj9LcdjKvrays7a4vsnh +WEk+ODY6QEtV7szDvrq4t7vCytPtXVJTW1VTVlxdSTs3Ojs4NThGX+7QwLexsbO2vcrlYE0/ +Ojg7P0da1sK9u7m5ub3G0utjU09PT09UX/D5SDExT04xLDvTy0lKvq6wvbyyt9RhbWBDOT9J +RUNexrzBw7q4v9Ll9VpGREpNS0xa8ePf19z+4PNHPT48NDdCT1Bfy7u7wr21uMvr3NhhSUlT +XWj+3tHLx8nP29zlb1lVWlpSVFxqdnjg2NnZ7ko/R0U5MztQVURI3cHBxr+4t73Gys3lXlRT +Vl5hbevd18/NzcrKzuF2ZlVNS0tJS1BWWl1saFpOSElLSUNHUFxp7NPJxMLAvr7CydHm8nFc +XGFeX3Pg1s/OzczP3/FzWU5LS0pKSUtbXlZcbfnu+3d4fWVcbXtlY3/o4d3a1dbn8Onx+HV8 +dfTt6dzY2dPMz9bS3m1zZ1hWXVNTYlxVWWRga3hqW11rZmBeaWf+7/rm4unr5vDh4fbt9m13 +d+vY5/Xm1+J+a+7fdFln6NzxbOTm+2thbWRYVV5tXl5defZt9+Xn29zn7e15ZPx6ZW72/mT6 +4ubv/fT7/vpsX15lfPr4bnPn8vrj73f99nn9b3nm7PPr3+Hn5Ofo7+3t/3R2YFRUY3pkX278 +fnRsZ3P/efp3fXF08+/t7+jo9ufi8395fn/4em3x6efn3tzv8e/ueXR8ZGdpYl50+e/2/Xxw +ZWVtbH37dPj3fuzs8ufydG1ta21rWWDx7u32793e5+Xg6+zl4elycmxkYGdkbmxvd/t6+OHh +7u3r73jte2x09n5q/Hh5dGxicfVmX2Rram7+eObZ4e3c4XByd25qfW1tdXLu6+Xn6Onc5nN2 +9P5pbWxlX2hoafXr8efed1Tz41tn7Xr13///+Pt53+pfY215Z39x+OXe6Oz38+zt6vlucXhi +YWZobGb6f/nf4d/v8/j0f3VwZWtuam5sa/Lt5+zv737m7GNZV2zf72Nq8+rd3uzo7PH7dXt1 +bGJy/u7m7fz1bWt4aVpVZf/ybGBq/uPX2t/k8PDy7PF0cXd4c2tfZG9ocPft6+Xo/Hl27OT6 +cPt/eXJoa2xsb2ppbvft83dv/ufj7Ojp6ur0fm9sd3xxfXludG5rb25oa3NubnN+7e5+evbp +5+vu9vj99PT69/Hq8fn4+fx0b3F7+/H3e3F6+3ptZWtzb3B7b15bXFpebHz1+/jz7Obf3ujg +3eLj397i4t/b2dna397d4ePmeltMQTw4Nzk+SVnq0svHxsPCw8bM1eT6aWRfX3Xt3dDMy83O +z9fmZEo/Ozg3OT5JWuzQxb++wMjO2/Rxamtpc3Nvcvvr3tDKyMfL0+1gUEU+Ojc4Oj5JWezO +wb28vcLL1uJqXFlbYWl88eLXzcnHxsTHzd5yWEg+Ojc1NjpCTGPZysXCxMjM0N72bWZka3zo +3tfPzsvIxcXIzNLlZks+OTQyNTpATWjWyMO/vsDI0OFlVFNSWF5x3tLLyMXDwcLGzNjoXkc7 +NDAvMTc/U+THvLm4ub3G1G9OSEVFSVN92s7HwL28vb/FzdtvSzowLSwtMTtS0r20sbK3vMnt +VEY+PkFKXNzIv7y7u72+w8nZcFZCMywpKSsxR9K6r6yus7zKb0g+Ojg8R2TSv7i1tri8v8PF +ydV2TDgrJSUnLD3Vtq6srLG/11w/NzM0OEThvrWxsbjCzMzIwb6/y249LCQiJCs9zLCrqqqv +vNhPOS4sLjZMyLSusLjF3/rVwrq4usPuPisiICMpOc2up6WnrLvvPi8pKS076LitrLG+3Vxh +zry0sra+3T0oHx4gJzy8qKOiprDORjMpJikzXLqrqa6+cUdHdb+zr6+2wWQvIB0dIC7Lp5+f +o63NQDEpJSg1cbapp67FTz4+W8a3sbG1ucY8IhsbHizJo5yepbNwNiwnIyg6ya2lprLbQztC +dsO6t7i2tLtBHxgZHzavnJufrMJJMiskISlItaajq8dDO0Zj18jEwLqvrLkuGBUbKsSemZ6r +us1MNSogHy+9pqSrxEM7UtfR4vjqx7Coq08cExgp0aOboLG+vMlNLyIeLMGnp7HjPDz8v8b5 +XXrHsKmrZx0TGC3KqJ6jtsC4vVAvJiM3t6esv1M4OVfO3GrkyrywrbRcIRYZLcyuoqCrurzP +OyspLVWvpqy/bD45Q15dW9W+t6+uukggFRcp6K+in6m5v+QyJygw16miq73fSD5IV05L676y +rKy5SB8UFyrls6Whq7e82zIlJS7NqKStvdRYSkxORkVizLarq7dHHhQZLs2wpaKstrvqMSYn +ObypqrW+xtxVSkdESVfqv6+tt0QdFBs0zrSnpq20u1wuKC1dsqyyvLy7yl9LTFpvZ33Esq/B +LxkXI0/BtKyssLXMOCgoPb6xtry8uLvWUFXXzPNPYsGytGgkFxw3xb23rq2uu04sJzXMt73E +v7q6y1BO08DWVFfQt7LMKxoaKte7vLOrqbNcLSUxzri/xr26vM5MS8271kRJ0LawvzgdGCRR +yM22p6Sr0i0jM8u+zMe8ubnPR06+t+o5OVa8rbhBIhwlP2pXx6ukqcUzKT7N0V/fvLK21Ex0 +uLVuMC9Kva+7RCUgMFFGPc+uqazLOTnTxllFZsK3vOlfwa+3WC8rNeG7yUYtLUnxPzdzt7C6 +8UvPtL1PPk7Kub/Z0bevu08zLzdOZ0k2LkPH0kRE4MXIYj9fsay+XEpP6s7T0r2vscZPOzc4 +PTs1LzfVuMTz3dz4VTs51K2suuJUU2vp1b+1srvpSkhDPjkvKytBvrjEx8LbUzwvO8KvtL3N +Y1RUUt+2rrfSYVVaZUw1KycrT7i0uri830MyLkC+s7e7xOJjS0jZs6641kxGX+hJMCgkLGC7 +uLawudxDMC5Nvbq+vcTO3FBH37ezvftGSP3ZVTYqJS1Tw7u0r7bMSjIvUcDAx8jPycHcVty9 +u8PpTEv60V45KyUrSczEurG2xV43LkPHws3Q08m8xH5+xr3E6U1L58vqQTAnKT7azL+0s7jE +TzE3fdDk7+bPurjSYtjGx9RcSWHKyl05KiQuUdjNvLW2uc1AMz1aY3jRx7y4wefoy8rO4lZV +1sPSXz8uKC07TNW5s7S4x2Y+MzQ+bb+0t7/J1ePq+Wht4M7Jyc3ZWDsqJCo90baus7m7yUYt +KTJgua+zvsXN6WFPS2HMwcTKysfKWS8iISpCv62qrLDFSzQrKzvTtq2uutFlSEFLaNfGv8G/ +vcLbSzMnIyc03K6oq7XOTDo0LzVZv7KutMhhRTw/T+7FtrK4v9T1Zkk0KCUqOOy3rKuvwFg9 +Ojw/UOHGurS61Uk5O1nGube9z3hfb+LW7kEsJCQrQbyppqu47kE8Pj9AT+rHubK3yFpBQlTd +zsvGxMTHz9d2SzgrJigvSr6rqKu37jwzMzhBYsm8uLjC8ktCRlrVxL26u8fpVElS2cbPTDIq +Jys9ya+qrbvyS0hOUUU6OEF2v7SzucjzWFRp3c/P297RwLi3vNQ8KSAeICxdsaajqLPaQzg1 +Nzs+RVTmw7Osq6/CVz08QE/tzMLAwb++vsL5NSQeHB4pTrenoaKptchcSEA5MjE3Tsm1rq6y +vc9fSkVDRUlPds6/ubW6xWg5KSEfICc157Gkn5+krL39RTgyLi4vN0zKta2rrrnUSjgyMjY/ +Z8e5s7O2u73GWzElHx0hLVq3p6Ggo6q1zVg+MSspKzBB2b22tLi+ytTlfW9pbGdlYWD418i+ +ubm910EuJSAgJTBUu6ulo6WrtMV4RjcvLS0wOlDZxL+/v767uLa5v9VSPjo8P01w18vEvr/K +WzwtJyYpMEPNtq6rrK+1vMbZZUo9NjIxNDtN3L61r66usbnKWz40LzE5Su7Jvbq8v8jjSTgu +KSgrNEjPuK+rqqutsrzhQzUuLC40PlLcwrm0sLK2v9ZXQjs4ODxJa9LEu7e5v85uRjgwLi40 +PlrQvri1tbi/znVRS0hDQEJESVNo5tTIv7u4ub3H2V9MRT8/QUhY2cG6t7e9yeNMOC4pJygs +O+q6rqytsbjB02xLOzU0OUTrv7SvsrnH4lVIQkBBRU1f4c3GwsHEytLe825kUEc+Ny8uMjte +w7SvsLfG51hIRENGSlfny7+8v85wTUNDSl3118vIyMrQ3OxrXmN36tbOzMnJzd1hQy8nJigw +V7msqKy51FA/PkRISVFo28O7urzLYUpHR1nn2tLOy8fEzNxyUkhIS09ae+vYzMrGw8tqQjMr +KCs2XL2vra+4yOxZS0ZEQ0RP6Mm9ubvG4VxQUlpp5uLm3+Xt+mdcWVdf7tTMxcXL0vtTSUQ8 +NzY3OkF4yLq1trzMaEhAQkhVbOLQy8bCwsXN1m9TSkhMU23k2djZ1t74+mtgYGVy6NPOy83c +e1xNQz47NjU5Stu9tra7ym1OSUpNUFhq38q+u73F3FRGQkNOb9jLxsTI1e1WSEJET/fNw7+/ +wcbT6WdPQDYsJioyUbqrqa258kU9PEFIRkdS68e5tLe+0lpGP0ZW+NfOyszO2GxRTE1W987F +v7/F0nlUTVJdcXNKOCwpLjrmt66utstZTEdGTExKUfrJubCzu9FNPjs+SmHh18/Kx8bN3V9L +RUhY6dDLys3b7efx7tfZeEw7LyoqMUzAr6yvu9pTR0JGS0xNYNK+trS6yWVJREZMW37r4dLM +zM7dWklDRVbjzsnK1OLr28vI0e1SPTUxLzE9Vsu2sbW92Us/Pz9JWHDcy8C8u77M71VNUF58 +4t7w/OHb2eBmVEtOYt3Qz9h+Z2nx0MzR3m5OPTczMDdAZsi6uLvE32xeVlRTTVBl28S6ubzF +311TTUtKSkpObNXHwsjZaVNTXnPt4+1nb+TUysfL2mRKPzs5NjU5QlvVw7u6vL/G1m9USUFE +TnXWycK/v8PJ2V9JQT9BTHDSyMXJztbs+nRjVE9RW/DZ0MvKzdDfXUU8My8wNDxO68vBvLq6 +vcHL4GhWTk1RYuzY0tDP0dff8m527d3d3eVlVU9PTlhsdXT06dvRzs7P1N9vXE1EQEFAQUhK +S1Rm7uHY1dDPzs3Mzc7Nz9nh4uV/a2hcV1tja/fh3t7h6vTp4/F6c2FaX3jr29fT093xc19S +SkNAQEVKUl1dXGdqa37l3dTS0c7Oy8XFyMzU3vtlXFpja2z/9P759nloamleWVVVXvjd0M3N +ztTZ5mxfV01HRkhMTlRUTk1RWmN55NzY1tbV1NTOztDQ1djW3ufr6fRxcHFwdfnu8m1iWlVV +XXPq2dPR2OhwZV5ZXF5aWlZQT1BOS0xNT1lidPLg2NbW087LysnKztHY5u7v9vTt8/by7vN9 +aV9YUVFYZvXf2tnb4ev9eWxhXVtWUVJTT01OS0pNUFdo897X0tHT08/MzMvLzNHX3Of7cvx1 +YmNubHB7fHNubV9eX2Z+7Ofp5Obr+np2dn53cWtbVE9JRkdKTFFYXnPs4trSzcjGxsnLzdDa +5/V1bGRiX19qeWhld/ru9XV3fPbv7fR/+/Ts+nl4fffn3+bz7vF3W0lBQD8/Q0hMUGHx1cnB +vby+v8bO2e1zZllWWlpcY3zh1tDP0993XVlWTk1RT1du6tvWz83Nz9PZ3+h2XlNMRkE9Ozs9 +QU1x0sO/vr+/wsfN2O9XS0tOWfXQy8rLz9Pc5fhlUktLSUpQZuXZ2dza4+rre3ZwbXzt7d7U +1t7valZGPTk3OT5Mes/DvLm5vMDK3G1SSUVESlbw0MfCxMnO3e5pU09MSU1add7Y2Nnj/Gdf +YWBcW19p5tHLyc3beFtRTEdAPTo7QU/hxr26u77DydPb8FlKR0dOaN3PysjL097yaltQTUxN +UmPz4tnX3dvi+XZiYVxXYH3j1c/OzdDjemJURDo0MzY+Xsy9urq7vb/Fz3dMQj0+SGTWysXE +xcfN129TSUBBSFFv3NTS0M/P0dr3XEtJTFRh8dvSzszKy9X4VEhDPTo4ODxJbM29uLi6vcPM +2fBZS0RFS13gz8vKzNDd9GlXTklJT1p44djQzdDY3vxdVU9QXHPt2s/OzMnL0ulmSTYuLi82 +R+3FvLm1s7a5wOBSQz4/R05l6tHGv72/zXRUSEZISk9OU3LazMXEy9h1W1pVTk1OVnLUxcDG +z+pXTktCODIyNUBfzb+7ubi3uLzH51BFQUVOXWr5287HwsLK5VtMRUJITE9aXevPy8nM2nxh +WFBVXGvq2dHLx8bL21g8MS8wNj9Obc+/uLGvsrvMbExGRENCQkZY38a+vcHI0u5kVExGRUdO +ZeTTzMbEyMzS5WhYSkNKVlxibHH083xzVklDQkNHU1587NvOxL+/wMbN0tzn+WhbW1xaZfbn +3NHT3N/v+XxpXFdWVV1x6+Dm/P7+bGZfWU9PV19rdW9scXNmX2FlZ19bX/Hb1dLP1NLNzs/T +3v1vaGz/9/15eu3j4d3oaV5fXVxdXGJx/+zj6+rzbGVdWVxZVVZZX2dt7e3/8/V93uD9+Gpr +fu3s3dbb3t/a29zh4fdoYXJrY/789fn/ff1vcHtjYGVne/Z1dPt8fnNkXl1hY2trcPnv8vPn +6Ozr72x8dHH/bG93cv7p5+Xi3/Hu7fT95exzdXR2fnxpd/vq6PPvenxzfHl8dWZcWlhiaGNt +/X138+7r7unmdmt5aW5w9ubt7uvp6vD48vf07Ojj4eXq9HxsX1lbYGl19fx6fXd3/e7u+317 +f/399vpxa2RhZmJiaXf7++307e7ufHd6cG748vf+7+5ycOvg397b3Ovp+29kYF9ubG72bnRt ++W1ubHpqYnn89O//a/p9aHd1bG9xbnF09u/n6uv35fB87u52cfhzbWpwb37w7uXm8u7n7+zo +931xbm5xam12/O/3+mVkZWxua299/Xx1c2x1/f7s7On0e3Nz9+vy9fvv+PPq9v9+bm1tamZq +en17efV//3zs7O7p73FqfG948e3v8PhpdW58b+ns6PlybmJrb/T/d3X+bmd3ZW1+7/Pq735y +bO727nZ493lteHz3dn7683fv7e7xfXh0endz+W979+p9/n7+b2/+/Op8+3pzaW958O38enJt +e+jq8333+fx5ZWlycXrx9XP68G5mbvz7eP7v9XZ48O/39Oz0dnl5fPb5+nV99fPx7vH48Ory +e3dvaGtze3Rua3F4bm59/fr1fXd3fX17bm96//Ty7u/s6uz2cW16c3N7ffn28vVwc3p3+urt +7+/v7/b+9Ovuffn3fnlvbWhobmtkY256cHJ+/Pp+/fD0fPT093tycn34/fnz9X1z/vPs5unt ++fXt7vxzfXdvbHZ0bWlrbGRt9+vs8Xp3+npxeXRucX37eX/9/Pfv7Ozw8vJ5dnB7eXJ7dnzz ++HL99W9vd/7t7+35bmxudPv9++z38+rl7P75d3JqZmlobW9qa3D29Pj3/Hd0/ffw7/R+/vX0 +7+31+/h8bG5zdXRwbXN99vP4b2/6+fT26+r+8e339fL+/Xx6bmxvd3VxfHny7Phva2pobf5r +7ddt6uDtcHdu8PZ69XdraPBiWFPd1f3j1+He91pf/1/o/ff27t7t6338dvxvaVxn7+zt7Pv6 +7HBsbmlobGpmaGNp83z14N/e3N7n6XRzeH76fPL48Onl5+Dc2tna6X9oZF9QSEA8PUNGSlrq +y727vLy/xcvaWklDQ0dKT17p0cfCw8bMz9npZ1ddYfXl3dLO5EIxLi8xNzo/bL+zrKuusrfC +7EU0LS4yOEd2y7uysbK3xNP7TUE/P0hd6Mq+u7e3vNs+KiIkJys0Q9+xpqKiqLPAejssJSMp +Nk3LurSsqKyywl1GQTo3OT1Uz7+8uru6vMbgXkk1KCImLDhSz7uuqKepsMlZPTEtKyw2Ts65 +s7Oxtb3K+0xDQUVQZe/Y0M/IxcTDyMvO2VY0JCIoLTpW4byqpaWpufdPOC0pJy1A2Ly0sq+v +tL3XUEVCRUlPXerPx8PEx8PAzNnkTTcqISYuNlHOv66np6u1e0A7MC0tMD/NuLCus7i7yf5P +Qz5AR0522c3GxcjKzs3M7HduSz0tJiw0P3bMx7KsrK69XEY9NTM1OEjUv7e2ubu/zOBiTUVF +SVJr49bRz83Hwb3Cyc9rTTooJCktPmfcwq+sqau86kw5MzQvNET/xLe4t7i9xtJ6TkZFR01X +etrLwr+9vLy/y3JFMyUjJis5V9O8ramkp7HNTTgxLSwuOFLPu7Wztba8yutOQT9AR1Fq3s7I +w768ur3BzV45JyQnKjRGYcayrKWlrbzfPzYvKiktOVbHubKvr7C1vNFbQz49PkBNZd3Hvbiz +tbrDZTMoJCMnLTZHybSpoqOnrbxsPy8qJycsN0/QurGtrK2xusxeRT46OTxBTujIvLWztLjM +QjIsKCosLjdJ47mtqqmrsLrNTzwxLS0wN0Z0zr63sa+wuMHN5l1LQj0/SFrt1c3Iw8TYT0A5 +NTU2Njo/Uc68tbKzuLzI3GNIPTw+Qk1adOHNxMDDx8jHyc/jZ1hSXF9cWFhf++pwVE5IREVE +Q0VKVuTLwr6/yczP2etkV1ZZY+zh6unb2t3p+eLd3dnf4+Dq5O93bVxcWFtXUU1IRERGRkpU +ZODMx8DDycvT3fZ6X1xu8uvt8uvd3uT4c2dq9t/d4N/n6N3q/WdnbHr3YlFHQj8/QENObdnL +xsTGycrQ4m9kYWvx8O/9/u3u7H9uaGn04efY193b3OPu9P3p+f1tXE5KRkE/QEhSaebU0NDU +19bc3vZz9uTb2N7n8Onp7vR+/vTh3trX3tvk9nl0a3F7ZFtYWE5NSEdESlFZafXf29TU0dLW +0tXa3uPl7O76+3Nobm5reurq397Y2eLm8fLp5Hfw7nRkXFFMSEdJSEtRXG1+79/h4djV1dPW +3N7n7X76/n139Ozz3+Tb4t/h39/c3/XsePP/8mNgX1hPT0pJSktOUVNbZvHj2tbPzs/S19/v +6evw9fDu++f25unb4eDo6Ojv7evs597j6X3vb1VNRUNAQUdGSU1f7djOysnJysvO1OJzdmRp +Z296+uXb1tfZ3ubp8ez4/XL36ujp8urt9G1PSURDQkFCRU1d7NnTzs7Mzs7P2O9vbWNqbG5z +7dnQ0dHT1tXb3+z6dWf08er4fff8d3VbS0dGRURGRElPYuna19fPzMzQ2eXw8fh9c2547N7Z +1dbT1NXX2d7q7n7r3t7g6nxweG1YSkdJRUBAP0FIUWTr2dbMx8jLzdbj8PLx/nJs9urf2Nre +3tnY19rk6ePf39/o/PTt7v5uW0pGSkU+Pj5ASVdi9t3VzcjIycvV3N3e6u37anvu6ODe4+jn +397h6+zp49/e7+3p7uDh821hVkhFSEI+Q0ZFT2du9+Da1c3Oz8/V2NTW29zm7+bl4+Tr8+ng +5unn4+js6+btb3F8evn1/m5nYlhOTkxEQUVGSVZfXG/j2s/IyczLz9HP1+Pv9H725Ofvd3fs +5e3s5ejm6Onr/X/+8/Hv5+3+f/h0XU5MTEQ/QUNCSVJefN3TysfGx8fLzdHe5ux9cnpwbO/p +8fX57Ovv8O3s8n57YVj07uPPzMnKzt9uTTszODY1PUNR28bAu7q+v8bX7FlHRkxKTV9n8s3H +xMPJz9biXlxTTFNUV27w7tXMzs7R3dzX2dLO2fZOOy8wNTI4P07VvLq2try+wd5PQz0+SFBb +5s3EvLzAxcreelpFQkZGSlNi7dHJxsXO3eR3XF5lftfQ1NT1SDkxNjk5QEr4w7i3ubzFytlR +Q0BBS2X24sq/vLzE2PJgTkhDPkhfX3Tb1M/KytHZ7W3s63/q2M3Fxs3dW0U9MSotNDdFbte8 +tLa4u8rX6Es/QkVS4NPLvru+wc9qZFxKSkhIXd7VzszMyc7xXk9IQ0JLVmrayb+9wMfN3F5M +PjMuLTA6QFLXvbWys7m9xdphTUVET1tp7c/DwcLI0uJvV0tERE5aa3bo0c/P3m5ubWpudHbl +z8vM1N/X3UQvLjM0O0FK2bu1tLa+xMXpSz89RFlqatrFvLi+z9feZ1FJP0RZX2T46djLzNje ++WhrWE1Zfvbf1NHNzdvnbj0uNzo1P0lZwba7urrBwMZYRUhDRlJPWMq/w7/M3M3Qak9KRU5g +Ulrj0s3Iytrh62xdTUVPZ2/+7ebSy9ff2Uc1PTozP0lOzb7DurW+v8VdUV9MSVNPWc7NzsHF +zMPPW1FNQ0lORlD+4NDIycvP9mRfTUlPVVdeberb3N7a6G1rWEE+RkZNZPvUwsHCwMXO0dxg +UU1QXWZg/dnXzcrQ09Xnal1RTllbZPXazsvLy8vYTj86NDY4OT9X2cS6ubm5wtVdR0E+P0BK +XdzDvby9vsLM3FxPTkxOUFr6187MzdPW5V5PRUJFRkpc9tzNys3S09j8WExHSE5OT1BVafL5 ++N7X08/X19TX3unucPns7Pt3f+fa1tDMzdDU2dze61tJQjw5Ozw/THvYycC/vb/J22lNSEZC +Q0hOZ93LxcLEy8/ia1xVT09SWG/g18/Mz9TT2+b2Z1tcZXZzbvv99erufGtqXlVQTk5RVVZY +Wl105d3a19XX2uPv9f14b37m3drb19TS0tfd5uHqe2NeaGFGPURDRU5PXNnR0sjHzMjO+Wle +VFhWTVJlaezX2NPQ1c3P3d3kcWNVS09cY3zl6t/c3uvv9GpgVlFTUFBYU1FfeuTZ2NfPztHZ +5ez2bl9ibv7h2+fq4eHj7W5faGVhbm9s9e14/H/38PP+cGdkbvh6bmVhbHBpbHZubG1panX+ ++XdreO7p8vTs49vd6+vi4tzW2tzd5vN2Y1xcW15iY2f+6u34bW1ybWxmZm1hX19odPLn6fB6 +9PJ+eH1wb3Fz8OPk4uTr7Obf6X1udm1rbG717v7++/7++X54eHFpa29vcG92dXry7Ovq7vz2 +7/t8a2ZfZn1+7Obq7vB3cH39+nz9/Xh6dm91d3p2/vx8+3prZ3Ty6uLe5+7r7vp4b291eHp5 +cW9uam766uXs7/N9dnp8/XhubWdnZWVrcX7v6eXs7/J9dW5sbG1873twePj6+vDu6/L07urs +8+vv9ndycmxvcPLu9/t/d2lub3BsZGdjYml2fvHq6enz7/Do7ft+dvt8fvz/b2x4/fP7eHx8 +9v33fXT+/Px8ePz9/vDm7Ht/8Ov1b292cW1qaGZtb3l9cnp+b21ucnz47Ozx9/X5+fj9f35+ +/fzr6PF/9e74/fv/+O/6cvf+bG1nZmVzdHZybXL47+74/Pbt6vdqaXT5+vv29/Hv7/9rb25w +c25ten587ery/vP9dXr5/Xh4cvz4/3h7/v759/Xv8fD5dHducH1vbWx0fvj57u306/h4/O/x +/Px29/H5fnZuZWt7dXV5fnd0cnF7/vTq63Zxdmpre/Ly8u3z6ury/fvv9/fu7fT8bmtva2po +aHZ3dGxtd/35dvnzdm92f31+9/bu7358+PDu/Hl4/fz39/z5fvz6+nl4/v13d3tudPP9cHN+ +/Xz56ef4bmtuefp4dXp29e338vf/9e/3/f17dHFvb3Z3e/t7dvzx+XF0/nN08vX6dmlna3V9 +8vnz7O/+cnT99/Xm4ez78+v2fXz19H13fGxsb3H483Vuevh2ePz+/v37dX18+/T78evn8P98 +enZubGlrbGlrbGtudX74+Prx7fHv8vL19PTu6Ofh5+77/3t3e3dzb2lpbm90eXNqbG12fnZv +eHl58vn/9fry7O3o6+zw+PXw8/t5d397cn37d2xsZF9ia3t0ePTo8f31+v/z8354cnV/+vz7 +9evs8/l6cnTy7fP7d3p+cGhtbXR4e35+7+37evbz7v1tant3bn/9/XZ99fv/8Or2cW52/Pbu +5+z6d3ZzfPv29fj3//z4dnpzeHNv8vj8+nNrZ2756O7/fnR/dnl2b2tqc2xteHz/+PT37O72 +6+fr6ezt7ezq7+/x9/j6b2ludnJzcm5mY2hoamlpb3NtbG1z+/Lu7Ozo7PTx7/Hp6u3m5OTt +7+zq6fh3bGhmbft3aGVnZmpoaW5oZGZqaW199/z88ejg4+Ph5+3u8/r9efXx/f/39vx8dnJ5 +eHd7bmptcXF29/T7eXhxb/75+fX28Pv8/HRwcfnz7/lqZ2dmbn7+8erq9PXw8/r7//56d315 +ent5ffXv6+j1/vr2+X1zb29rb3B3+fx2fP7+9O/n7P78d25ud3v78e/t7e/6dmpuevx+fXx5 +fn13dPT0/3xua2hrbGFlaG3+9+3u7+ji4+nr5OHq+O7s7ff9d2x0dP9vZmVpZF9odXBz+n14 +enb47evq5uX2fHV7d3v4e/12fPh+/PTx+P56c3hydH73f3d2/+748e9+dXT5/m9ub297ffP0 +dnJxaGZxd3308vn37fP08fb3+O/t93j77fd0dv/8/vr7+/Xx9fp5bWxqamttcHV6d3358+7v +9u/08vX+fnpvaWdu9vR4eX16fX13dnFvf/Lw8e/o6fDz7Ozx6vt1bnBwbm9ydXBvb3Z3e3Jq +cfz57+rx8e7u8P58ffX1e3VzbXXv83h5ffn6eHR1bGpsc3n/+P11/vbs6urn6erv8fR1Y2Fo +efn7enx+eH57/vl7cnx4fPTr/X18ffv57v999vtxd/vz8/91bGtobG9vcnR6fXr7cm537Ojp +4uXq8/Xt9e/1+v52dW/x+X18dnN+fXVscG9rZ2t0fXJqcHR4cX39eXd39vn08vTo3+Ds+Hh6 ++fd+9urr7373+Hdxfn9panN3d29pa2dnbX738/l5bm93/O30fuzq8/Pr6O338u32cG52fWts +evpyaGttbmpx/fD47ePp6OvvfWtvbv99evr/d3h2c3zu7Pd9/n5yfG5sd/n7eH73/nZ6b2t2 +7+3t7352/fX7fnj/8P9ycHr+/P727uzu8Pb8+/V2bGtpcG1sevPz7u5+e/P7dXt+bmpwb3F1 +cvjye3f97vF8eX5+fn5zb3v89/t+ff717e/47O7+9fD8d//v8/J6/PJuc/h8Yl1ocn10eft4 +fffz7/r+/nR0bHN7eHNze/5+d3N0+/Lu6ezz6u9ua315b+7vd35+5+Txdm9vc3x49XZue3Zv +bnx++nJ1+np9b2lobvz8dH/+cHZ4+fHr5+777er4dHn29Prw6vpucndtanN3fPn+bWVqb31/ +fHV5fnv6fvXn6Ons9/z6+XRkYWVtZGR3f3n68+/p9/Lt6+bo73P29H5183tudnt2fnhu++3q +9293cWppanVtbH7093t79O/v+Ovo8P57//7x+X11dvL3eG1ubnN2+vtobHN87+3w8+99bmxw +bm/z9Xr37O/9fHD883F8/nd77uDl9/37fXR5b3FzcXV0cW18+/xvc3ZudHRwdfn5/Pt89PP8 +e+7o6uz6+/pxcv17+Px59PF5ann99P1tcnFnbvz69O3q/XL27urz8u37eHhybXB1cff3eG5u +9/bz//Z+aW1vX2Jv/+nv8ensfPzy7fvv5/P49vD/fH5z9PD5/Pz0fmt08/f/cG5tZm56b29w +b/7p83pz/vN8e/v4/vf49v52/u/p5e779vv0/Hh1//1xbW1oYmpsbXh/8n/26PV8/Ofs8v9x ++nhxfX757fHw8+/89fxxfG9vamRmZnp7cXd+/HT27vR8cPf7b//w6+zu5fJ99v5+fvNwbnJq +dOz4e3j06fn6/HV17+P2ZmZpcXt9emZqd3B1bmt77P9od+/z7/x89PHl3uDr4+H1d/n6em9k +YGJgbG9sbGx7bmtz/unp9O7x9ers8+z79/p7e3L+7OXu/fx8/u7za27+dmlramJhZ3rz7O/q +6e59eHxyanD29O34an34dv18/fzv/n/+fn9nZ3J2++fq6t7j/f95ef3v/mhwbW17enJ5/ft+ +cnZ2eOjr6vB7/3R0a2d1fHR38/D57+vr9vXu/3hwdHJhafvt83d+dvzz8ufu+nh56vR8cnB+ +bXT5emx88XX+e/3u73Fy+mp4cXFrde9+8/Lp6+/57/P58f5t/v/y7Xhqc3FvbGxtaHd0dXj4 +7evu9nh9ef7v+3ny6vn3+PJ/b+77eHxxenr5cXZ1bG5tb/x9evbt+W5nc+/s6Obn5+33+fz/ +cHPs7nl5fG1jYWv9eHhsa/t8eHJ3evz5cHrz/n18+/zx6+Pn6eju8fD99Ovu+nlqbm9pZGpt +bn50fHBlfu39bn3l6/T09nt98Xd+8/7o7nLp+m98a2FkbWz2+HTt7fL8bfvv/nr07+71//31 +7vTse2due3FkZ3Ry9f337PP98/5vdvzk5nFrcv75+3z97e30eHB5empvf/r47fl6d3B3eP5t +YWt8/m9udvbq8vXq5u3v5/Pt7PTz/G1pam1/a3nt+nv+cfjwb3N+b/Dg/2xobv5+eP337+t8 +b2l5f/T5b352fXBj/PX56+Hh7+/5+31sbvTofnzv+nR1cmZ8emx1e3/4fmdk9P9zfnlpb+z6 +fvvs4vtw8PHz7uns7+79+P1ze3l7c2Zrb3x7enl2enP3eG12dvnt7On0/fbu/W99eG1zcG5t +aGz16vFscHzycW18++v4+O7u8O3j7uzu/e3x+PPu9nFmYmpoX3BucPf9/fF7bGpu/vbv+P3v +eV9xc2l2dWtu+O7p9/Pe7e/p+X796vtsb3j/b/rs93l/9/726O7r/GppaWlnbW5w+XJtbGtw +d3Zpb/vw7+r3+ent7Ozv7+Pf6XpqamJjfXdvd259/vR+9XptdHjw/X36f/f9+vH6+fV+evf0 +fvl6f/du7vpv/m16fmtobnZyfHZ35+bv8ntwb3L5fHZventxdXjv7Xxwd+Hc6+n3efvvc3Z/ +aXL8cHF0Zv56ZP7r8vZ1dHB8amVuaP58d2xy6u7w93X7+uzm6ezr6fh59/B6cXN2a2d2+vl2 +a3fx9W9wfXFvfPru83d49+nv+XxsbWl5+Wxvdm9veHNyfO/o7fV7f+7u7uzu9/Tu9mxjcnt6 +6u3573JpeHxra/v5dXNpdH167nzzfnj9bHxtYWr883Hx5eDf5+vm7Xpsb3Xq7fx7dXls7+9p +ff5tZGRjZnr+8+xxavv39HJtfvf99e77+H50a/n/a+fsc/bw7PLw9vrt63pu//L7d/l5+/39 +fHl1Y372ZHFuanNx/nX+92h5+XRyfevxfPvv6+5x/ezm7PTr7vpvevNz/e339m7/7/loYWlv +eurtcXJ1dWRmb3t3bGBoe3tw+er1+nvq7O7p7OPt9Obs7W928u/o9P3+c/htamxrbF5hY19p +/fR9+Pnz9X/4+Hz5fO/m6OXv8u3u/nF7eG59a2RpZWlu/G1t6uLf9nr+b/tvanV3cnltbH7y +8u/37ODte+vq/O77d/hva3Nsa3d8d3/teG1/9O/96vxs9/X/82xs9PN0a21u+H5n+u72eXn2 +7vb56/dvcHNucGp46/h2/G185+zv8O7u6nR65ndr/Ph3//ttamVpeHn69Hr5+X90cf9ybmNt +fvX/+fbs7/7i6vL9+flt/vH893Zsdfh5dGps7+n++e5+/v1sa2p37ff9aW/y/nJ7ePjq82Vg ++PXz8/fi7PP9bG5obHP/bGj/8/Vtfuv3/vj2fnZxd3x7+Xn25evu7vL3+/PzfPH3bGVqavdu +bPNw+u3y9mtoanJzcP3y9vn2dPnm9W5u9+n6f/B+9nxu8HJp8Hr+93f2+P51++j9fn5/7Wpl +eXZ/e3j3e3Hs5/Tp3+337fz9dfL5bGNtZW97Z3F58XJlcvVvcvdu8vp2d3zufe7d5evnf//3 +bXhocPdtcenj+3twdP77+vfu7vdxanD8fXH68OlxcfF5bHT57nJt8H9pbnz5eG/u+fbm6O/5 +efl0aml28Xlxb/3te3x0enNobXT86ut8d3Nv4+f8/PB4aG5+fff7bvz5/fB87fDx7nXxfmVu +93xmbXfp9Xb8duh7bfLq5nt36udoX3B2ZWb+fej2ce50aXX682l17vTr7XZz8PH0eHl2afpv +e/h+9u/p4u998ur9dXV/fWrw/GJqe/vtd3fr8XRvbH3ufX3xfXV8dfdyd/Nud3px6W9v/vNz +eObn7Gxv/PZtbev+/fV98vD2bm7sbHXreXr99Xbs6PVq6uZweGl3+31vZntzcnh79XB4d//q +cnt5b25s7fpyf+3lfX/46+327/by9/VpZvFocu1peHZ2fvP8a/3/f/l7Zf7qbv7r+H7p7Xh2 +e+vo+Pf26/JyZnzxcfJtaXRobGdnYG7p8f9q5t7v7O7t/vTsenFtdf7m8m/0/Xlt9+/7dlxg +/WVub2r9e/P99P3u3uXk7Wb26H3u4vtu7+7t835uZXdubHFjWGN4bnhxc+9qb/Zx8eL6eOTf +73rt5+TweOnn+u3+Z3r++O5zdm9faWhq/mVte/lodfr+7HNz6nZk++jt+f1u9+52enhx/Wtw ++ePr/+Pt9fVvfnzv+/r2duz+dPd6cv7p/WZmcG9tZmNsbXJx797h+HDp4mhgaPlxW3vm7+jo +3Nv9bXV5d3D+e/Ds7+Xz/nlycG5ma2pca2hjbv3u5Pjn3Pzz7/z+/Wth8/v7e//t6Ot5cnxv +73Jj8fvk+mFvcfF5b/r0eHH++Ppu6utt9un1/P1/fe3y9vp8a2praW3s9m/u+fnvfO/uZmZ1 +e15abH74em/r3PVv8uXi6vT+7Ob69fPr7HF773JnZWpvb29tbvp0ZHTz6nb88/L9aXZ7Z/zk +9O7u5+H37fBtbHhvaHb3+Htw+fb37/v59PtpZ21paWFib3f3+/nk4X185+jp/Pvy/P795t/p +/fPr9mtrbXBmZ2ZgbnR2X2T+cX717PJ4fe7h9Pbt6+//e/Pj+Hf07+b3Y2xvZWVhbPN2cnT0 +bG5z6+h5/nvs9Ph38+r98u/j7nd4fu/0bG/v6HRdavb4b3X96Xtrb/X+bnvx7vHu+fHxf3Vv +a3V+dG99+PhtZ3Z+dXbo6/HqeXD9+vTu9Px6aXP/8Ony6Or9/P3zcGRta211b275921sefd7 +bXV6cn71++zq9n319W778fZ6+/Hv7O/wfPrr6nhseG5dX29veXL9/XN7efvt937y7v1w/PD0 +eGxo8+z7/PLw9fvt73hydnN68e3v6uzv/fT3+3lgaWxmYmZscntxeu/teWd3+Xbr6erm6+7x +6+vt7O7vfGltbHV8ef577e93e3xvZGt5dnF3bGpyefx++fh2+n726+7v+3lrb/707P17fvP2 +fXR77PV88Ovr6+vv/npxc3RtZGh8b3FnZGVfbHT88e3v+3j86Ony7ejo5+369np99fDt73xs +Y15eYWlu//x5+/vr6Ofq8evw+Hx8c3Z+//j3ePp9cnj9e25udm1maG1++HZ0/nvz7+7u6urr +7O3t7+Pl9e/s9Hh1e25pbHh+amlxc21ocXX//mxtbXV0fn52cHjs5eLq6OPh3enq7vl3aGhs +en95cmts/394d2lka/t9b3J5dHR8//Pq6+/17u79fHd6+e3z+e73+Pv9c2h36eX2fn5zb2xz +/nt8dHJvdX7//P708vR9bGplaHr59fv78/d+ffL18u/z/fz8/P7/cX7p63x6fG9xfXxzcHx4 +fHz99PDz+/57dnV67+32/vny+Pz0fGtyenz89vN/eXt5fvh9cm//dW3+fnh2+vH+eHJ3ffPv +9PT17/D9fHJ48O/+dv56f/71+XpybHVveXz4dnTu6unp6/P+/fb8+PVvaWxqa3d+eW158Ov3 +dHhvbXP19vfs5Obr8O7u7fH7/HJwc2xzfG92em1pbGxqa3r1+Pj0+3R+8unh4ujr6fP78nhp +bHFseHR1dv58ffd7d//y7O/7cXJ/+/1ua2d1fWpscn358OvyePnu8fPq6uXp+3p/f//38Ply +bXFzb29pZGVoffD2cm96d319+/j38O/v+v3u7PD29O3v9+/w/X36eWZlffV6bGt1ff10cXFv +d/L1f/52bnZ3cn7x8/L58vj17e3s6uLn+n3392ttb3h0ZWhxc2x3f3ZtbXVybW16/Pv07/Hv +6eju//nv7u/8+Hx08unn7vP2+3JvbmpsZmBkaWhvfvPp6+zv/HZqcnl2/HltdPHn6+/y+PH4 +/3dxc3j57O////749u/t/nZ2eH76dXd+fn14dH57bGlrbGt9eXL8+O34e/z27uvp6fD09v9u +aW1tefp2evL1+fv27fP49Pb69ndzb2p1+3dpcfx2bHr+c21sbXX/++/1dvfs83x6fXdzc3p4 +evry5ujt5uLm6uft/XV1aGNjZWppampzdXNtamltdnp3ePHv8erl6+7m5ezw6+3x9/308/n/ +emlpc3dxbmtmYmdtdHx5d/708Ozs7vt5/nt4fPLsfn76fPbo6fX+8PtsamNo/vPy8vv7+Pzx +7PL07e19cnz6fXn5dm17dndxbnZ7fHhvaW1vevf3/315c3r26uDm7vbs6fb9+/H4+/1xa2lr +YWFvb3Zze/Pz//bp6O7z7evx/H75e3r+/vl/eW9ucnt8bmhnbnt6enn+7vH1+f5++/f9fHZ/ +fXn+9f11bWZe/tH55OZmVVHb4W/k4+xsUWTZZ1hozszk69PMUkfhYE554GXe32vo3nZvcXNO +V2xPXnbVaMzW6v7p5kvf5V7v8Vpx2mr0ddr33vFr3nZuXP5oXuxh3OzoafBned5eXtzjZnPf +5uv9XfPf9Vtn4l9v6FLm8mti7+193XN04W9j9Oj1/29nfe7r3eZz7edl6vNZcvxgXWbr/N92 +V/NsZm5ybXfkbW3n4+Pr7Ovd293X297f7O7f32hx8ldVXllKR0M7ODc5RVzcxbq4urvAx8vQ +19jX1tLW3dXHvr2+xsTGw8soExUdHi/bvqebn6yrsvRMOCQjLTNQuK+rpau+0GNJVF9c0r+8 +tbK0srdMIxkQEB8za6qfnZqcqsJBJh8gHiNPqqGgpbO/2D4xPWjIuLzDtqqmo6jPJxcSDxUf +PbSgmpyfp8U0KSYiK0TqtKSjq7TQQz5CQFfZ2tfIvLWrpqWoySUcFw8RHz25nJicn6rmLykm +Jjm/sa2rr8thVD5DeeHs0st+5cW6sKuqtHU3KB0VEho8sJ6Znai2ejIpJSlAtqipss5sVElO +ZdzAyE88PEzGramqq7HNQTIoHRUSHsWgmJiiv1Q4KicrNdarpa7MS0VGTeXKxMlbNi45362f +naOt2DEqLi4iGRghvp2anKxfNDIvLjBDvqqnr+I6O0NIZ8XE2FE0L0y1pZ2dqsZINC8/djke +EhQvrJ6bobpMRDgrKzfQqqKryzsvMzhSxba2zj0vOsirn56lvzsuNVe9s8geDQ4gv6CanKm8 +Xy8iIC3aqqCktEcuLTNLvqytyDgtOdasn52n0jEqNv25seYeERIfy6Wfn6a0Vy8lIzO8qKOl +uDcpKzBVsaWr1DMoL9Won6CrzUQ5OEvRx0gnHBkfPLWsq6qtun86MDZNybS7TUJKSFTGraet +7CwlL9WspaesteA6OWPHbzckGRspQ8i2qaSkqcU0KCk5TFjYu7a7wMfBtrPLNCgpNtevpqSm +sNs9LzNavlIlHRoeK9CioJ+eqecvKSUoNme5sbC0u8LGu8JcNystONq0q6SlrNc2Lj7EX0tB +ISUoJ0fOtq6wuN1JPjw+TM+8uL/Q0MW7t7jHTDYvOFHFtK2rsc1GOkVJP1TV1DwdHEFUMEuu +p7tGOEu4scTHubpfOz7erqewbzs7OC89vq6xutJIWOTvTEpFNC0rMTY4Vu3Yvbm/0Mi+wsnY +3uHV2fDDs62vyz8zMzg/VuDEvb+/zHtSNSIjN0o4PMa3x1dPwa+02FnPwOBFU8G+ycm+usDO +9GlKNjM+aFdOw7O7304/Ni8vMDpoxMXSyb/G1eDPzvZPXtHI1/3Pwsrf/tHG1lJRT0NOTUrc +zdzR11hBPUI+P0tJZ8PEy8zEwdt1bGb5Tk3KvMb66MnTTUTZwdxbXVFQTUVO4srNzs/WbEVH +SD07TtTP4NjV7FBHaOZ6/d3Ly9vf1tx4dNTYZPfH0f9k29xi6+vbzOtLR/ZQOFjaTWjN21lX +TVBfTfptUmNs89HZ693h5mrPz83Kv77nUstNOMrN5NPkc2tGWFJEbNvcUlTYWEHmvjrj5TfS +dUnG4XDFPt/ASc+60ui/RFX7ReLF2eXL4WVeVFZW5Gtq0lZf7undWs9MRt8+YV//x13v4Mxc +wNtowkpnQmTWR2i812nSXVTNcEvhyExZ3elV7GDZbGbcRmxiVljZ1u7NYMVh3sxL1VVPcWtT +1v/Pcs5bTs1E3Pvg8+LLS8NZW9px3VrkTU1dWt5N1fPl207T3+7tXfBj9Gjm7N/cfcRgRc9h +U2XY3FHN8Fjf2EnY1k9Q3E9YS75LashadlreY9bW23jNZ2prbWRoy2Pq+PZq0nVT1Wxd8nph +X9ZPXNhI7WpX3/bMTHXbZkvAYfrB5d1iz0zMa0TC7ULPxTvn2VZHx2s/w/FBycQ8c70/T8VL +ULtRR7/pU93lZdTaY+TeV+Jfffxj31jkak3YZW5b3uVecODJ8lTI1lr9WmVXXU/O2UTc1mlg +69fs01BnzUnjV1/haWpu1k3Y7VjP10nF7ldkuUpVu1pJ1XBHxtYzvcw0ZLg9QrlxPL9mSr9U +Qb/FOeS8R1PHUevQVPnGUmnEW+3a63teWWtrR+fYRHPmXmT84/Zp5OXufdJo2NJW2+hgcV/u +Yenib/7272lm49vfeFzufk1dzk5IznxW1tdh0+pf0t9P3NxPaelrXHRicu5iaNboZNjeWfXO +Z/XVfGHaXWnlflrc6FpqeWtS7u5SWGdbTn1dU+Tfa9nY7NbN18/C3MzH3svI39bB2GdPRkgz +LDc2LS9CRkfl0by5vLOttL21u9bT5VhNS0xa7V7cvcPoy8lUPT02Ly8tLTY9O1XIwr2xra+z +s7W9y+BtSz4+RkVIdM3Fwbu1vc7STTozLissLSswP1DnvrSurayrrre8xHFLPTo4OTtEb9TJ +uLKyra29x9I4LC0mHyMnJi1AXsWvq6ijpqqrtMprSjkzMTA3P0vVu7awrKqsrrXD3zoqJyIe +HR8mKjJMu6yopJ+epauvu3Y7MS0sLCw2SG3Ht62pqqusr7e8VEA9JyAlHB4mJitFyb6qoJ+f +n6Ost/o7NSskJywwO1HVtq2uqaerrrLC5d5ROjUpIiUhHycuNlfBtqifoKChqLLESS8tKiYp +LjVO1cm4ra2trLC1uMr85n5HOzQrJScmJi44R8u3r6eipKerus9ONi0qKSsyOkfTwbexsbGw +sbm+yOrk4O39UEE3LSkpKSszPVvItq6rqKqut8doPzUuLS8zPVHnyLy5uLO1tbe/xMvKz87K +21xFMCknJSgrLTNL1LyuqqiprbK70E07NC8xOD5La9bIu7S3sqyytbvCx9dlTEA2LSclJCUo +LjlSy7itqKWkqK63y1U9MCwtMDhGbNK+uLOvr7G3vM13bFxYUU5IPTIsKygqLzNB8MKyq6em +p6y3yFY8MS0tLzZBac+/ure0tbe7wtDncGrp2dveeEMyLCcmKi04Tte7rKelpKqywms9NCwp +LDA9WNnBvrizuLm7xcvP3djOy8fK1lo4LCYhIykuP9+9rqajoqavw1U4LSomKC8+47yzr7C1 +uL3Hz9r/9trLvru9wtk/LCQeHiIpNXe6rKKfoaWvyEYwKCQkKTnjuq2qq662x/hSS1j42si+ +tq6vtck8JhwZGh0jL+Suop2cnqSv1TgoIB4jLUm8q6Sip7DEWD47PEdm2MW4r6ysscY4IhsX +FxsjNcKmnZmZnaW0SywhHR4jLlywpJ+fpq/KRTMvMT7+xrivq6eqtt8wIRkUFhsmPrikm5ia +nqi9QCkfHB4kMO+uop6epLPkPC0sLjhewbOsp6WnsNI8JhsXFhgjNOGpnZqZnam6aSsfHh4i +Lkm8pJ6foqzISjIqLTVCz7aup6Smq7pPLyIZFhccKD3ApZyam5+qu04qHx0fJC1MtKKeoKOs +x0MvKy84R8myq6alp6y9SSwfGRYXHSo9waWdm5ufqrZYKh8eHiErR7Sin5+gqLtYNi4wMz3Y +ua+ppqiuvkkrHxoYGh4lNr+qopybnaKu3jkqHx0gKjjYrqeioau6yFA3NzpH1L63rquvuMpI +LCIeHB0kLDy/q6einqKqss8/MCkjJy40XLm1r6qwvL3cTWzk5Ma9vbe3xNPgRCsmJSAgKDJF +0bqup6aqrK+9X0I6Ly4wM0fda9q2ucnBv8S+vb64uMDAweVHQj8vJSUqKiozTt7EuLGrqa6x +tMJiSTszNDI2SkpE2r7Hv7Oys7G1t7fD2Nl1Rj8+MyspKyoqLjhH4Mi8ramrrKuzxtxKNjQw +LDQ9O1XDwLuvra2usre3xO9vVUI/PjUyMysnLS8sNFXkyLOtqaaorrK+Zj84MS0sLzs/Tsa5 +tK6srK6yt73QWkpIQEBGPjc3MCkrLSstQPLLtaumpKWqr7nXQzcuKCYpMTZExrOvq6eoqq+5 +vtBKQEM/QEtHOz89KSUuLCUwe9a/raijoKerq7lMOTQpIyQpMjpOva2qqKOkrLO7zVY+OTo7 +PEVdRTY/NSgsLiw3TVrCrKuooKGqr7fyPDAoJScmKjlXyrCpp6SkqK64zFo/NjQ0NjxJT0VB +QjQvOC8tRFhQw66tqqWprq68WEU6LCkrKS49QnKzrKympKmttMnfVDgxMzEvN0dAPk9MPkVH +PU1oWfPCu7u0sLS4u8reekM3ODg1OEdb1ry0sK6wt8DSWkA7MzEyODxDadbKxcHCxMrS0uBm +YFdOTFJSU1pVU1VXWl906d3WzMbDwMLIzNX/WU9HRERHSlR44dXPzsvJycrO1tjedVhUVk1M +TUlGQ0RGSlZs6trOzM3Ozs/O0+dyaVpRTU9YWl5u59TOzMbDxMvR5d7M9urY4PHxblVOSz86 +Pj03O0lNVeDSyL68wcG/z+VuXUtBQENLSk/0zsrGv72+v8nJxdff0dZ6cdl3WVxNRz0zMzk2 +MDVIUVfWvbe0tLa0uc1pX0o5Njk6QktN4L++vbSztri8xMzdW1tZRkdPUlxZQ0tMMTE+OC47 +UU/8yb+0rbe8srfV/PRLPTg2OT9BTdnAu7ewrbC4vcbcUz88Ozk8R1d8997NUDdITS4tRUc8 +TNO9srO5rqq44M3ORzU0ODk1OV/Ox720ra+5vsDcTEdGP0FETt7V3sPJUkU8ODctLDtHPEfJ +trOzsKytuc/b5UU0Mjk9ODt+ycvCtbCzusHEzGJKT09GRE586eHMzldNQzEzOC0tPUZF6rmx +r66srK+60/NZOy8yODYzPv3XzLuysLO6vsPdVlJUTUhLXt7Z1svTWkk9My8tLTAzQXzKu6+u +rKyusr3RUjw2MS8xNDpMedC8tLCvsbW5yOdrU0hGRUlk5vThztVMPUMyLDguK0R0UtW1rq+x +ra+3v2xCQjguLjQ8PkvRvLavr7CutsTP1WBCP0VJTlVn1stvR09RMic2PSotT+PWv7asqqyy +tLLCRj1AMy4yNThP3M69sbC0srG7y9V7T0U+PkRKU13cy15EcPM1KDVcLipfyd/Dua+qr7u7 +ts0+PUk3MTk8TNnPxrKvtri2uMbhYkxAOjg7QkVIYdTJyMjE5UM8SzImOzYx4lNKrqy+sKmu +vcXSVUtCMDlPPD7xy8W/u7i1ucbO0GRBP0VEPkNcbfng2cjJfuXUPTRMOis0PTtKX16/sr28 +sLW9v83f2l1FT2FNTurPysXGxb/J2fB9bElARU9CP09bYHpWXOnWaHba4utWU2NOSU1SXWpc +XtfR7dvJzdTX2tLU3d/Q0trX3tLW6XzW419TbF9FUlBOWW9WdOjy6GPj5nN5YOxkYFZX42ZX +TXpvT/Jg5t316vHM3HrO0c/d09zf3e7q/fn6XmlhWl9a6GBp5Gbp5fvg2Ht4/W9lVGhgTmNn +WXD7dn3m697v7nfm7lRtX15vY+/82N7W19Xr3OzuePBnXutveWj47/Dq8dnr6fV4b3JRWF5Y +XmTs5XRv3ezp529nZF9qZ3hmZn3lZOXs5/TxdeTm+f7g+fb2cff25ebx3Nbx/n15WFlpXnBh +bnbr4+bb5fV6ZF5dXXp07vv52/vlfPJialtYU1VZV21l+W7W19LRz9HR1efh+XFdYmRiX233 ++vbc2dzh+HlkZ1hWUVhdV19y+tzZ7NzX5nBuY15aUV514+Dc2NnV4tnf6X1iWmVfUVpZZW1u +5d7a4Nvq6d7x8P7ub29qaPBq7+zf/u1rbXBnXFZoYHBm7W9+/ufj7e7l63Jp+m9q9X/14PTb +39777vJp8l9ta15fX2RzcOjr9vbj9e/za290dH3y4vjm7+Dz5XXucP1daGlubFxgW/l19+/q +3/H28+TsdnDs9PT55OD08PPrbmpqb3JjdXD+aexc+XX3b/zscft4/2D+b/1m6vL37fDj5ujr +4d7w8/LlfGduYWtrZm9me350bHpw/nN16u74/OXc7G5teHZqa3B8fmtmfPVwe/Hq/uDs7Xvv +8//u8uludPFx63P7/OlqZ2Vi/mdubX7+buz16Pztdu1+dvBzfW/wf+fw7Pz1d/fnb2/wanBr +cHP5bnZ9fXl7/m3/fvnw9fB4/fFs+f3r6uLh5P3rb2xzemhpamp3Y2h0b2R8/uznfe7n4vL/ +5+TvfXNxZF9rZnFrfPH1ePvk9/b87fD16vDv7f/q9Pz5bnX9bW5rdnxyZ3zyafh5fm9pc/du +cGVoe/rvfe7/7eTt3t7g7vbo7/z87edz+vJmZW5+X3PsVG/vanHpYud9anz5a2R87+17fn3t +9njn6ejs5fX853hpf2dc6fr+7vlia3pjcvhrcev76e3mbvnref3ybv17/npyfW3f7eP74fZ2 +aWbt7PZb619vZ2/rZ+5w6277XXJ5eOt7e3Xqbvd07ujweX3++exz93t0cOzn/d7h7u/3bvZ1 +c2N6Z1lv72JkaXzp7m563O1lcPPe7v73+fZoZ+/9aHn8am1udXj66+rx8uzjfvn19O32+3n6 +bmj17PX17vl5bGhveGxfe3Vi9Ojn7uzq9n7+9/p5/eptZ2hsbWBdXGBfWVZVW1df7+PZz8/J +xsvKysvU5O3+bmZgYGRp8t7d9mpUSEpDOjo/PT5FTGjWzMO6ub28vL/G0+n9XExMUE1MTFFj +eOrSy87LxsfHytrf22RIQ0Q9NzQ3PT09SXPd08i9uru+vLvDzt3saFNMTU5HS1pt6NbKw8DA +v77BzNLSekY+OzUvLzQ2NThDZN3Rv7e2t7a0uL/IzeRYTkpGQUFIS05Z3szIxLy7v72+w8/6 +U0c+ODMyNDAyOD1HXtjHv724tLa5ur3CzN3tWEdCQ0FDSl/+69fJv76+vLzCy9ZnRzw2MjEw +MTI2PEVQ7sm+ubWztLW5vMHL3/VdS0lHRkZITVZu28zEwL68vr/G1vtTQTs1MTIwLzM4Pk71 +zMC8uLO1tbS4vMPWelhLR0VDRUdKV2T/2M3Evr27vL/I32dYQTg0Mi8vMDY9RFbaysO9t7O1 +tre6xM7jX01FQ0RCREtRXGzbzMa+urq6vL7G41xPPjQxMC8vMDc9QVDaysG7tbO1t7a6xszd +YE9JRkZAQUlOW+7PyMK/vr6+vcHM52JKPTUyMy8uMDg9RlLbxr+7tLS2tri7w8zUdVJKQkBB +Q0pPVGvg1MzGv7u8vr7G1m1PRDszMjMvLzQ8RE/xyMG+uLS0t7m6vs/a4lhLSEdHQ0VRUlbv +08vGwr6+wb/Dzt5YSUI4MDMvLjM5P0xd1sK/u7e0tbi7vMXW2ftPSUhGQ0JKUFNn3M7MycG9 +vr3Awcrpak08NzMvMjEyOT5Ha93Jvry3tbe6u7/I3O5+TkhIQkJHSlZjYN3My8S+vby9v8LJ +33tYQTk3MS8xMTY8RFni0cK8uri4uru+yM7lXFJOSkhIRkxOVW/hz8fEwL/Bvb7GwtB0WEA6 +OS8tMjAyOT9T6ti+trm1sLS3u8PH21VTTUA/P0FFQ0xrf9/Kwr+7urq5wsbF509GOzQxLS0x +LzM/TGTOwbmztbGvtLi8ytlhRkhBOTo9PUVPaNfKwbq5uri4ub7IzNtXQjk1LywrLzEwOkxq +18K4sLCxr7G7v8l9T0U7OTo2OUJGVdnLwbm1trS2uLq/xdJjUEU2MDMuKy0vNDk/XMvCu6+t +rrCwtb3M9U5BOjQ0Njc8S2jbx724tbOztrm8x9PoYEpAPDUxMS8xMjM8S05uxbq5tK+wtLe8 +xt1WQjo6OTI3REpL9MO9vLSwsre8vsbcZmhYRUE/PDUxNDk0Mj9STVPMuru6s7G2vsXL5FJB +PD08NzhJXmTZv7i4trO0ub7I1OBiTExPSUBDQTs3ODk4OkFLT3zMw766t7m8vsjiZVhJPDxA +P0FS6tLHvrm3trm+wMfYd2JbVE1OU05IRD88Ozs5Oz9GT2PdycC9u7y+vsTR7mVSQ0FHR0xe +4s/Iwby6ur7GytLsal9ZVVdZVExHQjs4Nzk5O0NOXejLv7u4uLm7v8jZc1ZHQENCRU5n3c7F +vr28vcLJztfsfG9gXF9aTkxHPzk2NzY3O0FPedDEvbq4uLm6wczdaVFDPj9DR1fz18rCvr69 +v8bLz977ZFtaXmhoU0lCOzg4ODY5Pkdb2cjAura3ury/y+RjT0U/QEBDS1/nz8O9vby7vcPM +1uxzb2xraGxuYE49NjU2NDU5PUJa1cW8t7e4urvBzuJkS0JBQUFGU/3Yx768uru9wszZ82Vh +WlZec/1xXEs+OTg4Njg8P0Zc0cC7t7a4urzCz/hXSEFBQEBIW/fTxL++vLy/yM/Z9mVcWl1f +cu3wbFM/ODc2NDY6PUZizsK8tbO2ubvC1PlYRj48PT9KX+PLv7y7u7u/xs/nXVJZWVNacO3u +9VtBODc3NTU5Pkdozb+6tLK2ubzE31lLQTw8OzxIYtzFvLm4tbW7xdD0VlNXVlVd9d/ib008 +NTQzMTA2PU7dxry2s7G0uL/QdVBGPjk4PERV38i+ubWztbnAzu5aS0dKTVZ84d/qZE9ANzMy +MTI5Rl/bw7q1srK2vcbWYkk/Ojk7P01l07+5tLK1ur7G2llHQUNMW2r8283XaEk6NDAvLzE6 +T+XFuLOvrrC4xNheRT05Njg6QmjTwrexr7C2vMbWY0c+QEVS7t/aztb3Szc0My4uMjhH38C6 +tK+vsrnE5VVEPTg3Oz9R5M2+tK+vtLrAz/tNQT9AR01d08PBwtdTPzYvLCsuND1azryyra2v +tb3NZkM5NTQ3PEFXybu4sa2vtbzOaVJKPjxEVGrPwb+9wtpKNzIuKSouM0LxxrmvrK6zu8z3 +Tj02Mzg8QFHUvrevrq+yt8LdW0g/P0FJXtfIwr7A1VdBMi0sKywwO07YvbWwra60v89tRz05 +Nzg9THjMvrawsLW7wMxtSUFCRklQatPDv77By25DNS4rKiwuN03TwLewrq60vs3tTz86OTk+ +TH7PxLq0tLe7v87zU0hHSEpWe9TFv8PIz11GOzEsKiwvN0Npy7yzsbK0ucHUaFBHQz8+R1n3 +18a+vLu9v8fS611TT1JaZOjPysvO1nlMPzkyLS81OD9N6M/Au7m3uLvFz95kVExGRUxebe7X +zMPAwsXIzNbmfWtncu3m3+j5bltNRkA9Ojg5PEBIUXvaz8vFw8PBxcnP2e79dWBfbXRx5uDj +2tTS0NLX3N/h3dvZ2+p5aF5WTkhFQUBAP0JJTk9b//Lj1c/Qz83P0dHX3N3b3+zq9Ozp5+Te +2dvW1NfUz83Oz9ToblxTSkQ/PT09PkNKTE1edXjh1dbWzs/X0s/W1M7T3t/l9O7f4+ne3eDg +3d3Z09PQztPe62tWTUc+Ozw9PEBHSlR09fPXzs7OztLWz9fd3N7p5d7v7+Pf4OTh3tfX2tjT +0dPQ1dztd2RUSD48PDs7PEBFUHvp6NXLzMvLzc/Pz9TW4eTi8P/67ODZ297e4OLg3Nzg39nc +7XNvaVhMR0I/Qj8+QUlPWXDz38/LzMzLz8/N0Nre5fLi5vXp3Nzc2Nzc2Nvm9Pn7+HxuZ2Fd +X2JQRUFFSEZFRk5hfuzk2dDOztPY3Nvc4ujv8fHh3uLc1s/R1dbb4u/t9nRs/nhkZ2tlYVxd +ZWRdU09PT0tKT1FRXWxqb/Tk49/Z1NPSz8/T09LU19rb3N3g5+rubW96dX327HxvbmNaU1hZ +Xl9eYFtYWlxXVFxdXmFbWmb6e+/e2NXOyszRz8/Y3+fl4uLt/v1se+fi7O3u/nj+bV9cWE9R +VFJZX2hqcHt29On5bGNlZ2xpa2n46u3n3dna3uTi6OTp6eXu7Ojm7OPi4+ff3+t/Y15ZVFpe +ZGh3fn5xdHFsZGJkXVxcX195em7559vk3tzu5t7i+vvy8+nz7urn6+jl7/Vzb3BsbWd8enZ9 ++P9zcH1xYmdpYl9udn5xfXru5vTg3N/v7Xp6bXduaGx7anF1eHTzdXJuc3RjeXnx+vPi29vq +4t/f6+//a252bm36/3x/8/fw63ZubWdeXmJfZGp87uzu7Ov7a3Z8b3F+dfp6/PPt3uHveu77 +/Hl+bGj7/fl57vT0++7j73/u4n1tcX5vb311eW158XJqe3Jf+2Zr7+d26/t+eebzeG5obm5m +Wm95YXbr4ufe6uTk3OfY6Nvx8+7pb2F+b35gVl1WVfNhbH3n5uj08u3r6nR+a375fevy82/w +b2N1/fB1+Wx7cPRpbnjk6nfy9+vs5/vh/ux6Y3Nbc3T6e/Lhcvn76tzq+3n5eVxbaHv4avlx +d+lzZHJ0de773ubv+eZ8fvh17231bHl/fWp57OnwceXt83ZxbHvk/HP35XXqcXT09mlb5PJ2 +ZGP/dPZpeOrjbXL1/f9xb3/r93597ez3bW7o9H95dPd6anH17ufg3+Pt8PHx9W9sbHBwZWRl +Ymxvb3Z65uNzZmlqXVpZW19eZG3t3dzZ0tDNzs/Q0drd3t7d2NPV0tjW0+hSOS0uMS0rM0n+ +yr62ramstrq/20k7NTQ3OT1N1cC8uLW1uMDXdl5PRklRZN/Oxb/E20w2LSwqKCs3UtK8sKuo +qa65yGg/My4uMTVAbsu9s66ur7fBz/VRRkNDS2ndzr+7w851OikmKSgpL0jIsqyqpqWsvetG +Ni4rKzFBZtfFt6+zubq9zGxKRk9SSU7exb6/wbu7z1xDMScjKCwvP8awrKqrrK/ASTQwLi4x +OlHHuLe3uby9zGFcaF1QVGL86+vdy8TGxsPG3FVNPi8oKS82PVa9r62xt7m+/Tw0OD4/Rl3K +uLi+wL3E5UM/8vlJVtbN1N9l2sPN3srCzt9uTEVLOCYoPko9aLiws7rL0sZgODpLTU9v6ci3 +uc3Vz2hIR0tX2c/fz8XL2dHP3dzb3tLM1+z/fmdCLCIrQDs1bLWwt8DLvr5jPEnuZ05Secm8 +xt7Qy/VKQ1Pb2+rWxcDI3fvk3HBd7s/Jytl2dWRCLCEoPT84ZLOtr7zPy8N8PT5RV1tddci5 +u8jV5V1RW1ha08bMzcjL0XlPT2FfVWbSw8PWaWNqPigkLzw/TMqzrLHE1s/SYEM/RVr4duDI +vLzLa1Z5alFg2MfByNne6FtIRk504dnIvL3Q9mFKOSkjKz1MXsCwr7S/0trhVERCSFfz5NnI +vsHcV13laFH6y8PG3Gz56k9CTPjPz9HIv8DN/ExJPiohK0JOaMK1r6++4N7gWElCQlTs79nE +vr7NYmbnXk9c6M7L4Hjk2fVdWWba0NrdzcnScllRRC4mL0FGVc67tLK9zdPdb1pHPkZga3/V +ysLH5mjm+WByftvM0+/n2uZvZWrk3N3XzMvSeU9USjYsLjlCU2/Qvra2usbW191gRj5CUmhk +XfTRyc3OzNHQ0dftZ2FvdWhjYWju4+7v8fLo72dr7e1hVVlcWFJOSElWX1pZedjLyM3b3trg +92RTU3Ta1tjWzsrP81xYX3xuWl7m1dfc3d3b33lodutuT01UUEpHRUFGUl1l4s/Nx8XIz9vj +72tWT1dy4Nva09HR1/JpeOt+a3Tk2NTW3ebo7P11fHpYS1BTSEJGRD5IVVv219PMxMHGztvr +Z1JIR1Bx3M3Hwb/Cxc/jb2heW2VsbO/b29nX5/nqZjwwNTk3PUdMesS9u7i7vb/OUUlLPz9J +SEhsz8a/vLy7v9RtXFBJTVJXetHKxcHCwMTYVEA8OCokLjk/9cS9sq2yu8bmVk0+NztJXN7N +z8e8vcjP09babVVVWFxdafPb1NPQzMfJzc3+R0I9LCUtPUFixr21rrTBzepRSkY+PUpo6c7J +zMXE09vY6evp/O3e3eHd3d/c5G5ecuZ6XF1lXk5bTzpERz5JTk750tfYz8/OyMvpXVpdd/f4 +3dPOycrT2tTZ3uD1cO7o+fH8bmxsWVVjdHhuXlZgf3p3bko4OUA/QVPcycLDyszR29rje/Dh +4O7r3NLOzM3T1NLZ529dWV5fXl9dXV1kZmnu72pjWVdcWFdkevHl4fVkXmhlWU5MVGR5+W// +19DX2drWzMrMzs/O0d75bV9kc3z8/HZxaVteXFtmaV1dY15hXl1iXl906+Lm9nxra3Z2dmt4 ++vjx9O7n397Z1tjd7vd8enJw8t7s/OJ+YG9nXGrte3tt+d/r/+99aWthZ/x4ZmZueW9reXtu ++/Hk6Xn/fnxlbHBqbm/0eHXi4Pvz9u5naHxx4+Tn3djZ3dfcfHJrYXP2bWFsb3Pj8GBeaGRb +YmNjZGl86X1qevHp93Xq3uv59v1vdvd3eXrt6X598+Xg6unm+29pbHF48vzn4+zq497o+PF5 +W1tbXWVs+Hr89ebmeXFfXmVYWWVq7+Xh6fnxeO/6+fPy8O7g3uLs4er8dHvx6ujt+vh9evpq +W1xodHH17f9wfXn85X5veWdYYGhteXh+8+ftePLt+XP0+v7s9evc7XF8+e5/9fVxau92Vl7+ +fn395t7k6PhuffN0fPdt9ent633q9WR4fG9982pq+nZleXBaXWhta+zq7vjq7n54b3f08Hb9 +/u3m5XFp8el5Zl516PHz393n7/z+9fp8+HN/73Jt/Xd2fV9jdG1qcPLt/HBrb2xfYXny9/t3 +b/D2a3jv7e3l6nno9Hfq4OP07vPt6/xrfO1zafbsfm1pY2hzaW58b/73fP5zd3t4c/D1ZG3r ++XH46u3n6vDseml/6XR18/h8dG57c2dmfu7q/H7p6vXy/nNpbWpmfvx6+O/z6un/+fL7dnlo +aXZ87fP4fXZ7fXRmef5/dnj7cP7w7n1ud3/5ef3yd3/47+35cm95c3Bvb3X56efufX3o4Ov4 +5eb3+e76ZFpUUVFTS0xbdfPo4drQzdDS1Nvg9fL3c3fz7enk4NzRzMzOztPd6002KygsMDM/ ++b+wq6utrbPFWjkvLzI4P1vKt7O4vL3E2VxFPkBISU1k2svCvb6/wcXH0WtMOSskJywvPu68 +rqmqrrG530AzLi4zO0blu6+vs7e9xt1OP0FJS1BcedXIx8nFwcnV0e9PQzQmJC83OWq7r6mo +r7i41zowLi00Q0Vluq+vsrzT9GpDOD5V4M3N1cm/x9r0+vl+WlLmzc7W90MsKzY1NErQu66t +s7e41kY8NS80PULourSzsrnKcT43PkJFVO/IurnCxsnafFJLVvDk3cS9y1kzJywxKy9oua2q +rbGvumA6MS8vOD1Svq+utLrC1kszMDxISnjGubO60+vcbU5MV9bL2tC7tclELCMnKSgyz66p +p6qur7xKLysqLTdC4bWsrK+1wv5DMjU+Q1/Pvba3xvZjVElBQ17WzcS/u7fKPC0mJSgtOdit +qKiprrfMRDArLTA8Wsu1rq+yu9BMOzg8RU9yzbu6xtzvY01CQ1nUycjHwr3D3Vw9KSEqLy9L +uqumqLO+vmo0LS0yQF/lva6tsLnOXEM7Oj9GY8vCxtnVzVhHTU9a/OXZxcLHw8jQ1l42KiYs +NDZHvaqprbe6u9s5LTA7Q0VWx6+stMLR4lE6Mzxe+P/Nw8/X4VBFS1Va7dTIvb7Fx8nPzdo+ +LCguMy08ya6rr7iyr803LjA1NzhGxKyrr7a5wE4wLjQ9Qk3auLC6z+TeVD47Q2jWx8O+uLnH +71pZOyclMzk6frmtqrDBvsRDLi8zO0pU0bGqrrrF3U00LjM+Vd/HurK1ymdbTT87PVvMxcW+ +u8DK51Rf62xKKyhHPC1Dvre0t8a4smQ1PD84OUNtuLC8v7m97UA5P09HReS6uMXIxNhKOT5S +YWDdvrvF2fbp4Nv6YuFJLSswMjVPzLmur7a4vlc5ODc2PFXJtrCzs7bDXT44NzhAWM28ub7L +zn1DPUFJWW1w1MLI0tXg69/db1t5dTgsQ044QtjBu7zRyLvvPUdbV1Fl3MG7xcO/x2A+P0lO +RUXowsp03cLG+01b4/dLTs/E1+7SvrzMRzAuNy0pPMm7vLq0rrLYR0ZANjM7V83AvbWvtsbf +X0c6MzpOYmrOuLnH2tbZVj89TFtOW9PDxs/NyMbK515fWTooLkYxNeG7uLa7vbPEPj9dSjo/ +7b64wL61vPs9OT9APD/gvry+vrzHdUpFREZHT9/Px7q60GxCLC8yKjTfv76yrq+xxU9FQDEt +NkvoxLy1rbC/1vRIODQ3Pk1hz7i2wMjD3EhCQT9CRVTaycnDvLq+zvhkXT0sLT85M1LDur3C +vre/TEZfUEA/VtLL1c+7vM9zXFpUSkBQ2Nlp2729zdvMxdpOS3X/S0/gekg7OEI8NUDh0t7J +ura7ys/MYjo3QERFT9u6srm8trrhSENGPTY8W9PTy725weDtdkk9PUVRXvjPwL3AwL/K+kou +LTssKkfP0sK1sa624OvdPjE6RUlQVMWywsW0udZoVkpMQj5X7PXUv76/v8PJ3l9KOzk+PDs9 +Uc/c6MnD2llUU09KTHPX3N3Iyuf9altcdWvuzMnFw8zO1upoYGRca/ng2uHs+fZgVldSUE9W +XWzt9NrZ6d74T0xOPj1LRkhf+tzJyci+xdXT1+hnXW33dvLMydTR1ftiZ19cYGXx4/Tl1tx/ +dWhYUFBQTFNcVGXm5NnfaXNZS05ZXE1Ye/bj2M3Izt/d4ndz49je3NLT3N3q/PZrXnfqWlJu +82xoeebqaGH7b11ddO9t+dzc2uVlcFxLS05MTlhZ7uLdyszb3OJxWlFeX1731c7Pz87Q43fv +5f9hdulnY/Pi5O7z5OtjXmZcUlpdXGj05+t/+n1tb2tdWGFWXH5u7ufc2Obn2+ljavHvd/Hf +3Or3/vD3Xmzm7O/h2trb7Xx1YWlnW2/zZ2B462xk5u5mXlxbWVZgfGxw9u3v6OXd2t7j4OR8 +b/Pt9e3n73Frbn5pX3l6ZWJdeuj57djU6/72bl1ddW5t7OLp9f3r7fl0Y2RaVFdf+/Po3+/7 +6Hxdandmb/Xs8Ojc39/l49rd6ux+fnZjZ3VnbW5iYm53bf57f/xrZm5iXW/76OPx5uJ4de77 +eHv2729t6ux/fPnycG7u92Vs8Xtx/ejY3vfq5m1td2dxZ2ztdHPz+HD+8nrzfWX+cFxqeG/y +6Pl5fnZ6/O3e4uzr731tdfT2/W1ucmps/Xxpeev3bvT2c+7t7N/p+eTo8vH7eHpzdfd4c+z4 +aXF7Yl1nY2VjY/32+e3o7O7z+unu+/Lr3/f+6/n9enZ9/2t97Pl8ffT8aWBudWn33+Pp6O3u +d2l6fHNpdHdsbWz++3Bkb/tqbfjzbG/v8Ors8ObudvXh3Ojk2d/z/vl8Z19oc2xkb/xvY2Zs +ZWZvfGhlbvvv6/Lv5+787d7m5+ns63Ju7O1tfHx7bWJub2Rh9Ot1cnXx+m3s6P947unzaWV+ +f2916O5/d/ft/G5+82phbPv8fevc5Wt382thau/0aXL2dGVs5ux7+vDvcnDm5O3u7PN8+3h9 +dHHq53ZvbW1jW2VraXry+XBvdPDj3uX6+nFucn72b3rv9v/5am/w7e/57nhucXRtdO/r4+z+ +eW5scXtydXn77/b9+/3w7evn82tqaWJia/7/ffh5a2pw9vL7f/18e+3h73r5+fD07et7fu/v +/HxrYW52aGv+eHn9+/1vb/r7em97end+7Oju8vx88n5/+Hdyfev6d3J7fPzu5uHudnRzbHJ4 +9fdubXN9/vX0eGts/vZuaG76en72fXr+/v/y+e7n93p8/PDt6urv8Pf7ffb/d/fteml3c2pp +ZmpndXH78m9tf+rk5efu7/L9fv73/f78enPy9nv5cXB4/f5vb25maX77+vN+b297ffz1/nn9 +8O31fXl0e/n+8vX++/H2fPTq6fb6+vz+eHlqbGplaWt0ePn1e3p1/fDy8vh6fvHv7/Z29vX+ ++fz/c21tcnN3/G5qa3d79fd4/3368O7u7e75fHj47ez7e/d3bGRsfHpwcXp5fP75eWx37+zz +935we3R57Ovv7PP08X19emtsenb993xybnN5eXZ9ffb4/+/s7/P1fGx+8unq+fj4dW/98Pds +Z3FsbXn49XL8eXBxdH58fXb+7evy9vLy/Pjs8f1uaW91fu3v/nRyen55+vF8bfXw/31z/fX2 ++/X6/vr46/B/fX5+c2tobnFpbHx4fO3u//zv93F1+e3v9u/s+nn+7er2+O31eXZvaGVkbXH+ +8fj5eHJv9fR29e71fH799eru+PZ2bXJ9eGx2e3Rxdm9sc3Bsbvj59u/v7urf3+l9dH767e17 +fvHw7n51/m9kZm9xcXv9eXBsbHn1/nr8fGto/fj+9PT+/Hzv6unr7/f5e29wamZw+vH39vl9 +/Pp7+3dtefL4++vk6nJpdvn38+76dnz9935ub25vam149uXs9n5/bmpubml57ezy7enycHDx ++P31e2tpc/Xs+3d/+3pz/vtwePx1bm147Of2+/jt7u3r8ntvb3B0/3d5bm1ree/z9nh4eP7x +//98evz7ffzw+nt/cWhqbXRxbvv6//X5cnB9+Ono/nZwev746vD90+1w83fs+uz9bGJnaGpl +bGr+7H58a3Z5bP/67vV79fb/+e/p+P3z7Ovv7vl5cHX/9nhsdfV8bXr09X38e21tbW97dHZ9 +6vH6/PT5e/nz8vL1eXB3df3z7/X69m9v//Pt6ft4/vz3939vcv18Zmh6dG1vaXf38vH5cGpw +e3ZwbnZ+8uLl5+fm6Ofm7vD6fvj07vhvb3Nzc3VvcfhtaHZ7c3b+b2l0b2hpc/Py8vHv7e35 +evju7u/49/1/ev/9bP7u8fnw83JtcHV7b3r68uvw7+77ef17fnz+9nR0/XZueff+fXd7fv3+ +e3lwc3z6+W9x9uzv7er8dnv6dm5tb/b28+ro7fHs8Hpzem5qamVncm7+6ev0fvl8b3ztfnJ1 +e3r8//3r7H93/fzt6O9+dHVqa29rb3V4/O7r8v716fp5/n12dXx2c3p8/Xt0c3r4dW/+/vXt +7urr+3z/+/x4e3lubvz9bGxzfnR+8u3r+vn2/m9y9/V0b359c3f9fXr68ujp+312bGpt9fL6 +6+jufvj47+/+eG9nZ3Z1dnx2fH16e3l2cm50eXZ2/fx1cezq/e3q6O/17/v16uz5e3Fv/vbt +9fT9c3FrbGpqa//vdnz6eWdr/nB4fH11b3J7ePnr7erp6uzu9318//z7fXP7839+9Pjy5+n/ +df93eHB8b3X7fH57dW5uc2988HVrbnB1+fn28fTu7/fu+Xr+e314dfLv/XZ/+Ph8f+34/PHu +8fLw93ZtcHNsb3Frbmpse375d/To7Pb67e99cG58/fnz/XN38+/+fHt+dXn16+78fXtza3j7 ++m1y9/v56+9+fv3993V39/b9+/Xv8O/0cW99/Pf7e2lpbmR87fZzam1tcf77bGpzev53ePXt +6OTi3+j79vP3fe/p7PX+fHNsZ3ru83J1dWlqaW5vcfx7efn8cHN/e/zy/X15dHf76+18+evp +7O70/W1oaWt2dv7xfm5xe/v6/vHv+HVw/v3//fn3evXs8f16eXr97uvvfG96/Pt7d3FsbnF0 +dm5mYm9wbX19dXp9f3Nz//rv9nJz8+nl4ufm493e6vvw7H50ZmVrbGtoZGNu9/p3bnX/ffd+ +++33/O3v9PN4cW1qbHF5cW9tc3X56ejt8+75/Xjz73t2+/T8fnz7e29udm9xd3l7ffDy8u/1 +eHzq6uzr/XN57PB9+vB9bWpyeGxqdXd4cnJ6bmhlZGRuff7z7uvr5+fr9Pfx/nV4++7s7nJp +bnz37vTu7P90dm5pcPfxeHr4fnBubvns7vhtZ2t3+vl+ePbp9PZ+dW1oZWdueujpfHN29O7r +5t/k7fh8fvX3fnlzcv33fft3dXFvfHh3aWVsamz69Hpud/f09Ozl6uzr5Ofu9PZ2e3hv/vf8 +eHh0bG97d3J+/3Zsb/b2fGtpa2l48e7v8vT28/f7//58f/f18vn57vr15+z28fTr7f78eW1n +Zmx3bW14b2xw8vD+/H798/LzfHN2dnn+eP3t+H3+/359c3d5/nH55vX0735vb3jv8X39fn73 +fv3y/mtv9/f48fb4+Xz5/Ht5e3pqce7u/v/4+n5++fN7b2pteHf6/n57ffl2bXf46+93/fnz +9u/8bGx1/Pn3b2hmZ3JwaXj49ubf5u3r9Xl68ezx+PX0f3t19/f//3lubGxtZ2pqa3FyeXdz +fHt3/PT49O7u9/Lm6vD88/B1c3drZmBgaXvu8+73fvn27e/s6fN+/P16efvp5/z69353b21v +enh+eW9sbnl6d3zz/HJ6dnh3dX7v6+zw7/L57+n3eHducW1zdm91+OzwcG397f95fHl0ePfw +93V8fPrx6uLp8vr18ezo6/FsZWhnY2n6/HdveH7/dGp3d3T/fvT3fPn8/2907/dyeft+ePzr +7vD18vLt6eLn+fX6+/nz8Pt4fvD0bmprZWhpdn54bmlweXF9+XlsdPbu7PD5/Xd2++/08Onp +6Ovs8Xt3fu/t+XJ2+nxpYGVud/Xo7fp7cnd1a2t0dXZxcXh89fPr7ejt9vTt+n7v/nn+/Xv3 +9vV8/vj/fnj88P9+cGxrb3F7eHR5b25veHV4+O7z9Px69e/zfn71fP3w7/T67ufvd3V6fHp6 +fP/58vl4dHNtcfx3b/r7dmhpcHj38O3xfHj49/ny+n57fXlqb356cXz99evo5efwe21ocW9+ ++/n3+/Hq8/zr6vd7ePf+aGRmaGFnbHZtav7s8fz16Ofq6ex7a239+Pnr5urq8PV6/X5yfH7/ +d3Nrbm9oZW1sbHz093Z5//b47+z06e9vf+3tfXD5dG93+f51fvfz8/nw6u35fn55a291bnV/ +eHf7+uzp+G1493dtfP5yeXvx8vr57+3s7uvp9G5vb2hscG5ubGVrcvz19/V++/f7fP7z9/L8 +fX96/vz5cHFxff7/7OXi9f7/fX1yfP75f3n1+Xx2fX99eXhsZGdrdXpwc3zw9PX8eH75fm98 ++3x9e37/fvD5e/z7efzz9/Dt7O18en16b3749f3x7X5yd/t5dX/+b2hoaG90dXRxa2hqfP59 +b/zq8X1y/PTy+/X19vP28fXs6Ozu7+/37/x4/Xt3aGpuZGRmcnv+9fl2dHt+eHl6efv4fXr+ +7Ovu7Pf8e3RrcPX68/Tv73Rz+fNxbG1rb2toc3N76+Pt7vDq7v5zbvvu7vft8nlyb2xkZW93 +bW9+fP/06ePr9vf4/npzdXz9dH73+e3s8/11fvT5c2ppZWFpand9evn79PLw8vPw7uz48eLo +9/Pr7f9xeHZvb3J3/25s+H9xfvb9bW10bmxuefX8fv328PD47vD9+/50a2969/H69u3u9X39 +/3b+92tu8/T9+/Du+Hh8/v51cHtvZmhxcGn97PXv7/r07O7t6/B2bHx8evH5dW9xfXtvbWx7 +/371/Hb67e7m6+/0f3p5/nt3fXRwc2958/N5dnZ0eHxxfHltbm57/PDl5erv9P5+eXV7+Ozq +6vZ4en13b/fxfHh8+f59bnj7bWdsdG9z+PLv//19e3dzffj4/uzt9e/o6+np7/52bW57f3t2 +cGpxcPjs9357/HVxb2ttamJob3fw5ezs6+Tk+fLx9nN2+PX08fX4fnj19f9+emxqbm5xeXlr +a3v5fPfxeWx5e29xcn7/fHb16Ozt6enu7fp2/nt4bml38+3n5vh38/V37/dsbnx8bW1xbWRq +ffLvf3Ntbm//f2xocf3+ePv8dH7u6+jm7OTm7+7m6fD9/PX29Pr+bmRudnFvbnBybGtuaWx3 +8/f//Xf99/Pt5+X1/3xqaHHz7/rx7vpxbm579Pf49vHv+f51evn8/X1ucvT46ertfXXu6f9q +ZmBfan9uZGRse/p/7uHq9O3o7+vf5fL99Pf0eXz17Op+cWhpY2NmaWtscHf+eHT99Pfv9f57 +fOjq8Oz0eHN5/PV+c2xu+/z6/Hj07Ofp7uz0fv17d390bXz+fG1rf/P6fHRucm9ufm5od/17 +evr8fHj46+vn7vX08O7s5uj0+39/+X1vbWtgZW1vdnz9c2l0+vr+9PlubfTwfnX/8u7v9Ofq +7u70/H7+fXB0cG1/d3P8+3VmbP52a250amd09+7u7erm7PLp6e/y+f59ffx1cGtq+O9vanv7 +cmxwb25z93twfP/39Xr77Ojq7/Dxevbn5Ors7vj8e3dwbGhtdWReY2lvb/ftenvt5/N8b3Z6 ++vbu6vH37e/1fPj++fN5amhtanV8dPro3/F/9/v6cXr8eHZ6d3x8//dzb/bwdnBzbmhvf/zv +7u/v+HxtbXx8dXF1cnN+dHB0evPj4vDv7vTv9PP9/PX27efq9X50eP1+aWJraF9gYmdpb337 +9/z2/n346+fx9+7q7OvvfnP+8vf69nVy+n1ve/j+e3h8dHn+fndxefX2c2lobfnx9PF/9uvv +93lqamtsbXN++/Ly8fr77OTrfXl8c3F9eHt6/Xx9/33v7vPy8v37dGhqbm1pbfn8bnj6/3zu ++mxz//p/e3P7/nJ66+bs8351fPL3/PP19/bw7fnz+HRtdXBrbm5waWpycnX76un3fXv7+u3w +fPn/dnv+bmlx+evs5uP9dnRwbWn/8Pj/+fL5/3JtbG9saHN5fe/x8/n27e/69+/qdW58d3J4 ++/96fPX2cmxvevr27uz1+3j97/Xy7vH18/Z7bWZkcnFlaHFxbfvzcm37+HB4dXh6/fXu6/Tw +5ujr7evzeP3+fXZzcnZ3dPvx7n358n5xb3hybWprd/t3c3RscH77a238/nZ2eXx/6+vu4+31 +6ef6/vL5cGpycm3/6ujr9Pnx+Hz/fXJmY210+vT9e3dtZWhtbHHy+Xz47uvu7+/u6/HyfXJ0 +/vhzcnh5cnJ3/Q== + +--owatagusiam +Content-Type: audio/basic +Content-Description: Flint phone +Content-Transfer-Encoding: base64 + +/31+/35/fv7+/v3//v///v59/f5+/X19/f5+//7/ff/8ff/+///+/Xx8//9/+Px7fPNyf/38fnZ+ +9vr7//79/Pz/ff1+/v98ff3//37/fv79fv9+/fz//nv+/P/9fX5+/v3/fvr9fH7/f379/P17/ft+ +/P99//37fX77f379f/5+fvz+fv39//1+fP3++vx//f39//39fvx++33/+379/n99f/v//P77ff3/ +//5+/fz7fn74fv39ff1+/f7++////v5+/vz7fH37fvl/ePz//vz+f3/9/v/+fX79/n///n39/3/+ +fvx8/P3++3z7fXz//n/8ff77/H7//339//3+f/p9/v5+/377/3/9/H7+f359/vz/fv349HN3fnb+ +///9//Z+fn98eXrv9/38+vz+/f7+fn79/H59/P7/fH58/n1+ff/8ff7//nr9/33+/v/+/3p+fv7+ +/H/+/H///f58/f79/Hz6fv79/n7//n79fv7+f3/7fX37/f5+/vz//3/+e/v8/v7//fx+/X7//Px9 +//39//7+fH77/f5+ffn++358/f///v/+/v7/f////X9+/vt9////f/7+fvV8ePh9/H99/n//f3/9 ++33//37+/fz///78/3//fX78/v39fv/+/f9+fv/9/v58/P3+f31+/vx+/v/7/n38/3x+/P///n37 +//t9ff39f35+/fz+/f18e/v8/nz+/H77e3r+/Pt9/H5++/7+//3+/v9/fv78fn18fvt++33//X7+ +fH98+f5++3r//f1/f35+/f7//n39/X3/fH/8/33//f7+fnz//vz+/n5+/n79fX7+/v7+ff79/H39 +fXz8/P95+/1+/n9/ff79/X5/ff79fv1+fvx/fn78f///f/59+399f/7//X5+fH/7/39//vt+/v77 +c/37fv1+/Xv8f35+/P9+/v7+/33//n5+/f7//3/9//x9ff7+f379/n7+f/99/f7/fv/9fv9+/31/ ++/19fv7/fv99fv78/35//P3+f/59ffp8fv79fn/+/nt/+n3+ff1///17/X38/3x+/v7//319fv1+ +/H5/+n3//nz+/f5+/n7+/X7+fX38/X5+/v3/f31/ff7+ff/9/f///Xx8+nz9/n1++/5+/33/f/79 +fn78fv7/fX/9/X1//H39/359/v1+/n3+/X78fn59+/17f/z+fv3/fn///v9+/f5//n19fv38/359 +/X/9/359/Px6/f37ef7+fP7//f18/fx+f31+fv7//P58/v3//n3+//58+vn/b//7//x+/f1+/v3+ +/n3///77ffx+ffr+//1+e/r+f//+/v7+/n19+v9+/v7/fv//ff/9/f59/v1//X3+ff79/fh8d/t5 +dPr/evt2+f179/z8fXt+8f9983z6fHd+evzzfvv++v1//Xx9/379/n39/37/fXt+/v58/f1/+nz8 +fnn7/P9+/f/+/X77ffr9fvz+/vz9fn///f3+/n77/n77ev/+/v1//vz/f/x//v7+/n78/X7+/n5+ +/Px++39+/X///37//H//ff39/f1+f/r7d379fvt9/v9+/P79/Hz9/P///v58+n79//79/v3//377 +/3/9/3/7fn7//X39+3x/fvn//X5+/H/9/v5//v7+fn38/X5//v1+/v9+//79/f58+n7///99/v3/ +/n/8/v//fn7+/n59/fn+fn5/fP5++/x8/f3+/35+ff39/v/+///+f3/+/v3//f/8/n/+/nn7/f7/ +fvv+/v/9fv77fv39/P99/X9/fv39fn78//59fnz9/P7/ff39/n3//379/398/vv+fft8evv+ff79 +fv5+fn39/X37fH7+/379/378/37+/vv//v5+fvr//v59+v9/fP18/P1+/Xv7/v3/ff9++v5/fv38 +/f18fPz+e/z+/H5//n7/ffv9/Xz9/H37fX39/v//fv79/v99/378/f19/Px7/H3+ffv+fn18+/1+ +/P54/fx+fv39/nv+ff9/fvz//P7+/nz//X75fn5//f5+/33//v77ff/9//3/fX/9//3+/v3+ff7+ +efr+fv19+/7//n97/f/8/338/v79fX79/f5+fvt9/v/+fH/8//5+fv39/f98//3++nv8//7/fX// +/fz9fH75fPx9fn7//H7+ff77//9/fv/9ff7+/P9+fX79/P3+f/x+/f5+/37+//z6d/3+/vl4/f9/ +//5///z///59f/3///7+/X9/fn7//Px+/376/33+e////vt8ffl+/H15/P/9/X7+/vz+fH59/v38 +/3z9/P/9fX7+/f5///x/+35+/H///H7//H7+/v99/v3+/Xr7/H5+/37+/v7/fP3+/v59//79/Xz9 +/f5+//9//n79+397+339/3//+37+f//9/f56+37+/H5+/n9//H3+ff79//7+/X79///+fft9/f9+ ++n79fn5++35+//z9ffx8fv79/P97/fp5+X57/f79f//9/v9+/n5++/5+//z///5+/n37/H1/fft/ +/v39ePl+//59+P9+fP59/f7//v7+//7+fX/9/vt/ff76fPt+e/t9//19/P5+/f19fvt8/f78fv/9 +e35++f9+//77/f9/fnz7/f99/v79/Hx+/vt9fv7+/Hz9fXx+//z/f/37/v7+ff/8/fx+/P7+//5+ +ff7/fn/8/nz//33+fv1+/Hz+/P/+//9///1+//1+/X99f37+f//9/3/+fX7//v39/Xr9/v/9+v12 +fXX+/n71fHd6+/j7+v39+v/8/n5+/v7+/H5+/X7/fv9//vt8/n39/n78fX7+/v59/fz9fP1/fX/9 +/Hz//v3//v59//t+/v39fX7+/X7///v+e/z///1+ff7+/n79fft//X59/H/9fX/9/vt/ff1+/v18 +/vt///58/v79ff79ffv//v5+fv3+//7+/v7+/n99/X9/+3v9/P59fv5+/fx9/vz+/H/9fvz///19 ++v/9/n19/ft6/Hr8/H7+fP58/f7+fnv7fv19f3/+/v9+/vx+/n5+/v39fn5+f//+ff99/vt+f3z8 +/3799Hlvfnr2//z9/f///v/7/n78/f/+/3/+/n77/31//P///X1+/X9+fv/+//19fX/8fn7+/H5+ +/n19/v7+/37//n7+fv98/Hz9ff79//98/v78fH9/f/l+/n5+fH/8/X19+3/8fn5+fv1/ffz+/H5+ +/nz9/v59fvz9/nz+/3z6ff7///5+fv59/vx+//7+fv5+fn7+/f5+/f5///7/fH7+/vx8/vx/f37/ +ff3/fv1//P7+ff////1+ff3+//99/339f/1+fvz+f37/fP3+/n59/H////98//3+/337f3z9fn3+ +/P7/f/v9/v7+fX77//5//n3+/H39ffr8/337fv7+fX58+v19/379//1/ff7//n1+/v1///59f/79 ++vn5+f3+/X18/X78/339ff9/ff7+fn5+/v3+ffx9f/78/n78/P39/35///r+//7+/f3////8/f7+ ++/z9ffn9//77/f/9+/t//X79//v8/f39/P77+/79/fz7//37/f77/v37/fx++vz/+/7+//z8/P/8 +/P/8/P3+/vv8/f38/fz9f/78/P3+//r9/vx+/H76+/39/vv+/P99+fx9/P38/P39+3t/+v/9/Pr/ +/P1+f/79+vx//P79/f9+/f39+37/+X5+/f1//P39/P38+/5//n78+/t9fvz++/9+fX74fv3++/3/ +/Xx++/z+/v/9/P39fP5++v3//v37//n+/v38+//7/fv9/f1//vf+ffv8/fz///z++vz7/n74ff3+ +/vr++/39/vv9/H///fz+/P/7/P/7//79/fv9/v76/P3+/H/9//v+f/r+//t+/vz//P/9+v79/P1+ +/vv7/n/8+/7+/X3/+/z+fvr8fvz+fv75/f//+v1++v7//vv9/P/9/f37/v/9/fv8/vz8/H77fvz9 +//p/+/3+/n7+/f39+X5++vz6fv/9/f38/H/6/f/7/X38/Px+/vv9//3/ff/9+////f/+/v1+//37 +fv/+/P7+/n78//t//vr/+v9//X7++v3+f/v6fvz9//r9//39/f38/v/8/fn+/fv+/P1++/n4eXh3 +d/z+ef15e3779f32+Pr9+/z+/Pv+//36/v//fP7/fv7////8fn///n99/n///vv//nx9/v7+ff79 +/n9//33+/f3////9/n5+/X39fv5+fv1+/X59/f1//P59+33+fX5//vr+f/79/Px9/P19+H3//v1/ +/Xx/fn77ff99/P3//n7+e/v+/n7//P7+f/9+/P58/X7+/nz+ff7+/v5+/P/+fv5+f/t9/fx7//v/ +/f5+/f/+/fz7fv5/ff///n5//f/+fv1+/v7+/X1++/5//v96/f57/379/v5/f37/f/79fvv9/nz+ +fP/7//t+/vv9/f/+ffv8fv77fP7/ff9+/P7+fv7/fX//fH76fX1+fvz+/X/+ff78fH37fv7//35+ +/f7+f/v7/n5/fX79/P5/fv36/fz9fv38fP39/v78/31+fv7+fP/8fvx+fX3+/v1+ffz+ff97fn/+ +fn9+/f59/Hz+/n77/378/X7+fn7//X/+f/37/vz+/X37/n58/H38fn3+fvz9evx9/v/9e3v/fvp8 +/H7/+3z+/3x+/n5+fv1//X5+/v79f//9/n///nv++3n6fXz8/v79/v39/fx+/f78/X1+f//+/v5+ +/f3//319fvx//X7+/P//fn58f//9fv/+f/x7fv7+/Hz9//p+f35+//38/n7/+/v7f35//f/+/v79 +fP5+/n/+fn7+//v+/n5+f//8ff1+fvr//f58fv3+fP/+/v5//n39/f/9e/r//v9+fn/+/v5+//1+ ++379/n76fn3++v///3z+//59//z//H7/fn3+fvt9//x9/n7+fn78fP59+35+/3t+/P7//X37/f79 +en39/fv+/v77/v79fXz9/n7++37+fX7+fv1+/n1+/v1+/3r+/f39ff/8/v/+fn3+fv9+/v7+/31/ +fv1//f/8/H38fX39fv79/339+/76/378/v78//79fn5+ff7//n5+//37e3n8fv39ff/7/P/+e/59 +//x/fv78//1/ffv9/n7++/99+39+//79/H3//ft+//37/f/7fP78//x8fXz5fX5+//5+/Xx+/n9+ ++317+/z7ffh/ePp9fn39fv7+fv/9/P9+/v/+/35/fv///n5+fvr9fv79+/39/H7+/H7//nv//fp8 +fP77ff7+ff/+/f7+fvz9//5/fH37fH18/P7/fn7//P19fv78//1/ff78/P3//n78//v7efp//f9/ ++3z8fP9+/v5/fH79/v57/n1++v7+fn76/v5+/v/9/X59/v5+//98f/z+/v79/37+/Xz9ffz+/378 +/P7+/v39/v59//d+fv59fv3+/nv+/H3/fP59//v9f379/37+/3r9fn7+efx/fv18/f33/nd/evr/ +e3P79/74/nz9evb4+fz9+/r7fPx/fP96fv3+f3x9/v18fn1+fPz9f/97/P///X1+/v/7e/79fvx+ +fP78/v5+/P37fn3/fv3+/n59/vz//P58+f/9/v79//79fn7+fvx8/vx/+v94/v79//t7//p8/n18 +ff79fn1++/9/fn5++/3//v78/H59/37/+X5+/fl9/Px//X39/v5+/P79fHx+/v/8fH77//19fn1+ +/f5+fvz6/v3+/n39/n9+/H7/fn1/ff/8fv38fv7/fP7+/f1+ff/7/v39/v78/f5+//t+/35+f//+ +/n/9/f79/3x//vz9/////v99/3x9/P5+f3/+/35+ff3+/v/+/P9/ff59f/r9///7/fz8fP19/f59 +fvz9/37//n79/f58/H/+/nv//v39/X19+/3+/nz//v//ff7//35+fH/6/n3++39//f//fP3+/H58 +/Pv8fv38/n1pXF9a/tjfvLjJ9Vo8Oi8xRklg67qusbGssrm/QDguJzMsLTU4w7Ovr7yxqrbvQjw7 +NywtLkq9ua+4sqmttVVBPzkvKSw0Q1W+uLqzrK25/Uw+PC4pMDQ7T+K4rq+rqq+zzkJBKiovKzc1 +R7Ctra6yrKzEQzszNiwpKyxqu7Svu6+qrsJEQTw3LCotPOLOtbi3rK2uwERCNjktKDg/Rdi+t7iw +q623wFJCOykxNjA9Ps6vsbGvr622TT8wLTQoKys0vraxsLiqqLPpSEE9MiosLUzPurG6rqqutU09 +OjYvKC03SGHBs7GyrKqz121APjEnMzc3R1m9rrKvrrKvwj9DLi41KjAvQbe0sLK1q6y+UEE6OS4q +LC5sw7q1va+rsLpIPjw5MiouQmTLt7q1rqytxE1HOzoqLDo7RvfEs7OzrK+4vEU9NCcyLi43Osqw +sKystcPPX1JLRUVFRUdNUl1w9NvX0s7R09vi7u96cWttb214bnt8eH92dHp2d31zaW1qZnt2fuz3 +6dze4Ors6ff7dXV1cnZubG7+9fX+f3N1cG1lamVldH39/vP0+/L2/XX5enr8ePLp6eTp6+vu7+5+ +b29rc/vzffz9/e/0c3Vybvlzbft29uj+fXV8eHxtbXF1+ff++H7z7PR+dm10/nZ8+n338/L8+PR0 +f3VueHb97Pfr7fzt7vn+bWxybnB7+f/s7+7s+vh2cHhtfXR78Prt93X693v/bGZ4dH33/fHv+PT0 +9Hhz/nRzdHJ+8O/t7nvz93x9b3N2+f16fPjt8u33/n54eXBydHd8eO/68Xh593T+9Xz2eX387X7v +93z59m9+fW51/f/59PLrd3BtfPJ2/fF69O777ev29PR6eHVuemlt92z1+fvz/3Zv+nlpdW1seXNs +2Lu721VMSEU3NjZLubizt7mrsfBOOzU3KS0tOr26tre4qq3YZEA2OysvLjm5tbGxs6qs0Vk+MDor +LS8ywri5tLasrc5QQTE7Ly0wM8i4urKwrKzIWkgvOjIuNjXItbqysK2uzkhBLjkzLTU4zLu+s66t +rt5eRCs8MC85Pbu1ua+ur7JXSzonOC8tOD6+uLqtrK+ycnI7KTwwND1Mura2ra61uFNSNic1LjA8 +Sr22tqyttLhgVTknMzAvPlO8tLWrq7O4W0k5JTAxLz9bu7ezqau1vVtLNycxMzFD7ry5tKqtucFN +QzglMDg0T9u9vLCprbzWVkg2KDM4OVbKuLmuqa7FakU8LyQuNTdYx7m3q6etx19QPi8oMTg/7r21 +tKupr9dKRzotKC44P3i9uLSrqrDaSkg7LSkvO0beurizq6uv5EVGOzApLjtH4bu8tausr9xFSTsx +Ki46TN+6vrWrrq7UQEI6NCkrO1PVvMO0qq2u4khLPDAqLThdzri8s6msr/o+PzguKCo2Vc+5vrOo +q6/0SUc6LiotN/zHtry1qay1ZUVBOS0qLDV/ybe7uaqrtHxHRTouKiwz48K2ubqqq7V7Q0A5Lior +Mtm/tri8q6u1eUNDOi8rLDHWvri4v6yrtm5BQTszKysxzr+7usKsq7pmSEM+MS0uMsm8ubfBrau7 +WEI9PDIrLC/MvLq3v6upv2hMPD8uLS4xwbm4tr+trMdSRDg9LSwuL8a5ubS9q6rJeEw1Qi4uMi/H +t7mzva6qyFhOMT0vKzIt2rS6srmtqb5bVjA6NCozLm20urO1rqq7VVExNjgrLzBmuby3sa6rvVJb +LzQ4LDYy+rK5s6+urLxITC0uOiszNGG3u7Strqy9U20sLzktOjn2srazra+wwURLLCo3LDM7Ybe4 +s6yvsbxYay8sOi85P++1tbOrsLi/S08uJzUtMj1ft7Syqq23vFVSMyc1MDJCa7m2tKqsub5WSjgm +MjUyQ2++u7WqrrvFXU04KTE3NknevLm0qq26zFBANiYtNzVM1r26rqiruuhZQzEoLjU5V8a1tKyn +rMVVRTktJSw0OVvEu7esqa7JXFRAMSsxO0XqvLi0q6qw4UlGOi0oLTg/Zr25tKuprtVJSDsuKC03 +RuG5uLKpqq7XREQ6LygsOk3Vubuxqayv9kJEOi8pLDhS2Lm9taqtr98+QTkzKSs5Xc25wLaprK7w +Q0s8LyotN3fJtby3qaywbj4/OC4oKjJtyLe6uKmqsO9FRzouKiwz5cK1ubqpqrVkQ0M6LSorMOPD +trm8qqq2ZEdFOy4rLDHUv7e5vqurt2VERDwwKywx0L+4ub+rq7phR0M8LissMsq9uLjArKu7WEI/ +PTErKzHHvrq4vaqqvWBKPT4tLS0yv7q3tr2rrMVPQDc7LCstMb+6t7W5qazMbUY3Py0vMDW+ube1 +vK2t1VpDMj4uLjIzxre5tLmurM1oSi88MC00MMqzt7G2rqzNUUctOTAsMjDMs7ixsq2ryVlMLDgy +LDYyz7S6s7CvrcNKSi01Nyw2ONu6vbOurq7KWFYsNTguPDzNtLuyrbGx1EFHKS43LTo80ra7r6uw +sc5WTCoyNy8+R8S0ua6rtbjuRD4mLTMuO0rFtLatqbW72U5FKS02MD1WwrW3raq3welERCkrNzE9 +W8O0tqyossbrRj8qKTQyPGTAt7arqbLKc0M+Kyc5Nj/awbu1qqu051lHOysqNzlI0Lq4samrtWpJ +PTcqJTI6SMm8uq6pqrdVUUU4LCw+TUBTvq2ztLy1rslEPC4zLygtLFK1ubCzrae05e02OjosNi9S +s7izs7KruU1TLi41KS8tQLa2sa+uqrFtZDItOSsxMUW1tbOurqyzY1I1KzstLzZCvbu5rq6vtV1Y +Nio6LzI8TLq2t62tsrVZRzgnNjIvPk++u7arrLK5ZFc2KDUxM0JwuLOxqau5wEpBMSQuLzBBb7y5 +saiuvMNfWDcqNjc6UNC4t7GqrsbmTEEzJy40NknWubewqKu+6lZENSctNzlRyLi3rqmsvl9OPzYn +LDk7V8a8ua2qrcBNTj81KSw3QF/Auretq62/SEU8NSkpOEXtvr+5q6ytxUVMPjQrLTdM5rq6uKqs +rs8/QTkwKCo0TeC7vbipq67QRko8MSstNF3Ot7m4qauw30JEOS8pKzBbzbi5u6qrseJDRjswKiwx +fMW3t72rqrDTQUU7NCsrLmHEu7fCrqqwz0VIPjQrLC1Wv7y2wq+qsM9CQTs3LCstZb29tsGuqLLc +S0E+MystLWi5urS+sKm07EY9OzQrLSxOur20vLKptedXPTw5LTMvS7m8tru3rLXxVzw3Oy0yMD29 +ure3t6yx5WE8MjwtMTI7u7W2s7Str+dTPS48Li4xNb+2uLGwrK3YW0EsOi4tNTbCtrqwr7Cu2EpG +Kzk0Ljk8yry+sa6vr91bSCs4NjA9QsO2ua+tsrT3Qz4nLzUsOkPJt7mtqrK13VNDKTE2MT9Xv7W3 +rKq3vm1CPSYsNC89VMK1tquptsXiS0MqKzYzPmO/tbesqbPNe0U/Kyg0NT1qwLa2q6mwzGNKPy0o +MTc+d8C5t6yqsNBQRT0yJy89P9vAvrSrq6/eSks8LyowPUvTurqxqqyx70A+Ny4oLTtN0729sayt +tOtMQzUuOk9W3NfMzM7Q2Nnd3+r3eGtgW1pYWFxcYWdre/fz8ujm4ubo5O3p8nz5/vzx9uzs7vJ+ +9Htxc2txbGtvdHlyfn99/vz+e356fnl5fHv7+fv5+Pjz+vj9/vn9/Pj7/P77+v77/v1+fvp+e/t+ +fHx7fvh6cnJ28X76+Pf+8vz3fv14/Hx4/nt7c/78/3z8e3///f/9/vt3d/f9ef1++Pn5+PXz+/p8 +/Xz093z3/f39e354ef59enx//Xt8fv3+fn18dPf4/fl+fvf3+/t8/357fXp+fPX3//x7+f/7f319 +//16fPz+/Pf9/Hx+9376+H75+31+enx5eXx9/3z5/X17/vx/+nl//3b/en39fvf39fX18vz9+v38 +fXh3e///+319/fn8+f15/Xl1b3B3dH78/fX07Pb78fv5fXl3cnd6/Hv++vj1+vv4935+/XBtb2Vd +U9G2vutkR0hDNTk3Tbq0sbi9r7HCTDk4Ni8qLDBL4byxtK6qq7HpRD46MSktOEBZyravsq6rsr/Q +OzkuJDAvMDxDvq6wrqytrLlMRS8xNCkvLT64ta+zuaust2Q9PDczKiotUsy8tb2tqq20V0Q+Oi8q +LjtLeL21tbKsrLnvTzk5LCc1NTlM47avsq2tsrDcSEMrMzItNzNlsbOvtressNZHPDY4LCssL+W+ +s7G5raquvUY/OzgtKSw5V9e2srKtqqy5VUI3NyslMjg9bce0srCqq7S4Xj07Ji0yLTk45K+vr6+u +rK/fPzkwNiwqKy/Mu7ayu6ypr85JRz42KywtQt/Bs7qyq66w6Tw8NjQpKjc+Tsy4r7GsqK7D1UU/ +MyYvMjI+SMKusK+usq+8RUYvLTYqLy85urGvr7isq7htQDw4MCorLUjMu7O3r6yvuGw+ODE1NzxF +VXzczsjFw8PFyMzR2vdmW1RRT09TV1tfZGtwf/X48/Tz9Pb68vDt7Ojm5OPh5Onv+3huamRlZmRo +bWx1fnt+eX7+/vr8e3z+//r18fHv7O3s7eru7/X3+Pz39vz79X17eXZ8cnBxcnFtcnF2dXB2c3t3 +dX10e3d6/Pry/Pf4+fb59vr09/Ty+Pj39vb2/f/7//z9eXl9ff///fv6e/3y/vz9e3l9fHp+fHt7 +fvx8e/V4/vx5e3p9eHt6d3t6+////Pj8/Pz7/Pn3fn57e/j+9fp/+fn9fv58/f7++vz9+vr//nx9 +/P7+fHt/fPj+/Pp8fX17eXZ4dnj9f3n5fvr7+fX5//v6fn55fnz//v/5fvf5f/5//nh9enZ9/f35 ++vz7/fp+fv7+f3h8enx+fvv3+fL2+fj8fXl7e3Z8+Hl8+376fHx6e/v2+OffWT9IZNzPurO20UZI +PjctLz5a3Lu2tKqqrtFFRTkuKCoyRHC8urepqq3LREY6LygqMUvluLS0p6irw0FGOi8oKi9K8by4 +u6qrrcJARTs1KikvTta8ur+sqq7DRUo/NiwsL0/Lura/rqquv0FBOzcsKSxNx763xK+orsZIST40 +KywtS7+6s7+yqa/KREE8NSsqK0a+vbS+tKivy1JGQDgtLi1Dvbu1vLmrr85OQDw4LC0tOcC6tLe6 +q6zFW0Q7Oy0sLTPDuLW1vKyrv1hDOTwvKy0uy7i5tLqsqr5fSTY9LywvLs+2uLO5rqu6VEY1OTUr +Li19uLy0tKypul9XMTc1KzQvcLO4s7Svq71QTC4yNisyL1i2urOvrqu7X1wuMDcsNjRms7WwrrCu +vFBWLSw1KzM1T7W0sq2vr7lYWzErNi4yOlK6tLKtrrG6Z0o2Ky8xQ2zhyMjDxsrM0dfd5PZvYVpX +VlRUV1tgaG189Ovp5+Tk4eLm6u3z8/j59vTt6+vv7/X+cWllYmFkZmttdv59ffb3/v15+37+9/n5 +8/Tz8vHv9PTu+Pf8+3x7/n31+v76fXt8dnt8eX12eHl2d3l4f/7/fv/8e33+fH1//n19/Pv9+Pj/ +fv79f/v7/vb8/fh8/vr8+/769/x9/P57/Px6fn38fnn7fn59+vx/e/3+//19fP9//3p9f3z+fHt1 +fn58eXz3+ff9+n789/r9en9+fv36fHL8/fn7/Ph9/P79/n3+/v79fvx++3j9+n79+/v9/Hj+fnh8 +fHt4/X19+37+/fr3+n/8+3p+fnt8d373/X74+/57e3v///9+fvv1+/X2+vn4/n79+P9+/Xp4fn5+ +fXh+/nv+fHt8f/r9f/n9+/58/3n//Xn//fr3+vj47+TdTjtP7eG8r7zW71E7LC44Qt6+vq+orLtS +T0ExKyorW7y+t72tqsTjSS49Li42QL6+tKmtvMZbRywpMzVJ0Mi6rKyx3FRSOy8sLkjCv7i9sKq4 +41E5OjQsMTnmy7+srbfB+UkvLDIzQdq+uKyprMBQTjwvKCk9zsa8wbCotM9pOjwzLjMzzLm9rayw +uGdNLicvLDRU1MKxqq2/cnpHMy4uPtK+tr2zqK/LXz88MysuLFq6wrSvrq/SYzsoMi4vROnAuaup +tNdtUDcrKzVPz7vCtKmsvVlOQzUsLCxUusO2sKysxFpEKjQvLD1UyMGtqa/L9Fw8LCs2Rty+xLWp +rbhZT0c1LCssT7zCuLisqsTtSC05Li04TMHAsKivwddTOyorMTdYxcCyqKq1a15LNiwrLGO9vbe7 +q6rC50gvOywtMDq/v7eqrbXEV0cqKjEwRNnHuauqr9VaXT4wKy5Pxb+6vq2pufFNOjwuLC40xcS+ +rK2uulFOKyk2LT5+zb2sqa3JXGg+MCwvSsy8usCtqbfpTEA8LiwsMMnDxLGvrLd7cy8sNiw4Usm8 +s6erve1xRzArLTlYyrvCr6mwy09LPi8rLC7Pu760saqu13Y6LDgrLzxrv7yrqLTM8E82KS02Q9fB +xa+rrrpMUkY4LSsv2sDDubaqrMx8Qi48LC42Tr7Er6iwu95JPiYqNDZlysuvqau3WG5MNi0tL9m7 +ure7qavIYT8yOissLjvBxrepr7TFY0opLTIxSs2/t6mpsOlXUTktKy1KyLy4wK2ot+RPPDwuKy4v +y77Arq2ts2tdMSg1LTVT0sCyqKu8ZXJHMiosPue/ucKvqK7ISEg9NCsqLHbAyLOtqq3YdzgpNyww +RNy+uaqostZrTDUqKjVG2sDKsqmtvldXRTUtLS7lub60tq2rzulALDosLTdLwcCvqLLK3VQ7Kisy +PHS/wLGoq7VfVUo4LSssUbu9trutqbztTzA5LysxOMrEvKutt8BXTi4oNTZE0869q6uuzlhlPzEt +LkXAvbe+sKiz4Es6OTEpLDHxycWtrLC5dFkvKzQvPebBuqynrMVXWT8vKiw/1MS9x7CptttYPz8x +LjAyyby/r6+utndrMSo1LTVM0b+2qau+8m1JMissOWDGusGwqK3DT01BNCssLXm9w7ayq67UfT0r +Ny0vPmnAvq2psct2TT0rKTdF6MDNtqqtuFxaTTouLS1Pub+3uK2qvV9KLTUxKjQ70cm6qa2+y3hH +LiszOVPGwrmpq7DmUE47LiorPr+/t7yvp7ncZDA5MisyNMy9vausur5vTy8oMTA788a+rqmsxF1o +QzErLDvJv7e/taivz1k/PDcrLS5ev8uxrK+04141KDMuNV3Mv7KoqrlbW0g2Kio92cW8yLKnr81Y +Rj8yLC4t07rBsK6ssPlfNSc1Ky9G5MK7qaq56/tONSwtOV/IucCxp63DU01BMystLGm6wbW1rKzQ +7UEpNy0tO1a9va6mr8vfUzwqKDI9br/DtqirtGNVTTktLCxIur+3uq6pvGhRMTcyKzM82868qq27 +ympMLys0OU3Iv7mqqq3MSk08MCorPcfFu76xqLXcYzY4NCwzNNO+vqystbxlUDEnMTA59szBrqqt +xV59RjMtLTrJvra9t6iw1287OjcqMCxLu8e1rbCx0WhAKDEvL0jav7mrqbLbZFY8LSoxVs28v76q +q7xsTUE5LS0sPrzEua+trL5STSouNSw+WM7CrqmvzXViPi8tNUvVvLy4q6y37EtDOC8tLj3Wx722 +srTG1145Mjg5RPrVwbOvt+FQTDsvLS5Hx7y3u6+otNNmOjwzLTEx1by+r66zuO5hMSgxLjVWzcCy +qay8Yl1INSssOtnCucG2qK7KYUU+NywvLV68ybOvr67cWT4nMjIwT/nMuqurtnVwTjcsLTnowLa+ +taeswE9GPjUqKitOvsq2r62tzu49KjYuMUbkv7urqbbiZE44Kys0S9S9xLaorcFjT0U3LS8tW7jB +tbOtrM1+Qik1Li07VMC+rqexzuVWOioqM0HpvMO1qKu3WFJJOS0sLFG6xLe2q6rE+0orNy4rOUjE +xLCor8PiTkArJzY9bMPQtairtlxkUDkuLi78uL61t6uqyWlDKzksKzVCx8iwqLPF1VU7KS00Peu/ +wq6nrLtWYEczLCsu0by7t7uorNPdOy46Ki4xTbzCr6i0vdhTOyctMzZlyMSvqau4W2hLNy0sMNq+ +urm6qavGakE1Oy0tLkTMz7SqsLbRXD0oLzI2XMm/r6iqs19RRzcrKDHkxb29u6isxe5DOTotMC9M +u8S0rLG00VU+KC8xMUvgybisrLj+cE83Li006sG5urupq8LuQjo5Ky0sPbvAtq2vrsNmRCgtLy0/ +6cC5qqev0WJVOiwoL1DNu727qaq6fEtAOSwtLD28xLmurq2+V0wqLTUtPlnRwa6qr85nZD0vLDNP +zru8uqqqtnZIQTctKis7w8a6sa6svulNLTMxLj1exL2uqbHOcFI7LSsyQu+/wbmqrLr9VEg5Li4u +Rby+t7SwrL53UCwzMiw4Rsq/tKitw91gQC0pLzxawr+7qqqw3k9OOzArKz2+v7m1ram581ItMjAq +NUDLwbWorbzUUkItJjA7WcfOuqqrsedcVjsvLi9Nu7y2t66rvX1ILy8tNFNQ29rTz9fa4+jw8ft4 +bm1wcHb36+Pj3t7f4enp7/Pu8/by+f53bGdjYWBiZmpuc3V1fnhyeHT+fP338+/w7O7u6urt7+76 +9Pr4fv36/P59eXh5eHh4d3l3c3l3dXx6dnh6+Pn//H//fvf7fvnyfnx+fPr/+vfv+fj4//r+en5/ +fHt1eP18fP36f3/3/vv6/fz9/n19f317fHx++f9//P7+9vz+fX/8ent4ePx9/P1+fn59e/55e/V+ +/fn3fHt7///+/Pr2+fP7/X53fHz+/f78/Pr+/fh+/vd/+v38/nx7eHl5/359e3p+fn5//f74+vv8 +e3P983f//v/9+f729v79/v59fXt5dnZ7fHv3+n399Pr6+PZ+fXt6fXz7fPz8+vf3+Pz7+vx6enp5 +dXd8ffr+9vn6+f78fX51cnN6fXb7+Pz4f//68+/29Pfr33ZEPkzeyci4trzBTkg1KTUzNEfjtK+u +p6mvt1BBMCEtLSw9XLy4rqWos79PRi0jLi4ySs6ysqukqrrMR0AsIy8vNE7Oubmsp67G41FELik0 +Nj1sv7a2q6iw21JFOywmLzU8a762s6qnr9lRSTosJy84Qtu5tLCpqK/0SEI5LSYuO0TXurmxqaqw +c0dGOSwnLjtJ0rm8r6mssGJBPzgvJiw/V8e5v66oq69RRUE3LCgtPW/Cs7usp6uwTD07MyslKjpq +wrW+rKaqtEtJPzUrKSw91b2yvK2mq7dIPzswKCYoOdW8sLmupam4TEQ9MikoKTnIvLC6sqaqukxE +PTYrKSo2yb2yubeoqrtVRj84LCorN8W+tru6qqy9U0I9OjArKzjDv7i7uamswFlHPjosLSw5vbu2 +ubiqrslLPzk4LSwtO8W+uLe0rLHKYkI3NThIT3Pq3NLV1tnZ2tve4+/4dGZfXV1cXl9la3F5+PLu +6ujq7Orv7/x+f333+fLu7O3q7/R+cW5qaWpqbnF4enz79/v9/3r/e3n/e3n+fnj69P719Pv3/PH2 +/vrz+Xv4/Pn+evr8e312fH55/Pl7/Ht7fHt6e33+fn31/Hx+/358+/z9/f79/v7//n59/np9/v5+ +fv59/vr6/v38/P7+/nx+ffz3f3d7+vP6+3v7fv7/ev97en14/33+/n1//P7+fn79+X78fP1/fnt9 ++3t+fP/9e/z9/375+/74+/t8+3//fn5+/f7//Hr7/fv6/f///P17fXp7eXl/env8/H79/X5+fX16 +evb+/P18+P35+H39/Pt+e3z+e/99fPr38vn9/Xt7eXRzdnp8/Xz++fr3/H7/+Pv5/fv6+Pp+/Pz/ +/P57fP95fHh8fnp+e312dnVoXlfovrrBX0xOPzUwM1G8ubS4sKm69FcvNjAsMzjNwLurrr7IYEsu +KjM0RM/Buauprs5bXz4vLCw+wr+3v7OotuxTODo0Ki4w48HGrqyyuHNcMSg0MDvuxr2tqau8U1xE +NSoqPsvEusSzp7HTXD49MywvLti8xq+tr7VeVDImMy0zUdbCs6irvnj0SzUtLjzZwbjAtKivy1ZD +PjQsLi1au8O0sK+vzv8+KjQuL0Pvv7usqbXbaU85LCozTNW7v7iprLpgTUU3LS0sRbvBuLSuq75i +TywyNSw7Ss/Esaqux/ZiQC8rM0J3v7+8qquw20lMOzIsKznFx764sKq142oyMDcsNj/Uv7qqq7zP +Z0YxKC84R8/IwKyrr9BTWz4xLS07vry3uLOps+FwMjE2KjI1fr++rau6xehNMykvND/hxL2uq67B +XldBNy8vPNrAura2vs3ZZVhPTExLTE1OUVddZnrv6eTk5efm4+Pj39ze3uHp7Pn/+Xp3+ff5fn52 +bW1nZGlnaW9tdX55fv5//Xz+fXp7f3v49/n28u728vD19f/28nr7fH76e318e/p+ef99fn57fH59 +e3h/9Pf2+Xp7e3z/ff18/v5+fnx6+H79/X19fXt8/nt8fvn+c3j8/Pr+ee/19/148P128P34/vz9 +/v16/n96fXz+e/79e//+/3x8fH19fXV9fv39ffr++/r5+f96+3t+f3t8/37/e/z7/fp/+X74fn75 +//n+/X76fv75ffb+/Pt9/n19eH5+fHt9/nz9/Xx6fX19ff/+/P36fv3+fvt8fPv69/z9+fn7/f71 +9Hx8e3d3ef13eXn/fHh9fP/7/Pn9/vj7+/78f3/6fv35+vf+/n3+fHx8f3x9/f76fvx+/P16e/58 ++vfs4fNQQ0FS28u2rrfbWE44LSstWsXGta6rs9D1MC43Mk7TzbKqr8dPTzwuLCszwMK4qa+zxOY9 +KjE1Rs7Nya2sv3hKPzotLzBcvcCpqLq/0U4vKzJG5MjYvqu23185OzgsOEfOw62ntc7WWTQsLD/M +y8G+rq3Ld0AtPS80VXfEr6u03nheNy4tMsrBwrWvq7ruYSwvNi9R89Owq7HXVls6Li4sRrvIsaqu +s83vNSozNEnP2r+qr8ddRj4yLDA0zL65pq2+wuZBLCw2S9HH2LSrvuhPNT4vLjlWwb2pqLjP2FEz +KixK1M7Iw6yv3eQ4Lj0sOl3NvKyost9hUzcsKDTN0ce3rqzB5k4rNzM19da+rKuz61ZRNS0sLW/A +zK6tr7ncWCwtNTj2zNCwqbTZTkQ5Li0uP73Eraa1vcdlNCswPXvIz8arsdz9Ojc6LDQ+zsCypa/G +zf06LSs26c7FybWswO5PLzs0MEr9yLaprsTtez0uKy1twsm6s6yz4mcyLDowSPbttq2vw1drQjIv +Ljm+v7utra7A8EUqLzQ6+WzTrq6+ek9DOC8zMnq5vqqotbzYTy8rMjxrz9+7q7jYXTg8Mi82Sb69 +rKa0x89OMSssPe/Lycmur9PgPTM+LjdKz7+xqLDJ3Gs5LSs12c7GwrWsv+tXLTY1L03lxbOqrcNb +aD4uKytRwdC4r6yy2/AzLDkwR9nWtquuvVRbQjAtLDTFxr6rrrHC3UQrMjU/29XOrq26eU1FOS4v +Lk28xaypt73NVTEsMj9+yNbCrLPWbjw5Ny42Pcm+s6auxM38Oy0sOHDUys+0rMXpTjE/MTBF+MK4 +qKy/4OpAListWsrNwbmstOd2NS4+LkF32rqsrLpueUwyLiw6wMm+sq6txX5HKjQ0Nvd+yK6tuG9e +TzYvLy/dvcesrLC64lotLTY5bdfetKy33FBGPC8vMEK9xK6ntL3KaDcsLzlZzM7Lrq7L+UM5PC4z +OuLCuqisvs7cRi8sNFnWyc+9rLnheTU5OS09WMi9q6m23XlOMysqRM3Ww7ytrtHiPC09Lzx8zryt +qrTiXU82Lisx0M7JtrGtwOBWLTY2NnjWx66rs9pTVjouLSxLvs6zrbG4zfgzLjc4W8vXuquyzlVG +PTEuLzXHv7inr7zE8D0sLzlRz83QsK3C9Uk8Pi8xOW/Evqmrvc3ZSDAsMVPTyc2+rLbmZTg3PC49 +UtnErau55eJYNS8tQ8PLv7yvrcxwRS08MjVdbcmxrbjrc1k3MC4zy8DEtK+su+hgLTE4Mlvq1LCs +t+NUUzouLy1Husexq7C1zu41LDY2TdPhv6yxy1dJPzQuMTbMwLuorrnA6EYtLjlK1dLasq3C8Es7 +PS4wOHHCvamqu8rnSi8pM1neztS6q7rnbzI6OC1BZMK7qam55/dLMiorSM/Zxr6tst/bOi8+Lj7w +ybusqrnwb040LSsyyc7HtK+tx9tJKzYyN+3Owayqte1XTzUsLStWu8murbC31PgvLDU2XczZt6qy +zk9KPzEtLjbFxrelrrnC6D4qLjdOzMzRrqu/cUU6PC0uOWHLvairvs/YRC8sMmbLwsi6qrXsXzQ2 +OSw8T9jCrKu9499MMi4tScDHvbutrdfePCw8Ljdf4sKuq7j2cE8zLiwvyL7AsrCsu9xjLDE1MVbY +zLCqstVSUzotLSs9vMa0qq6wyOc5KTM1RtDdvqutv1xKPzIsLjHVv7umqre/6kosKjlK39P4tKu+ +7E04Pi8vOV++vainuM3gTDEpL07fysrN0Xi8s8plSDw+LzA5ZcK5pqi6w85BLSovUNnKzrmquutX +LjUxKzxcwLmop7rN2kcvLCtDxMm8u66u1ts8LDsuOFzUv66qt997UTUtKy7YxMazr6y632stLzkz +W9zSsaywz1JdPC8uLT+8yrOprrHUbTonMjlI1HXHrK/FXUpBOC4zN8++uaaru8TtRSwrNkjfz+G4 +q7/nVjU+Mi88Y7+8qam7z9tKLywtSNHLxcOtsd/aNjA8LDtdyLyrqLjY7E8yLCo0yMzAu7GsxttO +KzkzNGfYwa+rstlcXDovLC1Zv8+0rq622/MxLTgzUdHatauwx0xUPzMtLTvLzbapsLjI9TwsMjpU +y8/Gra7DYEU+OS0uNvrJuqeuwsbfPi4uOnDLw82zq8PtTDE+Ly8+a8S7qK3H0OI/Li0udcnIv7ys +uO7pLzM6LUN7yLurrL/x8kcxLSs7wMy+t6+uzOJGKzs0O+Lnv62uuGdaTjUuLS/avsetrK+69Fws +LDo5b+N6tKy221BLPjEvMUi9xK6ns7vRXzcqMT9a1ezRrrPX8z48PC85QsnBs6evx9FyPC0sOXfb +yNO3rMnbTi8+MTJK27+1qK7H3W08LiwtZMfKvruttt/hMjE7L0Xoy7mrrb1oaUgyLSs3w8y/sa+v +x95EKzc0O9/axa2tt3dNTjkvLS9bxsytq7O6110vLTY89cnbuKqz1k1EPjMtMT/NyrGntcTKYzgt +MEHkyMnIra7R8z01PS01Q9vJtqizzdNzOi4tNdHJwsO3q8LqWy06NS5I68W3qa7G6f0+LiwsT8DM +u7atsdzhNi09METi2bqsrr5aZkYxLiw0w8a+ra+uwflNKS85PN761a+uu3VPSToxMjVkvr+sq7W9 +4k4yLj5MXt7c1drg5/j3/PTy9310aWZkZ3T97OLi4eXn7fl9ev7++f58fHdzbmpqbG14dnr///j8 +ef37fHv6/fz67/j27/Tw7u73+v99d3h6eft5ev98/vt7fHt5end4dXd9ffz/e3t//Pz7/Pn6/P/8 +fvv6fv59e/f9/v/9/f38fn1++H77/n37+fl9/n5++3x+ff3+fn1+ev78fvz9/vp8/Xt8f37+e37+ +/H18fnx8ffz8ef75+vj9+/36fn59/n55/nr+//v4fvz++/f7+3t5fnl+ffz6/vz6/n73fX58/f9+ +e3z+d3x5+P1/+Pz6/ft7fHd+fXz7/f/9/f//fv17fH94fXt7/vfx+Pj7/Px9fH97/v59/n78+/38 +/Xp++3h6enx6+Pj5+/33+v79+/z8+///e3j+fHh5en94en57+////X75/Pv9e319eHBnWvy8v/T2 +RUlANjw/ybu8ra21vFlKLyc0MTzs3sGura/UUl8/Mi4vTL+9uMCvqbfrTDs+MSwuM9HKwa6vsr15 +Wy0uNzFF3sO8raqw0lZXPC8rL07Owb7Frau+31E+Py8vMDm9v7yvsrC9ZFgsLTQtO1vHvq+or8xx +Yz4uKy9I2b28v6uqtuZPST4vLS03v8W+sq+svWRbLC82LDtPysKzqq/Fa1tDMSoySvvCx8GsrLbn +VU8+MS8uPr3AurWvq7tmUS0vMyo3RM/GtamuxtxrQS8sNEBvwMG7qqy2+lVOOy8uLUC9wbm6squ9 +7WAvNjUtNz/Ow7qrrb/OZ0gwKjE5SM7Fvqyrr8tXXT4xLC07v764urOps95bNjU2KjA6fcu/ray5 +w2xMMCozNkTPxburqq3KTVE9MysrQMbFu72wqrfXWTo5My40O9rCu6+wuMlUQzw6PD5GT15439XP +zMvKy8zO1trn7/ltaGFpYl9dW1tdW11iaW9xfvn6/Pv9+PXy7ufi4+Hh4eXp7vv8d3VzdG5sdHN4 +dHJ0dHZvbXJxb3Nzdnb++/rx8+/3fu/u8fD38PT2+vb8+X77/nz4fv58fn7+dnN8e3d3eHV8/nl9 +d33w+fr3fXx8f3h7fXp+/H77f337/f75+/z8+vr6f/n7fv78evx8fft8fvz9fvz7/n3+/Hz9/n36 +fn5/d338fv7+eX35f31+eH769vp/fn/6fP38/fb7dXZ7/Hj8+nV4/vv5+f33+/j7f/v7/fv/fX7+ +eXv+/f77+/3//P99fXl/enp5d3x8/P7++/n4/fv8+fh8fXp4e33/+336+fj19/t9e3l7eHt6//j7 ++fXy+Pf2enp5eW90fHh8fP/9/fP3+/h9/nh3fHh+f/z7c2VfzLrUXmlYRzY0PHjJurq9ra205jw9 +Ni0oKy9Wybe1u6qorspHSz0zKywuTcm5tL2tqK7JREY7MCkqK0jHvLS/r6mvx0VGPTUrKy1WwL21 +w6+psMxKSj82LC0tU769tsOzqrLPRkI9OCwrLFW9v7bDsKiy3UxBPjUrLi1mt7uzv7Gpt29JOzw0 +Ky4sY7m8tL2wqbh9Vzo9NiwzLm+2u7S8s6u8XlU2OjcsMy5Ptrq0ubWquF9fNTY6KzMuR7O3s7W0 +q7JkUzgwPCsvLz24uLWysKuw+lw6LTwsLzI7u7a3sa+tr/5LPCw8Ly41Pb+6uq+trq/uYD0qOy8w +OkC8tbiurbCzXEk4JzUuLThDvra2rKywtHpeOyk3MTA9T7qztKystrpZTDcmMi8vPE68s7Sqq7i8 +Y0w3JzAxMkNvu7Syq6y5xGJHOSsvNTdI7r60sbjCyuJ4XFVQTk5OT1FUV11neO3i3dra2tve3uHm +6vPzfXl2bnFyd3Vsb/z6c21oZGNiaGtxevnv7u3s7u3u9fX6+vv79Pf69fL19PT0+f59enV1em93 +dnN8dnp6e3p9entxdfr1fn57enx4fXx+ev/9fvb8+PX7/f33+/t8fv7/+Pt+fn14/X59fPr8e3n/ ++n19e33+/v9+/X59f/5+enn+ff3+//r+/3l+/P9+fX1+fnn/fX57en15eP36+/f++33+/356e/t8 +/vz9fHv+/339+P39/3h7+vv8+/x//359/Ht8/n77d3j8ePz+fv5+e/58//37+3/+d339fnt/fHx7 +dXZ8/3/7/f349vn4/Hh8e3x8eHh9fP7++/z8/fv8+f3+enn+ffn+/fj69ff8/Xx7eHVxcnp2d/5/ +/Pv1+PX6+fh5enpxcnh5eH57+fLt39ToSDxFX2/MxMjAubi/XEI7OTMrN0BDbcu0rbCurLG0yzo7 +Kyw0KzAxSLa0sbOzq67PTD41OiwsLjPJubOzvK6sss5BQTs1LCsvRPbFtLiyrKyx3UVAOzQqLTg9 +TNa8srWvrLK/ykE+MSYzMTA8P72tr66urau8S0MuMjAoLitKtrWvt7eqrrlUPTw3LygpMujJt7m6 +q6yuvkVDPDktKzNATtW6trevq6/B7UY5NycsNjE+TsSvsa6qra26RkosKjQpMC89tLGvsLarq8dM +PjY4KykrLeO+s7G6rKmuw0RCPDgrKi0+Zs2ztrOtq67JR0E5OCkqOjlF8MKytLGqrre7R0I0JTMv +Ljk5wa+yr7Ctq7dOPzMzNCkrKkW6u7C6tKiruVNIQTouKis0/861ubmqra7CPj44NiooMz9Ozriy +s62orcPbRz41JjE1M0FLwq+0sa6zr78/SS0tNyoyMD22s7Cxuqusv1VFOz0vKywtecG3s72uq6+7 +Qz87OS4oLj1Y27i2tq6rrb5RRzs6Kyo5OUFmybW1ta2ut7hNPTkoNTQuODjOs7aysa2qtlpMNjc2 +KS8sQrq7sru7qq67TT49OC8pKzN+zrW2t6mqrL1FRTw5Kyo0PkrevLO0sauuxtVKPDomLTYwPT/l +r6+wra+usU9KNSo5Ki0wML+vsK65ramz6kA8OTUpKipAyb6yvbKprbFjPz85MiksN01vvLW3says +tOhPPDkxJTI8O1jYubW3rauzs9U+RCktNiw4NU+wsK+xs6yu00I5LzYqKCst1Lmzr7msp67JTUg/ +OCwsLj/rxrS6tKyuseU/Pjk0KSw2PkzTurGyrqqvv81EPjMmLzEwPUTArq+ura6tukhBLy81KS0t +PLm3sbW2qqy7VkU9Oy4qKy/vxre3vaysr71BPzo5LigvRVnKt7q0rKutyU9HPDcoLjo4SXi/sLSx +rLK3vz0/LSc2LDA1O7mwsa+0rKu/XUs0PS8rLy1euriwvLarr8FIPzw4LSotNV7Yt7W2rKqsu05F +PTksKDE7Qvm+srOvqay6wko5NyMsMy06Q8uwsq+rrau2SkovLjcpMC49traxtbqrrblPPTs5MCkq +Le7Euba+q6mtvUVIPTosKi8/WNG2t7Wtq67KTUE4NycrNzRDXsSwsa+qsLW7Q00vKDctMTk5vq6x +r7Wvq7tORTM2MygtKz+8ua+3t6mstl5APzovKSsvVNy5tLmtq620Vz86NzEnLT5AeMK4t7KqrLfI +YD4+KSw5MDxD27Gys66ur7NQPjQrOCssLjG/trOwuquptv1LPz4xKy0tWMa7tcGxq7G7RUA+Oi4q +LjtW6bq2tq+qrL5XSz48LCo3OD9cy7Sxs6yuuLhQPzkmMC8sNzbRrrCusK6qtGNHNjQ0KS0rPb66 +sri7q621/D8/OzYrKjBc0bu4va2srrZOQz47LyoxPkn5v7e2tKytu81aOj0qKTgwOUT3tLCyra6u +sV1KNyo3LC4zNMKys7C8sKu4Z0U7OzQqLSxBxbyxurWqrbVlREI8MystNVB+vra5s62ttW9IPTs0 +KDA8PE/evLK2r6uzuMw+QSsqNi01OUm1sLGwsK2ux0U+MjkwKy0t7Lq6sr2wqa/CS0g/Oi0sLTzd +yLW9uKyvscw+Pzk3Kys1Q1PNubS1rauvx3BIPjIoMDQ4RE3Fr6+wrrOzvURELys2KzAyOryysLC3 +rau7YUk6PDArLi1Pw7evubKrr7dVPDs2LygrNUt4vLS0rquste5KPDMtMTtFX2HRvq+329dOVlg5 +QDpOuLe1vMqztMpDNzc1LigrLk7ZvLC3rqmssPBFQj42Ky89SWXDtrG0rqy0yOc6Ny4lLzIxPk/A +s7Swra6uvkpGLzE1LDMySLmzsLS4rK25Wj46NzEqKS1Xxrq1va6qrbhNQz46LiouOlDnurW2r6us +u1lGODksJzU2O1bYtK6wq6u0s+9EQScuMiw4NVyvsK+ytKyv40c7MzorKywv0bqzsbytqq/FQkE8 +NyspLDx3yrO4squsrcdBPjc3Kyg4PkjTvbW3rqquu8ZGQDYmMTMxPkHEr7Kxrq6ut0o+MS42Kiws +N764sbK4q6q060tDPTEqLC1Ozru1va6rrrdKPjw3LikuOkt+vLSzr6qquvtVPz0rKTY1O07etbCz +ra61s10/PCcyMCs3MPOvsq60saqv2Ek9NzgqKys0yr60t7ysrbHLPz86OSwqL0vuwba8sKytr+hF +Qzs1Ki87PlLPurO2r6u0vM86PS0nMy4xOkW5rrCurayrxUtELTYvKjAtXbe4sLu4q6/HS0I+Oy4s +LTTxzLe2uqysr8BERD07LiswPk3mu7S1squsu+JVOTwrJzYzOEh7ta6xrKyvr+I/PSgvLyo0L2Sy +ta+2s6uvyUU+OTovKyszy7+3t76sq6/GREY9OS0rL0Fpy7W5ta2tr8tEPzg3Kis4PEnfv7S0sKuv +usBIRTYoNDIxPT7Jr7OwsrKuu0xHMjE2KS8uOr64srS7rKu4a0VCPjUrLS5N0b2yu7GrrrFuPTw4 +NikrOEVTx7e0tK2qsMnuPjwyJTE2NERVva+zr6yvr70+Py4tOSsvLzy5trKys6qrvFFEOTwuKy0t +dMC5s76wq6+9RD46OC8qLjpe1Li2tK2srr5VQjg2Nzo/SFdr49fOzMrJyszP1uHzZ1xXU1JSU1da +X2NodHj78Pf09Pn07+/r6+ni4d/d3eHl7fb+cW9raWdqaWpubm5vd3hzdHJyc3V0dX779/j48u/0 +8/H08fLz9vr68+/5fv55enl2eHp+e316eHZ6e3t5d3t4eXd7enr/en97ffz7/vn4cfz9ffj39fn8 +/Pt9+fV8+vr//3l+fXx7fHl9fXz8/vv9//59fX59fvv+fn56/f5+fP59fHx4eHl/f/t8/fx7e3t+ +e//+eXj7/X1+fv/++/1+/f78/vz8e//6+X58/vn9/f79fn36+nx8fHt6/nn//Xv7/n5+/X53eHdy +eXR3eXX7/fj4/Pb6/Pt9/3l5fnZ++vD3/fj893/1em18/3n8/nT+/P/5/ff3+/56eXV2b253c3j9 +9Pf67/P3+Pv8fnl3c25zeH378unf0dhJPUpOT23Pvby+t7jMz0k5OiguODI/QOqtrKytr6uu3ko5 +LjcqKiwuzri0sL2wrLPPPj04NSspLD7ZwLG4sKmsrspDPzk1Kis0QFHMuLO0rauvv9ZEODMlLDcz +P0/ItLWxrK6uuE1ILyw2KzAyPLqxsLK4ray+Tz43OC4pKyxev7ixvK6orbxTSUE8LisuPF/Yt7e3 +r62vwklCOjgsKTU6P13NtrGzra24uvdAPSktMy04OGqvr66urqyv3EM4LzYqKiovx7iysbirqrDY +Q0E6MyorLUnXvbS9r6uusWQ+PDg0KSw9SG++uLizq6u22WE+Py0pOTQ7Sv21sLWvr7OyZj08KDQv +KzQv57G0rrawqbDbUD47OSsuLTzHvbO6u6yut2k+Pzs0KiwyTHK/tLawrKyy6kU/OTIpLjk9UtG7 +srOvrbO800E7LiozOkdh5M/JxsbHyMrN0tjpeGNaVFJTUVZdZWp0/vf39fb4/fz7+/f18evp5+Ph +3uDi6evxeW9raWhoam1uc3l4e3h5cXR2b210cnF1dHL//P349/X39vT99ff99vz3+Pj3+/78+/z6 +/353/X14f356ev95/3p++nl5enZ7+n36+338fnr9//3+/n19+vt8/vp8ff56e31/fnl1e/z9/H99 +/X77/X36fHz7/f79/P74enb+ffx+eX3+fX77fH18//x+f35+fHx9dX30ff57e/58e359evt+f316 +9/76/f38+/v9f/z5+f78fHp9fX58ef37fn9/eXz+enx5eX55enh8eH5/+/z+/v1++/t4eP95fX3+ +//z49/r39vb8+f3+fHl3ff/8+v7/+Pf6/395eXh3dXFydHJ4/Pv38PH38vj7+nt7dXF9eXR4/vr3 +9+/n39tbQj9DesPGw767tsNKQDY2Oi42NUu1sq+0uqytuFU8OzgyKSovZs25t7+sq667QUA7OS0q +MD5S2beys6+qrL1zSTc6KCg2MT1M1bCvsKuusrNRTjkoOC4uODTMsLWwubSst15FOTk3Ki0sO8C7 +r7e5qqyy9j9AOjQpKzBN/b6zua+rrbJ9Qj04NygtPj5Yzbq2t62rs7zRPUYtKDovNz5Mt6+0sLCv +rso/PS00MSovLFi3uK+6s6itwU9HPzwtLCw12Ma0uLurrbDLPT45NysqMEFW0ri0s66qrcRiSj06 +KSw3NkBWzLKxs62vtrZNPzknMy8tODPRrrGutK+rsv9GOjU3KSwrN8G7srW8rKyy1z0/OTcrKS9U +2ry1vK2qrbBeQD85LykvOT9RyLausa2qs7/YODgsJC8uLztKu6+vrKusrMBSRS8xLywzNmG9ubO0 +ub3I2G9VTEZDQkNESU1SZfje0s3MzMzO0NXZ3+ft9np8dG5ubm1pamhjYF1bXFpaXmBpdfvy6+bl +5ebp7O3s7/D59fXz7+/v7+7y9/z6/np6b25tbnh0cnJ0dnh8dXV6fXh+/P38+fn17/D39Pf59ff3 ++v76+/T5/P97/np4e3N4/Xl2fnp6eXd0dnt//n/8ffr/ePX2fff69/5893r9/vz8/fx8ev7//Hv+ +fnv79359/fr9//59/f37f3/9/Hx7fnnz/vbyfH59fP19en39/3h9/f37/n54/H36+v77/vn7e/1+ +fvx8e3l3fH59en7/+318/Pn+/X78+3r3+Pz8/Pr9+fj//317e358fn16//b99/x+/nl4d3l7en58 +9Pn++PP29f15/Ht+enN3/n///fv9+/T9//f+f/56e3l6/vn7fvv8fv36ffjr3+1HQk5Z1NHKtrO3 +2EFBPTUtLjdYy7e2t6mprstDRTswKSouS9a8uL6sqq/JQkU8MyorLkvNurO8rqmtvktIPjYsKy1A +zL+2wbWrr71NRj86LystPsbBuMC5qq6+U0lCOi4tLTvAvra8vKuuv09CPTsvKyw4wL64u7uqrcdf +Rj08LS8uOr27t7m8rK/QUkA4PS4uLje+vLi3u6yt029ENkEuMjI3vbe3tbqur+NYPy88Li8zNMC1 +t7K2rq3QWEUuOzAuNTTGtLmysq6uzU9GLTg0LTU2zbe6sa6urs5USSs1NS45Os21urGtsLDMREYq +LjgtOkLSur2vq7Czz1FMKjA4Lz1LxrW4rqu2u+dBQCcsNi48T8i5uKyqtr/iTkMqLjg0RP68tbWq +qbnQYkI8KCozMT99vra1qqm34WBGPCoqNjhF2bu2s6qqte9VQzwsKTY6RtG9urKqrLdcTUc4LCo0 +Pk3Ju7yuq624TUY+OSwoNEZhv729rKutukhKPzYsKzJJfb24vKyrrrxDQToyKikuQ/O/ub6sqq28 +S0xANywsL0nVvba/rqquv0ZGPTQrKy1C0b61v7Gprr9KRz81KyssQca8tL61qa2+TUU/OS0rLDzC +vrW9uamtv1BHQDktLCw7v763vb2rrsBORD87MCwsOcG/ubq6q63CXEc9PS4uLjm/uri4uqyuyE4+ +NzouLC00wrq4tberrc1sQzM/LjAyNry2uLS3ra7eUT4tOy4uNDPBs7ews66t0V5HKzoxLjg0yrK4 +sbCxr8tOTCsyNi03ONu2uLCtr7DGVkwsLzQuOTrhsrWyrK+xv0ZHLCs3LDQ9/bq7samusr9UWS0r +OS85RNmztrCpr7jFP0IrJTQtM0Psurquqa67xF1VLys4MztSzLW3rqmvv9ZFQSwmMjA0SNe3tq6n +rMDZUEQvJzAzOVbHtratp67Id0tALycvNDhNybWyrKarvW5LPTAlKzM3Tsm5t62prLtjUkE3KSw4 +PFfGu7esqq28Tkk9MikqNDxZwrq2q6qsvElFPDMoKTVAbL26tKmqq8FFSTwwKSs1Rf67uraqq63J +P0U7MCkrM0n3uru4qautyEJLPDIqLDFP2rm4uqmrrss/RjowKSsvSOK7tLuqqa29QUQ7MyopLUPY +vbW+ramtuUdHPjksKi1D0L+1wrCprrlHRD84LCosO8vAtr+2qq22T0BAOS8qKzrGwba+uqmsuFZH +RDsuLC01y7+3ur6rrLpUQ0A6LyssMcu+uLi/q6u5ZklCPS8sLjDNu7i1wq6qumFHPT0wKy4t4rm6 +s8GvqblwSzw+NCsvLGK3vLO+sqm180w/PTksLyxOub61vbOptPdSPDs5KzAtTLe+tbuyqrNvSjs5 +PCwvLUi4vre2rqmyZ1w4NjwrNS9Ktbu2t7Kst1ZPNTA7KzEvP7e6tbGvqrNoaDUvPCw1M0K1tbWv +sa21VV4zKzorMTM+tre2rq+ttVdmNCs7LDI3Q7a0tq6urrNVVDgpPC4vOEC7t7iura+yXFk5Jzgu +LzpFu7a3rKuvslxHOSUzMC48TL66tqqqr7ZeUzknNTExQV25t7WqrLa8SkI2JDAxL0Jgu7myqKu4 +v1xQNyk2NTdM2rm4sqmuws9LQzMmMDM1SNu5uLCorMHYUUU0JzA1OE7Nt7evqay/6U9ANyctNjhO +zrm4sKmsvGtPQDYoLDc4T8q6ua+qrb5WTD03KCw7PGPCvrmsq63BSk8/NSouOUJsvrm3rKuuwEJF +OjMoKThBbb6+uKurrcdJT0A0LC45TOq7urerra/OP0Q6MSkrNUf/vLu5qquuz0dMPTErLTVV17m7 +uqqssNVBRTwzKiwyT9u7ubyrrK7FQ0k8NCssME3WvLm+rayvwUNGPTctKzBUzr67xK+ssMVISz82 +LS0vVci8uMKvrLHIQkQ8NywrLlvDvrnGr6qy0UpNQDUtLy9rv7u3xLGrteVFQz01LC0tab6+tsex +qbbgT0ZDNS0wLnS6vLXEtKq5c0k9PjMsLy1oubu0wLOpt+5OPj82LC8tari8tMCzqrd+TD4+Oi0v +LVa5vra9squ3eFE7PDktMi5ct7y2vbOst19KOjo9LS8uUrm/t7iwqrhqXzY6Oi03MGG1vLa5s63A +T08xODksNTB2t721tK+twl9bLjk4Ljs11rK5s7Ozr8xOTiw0Ni05NOa0ubOwsq7GVFcsMzkuOjnb +tLmzr7GvxUxRLS87Ljg75re8tK2xsshOUiwvOC86P9C2u7KssrTNRkgrLTsvO0jQu7yvq7K40E1M +Ky45MT1Ox7W5r6u2vt9DQykrNy88Ucu5uq2qtMHcT0ctLjk1QGfBtritqrbOc0Y9Kyo0Mzxew7a3 +rKq20WpJPSsrNjdB6r22taurs9ReRz0sKTY4QeW/ubWrq7PlUUk8LCo1OkTYvbq0q620fktCOy4n +ND9Lyr29r6ustFhNSDktKzQ/VcW5uq6qrbhJQT00KigwPlbDurusqqy7TE1BNiwsM0j8vbe7rKut +v0NIPTQqKy9DbsC3vqyqrb5DSj41KisuRt68tL2sqa26Q0Q9NispLULXvrS/rqmtukZIPjYrKi0/ +z762wbCqrrpFQj45LiksQ8W/t8SzqK29SUtBOCwsLELBvrTBt6muvkVBPjgtKis7w7+1vrqorMBX +S0M7LS0sO769tbu9qq3FTkA6OissLDW+u7S3vamryV5FOz0sLS0zvri1tb+sq8ZYRDg9LiwuLsi4 +uLS9raq/X0s3PzAsLy7St7m0va+rvFpKNzw4LS4u77m+tritqrteVTM7NSszLuCzurK1rqu+S0Mv +NjQqLy7utrqyr62qvl1cLTg2LDgx27G4srGvrcdISiswNSs0MWq0uLCurq2+ZFwtMDYtNzjos7ax +rbGwxEpOKys1LDY5a7K1sauur71MViwqNyw0O3+0trGqrrG9R08tKDktNEHtt7mvqK22xUdNKyg4 +LjdI0LS2rqiuuck/RSskNS82TtC5uqynrb3TTEctKDUzO1vDs7Wrp6/I/kE8KyQvMThdxbi2qqez +z25OQy0qNDlB4ru0tKqose9MQzkrJi41PPe8tbKpp6/fT0g8LCcuOELkureyqamu4khFOi4mLjtF +1rq7sKmrr25DRTktJy47TM23u66oq69dPj42LSUrPl7Dub+tqKuxTEdCNywpLj78wrS9raistUZA +PDUrJys878W2wK6nrLZKS0I4LCstPdK+sr2wp6y6R0M9NSopKjjRv7K7sqeruU1FPzcrKis4yr2y +u7eoq7hOQkA5LSkrNMm/tbu7qau5VUVDOi4rLDLGvba5v6qruFhAPzsyKiowyb65uL+qqbteST49 +ListMMK6tra+q6q/TkI4Oy0rLC7Gubm0vKqpwWdLNj8uLTAuxrW4s7ytqsdWSjA8LysxLdmzubG5 +rqm/WlQvOTIqMy3msbiwtq+qvVFPLzk3KjItW7O6srKuqbtZWS40NiozL22zuLGur6u7Sk8tMDkr +MjNlub20rK2svlNbLDA6LTk73LS4sq2vscZGRiwtNS01Pu66tK+3vsXb7mVZVFNTUlJUV1hfbfzq +5d3b3Nve3uHp6/R8/mxrbWJlaGltfHdxc3dya21sbHR3+vLr5+bk5ujq7PH2+Pf9fvl+/n34/v77 +fXl0cndtcXR0dHF4d3Z5e3n9fn18fv369/5/+/r49/j28/r39/36/Pv0/X78f3t6fv78+v31/n7+ +fnx3/X3//n3/fXt9+Xv+///8fv5+/X7/fHv+/v78eX78dv95/n5/fn74/Pr6/v/3/3/9fPl5/vP2 ++vz8/vv+/v79/Xx9/336/Xz/fv71/vv+fX99fn57eX94/3t/e3f49/j7/Xt9fH15fP5+ff58+f3+ ++3r59/v7/n58/Hz9fv37evz/+ft8/Pr6+f50+P/9e33/eX18e+/5e/J/ffr7/3/9fHx4fn5+eHt9 +evr9/vv7+/r8fv/8/v98/f7++f7/fX98/v13+nx9/Xj/fv76fv5//Pr8ff78+vz+/nx9fX34/P36 +/Pf//P/+fnl4enp6/n36/nt7fXx8/v/6f337+vn6//x++v3+/vz7//39fP7/f/5+//z7fXx+/nt+ +fnv2+/x9/f99+n38ff/9e/38fnx++33//f/+/n3//fz7fHp7f/58fH57fv/7fv/5+/v//H3+/f3+ ++vp++/38e3v6/ft+/f9+/fx9f/57enp/ef9+eX56/v97//z5//59f//++/r8fff4/f5+/vv/+n99 +/X36fn1+evz7fPz//n5+fHz//H57/Pz7//59fP78/n38+/r9ff7//Px/fH38fP5/eXr++n37f3z9 +enLy7nT9f3r5ffz9/f1+9X38+3j2/H/7e3v9/f73/XX9/f18//59ff/+fv//fn5+//3++f79/f9+ +e3x+//v+/v7+///7/fv9+/7+/n19e/96evv/ff38+X5+fX1+/vz7/f39+vr/+vp9//x+e35+d3h8 +/n1+9/z6+338/n98ev/9fXp5eX19/nx+///7/f76/Pt+/fj9+v37+f37/3t8e37+/v7//v5+e3x4 +/v54+338fv79/f56fn15fv3/ffr7e378+/19/H3//f55e/v8fnl+//v/ff3++/35+PP9+n79fvz+ +/fp8f31+/X/6ff1/fXp8/Xt4d/97enx7eXz5fvn7+/n8+fr/f/v7fv7//f99ffr+/Pl9fXx5+/1/ +//z8fnx4/v//+vv4fv76/P38f/z8ff56//53/Xx+fnr/fP/4+/78fn5/f35/fn7+fP1+eH78/Pj9 +///7+fl++31+/X37fn79fX56ffv//P18ffz9fX79fP5+/vr+/n7/fv19/n/693z9/P56f/x09fj/ ++3z6ff52fv53eH3+fH94ev59/fn9+fz6+3z/9fT9937++X7+/v19ff/9ev16fHt3d3j9evt+/vd+ +/33+fX74/fj++/r99fl4d/12fn79e3r79/n8+3r8//79fPn+/v/9/n98/vl+fXv//ff+ffz9fv58 +e/t9+n/+/n/9fP59eHv/fn15evz+f/j//vv+/3p+fn5/f/t9/fr7f/v6+/79/f76+/t+ev35fX1/ +/339/H3/ffx7e3t4fX5+fPx+/Xz+//z7/vr8/v7/f/5+f/99+/l9+vT9/fp4fv5+/nj9/n7+e//+ +ffl//vz6+v78fvv9ef19/fl4fv59fXz8ff59fvt9+356/f79+////P3+fXp//n78fvx+eXz+fn39 ++/37+f77+3z7fv78f/7++P7+fv//ff78/v7+fnx9eH78fXz++/1+//98+/z7+/35ff/8enx3ff56 +/f///n1+/P/4+fr6+vd/+3t6fP3++P1++/7//H94ff19fv7/fH//fX7+/f/8/v7+/f59f33++nv9 ++/39fv/7fnv8fX3//n19fH19+vr++vz9f/z9fn77/v76ev39/f5//f1///59f/56eHn7/vn6/Pd/ +fvx3fH1+/H56ff5+/n18e/79/f59/f7/+/589/x++Hv7+/v6/X5+fvv6fH36f3x9e3j+/3x7/f1+ ++/x+fn5+/X3+/378e/z/ffx+/nz9/H7+enz6/n1/fv78/Pz+/v3//3x89ft++Hr/ff/8ffz9/P77 +fP59fXl4/v/8/Xr+fH78/Xv++fz//n18fv39/np/+/z+ff3/f/d+/3/+/f/7fv19/f3//nz9ff58 +fvr6+v79/H38fXp9//p+fn7/fXx+fP/9/3z//f76/vt+f//8/Hx+/vj/fv9+e3/+fnx+f/99/P18 ++Pt6fvn9fX7//Pn99/n7/fx+fn58fX5+fv59/X57fH19/338//j/efr+en/9fvP/fvl++fZ7ev59 +ff1+/v59/n1+/vr6/v34//x9fnx++vx7/vv+/n7+/333fP57fP57/P7+ff5+f3/++/75/n59/H56 +/3r9fv97eHx+/fn+/fz+/n/9/Pj8+/n79/58/Xz6fv79/X58/Ht8fPr+f/x9/357fnx5fv99fv77 +/Px+ff9+/Pl9+35+/Xv/d3v9/vv8/Pz4/v3+ff37/v79/Pv+/H79+v36+3/++nx9fv97fv59fP99 +fn18fHx9/v17/v3+/vz8ffz+/fv9+/37e3j9fP5+fPx7/vx+/X37f/f8/vl7eH73ffr7/Pt+/vt+ +/fx+ff5/fH76/X5+e3v+fnx8/Pr7/339ff3+//18/P/9f3x9ePt++v9+/Pz/fH16/P37+fz2/P1/ +e/99f357ff3+ff98/X3//P399/78fnt9fH5+e378/vt7e3x//fv9+vn7/v19e/x+fXt+/v19fHt8 +f/z+ff7//f5+fvnxdnj1dH/593h6/f7z//j+fPl+ff97evx//n3//Xv6fXz/fP1+fH1//v//fn3/ +/f1/ffv+/fp/+Pf5/v78+fz//n19/fv8/nl6fXl8/np+fP19e/r+/vz+/nz++378+/9+fv//fvf5 +fn54//z9/fx7dvl+/v76/vz8fX58fn78+v36/P5+/f/7+f1//n7+f35+fv3/fHv8fnx7fX15/n56 +/vx5/fv9/fr9+X7//P9/f359fPn8/Pn2+f/+/nv++Ht8/H38efp7/n59/H3/e/t7f/19ff59fn/6 +/vz7+/v9+v/+fP77/n5+/3z89f7//3t7fX5+fP9/fP99+vx+/X1+/f/8/vz8/Pt/+/78/fz8fnz9 +/379fP38e/5+/P1+/X16e///e35//X79/vr+ffz9/v78/f37ev/7//79fP1+fvz+/fz9fnv9/n7+ +eXx5e/36fn75+fz8+3/8+/98fPh6fP5+f/7+efx7//18ff5+fPt+/f5++3x9/nx8/Pr9fP59/P79 +9/33/fz++ft+/X5+fH7+fX7//v59/n59/3p9/v76//9+enz9/H3++/r7/Xx6d/79fP79/X/9/f98 +//19fn77+/5+///6+/v8//f8/f55fv///X18+/t+/n7+evv+fn9+/X3+f31+/X99fv3+fH5+fH/+ ++/7+/fz5fv7/e/x///97//1+/n56+vv8/vv9+/76/337ffx8enp+f/33ffv//fp8/np8fH58/319 +//34fv5+fnz+/n/4ff76/H39eH77/f59/v57/H56+ft9/H/7/vz++n9+/fv9f/5+/v99/v33fnt7 +ePz/fvR9/v38/Xx9/nr//Xx+/vv9+/35f/1/e318/nl8/v18/vx7e39//f77+Pz8/n/9+/r6+v9+ +93r8+3z8/P1+e35/fP58env+fHz+/P19/nx9/339/35//v39fnx+/fv9fv37//79///+/P78//7/ +/f9+f3/8/v1+/P5+/f////t7ff35f/58/n1793v8ff3+f/58/n3+/f1+fvp//35+ff38fn1//X3+ +/33+/vz8fvz9fv19fn9+/P78ff7+/P18//38/Xz++n78fn5/fv3//X79/vt7e/t+/Pt8//t9f3t+ +/31++/59/P39/v99f/v9ff7+/f/+fnr9/Pz9/v38/v3//X1+/H3//f7/fv9+f/79/339/n/9fn3/ +/f7/fn/5ffx+/X58/H/+fPx+/v99/v39/37+/n7//n7+/H38/X/+/vr/fv///f79f/3+/v59/nz9 +fH7+ffr+fPx6//z//Hz9//5+fH98/f3+fP78fv59///7f378/v5+/v7+fv77+339+/7//v1+/f/+ +fPr9e/3//331/Hl5cf77/375eHd+9/j9/Pp++v/+/P/+fX37fv1+fn3+/n59/v7//nx/e/5/fvh7 +ePh//Px///79/v16+X9+/nz/fv3/e/z9/X7//v/+/fp7fvp//X59/379/nz+/X/+f35+/Pz+/335 +ff39ff79/fz7ff38//t/fn/9/n9++v/+/39+//5+/Hr8/Hz9fn7+//79fP/6fn/8fX38fn98/f5+ +/n1+//37/v7+/X5+//5+//v+/X78/P/8ff39fvl9fvr//H97fP1+fn/9/X37fP19fvv+/H79/f56 +f33/+37/fv38f35+/v78/vh5/vt9/H3+fv3+//3//P38/Xx//H3+f//8ff59/n39/n7+/v7//37+ +fP78fv59/ft9//5+/n1+/3/9ff58fnz/+/15fvv//X1/fv7++/18/vv8fv1+/ft+/H79/X7//3z/ +/n19/f38fX7+fv5//v59/P18fX9+ff3+/n7+/v7+f378+///fn/6///8fX/+/fz9ffv8/P19ff39 +/n7//f9/fn1+/fv+fXz5fX79fn3+/P9+ff77/X7//n9+/357/P79/31+ffv+fv3+/f5/fn5+/vz6 +fX33fv7+fv/9/P99//1+//9+fn7/fP3+//7//n5+/P7+f379/H1+fX3//n5/fvx+/v59fP3+//t9 ++vz/ff79fPr9/v19/P77fXz9//19f/3+/n7+fXz9f////v1+/X96//v+fn5+/f7+/X3//f5/ff39 +fP9+/X/7//5+/P9+/X//ffv+/X/+/vt+/v5+/f3+//79ff76eHv8fv59/vz/+X97/f/8/X7//v9+ +/n18//7+fP7//f39/nv9/f79fvz+fv1//nv8+vz+//p8/fx9//9/f378fn77fX99/vt/fX/7//79 +fH79/H3/fn77f/78/3r+/nz9/X7+fn99/f/8fv/8f/59/n7//f78ffz7/Px9/P/9/v17/vp9fX5+ +/33+fn35fX39fP59/P3//378fv5+fX5++35+//1/+n3+/f/9fv7//P7+ff5+/fr8/nv8/v1//n5+ +/f59+/79/Xz+ff1//f9+/P1+fv98/v3//X///f3+fn3//35/ff5//v5+fX78fv19+v9//X7//n79 +/H7+/fz+/v7+/Pj+enn+/XF8ff/+fX98+Pn+/f== + +--owatagusiam +Content-Type: image/pbm +Content-Description: MTR's photo +Content-Transfer-Encoding: base64 + +UDQKMTA0IDEwMArve3/+3//////////w3b/b73//////////sLbt/7v3/v++//////B732/+3/+5 +/9/////w3nf7d//9/9/////78Lfc392//m++7/f///Dtt/b//7/d7//////w3bs//////v93//// +8Hbu7b/99//9/////+Du2+///9///77////wu3c7f/v9//6Nf///8O212////2+60z////Bvvd3/ +/7+ym3bP///w9s5n//+/tt253//38J3zv//+/9+3/mf///B7Pf//9v/f///r/+/g7u1v/90///// ++///8Lbvf//n7aO/6eX/3/C3O9//vu5s7/91//9wbdr//fszW2/983/98G3W///pkkN//Lv3//C2 +d7/+zEyU3f9t//+ws7n/9iAAEpf/c///4M2ef/EiIAJPbJ////Dd5//5AAAASf217/+wtnn/zBAA +AAb29///8Gbef8CAAAAj2t////DZp/8yAAAAAfs/777Q33n+SBAAAAX83/378GbefskAAAAB9m/f +/+B6zf4kQAAAAPs/9+9wm3d9kgQAAAL7t/2/0O20/JiAAAABbP/v//Dtn/ygIAAAAWx/+9twm2n9 +JggAAADzf/7/0HZu+UCAAAAAnb/XtvBnt/5QIAAAAP3/X/+wubX5hAIAAABXf2/b4L5t+SEAAAAC +Xf+z//DNz/5ISEAAAGb/v7dwc3P5kgAIYAA7f3/94L51++SRvyQAP/5237Bmzf/9RPeSABf+7/bw +W7v3///52SAf/u974Ns25//7DAEAD/n/23Dc1dv/rmcggA/o/v9wZ9tb/+SeyAAf4H+30Lsqxt/S +PgBAW+A39vDa77f/3j/gT/vwPd/gbtWz/9oe/DuH/D95sG23j9/CHmQwBYA/7/Dbakn/4i8AIBYA +N79w222Xf8EGyCAHAD330G23N//BEJIACUA/ffBtmsm/wIAQAAYQN+9wm26Yp4CCACAGAH3/0PNt +pl2AACAAAAB/dvBtsyVfIEkAIAAAd9/wbbbxLkAEAAAAAP270Jtt3r6AEkKAAIDu7/DzWZ/+gAZa +AAAA/v3wbdtgT8GBgAAAAfefcL222k/gASAAAAP98/CW7Zky6ADIAAAD73/wdtnlHuQAYAAAR/vd +0Nt2fNuSADAAAgfe73C7bxo2wgAYAAAP/7vwbbnqbaAADAABH/v+8M227JskACQAAD3+77C22zY+ +2QAkAAAf97vgdtubD/lT8AAAHf/+8Fts+V/gAJgAAD97b7DNt2xHkgQIAAA///vgdLWeNPAQIAAA +G+++8LeZ05ZMgCAAAD/777Crbn0TAAAIAAB/v//QamenbeIAAAAAd+/28Fu5uyUoAEAAAH3//uDd +rtubyQAAAABf9vuwptts0nSAAAAAf9/v8DrZt2WSAAAAAM9/ftDbbt95IAAAAAC3+//wzW3ZmWAA +AAAAt//t8Gebb+yIAAAAANv9v7C0//72gAAAAAFb//vwn///NkQAAAABbf7f0P////sgAAAAA2b/ +9vD////eiQAAAAKa/7+w/////8wAAAQDu3/t4P///73SQAAABmd//3D////v0xIEAA2Zv9vQ//// ++/yAIAANtv/28P///97spABAGmb//bD////PIwEBADObP+9g////zfJIEAA9u//7cP///8fYkIAA +Zm2/9ND////HbIQgANtN//+w////yeZhAADZ93/7YP///4DZEAAB5jd//dD///+yexIAAzu5/+3Q +AAAAAAAAAAAAAAAAAA== +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: Star Trek Party + +Received: from hanna.cac.washington.edu by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA29543; Thu, 3 Oct 91 13:04:09 -0700 +Received: from thumper.bellcore.com by hanna.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA19372; Thu, 3 Oct 91 13:03:25 -0700 +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id <AA12199> for MRC@CAC.Washington.EDU; Thu, 3 Oct 91 16:03:12 EDT +Received: by greenbush.bellcore.com (4.1/4.7) + id <AA08947> for MRC@CAC.Washington.EDU; Thu, 3 Oct 91 16:03:09 EDT +Received: from Messages.7.14.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.40 + via MS.5.6.greenbush.galaxy.sun4_40; + Thu, 3 Oct 1991 16:03:08 -0400 (EDT) +Resent-Message-Id: <IcurRw60M2Yt4Ta1h1@thumper.bellcore.com> +Resent-Date: Thu, 3 Oct 1991 16:03:08 -0400 (EDT) +Resent-From: Nathaniel Borenstein <nsb@thumper.bellcore.com> +If-Type-Unsupported: send +Resent-To: Mark Crispin <MRC@CAC.Washington.EDU> +Return-Path: <nsb> +Date: Thu, 19 Sep 91 12:41:43 EDT +From: nsb@thumper.bellcore.com (Nathaniel Borenstein) +Message-Id: <9109191641.AA12840@greenbush.bellcore.com> +To: abel@thumper.bellcore.com, bianchi@thumper.bellcore.com, + braun@thumper.bellcore.com, cameron@thumper.bellcore.com, + carmen@thumper.bellcore.com, jfp@thumper.bellcore.com, + jxr@thumper.bellcore.com, kraut@thumper.bellcore.com, + lamb@thumper.bellcore.com, lowery@thumper.bellcore.com, + lynn@thumper.bellcore.com, mlittman@thumper.bellcore.com, + nancyg@thumper.bellcore.com, sau@thumper.bellcore.com, + shoshi@thumper.bellcore.com, slr@thumper.bellcore.com, + stornett@flash.bellcore.com, tkl@thumper.bellcore.com +Cc: nsb@thumper.bellcore.com, trina@flash.bellcore.com +MIME-Version: 1.0 +Content-Type: MULTIPART/MIXED;boundary=Outermost_Trek + +--Outermost_Trek +Content-type: MULTIPART/MIXED;boundary=Where_No_One_Has_Gone_Before + +--Where_No_One_Has_Gone_Before + +You are invited to a + +*** STAR TREK 25TH ANNIVERSARY PARTY *** + +When: September 28, 1991, 4:30 PM until whenever +What: For those interested, we'll have a rerun of last year's season-ending + cliffhanger, and then we'll tune in the season opener and the 25th + anniversary TV special. Prior to that, if you bring some food + we'll have a pot-luck meal, and general merriment before and after. +Who: You and your family, including kids of course. +Where: 25 Washington Avenue, Morristown. + (See Nathaniel if you need directions.) +RSVP: 993-8586 + +What follows is some Star Trek related multimedia mail, the last of which will give you a chance to RSVP on line. + +Live Long and Prosper! -- Nathaniel & Trina +--Where_No_One_Has_Gone_Before +Content-type: audio/x-sun +Content-transfer-encoding: base64 +Content-Description: He's dead, Jim + +LnNuZAAAACAAAFmUAAAAAQAAH0AAAAABAAAAAAAAAAD////////37+/r7e/z9/f7//93b29z +//////v37evv7+vr7+/z9/97b2NdVU9OT09RWmFr9+Pd3d3e4+vt/29la21ra2lra3vn3dzn +9+//YVtaV1tp9/PjzsjHxsbGy87P2ef3c2dz/+vr59/Z09HR1dLR2d7n/2lXTUU+OzY1NTQ1 +OD5ETmXf2dLP1dfb3O9jYWNhX19pb+/ZzsjIzMzP43dfVU1RX2/bybu6u7q7wcjN0+1ra1VR +Y3fv7+fZzsS/v8LEztXW62FPRj03Mi8sLCwsLTVFVffLwL6+v8XFy9b/W1tdV1RVWVtr2srG +ytXj/09LRT4/SVtd2MC0r66trrG2uL3I0/dOSE5WWVxn99nGvby7vsfR4VdKRT03MCwoJSYn +JyowPURb0cfHz9lrZ2tZRktdd+HazcrGv7iwrrC4usHR5W9VTl1pd8i7tLSztbm/xcrb91dF +Pj9DREhXb+vQv7y7uby/wsr3XUQ7My8pJiYnJiYsOEFK38G9vL7Fzc/R72f/1dXe69/v99/M +w87v919NSUU+PUVMTme8s66urKyvsrO2vcTNb1JVWVNLTmfr2szKx8HLzs3XY0o9ODQtKCYm +KCYoLjpHacnIx8fI1W9dU0A9RU5nZf/Zxru2rKuusrK3xM/cb1pvd2PXu7Ovr7O2vtVlS0M9 +ODM2Oj1ATVfr1cq/vbu6ur7DyutSPzoxKiUjJCUkJS48T+29trSxt7zCyNNYS1FYb+/t2c/H +vrq6x9HbW0E9PDg6QE1dxbGtqaenqayxtbnC3FFNS1NeZ//c18/SzM7Pz/ddTktAOTUvLCgl +JScmKCw3QV3bvru2trzCyMjrT0hTe+fXy767urCsq7G4vcn3WU4/P0NJTs+6tbS1uL3Oa0Y/ +PDcxMjg+SlBb3si8urq4uru+yNnvW0c9OTApJycmIyQpLzdFY8i8uLS2urzC71b/697j2sfC +vLivr7W9xM1bRT88ODxHSnu8rqyqqquvtsDXd1NGRERKUVphX+HTz9LV2t/3b1tNRDs2MC8p +JSUlJSUsND1I2MC3srK1urm7xldHRUtLTF7Vyr61rKutsLa8zmdKPjpDRlHPt6+ur7K7x+FZ +Rj86NzU3Pk9cb+/Nvry9wb6/w8jV/1pFOzgzLSssKygoLTQ9SNrHvbi3uLq8xNtMTE9eZWfn +x8G6r6yttLa9ymdGODQ1PUBHzrWtrauutLrC2VlNPj1BRE1be+/jzMLJzNPjXVtKQDo2NDEu +KygoKignKjA4QGvIv7u4uLq8v83hY2lvc+/Ovrm2r6utr7O7yetURzs5PUdbyrevrq+zusfP +91lEPjs5OT5FTFBd98zIzcvKy93ja1lPQzs6Mi4sLCsqKzRFT9a5s7O3ubm9vcPnY1dMS1NN +XdfMw7y9x8rI0V1VT1M+PUdvz76vq6+vr7zCy9VZTkpKTERhc1lr0d3Sy83azs5rXU5EODMu +KykmJSQkIygyOkTOuLWzrrG/xbu41s7I1+u9ubmyrKytrbS7uuFCOjY0ODlAc8O+tbbAyM3v +X11LRkZERV7f69PPz9vZyszKx8DYy8vrUT83Li8pJioqKCs0Oz13u7W0srXHwsXcUVQ9PEZE +QE/XzsC6uL28xcHhRz9HQD5axbavq6mssbC+z+PTRzI8Ojg700ZFd9dN47nDz7+47cjM7ztD +Qy4qLS0jJygqMDNP38vPu7m8vbq2vsfG19fXzsO1tLOvrbPfu77VO0xFNS9CQEXCzL+3rcvY +4108Qz0wO0jj/93awr7VwLW83bS6wtTDWzowMzMoIyYpIyorLkJd19W6r7K/vLH/zrz3Pc3M +P2O/zky5s9HIr+dMPkIvNkpM0LinpJ+fo6qvvU5LSzYuMjk4SdDP3sO9z8vFTzZHQi49U0Rd +zMnN59zrbzA3PDsuLi0xKTAuKz3rxb6urqWgsbe4n6Sqt6rGLTI2Kibrs8XBq8F7MDIfJCEn +Ljtfr6ain5+foqK1w0IvHyAoIzBByc+trKepq7HGZTErHx8fHx8fHyAnMkLIr6ifn5+fn5+f +o6Cx78HhLzRTPylHMysrOiwmTEU4P7Pew7P33atJSa6nc76sr0i2rMNevbs438hIJVlQLyx3 +OCgtNCslMTwuNOPQyLKtqqerrK7GzVvTNS0uRSwmRdM3T63FrqzM377eOT1fKy5XREjJt7Oq +sLKtqv++wUfXwUss3UYvxNg8c6zLvrLDv75eS2suNy0iLjMfJjsyPa62yq2ipsyrxUq+zT5O +20e5PTK8yz+8sV/VZ7NFS09NMi9UTTxetFzIu96yvt+7r1ezsMXMa1tO0z05KT0rIkAuMEn3 +QLfnabRWSkfJTDo3yk9DLN+qv1/RyUbrU0lFd0W5tr3Bv7xPZ9EwLsbEPFuvvVO+q7Cup7K4 +Y080HyUgHyMmP0BXraOroammta3Jv0tLOygpKT5EL+mst8q7q6zv0cu1UUFZP003LjMzXS00 +RkYq4z0wz0M4QrNFyrNIvsS3T7HG07DDsrasv7m/XbprOzFILS48KD4wRT3XO0TEUEjJy99M +3bPQY925RbbEa3OvQzrJOsTXTOvJ+9e/68FMr21aRMbDQcdCxMy92a9OwNXzX0bYOlVR33dO +rcDjw7V31Uc8d0w/OzxTUz4/VdDz99/Ore3G78xCPjxBNi8/Ly85OTMywT+3b83Gzu3Vx0lD +70nIzFHIt669966wU8RMUelET0DLNWdMa01ttmfBP824Ok9JPeEw6Va/O2e8ULZS07XHU7rK +uljVw1vXa/tfQ088STlLSmPnzGO/W7/Wx//TxDxNXm8x/85D30nP5bJMw+PNN9Y9V1bBUc8/ +7bG94cO+zmvHZ0zLRz9CQjhZSztAc0TOXjhO38FTyM1XzXNH5z1JNFMqT0RfTdeyXa/pwcXI +Y1fS/87bX9nKzGf/vuHHz/e4T8DzuUpX73vFOs/Nzcr/yOf33kC/d9tcYchP671PxNDUSsL3 +uL3VxLXF+8tMS009KjM4LS45OkTjMtBZ3Ei6wtFKb0rBb0zIxcg6u2HP10vM1O8z2M81QzbO +R8ZYtMzPU8vPz1HKU8tFYWvM90PdVMZY607HTkbcP8c9zuVFVDrINcw/QzzzZ0q9yeu0uLnJ +u8NXb9rV+06+Srbf80/Zx8/USctaREndOE04XGFvwsW367fR3L7ezzzeOfdEyEhfw0vBd8xD +xmvOWlNj5+c+Uzk+ODgvQDM+NUE/WVX/yMnAx3fA/7BlvGm+Ub5Rxsq+xdW988XhVmNGVzlL +OFpjRMLTtc68w9PMy9vT7VnY8+//593aXc3Wz8/I28vv4UHHUVlMUDxANUU9OktJa9fFy8jK +w9zM49nKTM5Zd1lR90/cXdTdz9vX3l5jUT5VTW9P2b++vbq/wdJ3Y1dKPkBGPUM+TFlvWs/F +083Hw9HVzu1nRUg+QTU2ODQ2MzpNTGfcw8nLw8nhx9bO3cnVyMrAxrjFwL3Cu9vC92dcQ005 +PD5BS1Prv8TVx87I1Gfe/9NOa3dvT1X3d3NvzM7vz8jI02drXVM8OTk6NDQ2MTw+UljN0MC7 +v77SynfMZ1djUWtOY3PX0+3ry9Xn3ddlWm9LW0pIR/vdyb6+usPB2tTNZUxJUERLSllXa1nv +x9bP2cfHx8rK1/9NVkM+NzM3NzM4PFxl18fFv8DFy8nMzszfxsXHzcTBwcjEyc/b299fR0M/ +PTs/TvfUyb64usHJ1W9hU01VV1JNUE1TVG9l49PcyNHN193r729OQ0Y1NjQyMTA2NUJKY8rE +wsfCxtnZ69Tr39nj7+/OztXdysbP5//vW0NDPT9ARf/OvrivsLK1vsPP0P9eU0peWVFUW2v/ +a9nZzdXO1P93d29IPz0+NTIxMC4tNjtFSf/TvLu+ubu5vb3Nztfez9LT19jLxczb/8f3UkRJ +Qz08QEpV28u/wcS/zdNvVE1fUD9DS0hMW13zzsfCur+3u77Jzd1PSUc/ODk2NTAvNzs/PmXj +z9bJzd7N1MzP29fMydPIxsbAvr7B0cjTy2fnSkJBQ1lRzce+t7u9xMbTd3tXTEdHSU1Tb9nb +6c7SzcjEyc/lWWFKOzk4Ly0uLSsuMkNPVM3Dvr28vL+8u73IzcTFzNDGy83X291rX1FGPDo+ +Ojo5P0Jb28C/vb3Ix9HOzNFzVE1VT1lYXWNn59jNx727vb68ydlfU0s/NDAyNS8vNkVGT2fP +zM3JzN/v1t1nb9/KzNPOzGGryd/Lw06zzMn3XNHb3TfG12dfsfPCVVfvsllvQkfDP8c64+NB +Ub9Ew9xc0+U8OL9K2FoyLjstOi89NOsuSz22ScPOrsixY8K/+04/47/e373FzcNQuMrTa2Vd +Y0AsP0M4z7a7q666y6v3R1XhPdZLNMjHQN3Id9m349m3wTTFRMI80zE+RTNfWVwsWka6UVlG +sk3nv8tR9zYwwq9HONTJa008Zaavus6tu1cxLS8sIjDlvNfJpqemtr61tjYrNiciIB8nPz1Y +q6Kon6GjpajBYfcvIx8iIx8nHys7vbemrZ+rs03rMy03Vc2trK+rr9c8QDo0PeW2tc6zpKW+ +yMXOTyYkJygjKy9GwaijoJ+fpKqryS8/LB8iIh8gKT0+Pb+wraOgpK9r4UY1LjXJwKu1tNVX +KikhHyErN0vIuMasoa6/zME6LyYuM1VDY6ynp6Ofn6WyxunfNR8fKB8fIyYp2zU5ta9GwKOf +xdGtrsZb2rGgpK2sqrc/LSwpHx8jMTQySc64rMfBs7c6PU44M2PZyq+ioqGfp62rtd3dPScu +Kx8jLiQr2z8uY6jRO7Gfw0ZfwMJPS8WiprW1r18tICQiIR8q08x3tKiuqq3S5VsnHyIoHy89 +X66foaSjqL5ZSUQ1MSk3KyknO0w7R8GzoqlvvqilTe+3vltS466hq7SutjkjJyYfHyAtPt9d +rau1r6y43U0sNTctNMjVZ6afq6yrvddKLC1FNjM3PS46RitnscU9rqZra6ejXVGzsr/Z072k +rNDOyDUfHyIfHyAwyb7DtJ+rw7W7dywoKy4rL1C+r6qfoamptNNvTz8/Qi45TCchLln3PDj3 +59/E+2Oon6/rqaHDP9G6p6/KuLdVIyInJiIlSry/ya6tvLnhz1Q1Kjo/LTe5sK6mn6Kps99v +Pi0kOD4vK0cyLEQ34cG+Ta2rrFU3UKeuNe+wxjI2R7atxdjB3SkfICsiISjntsLNqKOuX8Sx +xy4kN1xENc6qqKqmrbbHOTs3Ki93Oj7HUTk8Zy85zKpESK6t5+t7p6CqS6yoyDhPxcW+Tklh +Nh8iKiciLty7tr2vpalLSMPILC9fXE3z27+yq6motVhpYyotLixM5TQ+tOM2O+/7vDQ7vai3 +udA1XbSsVEG31zwzOruvs0/d0zghHyMnKitZq6mpt8GrsTQz7eMtM8/JtM5jwKWjrLOww08x +Mt1nND20uzUvSW05P08+zae8bbmhs8Y/PrGt3yu/r9UyV7atyTdT9zkfISs0KTTBqrG/taev +Rjvrxz0wX8LOb//BuK2ssrXYQTA0LixQ1c7JW+9CNSw7SzswP0Jcy6Owtq6zyz0rWa/nLT26 +ezwzS7GtzTFBUCkfJDFHRMKtn6evra/HPzE1NisuRqzXPGOyrq+2wrS4vtfDSDxNX0tGMi84 +Tj4wOrq30dqmp846wKqtRCc4vksvWq3JL0U3OTkuObGvTzbVUzYlL2vEvbSfn6Sps7zAVywn +Mjw6P0jbwUw7x6/M22dDX0gpKD85Nzw/TmlMOUiyxeO/qqbDWdW5zEzrrVsvNUUzva+v6TpR +MjQ6Q9exvP84MCwpKTN3uqyfn5+fn6KtvD0pKSsfHy42L0e+xrymuP9P8zgwQELv09c1Lyk5 +NS04tqaosbGvrcw9Pau0TCy+v+tALzTcwikqa8YqKTBNQj1Dt5+qurmzYy8oL9O6wa2fn6Os +r7bPLyAqLiIgLC0yTT1DvbHL1VlXXVUyNs/GRlG9urvD47iuwsqvqq+80ruqXzT3wzw5Pv/H +P1tfOSkxQDJBt7nVQEA4W09Uu6irzcvfbzAtQ72/uqafpqyzvVEuIB8fHx8gJCo3QLympbmr +ornLytvK1jo/+/83b763wK2oqa7L78/RRT0/dz4xLTg5N0BZSFH/T2d3b9RLzcbbd2/bSUnr +/1V7wcHEyr22sLm2trC4vcZ3Ri4pLjMrKjdDOz5Nb9B3Qz1ZUUI4TsvK1bmmpaqqpKesr7W1 +tM1f71UvNT89NTc3Ny8uNkU7NDg1LzE3Pmm/ta+yuLGuvr+4vMXMVUnZzVFjylZFQzk1OTQr +MDk4P93Pv73Bxs7zSlVv693EwMbCwr+9u8zR01tJPkNQ28vCu8Lfd15JPT5Oz8nfzr24ymdr +zk8/Pk5PUT5D2dNBP2fX3evPvrrRSklXRTlB/148SnfF0e/jy8pXUt3aZ+O+w1ta52nn72Fv +yc/3/8jB2/fGvcrvZ01GPzs4Oj88Slr/WGvOz9nEvsPlW2tINjU/U17Z083Jz93v3efrzsft +d2tIOj1EU2HZx7u1vMDAurzC2tO/y0lBTkQzLC82SURNz7u4vr+7t73BvbzEzs3O0dLzW/tb +SEpNSUxVZevrTz9KPTI6OTc8R1FOTkxTXV9VXffr187SycXNycnt2cnL0bmzubO3vr/DXD86 +Ozs7PkZEODU0OD5PZ8i6u7q6vt/dysjvadnHyv9U08zZa8jEUWM3PD0uLDU+S0ZMVFdES2HL +tbKzs7Czs7W9z9/Z1mNGS2vf/2Np2Ug5NDw7NDc8Zelnb9fLzM6+vLm9wr7Ed0lN4/9GQkJB +Ozk8RlNNYcbHzMvbWe3W68zEy83MbU1KTz5CTU9AQz9ASVFTY9zT1c/DvLm6v7vAz8vL1Wvp +7//ryNZ3/+lVUVlbb+fd287L2V/e1eNzX0pKRjk0Okhb5c/KytnV3OPzX1ljZ1NGQUNZ59vB +s7W8wMr3b3dfT05MXVtfY8a8xNPRzuNIOjg7PTk4RfdzW3fb3dbS07+8v7+8v8PEzN/n81VG +PTMxNDU1OD5AREtFSFv/3M7CxMXI0tXJxMfKuLi7xOvnztfXzdRPP2NfN3f318jYyMbrU0xV +5/Nf1cC+yMvf6917e+fba09VTUlEP0FVV0hBPzw+PkNES1Nr7czZ39nIwL68vMnJ7Xfv+1v3 +08vT2uv7/11PTldJPTw7Okbr2My/wMjN2VdaWktFWe9hXevjy8G+vru3xM/VaVNXSj9MV05M +91FJSlJX99ZvbWFP89X3V83K0W9zSE1NUf/Bws3LydTjyr3IyMj7UfdPUW/U78i+yuFvT0z/ +a1FOXFVcT0A9R1dQW+/z2+drd8rB09TK2U1LPTQ1NjVHW1tSysXS78bIw7q+0v9PR01PU9/J +xMnD309Y3/db691VR0U/SFvj0cDCy9vtNELKL9xWPcRD1dNZvNdrubjf0dfp18nPzNPY/1BI +PTg6MT7CPGPIxL5HRePFxtvjSt9KP2FZe83Jv9fj7U5PXlHl2XfvY1ZPS1nTyMC+2GV3Xmvd +98Y3vrA9PD88uuPRr3vLzEh33l/n3cXDylFPMzE6LjY9TENVa/fny8G9tLfC1N1zOlc+Y9Pa +uMPNx3Pj42Pr3lNXRj53Szaz6zi+P7m6NsRBQbc+XctXVkvczLfFusXd1VxGymHLZ9Xrad4z +Oj00TCphxy5S1y/PRFm/39bLZ0jZY9+9U7nP1k+/OEPFN8HNSc33Mki/P89N2rnTx99Kx1Xr +Os1fyUk6uz1by0mzc/fE9zx33Efc58Tzx0nlwTjKWzpX0MM199lHW7DptOe/30vPd1ZExtTV +ucA7uz/JwN9lutVDSEtDU9/SU7tBzdRAvE//1z7GRllMO88+uU1ruW+zwUvrb0zEQ8ZLS05W +PD08R91Gb0ha11XRRcJrb7TXVrpLQ8df17xnylPvvUXKukmxPlS7Ob9KQ7hD3NnIwTjA1Vuy +Se++81Tbb0Ln31nhzcfUvEbGPM7Pu1S+tjy4Pjm3O8zIUzbE5yzDTVO9vTu1uz62UD27VU+9 +Z3fMzjm+bze+Osq+RDW+7z68OWG8XF9I2zjRNvdc2U1E2Tu+dz64W+W3UVHKvjXF50S/2TDL +NzfPVTu7SEfITvPn0E292UvKXbhB29W8zle067/3R1awRb/Jzu9t3DhP1zXAW8rYrtA8x7tL +Rq9Xd+9ETdlXQkXAPbzZRNpZv03Ax8tLZzrjey5Ga8Ezw1s30/suz7bdSk7bWN9TPbtMVdFl +2TP/TsvFPLtZQ84z1Ek42s7nSbl7V8V7V8NvxVE/1VxRc2drwW9B2rNKT8y9ytXRw8FUQsTR +PURbVjrJPj5GXLFzTrW4zTvMvlLr90S7e0hDtU1GssnVukfY50s843dEONFTzOfMt2td6dHl +PzTjPys8Z0BMXdm2ulm5u+/nuMdO3N1PNkhVLlVELzJNWzHZxeO5uv9Z1ckyMlHtuzfWpbNd +16++RjFR0TUrPbzvLNuyVDSworJCr6a6RSlCsc0mMb3NMy3Nrq/DrKKnwWnntDYqQ0g4LTy2 +vse5srbeZT03LCcrMy4yPMO5t6ymoaWvsMZWQi8lJS4qLC03S764/7mpvDzrvy1ES7rWRUA/ +rkM0zavDSa6828XBPjE9QzD/bS7jt2/zzz1nuk4rQctBvUMxsq8+K/fKNSguurbPOUarrktG +rKGpvby0rN83Q984JSUuT8LHT66frdwww709JUzSUCsu662xSu+soMMrQK/BLCvvs7Q+L1u+ +ySoqwbIyMMdKSHdKy7CqX8Ct1d3tyMDNxkwxRTAqLO/dOzZdVUgvM1fRw907z7DBMjrPrLZ3 +26up1FHMvus4OExLMi1E49vnwbOusWHMsbBLNsm2Nf9ZLza8MSjfrDouxq3KY+k7Qcc+LNOv +38quvju7p61rLTq8qUclOLRnJyzXpK4zK8qtQSc3q7dKLVa4tFkqPbyqazzn685ZOzXDuj0q +OU0+LkG9r7U6OLGkySkv6aOvMi65o7s8JWmosDMsuKvZKTTDqtErKVOs0yw1rrMvLduotNgy +WKu2LSnAq9U2xbmxxTAytK82N7VrSrz3LsusVjWyyzHerzguxP8oMbG+NkW03TxHWEy3tz06 +ualON83eNkbAQ/Opu109PDU8S93fwL2/Uyouv0Ex26WrTURAPM29OTGzrkUtyaq+ODk7ratR +K0yyOSY76biw1SdErdEuSv9YrK5ML82nYzNH2XfB1TTzralBM2e090EsUautPzHXres2LVOz +sb+7V1e6QicnOGW7q9XjrsApKsvTRW9lyqzLJzi+vT8xN8SnxjQvx9dFNEXNwO/rvttTS0Y2 +PK+2PE/APWWyNzO+sTtcvddvvkMxX8//QUq00tjEucVNLylQwrxOMryo/0W/u+fRby1Lrbkt +U7zN2zw4uqe0Xc7HSigu3aas3F33z1k2K1+qqMo2O0P7bzUyR7S4v9NDTMi/4+OzxEztZ0Zf +WzE6uPM0OfutrcwoLbiq2TnTzsQvKDi02TvfwSopy62qwSgiVapWLDG3oao/Jy1Ctq3NRV62 +1WVLPz13rr1HSFlD0cBMN1nX18tGOcymwk/LsbpHMig2wbLWW8Oup9EsLOmvv0UvwK7KLTLN +sK3IOEXHxzwpK+2svG82c7SuVjlWZ29lzlEtSbrKP8O5QS5vw0/Jsj9IvqzdLiEoxKm0NCw1 +O9y+R1OrqNs2JS/BsbTvWee/w005O0e7rLhISbi8Py0+58vGa1PQyc7XU0BJa//Hs7nd/9XO +zWtCPkvbx8JnQsSzx03nvcXvYUo3M0xb69H398e6y0Q/W9O5v1hC0Md3REY/X8nhXFFbX+ta +TsW6vcfGb07XzUxE5+9PRT4/Ozc228BnPUA5U8hfR2W/zFVRP0fIvszvtsT7W+lb48LB3s7B +RjIvUOtPW9VSO0FvVVzRxe/X0/dG97zLyLjDy72270Y/S1bnymVF/7vC3drJzffdZTQuOV1z +41tAU7e7Z+HDe8u360dOe0k/Ni9Ou8/rXz1G2cXXw7/OwsRdRFF3vMo8NlVvV048Kk7BVztJ +RDvdwVNPycztz8PKv722sLi+02FCSffRWEM5QVdGPmfUX088OkvnvP89PcS9zsa72NPByGO8 +tr3tX1tV61h33VvfTzw+WktJzspJPVNYVV1vybu9yHfv/1Rdzru7vca/YTxnzsfezM5jd1dv +XWPX619j+0NLVDw+TUs/Sz82Nu/rXdLZY07r1OdXTlvbwcPfXFdU68jD1dTW1/vfa09Vz9dR +Rv9WQDdNzrWsvlJO08zR1crEvLvETjk7S93N41tnSjw5RWfMxVw9U/PjXf/v5d3n0dF7d+vL +wL/FTUvXymvvUE//u8FDOTxFUffvTU5hb2VRW/9d+9nGysr3R0nKxMDMVV1Y51Vj6+lMRkZd +829nSU/Kw2dET1Hc3crQ3e33/0pKXPfvysLJ2V0+PDxP0c7ad1dIRWPT08q/u793P0ZKYcDD +Y1vnX0BHTs64uMtj3s27uLu4ucPN70NCSFN370tPTEBBOj1Zys/nTU9XTUZpv77H70lHZ/vO +11/vx7/N90xGPEbjy8heQz5EQU1NSWvVY0c7RVPnwsjJy87nXXfDtri6yGdJa+9Tae3r5cnT +TTk8TNnAw15FW95HUdm/ytRdSV/nT0Rr1c9lPzgyP1H3wbm5ub3DzdTdw8fvVz05Oz09Rk5b +/29rb1rvyr+3s7i+0Vk/PUzMv9FdTEpLU/PLxcHHyvddSEVWe3dTSkpJRDo/78G/xdNrZVdB +TNfnY01FRT04Nj/NvL/O4+tvUlnXxru/yVtFPkJt59HFy9/pa1Nvyrq4vcTra1FNWuvNzMvd +a15PX9LJz8vr/2dPRU9r3tvdb0U8PD9Y187Wd1FNSkpV183Cv7zFaU5c993QXUA7NzY2P1/d +4d3ra29ZV823try/w8fj49fLxsvnTkA9PVHfysfJ111NPzxDX29fU0xJSlRjzsK8ycrjUUZV +XWve2eNTRkRGTd7JysnMYUpGRlnRx8nVd11KSUVLb8nAwczT5djCvri7vs7Zd0dEZ+PR019R +TVFNXtfHzNXn/2NMR0JU993pTEE+Q1Pn92NNT09XTlP/ycPP3F9tR0VJZ9nZ1+NJQUVVXc/F +zVtISUlh68nCwLy/xdPd48y8x9hvU0dEQ0h3zMrU3/9jTlD3ycrnTkVAQ0RI5cbBxc5lRkRc +y7/AyntNQD5CVtXIy9P7Xlv/49/EvsvaTT48QUdZZWNZc2NVe8a5tLW+ydNdSEdLb9jvYVxf +WV9ryr27v8d3SURDTf/zW0tDPD9CTWnPz+Prd0xIS0//09leV0ZAQEvvyMrX3t9v7+fp0cnf +X1lGQExrzL68wMbFy9Lb08G8xe9OQ0JGV//XzfNNTEVET2PZytfvX1dPU2fevri802tZSk5N +Tuvj/1xIRUZZa93Jz+9ZSUlOX+/PzOdPRkE/Rk1f0tHb4e//59XEuLe8y+lZSkZJc8/P+09T +VV37387ExM/hWUlGS1zv4e1bT0xHSU1l499dTUhGVXfXxcDE3Onna/fj2NPX41lTTUtUZ+Xh +33tjX1133tHFvL/EyczIx8nN095zWVZPTlVfc/NjTkhJSkhNUld3d19dXXPp08nAwc/j82FR +TExNWWNZU1NQV2Vt99v3V1RZXWd38+vvY1FQT0tTa/fa3+/p1dfLx8PAwMfZ/11aZXf73d/z +5/NrX2Nfa9vZ921jVFlfaefd52ttb19WTk9TV01MU1Bfd+vTx8jNztXz493l39XfY2lfU0lC +SE5dZ11n7efn3M+/vb6/ws7/Z1dv721TWU5MTlFSWf979+9tU1FOW//nb/Pj7fP3/+/f5WNf +T0FESE1X7+fj2/dfWFVb3dXb1dt3aWNhb+/pd3NhWWFjd8/DxsfGyM7R0c/K0eP7b1RNTVzj +yszn4953YV1d99X3a2taT1FWZ9jQ2+t3a05HSkxf93dfWVNUXWPdz+Xv/15bV1Nj2dLd+2tX +UEtQZ9HS2c7W397Wy7+7wMjVb1VPT1Xz4/drW05LTVRt0+ldV1JHREZT39HT1917Y19v49nf +Y1RTSkZKV+HFyc/T71tRUWfRzdfva1RNSU7/3dxnXF5fVl3fxr29wcXM193f18zO52NVTEtL +XuPM2P93XktFSFPr22tbV1BTUWXVys7vWkxJQT9IY+PpZ2dnY1tn3cvK429ZVVNRV93N0mta +W1lPTunMwsfN0dXX3s/EvsPO3GNWTEtZ18/Xb2FbUU5P5c/L3W9fUk1JUN3Iyc7nb19YUV7b +3/tZTktLSlfPw7/L2/djVU9b18zT61hJRkNFXNPV7WdYUFFd38W7u8LO2+tjc9nDx9l3WkxJ +SU3pzNN3U0dDP0NV69brXlVOTlNf0cPK1ltMRD9AS+3X3W9jU01LXNPJy9n/XlFMTV3azNbj +Y1VKR1bVwL7AxszX5evQwb7I1/tlTk1f28zM329VS0ZFV9fMzttzVUtFVd7Mxcvd711JRE5n +9/9WTEU+PEFrz8nM1/NjTk7ry8XFzm9rTD9HWefa2+9eUUlL98e+vsTXbVVNVtXDv8LXd1dL +SmHn09V3VUc+PUV30c3R5V1dUE/dxsPGzV9TRD5G99rT1d1vVUtMXNnIy873Z0pGTnfX0dj3 +V01ESe/Lv7y+x87X79fMxsPK12dTSUz/0snK2FtLRT5Eb+Pb33ddTUZKX9TFxMbdWkhDSVtj +Z29UST49Qlfr1c7R+15NT+fbycXG0OtOQ0hf697X22NORkvjz8rHx9VvU0dY59XNytLfZ1Zb +383NzM53UEJATO/W083db1lKVdHKxsfOWUs9PEln3NnT22NJQkZz09XV13tOQj9O39TT2P9b +ST1Ia8vGw8XM3W/v0cK9wcbdXklHUtvMy9HhV0g+O0lc6+//XUxBQUrvycTJy9VtTlNp2dnn +Z0xDPTtD+9bLzd1vU0hQ98bCxcnha09LVdrLyM3nXU5DS9/Iw8LJ62tMSFvhysbH1/9bTVLX +xcHCyfddTkdX1c7Ky+1fSUVLb87GydNvSTs6PlNz5+tzU0M/RHvOy8vNe1RCQVXj1M/W6VND +QErvysG+wtJrU1nVxL++xutPRD5K28zIyedYQTw/TfPVztVdRjw+TOvOycbYZ0xLVdjIx8zb +VUc8PUxv0MnO22NLRkrrysTFzW1LQURd0MnJzON3TUZZ08S/wMrZV0ZHVd7NycznWk5JWM/E +wcTWa1FGR2nbz87X/09DQ0vny8bK1V9IPjtGZ+/t61ZGQT5E+9TIytHvWktJT9nJycrnWUpH +Rm3Iw8HF229bVmvKwL/H3WNMREdazcPCxdRnT0hJ/87LzeNVS0JEWdvJxcrnY09OXd/GydX/ +TUE/P0rjzMvaa1FMRk3jx7/E1ftRSUNFc8vL0ndSS0xP98O7vcrfZVVLV9PGyONhU0tITV/M +v8znV0tFRU73zczfZ1VNSlfvw7zC2W9bSkNCSf/dXE5JREFCS+fHyeddVU5NU/PNv813Z1hP +VV3jwbzJ1d/v//ffw7zA221XS0dKYdfAzOfnd1lSVePHx91fU0dCQE3byc7/d19XVFfjzch7 +TElDQkdMa8vP92tnVlRb5cS+ym9bVEpHSFfdzHtRUUxLTl3PwsfZ6/dnX2PlysPVa11cV1t3 +28XE3HtnVlFTXuvW5VtTU1hl68y/vcXf721OSUpRaW9RS0hISUxf3c7Q91pbWVxj3c/Jz/9v +d2/z1czEv8zZ4+Hv49fMycnXX1dRTk9YZd3cZ11dVVll69bP31xRSkhMWm/TzeN773d773N7 +615FQkNESlBd4czV7+vt7+Pf1c3Pa1FOTEtMTlfnbU9NWGfz59nJw83f5+Pe3ePZy8jf8+fr +5d/f08rX/19fV1dPT2n3Z1FXc/fv7dPIzOdlYVVPTUta92FRTlZdW1VZ7+F3XG//d19d99va +b2/p3ePr3cvEy9LPz9XvZ2/d41dOVVVPSlRp2913d+//Y15r599fV1thWU9f18rM3dbR32NT +VlpvVUlKTEtITGPUz9vp3ed3XXPbz9n/e29jUU9d89fj79/n/23318bDytfR6W9de9PKytXU +1ON3Z3fYz+dvZ1BIQkNNXWdbd+t7e//by8fN42lXSkJDS23vc21vY1tPVu/Y3O9vWU1LTmPd +0+X3/21rW//Xw7/JzdPjXVVr2djhd15RUUpJd9zT3f9rXldQb93S3fNzW1lPU+XKxMbN4WtV +SUpdaWtYSkdGQUhezMfN0+13X1hr0MnO2G9WVU9Md8rFydPr3fdd6czBydn/V1FJSVvOxsnW +92VYTVTZzM3bYUxLQkJW6c/U43dhW1NZ2cnL12lNR0I/TOfT0uddVk5FRV/Z0dxjVUxEQkrn +z9PnY1lVVmPIuLW6v8vZXU5d3czK2OtnWExLd8nEydn/W0pHTPPPzuVfV05ETN3JwMPS32dI +PkJc39rhb1VMQkVvzcjI2m9fSkBP28zIzuttV0NFWdPExcrZ51dR98jBxM97T0U9QGXayMfV +62dGQ03bycbR71dHPkBc0cjJ0etfTkhd1MvJ21FJPTg+TO/Pzt1hTj8+TenNzdJrVEVASuvK +xMXQ72tQT9nDubm9w89jTlXdy8jI0/dVSEdrzsfGyutZS0NId+HT0u9XST5DT9/Kw8TU/0lC +Rln/3dx3VExCQ2fby8vS81lDPkpd59nV71RGP0Jj18nGyNXpYVfdwr6+wdhtSD9GX9zNyMnf +W0M/T9/QysnXZ0tFSfPOx8XD1u1RS2PXzMzN2FlDOTpIb93W0XdORD5K+9PPzd9dSz9I79HJ +xsrYY0pLd8a8vL3D2FdGTevZ19Xcb1dGRHfPwcPF2PtKQkln0M7P22dJPj9Y1czM0/9TQjs/ +WPvj3/9fTD9KZ9HLzNF7Uz48RG/b3N93VEQ9QGfSysbL191dW8+/urvAy+lMP0Nn08vKz+Nc +S0NW1cvLzfdVSD9J48zEwMjT51NSb8vGyc3/Tj89QV7Xzs7ZX04+PUlr6+f3V0s+PERb08nF +zetVSkvnw7y7vMjfWktd2c7O1+1fSD5AVc+/wcLPd0pIT93MzM3bX0Q+P1PXzMvPa1A9OTxI +Z+/l+1lKRkzrxr+/wdddR0VL683Nz+NWRz5Fd9PFwcfP/09OX8a7vb/J50tBRm/NyMfN62NI +QU/TysrM32dMQENP1cfGxdHpW1NZ28bEx9VZSz87R1zf2NfdVEM9PUdr5+9vSz86OT9j2dLM +2HdfVmPLvrm5vMHPa1lnz8vR1XtMRT8+T9XJyc/vWVNMV9jLyc3b/1RKTVvRx8rP71VDPjxK +/+Pf71lQSkxf1cK/yuN3VElNX9PJzNlhSkRCSO3Iw8nX92ldZ9PDvcHU61FGQENdz8nN32VT +TU1fzsHE1mtRS0ZM783Gy9z3Y1ZRW9fFy99TR0JARFXVy9NrT0dBP0Zf3+VdS0VBP0RN1sXS +6WdeZ2fZv7S0vMTL0+v/28vCz19OTElNU//Iwdp7W1JOUVnjysxvWlNTWGPdybzF43daTEVD +TtnO71pfVFRXY87Axf9WT0pNTF/bxt9XTklHRkhdzszna2938/fQvLnG52dTTExMb8jG529r +X2Nbb8rC129SSkZHSvfGxNh3Y11jXmvdyeNMRD9BRUdezszvZ1NNTk5P88zVa05LSkpNa93K +0/tpb//r3cW5ub3Fys/V3tnOzN9ZS0lJTVX308vjY11dXF9r49Hhd1VVVV/73czExuFfWUxJ +SExf/29XU1Fca2/h0+VjTEtLTlRb8+fvWU5PU1tp7dHKz9vb18/MycbGx9xfUU9TU1nz2+dh +XV1hb+/hzs3rZ1dXY2//48nI13fv49vj7+vjX0tGSE1bXGHn2f9fYWf/92/t0dNpTlFUXVpb +d9vvXF7/3NXZzMDAxs7V19Xbb+/Z41dRXGtvXV/r3P9bXWd7X1FY/3deUVr/3Xdr2M3VaV1V +UUlDSF/va1tdZ/djX/PX52tVYWdfTExdb1tOU1dfW2fjyMLHyMbBw8rOy8bO811dXU5IS237 +Y1ldZ15XXf/Mzt3r7d/rd2vRxsza39fa/11d9/tVSktOTkdHT//ta2dv/11VUf/j71hTUk9L +TmPj29/Z1NPW19HGwcTK0d7vXVJb8+tvaXdnWlNb693d7/P3d1pMTmX3ZVxdYV1RVuPNzdnh +b19NSVL/3djd5ef/Xl1v2tHd6/9bS0VETWl7Z15fV05V7c6+vb29wMfP09PIyNnpZ1FGSVPv +3N3j/1VMSU5n6dXa529dUVVf28jFys7XbVpVXvf3c11ORkJAR1lz2+Pra1RNTVbf1Nnj/1dL +R0x3187P09jfd/PRxr++xdl3UkdFTnfd3+d3XVBPX9nMzNHfd1xMS1dv5d93Y11VTVHhy8nL +3WtPQUBK/87N0ePzaVVY69HM1e9hTkA8PU138/tnV0tHTHfJv728v8PL09LIwb/J52VMPz9H +c9PW3WtQREJFX+PZ22tTTklDVeXCv8DGz99bU2vY1d9zT0Y/PURX39jfc1dNRUNSe9PV72NV +SEhO787Ex9Hjd2lv1cK8u73O91tOTmvjztd3Y1hOV3fOxcPI1ndUUVt729feY1FOTFjr0cTC +02NRQTxDTF3p63daT0tP98/Hx9BrTUQ9RFVv3Nl7W01FTv/SxL+/ytXr3s/Hv77E2l1HQ0ZY +/9/bb1RKP0Jb/97b42lOQkBFZ9fJxMXO32tz18vKz95fRj89TP/f0s/f+09ER1f34+fzVUc8 +OkJj2M/N1N3/W2/Lvbu7vcnR/2P/1crHzNp3TURKa9PLzM/nX0tGUe3Uzt5fXUhATG3Ry87r +X0o8O0NU9+97WVpJSFrRw8DDz29XQ0FRZ+Pnb1lMRUBH38jAw8jT32Nj28fBwsnrU0g/SHPc +zM/nZ1JFRlPdzsvN32NOSkzny8fFydPna13jzcrN2l9TRT5KX9XOzttfTUREV+3V1elTRz87 +P1n/2NXh92dZa8q+ubm7wtpjVFzbzMnK129QSUdn28/N011PQUFMY9/X3PNZSUFDZ83Gys9z +TUA+Rl/f2dxfT0dBTO/Xy8vZbU1AQEr3z83VZ05BP0nvysK+w87pZW/Rwr6/x+lfR0BJXdnM +zdpfT0ZHZ87Gx8rlXU1JT9nKwsLK3W1OTW/b0Nn/WUo+PkNpzsjIzntPRURO69nd91FJPzxD +UOfc4/9bTklTd8S7urvC12tZXePIxMreW05HSFrpy8fL1WNLRUZb4dHX71dNSUlWzsLAxddX +SkNBW9zL0N/3WU1KTefIyM3rTkQ/PEjfz83XZ1RLR03rwr2+wszl/+3Zwry8w91RSkRCVdnO +zdlbS0VGTvfGwMnWY0tGRU7XxL/G129cVVFrzcvcX0dCPj9IZ83I1OlXSERET+PO1mNNRUNC +R2vWytpdT0pGSWfRwL7L1mdjX13nw73D2WtTU1NfzsK/z+9rVE1OUu/N0fdUTkpLUe/Ev8bd +XUlFREvvzcfa/2dUTlhrzsLM51pKQ0FBTt3M1mdaU0tPXdG/usTO1efr3dTEvMffW0xHSEhV +0857T0dCQUZP/8XE3nNXT1Vde8a8xM3Zd2FdVXfPzmFNRkJESlH3ys9nWUxJS01e1c/lV01H +R09Z3cjM72NbWmP/1cW7v8/b7213b97Ew8zrbV9j7+PNxsfab2teW1he39HnV1FLTldb78/T +6VNKRkhMWeXOyd9rY15nc+vTzuNnVk1NTk9d5+NbTE1KTlb/z8fI1dvd2c3PzsfK91lTTU5R +W//Z1XNOSklLVmf309tjWVtn79nOxL/Iz9//b2tXW+vnV0pLTlFcY2vh61hPSExjX2Xn195b +U1Vj9//v19PrZ3Pz1czLxb6+zd/3/+//a+vW2nddZ2/j92/r1fdbV11jXFNV9+tlWVtv7/9h +b+9vTUlLU2Nj79nL0vd3d+97ZWfn5/9YVVpbUUlPX1xJSVNbXFt328bGzMvGxM3a39ndZ1hb +be/3d+PT1GtjaW9zY2/n1etdY//n83vnzsvZ5f9vYU5JVf/3Y3vv429bWXvf/2VjbWdXUFvp +329pd/tvV1n/29vv7eHR3ePfy8jP2+f/WUxHVe3d7/fj2+9dWW3b3e//e19PSU1z3ePn3en3 +d1xj6/9bUlVPTk1Qa9vc6//vY1dQUXvZ3+vrY09NSVF36+/7d2dlWW/ax8LDw8TJ2/P31tHV +3v9va1lSa9vP3elnW09IUF7f5+vvb19QTlvcx8fN2fdjSkVMXeXj3ud3XVVP/9HT2edeTkhH +S2nf63NZUExDRlnn09HV2+/7d+fHvcDGz/9RR0ln2M7O1+tvVElN59fU1913VUlFT93Ny83Z +82tXWe/R0O9fT0pCP0ph18/T2ftjTUxX18vP1f9hS0dM787Jy9Pn/1ZV886/v8PK0PdXVvfQ +zt1tU05HQU3nzcvV72NVSEz/2s7Z/19URkVO28fExs7nVkc/S2/r4/dtaU9LV9/Ix83j91lD +QUpr+2dXTEc/PUFl1c3V6/9vV1nbxLm5vsbTX0xP3svHydlzXUlFT9zMzNZ3W05AQlnjz87Y +5f9aVWfOxsnQY0o/OzxN3s3K0O//UUdX183HzO9jSz9EVenMzNT3YUxLZc7Cv8PR53dWWdrO +ydFnU0g+QE//0snP42dTSEzlzMjJ02lPRUBL4c7LzudrTUFFTF3v5+tfV0xNb83Bvr/K3ldJ +S1v/7/9tT0pAPUtl2c/N1ftbUVrTwry7vcnhY05l2c7IxtZ3V0hN79fNz9dvU0FASXfc2dnl +b11ST9vEwcXK81hBOj5O59XV3W9SREdX3dvb42FNPz1Ea9fV0tl7W0xT18nCwcXM315VY9TK +y9P/U0Q/QVXr2dned11RTV/b0c/Z72lVS05r1szO0edlTEdOd97d72FTTUhM38W/w8nW51VN +Z9PJy9xvTUA6O0/v19ffX1dLRl/Hv7u+ydPvU1Nz0cfIz9zvVkpZ1cfL03dUSD5BY9zRz+1b +V0lGV+HIx87rUkU7PEr709PeY1RJR07jzs3XY0xGP0Fc5c/R32NUSEpay767vMbN5W9j2sfD +x9dXSD89RHvVytD3XU1CRVLVx8nN71tKRk3Xv7u9xtxzSkdX387R52dPRkNN/8rBwsrvVUhF +U9jJx9D/S0M8PFHv1d1vWE1FRlHNvr7B0XtTTlHjyMTG1G9XUk3vxMDF0WFORD9DV9vKzdxf +TUdFV87Gxs9fRT47O1DhzM3XaVlNS1nbxcXP41VJQ0JXz8TH02VKR0VL28S8vcXN3fdt98y/ +wtdvS0M+P0/Xys3fV0pHRk3ey8XP719RTVNzw7q6vs13U0pFUt/X71NIQENEU9DDwtNvUUhC +Rk7TyNHvU0A9PT5SzsjO91ZPTlr3zbq3wM5nT0pMWM7Cx99jTk9OU9m/vsxvUUxGRk3/x8Pb +d1VPTlf/x73B900/PT1AWMa9x+dpYVtb986+vdllTklJS1rPwMV3TURDSFHpyrvC2etnX2dv +18DB6VlLRkdMX87Dy2dQS0xOVdzHweFRTUtRWWnMvL/R+1VOTUhL79z3SkVCRk1X3cfA111O +S09SUufJ1WdMREZITWfHwMrrb2dn++PPvbzPd1lPT1NZ2cfRd1VLTE9Vb8i/zm9fXF9rd9nA +wNLp/2X39+XJwMlfSEA/QkNR183hW1FPWWN33cbD3GVLSE1NWt3N019OS0xca9bIv8v/Z15n +Y//fzNVvU01PV1/pzsnQb1JRV2Fv0szMe05JSEtVX9/MytdfV1ddVV3/3eVZVFlb8+PQy8XR +b11bY3f/59/nZ0pER0xZbd3Oy93r79vRzsvGw833Z11bb3P/2dfnWlNbY2t33c/X92Fjb/vr +79jK1+tr99vX4evX611HQ0NDRUlXb2VPTlNf+//vzsjcb2Nnd29p99TW91dfb+n/d9PK029c +YXdzV1V361pPU2Xn523dzdNrWmv33f/r287tVVVl7+1z/8/L3Ptvc3dVSlPv811c/9/a/+3W +ydT3Z+fdc1lTd/9dSkpPVE1KWefa7+XTy8vZ1srAyd/j63dSSk5v4/9cZ21fSUhd59737eXb +e1NV68zR2tPQz/Npa9/3VUpHSEY/Q1vv+2Nrb/dhUVPdzdbb293vX1j/0tDb3+Pta1VR3cnI +0dXZ61JHSGHrd29v82tdW+PJyM3R1dv/WWHpz9nj4/NvXFlf1MnZ5+ttTkVASmn/a+/j72db +We/LzNvb3/dcUVPn2ev/Z1NKQkFV3tnf1dvd93fWx7/Hz9f/TkA/TO/b3+N3YVBHTf/n3+f3 +ZVFGSFXTyMbGydb/XF3d0+t3XU5APT1M69PY3ftvU0ZLY9XO0NXrX01MWNXJys/db1NMTenC +vb2/x85rT1Fv3t9nWE1GP0BS08PDy9j/XUxN+9XN3mddVEdJ98zExtLnWUQ8PEv/3+n3bVtR +TV/MwcHJ33dbS0xe2czP22lTRDs+X9na3GtdU1Fb18G9wM73Y0o9QlPb0M3X+3dSUnfQxsTP +61pMSEf3y8jFzc7T82/by8PL42NLPzo6TO3My/NVTEdGW8/H1e9lX1dKTdnNyMXd3+1MTFvZ +v7m7w91jXlvf2dXea05HPj5Lb9rMzdDvTTo6Tffb3f9PRENFZ83CvcHL419OVGdr5WtdW01G +RErdx8TE229JQ0z3z8vI1mtLQ0BN79nU0WtOQ0NZ2crAwL/I3VFHTWvXy8vR51tMXdvJxMnZ +Y05MW2vT0N/O0vdcSEbau8XI1UxOQjhET0tXYUlb7UdabdvDwsbdVzxPY8e/bVnjZUtVPT3N +yr21z9drX2/OzdvJz+9bODc9UePOzVvT1udrRC4qLkqyrK++1uNMZ1tJW0vav6u0t71F3VdC +PzU1OVJrzsZjX+fKurnM39nj42VGZ2NBY0xOSURANLSlo6VPKh8nSq+fn6Gq50YtJCQrLz69 +u7S998+9v797Ni4xKzpvXbWwrq3H32NI1r/D1vdnP0g9KDlCM/tAMTUvOb+vublGOfdOv6+r +qbC+SkUuLT9OvLzd1UZPzysuTbypt0ElHyy/p6Gfrba+OicfISnPtbOvvbm3sLe8xTkzKiIl +KCtFva6qqK+tuGPN28O8yE9jOzlrSfPbR0A4NTp716+tt79vV9rPx7i/0c8yKyslLjUpO6ys +qLkpHyYwtKu+q662sckvPWNXt9nnx8C1qKq0tV09MyMfHyQvO1NFT8zMvbKxr7DId0E0Li43 +Su/XzdLr1c7Fua+vr7zbzse5ra6uq7HLOTAlKjM0Ql1va+M6KjFbycTeOkL397ywuba3vLvK +UUppy7W62Uk4MzpP78XI5VM4LCYmLT9Ye//hy8fHyMS+vcnbb1Bf18q3tbzH61FVSkNZ59r7 +ST49PUNj0cC+ztPVXkxHQWPN09tpRkVPd8q5vO1dT01RPjpV3MG/xc7Myb++vsf/92VOPjo+ +U99nPTk8SePOzsTD0eljXV1b3b21t8vnc3fbz8e7vclrQDQyMzZK38jGyMzTSEy5REVZ3ExH +PkdI3b+4v9VfUl5NPTXD0kRBPUhNd86tvM9lSnvrY8K5zsffUDld7V9GSMldT0hOR1w6OstX +Y1tnVrC5wqy+wb9A20VKzvNDrrr33TlHudDOs0fbTzpBOz9fW9PaO1Tf12XG1XdIXThvQ0JX +v66suEJETeXl0Ve2vmk9Ly8tP1PNusqvu82/1b7C2UNMNjRbSjU6LzPKuLOqrKi12zk/NTg+ +S0vdwjxAQyMyRS3HxDbQybztNTpIvKWkuMq6srVvOiUutKaswCofJSw5u8a2oafGQC8rc9/V +tbCno6WzyT4uLyonJSsqNjhGurW1uMrTy+PDtke+rFPMtEu7vjNfPi7vQS334TTD2tuptl3p +Y7irt8g5MC4kZdH/PiwrQjkpMC/Koaauu1w+TzIvvLCmqNEz2N9JbSooTkg6LjrPprE7QsjG +vuM5uKq+ubbPsco8u1QsJCI4sqtBNzX3u0Et86ygo+vHrcOtr8a96yUlLShZqK21UiEfISk9 +rqmjn7NfUzQ0VVTVpaeur0I6STMqLzs+21kvRdK0smE3PETVu6+sqLRTNSMtPzVjuffpPic9 +Wb3IzL24SiwpNLKqqKCpuEEnID08zq65sMpCQTIjNbfGvjQjNVVDyKupn6pNQDg221M1trK4 +v0I9vb5bTzU7X0MvP1q+uMrCvr7Me2fExj7G2b+460TBsUozJifZRnvN0cFILWs9QLmyd6u6 +SVYuQ+3de9NvRy8jNberr98uMTU7P/exoKS0UT0vLSQzU/+9tL2xu2dKw+97XTM7NTIyPWm4 +va+pxazKzLGtv7lIVT05NztVyPM9LjtZvs2zqcTGTyzX0b+trMm4QycqKDmuvLezZV88KCxC +2bO4xLfDPlQuPnfX2b/X/+NXWNXHxrpcW1Q+PzcyP0pTz8LPwbK2t+/O619IKjEtPDdJN9E+ +wttJ07zLvb3MwtHH3Xfvwm9d4zxLPkXnzs7n48Jady5j0//DT9rN71xXOvdP1uNj2etK48rG +wWfIT1s//9O0ta69w3s9MTA7Y8Xd4c1GRT1Ib8bhzNRfTURFyL64v+NnXUFHZ8nIyndJRTc7 +Vdq6t75vQzU5PkzczcjpRTw8PEhYW9Pd520+PjxJ0cy9vuO1zL67u7a5ws5fTzszOj08Vk9V +Wj9DUsLMw85vzu9ZU+nfzcrTx8Ld17++vL3K0VtKPEdJ4+PX2W1va2XPxsHG0Fc+PC84Rltv +zMvZ0UxKNk4+X07PydnHwbTHw8rt9088QEGws29V/9xZ/+/fzf/f4UlBMTpJTtR7181TST9b +zW/AykvhTUdERj/Dy8Lpykb3Q01C2Gu9XD8+P8d7y8/LuMvtu97Vyr65tblVXEA6aUZv5Vvn +QmtZxWXv0dpGv2vD58u0Z8M93Dj7P7r3usrf00dCRkLPY2nCTUw/Umfv41Hd/81PPldPZ/Pb +S8s7Vjlv78i6wrzr50DnTNTfv9hf60fORlTFUbg/7zxRQP/UT7tpWUdEVzu6293G1sVJ2z7A +wsfTslXWSVPXOsFOtFW5RWVMyEpGvUPISL49ylPO1+NYuFPN6d61xMZnwzfOTU/hvU7fa0Zc +NVLrvt1H93dNWDXbTLBPUss+vkFXR8FJvl9bW0HMSV9Jx0TZQ2tXQ7ZPtD57N1NOMck4u8tJ +WEhnSfdIs1fFT2/fU9w/ulnFv1F3PzrOd1e40XfRLkXfOtfA/8iuTVW6Pce+RLXEV8PrPbrH +97zIPcY2K807Z8Nb7/+8P//fQq/3VcRIU0g3xP/LzVlZ/1VI2M/Gw7pWRdFHTHvdU3dTZ2NZ +PjdRacjr0ffN1kBtRP/VPk09PEVBy8HFusnR401PUs/K18xHSkJKW02+v76/TE7ZUstZzcrJ +ZUhHOEVVZ8e640Vvt7XM2uPJtLXF4ffpz+dcVTo9ODo1Nj/P6dvOb+vF1sy7vca8XfNhSENr +b2XjWVD3UF/Ku7i/yFNLMzQ5NlBDSkJGRUfr1Lu1uLy91sra38Bt49trRDgtPELvuMdfSTlB +OVtJU19Fd0JGPz5Kvrqusq+ytru9r8G63TkzJSYiKiw4S0vZybuzq6ukp7CxyW9QQUhJ005A +ODs/Ql/Kt7CvvN3Ma1U5RsO+a0UtLC41V+vVREQxP0lTR9HNwrq+u83Hu7GqoaSpqa+9y/9L +OykjIR8fHyAiMTxU08m7wrOusauuusnKY1PfTV3vY/9tZ9PJy7+2sbzL6VVJSjtFSThIQko5 +NzIzQOHLY1tAPkjOvLOtrbm4s6+pqaWqrLe72Vk/NDEuMCgoHx8gICcrNFFQzb+zrKekoZ+i +qq66ytlr+0tTPzIuMjE3RG3NztDR2/vnztXNxl/VQT85OTU9Rk0+Ozo4SExvyry5ubq3vre5 +t7GyucPT22tlV0E+NC8rKywpLi42PEdHV9fOvL23sq+ytbu2srS0sri8zOf3b2PcX2f7UUJH +QD5JOT4/Pjw1OzlNTO/ey83LxMG8v7vAuMXdZ0pIS0tLWm9jV1lUX1dvZ97e/1VnWV/Ta8XJ +61lMS01YTE9fd29349/Z3eXb1NNdae/ZzdPHxr3Jz9Hn72NUSFhPRENHSFtZTuvl/2tlY2Nf +S05ZWVhMWenb0dXMytvf+9Xj6effy8fV18/Kz8/XzMzfe/fn49Xz5dHdV1lcUVJISU1vTklO +T2FnWl/33G9hY19eW01Za/dfZ+n382Xd0t3rXf//929z38/V4/vtb1hPSFl3Tk1MT09JR2Pz +3f/3d/NpTWndys3RzcjT1OfVzcrd891391tW5+HtZ+Vv61RMXWNjWFtYb29WY9/b2+Pf2WtL +SVB36eXX3ON3d2vSzMzP2dvnX1Jd29vn9/dnXldf4dvc6d/l329v68/V43tdWUhGS1rr42tr +a1dIR1Fp6+//42NJR01319TX0s7be13t0tXb6+vzX1Ra2c7K09LX7V9VXefZe2dVUUk/QlP/ +9+93b2dPTlnTxr/Cv8HV71nt3dPa3/d7WVhd59DT3+HvWk1JTv/7b2ttXV1SV+nZz93/ZVRB +P0lV/+vf2d1zb+vMwMLGzNfnXVRj2dHj81lOSURLY29tb1lXWU5Z79PN1etVS0NBPdtzR7Zd +SsxUxd9KubHv91gw105H1ufQxs9lb+P/z8TU19tXSEDj5dG8d72+XMPrTP9hW8/fO1ZCPthL +X9VNXGdOSv/3c8a/Z7rAz7nAvthV50lIPUI5P1FG1mdVPUpP77vR3co741Jdurm9wrHnM08q +MMI3vLs7tzAu60tPOq6/tLAzRD02z3exoq28OiwlK0A0v7dLtt5EvVPEws9pZ9c6zEQ1yELj +t9+wVFa4SLq4TrnN/y7KtLqsVy0sJTytpqCgyTsqIjXF47i57bS/QkIvNNm1rLjVMSw5Pr6z +ycvzV0lWV2+9s7KzUylbt7mvSywlHylZr6mpvywqHy1D17yqqrOtPDEvJ1e6sq3OPVM8XcZU +uuFzx2lNQm9fsK+9Wiv/ubW0MykiJtyto6jDMigiOXu9rdXM3ry93s4+RcjDzcTtPNJBSesy +YUhnuLPUzr93qqtJPr3Jq8YuKh8o0a6kqksrJyBE48S061NPxMzfZzNPxsK9VDdBPUp3S09K +R1XazsfFuLy6wkKuvrWuQTwjJtOspqtfJSQjO7+/t1w1QNPKyvcuREpzwONfY07pyczlVVtM +48rBvbqs0zi5wqmv3dcpO821oK/TMicvP8u7bTw+aePNazpEPmPB381ZQlNAT1djy9dOSjbW +uLZQu620p287KSrNq6OmzjMkI0f3vb9K6b3EvDwqKDjKsb5OLSg1T7e0xt9IO0RpzrFz/7HC +qPc1SyzKtq6fuO8yKDZfu7rDS1NnzL3L30dHVU9HOC8yP9vCyrxIODgv07q+w6mzpbw0Lizr +rKWfs0IoIytItKqxtldN5z/XzrSrtXcvJh8qNme6wLlMMyooUU7RrKSoskMpLT20rKu0NzUt +LFrItL3NOV5N78Jrv77JyE00MC0wU0/CtPdWKyg+NkPbv6+ouzwmKE6tn5+r0zEsL1S3q6jT +zUtLyWe2t6620Fc1Mi85RHe9vsE8KjEtPF/Gy6nJv0ErQzDCp62q3UEuK0S+sry467uxwLpv +z8PNSz8uKi4rP2POustMOy8yOT/Hta7KPCgqLNy4prK50TNbWtumta2247C/v7rJzNlKRjor +LykpOkHfykVILyxfPEzTOLew37RPO1g+r62ssU1NP++tv7y/17a/wsfJuMfZXT03MC4pNDJF +3mfeRzI2NGPI2bzTvbS0uFNMQE24sauyzG85b8K4ucxeVcK2r8xIOTNBOzM7LTEvN+Pd91M0 +ODk6RUzr1+PIzq2qrb89PzjBqqqor8jlZ0lJQzrMz8HDZVFAPEpLQWc0R89IzGsvM2s381Y7 +777VzK5luLDTqefHs8nHu7G1uMdGXHtX3chDOF00azo090FQa026O09MYc08TznERUfLSLJT +sLZetEnzssSrZ6++vbZVuGO8VN86OdssSTYwQDIrSzlVPm0v4Uk6zDjaaz/Qv7G+vtq2Q7pG +3dDK4fu2V7J7xFW9QL9nZ1Q9wD3GNOc1a0JrRFVfQ8VX0EB720xvvtDHvM7O7enr0mfK07/I +a8Xe48bV1XNtPd84zj/ZRVb3T2tvS+dPXE3pPctHX0xB/+PV40q3SbZKzEPIyT/LN8tU92Nd +yG1La+FPwVW23Ne4XcNZwTrHP9BdRlRETUPvWm0740e/b0HjXMxbzMBKuN/FSMJvxMZKy/PV +UsFDe9HtOXfZa99KsljEzO2/493r0NnATbdD0jbzPt3jPuVEtlq6P70/uTxT60zaQL1PxErn +OOXlMtM0zlB3R0pZPnc32kvlTNFFxvdVxVddV10z3k3v69NjWsJP88lQxDjBO81X6/vnv1LR +5c02xDPPXnfJ77blvj67Qs89yfv3Wul3Yds6z+vYe+NXVdNYytzMP89MwMtBvsvKxMg3xzVb +TXdLXVxpY0nEMME/xsZV6dm8T7dIv03AXUjRP85CwVK8y1LXVGn/XMftS8s9zd86Ous8vknb +Ot4z7XM6wzPBTNtOO7pGs07SyEvOX+FOve/vSk/ZQWdjYbZvwkfnzVzMXc7Mukm+U0jbbT7r +1N3lQbVNvNPFb7mwQLvIWLlE0bs4yjRt3DbJO0fANs3LL9dGPb9TXE7jc3e8RrrOQq86ybU6 +s01OtTy6SjxNX0tvbW/P20tLvzO+b0W/Qla+L0q/S17ASl3FVP+63cK9Sc7zOdQzPN49c2NF +RldCXMdRWu9BY8ZFzVpZwdbVx03n2sXVvm+/xGvUSUvlzd3YysjfxUNC7We+usbjyj1XSEpS +Rk9F607/0eu21b/Azc7rS+NlZdlFT0VMyHfF1eG728tMTUBXZ+v3QUU4Pz9TR19Nzr7Lv0M8 +OmHEsa+94TQ2MkVOT1VFSOv7w7+5v77T1PNKPjU+Tnfze2dv7829sK+urrrIa0pvQ0VOQUM9 +OD42VWtdys/N0ddXzsC/uL7L31NLb0rMa1/PU+NcTlVV23PRXktRQUZdzrvDwO9QSU3lwb29 +xVM9MTdAU9fZzslcb1VZx8zH09XvTE9ITFrf385rX0E/P0nn1c/OX0tPPlpp3dzO1VdJRElL +42/f/1tJVUta1dvPxc/KzWfrd9O8v7+/3ttMTv/c2ettSFVDSu3nu72zvb7JY9N31evcW0RC +Mz88a2H/505GPD40Tl931tnv70v737y4trbAxu1XXF3nzOfEZU9BP05h1VvRTV1HPz9AZ1zP +a/NEPj4/U9nMzcne72/71b7DwMHZ/0pFQVnv88x371NFV0fp08rL2VpRQU//z8rIzuNcTk9Y +3czL3edbRkBLV+vGyMjR72dbb83Hxb3L2W9NR2ff38/vV0hBPkr/zsLGw9PfWVXj1cvO03tN +Qz1FV//K3+9RRT47Q2fv39NZa0nfd8i/w8DnaUJERFPj18/e911KSVxzwcHJd0pHUvPT0V9L +TEn/y7/Fzv9YS05dU1dN2cS3sri/50w+RFXl6+dJOz4+RlbMx8TGyNLP7e/fy8HIzfdpRUVH +T3dv61BMQz86SG/ZzMrM3M9z59XHz97Wa1pRTV3PzcrVTUk8OVfjw7u/1+9vT1ffxcDD305D +Qj9AU9labT85OTs7W8i/vc9jRUI/Ud++sbW4wM9aT09czNX/d1xET1ddxLy8zsnOT11OTM7P +Y18/OTg/RtjHzNDj2tVj08S/urTMz9FrTc7F68BLM089MUJH4bvKT2dXSkhtU9fR21/HVVVn +5dfOVkc+ST9S6+PK00hV3Ur/1e3DytpO+2k/U0xjwMvpytte71nhu8C93VxDQU09aczj3mdX +VW9N29PS11RKT0c+Rk7vbef//1vP7XfAxsbKTc7tUdH/zL7Oz9Fve2NTb8rz81tHQTxKU8m9 +7+N3RU5BWdXNwcnJyu/jTE7NycjOWXdAO0dT18FvVFVDRjxSWO/VTUfzPHdbP7zP0MJFXc9E +3vff2j9VTl9v69u86+ndREJNQ/fAxczvRl9RW3fz389n3/vRVctjxbjAwMZRVUxO2MnBv+dh +Y0lrTvNd7/NVZ01fTEpS51tr7+PczOPL29DOTkM+REhIbd3M2FdpUFfX98fAxMnj729T32vJ +2uPZVltWU+fRv87ca1JTVV3V2d9RPj89Q0JPTsvz5V9zQmdMY97Vy+9RWU7f3ci5zs1YVETZ +///A1+XdPVhARdFvv8/dXEBDRUfr3rzO2fdYTlRfVcfJysv/ymtvzcS6wdHvS05Qd93RzGtM +TEhIS1dnY1dJT1dHV0hn5+Nf2W1n2fvZw9TOSk5dS1tr0s3Fd1PjTOlpRtJGY15D1f9rym/N +2FNX62fY3WnOVeFVR+NPb2Vf729JR0tS62/nxefH0+nOb1nnSN3vVtvr2tFPb2vR29v3zFVN +VT7Rb1DP98nNXl1d///nZ8Npd+dNzNPNy83B3dRK2mNP3D3a52/PX7/KxdHYyEdVSU7LXNnn +R2s8O11N81lMSkI/Q0hd0+XN52/GXNe907vve/9HUURzysTH52tDY0JMW2/K9//dRVlRb8rK +ydx7b1xbb+XT0M5n0/ff3t3Ra8xpT3dMRVd7xtfJ69ldYXdK0NPpXndl2f/zzNfeUUNHd1fv +d3fXUltRSGtTe8DOudnzd2HjU8vjxtlrW1tr8+PYz29UP0lPd+vPzs/KSttLV/890mf31UNj +Xz9HREvcWdhZQWU8aV1j++v/c2d7bdHCvL7M9+ll/13329vJWFFvS2dX0+vS6Wd7UWtU5+PM +ztDbydPr0NXR2tnU3Hfbb//a995lX0g9TUbP1tTXX1dMTEj/3e/PZ9lNZ0VjzdHMzuFOS0Nb +c83O51NEPz1MVdDHx8rd72lPUv/rz8/O1llMRExf43v/b0tPUVvHv8fG+2djXWfZ18Hn71lN +W1NVY9Tj2GNIQkJCVtfpzmNeTWP/58u+xr7b3/9LZ03Tyr6//19HR1d33czM129ITFZNz9Zv +a2tX5U370N/B0f/TW1djd8jF299TWlNJQT9P89vf+0xJP1jhz2dPQlPd19/f2czJymNVSU9c +/+NfW1VZSkxFSczMw83nZUZdd3fGy+POT1tZRmnv2dbO5fdHW2frwrzFwsvVTlNX7+Xpymtn +Q0tP3MXf2Fd7XklHPUZv2e97UUlGS9nLw73O2l1OTmft0czN0Vv3TGdj38nO1ftfUE5TXsrP +119BQE5OWd/SxcXPUUk/XdDHusfXXU8+Pk1SxsrLSkVAO2X3a1/Vd/dTPkRU4cPN33da/15c +/8/M22VTW09ATP/Evcbba2NbW/vQ0cvNZ2NGVG3rwtXV011RX1fby7y+0dhz90pTY9z30d/3 +Szw+RtnPzednW0tHRe3Zy97XT0dDRm/Rv8bPe91LQU5P19vV309KQUNA38nIwtP3UUdO283Q +b+ffV05HRHu/wr/Za1tDY+PAucLJWVtOTk1e59PH5d9IP0Bd2MZp329XTDo8X83Hy+ddY1xT +1MnAw9vZY09DTnfBvcbbb1BFSErXy77Gc0I7SkxYY9XG0dtYU1l717y7vM1rVlpXa/fRy19v +QklCSPvWw9xDQ0lEXWVj3P/ZTEg/Qk3pzdXIxuNVSz9N58zBe0tPPlFPb9HFyMTrVVtr3b/E +w99VWU9KQ2/Xw8jO41db7+fUyL3D209GP0XfztPZ5WtbVkZP48nP505NSD5Md9nZ62VfXVlM +Zcy8vdVeTElh49fBw8bZVEpJS1tvXl/37WtRQUNLY9Tj71lNTV//zMfMvb+/20ld7ce+d09P +V1lFRFTXx9ZVQ0dPUVtt/+f/41tGT2nXw8Pb7+1OTkNEW8/L2HdTSkhf987Mxcn3X1/fycDA +zNvL129ORV/YwsPaZ1FPVd7b5+Xr0NdRPT5N99nW2d3lT0xW/83F1c9fSUBCXHfb1uP380tJ +XVHW19zaW09FT3PZzMzR7+NaTk5DT9vnZ1JMRUNOX9fGzNX/911j/8q8ubrQ2efv7//rzthn +SUZITlFNY9t7XVNJSUVQ39XO71Xv62ldd9zBx93/UldfaW//5+Xt/2FfX2nZx8v/+1FdaV/7 +79XI/09PRuXP0c7P69pvVVFKW2fbzNtbWUth/3Pr69n3a2ddd+9v2vdTUU9PVVdt69/la1tb +UWdjb/Pje2P/Z2/3593S2ePl73tz/2/n53tbUk9TX+ff3uvv6+Pv0dnPysXL13Nne+3n6dvf +7XdpXF1dZ2tvWVlYV2FXY2n/6ef/d2/v39/d3eP3X2NaW2l3/+//b+9v9+dvZ+/p5ettb//n +/3Nrb3d3729nbf/Zzt3r+93naVtYd+ttW11dZ2tv8+/j82drYV9jZ//j/29nd3N37/Pb3/93 +c3NrY2d77+dz93d7///73+H393trc/f/+/f/7f9tY2N77+/j6/fz9/v3997Z3e///29hZWv7 +9/f7d/97d3d3/3d3a2tjX11n++/t9/9zb3dvd/Pv93tvb21v/+/r93f/////d3f37/f3d3t3 +b3t3+/f/9/f3///38/f7/+/z/3t3//v/e3Nvd3d3d/////f7//97d///9///////////+/f3 +/////////////////y8= + +--Where_No_One_Has_Gone_Before-- +--Outermost_Trek +Content-type: MULTIPART/MIXED;boundary=Where_No_Man_Has_Gone_Before + +--Where_No_Man_Has_Gone_Before +Content-type: image/gif +Content-transfer-encoding: base64 +Content-description: Kirk/Spock/McCoy + +R0lGODdhQAHIAKMAAAAAAP+2bQAAACQAAAAASEgAAAAkSEgkJG0kJJEkAABIkZFIJCRttrZt +SNptSP+RbSwAAAAAQAHIAAAE/hCISecQt+qtJf9gKA4EpmVXZqasZREHp1ozKlJsig38yv9A +0uAAGx54hUHSSBzCns3jj3hYKBQHae/n2+m4wVx4PO6Syd5zazuTVdq4D/xGl/uEBOEvT6IS +YDt8ZzhbaTyAYF0rhD00YkCAMTxZBlkHCgsGlZaWlZt+WQQFfqMwDAEMDpWCamyuhq1BWrFT +sLS0bjV1OCUhbSq6KF8mK39UnkRFlFTJMZKHMU+FLjoYodRzJ8JAXoFESzDLC+MMDQsN5gwL +6uuoqJkIluHzkwfu6t93Yc9Btq1efKQU8IcEyKwxMQbegvMrzq4Rb0A03EENAwxNoDhp3MiM +06o+/mmItXC0rdvIRBdYTVLWaZ25KuNinkM3Dp0DdOUwfdqU5wilBuUM6FtjRMKwMEMRCkgS +g+CPAgCmRFXjQyHVN9lEVsw2MeIGG4RIIjqwKgsTshyzLFCrdu04tvKOOCRaQ1cuNWiRtZU5 +DsECv35jBjZXs8HNcpnWoj2SR0Anqi2M6uPjKCkXipwcD5G1g1/Cpf4OTB0Ci9hX0w8hWmzY +lcbinhgrOSY7IcvstGzdGlBchRMiioVsNKq29egeSgYaKGjQ+23veAigR58e+C/fmUCzqytL +GqPjkCiBi1RiqNuiIQCcbULmyUh5bl8QGkU/iE7W0/edYI3YqLPjEpo4/vaJM6K5V5RrZ+G2 +FyXcjEeDVnaYQRpy5VSoWAJZxJPFKAdAVwB0HU63ll8w1TSThbYRmJ4EMRiA0jBmuCDhF6Lp +RZaNnZi1mSgF9bgPeGd4cAKEqUUo5JAOGSOAUOyhtaQFBD44HxvqKWiJc0gJh5oLQjaoQ14G +pIJYhxoVYOaZSZx5wCgcZtihdXC5dU5QZXnnomsPAoNaMAQt5kklFWrnVhW7fXKGT87cwU8Z +Rfri1Vd2zSDadzWSpUCT82khgGRZImHNZohactsBOJn1BxhsVJRLGjcqwMAp5WxkphK0ApGm +Emta0qYlJDbXGzo6eQTqd3meZ1KeU3i0jCcu/lV4EzrQQvtsAwOaZa1j6QmQh0IFujLJpjfc +R2SjGojWS22aZNIJBYmWJ0M1pI2i2a6c2EStJfAZK+O+smjyqgOw8ubTU7XOeiutabK55iga +cqLYw+ouJtqkFtyJ6pbw1qMJFhznpF120JYTbQANkHwYwOMU6ueEmhFrSLcSHBmuRKe5wa5Q +k9K25BB6/cninl2V9INRcQ2hoTWkorLTQf3tGweVYcIasGcYLGHVIwlvdmvCGzqs0XZNyeZi +u3qmGlY9rn6cinYAowLw24bZRPLcJU87pzmbMCEgerZ4cJnMNG/pBuBvGAAAkwJmG8ORlRx+ +waTiKiXVJFFtJHAW/yW/hIkflMGI1SE8u4qKyJuk51PVnqZ+8BIIK4HmwgubmavXOVIas3hE +rpHFcrCaHIAD7gQg/O/AOzAtOiQbBny054yznBVvKabXDqwTRcGRDJE7AhUsGh4VRpVD6Ti2 +/DLyLa2SnC4JDr1dmQWLOBFGVsO4Q2rRjWKmslbpTUmi0NXmsVVBljAwhKkJTQlaxoq2go1F +dIZUpxie8fIXso9JK27Hi5YGm1cYaKVsf99aH2mGQziHaEtwKExhCry3ovQgYyq1AcCU/Ca+ +8zRlM8PyySa80Jb2OWMANQEYTNbTGBmVbQC7edU97mUbHgLnarTYGutGUbCD4XBCy0CWqv7m +sru6AcxCGhRZyda2G+xo8IxoROOYPmGCZ0xJe49ymggKJCD27FAS82ljVLhEwy1Ya2Dpy2Ky +LjcqmlwpYuZ5Wh+UKDXeOG6EtmIEQapnq9UVrHVMcU8WE0UcRaKFd6/ioEzEmIrgIWY3pGIe +YfiSRuXFbXMpIp8spnKkEtbBLuA6wYry0iK0LNAaLIpKCXOAqNmEg2W16VZtzlEJR7YFlZlQ +WRGJMwUF3COU4HuGFi/WnzBYzUdbI5g3cZgjimmJGmRp1k2ix8p2CC+CiFnOJUokkwSMIwGA +AUxhjicTZVmjM5KxZYTIFzgZ6Kw2BPAEBcaGAQ/IcAQp+KFGWP4WKlbARFmLSRlcQoEXf0mN +Oe1yyjQs0wpKgtN15OnRqGSTCEUdIFCJ8WFMqoCT4Z0CC+7bi2CoQ50OPoudAsMZ0VxIDId+ +QDIw6xKSZACgFMlmYooTKAcINDHNcOSfZ/knRiUWMUpEUz294NmNgIKK5XinW6gCS9nGsxAr +dqpWBskLtkaKLgiaQ54PO6RyPFiqprDIYdaJCT7ZFJ0OvkQjGhJKDgRU1AnIbA4lnFSA+EXM +Fh11mBKJaG2ueBYeEet9DWXLgKqFG6Hw0IUvzQkl5vqg83ClWOMcQ/VM2o995AhnsrRGJUAW +z0H5kFR5kWETa8GJ6tjzLwgwU3IRgP9P3sxLdviahSFuZx9s+dJFD0UhWm/kjD3WLJeO0qo8 +crimHkBlQgEx3XokRqjRcjdRE4sasLJYmpbWjJpRFOBCGnQbhT7IT17NBHME1l9LmM58wMlV +AeyZzw+haVeoe528SKOIDoAXcDfSxGStSzjhulChQpVjHId0GUqNkIezpE/OeCkqQmmkWtn0 +F8CUo0AKm/NprdXTjPbLYxZUiQEMIlBMeUNaOnK4S0cI59WUGx184jO5BtvQJOA6K6zSZwfU +rQOggKwzGT5Uxzn7ky9tWct3xRA96fvOCNNcG5dtcmzu3ciW1RWmMSrnhabJrr50PC66nOGb +uDiKgOYp5rT+gY2lkLpAl2ohwG8mDDAOfvCZqpYGqxFwXBUo8wbQQichUawCn+buemLIAakS +dACPLdD6bqhZipAvRaVNC1AYwLFZX2FdrnZg9iDyiEH8g1G/+CsWmMU7GhuYNVoZ1lOk2Gg2 +PRg+UBTnmiPyUCEBTgXd+xO29Iwt0773TyHegMwei2ojrkDVP2tzdyn16omxN9a7e2f88HHd +1vBnoPAJzmW81Q+2Nk0bn4QeTDcXoE/zp9dwRWnrUippYOcbCZ1AtIWvJ+7rNc6h38NBMDNs +OMNp3NQF1aNjG/rqVyNVmN8pspzfvY6PcnnYZAFLeCUJjIyJRw2AnkYnZSBcTIj/DmzL8Osc +MibtM6GUtv7mL7+hawWDgwvkoDac01VAFgnE5n3iKrXN9kU0Ne+rKf98Kmmb6avLmY4ss0YF +tZpOiXRPhJquvYP5OjX3fOmrA19KDyPZoRHJvEu2y164o8vw1pQSjKZ3Ro1RRy5QGXZcqdc7 +nKWGnd2sjzy8SESznuHLbp1JVqxem2lQLUfWzeE0NpdPTb74DVeS5MCkrobR0MtdBVgxZz0e +RlJwTKJkHyX8FrMKgplOxOWKb2rxMctypj8ApuQMW8TkyoA5jwRVismVUjgCLDpK1Js7siUn +XfUEt0Ne88/F59eAf9G/77ukWTuyhZzyFpBiO0X91vYp/muCshQ5tMaPUxfq4LUBGiZ5BnAF +HjdQyydV5UYfj+MBjcN5YnVHo9JPIONBS1MvmAA97GE7OpYf4GEI4VRSbkV4DqQN31JnlAdV +uYVJwEEGJlV/9ddo04FPsQNXaiFmmlZtjBeAqUdqO4NbgNI4pgVHhLBqwSR9nbdSESgxzLFX +I7NB+wNrzQF0wcWDEGVCQ+EFAxGC4pQEIrV+CAJ2WRAr7+NlkJM6BrRwRSd4loQEaJIA9nRc +CRBpBrMEo2JtjgU4i7eDHeABlUKAw6ZYROgCTIIeefAz3VUlLEZazoMdIkM3wgMs0pNTVgAU +X1Vw2LML2fN6wXd4mGQmlYYG/51UDx6xJNHkPZGXJ1kjaQbjhlT2iq7zhqwUhwxmdG44G4h2 +O172dLn0fyHAcbrlS0TYgFUFdp/iboOWfYyICWcEPMMjPMUTAGxnOUlDa18FLkYGffbxCICU +SbOjMC74eycxCnfDAOulGAu0Dd50JvoXiwTTia74YH7hSuiQAA1gj/UYHVaENI2zfMbXi7zI +ARrmJKL2UE4HaploZMqXZmQRDjD2Yu4DPeZQgcTzOxb5AA/wO6vEEWS1HeI3KQD4XeZTQOjj +NQ3DNLTVb7jSDq+iDmcndZWnhQakXHM4WHPYcAkjj002jxlpPM+SQfcEj0jwYaKxi7qoi5fn +iwi5JP8BEm7bJmKc8pT+USWfVSflRI1DNJEQZDyZ44wY+YzQmB3RRSj3AG4++I8PIQYDYTnR +UyawMILepBY/RxuLIUP0F4sLVpMLpo8YworKZVg34QAZKUGBKS3PUotCOSFehpTZhYcBCDge +5yQ8Mza7OHRxUJR5d2ZGgAzhcJWfAFSpJEZyE40YOZhgmTw4VS8LMDq+1APjN4gsQEBM0Ja/ +xQ8heDCzwBTqxQmmky1VsRQzCYd76WRwuABOxlzMZU+CCTxfeZqRSDyF+ZP3OFis40SM15j/ +l2XKJyQ+QxuU6XeZRXKY8VeKYyWA1ZYDZiJnNDfM2ZzO+Q5BhjnWxGU4I4j/SwVHfrQUtONb ++AKDPZImC2Ma7iZ+HGabSyGPcMhcxnlG9rigyiOYpvmew/OgPmkTcDidyeVNMWSUx0dxSllC +2uZtfoVpczEFlJEinakgQCUTNNFKyFM3F+mezrk5o1J7ZjmENzaIW8EU+4kza/GOCASgojJV +LUQg/YhDsvOGxTkTgemTTuqTpZmREfqeXsSVN4GP9iicdugDybeYXXqdAamDFTOQFzeEPsga +VeUaOJOicfIra7FKzdOiaEQ3pBkApWmnEuoAiKQRVvCAe1SUW0dxmvifCUQ7DIcr0MWjutZQ +ZlikpgNxsUOTC3aP05kADmCpT2o8USqlEgqNJPMA/8sjLXB4qQm6pQVRlIyJcXiYfMy3G5fi +WCWGaoTzOJvSC1RVqCvKoobVSsnjOzEapZ36TrHkER75JID6XWAYLluwhWlxdqyGSYiye2WT +M86aHlrzhnmZpZZqqYb5pJuKpxIKqtEYN9FyqYahpWklFEa5rl+6i0kJLhpmgDckqPsBFgyJ +RW16HerZjMrDnr7jjMZjp5t6pxJKhbHRck7SoWk5M8LnRIk4G2o2QMBJK5Smc1tglzH0gI7h +bDfZZHC4rfd4qZnqpN/6lSZLsBV6PFlKqvdoqlQEqBzKqozJi4yTWgfFQKbhY9oyIQnSK/o6 +kUBbrlDqpBZZtF45sMAqof/38lfNFBSfl0KLKjjAV14hpBmgQk73Jwa440fuJjFn0rHDWY/c +OrIkC6GcKjxSeqdD66TlaqE3KQyJ46XHF7M0q3yTSWsHGTiGKAWI0pkQUyJplKmgiqdTCpZI +O7DBilNM6T4D+Vj12kD1FYriOAuqNhv1AJzR9mdSwCUSYw2s2GTGubIUSrJIS7hIu5ziCp1p +9LFemAIFoAlyK6ZeinyX1yrb8ZpcwYBa1ZnRQU8xMZHY4a2HOzymmbaEK7AYabadCmQlgCjh +Z5fCAS9yFL20IGVTlj6gMlHCd6pTMATOcW67qStmcpM1+bEfe6UjW7pnu6nLCbDE04x6Op12 +OAX/6rqYc7uudQteSOQv63CANCQHNSebxVV2HRS8mlqynTqYJ4u8pSuhlfA47gNz+LEGtiC5 +gwdI0dW92Ys0Y4koPHolyaMO3bBVn+uxozqqgluayqvAJ6vC0Cmd0NKg5vq25lWGs9uh1ZbD +WaZhBXiKCytR4nVIviunFAqqiBusnMrCAwuhnYoFawYXh5MnlPspqPJHoXI55sm32Ys5liA/ +ZzQTp7kAWoiLnMCOSmq+aEy6DXy8pyuuFapB08K658FCs9ulR6mwAGCrhXJx79qDwNEYY3EW +1cFKNnHA3xqs76nADHzIzukA6tMJMIc912tVj9wcELMAAQuF/MmnEZk0/yWDyO/JZVssK0qq +j9SBxvYIpYccoW38pORKqfiIycI5HKNQxzp8w41prBsDu2QWgJwhwEIsJ7s6tM1ZuKD8jHeq +woz8jE81aB7hXd27EZQCuIQBvNJimtHIlYaRPNs8Ms54zFRqG6NcxgvGjsl1kw+Wxqoso8QL +rMlrxM7IVxpUi2Zjy/eLw/jbbXqxQDL7rgZBXAkizL+7T5rKxCYLzqdpvOxLsGDJHNKXF32q +gtN8Ysmifbv6oMaMyAH7zQhtU+pCikHXIWgCZej8uedLssTbzi38ztpMGA1qRuhKDbbMrvbr +rpsSG7zsrka1h+ejPjUaDwJtRsR8vB2d0KZ7uP8yei/fIWy8vCkRlSDDwi65EadCi7gsnNDt +WdSniQWVs1Ubon/lPJx9gaAofMBEjcDFYzcHEIf3tErRMRyMOtP3nMM4HKIZILv5DAac90ck +ElgDXchmm8xajcxpu9BGPKV1AkoR4zdYhLWL0rUwMY+AbdYqjbZXPdhgqQ5YYF0tQc5kTaH3 +CNbJiamoa9jwzM2HlSGj3aD2FHx8NNN1PNdLkmFOt4cKiyDkEQ2holN/XcQBm9FFrciFrcxT +yhvXdCMelixQPWV8gwI+8buAfcTGq9WfPDd000+bpYgbYnTjm8oHXKHGSdIfi9GH/d2qaw7P +dsYfiwAwAtsxG9tWx8P/Q3iUXzqSEsWWAh20T2rZmG24SE3cBHsvexfRRWpVRpAgWKXFu03Q +h73Awc1PqKQXONHMUrjdOamchgyhXBneJuzdqFvQ4K2XwSdFo70A8xt57p3i6JKMq/qui9a6 +JMmnutq2XimYAtvfhL3I7yyu7nkO76RatLF5E0VVV2UQtxFEgS3cx6zCNIHFbfHJ5bBL8CW+ +Z7y24vqgobvaHu7GzNOXOdk+OTnaoBgHKe7euSR1Awim+GyCLXYW3pvfVD2yN47jDHzUKlzQ +pglKTiuM1sWzWlAvHsQJ03YlDwquho7IoEoYvWtg7oY87xQAjTPOkfq1zDW6TX5cpPpk6iyY +/y1qnJLWXB6kj187WP9W5mb+PVVXcfTNi8z9OLJwnvsqtOaN4+58uB9u0OQQhbg3coL+5128 +rzPVXfhqE+yM6Ff6FxvC62rh6M/I1YBkBE726eMtP5F6oaR6ziftk/dU0h/iZB607eObnGPu +N6Zuzw6oYU9C37lMXT1gLVB9JYM8E0Jd0HWu1cP93yn8AIPygAOoWQRy4IdE1aIkzhHVxcRe +2IfeznpKg5OmU8wOlpvNtxqhlzXZ4ei8rOHOuh47tBjqYBRPg5bwsX+RreydeuUe2wsVc6ru +oTq4WDsSVwQA1CzKV+fQpMuZ8Ahd60jdvmY9iQoUEZnxPgE/0KJ0NP+UI1yIZ8jFLrCEwSEa +Qsga9IzlYF1amAXrjcbL1Y5WYxaULt6kfZjcbnTYYPUJylxj7n8nX98JtfJ2XN/RPBttMpvC +HLjKM7hL39E6f7qqLI2M249QokkpMptvck/hPYdY1wgbYZhLj5HmoOnX4RdOBhMPjwppagTI +Xr5oTIfDpxhNjlx0ONoVKpxgrdds4PRxyN5tkPY33Fo72K6t73rPOs17Iadxnu/9rcR67618 +38VmtXHhi8GWjFzT0YmlIdWkss6Gq6fGufyCNem5At1jBGSOgDkjgsrrvZPYsexxIxijTtpi +y+1QRpAJY74jn/qqz6EXUQI7rdMcOpLRXOH+19FKNs/GOJ/A/83Sgrv7Y5gTfi/7uz3AEHBk +GdWOIqilZ8gkccbnCc7TaZakSRZ4QahMsG1PWhqeCQzBIVg4NAINBCK0dC2dDcfDOD1BHYFF +oaBsjUYuF2sJ05UP2oMzUbnZAG94XC4XAOoCQx7ovtvj/Tabi4qcIIEPiYMYGJ5GRxUvr4Ar +k4BKFMzMkk1OzqjIyJIFg8QGBgaFAwM7oUQJRESz10Haig2LxASEHZJMFZEXFhm0D4xD3LQd +IwZSAMKWo4OkJcimEJ6WRuWjyaMsLS4SKRVsJscdmARF3UWKm4G6Ofn5NtXVPrs7/L/84w5D +D4iClEHnyKAXKJP+riysVCLTQ06WOj0g8QmUKFcKAjAYxQqAhIGJiLhydShgrWK2UooM0QuF +ih3BxMyQMeFVDkTKTh1wlmvKBCdfnjDJ1ogbjwVnClBDqEaNQaQrlEndcMjNPKx08Ny7+iae +V6/6+ln9ECSWkFhJV6y1cpBHqIUSHVrSdGLi3YqgxCUtdeoeTxwkcwgGifOkIlKDA4o8s8tl +CkgOXoRIknDUAgaJ+JY6kbmVgF1Ghqnx4vSLZCsjqgQAurRL6V/AromAyhZplkBfs9K7oUef +bj/5wI4VxBOtELOKF02FkvrtRYYON8m9W50iRYt6pbjC/ANwSMLhB/JVMEoRxxWJSWr+QdPl +0iQri3Ql3NiAIAP7Enhs/PExyIsrkNgiqNKugSKbSFbjAQQuWhLKhS8amQ0hR45AKqA2dqMn +rDwUUGAPfuL5Src22Cjmpla4Y6QRhMhpEa67qLNuIouu0267RBRoQAGv9iBEMAQSSYI70TZK +hRT+1NqMsQJgiOKSyFoQwckrUMCviBOm4mUjUkJaIMAZZiBwhAlvDDA/p14DJhIWnyPHKCNg +msEOeIDT8A8bDFDgFAUG6IcOOEbsx8TPYClMkUXcBKW50yqyzi4TZizhSTPnWnLHPN45iztF +FNkFhpewiOGAzk5QZIX1tpAGirngE0qoLy/xoUr8OqMvs1j/oDkizAYjgy01cSi60AnXHIRQ +r0UpVMHCFRCo06o7scJhT7+62sePq367gKSBwEP0rRSwUxZYRyU1V9xQKKIrS2kkICVT5MIr +41NtLMTEKGaNYHeCJCp7LLJ0yERtP/hM8QUF+5KDZgX2inXQIgS9mJScydKkTUq4TnOOTW1m +MNFODUXM8xS/CAA5uEBzO0YxAlD8QIYVI1OITQe+BPa66aSTTiIZJ0ZXnEzyS2qBVHh6oyzB +hk5UGzL0xfchLBicYakGrnsJlIclNghqWrtMIyH7PgDnCYmRzWsFmbLQhahjzZbsl8i0QTsD +C04OuTdqOQIR22tDhAeDHxPZFFFl/iRRLVmzcdY5Up551jnx9zYaekdVANgjRU47tU2qFaGG +OqkEwKEptUoaBeM1iT0PNRoQoKlZpC0aFMFtSimWaoliyaU9QgolDJ09NqKV1gCSmQECZRHl ++U0Dk2IZ6TjCFWXU9GrI7YSuSLPX2RK3Iz+BlKQya8Yqeb9tjnOjqlS9WWmUCBP17H2F+0uJ +vcfkEvXAdoVXotJ90sY3SSkESwkH1nZHM98NkAZdEV5Y8pQ3VfABZYASzjFWJrjPqIg5bXrT +I6Z3kemgYHFz+VkooHYl/XzoDcbBoJAm17vnXA9q9vmU+8T0Gulk7HTpUh0mPLOwzUyNgOYo +WwklVA4C/haQBAfxX4vKQSwi1KCByjMAZnayN+UBYlCBi0UsvHSqzdVGGzV7hDiigL3qQCo7 +Jjxhji7HiuQIKUiFww4jimi/SRCOMrFTAunsUr/eza5VPcxPW+aojt85rG154dhbcKcLLmAD +KdmAH7IO5BQ0SHGKfAtCHsSXqWwFSpR8Q0YLW3GiTy3HNgXRUlRYVD+7oNETetFdJfQlOVUY +Jx8sBBIMEGAFYdHvf4SMwQv6FbvZ/QtoERJmRHroGQkVQQJCnAYR3fbBb0CymmmCUDKdmEAo +zsluWeHDVjz0LsBIaw7HONFZvJgTwi1naJ2SZww4Jz8bzdKScauGKvNjOa7A/8MwckwlqyYV +ETx6QxhLmEYSeKEaEQJtZiDsoZVY4IJf4gcGDZMdNbxJsy+IiY9js9hHeyeZNG3BHePcjQAI +oAcPES0PH5ngiHJjC5eWjyTqWJJO45koXtwMhAhkSz3naQrztMIZQfgIkFL50EFW9AHpuChl ++qWE1GFCohOtX0JRkAoW7MIHASiPUkhqIIxND5g1a1hbSUrSV47LGmoAhyY3KSJVkOxD9iBn +yix4IsUgzT8+9Wm/gPrBNUYoKr686pA0VwTzNINOA0EEOOhZuK3G8nNVbUJjfynI90xEIiBk +nOo4koYD+MAHF2JPR83xQYfYhwZauEBbp/YCtvjqiP5pUoIWWHo3T5LMHkbTIrbGYgucDC4R +4PEWYQmzi4LKT2Py9GwHklYSOmGOJDQJRgy9irDlMFSbWH2MCJ3JVcU9kzNj9cEEzpom7VTB +Y7eY7RaUEQMn8s6RKd1CnTYJljqQ4hRG4is/AFwiXBSDCIHLIBCUCp6eSqCpy8WcPacSt9sw +FkWLScS7NtMlHAx2u+0Lgc1Au67ISSEdcw3r+3AIEetQSrQn5IvB+IMqs67tKdI1ATbOgIGG +hQ5AHcwXoxxR0qX4lkTRAsRWNuKXCB7PTtoiBEDaCZIQf4CmRNJSZJf7I/DQqy3MJIMrzkKA +IKU5wkol7nrS7D5GJHNnzv4M5lzHoM1rlFeEk2jVQT+RMxpXUV9jxTF7ShpXYXFum7PZYIXE +aGe6esxaBvBTA/NEPOEu11qcJEshBiOQlmVwy5pR2g50VGYsx8tLYm5LVIJ0AAJU2cpn0Ix9 +8qMKeGQ3zCrtFzWayThgfwEdJSZ2r/P8JKgddHF//rP9fmjj+uSHBu57SsRgqI0nxOTRjxZg +N3UBPAbetZOpPQVf8oCWCf7JJCsDyAVXSFOBEiapSUGnejxCEnt68EIYdMbf/lacb7krB3YA +wqZ45dCqdnXOdSypVSMZrGQPM37K7kYmUPgC/qz21mNzLT7FKIapGMiV5zBITGaDO9rm+r9i +Af8oCtXTSf8O5x0mMQxlb4AWb4EnMYn5iHoA6x+vRQ9YvvwyOtGSYM6QxCOBe3PTqeFdvDQB +pU4Qg47dE0JfSEJ7flYX1IqWlKDxBchDbBAYEGcQmfgOKjsoQm0EiNbfWWDlw2EFKfbaj0Lh +g8qHOZHOEwHHLulBPbkcfEly2YqmkQspr47FGxwckkOE2gidQqdXEPHmaV6VbMHyRBPsvNBv +PwzrQWMVsulSo7gwCxWuUK2FyszxJBTrm22SG3OkNIW1F9XkJ/+dBdM9xRsAVMIpMgS0wrJF +wHlaIIfPKUgEyk6jdThzJBm8HWs3DM2whsKyQITT0PkbObbvza9V+MT+7uuUqi9axg+BiRVO +X/G4LIQK+HEwqQiN47EncZunKQo5Won22Xk0Vqq6McANq/gtddIHwfAIQwiectKUDBgo7RK4 +euAlpUKnW5oneSmc0UKCUjCKntoBFNCPWzo8B5uwOWoX8Vs0qMOOMCA2SKoYans4SVCIt1gL +M8Ke+IMoRwg69moEV9CCAfqdPOumt/E8bROG2xDAU0EHAiwxJKgbBFQevxoA4pGwpio+KRQZ +TbkyxTC8D2gZNhiMncsJTLCwRSC1hKCUpuEGhBGNzlkQgsGCwvMKzZimFZyGhCub0uCcFotB +HeMf2ugnRog2w+kGdYkLg/AMHOCPKrg1pQj+HSGCwvORDSesmCFyglcDo/uSJ6pLCjYIN+DD +lgPQkRSBo6P7jgpaGWRQLsLYlDUzgFuCEyckg8mhD3L4lhQoGKaxp4eAxAhqLhDAQ2N7qEVJ +BzU4pmTkqJagjaVhlk9AxIVAiHwpj6bqDtXCMfeKnSDrNktkgSRLufyrL1ewtQHEHSVIinCb +whDJhypiRJoriwoYi5TZFg4jtTTklhRZERYhPSxgmk6BLIiKAvTZNqa5JRRIqoBkhf15taZz +qGsQJmFDG2GIPSG8KtqaNqIIK/uSCjfphkMsOb5wPBsDQtgJx4tMuPSbmnFMpJS8ruUISCgc +n99buZFJES9qwO//CD5BkMekQcNRKZ982483yZc0XBETkL8w2hi5QUgUKLwI0i6+6Jd22QXc +kki0gUEZECI+kjQOGJAWmy9OdJNNCJBlOYfhe8cnu5DNcCtDa4l04MqLLLGLYoQuI4lVWgdE +YYb/okLw07Tlm7kDDIsqExsN2hwNxDeh2w9He0QliR5K+ITNqZ5zKMSHUBF3CbNpSooh0bzb +m6TTMabYm5rYqwVDUyn28AAiwL21mihe3DfCK4IfTBW3hMK41KZiUoOq88QQWMyAXATJMq6+ +BAsrNCV59LdQDIS/WTB+KSiRRDV62hxoJD10gCw6qhIiUx+l5EDPIYygyxzOfLOFup1P/zwm +IZoAlZitlny11ayC6zycL2CWockMx0stW0G1cawvA0HGT2k4TbS6FWm7BdEBtZgpuhM3AGs8 +6KkKdgrFLVJNfOPH2qAnVWiaRluNFPDIDHuLSCHIjzwc7oEoz1mSMhu8FMTDzIPImgG9yTBP +1EwJ9ayvLTDJXzLLuDLLowDIBbCcXDKF1UpMs5LRokBGJAMeGgAcIcwG5iA1aQrO4WyyO/g+ +WEjOdXsWTdHJD0A4D+qgC0GVyUQYBbmvtbgwfQIFyKhBkHwIqMylCVNBaRia8auYySBAz2JJ +JI0it6pRqOi6MpqZtRuaVBA+gzGFAQ3C2hzSlHLJI9XP/azM3//8u+Fcpzj4AFLwwrrZFpUp +JRfiR9VgzQBxQ1AF0zdcJQ39n4lxCRjBjorLBHW8w8OThansTMOqGCKFpAE5JjxtGKXQgaoB +SbhoDsxSiG5YLMRoBgnIRlRZkob5ytDANrp8pK6MgW0i1SpKjKZxUgPry3owgAgUCGQwiclC +sMW4vGa9wQT51HsRVYQ0SBbxs2nsqnLpuqARuDVVTE8hOvETAz/cyoaCLvZsn62MGXmtEp9p +v4oYVkc1D5oCAIPRKKnAoPoCMpETBoo9om2zvRpTC814l0j1y6Op1MFoHgmINeSg0gb9yZhh +lCPgwVB1SgVZ2SJrV1O9mnzyhFV9w+//DMgRI4hRmSOYCYqZMCyYadYXYaNV3UHFmj1HKIOe ++wgfZUudHbv0TMfbuSioUCzGfE5GwEtX6FhJ/ctTUjAMiDWfFIQuPJRpukpFGchfrCjnOB8X +MaMzegnFoTjPaYB6fdV5IYg8LCa4UQEtRayGiEaG0Kpd5LOJxMUc5Rw2ZUgfqDFpMrMjHbs7 +Ezl2/dMxoNAlWQWvFc6UgRdDEZt/mMdMRToicM64EtY0dds4scEOSlX1MS8Zm5RfvALqk77w +4MxFeMiqiwTrM5NznZlhdcMdtI2zXDsJ+4uPeDJUW5L0rC/XslwOogL5JEBZ6LC+etJ8WL5W +GIlbQBqz7UnA/2pIC9OLw60oUIVPc20iPBIX7Bgk+XOFvOVbRPEsROqj52CB7oFPZBle3DsK +Mjsf1hxQywmxY0UhM2jLQRDSssMtMKiN6l2oNFAHpetcPEEeZ0gMMGPOQniWOkFOCXwqm3mO +1Y3dHuLfanCRfDJhrXpfZ5K/yEqMgQguoiHRN+VXOFVCL6AS7TCbXSSHRzxLDB0BfozZkQyx +OrC/05IXIAMcW6gr9HstR9OGTqFgUzpQCw4RmNs+bxWsDzYRBkvRYloB82XhtiXeSWEiuY0q +us2OmoUCL+PRxFAtBOaLnpVVGWgB+rmoAzJTAT6Txf3fghQj5GAqx/WB+T2JyV1P3f9Mm7Yb +FVtELeBRuSz22JsbKOBJLn3wYJwyuEUgI2NMPTB1WZAsy9ojnYlRHTd2lC/AMjwwjjxoWM+w +Y4Lw11mF4wvLLwTihk+lgsZkTIX6uFYNFIFaS5IQ3Sf+3toKMmnoTZ7S3EhWVroJJWlhR1EC +DpMgBev6sbDFObIozA1zqFTSY5tJEKc5Y31JSmGLGc7TMzWCDnGxj4ITAqOjY6TSIE8B2Hud +JOsjYwH2oEAW5JjFvaE8h/GZ5yAYMEbsXg5YYCfegLay4p2KTiBdKZ5sKQuuA0oNLMMoC7K4 +Up/kjhqSp+ANVc9hiHXGLEAS0WChHRcsDB7dK7XEj6/T2cb/Ck8LawlgRZsx3RoFAebLtY9G +WwuuEISmykbzGAKUoAX6yk883dWJFgmcCr5KvpvDo5ubaCcw3pZWFOOCShTzZb8fPlOYyDd4 +RVXVAKCMEZZ3ObdyQ4wnu5LNgNOrIrHQUEJntFo9XsoBrpCArswNQoc9yA1yS4+wVYmlri2H +XlZj2GYr9i1EWKoNsWaM3lZQnADK+rEBINtvLtl79FmjeiWH6NT0hT9Q8CVF0acOzQv3zQ5U +yQNKJZnLyEbPSGBpUBWqtMpqQg05nY2ebkML+ZapMEogDGweKOpNtr8d4YtDUOZLvSnxpQUN +eF4jxQXMKOS+qepsfdUjvYkF+2Iw//5CAoWuMQ4YiUxKw9XON9nhXJ5ZcXEVRrKkUaA0e+CP +avVRsqLlhqxrdtBDXqjVNeHPTcTbCBPBXjzlJQzUTC3s8ugSukGJj74pCD9ATraBkTAFnKsp +z9XW4uqNw2sn5mxQTD0OmgNYo2rvaBzWM3pfg0WI3zW9mekx3ZFvSvMTAXuymUaFy7hDziRG +cVbR3pZTG5oawmq0qWjCghg+4vgAmi6JxPa3CFeZA1we5cwJ+kun5Eme4KDsr8U7n1NN62qZ +6B4E8R7a/jyslVZVP4MP60s0Mr4IVwGbtaWl/CDZj7BnWVRoG1ZB3Ma8wI3LapLLBYo38eap +TrRLMY0Bzv91IIaUKYU9iVqgcCuV8otusifGX/okjpQxLi7PVk5CJ7EdWXf44n84urNAOE+0 +SxNKSpulCKUhl4JQPBwk4hlnk/kmAFzHA/wujz0xkgbX2cyrSscyn5gYTbdi6lBEmrOopyUk +HDYlLjzAgVg2Vn9gpwj/4Cmn9HWy8LlMLbzdyd8YpSyWoGy+6jv9mEtV9g2TVpihWPzqHhdW +Ach0cV+SUE4lIyNrpFcjgAxomV6HMh/VmxBkjDRDLYcaUyFabNGBajjrRE5ZkXwr0IXtpFQY +t3MzDmPI9n/Ddimvye3lOAeWrEDgJHrUXrHgyXes1If+5oYWQ1g7dXEOK6r6Eon/ZLZ4Z0t+ +dEIRrsUVxfcxK2epyANcz2ADiOvwqY8q0inM28yOqQogQ/WZR8aYcc9kXUy2s7VVMBo7qBZe +MtZ+uwBKn3IrrSA8ydIGYYGFBPcMyW6Tr8Jc2okrs3au9oBQC8M3Je90lInZqXnWJkha1rAU +hXppvWstqRkXRwJS4Gwmp2MYkO35jaIhUQd68SUZ1dKCXhoBtpdaPEhUCwtycwNYpqkx38Lw +DftraW7osiqQ+/ajKX11k6C586vt1QMJSAUxrAHkrLLjKCXxHNo5pXlkWWF555SWCbVQu3t+ +FVq7NDLgTwpcjzWSLfq1/BCDKZrwgHwVDNxm4cpqijPD/geqWC8qP/ztMvP8nWBAXaITxCb9 +sBcOTnrin00GQ1dy9s+NjParm6N9z8DUpe5oF7oqCFhpobXabW657t0DYsdykCaapghrURYW +x9eGIQeB54RgNAyQQfIBFwaVqZA8FG4TUiMaZRWq1srEJZW6uhhY1Bu2oAAHs0FxBrABArZA +MJjP5fRBPK9369/5udVAQUKFhEQCiYVBm9xfXx7cW9skZSUjnBufwIHB0RknzkGjHV7BwMHp +6eYmqkkLBQuWocuHR0jHQxRKSQlSqEnGlswFx9YGGcHOXI5CAINzg4IRQ4PnkSeTIFPSjdYY +lVWTFWECYWwsU0vFFrFMw8H7/vviIgB9ZOYfHumdPr7f/z9A4sZhQWTwSZkzdfDoe2TpIcR7 +muKAYvNJlCA7pOSI6riJgBJXFdS96OIgyoYPIQKwbMmyQQB2vXZpQNlh2IwwNSgkG9CTwKkF +QYqYiIYthTYlp5okCvYFgbkqCMJRrSKoChMx7nDCMGLm6xpGDTUxLHunD5+0cQCxKDfobbkS +5Z70itSoIVpIEfdiwpSH0zU/nxbeAakq1KlWKM6NlFAoQQ0PGnA9cBnTsrAvkzVYvslFJwcL +N5KhAnrKAMtnDHodkXatVcirTKR25QLrHNMkVk0puVHI6TBiwuuusccozkRH+xjm1SOwSVtx +U8tB/yXUC5GJThgXjkKe6TtfvpDypDljx0QqOufptEqv+ECsF7+BS7EFwvLLmDD16xd22WUH +LJ1EQzslALUDDwOYAYQzqxlABiiepGLKNlc1AQYX1s3lwgQTxKdVZjmFodkFJtQTliXOPcLc +KHjlY6E4CQwyFzlQHXDQjYCpAYB6eOEFXngReccHJ9UYwFEPJpyn0VKbpIKeCoyV5E0wtVTm +wH8twSRFf/WdhCV+LgHnwGg5xAGUJ6oV8eBRnDyZHoyDtBNGW/PVRt9nwmRQ4J511XPcQwB5 +54iLaz0XDlRTKVqFjOQg4kR2RijE4nh9BSnkJAAdwMCRdbTykT6lsJeYkv/vwUdSF6HZVIsH +AYCZ35aXbWmMq/tl2ZJTFyBAmgAHDnDND6q9MxMoq6CyG29zwEflC+RgGKIxwpwU4nAjfOLG +kX5QIomgzfVxR1WLzmgOBeWcgIhVgMHB3SPaSnIpppFsKkSnym7CIz9yFJDDm+1t49srs3j5 +ZU0fyBorwiNyydnC+OkZypk7AKYmEL6gAQjGgjw3nw3WcVhbfZsZM+20CnelCBvz6JXiPe1y +S1acVIED36OQYjcVYPRst1almcIrnh9pCIHvYfoaegcqS0GJxDnNFthBMShNdpKs/C2cJ5at +xgqgyT8haEDFPzjjDLEoHGmKxkln3ERcX4jm8bP+NhXsqqs3eWZyF+aZt8d37qbVN0B+Hc1b +VVLdIBJ2KFDYSaaU/qPWz4GCR5GDR3ckCpMeJUYqDk+mg6oFkXFAMOn9Wb0f6lvUXXBNUWi5 +BXo9Cb3mAQ1S40uxqoBLh1QFMPsxfXaDECCWCJfstgsmFrfHu+9e0nzf+KhlFuFWbIO72itv +5JDfkQsZtFH7dEQ0R0Qn7QupIQW85wfRSuY6/FtrGVPWdLNeU5dRGJBMDmALm+bYGCANFRyB +QvrKmMak0rZUeWNqBltJ1Walpy+cwDvZ6p7zLAWkDW4rOc5JoFW4o55tGaBHPbuE94R0CgHu +bSFKuoMb+mWqpXHjFW3+S4kGCCSt0/FHS9OaH7SodYRTEEABQdBODoTSoGqgjz3LARd0DDGD +KhmsfrMKU5fyVoIjfeKC0uvgkFCIwpdlilDqGdTR8GCJTe2Mb49LIctiaEROWA5zGDGUQjiC +PsX1ZlmFgNrdttK6K8YPdcXzT4iyqKRk+G8mRIQHg9Rgto4owRSkQBu40nEndxjMYVh8yRjI +MJNOkJJvgeJWBjnYl1R6sFsrqwTYqsE9DcKxEn+pWL3qwAqe9ahUxlIBhVZQEgxAzW1B/CEo +88cOaMWtREc6AhB21UIUNGiAUJoQP7LJO2AwcE6u+2SYYIe8ohyRjsjRCwbPGcafsdJ787r/ +oxpf9spaHocIC4ih+MxwxhEmhhUo4FwN10GD1nkziBJ8UAO7aRsMEeM1FcNcGtMADWvApj3a +zCZW1reVyoDTYTKZiVCGogDtfDGVzUOLKukZnk0FoBO6NKVKU7QJIHTqiTvL5vgUk75KCtMb +OyERnmCXqkQ0BT672AV9cuaJBG0kMUZczT8xmSxMniWTJEmAMakWTi7lb6i8GMpQOvFKd6Gy +Bz3AFgFSGtNANYNTC1ADSrXFTsnFsJEx7OUuGaI5ZQH0eiHpzW9kAlTk8YKbJzjqYbEHDD1p +Jzs11SV7SCCEFHAEbcnKl1mUZieF2ep1V/soUecF1iCMdA3tlCcc/o7Ev7SudaVBCJYsf7RO +8ezlDTn4waTypTk58OEwfPVFSBZDAdBM0QUsUGx2FLu55GrFCHEg5XYIg7QjSKpzltUYdvNl +KJ52g4FcVeZCk0dBE4x2tIzzG/OOlJZ5rHZ/rYVIDyjWIFSMp53eQ+WvxJpGpDW1RzJcAh9F +klASHQ4pKbjGEfyJvdDpooF0LBYX8XmXw4Din3zFGFUhm8ZdQMULcwJvceGR2PKWd6SsfZ4m ++LAIs9Zjf/vj33szdYRgCYFBk81LvHym44lop4T2wik8xacv3AVXfcwaEQUsnJgcpKCwwGjK +qj4ajAQ/+F5M4hlHqPvCF2a3yy265BKu/urhPDVYxMM6AYnT7F61kGdIyOkEI0m52hOvdROz +41QUnpGd+sIxg7at2F31SgrM+TezFF5CcAUs0MwQzJj0CWq0QpkIKajhmVbu7ZUBwaPkKskO +172uhqWbaNB5GB4lOvOTS0DjNIN1pGpk83PNamk5w/nFL05GTHvQiadSIw1io+ne7KtWW2KL +U4bq73pa0VukDYbI6gssJ/EX5ZANElrHGwEDzWlljeTj2MqyxgF5t7uzrAiKIkGHk0Ga6pmw +mtUK4ME5J6Lis9Laxfxz8a1rmSRo0rgTqzZSI+BLS/gKgFMuGtVZlLRspJlBwUsp8qlSJa3W +ke5uX7o2yQYU/15eSMoNLQxVQ0SorI5kxNPixqzL+IGVRCPBySowA0zarWYe+EMPK1YZI3Nu +7zgTAM50DlLPSek/0hYp5kBgIoroKuzn7k9QzOEHoUXIS5IrRinb6A2I7ndtrRePfnq60wlc +cN543uVbaRwFly+qTW5j+ZIc0Qb22rQISMo8ze9WULz/4UV6zPnePfe734EudGgOxQhD/3UQ +CE5sHQetH3YpCzyP9WX2bJpzAkFF0wq69cwIh7Dd9LDL7cjLQpXd29tR27izOeHumJFJc4jw +Rb5iBki2pO7lLaE6gzaPFvMcAH2/t9D7/j2hTywIQtGO/sDagNoOu56ofPwpiGav0v7v0186 +hfv6xlTtz5wseb1o2nwaUwK9sOilbZ+wXjOidtU//YzK0aYlK3IvFCDe9iUGSsvskS20zvnW +tw76751S0A0eaQHBSJGSJIFVjn2RLcXa5ECOkOkOLyEJRvyTCgxAfAQWpHEfYRXYCYDfUJXB +sZWey3QbcxSA0aReVaEfyo2eepQKEsjAM6SG/bUavL2ReqXV7s2D//2dzuGb8JHV4OmIERWh +ApSWNRABEJyW4KgSeeyfX9Tc2r1UqPAIRVAS6i0GtOFEnnxefPiC+IlGCdyAB4VKCRLK0TzR ++lFhWZRdVTEbFMQN7VFMDYZVPEXhM/1J8OXc7/3f/7VXnP/tYRocYRFyCnRpx2sFiX29QX69 +mvMAxBtKoBlNX3swWUVlH5/kBAOpQ4F9XwbKx+GcoSien3StoXaFHPu54cjBw8PAgGosUR2K +FLyxWR76XrYAH+DxIa35Xh8OXq0RohGOlJ1dAyEywPfU1nNBFOP5A8g90eQhnEX9VthJ3HBQ +Iyge12E1hjZi4w220vlxzyReVIaZ4QQShirSxNfFwDPEHDTEYljhn1ylTD3kog62187tHB/a +4+DF2REeADAegUWQkgEKnPZYSq+oFxqtUkBIVxup4chhU0VN4+cVVzedgx+VxEhgI32NIo4x +DxqaYqi5nvsRRkg8mla8ohKuWg3/4h4+WFqv8I+u6Rzg2Rog6qMv2hoCCo0wyh4nCJAC0FY8 +HgfrxaNcrQiToOBQQh5F6E5krdvnaUFFKpQWGdUNBE7ueZC8iSJITuDk7cNalGQDSYGpCcWv +BcAB9po7spDvaUK2PBPP5SNN+qAfDuBN1lpODuIRAqRF1INPEiQrldUbGeQqkYUa7heheQTq +raJEWiMXhpIgGdcYmgiftQuLNGF9YZnakaBIYpaRTckIjJMUqAawKKE7Nt1L2tbuuUE92mPf +zaX/1aXQAaMBCtB5tQFeEmQUntQJRc9gupITmZ8feMpyWF+qNcWYhcj7cF6SHY5dgKNDSM9l +uszCOWQa/z5dH2VkFqga8oRmnr0G4aWliQkKtqjXH9YkEPYibMamAPnkEaolRdRDe8bLWGUl +bz4f4CSHsuDLB92F3qQHHrmCcWbdqtTC/YzBYblISUWneC6odNacCbbfkFGlfHhfPJzAZwJb +Y4kWeO6PT2QCD9zcPJanD/6dnAFfeiLgehaiEemlJAyicXQQrP0FggqmTAnlt5jQhAWaTSkY +UYHIwbCK8YgSCuRdKxXpI8JaVhalN4baymVg9hHVmeFWhBiehqblrpBVyrilXOKivdnlifpi +e/pkio7Ueu3aTyqeFGbHWKCWBikpZaqet+0OJl0OYonSqSHSwXwdhODAGfrD4/9FZ266Ubw5 +KNt5WkZ9olelW4R4QqWRV1qSVtN5qFjVwxu4l4jiI05+KQK2J6fmpXlkwq69aG6yGRRAVRgd +aZtOzpvCqRuOnvggVRwGFdUcTwgOaUE6Z4oByUlBp6qyzH5RhR9VgHGKWOhhgyR9wqMa392N +x4fyHq7tISBq6k0C4z9WWoS9AScY0Sld5ilIaWCsU1DWqCs1lXKwoCjsy5KpgJ2GpdR8XdjZ +qijaaLuUlJ8SJYopZD5QCGBxk6ImFihM1rF6XLKSFlD4wd/x4mq1mB/eY10eYMPKphrQZoKt +WMoc4Y4V5V9sChN5QsD9pWCSkW+uAvUtB/o5SZ1yXDD/gEG1nBmx8KqbEuoo/M3Ltin0AOYH +8cZRFZYiKEKEcMIWJcRMDawhwlsyvKRq4iKJZipdSquZBuM/foIkZOtPumnurcIFtAm8DuYD +bm3VnlP5mV0vKYslSmQorWu2jVJzqpPMspnvzee98mqqUu0f4OyBUWmF9RhgJAS2qKQ7qsGB +pJV5Iq2JMi2YUqs/EuI1/EmLWiyWtqSdmYFQ3K2BodPHDmp9lpvUGZp5AEUwtZzOmtq79gJr +yBZ6VW3NFSyRWq5JwW3NOujTORaCQVeFlcFXUI7QckrBti3g9iLPdSnhxmZe/qPQpVcaAAqs +rYEJuAanIYEujeoyCs5+fhAq/6qi7igBNijq535ucnkkfUrEPyRITzAgb0IOsXVLGTKJRUyp +2bAJJ4BFb1UpeHZO0fogL5ZnD/7u4AVvP46Up64Yt+za2mpKQA7B7D5ZCqCN6n6syxql9LYh +Z14h7ohucR6YafXKZM6SoNxgpbgZA6KX91buijAC8s4eGlyaHsBvWsKZT8DYlgruD+JvGsRw +qPIvYNTXIJYu35wBlQLkRaBA4iQBb43vAuPrfpZfZjXVpyBX3Nms+WptcvAATDIeyN5nzcqT +FYOjgtQutnpcKw3dwKrBCr9kD5qn78LwDLPJruVMPAKwWvgvGnRRcoGFL2BHJaFu66KW2oZs +GxZmVf8pD9YusUdaZYIG8JyNRfTMlr3C6PONaz4QiV0kh8DerolBsQ7O4zz2Lr6Z8V3yLw0P +b6Zka9fuW/ryMFgA1EzISDiYnwKn07hKl1eunbHg7R8TnzfO6wVPBILMIpu+ba/eJ/QyshsB +5znx2sC+1d+25ky+ZSbDMP/WpUcOol2AaBs4lvuea1PmyPVcXT9cJR4vsIpclB0UrL1cS9Ek +F+Gxb4pdZr0+DlG+5Jwl8Aadln2qM8wysHLwQUjd7q258+4GYhlr8tIqVew+IgCPh6XdLYsa +i2yoq+L4VRWobkH+MjA/6Jm0y7XQKUvRizAGG0e2zCKv8Ds3B/l+cBwFaij/l+A2u8HtHtEx +r6VYxaU/L620yjTxefLL3PCbXYvOzJ3HmWzhKMHNIEqiqbLxuhHM1rKhkSBQqEDMNdZHGGkg +DyrG8jNMJqSfcdAiRuEYkZXZjYc/rrQAHfOIJq2XAvTgHmIp7Z/uGeMW795Frwu+4Gy6rJxR +SQVV/tVGytvfSHQtS+fUccTYrm+P8V1fd62fZiWvhLQFQ2BJ75iugtEYIWjQgDULrRZV/6A/ +m7FMJ63C6uquVaoeMk7DsQHUwchshMOpxMJAQAdSrKluHrKCxqhRPsm99WwNv6coavAsNeBl +r5ZP9Mpek1EKKamukqPNUXZ45txBbmkm07QmL6xL/35HJ7A1D86DiWCauP20UCsKzdQJd1sF +5VaxbE90uYZcSLQGvcBTWnV0INdcc1IyaXgN//zIYyuiGNHsLE03MSfrJAdu8NWac/8uXb4w +UQKw0LVYWJiHCwlAVVxdJQ0CfIjDqRDCIFABetD3LaMR8/S1EWfsp/BMHsVrn2LQ0fYKSP9e +3xHpwOnbhlOEF+vzEaDnAAb4c8f07kHPZ8/aVeJTHQDrT08F20AHazMGd6syceddCRZ2+2Wx +Jii4bo+iBjdvb/IBile53z1n+UqEXwryrlF2WPPujNP4c9Pki+HYZ8uadmwb+lmWdiOKogD5 +OZhDC5xK9rjZBtNrHlNmUv/2CD5pcJTn9ob7zFpY+Q7EuImOdTrDqMABSt4JpJe7GhQDt98B ++DKPObTem0Hqmqz1zH6eayCc9mozinSwDZFXAHSgw0YK6qgKap5/LbeZRaFyZEU7p/a4sw7k +sk2S6FjjmopzraCjl5l6OW1W+TIDoM9pajOnp1x+sK49UympOWYyeMy0ueFARbXHeVvQ+YVz +86BAIFejNOsxBLz9tj48eR9Y9pPjecQQOnRn9h9iOTKm2ADuN1i/24fCGJkfe6WPOdKqNSO8 +NKVq+OhVz8q1+aK8+ZvLeaJkJDa+1Dqb7kmrSDkOGuqa5hn+tp6jKiOINcfrwD1Gqz7y+m5i +6f//drmwG2AulvV/I/sZyzBs4jtX66WlFYoDU3vvyExUTAc6ePdtUMHhCDOSezB5h1yWAS6t +QzGVW7A7QzUzWvkfXsOI7ruXwpjG5+q8h6mw9/eLhaiu26WYT+vLzxnNMo5+8VbuhcpUFbzN +34B0wLnPE/kYYiMm8VlhB72eE/0KY7werPdpwndV49NIUzmKe3zgMvc+VnoUN6FqbmqJrecX +k/mzqrwZO+xN7jpst5jE6/G0N2nhoDKpI/x01Ih3M4aS2bK3yDp/IljSlOC4nwm5H0iDsnNv +3zoOxOWL1f7hL+2Al/nzXH0xEjPW83fKF7smUz7lrzyuBTyoIuTp81La/lM7kF8BOKg26MeC +wu88zqCeiHNz2jrHM/3Au50m61c0FIO0OtmxoPPPrffhree7TDItTNIltapo8D8+TALhiX59 +bLp8XSa/cTwhBAg5aRVDlFF4979AQg8RObEUk5RlD+SFj0PDrFsA8kq/D+PAECoOBIyhQiBI +lILmYKlc5gbQpkTXk265XamBYACPyeKwGH1Gr9cKt3solCvkdfsd7/6m2eDwvy9QTIGN0MAw +TSprEUBs5yKnp2eiagPksiBhhCQzpCQT5XOlBSHhYKFkRqbgoLIKZydrYtJiAMgggCFXAYpp +SScqWFgADKrnp9VIckfKymvLzyx6TU3QevAN/o6OgW4b7xt8yI+rrPza2hCR+o8AwD1ywnFx +9majSuODpkNE3ySU5F8LVAgGLnjxwpSMGTRcveJBQZIsCgN+NBCSi0GRK1ecODGCwYhHKR0P +ECJwYNY7Hc6MeBmj5CW7PebOocmmLc4QOOF4zpGWiI2aaufSDRLETqWsRmJoPapVCR8rDvpA +mBjhj4WnEqNKbe1KKsaMqWIbXpjkTqJESgYWXNQlpAjIKRNCbunYkmMQlCFT+npGDhpMQHsA +1Tx0c6e2nT0Zc2tSE2ZQQeooG6WGFksPJEj6PuqB4Z4He5c+cdAUyh+ogKO4EiQFI5XYhWTL +2ugc60KQXLt1geno/9H3FhteRCITfuOv4HF8fpIZWhNxt+jcGvN0I62wYcOV1QVVu0OeUnqU +7N2zhGkfpxNZt2pdwVpgDBTyYYRYqJAVRYcQKRB4yxsjA2zpzyO6lOgFrysA+EFAKBySJbmX +YopMuZm0iw7DBbyhrro8lotMu2sQIaS7oNpRCR40lomIPKjOQ++DFE7Y5KpPvHoNx7BSeU22 +VmaboRJaKBLCIt6G0KgYJu7Cy6+RlGikCAlsw+0vjbqYELsQD8MwG+q6yWnDDrkxSSjtQKTJ +Jsv6eBLFeMJr06nQLJkzKk6s8uQqPEnRs6vWYisNNoV+nC1QGAxaCADQGGigAQB1yQUIvv98 +EakLuUaCZCL+fGGpwislPHM7DLd8Q8Nt6GjrSzHHnIZCLdHpo0QwWMxhDbQwS0tKOTl4ET0Z +88SKvRRaoyEFYvlZRZVkSVmA2QYWKJKBQ2d49r//MGIgUi7ucgJBSg+8wraVsHgEL047Haew +59C57o1D3CVRgVK/lG5MVa+zUF1qtIx1HVsrMOMdARwY2IGnajAPxjzTQ0GrGnHUip8YWNGH +2PVKYLZZRi2CNhdnm1200UcdhXSuSYVxklu7+DsLnuEiHGymfANhV01SMfRS1TrahcZVNN01 +k5Z3anVnYKILngiqDl7kdUaF/6lRz6tGsU+ssWhQlqCMNea40a7+GcX42ZBHfosbjUBaklK5 +RFqbB0aadPBlmKexRmZ1SkKs3jnmrW5nUHuG7qh2cCNmaIGPfmq00PBhWr0ZseLTYUBjvI+F +BLTeercAtv56c0bHDsDIBoLz1skEn3kIHqWaSO4Ll9D0O8002b1pzC69Weybm8yQ+Zoy8x1x +TTgJZwotggs2fuDEd2W88aYZhjwgGqdi2KvLNdZ8t5A7d3bRsDkWudoABYxyCQc9skJJ4lI6 +C0LSXZJJQn2bi32yd92Ql8NT8c5dOkNadZV3kAnYuNiQFKNJIHku2pVoEmYnp1HPRk3bxMUs +573NOUBz2+uc90YGOow4ShxFAMDJgkH/qQIJpmSxgNPq/hINdsxvHYVog+xKsiX84eQN3EAA +ELpUr/7dy0KBCGD9rsEyWg0NAAND4NESmDg6MU+C0osc9Rr2jwo6S4NZ1OL1HgW+zIHOWkJY +gAFGKAEkJAh9V9qCuG7lGRQBhjAoBNEZhhirEXEpXqYqSQNsp5PaXWd3Pxmiz0IkOBT1ATPG +m0ACD7a8BqYHII7bR2qedzEsbs8BW9QigDInMjCCUBdkCoMArERC1o0nYKpjHbqqAbsQkcgm +XIrDTSzCDQN4STG6Y9XfLoTIRmhmeCr6jpSa+MQFRgWKkKSiVQKiAoJgsgGZ1GTnsFckD3bx +k9jEpvgo0ogT/qGMdZfKjFPgEc6YBHKQsPqZ/Q5Rkhpm44YKCJlOcqlLF0qGl2Yi41KCKUwU +TYKRLhoNMh+pTElKLgUWnOZCw9hJD17zk50M4Sij0SQWqo8e81jEKrNDGPm5Kh01tB8etxEg +2+mOX/l0lTt+oYNApDJOTVTaQHk1UILGyE7LzITlsKjQzWVQk57EHkSzCUZtdpGPTDnj2ozA +SlOWTDzjcl8LzZHOnxWFZiMlAu3coBsiceiP2eCDuqzas8j0E4nDFKgCCVpTpVWleXfqyrMS +cMmFYo5RDQ2fFyNa1A/ChTO+GQeCqMqRWZ1FETJR7Fids69XjYqktdRbDhHDHHyq7PQcI4RJ +I9D6T6S5YnHlWdxbl1ZQuTrzWd5L7V2158lHea5rRNXmF7u4KEL8wAmOKMJmiLFYdP1mPFRq +Ifzm50qiGIU7Wp0XHXgDr7ACMn4whMxH6UbHdgjCXxVoCGiNOVrSFrRxCRBvXetqve0t6j/W +9KsuuMZX95LNqGjoLfysG05Y9EezcGyVpwQ5MzWpk6Q/vJYt7xadQFLXspcF4HKw69kLNCS0 +NYhwd8FLmvcsgLwaa5ZPPVfN2VZTc67t6zYdei2LiAEZZ2xHFFj5A4zC4hnevOc5BpnS2BU4 +l7Vry4B9aM+yKjifMosAADs= + +--Where_No_Man_Has_Gone_Before +Content-type: image/gif +Content-transfer-encoding: base64 +Content-description: Star Trek Next Generation + +R0lGODdhQAHIAKcAACQkJNsAAAAAALZJJP+SbbZtJLYAANuSSZJJANttSf+2bZIkAJIAAEkk +AElJSbZtSZJJJG1JSduSbW0kAElJJLaSbZJtSZJtbdu2krYkAP+2kv/bbdtJJG1tSf9tSf/b +tgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAQAHIAEAI/gABCBxIsKDBgwgTKlzIsKHD +hxAjSpxIsaLFixgzCgCw0WDHgh8zchRJsqTJkxYdoCSokmHLgS8hqpzZMCbCkANxrtzJs6dP +mD8HIoAwFABRCBIpQIxQ0CZCm0wNOlWoM2jCBQiwah2AoMCABAXAik1wgGwCAmStqqU4NeLQ +t0QfFJB7FK5dog3y6t3LN2/BqA9VAhbYFsBUwC8Lr0WIYIDWrAgadx1QIKzZsmXREjiwuTPn +z55Dg+a8mKTiiRLmqpabWi7rAxJgy35wgLbrt31z90XQgPdQvRDy8tabwHdvookJUph6WKDS +g6d9WqAc+TFWyQO+FsA8WrRoBQTA/osPT15B9+5kL5Te2bZA67kIaLeWHTu27bkH8PZe4LUy +WO7egUYZdUflVUBdZcmFGVm1HThgcFwF10BT65FUQVjZVQfZAlz1p10CIF523ncKiFdieeFx +Rl6AaB1wAQYVrnSfa/TN1uBr9TU4VmYqjucjij/+SMCQGBYwVGXaHaAkaAlA0ORbAzSAlEPR +xQiABRX8pySSXjkGmWT+MchieUsOqcBZn5XllQURtGkBBWz2p+JmIJpHwHYZVSnRaRFQ4Jp7 +q6mW2qC1FfqnXCAquVmQQDbKaJBpkhXlcLlRCpdeT12kp0lYVnBBZJQpWRxkA3rFGXgHLAAA +nAMQMOCG/tmFtWBZCmRHGZJnhcbgAUWiaaSVgRlmUHzxuXdjoIeqpuWijgLJWZEZVqboZZdt +l+KQunqlW17jEQDsQpuKVRkCCXTYX3X9bbfdiGVlZ92X/1G7JJp2rshZteV+Ve6mbIErLFAN +DQbXgXdFCpaH4oJoJoqahSepAhhEjEEEFlR8QK1fPbrikAaHZWBxoRaAEXMm2VQYArx6WRxW +91aXXaJobnZAhlx5eR2sAyh6b1lgyVwZx7OCWGRS3z5kZAM5j6ZzZwzf6+NnGkfdrJ2f/RcW +kmiB5yphRfekQGOaYWxdrNSZRa6+CeecqwKyitejiAuOdXDXVAIMUdLMaiwz/gEa8K1A391e +y3HUcyqNr9DlFuBX3VwzTndCORPQ2Lta9fyszbB2RXnC2yF+tViq2p0pQn1KVHqeFFkG4MXX +Rkqrw1J3yzqjumJWJIYI+Ps4Qs9N1DtBA7DN1cyOlftlrBgiDzN3JVLdYqItiqx7RfwCq/p5 +A2SwwATZJ8CB9wR4EL73ZJ2pJOHOi8ozktPyKv23g/0rEMWoJ4dQAZtRByp2/Hvof5JmkRlY +9AUgEG3kgCNBoAITyMAFbiQABmBABCfIgN0dhFwBDGCPGqWBE+mNY88LEc3WtTCOXa0AoVtP +/KSykBUqRCm/awkCJ7C9rNRsMlpaGtSudTAj7UhE/thSn8gc2MAiGiAAFSSiEou4xKrE6EOf ++5y8TqihrZQqZqAhUwm3lAAaInAtNFnI70g3EMQQpIlMbCAF4xUabHVQa+dxW4uyAkElHjGN +aMwjHvfoRCuRK4o8w9f1PAMpXrkvO3pcokjGOL2C9C6RfIykAy2gno6wyQIA24gBNhlBBkjQ +AAswAAMlqEQJBuCUqEylKle5yiMe8ZScnOARGaBKV0IQlRUsSWMguUCUdW51q9ui+3YpyWJ+ +MYEFWGBEFMNLYzqzmXkMZS03CcFXutKT1IQlK1/JylZ2c5qfrKY2bcnNWT4EmgDwyhJzJ4Dt +ASBm1FpUvlBoTMmg855F/rzJM/fZRFkGYIGx5OQtU7lJbNbyoNwk6Ctp6cpsDhShqExoKyUI +pwtUgGIHUCg1rSlQbRL0lrnMCT/xCLIFqAQD3GOnhxCgRHri86UjPSZMl0jLb2bTodXc6EMD +ulGdTrSmNn0oLG0p1G06VKIEhYACNkCBClBAAktd6gEMQLGCCrSTQP3oUEU505h6VaYjEUhX +x/pVjoDUk9vDJlK9CctwdjKW27zlVQ/60XB2k6jVzKpR7frNvt51kwtw605zCkoP1WxcHeJK +Y2hGs8kYyVbY4RCYbAXZc93whpalYpcUuFjHTCCsIxXrM8+1KgBM0JjS5KkEV0vBCW5TrwxF +/qIn1YrTac6VnEUdp18V+tfZ5jaofZ1gWlkbW07uz0iTAdPkHsu/mn2lsTXjEGOJctguNbd/ +7rIVf7rS2cnZkLuXpQwkRdtEyzq2VAM4XWkjSMPZMoCG8A2sVSMq1/ri9a5ylSZD3yvf+9I3 +oPYNMH49+l8I6jWnat0tfSdKQxye5SzwjSAKEysW6lQGudDFzoAuK5nIdIk6L6MMAB5gUYtG +4AF+AkB4OxQZ8Gbou/9jLmbRy1I8ftiwkiWbYdH7q4a8l6Gd3J6Q3TuBhgYYt0iu5gTIcieQ +nZAyPI0yXJNM5QIjOYKBxeZshQxfLUtZp/715nZABTLHTobDaL4u/maV+9iwxMeiC3jPAyJw +0Q3U5royphlW0EthPZPqf2RLbH+sGGMe85h/C+mjaC3I6EaXpnqLMVlC2oKTSoMEtPpUtKM3 +/ZMq2a8nm/p045wz6tJoetGcTnUjKwSB1dQoR8miy6Xq4hAXslAhkmYKpPVZoQ1lTnm/1CCL +2KVqKwlqNsZ6j5wBJZ/V3GUvv5GQlKB9HDcT5dbQmYioeXfpoHDX1zkeULxmxa5hm5tJFSg2 +SybdkFbTiEb1QRazVaOfbeVlAg3Ad2/2DW2C1aUut3lAtCm1FwqNetffWkC+qni8W8FsTHIs +d+GYFkTR8Ew9YPwJBG5ULPm82lD4sQ8g/oU9talV7cL15ousH9CkAfz7N5g6CcItkqXtgJjh +kvVfFNm4w/S1MXb2eh4G0q3ugzAlAoIy1qGOFe/5pGbcMSs50J9mHp5dykj/dnOFsR5zXKu6 +Ap4SV2fGtT/HXLojDnBABBojpoOdbzMYUpNnuVwZOHYGRMGz+QHYve5+EcTW2VaIwO8D66TP +SN46m7rUm0XxSCnO3nnRj9dlIr/FNBl/WJlAYyzTYsocbLHjVtHMwG1Dtc2LRwvazBt7JKoK +Z6dWLjHNSSjQ6rjQ+0DOBgvLWT7sQl7Ndl5x1fsGQoE+sb1zJQThzh7PlztNZu9cmzlP9KSu +428Pf6Pij+cV/tU06yqWcl5ZnlkUVqLzzApJbHuf9OWnp979LioxpFBhhIOAOw0aABdQAAUu +sJE25Z9cdKJ4AtgonhE3V9MirVIZKcR+Bqdud1IqC8Ah4OEVMAZFO+YY0VV2KCMmrUNIZdJ6 +UTR8y1R5CaFrLYQSL8Fki+c8jtJzK9iCFrdz41J1m5E7jzaCJhE8roJz+zMzF4ZYZvZ9fxZF +AnR+CWODMlch0SFsswMkXMIfUnQ+PaN45pZBB0MdE7I7oZZtCPc5VTQu2qdznCMuthM0meE5 +ldEQjNR3pPYQgFcavxd1FkcWXpEBB5AB2ZOHeLiHeUgv2EI7TLI+wSc0A7BpTrFC/s0xOoH3 +Tu2COdfhfDl2HZ4nJmoSNOWCemZRiG/Yhn8HausxSDsjL6J4Ki+YPraTL3jDJD0WI4Bnggex +HHwnOgqheTnXPxcWSKlHiN1lKh1zhs+TKmX1QP/kVbtDQExoHuMBOPaCiafYYdL1M01odydH +TxlnRuv3iqXGSzW0WNKCRXkTdDwTIHZyGQjAAIl0SsEYWoyWZuGVLuGHfDu0MFQzHmW2Rz3h +ig6xhh6Rjs1kVQywHZCCLSnCFdsTQQ2ERPyYQKZUTgaAQLMEUcq0FhF5QP6hOqOIRVoDjrZC +VkS0gEshEZvEkZtURPHFVenoXihpSg6UYMGlYGG2U62F/ldJlkqnlhDl9Vl5NAA4uS4XKY9K +MhkjxR/NJJSRJBEcmZBEhJKD9VFrtVVI9FB8tVYy6VdHRAE25U8cVV8EBks2GYzFEVYOkG65 +o1KsM3abpypoNCBImZCwuJZNRFdDRVgaNWW/9VZNWWC8lVB36ZRbSVAIMCgUMHRDFwEvcmIF +QFgN9ZAGFlch6ZYMRIEDUF6F2FXk5ZhHqUempGALZmA39UnWZFtyVVsTtZdamVcuGUG/tU1W +uVuf9F45ZWWEJQAe1hVIkligAlnad1w3x2He51gOxBXOVJmVCVbNNJzFhIT4hF/kZABddpc1 +9VZI5E/KSZe61UqoOWARlZl7/iWamnmVoOSZUSZXLeZmzlVSGKhmONRd0QVZL0ZZ5oVm+qNw +lPGM0SJdkhGG7LRPxrlO1mVdBDFbEwCgBdmaDJBaoQlXLllftBRbQFagrNVR1glmRwZcm1lX +CIVV3Imd3yRBw9VanskhyfNcjjFh2seOItpczxiEf+R9F2ABagZi+hMtZyaJGlZoLpVG+6li +/tN5hpZYC+FJXZaS8TUBg0WanslXqhRYBhagEKpb4VllUgmby6mdcuVlVMZJDypl9QWPc+Rc +4acdN7RY6MmeyoWBtvJYGWNnYHdRBQB2SHcAFbBUFIimzhWm9Mlc/3OFRrKjHNGbgJZzhmaj +GQIR/ljFX8SFoUQloS9ZSxMQFm4jaLHSM3QIFl92WxNKZWg1pP0VZb5VnXhJoah0m4KGouw4 +ptx4ppuXONmBNM3VAC6aWKWagdx1LlnxWO+CXTqmP+gCgbGyP8k1n4uVY5IhUvuIahZRk0ZZ +dMq6rN9iacYKWsh6EFURrcy6rNd4g9XKa9m6rTj4ONumiGwIrmpBrdxarqtWrfoYe47jd2fU +lVRhrvC6GHYBb/Imay9XElXiQptoEPu6acdzXl4Rr+zKEzgCG8lmsLFGbwQnbXqBhG64iPOj +HKVmdBCRrjFCOV66cz2JHgLbrROrEEfhajkysoCibMcicC/3cl23F/Fz/q3fyoARQa4Y4V2P +MVlhEjTnlrMdKxII2yAm63Q+a7ByBnOQF3nCEXm4BxYMexcNuK6y2GjO+GsOF2zBJHE5myY7 +CxHJMigh92pK1yB1UbS7wRcMCxxjS7ZvMX1Nu7YmEQHa5Wu2CHU6dLV0GylZmxDzBm8nSx/M +RrR8UbPt2FhfgrIDIxq3EbIpyxs1oW2siCQ8OFk8B3GlCELKVzsJQHSeqBYvwbVxUSwjayPK +5iDvmHplaXIVJzTHMRz/Bk8HMK8OknK7RjLXShEXsnDgBqnipxlWu7uE1IGu06Kosx4m85eA +0mqfK3Lz4XHvsSNZNICywzaJA5mNkRd0iLKi/qKyiott4to1dFabNNtw7/hD7QOO5rZ4ljt0 +I8MQFrtuCBcfhoKwX6u3TacsQBSNkxuQk8pdEOByUTh+bqYtC5CFmdsTWGI1vQm3Mya3HCiN +d9e7JaKMZ7IrslMW6GsVLfEcp0EyB4EfseazXdts97E8G+S8JjeOwyQhqjsZR+Fy4AVzsaiu +FVLAJwQtKPRdXDGGFrk0KaIwfLMgSNInfZJ4lXsvdcIrXVEyLzyCR1cQfyJnINfE9WoZTEPC +sbNBAsR8kOcbASzAMLwnbJsnETB0tSst9td5C3B0qfpgaHFDq7J2E6YvHBMiHIMBB1B8GxGY +BfA0aJE4dAh9sbhr/vg4eUm8KoN3bAl7yFI8wqX4LCFSLbwCFnDEwGRBcJViIIX4xSnxtBAb +EWCRFVz2MkbsYdqxGfzhpjDEFB8gcLcKjb94FhY5xYH4ZGShAZcsEtsWP9ZIgoXxEijLwVGc +LMuiyHo8yZglgwkjx84yh8WRG0zGFd5irpeXODQkbi5zRefTMYN2u8bYIqKyKGmiRSC4cLCn +yeFKgh/bOLPLxEdir8VCXTiHPDwijysCj5jRKhXgAB0wEh3wAFmSAODRKgEZywP0MWrjH+Rc +bPU3QGCKPxRYq6NclqyXL5JFerRphP58LyxSLf0BFh7piYCXiA2Rui/HM+5yQajCIEJi/r+P +IsymG4piQZt7iiGa+xNGDIVC5s9Gch2m4od2AoSOiDM8Yj59HBbKZ4YYUi5dHCwvARj9Ws4Q +ISFJU2Gi0qY6iD9y5M9NQ8VS9ywGWC6a4c8i5mgItwB7TJAI0Kjh8WK0OW4+fauO6Hm4Az2s +wyt398homMSxW0Yl+LARMSlvF3HfKI16zNJUfB6cs9N3ciYd6xRloSETwDHuUoEI48qb1zmJ +s4Fjt0XDtj7iIoKCfM5OrSkXAYAqncwj7EGCM8WTW3HLlzY+VDXwCmkXUy5uLRlCQ8O3AiDh +gT/3ci5OBnVW08mL+9nY2hDxLHX+IXqfEYHc80v2stJUozPz/hIvVyghFsy4bDi7z0EnPKgV +M/MfXEGLoMIlvwQ1eNeNZaguAzTAGYHBGSHCDgxCk0pyVQzdhrMk0DIqnObeoG3OsuhCdOIV +1oFC4Tep0OVwUITDds05nciv7peE/Z0Q6/sQP9R4dW0Wb3S/f0iAgXjbCF7LzFo9klZaABAV +N9y6X9JigCo3U2s5AdLVdJgp/Qp/6bweocfaD8iHe3jWC8ABA/A937OHpJiRAV2Et7PHASvW +eL22+SoQC3AmyIUVnfM1pee45qIwnOF5ytwqy9fRKNHUm+wTD9cdT7ajhwXJ5ts6cYN3WO4z +1KhuYG5G5WwT6/JilGPDGoJDMrin/hepJkT0tDKrrLKCJqSr2s57Ma4zfhnCw9GNdw5bIYPR +loDB3/k4EQrH0GmWLmMoKf3Jema4KwaUkKfkSeNlQVSLkeXxN6oOOH+zMTKjPrc9OaDsk6/e +ZMC5GLZWfAOBSQ7A3xM+Ee1Ei+0Yheoj0F8Beo5cv/X8VaN+lHTzR+LLJBeOia6X55FKcVkN +QlfDaOsXRnotQ0wkZOE2FuI4Oy6txt44JNSyT6d0mfbIaDH2vYB7XomSRfKcNcuoFfkELN7u +SCQurg5Q6gf0Y6BX3vFtit2xjOVSZGh0RO6OThZU2Tis4Ol+70wmPIgUnCUB5l7HHA/PQLHE +APXOLKvn/oFuoySOIVsOZJAfLwAsr5+7c8yfbkhRh4woYkiaA/OKxO//0vI4Cu4OGVAir0WR +QaSknkDDyJEQxU3g+ZpMCVKYthOQFIfcQW6GzkMbmZD7WWOdpkBcVpCVGl8ztZCh9GUKhEls +kkavVERICpct6U0MaVWKCZu4hBEOlEzOxE6NDEw8DTTc5VW5SUSvkk6TiaMYsUkBb5mmBfaK +n0f2lWB3SZqe+vRD5VafiVu4RK5Tr5N7FBkI9GBmaO6xgpbFBIHEWEzclmmN75jFVZpwf/mj +HpWMWaFuf5WC5aS0zxAw5UVFVIhYsRFYlIv3l0hZsfrj5RQ+31WxpVAs2ZeL/iqXuHRUs9+X +q0RRbPJXPuVTrl9N+0hWAs5AhchO5xOBr+JAm1cqyZ+OmWT8o8RRiflfPFWX0kn7/mVLmQmh +UVpOd8UASoViYIcBAHGhAgULBzYYCGBAYcKEChEyRPgwwMSIACwKAIBRY0aOGz12BOlxAAIE +GhcgGBmyY4EBKj9+vOhS5suZNWnGpJnTpsuJFCVK9BlxYc+GDiEyJEqRAYOhSYlGTIqQQU+g +TotStZoQgQQFGyhUqGDhwoYCESJYiKDUoVCFU51CVahT7s6PLAcUQImAZYG5fen+vQkYJE7B +crNancq2J1OjVdfCRWrVANPDFCNfvSx5cuasCilE/kDQ1LJUhwwWTJAcuS3HBQkKsCwJckHN +vCNta0Q5MrZf3oV99wbue8LppZsrRxXqNgBj0VEhLqz6dHnzt0+pv518/fhxhwsYY4XscKRd +va/zwl6AV/3d2ncHjK+dG+97kvPdk7d9Pi8ABK4HbCQssOAGDImlCAj8qLHnTJtgKc4WQ8rB +ttY6jC3ouNssOqyIoqzC7DTcrrLSvnusqO7cq808+FaM7z3y5suLJNvYg28v+vKbEb/X3rtP +LxTdW+Ck2RD8zcaUAvyLOeaM6myi4qIbqrillvRQwdEeZDJE5bBjassQQaRKIe+eLO25BXhM +r70dT2pRTfNg1E2v8848/m9HHFtkDyXYfMTxTCHtU4/Ivlykb6/9LJpyyrkmaA6yL4tbDino +lvKOws4oDO+o6n5yTqlNJ5MwRMuOm4q4JSk8E7YXSZJTzzbHUzG++vTLLwEaX5UPpTRllJNH +Xe8EtoDfCuyxvvtutSjZqUxLdLjhupzQuUwdBQ+i03xKiIEGqbxUwWkr3LBaL5N7UtQHnzot +XWcTnUzGuwpwzTX0ZgXWRzhrO7PQG3ecT6ALLGgAWH0HSJNFBOgk1EYYjQRO4bvYTNi98dxL +tmJEtTU1UXW9e67Eb8F8aIG2lhszyysfu/Db6q482UHpQNUOucSmQxmlBG4+4GZ4BzigPzpZ +/pKXT13xw/NeX2vctwGD/MVAILMKOCBW+/Kbj05jjTzv2HjvG3KlG48leGKHx2bPYrMvZjDj +Zq8d6mNNFxsK5wQomzLlo1B2W0NOv2V2wUSlBPVUvO92Dt4ECCBUPh6NRBjXehfmcSTXNlBA +ArAikOC1CCrAvKvKGz/6RjYNNfQ9eW8k6Wd9ITf0YLGPJZvoZCk4u+K0Ge3Qwm2D8pbwaV9z +LWcCDiCg+Jzh3RnvwfOuFqq/iXNW3eymbIjKTLd7KIE/bz3aXcdflfjW0y2goAEEHijgAQQg +IKgB87sXWLd8AaXvYKLvXC//kYS0n//09j9Y/1oXn9oVMDGB+xu0/qZ0LUn5zoEJGUDwDqAA +AijgePGK1fByZivlYcqBa1nKcFCmpLtNr3lfSg3CdhaxOBnteznq0elciD+JvRBiqAvg/2LH +HoVlbYc/7FUQj2Q2mHCkgEY8YhKVuEQmNtGJT4RiFKV4NgdM0Yq1q+IVtXhE2hERibXDSEy0 +GMYtltGMZ0RjGtWIxShmMVlVdKMWI5CsOQKgixYjIxkJs0Y+9tGPfwRkIOMYyALCkZCHRGQi +FblIKA5SiY7sI4C+iEQ9TrGSjMRkJjMJyYpBkpOF1CQULznJUYbSlKfc5BLrOMVPFvCOTVzl +2UqJR1mi0pa3BGQrLaZLi3VxkLwEAC9f/hnFWYKRlkcsJi6V2UZb/vKUnoQiBeI4y2Qu05qa +BOYWz5e+AkjgAJlDXzjPtz4EHNGZa8zmG9NYzWu20538gQA3H/DNbh4gnPIkJ/ogQE7z/dGT +w3zlJ6sYgWF68Z0HRWgTBxDObzbUm+Dk5j4lSs59us+iDdgnKltZ0GSxE5P+yxHyMOiahB40 +nvqkaEonKtGIqvSiL3WfFh3JUTqa7TOf2SUylZnDANZppCJNwAGIN9ThlbSM6VxiPuW51Hs2 +NX32ZKpKEfDSYFaMpr00myGzykUmIjWR/nOd4uIVVLIKj6hnHV5ajSpIs21zng91aEPvCU56 +zlOcK10fTDE6/lW9TtScOX1kEmPZztTxNGtjzVliD4dWxqb1rGvtYxy7+VRvvhWqc61rXfEp +0b1C4KWeNZ/7QLvXBPSnAHiFgDot4sbBsrGRt9SVYcVmOMUmtrG3dWxuIbvGyi4Vrr+NK10h +ylm9FteioC2AaKea1wbAqz8UFWwwA6raAtbxqh8lmGzlQ9uyLja3uAXv8BKw2yUC06l2nSxw +H8pNcFLUuO8VLXyJ6z6pbnW1ZnSkR89ogRjxz03BK2t4BfzdtAZVkV5dY1PlWs/M9RZ9Dk4f +P+E74Yoad77FTS15mRgB+WnXdNwVnncHPGINJqAC5EUwUyl7WRZDVH0VLu7GJsDT/gVYlE3x +xOs9WYpavlb0bK0FpTV9RWMcRRBqQSUx8SpIVOMRGK1BvYA/Tali9D44uJOd52ht7CrEkpUA +hwvqrVCrYtsOj8fEpa5rAXvLC9gFrI0DnpfDW0E6U9DOdR5xzjin4SRupaUKBm6Vv8nXvXCX +wMa785cVvSPzjfmeQiVAVCca3wZU9b5qtmYFnJtdkG63zHMuXvEsSMFDkxq3UEYwIVNdMR2v +j73BtadmIYpBxaa1zre+c6KHGjQYxyexUBsAaoPN13420Y3QtO8fOawisPrwyJAWapKdnNsm +PzlqaFHmqi1yWVdbdr0Qtuw9u2zrXOPa3HbeNY3eU1wE/kRNfQQgZ0uommxtK/ICQeN0TwlF +aznbetoC1rWT9Qxk8vb2pLB+66vhir5xK7ncDz83niNtK7zEc2yHg1q7pRrTID+x3lq8N42a +vW+gRq22CbDg8ND9b3ILeIP/SuLHEZleyjI41gxduGblBm2I9zzi6I4axddnZAmK17n77Fmj +K51TrR7UAoYjD42vJlKqy43lZ/V5uR2b2ApgYIsy32I8G0zzyrbYofVk+LOHmvWf/5x4QT3t +0FmKQR7jxaKWNjbek03IzUEdh/4tMtCe3e8lO9nU5daAAiBe4AOAhZlSJHjezTZHK8/1qZgt +e8LRV+sJtp3tPv/yBpm73JUG/nvY+xwJaKlY0r4juYb5viHwBq/BtdNZ0UrGvcrFe4C7fCYC +e+l8yqFWAQyq8bpWdKQ8b658u54d3GoXteel//AJCjXMFaevRZfb6LxMeulqBvverRgBDABV +hoVVYc5yHW1qKz7Sule0zlxDULSYBS2JvYuSIw3pSLfkj760mMizI0xTPhfDssuDKgMEMN37 +vOmzvcIbquMZgNCysJQSLb1LswyUovCzmAq4N6CKNPTIjxyyI4IyQT0xKw3imQlSPOSxEZ6L +OA16jS+zizMSwMc7otNCwAdjrx48L8MhNwdsQK07q+OZsB7jq0sjLwwAC5FKNxyhnc8oJ4so +qIGK/iDX0IvDqSC4CyoFgBqzoB0MIL8DoID32Lodkb80Eqia2iIdFK7Lujwq46agYkAhxLW3 +Uyzq+y7egy8LxEG2aqKuu7fWMLL+859C4z9Ssw3x8q/XUD+4U7IHqAAFMMGvKICUi0CdgZcN +GiJM+0MNrB1pwsCKwbGa+8EfLDo7TDku1JmgIyt5gRdEezK7gy9TCyxt40AlIgBn8Y/yMMSp +QzIEIKiM+IDPIL4JgD3T6S7hATbZiz5Se8WdicXXSKTp6qqzmSjNk0NxA0KHazujQxoMyq1+ +qz2Vy0RbMa7O+zI+swicOZh0KQ9bCRvTyZmRCLUBMEEA+IALgD3XiaBM/jw5s1o/xnPBCPJC +j5uiwdqoJLqjuDsvt4qwn4I2x1q8nNmueNEL3tuL0jqYkQo+CCTIBNCrAkAclDiA+wKmXDyj +C3qNIJkAwcsu05I9oNE/oWpJqSuPgESy0FssUrM9LlSRSFuk68oimhoklhKnF4swCFgoaZSX +T3tGPCs66+O9lrCADgCADrAAi/m0gTxHlrgonhFLauSjpvMj+SOUl5SY7XHEnpS4m2y2tuQ8 +gVQADQg1Czq5oNEZUDq28jKnOUqnT4qllHqxfNKTn5JIt1y/mxG1MGNBC7jKrITM4rmLnqvJ +AsNI9zmdqCGA2Vgz5EukAfBCeTQPnXmPk3AP/iRjv5qURz8hsitULMakSibDxF8TuqjxP1YC +ReuqmMi7QawSRXiSKmiTF1spyQGoIJ7xsjtkQAQYTRSsINgQqgYssNBDngm8Gcm5mY5DKAW4 +mfTYNJvMrtSsvUSLlX6cn51kRcXDxHGMzfzjvSkERU8MLCW0CMBcvay6quWawCtEw9lAC4JQ +API5SQraROY8t9sawiYrKyfUyC+7i/n0o758rYpBgC9LlQQYDue0ldFRzjpMOdRBz/o4Mp4M +OpIESTB7T+CRz8+8oqJESauyTyU6PkLDOJawIwwQQwrogA4gKAxwj9C7wwUl0iIESqixSQi9 +xoOClyBpjYOZgMXa/p/xkDNMLK0RFJJ8y0KVU7xXtEk6BMhohI2vi6YKzUBHstECg5O7QDJd +I56AU0XpO8MNckHrM1DPtCazdFGLUACeiZ7hQDksNBYAC7E+yaEO+5/YZInW6DyTC9MTZQmV +ZMgZlak1S64IYjlzC0JTA9E49UoZvJmtgRcKMjl3WrULhcvTkNKw8ZGREh19Y5N3HA4Pnbbi +WSw6ddVKFabfRKMsIgktHELatD1hJVLmJCr5Eyn4NJzxMqU1XNKKiZpFRYAZi068CCvBe0Hi +mR9ptBlI28T2ZCxIA8qtqU8qdKJUk1SLWEHqLM9baz9VbKxoxCC7QLkt7KRUEr9rjKNI/ouR +zrNWP4kYR4wa8LRN0zFH1wi18BrXnTkjpALAe6XQLUpEz3u7O7PL9Us5eN3DaITU/sQZYcEl +DtRTAEDRf9U3PiHJ11BZWAzVNqXBwym3DVLNhS0tJeLVe8XZUQzAPZU8i/lHb7TMqNE6LUys +LVzQcTTRVuRWjmNHKzIe9Asr2yjNHhE8TmRT87Af92DGnUOeaM3PXtVZ0ESqD23XclvUrh0e +GRlVhGVXcD3DjxU6z3qniM3ZfGVDAOAZBYitkfOPoOEVfUvNkqPKZaw6kJ28mANFdMVATjq+ +JNrEnQTan0RYnXnXYhW42ZSh08JTU13cTyTZ4UFUnuragQXc/ra0Vaz9ny4zOaozXDOlz1uC +TciNvnGUG+/sVMsEvWpTVJj0zHRtVnMNzleaI+vbW566QnDMUnuRxsKlNaiputysqo9zgKsK +zgltojhLwWFlPDokVTuMyk+lyoIMGt89I1E8J+401xw8UdHNWuCpIRtJzMRctHlVJQltosY9 +opuFonaDvurburIigItFnAwYAAIOsO+NQSMNuncJuhbFJPLF2euKgPS4GagFWHt5l61BzDC1 +zpHaTkrFO968W7ut1Lrl2SNi0yplrAJmYQJ2YRZ2yY25xCXDXTxESyRzrnfS3/u0KYKr3jna +mXY7zXkRq+y0FUIVsY2Nl7dj1h+z/sb0TSQINi2BPNawcVKCSQAOIAAt9gAC6GIPmM7I1UNb +tc0dAVUHPjC/5OFz5SIgc076OIniBCAMnpEFPJ43Lbxo5MkmPpuCmqMdTqj820njobgXzoAs +RmSanT4Fhju8ANMv69BmQlzxG1mcuq9YuqMbhdoJSh34cJeptJWJtD7jtGHtOdw1BgBAPir0 +NaP+kF08FNH2ANOjDdNQNdhjlceQ7Tj9hSQBRM5XBSvei0va+lLaAp5aU000Bk0QXuU+EuTt +hUrvgtfaHGVgk5zLFKq7mIDfveTexCoZHWEpQk4stOI46TAAij3Rkce8IFSqbAmdqBh4pqRJ +Sqidm81N/tXYY8XVfWHACeLCzY3iAiKf2lklXUo1lPDOK3Uc2Akf9RjkpA1IYREUl4gIebam +wYNKXKvLunS72hzX06TH2fVnssLRRWqtVXpYvvw6VsHIwOva7hJVdZtOMu6u27PIid6IbBkW +2D2577KzjU68xONUfRbTTj5eb6xO4nEugFYkS05lKE7cE0am0zjZifFgzutg1Nm5Vnzl48Fp +J8Fpes6k2O3Kj1w5OdvdvXURkhRWilRqednmQ/LjELapDUxpWnKWqI3H2QMzc7QgDIIV1X27 +7U0AQZmIYfGLU3JEqtNJzmzQXjSsjfQ3d71MnTmNRCpoMg1MJMlrODvq23Nr/rwsTowebP8t +KwJZjbCeC9iSvdoqyHkBvNRM4upbuY+EZJccjAfuXBMmaGOaCwZxF+xFK8qG5BJlrFVMLAYQ +jABA7OZeJqmDmKKRbVH+XkhDN47smiLioz8GwIGCaidSyKd2gNUOCaqmk6mkyApyv//16epT +LJGhi8NW7Z3GpflhaNmTX6xz13pNaF35C1WrqfM1aN/+b46YElih7jpTvCIkVjw8GAOoCeae +77DGJfxmbJp9Zep7U7v4D5lAEv3STcGsrsWd8JAoDTsOtQCutmlzPdzhCeUu8fm2pSy88Lwk +PA3POBztjQ9v2K8d2RFvbtT+kFnW3uG2IIJZgIR4/onlCHKZgBQn4QmK8HBbukIk1snJTjTx +cpHsFgweFwBldt0x6qgmT+yOmB6HmGH322jQhVIm94jJIHOQmBmo4J3vUA5OmQhJ+iO/aA0Q +W0bZZU557HAKlwmmntSv/eYCivEud4AoC6Ms0ogPGZG6WRaQkPCZ8BJzeZkwoZLcIRwoj6TC +kEu0JjyRDsH3WPQA4QuxDkXIi+c4L3HymyMB2MrxzghIN/DJWACNSIyXiBnsSQ06pxnoeIjr +6QkQTyLc2ObgKKdQxeobN56emQ+cbt/7yKNVDwxWDts3Mom4+A0x6YuNmZnbERmI+JsRgo6M +YAgBkG85/3UU0hvVwJSm/jB25rainBiAZd8JZMQInuHrMhtWaS8nAvkfutCTd66JT3QAb49x +A9B3ZzGARQcOhoCWUUkNYHcMeVeQO//0w5aiudBmmzgJ1oDoKi08veDy3jgJAvHy3EbIMZd4 +WP8NjpGIOaeZcFkZ7sCSMJkQqcAWYc9zVq+l3mAJucj3jNj1aFtGb6Q4hPeLY5H5Mv/uXYr5 +qneJUMl4K6F4egcXTReR0hANu7F4CFciIsGLnOCLg8kIaKutCeKXlJ8JlIh6mC9w6sJ1q5/v +bdkSYQd6aWkIy/gOlukUr2+SnreOzAAK5Vb0IOdIjaiiChCAtJ+NBRDlxPqf3Yh7rpn7POry +/sXH+zg/oLqRjk2/FCfpmGrJ+UcxCyz5EJ5XDedQfFoK60W9dUf/jw5HzibTIbj/cqj/fM7f +8aHffDL3IOt4cpx/G+vweddHfot3/rdgALPgHM0I/Ksw9op49RL372DiR5TAiCvdC97X8eEv +8+Ag8N/PCOXJFgvpHeN/977/+cNvfsTvDAaAgAOIAH/hHAvoimIPfEsBiAAGBAYgWFCgAQAK +AQhg6LAhxIcSI1J8mAABgoYAFiAYsKDAgAILJjoMWfEkSZQqU5JUuBLlQgcvWc6cycDgQQM6 +EQ4sOFAnUII9D/o0wGAn0aRCkwa9WZToUKg4ox5kAOHAgwMRKmDg/lqhQgQLWHUe7Rk0wM2B +TnNWpem25sMBGOGafNvSLlyYeCUujJB370qEbKPuPJsTaNCfSgUyKLtYKlW1ZpkuVuxzsdUD +EhRs7RqhQIQLYCFI/lkY6FqpPgGzrggSAYACCWTLRgCywN+ZLlvz1i2zN+vKQy3zLH4ZsWni +UBvjVKp4uOnHwoc/vrqB84UIFK4/wG4huWCyqQcjZAA8t8OOHUMOOO92N3q98QFQ+D1/pvSq +BpH6dBwZsVD8OcdcfpdJNV5+hlEFlQEIaAeBAhtoRpYBFHxnVHkLILiUafe556F8H74HHHwi +QlSgUmsZVlZhTAGYmHRGLUgZdM0lyN+M/kQxEAGKZKHFwARLHXeYURANMEACIXU0UkMf2QZb +kwgscORtT8p1pZVyNWCiQyWWWNGXXIYIokMTNCZgj2alhZaM1DH4nI0HHlUgcWqhyKabd954 +EwMa4sghYnIVsF6Sg1I55XoigYQlSBcdieWVR2Y56G1KQgrliBGFqRGJwHW0aW+NAakhgXeu +5diPADoHaI5soRrjcqZiaKCeMWJopn9T8SSopQgkGalIGFFqZaIFDHupoSFN+WilhqoHrKTG +/toeXAt1Gt9toOa2QGJGjfqqrf3tdBS4NBYXmYtrPvYfiuTWWiuG5CL3XGEdXeTsr4nq++iz +SD56Kb+SPkkp/nsA21awr0pWeiRDUt62AMQLkZlblQNQIOKacP70LZo6EiTqjyy2Ch66zs1a +ma4b6shcq+/mxOeZ88475QKOqmesXOoNTCyVxvK8pLOLSkplr8gqaduvH1mas6IeOTmAh9qS +dHDFUr8Uc8vHeasyUltjPfKL5po8clJzoixqxy4zdROuMtO75GyMvoYRRgYTHLDO/R5rG84G +8+qRsYN2tGjeDnP06EVisoQw4RYrJFBr3Moor8hpF3Rm2R8DOXmL08E45IyGqfbyuiFbrnZ/ +AbSNWMY6CTs4pEjS7azRe1+57N/P9v0s74JipLRHVBIrpZS5C8rkXlYzVDHViS6U/qoBcE3Q +osZFISevx2Zt3Ke8orv4OYcoZ33ZhmrFjHqMbJNaOWKI8tv4kbj3PnDReSdLe8L4Ayzw0ev5 +nrP75peziZWkSsJiT9W0AwCvAYkBDZnAAiD4QG7ZCE7v4tN+zLe60yEnfBYUm/jQIr7JuSxr +6psei9zVIF+9ZlEfCaD+bla/271vaPkbWgTsFj8XJut/HJlfs2TnHgT2L4iEK4C1AICWCDYm +ghFsk7c0Ni+eoKl6BojgYBooMlvByIqwohXoEGQakL3LhAaAIBrXJyNESSskfXPSegToxhi+ +TnhXwpmhRBOBBgBRX3X8V++IaERlsWRTRqQb0RZGNQBE/sBa3mJin9KIQh+Rp3oJ4hAFyecn +8EGGeh6MEwiPUyqtkfFOyiEPBJEkyTMxoHh8mw0s39i4QM6ShgobAAQGV6iOiEaPfERWouSH +pbpRjYj7ew1djPjDRBZMkElciFEgKKompjFXoPvkKVWDvWieL3RU9GI22QLGpZiNlJgzJY6A +wrtY3iYBB5iAz4oVOEAOToD7utmS3qeeJDVAM72swAWy84ACDHR/kfLhARXJKPbMplKLu1/B +3CdIZiHQNox8pkKiCclpjkqagKIc56yZH8mZb4vUSY4nvbiqcT4nk4dBWzjH+LUpBgBJB5DN +AQ7gzkLxKnA+u10teVdLgR3s/ki5dKMEMHAAgAIUAwEFgAQ0Q1D//WyYieqVEWnTUARGhHHG +ZONEB2kojCaxMdXkaCSxeNJPVmZDHr0i1rA5RXCCEJwyMmf35jVTmX3SVwkgwAEIkCQZVipu ++PSbHBlVVF8dQEJfAQtovhIBzTR2A0c9LM/ACtGe8XShR8RqRYNXTLEK8lNkTaKZHilNtD4x +PNgM3+XO+BGdKiCwBzjSXFkVNpXC9rU6wVV5mohWmLotpSiTzWANW6XlHg6xfhuawmCnAAlc +QAENkMBUH3CB7ihAAQ9oQOwUC0Bm8mqXt3Ol8JjXrN/1NKxhfdZpn/mtAF3xrE7ZrW8/ZhTA +8rcA/jq9KSxxW1y+0rVO4SPXt6jpRDSiBood/GCCZkM82QFLqPZE7HL/RRtjgaUB3iVoASwQ +Aex+V382NNQPFzbHJRXPvYpc2DJdLGPaxVe+Cw7pZM4yYLmS5SMKAKw7qeROwP5XqwPuYn6l +KKoF35h1dz2XJ9F5EEQ5bIaIvLA9MzyoABeAAntsAB/BDOY93tO5Kb6qR+oJQOJddZCifY1c +OCJnkRCtX0+Db42TyBiO4pijBrKkkKpyxtnklABalU2vhpxTYx05yfTt6CYbTC8KXXN0wmGK +K3ep0Lo5N8vGRDTzMGzlS6HXhmmWM6eDSN5lHq5SBwTcsuBcZTrjOc8LSrkvm4YLaTSy6Zp0 +JQqSdgrYH8fyVwX4sWBve2QpUojPblvVGHMc6NJB23edtSF6sfzcheFR2xSNIaTkHDvSHpJo +0CK3jI33rIAAADs= + +--Where_No_Man_Has_Gone_Before +Content-Type: APPLICATION/X-BE2;version=12 + +\begindata{text, 269602880} +\textdsversion{12} +\template{messages} + +Where no man has gone before... + +Click on the "death star" icon to start the animation: + +\begindata{fad,270222644} +$N icon12 +$C 30 +$T 30 +$L andy12 +$P 0,0,20000,256 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$A 29,24 -1,76 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$S 216,264 +"Fire!" +$V 260,260 417,242 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 321,186 250,158 +$V 319,193 265,172 +$V 316,199 290,187 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 321,186 187,122 +$V 319,193 215,141 +$V 316,199 232,155 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 241,145 179,117 +$V 265,163 179,117 +$V 316,199 180,127 +$V 169,120 163,101 +$V 184,111 188,89 +$V 163,101 172,115 +$V 188,89 190,110 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,108 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,108 +$V 198,108 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 191,115 185,109 +$V 178,104 185,109 +$V 246,158 180,127 +$V 169,120 163,82 +$V 185,109 204,80 +$V 163,82 172,115 +$V 204,80 190,110 +$V 175,133 173,162 +$V 173,162 181,132 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,108 141,158 +$V 141,158 149,161 +$V 141,158 130,154 +$V 130,154 137,171 +$V 137,171 149,161 +$V 130,154 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,108 +$V 198,108 199,118 +$V 199,118 149,161 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 164,61 +$V 185,109 219,66 +$V 164,61 172,115 +$V 219,66 190,110 +$V 177,134 201,167 +$V 173,142 201,167 +$V 188,128 256,143 +$V 256,143 195,120 +$V 175,147 147,192 +$V 147,192 173,142 +$V 168,127 113,103 +$V 113,103 171,136 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 171,109 +$V 171,109 177,130 +$V 171,109 142,135 +$V 142,135 183,120 +$V 183,120 177,130 +$V 142,135 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 132,80 +$V 185,109 195,52 +$V 132,80 175,116 +$V 195,52 190,110 +$V 177,134 192,201 +$V 173,142 192,201 +$V 188,128 241,106 +$V 241,106 195,120 +$V 175,147 234,175 +$V 234,175 173,142 +$V 167,130 113,143 +$V 113,143 171,136 +$V 167,130 160,153 +$V 177,130 210,140 +$V 190,110 208,94 +$V 172,105 172,64 +$V 154,122 120,115 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 171,109 +$V 171,109 177,130 +$V 171,109 142,135 +$V 142,135 183,120 +$V 183,120 177,130 +$V 142,135 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 139,55 +$V 130,154 175,116 +$V 139,55 190,110 +$V 177,134 219,150 +$V 173,142 219,150 +$V 188,128 193,72 +$V 193,72 195,120 +$V 175,147 226,80 +$V 226,80 173,142 +$V 167,130 144,191 +$V 144,191 171,136 +$V 175,147 173,202 +$V 155,138 130,167 +$V 157,128 121,89 +$V 171,109 165,69 +$V 191,115 205,70 +$V 184,116 247,130 +$V 177,130 191,172 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 156,170 +$V 156,170 177,130 +$V 156,170 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 179,200 +$V 130,154 175,116 +$V 179,200 190,110 +$V 177,134 221,72 +$V 173,142 221,72 +$V 188,128 123,82 +$V 123,82 195,120 +$V 175,147 120,89 +$V 120,89 173,142 +$V 167,130 276,111 +$V 276,111 171,136 +$V 172,131 164,203 +$V 153,136 74,143 +$V 152,114 128,56 +$V 179,113 182,44 +$V 199,118 301,141 +$V 194,137 215,183 +$V 151,150 97,225 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 163,134 +$V 163,134 177,130 +$V 163,134 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 177,125 +$V 130,154 175,116 +$V 177,125 190,110 +$V 177,134 162,129 +$V 173,142 162,129 +$V 188,128 173,142 +$V 173,142 195,120 +$V 175,147 163,145 +$V 163,145 173,142 +$V 167,130 163,134 +$V 163,134 171,136 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 163,134 +$V 163,134 177,130 +$V 163,134 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 177,125 +$V 130,154 175,116 +$V 177,125 190,110 +$V 177,134 162,129 +$V 173,142 162,129 +$V 188,128 173,142 +$V 173,142 195,120 +$V 175,147 163,145 +$V 163,145 173,142 +$V 167,130 163,134 +$V 163,134 171,136 +$V 204,106 216,100 +$V 215,110 221,109 +$V 231,98 236,95 +$V 241,102 241,102 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 163,134 +$V 163,134 177,130 +$V 163,134 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 177,125 +$V 130,154 175,116 +$V 177,125 190,110 +$V 177,134 162,129 +$V 173,142 162,129 +$V 188,128 173,142 +$V 173,142 195,120 +$V 175,147 163,145 +$V 163,145 173,142 +$V 167,130 163,134 +$V 163,134 171,136 +$V 214,99 214,99 +$V 215,110 221,109 +$V 242,84 236,95 +$V 246,91 246,91 +$V 221,147 221,147 +$V 207,133 207,133 +$V 168,166 168,166 +$V 150,161 150,161 +$V 175,92 175,92 +$V 192,90 192,90 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 163,134 +$V 163,134 177,130 +$V 163,134 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 177,125 +$V 130,154 175,116 +$V 177,125 190,110 +$V 177,134 162,129 +$V 173,142 162,129 +$V 188,128 173,142 +$V 173,142 195,120 +$V 175,147 163,145 +$V 163,145 173,142 +$V 167,130 163,134 +$V 163,134 171,136 +$V 220,75 220,75 +$V 215,110 221,109 +$V 242,84 236,95 +$V 278,93 278,93 +$V 248,151 248,151 +$V 211,172 211,172 +$V 176,196 176,196 +$V 137,186 137,186 +$V 178,70 178,70 +$V 198,64 198,64 +$V 169,100 169,100 +$V 192,97 192,97 +$V 204,137 204,137 +$V 151,150 151,150 +$$ +\enddata{fad,270222644} +\view{fadview,270222644,2,0,349} + +... by Curt Galloway +\enddata{text,269602880} +--Where_No_Man_Has_Gone_Before +Content-Type: application/atomicmail;version="1.12" + +; +; +; +; +; This message contains a ATOMICMAIL program. If you are reading +; this now, that probably means that your mail reader does not know +; how to handle ATOMICMAIL programs. +; +; If you were reading this with a mailer that had been extended to understand +; the ATOMICMAIL language, this mail message would automatically interact +; with you and take certain actions based on your responses. However, +; the language is designed in such a way that ATOMICMAIL programs can +; NEVER do you serious harm. +; +; If your computer has a ATOMICMAIL interpreter but it has not been linked +; into your mail system, you can run this program by piping the mail +; through the ATOMICMAIL interpreter. (In Berkeley mail, for example, you simply type +; "pipe <message number> atomicmail".) Otherwise, you can simply write the mail +; out to a file and then type "atomicmail that-file-name". +; +; If your computer doesn't have any ATOMICMAIL software at all, you +; should probably reply to the sender of this message to tell +; him or her that you were unable to run this program. +; + +(&checkversion 1 12) + +(defun init-ctrs () + (progn + (setq newline " +") + (setq summarizer "mmsurveyor@thumper.bellcore.com") + (setq global-survey-qid-ctr 0) + (setq global-nesting-level nil) + (setq this-level-ctr 0) + (setq total-questions 0)) +) + +(defun nextctr () + (progn + (setq this-level-ctr (plus this-level-ctr 1)) + (setq global-survey-qid-ctr (plus global-survey-qid-ctr 1)))) + +(defun pushnesting (txt) + (progn + (setq global-nesting-level + (cons (list this-level-ctr txt) global-nesting-level)) + (setq this-level-ctr 0))) + +(defun popnesting () + (progn + (setq this-level-ctr (caar global-nesting-level)) + (setq global-nesting-level (cdr global-nesting-level)))) + +(defunq onelevel (i) + (strcat (int-to-str (car i)) (cadr i) ".")) + +(defun apply (f l) + (magiceval (cons f l))) + +(defun getstring-oneline (prompt def) + (newlines-to-spaces (strip-newline (getstring prompt def)))) + +(defun getstring-notrailers (prompt def) + (strip-newline (getstring prompt def))) + +(defun newlines-to-spaces (s) + (let* ((l (strdecompose newline s))) + (cond + ((null l) s) + (t (strcat (car l) " " (newlines-to-spaces (car (cdr (cdr l))))))))) + +(defun strip-newline (s) + (do*((len (strlen s) (- len 1))) + ((or (lessp len 1) + (not (equal newline (substring s (- len 1) 1)))) + (substring s 0 len)))) + +(defun cadr (lis) (car (cdr lis))) + +(defun cadar (lis) (car (cdr (car lis)))) + +(defun caddr (lis) (car (cdr (cdr lis)))) + +(defun cdddr (lis) (cdr (cdr (cdr lis)))) + +(defun cadddr (lis) (car (cdr (cdr (cdr lis))))) + +(defun cddddr (lis) (cdr (cdr (cdr (cdr lis))))) + +(defun caar (lis) (car (car lis))) + +(defun cddr (lis) (cdr (cdr lis))) + +(defun caddar (lis) (car (cdr (cdr (car lis))))) + +(defun > (a b) (and (not (lessp a b)) (not (equal a b)))) + +(defun mapcar (func args) + (cond ((null args) NIL) + (T + (append + (list (magiceval (list func (car args)))) + (mapcar func (cdr args)))))) + +(defun thislabel () + (strcat + (cond + ((null global-nesting-level) "") + (t (apply (quote strcat) (mapcar (quote onelevel) (revlist global-nesting-level))))) + (int-to-str this-level-ctr))) + +(defun revlist (l) ; like common lisp REVERSE + (cond ((null l) nil) + (t (append (revlist (cdr l)) (list (car l)))))) + +(defun informative (p) + (strcat + "#" + (int-to-str global-survey-qid-ctr) + " (of at most " + (int-to-str total-questions) + "): " + p)) + +(defun survey-multiple-choice (prompt choices) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (car + (car + (select (cons (list "" (informative prompt) NIL NIL) (cons (list "" "" NIL NIL) choices))))) + newline))) + +; USAGE: +;(SURVEY-BRANCH "What is your favorite color?" +; (quote ( +; ("red" "red" (branch-question-set "red" +; (quote ((SURVEY-SHORT-ANSWER "Why do you like red?"))))) +; ("green" "green" (branch-question-set "green" +; (quote ((SURVEY-BOOLEAN-ANSWER "Are you green with envy?")))))))) + +(defun survey-branch (prompt choices) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (let* ((ans + (select (cons (list "" (informative prompt) NIL NIL) + (cons (list "" "" NIL NIL) choices))))) + (strcat + (caar ans) + newline + (cadar ans)))))) + +(defun branch-question-set (branch set) + (progn + (pushnesting (strcat "/" branch)) + (let* ((ans (ask-question-set set))) + (progn + (popnesting) + ans)))) + +; USAGE: (survey-short-answer "How are you? ") + +(defun survey-short-answer (prompt) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (getstring (informative prompt) "") + newline))) + +; USAGE: (survey-integer-answer "How old are you? ") + +(defun survey-integer-answer (prompt) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (int-to-str (getinteger (informative prompt))) + newline))) + +; USAGE: (survey-boolean-answer "Do you think I am sexy? ") + +(defun survey-boolean-answer (prompt) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (cond ((getboolean (informative prompt)) "Yes") + (T "No")) + newline))) + +(defunq surv-pkg2 (q) + (progn + (nextctr) + (list (strcat (thislabel) + " (" + (car q) + "): ") + (informative (car q)) "" (car (cdr q))))) + +(defun formatfillinlist (lis) + (cond + ((null lis) "") + (T (strcat + (car (car lis)) + (cond + ((equal (cadar lis) t) "Yes") + ((equal (cadar lis) nil) "No") + (t (sexp-to-str (car (cdr (car lis)))))) + newline + (formatfillinlist (cdr lis)))))) + +(defun survey-complex-form (preface qlist) + (progn + (setq this-level-ctr (+ 1 this-level-ctr)) + (pushnesting "") + (let* ((ans + (formatfillinlist + (fillindata + (cons (list "" preface "" "i" NIL NIL) + (mapcar (quote surv-pkg2) qlist)))))) + (progn + (popnesting) + ans)))) + +(defun ask-question-set (qlist) + (cond + ((null qlist) "") + (T (strcat + (magiceval (car qlist)) + (ask-question-set (cdr qlist)))))) + +(defun qcount (l) + (cond + ((null l) 0) + ((equal (quote survey-branch) (caar l)) + (plus (branchcount (caddar l) 0) + (qcount (cdr l)))) + ((equal (quote survey-complex-form) (car (car l))) + (plus (dcount (magiceval (car (cdr (cdr (car l)))))) + (qcount (cdr l)))) + (T (plus 1 (qcount (cdr l)))))) + +(defun branchcount (l prevmax) + (cond + ((null l) prevmax) + (t (let* ((this (plus 1 (qcount (magiceval (caddr (caddar (magiceval l)))))))) + (cond + ((> this prevmax) this) + (t prevmax)))))) + +(defun dcount (l) + (cond + ((null l) 0) + (T (plus 1 (dcount (cdr l)))))) + +(defun handle-survey (to summarize subject id qlist) + (progn + (init-ctrs) + (setq total-questions (qcount qlist)) + (sendmessage + (cond + (summarize (strcat "\"" to "\" <" summarizer ">")) + (t to)) + nil + subject + (strcat + (cond + (summarize (strcat id newline to newline)) + (t "")) + (ask-question-set qlist)) + NIL + 0 + T))) + +(defun maybe-displaytext (tx) + (cond + ((equal tx NIL) NIL) + ((equal tx "") NIL) + (T (displaytext tx)))) + +; THIS IS THE END OF BOILERPLATE CODE FOR THE RECIPIENTS + +; user-generated part begins here + +(maybe-displaytext + "") +(handle-survey "nsb@greenbush.bellcore.com" T "RSVP NOW!" "nsb.greenbush.bellcore.com.1991.8.17.15.18.4" (quote((SURVEY-BRANCH + "So, can you come to the party?" + (QUOTE + (("Yes, I can come" + "Yes, I can come" + (BRANCH-QUESTION-SET + "Yes, I can come" + (QUOTE + ((SURVEY-INTEGER-ANSWER + "That's great! How many of you do you think will be coming (including yourself)?") + (SURVEY-SHORT-ANSWER + "What kind of *vegetarian* food would you like to bring, if you have any idea?") + ) + ) + ) + ) + ("No, I can't come." + "No, I can't come." + (BRANCH-QUESTION-SET + "No, I can't come." + (QUOTE + ((SURVEY-MULTIPLE-CHOICE + "Aw, that's too bad. Why not?" + (QUOTE + ("I'm busy that day." + "I hate Star Trek." + "I hate you." + "None of the above.") + ) + ) + ) + ) + ) + ) + ("I really don't know." + "I really don't know." + (BRANCH-QUESTION-SET + "I really don't know." + (QUOTE + ((SURVEY-BOOLEAN-ANSWER + "Well, please don't forget to RSVP when you decide, OK?") + ) + ) + ) + ) + ) + ) + ) + ) + )) + + +--Where_No_Man_Has_Gone_Before-- +--Outermost_Trek +Content-type: audio/x-sun +Content-transfer-encoding: base64 +Content-Description: Distress calls + +LnNuZAAAACAAAIguAAAAAQAAH0AAAAABAAAAAAAAAAD///////93//////////////////// +//////f/9/////////f39/f37+/37///9/fr6+vr5+/r5+Pn4+fv6+/r6+ff2dnT1dXZ29vd +5+fj6+//9//v///3//dv/2dnXV1dXV1fXVtVVVNVTk5MTU5PTU5XWV1bXV9r//f3/+////f/ +6+///3dfa/93b/d3d/f/5+fr49nZ3d3X3+Pn/29n///3//////f/d2dZUVFPVVVZX1lXWVtX +X11bW1trX2fv49/b19HO0dHNzMzLx8bGwcbDzc3R193X49nf59vn52/r48/T3c/d119jZ9t3 +79/nz99ZT1/jY29X/+tdRm//Z0lLT01PSkNGW0o9SkRrS05FV0A9Q0tVWUlK3/9fV87Zx8/N +2bzd68zBwMv3y8Ldzvf3xsrPyd3HyV3VzF3NTtf3zN/jSt93Tmtf71XrZ11VS+s/b3dLTmfn +91tG3U1N511na+NLym9v19PKwsvZ29P//2PZxs5f78RLQG//TdlTuc9O6//nd13KY1v/2VtC +vUHNO8VKv0dbw0b/SM9T11NIzlvZWb/n1VvK1WNXuv9FvzlPvzrB2UHHXUvEQ/fZRtlPytXO +RWf3P0pZUdvTd8Q9RslGSrg378Q+vb7b91/A1V3/1VvFUUTAW0W+3z+4TU7AzUPPU+93/9s/ +T8K7PEZHRd+4vm/AWUc80znrumvMSWf3vknGvufZtkO5/0fLwj27zz/Asz/C20DV/0FLxS+5 +RkLC20jPwz2//0e8x0LCd0jNzzvT6+vLQUPd1zjjuFc/uD85wU8868A3Y74927s/91ldSFfd +Se9fb3fd1z/f39dI08pHd85AWb3jQcHTT8fOPcnCT0XDz0xj2dFfZ9/F199ryuNfZ0TP/0x3 +PFnr/0lH2/fR0c/I3//jwFfX1ePf0//Z0cbLa8fbvGdjyGtX3+fdd2Pva9ffTufjTu/nY1nn +1Vdr3UvT31Pd/0ld12d391dn61tKb+NPTu9MROtPVUVrQ0lVS0g/b0JI71VbSvdR2U9Z4+/L +22PRyG//3dXfyszM68/Rxu/r293rZ+PLa9tfSOvK12f/Wd3j787bW+9r7//f5/9R60/TydfT +zNfd3crJ2evr387H22Pv2W9X79Vnb2NTZ1dnV91K9+v/513X92drY2d3//9r42P////jb09d +UVdXWVtNTFVMQU5NS0ZRSE5KTUxZV1X373dv39vR1+vf09fP49vf29vvzuNZb2fv2ev3b2ff +5/fR21dn293R63fn59fj619VZ29r487X293Lw9f3Y/dRWXfZ72PKxMPBv8bJxcTLb2d3X1Hr +W1tZ39/d9+ffVWtrU01fY1VP2d/Z1d/v901VSU9XTUk1ODQ8NTxKPDE1QUdCU9/TV2PJ4+tX +V04/StvRz8e3srCvra20uLm731dFPzQ5Oz05PUzjzMXDubq3ubrEyc7rTEdPTzxGS0pD4+9j +P/fTyDVP97hLVf+30W/PrLPO17e4XffP9z9Cb/88SF3I/0zR1dk/T189MTY3LCcrLjIvOE9n +Y8m0rrOura2urq2zsbO2wcK/z993W008Oz04LzU5MjE7QD85VfdfUVPT311r0crj68vG0Xdn +519RQkY8Pjw7ODxJPD9F/99398Syvd22q6y1sqywr6+vsbe1wbvCvdPNy7vJ0ci/v9vLzMXr +21tTS0M8OTcxLC0xLSkqMi4rLTUyMDA5PTY3Pk0/Rkj/X3ffy8TBxL23vLy5t7u+v7y8vr2/ +v73AxL++vLy9vr2/vsO9wcfGxcfIy8jd53dVSkI+PDg3NDg1NjQ4ODw/Q0lPTl9n43fd2dXV +08vV09/j/2tbT0dBRD06OT09PT9ARk1VZ+PZ68vGvr+7uri3tbKwra6tra2ur7O2tr7Fx9Pn +509PTkVAPDw5NzUzOTc3NTg4OTw6PTw8O0I9Pz49Q0Q/P0NLQU5RRP9Xd1XHX87JzcS+vsC/ +uLu9trG0srGvr662rLuytLXLvsPZzyrGrT8zw18zY808X3dVLz9IKD13PjhJPTQ9RzI9SjU4 +PkQ3Rk4/RFFXY1P/93fd58TRv8zExMXBwe+9xb7Iw8nCvMzCucO5vMq7xNu/z+P3a2dFY0tj +Pd82QjpNOlVJQldDTznJP9tBwEjB53fO1TzfvFnVxV9Ny+NVvtFPu8pN379J/0PLTUX3PFN3 +QTzNNE85XUs/Z0k859M+X8lbS8zTScfOv8m1zc68vsC6yr24v/+wU1O00V27XbzVstHO2cw4 +we/n17bP1/drWU5HPjs5LCxBMS01Pzw9Qk1Tzl9jw9VX/9dvQ1k+QFNKQd3M6+O6vMPHv8Vv +2+vP913NWdfP38zVwre9uK6zr62vsre6vHfOPEdHIyY0LyMlRSovPm80QmtOP9HI69HFzffJ +Z0r/RD45Tj5DSudb0dW8vsqusNdIb+M3L0vfQefBsK+wra2tra2tra2tra2yvNPMyF85RM8t +OjM0Ki4qLyg9NSwmO1NfLTnN3TxB09P3TUxIW0Y4MkJANjU/59lryrLvvq2rb0+9zC84X29j +17OvrKysrKysrKysrK23tbiyxGfCw9dDT0o1NDcuLio+KicvNzMtNFc3Ql9LPTxP4zk2UedH +TVNdP0hnWTxB69dNTdPIw8XEub++w2NPV8fO68q0sravra2tra2tra2tra+vtb7Ly9VfPz81 +MjA1Ni4sLi8yMDQ4Nj5DO0JKV2dKTllNWV1OSUdOUVNbb+tnXVFPT0dMTkxZXV3/38jBwry5 +srW1s7G0sbGyt7m5vMK/x8jJ09HT3dXV1ePd09Xj3+P/W1lRT0dFPzs2NzUyMDAzMjA0Nzg4 +Oj4+P05VY/fT083Iwb/AwL2+vsHBw8PBwsDCx8PHy9HT0+f319nT08vLy8bCwL6+u7+/v7/I +zc3T629bV1NKRz9KPkBDPkFHRklVT0xGRT8+PEA9OzhHMj03PTo0RjxGPltbd83nweu+wru8 +ura5u8W7tLzFzLvj09PG/13n/+Ndd19jRUpdX1FO69PbycW3vr+4srq5urW/xsjC1W9nW0dD +PkM5PT07OT09PERGRU1XSExZa01FY01JQkg8Nzk3OTQ8OkM96/d30726vLKtsrWsrrOzsb2+ +wcvbW/dDTUdJPU5BPj5VRU3/5+/ZxrvNvcW8x8rBx9nV3/dPTl9RSl1jb2P3b2dRTkg+Pzs3 +NDI0Mjw6Qj9bU3fj2cnIu8DFvbq6yL++xcXIx9fd2edv53fK11/v481n1cPO1dvTzvf351lX +TWNVU1lbX1dX//9bb2POV2tv70lGR1E/UVNMQE9XZ1VfX2dj1+vT2c/PydO/77/Cv9l3X99f +90pITkE6TVU9Rv/rUW+/uL65scS2trrBzsW4d/9vTmdIS0YvLy83LS8vNTtMTkNCyL3Hyb21 +sryztbSwtrXB08G6xb531edjb0w7RkJJOT9JSFtf50TNd07PUWc67706NddPTzxrTj8vb+dL +Kziw5zA70cHbxbG+w62070jdwDgsQf9DRO++ycC0yf/d/0UxNUs8OFPjwL6zrVWts2M6189E +Lt/ITreusa6trcbGutE9U0hIRUNdb8rjZ1fZZ0k5TVM4P904NcnfMD3FW0xOSE08QzI9UzYt +W0gvOUbOPz/Kz0jrxc5OyLa857u1wdPAt8e8s7S2sK+5vrm3yuPM0U/Xs87Rua/A39XXPjg6 +MTM4NS87QjYvODYuKyoqKy4qKDhIOztvv93Au7eyvrnC18K6w7vItK23ta2trrvFrK5X77a4 +xWvBsb/Cys3C0UE+Nzk3Ki05Oz85StXfWU1ISzouKy0vLCoxPD9FXV3Prb43yrVPRWvfxufJ +us6svbyssd+z0dtfPUM9St1bTbPEz6+7ubXKuszDz9nGz9XOyMXGb9fZ/9s7R2M/MDU1MD0z +NUM+TElFY1NHRkZJRkdX/9fM68bGv8XLv8vIx8nHxMzOwcHJxsHGz8vO99/M33fT/2/fZ1Nb +VVFKR0tDPUU4ODs4MzU7OTlCRUddXWvV2dHKx8K/wry8x768ysfCz9HV2+/v929VU1tIS1dN +SFfvZ3fr/+/d71Vn/29VW93j3c7MysfJyM3O0Wt3b1lOTE5VU11Z/+f/d9nX593b19HTyc7J +vcHKv8bO29V3VV1MUVtXV3dd79fvz87O0cbGy8PHzMrH39H3b2NHSEpAPDs8PDk5OTg4OTU3 +Ojg7PD4+QUNGS0pVW2//49vNz9XO3f/V4//R3dXJxs2/wMjHs+PftrzHxMrFur3Rxr+9xMG8 +y8O5wcXGxcXGxcfdwLpT57lLLbRPLDxdNS42PTAtMjY5LjE7OTQ6SEFASN/3Z9PJzcnIxsbI +xb/Hysi9w8y/v762tbm4ur7Bu8rKyNHbb+/dT09rP0VFOT9MMzpCPj5GQkZNY0BHZ0RHXURA +WUtIT01BU1U9SGNFWU53V07b1ePGvr26ub+3u7y1vbi4vbvBwb/EwL/O68rTz8/jzdHMzt/r +1f/n509ITk89OTo5OTg9Ozw/QkNHQU5VRj5MRkdXa1/nzdnPvtFj28jI7//FzP/Tu85MzLvE +X8LDXcq+x1vBvM9DQEdL39HX08rA011DLy8wLCgqLTVVy7u6sa2xtcs+NDUvLTE3RuO0try2 +s7W1vcfMyclv58nJxLi4sMK+r7vbyt1n1+Nfd0dbTDlVSU1jZ8vN1cb/TONdPzg6VUXfzz0x +SUpPXVtTR1dbOy4uKi42OURTxK6tr7G8x8zvTklPa8zAxc3vwbe8vcDIwr7A3V1PY93vS0/H +v723ubnTX81HKSs0Ly9XRUHdt89LRFVOVU9RR1NNRExLU+fHwl2+v1X/zk5KTm9r2b61vLy5 +1WtbX+v3v73Dv87ZyL3Dxec4LC0817yvsMPRPzIxNDxBW/9ry7S0srfHY1NKOjpEPVnvY19I +PzpERUtANjzZSlFvPDZjR0fL37/HX8HjXbG9vLPVssHTuMjfucnEtruvusjZPiwuLDhJY9HP +U01XvLu7wFEpJCw0za+4vsLDuLXPNCMlMMSsq6u7d0E8QEpd99XJys9dUUk/TlVOU1s4PUpF +R0xVUUxXd8Kzy81Xz05nrK+6u0tLsbu2rMBPPTIuPWdX2Vk5RV1vQTcyLS1N60RLPjA6P0rn +yetZy7q4ra20w626xLm/vrmura2trb1fRT9N2c/P1f9XSUE5MzU4PlVvT1E/Ni8vNjtGRj80 +M0FGSltrQUtLTFdI5+fLwV/v28C1trCzwb6ztb28ur3BubW4srW9z2dfd9Pj28LBv7rH2WNH +1cbbvcNMLCYpKDK4s7vCNiQiIis4Z9FrXUg1OTs4Pz9RUT1JOzxASGdv72NEQ9s8Wb68/7ay +4721vMStrbG3rbi8r7W9sK+yu8DjWcC/xb6/72/Nw9Hv199OSj0/PUJOVf9nM0z/Q0/VTDs4 +QDYsL0lNY9X3Vzs8SDY1OT1Pb+9JNkhjb9drQzc5Sv/369X/X+PDvte+ts7Ps7rEvdXXta+t +s7/I38m0t+NvT0/ny8bO38jLwbrL1+NNV29jV1tFPVH3Tj83Ly44RE7Xt7rTWzYvN1XCvbm0 +xcvXW05GQFFPSl1ZST86PD9LVUlBQVXj2+NnQUBO68DZY11f18rN4+fn3+fF02/Gvr7R/8zP +w7y80cXCyb/HwcPAvc1n/3fnx9XT09fBa0ZBQv++uNFJW8hjPz02Lj1RWz8/a8VfOj0yKC4+ +MyY2yNNCR2/jY2/ra2/Nwr/f28O2tMTHvrCxrrfPtbW+u7O4yMy8vtnEvMTIxMdvR05VRklN +Sjo6PkEzMTs+Ny8vOzYrKiwuLTM2Ny86Sk89PUvRye//ysW/ubq+u7Ovr66xta6tra6wr62v +tby9uLO3vb3By9Pb605fb2ddY1lKS1lfSUdKRU1IST1AOz4/OjYyNDo4Ojk7QEU6QEQ/S0g+ +Q0RJSkxVV09O511NW1dbb1vO2c3Ky7/Dwbq/wcDKwr2/vb62vcC2v7vFwry/vb3Rv8Xnv933 +2f/va/9vT2dZSltITl1CXT9ETD1DQD5OPUJNPkJBNk84QE09QVlLR3dIXXdny2v/y9VvxdXn +wcrHxcbMvsbIt8nDu8XHw8zryt3d79/ZV8tbWWNTU29NX1dOb1v3Z13bX+Pn3e/O18fL2cXj +b8jM/9PPXczVWd/vV2vnUVFXT0FTVUBPWUdNSEVCRD08PDk+PTo9Pzg6Pjs6Pz5ATk5ATFFN +UWdba9vb3dHJx8K/vru3ubWzsbGurq2tra2vr66vr7Cvs7e4u72+w8jM1d3jd1tPS0ZBQT8/ +Pj46NzU0NDIwMDAvLzEuLzEyNTQ4OTk7Pj1AP01TV2Nn99/f19HOy8TFxMfFxsDAwcC9v76+ +v7+/xMC7vLy+vr3DvsbFx8/TzdPd3dn3b2NvXWNTTlFIR0REQ0Q/QUNJS0pdWVtnb+/n///f +d+/r39nn2+vv92dnXVFXWU9XV29dW2dnb+dr99nV29fZ2ePv/29vY//vb//Z793b0dHP1c/T +zdPZ21Xd1SqtrDwjrqwvLa2sNDK4uEkx77rRMWe8VzDTuj4xybtGPN3PY0vn0d93z8jV583H +62fV3VFMS8NdPMjdRtFNz+vrSdm060qxzWutUVWtwziurS6+rHdHsVM/tl9Eb7o+vLsxvb5I +ML3rQD9v7z5H0T8uP7czNEXXPjw5XVEtR10tR+9VPTXv9znZdzeuWzbOu293xe/ZvMHPvky/ +rbxF562t6zStr0i+rsbOta3vzbews+tJurTJyELOtF0409dE71tALU68NShCuzUqMuM9Lz0+ +LTZdQyksRWcyKS/X5ysv004ySt06Q8q2Vz7DrsFD3bmv3cy3t823ssNfwK22Z8W0r9v3vLdr +0bvFW8i8vFd3urnZUb2832PN2Vdbzuc8Qs3jPDVG31kuQu9HOktXNTx3WT49T9NZNFVvTmdv +VffO0+9vzsTL3dHCx8nNwL3GxbrFzr6/083HwMpva8lvV2NNTGNXPj5LV05CTmfvSz5Db0s4 +OktCOjg8Ozg+STc8X99ZR1fCx0nPssvZvLvA472vv/+/ucbrb9nDV+vFzcm8u7i6trK4yMHB +z0s/Tk43O0I3RXdvW2/Kw8jd28/ja1s9OD09PTUuQD80OV9LTkv3yf9nytffy8bGxsu/vs7N +wr/Dxu/f0dlrWdfJ71Nj9/9MR1VFNzxLRTE4TVc8P2/PUWPI0WPvxsf3Y7i51/e/usTVxL/H +xbm7v7+/vMnOwcXj1d3r70xVZ01XUU1ZU0FPSzo8T0k2NUtvQzRATEk+TW9MRVtdTElPV9vP +62v3u77ZybzFzsPDvri5t7S+xbi568e93UVPvtk6SsDrT0TMu01CyE4vNk8/MThjVTo9X9tA +PURPNzRESTo/WWdHP0rXTkFFystMa8fXT83H11/Zsr7XurG5xLe1vt+8tr/BtLrVwbeyv9u6 +tttZxtlTQd13OD1jTTE3SkgtL0k4MThHPj0/21VI3brX/8fAxN3Xw0k4Tu9KSv+4u99OU2NK +My9LTUVd/1n/287d3b28zc7j/9tVP+fFw2fNu79vx7rAwsvFxMzjwc3vyL/C09vNzNPbXWfv +Q0dCPD8/Q0ZRU+9VRGvv51VV9+9FS1dHSVX302NX9z01PEU8PkJZ51lDY1tKTd/b487d6+/N +x77HvLi5vr++v7y9z8nEvMfByb7FzczL111KU2NDV9lKTOfvSE9NTv/nY01Z23dV3+fvxMhn +Z0RG3WNHX1fja0RGV0k6S09XQz7JWz5T/0VJRj9ZSV3RX0pbb3dTSs9348HOY8O/vMVTy7bT +v8PXvrvJ6/fZv8zn09W0tsbNus/GxmdVY+vvQkdvdzs2OTw3Nzs8Nz4/NjZTP0FnSmvnV9Pb +0+tn28ZKW8fna+fPzk//wNfj/9m9vsrKub/Gu7q8vL23uOPIvsfj48bBzN/L1efMTErI1UhT +710/PU1OQVlrTzs4PkQvPFFAPUJBQ0A0QFdB//9rRllv1VFNX9XM1c3Nwc7GxtXZysnv67y5 +yFfO393O009vy/9v5+vn3dNNSdPHTU/300o+Y29NZ8znVc7L61PR22fd49vJt8zj78G9yc25 +vdHIvs1rY89v486/10rn60xJ3e9JTk1MOzlAOjw2PFFbOD1AQk02Nj5CVWddV1lbZ2NP92/G +zePGvbzK1cvK2efHyMXLw8rbyr/Nd+/nyHd323fT2993/3fb1UxZb9tPT1vT3Vdrb1dT9+dr +X2vTTVPT90ZJR0VTR1NMX9fvV1VZSUpvd1//z8PXTOvN79vN0cLA6+//Y29na2vLxMfV09v/ +d/fPzMnV0ePr319KV93P91vb7/dnTGNjd+/f58rG119T705dV0lN30o9SllMRk5ORT1n60Vd +9106S19bSVvV09PT23fPx8rC3c3Ly9fJb+u/29vHxs7My/9Nb9dfa2fd18rZ/2tv3XfXX2/Z +TmfnV1ffV/dvS1lVT05ARW9NZ29NzNlOSlFd301HW1lb/8//WdnVa1tr92d3/99j/8jfb99d +/83P38/Z093/0ef319Pfy8Z368/nWUdNd2f/6+dda/f/909Pd9/ja+Pn19POb+ffa+tXX3ff +a//X61Fjd2tXSktbWU53d1VZ987b49X3/83Za3fVwb7vZ+fd591ja+Pn629dP11dT0n3d0pO +Z2tKb813W+trb9Pf/+Pd12/j31frzNX/z9HbY13r4/dTWfdvTm9ZSFld2/dbXXdbUWdd/1XL +xltX1+9v79fH0d/O/9ffb9X/SnfdXev/28//6+fn2+/rz29f1c13/+9r39Hv2eP/42fnWVNZ +Y2NZW1vr1d3/b99nWf9d99HLysXK1efV31Xj12tX2d3/Z2dXSE5ZTE1FR1FXTU9HTElTY0hG +Ue9bWU5dd193/9nf19Hnb/fv99HZ79PV2dXXb+/j58nL08rV18PH08rG173JzsnO28vCxcvZ +ztfvT2df7+tMSEJHW1NLSUxZVU9JRUtVTU5RX2P/VUdf31tf71tbb29VWVFMd1FKS11bSEtZ +X1djU1Pn/1tr52f309n30e/v0dfryc/VzsnH093P2dnMy87OysHHwb7Cvb6/ysTGzMvd59/d +3dn/X91fa1tVU1dvZ3ddT1dRT0JAP0tPRj9ETVdOTUpISltTSEVET1dbU19XSl9ZSkhFTUlb +WVn36+fTze/XxM7b18rIwr/GwcK/vrvEz8nNy2//W1VjV19ja1tTW1Nfa+//b/f3//9vb19V +Y9vf3//v59nj49Xf28/P4+vX3d/fa/f359nj/1tjX1tbUVf349nr19fV19X///9db2tXVU9H +P0E+RUVKS0lMUU5dTEj3d3fr3etrW2/nXVdd29nja+/n5+vn38932dPXzs7N287f1dvPyNHM +09Xr92dj4+fv4/d39193XVtdX2/f/19v5+drZ/9v599j9+f/z8zOx8rDycvOx8nLyMnHytPr +5+tnVV9jWVNZW09KQT9FRzw+Pj5ERUpOTVlLUV9JQ0pNSUlLTVVbTlln//93Y19ZY+ddZ+/b +y9XV08rH19/b59XKyMLEzsXKy8jNzNfn193R5+vRy8fEw8TDwcbDxNHj393Vzszb/29ZV2Nd +UVlNVU9TVU1NSUtKSkVIRkRHR1dbXVVOR0tfSUhNPkJRU01NU19rd/fv/1dv3dfOyMjLy8vf +293j59XR09vf2d3Z083OyM3PxM3My87Jzs7Nz9nf9+/j0etja2NjZ11ZUVdJT0pVU0pOSERD +P0NHSUZCSUpNSUZLS1drZ+vn783MzdPPzszN0dPJ0+fO3W/r09fV3+fPyM7b2/fV1dVv19PP +zutZV2d3Z2tra2drV1tfW1lTUWNv39ndTln3W1lXSVFjY93Z7//FyM7n9+/V52N3a+vRzMvf +29XV1eN32dXP2dP349/j43dTXV9bQ05GQ0tMV09RT11bR0JMTkxbT05MW/fb2/dv5+fO29/d +zM3PzM/R1+dj39Hj1+dbV3dfWVVn69/r52ddT13X0+Nn59vZztXrX9vR291v3+9v09Hfa1/v +42dV2ePfY/9ZW+PR0+tb3dfn499jV+vvb3dnd+N3b9fZ71VET09da1lOUUtXT0xNSFtbX1lb +Y2f/X//NwcjMz2/fybzI0dXPz8rjVV1r485PR0tVXVtJRU9jZ+t3W+/n411jb+vZ1+NrZ9vO +011MTmfr2c/Tzcvb32/j3+fV0cnFzdlv41dX91tKWWv/409JU1t33+tNT0RGUVtX/+tKSERH +SVtRWV9La89fU8/H1dvX39/rxLm958C6v7W90f/RwsLfW9nNydH352/DzF1nSlXTa0JNSERH +Pjw2O/9XSDtO29NTPEFHV93/V0Nb91NbS0JRXcfCy8Xn38rv577N09fPzc7LZ93Rx8HKvb7L +39nn18bK/+dvd9/N3VdRWUhDUTs4d0xNu1syMjBVzlVJWd/GwNk/MjxOwbxMS0/T07rHb7C/ +69lVPtGuvciwwk6+9z5ESOPIXzRRvv9vSzw+47+/zltFx81bw9lJT79RMT9fRmtTU9VZMdfb +PES5az/F51m7vM7byOvGvVXjv2fXzTj32UfdTUU/Rt9DOV09Y+NMvj882///Oj3HVdfZS01b +wbnjd8RbvbzB00mssuuvT0+us7/bQsy7vF3bz0xNtmMxyL430esy68frWWc9PlVTMVfKK10/ +MEhrNjLvNTjLSzV3wDdXzWdjwlvGMa1bvuM/vt/IzetXvs3HwkC32V3V1z9X177LyddMd99j +ylNrPMnd7/9rZ1XIxUlrY7tbv+c8tcvPY9nJT8a8PUi5U8q9XW//zuPHPkxTvEo4uTk40U9N +P0Q7W7cyM2ddSf9vMzm6z0tOQC21sDxjyUjHusw8Ubi3ur03Nq3DUUhO3bC6ySVA9+vF5z7J +vkz/zT5fW7xVRMNIPcxrOsDE3UxZRk9VV0pb10hKZ2vXQ1PIyLi8PFu3x3exzFe7xL7GycFT +y7Tdzbo3QKzNML3MMj9KZ76vvzNn5yMnQC48trzfvr5NTOf/yr5EO85fz77BXVu0zVFLJz6v +3y7T22vKti8luq1ET7Ur1a33Kz63rTw+RStLvNs3R99fd71FObGuW7/rMretvD08vbdd6+/P +r8ROYzpOYz5RvrisrLO5999fNEzvRMEyR7g7X73bLy1A2yN3rc05P7W2NyoyNrOuv8vZtbLN +Ozg+b9dvPjr/tb/rZ8XKyb7GRU7Nxzorx8ZRQVlCOkjJ4ztX389rSC5RtLfDvb69xOfOx8zF +LjzDubtjTz4qLT9VPV2urbmvu1Pjz++8dz7f0b671W/Mw7rZNzc0NDs3Ki1HZ99jPEVdTEdd +Rl29s73PTV24trrHx7y0sdfVV1PL2UosOuPJzkQrO7RXOTZLuqyuua+4tbfDyLzZ98XNyMvI +41tBOjkzNC4zMCstMjg3OT5DSkI6ODhHwL7C51drzdPIvsW0wri7wLq8zv9fSbq/07ndUXdj +WbO3y7W6ta+str7BXdfXX+fd2//VO09fSVc9LS82Li0uKzA2LiosLzc+S1XrzevAy8e7ybe3 +u766trOxw8PN49nVWV9rUe9ORknf3VfPV0/Pyc+2ub6zwbm/v8e7vtfZUVNHTU8zRTo1Pj47 +N0A1MSswOjQxLjE4QVVn3by2rqysrKysrKysrKyur6++xc/jTF08MTEpKiktLygsMi89P1c/ +19HIvbyxs7mvvb/Husu/zedfUV9ITUVOQkk+Qz85Pj41RUVGREM/TWPdwb+2rq6tra2tra2t +rbKyu73DyF9PQTg5LCwrLCwtKiowLTQ7PkZbW9nFu7itra2trbK0sbjBzP9JPT43Oj0/PDY+ +OUBDRUA6PTQ5NTE+PDw+QUlvwrmtq6ysraysrKysrKyytriysrS/70w/ODYuLSwnJCQmLDE2 +QEDdXfe/uq+trrevsLOvuLC7w8/dTz5CNTIuKiYnKCkrKiovMTM9U2PLxcG6uK6tra2tubm0 +uLOwtLa4vbq3uLW2ur7Fvbe5wru+w8xbY1P3V000MCwrKikoIyMjIyQrMD1NTmfZxLWurK2s +ubm5uLOzv8PO1ePN29PvVzkxLi8xMjIuMjU9Rv/bxry2raysrK2tra2trrG2ur7R51tFPjkv +KCkpKCYnKycqLTY+TN3r07uvuLKtrq2tsLCurbG0ucHDd01KQDYyLiwzLi81NzU6P0JPU0pR +V11d493PxsfGybyxtrq/w8PHzMzO39fEa7+0v1nn1cnNwL3AxcO9td9vd9fPXU9C3W9DNDA0 +KyMjKDI3OFHFwrm7sa++y8a/tr7CvLKusK+ytsfbTDstIyIiIiIiIycvOm/Py9vDtq2trq+t +ra+xubu/tri5zOvN50Y7KigvLCwxODpE58Wxuresq7K8u864xN22s7y3vc+1vPdJPC8sKCQu +PjA6TkVCQ0rrTTMvLjsvOUtnzri1sbbAvLHC513fwN3/ydfBvrq3xru2v7u6tcHfX1dVWUJL +RTZAY/80MkdINS4jKCowLCpCZ7vBrbaurbS3t77rw8O7vrmzra+ttb66ylc9LiojKSclKy0q +Nkb/vK+sq6usrK6wwN/J70VRQe/r/1NrTGc3OSszNikkJC42PTlRwK6svq+svqyuvsy/u7TI +0bTfu8JJTFFLYzguOCwzOCg6SDJAP0bb693FyK24u768s7PE0d3Xz/fFuLjVtLnHrbi/urS6 +28/Ryf/rTEvCzDk3LzM7KSMvYyszSSw/40Qv98pbUTf3WdPKTcKzu7OyvbW9x7/nzUdKPuc4 +MWPrX1m9ucF3wj9M3SlBOydFxVPjZ7z/xq3VvaznS61DzUGxRi6tuzS5X8RZ374o3UEryy8z +xlPARdnFStG0M7XLO8JfQLjvX7o/z7stu0g1vzs33zRBWyu9NbhHT641rkwvrkd3tC6xwePf +sz9vrCesKzmsM7yxNqw2Ub++PMvKNawurj/FSLY0tOc51U02v0I81TXJQ+suvi7B0zPbYy++ +Tz+tONW9QNe6Mm+xL61nN60sb602tK4+tWdBrS+/xi3MySyuNmc/QD3jN7Uqryxf4zW9TTuv +LcrBP607xa4yrev/rz66zkfj2z/EyU3Ru8rT68zKRMPOSc///z/rW0xKOcs6W+s7V9NOZ8Y2 +a9E9b0VPV13JyUy/U/fTxsi5PK09u8PJua1dsNXKvOfCPve/Mbc7/1n3Sdk21180xTczvyxn +1yq/My/ZMdVKM8MyN78tV1szxDJbuS2/VT3dw8ay77TLxa7Hxq13rcC9sLdbrT+t2V2yY7yy +/7xfw9vjPMRZRVHF00PEd1HNS85bTevMOLg4Sc8w9zA6UzlENk88QEkzUz9nNMlH389K20bH +d120R8K7NbfTP67nVbQvTrQvsUDXV7FAtV/PvNVHsDbLy0nFPMRVY9tHxTg/vy3KPD/rxDa2 +MN9ZZ0S4QblGu9fKXVvTSdvj1T65RuPGb0u6OrxPd3fnX/dV5022W9W9QbRPxWOvQLrAwL7O +y8i8PL1LtEPXV7k7xDjCO3fO4zq+PlnRREPXO88vQ0jrNmc9Y009RUkvuTRHdzpLPMY5TVnN +VT21U9XXyGu34768xneyXcLIv0a6P7nV18JXukTvtj/MS89BuFtLv1PZW9tR091CyldDvj3B +O9XPS9vKOsc7xz1jzTjTUePdVc8/skG7Mt3vb9k/uzq0U9/FQ9tB2c80uzu3OrtLzO/XVdlL +PMVE107HSl9r3WM9W2dJyzGwLr7ZRtF360++SuPf40PjX0rD3z26QcNIvz+9Qe+7O8LvVbk0 +tfddyNndb0C9VbtVxW/TX09TVUhJ70VXY009a1lH/0rTTfe/yPfD47tnxb+/z7fA2bLTXbVX +u0m/ScDOY9XOV1fNPms+azTPPTpfOT9FMFs9zzdJQu8+90VfWfc32TjRWW9vV9dv/2u/TblN +yEK+90K6PLhNxM5DuetVvefbTLjvw+O7zve6v0fDVchOtD+/013CM68wska9T8+/QM5HSc1R +711GzULKNboqzjvjTi+5Mt1vX0FK40ZX68pfXbtE28fKTsfdZ1XLVePN0zvX91M6wkxOPbg5 +RMI/zWO9SrnDxNXvvlG02f+tWbhPvd/fs0i80bpGw79Iv0vXQE9nMMs8QDZbPUlGMV9ESjnr +TUVKWzz/70dv28NMzNtFvl/Z49fFXchvWefRa1XFVdlXulXTvc/Rzs3jwc7RyMzIwcTNv8jd +yMm/19Pf6+dnS2/nTGtPQFlFRz9DPjg6PjxCQEJJSmNM30Z3a2dM7+ffR9/X21m81dPLz83I +vVnTxM9O3cpTxV9nUbxvU9PvSXdVX0bfR+vZZ8M/vVPNTb8+698+/1e/POvJ28PEuc23612+ +SGM2TD1L9zPFycK/w6zjrLGu17RBz0dVIy0vLykzMDk/Sjc9Zz48Ok1OZ87NraysrKysrK2t +usNROSYnIiIiIiMpLjVGu6+srK2tra2tr8PXXz0xMS8/SUbfv763vK/Gv8ZGL1NELytBOE9V +38mxr7q6rb3Bzrj/t8bHtbOzu7CzvMDXT0Y0JiIkIyMjIyMjJis5WcK9rKusrKyssrK0wsnn +38bbwevEuN9nusrXwkdTzM45Pci+Qbq7tbi1zsW541lO10ZL5+vDvLq9t7W+y9tRNCwnIyIi +IiIiIiMkKzRLa7Szra2tra2tra+zvv9n31tRTVv/d//n12PXxc/Da8zLv9X31b/G18zByb7K +xMK/w7/Gv8TGzt/O0Wd33VVrSk0/PTsxLSwqKCkpLCosLzEyPVXXyLazr6ysrayusrjBz85T +Qz44OTc2NzdHRFNd3f/PvcTn08C9vcG0r7Cysbi0ubnI519ZOjo1OzxHTVn/b13vRU9FPS8u +Ly4rMDA5QFdb/768tbezrbKvs7Kzt7m8v83Pzd3//1lIR0M/NDIyNCwvMTYzNz1GWU9j1b66 +vbGzrrK1tbq9vdfnY2tOSUlBRklBREFOPEg/TEJMTEljd9XPvbm3t6+1trW5u7zBxsLD1b/J +vsvH5/fnT0lJOjcvKykoJyUnKCsrLzc7OUz3/09v0cnPu7q2trW2tLy1ub3Cw87N/+tv6+vd +59HjysLOyb61ysvAv+/3zMzZx8nHwcnFys7Bwcy9x7/J09Nra04+Pzo1NC8uLSkoKSYjJywp +KTA6OjZT2dV3u7extqysrK6tsbNFvshvZ+/rX+vIzMzEwcTOwc3IzHfdvtXv1c/KZ9e/07+5 +u8DEzNNXV11fS1dn51lTXV88PjwwLSwuKSgpKyskLio0NUZV983Nx825tba8sqystK2vrLO4 +xcPO90xIUUJFV0hn39HTzsXCzdnEU9W/3+drzOtP08DAt7Kys7y9u9l36+vfT2fC0V9r3Ugz +OTwuKjAsJigtKiMsNjA9StPvW8+7xc3Auq+/r66vsrnAxW9RQzo2OTg9PUNZ5+fKyMHF09vj +TT7V31E+U+tPZ8m7t66sraysrLm3r661sK2tsK6vvc3TVzcvNSwlIickIyMqKC47REJLY8xT +0e/AxcPBtbi1wr/dXz88NDQuNDA2OEZVU9HNxtXRzv9R281JQf/XXee3uryysbm6sba2sq2u +rq2tra2vsLzLZ04/NDEvKSYmKCIrLjgqPEFLPVnO3dO/urO9s7u9ys1jRj0/PDg9P0FDTExj +TvdTTU1DRztPPktMUd3jy8W6s720uru4urK0rrGtra2tra2vtL3L3Vs+OzsvLyouKjcsPjlE +PktbRkbv3dvjtLm8ubG7xtv/QDswMi8tLjQ1NkBFTD9LPjw5OzkzO0s/R9fIxL+usrGurbKx +sK+xrK2srKysrKyzt7jMSm9INi80KyosLywwP0M+S9dVR2/v/9fGvLq0tLW7vtPbTUU7PDM1 +NDU0PTpGPkxISz0+PT41QUdFRc3XyL2vt7Wvr7aysra4sLWztK61r7m3zM9OSDUwLiwrKist +LjA3QUBXTtXI0d/Fv8m/t6+zrayttLa82U9JPjMxNTQ3NUU/TUxXR05EPTs7MzpERUlf08zN +ubnAvLS5xrO3u7qvr7GzsbG4wr7NWzU1NTUmJzA1KzI7Ty493/9BRr3rd8qusruura28uLTM +T013RDNEU0g/V91TR0dXOTI5MzAyPjZB3eNNb7rZzbq3vMO2vMW8uLq2rbK1ubG6x9FZSjIz +LDE0LDQ5PDJNRVNOwsDvu7u4xrKsxrfIrMPGtrvDyV9bMzQtMCktLTgwOU/nX8zrzkxXQ0M/ +PTpJREjKtnf3v7nv17Szvr21usK7uMC1rbTIuL7Rd01JMi4tKjEqKj0yOT0u32NB48S+wL+t +u8awr7fKvLPHY73B3V9r7zw2QDgzMTc/PEDr38/DwdVj3e88QUlAPDw0VbxrW86vvdG/rF+u +vbivwa25ra25vMDrxkItyy8pVzw0KS9HNyZEPC8yukPGz7evSrmw289Zvchb27lnudPrdzVJ +NSs0NzJBT/fP57i93dtXRzg3OTw1S19T666sw7Wsrry4tb63srG1rKyysLG2y1dPSDsuLC4w +Ky8+LSg2NzUuOltBRsHT67muu8HBs8LOws7Nyr6+yL6+y29VSjs8PDk8REZn3dvX4+drUUU+ +OTo6Oz1BQUlj19PbwcS/tra4tK+ur7Czub6/yf9nW0A+PjgwMS8uKy8rLTE2Nj5DT+PT08e9 +vb6/vL68tbW0r6+wr661ubi8ydHP3+/bb1tbWU9KTUxDRkhKSEpNS0pNRkFMSkVJTkpJW2/3 +48rHxMDGycbIztfXd1tXSz06OjIuLy8sLi4vLzY7P07v18S7srGwra2tra2tra6ur7O4ur/L +1e9LQkE7NDI0NTQ4OjtBTFdXX/9fX19KVVFCQ0lGRGPd2cm8uLu1sri4tbm+v73Izc7VW1VR +PTo8OzM1MzIuMTU0QUh30cS7s7Cvrq2vsK6vtrW1vsfGz+dnX0w/OjYtKyooKSkpLC41O0BT +Z9fOy77Fvbm9x8fK39fRz9PGv8XFwcvKxcPTycjJzsvK693bZ01ZV0VAQjsvNDMuMT47SVnv +1cy8urWzsa6ura2vtbW3u73Cw9vvXUM5NC8uLC8tLjQ8PUJVY93PzcjRvsLR0+9jTF9bTevR +y9HJy9nLzcvZzcrTycvR5+NvT0pIPz86NjAvLi0sLS41PUhP78e8uLSvr62tra2tra2tr7O3 +vsHLY089NjMsLCwsLS4zOD1ESuv/09PFytPN79lH72/32dXFu7+8vrvCv8a8wMHCvcvV09tP +U3c/PEA6MisuKyorLTE4UVXvzbi8tq+trKysrKysrq+0t7zI4/dbPjUzLysuLi0tODc6Ql1X +WePJz9vT71lrb0gwxb1B2f//tcHbu8+6tcGxvLmvvcnTz8vZZ1E3Pz0uJyQkJi8xKzJHY2/B +zbWtrKysrKurq6ysurO6xGdTPTg9NzEwNTU4Oz00N0BAN2dZRT1KTVPvxtHKtrb/99Vn9+/3 +27Gur62urLC4v9VHyT8vPDxILygpJC9CRiw0U0H/TDhfra2urbmtra2tt7TBx8VnNTpLX1tV +PUJrz0hCPjdDQDzn/0dLY2fd583BvrrfPT1BY+/398ivsK+1trm8tu/v3/dbPkFGPCsvKzXV +PztVN0BOMUqytcG0t7y1r6y8y7z/b2tdQkdf109FY0pnTzM4Nzg6TlVdQ0FE/7/Bxbm6zutv +b+fXtrjIuK+tsrq9vt9fZ0pJW0Y5Ni87My9nOiw9Y1M7PsO7wsm9v761rq26ur9rP0pZT1VV +42/bzspdS0E1ODg6OkZRTEpMZ2fPvrvAy2tb68nDu7Ozs7Ctra6yurzKXV1bVUAxLiooLi8t +MS8wMjM7R0tv0cvCvLi0uLe4wsXI0efTd11NSUdDRUFDU1/3TmPr3ePX029vWd/f0dPT92Nr +XdnPzs7L1dPGwbq4tLW1t7a3ubrB1WNKPUJANzUrLSwrKisyNzs3O03/zMC1s7a3tLS0tbq8 +xtNjV1NOSEY8Ojo6RE1PUVlnWUhGTVtjX1dOV1Pfzce/vbu3t7azr62ws7i7vb7IzutfQDky +LS4uKS4tKTAwNEhFY9nGvLyzra2tra2ur7G5usrbV0U8NC8vLi8tLS8vMzg6R0tT/2dv2+PV +ysfOxcfNwr++urq5t7a1sK+urrC0try9v9XZX0Y9ODAtLCoqKissMDI5Rknr1cC7tLK0r6+x +sbK8vsLZY19HOzoyLy4tLi4xMTc5P0pba9fIw8PHys3Nys7JyNnTysvNv8PBuru6t7a1srS2 +ub2/xMnVa2NLPTg0MTAtLi0uLzI3PUROW9nKvrm1sbK1srS4urrI28NIQD4+NTczMTEwMjM7 +PkVPXe/ZzMS/ur3CvcHMx8bXzcnT1dPV29PGxcXFx8PEv8TBwMPHzdfrX01JPjg3MTAuLi0u +Li8vMzk9Q0xd287Evbm7ubi6urq6vb7D1ed3V0hKR0dJR0ZMV13n1czCv7u5t7e5u7y9w8fX +2/djSktJSz/3JNW4TEkqTLO8/+fPysnRzN/f61lLPD5NPDw/PDs1Ozo4Mjk+RUhd3c/Hv7y4 +tLCsrLG+yce7u7nD11NJQD9IRUE/PTY3SVnZ3dnbycm/wsPPW1dXUUxBOz1AR2fHv7/Bwb++ +vr7GyWtn52ddT0VDSllbR0Q8Oz5AP0JFVWtNW+vEvby7urq4usPJyMrVSz06Sd3Kz+d3a/9j +W1VJQDs8RlN35+//08vAv8jTXUs9S1tPPjk5R9W7s7G0uLe4ur7OX1lOVV9bU1djZ1lbWU9H +RD4+PT1BPT1IW1lVXdPHuri1usn/18jH1Ug8Ru/Dwszr/9/n52dORTo0Nz9TX2Nba82+vL/O +519FQFNnSzsvTN+6s66vrq2srrjCzdv/VUxPRkVZX0w/QkpTTUk9NThATUs6PVN3y9fTxrq3 +ub3Fz9/r0eNLPUld99nIy9vf2e9ZR0Q+ODQ1OkRRX2/Rx8HDxdHfYz9HX1s9OD13wrm0srCt +ra28yMrM3VVHQ0ZKT05APD1LS09IPDdMWUE2O03RzGNZY8+1srrLyMDD5/fJx+9V793NycfH +09vb31lERj88Oj9DSk1b59fn2dlr/1tITW9HP0hfz7y2sLC0sq+3vr6/wc/Z419XW11AODg7 +PDw8OjM0PTw3OkRGR09n59HAt7vAwsHAu8XZ2d3VzMfFwMLMzs/nWVdJQT8+PDs9P1FZXWvb +729nX1lKPUffY0dHXdvOxrq3vbmvr7e4uLzAx8/Z729j71NJSFVMQT1BPTo5PDo8PT9RWVVO +58/T0czN3fdf0cxfU+Pn4+PT193359/3T09RSz8/REZHVWvr79HJxcjNysbN0cvV08TKzdfL +x8rIv76+wL++v8LHzdHd2ddvV0lLR0I/NzY0MzQ1NDY6P0VLUVtfd+/d19PTz8rExsXFw8O/ +xMnHy87Tztff619PTEdKTUxKS05VVVVPVVVZU11rX2/33dnP68rRyMnOz9PX083Jz83T19nO +0dvj929nX2NXUU9LT0xMTUtPUVNPT09NUUlKTUtTT2dd/9nOycvGwb68vL2/wMTByMzR23dn +TkVJRT8/QEA+PkFAQEdLV2v/1czFxb/Cv7/Ew8PFx8TIztXX19vd9+//7293X11nZ2tnW1VV +T0hFRUlDPz8/P0E+PkA/P0ZKV2dv4+vR0c7PzcjBwcC+vr29v77AvsbNztvjd11dT09HTEhM +SEZJTU1LTlFVVWfd19HPzcTCv76+wcTEy8zOzOvf42fjX2NTV1VVT09NTUpMRkxGSE1JT1FV +UVFPVVdOTkpMTUxLTlFbXW9rd3fn59vT0c/RycXBwcHBv77BxcHBx8jOyNHV29vd/29ZVUpK +R0VDREhHS05TXW/n09HOysbIxcjJy8/Tz9XT/2f/V2NXTldXS1dPT05NT01IR0dGRkdLQ0ZD +Q0dJS09bXWN379fPzcbIxcbCv8PCw7+/wcDEwsHIyszP0fdvZ3dfS01KSkVKSERCRkZGSk5T +TlNNT1ldb/fbzszIzMjIxMjFw8fIy83Z2eNjUU9TTU5MSUpHSElCSkpHV2d3d+/n6+fj5+/j +/+//d//j39fb0cvNz8rJx8LCxMfGxcnGys/Ozd3f4+NjWV1RR0dGRj9EPjw+Pzw5PDs8P0RG +TFddU193///n39nRz87OxsfGysfM19nduTQ9rL0lPqw6P63OQcJrRcTnOee6PWe16z+6ukhr +uchK3cpn99VZV9vZV3fD91nKyu/Iz3fX1Wfn13dv0+dX1cxF38dnQWtVPkZXPj9dRzxFRzxM +STk8Q0o9P1tHTs/r78TBwLvCwLi+xsbC32e/yk3CxUe9vUfd1d/b38rTb9m/RVtbxU41Qm9N +NUs4a2M72URGvtdRyNXPvlvfxNf3zuvLzcvN/87I29lb3evbVUpX701GS0dTU0RAQ05PRUxb +a+/X0dXOxr3X473BTcNO28TvRs7GTsHbyL+7utnCv9nVWWdBP04wNTQ+LTo7PNs230fjW1Xv +QWdNz01ZzE7E68G+wrzFvb2/zdPA58nJ113n1UVTRjs7Pjo3PDtFSkpX3cO+xLm5uLS5xbq7 +//9Za+PZzNW+sr68tse7w7/Fd29PU0M6QUZVMURNPDE2TjswRDs9QVM+Ud1TXc7Za8HF09vH +z87O92/j/9NDX09d/0FnPVk/PEY7TjrvXc69z7rByLa51f/PW1/fTU5d67rNRbDFtsC82bjA +N7gyrkU0rS65vz+8ONFCSzs9XzjbPk7vV9VPz8n/uMvCvcLJ48/Rd9NKb1HbT0r/V3dXS1dL +WzpFRUhHXz5n929jX8VvZ7hLY///OtNON79Eb75NvTe1rS+sPUu3Sbw7sV1v2edNW8I1Vc07 +Y01JUzLMMkfRP+9PyVPIS2/VTcBjSb4971u/5zm2SLs8tTeu2d3F3bjV48V3zcLAyNXJa7RO +u1O808nPXbZGu0O7QUe4RDW4L8tHZ18yzUk3Y/85ty+5Ns2/NMvPLbY0zzpMTDvbvjfr5zvj +Z09VWedTTcU8yjWtMrvFP7hLd7/du75dtUTFPNm9S1XDO7itLa0rTbUvrDG7ObzEO79BPLYu +rjbJazu2PlW7Lq850bsurjS00UC8Tj+5OLZIV8I1w0XnTz3AN8LPMK4vRb5Lu9dRyUPPZ9td +RfdJzkhJ43c/uji0OFm0LrAvtzS878tdU8RvUbsvrje3vj+0OK5IxcJCskS3/z2yU83B3U/f +vf9byj23P8rLQspOd0pjP2s5zU5GzT/NP91K30xGzDjr1TTP529G21PnU2NHR+dCvNtHxj6u +McFfW8nVzMz3utlT18pXyMpPxT5vwjmxR0+9P+vDS7/XXbtO/7hfz64urDg2rFnjsTuvb0+u +U3fTRdV3NP9TP7pBVd0860tZ69s4vj0yvi22TU7XTkrLQkK9Ql/EOlu9ObxNR68vXbhM2blI +ulu+1+/Zxv/M2dVZvVPP485dOsF3ObpTV0PPUz7vW0n/Re9Ld+tb/8E/zsJj3993zF9r33dK +51l3/z3ZyTPd10RvTtFbTt9NV1tf59d3d9nKd9XVy83Zv8vTwMDnwc++w2vEzNPj0+vn72vX +a2/nY+fnT89Ma/db/1Nf/0VfX1dbSN9XT1FjVU1vSmtOX1lrW1tZWU1ZTFtOUVtPSlNPV01b +VVtXWXdb71Nr6/f373fdY3fR/9HX18fZzNPR1c7b09fjz9fbytPGz83Pzt/L39fZ59X/zt3V +y9fK08vR08rXz9HV2+Pd6+fva2ddXVtMWUlMSkhJQEtEP0pDSUpFU1VLY0v3Uf9OZ1lRb09b +/1vr/9fv1+fd3+/d5+vZ79vj29nV29nd7+fd99l35+dv5/fr92v/Y+9f/2tn41vn929r713/ +d293W+93d+v34/fZd9v/69nv59X/0fff3dnj39nr3edr33fj9+dvY2tra2//9+fb5+vf3+Pj +293b09nd59/jb/9rb2dX91NfV01PSUhPSk5JUUlOUURXRVNRV11VY29rd+/r6+Pv6//392f/ +393Z2dHZzt/N19HX0dfZ2c/b18/Pzs/O19PZ49tr72db51n3W+9jd2dbXVdfVV9Xa1N3WW9v +d2v/7+tvb/dj62v/b/f/39/d2dHRys/O09PO68/Xa9XM21Fv0dfvZ9/3VVln3VlG511VU01f +U1FRY1NNUV1vQ0xOTUtR/09ZWV9ra/fv52dv783b9/fb19Xn1dnv0dPNb93Dy2tRzu9n4/9v +Sl3d31nv229ra19bTe9vZ9VTSVnf1WPZ79/fzdnI2cnJzdu4tlNN2b7CWevn31u7ykFJyLd3 +SV9Bvb9IOUZXzdfPQzLNs0JHbztbvko4PU3V7+c4OufBVz5L51t3zDlOZ19PzOc0Y8vO6+tf +xMfCb87BwL1rx8Ovul/Zv7iwvUpTvsvE01M3PN/Pazs6O0XGVTMuOG9dOC45R01NRTw6WdFd +WVnr2dHMw9vf38avw//fua2w2Wu7sL13zsnHx79XWdvKz87rd1nZysn/Y+/bz/9ZVUlI79/3 +R0tO59XvU0pXb1NBODtCPzw6PUVOUXdNVWPVW1dMPkVGRjpBQUld11Xfu7y+wte+tLLI69fH +zGNFQ1nX09v/zsvT09dZ2XdbY0c7TM/n59vTua+z2cO9tq+2vrm0v8bC1/9JRkpZSz5H07/D +62tXUzkrJCMjIyMkKTM/W8+/vLmsrMw0MUfIzEo097Kutse7tq+z0Wdb62PnUzhIXdfJWU/V +vbvDTnfVXetbRUn3vrm+xL+/w+9HT+fbY1lLQjo0MTAvKzI3O0v/ybCssba6v81ZOjAyMjI2 +WVtbsKutvLyyrKy+Ttu/vVVfa8u5sLTGxr7CyFUzLzg5MjAwPVNJTj083+9N6zkvQD1KZ05O +w7u1rLq/sbr3zcdJQUhJd8TIzL3AxNtnRjAwLzg7QvfZvry3tsTG609VOikmKjNLy7Wxr7G5 +y2M8Oj9G2c7JuK+0vr3Zz7XTNjw9Sus8WcFfr706PVPj4/85LCxEura5vMKxr8w6LDEsOjIt +Qe+1rKyvsLW4yz0qKSsuMzY6W7K3rL3Ar8HrSj490brPvbG0vMG60c3G09nO0U1rX1NvSi4v +vGMzRDY231MyMkRXPjdFPsy9XdlTza25yc0+Y7q6W0pL08vJy9m0trO5Y0xOOzIvMUV3xbiu +tLezr8FvV0EzOjYtQHdn79VvR/d3PTxNUUVRVS9My1PXzNHI519XTUdLTEhFVTs2TF9Dyb6+ +3a6svK2tvMbEubatrbiurbbBuNEpOU42Qkk3RcbAxcdfR0U+KiIiIiIkKCtE71dXP0xRY1E/ +P2ddu7G0r6ysrKyyt7Kssba1tL/Dwc9vuLGxv2++/8pONElBV8vVK0BNPDQyMiwx7009/zwy +Ny0nLSgoMS43PefTtLy7vs/Oyms+PtW8urSusq2svrq6t62trq2tra2tsrCtvL++v9W972Nb +OkE4PjY2LC8mKTAqOS1ELjs+MC8uLC00MkhKTF/Nyb3Xysn3V9e+X83nwNu4u1m9zr69vv/R +ur+yt7e9u7rOvtHP979fs8W+xd3IQudPQlXvQEc7OT8v/yrRP78/VetEyEvHXbjDtd+zd7W8 +00TRa0//X8swxTlZPl87YzFfPj28V1FVZ2/fyUpJd7pOzcpbyLvRuFevV7p3tj2uvb9vz8JM +zF+9M8VE2z3/O28v1S09M+swRDxNNkJOW01Pd0/jWVG6S8+3L6wvuFe3b1esRqw3rUCvrj+s +M7rfxFdVu1GuNbU3uEW6OcYub0NZNT1KN9sw2Tw8SUw6Ty/OML9NPdFM39lFvTjH0cjMzLrB +wbbEuL3XrUyt67atv7nCvrzbt1e2UbpPwMzZU933SEhKvDfvN0JAQixGI04qPCdCJElMJFkj +Uyw+MjE2RT88XUhHxj+vU7m3v7usa6zMrLutrK2srK6suazLrLmuv66turO1tOO5ys/FU81M +aztKPzdAKUsiOSkrLykqLCorLihHI04oPzI+QDPPOl0+znfnw3fCzLr3rf+zuq69tK23rcet +rrmsw6y+razHrMuzw8y6b71L51V3Tl8+TTfrMGMyNMslXTAvPj42Qjc1QTFGPzrVOOM/V1tZ +02tOv8vTtlW2U69BsUZRt1G2d8lfu8jJV8Bv17xEvdHTxlm4S8nGSrpKtc1nuUK3XcFjRrhj +d87ZyffZzUnGT83jb1lRxmNv2VFnU2tRWU9JYzxrSENJPUo3STc/Qj5MOlE8RERGTU5bW2Nf +d+NV2V3Z/9Xv2dXNy83JxcfGwcq+xL+/xbvJvsnJycjN38rZyt/Ib8/r0+fb3+/jd2/nV+9n +a9332dfv0+f/11PbX1tdR908bz1HTEFRQltAUUhbS1FKSkxHT0RJQkZHPko9ST5ORkpMS1lL +61nb49/P0crbxc/AyMHHv73Dur+4vbe3ubK3sbK2sruzu7m7vbvDwMTIytvb43drT1lGSD47 +PDk1NTIxLy4tLC0rLSwtLS4vMzE1Nzk8PUJHTFFVV19v39PJyL+/urq2tLOysrGvsK+vr6+v +r7Gyr7Wytba2uri7u7+9xcfL0dfvd2dXU0tHQz89PTg3MzQyMDAuLi4tLi4sLi0vLzM0NDk8 +Q0ZOWV3vb+Pf1cnMw7+8uLixs7CysLGzs7W2uLi6ube3urW4ure9xMbX2eP3U1VMSkpHTkRO +RkJFP0E+Pz04NzY8QUNCPDg8NT47Pz8+QkBJTedRTuvDW+9MTP/Ru7S3vsPDvL66s7a3tra3 +tri8vMXIysfX51VTV0lPW11dVVNMSEU/QkZFSkNAP0hGdzFAQFFvTTUrR0m+u0s7191Z02c3 +SOutray5wE/fz7m+uMK90761s7m3srm9wctPQE5TU2drRkhITFc9MDMxLjE2LiwuLzM5ODg+ +OkI+PkQ8QlNvZ+PXy8S5tbO4tbOvra2tra+vsq6zsLa0tre5vL7FzOP/X1dOQE1NVUt3OkVL +RFU+Rjg4OD01OTUzOD9ER0I/OzxFQ01NRmNrX9Hn2d3Oyr+9w8TMwsa/vru/xM/Ryc3Tb2tX +d8zMzF9CPT1K9/9XSj4/P01nZ2dPa013b8zZ59/j0c7KxtHr09HGxL7CztvV09nXzNv/X1dR +R0pKWVVfW0s/QEM+QERNUU9OU2tnz8vM0d/P48rCxMnPy9vDz76/ycXPz+PPZ99bVWNO03fr +b+vjX+PJ42Nv63dTd8pHPkZZT0vV70I+RD44P29BPkU8Oz1KTkZDVz89Y0FrX29b/9nXvMm1 +x8nFxbS8ure4vLXHurW7t8OuZ8W+79fLuP//290yRUI7S1VjSTdCQj5ZSkBROVs/V91R39NT +72t3yte7xu/TTE5v/2PT0dHv68hX49vbd1nKTFFfdz1MzndPX8hCTUfjd0jIwzhdy8vLwr9n +OjI5Ljzd58K62ctryr/AvbxfTEIvNjZFY3fLyGfH4//O3cLDzLvDxba9urvBzmvX51dj61Fr +XV9fRudLRllEPj48ODUySER30e//a01jXc3Fx7TBur/J18fjxcW/v8LGzu/PZ2NfPjYxLy41 +OknfzMPJwsvR31NKODI1MTtOY8m7tbq5ubm6v73Oz+9f2dPHvLvCwutjRz9HOjxLPD9BPUpZ +/+Pr998/TEk//0/fY1dXU2/O/8y+077Gv8a+ybrGxs5Z21VVw8jJusvK1Vf/X0lrU1tHVV1T +/8XIwL3Pyk9MPzY6PTU8Pzg6PEY9SO9TU28+PTo2RkBNye/n505XX+Pnzb/Hy7/Py7y+t7K6 +tbq+u7i5trC4urO70bvNx768wsnBy9PFymfOW1dGOTQpLSoqMC8tOS0pLyUqLS04LjM0LTw5 +RcPIuLS+tsPVwNPbucy8z7q+wa6ut6yvvLW9triyrbG4tMnHyNHDyczEd9vnU05IRUo+Tkk3 +SjtDSUNJPz5DNjJCMTxKOEU+PEk9WWdTXVVIRD0+UUPXzM2/yN3dZ9/R28S9zsLE1+vNwMe7 +s7m3uLm+vsnKz1lrR0T/a9PHu8vXa0Q2MjQuNjg6PkBIX1Vny9P/zttLS+NOT9/ZW2tv53dT +udHvusVn03fPy76tsbCsv8lnQD02Q933wLLBvsrTd0RIRC41NCsvMTc9OllGPEc5MUc7SdHJ +uLi0r7i1ubO6vL7KZ1dPNlNbT7/P0cXf491rWff/3ePLydG9487Ka9vV/3fX/2vvTk1OT0Hr +TlPXTUxvQjlZP0RGUTlFTjZGRFFr787BzO/HU0Rr79/HucC1sLS2tLO8v8PO29nR19vH2d9d +TUY+PkpDRvdHRO9FS048RTc4MzU4O0NFWWdfVev3SXdna+d3zd3NvMfGub7FuLzAw8O9w729 +xM3b2V9r38jFs6+3srnDzt1PRE1BS01LXVNMT0hJR0JKTT5fSExIPkg+QUdLV0//W0xLQDo1 +NS4vMTA0PkX/X1/vVV/3783Xx72+ubK5sLWys7SwtbKztbi/vr+9wc7TxlvLwN3H1dFvV189 +RmtNR01FPlNFSdNK0989Pjk4MEtIW8PFv8fXVUQ2Ly8sLjlFTtXJ1+9KPjo2PExC0bzLtbjF +vL6+vbu4wMHM3dl3373IwbvRXWffTtvOx7/KvVvn519vXf9RSEZMRk5r6+vZ3V9LSz46TjhK +90fKX1P3T1lZ40v331vPycjIyePr10tj3U7ZwdfdyF9fzt/b2+tbTU48TzxNd0/r9/dV60RH +RD9NQt/jy8fByrzXv85vylnNzM3BzL7F68lnUdtMz9lbxd/Gvby7wsrvPFFKOHdja8/X29vv +Z1NEODMvLDA3O2vLy7vB2VM8Ny80NEFdV8vVd+f3Rmt3Quv3Z//J1b2zurCvtbSxuL2wubyv +uri2wMfZz01fV0BTPEI9R0pIVU1DPDoyND42Rk5DZ0FVSkRRS/dVZ1tL/0xr29O+vrm7w8nv +WVHj69vJwtnM52NNS0xIUVdO21vO09XKwsfRwdvj2dNvyef/zNXK/9nZd09jSEVXSetOa3dK +PUBGPlP3d8vMXedJR9V3xcDJvmPVyGfJw8XJusDNxcHJ0dPrT0tZUU9VW2dORF02NUEvMzk7 +PT5KPj49OkdBTc1n38Hr38rj983J2dW+zLy6uLC7sLe9vMHK0cd30/ff4+vVV9Vba2NHa0FJ +Tmf/zc/IyddrWW9jb9Vdb+NRSE8+PD5KOD8+O01ASV9fV91rY8bX0b/Z58LJ47/b17xnzcpT +3/dZZ+Nd2+9X411j/9fZy8L349NLTldKXV1TTVtZPWdKQsj/3evbW9vb38/O38nNd8zrzs/R +0+/PX1HdVW9fU1VXRExrTV3/T1lbTEhKTD9RPkldT1FV/0vd6+/PyMDEw9PLz9PEvry2t7e/ +xs/ZZ2Pn5+Pfz93b3+t3V+t33dfX2WPjTmNFRz9CSzo8Qzk+PTpKSDxIRG9f0cfJusjLw19n +791vxcfJxdfT129jUWdVa+NR0U9V3UxV39NZ/1tPZ1/r3+PR4+fr/87J4727xMXI0dvOV+/X +SmdrVUhjSj1jTU9Vd0Z3d13X28vGztfO1Wfd213R02fMd99fd/9XY0JbSEFPRlFMZ19NUUFI +P0pCRVNJd89db+fPzt/CysHMwr/Gx9PIU/9FXVtP0UfrV11nWVnbz9vIwse9xMPGycrJxc7J +02vn993vyWfT42/nW1lZ30/nTkx3VVFbT0RPX0J3UU3jb3fR/+vP41/vW29ZV1VKVVs/UT9E +Pj5AQj9FY0Y+SENNRXdf0+PAvt3E28/r28LOucW4uLm4vr7Gyetv31f3Y1NnTutfd11bW1N3 +39nZz8bNv8bIvr2+ubzJxsF3zW9b60lrZ0Y9RDwxPTMvPDg5OUU9O0hIY0ZM1+Nn181va+dn +6/ffx8zdwMzjvsjEvsfGvd3TydfJwsx3x2dVy0bn52/Pze/nxO/HyNfIzNPbxmNXX0lXSUZO +O0Y+OjM5OjA+Njo2P0s9TUpTa2/r3dPPyc/fyNnKwMfAv7zFvr7CwMTAwsXDw8PrzMLbytPV +Y9n/WWNrze9T/11VY1t36/9TZ3dPWUZFXT9EP09CP1FITklXTlvnX/fdz8njw+fr191fb/9T +719n719Ga0lMVU9db29da1Hn/2Pjz1dj1/fnzd/Gz8/ExMe9vrm9t7rIu7++wMfGzdnZ593n +W1dJPEM+Pj05PDwvMi41NzY6M0FKOj9PSVdP51v/b9nC08jFvr6/ur2+wc67vdO+xMa5wL3I +xMbEycfK0cjI283L18TE1cvGY9XXZ8tba11TRkhMQ0VAPjo5NjNDNDQ5Mi4xLi1DNTE+OTU9 +PD1dQ13VW9vRxufEvse6vLaytrWvtbuyu766ssK4v727vrrDwc7PzcTH09PL20tvW1lZb1NZ +UUhTQUdKRUdMTj9VS0pKSENCUUlnUf9LRktTSk9rY9tbVU9IW1lvb9/Za9fn2+PR39Hf1dnn +z9/T0crVzc3Ozdfd7+tdY+9v919XUV9OX2dbY+NXTndNY1dXU09PU1tvW2v3TmddV2v/1Wvb +7+/O09++y8m9xsu+0cjE2cPT79Xb/19Xa1fOb2ffX+PT1efvV9NRT/dI3WffU0nVQ2tP91lv +d07vUWNOQddL699Db1tHz0rN2UvLZ9XRS87L3bpjycdfvW/v00vMUdFj4/f/V2fdP2NnQONH +U9U9bzw/Tzo9U0I6RTxEQ0ZTTUrKS8vT3cHb0cnJxsS908C9ybS4wLTEurTGsbfGsr6/u8DN +tcHNusvNw0zDbz3dQ0FnQTJOLzU+LTk0KT8sKz0mPTYzQy87PTlMVU7KZ9PPyd/AxdW5yr+5 +xLm8urfHssTNutO9vne14/e478O7/77dSbdJ0chN41tE70RXSD5nPVVbPllJSFtO7+M80TU7 +3zDn4zbnO0xfQNFPTctJV8VEyF1nzFPGvlvB09e9yrSy16zfvbLXtbnPu99bvlPHzk3LRznE +M9H/NtEw/1843TxDX0BXTkBRPUBdP1VXQe9FRP9GV+tCY0dRWT9jY03PY2/D68XI47rHwba/ +urfBtrrFr+O3w8+/0du5Z8fTWb9f3c8+6007Zz4+XzdIPjNHNjlGPEE+QUdAS09OVWtX12Pb +yufHyf++yr6839HK68fA38/302vIxsDv3VdRz9nja193T2PP/2tNTVVn4+NTTEtLVU9LTkVn +XUzjSV9ZWevf5+f/779d09fv1+fNyeO+42POW9PGy85n3c/rz/9P219Ty1vXZ9VnX19dY11j +U+Pd3efnV1/fV9vfzXdfZ11f20ZO2U3db05ZTV1X/29Na0xRV1lb/3d3Z/fX29PX2/fZ99XL +19HEzsLVz9PX383J1czb3dtXd01j90ZMQkBPREA/P0ZRRUxFTFVBW0tb71Nvb07f29vRX9nb +zcD32c93zevR08zG0ci/zcnT58/Lx8DFxdvV2dXV09fX49fn51ljXVHdZ9vbU/dVZ3djWVNM +UUZMQzpCPj1HQEpJREhCT01ESE9N711VX0dVXXfd293P79vbysbAv7u+vr28v8LIzcHBv8jM +2d/j13ff2///Y+NjZ2dbXW9LT19OV1tNT1VVVU5NSkJORktTSkZMTEhKRUdJR0lRTlNbW2v/ +49/VyMfFw8PAv72+vb+8vr7CxcHFwMHJxs3RzePj//f3a2tRUU5DR0ZCSkNCPT09O0BCRVVI +TVNRd1//193V0czJysvP08/Z1cnn2+Pv1etnX2tvY29ZW2vn//d3a2djW01NTElOWUtMRkxK +TE5LS1Vv6+PXz8jEzMnEyb2/wMHEx77EycPGy8rJ29fb/9f//3ddb2v/X1lZW1VZUVdXd1tb +TFVVTU1bSk1NU1VPX05fd1dOSk5NVV1ba2d34+/r6+PVz8jHx8vHzcnT19vj3evf5/9dV1FT +UVtTTldVTU9LS09PW1dfX1dfZ2/n5+vr3ePb3efX29PT08/b39nn39PbzM3NzMzRyM/XzM7P +29fd09fZ3+Pva1tVTk1MT0pGSUE7Pz1KS09RVV9nV2N379/f49nZ3dPOy87M0dPV19nP2//r +Y11fb//v6+dva/f35+9v4+ff4+fvb2tnXVlTZ1tdb2N3a1tjY19rW1tdZ2tdb+/v32tra2v/ +/2dfXW9b92tjVVdVT1lXY2//3efn59PNy8vLzcnJxcjIxcjOzc7N2+v37+dZVWNfZ2NdWV1b +U0xOVVVZUe//d+vZzdPOz8zM08vNzs/b0dvf62drd+9rV1NbV01JS0xVTUZLTEpMSUdKQD49 +Q0lDR0VIU05OUVtb/+vf19vT19fR0c3Nz8jIysfJx8rV39XXz8/KyMjCx8nJ1c/Nys7Xy8rJ +y87Ry9fR0dvdd2tnY11dV11bVUpEQUdEPzw+QkA9QENGSU1VTldrd9nVys3NyMXDxMXFyM3N +z9vP2d/j9+/vb/9fZ2djV1VZU09XWVFTTk1NTUxOTU5NS0pKTE9ZX//d3ePdztfT29fR0c3X +0+d3693r79/d2+d3/+f379/r9+vv5/f34+N3W2NfV1t369/r6+vj2dnf29nT09nj29PR0dvd +29PR2dvXzM3O2dPX2d3V2+vvd1tXWVlNR0lJTEZBQ0lOTk9OV1tVVVVjZ2t3d9XZ09XZ0d/n +9+v/b1lRS0xLR0pLS0tKSE1VU1NOV2NjY2/r69/Z0cnNz9fRztfd6+v3b//v59nX19PRzdHV +09vX2dHO087O0c/LzMfJx8rKzc/b3dnT19fVz87b29vj629fW1VTW1FfU09RTExLSERAQT5D +QD9DRUBDP0pMTU9NXWtjY1tnX2drb/9vd+Pfz83Kzs3IxsPBwsTGycPJyMvV1d/f62dvXVdZ +VVNOT09PU1tdX2fv7+vf929nY/9nZ2dna19na2936+vd49/r7///7+/f39PT0dXX1c/P2dfj +5///73f3b/d36+fZ0dXP0c/V2dHZ39tra11RUUtLS0lJTUlETEpOT0xPT1VnX2/r6+9r/+vn +Z2dnX2NXW3d3//9v//9nY19jZ05XXV1fU1trWVdXU1dbV1FVVWdTd9/b2+/X0cvOycnKyMvR +zcvFxMG/vL++vL29vry6vr7Ex8vP0dvf5+trX1ldWVNPT0pBRURHSkxLRklLS01MTUxNTU5X +V1dfVVlRV1NRV0xKR0tESEdOUU9TU1tXX11nd3dr7+vb2+fd6+PvZ3ff593V2efvd29nZ3dv +993Z29fX1dfTy8nDxsXHxsTHycXFxMbHyMfGys7P2dvn72/v/+P35/9vWVVVU1dVV1tZX19b +WVNRUUpMS0pOTU5MTElHRkdIS09RT1dZWVlXWV9fX1tfb3fj3dXX0dPV09HLzM3Nzs7Nz8vN +09fb19Pf3efv/2NjX1tZVVdTVVVXVVdPT01OU1ddY2dra2v/9/9r93d36+/f9//na+vj2dHI +y8fJxsTExMbGx8rLz9HV29XX29XV29vjb2dvY2tnXWNfX11fV1FNTExLTUxISkpHSUhJSUVJ +SUpITEpHTU9XY2Njb2vv5//v6/f/7+Pb0dPXztnV1d/j5+vn//9v6+PZ2dPKycfGxcXJxMfJ +yMzKzs7T0dfb39vf69vvd+93Z1NbT09RUVFNSkpLS0tRUU5PTEpMSUpPXWNn9//v///3393d +39vd69/d3efn929v5/f34//db2NnZ+93d93V3dvd4+vj99/32ePZz9HOz9nZ429v///n7+// +//9dWVFVU09VT1VPTFdTU05RW19XT09RXVlrd3f/b//f693n6+fd7+f/9+vvb+Pf3dnf0dXT +1c3T0c3OxtHLzNPb5+vv79/33+fV4+/373dvb2fn7+/rZ+fj/29v52/3Y3dfV1lNX1FRTFNP +T0xJS01LTkpRTElHSEtIR0RISUxMV1lv9+/n18/TzcjFys3RysjMysjCyszLz83Mzs3KyMjK +zMzNy8zJy83TztnZ1+Pn793f/2tnZ1dTT1VPSUpJTU9PVU5LS0hFSENERUNHSklLTExDP0RF +S008SEZMS0dGSUtPTUpMSUhCSVFVT1V3b//3/2/v1dHHyr++v73EzcnKwMXLzMrNz8fJxMbH +xMDDvcfFy9nrX2dnb11TXVtOT2Nf7/dva1/n42NfZ1lZZ09NTkFKS05dXWdfVf9PWVtbUU1G +TkhDTUxITldf/2Nb7/fj49XnzM7MzdPRzdPXy/fO69nXy8/Vy87P1c/L28/Xztf/0e/f1dPN +999rb1tbXV1XX0tTTk5MP1E7Pzo+Qz9LSEhPU09vb1vb39PMzsPEv8O/v768u7vAvsO9x8zV +3WNvWetnWVtVTUxbVVdXVWdX42/XZ1lPSU1LR0ZLR01DSkZEPkdKTldr49/J59fTzdXZz8jX +53fZV19j71Ndd1lvb/d3Y2fd9+PXz8nHyb3BvL+/v7/Av768wb/DyM/b32NFTkE8Pjo6ODM0 +NzY1NTU4PTo6QUpHRl9db3fj59nKzMLGwMDDvsbBxM3Kxb/Izc2/wMrJvr/AybzMwci9wr3A +3cPTyNnv/19fTldNVVtMSU9JRUg9R1c/SDtFPzo8OTo3Nzo3PTo9Pj88Q0pMU1drd+fd39PZ +59fNx8O+v769t7rBu77AvMPGw7/BxMPMzNXf7+/va/dnWU9NV2djX2dbXU5VQ01PU11XUVVR +TD9VVUxbVXfr1czRysTO09XK0czFyc/Z2f93z3fT63dra1tfV+9n9+/j4+vvZ/f/3//r4+dn +Z1dbUVFPVUhDRkNBODtAP0hHRFNVX1tvb2vv283Fxr++vru9vb24v73Av8rM29Xf7/9nU0tK +RkxGS1NKV0pGTUlMSUdCP0dKR11r49Pd0dV31d/ZzMnPxMS7v7zAub+7wsTPxM/n91tbW1Fb +Z19d/3dvZ1NNS0tNU1NZT1NKSkxRTU9NSlNPTldTT1FdV1VOUVVbX2NbXf/359vbz9PrXedb +53d319XO08XJ0dtba2dr/+fPzM3NzMjJzcvTzdvM2dfbzt3N38vF0dHfz8vPz9HVd9dr6+tn +a11bR0hHTlFdWVlNR01LU1dRX1tfR0tKQUI/PTo7Ojg7PD4+SUJBSUBLSFVZ3+vXzsvIyMq8 +vr69vr67tra2srCxr6+xrrKztbm7wMbO12tdX1tVVUhOR0xBSUE/Pj5APEM9QDs/ODY5OTk1 +Ojk+PEA/RT8+QE9jV+Nnx8PEwMO+wMPKxMvL18/Zz9fbz+PZ5+9n6+fv987Ry8XTzMjJwsDL +1dXDwcfJzszHwOdXa2f/d05JSlvnX0pDPk1TUVdNU0VbVUk9PkRXU19Oa//jVVldS1VMX1XL +vrvvUz5dv7rHwrrVzefZ19HK6+fn1cbbPTAuzr2ttNtIQDw0ODhNb8G9vFdnX/9dTl3dwut3 +z8RFTGNvPd/328O9/0bdXUc/WU7/T2dZTzw1NVnZSz41LzRF3dlrW9/Ty7+9vtusrKw9LzT/ +rKysrK+vtO9GOz7Er6640+vba0c+OEHjwWsvQzovLzEqKUDnQuPMXzxNzGfru7/BucDVa8HP +x8bP1VlnWbu4zz85L1ljxVFK213OuCQpr6yyNSMoKKyrrMqwrOffNigpPbeszLzDsLTTST0+ +u7mu32P321U6MiswQfdnb1fIztdTPUNfuruyt7S9uNPZ18HJ1dXvVUlfRTY7N0I6Q0BbXdH3 +Wzk2Oj08Sc3fx2eyrSNPra2vUyo2Ma2ttNOtrchTKykqScvNN9u4rc0+ODnXur3VX9u3vkwx +LDlKY2NHd7uwtt9nY8C4tbu5sq64yklZ59PRV1Nn30s9MDY6QDw6RF3FTkFCTT5LV1tfuLBG +K66srDolLTe/rLrBra2wUSoqNUHfX0TZra3AOzhT429MTNG4s8o7LzhDPTc7Ss2yrbbXz8rG +1cjGta2tts5j2e9nSElr529EOjQyMjQuMTxLRD9jQzkySG/nUdHnwLvnsOs8raysQSvNv66t +rqysrLM0LUxVOTNXya2srMHjw7lRNzlT193vTz9DPS8mJis0PkxjyL282V1LV2PTwLW0t8nj +a1U+NTg+TU9MSkNGQTw5SOvf39fOwsjvb93ZzdPBure9uLW1uVXbvrPOW9+trKxAd8a9Slf/ +s665TDQ4RSgjIy1FS13jwLm84zs5R1E5Nz/ZzNn3W93nXUFD2cfKxbu5tL3My7+5wM3Py9f3 +WUs/Pzw6ODk1NDY+Pzo/T29j38zNzL/IzNPOytPRx7m8w7aztcnMwsrTvclnzK65SzdTUTo0 +Ok7JyVE1PUs2JictNDQ4Qte9u7u7s7bB09nKzONn3cO/ys7Ju7u9vLzFw9Hj393b3d/3X1FM +SDw2MTAwLy4wNjc5QUdJT2/j0cfBw8G9vsLLy8G7vby2t7q6usrLxcvTxsv/29PnU0Zv51k+ +RkpEPjwzNDg5MzdBREFFUVNRb+fr39HLyL+8urq6u7q/wsPIzs7O3f9vd19fWVNOTltbV13/ +b2NZW1lTU01LTVdfW1tf///36+/n087N29PV1c/T3dHPysrO1+Pr72dTU1VbT05FQUJCP0FB +RkxVVVVZY19dWVNMUVFLT1NXb+fd29HIyMXBwb+9vL69vb3CwL28v8LFwL7DztnR3/9ZT09O +Sj89Pj4/PD1AREdJR0VJTUtPXevf2efd49tnV1dfa19dWWNdT0xLU19nb+fb0c/P19PN0c7M +y8rDysfJzM7Pzc3R09PR1d/n6+v3a2NfY1lVT09PU05NTk5VWV1fY2/v72/37+vj9+//5+f3 +92NvXWNXVVVdZ11jVVVXUU9LTktPT01NTE1GSktMU2fd0crGxL+8uru8vLq6vLq/vb7Ayc/O +09vj7/9v7/9nXV9Xa05NTEdTV09OSlFRSE1IUUxZUU5NWV9TU1FXT1dVVU5bVU9OT1FRT09X +W1lna/fn39XL08nKzc/Oz83NyMrHwMHCwMPEycrJy9XT0dPd3+/na19TSEhPSkhPW1VTWVtV +TVFZXWNjd2/d3d3r2dXb6+fj/+/rd19bZ2NdW2NrZ/9jY1FZU0tPTE1TS1lVV1tTVWNjd2Pr +9+fr99/j59/fzs3NzdPVztPj29XO19vMw8vKz8/LztXX387L1dfd2ePb3/d3a+dra2drWVVT +T0pNSkVGSklFREtLTUZBSEdEQ0ZDSk9TTFNnY/9n49nj2dHTztHM1dXTzNPVzdXX1c3X1dHM +ysrGx8XHwL3Fxb6+xcbJzMfJ0d3Z2f9Za2tZWXdjTmtTOmNMODlTRDk+Pj46PUI+PkJFRz1T +90VCVdldP1/LRES77zpZvU1O28XIX9W418a528y8ysrZvbzfQsex1zi8v29HwVnTzNfTxme5 +y0XBtlPvxf+972fMSP/FTUNNX1c3OUdbOFVGQFtOTks4b/83Rk9LU1fr2VfZwNX30dnL91/r +VVfvS1Pj39HT0ca5vb7Dvb3Ezd/TzN/j2d/Z2e/v187d/2djUUpBQUFNVUpLWXdrX19XZ+v3 +d1NV919JWe/vUU/31VFb99VO78vRTd/r/03v3V0+2fdDSV/nZ9X/2z1Z3ddDOlu1zndR9+/M +vcH/07C1xOfXzt1vX0BC2b2+y763tLy+zV1LUUU5MztDTl9nX+fMw8fb72v3Y1dMTW/371tv +Z29rVT89RkRFRUlDQ01MQ0RTSz5NZ1lNd93jycTAwr/DyL21xMG/xdu6xO9nys7RxL5nT09n +b1l33T1300lMSU5vT0hfa0ZT687V/3dOS2fZz9/Jwb7IxN1ZV1lTR0FXY11ra1NNTldnSlFV +UU9Zb/drZ9tXTld3d+ffydnKwL7JxcjM6//f32/d093X18rO293r59fX329ZTldTRltZT0NJ +V+fVzNlLR9HByNtbPTtO00lIUVdf78zNV0hdVztK12NBPzk4O9vCz+/Hxs7MyN0/RGdTSN/L +x720r7G6uMDNd91nTk7n2dvIvcnOy87nX2tbSk9fZ//f1d////dTUU1ITk9XVU9VXVd3b1lV +WV9OS2P372N3W0lOX1lvb2ddY+fv/+dnTFFRU1fvU05rzMLAy1tLV1n/02dn/0RL08zZWet3 +Su+5usXj905fv7rMa9vHyL67ushf/9tv68j3RU7XT07XXT06RPdCTvdKP2fr/2tV72dVxsLn +59nL0c2+v+PZztvj49vvTFnda2fva19bW1lfZ1tr6//jW29fa2NLS13r911b99lnUV9MVdfn +V0ZId3fT38dbLEu1tetTOCkvPbutuLPFUz1O0f8uKjEtQ8asrLK6uMvEvbpRNzQ6P3e8tsLf +187O08bLXURMY83AtbW7xMbI2etjX0M9QU5dd+//Q0JHSEVLS01JT//3Z2PvXVVfb2v338// +Y2v3V1tdW09MX2NTW+vb6+PMzetZZ1tEXdnZ793Z1edf39dd08bX6/9ZUefNwb53SFFOTtPM +y9VrW/fvxsLdU0xbXd3HyN9PW13v5+t3W0pXWWtZa2/v59/n62/31dv36+tbWWvv2/dj0ddj +X83jd03f1d131XdKTnfR6+PV/1NEV/ffy8XZY/9bW1tj6/9TV3dbT1XIzGNHPj08P2PKy9fb +/1NJTD88PD5Gd9fFvsLFwMXGycvnb1dbW//v7/9n7+vb29PV28rb1+Pf2dHOzcrP1dvX09/f +73drW1dTWVdfU1NOUWPn3dvP31Vfxcv//9XrP013/1n/2/9M//dvSe/Hb01EZ2tX58PCyN9r +SEtEPjo6PDs6P9/Czd/j19nV53d3WVlbU1Ff19nb3ePRy8jCzc3Oxsa/vry9vb2+zNvX619P +SkY9PT5APkZHX1lr79nOzs7X3eN3629va3dZ3W/Z79/j9//n3c/dz9XT28/b0dfVd11OXU1M +SU5CQEZVS0dPX0tTZ91379njWWdr72vv5+9ZU2P/a+/n5+vX0crMzs3X72v/W09RTkxGS1tr +X3fb5+/V09fV2c/Z29nTz9fX529nW19TUVlfV0/r29PVxcfOyNHN08zDTMzN72/LZ2NFy2ND +wkhbTUdMOWdZTlH3XWvN5+vT2dfr411fWVtba/f/d9vvX9/j4+fd1+f34+//6//n71tZX01T +TVFRTFtbV1tRW1lf6/fr1dnV0czV29vX/3f3Z+f/529r92v///d3/+fv5+/r7+fd5+/v32P3 +a+f/7+P35+Pf3+Pd52/v393Zzs7Xz9fNytHP0dVr5/dTU0Tf0z9OXz88PmtVTmPXU0t3129f +a2NHR0hdT0NTzFFd2dPGPm/GX+vbyt9L69NbT+vrW/fNytHTzcfKzr/Dzc3T29n379drV1dd +UUxRU0tESk1PVXfr7+fZ19XP08nN1c/Z4//v52t329/j99vv//ff7+vf1+fn7293X2f/W09n +WWNfXWddWWNfVVtTU11TW1dXX1ln/2vn4+vZ1dnO1czPys/M19Pv7/9fV11fZ2dr/2//Y3dn +Y29jV11dY1dnW2NfZ19bV1dVT09MVVFNW1tjZ293a+/n7+/b2d3f39HX19fX19vf0+/n3dXV +2c3PzsfNyMnHxcTIyMfIyc/R09XZ3dvn5+/r92dnWVtdV1VXUUtKS0VFRURES0pJTEtLS01J +T0tOTlVRV1NXT09OWVVXXWN3b/fr2dfZ2dnT59Xf2+fX9+Pf49/T5+Pd39vV19vT3dXV18/O +0c7R1dXO183/3dHZ3+vf73fr3+v/73f3Y3drY2NnX2ddWWNbd1tra2djXVlbWVtZW11jb/f/ +72//d+vr/+9vd2v3X/9n52fv6+vv53dvd29v7/ffY/9v/2dv71/37/fv73fr/13d/3f34//v +//drX1t3WVlvX1dbXV1bXWtnZ2dja/9fb3dn9+t3a3f/b+vv59vd39vb3+vja2Pd/2d3//9r +2+P/387r1dnP0dPZ2dXf793X59nP987Ta83Oz9fr6+9n62NfXV9VV1tOTlNVTE5OSllRWU1n +Z2tr3+9399/v5/fn59Pb3+Pv2+Prd+fv3/9j91lfW1NXX1FfV1lfWVtZU/9dW+db2e/329fZ +3dPT19Pf0dvR19/T3///d9v///9Z93dra2tdU19RV01ZT1VXV2dra1tnd/9369/n2efn1dnV +19nj793jd9Vnb+fj6//fa2//7+d33Xd34/d3Z+9r3d/V0dXr39Xf3dtv69/jX2vn5133d2f/ +b/drd2dnX2NPW1lZV1NnU09RU0xPVU1VXU1XXU5VXU9rWVnv5+Nd3d/n/9Xf593v79l33ePb +3dPTz9PT1dHZ1c/P78/b4/fn711nW11r/1tv62//Wevva93rd+/P29/b39vb39XZ19XT59vn +a3dvW05bV1lRS0pKRklFTk1NTFn/d/drXdNrXefV79nR28rL18hnx9XvxUc/vfdBv8A8wtc9 +U8xdRtXRwi+7PWu7OMa1QUq5zji2OErXYzmwPzy2ON9b50xT389VSsRL42/fSknr71lGVb5K +33fr69nn1VvZydfn28fPytnT293Ozevn2+Pd/1FTUf9vTVNv/+/dV+PZ0ddVVWfKZ2tv78pb +QFVrd1VCP87May9bvsLTd0hRzs3/RE3IwNtfb//T109N29lVRNPG5zs4Pm/ZwcjIv7a9WT4+ +Pzc8Oz1MvrO0vrmvtMlVRD45Ojs+W7/Da01TSzo1O0z/0c7Iure2v9fVuMvOxc9d50vLU9HR +a0DNSVdOvtlL57XBLi+urccpJkE+wsnO262tyTYsNSwkJSguR6+tt7utrcTnTD03SNnvTr+2 +vetbV05Z289v78W7wsXCv7m3vstfR0xGPkBfd/drb1NBR009SE7vY1PVwXc/Nz333z5frqzL +Rcm760pXut/Iuss9tKywMy9Hb++709m+t8kvJy06Kio9Q125rLxN2bbMR0tdX9O+utXRu7nv +U9vVb8jCwd/Mvr/Z59HfX0pBOC4zNzo6Pj9FSD8+Nzk6Pzpd38nbz7y821XLra62zF27rq2+ +W9m2wL6/viv3razDLSlbTsvTzWe0rro0LC01LjEwMTu6rblJT7/E1VtZRG+8uNVT37/FV09f +787AzdXdxclvRUZNS2fv91tdV0g6NzU3Njg7REpNU2NnY03rxsnGwcK9w7+/vlnZtK2vss1j +ObyvrVE4vK13NEe6xc/J2Tk5RVNATOs8KzdLPjVbxl9DT189NU/XSkvOtLu+t7TAvb6818/E +v+PXzsT/U05LRFNv/0tNY2dRVUtBO0zrazs6P1FVb0k+SGtZPj/PyNl3y8VrWcC5ubG3wFdb +yLe5ub7ZO0fMr733T10+NzzZydvRbysszq9nLCYuPe+2t+9jv8Y3LjVIP07O02vCra/Jzr/d +3cu9zc69u91RUVE/SltbPUprd11rW1lVb1tXT3fO01c+TU5nT+PrzMrH0/9f/9fR31/TybjB +Pzhrr7PBRT7rt7LROUHJvj41O++2rsk0JyxTz99ES+/D11szOE1rZ1lPd8XJU0NASufOzm9b +2bq4w8fGxsnK51VR48HIWVFMUVNJRklP6+9b9+vfy8zPzdvX2cvN6+v/Z3fnW9nrzONdSlFZ +xMZbO0zP20NLZ105O85rPUDDTVtR2etX2bo117PBLzBbrsvBwsVVybe7Qk53d0VVV0ZA09dn +PVHba13/UUI+VeNXRk9fVVlv42/v18rT0869wMPJzdXOwsHZ09HXZ2vv419bY0pHU1lDS0xf +b1/v70Zj38nM68zAz8Nra8PHsrlny9fH01XIvlFvS9/jzclJLTnVzGc2Liw5a9dPMjtNPTlD +zkZRXVE2PFvM/9u+vb28usjb073H083L08jCvsvZ1dFfTU5PW1dTW1NAXVlvT0prX2fPWVdf +zbrBd9vPz81RRFnbvLXdU1XV5+NPWV/V72M4S9/nVV1X2T9Fw81TWXfDvk5jxcd3vlVMSsy5 +zOvn2V/jW+/dw+vdRUtvb0rb183jWUpFOz1nUWtVRktVT3d3WV1TV8vNa/9n3+dfTk1K/2v/ +12tnyt1Tb1nvvsjO1+/Z690/48fB1XdEUWNXv80+z9tvxFHj2e+7wz5ITOu4wf9dW8+497vR +/3dd/8F3vb1XzcxXd8e/yD9ARj9K93dnTmdPOjg+ODs4OUBGXc7ZY2d3ysTBys/Pz9HPzcnJ +ycbI59/Mb9Nba+9jW+/Z33f/XU5ZREhTS0VGP05KRFFEO1NnWV3fzN3DvMtJWb++29Oyw0NZ +ycK2vudLTve1XUHOucTnQUNTXcO6w8fE31FDOz4+Ql9X99vd599339njyctRVWNnXUVGU0hN +X0tETnfbV05VW+PVz9vvz8HRWWf/73dM/+tPWeNbQU1nd3dfUevra8e93U7vxL/rRNe5w9fK +//e9xeNnV13Hzl/LPjbTt2tFOjpn42PJ20zV401GPUxXU09KXW/Nv87Pyb/Gy9tn0cLI02f3 +193v6+93a9fT///3d9HT493b39nvVU9nb1tNRkBGWUpDPUdPTENHRkpHX2dVTOPZUVm7ylXV +sdtv97fnz765d//Tz2/P/2//xdlORszF6z/bZz4+T0k/P01LRkNKS1Nfa11399Pd2dfT2c7N +0dPdy8rGxcrMysvMzs7O0cbJ3d/r09/f3/f3b+tjX2djZ29rX1NdZ2tvXW9379nvX13r61tZ +U11RVUxHSUtOSExFSElLTEBKSl9bW2tvY/f/4+9d53fj3evf39fR09vTzM3R09/d1cvd1c3X +1cvZ49vT4+fn49Xj3efR3e/d2ffvd2Pn//fvb29v/11jU1VVV1NdUWv//1n/a+tn/2tf5+PZ +5/ff5/9v9/9dXXddY29rY/93X2vv/2tna/djY1tn63f/d9v/b+9n72//X/fr4//v73fj//f/ +/2vn/+Nf42/d/+P35+ff//93Y+93/2df7//dWV1n6/9rXVvrd+t3593j73fvY2v/X1dv/1VV +X+9jZ/9vb//rb29v2+vf2c/r3c73593j79XVXefA7+PDyt/E41vAdz/b02dT019I22NFztdn +a11r92dPX/dN611T/1fnY2NM10/vTUDBOk9fRlPTPl3nOsrFP1Hda+P3791Jz8FdXd/Kz9X/ +/9PD/1v32ePr9+/TzdHV69nM2ffVy9P/09fb1///3+/j/19j1+9MTdnnVdvjW0ffX01R3dFN +V29JTstRS+vIdzpV0T9Pd91TVcm+S0q9xks+WbzJVUndz9NfSMC9w3fr0c9ROj5J7z09RM/T +XVvby9vI1VFr2fdHVWPvSVvRXU1d2c1v49XN68vI5+fFv9/VxcXT0c/M513Tb19b929RTmNK +QFNGTVlRU05F62tNUWN3XWvbSVPOU09T2c1jS2PXy0fKu79fSsy/d//V0azRSGe8wWNDz8HP +y1nZzdNdR2e/S1Pf70tfV09Cb11BSO9dQERvRj5TTk5KTF9LT13v29/v1ev3VVf3b2/j529Z +z2P3z8pX78TVWdu+3+vf0cDM/92+zv9Pz9HnU8nL61vXx+fdQkvfW0FI3czZ3/fvY11da09n +RXfP30df/9lR4+9vX+//SVljW0//a1Pfxe/vzNHG0dHfzdfb2c/37+N342tv/+NXVetjV1FT +W01GUUljX1lT7/dvTevX21tdzc7j683N09fP1+Pf905bT1lIU//3Tl/Vz01v0e/3VVvIzEhb +93dTXedrWbzTTNvB30j3w8Rnv8fZ1clrb9vG/0nGykpDa0hBT04+X/9NRlfvb2tV62ddSEl3 +Y0tj3dfV1dHbyt/r09PPxN/XyL/L2cu+71PO0eNbz8znd9dd3ddfW+fdV1FfVUZjVUtO/08/ +Ve9HT11VW9XvV2fMxetHUd/VQj9b3UxIR1XTd1Vb49f/Rf/P41Vj2d/jXffP0ev35+t3d1tj +z+v/28rK49nTa8C/7/e/ws7Gxt3Jxl1jxM9V38xVb+9PTOtPR0ljU09XWU5nY0lf711T93dV +XV1OXVljWWPb/2fn2dXn68zN3dvb/+ffZ2vn52tf72tRW3dbW11Vd2tOW/dTWXd3W+Pv7+vP +9+Pj53fj419n4+N3Z+/j9/fr6//nb1vv6+Nv79/TZ//j7//n6+v3z+P/59nrb9fr79/f4+/d +4+vf2+vv5+tnZ3dvZ2tnX19nZ133XVlTVVldZ2NnW113/2tv72f37+d349nn3d/V09vb3/fr +a2Nra1lZa19nX19TU19PT1VLTVVbUVFVWVtZX1dvd3dr3d3V08jPzdnP2dfR19fT09fb2czX +3czX2c3d39nf7/fj5+/d2+t333dvY1NXU11PV19bVVNrV2tbWVlvX3dd6//v63fv9/9f71/f +a+//3eP/92fd399v79nv9+vra2//a19TY09ZV1ddT1FOVVdZX1/vXf9fb/dv2f/d09nf09fX +3dfZ1+PR09PR09ff3dPj1evb19v36+/v4+fZ3e/va/9jZ1VbWVVPW1lXWV1bZ2NfX1VbS1lN +U0lJWVVNXXdfb3f3991r2e/P1dfX2dPj29PV09vT3dPbz9/Kz8/dzs7f1+fj3+PrZ3fj7/93 +Z1tjUV9LVVVPUU1KS01LTUhNVUxTUVlTW2dZd2tvZ2Nf7+dv39vjz83O0cjNztXI2czTx9PK +ytPL1dHbzc/T19fn7/93X2djX19XV1VbT1FXVU1NTldRTFFOU1VZY1NXb2NrW2Nbb2vr/3fn +Z///7/fj59/b4+fr6+fr5//P29XN1cvjz9vZ2+/P2d3d29XR39n/7+vn72P3b29db19RZ2NP +Y19dX1VdZ1lZVWtfd1lbY3fvd+93X/f3Y/9v//9vWd3dd//jb2trXVtfV11fY1n/WU1vWV1b +d2fv493j1dvR1czdzs7PzM7HzMnb3ePv39X/z9nf29/33efjd2fnZ2tfd19fV3drd1dna2dP +VV1dV1lZZ2NrX/9dTedV/2dX51lnX2f3Z+P30/fn9+9f591rb2PvVV33a/9r7+/ra3ffb+f/ +d+P/79nr3czVd83Ry+vT2+Pd39fv5+vn2ff/429n999f/193Z+/rb/dvb+939/9RWV13TEtr +U05NU1NXTENTWU1MSUxdd1NZ9/fr/93V19PN08zP2c3j18/X48jN3czZ0dnR1Xfr7//n5+v3 +62vr53ff4+vj3+dv91lrZ/9nW2trZ0pdTldRd11ZTlNnUWtbZ11nW+//W1dZU/9P93fv33fr +42tf2evPb+fv5+dn42ff39vnzdfj/3e6Vb1r39XZ1dPnzWPHa+dj2ePfSe9Na1v/THdZY2P/ +411rY2dPVevvZ+v/b0vV30TTY3f3/2fbV+Pnd2/rV9FdY1t3Tk93X05b61dnd//nb9/O1dPJ +ysLJycfL383F1dfP1+Pb59X/0//j51vZZ2tjX11ZX1dMU0NJRkdbTVdKd2NjVVFOSVdTY01r +Z0/jY+Pv0+vfyevf79XfVclv41X/W0/vVe/va+fj02vvzkrNy1vf58tR1cJvzcrv38zNzMzK +0b/b6//Xb/fE3cX/08pJwP/b51lbTe87Ttc5/0NExi652y+0Lsn3N8tLVzi9PTXEP2/nQ11b +W81Ld8VB18w2x0TA2U9r0dXT9/fbxE7f72PFWc1Jz8vT79nD3cDDZ8S668P/XbvGTcPdv13/ +x9Pnx+tXy2vRTzr31ztM7z5vWUdTQ0zbPDjOU0HrTlNNz1VdTffvWW9N7+P/R2fd2U/OTV3Z +W0dL31FH68tZ0d/P2cr30f/M/2PGy8rC48i7ycBfu71jy9tjumvXzP/Ld1fZW1XdS0/nUU9X +X01bQ9FTPf9Fb1tCb0lX2T1X0VHbV0jnU81KP75RY8rrZ8LZ7/dZwWtOv/drxv9bu0y5wky6 +TffXPtnf/+PMUW/Z//dCWVnfW1NDUc9v4+dVv9dVZ1Vv2UZN6+/VU2Nf/+t3S1dv72dGXcx3 +a//j2//3Z3fjzlNO61Pb70xr41ffb0/ba2vfd+PK1c3CztnX19nX0cbRz8fVxcPbydfZ083j +3c/jW1vf49/P1ePf1+d372dbS01LSj9MSEVHSkRKTERESEpDXUFLTUlHRk9ZVU1nRU9bVWNb +3/fv2ev349v/0+dr49PTys/RzsvXzdvJx9nH2cjLzc/Rx8vKycvIzMXOyMPIxcjPzdHb2evX +02/jZ3f3VWNrWWtdSE5LS0tCR0dESUpISEhHSUBIRkhJRElMSkpNSFFRTE5KVVFRU2Nv2e/v +zdvO1cnLxcfAxMPCw8jEyNXG2c7ZztvVzdXT0dHPz9PZ19Hj09fb3dnf3+//d29TTldOSkVF +Q0dHR0hCSkhMS0lVTUtOSU1OWUxfU2v3V//Z29HZysnIycHIvb2+v77FwMXJz9PX6/dbb1tX +WVtVV2dnUWtfWfddXWf/6+dn7+fv5+9n32tnWVNZVU9NT09OT0dZTWtZU1tTXVVRWVNTV1FV +XV9jWVl3b///b2d3a+vb2cnXzsvOzMzKzcvFzsXDysTHw8rKxMzK0dHT39Xd59vr3+P32+Pn +32fdb9/r69vv79/v493v7+9db1tjVU5XS0tKSkVJRUQ/QD89QTw/PDs9OzxAPD5BQ0RLS1FR +W2dd79nVyMPCv7y+vby7vLq9ury4vb25vb7AxL/DyM7MytXZ2+vj/1tvV11ZWWNdb29TW09f +SltNTFtjVVNTSlFKRExISkhNSE5JS0xLS05MV1NfV2tfX1VbZ2v3/+fV39Prys/d09Xf39HV +3d3KycjT183f0+fj29fT3ePR4+Pj29/P59vv3+/r59vr1d9r9+//d99Zd1dRVU5dTndnd2Pr +Z+tjY1lTU01rUU5ORktPRUpNS1lPU1lMb1lbVV1vU2tv72fn2evZ0dPNzcnPzcnKxca/xMC+ +vr6/xca/wczIzM7P3dPf/29v92dna1VMU05DSFFRQUtBQT8+PEJAP0E/QURGSUlNU1VdZ1ld +99939+PPd9Pd3/fP38/b1dvXzsvPzNfP48vj1czZxcfIy9PAxcbKxs3Rz8jH2dXT49tf/+db +d3dnY13rTWtRWVlDW09MTUhJQUJIS0ZJSU1ISEtKT1tPXUxfTVdXXV33Y2v33f/X2+v/39t3 +zd/X3eff1d3Z3dPv6+fv3dvZ18jHy8LIx8jHw8jFxsfNzuPf23fZ3fdr/+9fWVdVU0pRS0hP +R0pBS0tEVUtTT1lITE5RT2NTX29nb+v32efTz9HIysvRxsjLzcvJys7Mz9XT1dfd3dnj28/d +3e/f9+tbXVVTW0hPREtIRlFHT0xPSklJQ05GSVFPTl1RW1tfV+tvU3dv1eNr99/r19nZ0dXb +ys7VzMnKysrMzcvR09nX0+Pd1c/T0dvj593Rb+PZ6+fj5//rW2/vZ/9jZ2tjb2Nj73d3a2tr +d2dbb3dnWWdV73dbd1FrUVlMWU9fVV1dW1n/Z/9fa19VWWtbb19V19dd4//XzG/j60fE29nJ +VdXDVczZVdvF/93bW9tOY9dPb2dJV1FOX0RX/29rXW/v5/f3593Z0//XzufRztPnY89n5+tr +3e9v3+Nvd1vfb2/dY2Pf3e9rW3dvWetrVWdvY13rZ2tr2Xfb4+/V791j7/fv3f/rd/fnd9nr +a+td//9Vb1dn429fZ3fra3dnd/djW1XrW/93X293Wffjd2PnVXdnd1f/a11j92ffXXf3791v +5//n32P3a+Nj01fO/93P99fb2+fT2d3n7//d5+fr5+Pf3czZ2dPT19HN3dnX6+v/a//3Y3db +V2ddXWtXd2drb1lRWU5bYz9IW1VXd0j/W1VvVVvbTmtOY1F3WU5XW19vV11fV19bV/9rb9vX +69Pd29fV39HZzs7NzcrM1dfG29PM29PZ38jT68fN38hZ68lN01HRT2vnWdVX91NZZ1N3b1tv +T2NMX1H/UVVbX2tVZ2NPVVdjWV1OWVVjT1VZWV9Zd2Nf7/dv49lrzslnv9fFv9nr38nvyt3f +zmfOXd1d//fX4113V3dZ91f/71ljV1dXZ3drY19nV09XW19ZY1tVWW9bWWNnY29j42vj1+vj +zMrOzGfna8JVvlfZ3+93601vd//Td29jd1FdX+/352Pr//fv7+/Z2f/j6+/v/2v/b3dVWe9f +a2NjX3dvX+N3d9vZY9XXWcdZxshT3WN31ddEyU9O7/9ZX0RZXWt3V1tPVU9bTmtdY3dba3dr +79nf29/d5+P/a2dr62fr53ff6+vr3d33z9nR19Pb2c7bz83P593v2d932/9vY03n12dN70jv +//9O70ffRtlX/01bZ05ZX2NJX0pOX2NVXVdTZ2Nv72P35+fr1dvZ2dPR08vR19PM49XT59// +4+vnb+vn/+fv52/ZW+Pvb/d3a11na+9nb+dnZ+//a29rX2NZa1tZY2Nfb2f/a2/vX2v/91// +//f/4+Pr6+/v4+fj7+vdd/9vb29rd2/3d3dX3dnvX19P49n/0WNr32dv/1nv3etvb/fr29vX +49/d1+/v3efj92tvZ3dvb3d39/fv5+/r7//j6/9db2NRZ09nXV9ZV11rWVljb193Z2tfb2Nv +a2tnX2N3Z+vj79/r3d/Z1c/R087bzdvZ2+Pr28/d3d3v7/f/92Nra1tXXWtXWV1ZZ3dfZ29r +Y2dbW///929rb2/rd1trb29X/1ddXVnvX29j71/ra+fn/2933+9v29HT30+/zdfZ3d/Lzr/f +0c5ra9nV1+Pj3Q== + +--Outermost_Trek-- + + +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: Digitizer test + +Received: from hanna.cac.washington.edu by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA29550; Thu, 3 Oct 91 13:04:23 -0700 +Received: from thumper.bellcore.com by hanna.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA19374; Thu, 3 Oct 91 13:04:04 -0700 +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id <AA12278> for MRC@CAC.Washington.EDU; Thu, 3 Oct 91 16:04:01 EDT +Received: by greenbush.bellcore.com (4.1/4.7) + id <AA08969> for MRC@CAC.Washington.EDU; Thu, 3 Oct 91 16:03:59 EDT +Received: from Messages.7.14.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.40 + via MS.5.6.greenbush.galaxy.sun4_40; + Thu, 3 Oct 1991 16:03:59 -0400 (EDT) +Resent-Message-Id: <YcurSj60M2Yt8Ta24=@thumper.bellcore.com> +Resent-Date: Thu, 3 Oct 1991 16:03:59 -0400 (EDT) +Resent-From: Nathaniel Borenstein <nsb@thumper.bellcore.com> +If-Type-Unsupported: send +Resent-To: Mark Crispin <MRC@CAC.Washington.EDU> +Return-Path: <sau@sleepy.bellcore.com> +Date: Fri, 24 May 91 10:40:25 EDT +From: sau@sleepy.bellcore.com (Stephen A Uhler) +Message-Id: <9105241440.AA08935@sleepy.bellcore.com> +To: nsb@sleepy.bellcore.com +Subject: A cheap digitizer test +Cc: sau@sleepy.bellcore.com +MIME-Version: 1.0 +Content-Type: MULTIPART/MIXED;boundary="mail.sleepy.sau.144.8891" + +--mail.sleepy.sau.144.8891 + +Well, here's a sample +--mail.sleepy.sau.144.8891 +Content-type: image/pgm +Content-transfer-encoding: base64 +Content-Description: Bellcore mug +Comments: 256 x Image wrapped by /usr/sau/bin/fetch_video +Date: Fri May 24 10:35:57 EDT 1991 + +UDUKMjU2IDI0NAoyNTUKAHaPj4+Pj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p5uCaWl2dml2dnZ2gnZ2goJvfHx8aXx8aWl2Y1dKMTEx +MT5KSkpKV1dKSkpKSkpKSkpKSldpdnZ2Y1dXV1dKV1dKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPkpKSko+Sj4+Pko+Pj4+PkpKPj4+Pj4+PkpKSko+Pj4+Pj4+Pj4+Pj4+MTExMTExMTExMTExMTExMTExMTExMTExAAB2iIiIiIiIiIiIiIiVlZWV +laGVlZWVlZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6uurq6urq6uqePdnZpaXZ2aWl8fG9vgm9vgnZpfHxpaXZ2Y2NjRDExMTE+Pj5KSkpKSkpKV0pKSkpKSldXaXZ2Y2NjV0pKSkpK +SkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPj5KSj5KSj5KSko+Pj4+Sko+Pj5KSj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PjExMTExMTExMTExMTExMTExMQAAdo+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm5ubm6enp6enp6en +p6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLShlXxjY3ZpaXx8aXaCb298fG98fG9vfHxpaXZjUEQxJTExPj5KSkpKSkpKSkpKSkpKSkpKXW9vb29dXV1dSkpXV0pKSkpKSldXSldKSkpKSkpKSkpKSkpKSkpKSkpKSkpK +SkpKSkpKSkpKSj4+Sj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMTExMTE+MTExMTExMTExMTExMTExMTEAAHaIiIiIiIiIiIiIiIiVlZWVlZWVlZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urq6urq6u +rq6urrq6rq66urq6urquro98fGNjdnZpdnZ2dnaCb298fG+CgmlpfG9jY1c+MSUxMT4+SkpKSldKSkpXSkpKSkpKV1djb29jV1dKSkpKSkpXSkpKSkpKSkpKSko+SkpKSkpKSkpKSkpKSj5KSkpKSko+PkpKPkpKSkpKSj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+ +Pj4+Pj4+PjExPj4+MTExMTExMTE+PjExMTExMTExAAB2iIiIiIiIiIiIiIiIiIiIlZWVlZWVlZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq66urq6urq6rqGVgmlpdnZpdnZ2aXx8aXaC +dnZ2dmlpfG9vb29KSjcrNzc3RERERERERFBQUFBQUFBQUFBdaWlXY1dXV1dXSldXV0pKSkpKSkpKSkpKSko+SkpKSkpKPj5KSj5KSj4+Sko+Pj5KSkpKSkpKSkpKSkpKSj4+Pj4+Pj4+MT4+Pj4+PjExPj4+PjExMTExMTExMTExMTExMTExMTExMTExMQAA +doiIiIiIiIiIiIiIiIiIlZWVlZWVlZWhlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrqurrq6urq6uq6hj29vb2NjfHxvb3xpdnZ2dnZ2aWl8fGl2dmNjUDc3JTExPj5KSkpKSkpKSkpKSkpK +SkpXY2NjY1dXV1dKSldXV1dXSkpKSkpKSkpKSko+SkpKSkpKSkpKSkpKSkpKSj4+Sko+PkpXSldXV1dXV0pKSkpKSkpKSko+Pj4+Pj4+Pj4+Pj4+PjExPj4xMTExMTExMTExMTExMTExMTExMTEAAHaIiIiIiIiIiIiIiIiVlZWVlZWVlZWVlZWhoaGhoaGh +oaGhoaGhoaGhoaGhoa6urqGurqGhrq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urqulZV8Y2Nvb29vfG9vfHxpdnZ2doKCaXZ2dmlpaUo+MSU3NzdKSkpKSkpKSldKSkpKSkpXV2NjY1dXV1dXV0pKV1dKSkpKPkpXSkpKSkpKSko+ +Pj4+Sko+PkpKPkpKPkpKSko+SkpKSldjV1dXV1dXV1dXV1dKV0pKSkpKSj4+Pj4+Pj4+Pj4+Pj4+MTExMT4xMTExMTExJTExMSUxMSU3AAB2iIiIiIiIiIiIiIiIiIiVlZWVlZWVoZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6u +rq6urq6urq6urq6urq6urq6urq6urq66urq6urqurqGIb29vY298b298fGl2dnZ2dnZpaXxvY3Z2Y2NXNzclMTE+PkpXSkpKSkpKSkpKSkpKSkpjY2NjV0pKSkpKV1dXV1dKSkpKSkpKSkpKSkpKSkpKSj5KSkpKSkpKSko+Pj5KSj4+SkpKXV1dXV1dXV1d +XV1dXV1QUFBQUFBQUFBQUFBQPko+Pj4+Pj4+Pj4+PjExMTExMTExMTExMTExMQAAdoiIiIiIiIiIiIiIiIiVlZWVlZWVoZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6urq6urrqurq6urq6urq6urq6uurq6urq6uq6b +j29jY3Z2aXZ2aWl8fG98fG9vgnZpdnZ2aWlpSjc3JT4+PkpKSkpKSkpKSkpKSkpKSldXY2NjY2NQUFBQUFBQUFBQUFBQUFBQUFBQUFBQRERERERERERERERERERERERERERERERERERERFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQRERERERERERE +REREN0Q3Nzc3NzclMTEAAHaIiIiIiIiIiIiVlZWVlZWVlZWVlZWVlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6uq66uq6uoYhvb29jb3xvb29vb298b298fGl2dnZjdnZjY0o3NyUx +MT4+SldKSkpKSkpKSkpKSkpKV2NjY2NXV1dKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPkpKSkpKSkpKSkpKSko+Sko+Pj4+Pj5KSkpKSj5KSkpKSkpKSkpXV1dXV1dKV1dKSkpKSkpKSkpKPkpKSkpKSkpKSj4+Pj4+Pj4+Pj4xAAB2iIiIiIiIiIiIiIiIiIiV +lZWVlZWVlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urq6urq6rpuPdmNjdmlpdoJvb3x8aXx8aXaCdml2dmlpaVdERCUxMT4+Sko+SkpKSkpKSkpKSkpKSkpjY2NjY0pKSldKSkpK +SkpKSkpXSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPko+Pj4+Pj4+Pj4+Pj4+Pj4+SkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSj4+SkpKSkpKSj4+Pj4+PgAAdoiIiIiIiIiIiIiIiIiIiJWVlZWVlZWVlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGh +oaGhoa6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6hgm9vb2NvfGlpdnZjdoJvb3x8aXZ2aWl2dmNjSjc3JTE+Pj5KSkpKSkpKSldKSkpKSkpXY2NjY1BQUFBQUFBQUFBQRERQUFBQUFBQUFBQUFBQUFBERERERERERERERERE +RERERERERERERERERERENzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N0REREREREREREREREREREREREQAAHaCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj4+Pj4+hoaGhlaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6urq6urq6urq6u +rq6urq6urq6uurq6urqum492Y2N2dml8fGl2dnZpfHxpdnZ2aXZ2Y29vXUo3JSUxMT5KSkpKSkpKV1dKSkpKSldKSmNjY1dXV0pXV0pKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSko+SkpKSkpKPkpKPj4+Sj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PjExPj4xMTE+ +MTExMTExMTExMTExMTExPj4+Pj4+Pj4+Pj4+Pj4+AABpgoKCgoKCgoKCj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKGCdnZpaXZ2aWl2dmN2dml2 +gnZ2dnZpaXxvV2NKNzclMTE+PkpKSkpKSkpKV0pKSkpKSldjY2NXSkpKSkpKSkpKV0pKSldKSldKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPj5KPj4+Pj4+Pj4+Pj4+Pj4xMTE+Pj4+PjE+Pj4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQAA +doiIiIiIiIiVlZWIiIiIiJWVlZWVlZWVlZWVoZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6uurq6urq6rq66rq66uq6uuqebiHZdaXZpaXx8Y29vb298fGl2gm9vb29jb29XSjcrKys3N0pKSkpKSkpKSkpKSkpK +SkpXY2NjV1dKSldXSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSj4+Sko+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTE+Pj4xMTExMTExMTExMTExMTExJTExMSUxMSUxMTElJTExMTEAAHaIiIiIiIiIiIiIiIiIlZWVlZWVlZWVlZWhoaGhoaGh +oaGhoaGhoaGhoaGhrq6hrq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq66urq6urquoYJvb29jdnZpdnZ2aXx8aWl8b29vfGlpfGlpXUoxMSUlNzc3SkpKSkpKSkpXSkpKSkpKV2NjY1dXV0pKSkpKSkpXSkpKSkpKV0pKSko+SkpK +SkpKPkpKSko+Sj4+Sj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMT4xMTExMTExMTExMTExMTExMTExMTExJTExMTExMSUxMTExMSUlAABpiIiIiIiIiIiIiIiIiIiVlZWVlZWVlZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa6uoa6urq6urq6urq6urq6u +rq6urq6urq6urq6urq6urq6urq6urq6urq66urq6rpuPb2Nvb29vfG9jdnZpaXx8aXZ2aWl2dmNvb1dKMSUlMTExSkpKSkpKSldKSkpKSkpKSkpjY1dXV1dXV1dKSldKSkpXSkpKSkpKV0pKSkpKSko+SkpKPj5KSkpKSkpKSj4+Pj4+Pj4+Pj4+Pj4+Pj4+ +Pj4+Pj4+Pj4+MT4+MTExMTExMTExMTExMTElMTExMTExJTExJTElJSUlJSUlJQAAdoiIiIiIiIiIiIiIlZWVlZWVlaGVlZWVlZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6uurq6urqurq6urq6h +fG9vb298fGlpfGlpfHxvb4J2aXZ2aXZ2aWldSjElJTExPj5KSkpKSkpKSkpKSkpKSkpdXV1dXVBQUFBQUFBQUFBQUFBQUFBQUERERERERERERERERERERERERERERERERERERERERERERERERERENzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyUxMTEx +MTExJTExJSUlJSUxJSUAAHaIiIiIiIiIiIiIiIiIiJWVlZWVlaGVlZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urqhj4J2aWl8fG9vb29vfHxpdoJvb3x8aWl8aWlpSjc3JSUx +MTFKSkpKSkpKSldKSkpKSkpKV2NjY1dXV0pXV0pKSkpKSkpKSkpXSkpKSkpKSkpKSko+Sko+SkpKPj5KSko+Sj5KPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PjExPj4xMTExMTExMTExMSU3Nzc3NzcrKysrKysrKysrKysrKysrAAB2goKCgoKCgoKPj4+Pj4+P +j4+Pm5ubm5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p6d8aXZ2Y298b298fGNvfG9vfHxvb3xvb29vXV0+MSUlJTc3N0RERERQUFBQUFBQUFBQUF1dXV1QUFBQUFBQUFBQ +UFBQUFBQUFBQPkpKSkpKSj4+SkpKPj4+Sko+SkpKNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyU3NysrKysrKysrKysrKysrKwAAdoiIiIiIiIiIiIiIiIiIiIiIlZWVlZWVlZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGh +rq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq66urq6rq6urq6urq6PgnZjY3xvb298b298b298fGl2dnZpdnZpaWlQPjEfHzExMT5KSkpXSkpKSkpKSkpKSkpXY2NjV1dXSkpKSkpKSkpKSkpKSkpKSkpKPkpKPkpKSkpKSko+Pj4+Pko+Pj4+ +Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTExMTExMTExMTExMTExMTElJTExJSUxMTExMSUlJTElJTExJSUAAGmCgoKCgoKCj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6e0tKenp6enp6enp7S0tLS0tLS0tLS0tLS0 +tLS0tLS0tLS0tLS0tLSnm3ZpaXZpdoJpaXZ2aXZ2dml8fG98fG9vb29dUDclJSUlNzdERFBQUFBQUFBQUFBQUEREV2NXV1dKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPj4+SkpKSj4+Sj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMTExMTEx +MTExMTExMTExMTExJTExJSUxMSUxMSUlJSUlJSUlAABpgoKCgoKCgoKCj4+Pj4+Pm5uPm5ubm5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0oY+CdmNjfG9vfHxjb3xvb298 +b2+CdnZ2dmlpaUo+MSUlMTE+SkpKSkpKSkpKSkpKSkpKSldjY1dXV0pKSkpKSkpKSkpKSj5KSkpKSj5KSko+Sko+PkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMT4xMTExMSU3NyUxMTExMTElMTExMTExJTExMSUxMSUlJSUlJQAA +doKCgoKCgoKCgo+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKeVdmlpaWl2dmlpfHxpdnZ2doKCb3x8aWl8aV1QPiUlJSU3N0pKSkpKSkpKSkpKSkpK +SkpXV1dXV0pKV0pKSkpKSkpKSkpKSkpKSkpKSkpKSko+Sko+PkpKPkpKPj5KSj4+Pj4+Sko+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTExMTExMTExMTExMTExMSUxMTExMTElMTExMSUxJSUxJSUlJSUAAGmCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj4+bm5ubj6GhoaGh +oaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6urq6urrq6urq6uq6urq6uurq6urq6urqhj4J2Y298b29vb2NjfHxpdnZ2doh2dnZ2aWlpSjc3JSUxMTFERERERERERERERERERFBQUF1dXVBQUFBQUFBQUFBQUFBERFBQUFBQUFBQUD5K +SkpKSkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMTExMTExMTExMTExMTExMTExMSUxMSUlMTExMTElJTExJSUlJSUlAABpgoKCgoKCgo+Pj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp7S0tLS0tLS0 +tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p5V2aXZ2aXx8aXZ2aWl2dnZ2iHZpfHxpdnZpXVA3NyUlMTE+Pj5KPj5KSkpKSkpKSkpKSldXV1dXSkpXV1dXV0pKSkpKSkpKSkpKSldKSkpKSkpKSkpKSko+Sko+PkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+ +Pj4+MTE+MTExMTExMTExMTExMTExMTExMSUxMTExMSUxMSUlJTExMTElJSUlJQAAaYKCgoKCgo+Pj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKGI +fG9jb3xvb3x8aXaCb298fG9vgm9vfHxpaWlKNzcfHx8xPj4+PkpKPkpKSkpKSkpKSkpXV1dKSkpKSkpKSkpKSkpKSkpKSkpKV0pKSkpKSkpKSkpKSkpKSj4+Sko3N0RENzdENzc3NzdERDdERDc3Nzc3Nzc3Nzc3Nzc3Nys3Nzc3Nzc3NzclMTElMTExMSUx +MSUlMSUxMSUlJSUlJSUAAHaIiIiIiIiIiIiIiIiIiIiVlZWVlZWhlZWVlaGhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urq6urq6urq6uq6hlW9vb29vb29jdnZ2dnZ2aXaCdnZ2gml2dmlXVzclJSUl +MTExPko+PkpKSkpKSkpKSkpXV1dXV1dKSldKSldKSkpKSkpKSkpKSkpKSkpKSko+SkpKSkpKSj5KSkpKSj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PjExPj4xMT4+MTE+MTExMTExMTExMTElMTElJTExMTExMTElMTExMSUlJSUlAABpgoKCgoKCgoKCj4+Pj4+P +j4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0oYiIb2N2dnZ2dnZpfHxpaXx8b3x8b298fGlpaUo3JSUlMTE+Pj4+PkpKSkpKSkpKSkpKSldXV0pXV0pKV1dKV1dK +SkpKSkpKSkpKSkpKSko+Sko+SkpKSkpKSj5KPj4+Pj4+Pj4+Pko+Pj4+MT4+Pj4+PjExPjExMTExMTExMTExMTExJSU3NyUxMTExMTElMTElJSUlJSUxMSUlMSUlJQAAaYKCgoKCgoKCj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm5ubm6enp6en +p6enp6e0tKenp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p6ePb29vY2N8fGl2dmlpfHxpdoJ2aXx8aWl2Y1dXNyUlJTExPj4+Pj4+SkpKSkpKSkpKSkpXV1dXSkpKV0pKV1dKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPkpKPj4+ +Sj4+Pj4+Pj4+Pj4+Pj4+MTE+Pj4+Pj4+Pj4xMTExMTExMTExMTExMTExMTExMSUlJTElJTElJTExJSUlJSUAAGmCgoKCgoKCgo+Pj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLS0tLS0tLS0 +tLS0tLS0tLS0tLS0tLSbiIhpaXZ2aXZ2dml2dnZ2dnZ2dnZpaXx8aXZjRDcfHx8rKzdENzc3NzdEV0pKV0pKSkpKSldXSkpXSldXV1dXSkpKSkpKSkpKSkpKSkpKSkpKSj5KSkpKSkpKSko+Pj5KPkpKPj5KSjc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3 +Nzc3Nzc3Nzc3KysrKysrKysrKysrKysrKysrHx8fAAB2iIiIiIiIiIiIiIiIiIiIiJWVlZWVlZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urq6rq6urq6uurq6urqnp4hvY3Z2aXaCaWl8fGl2dnZ2 +dnZpdnZ2dnZpUD4xHx8fKz4+Pj4+Pj4+SkpKSkpKSkpKSldXV1dXSkpXV1dXV0pKSkpKSkpKSldKSkpKV1dXSkpKSkpKSkpKSkpKSko+Pj4+Pj4+Pj4+Sj4+Sko+Pj4+Pj4+Pj4xMTExMTExMTExMTExMTExMTExMTExMTExMSUlMSUlJTElJTExJTElJQAA +aYiIiIiIiIiIiIiIiIiVlZWVlZWVlZWVoaGhoZWhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urrq6uq6urq6urq6urrq6rq6urq66urq6rpWCgm9jb3xvb29vY298fGl2gm9vfG9vb3xpaV1KMSUlJTE+Pj4+Pj4+PkpKSkpKV0pK +SkpXV1dKSkpXV1dXV1dXV0pKSkpKV0pKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MT4+MTExMTExMTExMTExMTExMTExMSUxMSUxMSUlJSUlMSUlJSUlJSUAAGmIiIiIiIiIiIiIiIiIiIiIlZWVlZWVlZWhoaGhoaGh +oaGhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urq6rrq6urq6uqenj29jdnZjdnZpaXx8aXZ2dnaCdml2dnZ2dmlQRDEfHysrNzc3Nzc3NzdKSldXV1dKSkpKV1dKV0pKV1dXV1dXV1dXV0pKSkpKV1dKV1dXV1dK +SkpKSkpKSkpKSj5KSkpKSko+Sko+Pj4+Pj4+Pj4+Pj4+Pj4xMT4+Pj4+MTE+PjExMTExMTExMTExMTExMTExJSUxJTExMSUlMTExMSUlAABpgoKCgoKCgoKCj4+Pj4+Pj5uPj4+bm5ubm5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6e0 +tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0lYJ2dl1vfGlpdnZpdnZ2dnaCaXaCb298fGlpXT4lJSUlNzc3Nzc3Nzc3RFBQUFBQUERQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQRERERERQUERERERERERERERERERENzdERDc3 +Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nys3Nzc3NzclMTElMTExJSUxMSUlJSUlJSUlJQAAaYiIiIiIiIiIiIiIiIiIiJWVlZWVlZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urq66urq6uq6urq6urq6uurqurrq6p6eI +b29vb29vfGlpfG9vfHxpaXx8aXZ2aWl8aVdEMR8fHzExPj4+Pj4+Pj5KV2NXV1dKSkpXV0pKSkpXV0pXV1dKV1dXV1dXSkpKSkpKV0pXV0pKSkpKSkpKSkpKSkpKSkpKSj4+Sko+Pj4+Pj4+Pj4+Pj4+Pj4+PjExPj4+Pj4xMT4+MTExMTExMTExMTExMTEl +JTExMTElJSUlJSUlJSUAAGmCgoKCgoKCgoKPj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSPgnZpaWl8b298fGl2gnZpfHxpdnZ2aXx8aWlXPjElJTEx +MTE+PjExMT5KV1dXY1dKSkpKSldXSkpKSkpKV1dXV1dKV1dXSkpKSkpXSldXV1dXV0pKSkpKSkpKSkpKSkpKSkpKSkpKSko+Pj4+Pj4+Pj4+Pj4+Pj4+PjExPj4xMTExMTExMTExMTExMSUxMTExMTExMTElJSUlJTExJSUlAABpgoKCgoKPj4+Pj4+Pj4+P +j4+Pj5ubm5ubm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLShoYhpaXZ2Y3Z2aXaCdml8fGl2gnZpfHxpdnZjV0QxHx8fKz4+Pj4+MTE+PkpXY1dXV0pKSkpKSkpKSkpXV1dXV1dX +V1dKV1dKSkpKSkpXSkpKSkpXSkpKSkpKSkpKSkpKSkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PjExMTElNzclMTExJSUxJTExJSUlMSUlJSUlJSUlJSUlJQAAaYKCgoKCgoKPj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6en +p6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJWCgmlpdnZpaYJ2aXaCb298fGl2dmlpfHxpXV0xJRgYGCUxMT4xMTExMUREV1dXV0pKSkpKV0pKSkpXSldXV1dXV1dXV1dXV1dKSldKSldXSldXSkpKSkpKSkpKSkpKSkpK +SkpKPj5KSj4+Pj5KSj4+Pj4+Pj4+Pj4+Pj4+MTExPjExMTExMTExMTExMTExJTExJTExMSUxMSUlJSUlJSUAAGmCgoKCgoKCgo+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0 +tLS0tLS0tLS0tLS0tLSbiGlpdnZpfHxpdoJvb3x8aXZ2dml8fHx8fGlpSkpKNzc3Nzc3Nzc3NzdEREREREREREREREREREREUFBQUF1dXV1dXV1dXUpKV0pKV0pXV1dXSkpXSkpKSj5KSkpKSkpKSkpKSkpKSkpKSkpKSko+Pj4+Pj4+Pj4+Pj4xMT4+MTEx +MTExMTExMTExMTExMTExMTExJTExMSUlJSUlJSUlAABpgoKCgoKPj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSnlYKCaWl2dml2dnZpdnZ2do+b +m6enp7S0tLS0tLS0p6enp6enp6eVlZWIiIiIfHxpXV1KSkpKPj4+SkpKV1dXV2NjY2NXSkpXSkpXSkpKV1dKV1dKSkpKSkpKSkpKSj5KSkpKSj4+Pko+SkpKSkpKPj5KSj4+Sj4+Pj4+Pj4+MTExMTExMTExMTExMTExMTElMTElMTExJSUlJSUlJSUlJQAA +aYKCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp7S0tLS0p7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p6eIaXZ2aWl8fGl2iIihtMfHx8e6urq6x8fHx9PT09PT09Pf39PT09PT08fHx8fHurqn +p5uPgoJvY1dXV0pKSkpKV1dXV1dXV1dXSkpXV0pKV0pKSkpKSkpKSkpKPkpKPj5KSj5KSkpKSkpKSkpKPkpKPj4+Sj4+Pj4+Pj4+MTExMTExMTExMTExMTExMTExMTExMTElMTExJSUlJSUlJSUAAGmCgoKCgo+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ub +m5ubm5ubm6enp6enp6enp6enp6enp6e0tLSntLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSPgnZpaXZ2dnZ2j6fAwMDAtLS0p6e0tLS0wMDAwM3Nzc3Nzc3Nzc3Nzc3Z2dnZ2dnZ2dnZzc3NwMC0tKGVgm9vY1dXV1dKSldKV1dXSkpXV0pK +SkpKSkpKSkpKSko+Pj5KSkpKPj4+Pj5KSkpKSko+Pj4+Pj4+Pj4+Pj4+PjExMTExMTExMTExMTExMTExMSUlMTElMSUlJSUlJSUlJSUlAAB2iIiIiIiIiIiIiIiIiIiIlZWVlZWVlZWVlZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6u +rq6urq6urq6uurq6rq6urq6urq66urq6urq6uq6hlYJpaXx8aXZ2obS0oaGhlaGhoaGhoaGhrq6uurq6usfHx8fHx8fH08fH08fT09PT09PT09PT0+b4//////jfx7ShlYJvY1dKSkpKSkpKSkpKSkpKSkpKSkpKSko+SkpKSj5KSkpKPj4+SkpKSkpKSko+ +Pj4+Pj4+PjE+PjExMTExMTExMTExMTExMTExMTExMSUxMSUlJSUlJSUlJSUlJQAAaYKCgoKCgoKCgoKCj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p492 +dnZjb3xvb7rNupuPj4+Pj4+Pj5ubm5uurq6uurq6use6usfHx8fHx8fHx8fHx8fT09PT09PT7P//////+Pjs7NnZx66hlYJvV0pKSkpKSkpXSkpKSkpKSkpKSko+SkpKPkpKPj4+Pj5KSj5KSj4+PkpKPj4+Pj4+MTExMTExMTExMTElMTExMTExMTExMTEx +MSUxMSUxMSUlMSUlJSUAAGmIiIiIiIiIiIiIiIiIiIiIlZWVlZWVlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urq66urq6urq6urq6urq6urq6rqGVgmNjdnZpdoi62dm6oY+Cj4+Pj4+Pj6GhoaGurq6urq6u +wMDAwMDAwMDAwMDAwMDAzc3Nzc3NzdnZ2ebm2ebm5ubm5ubZ2dnHx66PgmlQUERERERQUFBQUEREREREREREREREREREREREREREREREREREREQ3N0RENzc3Nzc3Nzc3Nzc3NzcrNzcrNzc3JTc3Kzc3NysrKysrKysrKysrAABpgoKCgoKCgo+Pj4+Pj4+P +j4+Pm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSnj3Z2dmN2gml2rs3m8tnAoYiIiIiIlZWVlaGhoaGurq6uurq6urq6x8fHx8fHx8fHx8fHx8fHx8fZ2dnZ2dnZ2ebm +2ebm2dnZ5ubm5s26p49vXUpKSkpKPj5KSkpKSkpKSj4+Pko+Pj4+Pj4+Pj5KPj4+Sj4+Sj4+Pj4+Pj4+MTExMTExMTExMTElMTElMTElJTExJTExMTExMSUxMSUlJQAAaYiIiIiIiIiIiIiIiIiIlZWVlZWVlZWVlaGVoaGhoaGhoaGhoaGhoaGhoaGhoaGh +oaGhoa6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urqurrquoY98Y2N2dml2gqfAwN/s7OzTupWViIiIiJubm6enp6enp6e6urrHx8e6x8fHx8fHx8fHx8fHx8fH09PT09PT09PT39/f39PT09PT39/f39/Tx6eIaUo+PkpKPkpKPj5KSj5K +SkpKSj4+Pj4+Pj4+PkpKPj4+Pj4+Pj4+Pj4+Pj4xMT4xMTExMTExMTExMTExJTExMTExJTc3KysrKysrKx8AAGmCgoKCgoKCgoKPj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6entLS0tLSntLS0tLS0tLS0tLS0tLS0 +tLS0tLS0tLS0tLS0tKeIb29vY3Z2aXauurrHx9nm8vLy07ShlYiIoaGhoaGurq6urq66urrHx8fHx8fHx8fHx8fHx8fHx9PT09PT09PT09PT09PT09PT09PT09/f39/f07SVb1A+Sko+Pj5KPj4+Pj5KSkpKSj4+Sko+PkpKPkpKPkpKPj4+Pj4+Pj4+PjEx +MTExMTExMTExMTExMSUxMTExMTExMTExJTElJSUlAABpgoKCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKenj4JjY3ZpaXaCp7TAwMDAwNPT +5vLy8vLZwKebm5ubp6enp7S0tLTAwMDAwMDAwMDAwMDAwM3Nzc3Nzc3Nzc3Z2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZx66CYz4+Pj4+Pko+Pj4+Pj5KSj5KSj5KSj4+Pj4+Pko+Pj5KPj4+Pj4+PjExMTExMTExMTExMTExMTExMTExMSUxMTExMSUlJSUlJQAA +aYiIiIiIiIiIiIiIiIiIiJWVlZWVlZWhoZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urrq6uq6urq66urq6urq6oYh2dmlpdnZpfK66urrHx8fHx8fH09Ps7Pj/8t/Huqenp6enp7q6urq6urrHx8fHx8fH +x8fHx8fH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PHrohXREREREQ3Nzc3RERERERERERERERERERERERERERERERENzc3Nzc3Nzc3Nzc3Nzc3Kzc3JTExJTExJSUxMTExMSUlJTElJSUAAGmCgoKCgoKCj4+Pj4+Pj4+Pj4+Pm5uPm5ubm5ubm5ub +m5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p6ePfF1vb29vb4Knuse6x8fHurq6urrHx8fZ2eb4+Pj4+ObTx7SntLS0tLS0wMDAwMDAwMDNzc3Nzc3Nzc3NzdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ +2dnZx7Shb0pKPj5KSj4+Pj4+PkpKPj4+Pj4+Pj5KSj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTExMSUxMSUxMTExMTExMSUxJTExMSUlJSUlJSUlAABpgoKCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp7S0tLS0 +tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLShgnZ2aWl2dmmCrrq6urrHurq6urq6urrHx8fT09Pf3+z4////////5tPAwMCurrq6usfHx8fHx8fT08fT09PT09PT09PT09PT09PT09PT09PT09PT08e0oXxXSkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+ +Pj4+Pj4+Pj4+Pj4+Pj4xMTExMTExMTExMTExMTElMTElJTExJTExJSUlJSUlJQAAaYKCgoKCgoKCgoKPj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6enp7S0tKe0tLS0tKe0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0oZV8 +Y298aWl2iK7AwMDAwMDAwMDAwMDAwMDAwMDAwMDNzc3Z2ez////////y8ubT09PHx8fHx8fHx8fH09PT09PT09PT09PT09PT09PT09PT09PT08e0tI9vSkpKPkpKPj5KPj4+Pj4+Sko+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTExMTExMTExMSUlMSUl +JTElJTExJTExJSUlJSUAAGmIiIiIiIiIiIiIiIiIiIiVlZWVlZWVlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6urq6urq6urq66urq6urq6urq6urqurq6urpuCdnZjY3Z2Y4i0wMDAwMDAwMDAwLS0tMDAwMDAwMDAwMDA +wMDAwMDNzc3N2dnm5vLy8vLy8vLm5ubm09PT09PT08fT09PT09PT09PT09PT09PTx7S0oYh2aUpKSko+Pj4+Pj4+Pj5KSkpKSko+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PjExMTExMTExMTExMTExMSUlMTElMTExMTElJSUlJSUlAABpgoKCgoKCj4+Pj4+Pj4+P +j4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKeViHxjY3Z2aWmhtMfHx8fHx8fHx7q6urq6x8fHx8fHx8e6urq6urq6urq6x8fHx8fHx8fH09PT09/f39/s7Ozs7N/f +7N/f7Ozf39/T09PHurquoaGPgnZ2aVdERERERERENzdEREREREREV0o+Sj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMTExMTExMTExJTElJSUxMSUlMTElMTExJSUlJSUlJQAAaYKCgoKCgoKCj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6en +p6enp6enp6e0tLS0p7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0oYJpdnZjb3xplbrHx8fHx8fHx8fHx7q6urq6x7q6x8fHurq6urq6urq6uq6urq6urrq6urq6urq6urq6urq6urq6uq66uq6uurqnp6ebm5uIiIiIdnZ2dmNXSkpKSko+Pj4+ +PkpKSkpXV1dXSkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTExMT4xMTExMTExMTExMSUlMSUxMTElJSUlJSUAAGmCgoKCgo+Pj4+Pj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0 +tLS0tLS0tLS0tLS0p5WIdmNjfGlpdqG0x8fHx8fHx8fHx8e6urq6usfHx8fHx7q6urq6urq6urq6rq6urq6urq6urq6urq6urq6hoaGhoaGhoaGhusfHrpWViIiIfIh8fHx8b29vV0pKSkpKSj5KSkpKSkpKSkpXSkpKSj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+ +PjExMTExMTElMTElMTExMTExMTExMSUxMSUlJSUlAABpgoKCgo+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp6enp7S0p7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLShfGl2dmNvfG+husfHx8fHx8fH +x8e6urq6usfHx8fHx8e6urq6urq6urqurq6urq6urq6urq6urq6urqGhoaGVlZWVlZWVlae0oY+Pj3x8iIh2dnZ2dnZ2Y1dXSkpKSj5KSkpKSkpKSkpKSkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTE+MTExPjExMTExMTElJTExMTExJSUlMSUlJSUxMQAA +aYKCgoKCgoKPj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSnj492Y2N2aWl2obrHx8fHx8fHx8e6urq6x8fHx8fHx8fHx7q6urq6urq6rq6urq6urq6u +rq6uoaGhoaGhoaGVlZWVlZWIiIiIiIiIiIiIiHaCgnZ2doJvb29XSkpKSkpKPj5KSkpKV0pKSko+Sko+Pj4+Pj4+Pj4+Pj4+Sko+Pj4+Pj4+Pj4+MTExPjExMTExMSUxMTElJTExJTExJSUlMSUAAGmCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ub +m5ubm5ubm5ubp6enp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p5t8b29vb298b6G6x8fHx8fHx8fHx8fHx8fHx8fHx8fHx7q6urq6urq6rq6urq6urq6urq6urqGhoaGhoZWVlZWVlYiIiIiIiIiIiIiIfHx8fHx8 +fG9vb29jV0pKSkpKSkpKSkpKSj5KSkpKSko+Pj4+Pj4+Pj4+Pj5KSj5KSj4+Pj4+Pj4xMTExMTExMTExMTExMSUlMTElMTElJTExJSUlAABpgoKCgoKCgo+Pj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp6entLS0 +tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKGViHZjb3xpaXynusfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHurq6urq6uq6urq6urq6urq6urq6hoaGhoaGhlZWhj4+Pj4+Pj4+Pj4+CgoKCdoKCdnZ2dnZ2Y1BQUERERERERERERERERERERERERERERERE +RERERERERERERERERERERERERDc3Nzc3Nzc3Nys3NyUxMSUlMTExMTExJTExJQAAaYKCgoKCgoKPj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSnm3Z2 +dnZjdnZpp8DAwMDAwNPHx8fHx8fHx8fHx8fHx8fHurq6urq6uq6urq6urq6urq6urq6urqGhoaGVlZWVlZWVlYiIiIiIiIiIiIh8fHx8fHx8b29vb2NXSj5KSkpKSko+Pko+PkpKPko+Pj4+Pj4+Sko+Sko+PkpKPkpKPkpKPj4+Pj4+Pj4xMTExMTE+MTEx +MTExMSUlJSUlMTElJTEAAGmCgoKCgo+Pj4+Pj4+Pj4+Pm5ubj5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6e0tLS0tLSnp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0oY+PdmNvfGlpgqe6x8fHx8fHx8fHx8fHx8fHx8fHx8fHx7q6 +urq6urqurq6urq6urq6urq6urqGhoaGhoaGVlZWVlZWViIiIiIiIiHx8fHx8fHx8fHx8b29vSkpKSj5KSj4+Sko+Pko+PkpKPj4+Pj5KSj5KSj4+SkpKSkpKSj4+Pj4+Pj4+Pj4+Pj4xMT4xMTExMTExMTExMSUxMSUlJSUlAABpgoKCgoKCgoKCj4+Pj4+P +j4+Pj4+Pm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6e0tLS0tLSntLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKeVdnZ2dml8fHynx8fHx8fH08fHx8fHx8fHx8fHx8fHx8fHx7q6urq6uq6urq6urq6urq6urqGhoaGhoaGVoZWIlZWI +iIiIiIiIiIiIiHx8fHx8fHx8fG9vY0pKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+PkpKSkpKSj5KSj4+Sko+Sko+SkpKPkpKNzc3Nzc3Nzc3Nzc3NzcrKysrKysrKysrKysrKwAAaYKCgoKCgoKPj4+Pj4+Pj4+Pj4+Pj4+PoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh +rq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6uurqurq6hlYhvY3Z2Y2OIrsDAwMDNzc3Nzc3NzcDAwMDAwMDAwMDAwMDAtLS0wMC0tLS0p6enp6enp6enp6enp6ebm5ubm4+Pj4+Pj4+Pj4+PgoKCgoKCgm98fHxpaWlKPko+Pj4+Pj4+ +Pj4+Pj4+SkpKSkpKSkpKSko+Pj4+Pj5KSj4+Sko+Pj4+Pj4+Pj4+MTE+MTExMTExMTExJTElJTElJSUxMSUAAGmCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLS0tLS0 +tLS0tLS0tLS0tLS0p492aXZpaXx8fK7Hx8fHx9PTx8fHx8fHx8fHx7rHx8fHx8fHurq6urq6uq6urq6urq6urq6urq6hoaGhlZWhlZWVlYiIiIiIiIiIiIh8fHx8fHx8fG98fG9jSj4+Pj4+Pj4+Pj4+Pj4+Pj5KSkpKV1dKSko3Nzc3Nzc3NzdERERERERE +REREREQ3Nzc3Nzc3Nzc3Nzc3NysrKysrKysrKysrAABpiIiIiIiIiIiIiIiIiIiVlZWVlZWVlZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6uuq6urq6urq6urq66urq6urq6urqurpuIfHxpaXx8aY+6x8fHx9PT09PT +x8fHx8fHx8e6urrHx8fHurq6urq6urqurq6hoaGhoa6uoa6uoaGhoZWhj4+Pj4+Pj4+Pj4+Pj4+CgoKCdoKCdnZ2dmlpXUREREREREQ3N0RERDc3NzdERFBQUFBQUFA+Pj4+MTE+Pj5KSj4+Pj4+Pj4+PkpKPj4+Pj4+PjExMTExMTExMTExMTExMTExJQAA +aYKCgoKCj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLTH09Pf7Ozs39/T08fHx66bj29jb29jb2+PtMfHx9PT09PHx8fHx8fHx8fHx8fHx8fHx8e6usfHurq6urq6rq6urq6u +rq6urqGhoaGVlZWVlZWVlYiIiIiIiIiIiIh8fHx8fHx8fHxvb1c+Pj4+Pj4xPj4+Pj4+Pj4+PkpXV1dXY1BQPj4xPj4+Pj4+MT5KPj4+SkpKSj4+Pj4+Pj4+Pj4+MTE+PjExMTExMTElMTElJTEAAGmCgoKCgo+Pj4+Pj4+Pj4+Pj4+Pj4+PoaGhlaGhoaGh +oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6ursfZ7Pj4+Pj///j4+Pj47OzZx7Shj29vb29jj8DA08fH09PT09PHx8fHx8fH08fHx8fHx8fHurq6urq6urq6uq6urq6urq6urq6hoaGVlaGVlZWViIiIiIiIiIiIiHx8fHx8fHx8 +fHx8b2NjPj4+Pj4+Pj4+Pj4+Pj4+Pj5KSkpXV1dXSko+Pj4xPj4+Pj4+Pj5KSj5KPj4+Pj4+Pj4+Pj4xMT4+PjExMTExMTExMTExMSUlAABpgoKCgo+Pj4+Pj4+Pj4+Pj4+Pj6GhlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6u +rq6urq6urq6urtPs+P/////////////////////4+ObNroh8fI/A09PT09PT09PHx8fHx8fHx8fHx8fHx8fHx8e6x7q6urq6urq6rq6urq6urq6urqGhoaGhoaGVlZWVlZWIiIiIiIiIiHx8fHx8fHxvb29vUD4+MTE+PjE+Pj4+Pj4+Pj4+PkpKSl1dUFBE +RDExPj4+Pj4+Pj4+Pj4+PkpKPj4+Pj4+Pj4+Pj4+PjExMTExMTExMTExMTExMQAAaYKCgoKCgoKCgo+Pj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6entLS0p7S0tLS0tLS0tLS0tLSnutPs+Pj47Pj47Pj///////////////// +//jmx6e62dnZ2dnZ2c3Nzc3Nzc3Nzc3Nzc3Nzc3NzcDAwMDAwMDAwMC0tLS0tLS0tKenp6enp6enm5ubm5uPj4+Pj4+Pj4+PfHyIfHx8fHx8fHxpaVc+MT4+Pj4+Pj4+Pj4+Pj4+Pj4+SldXV1dKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4x +MTExMTExMTExMTExJSUAAGmIiIiIiIiIiIiIiIiIiIiIiJWVlZWVlZWhoaGhoaGVoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6uutPm8vLm5s3Nzc3Nzc3Nzdnm5vLy///////////s7N/T09PT09PT08fTx8fHx8fHx8fHx8fHx8fH +urrHurq6urq6urq6urqurrqurq6uoaGhoZWVoZWVlZWVlYiIiIiIfIiIfHyIfHx8fG9vb2NKPj4xMTExMTExMTE+PjExMTE+Pj4+SldKSko+Pj4+Pj5KSj4+Pj4+Pj4+Pj4+Pj4+MTExMTExPj4xMTExMTExMTExJTExMTExAABpiIiIiIiIiIiIiIiIiIiI +lZWVlZWVlZWVlZWVoaGViJWhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6ursfm5ubZ2cfHx7q6urq6urrHx8fT09Pf7Oz4//////Lm09PH09PT09PT09PT09PHx8fHx8fHx8fHx8e0tLS0tLTAtLS0tLS0tLS0p6enp6enm5ubm5ubj4+P +j4+Pj4+Pj4+CgoKCdoKCdnZ2dnZpSjExMTExMT4xMTExMTExMTE+Pj4+Pj4+Sko+Sko+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMT4+Pj4+MTE+PjExMTExMTExMTExMQAAaXyIiIiIiIiIiIiIiIiIiIiVlZWVlZWVoaGhoaGhj3yPoaGhoaGhoaGhoaGhoaGh +rq6urq6urq6urq6urq6urq6urq6urrrZ2ebTx8e6uq6urq6urq6urq6uusfH09PT3+zs+Pj45tPT09PT09PT09PT09PT09PTx8fHx8fHx8e6urq6urq6urq6rq66uq6urq6urq6hoaGhoaGhlZWViIiVlYiIlYiIiIh8fHx8fHx8b29vY0o+Pis3Nzc3Nzc3 +Nzc3Kys3Nzc3Nzc3Nzc3Sj4+Pj4+PkpKPj4+MTExMTE+Pj4xPj4+Pj4xMTExMTExMTExMTExMTExMTExMTEAAGmCgoKCgo+Pj4+Pj4+Pj4+Pj4+bm5uPm5ubm5ubgoJvfI+hoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq7H2dnZx8e0p6en +p6enp6entLSnp6e0wMDNzdnZ2ezs2dnNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcDAwMDAtLTAwMC0tLS0tLS0tLS0tKenp6enp6eVlaGVlZWVlZWVlYiIiHx8fHx8fHx8fHx8aWlKMTExMTExMTExMTExMTExMTExMTExMTE+Pj5KSj4+Pj4+Pj4+Pj4+Pj4+ +Pj4+Pj4+PjExMTExMTExMTExMTExMTExMTElMTExAABpgoKCgoKCgo+Pj4+Pj4+Pj4+Pj4+Pm5ubm5uPj3xjV2+Pm5ubp6enp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS009PTx7q6rqGhoa6urq6urq6urq6urq66x8fH09PT09PTx9PT09PT08fT +09PT09PT09PTx8fHx8fHx7q6urq6urq6urq6rrqurq6urq6uoaGhoaGhoaGVlZWViJWVlZWViIiIiHx8fHx8fHxvb29jSjc3JTExMTExMTExMTExMTElMTExMTExMT4+Pj4+Pj4+Sj4+Pj4+MTExMT4+MTExMTExPjExMTExMTExMTExJTExMTExMTExMQAA +aYiIiIiIiIiIiIiIiIiVlZWVlZWVlZWhlZWIfG9XV2Njgpubm5ubm5unp6enp6enp6enp6enp7S0p6enp6entLS0tLS0wNPTx7q6rqGhoa6urq6urq6urq6urq6urq7AwM3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NwMDAwMDAwMDAwLS0tLS0p6en +p6enp6enp5ubm5ubm5uPj4+Pj4+Pj4+PgoKCgoKCgnZ2dnZ2aUoxMTExMTExMTExMTExMTExMTExMTExMTExMT4+Pj4+Pj4+PjE+Pj4+Pj4+Pj4+MTExMTExPjExMTExMTElMTExMTExMSUxJSUAAG+IiIiIiIiIiIiIiIiIiIiIlZWVlZWhlYh8b11KV1dK +Y4ibm5ubm5unp6enp6enp6enp6enp6enp6enp6enp6entLS0tMfHx7q6p6ebp6enp7S0tLS0tLS0tLSnp6enusfH09PT08fHx9PT09PT09PT09PT09PT09PHx8fHrq6Pb2+Cgpu0tLS0wLS0tKenp6enp6enp6enp5WhoY+Pm4+Pj4+Pj4+Pj4+PgoKCgnZ2 +dnZ2dlc+PjElMTExMTExMTExMTExMTExMTExMTExPj4+Pj4+Pj4+Pj4+Pj4+Pj4xMT4+MTExMTExMTExMSUxMTElMTElJTExJTExJSUlAABpiIiIiIiIiIiIiIiIiJWVlZWVlZWVlYKCaVdXV0pKXV12laGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6u +rq6urrrNzc20tKGhoaGurq6urq66urq6uq6urqGVp7TAwM3Nzc3Nzc3Nzc3Z2dnZ2dnZ2c3Nzc3Nzc20lWk3NzcrHzE+SnantLS0tLSnm5unp6enp6enp6enm5ubm4+Pj4+Pj4+Pj4+Pgo+PfHx8fHx8fGldPjExMTExMTExMTE+MTExMTExMTExMTExMT4+ +Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMT4+MTExMTExMSUxMTExMTElNzc3NzclMTElJQAAaYKCgoKCgoKPj4+Pj4+Pj4+Pm5ubj49vXV1dSkpXV0pXfI+hoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq66x8fHtKenlaGhrq6urq6urq6urq6urqGViJWn +usfHx8fHx8fHx8fT09PT09PT09PT09PT08ehfD4lPjESJT4fHzE+PnantLS0tKGurq6urq6hoaGhoaGhlZWVlYiVlYiIlZWIiIh8fIh8fHx8fHxpVzc3NysrKysrKzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N0RERERENzc3Nzc3Nzc3Nzc3NzcrKysrKzc3Nzc3 +Nzc3NyUxMSUlJSUlJSUAAGmIiIiIiIiIiIiIiJWVlZWVlZWVlXxjV1dKSldXRERdUGOIm5ubm6enp6enp6enp6enp6enp6enp6enp6enp6enp6enwM3NwLShoZWhrq6urq6urq6urq66uq6uj3aClafAwMDAwMDNzc3N2dnZ2dnZ2dnZ2dnZzc2uYys+Ph8x +V0o+SjcYGDExY6G0tLS0tLS0tKenp6enp6eVlaGVlZWVlZWVlYiIiIiIiIh8fHx8fHx8aVc+MTExMTExMTExMTExMTExMTExMTExMTE+Pj4+Pj4+Pj4xMT4+Pj4+MTExMTExMSUxMTElMTExMTExMTExJSUxMSUlMSUlJSUlAABpiIiIiIiIiIiIiIiIiIiI +lZWViHZjV0o+V1dKSldXSldpgpWhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6ursfHx7quoZWVoaGurq6urq6urq6uurquoZWCaXyhtMfHx8fHx8fT09PT09PT09PT09PT09OnXT4+MVeVp6e0tKGIdlcYJURXj7S0tLS0p6enp6enp6enp5ubm5uP +j4+Pj4+Pj4+Pj4KCgoJ2dnZ2dnZXNzc3KysrKysrNzc3Nzc3Nzc3Kzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3JSUlJSUlMSUlJSUlJTElMTExJSUxMSUlJSUlJQAAaYiIiIiIiIiIiJWVlZWVlZWVfGlpV0REV0pKV1dKV1dXV4KVoaGhoaGhoaGhoaGh +oaGhoaGhoa6urq6urq6urq6urq7Hx8e0tJubm6enp6e0tKe0tLS0tLS0tKePdnZ2gqfAwMDAwMDT09PT09PT09PT09PT09O6dlclPo+6urrHurq6uqeVdjcfMWmVrrqurq6urqGurqGhoaGhoaGVlZWVlZWVlZWViIiIiHx8fHx8fG9vVz4xMTExMTExMTEx +MTExMTExMTExMT4+MTExMTExPjExPjExMTExMTElJTExMTExJSUlJSUlMSUlJSUxJSUlJTElJSUlJSUlJSUAAGmIiIiIiIiIiIiIiIiIlaGVfGldRERXSj5XV0pKV1dKV2N2j6GhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6ux8fHtKebj4+np7S0 +tLS0tLS0tLS0tLShlYJjY4KhtLS0wMDAwM3Nzc3Nzc3Nzc3N2dnHm1AfXZu0x8fHtI+CdqG6uqGCUBgxaaGhrq6urq6urqGhoaGhoZWhoZWVlZWVlZWViIiIiIiIfHx8fHxvb1c+Pj4xMTExMTExJTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlAABpiIiIiIiIiIiIlZWVlZWIfGlXSldKPkpXSkpdUD5QXUpKb4ibp6enp6enp6enp6enp6enp6enp6enp7S0p7S0tLS0tMfHurqhlZWVp6e0tLS0tLS0tLS0tLS0p4h2dmlpj66urrrHx9PT09PT09PT +09PT09PTumM+V4i008e6x7pjMTGCp7q6oW9KKyuCrq6urq6urq6uoaGhoaGhlZWVlZWVlZWVlZWIiIiIfHx8fHx8fGlXPjExMTExMTExMTE+MT4+PjExMTExMTExMTElNzc3Nzc3Kys3Nzc3NysrKysrKysfMSUlJSUlJSUlJSUlJSUlMSUlJSUlJSUlJQAA +aYiIiIiIiIiIiIiIiIiIdl1EV0o+SldKPldXSkpdXUpdXV2Im5ubm6enp6enp6enp6enp6enp6enp6enp6enp7S0p7rHx8eum5uIm6enuq6urq6urq6urq6urqGPgmNjdoKhoa7AwMDNzc3Z2dnZ2dnZ2dnZzY9jN2m007SIb1dEREQlaaGurq6uaSs3So+u +rq6urq6urq6hoaGVlZWVlZWVlZWVlZWIiIiIiIh8fHx8fHxpVzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyUxMTElJTElJTExMTExMTExMSUlJSUlJSUlJSUlJSUlJSUlJSUlJRglJSUlJSUYGCUAAGmIiIiIiIiIiIiVlYiIaVdXV0REV0o+V1dKSldXRFdX +SkpjgpWhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq66x8e6rpubiKGhtLS0tLS0tLS0tLS0p7SniHxvb2N2j5uuurrH09PT09PT09PT09PT09OCN12nwM2nVyU3Nx8fPj4+b5uurqFjJT6Coa6urq6urqGhoaGhoaGVlaGVlZWVlZWVlYiIiIh8fHx8 +fHxvY1A+MTExMTExPjExPj4+Pj4+MT4+PjExMTExMSUxMSUxMSUlMTExMTExJSUxJSUxJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUYAABpiIiIiIiIiIiIiIh8XVBQPj5QUDdQUFBEV1dKV1dKSl1dUHaPoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6u +rq6uusfHuqeVlYihrq6urq6urq6urq6urq6uoY+CY298aYKhrrrHx9PT09PT09PT09PT09OnY0p2p8fTgkpKMR8+PhglNx8xiK6hglclSpuurq6urqGhoaGhoaGhoaGVlaGVlZWVlYiIiIiIiHZ2goJvb29KMTExMTExMTExMTExPj4+Pj4+MTExMTExJTEx +MSUxJSUlMTExMTElMTExMSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJRglJQAAaYiIiIiIiIiViIhpSkpKPkpKSj5XV0REV1dKV1dKSl1dSl18j6GhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urrrHx7ShlYiIoaGurq6urq6urq6urq6urqGIb29v +Y2+Cj7TAwM3Nzc3Nzc3N2dnZ2dnHj1BQocfTtHZKJUppUDExMR8fN3yhrqFKJVePp6e0p6enp6enp5ubm5uPj6GVlaGVlZWVlYiIiHx8fHx8fHxjREQxJTExMTExMTExMTExMTExMTExMTExMTExMSUxMSUlJSUxMTExMSUlJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJRglJRgYJRgAAGmCgoKCj4+Pj29QUFBQRFdXPkpKPj5QUD5QY0pKXV1KSl1daY+hoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq66x7q6oZWIiKGurq6urq6urq6urq6urq6ViHxpaXZ2aYi0tMfT09PT09PT09PT09PT028xfLTH08BjK2mh +rrq6oXxjPh92rq6bdj4ldqenp6enp6enp6enp5ubm5ubm5uPj4+Pj4+Pj4KCgnZ2gm9vYz4xMTExMTExJTExMTExMTExMTExMTElMTExJTExJSUxMTExMTExMSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJRgYAABpiIiIiIiIiGNQUD4+Sko+ +SkpKPkpXRERdXUpXV0pKV1dKXW+ClaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6uwMDArqGViIihrq6urq6urq6urq6urq6uoYhvb29jb3x8p7rHx9PT09PT09PT09PT07pvRHa009OhY0Rpp8DAwMDAfDc3dqG0wHw+PmmVp6enp6enp6enm5ubm4+b +m5uPm5uIiIiIiIiIfHx8fHx8fGNENysrKysrKysrKysrKzc3Nzc3Nzc3NzcrNyUlMTExJSUxMTExJSUlJSUlJSUlJSUlJSUlJSUlJRgYGBgYJRgYGBgYGBgYGBgYGAAAb4iIiIiIfF1KSj5QUD4+Sko3SkpKSldKSkpXSkpXV0pXV0pdiJWhoaGhoaGhoaGh +oaGhoaGhoaGhrq6urq6urq6urrq6uq6hlYiIp6e0tLS0tLS0tLS0tLS0p5WIfGNjdnZpgrS0x9PT09PT09PT09PT09PHVz6VwM3NrkoxiLTHx8fHx5VQH2mnp7ShVx9XoaGurq6hoaGhoaGhlZWhlZWhlZWVlZWIiIiIiIh8fHx8b29jPjExMTExMTElMTEl +MTExMTExMTExMSUxMTElMTEfHzElJSUxJTExJSUlJSUlJSUYGCUlJRgYGCUlJSUlJSUlJSUlGBgYGBgYGBgAAGmCgo+CaV1KN0pKPj5KSj5KV0REV0o+Sl1KSl1dSldjV0pdXXaPoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq66x8e0oY+CgqGurq6u +rq6urq6urq6urq6hiG9vb2N2doKnusfT09PT09PT09PT09PTtGlQj8fTx49dRIK0x8fHx8eISj52p7q6m1c+Soinp6enp6enp6enp6enlZWhlZWVlYiIlYiIiIh8fHx8fHxvXT4xMSU3NysrKysrKysrKzcrKysrKzc3NysrKysrKysrKysrKysrKysrHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fAABpj498aVc+PkpKPkpKPkpKSj5QUEREV0pKV1dKSl1dSldjV1d8j6GhoaGhoaGhoa6urq6urq6urq6urq6urq6urq6uwMDAwKGPgoKnp6e0tLS0tLSntLS0tLSnlYiIaWl2dmmItMDA09PT09PT09PT +09PT08BKSqHH08eVPj6busfHx7q6oUoldq6urq5vJUSPoaGurqGhoaGhoaGVlaGPj4+Pj4+Pj4+Pj4KCgoJ2goJvb2M+MTExMTExJSUxMSUlMTElJTExMTExMTExMTElJSUlMSUlJSUlJSUlJSUlJSUlJSUlJRgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAAA +Sl1pXUREREQ3Sko+PkpKPkpXSkpXSj5KV0pKV1dKV2NKSl1dXYihoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6ursDAwLShj4KCoa6urq6urq6urq6urq6urqGCdnZ2Y3x8iK7Hx8fT09PT09PT09PT09OuY0qVx9m6aVdXlcDAwMDAwIhKSm+hurqhb0o+ +gqenp6enp6enp5ubm5ubm5uPj4+Pj4+Pj4+PgoKCgoKCgm9dNzcrKysrKysrKysrKysrPjExMTExMTExMTExMTElMTExMSUlJSUlJSUlJSUlJSUlGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgAAFdXREREREREREREREQ3SldKPldXRERXSkpXV0pXY1dK +XV1KV2mClaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq7AwMC0oY+CgqGhrq6urq6urq6urq6urq6ViHxjb3xvb4+6x8fH09PT09PT09PT09PTx1dKocehfFclY67Hx8fHx8ehSiVvp7S0tHYlRIihoa6uoaGhoaGhoZWVoZWVlZWIiJWViIiIiIiIfHyI +dnZ2Yz4xMTElMTExMTExJTExMTExMTExMTExMTExMTExMTElJSUxJSUlJSUlJSUlJSUlJSUlGBglJSUlJRgYGBgYGBgYGBgYGBgYGBgYAABXSkpKPkpXSj5KVz4+Sko+Sko+SldKPlBQUFBQUFBQY0pKXV1ddo+PoaGhoaGhoaGhoaGhoaGhrq6urq6urq6u +rq6ursfHuqGVgoKnp7Snp6e0p7S0tLS0tLSnp3xvb29jdnaItMfH09PT09PT09PT09PT37pvSojAiD4lSoiux8fHx8fHj1A+Y6G6uqd2Sj6Cp6enp6enp6enp5ubm5ubm4+Pj4+Pj4+CgoKCgoKCdnZ2dlc+MSUxMTElJTElJTcrKys3Nzc3Nzc3Nzc3Nzcr +NzcrKysrKysrKysrHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwAAN0pKSkpKN0pKSj5KSjdKV0o+V1dKSldKSldXRFdXV0pXY0pXY2+Cm5ubm5unp6enp6enp6enp6enp6enp6enp6enp8DAwMCnlXyIp6enp6entLS0tLS0tLS0oY+PdmNv +fG9vj7THx9PT09PT09PT09PT09PHYz6PrmlQUGOhwMDAwMDAwK5jJVeIp7q6byVEj6entKenp6enp6enlZWVlZWVlYiIiIiIiIiIiIh8fHx8b29dNysrKysrKysrKysrKysrKys3Nzc3Nzc3Nzc3NzclMTExJSUxJSUlJSUlJSUlJSUlJSUlJSUlGCUYGBgY +GBgYGBgYGBgYGBgYGBgAADc3UFA3SldXSkpKPkpKSj5QUD5KV0o+V1dKSldXSl1dSldjV1dpgo+bm5ubp6enp6enp6enp6enp6enp6enp6enp6e0x8e6rpWCgqGurq6urq6urq6urq6urq6bgm9vb29vb4+0x8fT09PT09PT09PT09PTx49Kb7R8NzdXV2OI +p6e0x7qniF0xPoiuoW9KSoinp6enp6enp6ebm5ubm5ubj4+Pj4+Pj4+Pj4KCgoJ2dnZpVzc3JTExMSUxMSUxMTElMTElMTExMTExMTExMTExMSUlJSUlJSUlJSUlJSUlJSUlJSUlJRgYJSUYGBgYGCUYGBgYGBgYGBgYGBgYAAA+UFA3UGlpdmNQRERXRERX +SkpKV0pKV1dKSl1KSldXSldjV1djY2+Im5ubp6enp6enp6enp6enp6enp6enp6enp6enwMDAwKePfIihrq6urq6urq6urq6urq6hj3x8Y2N8fGmhwMDNzc3Z2dnZ2dnZ2dnZ2c18PnyhSjdKJRg+PiU+XV1dgnY+MUqCoZVXJWmhrq6urqGhoaGhoaGhlZWV +lZWViIiIiIiIiIiIiIh2goJ2aUoxJSUxMSUxMSUlMSUlMTElMTExMTExMTExJSUxMSUxMSUlMTElJSUlJSUlJSUlJSUlJSUYJSUYGCUYGBgYGBgYGBgYGBgYGBgYGAAAREREV2l2dnZXSldKPkpKPkpXSj5QUEREXVBQUGNQUGNjSl1dUF1vgo+hoaGhoaGh +oaGhoaGhoaGurq6urq6urqGhobrHx7Snm4KCoaGurq6urq6urq6urq6uoaF8aXZ2aWl8obTH09PT09PT09Pf39/f39/NlVdXiHxQMT4+Hx8+PhgxMR8fPisriK52Nzd8oa6urq6urqGhoaGVoaGVlZWVlZWViIiIiIiIiHx8fHx8fGlKMTExMTExJTExJTEx +MTExMTExMTExMTExJTExJTElMSUxMSUlMSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlGBgYGBglJSUlJRgYGBgAAD5XSld8fHx8aUo+Sko+SkpKPkpKSkpXV0RXV0pKXV1QUGNXV2NjV3aPj6GhoaGhoaGhoaGhoaGhoa6urq6urq6urq66x8fHtJuIiKGurq6u +rq6urq6urq6urqGPgoJpaXx8b6e6x9PT09PT09PT09Pf39/f36dKV4iuuq6PfHxXHx8+JRg+MRglSoiIaT4xgq6urq6urq6urqGhoZWVoZWVlZWIiIiIiIiIiIiIiHx8fG9jSjElJTExMTExJTExJSUlJSUxMTElMTElMTElJTElJSUxJSUlJSUlJSUlJSUl +JSUlJSUlGBglJSUlJSUlJRgYGCUYGCUlGBgYGBgYAAA+PkpKaWl2dmNKSko+Sko+SldKPldXRFBQUFBQY0pKY1dXY2NKXWlpdo+hoaGhoaGhoaGhrq6urq6urq6urq6urq6uusfHurqhiHybp6enp7S0tLS0tLS0tKenlXxpdnZpdoKnusfT09PT09Pf39/f +39/T09PHdjdptMfHx9O0fF0xMWNjNzc3JTePjzclY5Wnp7Snp6enp6enp6enm5uPj4+Pj4+Pj4+CgoKCgoKCgnZ2aUo3NzcrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwAA +PlBQPml2dnZ2Vz5QUD5KV0o+UFBERF1dSldXSkpjV0pXY1BQY2NQY3aIlaGhoaGhoaGhoaGhrq6urq6urq6urq6urq7Hx8e0oY98la6urq6urq6urq6urq6uoYiIdmNjfHx8rsDA09PT09PT09PT39/T09PT049dSojHx8fT05U+Pm+hrrqnj4+hj11KN2Ob +tLS0tLSnp6enm5ubm5ubm4+bj4+Pj4+Cj4+CgoKCgoKCgmNEMSUxMSUxMSUlJTElJTElJSUxMTExMSUxMTElJTElJSUlJTElJSUlJSUlJSUlJSUlJSUlJSUlJSUlGBglJSUYGBgYGBgYGBgYGBgAAERERFBddnZ2dl1dRERERERQUFA+UFA+SldKSldXSkpj +V0pjY0pdaV1dfI+bm6enp6enp6enp6enp6enp6enp6enp6e0wMDAwK6bgoKhoa6urq6urq6urq6urqGPdml2dml2gqe609PT09PT39/f39/f39/f09O0Vz52p8fT08CniF18tMe6use6rpVXJUqbp6e0tKenp6enp6enm5ubm5ubj4+Pj4+Pj4KCj498iIh8 +fHxpSjExMTExMTExMTExMTElMTElJSUxJTExMTExJSUlJSUlMTElJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJRgYGBgYAAA+Sko+Y29XV3ZdRERXRERQUD5XV0pKV1dEV1dKSmNXSmNjV1djY1BjY2N8m5unp6enp6enp6enp6enp6enp6en +p6enp8DAwMC0oYiIp6entKentLS0tLS0tLSbiIh2Y2N8b2+uwMDT09PT09PT09Pf39/f09PTx6FKMXy0x8fTx8fHx8fHx8fHx6FXJT5vm7S0tKe0tKenp6enp6ebm5ubj5uPj4+Pj4KCgoKCgoKCgoJ2dkoxJTExJSUlJSUlJSUlJSUlMTElJTElJTExJSUl +JSUlJSUlJSUlJSUlJTElJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlGBglGBgYGAAAREREV0pdNzdjY1dKSldKSkpXSkpdUD5QXUpKV1dEV2NXSmNjUGNjY1dvfIibp6enp6enp6enp6enp6enp6enp6enp6e6x8fHuqeViKGhoa6urq6urq6urq6hoY98b29v +b3yIrsDNzc3N2dnZ2dnZ2dnZ2dnZ2dmub1A+grrHx8fTx8fHx8fHx6djSjFKj7S0tLS0p6enp6enp6enp5ubm5uPj4+Pj4+Pj4+PgoKCgoKCgm9KNzclMTExMTExJSUxMSUlJTElMTElJSUlJSUlJSUxJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJSUlJRgYGBgAAD5XSkpXaTc3aWlKV1c+SldERERXSkpXSj5XV0RXY1dKY2NKV2NjV2NjV2mPoaGhoaGhoaGhoaGhoaGurq6urq6urq6uusfHx8e6oYiVoaGurq6urq6urq6urpuIfHxpdoJ2gq66x9PT09PT09PT09Pf39/f09PT06dKSkppp8fH +x8fHx8fHuo9vShhKiKe0tLS0tLS0oa6uoaGhoZWhoY+Pm4+Pj4+Pj4+PgoKCgoKCgnZ2Sj4xMTExMTExMTElJSUlJSUlJSUlMSUlJTExJTElJSUxJSUlJSUlJSUlJSUlJRglJSUlJSUlJSUlJSUlJSUlJSUYGBgYGBglGBgYAABERFBQPmlXH0ppV0pKSko+ +V1dKSldXRFdXSkpjV0pdXVBQaWlQY2NXV2Njb4+hoaGhoaGhrq6urq6urq6urq6urq6uoa7Hx9PHuq6VlaGhrq6urq6urq66rqGhj3Z2dnZ2go+nwNPT09PT09PT09PT09/f09PT09PHlUoxSmmPus3Nzc3Np49jMR9KdqG0tLS0tLS0p7Snp6enp6enm5ub +m5ubm4+Pj4+Cgo+CgoKCgoKCb1dERDc3Nzc3Nzc3Nzc3KysrKysrKysrKysrKysrKysrKysrHx8fHx8fKysrKysrKx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwAAPlBQUFBjYytKaVdXSj5KV0pKV1c+UFBQUFBQRFBQUFBjY1dXaV1daWlQY3yIlaen +p6enp6enp6enp6e0tKenp6enp6enwMDT08e6p5Whrq6urq6urq6urq6um4+Cb29vgm+ItMfH2dnZx9PT09PT39/f39/T09PT07qhXSUxSldpj492aWkxHzFKaaG6uq6urq6urq6urq6hoaGhoaGhj4+Pj4+Pj4+Pj4+CgoKCgoKCdnZjV1dKSkpKSj4+Pj4+ +PjExMTExMTExMTExMTExMTExJTElJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlGBglJSUlJSUlJSUYGBgAAEo+SldKY2MxV2lpSj5KV0pKV0o+V1dKSldXSldjV1djY0pjY1dXY2NKY2Njgpubm6enp6enp6enp6enp6enp6enp6enp7rH09PHx7ShoaGh +rq6urq6urq6uoaGVfGl2gnaCobrH09PTx5uux9PT39/f39/f09PT09PTunZdSiUlPjEYMT4fHz5XiK66urq6uq6urq6urq6uoaGhoaGhlaGhlZWVlYiIiIiIiIiIfHx8fHx8fG9vb2NjY2NXV1dKSkpKSkpKPj4+Pj4+PjE+PjExMTExMTExMTElJSUlJSUl +JSUlJSUlJSUlJSUYGCUlJSUlJSUlJSUlJSUYGCUlAABEV1dKSl1pRGN2XVBQUERXSj5KV0pKV1c+UGNKSl1dSldjV1djY1djb11daYKPoaGhoaGhoaGhrq6urq6urq6urq6urq6ux8fT09PHtKGhoa6urq6urq6urq6hiIh8b2+IiJW6x9PT3643N2Obx9nZ +2dnZ2dnZ2dnZ2dnHoWNjShglPiUYPldvobq6urq6urq6uq6urq6urqGhoaGhoaGhj5ubiIiIiIiIiIiIiIh8fHx8fHx8iHx8fHxvb29jY2NjY2NjY2NXV1dXSkpKSkpKSj4+PjExMTExMTExJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJRglJSUlJSUYGAAA +REREV0pKdldXb29QRFdXPkpXSkpKV0RQXV1KV1dKV2NXV2NjV1dvY0pjY1d2j6Ghoa6uoaGurq6urq6urq6urq6urq6ursDA09PT08e6p6enp6entLSntLShoZWIiIiIiIinusfZ2dmnMQwAEmO62dnZ2dnZ2dnZ2dnZzc3NoXxvUD5ddoinwMC0wMDAwMC0 +tLS0tKe0tKGhoaGhoaGVlaGPj4+Pj4+PgoKCgoKCgoKCgoKVlZWVlYKCj4+CgoJ2goJvb3x8b29vb2NjY2NXV1dXV0pKSko+Pj4+Pj4xMTExMTExMSUlJSUlJRglJSUlJSUlGBgYGBglJSUlJSUAAEpXSkpXSmlpaXZjV1dKSldKPldXRERXV0pKY0pKY2NQ +XWlXV2lpV2NjV1dpdoihoaGhoaGhoaGhoa6urq6urq6urq6urq7Azc3Z2dnZ2bqurq6urq6urq6urq6hoZWIiJWVobrN2dnmmyUlDAAAfMfZ2dnZ2dnZ2dnZ2dnZzc3NwMDAtLTHx7rHx8e6urq6urq6rq6urq6urq6hoaGhoZWVlZWIiIiIiIiIiIiIiHx8 +iIiIiJWVlZWVlYiVlYiIlYiIiIiIiIh8fHx8b29vb29vY2NjY2NXV1dKSkpKSj4+Pj4+MTExMTExMTExJSUlJSUlJSUYGCUlJSUlGBglAABKPlBQUERpfHx8fFdKV0pKSldKSldXPlBdSkpdXUpXY1dKY2NXY29dXV1dSmmIm5unp6enp6enp6enp6enp6en +p6enp6enusfT09/f39/TwLS0p6enp7S0tLS0tKGhoaGVobS0x9nZ2Y8xdnZEAEq609Pf39/f38e609PH2dnZ2dnHx8fHx8fHx8fHx7q6urqurrqurq6urqGhoaGhoaGhoY+Pj4+Pj4+CgoKCgoKCgoKCgo+Pj5uPj4+Pj4+Pj4+Pj4+Pj4+Cgo+Pgo+CgoKC +gnaCdnZ2dmNjY2NjY1dXV1dXSkpKSko3Nzc3Nzc3NzcrKysrKysrKx8fHx8fHwAASldKSldKV3Z2dnZdXUREV0o+V1dKSl1QUFBdSkpjV0pdXV1daWlQY29XV2NjfJubp6e0tLS0tLS0p6enp7S0p6enp6enp7TAwNPf3+zs39/Nuq6urq6urq66rq6urqGh +rq6ux9Pf39+PN5vHoR8xp9Pf39/f39NvN4ihlbrT09PT09PHx8fHx8fHx8e6urq6urqurq6urq6hoaGhoaGhlZWhlZWVlYiIiIiIiIiIfIiIiIiIiIiIiIiIiIiIiIiViIiIlYiIlZWIiIiIiIiIiIiIfHx8fHx8fG9vb29vY2NjY2NjV1dXV1dXSkpKSkpK +Pj4+PjExMTElMTElJSUAAEpKV1dKSld2dnaIY0pXSj5QUFBQUFBEV1dKSldXSldjV1djY1djY2NXaWlKY3yIm666usfHx7q6urq6urq6urqurq6urq6ursDA2ebm5vLy5tnHtLS0tLS0tLS0p6e0tKG0tMDT39/fiDGIx64lMafT09PT09/NVwZKMQBdtM3N +zc3Nzc3AwMDAwMDAtLS0tLS0tLS0tKenp6enp6enlaGVlZWVlYiIiIiIiIiIiIiIfHx8iHx8iIh2iIh8fIiIfIiIiIiIiHyIiIiIiIh8iIiIfIiIfIiIfHx8fHx8fHxvb29vb29jY2NjY2NjY2NjV1dXV0pKSkpKPj4+PjExAAA+UFBEXV0+b3x8fG9dSkpX +Sj5XV0pKV1dKV1dKV2NXV1djV1dpaVdpaVBQXV1diKG0x9PT09PT09PTx8fHx8fHurq6uq6urq66usfZ5vLy8vLy5tPHx7SntLS0tLS0p6e0tLTH2dnZ2YgxSnZ2GEq0x6GVp8fZzVcMSiUAV67Hx8fHx8fHx8e6x8e6use6urq6rq6urq6urqGhoaGVoaGV +laGPj4+Pj4+Pj4KCgoKCgoKCgoKCgoKCgoJ2iIh2goKCdoiIfHyIiHx8iHaCgoKCgoKCgoKCgoKCdoKCgnaCgnZ2dnZ2dnZ2dnZ2dnZ2Y2NjY2NXY2NjV1dXSkpKSgAARERQUD5KSmN8fGlXSldKPldXRERXSj5XV0pKY1dXV2lXV2NjV2NjV1djY0pXaYKh +wNPT39/f7Ozf39/f39/f09PTx8fHx8fHx8fH09Pm8vLy8vLy8ubZzc3Nzc26usfHx9PTx9/f39+CHwAAAABptGkfBhhdtMBKElclAGO0x9PTx8fHx8fHx8fHx8e6urq6urq6rq6urq6urqGhoaGVoaGPj4+Pj4+Pj4+Pj4KCgoKCgoKCgoKCgnaIiHx8iHx8 +fIh2doh8fHx8fHx8fGl8fHx8fHx8fHx8fHx8b3x8fHx8fG98fHx8fHx8fHx8fHxvb29vb29vY2NjY2NjV1cAAERXSkpXV0RpgmlKV1dEV1dKSldXRFdjSkpXV0pXY1dXY2NQUGNjV2NjSkpXSleIp8DZ2ebm5ubm5ubm8vLm5ubm5tnZ2dnZ2dnHx8fT09/s ++P/4///////4+Pj4+Pj////47Ozf39/faSUlEgAYj6ExBgYGBm+uRBJKJQBjrsfHx8fHx8fTx8fHx7q6urq6urqurq6urq6urqGhoaGhoZWVlZWVlZWIiIiIfIiIiIiIiIh8fIh8fIiIfHyIiHaCgoJ2goKCgoJ2dnZ2dnZ2dnZ2gm98fHxvb3xvb3xvb298 +b298fHx8fG9vb29vfHxvb29vb29vb29vb2NjY2NjAABERERXRERdXV1dUEREV1dKV1dKSldXSldXSldXV0pdXV1dXV1dXWlXV1dKPl18lbTNzdnm5ubm5ubm5ubm5ubm5vLy8ubm5ubm5s3NwNPT3+zs//////////////////////Lm5tnZ2WM+j49EEm9v +DDFvVwwxiDESVyUGdrS0j4+Pp8DNzc3Nurq6urq6x7q6urqurq6urq6uoaGhoaGhoZWVlYiIiIiIiIiIiIiIiIh8iIh8fI+CdoiIfHyIfHx8fHx8iHx8fHx8fHx8b298b298fG9vfGlpdnZpdnZpaXZ2Y3Z2dml2dmNvb29vb29jb29vY3Z2aWlpaWlpaQAA +RFdXSkpXSkpKSj5KV0pKV1dEV1dKSldXSldjV0pjY1djY1dXY2NXV1dKPl12iK7H09/f39/f39/f39/f39/f7Ozs7Pjs7Ozs7Ozf08DAzc3f7Pj4///////////////////y8ubZ2ccxY7rTfB9KKx92rpUlN2kYJUoSEo+CPgwABjGIusfHtLSnp6e6urq6 +urqurq6urq6hoaGhoaGhlZWVlZWVlZWIiIiIiIiIiIiIiIh8fIh8fIiIfHyIdnaIiHZ2iHx8iIh2doJ2dnZ2dnZ2dnZ2dmlpdnZpdnZpaXZpaWlpaWlpaWlpaWlpaWldaWlpaWlpXWlpaWlpaWkAAEpKSldKSldXSkpXSj5XV0REV1dKV1dKSl1dRFdjSldj +Y1djY1dXY1c+PldpiK7A09Pf39/f39/f39/f39/f39/y8vLy5ubm5ubm5ubTx8fH09Pf7Oz4////////////////8ubm2dnHPmO02ZUlMRgMJVBjJSVEEiVKEh9vPgwADAAAJYi6p2kxGBhKdq7Ap4+hrpWVrq6bm5ubm5ubm5ubj4+bj4+Pj4+Cgo+CgoKC +goKCj4KCj4+CgoKCgoKCgoKCgnaCgm98iHx8fHxvb3x8b3x8b298fGl2dmlpfHxpaWlpaWlpaWlpaWlpaVdpaV1daWldXV1dXV1pV2NjAABKV0o+UFBQUFBQPlBQUFBQUERXV0pKXV1KV1dXSmNjUF1dXV1dXURERERjiKe609PT39/f7Ozf3+zs7Ozs7Ozs +7Ozs39PT09PT3+zs7NnHx8fH09PT3+zs7Pj4///4+Pj45ubm5tnZx0pKlbp8JTESAAAAAAASJQwlShIlShgAN2ldGABdm1cSAAAAABJpoWMfN0olSoiIYz4+XY+PoaGVlZWVlZWVlYiIiIiIiIh8fIiIiIiVlYiIiIiIiIiIiIiIfHyIdnaIfG+CgnZ2goJv +fHx8fHx8fHx8b29vb29vb29vb29vb29vY2NjY2NjY1djY1dXY2NXV2NXV1dXVwAASkpKV0pKV1dERFdKPldXSkpdSkpXV0pXV1dKXV1KV2lpV2NjSkpXPj5jiJu0x9PT5ubm5ubm5ubm5ubm5vLy8vLy2cfHx7q6usfT09PT08fHx8fH2dnZ2dnZ2dnZ2dnZ +2dnZ2dnZ2cBKEhIxGAZKHx9jYzcfHzEAH0oSJSUGEny0tFASPlAYAAwlJQwAH4hKDAwMADFdMQAAAAA3iJubm5uPj4+Pj4+Pj4KCgoKCgoKCgpWhlZWhlYiVlZWIiIiIiIiIiIiIfHyIfHx8fG98fHx8fHxvb3xvb29vb298fG9vb29vb29jb29vY2NjY2Nj +Y2NjY1djY1dXY1dXV1cAAD5XV0pXV0pXY0pKXV1KSl1QUFBQUFBjV0pXV0pKY1dXY2NQUFBQN0ppfKG6x9PT39/f39/s7Ozs7Ozs7Ozs7Pjs39PHurq6urq6usfHx9PHx7rHx8fHx9PT09PT09PT09PT09/f09O6aTEGBgASdj4Ygrq6p49jEjdKEh8fACWP +usehdmM+BgZjoaFpGAZXNxIAABIlJQAAEhIADF2VoZWVlZWIiJWIiIiIiIiIiIiIiJWhoaGhoaGhoZWhoZWVlZWVlZWIiIiIfIiIiHx8fHx8fHx8fHxvfHxvb29vb29vb29vb2Nvb29jY2NjY2NjY2NjY2NjY2NjY1dXY2NXAABKSldXSkpXV0RQUFBQUFBQ +UFBQRF1dPldjV0pdXUpXY1dXY1c+PldXfKG0x9PT09/f3+zs7Ozs7Ozs7Ozs+Pjs7N/T09PTx9PTx8fHx8fHx8fHx8fHx8fHx9PT09PT09PT09Pf39PT08CIUB8MV6F2JVehlXyVdhg+ShIlJQAxlcDNzc20SgYlj7S0jyUANx8GBkp8aR8AMW9vJQY+iIib +m4+Pj4+Pj4+Pj4+CgoKCgo+Pp6enp6enp6enm5ubm5ubm5uPoZWIiIiIiIiIiIiIiHyIiHZ2gnZ2dnZpdnZ2aXZpaWlpaWlpaWlpaWlpaWldXWlpV2NjV1djV1dXVwAAPldKSldXSldXV0pXV0pKXV1KXV1KSl1dSldXSldXV0pXV0pKV0pdgqG0x8fZ2ebm +5ubm5ubm5uby8vLy8vLy8vLm5tnZ2ebm2ebZ2dnZ2dnZ2cfHx8fHx8fHx9PT09PT09PT09PT09PT08eursDTrlAMDAwASkoSPj4SMTEGMZvAzcDAp0oMPqHAwKExDCUlACuCp3YYGEp2dj4MMYihoZWhlZWVlZWIiIiIiIiIiIiIlaGhrq6hoaGhoaGhoaGh +oaGhoZWhoZWVlZWVlZWViIiIiIiIiHx8fHx8fHxvb29vb29vY2NvY2NjY2NjY2NjY2NjY2NjV2NjV2NjV1cAAEREV1dKV2NXSldXSkpdXUpXV0pKXV1KV2NKSl1dSldjSkpXSj5jiKGux8fT09Pf7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs +7N/f39/T09PHx8fHx9PT09PT09PT09PT09PT09PT39+PMQYAJYhdDD4+DDdXGBiCwLSCdnY+DD6htMehMQYxGAA+j6FjGAAADAAAACt8j6Ghj4+bj4+Pj4KCj4+CgoKCj5ubp6enp6ebp6enp6enp6enm5ubm5ubm5ubm5uPj4+Pj4+Pgo+PfHyIiHaCgnZ2 +dnZ2aXZpaWlpaWlpaV1paVdjY2NXY2NXV1dXV1dXAAA+V0pKXV1KV1dKSkpXSkpjSkpXV0RXV0pKXV1KV2NXSldXPkppgqG0x8fT09Pf39/f39/f3+zs7Ozs7Ozs7Ozf39/s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7N/s7NnNzc3Nzc3Nzc3NzdnZ2dnZ2dnZ2dnZ +2aFvY4+6dh9KShI+djESUIh2JQBKNwwlj7S0gjEAMRgAPo+nYwwAAAAAAAAxfJWVlZWViIiViIiIiIiIiIiIiJWhoaGhoaGhoaGhoaGhoaGhoaGhlaGhlZWhoZWVoZWVlZWVlZWViIiIiIiIiHyIiHZ2gnZ2dnZpaXZpaWlpaWlpaVdjY1dXY1dXV1dXVwAA +RERXV0pXY1dKV1dKSl1QRFdXRERdUFBQXUpKY1dKV1c+PldpfKG6x8fT09Pf39/f39/s7Ozs7Ozs7Ozs7Ozs39/f39/f7Ozs7Ozf39/f7Ozs7Ozs7Ozs7Ozs7N/Tx7rHusfT09PT09Pf39/f39/f39/f39PT06dvb1cfSpVjGAAMAAAYb2MYGGOhoVcSEkof +AESVoWkYGF18fGlpgpubm5uPm5uPj4+Pj4+Pj3yIiIiVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhlaGhoZWhoZWVlZWVlZWIiJWViIiIiIiIiHZ2iHx8fHx8fHxvY29vY2NjY2NjY1dXY1dXV1cAAERXSkpdXUpdXUpKV1dKXV1KSl1dSldjUFBdXURXV0RE +RFdXgqG0x8fT09PT39/f3+zs7Ozs7Ozs7Ozs7Ozf39/f39/f3+zs7Ozs2dnZ2dnZ5ubm5ubm5vLy8vLy5tnHurq609PT09PT39/f39/f39/f39/f39/f09PAoaG6p10YAAAGUJWVPgYSPjESADFjJQBKlad2GBhdiIhpXYKVoZWVlZWVlZWIiIiIiIiIiIiI +oaGhoa6uoa6uoaGhoaGhoaGhoaGVlaGVlaGhlaGhlZWVlZWVlZWVlZWIlZWVlZWViIiIiIiIiIiIiHZ2dnZ2dnZpaWlpaWlpXV1dXV1dAABKSkpdXUpdXUpKV0pKV1dKSldKSldXSkpXV0RXVz4+Sldpj6e6x8fT09PT39/f39/f3+zs7Ozs7Ozs7Ozf39/f +39/f39/s7Ozf39/f39PT09/f39/T3+zs7Ozs39/s38fHx9nZ2dnZ2dnm5ubm5ubm5tnm5tnZ2dnZ2dnZ2c2udldXiLTHrmklAAAAACV2aRIAaaGhfCUMK0orACV8m5ubm4+Pj4+Pj4+Pj4+PgoKPj6e6urq6rq6urq6urq6urq6urq6hoaGVlaGhlaGhj4+b +m4+hlZWVlZWVlZWVlZWViIiIiIiViIiIiIiIiIh8fHx8fHx8aWlpaWlpaV1dXQAARFdXSldXSkpXVz5KV0pKV1dEV1dKSldXRFBQRERERERvlae6x8fT09PT09Pf39/f39/f3+zs7Ozs7Ozs7N/f39/f39/f3+zZx9PT09PT09PT5ubZ2dnZ5ubZ2dnZ2dnm +5tnm09PT09/f39/f39/f39/f39/f39/f39PT39PT08fHx8fHx8e0fD4fEjd2oW8fH2+hoaFQEgAAAAxXiJWhlZWVlZWVlZWCj4+PfIiIiJWux8fHx8fHx8fHurq6urq6urqurq6urq6hoaGhlZWVlZWVlZWVlZWIiIiIlZWIiIiIiIiIiIiIiIiIiIiIiHx8 +fHx8fHx8fG9vb29vY2MAAEpKV1dKSl1dSkpdSkpdXT5QXUpKV1c+SldKPlBQN1d8j6e6x8fH09PT09PT39/f39/f39/f3+zs7Ozs7Ozs7Ozs7Ozs7N/f08fHx9PHx8fHx9PT09PT39/f39/f39/f3+zs39/f39/f39/f39/f39/f39/f39/f39/f39/f09PT +09PHx8fHx8e6p6e0tLSnj3yhtLSnm1cfDAxXiJubm5ubj4+Pj4+Pj4+CgoKCgo+brtPT09PT08fH08fHx8fHx8fHx8fHurq6uq6urqGhlaGVlZWVlZWVlYiIlZWVlYiIiIiIiIiIiIiIiIiIiIh8fHx8fHx8fHx8b3x8b29vAAA+V0pKV1dKSmNXSldXSkpd +XURXV0REV0o+SkoxPmOCm7THx8fHx9PT09PT39/f39/f39/f3+zs7Ozs3+zs7Ozs7Ozs7OzZ2cfHx8fHx8e6usfHx8fT09PT09PT09PT09PT39/f09Pf39/f39/f39/f39/f39/f39/f39/f09PT08fT08fHx8fHx8fHurq6urq6uq6urqGhlYiIoaGVlaGh +lZWViIiViIiIiIiIiIiIm7rT09PT09PT09PT08fT08fH09PHx8fHx8e6urqurq6hoaGVlZWVlZWVlYiIiIiIiIiIiIiIiIiIiIiIiIiIfHx8fHx8fHx8fHx8fHxvbwAASkpKXUpKV1c+UF1KSldXSldXSkpXSjdKSjc3Sm+Cobq6x8fHx9PT09PT09Pf39/f +39/f39/f39/f39/f3+zs7Ozs7Ozf08fHx8fHx8fHusfHx8fHx8fHx8fHx8fH08fHx9nZ2dnZ2dnZ2dnm5ubm5ubm5ubm5ubZ2ebZ2dnZ2c3Nzc3Nzc3Nzc3AwMDAwMC0tLS0tLS0tKGhoaGhoaGVlZWVlZWViIiIiIiIiIiIlaGu09PT09PH09PTx8fTx8fT +08fH09PHx8fHx8fHurq6urqurq6hoaGhoaGVlZWViIiIiIiIiIiIiIiIiIiIiIh8fHx8fHx8fHx8fHxvfHwAAD5XV0pXV0pXY1BQUFBQUFBQUFBQPj5KPis+SmmPrq7AwMDNzc3NzdnZ2dnZ2dnZ2dnZ2ebm5ubm5ubm5ubm5ubm5ubm5ubZ2c3Nzc3Nzc3N +zc3Nzc3Nzc3NwMDAwMDAwMDZ5ubZ2dnZ2dnZ2dnm5ubm5ubm5tnZ5ubZ2dnZ2dnZzc3Nzc3Nzc3Nzbq6urq6urq6urq6p6enp6enp5ubm5uPoY+Pj4+Pj4+PfHyIiIihtMfHx8fHx9PHx8fHx8fHx8fT08fH08fHx8fHx8fHx8fHurq6urqurq6hoaGhlZWV +lYiIiIiIiIiIiIh8fIh8fHx8fHx8fHx8fHx8fHx8AABKSldXSkpjV0pXV0pKXV1EV1dEREREMTE+V3ahrrrHx8fT09PT09PT09PT39/f39/f39/f39/f39/f39/f39/f3+zs7Ozs7Ozs39/f39/T09PT08fH09PHx8fHx8fT09PT09/f39/f39/f39/f39/f +39/f39/f39/f39/f39PT09PH09PTx8fHx8fHx7q6urq6urqurq6urq6uoaGhoaGhoY+Pj4+Pj4+Pj4+PfIiIla7Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e6usfHurq6uq6urq6hoaGhlZWhlZWVlYiIiIiIfHx8fHx8fHx8fHx8fG9vfAAA +SldKSldXSldXSkpXV0RQXUo+V0oxPj4+SoKnusfHx8fT09PT09PT09PT09PT39/f39/f39/f39/f39/f39/f7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7N/f39PT09PT09PT0+bm5tns7NnZ2dnm5ubm5ubm5ubm5ubm2dnm5tnZ2dnZ2dnZ2dnHx9PHx8fHx8fHx7q6 +urq6uq6urq6hoaGhoaGhj4+Pj4+Pj4+Pj4+CgoKPj6GuwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM3AwMDAwMDAtLS0tLSntLSnp6enp5ubj4+Pj4+Pj3x8fHx8fHx8b298b28AAEREV1dKSldXRFdXSkpdSj5QUD4+Pj4xV4inusfHx9PT +09PT09PT09Pf39/f39/f39/f39PHx9nZ5ubZ2dns39/s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozf39/f3+zs7Ozs7Ozf39/f39/f39/f39/f39/f39/f39/f39/f09PT09PT09PHx8fHx8fHurrHurq6urq6uqenp6enp6enlZWVlZWVlYiIiIiIiIiIiJWV +p7q6urq6urrHx7q6urq6x8e6use6urq6urq6urrHx7rHx7rHx8fHx8e6urq6urq6urq6uq6urq6urqGhoaGhlZWVlYiIiIh8fHx8fG9vAABEV0pKV1dKXV1KSl1dSkpXSjdKPjE+XYKnwMDAzc3N2dnN2dnZ2dnZ2dnZ2dnZ2dnZ2dnHx8fT09/fzc3Nzc3Z +2dnZ5tnm5ubm5ubm5ubm5uby8vLy8vLy8ubm5ubm8vLm5ubm5ubm5ubm5ubm5ubm5ubZ7N/f39/f39/f39/f09PT08fT08fHx8fHx8e6urq6urq6uq6urqGhoaGhoaGVlZWViIiIiIiIiIiIiIiVoaGurq6urrq6rrq6urq6urq6urq6urq6use6urq6urq6 +urq6urq6x7q6urq6urq6urq6urq6uq6urq6urq6urqGhoaGhlZWVlYiIiHxvbwAARERXV0pXV1dKV1dKSldKPlBQMTFEY4i0wMDAwNPT09PT09PT09PT39/f39/f39/f08fHx8fHx8fT09PHx8fHx9PT09PT09Pf39/f39/f7Ozs7Ozs7Ozs7Ozs7Ozs7N/f +7Ozs39/f39/f39/f39/f39/f39/f39/f39/f39/f09PT09PT08fHx8fHx8fHx8e6urq6urq6rq6urqGhoaGVlZWVlZWViIiIiIiIiIiIiIiIoaGhoa6urq6urq6urq66urq6urq6urq6urqurrq6urq6urq6urq6urq6urq6urq6urq6rrq6rq6urq6urq6u +rq6hoaGhoaGhoY98b28AAEpXSkpjV0pXV0pKV1dEV0o3Nzc3V4+0wMDAzdnZ2dnZ2dnZ2dnZ2dnZ2dnZ5ubm09PHurrHx8fHx9PHx8fHx8fH09PHx8fHx9PT09Pf39/f7Ozs7Ozs7Ozf39/f39/f39/f39/f39/s7Ozs7Ozs39/f39/f39/f39/f39/f39/f +09PTx9PTx8fHx8fHx8fHx7q6urq6rq6urq6hoaGhoZWVlZWVlZWIiIiIiIiIiIiIiIiIiIibm5uPoaGhoaGhoa6urq6urq6uurquurq6urq6urq6urq6urq6uq66urq6urq6urq6rrq6rq6urq6urq6urqGhoaGhoaGPdmNjAABKSkpdUFBdXUpKXUpKV0ox +Pj4+aZu0x8fHx8fT09PT09PT09/f39/f39/f39/f08fHx8fHx8fHx8fTx8fHx8fHx8fHx8fHx9PT08fHx8fT09Pf39/f39/f09PT09PTwMDA2dnZ5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubZ5ubT09PT09PTx8fHx8fHx7q6urq6urqurq6urq6urqGhoZWV +lZWVlZWIiIiIiIiIiIiIiHx8fHx8iHx8iIiIiIiIiJWhoaGhrq6urq6urq6urq6urrq6urq6urq6urq6urq6urq6urq6urq6rq6urq6urq6urq6urq6hoaGVfGNXVwAASl1dSldXSkpXV0pXV0o+SjExb6G6x8fH09PT09PT09PT09Pf39/f39/f39/f08e6 +usfHx7q6usfHx8fHx8fHx8fHx8fHx9PT08fHx8fT08fT09PT08fHx8fHx8fTx7q6utPT39/f39/f7Ozs7Ozs7Ozs3+zs39/f39/f39/f09PT09PT09PHx8fHx8fHurq6urq6urqnp6enp6enp5ubm4+bm4iIiIiIiIiIiIiIiHxvb29vb29vb29vb3x8fHx8 +fIiIiJunp6enp6entLS0tLS0tLS0tLS0tLS0tLS0wLS0tLS0tLS0tLS0tLS0p6e0tKenp6enp6ebj29jV0oAAEpKV1dKSldXSkpXRERERCU3b6G0x8fH09PT09PT09PT09PT09/f39/f39/f07q6urrHx8fHx8e6x8fHx9Pf08fHx8fHx8fT09PHx8fHx8fH +tLS0tLS0tLS0tLS0wMDAwMDN2dnZ2ebm5ubm5ubm8vLm5ubm5ubm5ubm5tnZ2dnZ2dnNzc3Nzc3NwMDAwMDAwLS0tLS0tKenp6enp6enlaGhj4+Pj4+Pj4+Pj4+Pj492dmlpaWlpaWl2dmNvb29vb29vb3yIlZWVlaGhoaGhoaGurq6urq6urq6urrq6urq6 +urq6urq6urqurq6urq6urq6uoaGhoaGhoXZjUF1dAAA+V1dKV2NKSldKPkpKNzc3b6G6x8fH09PT09PT09PT39/f39/f39/f39/fzc3AwMDAwMDAwMDAzc3N2dnZ2dnNzbrHx8fHx8fHx8fH09PHtLShoaGViIiIiJWhoaGhtMC0x9PT39/f39/f7Ozs7Ozs +7Ozf39/f39/f39/f39/f39PT09PT09PHx8fHx8fHx8fHtLS0tLS0p6enp6eVoaGVlZWVlZWViIiIiIiIlYiIfG9vb29vb29vb29vY2Njb29vb29vfIh8fIiIlaGhlaGhoaGhoa6urq6urq6urrq6urq6uq6urq6uurqurq6urq6urq6uoa6uoYhjV2NjUAAA +SkpXV0pKV1c+Sko+Pj4+aaG6x8fH09PT09PT09PT09PT09/f39/f3+zf08fHx8fH09/T08fT0+bm5ubm2dnNzdnZ2c3Nzc3Nzc3Nzc3NurquoaGViIh8fHx8fHx8fIiIobrT39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f09PT09PT08fHx8fHx8e6 +urq6urq6rq6urqGhoaGVlaGVlZWVlZWViIiIiIiIiG9vb29vb29vY2NjY2Nvb29vb29vb29vb29vgo+Pj4+Pj4+PoaGurqGhrq6urq6urq6urrq6rq6urq6urq6urq6urq6urq6uoaFvXV1KXWkAAERXSkpXY0pKVz4+Sj4xaafAwM3Nzc3NzdnZ2dnZ2dnZ +2dnZ5ubm5ubZ2bq6usfHx8fZ2cfH09PT39/f8vLy8vLy8vLm2dnZ2dnZ2cfH08e6urquoZWIiHx8fG9vb29vb4Ku09/f39/f39/f3+zs39/s39/f39/f7N/f39/f39/f09PT09PT08fHx8fHx8e6urq6urq6p7S0p6enp6enp5WVlZWVlZWViIiIiIiIiHZ2 +dmNjb29vb29vb29vb29vb29vb2NjY2NjdnaCgoKCgoKCgpWhoaGhoaGurq6urq6urrqurrq6rq66uq6urq6urq6urq6urqGIY0pXaV1dAABKSldXSkpXVz5KSjFKdqHAwMDNzc3Nzc3NzdnZ2dnZ2dnZ2dnm5ubZzbrHx8fHx8fHx8fHx8fT09PTx8fT09PT +7Ozs7Ozs7Ozs7Ozf39PT08fT07qurqGhj4+PgoJ2dnZ2rs3f39/f39/f39/f39/f39/f39/f39/f39/f39/T09PT09PTx9PTx8fHx8fHx8e6urqurrqurq6urq6uoaGhoZWVoZWVlZWVlZWViIh8aWlpaWlpaWlpaWlpaXZ2dmlpaWlpaWlpaWl2goKCj4+P +j4+Pm5ubm5unp6entLS0tLS0tLS0tLS0tLS0tLS0tKenp6enp6eVaVdjY1djYwAARFdKSl1dRERERDdKfKHAwMDNzc3Nzc3NzdnZ2dnZ2ebm5ubm5ubm08DAwMDA08fHx8fZ2dnZx8fTx8fH09/f09/f09PH2dnZ5vLy8vLy8vLy8ubZ2cfHx7Snp6eVlaGP +j67T39/f39/f39/f7Ozs7Ozf39/f39/f39/f39/f39/T09PH09PTx9PHx8fHx8fHx7q6urqurq6urq6uoaGhlZWhoZWVlZWVlZWIiIh8fHxpaWlpaWlpaWlpaWlpaWlpaXZ2aXZ2aWl2dnZ2goKCj4+Pj4+PoaGhoaGurq6urq6urq6urq6urq6urq6urq6u +rq6urqGhiGNXSl1dXV0AAEREV1dERFc+Pj5XfKfAwMDAzc3Nzc3N2dnZ2dnZ2dnZ2dnZ2ezfx8e6usfHx8fHx8e6x9nZ2cfHx8fHx9PT39PT09PH09PT39/T09PT7Ozs7Oz4+Pj47OzZ2c3NwMDAtKG0zdnZ2dnm5ubm5ubm5ubm5ubm5ubm2ebm2dnZ2dnZ +2dnZ2c3Nzc3Nzc3NusfHx7q6uq66uq6urq6hrq6hoaGhlZWhlZWVlZWVlYiIiHZpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaXZ2dnZ2dnaCgoKCgoKClZWVoaGhoaGhoa66p6e0tLS0tLS0tLS0tLSnp7S0p6enm29QUGldXV1dAABKV0REV0o+SkpKgrTHx8fH +09PT09PT09PT09Pf39/f39/f3+zZx8fHusfTx8fHx9PTx8fH09PT08fT09Pf39/fx8fZx9/f39/f39/NzdnZzd/f3+zs7Oz4+Pj4+Pj47OzZ2cfH09Pf39/f39/f39/f39/f39/f39/f39/f09PT09PT08fT08fH08fHx8e6urq6urq6rq6urq6urq6hoaGh +oaGhlZWhj4+Pj4+PgnZ2dmlpaWlpaWlpaWlpaWlpaWlpaWldaWlpaWlpaXZ2dnZ2doKCgoKPm5ubm5ubp6enp6e0tLS0tLS0tLS0tLSntLShrq6uoXxdXV1dXV1dXQAAPkpXVz4+SjFKiLTHx8fHx8fT09PT09PT09PT09Pf39/f39/fx7S0x8fT08DAwMDA +wNPTx9PT38fH09PT0+bm2dnZ5ubZ2dnZ2ezs7NPT09Ps7N/f3+zs2dnZ2ez4//j///jNwMDNzdnZ5ubm5ubm5ubm5tnZ2dnZ2dnZ2dnZ2dnZzc3Nzc3Nzc3NzcDAwMDAwMDAtLS0tLS0p6enp6enp6ebm5uPj5ubiIiIiHx8fGlpaWlpaWlpaWlpaWlpaWlp +aWlpaVdjY2NjY2NjY29vb3x8fHyIiIiVoZWVp6enp6entLS0tLS0tLS0tLS0tLS0tLSnp5tpV1djY1dXaWkAAERXSj5KSjFQlbrHx8fHx8fH09PT09PT09/f39/f39/f39/fx7rH2dnZ5tO0tMDAtMfHx9Pfx8fH09PH2dnZ2dnZ2dnZ2dnZ7Ozs39/f39/f ++N/f39/f39PT09/f8vLf8vLmwKenusfT09/f39/f39/f39/f39/f39/T09/f09PT09PTx8fHx8fHx8fHx8e6use0tLS0tLS0p6enp6enp6enp6eVlZWViIiIiIh8fGlpaWlpaWlpaWlpaWlpaWlpaWlpaV1paV1dXV1dXWlpaWl2dnaCgoKPj4+bm5ubp6en +p7Snp7S0p6e0tLS0tKentLSntJtvV0pjY1dXaWlQAABKPkpKNzdjm7rHx8fHx8fT09PT09PT09/f39/f39/f39/TwM3Nzc26x9PTx8fT39/f39/fx8fH09PT09PT09Pm8ubT09/f09Pf7Ozs7N/f39/f7Ozs7Ozf7Oz4+Ozf39/f38ehlaGuusfT09/f39/f +39/f39/f39/f39/f09PT09PT09PTx8fHx8fHx8fHx8e6urq6uq6urq6urq6uoaGhoaGVlZWVlZWIiIiIdnZpaWlpaWlpaWlpaWlpaWlpaWlpXWlpaWlpaWlpaWlpaWlpdnZ2doiIiIiVlaGhoaGhrq6urq6urrq6rq6urq6urq6urq6IV1dpXV1paVdXYwAA +N1BEN0pjlcDAwMDAwM3Nzc3Nzc3Z2dnZ2dnZ5ubZ2ebTx8fHx9PTx7rH39/T09PHx9nZ2dnZ2ebm2c3N2dnm+Ozs39PT09PH2dnm5ubm2dnZ5vLy8vLy8ubm5ubm2ezs7Nnmx6GVlaGursDA09PT09/f39/f39/f39/f39PT09PH09PTx9PTx8fHx8fHx7q6 +urq6urqurq6urq6uoaGhoaGhoZWVlZWIiIiIfHxvY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Njb29vb29vfHx8iIiVlaGhoaGhoaGhtLS0tLSntLS0tLS0tLS0p6eVaVdXV2lpV1dpXVAAADc3N0pjm8DAwMDAwNPH09PT09PT09PT09Pf39/f39/T +09PHx8e6usfH09Pf09Pf08fH39/Tx8fT09PT09/f7Pjm2dnN3+zf09/f3/js09Pf3+zs7N/s+Ozf3+zs7N/f39/f39/frpubm5uurq66x8fT09PT09/f39/f39/f39PT09PT09PHx9PHx8fHusfHx8e6uq6urq6urq6urq6um5ubm5ubj4+Pj4+Pj3x8b2NX +V2NjV2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nvb29vb298fHx8iIiIiJWhoaGhoaGurq6urq6urq6urq6urq6urq6ufFBQY2NXV2lpV2NjAAAxRERpp8fHx8fHx8fH09PH09PT09PT09Pf39/f39/fzc3m5vLy5tnZ2dnZ2ebZzc3Z2dnZ2cfHx9nZ2dnZ2dns +2c3Z2ebm+Ozs7N/f39/f39/f39/f39/s7Ozs7Pjm2dnm5ubZ2ezTtJWVp6enp6e0wMDAwNPT09/f39/f39/f09PT09PT08fHx8fHx8fHurq6urq6uq6urq6urq6hoaGhoaGhj4+Pj4+Pj3x8fGNKSkpKSkpKSkpXV1djY2NjY2NjY2NjY2NjY3Z2aXZ2dnZ2 +dnaIiIiIlaGhoaGhoaGhoa6urq6urq6uurq6uq6urrquj2NKY2NXaWlXV2ldUAAAMTFpp7rHx8fHx8fHx8fH09PT09PT09PT09Pf39/NrqGuwMDZ2dm6use6usfZ2ebm2c3Nzc3N2c3Nzc3Nzc3Z2c3Z2c3f39/Tx8fH2fLm5vLy5ubm2dnZ5ubm5ubm5vLy +8v/s7P//7OzZuqenp5WVoaG0tLS0x8fH09/f39/f09PT09PT08fHx8fHx8fHx8fHurq6urq6rq6urq6uoaGhoaGVlZWViIiIiIiIdmlXV0pKSkpKSkpKSkpKSkpKSkpXY2NjY2NjY29vb29vb3x8fIiIiIiVlZWhoaGhoa6urq6urq6urq66uq6urq6uuq6u +rm9XV1dpaVdXb11dXV0AADdvp8fHx8fHx8fHx8fHx9PT09PT09PT09/f39/Hp6e6x9PTx7q6x9PTx8fHx8fHx8fHx8fZ5uby8ubm5s3N5vLZ2dnZ5vLZ2c3f39/f3+zf39/H3/j4+P/y5vL/7Ozs7Ozs7Pj////y8vLm07SVlZWhoaGhoaGuwMDAwNPT09PT +09PT09PTx8fH08fHx8fHx7q6urq6rq6urq6uoaGhoaGVoaGPj4+Pj4+PdnZXPj4+SkpKSkpKSkpKV1dKSldXV2NjY2NjY2NjY2NjdnZ2dnaIiIiIiKGhoaGhrq6urq6urq6urrq6rq66urq6rq6uro9XRF1vXV1dXV1daVdXAABpp7q6urrHx8fHx8fT09PT +09PT09PT39/f39/Ap7TH08e6oaG6urrH09PT09PHx8fH09/Tx8fT5vLy8vLT08ff7Oz4+OzZ2dnZ8ubZ2dns7NPT3+zs7NPm5uby8v//////7Ozs+Pjs7Ozs7Pj4+N+6rq6urqGhoaGurq6uurq6x8fHx8fHx9PTx9PTx8fHx8fHx7q6urqurq6uoaGhoaGh +oZWVlZWViIh2dmNKNzc3N0pXSkpKSkpKV1dXV1dXV2NjY2Nvb29vb29vfHxvfHx8fHx8j6GhoaGurq6urq6urq6uurqurrqurrq6rq66uqFjPmNjV2lpV2NjY1BjYwAAiLq6urrHx8fHx8fHx8fHx9PT09PT09PT09O6rsDAwNO6urq6usfH08euurrZ2dnN +zdnZ2ebZx8fHx8fZ7Nnm5sfT7NnNzeby8v//7OzZ2fLy39/y8ubT5ubT5tnN5vLy5vL/////8vLy8vLy///s7Ozfx7qhiIihj4+hoaGurq6urq6urrq6usfHusfHx8fHx7q6urq6urqnp6enp6enlaGhj4+CgmlpXV1ERERERERERERERFBQUFBdaWlpaWlp +dnaCgoKCdnZ2dnaCgoKCgoKCm5ubrq6urrq6rq6urq66urq6urq6urqurrqurq6IUFBQaWldXW9jV2lpV1cAAJW6urrHx8fHx8fHx8fH09PT09PT09Pf39/f39/Tx8fHrq6ursfT09/fx8e0wMDAzdnZ2dnZx9Py39Pf3/LZzc3Nzc3N39/f39PHx8fH0+bm +5uby5tnZ2eb4+Ozs7NnZ+P/s7Ozs09Py///////4+P////////Ly066CgnaIiJWhoaGhoaGhoaGhoaGVlaGhoaGhrq6urqGVoZWVlZWIiIh8aWlpXV1dXUpKSkpKSkpKV1dXV1djY2NjY2N2gm98fHx8iIh2doJ2doKCgoKPj4KCj6Gurq6urq6urrq6rq7A +tLTAwLS0tLS0tLS0tMChXTdXb11daWlXV2lXV2NjAACPurrHx8fHx8fHx8fH09PT09PT09PT0+bZx9Pf39/f38fZ2ebm2dnAwMDf08fH39PT08fHx8fH5ubZ7Ozs39/T09PT08fZ2dnZ2dnZ5ubm5tPfzd/4+P//7Ozs+Pjm8v//8vLy/+zf8vLy39/s7P// +///////////////42bqhj4KCgoKCgoKPj4+Pj4+Pj4+Pj4+Pj4KCdnZ2gnZ2dmlpaWldXV1dSj5KSkpjY2Njb29vfHx8fIh8fHx8iIiIiIiIiHx8iIiIiJWVlZWViIiVlaGurq6uurq6urq6urq6urq6urq6urq6uq6uurq6fEpdXV1paVdXb2NXaWlQXQAA +obq6usfHx8fHx8fH09PT09PT09PT09PAm5ubrs3Nzc3N2cC0tLTAwM3m5uby5ubmzc26x7TAzdnZ2ebm2dnHus3N2ebm+ObZ8t/f3+zs39Pm8tPm5ubm09P42dns7Pj4+ObZ2ezs7Ozs7N/f39//+Obm5ubZ7P//////////////+Nm6oXZpaVdXY2Nvb298 +fHyIfHxvb29vb29jY2NjY1dKSko+PkpXV1dvb29vgoKClaGhoaGhoaGurq6hoaGhoY+Pm4+Pj5ubj4+Pj5ubm67AwMDAwLS0wMC0tMDAwMDAtLTAtLS0tLS0tLS0iEpdXV1paVdjY2NXaWlQY2MAAKHAwMDAwMDAzc3Nzc3Nzc3Nzc3N39Ouoa7Hx8fZx8e0 +tMff38euwNPHx7S0tLS0tMfZ2fLy8vLy39/T7NnNzcDNzebm5ubm2cfT09PT09O609Pm5tnZx9nZ5vLy5tnm0+bm///4+P/s3/j47Oz///Ly2dnZ8vLy8vLy//jm5v//////////////8seuurqViIh8fG9XV1dXV1dXV0pXY2NjY29vb4KClaGhoaGurq6h +oZWVoZWVoaGhoa6urrrHtLTHurq6uq6urq6hoaGhoaG6usfHurrHx7q6x8fHx8e6urq6urq6urq6urq6p2lKSmlpXV1vb1dpaVdjb11QAAChurq6usfHx8fHx8fHx9PT09PT39O6x8fT09O6uq6urtnNzc3Z2c3Nzc26zdnZ2dnZx9nm5ub45sDAwMDf7P// +//Lf3+zTx9//5tnZ2c3Z2eby8t/f8t/T5vLm5tPf09//+Pj47Nn47N/f8v////Ly39/y8vLy/+zs7N/f7Oz4+N/f39/4///////////////////y8v/47N/N2ebZ2dnZ2cfHx8fHx8e6rq6ursfHrq6urq6urqGhrq6urq66urqnp7q6usfHx8fHx8fHx7q6 +usfHx8fHx8fHx8fHx7q6x8e6urq6urq6urq6unw+V29dXXZpV2lpXV1paVdjYwAAobS0wMDAwMDAwM3Nzc3Nzc3Z2dnNzcDAtLS0tLS0tMDAwNPTx9PAwMDAwMDT7N/f38fHx7q6zd/s7Nnm5ubm08fH09/f8v/y8t/Tx8fZ2ebm5s3Nzc3Z2fLm5ubAwN/s +2dnZ2dnm5uby8vLf39/f3+zs+P//8ubm2dns//j439PT+Pjf7Ozf39/f39PT8vLy///////4+Pjs7Ozf09/fzc3Z2c3N39/f383Nzc3NtMfHtLS0tLS0x8fHuq6hrrq6uq6urq6urq6uuq6uurq6zc3Nzc3Nzc3Nzc3NwMDAwMDAwMC0wMC0tLS0tKFdUFBQ +aWlXY3ZpV2lpV1dpXV0AAKHAwMDAwMDAwMDAwNPHx9PT09PT09PT09PTx9PT08fHx8e0p7TTx8fZ2dnZ2dnHx8fHusfHx9PT5ubZ2dnHx8fT39/f7NPHx8fH2ezs7Ozs7NPTx8ff7Ozs39P47Ozs7Ozf09Pf39/s7Nnm2dnZ7Ozs7Oz4+OzT5vLy/////9nZ +2dns7OzZwNPT0/js2dnZ2dnm09Py8vLy///////47OzfzdnH09PT09PT08fH08fT08fHurrHusfHusfHtLS0tLS0p7qursDAtLS0tKe0x8fH08fHx8fHx8fHx8fHx8fHx7q6urq6urq6x7p2Pkpvb11db2NQaWlXV2lpUGNjAACburrHusfHx8fHx8fH09PT +09PTx9PT09PT08DT09PT5tnZ2dnZ2dnZ2c3Nurq6urrHx9Pm5tnZ2dnNzbq6x9PT39/f39/Hx8fZ7Ozf7Ozszd/T3/Ly8vLTx+zs7Ozs7Ozs7N/f3+z4+Ozs2dnZ8vLm5vLy/9PH3///7OzZ2dnZ5vLy8vLy8vLy8vLT0/Ly8vLfx8fT7N/TwMDA09Pf7Pj4 ++Pj47Ozs39/fx8fH08fHx8eursC0tMe6rq6urq7Huq6uurq6x66urrq6p6e6x8fTx8fT08fHx8fHx8fHx8fHurq6urq6uq66urqVSkppVz5XY1dpaV1daWlQXWlXVwAAlbq6usfHx8fHx8fH08fHx8fH09PT09PTx7TAwNPHurq6urq6x8fH2ezs3+zs39/s +39/f383NzcC0tN/T09Pf3+zZ2ezsx+by8t/f3/LTx9nm5ubZ2dns09Ps7Ozs7N/f08fZ//Ly8v/m09PT0+by8ubZ2dnZ2ezs7OzZzc3Nzc3f39/f39PH2fLm8vLy8vLm2dnZ2ebm09PT09PT39PTx8fT5vLy5vLy8vLy8ubm2dnHx7q6usfHtLS0tLTHx8fT +08e6uq6urrq6urqntMfHx9PTx8fHx8fHx8fHx8e6urq6use6urq6urq6Y0pXVz4xPl1vY2Njb1djb2NXY2MAAJW6x8fHx8fHx8fHx8fT09PT09PH09PTx7S0p6e6oaG0tLTH08fHx9PTx67A09PT09/s7Ozs7Ozs7Ozs7N/f39PTx8fT39/s08DA09PT09Pm +5tnZ2dnZ2fLy5ubm08fT09Py///y5uby8ubm5uby5ubm09//+NnZ2dnZx8fH3+zs7Ozs2dnZ5vj45ubZ2dnAwNnZ5vLy2dnAwM3Z2cfHuq7A09PTx8e6urq6rsfZ2ebm5ubm5tnZ2ce6urq6urq6rq6ursDArq66uq6urrrHx9PHx9PHx8fHx8fHx8fHx8fH +urq6urq6urrHiEpKY0orSmNjV2NjY2NvY1BjY1dXAACPwMDAwMDAwM3Nzc3Nzc3Nzc3N2dnZwLS0tLS0tLS0tLTTx8fHx8e6urq6x8e0tMDA09PHurrH09Pm8vLy8vLy8vLm5ubTx8fHx9PT0+by39PAwNnZ7Ozf39/T3/Lf0+by8vLf07rH5vLy///4+ObZ +2dns7Oz/7NnZ5tPm8v/m8vLy5ub45tnZ2ebm09/y8tnZ2dnHx8e60/Ly8vLy2cfHx8fH08DAwMDAwMDT09PHtMfHus3Z2dnZ5ubZ2dnNzc26rq66uq6uuqe0tMfT09PTx8fHx8fHx8fHx8fHx8fHx7q6urq6urq6oUpKb103RGNjY29jV2lpV2NvXV1paQAA +j7TAwMDAwMDAwNPHx9PT09PT09PT09PT08fHx7quwNO6urq6usfHurq6x7q6x8fH2dm0tMfHx9nZ2dnZx8fHx8fT3+zs+Pj47Ozs3+z45tPTwNnZ2dnZ2ezZzdnZ7Ozfx+by2dnm+Ozs7NPT09Pf8vL///j/+Ozs39////////Ly8tnZx9nZ2dnZ2dnZx8fH +09PTx8fH2dnZ2fLZx9PT09/f09/f08fHx8fH09O6urq6rrrNwMC0tKfAwMDT09PT39/T08fHx8e0p6fHx8fT08fHx9PHx8fHx8fHx8fHurrHx7q6urq6unZEUFBQN0RXdmlXaWldXXZjV2lpV1cAAI+6urrHx8fHx8fHx9PT09PT09PT09PT09PT39/f7Ozf +39/f09PTx7rHusfHx8fH09PHx8fHx8fH08fHx8fTx8fT08fT09Pf08ff3+zs7P//////+ObZ2cfH0+bm5tnZ2c3f7Ozs39/s2dnZ2dnZ7Ozf8vLT39PT5ub4+P////////////////j439/Nzc3m2dns7MfH08fm2c20tNPf09/f09Pmzc3Nzc3Z2dnZx7q6 +rsDAwMDAwMDAwMDAtLSnp8fHx8fH09PH09PTx8fTx8fT08fHx8fHx8e6usfHx8e6urq6uq66x5U3RGNXHzFjY1djY1dXaWlQY2NXV2NjAAChurrHx8fHx8fHx8fH09PT09PT09PT09PT09Pf39/f39/f3+zf3+zs7Ozs7Ozs7N/f383Nzc26x9PHx9Pf383N +zcDA08fZ5tnZ2dnHx8fT5ubm8vL////////4+ObT3/Lm5ubm5uby8tPT39/f7Ozs383Nzd/f3+zs7Ozfx8fH09Pm8vLy///4////////8vLf08fT8ubm5tPT08fHx9PTuse6usfHx7rNzc26uq7A39/Tx9nArq66urq6urq6rq7Hx7Snp6enp7rHx8fTx8fT +x8fHx8fHx8fHx9PHx8fHtLTAwLS0x6FXPmlpMTFjY1dpaV1daWlQY2NXV2lXSgAAocDAwMDAwMDAzc3Nzc3Nzc3NzdnZ2dnZ2dnZ2dnZ5tnZ5ubm5ubm5ubm5ubm5uby8vLy8vLy8vLy5ubZ7Pj4+Pj47Ozf08fH09PT09PH09/f09PTx9ny5ub4+Pj///// +//jm5tnZzc3N2dnZ5vjs383Z+Ozs7Ozs7Pjfx9Pf3/Ly39/f39/sx8fT7Oz4+P////////j47N/f7OzZ2cfT09PTx9PAwMDT08fHx7q6utPHx8fTx8fH09PT09/s2dnZ2bq6uq6ursfHx9PHx9PTx8fHx8fHx8fHx8fHx8e6urq6urq6urpjN11dRDdKV2lp +V1dpaVdpaV1daWlXV2MAAIKhoa6urrq6x8fHx9PT09PT09PT09PT09Pf39/f39/f39/f39/f7Ozs7Ozs7Ozs7Ozs7Oz4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj///j439/s08fT09/s7Ozf39/f09PT39PT5vLy///////////47OzZzc3m5vj47N/s+N+0tMDAwMDZ +2ezZ2dnZzdnZ5ubZ5tnNzdnZ7Oz4+Pj///////Ly8se0wMDAwNPT09PTx7S0wMDfx66htLS0x7ShoaGhobrHx8fZ2dnZ2dnZ2dnH09PHx9PHx8fHx8fHx8fHx7q6x8e6urq6useVSkpXV0pKY29jY2NjV2NjY1BpaVBQaV1QAABpiIiIiJWVlZWVoaGhrrq6 +usfT09PT39/f39/f39/f39/f39/f7Ozs7Ozs7Ozs7Ozs7Ozs7Oz4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4//j/+Ozs7NPTx9PT08fH09PT09PT08fHx9/s7Oz4////////////7NnZ2c3Z7Ozf+Pjm8v/s09Pf39/y5tnZ2cff+N/f7N/f38C0x8ff7Oz4+Pj/ +//j4//j47N/Hurq6utPT09/fzbTA08fHx7qhtMfHurq6oaGhrq7A09PT09PT09PHx8fHx8fHx8fHx8fHx7q6urq6use6VzFjYz4+Y2NXb29XY2NjV2lpV1djY0pdXQAAV2lpaXx8iIiVlZWVlZWVlZWVlZWVoaGurq7AwNPT09Pm5ubm5ubm5ubm8vLy8vLy +8vLy8vLy8vLy8vLy8vLy8vLy///y8v/y8v/4+Pj4+Pj///j///j47N/f7N/f39/f09PH2ezs7NnZ2c3N5ubm+Pj4////////////+Obm09Pm09/T3+zf39/Hx8fZ2ebm5tnNzbrs39/T09PHusfH09Pm8vLy8vLy8vLy8vLf09O6p7THusfHx7S0tLTAwLSn +p6e0tLSnp8fZ2cfH08fH08fHx8fHx8fHx8fHurq6urq6x7q6gj5XYz4xRFdpdmNjb29XY2NXV2lpUFBpXVAAAFdpdnZjY3Z2aXx8fHyIiIiVlZWhoaGhoaGhoaGhoaGhoa6ursDAwM3N2dnm5ubm5vLy8vLy8vLy8vLy8vLy8vLy8vLy///////y8v////// +///////////////4+PjZ2dnZ2dnZ2dnZ2cfT7Ozs2dnZ2fLm09Pf3+z/8vL//////////+zf08fHx9nZ2dnm09PT08fT7Ozf38fH7OzT0+bZ2ce6urrN383Z7Ozs+Pjs7Ozs39/fx8e6urrHx9PT5tO0tLTHx9nZx9PT09PTx8fHx8fHx8fHx8fHx8fHurq6 +urrHrko+Y29KN2N2aWlpdmNjdmlXb29XV2NjUGNjAABXgnZ2iIh2goKCdoiIdnaCdnZ2gm98fHx8j4+PoaGhobS0tLS0tLS0tLS0tLTAwMDNzc3N39/f8vLy8vLy8vLy8vLy8vLy8vLy8vLy////////8v/////////////////////4+Pjf39/f09/y8t/T +383Nzd/s7N/f7N/Hx8fZ2dns+Pj4///////4+Ozfx8ff+Pjs7Ozs383Nzc3N2dnZx8fH09PT39/f08eux9nNzdnZ5ubm5vLy5ubm2dnArqGuurrH09PT09PTx9PTx8fT09PT08fH08fHx8e6x8fHx8fHumkrV2lEJUpjY2N2Y2N2aV1paWldb29XY2NQUAAA +V2N8fG9viIh2iIh8fI+Pdo+PgoKViHyPj3x8iHZpdnZ2aWldXW9vfHyPj66uusfHx8fHx8fHx8fH09PT5vLy8vLy8vL////////////////////////////////////////////4///////s39Ps39PT09PT5tnZ2dnZx+zs09Pf09PHx9Pf3+zs//////// ++Pj45ubTx7q62dnZ2dnHx8fH0+zZ2bS0tMDAwNPT08fHx7qurq6609PT3+zf3+zs39/f09PT09PT09PH09PTx8fHx8fHx8fHx8e6use6x8e6x5s3N11KN0pXY3ZjV2lpV2lpaVdpaVdjb2NXb28AAFeCb2+CgmmCgnZ2iIhvgo98fI+PdoiViHyVlYKCoY+P +j2lQUFBQUFBQUFBQUFBQUGl8j6G0x9PT08fHx7q6usfH2eby8vLy8vL////////////////////////////////////////4////////////////8vLy5tnN2dnZ5ubm2dnZ2dnZ7NnZ2dnHx9PT8vLm+Pj4+P//+Pj439/s2dnN2ebm2dnAwMDA09/fzc3N +urq6x8fT08e6urq6ocfTx9PT09Pf39PT09PT09PH09PT09PTx8fHx8fHx7q6x8fHx7RdMUpvVzdKaWlXaWlXV2ldUGNjV1dpaVBjY1dKAABXaXx8aXyIfG+IiHaCj4J2j498fJWIdo+PgoKViIiVlWlKV0pXaWlpaV1ddpWViIiIb11dXV1pfI+hrsDA09PH +x8fHurq6x9Pf3/Ly8vL///j///j////4///4+P//+Pj///j///j////4///////////////////////////y8tPHx9/fzebm5ubm5ubm8t/T09PHx9nZ5vLy8v//////8vLm2c3Nzc3N2dnHx7qurq7AwNPT07TT5sChusfTx7q6usfZ2dnZ2dnZ2dnZ2c3N +zc3Nzc3NwM3Nzc3NwMDAwMB2JUpvUCU+Y1dpdmNjb29daWlXV2lpSldjUFBjMQAAV3xpaYKCaYiVfHyPj3aIlXx8j492j5uCgpubfI+hiGldSjdKY2NXY2NXfKGVlaengoKCb3ybm4iIiHx8fIibrrq6x8fHurqnp6enp6fAwNPm+Pj4//j////4///4+P/4 ++P////////j///j4///4////////+P//+P/////////////4+PjZ2ezZzc3f39/T08fHx8fZ2dnHx9nHx9Ps7Oz4+Pj4+Ozs39PAtLTH5ubm2dnZzdnHrqHAzdnZx7qurrrN2dnZ2dnZ2dnZ2c3Nzc3Nzc3Nzc3NwMDAwMDAwMChV0pdSjdKV2l2Y1dpaVdj +b2NXaWlQXWlpUGNjPgwAAGNjdoh2aYiIb3yIfG+IiHZ2lYh8j498fJuPfI+bgmlXPj5KY1dXaWlKdqGPj6GhgoKCaYKhlYihoY+bm4+PoaGVlaGhobTAwM3NzcDArq6uoaGhtMfZ7Ozs+P/4////+P////////////j/////////////+P////////////// +///////4////+Pj47Ozfzc3m5sfH08fH2dnmzdnZ2dnNzc3Z2dns+Ozs///s7OzZzcCurq66x9PT08fZx66uwNPT09/f09Pf09PT09PT08fT08fHx9PHx8fHx8fHuseuSkpjY0pKV2lpXV1vY1djb11daWlXY2NXV2NjPhIAAABXgoJpgoJvb4iIb4iIdnaP +j3aIiHx8m498j6GIiHxXPkpXV1djY1BQfIiIoaGIiIhvb4+bfIihoY+np3yIp6eVp6d8Y2Njb3yIiKGhusfH2c3NzcDArqGurrrH2ezs+P/4//////////////j///j4///4////+P//+P////////j4//j4//j4+P//////+P////Ly383Nzc3NzdnH09Pm +x8fHx8fHuq66x8fT5ubm+Pj4+Pjm5ubTwLS0tLTH09PH39/f39/f39/f09PTx9PT09PT08fH08fHx8fHx8fHaT5Xb0QlV3xvY3Z2XWlpaV1vb1djb2NXaWlXYyUAAAAAY2N2gm9viIhvgo+Cgo+PdoiVgoKPj3aIm4h8lYhKSko+SmNjV1djY3ybm4iVoXxp +doiIfJWViJuniIiVlYihrpWCaVdKXV1dXWldXYKnp7TAwMDT09PT39/Tx8e6usfH09Pm8vLy8v////////////j/////////////+P//+Pj/////////////////////8v////////j/+Ozf09/Tx8fH09PT09Ps7NPTx8fHx9nZ2dnZ7Ozs7Ozs7Ozf3826 +utPT39/f39/T09PT09PTx9PT08fT08fH08fHx8fTrjdXb1c3SmlpaXZjY3x8Y29vXV1paVdjY2NXaVcYAAAAAFd8fG+Cgm98iHxviIh2gpWIfIiVgoKViHaPm4JjUD4+V2NXV1dXV4Khj4+hlW98fHx8j498m6ePj4+Pb3yViIiIY0pKV1dXdnZjY4iVlaen +m5uPj3yVrq7A09PT7Ozf39/H08fH09PT3+zs7Pj4+P////////j////4////////+P//+Pj/+Pj4//j4//j4+Pj4+Pj4+Pj4+Pj///j4//js7N/Hx9PAwNPTx8fH2dnNzc3NzcC0wNPf39/f39/f39/f39/f39/f39/T09/T09PT09PT09PTx8fHx8fHx11E +XV1KSldpdmNjdnZjb29vXW9vV2NjY1djY1cxAAAAAABXY3aCb2+IiGmCgoJ2lZV2iJWCgpWVgoKbiIiIY0pKV1dXY2NKV4KCdpWVgoKCb2+Pj3aIoY+PoZV2goJ2doKCSkpXSkpjY2NjY298obSbm66VgoKCgoKhoY+hoaGhtMfH09PT09PT39/f09PT09/f +3+zs+Pj///j////////4+P//+Pj4+Pj/+Pj4//j4//j4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4//js7OzT5ubHx8ffx8fHx7rT5ubm5ubm5ubZ2ebm2dnZ2dnZ2dnZ2dnZ2dnN2dnNzc3Nzc3Nzc3N2ac+SnZjRGN8b2Nvb2Njdmldb29jY29jV2lpSl1KBgAAAAAA +V3ZpaYKCb3yIiHaPj3aClYh8j498iJuPgpWVfHyPgm+IiGlpdnZ2iJWIiJV8Y2+IiHyVoYihro+ClXxpiIh2Y1dXRFdvb2Nvb1eCp5uPrq6IiIh8iKGhj6G0oaGhlYihrq6uroiIobTH09/f39/s39/f09PT09Ps7Oz4//j////////4+P/4+Pj/+Pj/+Pj4 ++Pj4//j4+Pj4+Pj4+Pj4+Pj4+Oz4+Pjs+Pjs7Ozf39/ArrrN39/s7N/s7Ozf39/f39/f39/f09Pf39PT09PT09PT09PHx8fHx8fHx8djRGNQPlBjY29vY2Nvb11vb2Njb29XY2NXV2NXGAAAAAAAAFdvgoJpdoh8b4iIdnaPj3aPj3x8j498j6GCgqGVgqGh +j4+hlXyPp4+Pp6d8iJWIiKGVfI+hiIiVlXZ2iHxpdlBQUFBQXW9vY2OCm4+np5WVlZVpj6F8iK6biKGhiIiurpWurnZXV2Njb3x8iIihtMfT09PT09PT09PT09PT09Pf7Ozs+Pj4+Pj4+P//+P//+Pj4+Pj4//j4//j4+Pj4+Pj4+Pj4+Pj4+Ozs7Ozs7Ozs +7Pjs7Ozs7Ozs7N/f7N/f39/f39/T09/f09PT09PT09PT09PT09PH08fHx9OnV1djgoJpdnZpaXZ2XWl2Y2Nvb2NjdmNXaWlXPgAAAAAAAABXfG9vgoJpfI98fI+Pb4KPfHyPj3yPj4+ClZWCj6GIiKGhiIinlYihoYiIp5WIoa6VlaebiJubdoKCgm98iFdX +V0pKaXZpaWlpfKG0oaG0m4KCj4+Pp6ePobShiJWVfJWuoYhpXUpjdmlpdmlpiKGhoa6uoa6ux9Pf39/f39/f08fT08fT09PT3+zs7P////////////Ly//Ly///y///y8vLy8vLy8vLy8vLy8ubm8vLy8vLm5ubm5ubm5ubm5tnm5tnZ2dnZ2dnZ2dnZ2dnZ +2dnZ2cfH08fH09PTaUppfGlpfG9jb3xjY3ZpXW9vXV1vY1dpaVdXVxgAAAAAAAAASml8fG98j3xviIh2do+CdoiIdnaPj3aPj3x8lZWClaGCgqGVfJWhiIihoYiVoY+Pp6eIoaGPj6GhiJubiHxpV0pKaWlddnZXdqGVla6uiIihiIinlYKbrqGVp6d8fJWC +do9pRERjY2N2dmlpj6GVrq6hoYh2aZWnm6e6uq7H09Pf39/f39/f08fHx9PT0+bm8v////////////Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLm5ubm5vLm5ubm5ubm5tnm5tnZ2dnZ2dnZ2dnZzdnZzc3Nzc3Nzc3Np1dpaWmCdmN2dmlpdmlXaXZjY3Z2 +V2NjV1dpaT4MAAAAAAAAAERjV1djY2NjdnZ2j498iKGCgpWVfI+biHyVlYKPm4iIm5uClaePj6GhiJWnlYinp4iVp5WIoaGPj6enj6enfHyIdmlpdmNjdoJ2j6eVlaGPdnahgo+np4ihoXx8iIh8fJVvV2NjY3Z2dml2doKhuqGVro9vfKGhiKGhlaGhoZWh +tLS0x8fH0+bm8vLm5tnZzc3N2dnm5vj4+Pj4+Pj4+Pj4+Pjs+Pjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozf7Ozf3+zs39/s2dnm2dnZ2dnZ2dnZ2dnZ2dnZx9PTx8fT02lKY3x8aWl8b2N2dmNvfGldb29jY3ZpV2lpV1clAAAAAAAAAABpiIiIfHx8SiU3NzdQaWlp +doh2iJuPj5ubgo+hlYKbm3yIoY98lZWCj6GVgqGhiIihlZWhoY+PrqGPoa6Vla6ulaGulYiViHaVp5ubrqGCgoKCj6Ghlae6p4+hlXaPm4KCaVdKV3x8aXx8Y4Kurpu0tI+PgoKPoZWIoa6hoaGhj6G0p6enj4+hurrH09Pf39/s7N/f09PT09Pf39/y8vLy +8vLy8vLy8vLy8vLy8vLy5uby5ubm5ubm5ubm5ubm5ubm2ebm2dnZ2dnZ2dnZ2dnN2dnNzc3Nzc3NzadKXXZpaYJ2aXZ2aWl8fGNvb2Njb29XaWldXWk+BgAAAAAAAAAAgqGhoaGuiB8AAAAMGCUlMTExSmNXY3x8fIibj4+hoYiIp4+PoZWCj5uIfJWVfI+h +j4+np4ibrqGPp6ePoa6hj6enlZW0p5WurpWVtKeIoaGIm66hlae0m5ubm2+Pm3x8b1dKV29vb3x8Y4KuoaGuro+Pj2+IoaGIoa6hj6eVgpu0oaG0j2OIp6enp6entLTHx9Pf7Ozs7Ozf39/T09PT09/s7Ozs+Pjs7Pjs7Ozs7Ozs7Ozs7Ozs7N/f7OzZ5ubm +2ebm5ubm2dnZ2dnZ2dnZ2dnNzc3Nzc3NzcBdUHZ2doJvb3x8Y2N2dmN8fGNjdmldaWlXY29QGAAAAAAAAAAAAIKhoaGhtIgYAAAAAAYYDAwMGBgYJSUlPlBQUGNvY3aPj4KVoY+bp5uIoaGPj6GVgpWhgoKhoYihrpWVrqGIoa6Vla6ulaG0oZW0tI+ntKGh +tLSVrq6Vla6hfIiIiHaVgldKSldjfHxpaXyPj66um5ubgm+VroiIrq6brq6IiIiIiKG0lWmIoZWnp6enp6ebm4h2m7rHx8fH09PT39/f39/f09PH09PT09/f7Ozs7Ozs7Ozs7Ozs7Ozs7N/f39/f39/f39/f39/f39/f39PT09PT09PT09PH09ObSl1viHZp +dnZpaXx8Y3Z2aWl8fGlpdmNjb2NXMQYAAAAAAAAAAACCoaGhobR2GAAAAAASEhISEhISEhISEhISEhISHys3N0pXSldvb2+Cm4iIoaGIm6ePj6GhgpWhiIihoY+htKGVrq6VobShla6ulaG0p5WurpuntLSVrq6VobS0la6uj3xpXV1pfGlpfG9vlaGVobqh +doKVlZWhoY+hrqGPoY9piJWCgoKCgqG0oZWurpWntKGPoaGVp6ebm6e6usfHx8fH09Pf39/f09PT08fT09Pf7Ozs7Ozs7Ozs39/s7N/s7NnZ5ubZ2dnZ2ebZ2dnZ2dnZ2c3Z2cfH09PHXURvfG98iHZ2goJpdoJpaXZ2Y2N2Y1d2dmNvYxgAAAAAAAAAAAAA +dqenp6e6bwwAAAAADAwMDBgYGBgYGBgYGBgYGBgMGBgMDBgYGCU3NzdXY1dpfHx8j5uIlaenj6enj5uuoZWnp5WVrqGPoa6Vla6ulae0oaG0tI+uuqGhuq6VrrqhobShiJWhiHyIiGl2m4+Pp7SViIhvfKGhiKG0oaGum3x8iIh2j49jgq6ulae0laG0oY+h +rqGhrqGPoaGPm66urq66urq6usfH09PT39/f09PHx8fHx9PT39/f3+zs39/s7N/f39/f39/f39/f39/f09PT09PT09PT08fToURdaWmIfGl8fGlpgnZjdnZjY3ZpXW9vY2Nvbz4SAAAAAAAAAAAAAIKhoaGhtF0SAAAABhgYGBgYGBgYDBgYGBgYGBgYGBgY +GBgYGBgYDBgYGBgYGBglPj5KY2NjfI+CgqGhiKGuoY+np4+hrpuPp6ePoa6hla6ulaG0oZW0tJWnuqeVrrqbp7quobq6m5uurpW0tJunp4+Cla6bj6enj6e0j4+PgoKCj49piKGPp7Sbm66uj6GIb4inp4+hrqGVrq6Poa6hla6uoa6uoa7Hx8fHx8fT09PT +08fHx8fHx9PT09/f39/f39/f39/f39/f39/f39/T09PT09PT09PTx2k+Y4KCaXx8b2+CgmN2gm9jdnZjb29jY3ZpaWklAAAAAAAAAAAAAAB8oaGhrq5KBgAAAAAMDBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYJSUlPkpKV29vb4iI +iJunp4+np5WVrqGPp6eVoa6ula66m5u0tJW0tKGhuq6Prrqhobq6obTAoaG0tJWuuqenurqhrrqbm5uPb4KVdoKCb3ybtKGVrq6Vp7SPY3yhj6Gum4+np4+brqGPp6ePoa6hj4+hlae0tLS0x8fHx8fHx8fT08fHx8fHx9PT09PT39/f39/f39/f39PT09PT +09PT09PT06E+V3Z2doJvb3x8Y298b2N2dmNjdmlddnZjY3ZQEgAAAAAAAAAAAAAAgqGhoa6hMQAAAAAAGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAwYGBgYJTExMUpdXWmIfHyhoY+hrqGVrq6PobShla6ulae0oZW0tJuu +x66hurqhobqhobS0lafAp5W0tJunuq6btLSPobSnj6Gudnanp5WurpubtLSVlZWVlbquiJWnlZWuro+hrpubrq6Poa6bm6enj6GhlZWurq66urrHx8fHx9PT09PHx8e6x8fH09PT09Pf39Pf39PT09PT09PT09N2PldviIhpfHxpaXx8Y298Y2N8b2N2dmNj +b29dMQwAAAAAAAAAAAAAAIKnp6e0jyUAAAAAABISEhISEhISEhISEhISEhISEh8fHx8fHx8fHx8fHx8fHx8SHx8fHx8fHx8fHx8fHxISEhISEhISEjE+PlBjY2OIiIiIrqGVp6ePoa6hj6GhiJWuoY+urpuntLSVrrqhobqula6uoaG0tI+uupubtLSVrrqh +oaGhla66oaG0tJWhlWlpoaGPoZVvfKGhj6GulZWnp4+hrqGVp6eIoa6hj6eniJWniHyPp6enurq6urq6x9PT08fHx8e6urrHx8fT09PT09PT09PT09OuSj52dnZ2iG9vgnZpdoJpaXx8Y2N2Y2N2dl1vVxgAAAAAAAAAAAAAAACCoaGhtHwYAAAAAAwYGBgY +GBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYJRgYGBgYGBglJTFKV1dpgnZ2m5uIoaGPj5uPfJWhiIibj3yVp5WVtLSPp7ShobS0lae6p5u0tJWnuqebtLSbp7qum7S0m6e0lW9vlZWhtKGCj6GPm7Shj6enj4+n +m4ihoY+PtKePoa6VlaeViJWhiIihoY+hoZWhoaGuurrH09PH09PHuse6urrHx8fZ2dnZ2dnZgkpdaXyIdml8fGl2iHZpfHxpaXxvY3Z2XV12djcSAAAAAAAAAAAAAAAAdqGhoaFdEgAAAAAGEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIf +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fEhIfHx8rKytEXV1pgoKCj6GPj6GVfHyVfG+Pj3yIoY+Poa6VobSnla66m5u0tI+0tKGhtLSVrq6hobS0laenlaG0tI+ntKGhrqGPoa6bj6enj4+PgoKnp4ibp4+PoaGIm6ePj6GhiJWnlZWnm4iVoZWV +oaGhobrHx8fHx8fHurq6urrHx8fZtFc+Y4iIb4KCdnaCdml2dnZpfHxjdnZpaXZ2Y2MlAAAAAAAAAAAAAAAAAIinp49vJQYGBgYGEhISEhISEh8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f +Hx8fHx8fHx8fHx8fPkpKV2lpaYihiIihlXyPj3x8iIhviJWIiKGhiKG0oZWuro+htKentLSVp7S0lbS0m6e0p5uuuqGhtLSVrq6Voa6hj6GhfIihoYihoZWVp6eIm6ePj6GhiJunj4+bm3ybm4iIm5uCj498iHx8obTAwMDAwMDAtLS0p2k3XYh8b4KCaXyI +dnZ2gmNvfG9jdnZjY3xvY28+DAAAAAAAAAAAAAAAAACIlYJdNxgGBgYGBhISEhISEhISEhISEhISEhIfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHxISEhISEjElMURXV1d2doKVlYiI +lYh2j498fJuIdo+biIihlYihrpubtLSVrrqhobS0j6e0oaG0p5WntKGVrq6Poa6bj6enj6GhlYinp4+hoY+Cm5uIlaePj6GhiIihj4KVlYKPoY+PoY9XY4KCdo+Poa66x8fHrnY+SmlpgoJvb4J2aXaCaWl8fGNvfGlpdnZdaXxjJQYAAAAAAAAAAAAAAAAA +dnZKKysSAAAMAAASEhISHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx83NzdjY2OClYiIoaGIm6eIiJWIdoiIiHybm4ihrqGhtLSbp7Sn +m7q6lae0oaGuro+hrqGPp6eVlaeniKGhiIinm4iIiHyPp6eIoaGPj6eniKGhiIihlXyPoYh2aYKCj5uCgoKCgo+hlXZdSld2iHZpgoJpdoh2aXx8Y298aWl2dmNjfGldShIAAAAAAAAAAAAAAAAAAEo3JRgYDAAAAAAMDBgYGBgYGBgYGBgYGBgYGBgYGBgY +GBgYGBgYGBgYGBgYGCUlJRgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYJSUYGCUlJSUlGBgYGBgYGBgYGBgYGBgYGBgYDBglJSVEV1djfHx8laGPm6enj6GhfHyPfG+PoYiVrqGVrrqhobS0la6uoaGuoY+hrpWVp6eIoaGPj6GhiJuniHaV +oYibp4+PoaGClaGPj6GVgo+hj4+PY1d8lYh8lZWCj4+Cdoh8b4KPgm+IiG98iHxpgoJpaXx8Y3Z2Y2N2aVdvYyUGAAAAAAAAAAAAAAAAAAAfHwwYKwwAAAAAAAwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBglGBgYGBgYGBgYGBgYGBgYGBgYGBglJRgY +GBgYGBgYGBgYGBgYGBgYJSUlJRgYGCUlJSUYGBgYGBgYGBglJRgYGBgYJSUlJSUlJSUlGBgYGBgYJSU3V2NjfJuPj7SniIiVfHyPj3aIoYiIp6ePoa6hlbS0j6e0oY+np4+bp5uPp6eIlaebiKGhj4+nlYihoYiIp5WCoaGIiKeVgpubb1B8iHaPj3yIlZV8 +iJWCgo+Pb4KPdnaIiGl8iG9vgoJjdoJpaXx8Y2N2Y0oYAAAAAAAAAAAAAAAAAAAAEhIlJRgMDAAMDAwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBglJSUYGBgYGCUlJSUlJSUYGBgYJSUlJSUlJSUlJSUlJSUYGCUlJSUlGBglJSUlJSUlJSUY +GCUlJSUlJSUlJSUlGCUlJSUYJSUlJSUYAAAAAAAAGBglSmNjdo+Pj6enj5unj4KVlXaIm4iIoaGPj66hlaenj4+uoYihoY+Pp5uIoaGPj6GViJuniIihlYKVoYiIoZV8j6GIiGlpdoiViHyVlXyIm4KCj492do92aYKCaXaCdmmCgml2gm9jdnZjY3xvY28+ +EgAAAAAAAAAAAAAAAAAAABIrGBgYBgYGBgYGEhISHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwwMDAwMAAAM +AAAMDBglN1djY4+Pj6e6oaG0p4ibm4KCj4+ClaGPj6eniKGum4+hoYiVp5WIoaGIlaePj6Ghgo+hj4+bm4iIoY+ClYhKaZWIfI+PfIiVgnaIiHZ2j49viIhvb4h8aXx8b2+Cdml2dmNjfG9jb29XJQwAAAAAAAAAAAAAAAAAAAAYGCUSEhIGBgYGBhISEhIS +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8MDAwMDAwMDAwMAAAAAAAADBgYJUpKV3x8iJWnp5Wnp4iIoYh8lZV8 +iKGPj6GhiJWnlYihoYiIp5WIoaGIiKGPgpWhiIihj4KVoYhpaYKCj6GCgpubfI+PfHyPj2+IiHZ2iIhvfIh2doKCaXaCb298fGNjdmlpUBgGBgAAAAAAAAAAAAAAAAAAGBgAABIAAAAAABISEhISEhISHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fDAwMDAAMDAwADAwMAAwMDAwMAAAAAAwMHx8xPldpaXaPj4+hoY+PoZV8j5uCgqGVgpWhj4+np4iVoY+PoaGCj6GIiJubgo+h +iIiIaWmCm4h8j498iIiIfI+PdoKPgnaIiG98iHZpfHxpdoJ2aYKCaXZ2dmN2djESAAAAAAAAAAAAAAAAAAAAAAwMABglDAAADAwMGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBglJSUlGBgYGBgYGBgYGCUlJRgYGBgYGBglJRgYJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlGAwMDAwAAAAADAwMDAwMDAwMDAAMDAwAAAAAAAAAABIfHz5XY2OCgoKVoY+PoZV8iJuIfJWVgo+hj4+bm4KPoY+Cm5uIiKGPgpWVfG+VlYKVlYKClYh8iJV8fI+Pb4iIfHyPgml8iG9v +fHxjdoJvb3x8aWl8b1AlBgYGAAAAAAAAAAAAAAAAAAAGBh9XPgwADAwMDBgYGBgYGBglJSUlJRgYGCUlJSUlJSUlGBgYGBgYJSUlJSUYGBgYGBgYGBglJSUlJSUlJSUlJRgYJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJRgMDAwMAAAMDAwMDAwADAwMDAwMDAwMDAwMDAwMDAwMDAwAAAwYGCU3SldjfHx8j5uIiKGPfIiVgoKPj3yPoYiIoaGCj6GIiJWVfI+biIibm4KPj498lZV8fJWCdo+PdoKVgnaIiG98iHxpgoJpdoJ2aXZ2aWkxEgYGBgYAAAAAAAAAAAAAAAAA +DDFpiD4SEgYGBhISHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYG +BgYGBgYGBgYGBgYGBgYGBgYGEhIlRERXaXZ2iJuIiJWVdoibiHyPj4KPoY+Cm5uIiKGIfJWVgoKbj3yPj3x8j4J2j4+Cgo+PdoiIfHyIiG98fGlpfHxpfHxpaXxXHwwAAAAAAAAAAAAAAAAAAAAAADdpfHw+EgYGBgYSEhISEh8fHx8fHx8fHx8fHx8fHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fKysfHx8fHx8fHwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAwMDAwMDAwMDAwYJTE+V29v +b4+Pdo+PgoKViHyPoYiIoaGCj6GIiJuPgo+bgoKVlXaIiHx8j492go98fIiIb2+Idml8fGN2gm9vfHxjRB8MDAAAAAAAAAAAAAAAAAAAAABjfHxvMQwMDAwMGBgYGBgYGBgYGBgYGBgYGBgYGBgYJSUlJSUYGCUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJRgMDAwMDAwAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAADAwMJT4+V29vb4KCdoKbiIibm4KPoY98lZV8iJWCgo+PfHyV +iHaIiHx8j4JviIh2doiIb4iIb2+CgmN2dmlpaSUSBgYGBgYAAAAAAAAAAAAGBgAAY29jYzEMAAwMDBgYGBgYGBgYJSUlJSUYGCUlJSUlJSUlJRgYJSUlJSUlJSUlJSUxJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUYDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwMAAwYJTE+SmlpaXyIdoKVlYKVoYiIm498j498fJWIdoiVgoKPgm+IiHx8j49vfIh2doKCaXx8b298fEofDAwM +AAAAAAAAAAAAAAAAAAAAAFdXV1clEgYGBgYYGBglJSUYJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlGAwMDAwMDAwM +DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMJTExRFdjV2mCdnaIiHaIlYJ2j49vfI98fI+PdoKPgm+IiG98j3xviIhpdoh2aXx8aWk3GAwMDAAAAAAAAAAAAAAAAAAAAABKY2NXJRIAABISEh8fHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHxISEhISBgYGBgYGBgYGBgYGBgYGBgYSEhISEhISEhISEgYGBgYGEhIS +EhISEhISEgYGBgYGBhISEhISEhISEhISBgYGBgYGGCUxMUpdXV12dnaCgnZ2iIhvgoJvb4h8b4iIfHyPj2+CgnZ2goJpfHxvb4JXJRgMDAwAAAAAAAAAAAAAAAAAAAAASldXVyUMAAASEhIfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHysrHx8fDAwADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwA +AAAMDB8rK0pdXV1paV12dnZ2dnZjb3xvb4iIdnaPfHyIiG9vgnZpfHxpPhgGEhISBgYGBgAAAAAAAAYGBgYAAERXV0olDAAAAAwYGBgYGBgYGCUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlGAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBglJTdKV0pjY1djb29jb29jb4KCb4iI +dnaCgmmCgml2aSUMDAwMAAAAAAAAAAAAAAAAAAAAAABEV1dXJQwMDAAMGBgYJSUlGBgYGCUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUxMTElJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJRgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAABglJTFKSj5XV1dXb29XaXxvb4iIb3yIb298fEoYDBgMDAwAAAAAAAAAAAAAAAAAAAAA +RFBQUCUMDAwMDBgYJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlMSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlMSUlJSUlMTElJSUxMSUlJSUlJSUlJSUlMSUYDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM +DAwMDAwMDAwMDAwMDAwMDAwMGAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAwfMTE+SkpKY2NXY3x8b4KCb2+Cgl03DAwMDAwMAAAAAAAAAAAAAAAAAAAAAERXV1cYBgYGBgYYGBgYGBgYJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlMSUlJSUlJSUlJSUlJSUxMTElJTElJSUlJTExMSUlJSUlJSUlJSUlJSUlJSUlJSUlEhISEhISEhISEhISEhIGBgYGBgYGBgYSEhISEhISEhISEhISEhISEhISEhISEgYGEhIGEhIGBhIS +EgYGBgYSEhISEgYGEhIGBhISEhISBgYGEhISEhISEhISBgYGBgYYGCU3NzdEXV1daYJvb4KCaXZjJQYGBhISAAAAAAAAAAAAAAwMDAAAAABEUFBQJQwADAwMHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHysrKysrKysrKysrKysr +KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrHxISEhISEhISEhISEhISEhIGBhISEhISEhISEhISEhISEhISEhISEhISEhISEhISBgYSEhISEhISEhIGBgYGBhISEhISBhISEhISEhISEhISEhISEhISEhIS +EhISEhISBgYGBhIlMTE+UFBQb3xvb4JvShgAAAwMDAwAAAAAAAAAAAAAAAwMDAAARFdXVyUMAAAAEh8fHx8fHx8fHx8fHx8fHx8rKysrKysrKysrHysrKysrKx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHzElJSUlJSUlJSUlJSUlJSUlJSUlJTEl +JSUlJSUlJSUlJSUlMSUxJSUlJSUlJSUSEhISEhISEhISEgYSEgYGEhISEhISEhISEhISEhISEgYGEhISEhISBgYGEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEgYSEhISEhISBhISEhISEhISEhISEhISEhIGBgYYJSU3SldXdmNjYz4SAAASEhIG +BgYGBgYAAAAGBgYGBgYAAERXV1crDAAMDAwYGBgYGCUlJSUlJSUlJSUlJRglJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUxJTExMSUlJSUlMTElMSUlJTExJTElJSUlMSUxMSUxMTElJSUlJTExJSUlJSUlMTElMSUlJSUlJSUlEhISEhISEhIS +EhISBgYGBgYGBhISEhISEhISBhISEhISEhISEhISEhISEhISEhISEhISEhISBgYGBgYSEhISEhISEhISEhISEhISEhISEgYGEhISEhISEhISAAwMDAwMDAwMDAwMDAwYGBg3Nzc3Sj4fBgYGBgYGBgYGBgYAAAAAAAAMDAwMAABEV1dXMRISAAwYJSUlJSUl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlMSUxMTElJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUxMSUlJSUlJSUlJTExMTExMSUlJSUlJSUlJSUlJRISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIS +EhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISBgYGBgYGEhISEhIfHx8fDAAAAAwMDAAAAAAAAAAAAAAMDAwMDAAASldXVz4YDAwMGCUlJSUlJSUlJSUlJSUlJSUlJSUxJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJTElMSUlJSUlMTExJTExJSUxJSUlMSUlMTElJTElMSUxMTExMTExJSUlMTExJSUlJSUlJTExMTExJSUxJTExMR8SEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIS +EhISEhIGEhISEgYSBgYGEhISEhISEhISEhISEhISEhISEhISEhISEgYGAAAMDAwMAAAAAAAAAAAADAwMDAwAAERXV1c+GAwMDBgYJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUxMSUlJSUlJSUlJSUlJSUxJTElJSUl +MSUlJSUlJTExJSUlJTExJSUxJSUxMTExMTElJSUlJTExJSUlJSUlEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEgYSEhISEhISEhISEhISEhISEhIS +EhISBgYGEhISAAAADAwMDAwMDAAAAAAAAAwMDAwMAAA+V1dXRBgGBhIfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr +KysrKysrHx8MDAwMDAwMDAwMDAwMDAwMDAwMDBgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYGAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBgGBgYSEhISBgYABgYGBgYGBgYGBgYGBgYGBgYGBgAA +PlBQXUoYDAwMGBglJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJTElJSUxJSUlJSUxMTElMTElMTElMSUlJSUxJTExMTExMSUlJTElMTExMSUxJTExJTExJSUlJSUlJSUlMTExMR8SEhISEhISEhISEhISEhISEhISEhISEhIS +EhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIGEhIGEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIGEgYGBhISBhgMDAwYGAwAAAAMDAwMAAAAAAAAAAAAAAAMDAwAAEpXV2NEGAwMDB8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f +Hx8fHx8fHx8xJSUlJSUlMTExJTElMSUlJTElJTExJSUlJSUlJSUlJSUlJSUlJSUxJTExJSUxJSUlJTElMTExMTElMSUxJSUlMSUxMSUlJTExMSUlMSUYGBgMDAwMDAwMDAwMDAwYGAwMDAwMDAwMDAwMDBgYGAwMDAwMGAwMGAwMDAwMDAwMDAwMDAwMDAwM +GAwMDAwMDAwMDAwMDAwMDAwMDAwMGBgYDAwMDBgYDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBgGBgYGEhIGBgYGBgYGBgYGBgYGBgYGAABKV2NjSh8SEhIlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUxMSUxJSUxJSUlJSUlJSUlJSUl +MTExMSUlJSUxMTElMTElJSUxJSUxMTExMSUlMSUlMSUlMTElJTExMTExJSUxMTExMTExJSUxGAwMDAwMDBgYGBgYGBgYGBgMDAwYGBgMGBgYDBgYGBgYGAwMDAwMDAwMDAwMDAwMDAwMDAwYGAwMDAwMDAwMGAwMDAwYGBgMDBgYDAwYDAwMDAwMDAwMDAwM +DAwMDAwMDAwMDAwMDAwMDAwMDAwMDBgYBgYABgYSEgYGBgYGBgYGBgYGBgYGBgAASmNjY1AfDAwYJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJTElJSUlJSUlMSUxMSUxMTElJTExJTElJSUxMSUlJSUlJSUlMSUlMTExJTElJSUxJSUlJSUx +MTExMTElJTEYAAAAAAAAACsrKysrKx8SEhISEhISEhISEhISEhISEgYGBgYGBhISEhISEhISEhISEhISEhISEhIGBhISEhISEhISEhISEhISEhISEhIGBhISBgYGBgYGBgYGBgYGEhISEhISEhISEhISBgYSEgYSEhISEgYGBgYGBgYGBgYSEgAAAAAMDAwA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHx9PT39/s7Pj4//////// +////////////////AAAAAAAADAwYGCUlMTE+PkpKV1djY29vfHyIiJWVoaGurrq6x8fT09/f7Oz4+P///////////////////////wAAAAAAAAwMGBglJTExPj5KSldXY2Nvb3x8iIiVlaGhrq66usfH09Pf3+zs+Pj/////AA== +--mail.sleepy.sau.144.8891 + + +The digitizer does 64 gray levels at any of: + 256 x 244 (included) + 128 x 122 + 66 x 61 + +At 19.2k baud (it uses an rs232 interface) it takes up to 32 seconds to +fetch the image (with no compression). The lower resolutions take +8 and 2 seconds respectively. +--mail.sleepy.sau.144.8891-- + + +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: More Imagery + +Received: from hanna.cac.washington.edu by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA29595; Thu, 3 Oct 91 13:05:05 -0700 +Received: from thumper.bellcore.com by hanna.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA19384; Thu, 3 Oct 91 13:04:49 -0700 +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id <AA12304> for MRC@CAC.Washington.EDU; Thu, 3 Oct 91 16:04:44 EDT +Received: by greenbush.bellcore.com (4.1/4.7) + id <AA08989> for MRC@CAC.Washington.EDU; Thu, 3 Oct 91 16:04:43 EDT +Received: from Messages.7.14.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.40 + via MS.5.6.greenbush.galaxy.sun4_40; + Thu, 3 Oct 1991 16:04:42 -0400 (EDT) +Resent-Message-Id: <EcurTOC0M2YtQTa2QW@thumper.bellcore.com> +Resent-Date: Thu, 3 Oct 1991 16:04:42 -0400 (EDT) +Resent-From: Nathaniel Borenstein <nsb@thumper.bellcore.com> +If-Type-Unsupported: send +Resent-To: Mark Crispin <MRC@CAC.Washington.EDU> +Return-Path: <sau@sleepy.bellcore.com> +Date: Fri, 7 Jun 91 09:09:05 EDT +From: sau@sleepy.bellcore.com (Stephen A Uhler) +Message-Id: <9106071309.AA00574@sleepy.bellcore.com> +To: nsb@sleepy.bellcore.com +Subject: meta-mail +MIME-Version: 1.0 +Content-Type: MULTIPART/MIXED;boundary="mail.sleepy.sau.158.532" + +--mail.sleepy.sau.158.532 + +2 Questions: + +1) MM_QUIET doesn't seem to work in the 212 version of metamail. + +2) I've been pondering how I am going to send you this 40mb mail message. + I was going to split it up using the "parts" mechanism, but then it occurred to me. + My software has no business worrying about message size. Its up to the mail + delivery agent to do that form me. I should be able to compose a very + long message, and pass it off to sendmail (well, a pre-processor to sendmail). + if the message is too long, based upon the src/dst etc, then sendmail should + break it into multiple parts for me, and send it as multiple messages. As the + user (sender) I should be unaware this is happening. + + Similarly, on the receiving end, the separate parts should be assembled as they + arrive; I shouldn't have do deal with them at all as multiple messages. + + I guess what I am proposing are two utility programs: + + msplit <max_lines> <max_bytes> + + that takes 1 mail message and splits it into N messages and + + mcombine <parts...> + mcombine <partially_assembled_thingy> <parts...> + + that any mail system can call to achieve a uniform mechanism of splitting + and recombining messages, Kind of like: +--mail.sleepy.sau.158.532 +Content-type: image/pbm +Content-transfer-encoding: base64 +Content-Description: Mail architecture slide +Comments: Image wrapped by /usr/sau/bin/fetch_image + +UDQKNzk4IDUzMgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAB////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAP///////////AAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////wAAAD////gAAAAAAAAAAAAAAAAAAAAAAAAAEAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///gAAAAAAH///gAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//wAAAAAAAAA///AAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+AAAAAAAAAAAf//AAAAAAAAAAA +AAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//wAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAA +AAAAf/4AAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AP/gAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAfAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAABwAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAA +AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAeAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAHgC4AAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAABcAuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAA/4 +AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAXATgHgdB0DwDwB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAF4E4GMIwjBGB +HxjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAABOCODBmEYQwwwwwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAA +AAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAATwjggZgGAMMMMIGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAEcQ4f+eB4ADDDH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAABHkOGAD4PgHwwxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAQ6DhgAPA8HMGIYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAEPg4YAA4DjDA8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAABBwOHAUGQZgwQBwEAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAQcDg4JBkGYMMAOCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAA +AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAECA4P8YRhHPz/j/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAHwg/g8F4Xg+Yf8PAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAA/wAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAABgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAEAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+ +AAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAQEAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAfwAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAwBwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAHQRwME/v4HgJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAACM9/DPDAwGMe8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAIkAAAAAAAAAAAA +AAAAAAAAAAAAAABhDgwwwwMDBhyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAYAwOMMMDAgYYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAHgMBjDDAwf+GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAA +AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAA+DAYwwwMGABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAADwwGMMMDBgAYAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAOMBjDDAwYAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAPwAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAABBjAwwwwMHARgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAQYwMMMMDA4IY +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAGEOGDDDIyP8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAABeDeD/8cHA8H4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwA +AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAD8AAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAIkAAAAAAAAA////////////4AAAAAD////////////gAAAAAB////////////wAAAAAAAAAAAAAAB+ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAjAAAAAAAAAf////////////AAAAAB////////////8AAAAAA////////////+AAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAEAA +AAAAAAAH////////////wAAAAAf////////////AAAAAAP////////////gAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAEUAAAAAAAAB////////////8AAAAAH////////////wAAAAAD////////////4 +AAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAPwAAAAAAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAA +AADwAAAAAAAAAAB4AAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAB8AAAAAAAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAACMAAAAAAAAB4AAAAAAAAAAA8AAAAAH +gAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAQAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAAA+AAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAARQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAIkAAAAAAAAB4AA +AAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAjAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAA +AAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAEAAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAA +AAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAA +AAAAeAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAfgAAAAABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAA +A8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACMAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAQAAAAAAAAAeAAAAAAAAAAAPA +AAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAARQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAA+AAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAIkAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAjAAAAAAA +AAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAEAAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAA +AAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AHwAAAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAA +AAAAAAAAAHgAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAB8AAAABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAA +AAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAACMAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAQAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAARQAAAAAAAAHgAAAAAAA +AAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAIkAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAfAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAjAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAEAA +AAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4 +AAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAA8AAAAIwAAAAAAAAHgAAAAAAAAAADwADwAAeAAAAAAAAAAAPAAB4AAPAAAAAAAAAAAHgAAAAAAeAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAABAAAAAAAAAB4AAAAAAAAAAA8AB/AAHgAAAAAAAAAADwAA/ +gADwAAAAAAAAAAB4AAAAAAP4AAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAABFAAAAAAAAAeAAAAAAAAAAAPAAf+AB4AAAAAAAAAAA8AAP/AA8AAAAAAAAAAAeAAAAAAD/wAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAfAAAAiQAAAAAAAAHgAAAAAAAAAADwAH/4AeAAAAAAAAAAAPAAD/8APAAAAAAAAAAAHgAAAAAA//AAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAACMAAAAAAAAB4AAAAAAAAAAA8AA//wH +gAAAAAAAAAADwAAf/4DwAAAAAAAAAAB4AAAAAAH/+AHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAQAAAAAAAAAeAAAAAAAAAAAPAAD//B4AAAAAAAAAAA8AAB//g8AAAAAAAAAAAeAAAAAAAf/4B4AAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAARQAAAAAAAAHgAAAAAAAAAADwAAP/+eAAAAAAAAAAAPAAAH//PAAAAAAAAAAAHgAAAAAAB//w+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAIkAAAAAAAAB4AA +AAAAAAAAA8AAAf//gAAAAAAAAAADwAAAP//wAAAAAAAAAAB4AAAAAAAD//PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAjAAAAAAAAAeAAAAAAAAAAAP//////4AAAAAAAAAAA///////8AAAAAAAAAAAf/////////// +wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAEAAAAAAAAAHgAAAAAAAAAAD//////+AAAAAAAAAAAP///////AAAAAAAAAAAH///////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeA +AAEUAAAAAAAAB4AAAAAAAAAAA///////gAAAAAAAAAAD///////wAAAAAAAAAAB///////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAACJAAAAAAAAAeAAAAAAAAAAAP//////4AAAAAAAAAAA///////8AAAAAAA +AAAAf///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAIwAAAAAAAAHgAAAAAAAAAADwAAA//+AAAAAAAAAAAPAAAAf//AAAAAAAAAAAHgAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAPAAABAAAAAAAAAB4AAAAAAAAAAA8AAB///gAAAAAAAAAADwAAA///wAAAAAAAAAAB4AAAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AABFAAAAAAAAAeAAAAAAAAAAAPAAD//x4AAAAAAAAAA +A8AAB//48AAAAAAAAAAAeAAAAAAAf/+eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAiQAAAAAAAAHgAAAAAAAAAADwAD//geAAAAAAAAAAAPAAB//wPAAAAAAAAAAAHgAAAAAAf/8HgAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAACMAAAAAAAAB4AAAAAAAAAAA8AB//gHgAAAAAAAAAADwAA//wDwAAAAAAAAAAB4AAAAAAP/8D4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAQAAAAAAAAAeAAAAAAAAAAAPA +Af/AB4AAAAAAAAAAA8AAP/gA8AAAAAAAAAAAeAAAAAAD/4A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAARQAAAAAAAAHgAAAAAAAAAADwAH+AAeAAAAAAAAAAAPAAD/AAPAAAAAAAAAAAHgAAAAAA/wAPAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAIkAAAAAAAAB4AAAAAAAAAAA8AA8AAHgAAAAAAAAAADwAAeAADwAAAAAAAAAAB4AAAAAAHgAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAjAAAAAAA +AAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAEAAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAA +AAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAPAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAA +AAAAAAAAAHgAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAHgABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAA +AAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAACMAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAQAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AARQAAAAAAAAHgAAAAAAA +AAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAIkAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAB8AAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAjAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAEAA +AAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4 +AAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8ACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAPAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAA +AADwAAAAAAAAAAB4AAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+ABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAHgAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4ACMAAAAAAAAB4AAAAAAAAAAA8AAAAAH +gAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAQAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAD4AAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwARQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AIkAAAAAAAAB4AA +AAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAjAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAADwA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEAAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ++AEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgCJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAA +AAAAeAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAeABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgBFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAA +A8AAAAAA8AAAAAAAAAAAeAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPACMAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAQAAAAAAAAAeAAAAAAAAAAAPA +AAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8ARQAAAAAAAAH////////////wAAAAAf////////////AAAAAAP////////////gAAAAAAAHwAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgIkAAAAAAAAB////////////8AAAAAH////////////wAAAAAD////////////4AAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AjAAAAAAA +AAf////////////AAAAAB////////////8AAAAAA////////////+AAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAEAAAAAAAAAD////////////gAAAAAP///////////+AAAAAAH////////////AAAAAA +AAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAB4CJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAA8BFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwCMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4IkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAwQAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgEAA +AAA/gfAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPkAAAAADwAAAAAM8AAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4EUAAAADgBAAAAAAAACAAAAAAAAQAAAAAAAAAAAAAAAAAAAAOHAAAAAAMAAAAAA +DAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeCJAAAAA4AQAAAAAAABwAAAAAAAEAAAAAAAAAAAAAAAAAAAADAwAAAAADAAAAAAAwAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAHgIwAAAAOAEAAAAAAAAcAAAAAAADAAAAAAAAAAAAAAAAAAAABwEAAAAAAwAAAAAAMAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4BAAAAADgBAAAAAAAALgAAAAAABwAAAAAAAAAAAAAAAAAAA +AcBAAAAAAMAAAAAADAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeBFAAAAA4AQOgPATAAC4APAHgTw/gAAAAAAAAAAAAAAAAAAAHgAHgTwB7BOHAPAQwAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAHwiQAAAAOAEEYMY94ABHAEfGM9+DAAAAAAAAAAAAAAAAAAAAA+AGM9+Bhz334EY8MAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8CMAAAADgBDCGDDkAARwDDDBjhwwAAA +AAAAAAAAAAAAAAAAAH4DBjhwwMOPHDDDDAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAQAAAAA4AQwBAwwAAIOAwwgYwMMAAAAAAAAAAAAAAAAAAAAAfggYwMMDDBgwwwwwAAAAADwAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwRQAAAAOAEPA/8MAACDgMMf+MDDAAAAAAAAAAAAAAAAAAAAAB8f+MDGAwwYMAMMMAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IkAAAADgBB8MAD +AAB/8DDGADAwwAAAAAAAAAAAAAAAAAAAAAHmADAxgMMGDAfDDAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAjAAAAA4AQHjAAwAAQHAYhgAwMMAAAAAAAAAAAAAAAAAAAAAA5gAwMYDDBgwcwwwAAAAADwAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwEAAAAAOAMAcwAMAAIA4DwYAMDDAAAAAAAAAAAAAAAAAAAABAOYAMDGAwwYMMMMMAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +A8EUAAAABwCCDOAjAACAOBAHATAwwAAAAAAAAAAAAAAAAAAAAYDnATAxwMMGDGDDDAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPCJAAAAAcBggxwQwABABwwA4IwMMAAAAAAAAAAAAAAAAAAAAGAw4IwMMHD +BgxgwwwAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwIwAAAADxwMIf4MAAQAcP+P8MDDIAAAAAAAAAAAAAAAAAAAA4cP8MDD+8wYMc/MMAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAA8BAAAAAAPwC8B4PwAfAfx/w8Pz4cAAAAAAAAAAAAAAAAAAAAL8A8Pz4PI/fvj5v/wAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPhFAAAAAAAAAAAAAAAAAAwMAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4iQAAAAAAAAAAAAAAAAAYDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeCMAAAAAAAAAAAAAAAAAGAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgQAAAAAAAAAAAAAAAAABwwAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4RQAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAHiJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAHhFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAB/gA/wAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAeCMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAH4ADwAA +AAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAHgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAA/AAYAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAB4RQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAH4AGAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAeIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAA +AAAAAAAAAB/ABgAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAHgjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAfwAYAAAAQAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAB4EAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAG+AGAAAAEAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAeEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAeAAAAAAAAAAAAAAAAABnwBgAAADAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAHiJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAY+AYAAABwAAAAAAAAAADgAAAAAAAAAAAA +AAAAAAAAAAAB4IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAGHwGAD4A8AAAAAB+ABjg4AAAAAAAAAAAAAAAAAAAAAAAAeBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAABh8BgDjg/9+P4fhx4H58OH8AAAAAAAAAAAAAAAAAAAAAAHhFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAYPgYBgcBwPB4Bw4HA +OnDgcAAAAAAAAAAAAAAAAAAAAAAB4iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAGB8GAYDAcBwOAYcB4Dxg4MAAAAAAAAAAAAAAAAAAAAAAAeCMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAABgPhgMA4HAeDwEHAOA8AOGAAAAAAAAAAAAAAAAAAAAAAAHgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAY +B8YDAOBwDgcDDgDwOADjAAAAAAAAAAAAAAAAAAAAAAAB4RQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAGAfGB//gcA4HAg4AcDgA5gAAAAAAAAAAAAAAAAAAAAAAAeIkAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAABgD5gcAAHAPD4YOAHA4AOwAAAAAAAAAAAAAAAAAAAAAAAHgjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAA +AAAAAAAAAAAAAAAYAfYHAABwBwuEDgBwOAD8AAAAAAAAAAAAAAAAAAAAAAAD4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAGAD+BwAAcAcbjA4AcDgA/gAAAAAAAAAAAAAAAAAAAAAA +A8EUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAABgAfgcAAHAHk8gOAHA4AO8AAAAAAAAAAAAAAAAAAAAAAAPCJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAADwAAAAAAAAAAAAAAAAAYAH4HAABwA7HYDgBwOADngAAAAAAAAAAAAAAAAAAAAAADwIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAGAA+B4AgcAOh0A8AcDgA48AAAAAA +AAAAAAAAAAAAAAAAA8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAABgAHgOAIHAD4fAHAOA4AOHgAAAAAAAAAAAAAAAAAAAAAAPBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAYAA4DwEBwgcDgB4DgOADg8AAAAAAAAAAAAAAAAAAAAAADwiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAGAAGAfHAeIHA +4AOBwDgA4HgAAAAAAAAAAAAAAAAAAAAAA8CMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAADwABgD/gD8BgMAB44B8AfA8AAAAAAAAAAAAAAAAAAAAAAPAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAD/AAIAPgAeAIBAAH4B/wf8/wAAAAAAAAAAAAAAAAAAAAADwRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4EUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAeCJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAeBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4CMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAEAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4CJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAeAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4BFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAeAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgCMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8ARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAIkAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +eAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgCJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA+ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8ACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAA8ACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAB4ABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAEAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAADwAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAPgAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAIkAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA +AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAeAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAIkAAAAAAAAA//////////////////8AAAAAAAAAP//////////////////AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAjAAAAAAA +AAf//////////////////gAAAAAAAAH//////////////////4AAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAEAAAAAAAAAH//////////////////4AAAAAAAAB//////////////////+AAAAAAAAA +AAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAEUAAAAAAAAB//////////////////+AAAAAAAAAf//////////////////gAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AADwAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAA +AAAAAAeAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAHgAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAA +AAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAARQAAAAAAAAHgAAAAAAA +AAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAH4AAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAEAA +AAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAA +AAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAB8AAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAA +AAAAAAAAAAAHgAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAD4AAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAe +AAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAB8AAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAARQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAIkAAAAAAAAB4AA +AAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAA +AAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAEAAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAA +AAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAA +B4AAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAB+AAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHg +AAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAQAAAAAAAAAeAAAAAAAAAAAAA +AAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAARQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAH4AAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAjAAAAAAA +AAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAEAAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAA +AAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/ +AAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAA +AAAAAAeAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAHgAAAAAeAAAAAAAAAAAAAAAAAHgAADwAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAD8AAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAH8AAAAAHgAAAAAAAAAAAAAAAAB4AAD+AAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AP/AA +AAAB4AAAAAAAAAAAAAAAAAeAAH/gAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAP/wAAAAAeAAAAAAAAAAAAAAAAAHgAH/4AAAAAAAAAAAAAAfAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgf/4AAAAAHgAAAAAAAAAAAAAAAAB4AP/8AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAARQAAAAAAAAHgAAAAAAA +AAAAAAAAAB4f/4AAAAAB4AAAAAAAAAAAAAAAAAeAP/8AAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAe//4AAAAAAeAAAAAAAAAAAAAAAAAHgf/8AAAAAAAAAAAAAAAH +4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAH//wAAAAAAHgAAAAAAAAAAAAAAAAB4f/4AAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAEAA +AAAAAAAHgAAAAAAAAAAAAAAAAB//////////4AAAAAAAAAAAAAAAAAf////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAf/////////+AAAAAAAAAAAAAAAAAH//// +////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAH//////////gAAAAAAAAAAAAAAAAB/////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAD8AAAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB//////////4AAAAAAAAAAAAAAAAAf///////////////////9+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAf/8AAAAAAAeAAAAAA +AAAAAAAAAAAHn/+AAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAH//wAAAAAAHgAAAAAAAAAAAAAAAAB4f/4AAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAfgAAAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB7//gAAAAAB4AAAAAAAAAAAAAAAAAeB//wAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAe +H/+AAAAAAeAAAAAAAAAAAAAAAAAHgD//AAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgf/4AAAAAHgAAAAAAAAAAAAAAAAB4AP/8AAAAAAAAAAAAAAAAPwAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAARQAAAAAAAAHgAAAAAAAAAAAAAAAAB4A//AAAAAB4AAAAAAAAAAAAAAAAAeAAf/gAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAIkAAAAAAAAB4AA +AAAAAAAAAAAAAAAeAD/wAAAAAeAAAAAAAAAAAAAAAAAHgAB/4AAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAH8AAAAAHgAAAAAAAAAAAAAAAAB4AAD+AAAAAAAAAA +AAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAEAAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAeAAAAAB4AAAAAAAAAAAAAAAAAeAAAPAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAA +AAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAA +B4AAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAB+AAAAAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHg +AAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAA +AAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAARQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAB+A +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAjAAAAAAA +AAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAEAAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAA +AAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAA +AAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAA +AAAAAAeAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAD+AAAAAAAAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAA +AAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAARQAAAAAAAAHgAAAAAAA +AAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAA +AAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAA +AAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAA +AAAAAAAAAAAAAAAAAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+AAAAAAAAAAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAA +AAAAAAAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAA +AAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAA +AAAAAAAAAAD/gAAAAAAAAAAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAe +AAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAD/g +AAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAARQAAAAAAAAH//////////////////4AAAAAAAAB//////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAIkAAAAAAAAB/// +///////////////+AAAAAAAAAf//////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAjAAAAAAAAAf//////////////////gAAAAAAAAH//////////////////4AAAAAAAAAAAAAA +AAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAEAAAAAAAAAD//////////////////wAAAAAAAAA//////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAA +AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAB/4A +AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAA +AAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAH/4AAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAAAAAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAB//wAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAB//8AAAAAAAAAAAAAAAA +AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8AAAAAAAAAP//wAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///gAAAAAAH///gAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////AAAAP///+AA +AAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4APAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////wAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAPADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////////+AAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAP///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAALgJwDwOg6B4B4A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAD+B8AAAAAAAAgAAAAAAAAAAAAAAAAAAAC8CcDGEYRgjAj4xgAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAOAEAAAAAAAAIAAAAAAABAAAAAAAAAAAAnBHBgzCMIYYYYYMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA +AAAAAADgBAAAAAAAAHAAAAAAAAQAAAAAAAAAAAJ4RwQMwDAGGGGEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAA4AQAAAAAAABwAAAAAAAMAAAAAAAAAAACOIcP/PA8ABhhj/wAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAOAEAAAAAAAAuAAAAAAAHAAAAAAAAAAAAjyHDAB8HwD4YYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAIwAAAAAAADgBA6A8BMAALgA8AeBPD+AAAAAAAAAAAIdBwwAHgeDmDEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAA4AQRgxj3gAEcAR8Yz34MAAAAAAAAAAACHwcM +AAcBxhgeDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAOAEMIYMOQABHAMMMGOHDAAAAAAAAAAAAg4HDgKDIMwYIA4CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAADgBDAEDDAAAg4DDCBjAwwAAAAAAAAAAAIOBwcEgyDMGGAHBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAA4AQ8D/wwAAIOAwx/4wMM +AAAAAAAAAAACBAcH+MIwjn5/x/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAOAEHwwAMAAH/wMMYAMDDAAAAAAAAAAAD4QfweC8LwfMP+HgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAADgBAeMADAABAcBiGADAwwAAAAAAAAAAAAAAAAAAAAAAGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAA4AwB +zAAwAAgDgPBgAwMMAAAAAAAAAAAAAAAAAAAAAADAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAHAIIM4CMAAIA4EAcBMDDAAAAAAAAAAAAAAAAAAAAAAAwEAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAABwGCDHBDAAEAHDADgjAwwAAAAAAAAAAAAAAAAAAAAAAOGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAEUAAAAAAAAPHAwh/gwABABw/4/wwMMgAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAA/ALwHg/AB8B/H/Dw/PhwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAABgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAYCAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAHDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAABDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAfwPgAAAAAAADwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAgAAAAAAAAMAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAIAAAAAAAADABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHACAAAAAAAAAwAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAgAAAAAAAAMAcHAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAIE8AAB0EcDBP7+B4CYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHACPfgAAjPfwzwwMBjHvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAg4cAAYQ4MM +MMDAwYcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAIMDAAGAMDjDDAwIGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHACDAwAB4DAYwwwMH/hgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAABwAgwMf+PgwGMMMDBgAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAIMDH/g8MBjDDAwYAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAGDAwAADjAYwwwMGABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAA4BAwMAAQYwMMMMDBwEYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAwMDAAEGMDDDDAwOCGAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB44DAwABhDhgwwyMj/BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4D8+AAXg3g//HBwPB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM +--mail.sleepy.sau.158.532-- + +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: PostScript demo + +Received: from hanna.cac.washington.edu by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA19503; Mon, 7 Oct 91 09:15:36 -0700 +Received: from thumper.bellcore.com by hanna.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA28214; Mon, 7 Oct 91 09:14:12 -0700 +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id <AA13347> for mrc@cac.washington.edu; Mon, 7 Oct 91 12:13:58 EDT +Received: by greenbush.bellcore.com (4.1/4.7) + id <AA10867> for mrc@cac.washington.edu; Mon, 7 Oct 91 12:13:55 EDT +Date: Mon, 7 Oct 91 12:13:55 EDT +From: nsb@thumper.bellcore.com (Nathaniel Borenstein) +Message-Id: <9110071613.AA10867@greenbush.bellcore.com> +To: mrc@cac.washington.edu +Subject: An image that went gif->ppm->ps +MIME-Version: 1.0 +Content-Type: application/postscript +Content-Description: Captain Picard + +%!PS-Adobe-2.0 EPSF-2.) +%%Creator: ppmtops +%%Title: noname.ps +%%Pages: 1 +%%BoundingBox: 147 304 454 496 +%%EndComments +%%EndProlog +%%Page 1 1 +/picstr 384 string def +gsave +147 304 translate +1 1 scale +307 192 scale +320 200 8 +[ 320 0 0 -200 0 200 ] +{ currentfile picstr readhexstring pop } +false 3 +colorimage +9148489148486d4848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d4848914848914848914848914848914848 +9148486d48486d48486d48486d48486d48489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d48486d48486d48486d48486d4848914848916d6d916d6d916d6d914848 +9148486d48486d48486d48486d48486d48486d24246d48486d48486d2424 +6d48486d48486d48486d48486d24246d48486d24246d24246d24246d4848 +6d48486d48486d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d2424916d6db69191da9191dab6b6dab6b6da9191b69191914848 +6d48484824246d24244824246d24246d24246d24246d24246d24246d2424 +4824246d24244824244824244824246d24246d2424482424482424482424 +4824244824244824244824244824244824244824246d2424482424482424 +6d24246d24246d24244824244824244824246d24246d2424482424482424 +6d24244824246d24244824246d24246d24246d2424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d2424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24244824244824246d2424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d2424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d48489148486d48486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d48486d48486d4848914848914848916d6d914848 +9148489148486d48486d48486d48486d24246d48486d48486d48486d2424 +6d24246d48486d48486d48486d48486d48486d48486d24246d24246d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d48486d48486d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d24246d24246d2424 +6d24246d2424914848b66d6db69191dab6b6da9191b69191b66d6d914848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24244824244824244824244824246d24246d24246d2424482424 +4824244824244824244824244824244824246d24246d24246d2424482424 +4824244824246d24246d24244824246d2424482424482424482424482424 +4824244824246d24246d24244824246d24246d24244824246d2424482424 +6d24246d24244824246d24246d24244824246d24244824244824246d2424 +4824244824244824246d24246d24244824244824244824244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +9148489148489148489148489148489148489148489148486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d4848914848 +9148489148486d48486d48486d48486d48486d48486d24246d24246d4848 +6d24246d48486d48486d48486d24246d48486d24246d48486d24246d4848 +6d48486d24246d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d24246d48489148489148489148486d48486d2424 +6d48486d48486d24246d24246d24246d48486d48486d48486d24246d2424 +6d24244824246d2424914848916d6db66d6db66d6db66d6d9148486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824244824246d24246d24244824246d2424482424 +4824246d24244824244824244824246d24246d24246d24246d2424482424 +4824246d24244824244824246d24246d24246d24244824244824246d2424 +6d24244824246d24244824244824244824244824244824244824246d2424 +6d24246d24244824246d24244824246d24246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +4824244824244824246d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +9148489148489148489148489148489148489148489148486d48486d4848 +9148489148489148489148489148489148486d48486d4848914848914848 +9148486d48489148489148486d48489148489148489148489148486d4848 +9148489148489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d24246d4848 +6d48486d48486d24246d24246d24246d24246d24246d24246d48486d2424 +6d24246d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d24246d24246d24246d48486d24246d24246d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d48486d48486d4848914848 +916d6d916d6d916d6d914848916d6db69191b69191b69191b66d6db66d6d +b66d6d9148489148486d48486d48486d48486d48486d48486d24246d4848 +6d48486d24246d24246d24246d48489148489148486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824244824244824246d24246d2424482424 +4824244824246d24244824244824244824246d2424482424482424482424 +4824246d24246d24244824244824244824246d2424482424482424482424 +6d24244824246d24244824246d24244824246d24244824246d24246d2424 +6d24246d24246d24244824246d24244824244824246d2424482424482424 +6d24246d24244824246d24244824244824246d24246d2424482424482424 +6d24244824244824244824244824246d24246d24244824246d2424482424 +6d24244824244824246d24246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48489148486d4848 +6d48486d48486d48486d48486d48486d24246d24246d24246d48486d4848 +6d48486d48486d48486d48486d48486d24246d24246d24246d24246d2424 +6d48486d24246d24246d48486d48486d48486d24246d24246d48486d4848 +6d48486d24246d24246d24246d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d24246d48486d24246d24246d24246d48486d4848 +6d48486d48486d48486d48486d4848914848916d6d916d6d916d6d916d6d +b66d6db66d6d914848916d6d916d6db66d6db69191b66d6db66d6db69191 +b69191b66d6d916d6d916d6d916d6d9148489148486d24246d48486d2424 +6d48486d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d2424 +6d24244824244824244824244824244824244824246d24244824246d2424 +6d24244824246d24246d24244824246d24244824246d24246d24246d2424 +4824246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24244824244824244824246d24246d24246d24244824246d2424 +4824244824244824244824244824244824244824246d24246d2424482424 +4824244824244824244824244824244824244824244824246d2424482424 +4824244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d48486d48489148486d4848914848914848914848914848914848 +9148489148489148486d48489148486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48489148486d4848 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d24246d2424 +6d24246d24246d24246d24246d48486d24246d48486d48486d48486d4848 +6d48486d48486d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d24246d48486d48486d48486d48486d48486d2424 +914848914848914848914848916d6db66d6dda9191b69191b66d6db66d6d +9148489148486d24246d24246d24246d24246d24246d24246d24246d4848 +6d4848914848914848b66d6db69191b69191b66d6d916d6d914848914848 +6d48489148486d48489148486d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24244824244824246d24244824246d24246d24246d24246d2424 +6d24244824246d24244824244824246d24244824244824244824246d2424 +6d24246d24246d24244824244824246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24246d24246d2424482424482424 +4824244824246d24246d24244824246d24244824246d24246d2424482424 +6d24244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d24246d2424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +916d6d914848914848914848914848914848914848914848914848914848 +6d4848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148486d48489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d48486d48486d48486d24246d48486d48486d48486d24246d48486d2424 +6d24246d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d24246d24246d4848 +6d24246d48486d24246d48486d48486d24246d24246d24246d48486d4848 +916d6db66d6db69191b66d6d914848916d6d916d6d6d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d48486d48486d4848914848916d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6d916d6d6d48486d48486d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d24246d2424 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824244824244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24244824246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24244824246d2424482424482424482424482424482424 +6d24244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d24244824244824244824246d2424482424482424 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +916d6d914848916d6d914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148489148489148486d4848914848914848914848914848 +9148489148489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48489148486d48486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d24246d4848 +6d48486d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d2424914848914848916d6d +b66d6dda9191b66d6d916d6d6d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48489148486d4848914848914848916d6d916d6d916d6d916d6d +b69191b69191da9191da9191da9191b69191b66d6d9148489148486d2424 +6d48486d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24244824246d24246d24244824244824246d24246d24246d2424 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24244824244824244824246d24244824246d24246d24246d2424 +6d24244824246d24246d24244824244824246d24244824244824246d2424 +4824244824244824244824244824246d2424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d24246d24246d2424 +6d24246d48486d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d4848914848914848b66d6d916d6d916d6d +6d48486d24246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d4848914848914848914848914848916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6db69191b69191da9191b66d6d916d6db66d6d +9148489148486d48486d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +4824246d24246d24244824244824244824246d24246d24246d48486d4848 +6d24246d24246d24244824244824244824244824244824246d24246d2424 +4824244824244824244824244824244824246d24244824244824246d2424 +4824244824244824244824244824244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +b66d6d914848916d6d916d6d914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48489148486d48486d48489148486d48486d48486d48486d4848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +9148489148486d4848914848916d6d916d6db66d6d916d6d9148486d4848 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d4848914848914848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db69191da9191 +dab6b6dab6b6b69191916d6d9148486d24246d48486d24246d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24244824246d24246d24244824244824246d2424482424 +4824244824244824244824244824244824244824244824244824246d2424 +4824244824244824246d24244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +b69191914848916d6d916d6d916d6d914848916d6d914848914848914848 +914848914848914848914848914848914848914848914848916d6d916d6d +916d6d916d6d914848914848916d6d916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48489148489148489148489148489148486d4848914848914848914848 +6d48486d48486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48489148489148489148486d4848 +6d4848914848916d6d916d6db66d6d9148486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48489148486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48489148486d4848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +b69191dab6b6da9191b69191b691919148486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d2424482424482424482424 +4824244824246d24246d24244824246d24246d24246d24246d24246d2424 +6d24246d24244824244824244824246d24244824244824244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824246d2424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +da9191916d6d916d6d916d6d916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d48489148486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d4848914848914848914848914848914848 +916d6db66d6db69191b66d6d9148486d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d48486d48486d48486d48486d48486d48489148486d48486d4848 +6d4848914848914848914848914848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db69191dab6b6da9191b69191b66d6d9148486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24246d24246d24246d24246d24246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d2424482424482424 +6d24244824244824244824246d24244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +4824244824246d24244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +da9191916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848914848914848916d6d914848914848914848916d6d916d6d +916d6d916d6d914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848914848916d6d916d6d916d6d914848 +914848916d6d914848914848916d6d916d6d916d6d914848914848914848 +9148489148489148489148489148489148489148486d4848914848914848 +6d48486d48489148486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d4848914848914848914848914848914848916d6db66d6d +b69191da91919148486d48484824244824244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d48486d48486d48489148489148489148486d4848914848 +914848914848916d6d914848916d6d916d6d914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6db66d6db66d6dda9191dab6b6b69191916d6d +6d24246d48484824246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824244824246d24246d24246d24246d2424 +6d24246d24246d24244824246d24244824246d24244824246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d2424482424482424482424482424482424482424482424482424482424 +4824244824246d24244824244824244824244824244824246d24246d2424 +4824244824244824244824246d24244824246d2424482424482424482424 +6d24244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffb6b6916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848914848914848916d6d916d6d914848 +914848916d6d916d6d914848916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d914848914848914848914848916d6d916d6d916d6d +916d6d916d6d914848914848914848916d6d916d6d916d6d916d6d914848 +9148489148489148489148489148489148489148489148486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d48486d48486d48486d48486d48489148486d4848914848914848 +6d48486d48486d48489148486d48486d48486d48486d4848914848914848 +914848914848914848914848914848914848914848b66d6db69191b69191 +b691919148486d24244824244824244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d24246d48486d4848 +6d24246d48486d48486d48489148486d4848914848914848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d +b66d6d916d6d916d6d916d6db66d6d916d6d916d6db66d6d916d6db66d6d +916d6d916d6db66d6db66d6db66d6d916d6db66d6db69191dab6b6dab6b6 +b69191916d6d916d6d6d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24244824246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d24246d2424 +6d24246d24244824246d24244824246d24246d24246d24246d24246d2424 +4824246d24246d24246d24244824246d2424482424482424482424482424 +6d24244824244824244824246d24246d2424482424482424482424482424 +4824244824246d24246d24246d48486d48486d48486d2424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d24244824246d2424482424482424482424482424 +6d24244824244824246d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffdadab66d6db66d6db66d6d916d6d916d6d916d6d916d6db66d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848914848916d6d916d6d914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848914848914848914848914848914848914848914848914848 +9148489148489148486d48486d48486d48489148489148486d4848914848 +9148486d48486d48489148489148489148489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d4848914848914848914848 +9148486d48489148486d4848914848914848916d6db69191da9191b66d6d +6d48486d24244824246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d4848914848914848914848914848916d6d916d6d916d6d +914848914848916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6db66d6d +916d6d916d6db66d6db66d6db66d6d916d6d916d6d916d6db66d6db69191 +dab6b6dab6b6b69191b66d6d6d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48489148486d4848 +6d48486d24246d24244824246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24244824244824246d2424 +6d24244824244824246d24244824244824246d24246d2424482424482424 +6d24244824244824244824244824244824244824246d24246d2424482424 +4824244824244824244824246d24244824244824244824246d24246d2424 +4824246d24246d4848914848916d6d916d6d9148486d48486d24246d2424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24244824244824246d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffffdab66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d914848916d6d916d6d916d6d914848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848914848914848914848914848914848 +9148489148489148486d48486d48486d48489148486d48486d4848914848 +9148489148486d48489148489148486d48486d48486d4848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d4848914848916d6db66d6db691919148486d4848 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d4848914848914848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6db66d6d916d6db66d6d916d6d916d6db66d6db66d6d +da9191dab6b6ffb6b6dab6b6b66d6d916d6d6d48486d48486d24246d2424 +6d24246d24246d24246d24244824246d24246d4848916d6d916d6d916d6d +9148486d24244824246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24246d24246d24246d24244824244824246d2424482424 +4824246d24244824246d24246d24244824244824244824246d24246d2424 +6d24244824246d24244824246d24244824246d24246d2424482424482424 +4824246d2424914848914848914848916d6d916d6d9148486d2424482424 +4824244824244824244824244824244824244824244824244824246d2424 +4824244824246d2424482424482424482424482424482424482424482424 +4824244824244824246d24244824246d24246d2424482424482424482424 +4824244824244824244824244824244824244824246d2424482424482424 +4824244824244824244824244824244824244824246d2424482424482424 +ffffdab66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6db66d6d +b66d6db66d6db66d6d916d6d916d6db66d6db66d6d916d6db66d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48489148489148486d4848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d4848914848914848b66d6db66d6d916d6d6d48486d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d48486d48486d24246d24246d24246d48486d48486d4848 +6d48486d4848914848914848916d6d914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6d916d6d916d6d916d6db66d6d916d6d916d6db66d6d916d6d +b66d6d916d6d916d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6d +b66d6db66d6db69191da9191dab6b6ffb6b6916d6d916d6d6d48486d2424 +6d24244824244824244824246d24246d2424914848914848914848914848 +9148486d48486d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d2424482424482424482424 +6d24246d24246d24246d24246d24246d24246d24244824246d2424482424 +4824244824246d24246d24246d2424482424482424482424482424482424 +6d24244824246d24246d24244824246d2424482424482424482424482424 +4824246d24246d48489148489148489148489148486d48486d2424482424 +4824244824244824244824246d24244824244824244824244824246d2424 +6d2424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24244824246d2424482424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffffdab66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +b66d6db66d6db66d6d916d6d916d6db66d6db66d6db66d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +916d6d916d6d914848916d6d916d6d916d6d916d6db66d6d916d6d916d6d +916d6d916d6d916d6d914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848916d6d914848914848914848914848914848 +914848914848b66d6db69191b69191916d6d6d48486d48486d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d4848914848914848914848916d6d916d6d916d6db66d6d916d6d +916d6d916d6db66d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6ddab6b6ffb6b6da9191da9191916d6d914848 +6d24246d24244824246d24244824246d24246d4848914848914848914848 +9148486d48484824244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24244824246d24246d24246d2424 +6d24246d24246d2424482424482424482424482424482424482424482424 +4824246d24246d48489148489148489148489148486d48486d2424482424 +4824244824244824244824246d24244824246d2424482424482424482424 +4824244824246d24244824244824244824246d24244824244824246d2424 +4824244824244824244824244824244824246d2424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +4824244824244824246d2424482424482424482424482424482424482424 +ffffdab69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6db66d6db66d6d916d6db66d6d916d6d +b66d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +916d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848916d6d914848914848914848914848914848914848 +6d4848916d6db69191b69191916d6d6d48486d24246d24246d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d48486d48486d48486d24246d24246d48486d48486d2424 +6d4848914848914848914848914848916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6d916d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6d916d6db66d6db66d6d916d6db66d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6d916d6d916d6d916d6dda9191dab6b6dab6b6dab6b6916d6d +6d48486d24244824246d24244824246d24246d24249148489148486d4848 +6d48486d24246d24246d24244824244824244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824244824246d24246d24246d2424482424482424 +4824244824246d24244824244824244824244824246d24244824246d2424 +4824246d24246d24246d24246d24244824246d24244824246d2424482424 +6d24246d24246d24246d24246d24246d48486d24246d2424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +4824244824244824244824244824244824244824244824246d2424482424 +4824244824244824244824246d24246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d24244824246d2424482424482424482424482424 +ffffdada9191b69191b69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b69191b66d6db69191b69191b69191b66d6db66d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6db66d6db66d6db66d6db66d6d916d6db66d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6db66d6d916d6d +916d6d916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848916d6d916d6d916d6d914848914848914848916d6d916d6db66d6d +916d6db66d6db69191916d6d6d48486d24246d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d4848914848914848914848916d6d916d6d916d6d916d6d916d6db66d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b69191b66d6db66d6d916d6d916d6d916d6db69191ffb6b6ffdadadab6b6 +b66d6d9148486d48489148489148486d48486d24246d4848916d6d6d2424 +4824246d24244824244824246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24244824246d24246d24246d24246d24246d2424482424482424 +6d24244824246d24244824244824244824244824244824244824246d2424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24244824244824244824244824246d24246d24246d24246d2424 +6d24246d24246d24244824244824246d2424482424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffffdada9191da9191da9191da9191b69191b69191b69191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +914848914848914848914848914848916d6d916d6d916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6db66d6db66d6d916d6d914848914848914848b69191b69191da9191 +b69191b69191916d6d6d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +6d48486d4848914848914848916d6d916d6d916d6d916d6d916d6db66d6d +916d6db66d6db66d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6db66d6db66d6d916d6d916d6d914848b69191dab6b6ffb6b6 +ffdadada9191b66d6db66d6db69191b66d6d916d6d916d6d6d4848482424 +4824244800006d24244824246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824244824244824244824246d24246d24246d24246d24246d2424 +4824244824244824246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24246d24244824244824246d24246d2424 +4824246d2424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24244824244824246d2424482424 +4824244824244824244824246d24244824246d24246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +ffffdada9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6d916d6d916d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +916d6d914848916d6d914848914848914848914848914848914848914848 +916d6db69191b66d6db66d6d916d6d916d6db69191dab6b6dab6b6ffb6b6 +ffb6b69148489148486d24249148486d24246d48486d48486d48486d4848 +6d48486d48486d48486d24246d24246d48486d48486d48486d48486d2424 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +6d4848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b66d6db66d6db66d6db66d6d916d6d916d6db69191b69191 +ffb6b6ffdadada9191b66d6db69191da9191da9191b66d6d482424482424 +4824246d24244824246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24244824244824246d24246d24246d24246d24246d24246d2424 +4824246d24246d24246d24246d24246d24244824246d2424482424482424 +4824246d24244824244824246d24246d24246d24246d24246d2424482424 +4824244824244824246d24244824246d24246d24246d2424482424482424 +4824244824246d24244824246d24246d24246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d24244824244824244824244824244824246d2424 +ffffdadab6b6dab6b6dab6b6dab6b6da9191b69191b69191b69191da9191 +da9191b69191b69191da9191b69191da9191da9191b69191b69191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b69191b69191b66d6db66d6db69191b66d6db69191 +b69191b66d6db66d6db66d6db69191b66d6db69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848916d6d916d6db66d6d916d6d +914848916d6d914848916d6d914848914848914848916d6d914848914848 +914848914848916d6db66d6d916d6d916d6db69191ffb6b6dab6b6dab6b6 +b66d6d6d48484824246d48486d24249148486d24246d48486d48486d4848 +6d24246d48486d24246d48486d24246d24246d48486d24246d48486d4848 +6d48486d48486d48486d24246d24246d24246d48486d48486d4848914848 +6d4848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b66d6db66d6db66d6d916d6db66d6d916d6d914848914848 +da9191ffb6b6ffb6b6dab6b6dab6b6dab6b6b66d6d916d6d482424482424 +4824244824244824246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48489148486d48486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24244824246d24244824246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d2424482424 +4824246d24244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d24249148489148489148484824244824246d2424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffffdadab6b6dab6b6dab6b6dab6b6da9191da9191b69191b69191da9191 +da9191da9191b69191b69191b69191da9191da9191da9191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b66d6db66d6db69191 +b69191b66d6db69191b69191b69191b69191b69191b66d6db66d6db69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d +b66d6d916d6d916d6d916d6d914848914848916d6db66d6db66d6d916d6d +916d6d914848914848914848914848916d6d916d6d916d6d916d6d916d6d +914848914848916d6d914848916d6db69191da9191dab6b6dab6b6b69191 +6d48486d24246d48486d48486d48486d24246d48486d48486d48486d2424 +6d48486d48486d48486d24246d24246d24246d24246d24246d48486d4848 +6d48486d48486d24246d48486d48486d48486d48486d48486d4848914848 +914848914848914848916d6d916d6d916d6d916d6db66d6db66d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6db66d6ddab6b6ffb6b6ffdadaffb6b6ffb6b6da9191916d6d482424 +6d24244824246d24244824246d24244824246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d48489148486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824244824246d2424 +4824246d24246d24246d24246d24246d24246d24244824244824246d2424 +6d24244824246d24244824244824244824244824244824246d2424482424 +6d24246d4848914848916d6d916d6d916d6d6d48486d48484824246d2424 +4824246d24244824244824244824244824244824244824244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +ffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191da9191da9191dab6b6dab6b6b69191da9191 +b69191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db69191b69191b69191b66d6d +916d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +b66d6db66d6d916d6d916d6d916d6d916d6d914848916d6db66d6d916d6d +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848916d6db69191dab6b6ffb6b6b691916d4848 +6d24246d24249148486d24246d48486d48486d48486d48486d24246d2424 +6d48486d48486d48486d24246d24246d24246d24246d24246d48486d4848 +6d24246d24246d24246d24246d48486d48486d48486d48486d4848914848 +914848916d6d914848914848916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6d +914848914848916d6db69191ffb6b6ffdadaffdadaffdadadab6b6914848 +4824244800004824244824244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d48486d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824244824244824246d24246d2424482424482424482424482424 +4824246d24246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24244824244824244824246d24244824246d2424482424482424 +6d24246d48489148489148489148489148489148486d48486d2424482424 +4824244824244824244824246d2424482424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +ffffdaffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191dab6b6dab6b6dab6b6dab6b6da9191da9191b69191b69191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191 +b69191b69191b69191b69191b66d6db66d6db69191b66d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d914848916d6d +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848916d6d914848914848914848 +916d6d914848916d6db66d6db69191da9191ffb6b6da91916d4848914848 +4824249148486d24246d48486d24246d48486d48486d48486d24246d2424 +6d24246d48486d24246d24246d48486d48486d48486d48486d48486d4848 +6d48486d24246d48486d24246d48486d48486d4848914848914848914848 +914848914848916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b66d6db69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6d916d6db66d6db66d6d +916d6d914848914848916d6ddab6b6dab6b6ffdadaffdadaffb6b6b69191 +6d48486d24244824246d24244824246d24244824246d24246d24246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d48486d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +4824244824246d24246d24246d4848916d6d916d6d916d6d9148486d2424 +6d24244824246d24244824246d24244824244824244824246d2424482424 +6d24246d24246d48489148489148489148489148486d4848482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffffdaffdadaffdadaffb6b6ffb6b6ffdadaffb6b6ffb6b6ffb6b6dab6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191dab6b6da9191da9191b69191b69191b69191b69191da9191b69191 +da9191da9191b69191b69191b69191b69191b69191b69191b66d6db69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848914848914848916d6d914848914848914848914848b66d6d +b69191b66d6db69191b69191dab6b6dab6b6dab6b6916d6d4824246d2424 +6d24246d48486d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d48486d48486d48486d4848914848914848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db69191 +da9191da9191b69191b66d6db66d6db66d6db66d6db66d6d916d6db66d6d +b66d6d916d6d914848914848b66d6db69191dab6b6ffb6b6ffdadadab6b6 +b69191b66d6d9148486d24244824244824244824244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24244824246d24244824246d24244824246d2424482424482424 +6d24244824244824246d24244824246d2424482424482424482424482424 +4824244824246d2424914848b66d6dda9191b69191b69191b66d6d914848 +6d2424482424482424482424482424482424482424482424482424482424 +4824246d24246d48489148489148489148489148486d2424482424482424 +4824244824244824244824246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffffdaffffdaffdadaffdadaffdadaffffdaffdadaffb6b6ffb6b6ffb6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6da9191dab6b6da9191da9191da9191 +dab6b6dab6b6da9191da9191b69191b66d6db69191b69191b69191b69191 +da9191b69191da9191b69191da9191da9191da9191da9191b69191b66d6d +b69191b69191b69191b66d6db69191b69191b69191b66d6db69191b66d6d +b66d6d916d6db66d6db66d6d916d6db66d6db69191b66d6d916d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +914848916d6d916d6d916d6d914848914848914848914848914848916d6d +b66d6db69191dab6b6b69191ffb6b6da9191916d6d6d48486d48486d2424 +6d48486d48486d48486d48486d48486d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d4848 +6d24246d48486d48486d48486d48486d4848914848914848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db69191b69191b66d6db69191b66d6db69191b66d6db69191b69191 +da9191da9191da9191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d914848914848b69191da9191ffb6b6ffb6b6 +dab6b6dab6b6da9191916d6d6d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24244824246d24244824246d2424 +6d24246d24246d24246d24244824246d24244824244824246d2424482424 +4824244824246d4848916d6db69191da9191dab6b6da9191b69191914848 +6d24244824244824246d24244824244824246d24244824244824246d2424 +4824244824244824244824244824246d24246d2424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +4824244824246d24246d24244824244824244824244824244824246d2424 +ffdadaffffdaffffdaffdadaffffdaffffdaffdadaffb6b6ffb6b6ffdada +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191 +dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191b69191b69191 +da9191da9191da9191da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +914848916d6d916d6d916d6d916d6d914848914848914848914848914848 +916d6db66d6dda9191dab6b6da9191b66d6d6d24246d24246d24246d4848 +6d24246d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d24246d48486d24246d4848 +6d24246d24246d48486d48486d4848914848914848914848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6d916d6db66d6d +916d6d916d6d916d6d916d6d916d6d914848914848916d6dda9191da9191 +da9191b69191b66d6d9148486d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824244824246d24244824246d24246d2424482424 +4824244824246d4848b66d6dda9191da9191da9191da9191b66d6d914848 +6d24244824244824244824244824246d2424482424482424482424482424 +6d2424482424482424482424482424482424482424482424482424482424 +4824246d24244824244824244824246d2424482424482424482424482424 +6d24244824244824244824246d48486d48486d48486d2424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffb6b6 +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6da9191da9191 +da9191da9191dab6b6da9191b69191b69191da9191da9191da9191da9191 +da9191da9191da9191b69191b69191da9191da9191da9191da9191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b66d6db66d6d916d6db66d6d916d6d916d6d +b66d6db66d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d916d6d916d6d916d6d914848914848b66d6d +b69191da9191dab6b6dab6b6b66d6d9148486d48486d48486d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d48486d24246d4848 +6d24246d48486d48486d4848914848914848914848914848916d6d916d6d +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b69191b66d6db66d6db69191b66d6db69191b66d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b69191b69191b69191b66d6db66d6db69191b69191b69191 +b69191b69191da9191b69191b69191b69191b66d6db66d6db66d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848914848b66d6ddab6b6 +ffb6b6da9191b691919148489148484824249148484824246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824244824244824246d2424482424 +4824244824246d2424914848b66d6db69191b69191b69191b66d6d6d4848 +6d24244824244824244824246d24244824246d2424482424482424482424 +6d24244824244824246d24246d24246d24246d24244824244824246d2424 +6d24244824246d24244824244824244824246d2424482424482424482424 +4824246d24246d24246d4848916d6d916d6d916d6d9148486d2424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffb6b6 +ffb6b6ffdadaffdadaffdadaffdadaffdadadab6b6ffb6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191dab6b6da9191 +da9191da9191da9191da9191b69191da9191da9191b69191b69191da9191 +b69191b69191b69191b69191b66d6db66d6db66d6db69191b69191b69191 +b66d6db66d6db66d6db69191b66d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848916d6d914848914848b66d6d +dab6b6dab6b6ffdadab691919148484824249148486d24246d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d48486d4848914848914848914848914848916d6d914848916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b66d6db69191b66d6db66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +da9191da9191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6d916d6d916d6d914848914848914848914848 +ffb6b6ffb6b6ffdadada9191916d6d6d24246d24244824246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24244824246d24246d24246d2424482424482424482424482424482424 +4824244824244824246d24246d4848916d6d916d6d9148486d48486d2424 +6d24246d24244824246d24244824246d24244824246d2424482424482424 +4824246d24246d24244824246d24246d2424482424482424482424482424 +6d24244824246d24244824244824246d24246d24244824246d2424482424 +6d24246d48486d4848914848914848914848916d6d9148486d24246d2424 +ffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffdadaffdada +ffdadaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6ffb6b6dab6b6 +dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191dab6b6da9191 +b69191b69191da9191da9191b69191b69191da9191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b66d6db69191b69191b69191b69191 +b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848916d6d916d6db69191da9191 +ffb6b6ffb6b6dab6b69148486d48486d48486d24249148486d2424914848 +6d48486d48486d48486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d48486d4848914848914848914848916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191da9191da9191b69191b69191b69191b66d6db69191b66d6db66d6d +b66d6db66d6d916d6d916d6db66d6d916d6d916d6d916d6d914848914848 +b69191da9191ffdadaffb6b6b691916d24246d24246d24244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +4824244824244824244824244824246d24246d24244824246d2424482424 +4824244824244824246d24246d24244824246d24246d24246d2424482424 +6d24246d24244824244824244824246d24244824244824246d2424482424 +6d24246d24246d24244824244824244824244824246d2424482424482424 +4824246d4848914848914848914848916d6d9148489148486d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffdadaffdadaffdadaffb6b6ffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6da9191dab6b6da9191dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6d916d6d916d6db66d6db69191b66d6d916d6d916d6db66d6d916d6d +916d6d914848916d6d916d6d916d6d914848914848916d6d916d6d916d6d +916d6d916d6d914848916d6d914848914848916d6dda9191dab6b6ffb6b6 +dab6b6ffb6b6da91919148486d24246d48486d48489148489148486d4848 +6d48486d48486d48486d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d4848914848914848914848916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b69191b69191b69191 +b69191b69191b69191da9191da9191da9191da9191b69191b69191b69191 +b69191da9191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +916d6db66d6dffb6b6ffb6b6916d6d4824244824244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24244824246d24246d24244824244824246d2424 +4824246d24244824244824244824244824244824246d2424482424482424 +4824246d24244824244824246d24246d24246d24244824244824246d2424 +4824246d24244824246d24244824246d24246d24244824246d2424482424 +6d24246d2424482424482424482424482424482424482424482424482424 +4824246d24249148489148489148489148489148486d48486d2424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffffffffdaffffdaffdada +ffdadaffdadaffdadaffb6b6ffdadaffdadaffdadaffdadaffb6b6ffb6b6 +dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191da9191 +dab6b6da9191da9191da9191b69191b69191da9191b69191b69191da9191 +da9191b69191b69191b66d6db69191b69191b69191b66d6db66d6db69191 +b66d6db66d6db66d6db66d6db69191b66d6d916d6db66d6d916d6db66d6d +916d6db66d6d916d6d916d6d914848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848b69191da9191ffb6b6ffb6b6 +ffffdada9191da91919148489148486d48489148486d48489148486d4848 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d24246d24246d48486d24246d24246d24246d4848 +914848914848914848914848914848914848916d6d916d6d916d6d916d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db69191b69191b69191b69191b66d6db69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191da9191da9191b69191da9191b69191b69191da9191 +da9191da9191da9191b69191b69191b66d6db66d6db69191b66d6db66d6d +b66d6db66d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6d +914848916d6ddab6b6ffdadada91919148486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24246d24244824244824244824246d24246d24246d2424 +6d24246d24244824244824246d24244824246d24244824246d2424482424 +6d24244824244824246d24244824246d24246d24246d2424482424482424 +4824246d24244824244824246d24244824244824246d24246d24246d2424 +6d24244824246d24246d48486d48486d48486d24246d24246d2424482424 +ffffdaffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffdadaffdadaffffdaffdadaffb6b6ffb6b6ffb6b6ffb6b6 +dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191da9191da9191b69191da9191b69191b69191b69191b69191 +b69191da9191b69191b66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848916d6d916d6d916d6d +916d6d916d6d916d6d914848914848914848914848da9191ffdadaffdada +ffb6b6da9191b66d6d9148486d48489148486d48486d48486d48486d4848 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d4848 +6d24246d24246d48486d48486d24246d48486d24246d48486d48486d4848 +914848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b69191b69191b69191b66d6db69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191da9191da9191b69191b69191b69191b69191b69191 +da9191da9191da9191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6db66d6d916d6d916d6d916d6d +914848914848b69191dab6b6ffdadab691919148486d24246d2424482424 +4824244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24244824244824246d24246d24244824244824246d2424482424 +4824244824246d24244824244824246d24246d24244824246d2424482424 +4824244824246d24244824244824246d24244824244824244824246d2424 +6d24246d2424482424482424482424482424482424482424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffb6b6dab6b6ffb6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6da9191da9191 +b69191da9191da9191da9191da9191da9191b69191b69191b69191da9191 +da9191b69191b69191b66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b66d6db66d6db69191b66d6db66d6d916d6db66d6db66d6d916d6d +b66d6d916d6d914848916d6d916d6d914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6d916d6d914848b66d6dffb6b6ffffdaffdada +da9191b66d6d9148486d48486d24246d48486d24246d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d48486d24246d24246d24246d48486d48486d48486d48486d4848 +914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191da9191b69191 +da9191b69191b69191da9191da9191da9191da9191da9191da9191da9191 +b69191b69191da9191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6d914848b66d6dda9191ffb6b6ffdadadab6b69148486d2424482424 +6d48484824246d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24244824246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824244824244824246d24246d2424482424 +4824246d24246d24246d24246d24244824244824246d24246d2424482424 +4824244824246d24246d24246d24246d24244824244824244824246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6ffdadaffb6b6dab6b6dab6b6da9191 +dab6b6da9191dab6b6da9191da9191b69191b69191b69191b69191b69191 +da9191b69191b69191b69191b66d6db66d6db66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d914848916d6d +916d6d916d6d916d6d916d6d916d6db66d6dda9191ffdadaffdadadab6b6 +da91919148489148486d24249148486d24246d48486d24246d48486d4848 +6d24246d24246d24246d24246d48486d24246d24246d24246d24246d2424 +6d48486d48486d24246d24246d24246d48486d24246d48486d4848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b69191b69191b66d6db69191b66d6db69191b69191 +b69191b69191b69191b69191da9191da9191da9191b69191b69191da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +916d6d914848916d6db69191dab6b6ffdadaffdadab691919148486d2424 +4824244824246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d24246d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d48486d48486d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24244824246d24246d24246d24246d24244824246d24246d2424 +6d24246d24246d24244824244824244824246d24246d24246d24246d2424 +6d24244824246d24246d24244824244824244824244824246d2424482424 +4824246d24244824244824246d24244824246d2424482424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffdadaffb6b6ffb6b6 +ffb6b6ffb6b6dab6b6dab6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6da9191 +da9191dab6b6b69191da9191da9191da9191da9191b69191b69191da9191 +da9191b69191da9191b69191b66d6db66d6db66d6db69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db69191dab6b6ffb6b6ffdadaffdadada9191 +b66d6d916d6d6d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d48486d24246d48486d48486d48486d4848914848914848 +916d6d914848916d6d916d6d916d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db69191b69191 +b69191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6db66d6dffb6b6ffb6b6ffdadaffb6b6b66d6d6d2424 +4824246d48484824246d48484824246d48484824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d24246d24246d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d48486d48486d48486d24246d24246d24246d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24244824246d2424 +4824246d24246d24246d24244824246d24244824244824246d24246d2424 +4824244824246d24246d24246d24246d24244824246d24244824246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffffffffdaffffdaffdadaffb6b6ffdadaffb6b6ffb6b6 +ffb6b6dab6b6ffb6b6dab6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +da9191da9191b69191da9191da9191da9191da9191b69191b69191da9191 +da9191b69191b69191b69191b69191b69191b66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6d916d6db66d6dda9191ffdadaffdadaffdadadab6b6b66d6d +9148489148486d48486d48486d48486d48486d48486d48486d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d48486d48486d4848914848916d6d +b66d6db66d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6d916d6d +916d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db69191 +b69191b69191b69191b69191b66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b69191da9191da9191da9191da9191 +da9191da9191b69191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6db69191dab6b6ffb6b6ffb6b6dab6b6916d6d914848 +4824246d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d48486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +4824246d24246d24246d24246d24246d24246d24246d2424482424482424 +4824244824244824246d24246d24244824244824244824244824246d2424 +ffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffffffffdaffffdaffffdaffdadaffb6b6ffdadaffb6b6 +ffb6b6dab6b6dab6b6dab6b6ffb6b6ffb6b6ffb6b6ffb6b6ffdadadab6b6 +da9191da9191da9191b69191da9191da9191da9191da9191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b66d6db69191b69191b66d6db66d6db66d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6ddab6b6ffdadaffdadaffb6b6da9191916d6d +916d6d6d48489148489148489148486d48486d48486d24246d48486d2424 +6d48486d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d4848914848914848916d6d +916d6d916d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +da9191da9191b69191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6dffb6b6ffdadaffdadada91919148486d2424 +9148486d24246d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d48486d24246d48486d2424 +6d24246d48486d48486d24246d48486d24246d24246d48486d24246d2424 +6d48486d24246d24246d48486d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824244824246d2424 +6d24246d24246d24246d24246d24244824244824246d24246d24246d2424 +6d24244824244824246d24246d24246d2424482424482424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffb6b6 +ffb6b6dab6b6dab6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6ffb6b6dab6b6 +dab6b6da9191b69191da9191da9191b69191da9191da9191da9191da9191 +da9191b69191b69191b69191b69191b66d6db69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +916d6d916d6d914848b66d6ddab6b6ffdadaffdadadab6b6b69191914848 +9148489148489148489148489148486d48486d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d4848914848914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191da9191da9191da9191 +da9191da9191da9191b69191da9191da9191b69191b69191da9191b69191 +b69191b69191b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +b66d6db66d6d916d6db66d6ddab6b6ffb6b6ffdadadab6b6b66d6d914848 +9148486d48489148486d24246d24246d24246d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d24246d48486d24246d4848 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d48486d48486d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824244824246d24244824244824246d24244824246d24246d2424 +6d24244824246d24246d24246d2424482424482424482424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffffffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffb6b6 +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +dab6b6da9191b69191b69191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191b69191b66d6db66d6db69191b69191b69191b66d6d +b66d6d916d6db69191b69191b66d6db66d6db69191b66d6db66d6db69191 +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +916d6d916d6d914848b69191ffb6b6ffdadaffb6b6b69191b66d6d916d6d +916d6d916d6d9148489148486d48489148486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d4848914848914848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191da9191da9191da9191da9191b69191b69191 +da9191da9191b69191b69191da9191da9191b69191b69191da9191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6db69191ffb6b6ffdadaffb6b6b69191914848 +914848916d6d6d48486d48486d24246d48486d24246d48486d24246d2424 +6d24246d24246d24246d48486d48486d48486d48486d48486d24246d4848 +6d24246d48486d24246d24246d24246d24246d48486d24246d48486d4848 +6d24246d48486d48486d48486d24246d24246d48486d24246d48486d2424 +6d24246d24246d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24244824244824246d2424 +4824246d24246d24246d24246d24246d24246d2424482424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffffffffdaffffdaffffdaffffdaffdadaffdadaffdadaffffdaffb6b6 +ffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6 +da9191da9191da9191da9191b69191da9191da9191da9191b69191da9191 +da9191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d +916d6d914848914848b69191ffb6b6ffdadadab6b6b69191916d6d916d6d +914848916d6d9148489148486d48486d48486d48486d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d48486d24246d48486d4848914848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +da9191da9191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d916d6dda9191ffb6b6ffdadab66d6d916d6d +6d48489148486d48486d48486d24246d48486d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d48486d48486d24246d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d48486d24246d4848 +6d48486d24246d48486d48486d48486d48486d24246d24246d24246d2424 +6d48486d48486d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824244824244824246d24244824244824246d2424 +4824246d24244824244824244824244824244824246d24246d2424482424 +ffffdaffffdaffffdaffffffffffffffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffffdaffdada +ffb6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6 +da9191da9191da9191b69191da9191dab6b6da9191da9191b69191da9191 +da9191b69191b69191b69191b69191b69191b69191b66d6db66d6db69191 +b69191b66d6db66d6d916d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6d916d6db66d6db66d6db66d6d916d6d916d6d +916d6d916d6d916d6ddab6b6ffb6b6ffdadadab6b6b66d6db66d6d914848 +916d6d6d48489148486d48489148486d48486d48486d48486d24246d2424 +6d24246d24246d48486d24246d24246d24246d24246d24246d48486d2424 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191da9191da9191da9191da9191da9191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6db66d6d916d6d916d6db69191ffdadaffdadada9191b66d6d +9148486d48486d48486d24246d48486d24246d48486d24246d24246d4848 +6d24246d24246d48486d24246d24246d24246d24246d24246d24246d4848 +6d48486d48486d48486d48486d48486d24246d48486d24246d48486d4848 +6d48486d48486d48486d48486d24246d24246d48486d24246d48486d4848 +6d48486d48486d48486d48486d24246d48486d24246d24246d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24244824244824246d24246d24244824244824246d2424 +6d24246d24246d24246d24244824244824244824244824246d2424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffdadaffffdaffdadaffdada +ffb6b6ffb6b6ffdadadab6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6d916d6d916d6db66d6db66d6db66d6db66d6d916d6d +916d6d916d6d916d6dda9191ffffdaffb6b6da9191b66d6d916d6d916d6d +9148489148486d48486d48486d48486d48486d48486d24246d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d48486d24246d4848 +6d48486d24246d48486d48486d48486d48486d48486d4848914848914848 +914848914848916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +b69191b66d6db69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b66d6db69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191da9191b69191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191b69191b69191b66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6db66d6d916d6db69191dab6b6ffb6b6ffb6b6b69191 +9148486d24246d24244824246d24246d24246d24246d24246d24246d4848 +6d24246d24246d24246d48486d24246d24246d48486d24246d24246d2424 +6d48486d24246d24246d48486d48486d48486d48486d48486d24246d4848 +6d24246d24246d48486d48486d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d48486d48486d24246d24246d24246d48486d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24244824244824244824244824246d2424 +6d24244824246d24246d24244824246d24246d2424482424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffdadaffdada +ffdadaffb6b6ffdadaffb6b6dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191da9191b69191b69191b69191da9191b69191b69191da9191 +b69191da9191b69191b69191b69191b66d6db66d6db69191b66d6db66d6d +b66d6db69191b69191b66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6d916d6db69191ffb6b6ffb6b6ffb6b6b66d6db69191916d6d916d6d +9148489148489148486d48486d48486d48486d48486d24246d48486d4848 +6d24246d48486d24246d24246d48486d24246d48486d48486d48486d2424 +6d24246d48486d48486d48486d48486d48486d48486d4848914848914848 +914848914848914848916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b69191b69191b69191b66d6db69191b69191b69191b69191b69191 +b69191b69191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191b69191b69191da9191da9191da9191 +da9191da9191da9191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6db66d6d916d6db66d6db69191ffb6b6ffb6b6ffdadadab6b6 +916d6d4824246d48486d24246d48486d24246d48486d48486d48486d2424 +6d24246d24246d48486d48486d48486d24246d24246d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d24246d24246d4848 +6d48486d48486d24246d24246d24246d24246d24246d48486d24246d4848 +6d24246d48486d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +4824244824246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffdadaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffdada +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d916d6d +b66d6db69191b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6d916d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6db66d6d +b66d6db66d6dda9191ffdadaffdadadab6b6b69191916d6db66d6d914848 +9148486d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +914848916d6d914848914848916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b66d6db69191b66d6d +b69191b69191b69191b69191b69191b69191b69191b69191da9191da9191 +da9191da9191da9191da9191da9191da9191dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191da9191da9191da9191da9191b69191da9191 +da9191dab6b6da9191b69191b69191b66d6db69191b66d6db66d6db69191 +b69191b66d6db66d6db66d6db66d6db69191dab6b6ffdadaffb6b6b69191 +9148486d48486d24246d48486d24246d48486d24246d24246d48486d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d48486d24246d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d48486d48486d24246d24246d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24244824246d24244824244824246d2424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffb6b6 +ffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6ffb6b6ffb6b6dab6b6 +da9191dab6b6da9191da9191da9191da9191b69191b69191dab6b6da9191 +b69191b69191b69191da9191b69191b66d6db69191b69191b66d6db66d6d +b66d6db66d6db69191b66d6db69191b69191b66d6d916d6db66d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6db66d6d +b66d6db66d6ddab6b6ffdadaffdadab69191b69191b66d6db66d6d916d6d +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +914848914848914848914848914848916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db69191b69191b69191 +b69191b69191b69191b69191b66d6db69191b69191b66d6db69191b66d6d +b69191b69191b69191b69191b69191b69191b69191b69191da9191da9191 +da9191da9191da9191da9191da9191dab6b6dab6b6da9191da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +da9191da9191da9191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6dda9191ffb6b6ffffdaffb6b6b69191 +6d48486d48486d48486d24246d48486d24246d24246d24246d24246d2424 +6d48486d24246d48486d48486d48486d48486d48486d24246d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d24246d24246d48486d24246d24246d48486d24246d4848 +6d24246d24246d48486d48486d48486d24246d24246d24246d48486d2424 +6d24246d24246d24246d48486d24246d24246d24246d48486d24246d2424 +6d24246d48486d48486d24246d24246d24246d24246d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24244824244824246d2424 +ffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdada +ffdadaffdadaffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +b66d6db66d6dda9191ffdadaffb6b6da9191b66d6db69191b66d6d916d6d +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d2424 +6d48486d24246d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d4848914848914848916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191da9191b69191b69191b69191b69191da9191da9191 +da9191da9191dab6b6dab6b6da9191dab6b6da9191da9191da9191da9191 +da9191da9191da9191da9191da9191b69191da9191b69191b69191b69191 +da9191da9191da9191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db69191b69191b66d6db66d6dda9191dab6b6ffdadaffdadab66d6d +916d6d6d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d24246d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d24246d48486d48486d24246d48486d48486d24246d24246d24246d2424 +6d24246d48486d48486d24246d48486d48486d24246d24246d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24244824246d24246d24244824246d24244824246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffdadaffb6b6ffb6b6ffb6b6ffdadadab6b6dab6b6dab6b6dab6b6dab6b6 +da9191b69191b69191b69191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b66d6db66d6db69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6ddab6b6ffdadaffb6b6b69191b69191b66d6db66d6d916d6d +9148486d48486d48486d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +914848914848914848914848914848916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191da9191b69191da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191b69191da9191da9191da9191b69191b69191b69191da9191da9191 +da9191da9191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b66d6d916d6db66d6ddab6b6ffdadaffdadada9191 +b691916d24249148486d24246d48486d24246d48486d48486d48486d4848 +6d24246d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d48486d24246d48486d48486d24246d48486d24246d2424 +6d24246d48486d48486d24246d24246d48486d48486d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24244824246d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d2424482424 +ffffdaffffdaffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffb6b6ffb6b6ffdadaffdadaffdadaffb6b6da9191dab6b6dab6b6da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +916d6db66d6dda9191ffdadadab6b6b69191b66d6db66d6db69191916d6d +6d48486d48486d24246d24246d48486d24246d48486d24246d48486d2424 +6d24246d24246d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +914848914848914848914848916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191b69191da9191da9191b69191b66d6db69191b66d6db69191b69191 +b69191da9191b69191b69191da9191da9191da9191b69191da9191da9191 +da9191da9191da9191da9191da9191dab6b6da9191dab6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191da9191da9191b69191da9191da9191 +da9191da9191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6dffb6b6ffb6b6ffb6b6dab6b6 +b66d6d9148486d24246d48486d24246d48486d24246d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d48486d48486d24246d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffdadaffdadaffdadaffdadaffdadaffb6b6dab6b6ffb6b6ffb6b6da9191 +dab6b6da9191da9191dab6b6da9191b69191b69191b69191da9191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b69191b69191b66d6db69191b69191b66d6db66d6db66d6db66d6d +b69191b66d6db66d6db66d6db66d6db69191b69191b66d6db66d6d916d6d +916d6db66d6ddab6b6ffb6b6ffb6b6b69191b69191b66d6db66d6d916d6d +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +914848914848914848914848916d6d916d6d916d6db66d6d916d6d916d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191da9191da9191da9191b69191b69191b69191b66d6db69191b69191 +da9191da9191b69191da9191da9191da9191b69191b69191da9191da9191 +da9191da9191da9191da9191da9191dab6b6da9191dab6b6dab6b6dab6b6 +dab6b6da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191da9191da9191da9191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6ddab6b6ffdadaffb6b6da9191 +9148489148486d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffb6b6ffb6b6ffdadaffdadaffdadaffb6b6dab6b6ffb6b6ffb6b6da9191 +da9191b69191da9191da9191da9191b69191b69191b69191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6d +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +916d6d916d6db69191ffb6b6dab6b6b69191b66d6db69191916d6d916d6d +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +914848914848916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +da9191dab6b6da9191da9191da9191da9191b69191da9191da9191da9191 +da9191da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191b69191b66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6ddab6b6ffdadaffb6b6914848 +6d48486d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d48486d24246d48486d48486d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d48486d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffb6b6ffdadaffffdaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6dab6b6 +da9191da9191da9191dab6b6da9191b69191b66d6dda9191b69191da9191 +da9191b69191b69191b69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6d916d6db69191da9191da9191b69191b69191b66d6db66d6db66d6d +916d6d916d6d9148486d48486d48489148486d48486d48486d24246d4848 +6d48486d48486d24246d24246d24246d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d2424914848914848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191b69191da9191 +dab6b6da9191dab6b6dab6b6b69191b66d6db69191b69191b69191b69191 +da9191dab6b6dab6b6b69191b69191b69191b69191b69191da9191da9191 +da9191da9191da9191dab6b6dab6b6da9191da9191b69191b66d6db66d6d +b66d6d916d6d914848914848914848914848916d6d914848914848914848 +916d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db69191da9191ffdadaffdadab69191 +9148484824249148486d24246d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b69191b66d6db69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6ddab6b6da9191da9191b69191b69191b66d6db66d6d +916d6d9148489148489148486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d24246d24246d48486d48486d4848 +6d48486d48486d48486d48486d24246d4848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191b69191da9191 +dab6b6dab6b6dab6b6ffb6b6da9191b66d6db69191b69191b69191da9191 +dab6b6dab6b6dab6b6b69191b69191b69191b69191da9191da9191da9191 +dab6b6da9191da9191da9191b69191b69191b69191916d6d916d6d916d6d +9148489148489148489148489148489148489148489148486d4848914848 +916d6db66d6db66d6db66d6db69191b69191b69191da9191b69191b69191 +b69191b69191b66d6db66d6db69191b69191da9191ffdadaffdadadab6b6 +916d6d9148486d24249148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d24246d48486d48486d48486d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d24246d24246d2424 +6d24246d48486d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6da9191 +b69191dab6b6dab6b6da9191dab6b6da9191b69191da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db69191b66d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db69191dab6b6ffb6b6dab6b6da9191da9191b69191b69191b66d6d +916d6d916d6db66d6d9148489148489148486d4848914848914848914848 +9148486d48486d48486d48486d48486d48486d48486d24246d48486d4848 +6d48486d48486d48486d48486d48486d48486d4848914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191b69191da9191 +dab6b6ffb6b6ffb6b6ffb6b6da9191b69191b66d6db69191b66d6dda9191 +dab6b6dab6b6dab6b6b69191b66d6db69191b69191da9191da9191da9191 +da9191b69191b66d6db66d6d916d6d916d6d916d6d9148489148486d4848 +6d48486d4848914848914848914848914848916d6d916d6d914848914848 +914848916d6d916d6d916d6d916d6db66d6db66d6db69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6dda9191da9191ffdadaffb6b6ffb6b6 +b69191916d6d9148486d48486d48486d48486d48489148486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffff +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b66d6db69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6dda9191ffb6b6ffb6b6dab6b6b69191b69191b69191b66d6db66d6d +916d6d916d6db66d6db66d6d916d6d916d6d914848914848914848914848 +9148486d48486d48486d48486d48486d48486d24246d24246d24246d2424 +6d24246d48486d24246d48486d4848914848914848914848916d6d916d6d +916d6d916d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191b69191b69191da9191da9191 +dab6b6ffb6b6ffb6b6dab6b6da9191b66d6db66d6db69191b69191dab6b6 +ffb6b6ffb6b6dab6b6da9191b66d6db69191b69191b69191da9191b69191 +b69191b69191b69191b66d6db66d6db66d6d916d6d916d6d914848914848 +914848914848916d6d916d6d916d6d916d6db66d6db66d6d916d6d916d6d +916d6d914848916d6d916d6d916d6db66d6db66d6db69191b69191b69191 +b69191b69191b66d6db66d6db69191da9191ffb6b6ffb6b6ffb6b6da9191 +da9191916d6d916d6d6d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d24246d24246d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824244824246d24244824246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffb6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6b69191b69191b69191b69191b69191b69191b69191 +b69191da9191da9191da9191da9191b69191b66d6db69191b69191b66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6d +916d6db69191ffb6b6ffb6b6da9191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db69191b69191b69191916d6d914848914848916d6d +9148486d48486d48486d48486d48486d48486d24246d24246d24246d4848 +6d24246d48486d48486d48486d4848914848914848914848914848914848 +914848914848916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191da9191 +da9191dab6b6ffb6b6dab6b6da9191b66d6d916d6db66d6db69191da9191 +dab6b6dab6b6dab6b6b69191b69191b66d6db69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d914848 +914848916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6d914848916d6d916d6d916d6db66d6db69191b69191 +b66d6db66d6db66d6db66d6db69191da9191ffb6b6ffdadaffb6b6b66d6d +916d6d6d48486d48486d48489148486d48489148486d48489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24246d24244824246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffb6b6ffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6da9191da9191da9191b69191b69191b69191b69191b69191 +b69191da9191dab6b6da9191b69191b66d6db66d6db69191b69191b69191 +b66d6db69191b69191b66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db69191ffdadaffdadadab6b6b69191da9191b69191b69191b69191 +b66d6d916d6db66d6db69191da9191b69191b66d6d916d6d914848916d6d +916d6d6d48489148489148486d48486d24246d24246d24246d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48489148486d4848914848914848914848916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191 +b69191dab6b6dab6b6dab6b6da9191916d6db66d6db66d6db69191dab6b6 +dab6b6dab6b6da9191da9191b69191b69191b69191b69191b69191b69191 +b66d6db69191b66d6db66d6d916d6db66d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db69191da9191 +b69191b66d6db66d6db66d6d916d6db66d6d916d6db66d6db69191b66d6d +b69191b69191b69191b66d6db66d6dda9191ffb6b6ffdadaffb6b6b69191 +9148486d48486d48489148486d48489148486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d4848914848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d48486d48486d24246d24246d24246d48486d48486d48486d4848 +6d24246d48486d48486d48486d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6dab6b6da9191dab6b6 +ffb6b6dab6b6da9191b69191b69191da9191da9191b69191b69191b69191 +da9191da9191da9191b69191b69191b69191b66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6ddab6b6ffdadaffdadaffb6b6da9191da9191b66d6db69191b69191 +b66d6db66d6db66d6dda9191dab6b6da9191da9191b66d6db66d6d916d6d +916d6d914848916d6d9148489148486d24246d24246d48486d48486d4848 +6d48486d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d48486d48486d48486d48486d48486d48486d4848914848914848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191da9191dab6b6b69191b66d6db66d6db66d6db69191da9191 +dab6b6dab6b6dab6b6da9191b69191b69191b69191b69191b69191b69191 +b66d6db69191b66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191da9191da9191b69191da9191 +da9191b66d6db66d6db66d6db66d6d916d6d916d6db66d6db66d6db66d6d +b69191b66d6db66d6d916d6db66d6ddab6b6ffdadaffdadadab6b6b66d6d +916d6db69191b69191b69191916d6d9148489148486d48489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48489148489148489148486d48486d48486d48486d48489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d24246d48486d24246d48486d48486d24246d48486d2424 +6d24246d48486d48486d24246d24246d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffdadaffdadaffb6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191da9191da9191b69191da9191da9191da9191b69191b69191 +b69191da9191b69191b69191b69191b66d6db69191b69191b69191b66d6d +b66d6db69191b69191b69191b69191b66d6db69191b66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6ddab6b6ffffdaffdadaffb6b6dab6b6da9191b69191b66d6db69191 +b66d6d916d6d916d6dda9191ffb6b6ffb6b6ffb6b6da9191b69191916d6d +914848916d6d916d6db66d6d9148486d48486d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d48486d24246d48486d24246d24246d48486d4848 +6d4848914848914848914848916d6d916d6db66d6db69191b69191b69191 +b69191b69191da9191da9191b69191b66d6d916d6db66d6db66d6dda9191 +dab6b6dab6b6dab6b6da9191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b66d6db69191b66d6db69191b66d6db69191b69191 +b69191b69191b69191da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b66d6db66d6db66d6db69191dab6b6ffdadaffdadaffb6b6da9191 +da9191da9191dab6b6ffb6b6b691919148486d48486d48486d24246d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +914848914848914848916d6d9148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d24246d24246d48486d48486d2424 +6d48486d48486d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffffdaffffdaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6 +da9191dab6b6dab6b6da9191da9191da9191dab6b6da9191da9191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6ddab6b6ffdadaffffdaffdadaffb6b6da9191da9191b69191b69191 +b66d6d916d6d914848b66d6ddab6b6ffb6b6ffdadaffb6b6dab6b6b69191 +916d6db66d6d916d6db66d6d9148489148486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d48486d48486d24246d24246d2424 +6d24246d48486d4848914848914848916d6d916d6db66d6db69191b66d6d +b69191b69191b69191b69191b69191b66d6d916d6db66d6db69191da9191 +dab6b6dab6b6dab6b6da9191b69191b69191b69191b66d6db69191b66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191b69191b69191da9191da9191da9191dab6b6dab6b6da9191da9191 +da9191b69191da9191b69191da9191b69191b69191b69191b66d6db66d6d +b69191b69191b66d6db66d6db69191ffb6b6ffb6b6ffb6b6ffb6b6b66d6d +914848914848916d6ddab6b6dab6b6b66d6d6d48486d48486d24246d4848 +6d24246d48486d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +916d6d916d6d916d6d916d6d916d6d9148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d24246d24246d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffff +ffffffffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffdada +ffdadaffdadaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db69191b69191b69191b66d6db66d6db69191b66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6ddab6b6ffffdaffdadaffdadadab6b6dab6b6b69191b69191b66d6d +b69191b66d6d914848914848b66d6dda9191ffb6b6ffb6b6dab6b6dab6b6 +b66d6db69191b66d6db66d6d9148486d48486d48489148486d48486d4848 +6d48486d24246d24246d48486d24246d24246d24246d24246d48486d4848 +6d48486d24246d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d48486d48486d48486d4848914848916d6db66d6db66d6d +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6dda9191 +dab6b6dab6b6dab6b6dab6b6da9191b69191b69191b69191b69191b69191 +b66d6db69191b69191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191da9191da9191da9191da9191da9191da9191da9191 +b69191da9191b69191b69191b69191b69191da9191da9191b69191b69191 +b69191b69191b66d6db66d6dda9191ffb6b6ffdadada9191b66d6d916d6d +914848916d6d916d6ddab6b6ffb6b6b69191916d6d6d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d4848914848 +914848916d6d916d6d916d6d916d6d9148486d48486d48486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffffdaffdadaffdadaffdadaffb6b6ffb6b6dab6b6ffdadaffb6b6 +dab6b6da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191b69191 +b69191b69191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6ddab6b6ffdadaffdadaffffdadab6b6dab6b6b69191b69191b69191 +b69191b66d6d916d6d914848914848b69191da9191dab6b6ffb6b6ffdada +b69191b69191b66d6db66d6d9148486d48486d48489148486d48486d4848 +6d24246d24246d48486d48486d24246d48486d24246d48486d24246d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d24246d2424 +6d48486d48486d48486d48486d48486d48486d4848914848916d6db66d6d +b66d6db66d6db66d6db69191b66d6db66d6d916d6d916d6db66d6db69191 +da9191dab6b6dab6b6da9191da9191b69191b69191b66d6db69191b66d6d +b69191b69191b69191b69191b69191b69191b66d6d916d6d916d6d916d6d +916d6d916d6d916d6d914848916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db69191b69191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6dda9191dab6b6dab6b6b66d6d916d6d916d6d +b66d6db66d6d916d6db69191ffb6b6b691916d48486d48489148486d4848 +9148486d24249148486d48489148486d48489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +914848914848916d6d916d6d9148489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191dab6b6da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b66d6db69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6dda9191ffffdaffffdaffdadaffb6b6da9191dab6b6b69191b69191 +b69191b69191b66d6d914848916d6db66d6db69191da9191da9191da9191 +da9191b69191b69191916d6d9148486d48489148489148486d48486d4848 +6d48486d48486d48486d24246d48486d24246d48486d4848914848914848 +914848916d6d9148489148489148489148489148486d48486d48486d2424 +6d48486d48486d48486d48486d24246d24246d24246d4848914848916d6d +916d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db69191 +da9191dab6b6dab6b6da9191dab6b6b69191b69191b69191b69191b69191 +b69191b69191b69191da9191b69191b69191b66d6d9148486d48486d4848 +6d24246d24246d24246d48486d48486d4848916d6d916d6db66d6d916d6d +916d6d916d6db66d6db69191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b66d6db66d6db69191ffb6b6b691919148486d4848914848914848 +6d48486d48486d48489148489148489148486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d4848914848914848914848914848914848914848914848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +ffb6b6ffb6b6dab6b6da9191da9191dab6b6dab6b6da9191dab6b6da9191 +da9191b69191b69191da9191b69191b69191b69191b69191b69191b66d6d +b69191b69191b69191b66d6db69191b69191b69191b69191b66d6db69191 +b66d6db66d6db69191b66d6db69191b66d6db66d6db66d6db66d6d916d6d +b66d6ddab6b6ffdadaffffdaffdadaffb6b6dab6b6da9191da9191b69191 +b69191b69191b69191b66d6d916d6d916d6db66d6db66d6db69191b69191 +b69191b69191b69191916d6d9148489148486d48486d48486d48486d4848 +9148486d48486d48486d48486d4848914848914848914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d916d6d +916d6d916d6d9148489148486d48486d24246d48486d48486d4848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6d916d6d6d48486d48486d4848 +6d24246d2424914848b66d6db66d6db66d6db66d6dffb6b6b69191b66d6d +916d6d914848916d6d914848916d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b69191b66d6db66d6db69191b69191b69191b69191b69191 +b69191b66d6db66d6ddab6b6ffb6b6916d6d482424916d6d6d2424916d6d +6d24249148486d48489148486d48489148486d48486d48486d4848914848 +6d48489148486d48489148489148486d48489148486d48486d48486d4848 +6d48489148489148486d48486d4848914848914848914848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d48486d2424 +6d24246d24246d24246d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffdada +ffdadaffffdaffdadaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6 +dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db69191da9191b69191b69191b66d6db69191 +b69191b69191b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +b69191da9191ffdadaffdadaffffdaffb6b6dab6b6da9191da9191b69191 +b69191b69191b69191b69191916d6d914848916d6db69191b69191b69191 +b69191b69191b69191b66d6d916d6d6d48489148486d48486d48486d4848 +6d48486d4848914848914848914848916d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6db66d6db69191b69191da9191b69191b69191b69191 +b69191b66d6db66d6db66d6d916d6d9148486d48486d48486d24246d2424 +6d48486d48486d48486d48486d4848914848916d6d916d6d916d6db66d6d +b69191da9191da9191da9191da9191b69191b69191b69191b69191da9191 +b69191b69191da9191b69191b69191b66d6db66d6d914848914848914848 +6d48486d2424914848b69191916d6d916d6dffb6b6ffb6b6ffdadab69191 +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191da9191 +b69191da9191b69191b69191b69191b69191da9191b69191b69191b69191 +b69191b66d6db69191dab6b6dab6b6916d6d9148486d24249148486d4848 +9148486d48489148486d48489148486d48486d48486d4848914848914848 +9148486d48486d48489148486d48489148486d48486d48486d4848914848 +9148489148489148489148486d4848914848914848914848914848914848 +9148489148486d48486d48489148489148486d48489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d24246d48486d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffdadaffdadaffffdaffffdaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191da9191b69191b66d6d +b66d6db66d6db69191b69191b66d6db66d6db69191b66d6db66d6db66d6d +b69191da9191ffb6b6ffdadaffffdaffdadadab6b6da9191dab6b6da9191 +b69191b69191b69191b69191b66d6d916d6db69191b69191b69191b69191 +b66d6db69191b69191b66d6d916d6d6d48486d48486d48486d4848914848 +6d48486d48486d4848914848914848914848914848916d6d916d6d916d6d +b66d6db66d6db66d6db69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d9148486d48486d48486d2424 +6d24246d24246d48486d24246d24246d4848914848916d6d916d6db66d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6d914848914848914848 +9148486d48486d48486d24246d2424916d6dffb6b6ffb6b6da9191b69191 +b69191b69191b66d6db69191b69191b69191b66d6db66d6db69191b69191 +b69191b69191b69191b66d6db66d6db66d6db69191da9191b69191b69191 +b69191b69191b69191ffb6b6da91919148489148489148489148486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d4848914848 +9148489148489148489148486d48486d48489148486d48486d48486d4848 +6d48489148489148489148486d48486d4848914848914848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d24246d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6 +ffb6b6ffdadaffffdaffdadaffdadaffdadaffb6b6ffdadaffb6b6ffdada +ffb6b6ffb6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191b69191b69191da9191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b69191b69191b66d6d +b66d6db69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6dda9191ffdadaffffdaffdadaffb6b6dab6b6dab6b6dab6b6 +da9191b69191b66d6db66d6db69191b66d6db66d6db69191b69191b69191 +b69191b69191b69191b66d6d916d6d6d48486d48486d48486d4848914848 +6d48486d48489148489148486d4848914848914848916d6d916d6db66d6d +b69191b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b66d6d +b66d6d916d6d916d6db66d6db66d6db66d6d916d6d6d48486d48486d2424 +6d24246d24246d24246d24246d24246d2424914848916d6d916d6d916d6d +b66d6db69191b69191b69191da9191da9191da9191da9191b69191da9191 +da9191da9191da9191b69191b66d6db66d6db66d6db66d6d916d6d916d6d +9148489148489148486d4848914848b66d6dda9191da9191da9191da9191 +da9191da9191da9191da9191dab6b6dab6b6da9191b69191da9191da9191 +da9191da9191b69191b69191b66d6db66d6db69191b69191b69191b69191 +b69191b69191dab6b6ffb6b6b69191916d6d9148486d4848914848914848 +6d48489148486d48489148489148486d48486d4848914848914848914848 +9148486d48489148489148486d48486d48486d4848914848914848914848 +9148489148486d4848914848914848914848914848914848914848914848 +9148489148486d48486d48489148486d48486d48486d4848914848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48489148489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d48486d24246d48486d24246d24246d24246d2424 +6d48486d24246d24246d48486d48486d24246d24246d48486d24246d4848 +6d24246d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6 +ffb6b6ffdadaffffdaffffdaffdadaffb6b6dab6b6ffdadaffb6b6dab6b6 +dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191da9191b69191 +b69191b69191b66d6db69191b69191b69191b69191b66d6db66d6db66d6d +916d6db66d6dda9191ffdadaffdadaffffdaffdadaffb6b6dab6b6dab6b6 +da9191da9191b66d6db66d6db69191b66d6db66d6db66d6db69191b69191 +b69191b69191b69191b66d6d9148489148486d48486d48486d4848914848 +9148486d48486d48486d48486d4848914848916d6d916d6d916d6d916d6d +b66d6d916d6d916d6d914848914848914848916d6d916d6db66d6db66d6d +b66d6d914848916d6d914848916d6d9148486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d4848914848916d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +da9191da9191b69191b69191b69191916d6d916d6db66d6d916d6d916d6d +916d6d914848914848916d6db66d6db69191b69191da9191da9191dab6b6 +da9191b69191b69191b69191da9191da9191da9191b69191b69191b69191 +da9191b69191b69191b66d6d916d6db66d6db66d6db69191b69191da9191 +b69191b69191dab6b6ffb6b6da9191916d6d6d4848916d6d914848914848 +6d48489148486d48489148489148486d48486d48486d48486d48486d4848 +6d48486d48486d48489148486d48486d48489148486d48486d48486d4848 +9148489148489148486d48489148489148489148489148486d4848914848 +9148489148486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48489148486d4848914848914848914848 +9148486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d24246d24246d48486d48486d24246d24246d24246d24246d24246d4848 +6d24246d24246d48486d24246d24246d24246d48486d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d48486d24246d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffffdaffffdaffdadaffffdaffb6b6ffb6b6ffdadaffb6b6ffb6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191 +da9191da9191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db69191da9191da9191da9191da9191 +b69191b69191b69191da9191da9191dab6b6da9191b69191b66d6db69191 +b66d6db66d6dda9191ffdadaffffdaffffdaffdadaffb6b6dab6b6da9191 +dab6b6da9191b69191b66d6db66d6db69191b66d6db66d6db66d6db69191 +b69191b69191da9191b69191b66d6db66d6d9148486d4848914848914848 +9148486d48486d48486d48486d4848916d6d916d6d916d6d914848916d6d +9148486d48486d48486d48486d24246d48486d4848914848916d6db66d6d +916d6d916d6d9148486d48489148486d48486d48486d24246d24246d4848 +6d48486d24246d24246d24246d24246d24246d4848914848916d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191b69191da9191 +dab6b6da9191b69191b69191b69191916d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6db69191b69191da9191dab6b6dab6b6dab6b6dab6b6 +da9191b69191b69191da9191da9191da9191da9191da9191da9191b69191 +b69191b69191b69191b69191b66d6db66d6db69191b69191da9191b69191 +b69191b69191dab6b6ffb6b6ffb6b6916d6d916d6d6d48489148486d4848 +9148489148489148486d48486d48486d48489148486d4848914848914848 +9148489148486d48486d48489148489148489148489148489148486d4848 +6d4848914848914848914848914848914848914848914848914848914848 +6d48489148486d48489148486d48489148486d48489148489148486d4848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48489148486d48489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d24246d48486d48486d48486d48486d48486d48486d24246d2424 +6d48486d24246d24246d48486d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d48486d48486d24246d48486d24246d2424 +ffffdaffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffffda +ffffdaffffdaffdadaffdadaffdadaffdadaffdadaffb6b6dab6b6dab6b6 +ffb6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191dab6b6 +da9191da9191b69191b69191b69191b69191b69191da9191b69191da9191 +b69191b69191b69191b69191b69191da9191da9191dab6b6da9191da9191 +b66d6db66d6db69191da9191dab6b6dab6b6dab6b6b69191b66d6db66d6d +b66d6db66d6dda9191ffb6b6ffffdaffffdaffffdaffb6b6ffb6b6da9191 +da9191da9191b69191b66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b69191916d6d916d6d6d48486d48486d4848914848 +6d48486d48486d48486d48486d4848916d6d9148489148486d48486d4848 +6d48486d48486d48486d24246d4848916d6db66d6db66d6db69191b66d6d +b66d6d9148486d48486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d4848914848b66d6db66d6d +b66d6db69191b66d6db69191b66d6db69191b69191b69191b69191b69191 +da9191b69191b66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6d +916d6db66d6db66d6db69191b69191da9191da9191b69191da9191da9191 +da9191b69191da9191da9191b69191da9191da9191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db69191da9191 +b66d6db66d6dda9191ffb6b6ffb6b6b66d6d914848914848914848914848 +9148486d48489148489148489148486d48489148486d4848914848914848 +9148489148486d48486d48486d48486d48486d48489148486d4848914848 +9148489148489148489148489148489148486d4848914848914848914848 +6d48489148486d48489148486d48486d48486d4848914848914848914848 +9148489148489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d24246d48486d24246d2424 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d2424 +6d48486d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffffffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffffdaffdadaffdadaffdadaffdadaffffdaffdadaffb6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191da9191da9191dab6b6dab6b6dab6b6 +da9191b69191b69191b66d6db69191b69191da9191da9191da9191b69191 +b69191b66d6db69191b69191dab6b6da9191da9191b69191b66d6db66d6d +b66d6db69191da9191ffb6b6ffdadaffffdaffdadaffdadaffb6b6da9191 +b66d6db66d6db66d6db66d6d916d6db66d6db69191b66d6db66d6db66d6d +b69191b69191b69191b66d6d9148489148486d4848914848914848914848 +6d48486d48489148489148486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48484824246d2424b69191b69191914848da9191ffb6b6 +b66d6d6d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d4848916d6d916d6db66d6d +b66d6db69191b69191b69191b69191da9191b69191b69191b69191da9191 +da9191da9191b69191da9191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db69191da9191da9191da9191dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191dab6b6da9191da9191da9191da9191 +da9191b69191b69191b69191b66d6db66d6db66d6db66d6db69191da9191 +b69191b66d6db69191da9191dab6b6b66d6d916d6d914848914848916d6d +9148489148486d4848914848914848914848914848914848914848914848 +9148489148489148489148486d48486d4848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +9148486d48486d48489148489148486d48486d4848914848914848914848 +914848916d6d9148489148489148489148489148489148486d4848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d24246d24246d48486d48486d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d48486d48486d48486d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffffffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffdadaffb6b6ffb6b6ffdadaffdadaffdadaffb6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191da9191b69191da9191da9191dab6b6dab6b6ffb6b6ffb6b6 +dab6b6da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191da9191da9191b69191b69191b66d6db69191 +b66d6db66d6db66d6dda9191ffb6b6ffdadaffffdaffdadaffb6b6b66d6d +914848914848914848916d6d916d6db69191b69191b69191b66d6db66d6d +b66d6db69191b69191916d6d9148486d48486d48489148486d48486d4848 +9148489148489148489148486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d24246d48486d48486d4848916d6ddab6b6ffb6b6 +b691916d24246d24244824246d48486d24246d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d4848914848b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191b69191da9191b69191b69191b69191b66d6db69191b66d6db66d6d +b66d6db66d6db69191b69191da9191da9191da9191da9191dab6b6da9191 +da9191da9191da9191da9191da9191da9191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6dda9191 +b69191b69191b66d6dda9191ffb6b6b691919148489148486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48489148489148486d4848914848914848 +6d4848914848914848914848914848914848914848914848914848914848 +6d48486d48489148486d48486d48489148486d48486d4848914848914848 +9148489148489148489148489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d24246d48486d4848 +6d48486d24246d24246d24246d48486d24246d24246d24246d48486d4848 +6d48486d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffffffffda +ffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffffdaffffda +ffdadaffb6b6ffb6b6ffb6b6ffdadaffffdaffdadaffdadaffb6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191b69191b69191b69191da9191dab6b6ffb6b6ffb6b6ffb6b6 +dab6b6dab6b6b69191b69191b66d6db69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b66d6db66d6db69191 +b69191b69191916d6db66d6ddab6b6ffdadaffdadaffffdaffb6b6b69191 +6d48486d48486d4848914848916d6db66d6db69191b69191b66d6db66d6d +b69191b69191b69191916d6d9148486d48486d48486d48486d48486d4848 +916d6db66d6d916d6d6d48486d4848914848916d6d916d6d916d6d914848 +9148486d48486d48486d48486d48486d48486d4848b66d6dda9191b69191 +916d6d6d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d4848914848916d6d916d6d +b66d6db66d6db69191b66d6db69191b69191b69191da9191da9191b69191 +da9191da9191da9191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191da9191dab6b6dab6b6dab6b6dab6b6ffb6b6ffb6b6 +dab6b6dab6b6da9191dab6b6da9191da9191da9191da9191da9191b69191 +b69191b69191b66d6db69191b69191b66d6db66d6d916d6db69191da9191 +dab6b6da9191b69191da9191dab6b6dab6b6916d6d914848914848914848 +914848914848914848914848914848914848916d6d914848914848914848 +9148489148489148489148489148489148489148489148486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148489148486d48489148486d4848914848914848914848 +9148489148489148486d48486d48486d48486d48489148486d4848914848 +6d48486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d48486d2424 +6d24246d24246d24246d24246d24246d48486d24246d24246d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffffdaffffda +ffdadaffb6b6ffb6b6ffdadaffdadaffdadaffdadaffdadaffb6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191b69191b69191b69191b69191dab6b6dab6b6ffb6b6ffb6b6 +dab6b6da9191b69191b69191b66d6db66d6db66d6db69191b69191b69191 +b66d6db69191b66d6db66d6db66d6db66d6db69191b66d6db66d6db69191 +da9191da9191da9191b69191dab6b6ffb6b6ffdadaffdadaffdadadab6b6 +9148486d48486d4848914848916d6db66d6db69191b69191b66d6db66d6d +b69191b69191b691919148489148486d48486d48486d48486d4848916d6d +b66d6d916d6d916d6d6d48486d24249148486d4848b66d6d916d6d916d6d +914848916d6d914848916d6d914848916d6d916d6db66d6d916d6d916d6d +9148486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d4848914848916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b66d6db69191b69191b69191da9191b69191b69191b69191b69191b66d6d +b69191b69191b69191b69191da9191da9191dab6b6dab6b6dab6b6dab6b6 +da9191da9191da9191dab6b6b69191b69191b69191b69191b69191b69191 +b66d6db69191b66d6db66d6db66d6db69191b66d6d916d6db66d6db69191 +dab6b6dab6b6da9191b69191dab6b6dab6b6916d6d6d4848916d6d6d4848 +9148486d4848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148489148486d48489148486d4848914848 +6d48489148489148489148489148489148489148489148486d4848914848 +9148489148489148489148486d48489148486d4848914848914848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d2424 +6d48486d48486d48486d48486d48486d24246d24246d24246d24246d4848 +6d48486d48486d48486d48486d24246d24246d48486d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6ffb6b6dab6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191b69191da9191da9191dab6b6dab6b6 +dab6b6b69191b69191b66d6db69191b66d6db69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db69191b69191b66d6db69191dab6b6 +ffdadaffb6b6da9191b66d6db66d6dda9191ffb6b6ffdadaffffdaffb6b6 +916d6d6d48486d48486d4848b66d6db69191b69191b69191b66d6d916d6d +b69191da9191da9191916d6d6d48486d48486d48486d48486d4848916d6d +b66d6db66d6d9148486d48486d24246d48486d4848914848916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6d6d48486d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848b66d6d +b66d6db66d6db66d6db69191b66d6db69191b69191da9191da9191da9191 +da9191b69191b69191da9191dab6b6da9191da9191da9191da9191da9191 +da9191b69191da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191b69191 +da9191b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +da9191dab6b6dab6b6da9191dab6b6da9191916d6d916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d48486d24246d48486d48486d24246d48486d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffffda +ffffdaffdadaffb6b6ffb6b6ffdadaffb6b6ffdadaffb6b6ffb6b6ffb6b6 +ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191b69191b69191b69191b66d6db69191b69191b69191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6dda9191ffdada +ffdadab691916d48486d24244824246d2424b69191ffb6b6ffffdaffb6b6 +916d6d6d48486d48486d2424916d6db66d6db69191b69191b66d6db66d6d +b66d6db69191b66d6d9148486d48486d48486d48486d4848914848914848 +916d6d916d6d9148486d48486d48486d24246d4848914848916d6d916d6d +916d6d916d6db66d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6d +9148486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191da9191da9191da9191da9191b69191 +b69191b69191b69191b69191da9191da9191dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191b69191da9191da9191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +b69191da9191dab6b6dab6b6dab6b6da9191b66d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6d916d6db66d6db66d6db66d6d916d6d9148486d4848914848914848 +9148489148486d48489148489148489148489148489148486d4848914848 +9148489148489148489148486d48486d48489148489148486d48486d4848 +6d48489148489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d24246d24246d48486d4848 +6d48486d24246d48486d48486d48486d48486d24246d24246d24246d2424 +6d24246d24246d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d24246d24246d24246d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffffda +ffffdaffdadaffdadaffdadaffdadaffdadaffdadaffdadaffdadaffdada +ffb6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6ddab6b6ffdada +ffb6b6b66d6d6d48486d48484824246d24246d2424916d6d916d6d916d6d +6d48486d48486d2424914848914848b69191b69191b69191b66d6db69191 +b66d6db69191916d6d6d48486d48486d48486d4848914848916d6d914848 +916d6d916d6d916d6d9148489148486d48486d4848914848916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db69191b69191b66d6db66d6d +9148486d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d2424914848916d6d +916d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191b69191da9191b69191da9191da9191da9191dab6b6da9191da9191 +da9191da9191da9191da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +916d6db69191da9191dab6b6dab6b6da9191b66d6d916d6d6d4848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6db69191dab6b6dab6b6da9191da9191916d6d6d4848914848b66d6d +b66d6db66d6d914848914848914848914848914848914848914848914848 +9148489148486d48489148486d48489148489148489148486d48486d4848 +9148489148489148489148489148486d48489148486d48489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48489148489148489148486d48486d48486d48486d4848 +6d48486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d48486d4848 +6d48486d24246d48486d48486d48486d24246d24246d24246d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffffda +ffffdaffdadaffdadaffdadaffb6b6ffb6b6ffdadaffdadaffb6b6ffb6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6da9191dab6b6dab6b6da9191da9191 +da9191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b69191b69191b69191 +b66d6db69191b66d6db69191b66d6db66d6d916d6db66d6dffb6b6ffdada +ffb6b6b69191916d6d9148486d48486d48486d24246d48486d24246d2424 +6d24246d48486d4848914848916d6db66d6db69191b69191b66d6db66d6d +b66d6db66d6d916d6d9148486d48489148486d48489148486d4848914848 +914848914848914848914848914848916d6d914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6d916d6db66d6d916d6d +9148486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d4848914848 +b66d6db66d6d916d6db66d6db66d6db69191b69191b69191b69191b66d6d +b66d6db69191b69191b69191b69191b69191b69191da9191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191da9191da9191 +da9191dab6b6da9191dab6b6dab6b6dab6b6da9191da9191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6d916d6db66d6db69191da9191dab6b6b69191914848916d6d914848 +9148489148489148489148489148489148489148489148486d4848914848 +b66d6dda9191dab6b6dab6b6dab6b6dab6b6b69191914848b69191b69191 +dab6b6da9191b66d6d916d6d9148486d4848914848914848914848914848 +9148486d48489148489148489148489148489148486d48486d48486d4848 +9148489148486d48489148489148486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d24246d4848 +6d48486d48486d48486d48486d48486d48486d24246d24246d48486d2424 +6d24246d48486d48486d24246d48486d24246d48486d48486d24246d4848 +6d48486d24246d24246d24246d24246d24246d24246d24246d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffffffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffdadaffdadaffdadaffdadaffdadaffb6b6ffdada +ffdadaffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6d916d6db66d6ddab6b6ffffda +ffb6b6b66d6db66d6d916d6db66d6d9148486d48486d48486d48486d4848 +6d48486d4848914848b66d6db66d6db69191b69191b69191b66d6db66d6d +b69191b66d6d916d6d9148486d48489148486d48486d48486d48486d4848 +914848914848914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6d9148486d48486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +916d6d916d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191da9191da9191da9191b69191da9191da9191dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6da9191da9191b69191b69191b69191da9191da9191 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191 +b66d6d916d6d916d6db69191da9191dab6b6da9191916d6d916d6d914848 +916d6d914848916d6d914848916d6d914848914848914848914848914848 +916d6dda9191ffb6b6dab6b6dab6b6dab6b6da9191b66d6ddab6b6ffb6b6 +ffb6b6ffb6b6da9191916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148486d48486d48486d48486d4848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48489148486d48486d48486d48486d2424 +6d24246d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d24246d48486d24246d48486d48486d48486d48486d48486d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffffffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6dab6b6da9191dab6b6dab6b6dab6b6da9191da9191da9191 +da9191b69191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6d916d6db66d6ddab6b6ffb6b6 +ffdadab66d6d916d6d916d6db66d6d916d6d9148486d48486d48486d4848 +6d48486d4848914848916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d9148486d48486d48486d48486d48486d48486d48486d4848 +9148486d4848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db69191b66d6d +916d6d6d48486d48486d24246d24244824246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191da9191dab6b6 +dab6b6dab6b6dab6b6da9191da9191b69191da9191da9191b69191da9191 +da9191da9191da9191da9191dab6b6da9191da9191da9191da9191da9191 +b69191b69191b69191b66d6db66d6db66d6db66d6d916d6d916d6db66d6d +916d6d916d6d914848b66d6db69191da9191da9191916d6d916d6d914848 +914848916d6d9148489148489148489148489148489148486d4848914848 +916d6db69191dab6b6dab6b6dab6b6dab6b6da9191da9191dab6b6dab6b6 +dab6b6dab6b6b69191916d6d9148486d48486d48489148486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48486d48486d48486d48486d48486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d24246d2424 +6d24246d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d24246d24246d48486d48486d48486d24246d24246d24246d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffdadaffdadaffb6b6dab6b6ffb6b6ffb6b6ffdadaffb6b6 +ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191b69191da9191b69191da9191b69191da9191 +b69191b69191b66d6db69191b69191da9191da9191b69191da9191b69191 +b69191b69191b66d6db66d6db66d6db66d6d916d6d916d6dda9191ffdada +ffdadab66d6d914848916d6d916d6db66d6d916d6d916d6d9148486d4848 +6d48486d24246d4848914848b66d6db66d6db66d6db69191b66d6db69191 +b66d6d9148486d48486d48486d48486d48486d48486d48486d48486d4848 +914848914848914848916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +916d6d9148486d48486d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424914848 +916d6d916d6db66d6db66d6db69191b69191b66d6db66d6db69191b69191 +b69191b69191b69191b69191da9191da9191da9191da9191da9191dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191dab6b6 +dab6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +b69191da9191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6db69191da9191dab6b6da9191b66d6d914848916d6d +914848914848914848914848914848914848914848914848914848914848 +914848916d6db66d6db69191da9191dab6b6dab6b6ffb6b6dab6b6ffb6b6 +dab6b6dab6b6b69191914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48489148489148489148489148486d4848 +6d48486d48489148486d48489148486d48489148486d48486d48486d4848 +6d48489148489148486d48486d48486d48486d48489148486d4848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d4848 +6d24246d48486d48486d48486d24246d48486d48486d24246d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffdadaffdadaffdadadab6b6dab6b6ffb6b6ffb6b6ffb6b6 +dab6b6dab6b6dab6b6da9191dab6b6dab6b6b69191da9191da9191da9191 +da9191b69191b69191da9191b69191b69191b69191da9191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191da9191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db69191ffb6b6 +ffdadab69191914848916d6d914848916d6d916d6db66d6d916d6d6d4848 +6d48486d24246d2424914848916d6db66d6db66d6db66d6db66d6db69191 +b66d6d9148486d48486d48486d24246d48486d24246d48486d24246d4848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +9148486d48486d24246d48486d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +914848916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6db69191b69191b69191b69191b69191b66d6db69191b69191 +b69191da9191dab6b6da9191dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191da9191dab6b6da9191da9191da9191da9191da9191da9191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6d +914848914848916d6d916d6db69191da9191b69191916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d4848916d6dda9191ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6 +dab6b6b69191b66d6d9148486d4848914848914848914848914848914848 +9148489148489148489148489148486d4848914848914848914848914848 +9148489148489148489148486d48486d48486d48489148489148486d4848 +6d48486d48489148486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48489148489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d24246d4848 +6d48486d48486d48486d24246d24246d24246d24246d48486d48486d2424 +6d24246d24246d48486d48486d48486d48486d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6ffdadaffdadaffb6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191dab6b6 +da9191da9191b69191da9191da9191b69191b69191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6dffb6b6 +ffdadada9191916d6d914848b66d6d914848b66d6db66d6db66d6d914848 +9148486d48486d48486d4848916d6d916d6db69191b66d6db66d6db66d6d +b66d6d9148486d48486d48486d48486d48486d48486d24246d48486d4848 +916d6db66d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d914848 +6d48486d24246d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +916d6d916d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191 +b69191b69191b69191da9191b69191da9191da9191b69191b69191b69191 +da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191dab6b6da9191dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +916d6d916d6db66d6db66d6db69191da9191da9191916d6d916d6d914848 +916d6d914848916d6d914848916d6d914848914848914848914848914848 +9148486d4848914848b66d6ddab6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +da9191916d6d9148489148486d4848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d48486d48489148489148486d48486d48486d48489148486d4848 +6d48486d48489148489148489148486d48486d48486d48489148486d4848 +9148489148489148486d48486d48486d48486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d24246d48486d24246d24246d48486d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6dab6b6 +da9191da9191dab6b6dab6b6dab6b6dab6b6da9191b69191da9191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6dffb6b6 +ffdadada9191b66d6d916d6d916d6d914848916d6d916d6d916d6d914848 +6d48486d48486d48486d4848916d6db66d6db66d6db66d6db66d6db66d6d +916d6d9148486d48486d24246d24246d48486d48486d48486d4848914848 +916d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d +916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d916d6d6d4848 +6d48486d24246d24246d48486d48486d24246d24246d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +914848916d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191da9191b69191b69191da9191da9191da9191da9191dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6d916d6d916d6d +916d6d916d6db66d6db66d6db69191dab6b6da9191914848914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +9148486d48486d4848b66d6dda9191dab6b6ffb6b6ffb6b6ffb6b6da9191 +b66d6d9148489148486d4848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48489148489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48489148486d48486d4848 +6d48486d48489148486d48489148486d48486d48486d48486d4848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d24246d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d2424 +6d24246d24246d48486d24246d24246d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffdadaffdadaffdadaffffdaffdadaffdadaffdadaffb6b6ffb6b6dab6b6 +dab6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6da9191b69191da9191b69191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6d916d6db66d6dffb6b6 +ffffdada9191b66d6d914848916d6d916d6d916d6db66d6d916d6d914848 +6d48486d48486d24246d4848914848b66d6db66d6db66d6db66d6db66d6d +9148486d48486d24246d48486d24246d48486d48486d48486d4848916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d9148486d4848 +6d24246d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +914848916d6d916d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191da9191b69191da9191da9191 +da9191b69191b69191da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191da9191da9191dab6b6da9191da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db69191b69191da9191dab6b6da9191b66d6d914848916d6d +914848914848914848914848914848914848914848914848916d6d914848 +9148486d48486d4848914848b66d6dda9191dab6b6da9191da9191b66d6d +9148486d4848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d48486d48486d48489148486d48486d48486d4848 +6d48489148486d48489148486d48486d48486d48486d48486d4848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d48486d4848 +6d24246d24246d24246d48486d48486d48486d48486d24246d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffff +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6 +ffdadaffdadaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +dab6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191 +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db69191b66d6db69191b66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6dffb6b6 +ffdadadab6b6916d6db66d6d914848916d6d914848916d6d916d6d914848 +6d48486d48486d48486d4848914848b66d6db66d6d916d6d916d6db66d6d +9148486d48486d48486d48486d48486d48486d48486d4848914848914848 +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d916d6d +b66d6d916d6db66d6db66d6d916d6d916d6d916d6d9148486d48486d2424 +6d48486d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d4848914848916d6db66d6db69191b66d6db69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db69191b66d6db69191da9191 +da9191da9191b69191b69191b69191b69191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191da9191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6dffb6b6b69191914848914848914848 +914848914848914848914848914848914848914848916d6db66d6d916d6d +9148489148486d48486d4848914848916d6d916d6db66d6d916d6d916d6d +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d4848914848914848914848914848914848914848 +9148486d48489148486d48489148486d4848914848914848914848914848 +6d48489148489148489148486d48486d48489148486d48486d48486d4848 +6d48489148489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d24246d24246d4848 +6d48486d48486d48486d48486d48486d24246d24246d48486d48486d4848 +ffffdaffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffffdaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6ffdadaffb6b6 +dab6b6dab6b6dab6b6da9191da9191dab6b6da9191da9191da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b69191 +b69191b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6ddab6b6 +ffdadadab6b6b66d6d914848916d6d914848916d6d916d6d916d6d914848 +6d48486d24246d48486d4848916d6db69191b66d6d916d6db66d6d916d6d +916d6d6d48486d48486d48486d48486d48486d48486d4848914848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d9148486d48486d48486d4848 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d4848914848916d6d916d6db66d6db66d6db69191b69191b69191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191da9191 +dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191 +dab6b6dab6b6da9191da9191da9191da9191da9191da9191da9191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b69191b66d6db66d6db69191dab6b6da9191916d6d916d6d6d4848 +916d6d914848916d6d914848916d6d914848b66d6db66d6db69191b66d6d +916d6d916d6d9148489148489148489148489148489148486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48489148486d48486d4848914848 +6d48486d48486d48486d48486d48486d48489148489148486d48486d4848 +9148489148486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d24246d48486d4848 +6d48486d48486d48486d24246d24246d48486d24246d24246d24246d4848 +ffffdaffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffdadaffdadaffdadaffdadaffb6b6ffdadaffb6b6ffb6b6 +dab6b6da9191da9191da9191dab6b6da9191da9191da9191da9191b69191 +b69191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6dda9191 +ffb6b6dab6b6b66d6d916d6d914848914848914848914848916d6d914848 +6d48486d48486d24246d2424916d6d916d6db66d6db66d6db66d6db66d6d +916d6d6d48486d48486d48486d24246d48486d24246d48486d4848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6d916d6d916d6d6d48486d48486d24246d4848 +6d24246d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d4848914848916d6db66d6db66d6db69191b69191b69191b69191da9191 +da9191da9191da9191b69191b69191b66d6db69191b66d6db66d6db66d6d +b69191da9191dab6b6dab6b6dab6b6da9191da9191b69191b69191b69191 +da9191da9191b69191da9191da9191b69191b69191b66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6db66d6db66d6d916d6db69191ffb6b6b66d6d914848914848914848 +914848916d6d914848914848914848916d6db66d6db66d6db66d6db66d6d +b66d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148489148489148489148486d4848914848914848914848 +9148489148489148489148489148489148489148486d4848914848914848 +6d48486d48489148489148489148486d48486d48486d48486d48486d4848 +9148486d48486d48489148486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d24246d24246d48486d48486d24246d48486d24246d24246d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6 +ffb6b6ffdadaffdadaffffdaffdadaffdadaffb6b6dab6b6ffdadadab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191 +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6db69191 +ffb6b6ffb6b6b69191914848916d6d916d6d914848916d6d916d6d916d6d +9148489148486d48486d2424914848b66d6db66d6db69191b66d6db66d6d +b66d6d916d6d9148486d48486d24246d48486d48486d48486d4848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d6d48486d48486d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d48486d48486d2424 +6d2424914848916d6d916d6db66d6db69191b69191b69191da9191dab6b6 +ffb6b6ffb6b6dab6b6da9191b69191b69191b69191b69191da9191b69191 +b69191b69191da9191ffb6b6dab6b6dab6b6da9191dab6b6da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b66d6db66d6ddab6b6ffb6b6b66d6d916d6d6d4848916d6d +914848914848914848914848914848914848916d6db69191b69191b66d6d +b66d6d914848914848914848914848914848916d6d916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148489148489148489148486d4848914848 +9148489148489148489148486d48489148489148486d48486d48486d4848 +6d48486d48489148489148489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d48486d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d24246d24246d24246d48486d48486d24246d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffb6b6ffb6b6 +ffdadaffdadaffdadaffdadaffdadaffdadaffdadadab6b6ffb6b6dab6b6 +da9191dab6b6dab6b6dab6b6dab6b6da9191b69191b69191da9191b69191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b69191b69191b66d6db66d6db69191b69191b66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6d916d6d916d6db66d6d +ffb6b6ffb6b6b69191916d6d914848916d6d916d6d916d6d916d6d916d6d +916d6d9148486d48486d48486d4848da9191b69191da9191b66d6db69191 +b66d6d916d6d6d48486d48484824246d48486d24246d48486d4848914848 +914848916d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6d916d6d9148486d48486d48486d48486d2424 +6d48486d24246d24246d24246d24246d48486d24246d24246d24246d4848 +6d48486d24246d48486d24246d24246d24246d48486d48486d24246d2424 +6d4848914848916d6d916d6db66d6db66d6db69191da9191ffb6b6ffb6b6 +ffdadaffb6b6dab6b6da9191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db69191da9191dab6b6da9191dab6b6b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6d916d6ddab6b6ffb6b6b66d6d6d48489148486d4848 +9148489148489148486d4848914848914848916d6db66d6db66d6db66d6d +916d6d914848914848914848916d6db66d6db69191b69191b66d6d914848 +914848914848914848914848914848914848914848914848914848914848 +916d6db66d6d916d6d916d6d914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d48486d4848 +9148489148489148489148489148489148489148486d48486d4848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48489148489148489148489148486d48486d48486d48486d4848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d48486d4848 +ffffdaffffdaffffdaffffffffffdaffffdaffffdaffffdaffffdaffffff +ffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffffda +ffdadaffdadaffb6b6ffb6b6ffdadaffdadaffdadaffdadaffb6b6dab6b6 +dab6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b69191b69191b69191b69191b66d6db66d6db69191b69191b66d6d +b69191b66d6db66d6db66d6db69191b66d6db66d6db66d6d916d6db66d6d +dab6b6ffdadada9191b66d6d914848916d6d914848916d6d916d6d916d6d +916d6d9148486d48486d2424914848b69191ffb6b6da9191da9191b66d6d +b691919148486d48486d24246d48486d24246d48486d24246d48486d4848 +914848916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6d916d6d9148486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +914848914848916d6d916d6db66d6db66d6dda9191dab6b6ffb6b6ffb6b6 +ffb6b6dab6b6dab6b6da9191b69191b69191b69191b69191b69191b69191 +da9191b69191b66d6db69191b69191dab6b6dab6b6dab6b6da9191da9191 +da9191b69191da9191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b69191b66d6db69191ffb6b6ffb6b6da9191914848914848914848 +916d6d916d6d916d6d914848916d6d914848916d6d916d6d914848916d6d +914848914848914848916d6d916d6dda9191dab6b6ffb6b6da9191b66d6d +914848914848914848914848914848914848914848914848914848916d6d +b69191b69191b69191b66d6db66d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148486d48489148486d4848914848914848 +6d48486d48489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48489148486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffb6b6 +ffb6b6dab6b6ffb6b6ffdadaffdadaffdadaffdadaffdadadab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191b69191da9191 +b69191da9191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +dab6b6ffdadadab6b6b66d6d916d6d914848916d6d916d6d916d6d916d6d +916d6d9148486d48484824246d2424b66d6ddab6b6dab6b6da9191b69191 +916d6d9148486d48486d24246d24246d48486d48486d48486d24246d4848 +914848914848916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6db66d6d916d6d916d6d9148486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d48486d24246d24246d24246d48486d24246d24246d4848 +6d4848914848916d6d916d6d916d6db66d6db69191dab6b6da9191dab6b6 +da9191da9191b69191b69191b66d6db66d6db66d6db69191b69191b69191 +da9191da9191b69191b66d6db66d6db66d6db69191da9191da9191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b66d6db69191b69191b69191b69191b69191b66d6db66d6db66d6d +b69191b69191b66d6db69191ffb6b6dab6b6b66d6d916d6d916d6d914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848916d6db66d6ddab6b6ffb6b6ffb6b6dab6b6b69191 +916d6d6d48489148486d4848914848914848914848914848914848b66d6d +b69191b69191b69191b69191b66d6d916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48489148489148489148489148486d48486d48486d4848 +6d48489148489148489148489148489148486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d24246d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffb6b6 +ffdadaffdadaffdadaffdadaffdadaffdadaffdadaffb6b6dab6b6dab6b6 +dab6b6da9191da9191da9191da9191da9191da9191da9191da9191da9191 +b69191b69191da9191da9191b69191b69191b69191b69191b66d6db66d6d +b69191b66d6db69191b66d6db66d6db66d6db69191b66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +dab6b6ffdadadab6b6916d6d9148486d4848914848916d6d916d6d916d6d +916d6d916d6d6d48486d2424482424914848da9191ffb6b6dab6b6da9191 +916d6d916d6d6d24246d24246d24246d48486d24246d48486d48486d4848 +6d4848914848916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6d916d6d9148486d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d48486d48486d48486d2424 +6d4848914848914848916d6d916d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191b69191 +dab6b6dab6b6dab6b6da9191b69191b66d6db69191da9191dab6b6da9191 +dab6b6b69191b69191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191da9191b69191b69191b69191b69191b69191b66d6d +b69191b69191b69191da9191dab6b6da9191916d6d916d6d914848916d6d +916d6d916d6d914848916d6d914848914848914848914848914848914848 +914848914848914848916d6db66d6ddab6b6ffb6b6ffb6b6dab6b6b69191 +916d6d914848914848914848914848914848914848914848914848b66d6d +b66d6db69191b69191b69191916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +9148489148489148486d48486d48486d48486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48489148489148486d4848 +6d48486d48486d48486d4848914848916d6db66d6db66d6d914848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d48486d48486d48486d48486d48489148486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdada +ffffdaffdadaffdadaffdadaffdadaffb6b6ffb6b6dab6b6dab6b6dab6b6 +dab6b6da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b69191b66d6db66d6db69191b69191b66d6db69191 +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +da9191ffb6b6ffb6b6b66d6d914848914848914848916d6d914848b66d6d +916d6db66d6d6d48486d48484824246d2424916d6ddab6b6dab6b6ffb6b6 +b69191b66d6d9148486d24246d24246d24246d24246d24246d24246d4848 +6d4848914848916d6d916d6d916d6d916d6d916d6db66d6db66d6d916d6d +b66d6db66d6db66d6d916d6d9148486d48486d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d48486d24246d24246d24246d24246d24246d24246d4848 +6d24246d24246d4848916d6d916d6db66d6db66d6db69191b69191b66d6d +b69191b69191b69191b69191b66d6d916d6db66d6db66d6db69191b69191 +da9191da9191dab6b6dab6b6b69191b66d6db66d6dda9191da9191da9191 +da9191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db69191b69191b69191dab6b6b69191914848916d6d916d6d914848 +916d6d914848916d6d914848916d6d914848914848914848914848914848 +914848914848914848914848b66d6dda9191dab6b6dab6b6da9191b66d6d +916d6d916d6d914848916d6d914848914848914848914848914848916d6d +916d6db66d6db66d6d916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148486d4848914848914848914848914848 +6d48489148486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48489148489148486d48486d48486d48486d4848914848 +6d48486d48486d4848914848916d6db66d6db69191b69191b66d6d914848 +9148486d24246d48486d48489148489148486d4848914848914848914848 +9148486d48486d48486d48486d48489148489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b69191b69191da9191da9191da9191b69191b69191b66d6d +b66d6db66d6db69191b69191b69191b66d6db66d6db69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6dffb6b6ffdadada91919148489148486d2424916d6d916d6db66d6d +916d6db66d6d9148486d48486d24246d24246d4848da9191dab6b6ffb6b6 +dab6b6b66d6d9148486d48486d24244824246d48486d24246d48486d4848 +6d4848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6d916d6d9148489148486d48486d48486d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d4848914848914848916d6db66d6db66d6db69191b66d6d +b69191b69191da9191da9191b66d6db66d6db66d6db69191b69191b69191 +da9191da9191da9191dab6b6da9191da9191b69191b69191da9191dab6b6 +dab6b6da9191da9191da9191b69191da9191b69191da9191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b69191b69191b66d6d +b69191b69191b69191b69191da9191916d6d916d6d914848916d6d914848 +916d6d914848916d6d916d6d914848916d6d914848914848914848914848 +914848914848914848914848916d6db66d6db66d6db66d6db66d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48486d48489148489148486d48486d48486d4848 +9148486d48486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d4848914848b66d6db66d6db66d6db69191b69191916d6d +9148486d48486d48486d48486d48489148486d4848914848914848914848 +9148489148486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffdadaffb6b6dab6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191da9191b69191b66d6db66d6d +b66d6db66d6db69191b69191b66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6ddab6b6ffb6b6dab6b6b66d6d9148489148486d4848914848914848 +916d6d916d6d9148486d48486d48484824246d2424b66d6ddab6b6dab6b6 +ffb6b6b69191916d6d916d6d6d48486d24246d48486d24246d24246d4848 +6d48486d4848914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6db66d6d916d6d9148489148486d48486d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d24246d24246d24246d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d4848914848914848916d6db66d6db66d6db69191 +b69191da9191da9191da9191b69191b66d6d916d6db66d6db69191b69191 +b69191b69191b69191da9191dab6b6da9191b69191b69191b69191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b66d6db66d6db66d6d +b66d6db66d6db69191b69191b66d6d916d6d914848916d6d916d6d916d6d +916d6d916d6d914848916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148486d48486d48486d4848 +9148489148489148489148489148486d48489148486d48486d4848914848 +6d48486d48489148489148489148489148486d4848914848914848914848 +6d48486d48486d4848914848916d6db66d6db69191b69191914848916d6d +6d48486d48486d48486d48486d48486d48486d4848914848914848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffb6b6dab6b6ffdadaffb6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b69191b69191b69191da9191da9191b69191b69191b66d6d +b66d6db66d6db69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db69191ffb6b6ffb6b6da9191b691919148486d2424916d6d914848 +b66d6d914848916d6d6d48486d48486d24244824246d2424dab6b6dab6b6 +ffb6b6dab6b6b69191b66d6d9148486d24246d24246d48486d24246d4848 +6d48486d48486d4848914848914848916d6d914848916d6d916d6d916d6d +916d6db66d6d916d6d9148489148486d48489148486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d4848914848916d6db66d6db66d6db69191 +dab6b6dab6b6dab6b6b69191b69191b66d6db69191b69191da9191da9191 +da9191da9191da9191da9191da9191da9191b69191b69191b69191da9191 +da9191da9191da9191da9191b69191b69191da9191b69191b69191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b69191b66d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d914848916d6d914848916d6d914848914848914848 +914848916d6d914848916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d4848914848 +9148489148489148489148489148489148489148489148486d48486d4848 +9148486d48486d48489148486d48486d48486d48486d48486d4848914848 +9148489148489148486d48489148486d48489148486d48486d48486d4848 +6d48486d48486d48486d4848914848916d6db66d6d916d6d9148486d2424 +6d48486d48486d48486d48486d48486d48489148489148486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffdadaffb6b6ffb6b6ffb6b6ffdadadab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191dab6b6dab6b6da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db69191ffb6b6ffb6b6dab6b6da91919148486d48486d4848914848 +916d6d916d6d916d6d9148486d48486d48484824246d2424da9191ffb6b6 +ffb6b6ffb6b6da9191da91916d48486d48486d24246d48486d24246d4848 +6d24246d48486d48486d48486d4848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d9148489148489148486d48486d48486d48486d2424 +6d24246d48486d24246d24246d24246d24246d48486d24246d24246d2424 +6d24246d24246d24246d48486d48486d48486d24246d24246d24246d2424 +6d24246d48486d4848914848914848914848916d6d916d6db66d6dda9191 +dab6b6dab6b6da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848914848914848914848914848914848916d6d916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48489148486d48486d48486d48489148486d4848 +9148486d48486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffb6b6ffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6ffb6b6dab6b6da9191 +da9191da9191dab6b6dab6b6dab6b6da9191da9191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db69191b69191b69191b66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6dda9191ffb6b6ffb6b6dab6b6b691919148486d4848914848 +914848916d6d6d48489148486d24246d48486d24246d2424b66d6dffb6b6 +dab6b6dab6b6da9191b69191916d6d6d48486d24246d48486d48486d4848 +6d48486d48486d48486d48486d48486d4848914848914848914848916d6d +916d6d916d6d9148489148489148489148486d48486d48486d48486d4848 +6d24246d48489148486d48486d48486d24246d24246d48486d24246d2424 +6d24246d24246d48486d48489148489148486d48486d24246d24246d2424 +6d24246d4848916d6d916d6db66d6db66d6db66d6db66d6db69191da9191 +dab6b6dab6b6dab6b6da9191da9191da9191b69191da9191b69191da9191 +b69191b69191b69191b69191da9191b69191da9191b69191b69191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191da9191da9191b69191b69191b66d6db66d6db69191b69191b69191 +b69191b66d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +914848916d6d914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6d916d6d916d6d914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148489148486d48486d48486d48486d48489148486d4848 +6d48486d48489148486d48486d48486d48486d48486d48486d4848914848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffdada +ffdadaffdadaffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6 +da9191dab6b6da9191dab6b6da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db69191b69191b69191b66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6ddab6b6ffdadaffdadaffb6b6b66d6d916d6d6d2424914848 +9148486d48486d48486d48486d48486d48486d2424482424916d6ddab6b6 +dab6b6dab6b6dab6b6b66d6d9148486d48486d48486d24249148486d4848 +6d48486d24246d48486d24246d48486d48486d48486d4848914848914848 +916d6d916d6d916d6d916d6d916d6d9148489148489148486d4848914848 +9148489148489148489148486d48486d48486d24246d48486d24246d2424 +6d24246d48486d48486d48486d48489148486d48486d48486d24246d2424 +6d2424914848916d6db66d6db69191b69191b69191b69191b66d6db69191 +da9191dab6b6dab6b6da9191da9191da9191da9191b69191da9191b69191 +b69191b69191b69191b69191b69191b69191da9191b69191b69191b66d6d +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b69191 +b69191b66d6d916d6d916d6d916d6d916d6d916d6d914848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848914848 +914848916d6d914848916d6d914848916d6d914848914848914848914848 +914848914848916d6d914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848916d6d +b66d6db66d6d916d6d916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148489148489148486d48486d48486d48486d48489148486d48486d4848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdada +ffdadaffdadaffdadaffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191da9191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db69191ffb6b6ffdadaffb6b6b66d6d6d4848914848914848 +b66d6d6d48486d48486d24246d48486d48486d24246d24246d4848da9191 +ffb6b6dab6b6dab6b6916d6d9148486d24246d48486d24249148486d4848 +6d24246d24246d24246d24246d24246d24246d48486d4848914848914848 +914848914848916d6d916d6d916d6d9148486d48489148486d4848914848 +916d6d916d6db66d6d916d6d916d6d916d6d9148486d4848914848914848 +914848914848914848916d6d9148486d48486d48486d48486d48486d2424 +6d2424916d6d916d6db66d6db66d6dda9191b69191b69191b66d6dda9191 +da9191dab6b6dab6b6dab6b6dab6b6da9191da9191b69191da9191b69191 +da9191da9191b69191b69191da9191da9191da9191b69191b69191b69191 +b69191da9191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db69191b69191b69191b69191 +b69191b66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d916d6d914848914848914848914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848b69191 +b69191b69191b69191b66d6d9148489148486d4848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +9148486d48489148489148486d48486d48489148486d48489148486d4848 +6d48489148489148486d48489148486d48489148486d48486d48486d4848 +6d48486d48489148486d48486d48486d48486d48486d48486d48486d4848 +9148486d48489148489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffdadaffffdaffdadaffdada +ffdadaffb6b6ffb6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191b69191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6d916d6db66d6ddab6b6ffdadaffb6b6b69191916d6d914848916d6d +b66d6d916d6d6d48486d48486d24246d48486d24246d24246d4848b69191 +dab6b6ffb6b6dab6b6b691919148489148486d24246d48486d24246d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d4848914848 +914848914848914848914848916d6d914848914848914848916d6d916d6d +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d9148489148486d48486d48486d2424 +6d4848914848916d6db66d6db69191da9191da9191b66d6db66d6db66d6d +da9191da9191dab6b6da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191da9191da9191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b66d6d +b69191b66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +914848916d6d916d6d914848914848914848914848914848916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +914848914848916d6d914848914848914848914848914848b66d6db66d6d +b69191b69191b69191916d6d916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d4848914848 +6d48486d48489148489148489148489148486d48486d48486d4848914848 +6d48489148486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffffffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b69191b69191b66d6d +b69191b66d6db69191b69191b66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6db66d6dffb6b6ffb6b6dab6b6b66d6d916d6db66d6d +b69191b66d6d9148486d48486d48486d48486d48486d48486d2424916d6d +dab6b6ffb6b6da9191da91919148486d48484824246d24246d24246d2424 +6d24246d48486d48486d48486d48486d48486d48486d24246d48486d4848 +914848914848914848916d6d9148489148486d4848914848914848916d6d +916d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d9148489148486d48486d4848 +6d4848916d6d916d6db66d6db69191da9191dab6b6b69191b69191b66d6d +da9191da9191dab6b6da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b69191b69191da9191da9191b69191da9191da9191b69191 +b69191b69191da9191da9191da9191b69191b69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b69191 +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +914848914848914848914848914848914848914848914848916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848b66d6db66d6d +b69191b69191b69191916d6d914848914848914848914848914848914848 +9148489148489148489148489148489148489148486d4848914848914848 +6d48486d48486d48486d48486d48489148486d48486d48489148486d4848 +6d48486d48486d48486d48489148486d48486d48489148486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +9148486d48486d48489148486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffffffffffffffda +ffffdaffffdaffffdaffffdaffdadaffdadaffdadaffdadaffb6b6ffdada +ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191dab6b6da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6db69191ffb6b6ffb6b6da9191916d6db66d6d +b66d6db66d6d916d6d9148489148486d48486d48486d2424482424914848 +dab6b6ffb6b6dab6b6b69191916d6d6d24246d48486d24246d48486d2424 +6d48486d24246d48486d24246d48486d48486d48486d48486d48486d4848 +9148489148489148489148486d48486d48486d4848914848914848916d6d +916d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d9148489148486d4848914848 +914848916d6d916d6db66d6dda9191dab6b6dab6b6da9191b66d6db66d6d +b66d6dda9191da9191dab6b6da9191dab6b6da9191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191da9191da9191da9191b69191 +b69191b69191b69191b69191da9191da9191b66d6db66d6db66d6db69191 +b69191b69191b69191b66d6db69191b66d6db69191b69191b69191b69191 +b69191b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d914848916d6d914848916d6d916d6d916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6d914848914848914848914848914848914848914848916d6d916d6d +b66d6db66d6d916d6d916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48489148486d48486d48486d48486d48489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffb6b6 +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b69191b66d6db69191 +b66d6db69191b69191b66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6d916d6ddab6b6ffb6b6ffb6b6b66d6d916d6d +916d6db69191916d6d9148489148489148486d48486d24246d24246d4848 +da9191ffb6b6dab6b6b69191916d6d6d24246d48484824246d24246d2424 +6d48486d24246d48486d48486d48486d48486d24246d48486d48486d4848 +9148489148489148489148486d48486d24246d48486d4848914848916d6d +b66d6d916d6d916d6d914848914848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848914848914848916d6d +914848916d6d916d6db66d6dda9191dab6b6dab6b6da9191b69191b66d6d +916d6db69191da9191dab6b6da9191dab6b6da9191b69191b69191da9191 +b69191b69191da9191da9191da9191da9191b69191da9191da9191da9191 +da9191b69191b69191b69191da9191b69191b69191b66d6db69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d914848 +914848914848914848916d6d914848914848914848914848914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48486d4848914848914848914848914848 +9148486d48486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48489148486d48486d48486d48486d48489148486d4848914848 +6d48486d48486d48489148486d48486d48489148489148489148486d4848 +9148486d48489148486d48486d48486d48486d48486d48489148486d4848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffffdaffffdaffdadaffb6b6 +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6da9191 +dab6b6dab6b6da9191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6d +b69191b69191b69191b69191b66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6db66d6db66d6db66d6d916d6db69191dab6b6ffffdadab6b6b69191 +b69191b66d6db66d6d914848916d6d9148489148486d48484824246d2424 +da9191dab6b6ffb6b6da9191916d6d6d48486d24246d24246d24246d4848 +6d24246d48486d24246d48486d48486d24246d24246d24246d48486d4848 +6d48486d48489148486d48486d48486d24246d48486d4848914848916d6d +b66d6db66d6d9148489148486d4848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d914848916d6d916d6d914848914848916d6d916d6d +916d6d916d6db66d6db66d6dda9191da9191dab6b6da9191b69191b66d6d +b66d6db66d6dda9191da9191dab6b6da9191da9191b69191b69191b69191 +b69191da9191da9191da9191da9191da9191b69191da9191da9191da9191 +da9191da9191b69191b69191b69191da9191b69191b66d6db66d6db69191 +b69191b66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848916d6d914848914848914848914848 +914848916d6d916d6d914848914848914848914848914848916d6d916d6d +914848914848916d6d914848914848914848914848914848914848914848 +914848914848914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48486d48489148486d4848 +6d48486d48486d48486d48486d48489148489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48489148489148486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d4848914848914848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdada +ffdadaffffdaffffdaffffdaffdadaffdadaffffdaffffdaffdadaffdada +ffb6b6ffb6b6ffdadadab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db69191b66d6db69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6db66d6dda9191ffdadaffb6b6 +da9191b66d6db66d6d9148489148486d48486d48486d48486d2424482424 +916d6ddab6b6dab6b6dab6b6b691919148484824246d48484824246d4848 +6d24246d48486d24246d48486d48486d48486d24246d48486d24246d2424 +6d24246d48486d48486d48486d48486d24246d24246d4848914848916d6d +916d6d916d6d914848914848914848914848914848914848914848914848 +916d6d914848914848914848914848916d6d914848916d6d916d6d916d6d +916d6d916d6d916d6db66d6db69191da9191dab6b6da9191b69191b66d6d +b66d6db66d6dda9191da9191dab6b6da9191da9191da9191da9191b69191 +b69191da9191da9191da9191da9191da9191b69191da9191da9191da9191 +da9191da9191b69191b69191b69191da9191b69191b69191b69191b66d6d +b69191b69191b69191b66d6db66d6db69191b69191b69191b69191b69191 +b69191b66d6d916d6d916d6d914848916d6d916d6d916d6d914848916d6d +914848914848916d6d914848914848914848914848914848914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +9148489148486d48486d48489148486d48486d48489148486d4848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48489148486d48489148489148486d48486d48486d48486d4848 +9148489148486d48486d48486d48486d48486d48486d48486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d48486d4848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffffda +ffffdaffffdaffdadaffdadaffdadaffdadaffffdaffdadaffdadaffffda +ffdadaffb6b6ffdadaffb6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6 +dab6b6da9191da9191b69191da9191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b66d6db69191b69191b66d6db69191b69191 +b69191b66d6db66d6db66d6db69191b69191b66d6db69191b66d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6dffb6b6ffb6b6 +ffb6b6da9191b691919148489148486d48486d48486d48486d48486d2424 +916d6ddab6b6dab6b6dab6b6da9191916d6d6d48486d24246d48486d2424 +6d48486d48486d48486d48486d48486d24246d24246d24246d48486d2424 +6d48486d48486d24246d48486d24246d48486d24246d4848914848916d6d +9148489148489148486d4848914848914848916d6d914848914848914848 +914848914848914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6db66d6db66d6db69191da9191dab6b6da9191b69191b69191 +b66d6db69191da9191dab6b6dab6b6dab6b6da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191b69191b69191b69191da9191 +da9191da9191b69191b69191b66d6db69191b69191b69191b66d6db66d6d +b69191b66d6db66d6db66d6db69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d914848916d6d914848914848916d6d916d6d914848 +914848914848914848914848914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148486d4848914848914848 +6d48489148489148486d48489148486d48486d48486d48486d48486d4848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48489148486d4848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffffdaffdadaffffdaffffdaffffdaffdadaffdadaffb6b6 +ffb6b6ffb6b6ffb6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6da9191 +da9191b69191b69191da9191b69191da9191b69191b69191b69191b66d6d +b66d6db69191b69191b69191b69191b66d6db66d6db66d6db66d6db69191 +b69191b69191b66d6db66d6db69191b69191b66d6db66d6db66d6db66d6d +916d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db69191dab6b6 +ffdadaffdadada9191916d6d9148486d48486d48486d48486d48486d2424 +914848dab6b6ffb6b6dab6b6ffb6b6b66d6d6d48486d24246d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d48486d2424 +6d48486d48486d24246d24246d24246d24246d24246d2424914848916d6d +9148486d48486d4848914848914848914848916d6d9148486d4848914848 +6d48486d48486d4848914848916d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db69191da9191da9191da9191b66d6db69191 +b66d6db69191da9191da9191da9191da9191b69191b69191b69191da9191 +b69191b69191da9191b69191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191da9191da9191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b69191b69191b66d6d +b69191916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d914848 +914848914848914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148486d48486d48489148489148489148486d48486d4848 +6d48486d48489148486d48489148486d48486d48486d48486d48486d4848 +6d48486d48489148489148486d48489148486d48486d48486d4848914848 +9148489148489148486d48486d48489148489148489148486d4848914848 +9148486d48489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdada +ffdadaffdadaffdadaffffdaffffdaffffdaffdadaffdadaffdadaffb6b6 +ffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191b69191b66d6d916d6d916d6d +b69191dab6b6ffb6b6b69191916d6d9148486d24249148486d2424914848 +b69191da9191ffdadaffb6b6ffb6b6b66d6d9148486d48486d24246d4848 +6d48486d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848914848 +6d48489148486d4848914848914848916d6d9148489148489148486d4848 +9148486d4848914848914848916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191da9191da9191b69191b69191 +b69191b69191da9191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848916d6d916d6d914848914848914848 +914848914848916d6d916d6d916d6d914848916d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d4848914848914848914848914848914848914848914848 +9148489148486d48486d48486d48489148489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48489148486d4848914848 +9148486d48486d48486d48486d48486d48486d48486d4848914848914848 +ffb6b6ffffdaffffdaffdadaffdadaffdadaffdadaffdadaffdadaffffda +ffffdaffdadaffdadaffb6b6ffdadaffdadaffdadaffb6b6ffdadaffdada +ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191b69191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b66d6db66d6db69191 +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6d916d6db66d6db66d6d916d6d916d6d916d6d +b66d6db66d6db66d6db69191b69191b69191b69191b66d6d916d6d916d6d +916d6db66d6dda9191da9191b69191b66d6d916d6d916d6d916d6db66d6d +b69191da9191ffb6b6ffb6b6da9191b691916d24246d48484824246d4848 +6d24246d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d48486d48486d4848914848916d6d9148489148489148489148486d4848 +6d48486d48486d4848914848916d6d914848916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191da9191 +b69191b69191b66d6db66d6db66d6d916d6d916d6db66d6d916d6d916d6d +916d6d916d6d916d6d916d6db66d6db66d6d916d6d916d6d916d6d916d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db69191b69191b69191b69191b66d6d +b66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d914848 +914848916d6d914848914848914848914848914848914848914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848916d6d914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148489148489148489148489148486d4848914848914848 +6d48486d48486d48486d48486d48486d48486d4848914848914848914848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48489148489148489148489148489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48489148486d4848 +ffb6b6ffffdaffffdaffffdaffdadaffdadaffdadaffb6b6ffdadaffffda +ffffdaffffdaffdadaffdadaffdadaffdadaffdadaffdadaffdadaffdada +ffb6b6ffb6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191b69191da9191b69191b69191da9191da9191 +b69191b69191b69191b69191da9191b69191b66d6db66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6db66d6d +b66d6db66d6db66d6db69191b69191b69191b69191b69191916d6db66d6d +916d6db66d6db66d6db69191b69191da9191b69191da9191b69191b66d6d +916d6dda9191ffb6b6ffdadaffb6b6b691919148486d48486d24246d2424 +6d48486d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d4848914848914848916d6d916d6d916d6d9148486d48486d4848 +6d48486d48486d4848914848916d6d914848916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6d916d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6db66d6d916d6d +b66d6db66d6db69191b69191b69191b69191b69191da9191b69191b66d6d +b69191b66d6db69191b69191b69191b69191b69191b66d6db69191b66d6d +b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +914848914848914848914848914848914848916d6d916d6d916d6d914848 +916d6d916d6d916d6d916d6d916d6d914848914848916d6d914848914848 +914848914848916d6d914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848916d6db66d6d916d6d916d6d916d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148486d4848914848914848 +6d48486d48486d48486d48486d48489148486d48489148489148486d4848 +6d48486d48489148489148486d48486d48486d48486d48486d4848914848 +6d48486d48489148489148486d48486d48486d48486d48486d4848914848 +ffb6b6ffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffdada +ffdadaffffdaffdadaffffdaffffdaffdadaffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191 +da9191b69191b69191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +916d6db66d6db66d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6db69191b69191b69191b69191b66d6d916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d916d6d +916d6db69191dab6b6ffb6b6ffb6b6b69191916d6d4824246d24246d2424 +6d48486d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d48486d4848914848916d6d916d6d916d6d9148489148486d48486d4848 +6d24246d48486d4848914848914848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db69191b69191 +b69191b66d6db69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db69191b69191b69191b69191b69191b66d6db66d6d +b66d6d916d6d916d6d916d6d916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848916d6db69191b69191b69191b69191b66d6d9148489148486d4848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48489148486d48489148486d48486d48486d48486d48486d4848 +6d48486d48489148486d48486d48486d48486d48486d48486d48486d4848 +9148489148486d48489148489148486d48489148489148486d4848914848 +6d48489148486d48486d48489148486d48486d48486d48486d48486d4848 +6d48489148489148486d48489148486d48486d48486d24246d48486d4848 +ffb6b6ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffdadaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191da9191da9191b69191b69191da9191da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6db69191ffb6b6dab6b6ffdadab69191916d6d6d24246d24246d2424 +6d48486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d4848914848914848916d6d916d6d916d6d916d6d6d48486d48486d2424 +6d48486d48489148486d4848914848914848914848914848914848916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d914848916d6d +914848914848916d6d914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848b66d6db69191da9191da9191da9191b69191916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148489148489148489148489148489148486d24246d48486d4848914848 +ffb6b6ffffdaffffdaffffdaffffdaffdadaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffdadaffdadaffb6b6ffb6b6ffdadaffdadaffdada +ffdadaffb6b6dab6b6dab6b6ffb6b6ffb6b6dab6b6da9191da9191da9191 +da9191da9191da9191da9191b69191b69191da9191b69191b69191b69191 +b66d6db69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6d916d6d +916d6d916d6db66d6d916d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6d916d6db66d6db66d6d916d6db66d6d916d6db66d6d916d6d916d6d +914848916d6ddab6b6ffb6b6ffdadada91919148486d24244824246d4848 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d4848914848914848916d6d916d6d916d6d916d6d6d48486d24246d2424 +6d24246d24246d48486d48486d48486d48489148486d4848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191da9191da9191da9191b69191 +b69191da9191da9191b69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b66d6db69191b69191b66d6db66d6db66d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848916d6db66d6db69191b69191da9191b66d6d916d6d914848914848 +9148489148486d48486d48486d48486d48489148486d48486d48486d4848 +9148489148486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48489148486d48489148486d48489148486d48486d48486d4848 +9148486d48486d48486d48486d48489148486d48486d48489148486d4848 +6d48489148486d48486d48486d48486d48489148489148486d48486d4848 +6d48486d48489148486d48486d48486d48486d48486d48486d48486d4848 +9148486d48489148489148486d48486d48486d48486d24246d48486d4848 +dab6b6ffffdaffdadaffdadaffdadaffdadaffffdaffffdaffffdaffffda +ffffdaffdadaffdadaffdadaffdadaffb6b6ffdadaffdadaffdadaffdada +ffb6b6ffb6b6ffb6b6ffb6b6ffdadaffb6b6dab6b6dab6b6dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6db66d6d +916d6d916d6dda9191ffb6b6ffb6b6dab6b69148489148486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d48486d48486d4848 +914848914848916d6d916d6d916d6d916d6d916d6d9148486d24246d4848 +6d24246d24246d24246d48486d24246d4848914848914848916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191da9191b69191da9191dab6b6dab6b6da9191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191da9191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b66d6db69191b66d6db66d6db66d6db66d6d916d6d +b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848916d6db66d6db69191b66d6d916d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48489148486d48489148486d48486d4848 +6d48486d48486d48489148489148486d48486d48486d48486d48486d4848 +9148486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48489148489148486d48486d4848914848914848 +ffb6b6ffffdaffdadaffdadaffffdaffffdaffffffffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffdadaffdadaffdadaffdadaffdadaffdada +ffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191dab6b6da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6d916d6d916d6d916d6db66d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6db66d6d +b66d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6db66d6d916d6d +916d6d916d6db66d6dffb6b6ffdadaffb6b6b691916d48484824246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848914848 +914848916d6d916d6d916d6d916d6d916d6d9148486d48486d24246d2424 +6d24246d24246d24246d24246d48486d48486d4848914848916d6d916d6d +916d6db66d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b69191b69191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +914848916d6d914848916d6d914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848916d6db66d6d916d6d914848914848914848914848 +9148489148486d48489148489148486d48489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +6d48486d48489148486d48486d48486d48489148486d48486d4848914848 +6d48489148486d48489148489148489148486d48486d48486d48486d4848 +6d48486d48489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48489148486d4848 +ffb6b6ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffdadaffdadaffdadaffdadaffffdaffdadaffb6b6 +ffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6db66d6d916d6db66d6db66d6d +b66d6db66d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6ddab6b6ffb6b6ffb6b6da91916d2424914848482424 +9148484824246d48484824246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +916d6d916d6d916d6d916d6db66d6d916d6d9148486d48486d48486d2424 +6d24246d24246d24246d24246d4848914848914848914848916d6d916d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b69191b69191b69191b69191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db69191b66d6db66d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d48486d48486d48489148489148489148486d4848 +9148486d48486d48486d48486d48486d48486d48486d4848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48489148486d48486d4848914848 +dab6b6ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffffdaffdadaffdadaffdadaffdadaffb6b6ffb6b6ffdadaffdadaffb6b6 +ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b66d6db69191b66d6db69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6d916d6db66d6d +916d6db66d6db66d6db66d6d916d6db66d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6d916d6db66d6d916d6d916d6d +916d6d916d6d916d6db69191dab6b6ffb6b6da91919148484824246d4848 +6d24246d24246d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848914848 +916d6d916d6d916d6db66d6db66d6d916d6d6d48486d24246d24246d2424 +6d24246d24246d24246d24246d48486d4848914848914848916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6d916d6d916d6db66d6db66d6db66d6db66d6db69191b69191b66d6d +b66d6db69191b69191b69191b69191b69191b66d6db66d6db69191b66d6d +b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d914848 +916d6d914848916d6d914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48489148489148486d4848 +6d48489148486d48486d48486d48486d48486d48489148486d48486d4848 +6d48486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48489148489148489148489148486d48486d4848 +6d48489148486d48486d48486d48486d48486d48486d4848914848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffb6b6ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffffdaffdadaffdadaffdadaffdadaffdadaffdadaffdadaffb6b6 +ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191dab6b6da9191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6d +916d6d916d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6db66d6dffb6b6ffb6b6dab6b6b66d6d6d2424914848 +4824246d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848916d6d +916d6d916d6d916d6db66d6db66d6d916d6d9148486d48486d24246d4848 +6d24246d24246d24246d48486d4848914848914848914848916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848914848914848916d6d +916d6d914848914848914848916d6d914848916d6d916d6d914848916d6d +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148486d48486d48486d48486d48486d4848 +6d48486d48489148489148489148486d48486d48486d48486d4848914848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +ffb6b6ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffdadaffdadaffffdaffdadaffdadaffdadaffdadaffdadaffdadaffdada +ffdadaffb6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191b69191da9191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6d916d6db66d6db66d6d916d6d916d6db66d6d +b66d6db66d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d +b66d6d916d6d916d6d916d6dda9191ffdadadab6b6b691916d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848916d6d +916d6d916d6db66d6db66d6db66d6d9148489148486d24246d24246d4848 +6d24246d24246d24246d24246d24246d4848914848914848914848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db69191b69191 +b69191b66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848916d6d914848916d6d +914848914848914848914848914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48489148486d48486d4848914848 +6d48486d48486d48486d48486d48489148486d48489148486d48486d4848 +9148489148489148486d48486d48486d48486d48486d48486d4848914848 +6d48486d48489148486d48486d48489148486d48486d48489148486d4848 +6d48486d48486d48489148486d48489148486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffb6b6ffdadaffdadaffb6b6ffdadaffdadaffdadaffffdaffffdaffdada +ffdadaffdadaffffdaffdadaffdadaffdadaffdadaffdadaffb6b6ffdada +ffdadadab6b6dab6b6da9191dab6b6dab6b6dab6b6dab6b6da9191b69191 +da9191b69191da9191b69191da9191da9191b69191b69191b69191b69191 +b66d6db69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6db66d6db66d6db66d6db66d6d916d6db66d6d +916d6d916d6db66d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6db66d6dffb6b6ffb6b6b69191916d6d6d2424 +6d48484824246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24246d24246d48486d4848914848 +916d6d916d6d916d6d916d6d916d6d916d6d9148486d48486d48486d4848 +6d48486d24246d24246d24246d4848914848914848916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6db69191b69191b66d6db69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b66d6d +b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848914848 +914848916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d914848 +914848914848916d6d914848914848914848916d6d914848914848914848 +916d6d914848916d6d916d6d914848914848916d6d916d6d914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48486d48486d4848914848914848914848 +6d48489148486d48486d48489148486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48489148486d48486d48486d48486d4848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +ffb6b6ffdadaffdadaffdadaffffdaffdadaffdadaffffdaffffdaffdada +ffffdaffffdaffffdaffdadaffdadaffdadaffb6b6ffdadaffb6b6ffb6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191da9191da9191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +916d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +916d6d916d6d916d6d916d6db66d6ddab6b6ffb6b6dab6b6b66d6d482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d4848916d6d +916d6d916d6d916d6d916d6d916d6d916d6d9148486d48486d48486d4848 +6d48486d24246d24246d48486d24246d4848914848914848916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b66d6db69191b66d6d +b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +916d6d914848914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148489148489148489148486d4848914848 +9148489148486d48486d48489148489148489148489148489148486d4848 +9148489148489148486d48489148489148489148486d4848914848914848 +9148489148489148486d48486d48489148489148489148489148486d4848 +9148486d48489148486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48489148486d48486d48486d48486d48486d4848914848 +ffdadaffdadaffdadaffdadaffdadaffdadaffdadaffdadaffdadaffdada +ffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6 +dab6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191b69191b69191da9191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b66d6db69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191ffb6b6ffb6b6ffb6b6b66d6d6d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +914848916d6d916d6d916d6d9148489148486d48489148486d48486d4848 +6d48486d48486d48486d4848914848914848914848914848916d6d916d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db69191 +b69191b66d6db69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848914848914848914848914848 +916d6d916d6d914848914848916d6d914848914848916d6d916d6d914848 +914848914848914848916d6d914848916d6d914848916d6d916d6d916d6d +914848916d6d914848916d6d916d6d916d6d916d6d914848914848916d6d +914848914848916d6d914848914848914848914848914848914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +6d48489148486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48489148486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48489148486d4848b66d6d +ffdadaffb6b6ffdadaffdadaffdadaffdadaffffdaffdadaffffdaffdada +ffdadaffb6b6ffb6b6ffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6da9191dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db69191dab6b6dab6b6dab6b6dab6b6dab6b6b66d6d6d4848 +4824246d24244824246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +9148489148489148489148489148489148486d48486d48486d48486d4848 +6d48486d48486d48486d4848914848914848914848914848916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d914848916d6d916d6d916d6d916d6d916d6d914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848916d6d914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +916d6d916d6d916d6d914848914848914848914848914848914848916d6d +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148486d48489148486d48486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d48486d48486d48489148489148486d48486d4848914848 +6d48486d48486d48486d48486d48486d48486d2424b66d6d6d4848b69191 +ffb6b6ffb6b6ffb6b6ffb6b6ffdadaffdadaffdadaffdadaffb6b6ffb6b6 +ffb6b6ffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6da9191da9191da9191da9191da9191da9191da9191da9191 +da9191b69191b69191da9191b69191b69191b66d6db66d6db69191b69191 +b66d6db66d6db69191b69191b69191b69191b66d6db69191b66d6db66d6d +b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191dab6b6ffb6b6ffb6b6dab6b6ffb6b6da9191b69191914848 +6d48486d24246d24246d24246d48486d24246d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +9148486d48489148486d48489148489148486d48486d48486d48486d4848 +6d48486d4848914848914848914848914848916d6d916d6d916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db69191b69191da9191da9191da9191b69191da9191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d914848916d6d916d6d916d6d916d6d916d6d914848 +914848914848916d6d914848916d6d914848914848914848914848916d6d +916d6d914848914848916d6d916d6d916d6d916d6d916d6d914848916d6d +916d6d916d6d916d6d914848916d6d916d6d914848916d6d914848916d6d +916d6d916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148486d48486d48486d48486d4848914848 +6d48486d48489148489148486d48486d48486d48489148486d48486d4848 +6d48489148486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d4848b66d6db69191 +ffb6b6ffb6b6ffdadaffb6b6ffdadaffdadaffb6b6ffdadaffb6b6ffdada +ffb6b6ffdadaffdadaffdadaffb6b6ffb6b6ffb6b6dab6b6ffb6b6ffb6b6 +ffb6b6dab6b6da9191dab6b6dab6b6da9191da9191da9191dab6b6da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d916d6d +b66d6db69191dab6b6dab6b6dab6b6dab6b6ffb6b6dab6b6da9191b66d6d +9148486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d2424914848916d6d6d48486d24246d24246d2424 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d4848914848914848914848916d6d916d6d916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191da9191da9191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191da9191b69191b69191b66d6db66d6db66d6d +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6d916d6d914848916d6d916d6d916d6d914848916d6d +914848916d6d914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848916d6d914848914848 +914848914848914848916d6d916d6d916d6d914848916d6d916d6d916d6d +914848916d6d914848914848914848914848914848916d6d916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48489148489148489148489148486d4848 +6d48489148489148486d48486d4848914848914848914848914848914848 +6d48486d48486d48486d48486d48486d4848914848914848914848914848 +6d48489148489148489148486d48486d48486d24246d2424916d6db69191 +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffdadaffb6b6ffdadaffdadaffb6b6 +ffb6b6dab6b6ffb6b6dab6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6ffb6b6 +dab6b6da9191dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6db66d6dda9191dab6b6dab6b6ffb6b6dab6b6dab6b6b69191b69191 +916d6d9148486d24246d48486d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d48486d48489148486d24246d24246d2424 +6d24246d48486d48486d48486d24246d24246d24246d48486d48486d4848 +6d4848914848914848914848916d6d914848916d6d916d6d916d6d916d6d +b66d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d914848 +914848916d6d916d6d916d6d914848916d6d916d6d914848916d6d914848 +916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d914848914848 +914848914848914848916d6d914848914848916d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48489148489148489148489148489148489148486d48489148486d4848 +6d48486d48486d48486d48489148489148486d48486d48486d4848914848 +9148486d48486d48486d48486d48486d48489148489148486d4848914848 +6d48486d48486d48489148486d48486d48486d24246d4848914848b66d6d +dab6b6ffb6b6ffdadaffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6 +ffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6ffb6b6dab6b6 +dab6b6dab6b6dab6b6ffb6b6dab6b6da9191da9191da9191da9191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6d916d6d +916d6d916d6db69191da9191dab6b6dab6b6da9191b69191b66d6db66d6d +b66d6db66d6d9148486d48486d48486d24246d24246d24246d24246d4848 +6d24246d24246d24246d24246d24246d48486d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d4848914848916d6d916d6d914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6d916d6db66d6db66d6db69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d914848916d6d914848916d6d914848914848914848914848916d6d +914848914848914848914848914848916d6d914848914848914848916d6d +916d6d916d6d916d6d914848916d6d914848914848916d6d914848914848 +916d6d916d6d916d6d916d6d916d6d914848914848914848914848914848 +914848914848914848916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d4848914848 +9148489148489148486d48489148489148489148489148486d48486d4848 +9148486d48489148489148486d48489148486d4848914848914848914848 +6d48489148489148489148489148489148489148489148489148486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d4848914848 +da9191ffb6b6ffb6b6ffb6b6ffdadaffdadaffdadaffdadaffb6b6ffb6b6 +ffdadaffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191da9191da9191da9191da9191da9191dab6b6da9191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +b69191b69191b66d6d916d6d9148486d24246d4848916d6d914848b66d6d +6d48486d48484824246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d4848914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191da9191b69191b69191b69191da9191b69191b66d6d +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d914848916d6d916d6d916d6d916d6d914848916d6d +914848914848914848916d6d916d6d914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848914848916d6d914848 +916d6d916d6d914848916d6d916d6d914848916d6d914848914848914848 +914848914848914848916d6d914848916d6d914848916d6d916d6d914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848916d6d914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148486d48486d4848914848 +6d48489148486d48489148486d48489148489148489148486d48486d4848 +6d48486d48486d48489148486d48486d48489148489148486d48486d4848 +6d48486d48486d48486d48489148486d48486d48486d48486d4848914848 +da9191ffb6b6ffb6b6ffb6b6ffdadaffdadaffdadaffdadaffdadaffb6b6 +ffb6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6ffb6b6dab6b6 +dab6b6dab6b6da9191da9191da9191da9191dab6b6da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +916d6d916d6db66d6d916d6d916d6d916d6d916d6db66d6d916d6db66d6d +b69191dab6b6da9191b66d6d6d48486d48486d4848916d6d916d6db66d6d +9148486d48486d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d4848914848914848916d6d916d6d916d6d916d6d914848914848 +916d6d916d6db66d6db66d6d916d6db66d6db66d6db66d6db69191b69191 +b69191b69191b66d6db69191b69191da9191da9191dab6b6dab6b6da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d +916d6d914848914848916d6d916d6d916d6d916d6d916d6d916d6d914848 +914848914848916d6d914848914848914848914848914848916d6d914848 +914848914848914848914848916d6d914848914848916d6d914848914848 +914848916d6d914848914848914848914848914848916d6d914848916d6d +914848914848914848914848914848916d6d914848916d6d916d6d914848 +914848914848914848914848914848916d6d916d6d914848916d6d916d6d +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148486d4848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48489148486d4848b66d6d +916d6d916d6d9148489148486d48486d48486d48486d48486d48486d4848 +dab6b6ffdadaffb6b6ffb6b6dab6b6ffb6b6ffdadaffb6b6ffdadaffb6b6 +dab6b6dab6b6ffb6b6ffdadaffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191da9191da9191b69191916d6d916d6d914848914848916d6db66d6d +b69191916d6d6d48486d24246d24246d48489148486d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d4848914848914848916d6d9148489148489148486d4848914848 +914848916d6d916d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b66d6db69191b66d6dda9191da9191da9191dab6b6ffb6b6dab6b6 +da9191b69191b69191b69191da9191b69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +914848914848916d6d916d6d916d6d916d6d914848914848914848916d6d +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d916d6d916d6d914848916d6d914848914848 +914848914848914848916d6d916d6d916d6d916d6d914848916d6d914848 +916d6d914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d4848914848914848914848914848914848916d6d916d6d914848 +9148489148486d48489148486d48486d48486d48486d48486d4848da9191 +da9191da9191b691919148486d48486d48486d48486d48489148486d4848 +da9191ffb6b6dab6b6dab6b6ffb6b6ffb6b6ffdadaffb6b6ffb6b6ffb6b6 +dab6b6ffb6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6da9191dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191dab6b6da9191da9191da9191b69191 +b69191b69191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d916d6d916d6d +916d6d916d6d916d6d916d6db66d6db66d6d916d6db66d6d916d6d916d6d +916d6dda9191dab6b6b69191916d6d914848916d6d914848914848916d6d +b66d6d916d6d9148489148486d48486d4848916d6d9148486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d4848 +6d48486d48489148489148489148489148486d48489148486d4848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6db69191b69191b69191 +b69191b66d6db69191b66d6db69191b69191da9191dab6b6ffb6b6dab6b6 +dab6b6da9191da9191b69191da9191b69191b66d6db69191b66d6db69191 +b69191b69191b69191b69191b66d6db66d6db69191b69191b66d6db69191 +b66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d914848914848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d +916d6d914848914848916d6d916d6d916d6d916d6d916d6d914848914848 +914848914848916d6d916d6d916d6d914848916d6d914848914848916d6d +916d6d914848914848916d6d914848914848914848914848914848916d6d +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848916d6d916d6d914848914848 +6d48489148489148489148489148486d4848b69191dab6b6ffb6b6da9191 +b69191b691916d48486d48486d48486d48489148486d4848914848da9191 +da9191da9191da9191da91919148486d48486d48486d48486d4848914848 +da9191dab6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191 +da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6da9191dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6b69191da9191da9191da9191b69191b69191 +b69191b69191b69191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191da9191da9191da9191da9191b69191b66d6db66d6d +b66d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6dda9191dab6b6da9191916d6d6d48489148486d48486d48486d4848 +914848916d6db66d6d916d6d914848914848916d6d914848b66d6d916d6d +9148486d48486d24246d48486d24246d48486d24246d48486d24246d4848 +6d48486d48486d48489148489148486d48486d48486d4848914848914848 +916d6d916d6d916d6db66d6db66d6db66d6db66d6db69191b69191da9191 +b66d6db66d6db66d6db66d6db66d6db69191b69191dab6b6dab6b6dab6b6 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d914848914848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +916d6d916d6d916d6d916d6d916d6d914848914848914848914848914848 +916d6d914848914848916d6d914848914848916d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848916d6d914848914848916d6db66d6d916d6d +9148489148489148486d48486d4848b69191b69191da9191dab6b6da9191 +b69191da91916d48486d24246d48486d48489148486d4848916d6dda9191 +b69191dab6b6b69191da91916d24246d48486d48486d48489148486d4848 +dab6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6ffb6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191b69191 +b69191b69191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b69191dab6b6dab6b6dab6b6dab6b6da9191b69191916d6d +916d6d916d6d916d6d916d6db66d6d916d6db66d6d916d6d916d6d916d6d +916d6db66d6ddab6b6dab6b6b691916d48484824246d48484824246d2424 +6d24246d4848914848916d6d916d6d916d6d916d6d916d6db66d6db66d6d +9148486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d48486d48486d48486d48486d48486d24246d48486d4848914848 +914848916d6d916d6d916d6db66d6db66d6db69191da9191dab6b6da9191 +b69191b66d6db66d6db66d6db66d6db66d6db69191da9191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d +914848916d6d914848914848916d6d914848914848914848916d6d916d6d +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848916d6d914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848b66d6db69191dab6b6da9191b69191 +b691919148489148486d4848914848b66d6dda9191b69191da9191dab6b6 +da9191b691919148486d48486d48486d4848914848b66d6db69191b66d6d +da9191da9191da9191b691919148486d24246d48486d48489148486d4848 +dab6b6ffb6b6ffdadaffdadaffb6b6dab6b6dab6b6ffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191dab6b6 +da9191dab6b6da9191da9191da9191da9191da9191da9191da9191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b66d6db66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191dab6b6dab6b6dab6b6dab6b6dab6b6da9191b69191b66d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6ddab6b6dab6b6b69191b66d6d4824246d48484824246d2424 +4824246d24246d4848914848916d6d916d6d916d6d916d6db66d6db66d6d +916d6d6d48486d48486d24246d24246d24246d24246d24246d24246d2424 +6d48486d48486d48486d48486d48486d24246d24246d48486d4848914848 +914848916d6d916d6d916d6db66d6db66d6db69191b69191dab6b6da9191 +b69191b66d6db66d6d916d6db66d6db66d6db69191b69191da9191b69191 +b69191da9191b69191b69191b69191b69191b66d6db69191b69191b69191 +b69191b66d6db66d6db69191b69191b69191b69191b66d6db69191b66d6d +b66d6db66d6db66d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +914848916d6d916d6d916d6d914848916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848916d6d914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d4848914848b69191da9191da9191dab6b6da9191 +dab6b6916d6d6d48486d24246d24246d4848b66d6db69191b69191b69191 +916d6d916d6d9148486d48486d48489148486d48486d4848914848914848 +9148489148489148486d48486d48486d48486d48486d48486d4848914848 +da9191ffb6b6ffb6b6ffdadaffb6b6dab6b6dab6b6ffb6b6ffb6b6dab6b6 +dab6b6da9191dab6b6dab6b6dab6b6da9191da9191da9191da9191dab6b6 +dab6b6da9191da9191da9191da9191da9191da9191b69191da9191da9191 +da9191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6d +b69191b66d6db69191b66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191da9191da9191dab6b6dab6b6dab6b6da9191b69191916d6d +916d6db66d6d916d6d916d6db66d6d916d6d916d6db66d6d916d6db66d6d +916d6d916d6db69191dab6b6da9191b66d6d6d24246d24246d24246d2424 +6d24244824244824246d24246d24246d4848914848914848916d6db66d6d +916d6d916d6d9148486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d4848914848 +914848916d6d916d6d916d6db66d6db69191b69191da9191dab6b6dab6b6 +da9191b69191b66d6db66d6db66d6db66d6db69191b69191b69191da9191 +b69191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +916d6d916d6d916d6d916d6d916d6d914848914848916d6d914848914848 +914848914848914848914848916d6d914848914848914848914848916d6d +914848914848916d6d914848914848914848914848916d6d914848916d6d +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d4848914848b66d6dda9191da9191da9191da9191 +da9191916d6d6d24249148486d4848914848914848916d6d916d6d916d6d +9148489148486d48489148489148489148489148489148486d48486d4848 +6d48486d48486d48486d48486d48489148489148486d48486d4848914848 +da9191ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +dab6b6dab6b6da9191dab6b6da9191da9191da9191dab6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191b69191da9191da9191da9191b69191b66d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191dab6b6dab6b6b691919148484824246d4848482424 +6d48484824246d24246d24246d24244824246d24246d4848914848916d6d +b66d6d916d6d9148486d48486d48486d24246d48486d24246d24246d2424 +6d24246d24246d48486d24246d24246d48486d24246d24246d48486d4848 +916d6d916d6d916d6d916d6db66d6db66d6db69191b69191da9191da9191 +da9191b69191b66d6db66d6db66d6db66d6db66d6db69191b66d6db69191 +b69191b69191b69191b66d6db66d6db69191b66d6db66d6db69191b66d6d +b66d6db69191b66d6db69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d914848916d6d914848916d6d916d6d916d6d914848 +914848914848916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d +914848916d6d916d6d916d6d916d6d914848914848916d6d914848914848 +914848914848914848916d6d914848916d6d914848914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d4848914848b66d6db69191b69191da9191da9191 +da91919148486d48486d48489148489148486d48486d48486d48486d4848 +6d48486d48486d4848914848916d6d916d6d916d6d916d6d6d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +da9191ffdadaffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191b69191da9191da9191da9191b69191da9191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6d916d6db66d6ddab6b6ffb6b6b691919148486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824244824246d24246d4848 +914848916d6d916d6d916d6d6d48486d48486d48486d48486d24246d2424 +6d24246d24246d48486d24246d24246d24246d24246d24246d24246d4848 +914848914848916d6d916d6db66d6db66d6db69191b69191da9191da9191 +b69191b69191b66d6db66d6db66d6db66d6db69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b69191da9191b69191b69191b69191 +b69191b66d6db69191b66d6db66d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848916d6d916d6d914848916d6d916d6d +916d6d916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848916d6d914848916d6d916d6d914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848916d6d914848b66d6d916d6d +9148489148489148489148489148489148489148486d48489148486d4848 +6d4848916d6d6d4848b69191dab6b6ffb6b6dab6b6dab6b6b691916d4848 +6d48486d48486d48489148486d48489148489148486d48486d48486d4848 +da9191ffb6b6ffb6b6ffb6b6ffb6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6da9191dab6b6dab6b6dab6b6da9191da9191dab6b6 +da9191da9191b69191da9191da9191da9191da9191da9191da9191da9191 +da9191b69191b69191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db69191dab6b6ffb6b6da91919148486d48484824246d4848 +4824246d24246d24246d48486d24246d24244824246d2424482424482424 +6d24246d48486d48489148489148489148489148486d24246d4848482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +914848914848916d6d916d6d916d6db66d6db66d6db69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b69191b69191b66d6d +b69191b66d6db66d6db69191b66d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +916d6d916d6d914848916d6d914848914848914848914848916d6d914848 +916d6d916d6d916d6d914848914848916d6d914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48486d48486d48486d4848 +9148486d48489148489148486d48489148486d48486d48486d4848914848 +914848b66d6dda9191da9191dab6b6dab6b6dab6b6dab6b6da91916d2424 +9148486d48486d48486d48489148486d48486d48486d4848914848914848 +da9191dab6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6da9191 +da9191da9191b69191da9191da9191dab6b6da9191da9191da9191da9191 +da9191da9191da9191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6d +b66d6d916d6db66d6dda9191dab6b6dab6b6916d6d6d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +4824244824244824246d24246d4848914848916d6d9148486d48486d4848 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d4848914848914848916d6d916d6db66d6db66d6db66d6db66d6db69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +914848916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d914848 +916d6d916d6d916d6d914848916d6d914848914848916d6d914848914848 +914848916d6d914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6db66d6db69191b69191da91919148489148486d4848914848914848 +9148489148486d48489148489148489148486d4848914848914848914848 +6d4848916d6dda9191b69191da9191da9191dab6b6da9191da9191916d6d +914848916d6d9148486d48486d48486d48486d48486d48486d4848914848 +da9191dab6b6dab6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6da9191da9191 +dab6b6da9191dab6b6da9191dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191b69191da9191da9191da9191da9191da9191da9191b69191 +da9191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6dda9191dab6b6dab6b6b66d6d9148486d48486d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24244824244824246d24246d48486d48489148486d4848 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d4848914848914848916d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6d916d6d916d6db66d6db66d6db66d6db69191b69191b69191 +b66d6db69191b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848914848916d6d914848 +914848916d6d916d6d914848916d6d916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848916d6d914848916d6d914848 +9148489148489148489148489148489148489148489148486d4848914848 +b69191da9191dab6b6dab6b6ffb6b6b66d6d9148489148486d24246d4848 +6d48486d48489148489148486d48486d4848914848914848914848914848 +916d6d916d6d916d6db69191b66d6db69191da9191da9191b66d6db66d6d +914848916d6d6d48486d48486d48486d48486d48486d4848914848914848 +da9191dab6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6da9191da9191da9191 +da9191b69191da9191da9191da9191da9191da9191da9191b69191da9191 +da9191da9191dab6b6da9191da9191da9191b69191da9191da9191b69191 +da9191da9191da9191da9191da9191da9191b69191b69191da9191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6d916d6db66d6db69191dab6b6dab6b6b691916d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824244824246d24246d24246d2424 +6d48486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d4848914848916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d916d6db66d6d916d6db69191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b66d6db66d6db66d6d916d6db66d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d +916d6d916d6d916d6d916d6d914848914848916d6d914848914848914848 +914848916d6d914848916d6d914848914848914848914848914848914848 +914848914848916d6d914848914848916d6d914848916d6d916d6d916d6d +914848914848914848914848914848914848916d6d914848914848914848 +9148489148489148489148489148489148489148489148486d4848b66d6d +da9191da9191da9191dab6b6dab6b6b69191916d6d6d48486d4848914848 +6d48489148489148489148489148486d4848914848914848ffb6b6ffb6b6 +ffdadaffdadaffb6b6b66d6d916d6d916d6db69191916d6d916d6d916d6d +916d6d916d6d9148486d48486d48486d48486d48486d48489148486d4848 +da9191dab6b6dab6b6dab6b6dab6b6dab6b6da9191dab6b6dab6b6dab6b6 +dab6b6da9191dab6b6dab6b6da9191da9191da9191da9191da9191b69191 +da9191da9191da9191da9191da9191b69191b69191da9191da9191b69191 +b69191b69191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191da9191dab6b6b691919148486d24246d4848 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824244824244824244824244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d4848914848914848916d6d916d6d914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +9148489148486d48486d4848914848916d6d916d6db69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db69191b66d6db69191b66d6d +b66d6db66d6db69191b66d6db66d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848916d6d914848916d6d916d6d916d6d +916d6d916d6d916d6d914848914848916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848916d6d914848914848914848 +9148489148489148489148489148489148489148489148486d4848916d6d +da9191da9191da9191da9191da9191b69191916d6d6d48486d48486d4848 +9148489148489148489148489148486d48486d4848916d6dffb6b6ffb6b6 +ffb6b6ffb6b6ffb6b6916d6db66d6d914848914848916d6d916d6d916d6d +9148489148486d48489148486d48486d48486d4848914848914848914848 +dab6b6dab6b6da9191da9191da9191da9191dab6b6da9191da9191da9191 +da9191b69191da9191da9191b69191b69191da9191b69191da9191da9191 +da9191da9191da9191da9191da9191b69191da9191da9191da9191da9191 +da9191da9191b69191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191da9191dab6b6da9191916d6d6d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824244824244824246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d4848914848914848916d6d914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6d916d6d914848914848914848916d6db66d6db69191b66d6d +b69191b66d6db69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b69191b69191b66d6db66d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848916d6d914848914848916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848914848914848914848914848916d6d +914848914848914848914848914848914848914848914848916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48486d48486d4848914848 +b66d6db69191b69191da9191da9191b66d6d916d6d916d6d916d6d914848 +9148489148489148489148486d48486d4848b69191b69191ffb6b6ffb6b6 +ffb6b6ffb6b6ffb6b6dab6b6b66d6d9148486d2424916d6d916d6d916d6d +9148489148486d48486d48486d48489148489148486d4848914848914848 +ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +b69191da9191da9191da9191da9191da9191b69191b69191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191da9191dab6b6da9191916d6d6d48486d2424 +6d24244824246d24244824246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d4848914848914848916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191b66d6db66d6db69191b66d6d +b66d6db66d6db69191dab6b6dab6b6dab6b6da9191b66d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848914848916d6d914848914848916d6d916d6d916d6d914848 +914848914848914848914848914848914848914848916d6d914848914848 +914848914848914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d48486d4848 +914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +9148489148486d48489148489148486d2424916d6ddab6b6ffb6b6ffb6b6 +ffdadaffb6b6ffdadaffb6b6916d6d6d24249148486d48486d24246d4848 +6d48486d48486d48489148486d48486d48486d48489148486d4848914848 +dab6b6da9191da9191da9191da9191da9191dab6b6da9191dab6b6da9191 +da9191dab6b6dab6b6dab6b6dab6b6da9191dab6b6da9191da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db69191b69191b69191b66d6d +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b69191da9191da9191b69191916d6d6d48486d2424 +6d48486d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d4848914848916d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +da9191da9191da9191da9191da9191b69191b69191b66d6db66d6db66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191da9191b66d6d916d6d6d24246d24246d4848 +914848914848914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d +916d6d914848914848916d6d916d6d916d6d916d6d914848916d6d916d6d +914848916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d914848 +916d6d914848914848914848914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848916d6d +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d4848914848916d6d916d6d916d6d916d6d914848914848 +6d48486d48489148489148489148486d48486d4848da9191dab6b6da9191 +ffb6b6ffb6b6ffb6b6dab6b66d24246d48486d2424914848914848914848 +9148489148489148486d48486d48486d48486d48486d48486d4848914848 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191dab6b6dab6b6 +da9191da9191dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191b69191da9191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b691919148486d48486d4848 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d48486d48486d48489148486d48489148486d4848 +6d24246d24246d48486d4848914848916d6db66d6db66d6d916d6d916d6d +b66d6d916d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db69191 +b69191da9191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6d9148486d4848482424240000480000240000480000 +2400004800004824244824246d4848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6db66d6db69191b69191b66d6d916d6d916d6d +b66d6d916d6d916d6d914848914848914848914848916d6d916d6d916d6d +914848916d6d914848916d6d914848916d6d914848916d6d916d6d916d6d +916d6d916d6d916d6d914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848916d6d916d6d916d6d914848914848 +9148489148489148489148489148486d48486d48486d4848916d6d916d6d +b69191b69191b66d6db691916d48489148489148489148489148486d4848 +9148486d48486d48486d48486d48486d48486d48486d4848914848914848 +dab6b6dab6b6da9191dab6b6da9191da9191da9191dab6b6dab6b6da9191 +da9191da9191da9191dab6b6dab6b6da9191b69191da9191da9191da9191 +da9191da9191da9191da9191b69191da9191da9191b69191da9191b69191 +da9191b69191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6db66d6dda9191b69191916d6d6d24246d2424 +6d24246d48486d24246d24244824246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d48486d48486d4848 +6d48489148486d4848914848914848916d6d916d6d914848914848914848 +914848914848914848914848916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b66d6db69191 +b69191b69191da9191da9191da9191b69191b69191b69191b69191b69191 +b66d6db69191b69191b66d6db69191b69191b69191b69191b69191b69191 +b69191b69191b66d6d9148489148486d24246d2424482424482424482424 +4824244800004800004800004800004800004824244824246d4848914848 +914848914848914848916d6db66d6db69191b691919148486d24246d2424 +6d24246d24244824244824244800004824244824246d48486d48486d4848 +6d48486d48486d48486d4848914848914848914848916d6db66d6db66d6d +b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48486d48486d48486d2424 +6d24246d24246d48486d48489148489148489148486d48489148486d4848 +6d48486d48486d48486d48486d4848914848914848914848914848914848 +dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b66d6db69191b69191b69191b66d6db66d6db66d6d +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6d914848916d6db66d6dda9191b69191916d6d6d24246d2424 +6d24246d24246d24246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d48486d48486d4848914848 +914848914848914848914848914848916d6d916d6d916d6d916d6d914848 +914848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b69191b69191da9191da9191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b66d6db66d6d +b66d6db66d6db66d6d9148489148484824246d24244800006d2424480000 +482424482424482424482424482424480000480000480000240000240000 +480000480000480000482424482424480000240000240000240000240000 +240000240000480000240000480000240000480000240000240000240000 +2400004800004800004800004824244824244824246d24246d48486d2424 +6d48486d24244824246d24246d4848916d6d9148486d24246d24246d2424 +6d4848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d48486d48486d4848914848914848914848914848914848 +9148489148489148489148486d48486d48486d48486d48486d48486d4848 +9148489148486d48489148486d48489148486d4848914848914848914848 +da9191dab6b6dab6b6da9191da9191dab6b6da9191b69191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191b69191b69191da9191da9191da9191da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191916d6d914848914848b69191b69191da91919148486d48486d2424 +6d48484824246d48486d24246d24244824246d24246d24246d24246d2424 +6d24246d48486d48486d4848914848914848914848914848916d6d916d6d +914848916d6d914848914848914848916d6d916d6db66d6d916d6d916d6d +914848916d6d916d6d916d6d916d6d916d6db66d6d916d6db66d6d916d6d +916d6d916d6d916d6d916d6db66d6db69191b69191b69191b69191b69191 +da9191da9191dab6b6dab6b6da9191da9191b69191b66d6db69191b69191 +b66d6db66d6db66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b69191b691919148489148486d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +480000480000480000480000480000480000480000480000480000480000 +482424482424482424482424482424482424482424480000480000480000 +480000480000480000480000480000480000240000240000240000240000 +240000240000240000240000480000480000480000240000240000480000 +4824246d4848914848916d6d914848916d6d914848914848914848914848 +9148489148489148486d4848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48489148489148486d4848914848914848914848914848914848914848 +6d4848914848914848914848914848914848914848914848914848914848 +9148486d48489148486d48486d48489148486d48486d4848914848914848 +9148486d48486d48486d48489148486d48486d4848914848914848914848 +9148486d48489148486d48489148486d48486d48486d4848914848914848 +da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191da9191dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191da9191b69191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191b66d6d +b69191b69191b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b66d6d6d48486d4848914848b66d6db69191b691919148486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +9148486d4848914848914848914848914848914848914848914848914848 +914848916d6d914848914848914848916d6d916d6d916d6d916d6d914848 +914848914848916d6d914848916d6d916d6d916d6d916d6d916d6d914848 +916d6d914848914848914848916d6d916d6db69191b69191b69191b69191 +b69191b69191da9191da9191b69191b66d6db66d6db66d6d916d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d916d6d +b66d6db66d6db66d6d9148489148486d24246d24246d2424480000482424 +482424482424480000482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424480000 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424480000 +480000482424482424480000480000480000480000480000480000480000 +4800006d24246d24246d48489148486d48486d48486d48489148486d4848 +9148486d4848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d4848914848914848914848914848914848914848 +9148486d48489148486d4848914848914848914848914848914848914848 +da9191dab6b6dab6b6dab6b6dab6b6da9191da9191dab6b6da9191da9191 +da9191da9191da9191dab6b6da9191da9191da9191da9191da9191da9191 +b69191b69191b69191da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b69191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +9148486d2424482424914848b66d6dda9191b69191916d6d4824246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +914848914848914848914848914848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6d +914848916d6d916d6d916d6d916d6db66d6db69191b69191da9191b69191 +da9191da9191dab6b6da9191da9191b69191b66d6db66d6db66d6db66d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b66d6db66d6d9148486d48486d24246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +480000482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424480000482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d48486d48486d48486d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d4848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148486d4848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +9148489148489148486d48489148489148489148489148489148486d4848 +9148489148489148489148489148489148486d48489148489148486d4848 +9148489148486d48486d48486d48486d48489148486d4848914848914848 +da9191da9191dab6b6dab6b6da9191da9191da9191da9191dab6b6da9191 +da9191dab6b6dab6b6da9191da9191b69191da9191da9191da9191b69191 +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191da9191916d6d +6d24246d2424482424914848916d6dda9191b69191916d6d6d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +914848914848914848914848914848914848916d6d916d6d914848916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d916d6d916d6d +914848914848914848916d6d914848916d6d916d6d916d6d914848914848 +6d48486d48486d4848914848914848916d6db66d6db69191b69191b69191 +b69191da9191da9191da9191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b66d6db66d6db69191 +b66d6db66d6db66d6d916d6d6d48486d24246d2424482424482424480000 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d24246d48486d4848 +9148486d48486d48486d24246d2424482424482424482424480000480000 +4800004800004800004800004800006d2424916d6db66d6d916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148486d48489148486d4848914848914848 +9148489148489148489148486d48489148489148486d48486d48486d4848 +6d4848914848914848914848914848914848914848914848914848914848 +da9191da9191dab6b6da9191da9191da9191dab6b6dab6b6da9191da9191 +da9191da9191dab6b6da9191da9191dab6b6da9191da9191da9191da9191 +da9191da9191da9191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b69191b66d6db69191b66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191da9191b691916d4848 +4824244824244824246d24246d4848b66d6d916d6d9148486d2424482424 +6d24244824246d24244824246d24246d24246d48486d2424914848914848 +914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +6d48486d48486d4848914848914848914848916d6db69191b69191b69191 +b69191da9191da9191da9191da9191b69191b66d6db66d6db66d6db66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b66d6db66d6db66d6d9148486d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24246d48486d48486d48486d4848 +6d24246d24246d2424482424482424482424482424482424482424482424 +4824244824244800004800004800004800006d24246d24246d4848914848 +6d48489148489148489148489148489148486d48489148486d4848914848 +6d4848914848914848914848914848914848914848914848914848914848 +9148489148486d4848914848914848914848914848914848914848914848 +9148489148486d48489148489148489148486d48486d48486d4848914848 +9148489148489148489148489148486d48486d48486d4848914848914848 +6d48489148489148486d48486d48486d48486d48486d48486d4848914848 +da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191dab6b6da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191b69191da9191b69191da9191da9191da9191da9191 +b69191b69191b69191b69191b69191b66d6db69191b69191b69191b69191 +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191b69191 +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6dda9191dab6b6da9191b69191b66d6d9148486d24246d2424 +4824244824246d24244824244824246d24246d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848914848 +914848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6d916d6d916d6d914848916d6d916d6d916d6d916d6d916d6d914848 +6d48486d24246d24246d4848914848914848914848916d6db66d6db69191 +b66d6db69191b66d6db69191b66d6db66d6db66d6db66d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +916d6db66d6d916d6db66d6d9148486d24246d2424482424480000482424 +480000482424482424482424480000482424482424482424482424482424 +482424482424480000482424482424482424480000482424482424482424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424480000482424482424482424482424 +4824244824244824244824246d48486d48486d48486d48486d2424482424 +4824244824246d2424482424482424480000482424482424482424482424 +482424482424482424480000480000480000480000480000480000480000 +4800004800006d4848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d4848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +9148489148486d48486d4848914848914848914848914848914848914848 +da9191da9191dab6b6da9191da9191da9191da9191dab6b6da9191da9191 +da9191dab6b6da9191da9191da9191da9191da9191da9191b69191b69191 +da9191da9191b69191b69191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191ffb6b6ffb6b6b691916d24244800006d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d48486d4848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6d916d6db66d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6d +b66d6d916d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +9148489148489148486d48486d48486d4848914848916d6db69191b69191 +da9191b69191da9191b69191da9191b69191b66d6db69191b66d6db69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b66d6db66d6db66d6d9148486d48484824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424480000482424482424482424482424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424480000482424480000482424482424 +4824244824246d48486d48489148486d48484824246d4848482424482424 +482424482424482424482424480000482424482424482424482424480000 +482424482424482424482424482424480000480000480000480000480000 +4800004800004800002400004824246d24246d4848914848914848914848 +6d48486d4848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d4848914848914848914848 +da9191dab6b6dab6b6dab6b6da9191da9191dab6b6dab6b6dab6b6da9191 +dab6b6dab6b6dab6b6da9191dab6b6dab6b6da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b69191 +b66d6db69191b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6dda9191da91919148486d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d916d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +9148489148489148486d48486d24246d4848914848916d6db69191b69191 +da9191da9191da9191b69191b69191b66d6db66d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6d916d6db66d6d9148486d24246d4848482424482424480000 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424480000482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d24249148486d48486d48486d24246d2424482424482424482424 +482424480000482424480000482424480000482424480000482424482424 +480000482424482424482424480000480000482424480000480000480000 +4800004800004800004800004800004800004800004824246d4848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48486d48489148486d4848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d4848914848914848914848914848914848914848914848914848914848 +da9191dab6b6dab6b6da9191da9191dab6b6dab6b6da9191da9191da9191 +dab6b6dab6b6da9191da9191dab6b6dab6b6da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b66d6d +b66d6db66d6db69191b66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6d916d6d9148489148486d48484824244824246d24246d2424 +6d24246d24246d24246d24244824244824244824244824244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d4848914848 +916d6d916d6d916d6d916d6d914848916d6d916d6db66d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6d916d6d916d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d +9148489148489148486d48486d48486d4848914848916d6d916d6db69191 +da9191dab6b6da9191b69191b69191b69191b66d6db66d6db69191b69191 +b69191b66d6db66d6db69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6d916d6d6d48486d24244824246d2424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424480000482424480000482424 +4824244824244824244824244824244824244824246d24244824246d2424 +6d48489148486d48484824246d2424482424482424482424482424482424 +482424480000482424480000482424480000480000480000480000480000 +480000482424480000480000480000480000480000480000480000480000 +482424480000482424480000482424480000480000480000480000480000 +6d24249148489148489148489148489148486d48486d48486d4848914848 +6d48489148486d48486d48489148489148489148489148489148486d4848 +9148486d48486d48486d4848914848914848914848914848914848914848 +9148489148489148489148486d48486d48489148486d48486d4848914848 +6d48486d48489148489148489148486d48486d48486d4848914848914848 +da9191ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191dab6b6da9191dab6b6dab6b6dab6b6da9191da9191da9191 +da9191b69191b69191b69191da9191b69191b69191da9191b69191b69191 +b69191b66d6db69191b66d6db69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b69191b69191b69191b69191b69191b69191b66d6db69191 +b66d6db69191b69191b69191b69191b66d6db69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b66d6d916d6d9148486d48486d24246d24246d24246d24246d24246d2424 +4824246d24246d24244824246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d916d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d914848 +9148486d48486d48486d48486d48486d48486d4848914848916d6d916d6d +b69191da9191da9191b69191b66d6db66d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b66d6db66d6db66d6d +916d6d916d6d916d6d916d6d9148486d24246d4848482424482424482424 +480000482424482424482424482424482424482424482424480000482424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424482424480000482424482424482424 +4824244824244824244824244824244824244824246d48486d2424914848 +6d48486d48486d2424482424482424482424482424482424482424482424 +480000482424480000482424482424482424482424482424482424480000 +482424482424482424480000482424482424480000482424480000480000 +482424482424480000482424482424480000480000480000480000480000 +4800004824246d24246d4848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d4848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d48486d4848914848914848914848914848914848 +da9191dab6b6da9191da9191dab6b6da9191dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191dab6b6da9191da9191dab6b6da9191da9191da9191da9191 +da9191b69191da9191da9191da9191b69191b69191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b66d6db69191b69191b66d6db69191 +b69191b69191b66d6db69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b66d6d +916d6d6d48486d24244824246d24244824246d24246d24246d2424482424 +4824244824244824244824246d24246d24246d24246d2424482424482424 +4824246d24246d24246d24246d24246d24246d24246d4848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +9148489148489148489148486d4848914848914848916d6d916d6d916d6d +b69191b69191b69191b66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6d916d6d6d48486d24246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424480000482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24246d48486d48486d4848 +6d24244824246d2424482424482424482424482424482424480000480000 +482424480000482424482424482424482424482424482424482424480000 +480000480000480000480000482424482424482424482424482424482424 +482424480000480000480000482424482424480000480000482424482424 +4800004800004800004800006d48486d4848914848914848914848914848 +6d48489148489148489148489148489148489148489148489148486d4848 +9148489148489148489148489148489148489148489148489148486d4848 +9148489148486d48489148486d48486d48489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d4848914848914848914848 +da9191dab6b6da9191da9191dab6b6dab6b6dab6b6dab6b6da9191da9191 +dab6b6da9191da9191da9191da9191da9191da9191da9191da9191b69191 +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b66d6db66d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191916d6d +6d48486d24244824246d24244824244824244824244824246d24246d2424 +6d24246d24246d24244824246d24246d24246d24246d24246d2424482424 +4824246d24244824246d24244824246d24246d24246d4848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b69191b69191b66d6db66d6db66d6db66d6db66d6d916d6d916d6d914848 +9148489148486d48489148486d48486d4848914848914848914848914848 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6db66d6d9148486d24246d4848482424482424480000 +482424480000482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424480000482424482424482424482424482424482424482424482424 +4824244824244824244824246d24246d24246d48486d48484824246d2424 +482424482424482424482424482424482424480000482424482424480000 +482424482424482424482424480000482424480000482424482424480000 +480000480000482424482424482424482424480000480000480000482424 +482424482424480000480000480000482424482424482424480000480000 +4800004800004800004800004824246d24246d2424914848914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d48489148486d48486d48486d4848914848914848914848 +da9191dab6b6da9191da9191da9191dab6b6dab6b6da9191dab6b6dab6b6 +da9191da9191da9191da9191da9191da9191dab6b6da9191da9191da9191 +da9191da9191da9191b69191b69191b69191b69191da9191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b66d6d +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b66d6d6d2424 +6d24244824244824244824246d24244824244824244824246d24246d2424 +6d24246d24246d24244824244824246d24246d24246d24246d24246d2424 +6d24244824244824246d24246d24246d24246d24246d2424914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b66d6d916d6d916d6d +916d6d914848914848916d6d914848914848914848916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6d916d6d6d48486d24244824246d2424482424 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424480000482424482424482424482424482424482424482424 +4824244824244824246d24246d48486d48486d48486d2424482424482424 +482424480000482424482424482424482424480000482424480000482424 +482424482424480000482424480000480000480000480000482424480000 +482424482424480000480000480000480000482424480000480000482424 +482424482424482424482424480000480000480000482424480000480000 +4800004824244824244824244800004800004800004824246d2424914848 +9148489148489148489148486d48489148486d4848914848914848914848 +9148489148489148489148489148489148486d48486d4848914848914848 +9148489148489148489148489148489148486d48486d48486d48486d4848 +9148486d48486d48486d48489148486d48489148486d48486d4848914848 +da9191dab6b6da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191dab6b6da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db69191b66d6db69191b66d6db69191b66d6db69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b691919148486d4848482424 +4824244824244824246d24244824244824244824244824244824246d2424 +6d24244824246d24244824244824244824246d24246d24246d2424482424 +6d24246d24246d24246d24246d24244824246d24246d48486d4848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191da9191da9191b69191b69191b66d6db66d6d916d6d +9148486d48486d4848914848916d6d914848916d6d914848914848916d6d +916d6d916d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191b66d6db69191b66d6d +b66d6db66d6d916d6db66d6d916d6d6d48486d4848482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424480000482424482424482424482424482424482424482424480000 +480000482424482424482424482424482424482424482424482424482424 +4824246d24246d24246d24246d48486d2424482424482424480000482424 +482424482424482424482424482424482424482424480000482424482424 +482424482424480000482424480000480000480000480000482424482424 +482424482424480000480000482424480000480000480000480000480000 +482424480000480000480000480000480000480000480000480000480000 +4800004824244800004824244824244800004824244800004824246d4848 +914848914848914848914848914848914848914848916d6d914848914848 +9148489148489148486d4848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48486d4848914848914848 +9148489148486d48486d48489148486d48486d48486d4848914848914848 +dab6b6da9191da9191dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191dab6b6da9191dab6b6dab6b6da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b66d6db69191b69191b66d6db69191b66d6d +b69191b66d6db66d6db69191b69191b66d6db69191b69191b66d6db69191 +b69191b69191b69191b66d6db66d6db69191b66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6db69191b69191b69191b691916d48484800006d2424 +4824246d2424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824246d2424482424 +4824244824246d24246d24246d24246d24246d24246d24246d4848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191da9191b69191b69191b69191b69191b69191 +916d6d916d6d914848914848916d6d916d6db66d6d916d6db66d6d916d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191da9191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6d916d6d6d48486d24244824246d2424 +482424482424482424482424480000482424482424482424482424482424 +482424482424482424482424480000482424482424482424482424480000 +482424482424482424482424482424482424482424482424482424482424 +6d24246d48486d48486d48486d2424482424480000482424480000482424 +480000482424482424480000482424482424480000480000482424480000 +480000480000480000482424480000480000480000480000482424482424 +480000482424480000482424480000480000482424482424480000480000 +482424482424482424480000482424480000480000482424480000480000 +480000482424480000482424480000482424480000480000480000480000 +6d24246d4848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48489148489148486d48489148489148486d48486d4848914848 +6d48489148489148486d48486d48486d48486d48486d48486d48486d4848 +da9191da9191da9191da9191dab6b6dab6b6da9191da9191dab6b6dab6b6 +da9191da9191da9191da9191dab6b6dab6b6da9191da9191da9191b69191 +da9191b69191b69191b69191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b69191b66d6db69191b66d6db69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191da9191da91919148489148484824246d2424482424 +6d24244824246d2424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24244824246d2424482424482424 +6d24246d24246d24244824246d24246d24246d24246d24246d4848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191da9191da9191da9191b69191b66d6d +b66d6d916d6d9148486d4848914848916d6d916d6db66d6d916d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6d916d6d +b66d6d916d6db66d6db66d6db66d6d916d6d9148486d2424482424482424 +482424482424482424482424482424482424482424482424480000482424 +482424482424482424482424480000480000482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d48486d48486d48486d24246d2424480000482424482424482424482424 +482424480000482424480000482424482424482424480000482424480000 +482424480000480000480000480000480000480000480000482424480000 +480000480000480000480000480000482424482424482424480000480000 +480000480000480000480000480000480000480000480000482424480000 +480000480000480000480000480000482424482424480000482424480000 +4824246d4848916d6d916d6d916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d4848914848914848914848914848914848914848914848 +6d48489148486d48486d4848914848914848914848914848914848914848 +b69191da9191dab6b6da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191dab6b6dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db69191 +b69191b69191b66d6db66d6db69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db69191b69191b66d6db66d6db69191b69191b66d6d +b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d6d48486d24244824244824244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d4848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191da9191da9191b69191b69191 +b66d6d916d6d916d6d916d6d914848b66d6db66d6db69191b66d6db66d6d +b69191b69191b69191b69191b69191da9191da9191b69191da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6d916d6d6d48486d24246d2424482424 +6d2424480000482424482424482424482424482424482424482424480000 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d24246d24246d4848 +6d48486d2424482424482424480000482424480000482424482424482424 +480000482424480000482424480000480000480000480000480000482424 +482424480000480000480000482424482424480000480000480000480000 +482424482424480000480000480000480000480000482424480000480000 +482424480000480000480000480000480000480000480000480000480000 +480000480000480000482424480000482424480000482424482424480000 +4824244824244824246d4848914848914848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +9148489148489148489148489148489148489148489148486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48489148486d4848 +da9191da9191da9191da9191da9191dab6b6dab6b6da9191dab6b6dab6b6 +dab6b6da9191da9191dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b69191b66d6db69191b69191b69191b66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b691919148486d24246d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +4824246d24246d24246d24244824246d24246d24246d24246d48486d4848 +914848916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b66d6db69191b69191b69191b69191da9191da9191da9191da9191 +b69191b66d6d916d6d916d6d914848b66d6db66d6db69191b66d6db69191 +b69191b69191b69191b69191b69191da9191da9191da9191b69191da9191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b66d6d +b66d6db66d6d916d6db66d6db66d6d916d6d6d4848482424482424482424 +482424480000482424482424482424482424482424482424480000480000 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d48486d48486d2424 +6d2424482424482424482424482424482424482424482424482424480000 +480000482424482424482424482424482424480000480000482424482424 +480000480000482424482424482424482424482424480000480000482424 +482424482424480000480000480000482424482424482424480000480000 +482424482424480000480000480000480000480000480000480000480000 +480000480000482424480000480000480000480000482424482424482424 +4824244800004800006d24246d2424914848914848916d6d914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148489148486d48486d48486d4848914848 +6d48489148489148489148489148486d4848914848914848914848914848 +da9191da9191da9191da9191da9191dab6b6da9191da9191da9191da9191 +dab6b6da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191b69191b69191da9191b69191b69191b69191b69191b69191 +b69191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +916d6d482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d24246d24246d24244824246d24246d24246d24246d24246d4848 +914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b69191da9191da9191da9191da9191 +da9191b69191b66d6db66d6db66d6d916d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191b69191b69191b69191b69191 +b66d6db69191b66d6db69191b69191916d6d6d48486d24244800006d2424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424482424482424480000482424480000 +4824244824244824244824244824244824246d48486d48486d4848482424 +482424480000482424480000482424482424480000482424480000482424 +480000480000482424480000482424482424482424480000480000482424 +480000482424480000480000480000480000482424482424480000482424 +480000480000480000480000480000480000480000480000480000480000 +480000480000482424482424480000480000482424480000480000480000 +482424482424482424480000480000480000482424480000480000480000 +4824244800004824244824246d48486d4848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d48486d48486d48486d48489148489148486d4848 +9148489148486d48486d48486d48486d48486d48486d48486d4848914848 +dab6b6da9191da9191da9191da9191da9191da9191da9191da9191da9191 +dab6b6da9191da9191da9191dab6b6da9191da9191da9191da9191b69191 +da9191b69191b69191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191916d6d +6d48486d24244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +4824244824244824246d24246d24246d24246d24246d24246d48486d4848 +6d4848914848914848916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b69191b69191b69191b69191b69191da9191da9191da9191da9191da9191 +b69191b69191b66d6db66d6db66d6d916d6db66d6db66d6db66d6db69191 +b69191b66d6db69191b69191b69191b69191b69191b69191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6d916d6d6d48486d2424482424482424 +482424482424482424480000482424482424482424482424482424482424 +482424482424482424482424482424480000482424482424482424482424 +4824244824244824244824246d24246d48486d24246d48486d24246d2424 +480000482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424480000482424482424482424480000 +480000482424482424480000482424482424482424482424482424482424 +480000482424480000480000480000482424480000482424480000480000 +480000480000482424482424482424480000480000480000480000480000 +480000480000480000480000480000480000480000480000480000482424 +4824244800004824244824244800006d24246d4848914848914848914848 +916d6d916d6d916d6d916d6db66d6d914848914848914848914848914848 +9148489148489148486d48486d4848914848914848914848914848914848 +9148486d48486d48489148486d48486d48489148486d4848914848914848 +da9191da9191da9191da9191da9191da9191da9191da9191dab6b6da9191 +da9191da9191da9191dab6b6dab6b6da9191da9191da9191da9191da9191 +b69191b69191b69191b69191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b66d6d9148486d2424 +6d24244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24244824246d24246d24246d24246d2424 +6d4848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191da9191da9191da9191da9191 +da9191da9191b69191b66d6db66d6db66d6db66d6db69191b66d6db69191 +b69191b69191b69191b69191b69191b69191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b69191b69191b66d6d9148486d24246d24246d2424480000 +6d2424480000482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424480000 +4824244824246d24246d24246d48486d48486d2424482424482424480000 +482424480000482424482424482424482424482424480000482424482424 +482424482424480000480000482424482424482424480000480000482424 +480000482424480000480000480000482424482424482424482424480000 +482424482424482424480000480000482424480000482424480000480000 +480000480000480000480000480000480000480000480000482424480000 +480000480000480000480000480000480000480000480000480000482424 +4800004800004824244824244800004800004824246d4848914848914848 +914848916d6d916d6d916d6d914848916d6d914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48489148486d4848914848916d6d +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db69191b69191b69191da9191b66d6d6d48486d4848482424482424 +4824244824244824246d24244824244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24244824246d24246d4848 +6d4848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b66d6db66d6db69191b69191b69191da9191da9191dab6b6dab6b6dab6b6 +da9191da9191b69191b69191b69191b66d6db66d6db69191b69191b66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191da9191 +b69191b69191da9191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b66d6db66d6d9148484824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424480000482424482424482424482424482424482424482424 +4824244824246d48486d48486d48486d24246d2424482424482424482424 +482424482424482424482424480000482424482424482424482424482424 +482424480000482424480000480000482424482424482424482424480000 +482424482424480000480000480000482424480000480000480000480000 +480000480000482424482424480000482424480000482424482424480000 +482424480000480000480000480000480000480000480000480000480000 +480000480000480000480000482424480000480000482424480000482424 +4824244800004824244824244824244800004800004824246d4848914848 +916d6d916d6d916d6d916d6d916d6d914848914848914848914848914848 +9148489148489148489148486d48489148489148489148489148486d4848 +9148486d48489148486d48486d48489148489148489148486d4848916d6d +da9191dab6b6da9191da9191da9191dab6b6da9191da9191dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191da9191b69191b69191 +b69191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b66d6db69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db69191b66d6d +b69191b69191b69191916d6d6d48486d2424482424480000482424482424 +4824244824244824244824244824244824244824246d24244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d4848914848914848916d6d916d6d916d6d916d6db66d6d916d6d +916d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191da9191dab6b6dab6b6da9191 +dab6b6da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191da9191da9191b69191b69191da9191da9191da9191da9191 +da9191da9191b69191b69191da9191b69191da9191b69191b69191b69191 +b66d6db69191b69191b69191b66d6d9148486d24246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d48486d48486d48486d24246d2424480000482424482424482424 +480000482424480000482424482424482424482424482424482424482424 +482424480000480000482424480000480000482424482424482424482424 +480000480000480000480000480000482424480000482424480000482424 +482424480000480000480000482424480000480000482424482424482424 +480000480000480000480000480000480000480000480000482424480000 +480000480000480000480000480000480000480000480000480000482424 +4800004824244824244824244824244824244824244824244824246d2424 +9148486d4848916d6d916d6d914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +9148489148489148489148486d48486d4848914848914848914848916d6d +da9191dab6b6da9191da9191da9191da9191da9191da9191dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b66d6db69191b66d6d +b66d6db66d6db69191b69191b66d6db69191b69191b69191b66d6db69191 +b69191b69191b66d6d6d24246d24244824244824244824246d2424482424 +4824244824244824244824244824244824244824246d2424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +6d2424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d48486d4848914848914848916d6d916d6d916d6db66d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b69191b69191b69191da9191da9191da9191dab6b6 +dab6b6dab6b6da9191da9191da9191b69191b66d6db66d6db69191b69191 +b69191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +da9191da9191da9191b69191da9191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d9148486d24244824246d2424480000 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d48489148486d48486d2424482424480000482424480000482424480000 +482424480000482424482424482424482424482424482424482424480000 +482424482424482424480000482424482424482424482424482424480000 +482424480000482424482424480000482424480000482424480000480000 +480000482424480000480000480000480000480000482424482424480000 +480000480000482424480000480000480000480000480000480000480000 +480000480000480000480000480000482424482424480000482424480000 +480000482424482424482424482424482424482424482424480000480000 +6d24246d4848914848914848914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d48486d48486d48486d4848914848914848916d6d +da9191dab6b6da9191da9191dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +da9191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6db69191b69191b66d6db69191b66d6db66d6db66d6db69191 +da9191da9191b69191916d6d6d24246d24244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24246d2424482424482424482424 +4824246d24246d24246d24246d4848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191da9191da9191dab6b6 +dab6b6dab6b6da9191da9191da9191b69191b69191b69191b69191da9191 +b69191da9191b69191b69191b69191b69191b69191b69191b69191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b69191916d6d9148486d4848482424482424482424482424 +482424480000482424482424482424480000482424482424482424482424 +4824244824244824244824244824244824244824244824246d2424914848 +9148486d48486d2424482424480000482424480000482424480000482424 +480000482424482424482424482424482424480000482424480000482424 +482424482424482424482424482424480000482424480000480000480000 +480000482424480000480000480000480000480000480000480000480000 +480000480000480000482424480000480000480000482424480000480000 +480000480000480000480000480000482424480000480000480000480000 +480000480000480000480000480000482424480000480000480000480000 +480000480000482424482424482424482424482424482424482424482424 +482424914848914848914848916d6d916d6d916d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d48486d48489148486d4848914848914848914848914848 +da9191da9191dab6b6da9191dab6b6da9191da9191da9191da9191dab6b6 +da9191da9191da9191da9191dab6b6da9191da9191b69191b69191b69191 +b69191b69191da9191b69191b69191b69191b69191b69191b66d6db69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b66d6db66d6db69191b66d6db66d6db69191b69191 +b69191b66d6db69191b69191b66d6d916d6d6d48486d24246d24246d2424 +6d24246d48486d48486d24244824244824244824246d2424482424482424 +4824244824244824244824246d2424482424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d24246d24246d24246d24246d4848914848914848914848916d6d +b66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191b69191da9191da9191dab6b6 +dab6b6dab6b6da9191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191da9191b69191b69191b69191b69191da9191b69191da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db691919148489148486d4848482424482424482424482424 +480000482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d24246d4848914848 +6d24246d2424480000482424482424482424482424482424480000482424 +480000482424482424482424482424482424482424482424482424480000 +482424482424482424482424480000480000482424482424482424482424 +482424482424482424480000482424480000480000480000482424482424 +480000480000482424482424482424480000480000480000480000480000 +482424482424482424480000482424480000480000480000480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000480000480000480000482424480000482424482424482424482424 +4824246d48486d48486d4848914848914848916d6d914848914848914848 +6d48489148489148489148489148489148489148489148486d4848914848 +6d48489148486d48489148486d4848914848914848914848914848914848 +da9191da9191da9191da9191da9191da9191da9191dab6b6da9191dab6b6 +da9191da9191dab6b6dab6b6da9191da9191da9191b69191b69191b69191 +b69191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b69191b66d6db66d6d +b69191b69191b66d6d9148486d2424482424482424482424482424482424 +480000482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d24244824246d24246d24246d48486d4848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6db66d6db69191b69191b69191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191da9191b69191b69191da9191b69191 +b69191b69191da9191da9191b69191b69191b69191b69191b66d6db69191 +b66d6db66d6db66d6d6d48486d24244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24246d48486d48489148486d2424 +6d2424482424482424480000482424480000482424482424480000482424 +482424482424482424482424482424482424482424482424482424480000 +480000480000480000482424480000480000482424480000482424480000 +480000480000482424480000482424480000480000480000480000480000 +482424480000480000480000482424480000480000480000482424480000 +480000480000480000480000482424480000480000480000480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000480000480000480000482424482424482424482424482424482424 +4824244824246d24244824246d4848914848916d6d914848914848914848 +914848914848914848914848916d6d914848914848914848914848914848 +6d48489148489148489148489148486d48486d48486d48486d4848914848 +da9191dab6b6da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191da9191da9191da9191b69191da9191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db69191b66d6d +b69191b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db69191 +b66d6db69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b69191b69191b66d6db66d6db66d6db66d6db69191 +b66d6d916d6d6d48486d24246d24244824244824246d24246d24246d2424 +4824244824244824244824244824244824244824244824244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24244824244824246d24244824246d24246d24246d24246d48486d4848 +6d4848914848916d6d916d6db66d6db66d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191da9191da9191da9191 +da9191da9191dab6b6dab6b6da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191da9191b69191da9191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +916d6db66d6d916d6d6d48486d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24246d48486d48486d48486d24246d2424 +482424482424480000482424480000482424480000482424482424482424 +482424482424482424482424482424482424482424482424482424480000 +480000482424482424482424482424480000480000480000482424482424 +480000480000482424480000482424480000480000480000480000482424 +480000480000480000480000480000482424482424482424480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000480000480000480000480000482424480000482424480000480000 +482424480000480000480000480000480000480000482424482424482424 +482424482424482424482424914848914848914848914848916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148489148486d48486d48486d4848914848914848914848 +da9191dab6b6da9191da9191da9191da9191da9191da9191da9191da9191 +b69191b69191da9191b69191b69191b69191b69191da9191b69191b69191 +da9191b69191b69191b69191b69191b69191b66d6db69191b66d6db66d6d +b69191b66d6db69191b66d6db69191b66d6db69191b66d6db66d6db69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db69191 +b69191b69191b69191b69191b69191b66d6db66d6db69191b66d6db66d6d +916d6d9148486d24246d24244824246d24244824244824244824246d2424 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d24246d24246d2424 +6d24246d48486d4848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db69191b69191da9191 +da9191da9191da9191da9191dab6b6da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b66d6db66d6d +916d6d916d6d9148486d48486d24244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d24246d48489148486d4848482424482424480000 +6d2424480000482424480000482424482424482424480000482424482424 +482424482424482424482424480000482424482424480000482424480000 +482424480000480000482424482424480000482424482424480000480000 +482424480000480000480000480000480000480000480000480000480000 +480000480000482424480000482424480000480000480000480000480000 +480000480000480000482424482424480000480000480000480000480000 +480000480000480000480000480000480000480000482424480000480000 +480000482424482424482424480000482424482424482424482424482424 +4824244824244824244824246d4848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48486d48489148489148486d4848914848916d6d +da9191dab6b6da9191dab6b6da9191da9191da9191dab6b6da9191da9191 +da9191da9191da9191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6db69191b69191b66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b66d6db66d6db69191b69191b66d6db66d6d916d6d +6d48486d24246d48484824246d24244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d2424482424482424 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d24246d4848914848914848916d6d916d6d916d6d916d6d +916d6db66d6d916d6d916d6db66d6db66d6db66d6db69191da9191da9191 +da9191da9191dab6b6da9191da9191da9191da9191da9191b69191b69191 +b69191da9191b69191b69191b69191b69191b69191b69191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db69191 +914848916d6d9148486d48486d24246d2424482424482424482424482424 +482424482424480000482424482424482424482424482424482424482424 +4824244824246d24246d48486d48486d2424482424482424482424482424 +482424482424480000482424482424480000480000482424482424482424 +482424482424482424480000480000482424482424482424482424482424 +482424480000482424482424482424482424480000482424482424480000 +480000482424480000482424480000482424480000482424482424482424 +480000480000480000482424480000480000480000480000480000480000 +480000480000480000480000482424480000480000482424480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000482424482424480000482424480000480000482424480000482424 +4824244824244824244824244824246d2424914848916d6d914848914848 +914848916d6d916d6d916d6d9148489148489148489148489148486d4848 +9148486d48486d48486d48489148486d4848914848914848914848914848 +b69191da9191da9191da9191da9191da9191da9191dab6b6da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db69191 +b69191b66d6db66d6db66d6db69191b66d6db69191b66d6db69191b66d6d +b69191b66d6db66d6db69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b66d6db69191da9191da9191b69191b66d6d914848 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d24246d24246d24246d48486d4848914848914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db69191b69191 +b69191da9191da9191b69191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6d916d6d +9148486d48486d48486d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d48486d48486d4848482424482424480000482424482424482424 +482424482424480000482424482424482424482424482424482424482424 +482424482424482424482424482424480000482424480000480000480000 +482424482424480000480000482424482424480000482424480000482424 +482424482424480000480000482424480000480000482424480000480000 +480000482424480000482424480000480000480000480000480000482424 +482424482424480000480000480000482424482424480000480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000480000480000480000482424482424480000480000480000482424 +482424482424482424482424482424482424914848914848916d6d914848 +916d6d916d6db66d6db66d6db66d6d914848914848914848914848914848 +9148489148489148489148486d48489148486d48489148486d4848914848 +da9191da9191da9191da9191da9191da9191da9191dab6b6da9191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191da9191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191da9191b69191916d6d6d24246d2424 +480000482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24246d2424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d24246d24246d24246d24246d48486d48486d4848914848 +914848916d6d916d6d916d6d916d6d916d6db66d6db69191b66d6db69191 +da9191da9191da9191da9191dab6b6da9191da9191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191da9191b69191b69191b69191 +b69191b66d6db66d6db69191da9191da9191da9191b69191916d6d916d6d +9148489148486d24246d2424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d48486d48486d24244824246d2424480000482424482424482424482424 +482424482424482424480000480000482424482424482424482424482424 +480000482424480000482424482424482424482424480000480000482424 +482424482424482424482424482424482424480000482424480000480000 +482424480000480000482424480000482424482424480000482424482424 +480000480000480000480000482424480000482424480000480000482424 +480000480000482424480000480000480000480000480000480000480000 +480000480000480000480000480000482424480000480000480000480000 +480000480000480000482424480000482424480000482424482424482424 +4824244824244824244824244824244824246d4848914848916d6d916d6d +914848b66d6d916d6db66d6d916d6d916d6d9148489148489148486d4848 +9148486d48489148486d48486d48486d48486d48486d48489148486d4848 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +b69191b69191da9191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db66d6db66d6d9148486d48486d24246d2424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d24244824244824244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24246d24246d24246d48486d48486d4848 +914848914848914848916d6d916d6d916d6db66d6db66d6db66d6db66d6d +b69191b69191b69191da9191da9191da9191b69191b69191b69191b66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db69191b69191da9191b69191b66d6d914848914848 +9148486d24246d24246d2424482424482424482424482424482424482424 +4824244824244824244824244824244800004824246d24246d24246d4848 +6d24246d2424482424482424480000482424480000482424482424482424 +480000482424482424482424482424482424480000482424480000480000 +480000482424482424482424482424482424480000482424482424480000 +480000480000482424480000482424482424482424480000480000480000 +482424480000482424482424480000482424482424480000482424482424 +480000480000480000480000480000480000480000480000480000480000 +480000482424480000480000480000480000480000480000480000480000 +480000482424480000480000480000480000480000480000482424480000 +482424480000480000482424480000482424482424482424482424482424 +4824244824244824244824244824244824246d4848914848914848916d6d +916d6d914848b66d6db66d6db66d6d916d6d9148486d4848914848914848 +9148486d48489148489148489148489148486d48486d4848914848914848 +b69191da9191dab6b6da9191da9191da9191b69191da9191b69191b69191 +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d914848 +6d48486d24246d2424482424482424480000482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24246d24246d48486d4848 +6d48486d48486d4848914848916d6d916d6d916d6db66d6db66d6d916d6d +b69191b69191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db69191da9191b69191916d6d9148486d4848 +6d48486d24246d2424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24246d48486d48486d2424 +482424482424482424482424482424482424482424482424482424482424 +482424480000482424480000482424480000480000482424480000482424 +482424482424482424482424482424482424482424482424482424480000 +480000482424482424482424482424480000482424480000480000482424 +482424480000482424480000480000482424482424480000480000480000 +480000482424480000482424480000482424482424480000480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000482424480000480000480000480000482424482424482424482424 +4800004824244824244824244824246d24246d24246d48486d2424914848 +914848914848916d6d914848916d6d916d6d9148486d4848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d4848914848 +b69191da9191da9191da9191da9191da9191b69191da9191b69191b69191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d6d48486d2424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d24246d24244824246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824246d24246d2424 +6d24246d24246d48486d48486d4848914848916d6d916d6d916d6db66d6d +b66d6db66d6db69191da9191da9191b69191da9191b69191b69191b69191 +b66d6db69191b69191b66d6db69191b69191b66d6db69191b69191b69191 +b66d6db66d6d916d6db66d6db66d6db66d6d916d6d9148486d4848914848 +6d48486d2424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24246d24246d48486d24246d2424482424 +482424482424482424482424482424482424482424482424482424480000 +482424480000482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424480000482424482424482424482424480000480000480000 +482424482424482424480000480000482424480000480000480000480000 +480000480000482424480000480000480000482424480000482424482424 +480000480000480000480000480000480000480000482424482424482424 +480000480000482424482424480000480000480000482424480000480000 +480000480000480000480000480000482424480000480000482424482424 +4800004824244824244824244824244824246d24246d24246d2424914848 +916d6d916d6d916d6d914848914848916d6d914848916d6d914848914848 +9148489148489148486d4848914848914848914848914848916d6d914848 +b69191da9191da9191da9191da9191da9191b69191da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b66d6db69191b69191916d6d6d2424482424 +482424482424480000482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d24246d24246d48486d48486d4848914848914848916d6d916d6d +b66d6db66d6db69191b69191da9191da9191da9191b69191b69191b66d6d +b69191b69191b69191da9191b69191b66d6db66d6db66d6db69191b66d6d +b66d6db66d6d916d6db66d6db69191916d6d6d48486d48489148486d4848 +6d48486d2424482424482424482424482424480000482424482424482424 +4824244824244824246d24246d48486d48486d2424482424482424482424 +482424482424482424482424482424482424482424482424480000480000 +480000482424480000482424482424482424482424482424482424482424 +480000482424480000482424482424482424480000482424482424482424 +480000480000480000482424482424482424480000482424480000482424 +480000482424482424480000480000482424480000480000480000482424 +480000482424480000482424480000480000482424480000482424480000 +482424480000480000480000482424480000480000480000480000480000 +480000480000480000480000480000482424480000480000480000480000 +480000480000480000482424480000482424482424482424482424482424 +4824244824244800004824244824244824244824246d24246d2424914848 +916d6d9148489148489148489148489148489148489148486d4848914848 +9148489148489148489148489148486d48486d48486d48486d4848914848 +b69191b69191b69191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b66d6db66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b69191da9191da9191da9191b66d6d6d4848482424 +4824244824244824244824246d2424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d2424482424482424482424482424482424482424482424 +4824246d24246d24246d24246d24246d48486d48486d4848914848914848 +916d6db66d6db69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db69191b69191b69191b66d6db69191b69191b66d6db66d6d +b66d6db66d6d916d6d9148489148486d24249148486d48489148486d4848 +482424482424482424482424482424482424482424482424482424482424 +4824246d24246d24246d48486d4848482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424480000482424480000480000 +482424482424482424482424482424482424480000482424482424482424 +482424482424480000482424482424482424480000482424482424482424 +482424480000482424480000480000482424482424482424482424480000 +480000482424482424482424482424480000482424480000482424480000 +480000482424480000482424482424480000480000482424482424482424 +482424480000480000482424480000480000480000480000480000480000 +480000480000480000482424482424482424482424482424482424482424 +4800004824244824244824244824244824244824246d24246d2424914848 +916d6d916d6d914848914848914848916d6d916d6d914848914848914848 +916d6d9148486d48486d48486d48486d48489148486d48489148486d4848 +da9191da9191da9191b69191da9191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b66d6d9148489148486d48486d48486d48486d48486d48486d24246d2424 +4824244824244824244824244824246d2424482424482424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824246d24246d2424 +6d24246d24246d24246d24244824244824244824246d24246d24246d2424 +6d24246d24244824244824246d24246d24246d24246d48486d48486d4848 +914848914848916d6db66d6db69191b69191b69191b69191b69191b66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6d9148486d48486d24246d48489148489148486d48486d2424 +482424482424482424482424482424482424482424482424482424482424 +4824246d24246d48486d2424482424480000480000482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424480000482424482424482424480000480000482424482424 +482424482424482424482424482424482424482424482424480000482424 +482424482424482424482424482424482424482424482424482424480000 +482424482424482424480000480000482424482424482424482424480000 +482424482424480000482424482424480000480000482424482424480000 +482424482424482424482424482424482424480000482424482424480000 +480000480000480000480000480000482424480000482424482424480000 +480000480000480000482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d24244824246d2424 +6d4848916d6d914848914848914848914848914848914848914848914848 +9148489148486d48486d48486d48486d48486d4848914848914848914848 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191916d6d6d4848 +6d2424482424482424482424482424482424482424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d4848916d6d6d48484800004824244800004824246d4848914848 +9148486d48484824244824244824244824246d24246d24246d48486d4848 +6d48486d48486d4848914848916d6db66d6db69191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b66d6db69191b69191da9191916d6d +916d6d6d48486d24244824246d48486d48489148486d48486d2424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d2424482424482424482424482424482424482424482424 +482424482424482424480000480000482424482424482424482424480000 +482424482424480000482424480000482424480000482424482424482424 +482424482424482424482424482424480000482424482424482424482424 +482424482424482424482424482424482424482424482424482424480000 +482424482424482424480000482424482424482424482424480000482424 +482424482424482424480000482424482424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424480000482424482424480000 +480000482424480000482424482424482424482424480000482424482424 +4824244824244824244824244824244824244824244824246d24246d2424 +6d4848916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +9148489148489148489148486d48486d48489148489148486d4848916d6d +b69191da9191da9191b69191da9191b69191b69191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b66d6db66d6d9148486d48486d2424482424 +4824244824244824246d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d2424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824246d2424482424 +482424916d6d916d6d6d48484824244800006d24246d4848b66d6db66d6d +b66d6d916d6d6d48484824244824244800004824244824246d24246d2424 +6d48486d48486d48486d48486d4848914848914848b66d6db66d6db69191 +b66d6db69191b69191b66d6db66d6db69191da9191da9191da9191914848 +6d24246d24244824246d24246d48489148486d24246d4848482424482424 +4824244824244824244824244824244824246d24244824246d24246d2424 +6d2424482424482424480000482424482424480000482424480000482424 +480000482424482424480000482424482424480000482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424480000482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424480000482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24246d24246d24246d2424 +6d24246d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d24246d24244824244824246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424480000482424482424 +4824244824244824244824244824244824244824244824246d2424482424 +6d2424916d6d916d6d914848916d6d914848914848914848914848914848 +9148489148486d48486d48489148489148486d4848914848914848914848 +b69191da9191b69191da9191b69191b69191b69191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db69191b69191b66d6db66d6d +b66d6db69191b69191916d6d9148486d24246d24246d24246d2424482424 +4824244824246d2424482424482424482424482424482424482424482424 +4824244824244824246d24244824244824246d2424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424480000482424916d6db66d6d916d6d +b66d6db66d6d9148484824244824244824244824246d24246d24246d2424 +6d24246d24246d24246d48486d48486d48486d4848914848914848916d6d +916d6db66d6db66d6db66d6db66d6db69191da9191b66d6d916d6d6d2424 +4824246d24244824246d24249148489148486d48486d48486d2424482424 +4824244824244824244824244824244824246d48486d24246d24246d2424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424480000482424 +482424482424482424480000482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824246d24246d2424 +6d24246d48486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48489148489148486d48486d48486d48486d48486d48486d2424 +6d48486d48486d48486d24246d4848482424482424482424482424482424 +4824244824244824244800004824244824244824244824246d2424482424 +6d24249148489148489148489148489148489148486d4848914848914848 +9148489148489148489148489148486d48486d48486d48486d4848914848 +b69191da9191da9191da9191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db69191 +b69191b66d6d9148486d48484824244824246d24246d48484824246d2424 +4824246d24244824244824244824244824244824244824244824246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +4824244824246d24246d24246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +482424482424482424482424482424480000480000916d6db69191da9191 +da9191dab6b69148489148484800006d48484824246d48486d48486d4848 +6d24246d24244824244824246d24246d48486d48486d48486d48486d4848 +6d4848914848914848914848914848916d6d916d6d6d48486d2424482424 +6d24244824246d24246d24249148486d48486d48486d24246d2424482424 +6d24244824244824244824244824244824246d24246d48486d2424482424 +482424482424482424482424482424480000482424482424482424482424 +480000482424482424480000482424482424482424480000482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d24246d48486d24246d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d2424482424 +4824244824244800004824244824244824244824244824244824246d4848 +6d4848914848914848914848914848914848914848914848914848914848 +6d48489148489148486d48486d48486d48486d48486d4848914848914848 +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b66d6db66d6db66d6db66d6db69191b69191b69191 +b66d6d6d48486d24244824246d24244824246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d24246d24246d24246d2424 +4824244824244824244824246d24244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24244824246d24246d2424482424 +4824244824244824244824244824244824244824246d2424482424482424 +4824244824244824244824244824244824244800006d2424916d6db66d6d +da9191b691916d48484824244824244824246d48486d24246d24246d2424 +6d48486d24244824244824244824246d24246d48486d4848914848914848 +916d6d9148489148489148486d48486d48486d48486d48486d24246d4848 +6d48486d48486d24246d24249148486d24246d24246d2424482424482424 +4824244824244824244824246d24246d48484824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d48486d48486d48489148489148486d48486d48486d4848914848 +6d48486d48489148489148489148486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48484824246d24244824244824244824244824244824244824246d2424 +914848914848914848916d6d914848914848914848914848914848914848 +9148486d48486d48489148489148486d4848914848914848914848914848 +b69191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6d6d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24244824244824244824244824246d2424482424482424482424 +6d24246d24246d24244824244824244824246d24246d24246d2424482424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24244824246d2424482424482424482424 +6d24244824244824244824244824244824246d24246d4848914848916d6d +916d6d6d48484824244824244824246d24246d24246d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d24246d48486d48486d4848 +9148486d48486d24244824246d24244824246d24244824246d2424482424 +4824246d24246d24246d48486d48486d4848482424482424482424482424 +482424482424482424482424480000482424482424482424482424482424 +482424482424480000482424480000482424482424482424482424482424 +4824244824244824244824244824244824244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48489148486d48489148489148486d48489148489148489148486d4848 +6d48486d48486d48486d48489148489148489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d2424482424482424482424482424482424 +6d4848914848914848914848914848914848916d6d914848914848914848 +6d48486d48489148486d48486d48486d4848914848914848914848914848 +b69191b69191da9191da9191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db69191b69191b69191b66d6d +b66d6db66d6db66d6db69191b66d6d916d6d916d6d914848914848914848 +6d48486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +4824246d24244824244824246d24244824244824246d2424482424482424 +4824246d24246d24246d24246d24246d24246d24244824246d24246d2424 +482424482424482424482424482424482424482424482424482424482424 +4824246d24244824244824244824244824244824246d24246d2424482424 +4824244824244824244824244824244824246d24244824246d2424482424 +6d24246d24244824246d24246d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d48489148489148489148489148489148489148489148489148486d4848 +6d48486d48486d48486d48486d48486d24246d24246d24246d24246d2424 +4824244824244824244824244824244824246d24246d2424da9191b69191 +b691919148484824244824244800006d48486d48486d48486d48486d4848 +6d24244824244824246d24246d24246d24246d24246d48486d48486d4848 +9148489148486d48486d24246d24244824244824244824246d24246d2424 +6d24246d48486d48486d24246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d24246d24246d24246d24246d24246d24246d24246d4848 +6d24246d48486d48486d48486d48486d4848914848914848914848914848 +9148489148489148489148486d48486d48489148489148486d4848914848 +9148486d48486d48486d48489148486d48486d48489148486d4848914848 +9148489148489148486d48486d48486d48486d48486d48489148486d4848 +6d48489148489148489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d2424482424482424482424482424 +6d2424914848914848914848914848916d6d914848914848916d6d914848 +9148486d48489148486d48489148486d48486d48486d48486d4848914848 +b69191da9191da9191b69191da9191da9191da9191da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b66d6db66d6d916d6d9148486d48486d48489148486d48486d4848 +6d24246d48486d24246d48486d24246d24246d24246d2424482424482424 +6d24246d24244824244824244824244824244824246d2424482424482424 +4824244824244824246d24246d2424482424482424482424482424482424 +4824244824244824246d2424482424482424482424482424482424482424 +4824244824244824246d24244824244824244824246d24246d2424482424 +4824244824244824244824244824244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24246d2424482424482424482424 +4824244824244824244824244824246d24246d24246d24246d24246d2424 +6d48486d48486d48486d48486d48486d4848914848914848914848914848 +9148489148489148489148489148489148486d48489148489148486d4848 +6d48489148486d48486d48486d48486d24246d24246d4848914848914848 +6d48486d24246d24244824244824246d24246d4848916d6d916d6d914848 +914848482424482424482424482424482424482424482424482424482424 +6d24246d24246d24244824244824244824246d24246d24246d4848914848 +9148486d48486d24246d2424482424482424482424482424482424482424 +482424482424482424482424482424480000482424482424482424482424 +4824244824244824244824244824244824244824244824246d24246d2424 +6d24246d24246d24246d48486d48486d48489148489148489148486d4848 +9148489148486d48486d48486d48489148486d48489148486d48486d4848 +6d48489148489148489148489148489148486d48486d4848914848914848 +6d48489148489148489148486d48489148489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d2424482424 +4824246d48486d4848914848914848914848914848914848914848914848 +9148489148489148486d48486d48486d48486d48489148486d4848914848 +b69191da9191b69191b69191da9191da9191b69191b69191b69191b69191 +b69191b66d6db69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6d916d6d916d6d916d6d9148486d48486d48486d48486d4848914848 +6d48486d24246d24246d2424482424482424482424482424482424482424 +4824244824246d24246d24246d24246d24244824244824244824246d2424 +4824244824244824244824246d2424482424482424482424482424482424 +4824244824244824244824246d24244824246d24246d2424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d48486d48486d48486d48486d4848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48486d48486d24244824244824246d2424b66d6dda9191916d6d +916d6d4824246d2424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d48486d4848914848914848 +6d48486d24246d24244824246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24246d24246d24246d24246d48486d4848 +6d48486d48489148486d48486d48486d48489148489148486d4848914848 +9148489148486d48489148489148486d48489148489148486d4848914848 +6d48489148489148489148489148486d48486d4848914848914848914848 +6d48489148486d48486d48489148489148489148489148486d4848914848 +6d48486d48486d48486d48486d48489148489148489148486d48486d4848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48489148486d48486d48486d48486d24246d24246d2424 +4824246d24246d24246d4848914848914848914848914848914848914848 +9148489148489148489148486d48489148489148489148486d4848914848 +b69191da9191da9191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6d916d6d +916d6d916d6d916d6d9148486d48486d48486d48486d24246d24246d2424 +6d24246d24244824244824244824246d24244824246d2424482424482424 +4824246d24246d24244824246d24246d24246d24246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24244824244824244824246d2424482424 +4824246d24244824246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d48486d48486d4848914848914848914848914848 +9148489148489148489148489148486d48486d48486d48489148486d4848 +6d48486d24246d24246d24246d24246d24246d24246d2424482424482424 +4824246d24246d24246d24244824244824246d48486d48486d48486d2424 +6d2424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d24246d24246d48489148486d48486d48486d48486d4848 +6d48489148486d48486d48489148486d4848914848914848914848914848 +9148486d48489148489148489148489148489148489148489148486d4848 +9148489148489148489148489148489148486d48486d4848914848914848 +9148486d48489148489148489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48489148486d48486d48486d4848 +6d24246d24246d24246d4848914848914848914848914848914848914848 +9148489148486d48489148486d48489148486d48486d4848914848914848 +grestore +showpage +%%Trailer + +--owatagusiam +Content-type: image/gif +Content-Transfer-Encoding: quoted-printable +Content-Description: Quoted-Printable test + +GIF87a@=01=C8=00=D7=00=00=00=00=00=00=00=AA=00=AA=00=00=AA=AA=AA=00=00=AA= +=00=AA=AAU=00=AA=AA=AAUUUUU=FFU=FFUU=FF=FF=FFUU=FFU=FF=FF=FFU=FF=FF=FF=00= +=00=00=14=14=14 ,,,888EEEQQQaaaqqq=82=82=82=92=92=92=A2=A2=A2=B6=B6=B6=CB= +=CB=CB=E3=E3=E3=FF=FF=FF=00=00=FFA=00=FF}=00=FF=BE=00=FF=FF=00=FF=FF=00=BE= +=FF=00}=FF=00A=FF=00=00=FFA=00=FF}=00=FF=BE=00=FF=FF=00=BE=FF=00}=FF=00A=FF= +=00=00=FF=00=00=FFA=00=FF}=00=FF=BE=00=FF=FF=00=BE=FF=00}=FF=00A=FF}}=FF=9E= +}=FF=BE}=FF=DF}=FF=FF}=FF=FF}=DF=FF}=BE=FF}=9E=FF}}=FF=9E}=FF=BE}=FF=DF}=FF= +=FF}=DF=FF}=BE=FF}=9E=FF}}=FF}}=FF=9E}=FF=BE}=FF=DF}=FF=FF}=DF=FF}=BE=FF}= +=9E=FF=B6=B6=FF=C7=B6=FF=DB=B6=FF=EB=B6=FF=FF=B6=FF=FF=B6=EB=FF=B6=DB=FF=B6= +=C7=FF=B6=B6=FF=C7=B6=FF=DB=B6=FF=EB=B6=FF=FF=B6=EB=FF=B6=DB=FF=B6=C7=FF=B6= +=B6=FF=B6=B6=FF=C7=B6=FF=DB=B6=FF=EB=B6=FF=FF=B6=EB=FF=B6=DB=FF=B6=C7=FF=00= +=00q=1C=00q8=00qU=00qq=00qq=00Uq=008q=00=1Cq=00=00q=1C=00q8=00qU=00qq=00Uq= +=008q=00=1Cq=00=00q=00=00q=1C=00q8=00qU=00qq=00Uq=008q=00=1Cq88qE8qU8qa8qq8= +qq8aq8Uq8Eq88qE8qU8qa8qq8aq8Uq8Eq88q88qE8qU8qa8qq8aq8Uq8EqQQqYQqaQqiQqqQqqQ= +iqQaqQYqQQqYQqaQqiQqqQiqQaqQYqQQqQQqYQqaQqiQqqQiqQaqQYq=00=00A=10=00A =00A0= +=00AA=00AA=000A=00 A=00=10A=00=00A=10=00A =00A0=00AA=000A=00 A=00=10A=00=00= +A=00=00A=10=00A =00A0=00AA=000A=00 A=00=10A A( A0 A8 AA AA 8A 0A (A A( A0= + A8 AA 8A 0A (A A A( A0 A8 AA 8A 0A (A,,A0,A4,A<,AA,AA,<A,4A,0A,,A0,A4,A<= +,AA,<A,4A,0A,,A,,A0,A4,A<,AA,<A,4A,0A=00M=B2=00Q=AE=00Q=AA=00U=AA=00Y=A6=00= +Y=A2=00]=A2=00a=9E,=00=00=00=00@=01=C8=00=00=08=FC=00G=08=1CH=B0=A0=C1=83= +=04I(\H=C2=04C=12%J<ThB=E2D=85=11O=B4HR#=A2=C7=8F C=864A=F2D=8C(0`=14=A1=81= +dE=0B=175h=E0=B0Q=03=07=8D+/r=C2=88=C1=02=85=CF=14'=82=06=F5=89"=86=0D=1D2V= +=10=95=11#E=0A=1C.l=C8=98A=A3=06=16!7=92=DCh=A2$=06=8C=9C-h=C8=B8=E1S=A8Y= +=14f=85=A2H!=83=A8=D3=15U=8D=DC=F0=DA=94h=DA=B4h=EF=E2=D5=CB=B7/=D1=BFle=EC= +=F4=A1dG=8E=AF9_=CC=F8=91CG=8D=C74hP=B5=01c=07=90=15*T8MQ=E3F=8B=150G=94=10= +A:D=08=11+L=AB=0E=01=02=A1=EB=D7=09/Z\X=02=C6=C4=12C*^=84=18=11=85=90=13$E= +=0A=1FN=D2=04=8C((=98=F2=C0=0C#f=D5=1A6=A2=DF=98=81=18=86=0C"0\=E4=C5K=E3= +=85=8B=9C=FB2R=AC=AD=D1=85=C5=0C=AF=93u=F0H=E2=C3=07=12"7=82x=B5.C=F3=DF=BB= +=E2=EF=A2P=E1"=85=8D=14,=BC=10C=0FC =91=03S5=ECPW_3=F4=95=16P=0EFx=C2_?=F9= +=97X=0B3=9C=87XN9=C4=F0=82J6=00aD=0D04=D1=02=0B2=FC=C0=02f=99=B1=15C=17/=8D= +@=9A=08=AB=D5h=1A=08=AD=C1=A6cA=139=84=D1l=10=B5=00dDC=A4=E0=11C=1F=99=F0= +=02=0B=DFU4\=92=C4=157=D4O+=1C8=83=13K=001=C5=0D\=E2=F0=D8W.=CC=F0BYS=0E=95= +B=0B-=D8PE=0C+=BC=D0F=0C8=A5$C=15=86=ED D=11G=14=01D=0E8=F0=C0=E7N2=B0 =9E]= +g=C1=B0=9DZ(=90(C=0B=87=C9=80=C3=0FG=EC0=C6=0B=F6=11z=16=0D=87:=98=9F=84~Q= +=A8B=0D1=00=A1C=0C4|=CA=14=0E2=B8=F0=9Dw=FBD=FC=E0=02=0F6=A0=19=D3=0A=B4f= +=A6=C2=0A2Dq=82=88A=B8`B=0D=A5=D9=B8=1A=8E;=16;=82l=16=95 =A4G'=E40=D2w=C4= +=95=A0=A4=10K=00=17=91=93O=A2 RqRN=D8=C3=0A=F2=C90=C5=0E<=B4=E7=83=0E8=DC = +=D8N4=B40(Z>=05=E1Sf/(=B1=C6=126=A0H=C3=86;=F1=A9C=12KH=C1=85=12A=E8=90=03= +=0FL=A5TDJ/=BC=FB=17=0C?=909=E5Z+=FC=80CN3=04=11=DD=BE=9Ai=E6=F0_cr:=14=0F= +=99=8A=8C=A8[*=EC=D4=E2~.=B5=FB=9D=AA=AA=C2=80=E6=87,=D4\=EB=AD+=0AZB=CD=99= +=AD #=8D=C2=AAF=AC=B1=B0=3D=E4=91=92=D7=DA`=82=14%=8CY=C3=09=1E=E1P=02=0A/I= +-=DC=09=3D=B4 F=CA=13B=0D=E5H-=04w-I)=94tB=0A<=A4@]=0C=06=F30=C4=13FlQ=05= +=9FY=FB=14=E1UKN=01=16=83=0F-=F4=10C=0C7=0CqC=0Di=D6=94=93=11E=08a=C3=0D9= +=FC=F0D=12Z=0CQ=84=C1b=8C=1A=C3=0C+=CC=90=B7Oc=12EC=12=1F=13=A5=02=19^%=06= +=C3=0C8=C8=DA=82=0A7|=EC=12=0C=9Br=8AB=11=12=9B|r=0A*=E0=00=03=0E=95=8A=0E= +=AB=0D=17=A2yb=CD+=D2=0AZ=0A.=D0=C0=C2=0D=0E=B5=B9B=093=A8=F0s=D07=E6H=F4A= +=0B=C5=D0PD2/=D9=C2=09.=A0=C9=BC=AA-=BC=B0=03I=8A=B9=80=14=0A=15=C9pto0=E4= +=FB=92=11:`=1B=D1=B2=CF=02=C7-I(=D8=B0=14=18)=B1=98=0E=82=90=848x=81`9=08= +=82XJ=17=9EA=8D)=05+=E8=C1=0E\=90=12>-=0Cf=14=D4I=10=D2=85=83%=FC=00=0AJ=F0= +=C1=0Et=B0=83=190=E5=07=A5=DA=DCO|B=83=14=A0K=05=14=FA=C9=0C=14=C40=8C=A9= +=8A=09=FB< U=0D=9Cb=AB=16@G)=B6[K[J&2=0A=A5@,=1F{B=11R4=84=94=CC=80Q=AF=0AP= +=0BR=C7$&=99=E47$=18=08DF=E0=B3=D5=91=00h=C2=1A=DA=F5x=A4=10=17=94=00x=FDYL= +=9BzP=03=D0=D0=E0=06*=A8=D9K\=10=83f=A9=EF=06R=01=9F=D7L=80=03=FE=A5@=093= +=B8=C2w=F4w4=AF=8D=E4=04,=08JIJ=82<6=F1=E0C9=E8L=E3=CC@=06'=0C=C1=09=06=A3= +=82=1Bb =03=1Exl-;=C8=CC=0C=80=A0=AE=0Fy=05+7=80=99N8=A9=B8=C0=09=A1=07<=E0= +=C1=0E=A0=D0=03=13=C6*U=1E=E3=E1=A0\=08=86=17=C8 =08=83=8AA=85L=A8=83&x=07= +=83=95I=C9=DFT =98=1E=BC=003=B5=93=90Oz0(=DB=9D=E5'*=08Q=EDP=90=03=EF=E4=E0= +'=3D=C0=81=13\=A0=02#=B8`=0Al=11=82O=94=B5=02=16d=FCqF2=FA=99=08~=06=83=11= +=D8H=8Cc<=16EV=D7=03=FEP=ED=08.@=91=10=02=AA=02=1E=F4@y,h=CE=0D=0C%=83|=C9Q= +]=DCb=0B=0Arr=83%=04=E1=06U=D0_qre=BF=A3=99`Q.=08J=0E=D4"=03=1F=C4`U=BB=BB= +=01=0E=8E0=05,X=81=09#,!S=0A=A4=92=CD=A8=E0=05I=D8I=0D=3D=94=18U=FA=12=07D= +=00=C2=E2l=B0=84=AC=CC=84=07b=91A=1B[dS=17H=C1cLJ=89=A0=9C=92J=9BV=C5=A7=AB= +=FA=10=0C=94=E0=18=01Ie=88D=EC=D4=104=17M=93=FDE0=99RJ=0A=CE=90=17=14=A8=8A= +$< gD=DA=B8=83=1F=B1=A0=05=F2=9C=11=18=A9=C7=1A=10=CCs=8C=181J=0EX =91=88= +=F0=A6=04f4N=0B=8A=D0=02"=9C=88=99MXB=11=DA=D8=CE=18=B4=C03=DE=01=0E=13f = +=85=F05=87=075=F0A[M=90=1C=16=FB=88-I=FC=F3=C1A=81=90=D0=B393'=DF=81A=0Ev`= +=03=1C=E0=A0=07=B0=8Ce=12vP=83=A9<=92=05=1E=C3=8C=B8=E6=93=18=D8b=D0=94r=E1= +=13=1E=A1=D3=19)H=86*=C9=E3=9B=AD|=90=99=1B,=C7%=A8=C3J=A90=13=03O~=06gs=FC= +[q_=80=84=1B=FC@=08B=80A=16=1C=16D=14=80&be-=E2O=80=00!=A1=00=A5=7F}$=ADF*2= +!"`=E4{<Z=81^=F7=CA=D7=BE=92=86he4=E3n.B=D8=DA=14=A5=05=06=A5-=0F=94@=AB=16= +=E8=00=09:=F8=8AuN=D0=A6=F0=BD$=077=00=AE=85u=C0=B9=1A=A8=80[=85,I=AA^"=A0= +=15=A4=A0t=AA=BA=C1=12g=B28=1F=E4=80=0A=EC=A9=81=09=C7=F2][1AT=7F=9B=0Fb0= +=A8=AA=17=E4=E0=09)iN$i=E2=1C=1A=F4=800=C5=B3=15=AEj=00=04=1A=04=C1|=80c=82= +=11b=05=FB=17=198=81=084=E0A=0B~=DC=83:=D8 =06=1DTfN=8Cr=B9@=C1=EE>f]=0B=10= +`=F8.k"=EA=C5}1-=B7=B4=F5=11=86=BC` =03=9EQ=81k=E4=D7=03=EB=88=045P=88k=16= +=9C=ACD=CE=C0=04=1A=19s=CEXP=95"T=14=06=F2=E2=81=11z=85=A6@=DDU=09=DEy=C1= +=10p;=04=B4=ECOJ)=09=B1=0D=1Ac=E2!=E4=80=C8=98=06-s=7F=E0=9C=0C%=90*R^Aoe= +=C0=84=83=1D=C6=B8=C7=3D=E6*=CBU=DB=1EH!=09Sp=C1=12Nd<=E5=D1=C0=0A1x=02=0F= +=B0=13m=DB=E6=C0=87k=A2=F6=DF=A6R=15&D=C7=07@=C0A=E9`=80=84=180=95Bq=A6=1A= +=0D=EA=02g;=9B)-=A7=EE(C=0C=12=E8`=0Dz5z=CD=E7kvS=02=A8=F17=C4'=8A=1E=AE|`= +=85"tHspy=C1=F0=88w=D7=98=9D=CBP=1A=8D=F7=84=FB83K=1E=CC=A0f=1E.=F2=EE=0C= +=0A=99=C8H&=094=D8=C1gjUY$d=88=07QHW=0C=9C=00=84c=C2=CC=06=C7=DD]=11=C2=A9= +=03#=13A=E16k'=0Bt=80=14=A6=FC-%=A02=02O=17=9AdN"a=D5=B1=D4=13=97n=B0=EE$= +=CB@=06)=8CaX=F12=AF=C3=98=18=86=E8v=F7]=E2-=EF=85=D0=BB=DE=F7=AE=D1=80=F5= +=BDo=1FQ=846=C6=81O=0Bb=00*=19=E4=C0=09=3D=90=8A'W=80=03=86=13Ox-=08=83=0B= +=80=08=1CE=9A=0D=D2=13=97m=13=1E=E5a4=C1=ECQ=82=B3=81=0F=AA=12=97=1DL=81p= +=C63=9E=0B=8C@=95=1B=E8=C0=06=04=8BA=10\Ed=0C=02np=DD=0C5hi@=84=BB=EBX2=0Bt= +=BA2=C3`:=1C=90p=869=B0=83=0F=8A=B0=F9#X=FB=06;PfRT=98=F5N=B9E=C7X=8F=A1=D6= +=E1=BD?=19=14=E7=06G=9B=FC=F7=0C=04Ro=02=DF{=ECd_4=BF?*=CC=1D=00%=05/=F0Bt= +=A82rZ=DDu=82=C2+|=9Av=B2=96=17D\=98=13*=CA=87=FC=B4=04_=86=DF=05@=E8=C1=0F= +^0=AA=92j=DA=06IxA=0Dr=D0.=E3=BDd=07G=00=06=91=01=1D=81=E3r=9D=A7*q=F5!z0= +=03=E4=F3=12=0B=F7P[=10rC`=04M@=1DI=B6!Z=C5.=1B=94=03K=F06N=90=04"=92.~=93= +=12:0=04=E5=F3I=C2=C7=17=14b=03\=B0(.&uSg;=DC=B2=02%=E1+=FD&H=18aF=05q`z=15= +v=AA=11h=D1'}=B7=E1=02N=00=05=D2=02in=C5'=00h=03X=D0}=C4=E3=02=05=F3=12d=80= +L=91a~=1A=15=14=CE=C4&:=F0=1D=C0=D3Y=85=A7*=DDTd=C9=D3=03cp=03/=D0.}=93s=15= +vRA0=03C`=034=00=06=87q=80=07=B88=FCP=81w=0B=D7=02VP0=8F=E1=03A=10I=C45^N'= +=03H=80=03C=A0=03Z=F2=04U=90=04hP'>G8=BDu=03=FD=14:=96=92~1tD^=D1=03=82=02= +=83=C3=A7=17!u6L=10R(=A0=03=CCc=02=89=94E=C7r,=D2=13hAco?=08}A=88=3D=0F=D1Q= +=19=01=03O`x=C3c<5=A3p-0=169Q=03=00=B5=85/=00=05=F5=91)(=A0<=F8=A2J0=83=87= +=EA=93q.=80G7=E0=03=1E=C6p=BA(GQ=81=04=DD=11K=D9=B1=8C=EFGd=D0=E1=1Dxh=8DG= +=B0\vX=88=A5S\r=C2=03=81=83=05*=15=04@=00)D =04<=A0=03>@=8C=DB=06\=FF=C1{0= +=08=836=C0]K`r=94=18_Z=87=02K =1EH0=07=82=04=13w=F5=02b $$=10=16=FA=97W=CDG= +=1A*=E0|=A7=01=8B=B1h=10Hr=1BG=98=13=FCrtq=C6=03=04N =19L=86=15<PA=DEaP=B1#= +=14b"=03-Gdx8Gx=07=13@0=03X=10>v=97=93=E5C[0=93=12=0D=18=93=9DW=13=A9=F4=93= +=E1=F7=02?=F0=86=E1=D6!=E7h:=08C*=06=A3R=15e.=B2=14=7F&t9?=80=19=9B=B1=8F= +=FC=882'iY=B7=12=901=18!+=A0=16* T> =03=E0=88=93ibn.`|=99=81=8A3R=91z=B50= +=7Ff=91=17=99o=19=89=3D@b4=D22!=ED=B4p=91=C7=02(=E4q=8F=B18L0=7F=18=93 =DB= +=D1=86o=F4!=06(~=E1=87w[=E8=026=01s=0F=C8p}=B3=04<=95qw=18=933y=80=9E=F9=12= +F=C1=03=AE=E77=E3=A5=13=D5![=1Ch=877=80=04;p.:=F6t=ED"=03Y=E0b=FA=B8B=FB=A8= +=1Dkq&=14t:N=80=03)=F0=03=A13|04%=FC2PT5=D0=80v=D7N=86=A8"xE=10' =1070=02a= +=90^=AE(v=18=99=97=B1=C1o=FD=96&9=14~+=12G!G=155=00+9=10=1D=A2=C201=B0=055P= +=16B=F4=04=0BU\'=05=99=A193Q=D1+K@=999yW=9EI=9F=A1=C9=8D=A1) 0=A0=05:aR5p= +=9A=82=C8I=9Da=03=1A=E3%U=96!h=F0j,=B2=19=FA=F8=041=D4=13n=91=03=99=C1F=E1D= +*Q=C7=89=EE=E6^g=A5L_1=9F9=A7/=93=A3=3D$=80=02#=A0=02$p=03=0A=9194=F0N|=05= +=84=DA=A9=91=DC=C9=145=D3=99/=10=04=F5q+&=94=03=E7bP?=A0=06\=F2=03=B9=07=03= +P=D0=1F=BE=B1=16B4=1F=0B=E3L=00Z=9F=0E=88&O=A0=7F=97iwU=DA=022C=A5^=0A=941S= +dH=80=81=08=0A=034=90@F=90.L=D6dqwW=FC=D1=93K=14=AAK14=03=80=01=1Ag=06=05A`= +=05=BFt=9B=BD=17g1=F0=03J=F0)H=E0=98=97c=03r=B1$=B4=82=03=99=C3=1C=BA=D3=02= +=10Q<=C0=E3=A2=D3C=3D6z=A3=DB=89$%=A0=02=A3=C2a0`=12=8B=F3!>=80;m9=03M@BG`= +=04F=F0=03a=80=0390=04t!=16=18Z=14=10=E3=157=C0r?=D0*D`=03=82=F3=A5=91=99= +=A5:=C9=AB=C0=0A=A6=AA=E4!=9D=87=8E;a[=B8g=13<=C0=048=B0=03P=11=04=94e+=BAD= +=A1?@M=97h=1Foqf=FD=F2]|=DAnq=F6bM=E4=06Z=A0;;=E1=04;@=03M=D0=8F=91Gr=15F= +=12=FFQ=04=A1=18=14=82F=A9xi=A9=97zX=F6=F3=02=D2=82=02=94=06:>!=03=A32=039= +=D0=04B=D0=04X=90=04H =87@=B5.1=11=1E=BB=C9L=7FccW=B08zB=9F=FCZ=1A=93=FB=99= +=B1=C1=BA=B1=DD=F8*t=98U:A=04QP=05kv.=DF=A1=03=CCFr=99Ai<=C4=1F=CB=C1{N=F1= +=03L=A5=024@=19=1C=F2t=B8=03=96=02=E9{g=C2=13O7=1F=9C=D4P\=C2"=B6=823,P=04= +=E4=05=B0) 3yU=A3=F5j=AF=02=B1`?=E2=114=F8QC=D1e|=B2=07=04d=05W =04=92`=18= +=E7=C1IC=00=A7*=D0=02=D5:=159=A0=04=85=D9=03=E2=97=B1n=FB=B6r=C4=B1=1B=FB= +=B1=C5=8A=9A=9Fc:3=90=9ChB<=B42=1D=EDD=03D=AB=AC=B6=B9KN=01=B0+=C2&/A{=CA$= +=16q=84;=BD=D3=A7=11rVX=F9t=F1=B3m6=C9=7FD=DB3=ED=A4@P=90=03nx+=B91`=AD=F8= +=B4P+=B5=B4=01=12R=E2=1B=E6=03=9F>=F0AF@=04H=A0=05:@=04;=C0=14Sp=94H=E01=AC= +=13&TA=15=FC4=E0=06M=F0K=D3=08=B7=C4=FB=ABr=0B=ACt[=B7=1FR=93=8F9=8D'=C2=04= +_1=04H=B5=12=C6s=18=A1d=9BU=90=B3=00"8=EBF=88<=B0=04=B6=F5=15=06=F5-:=BB=B3= +=D7dD=9A=A1k=0A=14=039=E0X=99=9B=19J=C0=02=D2=EB=92B`=04=E1=84+=C4#=BA=F86O= +=A4k=AF=A6{=BA=1E=95=A68=F1!=D01@=B8=15K;@k;VR;=80=95R=F6=A71=11=1D=AF=19"= +=AF=E6=AB=C5=FB=B6=C7=8B=BC=C9=AB=BC=8Ag=80=C2cY=BE=94 T=D1P=87aB4=F0=03=A3= +=02\q=8A9=91=B10=9C=F4/K`01=B0=04=E7=A6=95=DE=AA=1F0=88;=08c=A8_A=B9E[=B4= +=A0A*=E79=1D*=10=9D=12=D9|_dh=AFQ=02=D1=F7=BF=00<6=13=82=18=D5=1A=1DH=00)= +=3D=A0=03=07e=03;=96=B7=99=DB25=10=04'9=054ax=EDr=C1=FCf=CC=9F=19=EC=A5=1BL= +=87=E88=9F=BC=D8=02C=E0=02=B1=1B=19=0B|=1EP=B7=03K`q=C0%=AD=10=14=16=F3=F1= +=05=CE=AA=03G=80=04=A9bb=DDj=C3=E7=BB=8Fj=B3c.A+?=FA=C3=B7=A2=03E`=81/=C0= +=03=BA=C1|=13y`3=A0=C4E#=11=80=E5=C4S+=03G`qR=F0=14=3DI=045@k=B4V=03B =19OW= +=04?0<=AB=A3=B9=A9=C4=021Q=C1w%3g|=C1=FD)=AC=9DW=9Fk=1C=CC=9D=D7=1CG@=13I= +=90=03R=E0s1=90=04=02;=13=01=B7=A8=3D=A3c=3Dp=18=B2=95=C0=9EQ+Yi=C3=DA=AC= +=95=B8=93=04<a=C8=B8C]qj+^=00\=C2=C9>=16=01h=A2Qo$A=04=7FU,=DB=83=8A;"=1B= +=DCYH10"=86=F7=02YA=13U=E1\=CFE=15:=80=05=86=11=9E=B9=D6N.=90=05_=81=99=BB= +=0C=B7T=FA=8C=FC=DB(=CC=10=1D=D1=B0=06=8D=B7J=04M=B9m=E2=B6=13U@=88>=903.= +=B1=03s=A1=13=C7=94/)t=C8N=BA=CD1dn4=B0=04=C0=17=A7=C8=E3=D2-=DBB=83=02=03= +=A3b=1B=02Q=02G=90W?3=02=0D=03X%0=A3^=87=10R;5Or=84=0C=F4=12=AF=85{=1E=F7= +=CF5[d=98C=B4=81i=04Yj=C1=0B=8D=BC=80( =12=0D3=F3=99=D5=18d=86=BE=E4=AC*5[= +=CA=1Cd=FB=C2If=DD=04b=96=06=0D=07=B20=00=04=16=D7=CA=83=9B=C3=DC=AC=CD-=0B= +=D3v=3D=ADo=A1T,=90=039`=02p=F1N=07=E63=C7b=02.=90O=10Q=04{=09=CA=B4=01>=15= +=81-0P=1C=E4=02=8E3id=B2=B6=05P78N=90=8B=EB=EA}=0BM=BCi=FC=1200=04=8Fa\=CD= +=9B=BC=C0=C6=D5=1F=E2z2a=03B@=04=82,d=17=B8=13A=F6t=19=82=8D=FB=BE=F4=02M= +=A0a=072 =94=F2=D2.=DD06\=BEFt=D7=C4=CDC=EA=BA<=8F=03=04=F2,=10=F5=C1=13=94= +=A6o=10A=83.=A0=D8=1C=B9w$=C6?=DD=11=14'=B9e3i=03=3D`=06=BA=DA=15=97=14+j= +=E8}=9B]=8D=9D=FD=D9=9Fi>=8B=E3![=ED=027=B9=C6=8A=D1SY=9D=13R=90=12P0=17A= +=16=DB=CA=F47=9E;CUAcW=CC=05=17=18=03G=C0=14=C6=A3=02=00=91B=C5@=18-P=1CD= +=98P=E1B=86=0AS<=84=18Qb=C4=81=03W=D0=D8=D1"=C5=08=8E#=9C=8C =F1=02=87=8A= +=157:=9ED=99=92#=09=12=3D\=98@=C1r=05K=9A4]=D4=C4Y=A2=C4=09=1B-t=ACp=D1=C2E= +=91=87Bd=B4`=D1Bi=0B=186t=B8x:=03=C7=0E)6\=B0X=91U=EBV=AEYY|=05=1BV=EC=D7= +=A5e=CD=9EE[=D6=85=8B=170=8E=FC=D0=F0=11=E3=C5=DA=19k=ED=DE=C5=BB=F6E=0F=B9= +/=FC=FA=CD=1BX/=0C=BF0f=EC=D0=01=03F=0C=C5=8Dc<=9E!c=06=93%:v=F0=E8=11%=0A= +=8E=1B7b=C8P=1C=83=87=0E=1E/b$=81=E1=E3G=0C#)=1A.t=FDZ=B6=8A=89=B5!V=B4H=BB= +=C5=0B=12%:=D6=CDZQ=E5p=944=93=E4hQ=C2D=09=9C4=997g=A9=13=C5=09=185n=F8=B4= +=91#=86W=B0J](=B9=BE=D4=C5=10=1A=87_=88=9D=D1U=FDX=F6I=CB=BEHk=96F|=EFk=89= +=DC=A8=91C=86_=1Fs=EF=FA=17=AC-=1B=14=FB=EB/=C1=F0*=10=06+=1AcP=B1=19=BC=C0= +A=88=1CvX"=87=1CtHb=08.=98=F8!=07=1C=8C(B=06=D0b=B8=81=88!vXL=86=AC=1E=92= +=CD=A1=16e=B3M =DCp=CB=017=16=82=92=AB7=96=90=C2=8A6=E2~=04)=BA=CEZ=B8=E1= +=B9=16=FBrz=AE9=9D=94;!(=16j0B=88=1A=E6=13K)=1A=9Ct=8F=06=CE=80=A8!=06$Z=F0= +=01)=F5=BAj/=AC=A0=C4=13=CA;=B5=CC:3>=BB=FC=CA=A1=08=A9t=E8=01=C0=B5x8=90-= +=91t=E8=AB@;=03K=901=C2=1Ad0=86=19h =02=07=1Cr=10=A2=89/=E8=F8"=08=0A=8D=90= +=E1=B1=C7^=F8=E1P=1DhP=81=06=16_DH=05P=1B=92=88$=8CjXa=C6=8Az=E0j=AD=E5X2= +=01=BE f`a=A3=94p =01H=96b0=A1=85=8B`=D0=C9=84=1BrB!=C9=9A=82]b=06=14=B6H!= +=06:=8D=A8a=A9=EEZ=E8)=AC=B2=A2h=A1=07!x=1Cs=BD=B1=BC#=EC=87=1Enp!=07=17=CC= +X+=CC=FA=D8l=13=AD7y=B0=C1=86=1A=E2=A5=C1=C0=B6f=F8=F3?=D3:=D3=C1O=03=01=F5= +=D7_B=17=D3=C1=C3=0B=83=00"=0B'=9A=10b=07F=E9=FB=84=8C=86=1ES=8Dh=D4=83h=B3= +=D8=A1=DAHbA.*V=98x=89=1B=B0=FAj=05=A5jxA=A7!\=80a=88=87=86c=EE=C7=9AL=80= +=01=89=14=ECz5=BA=12=A0=D0=09=C9%M0=E1=84=FDfH";=ABx$+#k=BB=BB1=ACn=C9lOM= +=17=84=C0a=88=19=06=E4=01=887=DB=1Do=AE=B4=FEs=EB=07 |=C0=01=B4=BFb=A0=81= +=B0=03=0B=D3=81=0C=19=86=D8/`=00=E5=96=BB=C1=CFd =1B=07=1D=94=F8=C1=0B$=8C@= +=C2=B2=F2*=95=81=08=C3=06z=A8=D6OG]<=E3=83b$=E9=86'=82=D0=01+=A0=8A=A0=E1= +=86=1F=90=96=E1=04^=83=A6=01=05=D7=86#=81=85)rM=89&#x*=F9+=1D=96[=B2=04=17d= +=80=3Dv=DB=95k=01=08=BF=E2ms=AC=1C=CA=14=EBi=A8=81=17=EF=05=CD=7F=98=97=B0= +=18j=80=E1=AE=1F`=C0a=AD=B3=F2j+J-=94=D0=FBa=86=C4b=A0=FA=87|=F5=F2=8B=87 l= +=B8=A1=07=C2=E8F=BFn=C7p=E0=A2=08=1Ft=B8A=D1#=C4=E5=E1=B2=1B=E8=AC=94=87!|= +=A5M"=C71v=1CB =A7=02=16=88=88=07=F3y=02\=AA=E3=83=82=84=C7=05(`=C1=09$=88= +=10=E2=94=00=064YIsZ`=02'=A1=CC=05G=88=DD=CAnP;=DB=AD=00hA;=C1=13=C2=C4=16i= +=01=0Fx=C2=E3=8A=0B=AD=05.=1B=00A=0A5=10=83=0D=F0e=847=ED=E0=07yb=8B=9EH=14= +=04=1F=F4@=0A=16=CA=81=0F=F0S =04=FD=05=06oc=82=A0^P=AF=F4U=B10=8D=91=C1=0D= +=84=E0=03=0F=91=EF=06>=B0=81=0Fj =87=C8Hf>C=88=01=AB&=92=B1=14=AC=80(=01=14= +=DD=00=09x=03=91=A5Q2=92=99=C1=BC=92=E0=9F=17(=EB=06=09!N=E9.=08=1D=E7(G=06= +8=E8=81UN=80=C2=E9$e.?=8B=1D=0Ap=FC=D0=17=89=9DE=86=EC=81=E1=F0.Y=1F=17=EC= +=00=076=A0=01=10=C8=B7;=E3=D5=00=07m=D1=0B=A0n`=033=90/^6=08=C2=0D=86=E0=84= +=1C=9C=0F}-=B3=C1'=91=80=19*Z=B1=8AX=C4=01=E6NS=B4x=D5`J=E5=99=01=10.=E3+_I= +=EC=05;=A8=18=E3R =03=00:."=3D=A0=88=0A=80=90=14=EDU=EA33=00=E7=94=8Ci=03C= +=B1=ACR=AE=19C=0AX=92=BA=12=80=CC=04::V=B1Jp=04=C2@=81<=9DK=C1=14g=B7=03=B9= +=D4=8E=84@+H=0F=92=B0L=B3=B80=93=C2=BB=E4=0C=BD=F3!=F2=FD=E0=078=80A=0F~p= +=03 P=ED{`=83=DE*=C7=F9Jq=F5I`N=CC=81=17k`=B6=04=05=CC=96=B7TL=18k=A9=98=1C= +$=E1=06<=10=82=0D=B2@=CE"L=B1=06,=C0=8Dm=A4=19=83=FE=05p"-=98=D1=0Ax =A2=C7= +=88H{6=D8B=11=FB=13=E9=99=F3=015=05.=1B=C1L=8AC=02=13=F8=00.=CC=E9YoJ=B0=9B= +=1E=08=85=06=E5Q=81d=822=87=1A=A0(=05'\d=EC=18=F9=98/H=AF=A0=98<=E8=D3=98= +=B6I=EF=DC=C042 =03=11*S=B8U>=81=07}=8A=81=F3=DE=D4=83.t(=074=B0=01=0F:=D3= +=19=FD4=A1N=01=BB=81bd=C0=83& =E1=0B:HL=82NZ=A0 XQ=B2=91-=8C=10=BCW=1D=96= +=C5@(=96[A=0D=10=17=A3=17=3DD=050=E8=A95K=85=03Z=1D=E1=0AK=A8=81=0E=08=07= +=06=1E=94=954=98=F1=81=17=E2=B7=D2=18=14=01=06+=D8=C8N=A0=B3=B3=F9=E8$=ADKR= +=01=B9X0=9F"=A4j=05G=01=13kT=F0=82=1C=9C=E0=05J8ax=83=A6=B6=BB=E0=80).@=C2M= +=9D=16=D71%=94=3DlzA=13=A2@6=1A=18=D3=BEtj=A9=9D6=DB=16C}=B1=07K8=FB=82=16^= +:=D4=93=DA=12=06Y=F8P=0E=80p=04=DD=0A=CA1t=93b=FA=14=03=D1=04=DD=85[=C1=C9i= +=8Cb=C3=906>=04_=FD=DB0=A86=C6=82=B8=1C=EAJ=A1=F9=0C\&$=04"8a=08=1D=9A=0A= +=10=9Ex?O=81=E4F2=E9=0D=D0:=B9=83=F34!=06KJ=81y=91&&=90=89=85=BB.8=8D=0BL= +=18=DE?=1A=8A1z!Q.=F1=14<=F6j=D2=BD=D3R=0B=A6=EC=FB=D5y=BD=F2=08B(=0D=1F=EF= +C =EDX=86NE=D8=02=10`=9C=83=19=10=A80}Z=8C=85=16u=03=8C=EC=A0R=05=AB%=DD`= +=F0=BC=FD=9ATw=80=B1K=0B=B5=82=1B=E4j=18"=02=94=08=0E=BE=0Ab6F=E4=06+=A0=15= +=1AyP=04=DA=A2=B8=BE=16=12=82=11=94=F0=05%H*=89=DE=A4=01=C5X=B2=17=17=94=80= +=06:i=1E=91d=00=96=1B4=01h=F0=F3K=C9=B62=D7=85=A6G=82=FB=8B=04=DA=09P=F0D$= +=D8=F5=05Cxe=13=94=B6=DE*s=87xH{o=0Bd=A0=97=1B=84=A1*=C7T=AC=1A8=D3=19=0A= +=17h=B1=FCL=02=10=16U=84%P=01=0EH=A0=1Cg=B4=C3=A0x=15J=07=BD=8EW=FC=18:=157= +=9B4.=8D=F1%=A0=ED=12=A6m=06E+:=C8=B0=0Af`=E8l=AE=C0P =0Eq=8BJU=03!=18=024S= +=D1=C1=BBc=E0=03# X=07=08=B3=AD=15=84P=B0#=F03=8B1=C0)=09ZP=83)=A4@#/=11=C3= +=0E,=97=14=3DeA=82=95=CA=E3=AC=BB=13-=B3=0Ch./=C0=B5=04k=90O=BFpa=08Q=D0=03= +=97=D7=A2^=D4=B2=D7=BD=D1=8A=1A=BBZF=D1)!=B2=07>(Cg(=DD=97=C6=D0@=0A;=C8O= +=FC=80=00=04&t=E1=0DH=18=02=0F=E2=F4=18=18l=0F=07G=80=A8=A5d0=CE=C5=12=01= +=EB=93l=B7=9F$K=03=07=F7=FC=B9=8A\t=82=0D=88=80=14p=A6j X=09=0A=BF)Rq%=02<= +=E0=AF=89=C8=F2=A6=B0=9D\^=B7R=A1Y=CC=0F=82=80=035=1F=E1=08A =82=0E=B8=10= +=19=C6=1C=11=075h=A7=AF@=C6=96=1C=A0=80U =93=CA=0C=9E=00=85=17=D8@t=AB=DEJ= +=10=8A=A0=B5=93=99=CB=055x=13"wp=EB=13=E0=BBe#=BA=9F=A2i=D0=83=1Dh=C9=06=B2= +=F6y=D4=BE=85=DD!=7F=AD=B4qI=C2=A4=8F=10=85=1FxR=B7=8DQ=D4=0E|`=C3t=DF`=F5`= +xB=8BG=B3=83=19X=8A=FBA=E0A=14=EC<=A5=D1=AF=A1=0A=0C=D6=01g|pxx=0B=EC=89Gh= +=BB=DB=03=D6=84=A9_^=9C3=F8=01=134=AF=E4 =18=01=A7=1A=061N1=99=1B=C8=08=BF= +=93&=D7z=81,=A8=08=81=A0=81=A1=12=82=D0=A0=81,P,-b=82=1E=E8=01'=E8=01=B8=10= +=11=9ES=81=16=E0>S=01=02=FD=FC=E0)=92=88=81=1C=08=82=1F0=82=B2=81-=19=B1=08= +=AF=A0=81=C4=90=81"H=0C=18=B0=AB@=13=15=14=88=81[C=01=15@=11K=A9=01p=9A=81= +=1Cx=82=1F=A0=81=FD=E9=B9L=02=9E=AB=10=0B=17x=82v=A1=8F7=81=81* =02!=98=822= +@=82L=CB=81=F8a=8C=18=98=82 `=02=CE=E0=0C=F2=C1=01$@=02=1F("=1F=D8=81=0C=DC= +=C0=0Bd=82=1C=90=02Q=E2=02=0F=B1=8C)(=02+=00=82!P=14=13=8C?=CD=92=AC(h3=06= +=F1=AC=B6P=14=F2=E9=BD=19=B8=01$X=1E=1E=98.=C8S=82=D5=BA=8Dlr=AD#(=1C;c3*= +=008=11=83=88=1E=D8=02=80=BB=BBy)=0C4=A2=81=1FH=B7=C4=B2=AF=C8=B8<=0C=F3=01= +=C3!=C1=1C=A0=82=06=AC=91=AC=B8=0C=0D=99=BE=18=90=02=92=A8=08=AD=F8=A1=1E= +=C0=9B=AF"=1F=11=A1=82=F3y"=18=10=82=E9@=88=15=18=02+=B8=1B=13=FC=03=02=A4= +=E9=AA=E0=AB=92i=99!=F2=09=8A =98=1E=041=9F=1D @ @=02+X=82-=D2=01#=80=BF=CF= +=D0=B6i{=A59=CB=01=1Ep(.@=02P=CA#=CA=F1=10E=19=02j#=82"=08=02,=A0=02(X=02(H= +=BF=1B=A0=9C=F8#=94=12=BC=01#=D8=C3[=DA=01<=EC=01E=013=1D=12=11=C9=A8=81=81= +=92=81Ps=C4=87=A0=18=D7=DA=01=92=F8=95=82=98H=FF=C1=C4=14=08=B5=0D=83=88es3= +=C2=90=81&=C0=0Fc=FA*=13S=90=A3=B0;:=F3=15 @=01=E3=C1=811H=15Oi=01=D6@C=1A= +=18=BB=1B=B9E=16 =1A=1D:=94*=B0=AF\b=02`=B4=81JI=886=92=82e=E3>=19p=82 =B8= +=0A=CD=F3=B7=B8z/#=14=0A=96[=8A=EA=D0=01mC=13=F18%=BD=90=01# =9F"=F8=81'=D8= +=02" =82=D1X?=19=F8=02$=B0=10=F8Y=A5x=F9=A4\=FCz<=1Cp=02'8=A6"=D8=01=19=F4= +=90=C5=8A=1F!P=82=05{=02&x=02=19=84=1F=F6s=10=BB=E1=9E=D5=E3=0BBA)=19=E8=01= ++X=94=0B=E1=812=9A=81=89#=02#=08%=BB=9B=11N=C1=8D=97=0A=A7IR=11=BF;4L=F4=14= +=87P=81=85=03=02=C68=1B=BF=88%=13=AC=813=C8:=8C=FB=0A=D5R=81=9E=00=99=0D=C2= +=01Y+=A0i=E2=AE)=B9=1A=8C=B3;=93i=8B=A1:=14=0A=89=82N=FB=A4,=FCE=E3y=02=DA= +=B8=C18=0A+!=BB=81C=81JgD=8A=DDh=9E=1D=08=0A=B6pJ=F1`=99=F1=F1=1A=B7=F2=0E= +=1D=88G=C3=C9B=1B=10=82=A33C=1F=A8=9F=C5=8B=8C=1A8=91=F9)=82'x=A5W=D2"=8D:= +=A6$8=82=FF=D2=C7i=CBF=F1=09=02%(=02"=106=1DH,=9C=F4G=06=D1=9E'(=03=C3=04= +=C4=BA=D9=C2=C9b=B1YYH=C9=801=E0T=95=87=FC=E4=1F=02"=02=11a=C5=E7C=1B=D1=FC= +;=C0k=1C=14=88=02r:=0F(=88=018=F8=8F0x=81+=80=BD=8D=EB=01=AC=D8P=15=E8=0D= +=83=88=89=9D=08,=A4p=01]=DB=1C=AFz4=0C=AB=08=17=88=8C=80=AC=1F=F5<H=FCH=1B= +=C9r=01 =C0=18=D7=AA=0B =D0=0A=1BH=82'=A92=B0X6=E6A=AC=DE=EB=92=CBC=AC&=1C= +=8A=1E=00=02-8%=EF=11=02=AF=11=0A=E3!=1Feb=82W=CA=01C`O=CC=08=83 @=A6d=0A= +=03=89=0A=A9=FAtS0=B2=AFq2=02=1F=F8B=BE=A46=E93=C3=1E=E0=01%=A8=81=A1=B2=94= +=C7=98=C1=09=BB=1B%Z=94.q=D0>=B3=9B =98=95=1F=F4&=19=D0=AD=FD=88=16=AFh=C1= +=15@=0C=16=E0=81=AC=C8=A5=C5H=82=E8=B1E=9D=CA=18eY=88=1B=90=01=19Q6=FFH=93= +=16=C0=81 =00=0B=DB=BCE=90X=01cA=81+9=81!=08=16=89=FC=B1UY#=B4=BFz=C8=1D=D8= +=01=B3,=02=D1B"Sb=8C=1A=08=13=BF=1B=88 =B0=08E,=B6=A4=D8=A2=19=88=8B=A2=14#= +=1A(=03=DD=A2=81)8=02=1Bx=81*=90=17c=9A=01sU=A6=E6=01=1B7=EC=81=A0<=D5!=88= +=13=A8=CB@p=AA/=1B=88Gx9=D7=8Dz=A5>u=A8=89=8A%A=E5G$h=82 @=82(=08=82)Y=C8'0= +=14D=E1=BA=18=B8=82!=18=02=1DX=BD$=E2=93=81=C1X=C7=10=02=CA[=D4=A2*=AA=C9= +=84V=D4=D2=0FC%N=1AH=82=EE=83=1Ej=15=D1=D1=CC=18=19=10=A0=838=02=01B=0C=D3= +=F8A=A5 =B6A=D37=8Ex=A7=0CZ=01=1D`=0E=1B=DD*=1D 2=AFP=B2=FEI=CD=18=C8=0E)= +=10=82%=C0=02p=E3=A21<<r=E9=1FN=BC=C5&=C8=01=9F=EB=A4=D7K=13=16@=8E=AB=A1= +=C1=C9=9C=90"@=02=ED=E9=AD=AF=BA=D7=D5 /=A8=FC=18=02%=9A=A8s=8D=9Fx=E9=82= +=1E=C8=81c2=DBP=E2=92y=E9=D3=BC=D5[7}K/=8A=9FD=A1(y1[=1D=98=02!=F8*0=13;=1A= +=A04 =82*=80:=AE=CB=D8=8C=ED=D8=C9-*=A3z=CA=15=88=02#=E0=D8=C9=EA=01#=10A= +=11=C9=C8=DA=80#=84=D0=C1=E98=81=14H=D4=83=90=01=AB=F8=3D"=E0Zd{U=19=D8=01= +=8E0=89=8E(=9Dw*=A4=9D=C8=0A=F5j=01&H=0F=D1=E9>=98=E2=01&=10=02/h=02=A5=95= +=D7#=E8P=C2Q=11=90=A1Z=15=F8=01=CD=BC=C5=A7=E1=02=B0(=B2=A4=00=0B=F8`=8A;= +=E0=8B=1D8=82/=B4W0=92=97t=93=D7=97=A3=13%*=A6=BD=3D=02%=00%=BA=AD/=BD=85_= +=F8=D5=D3=FA=EC=8C=B6-=C9=1A=10=17=C4=08A!x=82&8=14=11YVE=C1=0F]=84\=C4=8B= +=DC=7F=9C=DC=0A=A5=CC)=DB8=EE{=0C.:=02(=FCp=E0s=0BM=D6=1A]=DA=C3=E0=14X=A4= +=E6=19=88=13@,=A1H=81=19=E8=AA=16=98=81X=F1=01=95=D0=91=0C=8A=8E=17=D8=9Bji= +=01#=80=81=CEC=01=87=81=81"=B8=81$R=3D0=D3=DF=F5{=8C=CB=A0=AD=DF=9BZU=11=E2= +k=15=8B=D2=88=9E=1BX_&(=8F=AF=D2=1C=0BY=A5(PM=C6=C0=C3U=BA=DF=BC]=A5w=AD[= +=B3=8D=DF-=E6=D7=F9],=1C=E0S=1B=E8=01(=F0=01.p=18=D2=D0=81=89{=02;=E0=C5=C5= +=BA=90=B4\=D4=03=C6=D8E-"p2=AA=1E0D=1A=A0=83=A00=8D-=DC=01 =D0=A8=87=C4=DE$= +=82=02=11=1D]=D3=C5`=B4=02=9A=1C=D41=1A=08=1A=17=C8=A5C=D1=09=16=D0=01=95= +=90=81=94=D0=89=93=99=0A=16 =02=BB=D0=01=09J=01=E5=C9=8E44Td5\=A2z=8CO=E2= +=01=1FP=01=1E=10=E2W=FET=A9=04=8B=11=DE=8D=84=9D=17{=9D/=E0=FC=12=82=CE=C0= +=02-=90,<=9C:=FC=0CJcR=D2,=E62.=96=DF=F9Uf=FAU=0Dw\=94<=B4=8C4=F4=01=F9=CAC= +=92=DC=01I=81=A8=81A=91=03=EEX=19=F8=01=D2=D8=81=A21Wcj=82=B6P=D0Tc=81G=CB0= +U=85#=0C=C6=B5=13=0A=96=12P=01=13=E8=81=E5=B8=8A=15=18=A4=DEx=81=D4Aa=12=18= +UN=16=9DS=CA=A7\=13=02=B6=88G=1B=98=A83=F0=81=CA=A8=01=F0=13=910=E8=09=CD= +=83=E5=89=B6Hg=EC=8Er=81=BA=1A=D0E'x=16( =82=1F8=02=0BY=D2=091A=1F=18=D7-3= +=E6=94~=DF=F8M=DF=A0\=E6=97=BE=81+P=B0=82Q=14h=DE=81=88e=82#=A8(O=C2=81o=96= +=92=04U=8CF=95=DCE=95=8C5=00=82=ED=03.=CE@#=94U=0C=AB=EA=91=054=B4C=16 =DA= +=03=9A=DB=91g=96=00=96=E4@=9D=9D=05=92=958=81=B0=9A=01=9D=FC=08=82=87(=01!P= +=0E=13H=01'`=0B(=B0e=F2=F0=CD2b=C8$=10=D2=DC=A0=E8=E9=BD=D2=B0=88a-=99=97Ir= +=8A=A5=A5=03p=EB=10%=C8T=19d=CF"=C8=02=93T=E9=94v=E9=97VfQb=EC=EA=BB=E1=9A= +=8E>&=F8=E8 H=02-=90=02)8=91=1Cp=82n*`B=99T=04=AE=D0=1E=C0=AC=0Bi=82!(=02= +=9D=06=BB!=90=82 =80=8C=03z=EA=95=D5H=8B=F1=C8=19&F=D1=81=E7=ACR=92}=D6=D9= +=11=10=01=11=D0=95=12=C0=01=DD=0E=09=B5R=01j=DC=0D#=00?=B3=05=C2=C8=98=81"= +=E8-=CB!4=E9=ADk"=9E=CD=FA =D7=B6=C0,=CB=AE=82nL=02=CCj0=C9X=82?=1E`=F7M=EC= +c=B6bK=1D=9F=C7=8E=1F=BET=E6=CE=D06j=AB=E9=09A=18-=10=D7! =ED=96=FA=01o=02j= +a=EC=EF=C5=10;m=81O=0Ba=82 =90=82{=CC=DC=1C=FB=00=88=1DOb=C8=88Ap=06=10=16*= +=16=A6h=E8=F0=E1C=14=12'R=AC=98=02=C7=C4=14Bf=C0@=91=E2=85=0C=140T=98(Q=82= +=04=CA=94#V=92X=E9R=04L=972Y=DA8I=02F=CA=9C&K=98=A0=E1=A2=05=D0=19In=D8=082= +=83=C6=0C":b=0C)=92=83=8A=8B=15,VP=AD=B1b!=D6=ACZUP=ED=EA=F5=EBW=16b=C7=B2h= +=F1=D3=85=0B=1AHr=F88Rd=88=93 :v=CC=90a=F7=0B=8D=1A;j=D0=E8=EB=F7/=E0=1A=82= +=07=13=AEa=E3=87=12(D=89=DA`l=E3=F1=0D=1CAp=DC=A8=EC=B8=B1=E5=CC=91s=00=89= +=C2=E4=07=10$h=80=F0=F8Q=C4G=8D=1FB=0A=C2h=ED=BAu=8C=A51^=D36=18=E3(=0E!HvH= +n"D=8A=13&Cx=E8=08B$HA=BB3=8A(d=08=F1y=C3=8A=D2)=AA=80=F1P=85=0D%;z|q=01=FB= +=D2=85=89=F0&U=CE=94=093fy=13-e=E6Li=D2=C4=09=144=C4=B6=88a=C3=05=16=18:=A0= +=E4=D5=F1=02=C7=112=1C=D5=C2X=3DL=B5=15=82=0B=81=B5 Xd=8D=05=94Y/=00=D1=D8= +=12>,=D1=83=19;=E8=80=84=0Eu=09x=94=0D=80=89=98W=0D=A8=15v=A2=0DBtA=C5=10@0= +f=C4c1V=E6C=0EQhv=A3f8pf=DA=0E?=F4`=C4=12E=D0`=84]=B6=19D=1B=0C=06=E1=00=C5= +=91H&i=D0=0C8=00=01=84=0E9=E0=90=9BjE=1CA=C5=0E;lT=90A9HQ=03=0E:\=A5=02t=D0= +M']CR=A5pU=10=A8=B5=F6=82=0BD=0D=89=82Y6=ADW=DEy}=96=F7'K:=B5=90C=0E=DA=D1g= +=03P.=D8=E0=D4=0D?=045=C3=0CL=C9=F0D_S=9D=99=A0V=0Cj*=95=83=F4=01=F5=02=0F= +=A8=FD=80=04=12<=F0=B0=03=0F=3D=F0=FB=05)=AB=90=8E=F8=D7=89=83=D9=80=A2=0D>= +=F8=00=04=13=95=E9xYe9 qe=0E7R&l=99=94=05=DBD=89H=D9=05=A6=91=CD=DA0=84=0F= +=B29=F9=A4=0CJ=D8&E=10=BA=0A=E1=A3=A9<=D8p=AA]=FE=D9@=04=0E1x=DB=C2=0E[=B9= +=90f=0Akz=E4=90=0A>$)=04=0EI=BEp/Z=9F=1E=E1=C2=09'=D9=C4g=9F=E7=01=FA=A7N%= +=9C=90=C4=0A6LA`Yb=B9=80C=94=0C=97=05=04=0E-=D00=ABU4P=85i=A6`=B5=B0i=A7=9E= +=BE=D0=02=0C=3D`|=D8=11>=E0 E=88=AD=BA|=94=88=82=3DV=C3=0D2=CB=8C=F1=CD=8D= +=F9@=05=11-F=91m=8EB=DC=BA=05=8E7=E8P=F4=95=95=CD=BC=EAQ=CB=E6=D0lAu=D9=A0= +=03=B3=D3=1AD=03l2=0Ca=04Q8=D4:=E1=0F=CA=0AH=C3=11-=D4=D5=97=0C=A8=B5=80=83= +B=ECBd=11D*=D4=9C=FB=DD=0F=B3=C5p=83O?=91=FC=83=0C,=F0=84BI9=AD=14=B0=9F=03= +=CF=D4=9EI'@(=D6=0F=0F=FA=F0=82=83=F3I=F5=F1W=1Cg=C5 =0Bl[JU=C8=13=F3=F0B= +=0CV=CE=10=B6`R=F8pC=13<(=11=06_H=BD=0Cs_=B2=FA=D0=C3=85=95=FD=00=99=101=CA= +=A8D=CA=3D=F8=F0C=10=C1f=F6=AB=10_=08a%=0EJ=E4he=D1=991a=04=1C=3D8=C1j=0F= +=CC=DA=16=AE=0E54ku=0E=AE=C5=00D=92=13=12=D6=EA=B8@X=B5BB+=C8=90=95=DBn=A3= +=197W@ =05e=0E60=01=D4=83$=CF=E0B=0D=EA=CDD=B8=C0=0C=E7=92=F6=90=80'=AD=C9= +=97=83Z =04!=88=A5+=94=93J=E5,=A7 M=B1=80Fd=91X=02=B9 =BF[=11=C1/58=02_=0A= +=D3=97=D7=C1=0EV=82=01^=A8~p=03!=E8=C0=07=BA=93Q=9C|`=85=1F=FC=80=09=C3=FC= +=A2=0C=0Ev=00=04,=F8@.T=18=96ep=10=05=1D$=EDF=C1*=CD=11=BA4=17 =E4=A0.=06)= +=92=0C=A6=A0=83=B7=10=A1=07F=9A=16=92=A2=F0=02(t=AF=087=98=81^z@=03=A2=08!*= +W=91=0A=FB=DA=A7=C6=E7p=A5=06< =88=0Cn =A4=D91=AC=055SB=0DX=E0?=80=11N=80= +=03D=89=DFJ@=03=03=C2=00=8C^=A1=0F=E46=D5=15=09N=10d1=A8A=0B =97=C7=90=01= +=85=06=C7sB=0F~=D0=BA=D6=89=88=84%4a=0D=8C =04?=8C=C1V=AA=B9=81=12 =A3=AB!= +=04a=09NHB=10~=90=03=DEL=A6LD=F8=DD=0F=8E@D ^)=0AC=B8=12=10=83=B8=851=00A= +=08C=98=0B=11=92=C0=03=0F=C9=80l=90=EA=01eh`=BD=D9`qN=F7=A2=13=9D=EES=03=B4= +=DC=C0=05e=A1=01=10.=95=C65=92=B3!=0A=FA=C1=12=945:D]P=9A=FB/=A8=C1=BFX=F2= +=92>=FAQ'4CA|<=C2=95=B0=B0=00=06/P=A489=06PN=F5=05=0A=F8+=8B=C4 =E4=9D=18q= +=F2U=9E|U=EC=04=03-=1F=A4=CAVJ=18V=9C=8A=F3=83+@=A1=0AK=08=C2=10r=F0=03=1D<= +A=07K0&=15=8E=10=04!=F0=E0=97=C0=BC=12,=91=17=CC=C8=E8h=08=A8=CA=C1\D*4H=11= +=81=85<XB=95|0=CDjZ=13_z[\=0B=94=E0=95 =04=B4=9Cj|_=0A=14D=83L=DA@=06< =93`= +,=D5@=15=C4=E0=05%=10BJz =CF=11=D0=93`=883=89B=FF`=AE=A8l=AE+=0D=D3=14#=1By= +=C8=06=B1=C0=05=A7*=1B=84n=00=A1D=B9=00=06$j=A8_<=C9*=0F=8EH0M=B8U=0Fx=D0= +=84=B7=00=EF=06=3D=F0=15=12~=87=04'=18=81=08R=98K=10=80 =05=E0]a=09tP=C2=D6= +d=9AC=1C=10=FC=01=08S=10m=10=AF=C4B=9C=12=8AP:=D0=C1=14`=9A=06=CE=EC=86=079= +=A8A=12vP5=A2=CE=E9>t=92X=047=E6=1C=A7=B6o=05}AM=0C=AA=17=03o=C2=01=06=0E[P= +=0B=90=E0=82=9D,=17%#hIY=0F=D7=93=18=AC =05=F6i=81=0C=08=04*,=04=A1=06=CE-= +=0B=E6=C0=12W=B9~=85=A9n=A5O=0Ex=00=04:=3D=AC=06#=D3[_q=F0=03=13=09&=B0=82= +=FD$=89@i=18=1C=14=A1=86g=80=A5=14r=F3=04=1A=B6=E5=07=888=82=13LE=04%=00=81= +=86S`=C2=11=B0P=04=B9=B8=D6J98=0E=14=E4=F2=D2=11=BF=D4=B5=1Aj=A1=10z=10=84= +=04_iU=D3l=92=93=A0=D0=1A)=E6=C0=8B=DD=1CY[=03=8A=15=E2=D2=E0=A9\=01=EF=0A= +=B8=BB=83=BA=86mAb=99=0F=BF=14G=A0=12=8C=E5=04=01=13`J=AE=CA=82G=FET.W=E0= +=01=B9=9A=D9@E=FB=AE=17+=9A=AA=D3=05=81b=83#=80=01=065=EB=C1=10=D0=D2=85=B3= +=F45F*L=82=7FI=08=D1=AB=12=C6D=8D=D1=01=10=9E`=85=93F=AB=08Lx=82=ADl=15=D9= +=C4=1Ea=09J=A0!=0D=95=80=04+`=E1T=A7=FA=01=114=94=D9=1Fh=E8J=14#10[=AB=83#= +=B8A=08L(=C2=166K=A8& =85=06=CD=B2=8D=93=08R=83=19=98=9415=08^=0B=8E=D0=C0= +=E6 =88=B8Pm_VZ=A0=A0 =E4x=05-=E8=01=1C=B6=D0W=7F=A2=80+3=C8AWHP8(=A3=E4=06= +%=80A=1Eg=C0=02=19=04!D=3D=F8=C9=96=E1=DA=E5}b=EE^=07=85=C2=10=F2=82=14=BEL= +=E1b.=EA=ABwlz=83[=FAN=08#=943`H=9D=17=A3=DD=16c7=B0a=9C0\=04"=18=A1KE(=82= +=16=800=BB@=F7=A0=E0=816e=85=07=DE=D3 p=81=09Q=D8=EF=940I=FB%L=8F8=07=C7=EC= +=E1=10=96@=06=D0Fz=96=CB|1=AA_c=9B!h!x*"=C3`=BE=F8=CFE=D6=BA=9Cm#'=82vp=A9= +=B0|=11=0A*=8B=0D=9A=ECX=82=EB=06=D0=8F=D7=B5I=09=BA=AB=82=13x=07=066=90=02= +Y6=B5m=F6=FA=9A,.h=02=0Cp=F0=93=9A=BD=FB=AF=82=E9=9E?_=00=031=E4=B0=09;=18= +=0E=0F\=F7:=13zM070=82=C9@h=98=1FD=D8wK=08MbQU=05=DF=15=BC=EEv?8=DEsy=84)= +=ADt=09]P=C2=8A=89#Z=1DU=DCW@=A0p=10=90=D0=04=DFhH=08;$=0E=A4=84z=EA=C97=B3= +J<(p=08=87=93m=1D=0F=B7};=E8=B1S=B52=03=04q=CE=05A=A0=81=0E=94=E0=83=19|=AC= +=05=F1D=8F=CF=03=C5=93=9D=80=CA,@=E1=81=0B=9C=D0k=AF,=DD=C8=AC=DFA=0BV%=98#= +=BC =07=AE#=91=C9=FB=9A=F0=18)=C0 =07Z=8F=81=13p=9AX=B1=8F=DD=92^=F8=96c=A1= +)=B4=9DI=C1d6=B0=D2~=E9Nr=1F=B0=D4Tv?=BF=EF=F0~=F0=D2N=09=08AH=82=12=A4 =9C= +#=84T=B4=AC=ADxH=F1=FC=03#@=81=09X=E8R=D8=AD=9A4=81=DC=E4AI=8A=E9=00=0F=94= +=1B=AB=D0L=0B =8A=13=0C=01H=E8=D8S=CD@w=D9=9A=E5pN=D3=C8=C0=84=DC@Y=E4=80= +=09=C4=DE=C0=9C=95=09=88=04=06%=1D=A7=F0=DE=B6=1D=12=13=94=C5=AA=D9@=0C=D0= +=05=0D=84=0Ae=C0=D1Q=E4=12=DD=11Ae=B8E=D6 `=B4=00=C1CQ=D4=EC@=D3n\=81=10\Y= +=DD=8DJe=08\=10=DA]=B7=A4=CA=DD=A9=1F=A2=EDW=A0E=A1=FBM=81=11=FC[=A8=B4=96= +=16j=07=A1=8CX=12=94=09=10=F4=08E=A1=0AH=9D=0D=01R=1E=0D=EC@=0E|=C1=0C=F4@= +=87=B8=CA=BC=11=C4=10H=1B=E7=FCu=1E=FC=04=DF=AD=95=93=04=AD=C0=F9=F4=C0=0Dt= +=95=148=1B=17=90=C0=15=EC=09=A0=18=E2=E1=14=0C|=BCI=09>=C8=CA=B1\=97Q=C5=C7= +=B0@=88H=81=0Ch=C1=10=0CA=F5,G=16=D8=94=87=D0=80=0FlG=0FL=01=0D=D9P=13=19= +=01=94P=81=80=10=C1=0C=1C=C1=EB=84=DD_=CC=0A=B4=A0Pi=18=C1=11=98=86=A5=99= +=C1=15=14\=136a=DD=F9=80=14 =81=12=1E=DC=A8=DCb=14R!=83=99=8A=86=A8=A1=A6QI= +=17=92=98e<=86=15=08=C6Q=F0=C0=B2=14 6*=C7=87=90=0F=0F0=C1=F4=E4=91pq=0C=BC= +=A8=80BL=D9U=10=979=ED=E19=E2SI=C4=93=1F=9D=84Y=B9=07O=F4=95=0E=E4=85=C44= +=0Ex5NW=D8@=1Db=8AW=CC=CA=12=A4M=0DT=C9=17=99=97=1C=85]@=DA=05E-=01=114=C1= +=11=08A=10=F0F=0DX=CF=87,=CB=7F=1D=D7=BC=A1Y=0F=14A=13=FC@=01=140=D1=87=0D= +=C1=134Z/:=E1=DD=B1=DD=10=FC@=15L!=15=14=D81=BEd=10=18=C1=10=94=C1=15p=C1k= +=11=07=11pHka=DA=12=DC=00=120=CD=00^#=E5a#=1C-=8Br=F0@f=D9@=13tS8.D=0D=A8= +=8BVh=01Q=D8!=CC=AD=D7=0A=C8=0B=0C=04=0E"=86=E0=0A=90=07=01=95=80=0B=A8=80= +=0C =DBm=1D=D5=0B=FC!H=CC=87X=9CO?=92=9ET=B0Z=0CT=0A$=95=85=90=B8=C0=E7=BD[= +A=9C=D6=FB=85=C1=18=9CT=95l=8D5=16=A5Q*=C7C=F5=C5=0A=F1@=1E=D4=88=14=94=01= +=13=08=C12=96FI=A2=9F=C1=F9=80=128=A4=11 Zh4=01=10,=01=A2=09c=85!Zg=0D=8119= +A=18=0A=01=11l=01=12=10=81m=0D=9E=1A.=C1=0C=FD=A4=0D@=CC`=16=E0=1Ff=E3`=0AH= +=16=C8=80?e[V=D0=1AW,=04=13dE=CD=C8=C0=99=FC=A0cT=E9=1A#=F9=80=3Db=84W=B2= +=C7=E1DE=01=11=90<=8E=E0=09=E4=C0Q=A1=05=0C=84=9DP=DD@=13=11=08$^=E0[J=DBTL= +"=E7=C8Z]=B9@=E8=D0=80,%=09=0E=A0=C1=11@A=11,=10A=F2=00=0E=DC=E6`^dD=D9@=85= +=15=01h%=01=14t=09=00v=8B=EF=80F=A09=C1=C1A=01=11x=C1=DE=B5=9F=A2%=C1=94=80= +=C6=188=E8gN=09D=AE=941=19=C1=83V=89=16=96=D8=02%=C6=E5=AD=DA`=09=A5=914=13= +Q=0A=E6`=1AA=0Dd=01=B6}=05r*=88=8B=AA@^=80=CE=A5=A0=E3V=AC@"}=E7=0A4=8EX=E8= +=80=10=98=80=D4=1D=0E=0D=EC=09=09=B4=00=0A=AC=C0=0C=B4=87z=14=0CO=9C@=D9=9C= +=05b0M=A3=B4a=91=B4=E5=E5T=0A=E7t=05=05=9E=A0T=D8=C0=AF=E4=85=0C=D8UQ=F8=CE= +=138=C1=89=89=91=870=D3}=16=A6=07=DD=80=13=FC8=01=18=18A=13=94=CA=A9=00h/fR= +N=1EA=15=D8=DC=0Fd=01=13@=01=17=00=1E=A8!=81=16h=01=E0MI=130=C1=14=B4=9F=A2= +=BA=9F=10,=C1=14hA=12=98=A6=1B=EA=80=15h=A1=A6M=01=1B=CC=E9c=91=1A=9A=DEf}= +=12=A5Q=D2=05=A4|=08=0DP=8A=A5P=A0=0B8=CA=99$=CCU=B0@=A4L$=DE<=E5=8E=85=1E= +=E9%=C1=E6=1D=92=1C=3D%X=FDQ=10$iN=C4=80=0F=F4=8B=11=A4=84V=16=D0N=98=C0=0B= +=0C=81=0D=D0Wc=00=0FR=C8=D7$QE=15P)W=F0=C0=03=01T=E6=D0@=84=FC=04=11=94H=14= +(c=E3)g=AB=D8=E76V_=0C=EAg=11=18=81I=F6=80j=02(=AA=F8=A2=98=06#=15=FC=80=14= +X=81=11T=81=13=10=81=16D=C1=11 =C1=98=0E=01=11P=81i=1EA=12=B4=C8=A2=16=13= +=12$=01=194AO=F5=94=86Z=AAk-=81=12=ED=80=12=FC\fP^=81E=0A=88=0E=F4=D4=19=DE= +g=11=1C=C5`y=D3Z=D6=95=1BJ=A2=AB:=CCQD=01R4=95=1E&=88T=F4=CD=C7@=C1W=B8=C0= +=15,=17x=EDI=0A=B8=C0=11=A0@t=FA=0B=05=8AE=E0=18L;=EE=04O=F8=C4G=A0=C5=BD= +=D0=80&.=8B=0DX=8A=97Q=E9=CA=B9,X(A=1D=D1G=B5=91=09=0EX=C1p=00=01=DA9=E6=E7= +u=AAE=0EVC=A9l_<=CB=130=81=F9u=8B=BB=BE=AB=80=0E=A8=14=84=01=E0%=C1=13=18= +=81=11 A=BA=D2=AD=11=8C=81=11$A0&=C1=16=FC]fMI=A1=BA=1F=10=0CA=14=18=C1=13= +=F0=C0e=3D,=C4=E2=D4k=3D=AE&=B1=CA=1C=0A=C8=D8=10=81=0DxH=01=DEf=1B=EE=C5T= +=F5=C5=E7=B0=00=DE=94J=F7=94=0B=0Bpn=0Dt=81A=BC=C0=1B=80=8EV=B4=AC=CB=B2@= +=0D8=DF=96I=0EU=E0@=BF=B4=C7>=A1=8B=BF=F4=CB=D3=FC=E8=00x=BC=C7=0B=A0=00=D1= +=1E=EB=08=A2=00=12d=DD=93=10=04=DE=1C=C8zY=85:R=C5#>=08=0CX=C8=C5\=8C=AA=F0= +E=D8]=EE=A8j=AE=CB=C4 =0E=10=96=CC=F0"=B8=BAk=13.=E1=C3!=01=134A=C1=FE=1B= +=FB=FE=1B=DE=D2=ED=11=F4=AB=18P=01C=06=81=FD=06=81J)*=0D=C5=DD=E3j=A1=16@= +=ECk=B9k:=E5=C5=F7=82H=EC=1E=01=DA=10`=D8=CE=00*-=01=0E=F0@=12`L=19=D9=C7= +=00B=CA=10=AC=8D=80=14=81=15=10=81=0C=F4=00=E7U=E5=E5\=0E=0B=BC=00=A4=9C=17= +=EC2=CCO=00=C1=09=A4=00J=A8=87=0A=D8=91Y=10=01O=B0=CD;-E|=04o=C5=B4c=BF=BC= +=07|=E4=91?A=CD=17=82c\=8D=1E#Q=10}=A8=CA_\=95=AB=8C+=F7=82=EC`%=D6=DA=0D= +=06=83=CD=CE=9C=D2=A9=F9=15=DC-=DAJ=14=CC-=FF=11=01=11=B0=EF=FB=F6k=FC=8Eq= +=FC=FC6=81k=0AA=11\=81=14@d=FBqA=12=E4=E4=E5=3D=EE=E3=AE=A6=16=060i$=D6c=CC= +i=1EP=C9=B7=E6=80QR=1Ea=0A=01=1E=9D=CA\=98=CA=ED=E0=80=D6=A9=A2=0C|=8B=11= +=D0=88=A9=C9=C0Or=04q=B6=1C=AE=D5h=8E=F5=D3=13=00A=F0=99M=0C<=08G=8C=07>=A1= +=80=0C=EC=C5=0B=A4=00=D1=11=08=C9=E8=DA=FED=D7=0E=C4=C0=09=C0=07x=84Gx=9C@>= +=BD=D6lPM=0D=F0=C1=0Cl=81or=0C=0FD=A2=91=D1G=9D=18=05=CCh/=137q=09=D5=00c= +=A6=18R.=06=F0=04,=99=92=EF=15N=D8=14|=F1=16=E4=92=13=EC=9B=17=7F=F1=BFM=D6= +=11=D8=E2=12$=01=12=1CA=17=8Cs=BFV=81=12P=C1=15D=EA=FD=DAo=CF=00=AC=17=BC= +=C1\=BCV|=BEV=1D=EB@=0F=EC=C0=14\=E8=0F=E8=C8=14=ED3=AAlo=91=9CZ=B8=E0@=F4= +=B1A=A5=EA=80=16=F4=80=10=FClA[=C8=A6m=90=89=12=10=E1j=C8=00s`=A9=04V2V4=C7= +=0A=18=1F=E7\=89f~A=BD=09=01$=E5=00=81=98W;=9A=80=15x=8B=11,EC=10=84X=B0=CD= +=E4=D4=15=0BP=81=BD=BC=C0+=C7=80,=D3r=0A =85=0A=B0=1A=1Aq=15=10=14q=0A=D2= +=15=E8=12E=13=B9=0C=16=B0=0A=B9=96k5=0AF=AAtI=DD=F5$wV=B3=16l=07=80j"=15=D4= +=E2=100A=18=A8A=104=81=13l07=A7=AB=96=A4=01=14 =C1=14L=01=18=90=CA=14=90=0A= +\'=C6=14(A=85=B6=F3=02=19S=10=F0@=A6=FE=C6=89=D51=F9uA=E21=01=1E =01=17=B2= +=C5=E5EA=A7=022=10(=87=86|X'N=81=13 Af=D5'=98=C8=00=BD=04=81=EFP=1B=1D=F6= +=A3=8Fy=D9$=9A=9A=81=B8j_8A=DA=80=AC=C9,A=BE=A8=CC,=FF=C4#=ED=00=0C4=C1=9B= +=185}=18=C1=0B=FB=D0=C0=D0=9D=00=13=D0=B2ngD=05M=819=B9=EAo=C2=CF=D2=3D-=E7= +|S=F6=C8@=0D=C4=E7=A9P=9F@=DB=E7`i=D2=A9=A0]!=9B&=86=92A=F0=DC=E4=DAZ1=0De= +=D8=12=08=07=C0zq=11`A=12T=C1=11X=01=14PA=16<=C1=184=81=14D=C1=19,A=C2=8A= +=F38=BF=C5=02=19=C7=FD.=10=9C=DE=A2=10=C0=ED=A42=EE=E3=16=01=10\A=14D=81=C0= +=BE=96=12=D4=A3=EBL=01@=C8=10(#FA=83=05w=10=14=C8CI=0E=1D@=844=09=E3D=88=90= +=1CMf=10=8C=01=E3=85=8E*3j=D8=E8!c=85=0A=93'M=AEH=B1=92eK=96'Y=ACX1=83=C6= +=19=198p=D4pq=A3=C8@=194=80=02=E5=91=03=87=8B=19(=90=98H=F1=82E=0B=187p=A0= +=94=C9=82*U=1C-=B0f=CD=F1b=05=0C=18'R=9C=10=8B=02E=0A=1C)T=B0=F4a=D2e=FBK= +=94o=E1=C2=959w=05=D5=17.h=F0=E8=D1=03=09=D0=19=7F=01=FB=14,=E3/=93);=9C8= +=D1=F1d=C8=0E=1DC=AE=F0=81r$=08=0F=1D=0Eud=D6=B1=833g=1E=9F}=14ILeHi"=A7=8D= +0=F1=A3=C4J=13=D7=89=9D<=81=E2=C4=8A=923J=92 I=B2d=CB=10/C=AC=08=09=12D=C8= +=14%Q=BE$=112=87=B3=E6=1C=CF=A1=E7P2=86=0A=12=D1=3D=1C=F3=B8Q#=E3=E0=83=075= +=C6=A82d=09=8E=1CQ=80=141B=04=8C=E3 =03i=E8=E8=D1=E2n=0B=165d=FC=88=CB=B6m[= +=15%g=EAa=86=1F=82=88!=87)=8A(h =1Bh*c=BB=EDj=D8=08=AF=B1R=A8K&=1AJJ=A9=AE#= +=B2r!=08=17Z=E8=C1=85=11a=18=8E,=1AP=18=8B=AC=B2=DC=EA=CF=A5=FD`<=89=AE=B9= +=A8=CAJ=86=1Ap=F4k=06=1D=FE=1Al=A0=BFj=08=03=08=1El=FB8=02=87=1Fx=D8=01=88*= +=84p=C2=8C(=84=E8A=B3);=F3=8C=07=1F=96=98=E2=B4=D2=868=ED=88"=9Eh=C2=09*=98= +h=02=8B=C4=B2x=02=0D(=D8=CC=E2=0B=DC=92HB=091=95 M=B8=E1=82`=E2=88'=A8=10= +=02=0A=1F=A6=8C=EE9=9Ct=98=C2=87=1E=AEh=0E=8A=1C=82=E8=CE=A7=EF -=08=88%=82= +=C8=E1=06=F9|=F8=C3=07=CEn=D8=81=0A=81h=AA!=A6=19W=A0a?=17_4i=060th=A1T=1E^= +=C0LA=C2p=B8!I=1F~8b=87=1B`=D8=08=87=15G=CDP=C3=BAZ=08=E9=85=1B=82=E0=C8=86= +=BBFt=81=A4=18dXQZ=16_@=D5=BF=18=E3=92i=0BR=ABj=C1=A8=1A=82=0A)0=1F=09+=02= +=07=A0=B83=02=A8&xxb=09=1F=D6+-=3D*=A6=DC=8C=B3!>=DB=EB=CB"=B8$=E2=08&=ACp= +=E2=88+=98(316=B6=F8=A2=0C1=C4=88=FB=02=8A(=A8Pb=09=DC=B2=80=A2=0D%=88=A8= +=08=CF ~=F8=C1=87C=B1+=C2=B1=CB=A0=BBl=87ZE=1A=A2=87#z=A0=E1=87=1C=8E=A0=C1= +=D1=81"5=C8+=19`=90=01=8A=1Bn=00b=07(=88=C0=C1=0B=99A=FD=8B=08 =82=C5=D6Z= +=B7=FE=BBA=08=19=EB=CAO=A3=FCj=B0l=07#&=0B=CD=E9=8Dd=E0a%=AC=84=FD=8F*=1BZ= +=10.>=A0=80Pb=06$nx=C1m=18x=D0B=86=14=C8=A2{=C5=A5=FB=C3=F6=AD=19]=A5=B1=A9= +bk=88=C2=06=1C{=F0!=08=1An =DA=C7!d=06=0C=B0=C4=D1-=BC=87!=89x=97=CA=CEx=B8= +=A2=08$pM=A2=09.=BB,B=8A.=C0X=A2=E0&=C8=18=A3=0A+=AEh=1D=0B;=A2=808=8D=88= +=E3L=A2=08"=86=A8H=F7)=8E@2=C9=91=EB=CD=8C=87"=84=00"=87=C1=C1=BD=C1=07=C7= +=C7=A5=B9=E6=8D=BC=8A^=86#l=18=1C=FB=F2=C6=09=DB!=0AQ=E7=D2=1B=EF=97f(i=A5= +=94h=CA(=86=1F=08=1B=C2!=DC=A1@=E2=0B$p=C8=CC+%=D2=B2=81=86$`Z=A1=05=C7.=FD= +=8B=06=1Cqd=83Nq=84#/hAZ=C6g7=16}=8Fi=FB!=D5=8ChP=15=17t=0B=069=A9=C1=C7x@= +=842=F0=A0y=03=11=90`=98=17=AA=1E|=C6=0A=9D=B9=DC=0E=AE=E4=83'=CC=09=09J=08= +B=C6@G=04=CF1a=09M=88=82=13=AA@=85*=A4=E1=0B`=E0=C2=18=B2 =06)D=C1=0A=13=93= +X=13=1E=96;=DD=09=A1K=FE=FA]=F04=B3=03!=18=C1c=DB=D1Q=07=05=13=A9=F0=F8=A0= +=80/=08B=13vP=BD+=DE=C0@H=10B=11Z=90=83=B0=C1=88=81h=C9=01=02=C7=F7=1F=17= +=E0=00g=D0=9AA=A5t=10=04%p!=0DK=B0=C8H=A0=A5=03=93xe=06)I=09=0Bh=90=03=C2= +=CC`Wd=18=02=10p=FC`=83=E7=08=81=80M=B8A]=B8=D2F=17=C1h&=11=8CIL=800=97=FDU= +=A5[.=B0A=18=91=E5=98=1D=8C=84\=E4b=1E=0D=CCS%=CB\=AE=07Lb=82=10=94=90=05)L= +a=89C(=02=13=8Ap=84*,=C1tV=D8=C2=14=A8=E0=85.=B0=E1=0Cc=08=83=16=DA0=05)=A0= +!=0DRP=C2=11=F9=D5=04#=E8=8EKQxb=14=A7=E4=03=86=1C=AA=09=E0b^+=9D=07-=19=F4= +D=06#=E1"=B3\=F0=83=9D=F8=C0=068=D8=C1=05q=00=85=1D=00fTJ=D3$=0B^=B4=82=1E= +=D4=E0=05=1B=89=01=18~=D0=83=1C(=A9=09|=F2=A5=0E=B6#=03#=0C!=06(BK=1C=A7=82= +=1FFzs=95M=00=14=CAp=E6=95=18=CC=E03=82=D4d=DEb=14=B5=1C=B8=CC=93,0J=0C=B0B= +=B6=0E=89=87P9=90=C2=0E|=80N=1F=91=B4J^@=92=09=A9=94=84$=F1=E0=07D=80=D7=14= +=FB=C2T=91=D2=14a=09Z=88=82=9CL=E7=04/=E8p=0BhhC=00=0A1=86-xA=9AQ=D8=82=11= +=A1p=87%d=01wJ=1D=C2=97=86=F4=03=CCM=A1^=98=E3=0B=CF=1A=D7#=9D=0AF1GP=1F=12= +tP=14=10=81=E8=05=D3=D3=01=0F=82P#!=10=94=06=3D=E0=CA=1A=DFrR=97=F4`=05J=A0= +=C1=15r`=D0=18=DC=A0=07=B6=02=02=AE=82=80=9D{=0AD=0A.x=C2Q=02=1A=03)=18!=06= +=DC=D9L=97=9E=10=04 \=E6HP0(H|=B0=02=17=BC=E8=A4=D8=9A=CA=0Bh=B2=03=F8=0D= +=14~/=10g=B3F=F4=02=B8=C9`=0A?)Bw=D4=A9=D3W=D6 =A1=0C=B9R=F0Ti%.=E9=CE=08J= +=18B=99"=A6=04)=88=01=0D]=98=82=1D=B4=F0=861=D0=81=0Dj=F0B=16=90i=05=1A.au= +=C1=E4=97=EE=9C0=85=B1=1E=81=89B =02_=80'=BC*=0D!=92=E7=9C=FB=ABO=F6r=99 = +=DC=C0=06:X=16V=9A"A=FB=C8=04iU=01=CA=11=10{=12=C5=B6=A5=A03iB=0C=84+=04-X= +=0A=07S=C0=D7=0D=920=03=1B=08Df%AB=0Ah=F0=12=93=E8@!=0A=15=C2=12=D2P=9B =08= +=D8|9=BBJ=86\=F2=C66=EA=ED?=FA#=9EB'=DB=B8=FFUo=07^t=9Bp}PZhi=D1=95=CBU=DE= +=0F=B6y=04(f=863@8=C2=96t=E7=C7!D=01=09M0=E2=12=AC=10=85=EDfa=0C`=00=C3=17= +=D2=80=05=1D=E2=D0=CB=05K=02=EE=A6+=1C% =A16O=F0=01=1F~=97=DF=CE=8CP/=F6=0B= +!=08Y=E9=13=C7=95=81=08<8=82=0Fp=B4=11=FBPe=82T=C1=D0=03=BB=A7=82#=9C=EA=A4= +e)=8B=0Al0>=C3=0A=B7=060=D8=15=F2B=12=D7K=ED=C0U=8C=15=DFEU=A0=04=AFd=06=07= +=EEC=02=14=BAt=99!d=E4=07=FBv,1=7F=FES=C8=1D=DB6=A3Q=D8=E7"=83=B2=9D=EA=1D!= +=A4=D1=EB=D5=F3@=18B=1F$.=809=80H=11f=09E+=E5=8A=97=BD$B=11jW=A7=D9=C5=CE= +=0EXh=DD=15=ACP=851=90=A1=09=05[=02=18=BA =85=DB=81=AE=09I=F0=98u=AE=90=E7= +=FCb=A9=D0@=90=1C=B8=80r=83=10=D2d=08=AED=1C=0D=82p=A8=00n=AF=06=08=0E=96= +=FEf=C4c=09W=FAnu=93=81=16x=D0=C5=1B a=06J=00=02Pt=00p!=B4=C0=06TYA=A7=F8= +=C3=12=1E=D4Q=08<=F1=C1=11=A0`=84=EC0wj=E8=EB=A7IJ=8E=E3=EF=F1=BA.@ =C2=B8h= +=E2=05=1C=10A=9F@=E0=19=14p=16=D2=E7%=F7G48B=0E~PX=96=A9L=80=F6tHt=A8,=B2= +=BD|=ACc=1B=AB=08=11=94=D0=06(d=01=AAurX=14=18V=86/l=81=0D=89)7=13=AEp=04= +=DA=E8=FC=09=CE=BE=0C=E6^>=D3=98=E6L=89=0AE=00=82i=8C=80=A5'=F0=A0=09@1=02H= +=80=82=83=E3=B6=120=83=0B=D7=0C@T=15Rm+=C2=FE=FC^=B5=148-=82=AC@=06=C0}=C1= +=B2J=D4=B6=C1-X&*`=C1=C2=15=88=83^=3De=07=BD=DB=94vp=80=DC=18df+<=C0P=0Bt= +=00=86B=86=DCZ=FBy=F4=8C=EE=A38*=EC=8A3=99:=14D=19=B5=04 =0C=DD =83=B9c=0E= +=A0`=AF+=14=8E=AD8=11=14f2=E3=03(=08=81=0AO=F8=97=D5=87=101'4=01Nr=FAB=C5= +=D8=84=86'd!1X(7=15=B6=FF=84`n=C94D=90=AF8=E5=9D_=CD=F4@=08Q0=03E=AA=E03=A2= +=E2=80z<=00B=18=B8cf=92=8DGh=E2=7FpD=06=B2=C2=E3HE=E1=E0=02o=E0h%=A4e,P=04= +=05=86=03=06=9Ae><=04D=B0=E2=08^=AE=D0=C2=86n=FC=C4=82=06\=A0Wp=E4A=CA@fFL = +=0A=A2=08=A6 =B28f=06=04=04@=1E=10U`=04}D=C5[=0CHJh` fl=07=C0=80=08=8C=C0= +=EE=A2=80(=96`=08=AA=A0=F8jf=A7j=C0V6=A3=07=9C`s=A8`=0C=1A=E2=F9=A2h=07=E6@= +=08=92=E0=0B=A2@=09xi8=84=C0=0A|c=08=BE*7=E4=E46=02=06=0A=9E=006\=A3=09j=C3= +=0F=98`=3D=D8/=FB=12=A3=08=E0/=FE=EA=C5!=00=0B=E5=F8=E0=0A=86=E0=B4=9E@=07= +=12c=07=A6=80=09=E4=AA=C9=1C=07(=90=00=EED=90)=0E=AE=F3=180=B16I=05|=E0%=CC= +=C2n=C4=02,N=C0+V V=B2"+p=80=94^NXV =A7=AA=C5=04=90=00=05=10=CF<\/(vp =8A= +=E0=06\=A0=06pB=06=CE=A0=C4=EA=02=F4=AC=A5=F1(=AF=07=06g=06=AA@=07=84KAf=A0= +=09r=A0"=9C =0C=FC=9A=A0x.C=09FN!v =09=07b=0A=FC'>=94 3=A8/v=AE =3D=9C=A3d2= +=A3=07=94 =0C=84 W=B4Ic=86=83=08=88=83=89=82=09=09t#7=96=E0=0C=C4=AC=09=C6`= +=FC=A8=00=0A=AC@=98=92=00=0Bn=87=FDh=08=0Bz=C7w=AAD=96X/=08=C8=00=08=D6C=08= +=92D>T=8E=07=98+=AE=D0)=84h=00=85=CE=08?j =E3=16=8D.=1E1.=02J=05f=E0=F3V=C2= +P=00jE.Q,=98@,T=80=06^=C0=08=16M=F1=16=F0?<=8F=E3\=E0=04L=C0=04p=C0=07=BC= +=C5=05=96@$=CA'=A7=9C=C0/=A8=A2=07**&\=05=12k=CF=81=EA=E2=8Ed=E0P=82=00=07= +=84`jn=02=08=82=00=09=E2k=08=C8=CA!~M=06=80@=05!=05=84=A2=00=DA|=E09v`=CE= +=F0=80=09=90 =08=BA@=08=00=05=EA6C=0A=0C=92=0D=00K=89=EE=C4=EA=FC=B8=10=0A= +=E6L=1D=D5q=0A=D4=11=0C=A6=C0.=A1=20=0D=BE$=08=8B =1F=03=A6=09=82@=0D=C2=80= +=09=86=80=8Ax=80=0Az@=EEVi=07=B4=C0=FD,=E5=06=96`/4k=84p=C4=F5=FCk=A7=FE=02= +=0BB=E8xxF%=13=EE=11=1B=EF-=86=CF$b=82G42=C5=C4"&M =06L=E0=04=DCf#=A8=C0=A5= +=12=AC.>=91=05=08=A2BL=8D*=AC=C0=04J=A0=04L=00=06n0=07=8AE=08=06'=07=BE=00= +=08=9A=00'F%=912=E4=F3P=C2=01=F7&|=A6=82=9D*=E2=0A=94 '=8Ao=06=F8=CF=07=B6 = +J=B4=E02=AC=80=0Dr=C0=09=E2=07+=BFC=D0x=AA8=8A=80=B5=A0,w=0ECJH=E69=AC=B1= +=3D7C=07=DE=C0=0B=E0=CC=1C=AD.=09=AE b=AA=00=09=8E=E0=08=90=A0=0B=08t7=8E= +=C0=08=D4=CE:=FE=F24NC4zg=0Bn=C78=AE=CD=08=E2oL=FC=CC=F1=07=08=0CY=F4B=08= +=98=A0=0C=F0=ED=8A=04=F0G=98=C7~=1Ag=C0=12O=01WR=E1x@=E1X`=0Bf=80=0F=F0C=07= +z%3=C8b5Y=D3=04^=F25c@=B7=BC=A5=90=9C=C2>p0=076r=13[=E0=04P=80=04~=13=06f %= +G=AAXZ=00=08=9E=00=06=1A1&0R:=F7=06g@=02=09=08"=91=E0=85H=04=82=0A8"=92=FCq= +3=14R=09=84=A0=10=99L r=80=07=A2=E0!=F2=C03=AAG/=FCod=9E/=DA4=03=DA=90@=86= +=B8=00=08=FC=948=A4@s=BE=B0=86=06=B4P=07T@=8D Q=FD2=1FS=CE=08=9E =0A=A8=8Ee= +=E0=EE3=FEQ/=A8=EE=07=00=E8=07=06G/=E2=AA|=0AQ=3D=FD=07HV1rR=12=D2F=F3-fOo= +=EAB=16=93 <=0AB=B8=EE=03&}=F37O=E07M=A0=05~=E5=05Rd=F5=08=8A=05p@G=FCu=C0(= +=86=E0=06N=80=04L=80=04H ,=80=C0[jDT=A8=82Ig=80)=C2=06=B1=18([F=82=08=AC`= +=F0=AEb=D6=BA=83=06l =06\`=B0BB=A8p`b=F4MM=99=EC=C1r =D4h"'=80b=09=AA=84=F5= +=04e=C3=B8=D1L{=A0c=FC=F4O)=03O*=87=0A=C4@@=13TQ=17=F5/=FFr=08f=08=09~ =0A(= +=B3=0E=E3=0F=85=F2=85=17s$Dq=0033=13T=ED=C7=F5=08=C7~=EC=E7]`=A0Te=E2=B0=1C= +1=A5j@4=11=E9=06=C2=A3=80`=E0=14Q &=7F=B3e=7F=13=05^`V=81=D5@J=A0VK=C27=954= +=06=90ugk=16=07h=E4=D1=ECb]=AD=94=8D=AA=15%0=EC +*=06=BA=00\j`=07X =06D=AFM=FB=E2=06X=E0=05V=B1e=9A=F6=83=B2=88=C9D=8C=08=88= +&#f=80[A=E2=07=82=E7=F9=D0R=0A=FC=DA=C5=08=A2=E0=91T=CB)-=EEO=95=A0=0B=B6 7= +=A4 =09=8C`=0C=04vs=12=F5=09=92@=8F=C2@=0A<fR?#=FE=06=97=CF=98=801L=94=06= +=A2=80=15=CD=09=8B=8A=8E3=A2=C4=08=86=048p"$=82`=D10W=09=1E=88(_=80=D7=A0= +=86=05R=B0=9D=18=C7m=82+=05=F0bV]=F65K@IM=C0=E3f`uK=C0=0CJ=82=04F=80=04z`= +=04p=97=04=10=D0=05b=E0=0A\`F=A0@=7Fpsh=AF=B4he=84&=16=17=F1=A8b#=FBF>&=C8Y= +]*=AEdf=F0=1E%=09=ED=8BG=08c =AE=00>=A0L=09=A2k=09=E6=93=0A=ED=CB=BEP'7=8A'= +_=F3=D5`=AF=8C=FAp'6=044=0A=1E=13=87=8C=C0=0A=00=B7:=A4=C0=CE=04=97R1=E7=BE= +(=93=07=82=10=08l`T=F7=CDq=8B=C6=7F|@=08=EC=E53 =B5=06=88=00=07A=04=96=FC= +=1A=D1T=F5=87=07N5%=AA`*=EEcHh=82c=08,=B8l`=08b=D6ey=F6X=91=D5=08j6=C9vv=05= +h=17wk=97=85I=E0ij=E0=15#=18=83=93=A0=F1j=EB$=92=E7FF=EA=F3V=C0=062D=7F=E4i= +&=A6=82=06=9E=00{=00#!=D2I=8B=E8=88=F0h=80=185=8B=07=D8=80=AD=CC=D6=0A=BA1c= +=92@=0B=E4K8=D0=17}=07=B1=09=E0V=0B=B4=00=09$T=8F=B8=00=0A=98 =0B<=06=0A=AA= +=80@=89=A0=B9=06W=DE>=A3=CB=8C=00=0C=12=C3=8AXq=80?U=D0@=A5=B0=A8,6=902=80= +=9D=05\Z=AD=E30X&=A8=D3B=EA=02(*XF=D4I@4=D4=7Fj@=09=E4=C9[Z=E0=08`=B2ew=16Y= +Ixg=C3=07=05Z=80v=91=95=85Ey=04=E6=C8=04=10=B8*~`Zi=84+=1A=F0=86=FF=03=C3= +=C0=C5=90X=F2$=FA=86F=BC%=0B=FCj=C0=08Z=89=F8v0+I=CCqb=98=07=E4=B2"=88=02'= +=CC=03=EA~=C0O'=8A=1C=CF=17_=81 =09=C6=00=08=92=F9=99[=08}=8F@?=FF=E4c|=C0= +=09=B4Y=9A=0F=E5=8D=AB=04=0A=92`=08=94=A0=08=92=19y=82=02=8F=F3x0&=F6=06=1C= +=A2"=8A`2=D0=00=076=02=E9=12=09\=1B=8D=03=A7=02=E1=96=B7H=17yX=9Ab=06,=E5(= +=F3=C2=025=D0[r=00Ig5=93=19zuek=85G=B9=04r7w=91=15=05=AE=02\=D6=82=C7=0Eh= +=C2R=E2Fn=00%=98@=96MS*0X=B8d =0BF=D4U!=85=8C=D6=14T"=A9=06=10=B6=88=16=CA= +=98=9D=AFM=89@=8C3FI=9C w=C8=E3=0A:=C6=99=11=B6c=84=AF=09=90@=9A;FA=B9=EFc(= +s=A9=F9=EC=8D=7Fj3<=B4=0C=86(=07=F2=80=07J.=9D=F1x=97=BBf=A2=DEy=09=9C=A9o= +=FC=0F=C4=8E=0A=F0!=F1=02=8D=9ABT=80b=F5=FCY4e=02zw=B0=A0=DA=A6Cj@=8D=14I= +=05\`u=19=9A=A2I@=85qW=04=FC=FA=AFG=B9vY=D7+b=EB=119=1A=D3n@=0B=DE=C2=05=E0= +bdIz'=9A=C0=06=9C=92=83|d=E8T=BA=F8|B=C8`Z2i=DA=98KfO=FF*3=B8=E0=0A=CA=E009= +=E6=A7Q=1B=B5=8B=80=0A<=E6c=AA=E0=07=86=C0=09=02=97=A9=DFxp=B1=801=88=E09= +=80=80M=9A=A0=08=16=B3=B20ZD=F7=8DD]=F5F=EC=898=8E=A0=09*=E7J=06b=09=F2=E2= +=15=85s=06=DCY=07.H=06=96 $,R4}x*=D0=C7>~=A0[=C0=85F]`=A139=B0kW=A2G=E0=AF= +=D5{=94=91=D5V=91=14-B6F8z=05b=E0=F3=A0S=C5RjUg=C0=09=98=80H=FEL=F5=88=0F<= +=16Bfp=C4=0A=AA=87g=FB=A0=02=07=00=02=87@=819r=E8=00=A2=A3`=C1=1D:v=F0=E0= +=E1=E3=C7=0F =12+Z<=82=E4=87=8F=8D=1C=81 =91=E2=A3=87=C8=87$I=8A=BCb=06=88= +=C0"?=8E=18=F9=F10=88=C6!5l=D0=B8y=93=C7=8C=9D<g=1C=99Ad=86=0C*3b=C402#=07= +=0E&=12=A7=88=DC=E1=83=86=0C=193v=0C=C9RDh=8F!C=B4=C8=90B=C3=06=8B=15-V=ACP= +=816=AD=DA=B5i=CD=BA}=D1=82=85=DC=B9r=CB=A68a=A2D=09=12|=F9=8E=F8=0B=180=89= +=BF"=0A=1B=16=F1=97=C4=15=12\J=DC=90=F2"=C6=8D=1Efk=9Ce=BB6=85=E6=CD=9C;sVQ= +=A3=05Z=CF=9B1=A3]=C1b=C6=10=19=92k=DC=E4=A9=A3=C7=8C/9vH5=8A;=B7=EE=182=A4= +=AA=0E=C2=C3a=C4=1D=08q$=19H=B0=B6=12=85=CC}=F0(R=C4=C8=94 =14+r=8Ch=FD=FAF= +=91=FB=DCKr=E7=BE=11=C8=8D=1B=19=BB_=11re=07=12=1C"=9DG=ED=09=1F=A1s=1D=ACa= +=C0(rd<=91=1E!=8F=FC=A0!=14k7=E0=E0=1C=80;=C4`=C3=0C=A1=B1=C0=C4Xn=99=06=A1= +=0An=A1=E6 ]t=B5=00=03=0Ay=ED=D5=D7`=81}H=D8a=85=05fB=0Eq=DD`=03=10S=01=E8`= +=84=A3=91=06=A3f+=CC=A0B=8C=A5=AD=B5=82=0C/=0C=E1D=0B6=B4pC=0D<=D10=05=0F= +=B1=09Q=D4nJ=1A=B5=A2=824=04=B7=03=16L@=F1=12B9=0C=A1=14r=06e=99=DC=10G=0C= +=C1=84=14J$A=1D=10f=12=A1=9Dv=DF=AD=D9=03IB=F8=A0=C5=10=FC=F1=F7=03=0E9=D8`= +C=0FRP=B1=91=10=EC=F5p=03=0F6x!=C4k=F0=F5=F4d=0F=099=11=03=0C/=E4=00=83=14x= +6=91g=0D=AE=EDDC=0E/=1Ca=E9=0C4=84=B6C=0B388=E1e.=E2X=FC=EA=84,8=E1=02=0F-= +=B4=E0B=0B<=BC=A0W=09y=F9=05=E2=87"=8E8=02_%=94%=AA=0FJ=E8@C=10.=B4=C8=16= +=8Dj=D9H=1A=0D;0{#[=AA=B2=C0=03M=9F=FEP=04=0F=06=DD=B6dn2=F8=B0=93=0E<`=01= +=84=10=0D=09=D1D=13HP=A7=84G=05!g'=BC=06=F1 E=10Jt=B1=84=10e=1E=E1_=9A=1C= +=B1=09^=0FU=04=C7C=0FH=00=B1DH<8=F1=83=0D=96=1E=91=A7=11A=D6=84=83=A58=01x(= +=A6=0F=0D=B1C=13;=E0 =86=A3/=D8=97=83=A5&c|S=0D7=C0=8A=03=0CM=1C;WY=A5=9E= +=8AY=AA=D3=CA%=A9=A3.=9CP=E3=0A=1C=EE=95k`=BB=F6:=82c-=A4=A0=82=0E1=10=08= +=C5=0C7=90jV[;`=06mi,T=1D-=AAf=BD=E0=B4=C9dt!D=0EA=C4=89=9B}fwKUp=B5=111=84= +=12d,1D=10=FB>=E8=80%=BCv=E3pP=0FN=98=19Q=14Lp=11=84=10h=D2I=91=9A=EDm=E7= +=03=10Z@=B7=C3=0EF=10=81=1F=13>=04=B1=D4=C4=0E=1B=14=E4MM\lh=C67=BD=C9=1F= +=117X=F5=82=0B0=B8p=03=106M=F1=A9=A7=AE=0D=01E]-=BC=F0=02=D4=A9=D2=AC=B5=CD= +=14=C2=DACXA=C8=90=1A=0B5=C0=E0X_A=87hXbn=E50=C3Y(=8C|=FA=16p=F4 =B3=AAA\&Z= +ZX=D7=88=B5f=10=8E%=D7=11-=88]=93=0D7,=A1=83=82=F5=99}=B6=92=00=D2=D0DA?H= +=B1E=11L=08=E1=C6=11=09=BD{=B7@*=E1=BD=83=89=04=A1!D=F8=81C=1C=82=05+ A=09= +=16Q=C2=12=8EP0=1F =E1:O`B=11t=E0=03!,=C1=0AO@=08=8A,=E5=03=93Y=8A=07=9C=BB= +X=C6=86t=93$=DC=A0ax:]=AC\=D0=05=17=B8@N*=83=FB=01=18 =F6=AA=B8=CC=E5=06.= +=D0=9D=A9p'!=1F=9AE.R=C1=01=11xp=05=1D=04a=09<=A8A=0C=84=C7=03=E3=05=ED0=7F= +=B1=C1=09=E6R=02=16=BC=EA=04'8=16=0D=E4b3=1A=FC=E0X;XA=0CrT=96=17=D9=88=06= +=DD=F3^=CDT5;=D4=DD=A0=08=06=99=82}=A0=C0=BE<*=89*=9F=1AH=BDz=F0&=1D4d=7F= +=FD=83=97=12=A1=10=04"(eK=06=09B=11=B0p=04&LA"@P=C2=11=17v=04D=B4=04;O=F0S= +=BD=92p=06=A6=14=01=07=0E;=19N,=C6=B9=13"*e&=8BH=CBb=05=AB=D9=D5=00=072|=01= +=10=B4=A5C=A8]Ow@=0C=A2=AAt=A7C=18=D4 =08X=98=95=16e=E0=A3=18=A4=C0=8C40=81= +=87t%=02=12=A8 =8A' =1A_\=10=83Z=B9=00=09=D5=9B=10=CC`=00=07=16`S=06=3D=88A= +=0D=A2B=83=15=B4=B1j=FBm=B9L=A9b=E6=82=D2=D9=00zy=AC'=0Cp#=83=1D$=A1=069=08= +=CE=C1r=90=86=E3=E0`=0A=82dNBt=E0'=81=8Cg@=03=C9=C1=14=80@=04=1C|=AC=A1Fh= +=1B=1D=96p=05=99H=01=08A`=88=14=88`=04'dD=82H=C8=01=A0d2=84"4=A1`@=F0A=13P= +=C99=D7tN=95%=FC=94=C5\=98=C3W=AD,=87Gp=08=CCRe=BB=A8=E1=CE=87Z=0C=EAXZ=15= +=83?=C0=B2=05=B5=EA=10=AE@4=B4=C4=FC=A5=07}=11B=09"#!0=A2=C6R=15=E3=81=0Cl= +=F0=83=DE]=A64=EB=B4=11=8Evi=16%=C4%=A7=B0=8A'=ED=E8iO=FB=E8=E6[=06a"B=832= +=83=0C=FE=A06=09=09N=DDp=B0=D0=F144=08=02E=CE=10x=A0=AF#Pa=08=1A=D4=C1=13t= +=B0=D7=B8-=A1=0AP=B8=C2=0F=0689=C1*a;=10=F1=01M`ZS=9A=D6=FC=F4=94x=9A=E7Rc= +=A6=C3WA=E1&Z=15=E2=0F#=E4=DA=15=8C=AC=B5=0FJ=01=0APp=02=14=04=89CO=3D=DE= +=AExE=B4=C4=90=A0=045xAor=A9E=B0=0A=C5SK=F8=C1X=CB=0A=AD=9A=01=81=06qA=9D= +=0Ck=E0=02=1B=C4=D3=AD=B4=8B+=FB=E6J=83=01=C9=C6'R=99=CA=0Cx=90=04"0=84=B1@= +=18=C3=16=00=1BX=86=E2`=08QP=A8`=F1=E6=1F=8D=10A=07=02=A1=DC=0Erp=D9$8a=09A= +=18=02|Qd=03%=DC@=08=1A=F1=C1=18=FC =04#=98=B2=84=A2-=A1Lk=10V'=E4=A0P=AF= +=B2=D0\j=C0=02=B881=A8=B7=A3YlQ=03=17=DA=0A=C9>y=A1=81^X =C5=E3!/=AA=1F"=81= +=09=84=A7=04=95=A5=96?4(=C2=0D=A6=12=83&=9E=05=BA=CCR=CBX=82=E8=02!=98=8F= +=06=3D=D8=81=90=E6=08=83=1C@=E1=05Q=F0=AE=1Eq=D3=03=B6=FB]p=0A=AC=012o=92= +=02=04=864=CE?<=B8A=0E=E2{_=1D=D47=BE8=A0=82=12}@=AE=8F=0DH=B0L=F9=81=156= +=12=04=04=97=16Os=13=C2=0A=9D#=93=09=9B=D0s6=3DY=0D8=85=13"=B4=94=06@=E0=02= +r/D=97=1C=F8=80=C4=0F2=F1/=CDR=3D=B9=08A=08=8Fn+=8By=1Bc=19=FF6y=81=B11vg= +=00=83=0E=CB=8E=096`=9EQ<=05=84=E7~=86=C8j=91=01jb=BD=82=1A@4A<=11a=8A=1A= +=05=84F=91L=D8=F5=D4M=0D=04=E9eo=8Dw=06N=E8=01=1C=8C=C0=044=A39^=F1U=02A=84= +=F0=05?!!=BEb=D3=08=7F=8E=A0=E0=3D=E3=C9=CFx=FA=C1xz=B0=04=FE=94R=A63]e=0D= +=C2=A0=04=1E4=E1=06>=90=82=C5~0=03;=C5=E0=05<=00=C2=A3=E72-=1CPz=A8=A5=8A= +=0Bj=BEH=97=17=F8 =97?=90]=0BN=A0=FB=17=A7=CAXh=A3FL=AF=FAb+=0DeQ=06?Hu[=C3= +=DB=A8=18=FC@=09=0E=BB=01=F78s=DB=94o=8F=058h=C19{=E3=9B=16=1C=01@=E6=15c= +=8A|`=03R=DE=A0=A2=EB=A3=81Q=E2=8AO=1D=D8=80*=BC=D1M=0E=A6=D2=1BLY=0AO=F7= +=95=F6=0Dt=E0=F4-=B4=D4Oh=0EB=14=800=04"=F0I=CF=BE.e)=83=84'=D0=E2D=95=9E= +=B2=81=14=08=E4=1F=AF=F7 =D5p=F97mS=D5=CDJ=9F=CA,=E9\:uq=E0=EF=98=E1 =DF0K= +=ED=14l=B0=82$@=1C=D4=13=9F1=8D=053=DC=E1v=F1=08m=AF%=ED=1A=85=03!4=CA=07'= +=B7m=CA/=8F=82=18=B9=80-=A1=B2=01=0F=96F=84y=D2'=9F=822=C9=0F=A8~=83 H=017J= +`=0D=B1=AF=8C=C1!=D8=A0[L=AAy=08=E7}f=BC=D9=97=CDh=CERI=C7=B3g3=C3=97=09-= +=C5=F9=BA=FBMv|=11=B2{=B4=9E=ABA=9B=1C=C2=03$d=E4=9C=B3=CA=A1=87=DF~b =0E= +=F1&O=90=C1=10b=C0=93W=99;=07E=D0=EE=AB~$=97=1D,=C7D=A0~=A6=A8G=1D4=8C=C7= +=0A=05F=08=0B=0F=A1w=CE H(=05c=D1=0C=E6=FF=7F[=DB#!=FCU=03R=90=03=F84=03B= +=D08Tp=04E=C0`=09e=10f=B2wecOF=01=058=F0sW=86O2P=7FE=B0=04F=D0=03=06=C4=12@= +=A0=14N=E7tQ i=C0=B7gF=C0tXG=05`=93|=CA=07BbWS6=B1=13=E6=A5=03H=D0=10f=80n>= +=B0=04(=02=04=A5c}=1Evb%fb,=D0=031CsG=80=03/=A0=03=AE=01=05:=00=03X=90]1=A0= +C4=80[=1B=E2T=BD=D5+&@q""c=18g+&`=02.=A0#.=F0=05MFr=95=07=03*=00=80o(=80*= +=C0=02=FCY=01d2=90H=03T-L=E0=04R=80.=FE=85=04~=02 =14X=811=A04@'=03=0CvN,= +=D1ohp0?=C0=04WW=82N=17|=0B=85=03=94=A3gL=87=897=00=05=0C=14=83=CA7Z5U=03NF= +=03_=80tU=A1DN=90RG=E0=039=80=044 C=B1t}E83Ce=19C=B4=02.@=05=E4=F7}:=10=14= +=00=12=04=E6=93=043=90C.=D0LM=B5=850=E0+6=E0~#=80=18^=18=7F=88=D7!za=02*=90= +!:b[0=90=80=96=87=028=A0=8Doxyq=C8=02@ =14L=12=03O=F0_F=10=05P@=05=F5=C2=04= +=05A=13B=D0=03=AE=97=81@'=04=DE=85O?=90=04=06=B1=15G0=05Z=C0Q=FF=85=1C=82%= +=1E=97XZ=81=05X=E2=86=906=10=04=0B91=9E=F8=891=D5=03*=13fK0=8E2 H:=90=04=1A= +T=05=FCd"H"=A3]=B0=04b=00'=8BBEpj1D5=F0=1C=CB=85BO=12=04F=D0v=FA=B7!z=F1=02= +=D1X=028=004=D04=024=F0L=CE8=02=B4=B2=85=BE"=8Ddhy=B9=B5=03=99=A7r=DE=08=87= +=D1u=1A,=F0$I=A2z=06v=04@=D0=80C=D0=04=07=15=1BH=E7zVvO2`=8F=BC=91>=1Af=15R= + =05Z@&?@=04L0Q=0D=B5P=09=89=90=AA=C3=96o)h=0F=C9JX=01=11:P=04=AE'=03=CBqYH= +pQ=E62{=A44K=99=02=03=162=92r7w=A8=B2O=01B=15=AEC=03=9F=15=04S=E6=02N=90=02= +dX=02V=A5=19A=A0=17B=A1=02'=B0=8C!R4\=E9=026=96=18=BFR=02=C8(M=B5=82=9Ad=C8= +E\=D4=8DH=89=94J=B9=944=E0=03gS=14C0 =0A=C3=10=FD=B6=06=E3=98=1BZ=09=03R=08= +t5`.=FCu"QB =95L0=04=E9=91=10Zr=109p=05=04=F9=96{=A6|a'=83q=F9=90=C8=A7=8AA= +P=1B=90=02=03=99=92=03=FEA=04T=A2(N@N=96=F2_=B1B=84=85=D9K&I=16>=12=06S=C1= +=03Apl=09s=06+d>CP:B=80=17&=F0=02)=F0=02=DC=88=02D0=16Q=D4=99=CC=18M%0=04"= +=C3[0=80=1A.`+=3D0=8D=B6=12=94dh=02=AB=B9=9A=AE=F9=9A1b=92O=03+=D8=98G/=F0R= +5Q=056=90=04=0E=01Y=F28=8F=DE=B5=03q%Q=1Du=03=F1#=10Q=D0=04!=D18=CB=19/=8D= +=A4=11=D0=19=9D=D4Y=9D=3D=BA|=17=A32K7=9D=A9=A3=12=ABa=1FZ=80=05=E3=01:=10= +=11=05=18SJA=D0v-=90=84"9=92=EB=C9=03*=E0=1C9=B7=814=A0=80=0E=F1=14w=B2o0p= +=17'=A0=032=E4=02=02=FA1=A1=C1T=FC%=00"2=C0+%`=16:=C0=02z=01 =A4=B43&=E0=8A= +=AA=19=03=AAI=A1=16z=A1=18=9A=94=9D=A1=02P=B0=8AE%=155=91:=07rO=FB=06+t=10^= +3 =1B=E6=05=A9>=D0=9B=BEYl=1B87g=06|7a=07=8Fe.FR=1B\=E0=03P=D0=03=0Ec=03>p`= +p=E9=A3>=0A=8A=A5=DA=90=CA=87"=03=92=A0a=1A=03Q`>=F2s=03=AFA=03L=A0=04=F9= +=E1=02M=C8=03=E9Y=A54=E3=3D,=90 8=10=1CL=928=0D=81XE 7gV=04QV=94(=00)F=B0V= +=09=A6=03>)E=89Wj(=00=11/`=02=C2(=A53=90=02=B1b=13<=A3=02=A6S=A1c=EA=A7\=04= +=A8=81=EA=19=12"=03:=08~;=00=05G i=AF=E6d=D5=A5=13=E6=85=95Jb=A9=DF=F5]=BC= +=11=91=0C%=04w=99tM=D0I9=80=10;=10=82&=13=AB=E6=A6=A3=FC<=BA=AA=3D=0A=A4a= +=D1=AB=9D=C8t!=91=AD=F1t%=08V>=EF=91oL=D0S1=D0=03w=E0q=B5S=17=007=17\=E0Z= +=D2=F2=03=DAc5fQ=872@=04=F8=CAXR=D0=04=84=C2=04=88=F5y=E4=8A=023=C2=04:T=8B= +=83=07j7=E6=17}aN; =03)=00<1=93=03, =A0=DA5t=B7=D5Dcz[=7F=FA=AE=FFgV9=D2e9= +=00=82^=C5$3=80=8Ed!N=8AI{=82=18=B0r=B5=B4U=A0h8P=04=DC=12d=85=C2=A5=04EZ= +=E2aD=A9=CAtwB=B1=15[Jfba&=D5=05x=02XK=B7B=F46=04eZK=F7=D40=EC=86=92=E9=83= +=04E=F0_=E7u=030=90 =E3=A3E=B1=82];p,#=99=03M=F0C=B3=864=A8=B3=95=EB!iA=80= +=04X=90/=068{1=00=04=DEs=8BP=A3E:=C0T=D24\:=B0=02$PM=FC$=D0=02B=B0=02:q=1A= +=EF=84Z=0A=B2o=0D=A1=8DG=10=80)'=03[=ABr=1A=AA=02=94sO3=90=044=F7=10=F1=98= +=03n=C1=02!t^x=B9G=09=F8z=01K=88=AB=08=04=17=C4=15W=10r1@=04=81=D8}+2LQ=B0.= +=EA=92gU=B7B=12=D1u=A5=D5ue&{=97=E2)=11=B9=03td`I=B0nz=02)=A5c=A6=A6C=1C6P= +=05=0A=B2tU=F0=026=C0=8FR=A1=03e=F0)>=F0U1=00.=19dp=85I-=97=A1=7F=95=874-= +=10B=F7T1=0AqzE@=04=EAe=1B=AC=C1=03?4Dr=11=04L=B9!C=D0EXH=02=B9[=93eq=3Dm= +=E1#sA9=AF=F2B=F1=84L=A3!=037=00=803=C0=BC=99G=1A=12=92=AE=C6=01y=80=F7=BB,= +=D0=10=95=E6 .g\=16=89=97=0A2=03=0B=F9=BDo=C5=C5z=C4=1A=FC=04X=14=CC=1A=FC-= +c6J=E3-M=14o=FC=B1=11r=C6f=92=C3=82=D3=B9=8Al=09`=3D=10=06=E2=88)A=10=06m= +=02=11=86=C0=B76=80=96=E2a>B=08+/ =04/=F0=03=FF=E9=8F=3DP=042=F4=0461K=E6= +=E4,6!LfH=A5E=08b=00=EC=16@=E0=024=E2=7FH=A3=C9\i=1F=9F"^=DB=E1=10=12C=15= +=9B=C7=9E+=90=AB=B0=F4=03=B8u,=B0=12=03W=A4=02%=C0=1BGv=1Ae=81=84=A1=E1=025= +p=05/=10=06=04,Cp=10=03=B1=13=196=10=05=98=B7=19[=9B=C4>=07=03=16=99=8BS!= +=A0=B7,=15=D2=C2=02K=03`=8AI=15=89$=04b{O"=C3=C5oU=812P=06=8F=85j=F6=D8=1B= +=82=D2=10M=009J=B0=90=FD=B6=03=94=A8=03P=90nG0=BD6e>=E4&nO=C0=12=3DE=13TQ= +=89=C2=F1/Jff0 :=89=BBTm5=C8=0A=89S=FC>=0C=A5/=C4=B9=8E=B2V=95,=8B-=00 ;=85= +=032=C0=3D)W#*=F0=04702T`f9g/Q=B0=04=B6!=14<=00=D1=EET=CD=09=F2)=9A=D2=B4= +=C0=D3=C2=96{=02>g*!Y=CD=D5r=06=C3tfP=1A=19=E0=EC=BA=94Z#=C8=CCF=AD=E9=8D0"= +=AFK#$=94=BB=164 ]4=F08=08=15 =E7EHV=10=8F=F6=F1=CD=DF\l=3D0=BE=92=F7=BD=E5= +,WC,HEPAO=10=95J=80z=82e=10=92=1B=B7=9F=E2=04NP=89LH=B8=05=F9t=05=81=04=A4= +=F8-=E2r=C2[=F0=04=D8=82"Fp=86=F1DK9=B5Tx=F7=84=1E=97C=D8=B5VC=E0v=B2xF=98&= +NA@=9EUa=86R=A0N=97=C7=1B6 20=C0=04=80i)U=E0=A4=C1h=CB=E9*<=BD=01=15F`=85)= +=C0=D4+0=06=80=85=81=B6=854:,=03V=D0=9D=FB=EFSh/=AA#=99}:M=EB=7F=01=B8=02CM= +=D4=F0Z=1Ad=11=CAQ35=C1-=A8=12"=15=FA$$=A5=E8y=09=D5=03=F3=B5=A2W=8D=D5=DF%= +1=07=A8=95=84=98gx#=CF=EA=88=05=8E=14Q=E3a`=04=A1DB=12=16H=C0=05=12=A1-=C2'= +=D7=FE=E3z.=81A=1A=A4@a6:0=D0=03=C0l=A6l=D5=02A=00+(=A2j=B2=133=B18=D1S=AAE= +=D3Es=ACa=05C=B0=02(=00=10(P=9C@!=04=86=0C=18/^=C0=A0"C=C6=0D=1B4h=F8=90=D1= +=C3=C5=8F=15=19Ul\=A1BJ=0C >=B8=0C=E1=B1Cc=0E=1E4=1A=CEP=91=C2e=0A=8E+j=E0= +=901=A3=C6M=1E6 =DA=F8A#=C6=90=84/l=D4`=B1=F1%=CC-=3D=8E=0Ad=DA=B4=E9Q=15Tf= +=E4=90=B1=83=88=8C#-aju=C9=B5=AB=0A%D=82=D0`=C1=A3F=0C$7f=FB=D0=D8=01=11=07= +=8E=84A=15=CE=A5=AB=10=C6=DD=BB3=A2 =C4K=17=EF=DD=18Ar=BC=1D=02=C4J=91);t= +=E0=C8=C1=C5=06=10)9=988=E9Q=C3!=8D=1E;|=F4=F0=E1=03=09=12=1C=10o=84=C6=C1$= +=C8=94=180b=84=CEaD=08=922S=84=10=A9=92=D0=C5=ED=16=B9u=EF=DE=ED=E2=89=0B= +=16=C1=85=03=17^<xF=E4=C9=95#g=D1b=08=8D=1FOr=CC=A0~6F=EA=1D*=06=9E8=11C=A0= +=8A=16=B7]=BC=B8qWG=11=84:=C8"=DFhT=C5A=1CF~=08=8E=D1QE=0C=199=A6=CB=E0=AAB= +=B8e=19|=C0=8C=B2=1E=98=10=E2=86=1Bx=C8=C2=A7=BB=84=90!=A5=96=DA=CB=E2=05= +=AF=9C=B2=90=A9=A3`j=A1=AD=16:=A2=E1%=AF2=84=89=05#=82X=C1=85=8CZ`=E2=07=9B= +h=B8=09=07 =80h=A2.=1A=FD=FA+=86#=F8=AA=F1=C6=00G=D3A=87#=AAX=FB=03=8A'\=AC= +*=0A=1E=82=98a=87=EBbXR=07=1E=9C =E2=090=80(=02A=1Bl=90"=A4=1D=DE=C2K=86=C5= +v=F8!=8A#=8A=E0!=89=18|H=0D7=DEt=13N7=19Z0=AE=B99=85[=EEN=E5=82=B3=01=07=B6= +z=90=08=07=1DnHM=06=A0T=D0=81;=EEv=E8=01=87=17=C4=AB=E1=B6=1Cj=C8=CD=05+MdN= +=86=14P=B0=E1=05"g=C0a=06=162=EA=01=85=1C^=B0=0F=C4=99r=90B=B5=9A=B8=D0A=AC= +#=8E=F8=01=08=1C=82=F8!=B5=D4X=95a=05=1ClX!=86)=CEZ=EAB=0B3T=E1=06=1Fv=C8JD= +f_=0Ao=85=A28=A2=AE9"lp"=07=1Fj=D4=D6F=C0h=D0qG=D5p=18=02=09"=10=84=E8&=19= +=9A=84=01=87#pHM=07=D5b(=02=A5q=DF=E8=82=89=18Y=ABa=07)h=E8=EB=85=D5=AE=BC= +=A1=8C=CD=16u=11=88=1B=80bs=FC=B7:=9B#=AA=E19=F1=948=A3=FFn=ABA"=3D=A2=18= +=82=8B=B9R=A8=81;=13L8=A1=D1=85lhS=D2=E2=92=ABa=06=FC=B8=9B=B0Q9)=DEA=0C=13= +\0=0AD=FFb=B8!]es=D0A=08+=AE8=02=88 =16=CB=C2=085U=F3A=87.=0F2D=88=1AB$=F6B= +=A8X>=B5Y=11Y=FAj#=1D=90=0B=8F=05 Z=F0A=BC=DB=B6=05Wi=B9h=BC=ABK=1B=8Cxk=A7= +=1B=90=D0!=D7=BB=B2=BC1=07=1F=83@=02=0E*=96=98=17F4=DBB=B0=AEu=CD=C5A=8D=04= +%=AAA=CB0nh=D4=858=E5=8487=88=ED=9Cxb=E36l"K=1B=86P(n=84=06=0AYd=EEV=F0=D4= +=05=CA=E9<.=B9=E0>=D7!=E4&n=10=EE=A1=F0`(=A1=84=9B=BB=82i=05=9F=F0=F3!=87= +=1D=82P=E2=0B%\=D3=EF=E2=EB=F2=C2=C1=CC=9FX=98a=85=1B2=9C=9A=EA=AE=FB=FE=14= +=11C=AC=8F=B2/&h=9B=9BT=BC=B9=80H{=DB=BB~=18=DF/=FD=E6=AEj=07=1An=18L=BF=D4= +=E6=8A=DF.=18=A6bl=D6-=8A=E8=81=E9=B9K=BD=EB=06"<N!<=10=C2=1187=14=C5=DD=E4= +=070=E3M=E5=1C=18=AA=CB]=CE8.=E0A=AF=04=F58=D5=B0=0C=057=18]=C8N=84&=17=94*= +b=D0=92=9C=F7p=90=82=DB=95 =06M`=C1=0Bv=B0=03=17=84=AC=04$p=81e2D=83@!=04= +=08]=CA=C1=0F=86 %!=EC=00[=DEJ=1E=0C\ =11=96=F9=A0(=CC=9A^=B1=BA=F2=82=19= +=B8d=05=99"V=F6=B6=D2=1E=E64=87li[=D7]=CCF=BF=18l=8Bn=80=01=D3=D0Z=83=83,= +=C8=85=8B=0F=E2=C1=0D=B4p=84%pF-=F3=F3=0B=D9^=90=84=1C=EC=EF&{=A4=01=0E|=10= +=85=19=A1=8Ea=0FlX=04#h=9C=1A =C1=050h=01=0E=C86=FB=1E=18=9C=A0=83=1DT=C2= +=0BNP*=15=18!M=B9=D9=95=0AVP=84=16=90=C5=057PA=0AK =B2=DB=85=12=0A3$=01=09= +=A8b=83L=BDd=050(B=AE=06s=03/l=86=07<`Z=0Dx=00=86t=81=A9=06K=10=9A=F3p=10"*= +6=D1)]=81=81V=94=99=BD=8D=D4=809=A8[S=0D=12=F2=03=83=D8eg^=FC=E2=0B=82=A0-n= +=DA=E5G_@B=13x=C0=17=C7=D5=A8=07M=C8=8F=B9=12=14=11=FD=FC=A0=0B=3Dx=DCE=C8= +=16F=85=C4=80=07O=D0=C9Ut=B0=04"=90!]=E4=11d=09=1DXBC=1E=B2Nm=BA=CD=17=AE= +=B3=1D=13=98Rd=A3K=01=0CvP=839=84g=06=FCY=0B=0DPG=CF=16=DC=AE=95"-=81=80|`= +=82V=8E=00=09S=C4=DE=104d=17=9D=D9=A0=07=9C=D9=82=0Dt=B0=D1t=E1=E7A=DB=DBH= +=0B=AE=A7=CCe=C2$=06.=01*=0A=FB=9A=D5=1E=FF\=EC=05=B5=B4A=16l =846=E2=11/= +=D8=B2=C1=BF=BEx=BE=85=10N=065=C0R=0E=D4(=C6=1E=FC=E0=807=D1=09\l=F3=C8G=BE= +=00=07B@=D8=0Fz=B0=AE=1F=FC=00"n+=A8A=09=99P=CCU=AEM%IB=0FZ=00=03=19=A60=A2= +=B73=01=C0v =83#=BE =05'=90=01=0D=86=00=85=85=1C=E1v(`e+I0C=13=84j=86#=E0= +=CE2=C7`T=FC=18=91eC=B9=D8=CA=A8=93S0=CD@N@=C8]=0A=94=F2=92=A2.S=05=98J=E63= +_=B2=83=17=B0=80=06+=E8P=0BJ=02=04=EA$=90sI@=13=0D=8A@=13=ABv=B3=9B=98=E1= +=01=12=F6=D49=AC=12.=07N=18=C2=0D=82=C09=88=98A'=F5=B4=E3m=12=82=03=AE=0A= +=E5s=8F=A1=C1=9E`=C8&BZ=0E=AF=DDK=EF=9B=1AH=83|=E2=80=B2=82M=E1x=E4D=10=90= +=9D=C0=052=A5=FB=C9`-=FB=DF=FF=C2=80=05$=18=C1=08d =90=DA2=E5=06(=98=81=00= +=930=94=D3n=B4=07:[=82=EC=DA=93=BD=D8>=A5=08,=8D=AD=88V0=E1!=84=12=A73=90C= +=0D|`=03=1F`=891>8=10_=C2=A9\=B3=C1=170L=18=02B=E8=92=D6=B9p=F5w=FA=91=02g= +=82pA=92=A1=F5=91?=C0=ADx=8C=00E=1B=88=A1=06[=AAjA=DB=BB=DE=F6=CEI70=F3=C1= +=13@=E6ASJ=F4=06.=18=82)=8F0=1E=A2=84=C7=04-=00pJG`Y=DB=15=F8=06B=D0]S=10= +=C5=02=14=08=F2=06=7F=F5=815=05=F4=84P=9ES=06=D1=C2Z=86e=EBg=11y=D29<=C0=CF= +=FE=12=B4=03=1E=84=B5]=A1=D1=81=0F=8A=C0=05w=FD=05=C60=86A=0F =12=04=1E=CCE= +=C8=E3=F9=C1Z=DF5=03=1D(A=0BB0=C2Y=C9=C6P=17=C0=E5=07[<K=C9j=10W=C79=D9=81= +=FBP&d=0E=A4<=A9,)$l=83=CDr=96M=80X_=EB=E08z:=81=11,[`d=17=98=04S=18=F0=08= +=BC=95=AE=96 =18=054=90=A4=09b=C0=D87=C9=D5=B8(=82=96=0E=82=F0=84=1Bt=A4=CF= +~=C6^=86_=C2=82=AF=CC=00=06W=C1=CFZ=14=83=04# =C1=0B?P=C2b=FC=E8=901FW[=E0= +=D3=16=A1d@=06x)d=D3=90=F4=C9\=E0=E3=03 =FC=E0=08=A6=AEko^0=84=BA=8EG<@=E0= +=01=0Cl0=83!=AC=15u=82=84=18^=8B=03=9C=12=1AtC"=DFo=0El=90=84=06=CB=A0=DAY= +=06=F0=EDVY=D9S=8A'=05H=00=EC=7F=93}=F33=97`=04DH=CD=14=8F=A2=B0.=97=E0=05= +=92=EA=D0=B0o=B0=84=8E@k=05T=00X=A8=90ITr=1BU;=1D=06Q=D2u=CB=B2=18=ECO=08= +=C0=13B=13=9C=90=05=A2=E9=E0}s=FBKr=B7=B5im=05=FB=0A=C8=03=87=A2m=E6R=DE=A1= +d)=D3=E2iSo=1A=BE=B0=B1=B9=C0=0C!=1CeX=17=C2=F1=11=1A28-=10=82_=A30=C8=C1= +=9B,=E4=B9=A9=81=11=F67=D4-0x=09=FE-s=09(=0B`=0E=DE=0E=06=BBm=81=B5=CD=8Csd= +=93=A0W5=B9=9A=F3=82=D0=82=17=A0=F4=B25=E36rz=80T=A4=CA=84}=E2=1EV=D4=A7^T= +=97=D0@=058=A4=C1=0C=16=D8$=FC=18a=09=C1=FB=02=1D=BE=D0=84=AD=BF=85=08=BD= +=CF=B7=A4=01=93=B6=81=97=8DF1X=8C=C0=07=CE=83=B4=EE=EFS=F3=B2~=C3=19=CA=9B= +=88O*<=BDy=A0=E0=C5=D6=02$=C4=A0=06=08=E3S=EA=C2C=83=D4=BD=C9E=A4=0E=B3=0B$= +=99=C22=8F=B4=B2=AD$=F3e=E7=8C=A0=CA=02=3D=9C=DB=A8=DC=E8=8F=EE=E9=BF=19=02= +=98=AFA=AA=1C=80=3D=A4=1A=B7=A8K=B0=E9=91=A2=15H=17=8B=1A=82r=19=14=19(=02= +=B7=E9=FB!&=18=89$=10=BB=1C=18=BE=1C=10=02=1C=F0=02u+;=BC=B0=02=E8=8B>=E9= +=B3=91=AA=E2.=B4=92=C1=17=C8=96=17=C8=0F=AE"=02=BA=AB;=DD=80?=1E=DC=8D=17h= +=A0=BB=8A P)=0E=17Z=0B=88=DB=8D=1BP=02=C0[=9D=1809=1Dh=81=1B=B0&=82=10=A9= +=FC=BB=AC+<=A5=12h=81=1CH=82c=13=C0d=03=02=14=D1=8A=D8;=91=19@=B6=04=F4)O= +=82=3D+2=96=A83*=DC=D3=A4=1F=F0=01=18@=93=17=E0%B=BB=8BtA=10=1C=88=82(=E8= +=81=92=F8'&=D8(=AC=CB=B7\a=1Au=B3=0B=19=8C=BE=E9=A3'=17|=A4=19(=9B4=A1=81= +=85{=9C=1F=BC=C4K=8C2=08=F2=B8=FD=92=82.=89D=1Dp=01=1D=A8*=86i=01=19`=B3=14= +(=82=8D[=81(=B4=81=13=B0=C2=FCs=81+\=81VB=81=9A=E9=81=CF=03=C3=11=D0=08=F7= +=087=15`=14=02s=82dK=81=0D=FC=D9=AD=07l=C3=9Fz=C3&=FA=AB=0B=F3=A4=8C=C0=8F#= +=18#W=E9=81,=01/=B6=A0=8E=1CP=17=15=04=BE=1B=80=82=BB=90=82=EE{D=1C=83=A2E= +=DC4,=B8'=80=81=88"=F3>L=FCAML=19<=D9D=8Ai=0Ek=19=82=18P=82!=B0=013=A0=C6= +=BAj=1B=18=E0=01=EEx=01=1A=B0E=13@=81=AEq=01X=BCB=85=A4!=13X=81=CD=D2E5c=AC= +=15x=01=14=88=01=B2`=81=18=98=AD=9B#=01 H=02p=83 =1Bx:d=84:=DCk=A2=14P,=11q= +=01=98x=81=09=CB=8F=B8=98=11=19=10H$8=AD=9C*=A2m<=82W=11=82=3D=C1!=B8(Gq=E4= +=B7=9F=04=1F=E9=BB=09=85i=C7L|=C7=F2=BB=93=C1s=02=AE=F2=96-=C0=89R=B9=BB;= +=DC=81=D1=B1=1D=C2=8A=B9W\H=AD=BC=AC"xH=88t=A1=81P=01=1B=88!=02=DB=C5=11=10= +=01=B4<=B3=DD2=01=FD=FC`=01=CB=F09=DD=19=C9=AF =C9=A9=91=C0=A7=A8")=A2=01!= +=98=01=1E=10=9F=1BC=1D=16H=03=DFj=02=FC(=CC=CD=03=BE=EB=A8=8A[=C2=81=C3=FA= +=9C=A0=8C=BE=18x=CCG=0A#=F5=CB=01v=AC;=A4\()3=02y=C4"=D3y=9C=88=A0=8E=8E=92= +=88=B6P=08=8B0=C5=85=88=81=C0=EA=B5=14=BA<=85=04=C3=FF=A2=01=AF=14@=11(=CB= +=11(=8B=93<K=11=D0=CD=B4=94,eS=0DxA=B0=14=D0=3D=91TIc=B1=89%=D0=3D=EF=88=C0= +=09=AC=1E=16=18KH=CA=A7=1B=D8=81=A2=83=16=CF=90=81*=C0=15=9Ah=92=07!=02"=90= ++=9D0"=C9=1CO=F2=84=81-;=CA=CC=942#=84=81,=00=0E=F6=C0"=16=00=1E,P=0F=D1=94= +=08)(=AD=93=8B5=C6=D3=A4=FB3=A5,=CC?=88L=B6=D5=B3M=D0C=CB=B4=14=82=17 =82= +=901P=06=D5=B9=DDT=B6=D53=AA=1F=F0=0F/=FC=B80=A8=F0=012$=8A=18H=82hSF=DB=DA= +=1D=DE=BA=01"=F3*=18=C8#=9B=B0=0F=D31=1Dzd=8C=19@=93=C4=8C=8C$X=9C#=B0&=F2= +=FC=C9=1F=1C=B8=EFk=93=F4=9C=1CF=D2=A2=1Cp=11=16=18%^=04=8F=C1=FB=01=F4=A8= +=09=BDT=A0W=AB=01"=10=CFTK=01)=E0=CB=1C=C1=BF=AD=FC=C2=00=15=D0=D9=BC9=06E= +=CB=168=C3-=FD=D2=07]=BDL=CB=8B"=E8=1A=07=DC=88]=E1=AD=0A=AC=89(R&D!=08r=EB= +=8AG=91=01$=C0I=C6=FC=82n=E9=90=AD=F1=0F=BE=1C>"=C2)$=A5=01-P=A4=10=CB=8D= +=C7=A1#=9F|D=A3\T=1D=DD=D1=85=F2(=C6=B3=81)=F8=C7 =B8=98=0E=89=BD=95q=88=19= +=88=88=FD=E9=01Yq.=99Z=A0=85=10=1D^KH=AD=BCR0=D4=B9=02=0D=81=100=D03=03=D3/= +-=B0=13P=81=19=80=88=1F=8DL=9EB=AA=83=88I=18=FC0=02=1Bx=90=0E=BD=907=1DV8= +=05=AA=AFX=82'=FC=A7=10=B4=C0"=90=08=D31=16=8C=D4=81=9E=A8=89=12=FD=D5=DE= +=BB=A8=98l=81=18=D0=0D;:1M=93LF=0D=D7=F8s=D4=E2=08=8F=1C=00=02=14=DB=81,q= +=91[=D9=9E=DD=D1=0C=87=A8=89WC=B4D=EB=81=A2=19=8A=A0=B8=82=F8XMS}MT=FD=D7= +=02cU=81}P=B4=14XV=DD=D2=D9=E1=95=1Ep=0D x=90!`=01%p@=DE"=82l=A4=81J=9D=A2`= +u3b%=D6g=FA0@\=88=B7X=82=E6J=97=F6yX=DD=A9=02)R=81=1D(Q=E40.=1A=E0=01=CF=81= +=01&=A0=93=EF=B1=A3=19=F0=CBpTTq=0DWr=BD5=17=08=02=19h=027@=A2=DE=8BDR=EA= +=0A$=18=82=1F@=8D=AA =02=1D=18T"0=02(=98=C3=1Bx=02=DC=12=02R-=D5~=05P=80=FD= +W=83mU=17=10=81=AF=1DX=06=FC5=81!=E8=88!=98=0A(=B0X=08=82=3D=DE=C9=01,=D8= +=A8=EB=A8*=87=D8=9D=03c=8A=8D=CD=DB*2=8A=A2h=AC\=09=02U=EC=90=FA`=01=1D=A0-= +*=92=A5=948&=8EX=8FZ=9DG=EF=A9=A1DT=88$=F0=17=B9=08=CA=9D=E5=D9=9Eu=AFI=A1= +=C6=9BP=82=FD=08=AB=16=F0=0A=15=A8=B1=EB=98=8A=1D=90=04!=B8=02+H=82 =D8=03= +=C6h=AC=15=D8=0E=19=C02=FF\=C8=AE=05=D8=B1%=81=B15X=06=1D=81=BFJ=81=C2E=82= +=A5:=0E=89=C5=12|#=A3=3D=DB=D6d=CA[=E65=C9=96p=88R)=19=DD=FB=8A=1F=A0K)=C2= +=BE=9B!=0B=8EpF=12=D2=81Fi4|=AA=82(h=D2=BA=B8=BES=BB=DCEm/=CC,W=F0=B3=12=88= +=B8=02lILgJ=81=C6=B2=A6=83 =02=C6=00=03$H=02,@=BE&=98=0E=EA=BB=DB=14=98\8= +=8B=A8=17=90(*=B5=D2=DB=0D=D0=B1=FC=DD=81=DD%[=11=E0=0E=17`=82"H=01=1B=08= +=99=0E=D1=88;=B1=81&`=0B'=C8=15=1C=D0=027=80=01{=A4"=E6m=DE=E6=14=B4lT=0D_!= +*=98=90@=D7=AA^=A8=D8=9A=8C=A8=81 H=B5.a=82=C4m=8B=B7=C8=95=BF=B4=A30z$=F4M= +=DF=83=1A=BFEM=18=1B=F8=CE=EF=04=02'(=8F=180=9F=E5D=01=16=F0[=D5=18=82=C1= +=08=83=1F0=02#8=02=C5h=82=8D=B2=99=14=A0C=F2=B0=81k=83=81=15=E8=0E=1D(=A5= +=FDS=E0=05=D6=C5=B1=15=DB=07n=D5=DD$=01=15=10=0A=8A=99=A1=BF=82=0BOz=1E=1C= +=A0=18=F2=F0U=96=C9*$=88=1A%=B8=15=818a=BDmN=A0=B5=82 =80=82=18=18K=0E=13= +=88=19(=16=91=DC=0A=D5zN?I=A0=C5=19=8D=12=F9Q}=B3=0B=E1=F5=AE=1D=1Cb=DE`$= +=F1=D3=AB=1Ax=01<=13=BFv=04=9F=B7*=022=8A=A5=820*=17=FC=F0F=8B=92=AB=1BP=03= +=B7=E2=A5=DF!=3D4=FD=A6I=C1=81=E0=C0=8F=AD=CD=C56=06=C38~=E09=EE=3DZ$=81=1B= +=A0=E3=11@=81V=A2=BEf=DD=B3y=BC=8D0R=0D=3Dl=8A=D8Ed=14=A6=9A=DD=F3=09=1C=A8= +=8C=D7S=81=1C=A8-8s=8A'=08*=9C9=91=1C@=83=E0=02=82=99=B0=81=EB=9AB=0B=FC=A2= +=B3=10=E3=17=D0=02=D5=08=C2=1B]=18L=BC=CC:q=A4%=F8=D9=B1=F4g=A3=C4f=BF=A8ZL= +=19=08=81=A8=81-=C8f=18=D0=01t=B5=01=933=8Bk=D5^h)(}2=99W\c=00;f=06N=E6=AFE= +K=18=10=820=18=81=1B=90=D5=9B=93=13=1F=12f=F6=1A=BC=F0=A8=A1=A3=BB=DB=CER= +=01o=FEf=0C=A9^=1Cp=82=14D=1D=A8s=81=09=A4=9E=14X=81,=88=93g=B3=89F=DB=81= +=B4=08=0D=1BX=02=FD=E0=A6=17=93=1F=ED=CB=89=C8=E4=C1M=0BhG=9A=94|=FC=8A#=BB= +z=93=FD=EA=A3=DB=88Bn=AD=BB=B4J=88=1B=E8=BD @=14=14=B8=A8=06S=88=1F`=82s=B9= +=18=89=80=0Ey|=93P=11=9Db=C6B=91vc=92=1E=D8=11X=88"=D8R=15p=D53=DB=88_=B3= +=99G=96=93=F1=1B=8F=00y=0C=ED@=943=CE=E9=8D=AD=CB=8E=D0=D6=7F=0CV=1B=00=B4= +=AEX=01=16i=B7=1E=D8!=1E=E8=0C=1F=A80=D6P=0F=FC=A88=C2=B9=8E=C1@W=A5e =BB= +=1B%=F0B+=AC^$'=B5=01=DC=FA=EA=CCq=81=B8=95=E7=88=F3=BE=B4jX(=E2X=D7=C2=BE= +=17 =D16=82=9A=C5Y=0B'=00=02=E6=B8=E4=16J=3D=CA=FB=AF=FD=EBkd=FE=EBV-lX=DD= +=D2=11He=F8=BB=AC=16=10=83 t=CB=DB=B8=829@=02=A3Z=82=ED=A0lD=AE=CB=19@=02d= +=F5=A4=CD=8E@=97=08=C9)NL(X=1A=02"=02Y!=9A=D0=C0=82=EA:=A7=A9=0E=17=D0=FB8= +=17=9D=F82=C9i=01=80h!=B0=85=8B=176j=B8H=A8=D0=C5@=82=0Aa=F0=E0=F1=82=06=12= +=1B=0CY`\=A1=11#F=81.|=DC=B0q#=A1G=1D=0C=1B*|=A1=D0=C6=12=164P=9C=88=19=13= +=85=0A=19PT=9A<R=E3=C5=8B=1B2=04=BE=C8=B8=91=05A=81O`=9C(=A1ti=09=13$=9EB= +=1D!u*=D5=AAV=AFN=0D=A1u+=D7=AD"Dt=F5=FAu=EC=08=15$F=9CE{=82=85=09=137t=C0t= +=C1$EL=172=EF=E2=CD=ABW&=8A=BE~=FB=A6`=D1=03F=0C=1A)=FE=FE=BD=8B=F8o=0A=15= +=3D|=D6hQ#F=0C=19;r=EC@=93=A4=CA=93)@t=0C=C1=81D=86=0C=18=A6y=A2~a:F=8D=1CA= +|=D4=A8=A1#=88=95=16=1C=1B=12=C4=11r!o=DE0r=80=A1ac=C8=8C .b=B4=D08=B4=87@= +=1A=3D=C7=F4=A0Q0=E1=8B=1C$=3D=FB=BA=90b=10=E7=8A=18/z=C4lk"=E6D=1A0=16=92a= +8=DB=05G=E5-=B0=D88=B2=03=87u=98mK@q=E2=A2=04=D4=FEi=B1=02=18=E0=08 =10=18= +=96=81=07=8E%=C2=08_UU=C2~O=B9pER&=D8=D5=D6=0A=E2=8D=B7=97=86z-=06=D8=0A-= +=C8=C0=85=0D=88i=D8a=0A=8D=BD=D0=C2=10:=AC=F6=18=0EF=00=91=84=13O=0C=B1D=0E= +8=04AC=0C=A6=C1=90=1A=8F=A6=CD=D0=84=11C=EC@=C3=167=D8=C6=11Q'%4=83=1E=3D= +=BA=C0Co=BC=BD0DH5=D0@=03=18=F21=E4=1E=0D9=EC=94=84=0DF=F0=E0=83=0C1=E8=F0= +=C2=0F=3D=00q=1D=88/=D8=C8C=8F1=F4u=02=0A1`x=C2=0B=87=EDh=03J=03=B9=B0=83m= +=CA}H=C3=0C6=D8=E0=C5=9E'=A4=B0=C3=9D2=98=C0=9F=7FQ=09XiU=04bz=A0=A6b%=C8= +=E0=083=A0=05U=A4J=DD=FB =1E=A4=18f=B8=A1=AA3u=A8=C2=0C5=1C=96=D8=86=1D=A2p= +=E2=0Ag=9A=B6=C3=0D7=E2p=C4=0FA=14=E1=83=1D=98=CD=B0=83=0E8=F4=C8S=18;=C2P= +=DAj2=18jhd=1C=11AC=0D=12=15T]=0D7=DC=10=C3=94=0A=FD=1AC=10J=D8=A0=C3=0D=86= +=1A=E1=02=A1=1AI6=C5=0EF`=89=A5=0F"=0D=F1=03=0E=0A=A1do=139=C0pXx=E1=B5=F5= +=AF=9D+=B8=10FCJr=84=C3=0A*=F0 =83=0D=3D8=91=C3=99=93=B5p=03=110D*j=7FNY=DA= +=F1=80=98=16=B8)=82=9DzJU=7FL5=85j=C0=AB=B2=BC=98=0A*=D4=F0=9B=0A~=B5=BCXc4= +=90=C6ca=DC=DE=00D=11=11=E5`=C3h=CC=9Av=03O1=18=C1=DAj=94=91=A6=83=0EBu=F4= +=02=119=BCpl=0FE =AB=D2JT=02=E1D=0C7=E0=10=05=0F3=CC=80D=0C,,=EC^=91I=CC=90= +=FCe=96=B1=F5=C0C=D6=D7=B1=C7=C2=0C<@=B1=03=AC=F6=A9,=9E=9D0=E8=E0=C3y=17!= +=DC=C2D+=A40C=0C9=14a=85=99=0B=CF@=14=0B7LXBR=93>=E5=B1=80 g*rX$=97<=D5=C9L= +=F5=8D=97=BF,=EF=85X=0A=85=B5@3=EA=AA7=A6B=0CH=F4H=18=0E@=CCk=03=13X=CEp&e0= +=10=11C=15=91=F1=FA=C4=8ED=F0`=BC=154=B8=A4=1CQK=B80E=12R=F4=80=83=0D>=F0= +=B0#O=D4i=BD=10O=BF=F1=90=03=13=A4=D5=A0=D1=CB*=18=1AD=0Ed=BF=FDC=0D=07]=1B= +=C4=E0=0A=E50=04=CC:=04=3D=B9i'=F4=3D=1E=0AC=F4=A0=07CP=C9=0B=94=90=A4=9F= +=10$=08dB=81=FC=96p=83"`)#,`=82@=F87=83=B5HJR=98=03=D0Sj=F0=1F=ABp=AEs=9E= +=D3=0A=E8=14$=95=17=8Cn)(@=15=0B4=14=83X=A1./=FB~9=8C=0A=80=00=C3=182=06=06= +,=90=81=E2l=E0=9D=170k=098=88=81=0D=EA=C0&=0A=F2=80=06Dp=02=B4>4&&tk=07/=C8= +=11=10j =83=85=BDl#J=F0At=DE=F6=BE=D6=C4=CC4O=A0Zo=BE=B744=01=81=09=E7S=C1= +=87|=C2=C3=1A=F8 =09T=C8=01H=10=85=03=19=14a$=05!L=0A=BA=A3=12=82=C8=80=7F= +=E3=19U=CA=DA=02=B3=17=F4=C5i-P=C1=E4=AC=E3=91=17=AC=E0=04=A5Q=8D=0E=90=A0= +=83=E4=AC@=09<=B0=C1=0E=E2=D6=02:=C1@),=C0=1C)=1D=E4=82=CC=05(=84"=F4\=A7V= +=F0=C1=11=9C=A0=05=92"=02L=9A=D2=02;=B5=C5z0=A1=CB]R`C=D7=C5=90/}=F9=81=BA= +=EA=84=C3=19f=01=06B=10=C2=0Fn=80=84=D4=00=D1[=17I=DB"=B3=C7F=F4=DD@=088=98= +=01&yp=83=97=F9=E0|-=F0=81t=0C=D56)=DC=FC=E0=8B"=A1=CF=0D=92=06%=EF=F9=880S= +=90=01=1BO=C4=C8=17=8CM=065=D8A=12"=C2=83=00=E2=C0z=97=81=12jz@=17=1D=02=81= +=06=3D=F0=C1=0A=EF=83=B2=B6=ECp=850=B1=13lx=103=82Ha=06L=18OA*=F6I=B4=AD=A0= +=06EXB=13=E8I=14"=B4=A0=08-=C0=98=83=96B=02=A5=BC=94=05A=8B=81=A4,=A5=CA=90= +=89=0Ct#=B0=0DLI=B0=83=90*E=05QjKB&=8A=823=1C&=92=8Ai=96=AC=82=C9=AA=C4=0D= +=C1=98=AF=EB=0Bi|=F8=02=D9(=E14=DB=DB^B=B0=A4=82=13=A5=C0=057=00+=0BL=C3=1E= +{J=C1=05_=05k=16=AD=08=ADM=E2 =097X=82Hl=00=04"=DC=91=AB=D9:=9A=19w=94=84= +=17=AC5=05E=80=01=12=86P=99b=E9`=07L=B0=02=16=A6p=04=DDdM%10=D3DO=90=83=BA= +=80=C8=A1=0F=8D=C2=A9=FCV=85=1B=FB=04=C1=81<A=81=0CR=80!=19 =89#6=90=01=0A`= +=90N=1D=BA$n=8Ct=81=10d=C0=02=17=1C=A1uj=ED=81=0AZ=E0=14T=DA=F4=A6a=19=01= +=0C=18D=16=05=91=85=04h=93e_j=9B=82)=B8=C0=08Bu=02=0E=0C=DA=17=EBT=A7=B2vB= +=01=10l=F0U`:=150=3D=90j=CD=D8=F8=9Df=C9=8EY;=98=1Fu=9A=A0=03=1E=9E=A8/t=AA= +U=10d=F0=020=E8 V=8D=01kc\=F0=93=D5=CE=A0=07y=8BH=0F=84`%=1B=D4V{=DD=E3=96= +=10=08=D3#=D4=02a=06/=DB=C1a=EC=D9=B0=18=B8a=8E:p=C2=10=9C@=063=FC =07=E9= +=E4=17>=BB=E3=02=BA=04le-$$=CA=F8=B7=94=80=A9=E4=0A3P=C2ar9=AA=13=D8=C5aoq= +=C1e=A5=99$=15=9CK]5=E8=01$=7F0=83=B0=1A=C4A=94=F2=D8MA=A0)=11=90=A0=B7#X= +=C1=08=F8#=FB=BA=13=08!=068=BE-Qp`8=16H)=07-=98=81i=EA=85=C7'=A8=0EZ=B1=02o= +0=A9z=BA=D7=AD=E0 =8B|=D9=89=B0=14=03=1E0=A1I=A8Y=CD=0E=8E=DC*=1C=E4=F7%=B5= +b=CC=CD~pXc=ED=C0=07J=80=C2=0F=84=086=F9}o!0=C0=1A=BF=CE=D3I=C4=A1=00=91=B5= +J=81}=09=03-=F5=8D=CB=0BqHB=10=8E=F5=03=D3=80=81=B5}=19Q=E9\=C0b=A6=C8=92t:= +H=97ml=00=03=14(=85=902h=0AiM2=83=17=B4E=8A=0Eq=8BGb=C9=82=14=85=B2)$=88=C1= +=92=99,=DC'+=C8U%X=01$I=E0=16=97=9CX]=CE=BB=CD@P=83(=1E=CC=8C1*@=16=0E=BEK= +=DE=F0=A2=A0=08=DAUU=AD`=90=1C=D5}S2=02=D9f=B2T=13=032=84=DBfI=10t_4=BD=E9= +=19=AC@qh=12C=0EtP=84!h!=09O=08qH=FB=84P=04#=F0=04=07=EF=93=CC=0D=ACD=19=E6= +=F8=E0=85=84^=01=EDbP=84,=D0=A7=0A[0=02=8D=C2=A7=83=1D=1D=99=07=BCl=8Bi5=DB= +=16=DF=A2,=D7-=86=09=0CT =86=16=80'=E6K=B9W=EBJ=80=83=A5=9C=A0=06=99.=81=14= +L`=83Q=01=DB=A5=FD=D1=1CU=9A=9CS=05a=11#%=08=CC=0A=D0=96=C5=AAc=A4G=02a=EF= +=1Fi=90=9C=99=C5nG=E6fsxy=B0=EEY=F9=1Bv_U=01=0C=84c=83 =FC=FA=058=F8=01=A6= +=C9;=CC[=DBL5=93~=96=C9=C7=C5=05),!=09=C7=CA=81=82U=833=16=B0d=0DJ=00l=B8= +=83P=A7=19=B6@G=A6A-=A0}`y=1E=EC`=9E=E2Z=C1x=01=86!=9D=E3Z=E7=A4=CB=F5=09= +=96 =84=A4=BF=9A)*I=FDea=9DA=0D.=9D=E9Sq=FA=A6=BER=03=0A)=10=08'=E0,=16=D9= +=A8=11k=09=C4=06R=FA=FB=01=11=B2=95=10=19=0CQ=9F=E8C#k=F2M=F66=F3rU(x=89=0C= +g=A8=82=17=8Ca=07=BE=BA=E3o@=04=03=A1=9F=BD=B5=EBf=CC=0EwD=1F=B9=E5=C0gG(= +=82=10.=B3=83*8=EB=05W=88A=1B )<?=B5=E0tR=ED=F7=0C=F6=18=1B=DDp=8Bg,=81=13= +=F4N=0E=D4=DDD}=9E=E8=A5=9E=02=AA=C4=B1=B1X=0A=A5=C0=10=F4=D4S=94=80,=8D=8E= +=C6=F8=87=EC5=DD=B3A=9B=820D=17TF=EC=B0=11=0B=FC=80m=B5@=13|=1F=8C=D8=C0`= +=01=11=D5=ECY=0C=90=8D=E1=F0=84=0D=C4=17=898=95=E9=A0=CE=05=A5=CE=EA=E8Me= +=E4@a=F5=80w=B0@=0A=D0=A0Z=85_=F4=09=13`=D4=84=B3=88=8B=C5 =81=E5=F5=93=0E= +=D8=80=A1=10F=E4t=C1=DEp=DAVQ=9F=0C=B9=00=F0L=92j=CC@H Jl=BCM=CD=AD@=F6=B0V= +=14`=8Cf=89^=1B=92=CEx=FC=08A=E8=C1=DE=C9=98=80=04NJ(=F9=C7=1C6=9B=06~=8C*u= +=05=09pE=82=A0=C5=0A=10=16=9D=C5N=9C=09=8E=0B=D4@=DB=BCMB=F5=C0=B1H=D1=9EY= +=92=A1=19=C4=D85=D5=0D=CA=04=0D=B0=0C=12=E2=C5=0CM=86=0DT=17=C4=D8Vi=F9=05= +=0D=EA=85=96U=1F=AC0=D2=0F=A8F=0D=84=81=11pK=15=F0@=12,=D4=85=01=C1=B9=C8= +=CE=9E=F8E=CC=B8=00J=DDZ^=F4=CB=89h=D5=0B=CC=C0=14=D0=11=19=D2=003=A1=8D=0E= +=90=19a=BC=80 =B1=A1=1BJ=A3=09=B4=80=0E$=85=1EBE=05=EA=A1=B2=91R=06=F2=E1= +=EC=F9aX=A4=00=C9=8C=80=BD\S`=9DOH=BD=17=FB=C4=06=A2=88D=F6=D4=8Ej=C0"=10XI= +=B3=1C=E0%b=E2=EB=CC=CA=A6=01=01=BF=F0=00=12,=C1"=AD=19L=90V=F8q=08=3D=FD= +=86=0D|=0F=0D=E8=00=13=CC=CBc=D4=C0=12=14=CB=B4DT=0A=18=81Q=FC=1D=C6=ABpb'= +=A6=80=18`=CB=0BH=C1=8E=0C=C1-=CA=00Je=84"RM=9F=ED=D2xH#S=E4a=8B=ED=C0=A8t= +=A36b=CE)u=E3=1E=F2a8=86=00XxE=0AH=05r=0D"=16=B1U=9C5=07i=B4=8D=13=18=C1=0E= +4=93=88=E4=00=98=DC@=BD=B9=80=A1TU=AA=0D=E4=B9=E5=E3U=CEDc=C0=80=13=00=81j= +=A8D=0E=10=813q=A2=0A=B4=CC=B8]=0C=0D<ej=C4=80=12=CC=1D=0F=08A=12=B8=80=0D,= +Lc=18=93&=DA=89=9D=00=99RA=A3b=F0=90u$=C4=E0=D8KB=08=CD=19t=84C=9C=9C=A1=DD= +=9AxH=E3M=BE=18Kac6>=E6M=02=D77J=85N=86=C0=0C=90=90=08=E0=0C=09=D4=DCY(W=11= +=B0=C0Z-!=C9=DD=11i=CC=C7=0E=FC=93=E5=1D=CB=0D=C8A=C4$=8BiX=DD=0B=81U=87`em= +=DA=09=0B8=C1d=94U=0C=DC=CB=F7T=C6=D9=FCI=DF=0CX=1F=8F=F0=84=9CP=0D=0Ct=A5= +=BB=B5=07]j=08=0D=1C=81=E7=AD=CC=09\_=99H=11oD=C6@(=89G=D8=00=18=10=93=0C4= +=81=0B=DC=CD=0C,=A0dfc=0B=95=0AyF=E6MR=E6=A5pNW=88=80=0A|=05=09=04Fc,=0C=0B= +L=1Ba=F1=17}=F6Nex=C1[=F8=00=11<=1C=10=84=D8=DCM=06=8FP=01=15=FC=94=3DU%>= +=DA=A6S=05#`=B0=C0=D9=18A=1E=F4=88=94=94=01pjH=0D(=06=0A=84=E1=0C=E0=80=D6l= +O=8F=E0_=0B=88=C4=9D=BD=99=E7=C5=C4=8A=A9=0C=8E=EDH=84&=CBI8=84@p[Q$=07=0DD= +R4=A2=0Cy=8E=8E=0A=A4=E7S=A0=90=8E=C6=DEz=82=E3*=B9=C0W=B0=00=10=B4=80O=F5= +=91=89=DD=92=09=A0=00=F8=B1=95=0A=AC =D3lXaM=81=19 =01=10=04=01}d=C1=0F=AC= +=17a=A0=09=0Cj=1C=ADXe=83J=9Fv=FC=F9=85O=10=01=10=C4=C0=0F=FC=05=0E=E4=E3= +=0CU=DD=B70=C9=0DL=81=17"!=AA=E8=094=E6=C9=99=C4=CA=A9=0D=01=8Cb'F=E4=C8HH= +=13=0C=1C=1D=8E=BA$=90f=A3=09=EC=1A=A3=EA=A8=90=82=10N=ED=A4=08x=D7=0B1=8C= +=A6Q=86=0E@=81=9C8=01=A1=A9=00=DC=E9]=0C=E0=95=C1=0D=01=144=C1=12=1C=81=10= +=E4@=12=FD=0E=0C=F6=00=C0=CD&=99b=A8=99=EE=C5=14pH=0A=04=01o=96=CF=89=E6=C5= +=8Ar=08=0A=AC=A3B=91=91=9B`=07j=B0=96L=94=0E=9F=8A=07*=C6=C4=0B]=D1=87=FCQ5= +=DA=00GH=E1j=9DG=0D\=A4=A2*=1D=A4>ELz=ABzJ*{z=05Y=EE=CF=91=9D=00=13=08A=AC= +=C0=C0=0F=0CA=15=D4\ +=A3=C3=10=1E=98=B2=A5=E5=0DA=13H=81=B1=DC@=12=F8N=D1=08=C1N=C8=E6=82=DA=A0m= +=EAix=A5=C8=F60=01=DE=E9E=FFD=E7=09=FCtK=F8,=81=B8LAZ=16=90=BB9=C4=82mS=0C(= +U=FF0k=86=F8=8D=9D=CC=80=10=B4=CDw=AA=C4=F7q=EC=14nK=88=C1=C0=05)=A6=E8=85k= +=7F=F0@=CCN=CA=B8^=85=93=F1@=FE=A1=00=0B=A0=C5T=F4=00=09=AC=80=0E=A8=80=AE= +=84=E1=99=04=E1=10B=E8=DA=ADc=B3=08=01=B7=B4=E5=0E=84=81D=F6=80=EFT=01=9C= +=F0=00=10=C0=00=13=94=DB=AC:=1F=83=C6=90=C3>=EC=ACl^=ED=88=19=C7=E6)=D8=86-= +=0A=B0=A2=C4=F1=00=0B&${D=9EW2=04=0DH=C9{}l[=F8=00=DA=92=C7q=04=81=BD=80=A8= +=B8=04F=B1=A0=816=F5KL=F4=C0=CB=E6(=CD>=C5=0C(=EE+=D9lV=A4@=09=BC'f=BA=E7N= +=12=8C=0C=8C=80=BA=CC=80=D0=D6`_=B0=80=12=1E=9B=D4=C0=80=12=A4=13=1C=D5@=B5= +=E0La=F0=D0=D8$=16=0D=18=C1o=F8=00=D6R=18=AD=DAL=BB=01'=DA=FC=E6=C9=86=0Cd= +=0A@A=16=E8=C0=0A=AC=1B=EE=86=ECL=B8=00=91=D1=80=0A<=81=0D=F0=8B=F0=84=D4A= +=08=CD=D1=C4=97w=C0=A9=F0=AE=E8=F4=C5=A5=F0yG=C5=98=C6=89=B8=C0=0F\=C1=12D= +=C7=0E=C8N~1=C1=09P=DB=AB5=EES$=A9=B7>n=80=F0=A4=C8=FC=E4W=90=CD=DAu.c=C8= +=00=13=90=98=BDi=929=91M=18=DE=80=1E\=D1=CB=14=C1=F9=0C,=C1=0EZ=87=AC=80=A3= +=EC=05=F5=E6=AE=0C)F=0A=FC=06=10=05/=F5=F2EaxS=B8YT=0A=FC@c=C8=C0=9A4=D3=8E= + =81v=8D=87=0A0p=C0=C0D=F6JF=0A=C4=E1=0D=D4I=0A=AC=14=81N=CB=0E=B8=00=0E=84= +S=0E=E8\=FA>=05=0AHfM=B5=EF=E6p =09y=05Z=B4=16=7FuH=84=A6@=12=18=0EI=14=DF= +=BC=DC=C0=0FPA=84=CE=C0=11=88f~=1A=B0=CB=F4=C5=F5=F9=EA]=94=F0=F0=96=C8e=00= +=11$=FCU=D6=16=EBI=0A=E0=CCK =05=A3=CC=D0=0Cx=81=0E(=81=8D=E0=911=E1nC9lL= +=C4Y=8FL=94]=C6=84=0C(=E2N0=02=DC=0A=84=96=8D'=0E=BF=94=B8=F6p=A54=19=A5z= +=C5=F5=F0=00=16=3D=A5=EBP=15=D8E=10=E1dD=0E=84=A6F\=11X=1DY=FD=D2=CA=9A=B9= +=F0H=9CA=99=DE-=05o=08=D85=8Apjq=09=DB=09=8B=94i=ADP=C6[T=CB=DE(+=DA=C6=DC= +=8A=B6=C0=15=10=01=1A R=8A=B5=05w=FD=91=97=B1=80=0E=90=C1N=D0=92C=3D=A0 =FF= +=967=16rp=1D=B2{F=EE=85=A4M=11x=07=9A=1A=13=C6 =05=C6=AE=CB=1A=A9@~i2=99=A6= +=C0=11=CCPYy=17(o1=B0=96=C8=F5=15U,3=F0Zt=81=0D4=E7S=9A=C6=EDT=AB=E2=9C1=D8= +=BA!=AA=D4=C0m=F1=A9 =D9%=0B=1C=01CP=B2=DD@=91=86=06A,=BD@=E2=0Ar=CD=C5&s= +=C7=1C=F2*U=AA=82pS=97=D5=EA=CB=CA=D2=0B=EC@=0C=AC=11=15W=B1=CD=A8=0B[=1D= +=07=0E=0C=A45=A2=F38sq=F5ip=EB *=C3q=C8NT=E2L=C7I=A8=86=D1$=AB=CA=B4d!9*= +=8D=81=ED=09=AC=88B=02=11=0BpA=13`=9EET=04!=C9=E4A=E3dB=A7=D2B;=99{N=C5=84= +=08=12YrH[@=85=13=BC=14r=AE=00=10=04=96=82=D2=AE=87=C8=C0"=B3=D1=11=80=C6= +=0D=FC=1AM8=DE)=8B=F4=C1=A6=8E=0D=FC@=0BA=A7=F0=E2=18=0Ex=AC=9D=F8=84=D6=10= +=04=19=F5@=10=DC(=AA=CCt=AE=05L=13=F0=CD=1B=EEmRM=1F=0C=80=C4=D9=08f=02N=A0= + =1B=B5=E6=04=04=00;= +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: q-p vs. base64 test + +Received: from thumper.bellcore.com by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA18271; Sat, 26 Oct 91 06:35:15 -0700 +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id <AA13322> for mrc@akbar.cac.washington.edu; Sat, 26 Oct 91 09:35:12 EDT +Received: by greenbush.bellcore.com (4.1/4.7) + id <AA01130> for mrc@akbar.cac.washington.edu; Sat, 26 Oct 91 09:35:10 EDT +Date: Sat, 26 Oct 91 09:35:10 EDT +From: nsb@thumper.bellcore.com (Nathaniel Borenstein) +Message-Id: <9110261335.AA01130@greenbush.bellcore.com> +To: mrc@akbar.cac.washington.edu +Subject: Audio in q-p +MIME-Version: 1.0 +Content-Type: MULTIPART/MIXED;boundary=hal_9000 + +--hal_9000 +Content-Type: AUDIO/BASIC +Content-Description: I'm sorry, Dave (q-p) +Content-Transfer-Encoding: QUOTED-PRINTABLE + +=EA=EE=F9=FD=FB=F7=F1=E9=E3=E3=E2=E4=E7=E7=EC=F3=FD=FExwsomhca`]]^\ZYY[^c= +k=FA=E9=E4=DD=DB=D7=D5=D5=D7=DA=DC=DD=DE=DE=DF=DF=DF=E2=E4=EB=F2=FCpmh^\Z= +YYYXZ\^`dghhkmmnuy=FE=F4=EB=E4=E0=DD=DC=DA=D9=DC=DC=DD=DF=E3=E5=E3=E0=DF=E0= +=E4=EE{jf_[YVUWZ]_bfmy=F8=EF=EA=E4=DE=D9=D8=D5=D5=D6=D9=DE=E5=EFynomiea`_= +_cfcba^\Z[aku=F0=EA=E4=DE=DC=DC=DD=DF=DF=E0=E5=EA=ED=F4=F7~tz}=7F=FC=FE}|= +=FE=FDzzvpmlou~=F4=EC=E5=E1=DF=DE=DF=DF=E7=ED=EF=F6=F7=FA=FExqmf^XSQPQSVW= +VX[cu=F4=EA=DF=DC=D8=D3=D0=CF=CE=CE=CE=CF=D1=D5=D7=D8=DB=DE=E5=F4tf]XRPQR= +SSTVY]bo~=EE=E7=E1=DF=E1=DF=E1=E5=E7=EA=EC=EA=EA=E7=E4=E5=E6=E5=E8=EF=F4=F9= +{kee`\^___afgkpz=FB=F2=EC=E4=DE=DD=DC=DC=DC=DE=E3=E6=E9=ED=FEonjlrplhgmlj= +npqsz=FA=F3=ED=E8=E8=EC=EE=EE=ED=EC=E4=DE=DE=DE=E7=EE=F4xlb\YWWUVX[]_bhs=FE= +=EF=EB=E8=E2=DE=DC=DC=DB=DD=DF=DF=DF=DE=DC=DB=DC=DD=DE=DF=DE=E0=E8=F6voic= +_^[YUSRSVW[\]^dp=F1=E3=DB=D6=D3=D1=D1=D1=D1=D5=DA=DF=EA=EF=EF=EF=F5=FFwkg= +c]ZXVUV[an=7F=F7=EF=ED=ED=E9=E6=E5=E4=E4=E3=E5=E5=E9=F3=FB=FCzmjjihjlppqz= +=F7=EE=E8=E1=DF=DF=DF=DF=E4=EA=F8vtqs}=FDzwskihddgijhilrz||}=FD=F5=ED=EA=E8= +=E8=E3=E1=DF=DF=E5=E7=EE=F0=F4=F4=F4=F9=FA=F9=F7=FEnia]\YWUSTY^dmz~=FC=F1= +=EE=E8=E0=DC=D8=D6=D4=D2=D0=CE=CE=CE=CF=D0=D3=D6=D7=DE=E8=F8vj`[VSOLJIHGH= +HJLNQV[d=7F=E4=DA=D2=CC=C9=C8=C8=C8=C9=CA=CC=CD=CE=D0=D3=D6=DA=DF=E9=F9yu= +oha\VRONMLLLMPW]gr=F6=EA=E1=DD=DB=D9=DA=DB=DB=DB=DA=DA=DA=DA=DC=DB=DE=E3=E8= +=ED=F4wqjc`_bdbda_bged__cccchr=F6=EA=E6=E3=DE=DB=DB=D9=D9=D9=D7=D5=D5=D7=DA= +=DF=E7=EE=FCrrnd^[YTSTVW[^biv=FB=F4=F2=F0=EB=E9=E6=DF=DC=DB=DA=D8=D9=DB=DD= +=DF=E3=E7=EC=F0=F9=FEqhd__^\ZWUUSRRVZ^do=F3=E7=E0=DC=D9=D7=D4=D3=D1=CF=CE= +=CE=D0=D4=D7=D8=DA=DC=DF=E5=EC=F9}umic\WVTSRNLKLNOUY]bio=F9=E9=DE=D9=D5=D1= +=CE=CE=CE=CE=CF=D1=D4=D7=D8=D8=D9=D9=DA=DB=DD=E6=F6tdYSONMMLLLNPSY^dk|=EF= +=E6=DE=DA=D7=D2=CF=CC=CA=C9=C7=C7=C9=CA=CC=D2=DB=E8xcVOLIGFGHIJKLNOT[_q=EC= +=DE=D5=CF=CB=C7=C4=C3=C3=C3=C4=C6=C8=CC=D1=D9=E3=F3i[TOLJIHHILNQV[ao=F6=E7= +=DF=DC=DA=D8=D7=D6=D5=D7=D8=D9=DB=E0=E9=F2=F9=FDxnjjfehlmlmrpoqw=FF=F3=EF= +=EF=EF=F4=F2=F0=EC=E7=E6=E3=E0=E0=E4=E9=EC=F5|og^ZWVVUSRSTW[_n=FA=E6=DB=D7= +=D3=D1=CE=CC=CA=C9=C8=C8=CA=CC=CF=D5=DB=E8x`XSPNMKJIJLMNPSY]f}=EE=E5=DD=DA= +=D7=D4=D2=CF=CE=CE=CE=CF=CF=D2=D7=DC=E2=EB=F7zpjea^ZYZZZ[[\]][Z[]agr=FA=EA= +=DF=DB=D6=D2=CF=CE=CD=CB=CC=CD=CF=D6=DC=E6=F6se]WRNKJIIIJMSX\aq=ED=DF=D8=D2= +=CD=CB=C8=C8=C8=CA=CB=CD=CF=D3=D8=DD=E2=E8=F2ug_[VPNOOOPPPONMMNQV^k=F4=E0= +=D7=CF=CB=C8=C5=C3=C2=C2=C4=C7=CA=CF=D6=E1=F6i\UOMJHGGGIKMQZfz=E7=DE=DA=D7= +=D6=D5=D2=D2=D3=D4=D5=D6=D6=D8=DB=DE=E0=DF=E4=EA=F1=FEsib\YUTSTTUXY\`m=FF= +=EE=E6=E3=E0=DE=DD=DF=DF=E4=E7=EB=F6=F8|=7F=FD=FB=F1=EE=EE=EE=EF=FA~~|uun= +jooox=7F=FFxyutnmms=FA=F3=EC=E6=DF=DA=D7=D3=D2=D4=D6=D9=DE=E9=FDi]XTSROOO= +OQTW]`jr=FE=F1=E8=DC=D7=D6=D5=D5=D6=D9=DC=DD=E0=E4=E6=E9=EB=EE=EB=E7=E1=E2= +=E8=EB=EF=F6|qjig_\[ZYXY\]_hy=F3=EC=E8=E5=DF=DD=DD=E2=E7=E6=E5=E7=ED=F6=FB= +~vmhfb^\[[^beq=FC=EA=DF=DB=D6=D2=CF=CF=CF=CF=D0=D3=D7=DE=EA=FEk`]YWUQONML= +KJJMOU[dz=E7=DD=D7=D2=CF=CD=CD=CC=CA=C9=C8=C9=C8=C8=C9=CB=CE=D2=D6=DB=E7=FC= +k]WSNKIFDCCDEGJNSY]`p=E9=DF=DB=D7=D4=D0=D0=CF=CE=CE=CD=CD=CE=CE=CF=CF=CF=CF= +=CF=D0=D3=D7=DA=DC=E4=F9l_[WROLKIHHHILPVZ]h=F9=E8=E3=DF=D9=D1=CD=CD=CE=CD= +=CC=CA=CB=CF=D6=DC=E5=F6sg]WSQRTST[fgban=EC=E2=E4=ED=E5=DB=D7=D8=DE=E3=E0= +=DB=DC=E5=F7ptld\Y[\]]]cl=FF=F6=F3=EC=E7=E4=EE=7F=FA=EA=E1=E2=E9=E3=DC=DC= +=E0=ED=F5=F1=F2=F3=F8z}=F8=FB=F1=F8vomptjb][]a]WRRV[][\n=F9=FC}=F8=E7=DE=DB= +=D9=D6=CF=CE=CF=CF=CE=CE=CD=CD=CD=CE=D2=D6=DC=E5=EEyjaWONNQOMKKMOQSWZ]_dj= +u=EF=DE=DC=DB=D9=D6=CE=CC=CE=D8=DC=D9=D9=DE=EE=7Fz=F0=F7loz=FC=FFnikv}np=F2= +=EE=F9vq=F1=E8=ED=EF=F0=F6=F8=F8=F2=F8=F8ujtyi__iodVR\hb]bp{tdds=FD=F9=ED= +=DF=DC=DE=DD=D9=D0=CD=CE=D1=CE=CB=C9=D0=DC=DA=D8=DFgUQRUMGHNOKIJOY[V_=E2=D2= +=CF=E3WP=DB=C2=C7=ECa=D9=BF=C6=DE=C7=B6=B8c9B=CD=B5=BC=E5w=DDjG;25Be=EBmV= +EBEGJ`=E0=DB=C5=B7=B2=C5F>_=BC=BA=DAOV=CB=CCTEQ=D1=C5=D2=FB=EA=CE=C9=E0U]= +=DF=D0=D5w`mp}YEGHg=CFVEBL=D9=F0UIONA=CD=B9=AA=B32+/=CF=A9=AD=B7=C3=B4=B2= +o/'.F=C8=BD=C1=C3=CF=EDG;:Em=CE=C2=C3=C2=CC=ECRA>?KZd=FF=DC=D5=E3cXn=D9=CE= +=CE=CF=CF=D0=DA=ED=F7=E5=D9=DD=F5z=E8=DFvYXbyo][gjVMOTXWa=E5uk=DF=DC=CE=E1= +]=EA=CB=BEY?=C5=BB=B7=BF<37k=C7=DA=BA=B9=BF=C1O0-6AX=D8=C3=BE=C2=DFE?GUh=D4= +=C3=BC=BA=C4=DCSB?AMq=ECd=DB=CC=DDeP=EC=CE=C7=D6_=D5=C8=D9^]=E7=DA=E2\[=FA= +=E0mZfs=FBb_dp^KLOc\K`=DD=D7=F4[=DA=CE=D8pL=CB=BC=BD=BFJ<;N=CC=CF=BB=B5=B7= +=BBu:/5<J=EE=C2=BC=C1=CFUE@DO|=C9=C0=BE=C4=D7]D?=3D?G[=D8=CD=E8u=CE=CB=E8[= +t=CA=BF=C6=EC=EF=C8=C9wOi=D6=D9cPc=EAkLKb=F1^IK`uVIKf=E4te=F2=DE=D3=D4=D7= +=D6=EC=E7=C8=BE=B5=BFH8?=DE=CB=D5=C7=BB=B3=BDP618:>Y=CD=BF=C4=E2TIILMg=CE= +=C0=BE=C6=D6mNF@BKZ~=E1=D2=C9=CD=E8p=E4=C8=CC=E1=EA=CB=BE=C5{X=F8=CF=EFNO= +=FE=E0^JK\[JDLXYOM[=FEqiw=E5=DA=CE=CA=D2=D7=CB=C8=CA=DAW=F2=C4=B7=BAY:<o= +=D7mU=D4=B8=B7=DB>5;<;?]=CC=C4=CFeOR]Za=F5=CD=C0=BF=C6=D1=EB\OKMS_u=DC=CC= +=C6=CB=DD=7F=EE=DA=E0la=F0=D9=D9sUUa`VSZgum_^cf_^ao=F8=EF=EE=F2=EC=E6=DF=D7= +=D1=CF=D1=D4=D4=D6=D9=E2=F1gZm=DF=CF=DBWECO_fgw=D8=CE=D3=F7TKIO[m=F7=F4=ED= +=EA=E2=DF=DE=DC=D8=D4=D1=D4=DC=E7ue^]^]XSQTZ_m=F1=DE=D7=D4=D3=D1=D1=D3=D9= +=DE=E8=EE{f_an=FB=F8xoruoia]]][ZZ\_j}=EC=DF=DA=D9=D8=D8=D7=D8=D7=D8=D9=D9= +=DE{k=ED=DA=E3bNJN\]VYl=E3=D9=D9=EEc\\amujghms=F0=E3=DA=D0=CD=CB=CC=D1=DC= +=E5=EC=FBk]UMHFGKOYe}=E1=D4=CD=CD=CE=CF=CE=CE=CF=D6=DE=E6=EF=FBu|=FC|=FEx= +jb^ZVUROPPQSW\_k{=EC=E4=DC=D5=D2=CF=CF=D5=DC=D1=C7=C7=D4=F9`\ixk~=DA=CF=CF= +=D7=EE]QQPPQNKKORWb}=E3=D6=D0=D2=D5=DA=E0=E5=ED{e^[SSUYd=F4=DF=DA=D0=CA=C8= +=C9=C8=C8=CB=CD=D7=EFpja\[\YWWSRSRQQSSTVX[fv=F7=E8=DC=D6=CE=CB=CB=CC=CB=CA= +=CA=CF=DE=E6=D7=CF=D4|PJJJKLT{=DC=DE~]RONQ[dlnlo=FE=E6=D7=CE=C9=C4=C2=C3=C6= +=CB=D1=DA=E5w_QJEDDDEHO\o=E7=DA=D1=CB=CA=CC=CD=D2=DA=DF=E7=EB=E9=E9=EC=F2= +=F6=FB=7Fxroie]XUSUVW[]`go=F8=E9=E5=DE=D9=D7=D5=D5=D5=D8=E2=E4=D9=DB=E3=E0= +=F5o=FDeYcpy=E9=E4=ED=F5p_XSRRVZXTW]dx=EC=DF=D8=D5=D6=D5=D2=D2=D5=DA=E0=E9= +w_YY\eq=F7=E8=DD=D9=D9=D7=D4=D5=D8=D9=E4=FBl^YUUUWYZZY]_bjmppnku=FE=F7=EC= +=E7=E2=DC=D9=DA=D9=D5=D0=D2=D5=CC=DAai=F3=ECg\fjphVNS[\[]q=F9z=FC=F3=FA=E7= +=DB=E1=E7=E1=DE=E8po=F1=E9=E8=F2=FE=F7=EC=F6g^g=E6=EE`l=F3=F5=EEe[=FA=EF~= +ia=F9=EDm=FDn=F0=E3{=ED=F0=E1=EB=F1{|=E8rl=FDp=EAs=FDz=FD=DD^=DFqz=DCZ=DC= +wt=DDR=F4U]cT=F7e=E1=F6zm=EE=EC=F4=DD=FA=D2=DF=E0=DA_=D6=FA=EB=E3=EE=E4=FC= +=F8jyx^}^|=FB^]`[d]Zk`a]ckk=F6a=EFzy=EBv=DD=E7=DD=D5=EA=D5=E9=DC=D3=E2=CA= +=DB=D0=DA=DF=DF=E1=F6=F0=EAy=EFn^\LbSkmS=F0L_TUePh\l=EE_|w\=DFo=E3=E2=EC=D0= +=DF=D7=D8=DA=D7=D6=D3=D5=D5=D4=EB=D4^=E0j_=EASyTg\[]KZM[ZU=FFW=EA_=E1=EA=FA= +=CF=FA=CC=DF=D2=D3=EC=C6=F7=CE=DB=D9=CD{=D0a=D5^=F5]TiKvIaWIfG^NQoN=D9^=E8= +=FE=E6=D8=E4=D9=DF=D3=D7=D0=D8=D0=D4=D3=D8=DC=DC=DC=E9=ED=F5=EA=E6hk_^ZVS= +XO\RVOWOfVd=FF=F5=DF=EF=D9=E5=CD=DC=D3=D7=CF=D2=D3=D9=CF=E6=D9=F3=EB=E8_s= +NkKbO_[d[_=FC^wxw=E7=DF=EB=DE{=D5c=DBq=E0=DC=FF=DEx=DF=E3e=FCX}]=F8sl=E7_= +=E5^=EFZl=FEe=DDW=DDo=E4=DD_=CE=FF=D1=E0=D6=D5=FC=D6ml=EEO=F5L=F1SYdJ=FFH= +rN=FFXnmy=F2=ED=DD=EB=D2=DD=E2=D1=DD=D2=D7=E3=D7=E5=D1=F4=DB=E9=EB=E8g=E7= +Tp\crfdjf=FB[gUgeZ=ECZ=E8i=EAy=EA=EF=FB=FC=EF=F6u=E7=F6=EEm=EBk=E4=FD=E0l= +=DC`=E9agkq=E9|=DEz=DA=E4=DE=EB=E0=E6=DDu=E7f=F2s^[h^hcW=EAi=F8tk=E4=FCk=DA= +X=D7W=ED=FE=E7=DC]=D7g=DB=F4r=E0g=E8va=EEb=FCW=DFb=F0y=E7=ED=FF=F1=EC=EF=F2= +=F4=EDm=E8ok[=F5{Z=E5L=E0]u^\=E0=FE=DBi=DF=DE=D6=DC=DF=DD=E9=F9=DAh=D0k=E9= +n=DF=F1b=F7Z=DAV=F1\\=EES^S^_Q_Qlq]=E2{=D4=F6=E1=DC=EB=D9=DB=F6=DC=EF=DA=E3= +=E7=E7=E3=D9=E0=FA=DC=EEy=E0Z=EE=E6|=F6\=E4omzOVoM`N[=F1Y=DAT=E4=F6t=E9Z=D8= +e=D3]=EA=E5=FF=DCo=F0=D9=D3=EE=E1=D7n=D3m=F8=F8kja=EEh=DBx=EA=D2f=D1i=EBr= +gtqVQ^QoN_Uea[]`=D4h=D7w=F3=DF=D5~=DC=DE=E5=D5=D8=F9=D0=EF=CEx=D5=DA=DA=F0= +ocxm=E7=EFV=EDaqoJfM^=FCRmV=EFu[=7FU=D2X=EAjg=E4=E3]p=ED=DEu=E2=E7=D8=E0=CE= +=DC=D1=E0=CF=DD=D9=D4=E6=E6=DEl=DAh=F8=EDR=F8K^PZYITNR=FEIyao=FCh=DD\=DD\= +=DB=D6=F3=DE=D7=D6=D8=DD=DF=CE=CF=D7=D3=EA=C2=EC=D4=EB=EF=DBT]i\=E4JXAQLF= +TLj\=E3n=EFhm=EB=E6=DD=EA=DE=D5=D4=D0=DC=CE=CB=D1=CD=D8=E2=DA=DE=EE=DFjid= +Y]MNJONIXQYOOZ=F9p=E3j=CF=D5=CA=D7=D2=CE=D7=CC=E0=D2=D0=C9=D9=CF=DB=CE=D3= +=EAUvi=EEYKS`pMMI_[POKSWY]X^=7F=F0=FE~=FD=DC=D0=DB=CE=CD=CD=C9=CF=CF=D0=C6= +=D2=CE=C9=E0=CC=F0pmjsSYJMVNLBLPLTG\^=F0_o=E9=DF=D4=E9=D8=DB=D6=D1=D4=CD=D0= +=D7=D0=CE=CC=D6=D4=F6=D8=DD=E2=EBbej=FA^XRNXUNJHLR\S]u|zit=DE=D8=FE=EE=D4= +=C7=CB=E6=F4=D5=C2=C6=D5=E0=D8=CB=D5he=EE=DA=E6XNX~gSNN^SHJMNW_PZ=D9=D9=E0= +x^=FB=D3=CA=D9=EA=D5=C8=BF=C7=DE=E2=D1=C7=C9=D5=ED=E7=DA=E1hVQW[UJFIHIFDE= +KSNP^=EF=DFx_=E4=CB=C2=C4=CC=C4=BC=BB=BD=CD=E0=BD=B9=C8=D5=EDdmH8Ab=E3=E0= +iORI:303;FOi=E6=CF=C7=C4=C7=C5=C0=BF=BE=C3=C2=BC=BC=D1LDw=C6=CAfLx=CA=D1= +R@L=DF=CE=E6\X^XIBBFN^]Z^e=EA=E6mQU=FB=D9=CB=CF=D1=CA=D5=E9=C3=BE=BF=BB=CE= +L>Fe=CB=BC=BE=C4=C6=CEZ</,/7AX=ED=D6=CF=CA=CE=DB=EAv=E8=DB=CD=CB=CD=CB=C6= +=CCoPHRagfj=DD=D3=D7=E2=E7=DD=D2=D3=E0o\SNNLO]=FA=EA=EA=F5ueh=EE=DD=DF=EF= +iZ^=E2=C9=C6=D1=E5m_=D4=C1=D3b=FD]B?>Ao=BE=BB=C6=CDo?776:K=EE=C7=BB=B8=BC= +=C5=CE=DA=E1=DE=D5=CF=CB=C7=C6=C3=CFY@9;BLLNd=FA=E9=E8=F9=FE=EC=D7=D4=D8=DF= +{ge=7F=E7=D7=D0=D5=DA=DF=DE=F1_RSm=E3=DF_LJQq=DB=D1}H=3DR=C8=C7=C7=D1K><L=EE= +=C5=B2=B6=BE=BF=DEF746>d=CB=BF=BC=BE=CB=E1=EDk_|=DB=CE=C8=C5=CA=D2=E5O=3D9;= +AKX_m=DD=DD=E2=E5=EC=DD=DD=D8=DB=EA=ED=F6=EE=F5=E5=D8=D4=D2=DE=FFc^]VTYg=E9= +=DDsSLN[=FD=DA=DC=EF_Lu=C6=C5=C3=CDT>9D{=C2=B0=B3=BD=CAj@789@q=C7=BB=BB=C0= +=D3YOPO`=E4=CF=C7=C6=CB=DA=F6J:8;IYo=EA=EC=D3=D0=D8=D7=D9=D6=D3=CF=D0=E0= +=F0ut}=EF=E5=F5|ja`ZVOOWZ`{=F5n_UQ]=E7=D1=CE=D2=D7gn=C4=BF=C2=BF=E4D:=3D^=CA= +=B2=AF=BC=CD_?4479J=DF=C5=C1=C9=D9XKPVk=D7=CB=C8=C6=C6=C9=D9VB>CUjl=F1=E0= +=D8=DB=DC=DB=D7=D1=D3=D8=E3=EAu]^`=FD=DD=DC=EEcYVUPOQS]o=EF=F0`]^`=E8=DC=D7= +=D7=D7=D4s=DB=C0=C2=BF=CBN;7E=EC=C1=B2=B6=C3=E1M<58;Bn=C9=BD=C0=CA=DFON\l= +=E4=D6=CE=CC=CA=C7=D3YA=3D>DQU\=EC=D3=CF=DA=D8=D9=DD=D7=DB=DF=F1=E8=E8m~=EC= +=E0=E2=F4yce`TOR_q=FFxlfhkis=EA=DE=E5=E4=DCj=E4=C3=C2=BF=CDI:8M=D4=BF=B3= +=B9=C6=DDO>56<H=E2=C4=BE=C9=DCrMNXa=EC=DC=CE=CA=C9=C9=EFH?AM[^]j=DB=D4=DA= +=DE=DB=D1=D1=D5=DB=EE=F1=EF=EB=E7=E0=DC=E3=F5zovmaVNTcqhZW]fnlegppfV=E4=C2= +=C1=BE=CCL<;T=CB=BC=B3=BA=C4=D2[D97=3DI=F7=C8=BE=C4=D6=FD_]dj=F5=E1=D9=CD=CD= +=D1=FEF;<GVTOX=F5=DC=E2=E8=DF=D1=CA=CB=CF=DA=DF=E3=ED=EB=E1=DA=D6=E0=F7=FB= +=EF=E8z]X[hh^ZRU^mvbYXYX=FA=CB=C7=C6=D6L>>X=C9=BC=B7=BA=C1=CBrI=3D:@O=F3=CB= +=C4=C8=D4=FAd[Z]i=EC=DF=D4=CF=D5sIADHNOQg=E4=D6=D7=DA=CF=C9=C7=C9=CE=D5=E1= +zeao=F0=F6xy=F8r[ONRY`d`_eo}=EB=E4=EA=E8{]=DF=C7=BE=BE=F0?<H=DA=C3=C2=C2=C2= +=C2=CC_@76=3DN=EA=D0=CD=D1=DC=E8=F3wj_n=E5=D7=CD=CB=D7YEFR^TLU=E5=CF=DAjk=D9= +=C8=C7=CC=CE=CE=D6=E8l`]]l=E9=DC=DF=EFiXPUZVOMS`ldd^MU=D8=C3=BD=DB?;L=CE=BF= +=C1=C5=BF=BA=BC=CDU=3D:@R=F6=DE=DB=D9=D5=D1=D7=EBcX]n=EF=E7=E8xSECKRROY=ED= +=D3=D2=DC=DF=D8=CD=CA=CC=CF=D2=D4=D9=E9ynr=FB=FCsi]UR\rcNISvyZTUd=DD=CC=C3= +=CCN<E=DE=C1=C3=CD=C8=BC=BA=C7dA<>I_=FC=F9=E4=D7=CF=D3=E9k^`=FC=DD=DC=E9=F6= +=F7gOFGMX_i=F0=DC=D9=D8=D3=CE=CB=CC=CF=D3=DA=E6v_Z\dq=F2=F0=FFk\\i]MIL\xx= +^Y=E8=CB=C2=C9V<?y=C7=C5=D0=CE=BC=B6=BD=E5G>BINQTj=DF=D3=D4=E4=F6=F9=EB=E5= +=EB=EE=E8=DE=FBRIHJMO\=FA=E0=D9=DA=DA=D3=CB=C5=C7=CD=CF=CF=D6=EFf`hl_[]]Y= +V[\QLR_cWONi=D2=C9=CDoKO=E3=CB=CC=D6=CD=BC=B6=BE=DDQKOMHFLe=E3=E2=FAm=FD=E1= +=E4rk=E8=DB=F9[Y\TNOYglgm=EA=D8=D4=D5=CF=C7=C2=C5=CB=D4=DC=E1=F0{gguj`n=EE= +^KLX\SR\V]=DC=D8=FDQDESu=F3=F7=D7=BF=BA=C1=D2=7FgaOHHU=E6=D7=DE=DC=CF=CD=D1= +=D7=D0=CA=CE=FBc=F4=FEL?CQXKBL=EC=DCn_=DB=C7=C9=D4=D4=CB=C9=D1=E9=F5=EB=ED= +vkt=EB=DF=EEh`ce\TXWJ]=D6=E5[PRYVTZ=EA=C6=C1=CB=CB=C9=D2uSPOMQXby=E5=E2=DE= +=CE=C6=C8=D7=D2=C6=CB=F6XUWOF?CQSOX=FC=DE=DF=E0=D6=D3=D8=DB=DA=DC=E4=E4=DF= +=E7=E1=D6=CE=CE=E1=EE=DA=D9=EEn=E8=E8Tk=D9cUQMMFAH\pZ[=E4=D3=F1X[uaMOt=F2= +q=EB=D4=C6=C1=C5=C4=BF=BD=C0=C9=CA=D2=E4eNIFCBFJMXl=EC=EB=F8=F1=E0=DC=E5=FB= +=F7=EC=7Fh=FC=E7=F4ff=ED=DD=E6=FB=DE=D7w=DB=CC=EC~ra]OJNg=EF=FD=EC=DA=D5=ED= +nkd\VV[YYeo=E5=D8=D4=CE=C9=C5=C8=CA=CB=D0=D3=EBdXMHCBDKOXi=EB=DC=D5=CF=CD= +=CF=D2=D5=E0=FE|d\\UT^n=ED=DC=F2=E6=C5=CFm=EA=DD=F2h[]=E6=DC=EA=DC=CD=CD=D4= +=DE=EFzePLLHDFHKWV_=EF=EC=DC=D3=D4=D6=D6=D2=DD=F4l`_]]f{=EF=E1=D9=D2=CC=C7= +=C4=C3=C2=C4=C7=CD=DF=EBiQPICFHKJIsmO_iZTTVb~=EF=E5=D9=D1=CE=D0=CC=CC=CC=CE= +=CF=D0=D4=E8=FEz_bj`o=FA=F2=FDpm`cZONMHGGGJOXo=E2=D5=CB=C5=C3=C0=BF=BF=C1= +=C4=C9=D1=D9=E0lVYVOMXwTY}fUUX]Y^jw=FB=E4=E6=7F=EE=E7=FCw=EC=EA=E9=EB=E1=EB= +=F5=E0=EC=EF=E1=E6=DE=E1=E4=E3=E9=F2jZTNKIHGJLS\l=E9=D7=D0=CD=C9=CA=CA=C9= +=CA=CD=CE=D2=D9=DE=F9}=EDaj=D4m_=DD=FAZc`Y]idowvk_\]YVbd]etea=FEsl=EC=EC=DF= +=DE=E1=DD=DD=E2=DF=E8zlj[YYZ]en=EE=DE=DA=D4=CF=CF=CF=CF=D1=D7=DA=E3=EB|_[= +[UTOf=F9Xj=E0=F2=FC=E2=F2=F0=EC=F6{=F2=EE=EA=F9|=F6=F2omve\^d]]mof=7F=EB=E6= +=EC=E6=DB=E6=ED=EBtcf_[]\\`ho=F3=E8=DD=D4=D4=D1=D1=CF=D2=DA=D9=EEpng_[]YR= +^=E9jb=E3=E7=F7=E4=F1=FD=E8=E2=EB=E1=DD=DB=DC=E4=EA=EF=F9qtkc^_[[\Y_a_emj= +eimsonla]]Z[_g{=EE=EA=DE=D2=CE=CC=CA=C9=C8=C6=CA=CD=CE=D5=E0=EA=FCo]VTSWS= +RYYVZ]]\]_lyw=F3=E8=E4=E4=E0=DF=DF=DD=DE=E0=E1=EC=FA|of^[Y[\^fkkr~=F8=F4=F5= +=ED=E5=E1=E6=ED=F4~=FD=F6=F2=ED=E7=E2=DE=DC=DD=DF=DE=DF=E3=E3=E8=EE=F5yss= +upkhgfcaaa_ccdhkruusroux|=F6=ED=E9=E5=E3=E1=DE=DE=DF=E2=E8=EF=F4=F9=FDztm= +igd`^^^^]]]^`k~=EF=E5=DE=D9=D5=D3=D3=D5=D6=D8=DB=DF=E5=EB=EE=EF=F1=EE=F3=FD= +}{}xyz}zsuoh^YXXXXXZ^aimoptzwsqnv=FE=F6=EF=EC=E9=E4=E1=DF=DC=DA=D7=D5=D5=D6= +=D7=D9=DD=E2=EB=EF=FC|=FE~||umkgc_\ZXVVX[]_cioz=F4=E9=DF=D9=D6=D5=D5=D3=D5= +=D9=DC=DF=E7=ED=F7qjd^]\ZXXWWWY[]cn=F9=ED=E8=E0=DE=DE=DC=DC=DD=DD=DD=DE=DF= +=E1=E2=E2=E6=EA=EC=EF=EF=ED=F0|rlg`^]\]^_bdhox=F9=F2=EE=E8=E1=E0=DE=DC=DC= +=DE=DF=DE=DF=E2=E8=F0=FEphc^]\[ZXWY[_el{=F9=EF=EC=E6=E4=E4=E4=E4=E7=E8=E7= +=E8=E7=EA=EB=E8=EA=ED=EF=F7=FFzxqmkijmoonlklmoz=F6=ED=E6=E1=DF=DE=DE=DE=DB= +=D9=D9=DB=DD=E0=E4=EA=F2zf^YWUVTRRRSTVWZ_hkx=F3=EB=E0=DB=D7=D2=D0=CF=CF=D1= +=D3=D5=D8=DB=DF=E5=E8=EC=F2=FEuvvunkd^\ZXWWWWY\_bgn=FE=EB=E0=DC=D8=D5=D4=D2= +=D2=D3=D4=D7=DB=DF=E8=EE~oe][YXY[]``_^^^]^ahp|=FA=F0=E8=E6=E3=DE=DC=D9=D6= +=D4=D3=D4=D6=D7=D9=DB=DF=E2=EE{qie`\YVVUTTUVZ]ajv=F8=E9=DF=DA=D7=D3=D1=D2= +=D5=D7=DB=DF=E5=EE_^=CBdDLQ=D3=DAi`_=EF=EBgmfiZ=E4=D3=DFh=F1=E4|=D7=E6=EB= +aTS=CA=BF=EFfH`=E8`h=F5k=F5i=DE=ED=F4TS=F9eji=DD=F9~dw=D6=FCTb=EA=DF=DA=E8= +=DC=D0=DFj=DA=E0=DEn=F2=DA=D1=DF{=EA=EA`WSYNNLS]NPY`ng=F6=DD=D7=DF=DE=D3=D6= +=D7=D5=DA=D5=D6=DC=DC=DB=D9=DC=D7=DC=DD=E5=EB=F5sb]fUUNNMKIKNQU]by=E4=E4=DD= +=DB=D5=CF=CE=D3=D2=CF=CD=D2=D5=D6=CF=D9=DE=EF=E5=E8s_fgWQQTQNNSZVV`rpj=EF= +=DA=D5=D8=DA=D2=CF=D6=DD=D3=D9=EBz=F5=DF=EB_[y=EEndn=EFx[Z^\X[\PTh=F0=E7=ED= +=DD=CA=C6=CE=D6=D0=CE=D7qetbNKORMLY|=F7=EE=DA=CE=C9=CC=D6=D8=D3=E1_SY\WUU= +J\=CE_=E5=C7sa`\=EB=EA]=E7=C7=CC=D8=E5=ED=D8=F8NU=FDiX[=EF=DA=EB=EF=D8=C9= +=CC=D7=D2=CE=D9nZPH>879>HEL=E2=CF=C3=BF=BE=B7=B3=B7=BD=C3=C6=CEhJOSJEIWc]= +e=EC=DD=EDf^^p=7FM?NNIOOh=C9=D1[=CC=B4=BF=C4=C7=DD=D6wO\=E3=DE=F2=DC=C9=CC= +`QaTD>ENOIT=F5=DD=E0=DF=CB=C5=C9=CD=CE=D2wNGFC<=3DLfd=F3=D7=C3=B7=BA=BF=BB=B9= +=BE=C6=E0YRRRH@M_oj\e=DE=DEg\fiYJHLe[K]=EDnr{=DD=CB=C6=D7P=E3=B5=C4Kc=CF=EF= +N?J=D2=C3=DB=E2=BC=B8=D9Q^`J?@Y=E8X]=CF=C6=CE=D5=CF=C6=C8=E1b_^F<<<<=3DJ\bY= +=D5=BB=C2=D6=C6=B9=BB=C8=E1=DA=C7=D1VY=D6=D0^[=E4=DDnSVrcHIXSHFKSUQSo=F1Y= +^=D9=D5=DB=D4=CA=C8~=CE=B6=C0\`=C3=C4a?Q=C3=BB=DEk=BF=B9x?ARD67Q=FDOR=D9=CA= +=DDj=EE=D3=DE[UqmMFOWTPa=D2=CA=E5=E1=C2=BD=C7=CE=CA=C3=C1=D0=7F=DA=CC=FBQ= +Zq_OJTZKBMZNIM\`UTl=EDw=EC=CF=CF=CF=CE=CD=CC=CE=CD=C9=C7=CF=D5=CFZ=F8=C4=DF= +JU=D8jD=3DD=EB=D2QS=CC=C6R>APF;?=ED=CF=E1=D4=BF=BC=C7=D0=CA=C4=CE=EC=EA=D4=DF= +aT\_OO^fOR=EF=D9=ECs=E9=CE=D5_[=ED=FA\OSgh_h=DF=E4=E9=DC=D4=DE=E5=E7=DB=E3= +sa=EE=EBni=F9=E2=E1{=F4=DF=FB`{=E4nZo=EAo=3DD=C0=C6D?=DB=C6`:?=D1=BD=E6t=BC= +=B5=CCTX=E8^>B=DD=CAks=C9=C3=DFVj=DCwNQ=F6=FBOKU]LFP=F9jP|=CC=CB=D2=CF=C5= +=BE=C5=DB=DA=CD=D6{ksxe_`d_\^[OMTSLMX\\^j=F6=E5=DE=D9=D6=D4=D0=D6=DB=D5=D2= +=D2=CB=CB=D0=D0=E2Q=CE=BD=FDCS=DAx>6F=DE=F2GZ=C7=CAOCQjI>S=D3=DC{=CF=BF=BF= +=D0=D5=C7=C4=DB~=DA=D5dOU[ODL=FFjHK=DF=D6p\=E8=CE=CF=F7=F3=D5=D0=FDi=E1=DA= +=ED=E2=D7=D2=DFuv=F4ePNWZTYgbZ_|=F8ig=EA=DD=F3y=F5=E0=E0=E4=F0=D8=CB=DF=F6= +=D6]=EC=BE=CFW_=E7=DFU>D=F4=D1n=F9=C7=C6=F4PNUK=3DBq=ED`=F3=CF=CB=D6}=DF=CD= +=D8w=EF=DC=F1\Y^XLNe=EF[S=DD=CF=D6=D5=CC=C5=C1=CB=D7=CE=CE~y=EFbXjke`WXjW= +LU^PNRTUQTanp=EF=E1=DE=D7=D4=DB=D2=CD=D1=D2=D2=DB=CF=D0=DB=E3\=F4=BE=D1P[= +=EF=EFUBEg=E4n=FD=CD=D0~XOJE>E\ce=DE=D3=D6=DC=E7=DF=DA=E5=E8=DC=DF=E7=E5=EC= +}|je=F3=EC=EDr=E3=D5=D4=DA=D2=CC=CB=D1=DC=ED=F5=EChSU_XW[YVVTWUPR]_\_ba=FD= +=E7~=F5=DA=D4=DD=E2=DB=D4=D4=DC=DE=D7=CD=D3=DF=D7=D0=DC=EAe\=CE=CAUMpvXIB= +M=FCh_=E2=CE=DC=FDdYPJENa\p=D6=D1=D3=D3=D4=D0=D0=D8=D7=D4=D7=DF=E3=F2hYSR= +Z\XTk=E0=E0=ED=E3=D6=CD=CF=E6=F6=DE=E5fmf`=F5=EEm=F6=F1c^bZZ\Y_vjZ[_hf]m=DA= +=D6=DE=DF=D5=CF=D0=E3=DE=CF=D2=F8=F0=DC=DC=EDnqa`=DC=E9VOW=F6^CAVis=F2=D3= +=CA=CA=D7|g[KJ\mj=E3=D0=CE=CE=D4=D3=D3=D4=DF=E2=E8=FDmcXOKKSVSQj=E4=DE=E3= +=DA=D5=D1=D5=D9=DA=D4=D8=E1=E1=E1=F7=FC=E3=DF=DC=EB=F6=F2=EAjVTUTTNMSRNNQ= +SX^u=F5^=FE=CA=D1~=DA=CB=CC=CA=D0=CF=C3=C5=D2=D7=DD=CD=C7=E3YYnbLCI\njo=DC= +=DBnXNJE?BKTW{=DC=D2=CF=D3=CD=C8=C9=CE=D2=D1=D0=DD=FDj__c_Z^=ED=E0=E7=DA=D0= +=CE=CB=D3=DD=D6=DCukjWQXVQTTTXYV[XSWXZcig=F8=E2=E6=DB=D2=D6=D5=CE=CB=CC=CF= +=D2=CD=D6=E9=DF=E5t=FE=F0hqnR=F2=CD[GQ_TNIL=EF=EDu=DF=CC=D2=E5=E2=EBo_NPb= +kc{=DB=D6=D3=D0=CD=CE=CF=CF=D4=E4=F9fWOKJOTOOn=DE=EB=EB=D3=CF=DB=E2=DF=E0= +=F1ljegghrx=FF}=F8=F0=EE=FE|=E7=EB~=F2=E9~m{=7Fq=FE=E6=EAn~=E6=E3=FBbt=F1= +{lgfmdSn=E6Mh=C3=EAMa=EE{=FA[O=DC=C7=D9=DC=C6=C4=D9=D9=E3c[OLPXU]x=EC=DF=DF= +=DF=DA=D5=D8=E5=F3u^YOIJOOKW=E9=E4=DE=D6=CF=CA=C5=CE=D3=C8=CB=DB=E4=E0=EA= +|s_cjbbdYPWVQY[V]e]`wv=7F=E6=E4=E5=D8=D7=E0=DD=DB=EA=F2=DC=D7=E0}=E9=D9=DF= +MU=CB=D7NMb`hTM{=CE=E5=EF=CE=C6=DA=DD=DB=F4dZY\eY]=FB=E9|=E9=DE=DD=DD=DD=E0= +=F0vd[QLIJGGNZ^l=DB=D1=CF=CE=CA=C6=C7=C9=CA=CF=D3=D3=D5=DF=E9=E0=F0z=F5=FD= +`_bUNNNKIIMOPT\_h=EC=DC=E1=DD=D6=D4=D0=CE=CE=D1=C9=C6=D2=DB=E7=E1=C8=D5XX= +=F3^OMJM[Z\=F9=DB=EE=EE=EAo`]ZZ]^aw=F1=EB=DF=DB=D9=DA=D4=D1=D6=DC=DF=EFcV= +VXNJSwqk=DA=CF=CE=CB=C9=CD=CC=CD=DA=E3=E5=FAfghfga^jb[YYTRSNJLSNO[dd=EF=DE= +=DB=DC=D8=CC=CA=CF=CD=C9=C8=CD=CC=CB=DD=DC=E4=D3=D6=FD[^hXOLK[d\\w=FAen_X= +WXSW\_l=F3=EC=E7=D9=D3=CD=CC=CB=CD=CE=D1=DD=EFqgZQUYYVc=F2=EF=E7=DE=D7=D6= +=D7=DF=EB=EDoii^YX`]]]bnuo|=EF=F6qx=F8{v=FA=ED=E9=DF=DE=DC=DC=DA=DB=D6=D4= +=DD=ED=DB=DAtk=F8_Nk=E6YNZZTOMObim=E7=D6=D4=D7=D6=DA=DF=EC{=F1=FAmm=EF=F6= +x=EB=E5=EA=E0=DD=DB=DB=E1=F0=FDmZOJKKNPXu=DF=D7=D5=CB=C5=C8=CB=CE=CF=D4=DA= +=E1=F7=F2qa[`a]]^^ZTQNMLKMQSXi=F9=E8=DC=D7=D5=D3=CA=C9=CC=CF=CA=C7=CE=DF=F4= +=D8=C6=DBV`=DDvOLRa\W_ztdgbYUTUZZ[g=FD=F8=E9=E0=DD=DA=D0=CD=CE=D0=CF=D9=E8= +=EFoZOZXTX_t=E3=D6=DA=D1=C8=CC=DB=DC=D6=F9^_[VNPTYZ_=FA=E9=E1=E7=E2=E5=ED= +=FEnpsg`ep{=EF=EF=F6~=F0=E6=F4=FD=F8}o=FAh\=E3=DEdo=E1=DF=FF=F9=ED=DE=D8=DA= +=DA=CF=CE=DF=ED=EEjXQOOPOOZ]`h=FE=E9=E4=DE=DA=D6=DA=DE=E9=F9qeYWX[_dw=E5=DB= +=D5=D0=CC=C9=CC=D3=D6=D8=EBog]WVSV\^g{=FD{=F4yifg]^b^i=EF=E6=ED=E3=D9=D8=DB= +=D4=D4=DD=E8=E8=E7fTk=EBcSZs\QTi=F8=F4~=E6=D1=D4=E4=E6=DB=E6dbrmdi=FA=EC=EB= +=EF=E3=D8=D5=D6=D5=D6=E2=7Fe^QHEEHIMUk=E1=D7=CF=C8=C5=C4=C4=C6=C8=CD=D4=DC= +=E7ud^[X\]\[YWXXNLNNJJOUZ^r=DF=D3=CF=CC=C4=C1=C2=C3=C7=C7=C1=C9=E4~=DC=EB= +VMS^\TR_lXMQVNILTVR]=F3=DD=DA=D2=C8=C2=C0=C3=C4=C5=CB=E0pfTH@CHIHNl=DC=D3= +=CE=C9=C5=C5=CC=D3=D7=DD=FBga\VRV_eck=F7=E8=EC=F8vweXTU[XU^~=F2=EF=E5=DC=D5= +=D0=D4=E6=D9=C8=CF|d=F4}[Vb=E8=D8=DE=E8=D3=C9=D7s|=EEhRPXYPMQ\]\k=E3=D9=DE= +=DF=DE=DF=FAg[TOIGKVg=FA=D7=CA=C4=BF=BE=BD=BD=BE=C4=CB=CF=DBrYPLJFDGJKKOT= +XXUTX]_\]=FF=DE=DC=D8=CE=C6=C2=C2=C3=C3=BF=BD=C2=D2=E9=E4=FAZMLQZVOPYUMKL= +NLJJOTX^|=DB=D1=CD=C9=C6=C3=C4=C9=CD=CE=D1=E6i]ZSNLO`{=EE=E3=D7=CE=CE=CF=D0= +=CF=D3=E2q^VQMLLPWY^dr=FA}vkgv=F5|o=FC=E3=DB=E1=E1=D5=CD=CD=D1=D7=D7=CF=D4= +=E4=E4=F0h[VTTUQUbjaaijf]W[egel=F1=DF=D8=D7=D4=CD=CA=CA=CC=CE=D0=D3=DDw^Z= +VLHIOWVVb=EA=DE=E2=E5=DB=D3=D7=E6=F5=E9=E6{`f=FE=F3|y=EC=DF=E1=EC=F4=F5p`= +fh\Z\hq^d=EF=DF=E4=F2=E5=D1=CF=DD=F1=E3=D3=DE]Td=F9mYWo=DD=E4mb=F7=E0=E9t= +i~=EA=EEmh|=EC=E8=F0=FA=EB=E2=DF=E6=ECze_[TOLLPTST^s=EC=E5=E8=D9=CF=CE=CE= +=CC=C9=C9=CA=CD=CE=CE=D1=DA=E1=E3=E7n[Y[YNMPRNKLMRPP\]cn|=DD=D4=D9=D3=CD=CC= +=CC=D0=CF=CD=D0=DE=ED=DE=D9=DFvh=FA=E6zYW_bWMMPTOMR]kyy}=EA=DD=D8=D8=D6=D0= +=CE=CE=D2=D7=D5=D7=DA=DE=E8=EF=F6tle]cb^]ZVUSRVYUR[krjo=E7=DA=D6=D9=DA=D1= +=CD=CE=D2=D1=CC=CD=D5=D9=DB=DA=E7no=F9oihbWOKKPOKKQ]`[^n=ED=EB=ED=DE=DA=D3= +=CF=D5=DA=D6=D4=D4=D4=D8=D9=D9=DC=E6=EE=EF=ECu[\__SLNTSQU[^iz=EE=E6=E7=DF= +=DA=D9=DE=E9=E1=D9=DA=DF=E5=E9=E7=E8=E3=DC=DC=DF=DF=DC=DD=ECrp=FFn[SVYTSV= +[]^cjt=FC=FE=F5=EC=F0=F6=F0=ED=EB=EA=F1=FC=FE=E9=DF=E2=E6=E6=DF=DE=DF=E3=ED= +=F1=F1=EB=EF{nk~=F9wklnnibfnmd_gjj_Z`b_ak=F5=F1=F6=E7=DD=D5=CF=D0=D0=D0=D5= +=DA=DA=DE=E4=EB=E5=E0=E9=F5=FF=FA{kb^^ZQONQOMOQW[[c}=EF=E8=E3=DB=D9=D8=D6= +=D3=CE=CE=D4=D7=D6=D2=D8=DF=E8=EC=E7=FEf_`da[ZY[]^_bq=ED=EF=F6=ED=E1=DC=E2= +=EB=F7=F0=F1}ncehm{jh=FA=E9=E7~dk=EF=FBg_emppn=FE=F5=E7=DB=DB=DB=DB=D9=D6= +=D7=DC=EA=ED=E6=EA=F3qhrqf`_gi]Z\__\X]mxifu=EF=EB=EB=EB=E5=E1=DF=D9=D6=D7= +=DA=E1=E5=DA=DB=E9=F0=F9=F7=FCj]Z]`a][^imkkj|=F7{st=F1=E5=E5=E9=EB=EC=E5=E6= +=F5=EF=EE=F0=F2vv|=FD=F8=FEtw=F6=E7=E5=F0=F8=EB=E3=EB=FEorts`Z\^\_jmoo~=ED= +=E1=E1=E6=E1=DA=D9=DD=E0=E1=E7=E1=DE=DD=DD=E8wgi_WUQPRRRUZ_k=EE=E1=EF=F0=DE= +=DB=D8=D9=E4=E9=DD=D9=DF=EC=F1=EE=E7=EB=F3=F6=ED=E6=E3=DD=DC=E6=EB=EF=EB=E2= +=F6nbj=F4gY\[__YVTWYYZ[[d=FB=F5=FA=FC=EE=DD=D9=D6=D5=D2=CE=CE=CF=D6=DD=DD= +=E8znnkg^\fjc]`m=FDwdbr=F1=FB{=FC=EE=ED=F5=FA=F8=E4=ED=FF=EF=FF=F8=F0=EB=EB= +=EF=E9=EE=ED=F5vmihe`ahkme^j~=F5}|=EC=DF=DF=EA=ED=E2=D8=DC=E5=DE=DF=E9=F4= +vkdb_[YY[ZZWVX_cm=F8=EF=E4=D7=D3=D3=D1=CE=CA=C8=CA=CC=CF=CD=CE=D8=DB=ECpm= +^ULHHGGEEIMORXYa=FC=E7=DF=DB=DA=D1=CC=CD=CE=CD=CB=CA=CD=CF=D8=DC=DD=E6=F8= +idc`_YTU]]W[^ftjfgg}=F6vrx=EB=DE=DF=E2=DF=D8=D2=D4=DA=D6=D0=D3=DB=DF=E4=E7= +=F1ohb^ZWVSOOTZ[UV]__\V[p=EF=ED=E8=E3=D6=CF=CF=D1=D4=D0=CF=D2=D8=DC=DD=DF= +=DE=DC=DE=ED=FC=FF=F6=F9f]cpf[YWXXWVX\]_^ai{=F9zz=F3=EA=E6=E6=E7=DD=D5=D4= +=D5=D7=D5=D5=D5=D4=D6=D5=D8=DE=E5=E2=E1=FA^Z[UNJFEHJKNNOYfx=F8=EC=DD=D0=CC= +=CB=CD=CC=C8=C5=C7=CB=CD=CD=CE=D4=DD=E9=E6=EFg^XYVLHIJKKKNSX[]jw=F1=DE=D6= +=D1=D5=D3=CE=CB=CD=D5=D7=D1=CF=D2=DA=DA=D8=DC=E2{lx`XZXWQONMLMNRXWZh=FE=FA= +=FE=E5=DC=D9=D3=D5=D4=CF=D1=CF=D1=D8=D9=D8=DA=DB=DB=DD=E5=E6=E7=F8=F4=EE=FB= +wjpna\USTQPQSVWUWZZ\dlp=F3=EF=F1=E0=D6=D4=D7=D8=D4=CE=CD=CE=D3=D2=CF=CE=D3= +=D7=DC=EC=FCrjf\TWXYZQT]_c\Zbokl|=ED=E4=EF=FBw=FB=EF=F5}n|=ED=E6=E8=F2=E9= +=DE=D9=DB=E0=E0=DC=DC=DF=ED=FE|qlhfa\]afeaeu=F8=F7=F9=7F=F2=EB=F9|}=FC=F4= +=F6=F1=EA=E8=E7=E7=E2=DD=DA=DE=E6=EA=EA=EFn^[aa[VQV^_YV]gf__n=F1=E9=E9=DF= +=D9=D3=D0=D0=D0=CE=CF=D1=D0=D2=D3=D7=DA=DE=DF=E8uc`hfYPQUVPNOVXUV[anrn~=F6= +=F2=EE=F0=F5=E6=DD=DE=E0=DE=DC=D9=D7=D9=D9=DC=DF=E2=DE=DE=E3=EB=EF=E7=E4=F3= +wljnnb]aeha\_cgecdjvz{y=FE=F2=ED=EB=F1=F4=ED=EA=EF=FEz=F9=ED=EB=ED=EC=E4=DE= +=E2=EB=F4=EB=EA=EE=F0=FC=FC{tpkc][Z[\_en|=FB=F9=FA=F3=EB=E4=E5=E7=EB=ED=EA= +=EA=EC=ED=EC=EB=EB=EC=EC=E9=ED=F1=EF=F0=FBwoica_ahjknpy=FB=F7=FA=F5=ED=E8= +=E4=E5=E3=E1=DF=E2=EB=F6=FFyyxtnkliiijjihea__^_dkr=FC=ED=E5=DF=DF=DF=E0=E0= +=DF=E2=E6=EC=F5=F7=F9xxz=F8=ED=EA=E4=E2=DE=DA=DB=DE=E1=EC=F8=7Fwl`[YYXWWY= +\^bcbgq~=FA=F1=ED=E9=E6=E9=F3=FB=F4=EF=EC=E9=E8=E4=DE=DA=D9=D9=DA=DA=DB=DC= +=E6=F1|ne\WVXZ[[^gljomo}=F8=F0=EF=EC=E6=E7=E7=E9=E7=E9=EB=EF=FAy~=F6=F2=EF= +=F0=F1=F0=ED=EC=F0=F6=F5=F3=F2=F0=FA=7Fwvvr||{uoidcegggghifhku=7F=EE=E2=DD= +=DB=DC=DE=DF=E4=E8=EF=FEoige`\[ZZZ\]do|=ED=E3=DC=D6=D1=CE=CD=CA=C9=C8=CA=CC= +=CF=D6=D9=E5=FAi]WQMKJJIGGGHKOSX^hx=E9=DE=D9=D4=D1=CE=CD=CC=CD=CD=CD=CD=CE= +=D0=D4=D6=D8=DC=E3=E5=EC=F0=FCoc^ZVVUVXXYYZ\^aelv=FB=FB}vty{{=F8=F1=F2=EA= +=E3=E0=E0=DF=DF=DD=DD=DF=DD=D8=D6=DB=E6=EE=F3=F3r_XWXXVW]h}=F6=F2=EC=E6=DF= +=DD=DE=DF=E2=E7=EC=F6=FEwprnmmiea^^^_ciqy=F4=EA=E7=E3=E2=DF=DE=DF=E2=E2=E6= +=E4=E5=E9=ED=EF=F0=F4=F4=FDunha_]\\\[\^dm{=F7=F4=EA=E3=DF=DF=E2=E4=E3=E0=DF= +=DE=DF=E1=E0=DF=E2=E8=EC=EF=F5~xnfb``adhnolmmmjeb^^__]^_behnu=F2=EC=EA=E4= +=DF=DA=D7=D5=D3=D3=D0=CF=CF=D2=D4=D5=D4=D5=D7=DC=E1=EC=FAsd[WUQOMLLKLNOTX= +YZ[^cm=FC=EB=E5=DF=DA=D6=D5=D2=D0=D0=CF=CE=CE=CE=CD=CE=CF=CF=D0=D3=D6=DA=E3= +=F1o`XSQOMMLKKLMOTWZ^gp=FD=EE=E8=E0=DC=DA=D6=D6=D6=D5=D4=D4=D7=D8=D7=D7=D7= +=D8=D9=DA=DB=DD=E3=EA=F3=FDyme]YWSNKJJMOOQTZ\_cj=FD=E9=DC=D7=D2=CF=CE=CC=CA= +=C8=C8=C8=C8=C9=CA=CB=CC=CE=D4=DB=E8=FEk_YRMJGEDBBCDEFGJMR\j=ED=DA=D1=CC=CA= +=C8=C7=C6=C5=C5=C5=C5=C5=C5=C6=C8=CA=CC=CE=D0=D7=DE=E9|_UOKGDBABCCCEHJMQW= +`t=E8=DB=D4=CE=CB=C9=C8=C8=C7=C7=C7=C8=CB=CD=D1=D8=DD=E5=EF=FEsgb^[\^`a^]= +[ZYYZ[]]\\]]``gmpz=F5=E9=E3=DE=DC=DB=DA=D8=D6=D4=D3=D4=D3=D3=D6=DB=E1=EB=FB= +nb\[ZZ[]_ejlnnnmoqt~=F2=ED=E8=E1=DD=DC=DC=DF=E7=F0|ojda^\[[[[_dhlpuz=FA=F4= +=ED=E8=E6=E6=E8=E4=E2=DF=DE=DE=DB=DA=D8=D7=D7=DA=D9=DA=DC=DE=DF=E5=ED=FDo= +bZSOLKJIJLNQTX]gy=ED=DF=D9=D4=D0=CE=CD=CD=CC=CB=CB=CD=CD=CD=CF=D2=D8=DD=EA= +=FDod]WPMKKJJJKMNOTY_ht=FC=EC=E2=DB=D6=D2=CE=CC=CC=CC=CB=CA=CA=CA=CB=CC=CD= +=D1=D8=DF=F2m]VPMLKKLLLMNOT[dp=FB=EE=E8=E3=DF=DE=DE=DB=DB=DB=D9=D9=D6=D5=D5= +=D7=D9=DA=DC=DE=DF=DF=E0=E7=ED}mb\XSPPQRPPSTUVZ^gv=F2=E2=DB=D6=D1=CF=CE=CD= +=CD=CE=CF=D0=D2=D3=D5=D9=DC=E2=EB=F5{ohc^ZWVWVXXXYZZYXWWXY[]_dm=FE=EC=DF=DA= +=D7=D4=D1=D0=CF=CE=CF=D0=D1=D2=D4=D7=DA=DC=DF=E1=E4=ED=F9ymifb^ZVSSRRSVXX= +WXXY^es=F5=EB=E3=DF=DB=D7=D3=CF=CE=CD=CC=CC=CE=D1=D5=D9=DF=EErd\ZWUSRRSUX= +[]^_`dem=FE=F5=F3=EE=EA=E6=DF=DD=DA=DA=D9=D7=D7=D5=D4=D5=D6=D8=DB=DE=E4=EF= +xi`\YVRQQRSV[^`hz=ED=E3=DD=D9=D6=D5=D6=D7=D7=DA=DD=DE=E2=EA=F8vljff_\YVTT= +VXXX[]_cm=F5=E8=DF=DA=D7=D4=D1=CF=CE=CD=CD=CE=CF=D0=D2=D5=D9=DD=E0=E7=F7n= +a[VQONNMMMNORVYcp=FE=F4=EC=E5=DF=DD=DB=D9=D7=D6=D5=D6=D9=DD=E3=EB=F2=FExq= +njhhhkns=FD=F2=F2=EF=EB=EC=EE=EF=F5=FB=FD~yz=FC=F3=EE=E9=E8=E9=EE=FA=7Fri= +fd`_]]\^acfmv=FD=EF=EB=E9=E9=E4=DF=DE=DE=DF=DD=DD=DC=DC=DD=E2=E7=ED=FCsni= +f_^^\\[[ZYY[]_dgmz=FE=F1=E9=E6=DF=DC=D8=D4=D3=D2=D1=D0=CE=CF=CF=D0=D2=D4=D8= +=DE=E2=E9=F7pb[TOLLKJIIJLMORUX\hnw=F6=EB=E1=DA=D7=D2=CF=CE=CC=CA=C9=C9=CA= +=CA=CB=CC=CE=D1=D5=DA=DE=E6=ED|oic[TOMLJJHHHHJKNSY]cl=FD=E6=DD=D7=D2=CE=CB= +=C9=C7=C6=C5=C5=C6=C8=CB=CE=D2=DA=DF=E8=F5qe\UPNLIHFGIKMPU[bjw=F8=ED=E6=DF= +=DC=D8=D1=CF=CE=CD=CE=CE=CE=CF=CF=CF=D0=D3=D6=D8=DC=E4=EExh^XQNMKKLLMOOSX= +\_er=FB=EB=E2=DD=DA=D6=D0=CE=CD=CC=CD=CE=D0=D3=D7=DC=E0=E6=EA=F3sje`]]]\Z= +Z[[]]]^_^^^__dhnw=F4=EA=E2=DD=DB=DA=D7=D5=D4=D4=D5=D5=D7=D9=DA=DE=E3=E5=E6= +=EA=EF=F4=F3=F8~{via^[XURQONNMNQW\ds=F2=E9=E3=DE=DC=D9=D7=D6=D5=D4=D5=D6=D7= +=D8=DB=DD=DE=E1=E2=E0=DF=E0=E2=E3=E5=EB=ED=EE=F7rg^ZWUTUWXY\^biot|=FB}wus= +ngiklo{=F0=E9=E4=DF=DC=D9=D8=D7=D6=D6=D8=D9=DA=DE=E3=EA=F2=FAwojhecbca^]]= +`cbbfiiklko=7F=F0=EB=E3=DF=DE=DD=DC=DB=D9=DA=DB=DD=E5=EF=7Fvmjijkjgc_\[ZX= +XY\`iv=F9=ED=E8=E6=E3=E0=DF=DE=DE=DC=DB=DB=DB=DC=DC=DA=D9=D9=D8=D7=D8=DC=DF= +=E5=F0zl_ZXTQPONKLLLNOSW\cm=FA=E8=DE=D9=D7=D3=D0=CE=CD=CD=CD=CC=CB=CA=CA=C9= +=CB=CC=CE=D3=D9=DF=EDnaYQMKHGEDDEFGILOT[`k=F6=E4=D9=D2=CC=C9=C7=C5=C4=C3=C2= +=C2=C3=C4=C7=CB=CE=D6=DF=F0n`ZUONLJJJIIJKKLMOQU[`k=F5=E0=D8=D1=CD=CB=C9=C8= +=C7=C7=C9=CB=CD=D2=D8=DF=EC=F3=FBqkgb]ZWVUSTUVZ]`hmy=F7=EA=E4=DE=DE=DE=E1= +=E4=E6=E4=E1=E0=DF=E2=E5=EA=ED=F6vnieecdgikliea`_`dfity|}{=FD=F4=EB=E7=E3= +=DE=DB=D9=D6=D5=D5=D5=D6=D8=D9=DC=DE=E0=E9=F4=FEsd][VQONMMNORUZ`jy=EF=E7=E2= +=DE=DC=DA=D9=D8=D8=D7=D4=D3=D1=CF=D0=CF=D0=D3=D6=DA=DF=EB~m_ZVOMKJJJLNPU\= +m=F6=E7=DD=D9=D7=D7=D8=DA=DC=E0=E4=E6=ED=EF=F1=FA|sw{=FA=EF=EA=E4=E0=DF=DE= +=DF=E2=E1=E1=E4=E6=E7=EA=EE=F9zpjhc_]\ZZ[[\\]\\\]`fkns=FA=EF=EB=E9=E5=E3=DE= +=DB=D7=D5=D4=D3=D0=CF=CF=D1=D4=D8=DD=E0=E3=EA=EE=F3wi^WQNLKJJIIKLOT[f}=E5= +=DC=D6=CF=CD=CB=C9=C9=C9=C9=CA=CC=CD=CE=D1=D5=DB=E2=EDxjhc^XTQNMLLKMMMNPS= +X\bo=EF=DF=D9=D4=CF=CC=CA=C8=C8=C8=C9=CB=CC=CF=D3=D7=DC=E8=FFi^WOLJHHJKNS= +Zam=7F=EE=E7=E1=DE=DC=D9=D8=D9=DB=DE=E2=E3=E1=DF=DF=E0=E3=E8=E9=E9=EC=EF=F2= +=FCzwtvwqplfb_^[YYZ\\[^_cl{=F0=EB=E7=E1=DF=DE=DD=DB=DA=DA=D7=D4=D3=D3=D4=D4= +=D8=DD=E3=EC=FFog\VQMKKKLNPU]n=ED=DE=D7=D3=D0=CE=CD=CE=CE=D0=D2=D5=D8=DB=E4= +=F1vf^YVTUUUVWY[\]`fm|=F9=EF=EB=E7=E2=E1=DF=DF=DD=DA=DA=D8=D6=D4=D3=D6=D8= +=DA=DB=DE=E5=EE|lc]YSONLLKLNRX^hy=F2=E8=DE=DA=D7=D4=D2=CF=CE=CE=CF=D0=D1=D2= +=D3=D3=D3=D7=DB=E4=F0ra[TPNKIHIIJLNSY_l=FE=EC=E4=DB=D5=D1=CF=CD=CD=CD=CC=CD= +=CE=CF=D2=D7=DB=DD=DF=E3=EA=ED=F1=7Fl`[YTPPPQSSWZ]djs|~}wtpmp{=7F=F7=EF=E8= +=E3=E0=DD=DB=D7=D7=D7=D7=D9=DB=DC=DE=E3=EA=F1{mf`___acdflm|=F5=F7=F9{ywpq= +sow~{utxy=FE=F3=EE=EC=E8=E9=E9=EA=ED=EE=F2=F9|umjiknu=FC=F4=EB=E6=E2=E2=EC= +=FAsja][XXY\_cgmy=F8=EB=E0=DC=D5=CF=CE=CC=CB=CB=CC=CD=CF=D5=DC=E8=FEi\UPM= +LKJKLLLNQY_iy=F6=E9=E2=E1=DD=DB=DA=D9=D8=D8=D6=D4=D2=D2=D2=D2=D3=D5=D8=DA= +=DD=E2=EA=F6xldb^[[\[[\\^`b_^]]]]^^^`deintx=FB=EB=E2=DD=D8=D6=D3=CF=CE=CE= +=CD=CD=CD=CD=CE=CF=D4=D8=DB=E0=ECyj`WSOMLJJIJLNPUY]bkw=F0=E5=E0=DD=DC=DB=D9= +=D9=D9=D8=D9=D9=DA=DB=DC=DC=DD=DC=DB=DC=DB=DB=DC=DC=E1=E9=F1=FC~vmha\\ZXU= +TTTSSUX[_cir~=F2=EC=E7=E1=DF=DE=DD=DB=DA=D8=D8=D8=D9=DA=DC=DF=E8=ED=EF=F1= +=F5=F8=F9=F6=F4=F5=FCxnmmjge_``__```aeijhgfhmr}=FB=F4=EE=E6=DE=D9=D4=D1=CE= +=CF=D1=D5=D8=DC=E2=ED=FBvjeb^[XWVWY[`efims{=FE=F9=F4=EC=E4=DF=DD=DC=DD=DE= +=DE=DE=DC=DD=DD=DE=E3=EB=FEnf^ZVROOOOPPSX^j=FD=EA=DE=D7=D1=CE=CC=CA=C8=C7= +=C8=C9=C9=CC=CE=D3=DA=E4=F5n^VOKIHGFFGILPX_jt=FA=EC=E4=DD=DA=D9=D8=D6=D5=D4= +=D3=D3=D4=D4=D3=D5=D8=DB=DD=DD=E1=E8=EE=F4=F5=FCrj_ZXTSRSSRPQSX[]bm=FA=E7= +=DC=D4=CF=CD=CB=C9=C9=CB=CC=CE=D2=D8=DE=E5=FAkd^XSQONMLMMNQW\_f{=EA=E1=DE= +=D8=D5=D3=D0=CE=CD=CC=CD=CF=D7=DE=EA=FBqlke___^_`a`cjllklnnkmot}=F8=F1=EC= +=E9=E8=E7=E3=E1=E7=EA=ED=EF=F2=EE=EA=EB=E9=EE=F6=FAytlgb__`bdhnz=F9=EF=EA= +=E7=E7=EA=EB=EF}xqomllls}=F4=F0=EF=F0=F8=FExtuy=FB=F3=EF=EF=EE=EA=E7=E2=E0= +=DE=DD=DC=DA=DA=DB=E0=E6=ED=FDk`\XURRRRRSUX\aen=FE=EF=E5=DE=DC=DC=DD=DE=DE= +=DE=DE=E0=DE=DD=DD=DC=DB=DE=E2=E5=E9=EE=F9zrmnorpolgjilomlnnnuuw}=FD=FF=F9= +=F5=FB=FB}tmhc_acegihimnu=FD=F5=EB=E4=DF=DA=D7=D4=D1=D1=D2=D4=D6=D9=DC=DE= +=E2=E8=F4sg^YXVWWY[_dddc`adglprxz=7F=FF}|=FE=F8=EF=E8=E3=E0=DF=DE=DB=D9=DA= +=DA=DA=D9=DB=DE=E3=E8=EB=EF=F8}}yqnf_]XVTSTVXY[_bdkz=F2=E7=DF=DA=D8=D8=D9= +=DB=DC=DE=DF=E0=E1=E4=E5=E2=E2=E1=E2=E3=E1=DE=DD=DE=E3=E9=F8re]ZVQONNOPSW= +Z^beilpw=FC=F1=EC=E5=E2=DF=E0=DF=DC=D9=D4=D1=D0=CF=CD=CC=CC=CE=D0=D5=DA=DE= +=E2=E5=EFwh^ZUOMKKJJJKNPSY]afp=FF=F4=EC=E2=DD=D9=D3=CF=CD=CD=CD=CC=CB=CC=CD= +=CD=CF=D3=D7=DC=E3=F7m_XQNLKKKJKKKLNSXao=F1=E3=D8=CF=CC=C8=C7=C6=C6=C7=C8= +=C9=CA=CB=CD=CE=D0=D6=DE=E8t_WMIECA@@@@ACFJOYg=F4=DD=D3=CC=C8=C3=BF=BE=BD= +=BC=BC=BD=BF=C2=C6=CA=D2=DD=EAw_WPLHECA@@@ABEGILQZi=F3=E1=D8=D0=CC=C9=C7=C5= +=C4=C3=C3=C4=C4=C6=C9=CD=D3=D9=DF=EA=FEmd_[VRPONMNNOQTXZ^dp=F8=EC=E5=DF=DE= +=DC=DC=DC=DC=DD=DD=DF=E0=E4=E9=F9rjdca`]\]^^bfkv=F3=EA=E1=DA=D6=D1=CF=CF=CE= +=CE=CF=CF=D0=D3=D9=E4=F3sf\VQOMLLNNPSWXY[]`gn=FE=EF=E4=DB=D7=D4=D2=D2=D3=D5= +=D7=D6=D7=D8=D8=D8=D7=D7=DB=DC=E0=EA=F2=F9wjc^ZWUSSTUUUXYZ\]afjs=FE=EE=E7= +=E2=DE=DC=D9=D7=D4=D3=D4=D4=D3=D4=D5=D7=D9=DE=EA=FDl_YUTUVX\_hnt{=FA=F9=FA= +=F6=FFy{spoolpopy=FC=EE=EB=E4=DE=DA=D8=D9=D8=DB=DD=DE=E0=E9=ED=F2zmliedba= +`_^\\YWY[_ho=FB=EA=E0=DC=DE=DE=DD=DD=DF=E3=E6=E8=EA=ED=EF=F4=FA}rmhba__bc= +ffhlu=F4=E8=E0=DA=D4=D2=D1=CF=CE=CF=CF=D1=D4=D7=DC=E4=EFte^XSOMKHGFEFGILN= +U^m=F0=E1=D6=CF=CC=C9=C8=C7=C4=C3=C3=C3=C5=C7=CB=CF=D5=DE=EDxg]WQQONMLLMN= +OSY`hu=ED=E6=E1=DE=DD=DB=DB=DB=DB=DD=DF=E3=E4=E8=ED=F6vkd_\[]__gox~=FA=F1= +=EC=E8=E5=E2=DD=DB=DD=DE=DF=E2=E9=EA=EC=F4=FA=F6=F6=F6=FFvokihhe^]^^_bilp= +y=FD=F9=F0=F3=F4=EE=EA=E7=E7=E9=EC=EF=F4=F3=EF=F2=F3=F6=FC=FF=FF=F4=EE=ED= +=EA=EA=E7=E3=E4=E2=E0=DF=E2=EDzjc^[XVTVXZ\]_gjpy}=FA=F1=EC=E8=E5=E2=E3=E4= +=E2=E2=E3=E4=E3=E2=E5=E7=EA=EA=EC=EE=EE=EE=ED=EE=EC=EA=E7=E4=E2=E0=E2=E1=E3= +=E7=EA=F7xokjheb^ZURPOMMMNOQTZ`k=FD=ED=E1=DD=D8=D2=CF=CE=CE=CD=CD=CD=CD=CD= +=CD=CD=CE=CE=CF=D5=DA=E1=F1o_YVRNMLMMMNOQTY_hpu=FF=F6=F4=ED=EA=E4=DD=D9=D5= +=D2=D0=CF=CE=CF=D2=D5=DB=DF=EB=FB|qhdd_^[XUSQPRSW]dos=FA=EF=E7=DE=DC=DB=DA= +=DB=DB=DE=E3=E7=EA=E7=E9=E7=E7=E7=E4=E3=DF=DD=DD=DE=E0=E3=E8=EA=ED=EC=E9=EC= +=EF=F2=FFl]XTNKIGFEFHLOW_q=E7=DA=D3=CE=CC=CA=C9=C8=C7=C6=C6=C8=CA=CD=D2=D8= +=DC=E0=E7=EE=FBoe^YWSQOOONNMLMORW\_k|=F1=E3=DC=D6=D1=CE=CC=CB=C9=C9=C9=CB= +=CD=CE=D1=D9=E2=EEuf]WSOMLLLKLMNNQW]ep=FA=EF=E6=DD=D8=D3=CE=CD=CC=CA=CA=C8= +=C8=C8=C8=C9=CB=CD=D1=D8=E3=FEdXPMJHGEEEEFHJKPW^n=F5=E7=DD=D7=D1=CE=CB=CB= +=CA=C9=CA=CB=CC=CE=CF=D1=D5=D7=DB=E3=EB=F9tj_[YXVUTSSSTWY\_dfgilowy=F8=EA= +=E2=DD=DB=D9=D8=D7=D4=D3=D2=D2=D2=D4=D6=DA=DC=E0=F1vf]XTSRPNNNORUW[^bjko=FF= +=EF=E9=DF=D8=D1=CE=CB=C9=C7=C7=C6=C5=C5=C6=C8=CA=CE=D7=E4pZOKGDBBBBAEIIIL= +NPYn=DF=D3=D0=D7=DD=D9=D1=CF=CE=CC=C8=C3=C0=C2=C6=CC=CE=CD=CF=D3=D9=DE=DE= +=E3=FAaVNLJHHGGGHHIJMR\jy=ED=DE=DA=D6=D0=CF=CE=CD=CC=CB=CC=CD=CE=D3=DB=E5= +=E9=EA=EE=FEj_^^^[\\c=FDn\SU\b^SVes=EE=F3u|=E9=D7=D3=D4=DB=E5=DA=D1=CE=CE= +=D4=D8=DA=D6=D4=DA=E3=F9=FC=EA=E9=FC_UOSVOKEBGKHDELVbl=FD=DD=D4=D1=CF=CB=C5= +=C0=BF=C1=C6=C7=C7=C8=C9=CD=D3=D0=D5=DF=EFo\ROOMMKIJHC?AEHMTe=F2=ED=E3=DB= +=D1=CF=D5=D2=CA=C5=C2=C3=C7=CA=CC=CE=D8=E3=EB=E2=D8=D8=F3YSYYRF?LyWNK=3DCh=D2= +=CB=7FWQd=CF=E9n=D9=CC=C2=C8=DA=DC=CE=C8=CE=DD=DF=D4=C6=C9=EDXVmvXKGO[YXP= +NVc|nUKS=F2=E3lX[t=DB=D2=DC=E3=E8=DA=CA=C4=C6=CD=CF=CD=CD=CF=E3x~=FBjVMM`= +oWE?M=F5=DB=FCSTa=E1=D3=E4^Q]=DF=CD=CF=F2^j=DC=CD=CF=EA_^}=DB=DA|\o=D9=D1= +=D9{h=EC=D7=DAmWWn=D8=DD_KJ[=F7=FCVNY^efjq=EF=ECl=E8=D5=CF=E0X=EF=C3=B9=C3= +M?Y=C0=B9=C9dX=FB=EFdI?GReoijWMST[|=EE=D9=CB=C5=CFv]]=EE=E0=F5ci=D9=D2=E7= +l_l=E4=DF=E0=D6=CC=C9=DC=FF=F6=D7=CE=EDZV=DB=D1U??=FB=DAH8<s=C5=ED6-I=B6=B3= +=CD?9Dz=CB=C0=B7=AE=AE=B2=BBw<<J=F1=CB=C4=C3=C3=CFV>9?Lo=E5=E8=DB=E6[D;8;= +?H[m=E0=DA=DB=D9=DA=D8=CF=C2=BC=BE=C7=CB=D7=CF=C4=C6=D2=F8^m=E8=EBUFJX^XK= +EKTVOKO_=EA=DF=EF=E1=CE=CA=CC=D6=DC=CE=CB=D4=E4=E8=CD=CB=CF=DE\=E1cG=DC=CD= +=BA=CA1()O=BA=BE=D1=DA=C6=C1U/+2K=CA=BF=BF=C0=C3=CFeGJ=FB=C9=BA=B9=B9=BA=C3= +=DARB?HQd=F9=E3=E0s^]ZSSu=CF=C8=CD=F9Uc=FA~WQ^=FE=E2mOLVefa^k=F8=F6m\b=F8= +=DF=DB=DB=D8=CD=CA=CF=DD=E9=D7=D4=DF=E7=DE=CF=D6=D7=EFIs=D3=CA=C1Q7.:=D7= +=C7=C4=CD=D7=C8=D0D0.7S=D2=C4=C5=CB=CE=E7VINg=CA=BD=BC=BC=C2=CC=E8UIEKYv=EA= +=E7=E5=E5xYR^=EC=DA=D7=E0=E5=E6=FB_VZbp=F9=F9{ja^dw=F7=F7=F9=F5=F1=F1sd`f= +=FF=E8=DD=DA=DB=D8=DE=EE=FE=7F=E0=E0=F9j=FD=DAnR=F8=DE=CD=CBd?8Ab=D5=BC=BD= +=C6=C6=CEkC;8=3DY=D0=C7=C8=CF=F1]ZVUj=E2=D4=CA=C8=CF=EFXLFHLOZk=EB=D7=CE=CF= +=D6=D9=D6=D1=D0=D0=D2=D1=D1=D4=DA=E2=EF|il~xl_VQOOMKKKLNOOQYd=FE=E0=D8=D5= +=D0=CF=D0=CE=CC=CD=CD=CD=CE=CE=CE=D2=E4=EB=DD=E3=E7=E9dNNUU]t_T\[S[d[[a[T= +WXT\|=EB=DC=D4=D0=CE=C9=C6=C7=C7=CA=CF=D6=DC=EEgYQMLJLOU^p=EE=E1=D8=D3=D4= +=D0=CF=D7=DF=E6=F3zqcYVWVWZ[]ba[[[\^cnz=EF=E6=DE=DB=D8=D1=CE=CC=CB=C9=C9=CA= +=CB=D0=E2=E0=D9=E4=FCnTGINMXt`W^ZP\k^cn[QSON[s=F7=DE=D3=D1=CE=C8=C7=C7=C5= +=C7=CA=CE=D5=E8m^PLLLMRZb=FC=E3=D8=D2=CF=CF=CF=D1=D7=DF=F6hZTPOONOSX\_cdg= +jmop~=F6=EA=DE=D8=D4=D3=D1=D2=D3=CD=C8=C6=C7=C9=CF=DA=E8=ED=EA=F4fUJ@>AEK= +YYSUWVb=EE=E6=E0=E0=F7hjoy=E3=D5=D1=CD=C9=C7=C6=C5=C6=C8=CA=CC=D4=E0{ZKEA= +@@ACFNXf=FB=E0=D4=CD=CB=CD=CE=CF=D5=D9=DF=E7=EA=EA=F2slko=FF=F1=EF=EC=EF|= +rg^YZ\^a``cchx=ED=E4=DD=DD=EAm{=DD=DE=E9=E5=F6XT\[v=D1=CF=DC=D8=DB=F5=E2=D3= +=D4=D1=D2=EAaYOLQY]krlo|=F9=EC=E8=EE=F5ze]ULIJLPZe=F1=D8=CD=CA=C7=C2=BF=BD= +=BC=BE=C1=C8=CF=DA=EBk^WNJEA@@ACEEFHILQXh=EA=DB=D4=CD=C8=C3=C1=BF=BD=BC=BD= +=BF=C1=CA=CC=C8=CD=E1vXD?A?CQRLNJEKW]y=E4=EEtlac=F9=E2=D9=CF=CC=CA=C9=C9=CA= +=CB=CE=CF=D2=DB=EAnUJGFFHJMVeiq=D7=CB=CB=CC=CD=C9=C5=C7=CF=D9=D7=D6=E1za[= +SOPSUTOLJGFEEJU^\]{=D8=CB=C4=C1=BE=BC=BC=BD=C5=CD=C7=C1=C3=C9=D5_HC>?Mh=FC= +=ECyRF@=3D=3DBISh=EB=E1=DC=DC=D9=D7=CF=C9=C4=C0=BF=C2=C9=D4=EBfXNHFKR^q=FE=F5= +=E4=DD=E0=E1=DD=DC=DC=D9=DC=E7=ED=F8qmnp|=F2=EC=FAma[^_\YVUVWYc=FE=E5=E0=E0= +=DC=DA=D6=D3=D2=D6=DC=ED=FA=ECcV=F1=DB=D7=D7=F6LBCEU=D0=C0=BE=BF=CBsOHDIU= +g=E6=D4=D1=D7=E3ueg=FC=E0=D4=CF=D5=E4mXNMLGEIV=F1=DB=D6=D5=D3=CD=CA=CB=CC= +=CD=D3=D9=DD=E4=EC=EF=FEkifekj`[[]abYONPTUV^ovmjy=E2=D9=D2=CF=D0=CC=CC=D2= +=E1c]=D8=C8=C6=CA=DCUFBCU=CF=BF=BD=C2=D0eJB>>FS=EF=D2=CE=D6=F6\TVb=E9=D7=D1= +=D1=DDv[NJLNLQm=E1=D3=CE=CF=CD=C9=C7=C8=C8=CB=CF=DA=DF=DE=DF=E5{_USWZYSNK= +MPRQONR[ct=E8=E2=DD=D7=D5=D1=CD=C6=C3=C5=C8=CD=D8=E1=E5rS[=DE=D4=D9=F2QD@= +?>K=EE=CF=CA=CD=E1aPGDIV~=DA=CF=CD=CD=D0=D9=E4=EB=DF=D4=CE=CD=CE=D9=F5\OL= +KIINWbw=F6=DF=D6=D0=CE=CE=CE=CF=D2=D7=DA=DA=DA=DE=E8{_\]__\XSRQOOQSX[_dek= +=FB=E1=DA=DB=E4=F6=E4=D1=CB=CB=D1=D9=DD=DE=DD=DE=E2=E4=D2=C8=C9=D4|RMSVZe= +rlfaXNJFEINVbt=7F=FA=EA=DF=DA=D3=CE=CA=C9=C9=CC=CF=D8=E4z__jjlgcdgl=FD=E6= +=DD=DC=DE=DA=D9=D6=D9=E2=EA=EB=ECp_\\^ZVUUVUQMNS[gk_]t=E4=DA=DA=DF=D9=CE=CD= +=CF=CF=D0=D0=CE=D0=D5=D7=DD=E8=E9=E4=ED=F2=FAupdbc^ZSPOONNQTTY`a`ch`^n=EF= +=DB=D3=D5=D2=CF=CD=CD=CF=CD=CC=CD=CE=CF=CF=D1=D7=E6wc\^`]WOPW\WQOU`a_oncb= +fw=EF=ED|o=E9=DE=DE=DA=DB=DD=DF=E6=E0=DA=D4=D7=E5=F1=F7=F2=F7ukchot=F3ua[= +_glm]^x=F8=F9ogz=FE|mv=EB=E4=E5=ED=EC=EC=F6=F1=E0=DB=DD=E0=E5=DE=D9=E3=F3= +~|oga_d[[^\WRWX\`[r=E5=EC=F9=ED=D6=CC=CE=DB=D9=CF=CD=D2=DB=DC=D9=D9=E3yhh= +ha^^Z]ZUUSX^beaaimomn=FA=E1=E4=EB=E7=E0=DE=E7=F4=FD=F6=E9=DD=DC=DD=DA=DA=D9= +=D6=DA=EC=F7~~sfd]XVX\[WUZv}z=EE=E8=E7=E1=DC=DB=DC=DC=DC=DD=DD=DE=EC~|}wh= +fefmy|igv|rligehgkyyoo=FD=F4|q=FC=E7=DF=E3=E8=DE=DC=DF=E8=E8=DF=DE=DE=E5=EE= +=ED}pj`]XY__ZUV\bip=F6=EA=EA=EA=EA=E8=DF=DC=DA=DA=D7=D7=DC=DD=DE=E0=DF=E9= +=EF=FA|sg_^_[Y[\adagkomgfx=FD=F9=F9~=ED=E3=E7=E8=E9=E6=E0=EA=F5=ED=E6=E5=E7= +=EC=E7=E4=DE=DF=EB=E2=DE=E4=E8=F8yuf_[WWXX[ZY\\ail{=F0=E2=DE=DE=E0=E4=E1=D9= +=DD=EC=E7=DE=D8=DA=E8=F1=7Fulhjmh_[Y^c_ehl=F9=EF=EA=E0=DF=DF=DC=DA=D7=D6=D8= +=DB=E3=E1=DE=DF=EC|sp}=FFe]YX\[VQOPPPUYX_n|=F6=E4=DB=D8=D2=D1=D0=D0=CF=CF= +=CF=D1=D5=DA=DC=E2=E9=F1=F9{xvfoyli^\[\]`aZ\^i}=FCyx=F8=ED=F2yngcejn|z~=EA= +=DC=D8=D9=DA=D8=DB=E0=E7=EF=F8=F3=F5wtkghnod_jr=F4=FDjz=F0=EF=F5=FC=F1=F5= +=F9=F6=FD=EC=E9=F9=FE=F1=EB=F1=EF=EA=F3=F3=EF=EE=F2necca^]`i~{lmx=EF=F2pj= +l{=F6~=F1=F1=EA=E1=E7=E3=E0=E6=EC=EC=E3=E3=E9=E5=EF=F4zpslkejoilt~=FFlccj= +nl^^jmfdj=FE=FCz=F4=E8=DD=DB=DA=D6=D5=CF=CE=CE=CE=CF=D3=DC=E4=EFxq\VXVVQM= +NRTTSVY\__mnq=F6=EA=E4=DF=DC=D5=D7=D7=D4=D8=D1=CD=D7=DF=DB=D6=D7=DC=F1l=D9= +=CDdEGl=D3=E9RKOb\LJLNW=EF=D9=DC=ED=FE=DF=CE=CC=CF=DB=DB=D2=D6=E2=EC=F0=E5= +=E8=FDy=EC=EB_PW=FB=FEWPh=E5`Qfw_QT=FA=D9=E9g=E5=CF=D5=EBl=E8=D0=DA=F9=FA= +=EC=FA=F0=D4=D9w]V^w=EF=EDxa\t=EF=E3=DA=ECk|=FDtm~k\ece=ED=DA=E1eU]=E3=CF= +=D3=F7QQw=D9=E5gVLY=D4=CA=DB^N_=CC=C4=D6ia=ED=D0=CA=D0=E4k_og][bfOJV=F1=DF= +hNOa=E3=D6=E3`Yg=D8=CE=E6=E5=D1=D8e_=D0=C9=D8{U\=DF=D9=DB=F2\PT=ED=CD=D2u= +UPi=D4=D8eFD]}ah=E8{U\=DD=CC=D1=FAx=DD=DCn=FD=CA=CCZJ[=CF=CC_EMp=D6=D9vll= +=EA=D6=EEg=F3=E7=EF]d=D9=CD=D5eOv=CB=D2jV^=E6=D6=DEZISi~{cOHO=F1=DBfIEo=CB= +=D4cZ=E6=CE=CD=D1=D1=CE=CC=CE=D5=D1=CD=CC=CF=EBt=FC=ED=EArNGHNZOHIJMV_ecp= +{=ED=D2=CE=DD=E8=D7=CE=D0=D5=D9=D5=D9=E4=DD=D6=DC=F8gn=EF=DC=DF]LNd=F3dME= +Ml=7FYO_=F3=E2=DF=DF=D3=D0=DB=DE=DA=D2=D1=D6=DF=F4=E6=D4=D4=E4]P^=DE=DAU@= +DZ=F1_NVzkLIh=D1=D5=F2=EA=CF=C9=CF=D7=D2=D0=DB=E8=D9=D0=DD]Sd=F5mYVa=ED=DB= +=E5`T_=DF=D8lNU|mLBIX\Zu=D6=CE=D2=D3=CC=C6=C5=C9=CC=CF=D7=DE=DA=D7=FEOJPQ= +KJQjrNCZ=C8=C9ZFU=F8XFU=D0=C1=C2=C3=BB=BA=C9=ED=EA=E6XCEYnZY=7F=DF=DE=D5=C9= +=CA=D9=E8=E2=E9WA<<<76<H]=FB=DA=C6=BC=B8=BB=BE=BE=BB=BE=CB=DC=DC=D3=DAcR\= +=EE=E8mckpgVKHQmX@<L=F0mRZ=DF=D3pu=C2=BD=EEK~=CA=E4B?s=C2=BE=CC=DC=C8=C0=D8= +MABHKTk}=DD=C7=C1=C6=C9=C7=C2=C7=D2=E8j^M=3D67;=3D;=3DM~=E2=EA=E5=CE=C3=C2=C7=C7= +=BF=BC=BE=C9=CE=C8=C4=CA=DC=F9=E1=D7=E8THObS?;>FC<?KetF;=E9=B9=C5IM=CD=C5= +=E8MU=C5=AD=AE=C3=C7=B7=BA=E5C=3DAMb^W=DC=C4=C8=DA=E1=DD=DC=DCvQTeN<8;>>=3D@V= +=DA=D5=F2=E6=C9=C0=C6=CC=C9=BE=BC=C4=DE=E2=D0=CE=E5l=7F=D7=D0=E4]Zs=F9ZGB= +HNH@APu=FCXIh=BD=BFWK=D4=C7=FCAD=D4=B3=B4=CE=CC=B4=B7r<=3DJPHE[=CF=C5=D4=E9= +=D4=CB=D3=F1kjbdXE=3D@C??BO=EB=D8{=EA=C5=BE=C6=CD=C5=BD=BD=C7=D3=CD=C9=D7ml= +=E2=DDx[^qaOMOND>AGECH[=DF=EDIG=C7=BA=DES=D5=C8=D4]R=D9=B6=B4=C5=C2=B1=B6= +=E7GISMDFp=CE=D5~=EB=D2=DD\RZeUDDMF::@FEKj=D0=C8=CD=CC=BF=BC=C1=C5=BD=BB= +=BF=C9=CB=C9=CF=FF^~=E7dRV\OB?HLE>?FJHIW=ED=DB=D7=CC=DD=D2=B7=BA=CC=C5=C1= +=CF=EA~=F5=D1=BF=C5=CD=BF=C0pGC@95:ENLS=F1=D8=DC=EB=DB=CD=CF=DC=E6=E1=DC= +rLL\\NS=E3=CC=CA=D2=CE=C2=BF=CA=D3=CD=CB=D6=EFmcXLKQRMOZ^VLKYcOMZb][s=DF=D4= +=CD=CB=CB=C9=E0=CE=BA=C6=DA=CD=DCeVV\=EC=D7=E1=D2=C7=DELGG>:;GZ]c=D5=C6=C7= +=CB=C8=C1=C0=C7=CD=CF=DAoZOC>ADEJ\=DF=D6=DC=D3=CB=CC=D8=E4=DE=DEw^h=FDg_s= +=E6=DF=DF=DF=E2=E7=ECh]qqWU]TVggh=FB=DF=D6=D7bP=C4=C3d=E2=E4YQNNf=D2=CF=CD= +=BE=BF=DEniNC@GW_]=E7=CA=CE=CD=C7=C5=C4=C7=CA=CD=DB`LI?66;=3D<AW=DA=D5=D4=C9= +=C0=C1=CA=CE=CE=D0=D8=E4=E1=D7=DE=E5=DA=D0=D7=DB=DA=D5=DD{dVQ\QFJLJIJNZ[i= +=DFoL=D2=BD=ED=D9=C4=F2Z=EC=EFz=D0=C6=C6=BB=BA=C8=D7=DF[HA?ILJV=F1|}=DA=D5= +=D6=D6=D1=D6=E3bTN?:=3D?@DQ=FA=CE=C9=C9=BF=BB=BD=C0=BF=C3=C9=CD=D8=E6~j_^Y= +W`^ZZYPLKMTOKKP[[[=FD=D8=D7=D8=D4=EB=C6=BA=DC=D1=BC=D6Uz=ECp=EF=D7=D2=C4=C4= +=D6=EEyOC?>?DDKdcj=D8=CF=CE=C8=C6=C6=C6=CC=D9=EB[GBEDAL^=E7=CE=CD=C8=C1=C3= +=C8=C9=CC=D5=DF=FD]SNJJLNWZ^vo]Yd=F0=F9hm=F4=E6=FCp=EA=D8=CC=CA=DBe=E1=B7= +=CDQ=C6=D5KPSOZ=FD=E9=CF=C5=CD=DB=E8jNHADJII]=F4y=DC=CE=CB=C6=C4=C3=C3=CB= +=DDnYI>9:=3D>FV=F2=CD=C6=C3=BE=BC=BD=C0=C5=CA=D4=E9n[YRRY^ewm|=F1o^[]_TNNM= +OOP^=F2=D6=E4O=CC=BB=EB=CD=C5o=FA=E3_y=D6=D9=CE=C0=C6=CB=CE=E5k\LGLJFMWVh= +=E5=DB=CE=C9=C8=C5=C9=D4=F4WKD;69<>EW=F0=CF=C6=C2=BE=BC=BE=C1=C3=C8=CF=D5= +=E9=FD=FFe]ky=FD=EF=EC=ED=F2mWUYOGFFHFHSf=F6_{=BC=C3=DA=BE=C4=E1=D8=EEm=D9= +=DE=FF=CF=C5=D0=D8=D9=E8lUJMMDDNQO_=EB=DA=CF=CD=C8=C1=C6=CE=D2=DF\LFB=3D;=3DC= +LRh=D7=C7=BF=BE=BE=BB=BB=BF=C7=CD=D9=EBdVQLNOPW_glh[[]VTOQQNOR\h~=E4=D8=CD= +=C9=C7=C7=C5=C4=C8=CC=D0=D4=D8=DB=E3=E5=DF=DF=E3=F5ug^WQPNNNMMNOOOQRUZ^g{= +=EF=E7=DC=D6=D2=CF=CD=CC=CC=CD=CF=D0=D5=DD=DF=DF=EC=F4=F3=F4=F6=FEtzyuxyo= +kh][YWUVVWYYZ\]\`ho{=F8=ED=E7=E7=E6=E0=DD=DB=D7=D3=D0=CE=CD=CB=CA=CC=CE=D3= +=D7=DD=E8=7Fi_YVSRPOOQTUUX\[^`bfiku=EF=E6=DE=D9=D7=D8=D9=D9=DD=DE=E2=EB=EA= +=EA=EE=F1=F0=EF=EE=F5=FC=FB=F9}xvkiihlihotux=F4=F0=F7=F9=FF=FB~rqvsptztq=FF= +=FD~=F8=F0=ED=ED=ED=EB=ED=F4=F5=FFrqos{=FE=F9=F1=EC=E6=E3=DE=DC=DC=DE=E1=E2= +=EB|okd_`OW=C7h<Ch=D9=E9Z\=E1=EDKG=FE=EDWH=DA=B8=BEwo=CF=CA_J=F4=C2=C9^=FE= +=C4=C2rHV=CC=CEQK=EF=D4bL\=D1=D7KCUcJ?L=EA=DFi=FC=CB=C7=DCh=E7=CF=E3WZ=DE= +=D6=FD_=E2=CD=D0=FA=FE=D7=CD=D8=EA=E7=CF=CEjZ^fXKMWYOMUZZVU]g_b=F9=FCn=F7= +=DE=D8=D5=D3=D1=CA=C8=CC=CC=CA=C9=CB=D0=D1=D3=D4=E4wwl^UONKGFGFEGJNPV^`=F5= +=DE=DC=D9=D9=F4=D8=BB=C0=D9=D5=C7=CFuP_=CB=BF=C8=C5=BA=BB=CEWJH>46>HEIg=D4= +=D3=E2=D8=C8=C7=D3=EE=EA=EA[HGLQW]f=FC=D1=CA=CB=C8=C4=C4=C1=C8=D9=E7=EAo^= +TY`[STZ_ZS[`daRO\XLO=E2=D1=F0=F6=DA=D0=CB=D2=CB=BB=C8]=C3=BA=C7=CEL:DL@J= +=CA=BC=C4=C7=CDdC:228=3DP=D8=CA=C8=C2=C5=C9=CF=DE=DE=DA=D6=D5=D2=D1=D7=E6=FE= +m^RO]pXU=ED=CF=CC=CD=CF=D3=CE=DDZLPNEBKe=F1pi=E6=E0oVU\c][q=DC=D9=E1=DF=D2= +=CE=CD=CB=CD=CF=D8=D5=D7=D7=CD=C9=EFAl=BE=CFOC;<A<:s=B8=BA=C9=CB=D8W>35F= +}=CE=BF=B9=B8=BA=C4=DEe]_f=F1=DC=D1=D2=E0`LC>=3D?GHJk=CF=CA=CD=CD=C7=C3=CCz= +j=DD=D8=E1=EE=E4=CF=C9=D0=DF=DF=EB[MNMMVdf_ZUVRLIU=E7=DCvr=E5=D7=CC=CC=C8= +=D3U=CB=B5=B9=D5O>C^OL=C6=AF=B5=C9z?5314E=D8=BF=BB=C1=D7wXKGNn=CE=BF=BD=C2= +=CB=DD`LA=3DBUm^k=D0=C4=C5=D7=FD=DA=C8=D2XP=F5=CC=CC=F9Z}=D6=DDdTVgkSLUq=EC= +=E8kW[ZVX]Xk=CD=C4=CF=7Fr=D9=C7=C2=D1PA=E0=BC=C7ZBBOuOG=CF=B4=B8=CF]D>A>>= +S=CE=BE=BC=C2=D5=F9la[f=E3=CD=C5=C6=D1=FBWJB>=3DDONL`=DB=D9=E3t=FC=D0=CD=F3= +[=EE=CF=C9=CC=D7=DD=D6=D1=D7=D9=D9=DA=DB=E2=FCignxw^UNGELTVZ=FD=D5=D6qNW=E2= +=D1=CF=EANK=CC=BB=C4yHKw=D9_S=C7=B5=B7=C6pIBFADW=DD=C7=C5=D2hPMLMTh=DB=CD= +=D1=E3y^PIIKMW=FE=DC=D1=CB=CA=CC=CB=C7=CB=D6=DA=DC=D2=C9=C9=DFX`=E9=E0oON= +TWKBFOUPMOTVUU]q=E8=CE=C4=C5=CF=D9=D0=C9=C0=C2=CE=D6r=EF=BE=BA=CFD=3DP=EDm>= +=3D=DE=BD=C5W=3D<@A:=3DM=DE=C7=C7=D4=E6=E2=DD=E6=ED=DD=CD=C1=BC=BF=C8=D7=EFxYG= +AL_wwfy=DA=DDbT_=E7=DEvey=E6=EAlb|=D5=D6fS_=EF=EEdYl=D8=DC_Sc=EE=FC][=E9=D3= +=EB[x=CF=C8=CF=ECkV=EC=C4=CC[FT=EC=E9TD=F4=B9=BB=E6R=F5=E8P<9M=D8=CF=EA=FC= +=DB=D2=E7QHU=F5=DC=DB=D6=CF=D1=DFt^JCNcl`n=DC=C9=C8=E2o=E2=D0=CE=D8=E2=E3= +=D6=D4=DF=E0=DF=E9~nd`[OKSb[QTanZJKf=EEnRT=F0=D4=CE=CE=C8=D7^=CD=BA=C3WK=E6= +=C8=D0HF=C3=AF=BD_i=CF=E5@2:]=FAOO=E8=D3=FBGF\=FC][=DA=C6=CB=F8b=E7=E1Q@= +M=EF=FAY]=DD=C6=C9=E9=E6=C6=C3=D4=E5=D9=CD=D4}x=DA=D3=EEaik^RMOUNLT[YSX_`= +_j=F3=F0=EF=E7=DD=CD=C3=C3=D3g=DB=BE=C9XMk=DB=F7GF=DF=C2=D0b=E7=D0sD<DLIM= +r=D5=D9=DF=DE=D2=D2=EB=EC=D4=C9=CB=D1=D9=D4=D5bKNXJELT_^Xh=DC=DB=E9=D9=CF= +=D2=DF=F4=E5=DF=E7=FE=E1=D7=E4p=F2=DFy\Zlx[Ydma_n=FDujak=E7=E6=EA=D1=C7=CF= +=FC=D1=BE=CFai=E7{OFN=F6=EF^c=E4=F5UHEGD@I\_i=DB=CE=CE=CD=CA=C6=C3=C5=C8=C3= +=C2=CD=DF=E3=FC^XWVY\[_mjdf{sgdf_[VTWX\dosv=FF=F5=F8=ED=E8=E1=DF=DE=DB=D6= +=D4=D2=D2=DC=DF=DE=DF=E0=E2=E5=E5=E6=EEi=DF=DF\[nVNONNYb`n=E8=EA|=FErnd^b= +|wz=EA=DD=DA=D3=CE=CE=CF=CC=CB=CF=DC=E7=F3eWNLKIJJLO[_o=E9=E0=DC=D4=CF=D3= +=D5=D4=D5=D6=D9=DD=DE=E0=E5=EE=EC=EA=EE=FAzvmg_[ZYVTVVWZ]__r=F9=FA=EA=E8=E6= +=E2=DC=E2=DE=D6=DC=DE=DF=E1=DB=D7=D9=DC=D6=D7=DE=E1=E6=EF{=F6=FBnd^\XVSOO= +PQRSUX\_bk=FE=EF=E6=DF=DF=DD=DA=D9=D6=D5=D5=D3=CF=CF=CF=CF=CF=D2=D5=DA=E0= +=E7=FAjb_\YXVSPOPPQSTUY]bkw~=FB=EF=E9=E2=DE=DC=D9=D7=D4=D4=D4=D5=D4=D6=DA= +=DB=DE=E2=EB=F4=F2=EF=EE=EF=F1=FErong`_^^^^`cbeeca___`aehjlv=7F=F4=F1=ED=EA= +=E8=E4=E1=DF=DF=DE=DD=DC=DC=DD=E1=E6=E7=EA=EF=F7=F9=F9=F7=F8=F9=FA=F5=F1=F5= +=FB=F7=F2=F9}xqlid][[[YY[^emy=F7=EF=ED=EA=E6=E5=E5=E5=E6=EA=EB=E7=E4=E1=DE= +=DE=DE=E1=E8=EF=FC=7F=7F|yrnlhb_[YZZZ[^ajsy=FB=F0=EA=E4=E0=E1=E1=DF=DE=DC= +=D9=D8=D7=D9=DC=DD=E1=EBzjgd`_^^^bb__agjjikllms=FD=F7=F3=EE=E9=E3=DF=DC=D8= +=D6=D5=D4=D3=D6=DB=DF=E2=E3=EB=F8xpnd`^]\XTSTTUWXY]`fmv=FA=EC=E8=E8=E6=E4= +=DE=DA=D8=D7=D8=D9=DB=DD=E1=E4=E5=E7=EC=F2=F8=FA=FE~~~=FB=FBupospqvrpniea= +deeksy|=FC=FE}=FE=FE=FF=FE=FA=FB=FF=FB=F1=F0=EF=EB=EA=EC=EA=EB=F4=FFwspon= +poqtvsrnotu}~=FA=EE=EB=EB=EC=EC=EC=ED=F1=F6=FC=FD~xx{~=FA=F2=F0=F3=F5=F5=F2= +=EE=EB=E8=E7=E5=E5=E5=EA=F0=FFqh`[VVWYYZ\_hms}=F3=EA=E9=E6=E2=DF=DF=DE=DD= +=DD=DE=DF=DF=E1=E4=E7=EA=EA=E9=E7=EB=EC=EC=F2=FBtjd`]ZZ[[[[[\^`dn=FD=EE=E3= +=DE=DB=D9=D8=D8=D8=D8=D8=DA=DC=E3=EC=FDmd_^]Z[\^__eps|=F8=EF=E9=E5=E4=E1=E0= +=E4=E6=E9=ED=F5=F7=F3=F5=F8=F3=EF=EF=F2=EF=F0=F6=FA=FD|vomjhjheccdbeihkty= +y=F8=F1=F3=EF=F0=F1=ED=E8=E2=DD=DB=D9=D8=D9=DA=DE=E4=EB=FBuokd_\ZZXXZZ]^^= +`foy=F5=EC=E3=DE=DC=D9=D8=D7=D8=D8=D9=DA=DD=DF=E3=EB=F7ynifc_][\\]^_ceitz= +=FD=F6=EE=E7=E2=E1=E0=E2=E0=E1=E3=E5=E7=EA=EE=F8yqolhZ=EC=E4JG=CF=C5?I=CB= +=CF=CC=D4TQ=C2=C3>L=D9lVv=CE=E7O=FAkZ=FEmU=F1=C9=FCP~=F1mu=EF=DF=DF=D0=DF= +=EF=DD=E6z=EF=F9=EE=EE=EF=ED}nj^X\[\bedgnuor=F3=F3=EC=E4=E9=EC=ED=EB=E8=E8= +=E9=F9=EC=EE=ED=EAz=FA~=EA=E3=EC=DF=DD=E2=E5=E0=ED=F5=E9nodZcXX\TZUO[ZY^i= +=F9=EF=F2=EA=DD=D7=DE=DD=DC=DC=D3=DB=DA=D3=DA=D9=DA=E5=DE=DC=F0=E9=E6qefk= +b]\]beZS[\W[Ye=EB=E6=FB=FD=FBfwlw=E1=ED=E3=D7=D4=D7=E4=E1=D6=D5=E3=DC=DB=E1= +=E1o=FE=FFn_V\b[PSXWUOVZYrun=E9=D6=D5=DB=DD=D9=D0=D5=DA=D9=DA=D9=E0=F3=E9= +=EC~=FB=E8=ED=E8=EB=F9=F8opmmecheZSUYUW^dhcl=F3=EE=F5=E8=D8=D5=EEm=EF=DE=E9= +oo=E8=E0=F0=FE=7F=EF=E5=DC=F3s=EC=DF=E9x=EB=DC=DE=F0=FC=EFtZ_=E2=D7=E8[Y=F4= +yUN]=F0gVb=F2i[\]r=F1wd=EB=D3=E8a=EB=CC=D3jz=D2=CF=E3=EB=D7=D4=F7l=DF=D9=EF= +p=E1=D1=D7kYh=F9YKO`bRMRRMLPX\oog`=F8=D9=D7=D8=D1=CB=C9=CA=CF=D4=D1=C8=C3= +=D3s=D0=BE=D2MLSe=DD_IV=E4M:X=DFI@=E1=CA`Z=EF=DF=E5[O\=E5qHS=D8=D6k=F4=CB= +=C6=D6=ED=E2=DA=CE=CF=DB=F4=DE=CC=D0oKLtwQI\=DE=E7x=F6=DF=ECkz=FCzq=E9=D5= +=E8dnyk=E8=D4=DErhPEOan=EDOK=C9=BAm9G=D7=EEC>=E8=B4=B6=DA=D4=B4=B8V8D=F2\= +B\=C0=BE=DDc=EA=E1UER=D4=CD=EBo=DF=E6[KEGMJEKf=FAv|=E9=D4=C9=CC=D6=D8=CD=CD= +=DF=EB=D6=CD=D6=EC=DB=CD=D8pb=F0=DChMMk=DCnHKanJEWN}=BC=C7[N=E7=E1H?H=D9=B3= +=B5=CA=C8=BD=D2<0;IO\=DE=C0=BE=CEg\oaW=EA=CA=C2=C6=C9=CE=FCPEBHE@Gl=E5q=FD= +=D9=CE=CC=CE=D5=D8=D6=D2=D3=D5=D7=D6=D8=DEq]as]PP\PHK[v`MO`k_hXU=C3=B7=D1= +M=E6=C6=F3BE=E5=B2=AE=C6=D8=BD=C6A/8JKKl=CC=C6=DDQMYZO^=CE=C1=C4=CB=CF=D2= +=DEYBAT~]Sm=CE=C9=DEZx=CA=CBm^=DD=CD=DF_f=E3=DAjSgyWLQi`MNf=E1=E6]Vkp`h=EB= +=E9[=D3=B8=BDkT=DC=D8K=3DJ=C5=AF=BD=EC=CE=C2f62BYh=F4=CE=C0=C7uO[m_e=DB=C6=C1= +=CB=DB=F3dMBCDCOnv\^=E8=DA=E8iu=D5=CB=DA=FF=DD=CA=CD=E0=EE=D5=CD=DAo`}=F6= +aZe{lRP_m`NOd=7F^W=E0=E5c=CD=C3=DC\d^FG^=D7=B6=B2=C3=CC=C7=F9;3?W=ED=D3=CB= +=C0=C2=DCSKW_d=E4=CE=C5=CA=DDeOIC??EOu=F2fh=E9=D5=DFp=DE=CB=C6=D1=F3=DC=CC= +=CE=ECu=D4=CD=E1ll=EFiOO_=F2fQV\_]OLW=FA=FAi=F5=CE=CEk=DD=C5=C7=DAaQQd=ED= +=E5=BF=B5=C0=D9=F7WA9<Gf=DB=DC=D4=D6zSLRc=EB=D2=C9=C1=C3=CF=EDZJDGJLOp=DB= +=DA=E9=FA=E0=D5=DD=E5=D9=CB=CA=DC=F5=E7=D7=DDd^uo]RV]\X_=FD=FAeajl_[}=D7=DC= +ac=DE=CF=D8=E3=EEW=F1=C2=C9=F4WQNR[[=CE=B8=BD=D6=F4hN@>H}=CF=D1=D1=D2=EF[= +KLa=E2=D7=CF=C9=C7=D7eJGLF@L=F2=DDpZj=DB=D8k[=D4=BF=C3=D9=E3=CC=C3=CEm}=CD= +=CA=ECTV=F1=EBUITmYJIOOJNZ[OM^=D7=CF=FA=F0=DD=D9=C0=BD=CDbl=D4=D1=E1i=D7=B6= +=B2=C3n`=F2T=3D:I=E7=DAiWTWMDFT=EC=DA=D6=D0=D1=E4^OSWRO\=DF=D3=E4ir=DA=CF=D6= +=DF=D7=C9=C7=D2=E6=EC=D8=D1=DDzz=E2=EE]SV[XSYnmSMTbh[Ww=D8=DAl^=E6=CF=EB=DE= +=CC=CB=CF=F2[M^ux=CF=C2=C0=C8=DF`I?>CVr=DC=D3=DD=F9fY_n=E0=CF=C6=C2=C5=CB= +=DFbUNNKHNWhaSQ]=FBsm=F5=DD=D2=D8=DE=D8=D3=D2=DA=DC=D8=D3=D8=E6=E6=E6=EA=FC= +g]^feYSRZ\TOOg=E2=F8bj=F1d=E9=C9=C8=CF=F8_d=F2~_=D3=BC=B9=BF=D9fQF?>Ik=DB= +=D7=EFe_XXT^=E7=CE=C9=CF=D6=E8m]NHHM[=FC=F1hf=EC=DE=DE=E0=DF=D4=CC=CA=CC=CC= +=CD=D2=DA=DF=DF=DB=E1=EFphh]XPNNMKJLNLHKX]al=EA=D9=D6=E8r=D4=BF=BB=C3=DAy= +=D8=CA=D0=E6=D5=BD=B7=BD=DCTNKB;>MnrPJJMNLU=F2=CF=CA=C9=CC=D3=D9=E9t`TT_=F1= +=E9=F7=F6=E7=D7=D9=ED|s=F2=EC=F0=FD=E9=DF=E8=EFr|=F0=F4|v=F9=EF=FAmcdddZU= +[a^XZg=FD=F4{=FD=DE=D3=D4=DA=DE=DD=DC=D7=D8=DB=DA=E7=FFieh=FB=E2=DC=D5=D4= +=D9=E8aRMMQ[hjvoe_`el=FB=EA=E2=E3=EA}jc\XVVX^gv=F6=E7=DE=D8=D2=D0=D0=CE=CC= +=CD=CE=CF=CF=D4=D7=DD=EB=F9widc_[WQMKIJJKLMPV\f|=E9=DC=D4=D0=CF=CD=CC=CC=CD= +=CC=CC=CD=CE=D2=D7=DD=E8=F2=FDywrqqh_ZWTRRTWZ^^]]dkknv}yz}=FC=F6=ED=E6=E5= +=E5=E6=E5=E5=E4=E3=DF=DF=DF=DF=DF=DE=DE=DD=DB=DB=DC=DF=E6=E8=EE=FAuke\ZXV= +VVWXZZXXWY^hz=F7=E4=DD=DB=D9=D8=DA=DC=DA=D9=DA=DC=DD=DB=DB=DE=E3=E8=ED=EF= +=F8}uohfhklkmnmhbbggffikkknplifglpz=F4=E9=EA=EA=EC=F0=ED=ED=EB=E8=E3=E1=E2= +=E4=E4=E4=E2=E2=E4=E3=DF=E0=E1=E3=EA=F2}j`^[YXYY[[ZYZ^biv=EE=E6=DF=DB=D7=D5= +=D4=D4=D5=D7=DC=DE=E2=ED=F5~vmfa`achlmlkiihhjmnqusppv|=F7=ED=E9=E5=E6=E7=E5= +=E6=EA=E8=EA=EA=E8=E8=ED=F6xjfghjlpsqkfinor=FC=F2=EB=E1=DF=DF=DE=DD=DC=DF= +=E5=EA=EB=F1=F9yuod^[YXWWXY[]do{=F6=EA=E1=DE=DA=D8=D7=D6=D7=D8=DB=DF=E6=EF= +=F6~vrpxvtmlkiihikmnmklmo{~=FD=FC=F8=F2=F5=7Fy{xvx}=7F=FD=FF=FC=F5=EF=EE=EC= +=EE=EF=EF=F1=F0=FB=FC=F6=F4=EE=EB=EA=EA=EB=ED=EC=EF=F3=F9=FDwojf_\\_cchmo= +ps=FC=F3=EA=E1=DF=DE=DD=DC=DA=DB=DD=DF=E8=F3=FCsg`^ZXWVXXX[^_djn=FE=F3=E8= +=DD=D9=D7=D5=D4=D3=D4=D7=DB=DE=DF=E2=E3=E6=E7=E9=EA=EE=F6xld_\[]^^acbdgil= +spoonmmnopw=FB=F0=F0=F0=EE=ED=EC=EE=F1=F1=EF=F0=F1=EE=EA=EA=E8=E7=E4=DF=E0= +=DE=DD=DD=DD=E1=E5=E8=F3vojd^]]\[ZWXZ[^dn=FE=EF=E9=E7=E7=E9=EA=ED=EF=F0=EE= +=E9=E3=E0=E2=E1=E2=E7=EE=F8=FB=FCypnmkkkmr|=F3=EE=EB=EE=EF=EB=E8=E8=EB=EE= +=FAvka^^^^agmw=FE=F5=F2=ED=E9=E9=E5=E7=EB=ED=EC=EC=EE=F4=F6=FA=FD=FCzxtnj= +fccacgnw=F9=EF=EB=E6=E1=E1=E2=E4=E6=EA=F3=F9=FB}|usuuxuuz}=F9=EF=EA=E7=E6= +=E7=EA=EC=EF=FDyojf`^^____`__`ehmy=F6=EB=E6=E3=DF=DD=DB=DB=DC=DB=DA=DB=DB= +=DB=DB=DE=E2=E5=EF~roojf`][[[\][]^^aelv=FF=F4=EC=E2=DE=DC=DD=DD=DC=DD=DE=DF= +=DF=E3=EC=F8~oiea`__^^`dfinpw=7F=F7=EE=E7=E0=DD=DB=DA=D8=D5=D2=D1=D3=D4=D6= +=DB=E1=F0yj_[URONNOOQTW[^floz=F5=EC=E6=E2=DE=DE=DC=DA=DA=D9=D9=DA=DB=DB=DB= +=DC=DE=DF=E0=E2=E4=E7=EE=FByplhd_]\[\\[_cgijr=FE=F5=F1=EF=EC=EA=EB=EE=EF=F5= +|qmnlkkq=FF=F5=ED=EC=E9=E3=E0=DD=DA=D8=D5=D4=D5=D9=DF=EBrf^YXUUVVVXYYZ\_b= +fkty=F0=E9=E3=DC=DA=D7=D4=D2=D0=CF=D0=D1=D1=D3=D5=D8=DC=E0=EA=F5sf`^\]ZWV= +TRRSSUWXZY[aekw=F8=EB=E3=E0=DD=D9=D8=D5=D3=D1=CF=CF=D0=D3=D5=D7=DA=DE=E3=ED= +=FAvha^[VUUVYZ^hnx=FE=F6=F3=F3=FA~tmmmmpusvwuqons{=FE=FA=F4=EE=E9=E3=E1=DF= +=DC=DC=DB=DB=DA=D9=DC=DE=E0=E1=DF=E3=E6=E8=EC=F9=FEyog_[WTRPNNNNOOPSX^gx=ED= +=E2=DC=D6=D2=CF=CE=CE=CC=CC=CC=CD=CE=D0=D5=D9=DB=DF=E8=EE=EF=FDonieb__\XV= +SPONOOPRUY^dl|=F0=E7=DF=D9=D4=D1=CF=CE=CE=CE=CE=CE=CE=CF=CF=D3=D7=DA=DC=E3= +=EC=FEk]VPMKJJIJJKLNSY_iy=EC=E0=D9=D4=D0=CD=CC=CA=CA=CA=CA=CB=CB=CC=CE=D0= +=D5=D9=DD=E7=F3o_YTOLKKJJJJKMOSX^jz=F2=E3=DC=D8=D5=D3=D0=CE=CC=CB=CA=CA=CC= +=CD=CF=D1=D5=DB=E1=EEyf[TROLJIIJKNQZeu=EE=E4=DD=DA=D8=D6=D7=D8=D8=EB=D9=BF= +uF=DB=E2=CE=CCU=E9=D5x=F8Y=F1=D5VX=E0=D2=DDFd=C7OU>N=CB\=EF[=FA=CCHTUZ=F9= +E=E7=DA=EB=CEi=D0=CD~=D0=DE=CE=CC=E9=D0=E2=D0=DCVwdkfOlz=DDmy=DCl=E9\O`HO= +MNKOkm=E2=EC~=D0=CF=E2=EF=CA=CA=CC=D7=EF=CA=C9=D1\=E9=D3=FCiSw=D9rWW=FF\S= +NJtYGQamOS=E4=E2=D2zf=CF=CA=D9V=DE=CA=CE=D8=EA=D2=C5=D4Uh=CC=F2`S\=D2wKO=DA= +fORW=E7nO_=EF=F8W=FC=D9=FD~g=E1=CF=F3U=F7=CA=D9bm=DC=D1=E7\~=CD=D0mc=DB=D3= +nNY=F7tNHUp[JN~=E7h]=FB=D9=DC=EB=E4=D6=D1=D6=DE=D5=CB=CF=DC=DA=CE=D3=E6~=FF= +=DE=E1l[g~]SVTOIFJKFCNbdY]=E5=D4=DA=DF=D1=C9=C7=CA=CE=CA=C5=CA=D3=D0=CB=CD= +=D7=E9=E5=DE=F1c[cbTLPWPJIPVNJP_aXYu=EF~u=E6=D5=D6=DC=D7=CA=C5=CD=D8=D0=C8= +=C8=D6=DE=D7=D2=DEo_a^QOOOONSZXSTl=FCmjw=ED=E4=F3r=F4=DF=DE=FBp=DE=D0=D9=F3= +=F5=DA=D8=DF=EF=EB=D4=CF=D9=EC=DD=D0=DFgbuoZXYQMLNZ]VZ=ED=DB=EEu=EA=D7=D3= +=DFpfsfQKMU\bu=DD=CD=C7=C4=C1=C1=C1=BF=C3=C9=D2=DF=ECvXJ>?SM@KMIHIJT=F8id= +=D9=C7=CE=E2=DA=D4=CF=D0=DF=E8=DD=D4=DF=F4=ED=DC=D1=CF=D0=CE=C8=C5=CA=D4=DC= +=DFpM><>=3D96:AIJQ=EE=CD=C4=C2=BE=BA=B6=B7=BC=C2=C5=C9=D4wTTVNH@BHJJKOU\_Y= +Tx=D3=D4=D2=D0=D2=CD=C7=C9=CD=C6=C1=C1=C1=C2=CA=D8=E3iVKC?>><<<?EJR_=F7=D3= +=CB=CD=D2=D5=CF=CC=D2=F9g=FE=E8=EEln=E3=D2=CA=CA=C7=BF=BA=B8=BA=BD=C0=C4=CB= +=DE]OID?;657989;?JQMU=DB=CC=CC=CD=CD=CD=C7=C2=C6=C6=BF=BE=BE=BE=C0=C7=CA=CC= +=D6=E7pZROJFEFJMPUi=DA=DB=E8=E1=E6=E0=DFmUTUMGDEMYh=FA=D8=CC=C4=BE=BD=BC=BB= +=BA=BC=BF=C7=CD=CF=DBsTJEEC??@CFGENcdd\UTckd=FE=E5=DB=CF=C9=CA=CB=C9=C9=C9= +=CA=CE=D5=DA=DE=E4=EE{jl|=EE=EB=DF=D4=D4=D7=E0}xr\MIFCA?>AIR_=F6=DB=CD=C5= +=C0=BE=BD=BE=BE=BF=C4=CB=D0=DD=FF[MFEEBCDIKKVc=FC=DE=F0ik=E6=D9=D7=DB=E9=E2= +=D2=CE=D6=E0=F5=FC=E8=E2=F0megntliu=EB=DB=D4=D1=D1=CD=C9=CE=D9=F1rvnWJGGK= +KIJSi=E6=D9=CF=CC=C7=C2=C2=C5=C9=CE=D9=E9v_WLD?@BB@AEKO`=FB=D9=CF=D3=D5=D1= +=CA=C6=C3=C3=C6=C4=C1=C2=C7=CD=D7=DD=DE=EAlYOJIHFFGKS^hy=EA=E1=E3=EFlckkb= +YTU[bhq=EB=D7=CD=C8=C5=C2=BF=BF=BF=C1=C4=C9=D0=DD=FBaVLD?=3D>?@CGJNa=F0=DD=D9= +=EAz=EB=D7=D2=D4=DB=DB=D3=CD=CE=D6=E2=FFx=FEo^YUW\ej~=EB=DD=D3=CE=CA=C7=C6= +=C9=CC=D5=DF=F4hXNHDCBACHO]y=E0=D5=CB=C6=C4=C3=C4=C4=C7=CC=D6=DF=ECv\MDAC= +FHIKM]=E9=D6=CD=CF=DC=DB=CE=C8=C9=CD=D5=D4=CD=CC=D3=EA\SUSMHDDGJKLR`=EC=D4= +=CC=C7=C3=C2=C2=C5=CC=D2=D8=E0w^PKHHGGLVk=EA=DB=D1=CA=C6=C2=C1=C2=C5=C8=CD= +=D3=DD=FB^OHEFGEEJNOWg=E5=D5=DCxj=F3=DE=DC=E7or=E5=DB=DD=E8qj=FA=EC=FBi\]= +iooqz=F2=DD=D1=CB=C7=C5=C8=CA=CE=D6=DD=F5bTKEB@??@FQc=ED=D9=CD=C6=BF=BD=BD= +=BD=BE=BE=C1=CB=DB=EDrZI?>?DDDGM]=E9=DA=D6=D9=E5=EE=E9=EC=F9=FDmo=EC=E8=FB= +l_^msnmiflqro=FE=EB=D9=CE=CA=C4=C0=C2=C7=CB=CF=D3=DA=F4]OIGD@?CJVf{=E3=D3= +=CC=C7=C5=C7=C9=CC=D1=DD=F5aUNKIHIKMQ[t=E3=DA=D7=D5=CF=CD=CD=CE=D2=DD=E9{= +f]ZWSRPTYXZ\d=F6=E0=E4=F7{=FE=F1=F6w=F1=D8=CC=C7=C4=C3=C2=C0=C0=C6=CE=DD=FC= +k]OF?=3D<<=3D?EN^=EB=D6=CD=C9=C6=C4=C2=C2=C4=C8=CB=CD=D4=D9=E8s_YUOJGEDDDDDEG= +KSZh=EF=DD=D4=CF=CB=C6=C1=BF=BF=BE=BF=BF=C0=C2=C5=C8=CD=D8=E5pYNIGECBBEHN= +QUY_lu=F6=EB=E1=DE=DE=DD=D8=D4=D3=D4=D3=D0=CF=D2=D5=D6=DA=DC=E4=F1=FBoe]U= +QONMLLMNPRW^ju=FF=EE=E6=DF=D9=D6=D6=D5=D3=D1=D2=D2=D3=D2=CF=D0=D3=D5=D7=DA= +=DF=EA=F3=FBzlf^YTOMKLMOQUZam=F9=EA=DE=D9=D5=D1=CF=D0=D4=D5=D6=D8=DC=E4=EA= +=F3}mea`_][Y[aaaefjkfkov}unx=FA=F9=FD~=FA=F4=E9=E4=E0=DD=DC=DB=DA=DB=DB=DC= +=DF=E2=E4=E5=E7=EC=EE=F7=FEtoommkha]\YYYZ\_^al}=F6=EF=E6=DE=DA=DB=DC=DC=DC= +=DF=E9=E8=E7=EE=F3xmhd_]___cfmr}=F0=F3=F3=EC=E9=EC=F5=ED=E8=E6=EA=EF=EF=EC= +=E6=E7=EA=E9=E7=E8=EF=FDz=FC~=FDthknmmikrx~kdcb_ZY]hmln=EB=DF=E0=E3=DF=D9= +=D5=D7=D9=DC=DE=DD=DF=EC=F3=F5wmlh`_]^_bd_ev=EB=F8o{=EE=E7=ED=FD=FD=F6=E8= +=DC=EDbm=DA=D5=DF=EF=E3=D0=CF=EEURg=F8`T\=EF=E4w^]hyo]WW\]XY_ggaf=FB=E4=DB= +=DA=D7=D1=CE=CD=CF=CF=CE=CF=D4=D9=D9=DA=DD=E2=E4=E5=E1=E2=E6=EE=F6=F3l]ZZ= +SLKLNLJJKOSTW^q}w=F8=DC=D5=DC=E5=DB=D1=D4=DD=DE=D2=CC=CB=CF=D2=D0=D1=DB=F0= +=F1=E6=F0ian=7Fkabnt`VON]=F9lVMPg=FFbZz=D3=CC=D5=EC=E1=D0=D3=F5`i=EC=E0=F8= +o=EB=D8=D3=DB=E4=DD=D2=D1=DC=EA=F7pZIAEIE=3D<J|=E3{=ED=C9=BC=BE=CC=D9=CB=C2= +=CB=FB_=E7=CE=DB[Qo=DE=FA]a=ED=E3oQKNOHCFJNTYmzh=D8=BF=BD=C3=CA=CD=C6=CC=FF= +\=E1=C2=BD=C4=CE=C8=C7=EDI>>ED?ANp=EC=FA=EF=DA=CE=D0=DD=EC=EFxXG?=3D=3D=3D?GW}=DF= +=CC=BF=BD=C0=C2=BE=B9=B9=BF=C9=C1=BC=C7pVi=E6eIGYbJ=3D>GH?=3DHXPHO=FF=F1bh=D4= +=C0=C4=D4=D8=C5=BE=C7=E3=DE=CB=CB=DD=E8=DD=DDUR=C3=B9=CBL@=EE=CCO8=3D=CC=BB= +=CCXX=D9=E8>02?JD@T=CD=C4=CF=DB=CE=C4=C2=CE=D7=CD=C5=CD=EAn=FE=F2hORo=DF=7F= +`=F5=D3=CD=CE=D6=CE=C8=C6=D2=F5peZQOPTRQPOMNNKIGKQOP]=EB=D8=D7=E1=E3=CD=C6= +=C8=C7=C5=C4=C2=C1=C4=CE=D9=D7=D7=CD=D0=ED=F0}Nk=D1|H=3D=3DX=F9A6F=CD=C5=E8KL= +=ECx=3D6?[=E8=E2=DE=CB=BC=BB=C3=CC=CC=C8=C5=CD=D5=CF=C9=CF=E6c\SF=3D<I]MAJ=DD= +=C6=CDq_=D5=C9=E0NX=D0=CC=FCX=DC=BE=C2bHq=C7=D4JBt=CB=EBA?h=D1gGO=E3=D1{N= +[=D4=C8=CD=DD=DA=C9=CB=FCWTm=D4pK[=CC=C5=D8D?=DD=BA=C9G;L=CD=C8O=3D`=BD=BB=CE= +]P=F8{B7;M=F6=E4|=EE=D2=CE=E0ia=FC=DB=CD=C9=C9=C9=CA=D1=E9eVQMU=F4=D3=E6a= +=DF=C7=C2=CDxb=DB=D3fKZ=F6sRLPcTGDJSWUOYlko=F1=DD=CF=CC=D2=DD=D7=CD=CB=CD= +=CB=C4=BF=C0=C9=D2=D8=DD=EFe]RMMPOOLJJGBEPg=FB`Sg=D5=D7=E9=ED=D3=C2=BC=C4= +=D9=DF=D9=EF`Y]=EE=D9=DD=EEl_aqeZ^=ED=D6=D7=E4|=EE=E6pSKSk=F7YU=DF=C8=C8=E3= +]o=D2=D7]Ny=CD=D4ZIQ=DE=DEUK^=F9jUNm=D6=E1bs=D3=D4yV^=D6=CA=D9w=DC=CA=C6=D1= +uy=D8=D5=EFjx=FChYSS\hZ]XMKQOg=DE=FC\WL]=CF=D0x=F1=CA=BF=BD=C7=E9=F8=D3=F0= +MJW=E9=CF=D9=F4=E1=D3=DFhOR=FA=D3=DFfi=F2=FCUA?LaQDW=CF=C8=DDd=EE=C6=BE=CE= +f=E0=C1=C1=FCU=ED=CA=CBlKV=E2lHEO]XLLV[MIV=F0=DC=EDv=EF=D5=CC=D2=D7=CD=C1= +=BE=CB=E4=E0=CE=CC=DEicx=DE=DF=EA=E9oZTKHU=E1dHKLKH@C\=DF=FA=7F=CF=CF=E6=FA= +=F3=DD=DB=E2=D9=C6=BE=C3=CA=CB=CD=CC=DA|=7F=E1=DC=E3=F5f[WKDCED=3D>Ks=EDhl=DE= +=CF=D7=F9z=D7=C5=CB=DB=D7=CD=CA=D5xf=DA=CC=E1\p=E1=EA\LU=EBvIE[nTJJe=E0cN= +=F9=CB=CE=DF=EC=E4=DF=E9=ED=D9=CB=CD=D6=D5=D2=CE=D9mh=D6=CD=E3_]f=DD=D9dN= +QMDBHJQc=F7=F6iVXrdM^=D1=C6=CF=EE=DC=C6=C5=E6b=DA=C7=CA=DD=EB=D7=C9=D1ca=E3= +=E0S>?R=EDbJU=D9=CFjM]=D5=CB=DEh=EC=D2=DE_f=E8=E9=F8\XkhTS_\T\_ekgm=E5=D2= +=CF=D0=D2=D5=CF=CA=CA=D0=D9=D6=D3=D4=DFbl=E9mRILScfLKPNM^aqqX=EB=C2=C8QC|= +=C6=C5=E1]=CC=BB=C7QQ=D2=C7=E1OT=DA=D7RHY=E3=DF]Oe=ECYFQ=ED=DB=E8o=E6=D1=D7= +_NWn=ED=E6=EB=DC=CD=CC=CF=DA=EE=EF=DB=D9=F9k=FE=DD=D3zNTiRCBFNQIKk=F2ZV{=DC= +=D5=D4=D2=C9=C3=C6=CC=CF=CB=C4=C2=C4=C6=CB=D0=D5=EESNXZYRKHI?9ATOUUU=F6=E5= +MI=E1=CF=D6=CC=D1=CE=C6=CE=F3=E9=CB=CD=D4=CC=CB=CE~On=CF=DCNK~=CF=DAI>U=D9= +zIJo=D6=DAo=F4=D2=D6=EC=DF=D1=D3qUt=D2=D7WJd=DB=F6J@P=DC=E2KDa=D3=DC\V=F1= +=CD=D0d]=DD=D6t]=EA=CF=D0=FFb=E0=CF=DBgv=CF=C7=D2y=EF=D0=CFuU=FE=CE=D4_LQ= +v=F2TH[=DDyG?M=E8=E3K@_=D6jGM=F1=DBjm=CA=BE=C8bc=C4=B8=C6_=EA=BB=B6=CBMJ=EF= +=D3V>E|=EFI>DZ^KJ_=D9=DEbk=D7=CE=D6=DF=D7=CF=CE=E0bj=DD=DA=EB=F5=FE=F0=E1= +=EA^X_hv=F1=F9=F9=7Fc\=EB=D7=FC[Zd=EF=E4j]=FC=DE=F7rh\f=E2=DEr`h=E9=D9=F2= +W[=E5=D4=DFiZj=ECwi=F8=DF=DA=DF=E0=E1=ED=FE=EC=DC=E2=F7=EA=DB=D6=DAx_=F5=E4= +[Oat_iYNNUNPXT[=EE=DF{dh=F8=DA=CF=DE=EC=D8=CE=CE=D2=DF=DC=CC=C9=D5=EB=DF=DA= +=E1~l=FB=EAtUPRMJIKLJL^=EFoPU=E5=CC=CD=DE=DC=C8=C2=CB=D7=CF=C3=BF=CB=E2=DB= +=D1=DAcUUOMLJGDA@EJILd=EF=FA=F6=E6=E1=DD=D2=CD=C9=C7=CA=C9=C4=C3=C8=CD=CF= +=CB=C9=CD=DF=E8=EEbROQQOMIHJJKGELVZUR_=FE=F8}=F5=DC=CB=C5=C8=CB=CA=C7=C5=C7= +=CB=CA=C5=C2=C8=D5=EBihq\OORPMGACJIHMUYXUXc}=DE=CE=C9=CC=D2=CF=C7=C7=CF=D8= +=CF=C6=C6=CE=E7t=F2=E7=F8q=FE=F6o_VPPONLOQQQOOX`cr=EC=DC=D5=D4=D4=D1=CB=C8= +=C9=CF=DB=DC=D5=D2=E0na=FD=D8=DC]O[=EC=F7XLT=EA=E8ZORZ[NJQdjfcj~=DC=DB=D8= +=D5=D3=D0=CD=CD=D5=D6=D3=D5=D7=D8=DB=D9=D8=DD=E4=E2=EDmZWWVPLKKJIMTZSUp=D6= +=D3=EB=FD=DA=CA=C8=D6=E6=D5=C8=CA=E1y=EE=DC=ED_\{=E2=F4[Uco_Yay=FBbX_=EF=ED= +jf=EE=D9=D9=E8=F1=E2=D8=DB=E8=F3=EC=E0=E5=FDjedfa[XZ]a^Y\itv~=EB=DF=DC=DA= +=DA=D6=D5=D9=DE=E6=EC=E9=E9=EFvh_\[[^cghjim|=FC=FE=F9=E8=DE=DD=DF=EB=E1=D8= +=D6=D7=DC=D9=D6=DA=E5|ung]Y[[ZVSUXYVVWZZ[dv=EE=E6=E1=DE=DD=DC=DD=DE=DE=DC= +=DB=DB=DB=D8=D6=D6=D5=D6=D7=D7=D8=DB=DC=E3=EF{lb[UPNMMMOSVY]aix=F9=ED=EC=E9= +=E5=E2=DF=DA=D7=D7=D7=D7=D7=D9=DA=DC=DF=E5=EE=F7=FC}ojf^YSPORUVYY]hx=FB=F0= +=E6=DE=DB=DA=D9=D7=D5=D5=D5=D6=D4=D5=D5=D7=D9=DC=E1=EA=F1ucZTQOOOPRUVV[_f= +ko=FA=EB=DF=DB=D6=D4=D2=D2=D3=D4=D6=D7=DB=DF=E8=F7ukb\ZYYZ\_ejs|=FC=F5=F6= +}yw{=FF=FA=F9=F7=FEz|=FF=F5=F6=F2=EE=F2=EA=E5=E0=DE=DE=DE=E1=E5=E8=E8=EB=EF= +=FCzxql`_```fkmmjgc__^_cfmw=FD=EF=EA=E7=E2=DF=DF=DE=DD=E1=E2=E1=E3=E4=E4=E5= +=E5=E7=EB=EF=F1=FBvmjjgfegghmq{=FC=F7=EC=EA=E9=ED=FFqje`eijmnpnluz{=FF|us= +tw=FA=EF=E9=E4=DF=DF=E0=DF=DF=DE=DE=DC=DC=DB=DA=DE=E1=E9=ED=FCmklgda_][XU= +TTRQSSUX[^fu=F4=E5=DC=D7=D4=D0=CD=CD=CD=CD=CC=CC=CD=CE=D1=D6=DB=E2=EC|kec= +a\Y[[YYWTRSRRPPQPPRSV[du=EB=DC=D3=CC=C8=C5=C3=C2=C2=C1=C1=C3=C5=C7=CC=CF=D8= +=E0=F5eWNJFDCBCCBBDFIMS]n=EF=DE=D6=CE=CA=C8=C6=C4=C3=C3=C2=C3=C4=C5=C8=CE= +=D2=CF=DBhTNKLLHFHFA?ACIUf=F6=DF=D9=D8=D3=CD=C9=C6=C4=C3=C5=C8=CC=D1=D7=DB= +=DC=DC=DF=EBu`XOLKIIKLNPQVZbv=EB=DB=D7=D3=D0=CF=CE=CC=CB=CB=CC=CE=D4=DC=F0= +la\WTTSRRUW[]`ed`^\^h|=F1=E8=DD=D9=D4=D1=CF=CE=CF=CE=CF=D0=D3=D8=DE=E5=E9= +=ED=F6uf]ZXRNMMNOQSV[_ait=F9=E8=DF=DB=D6=D1=D0=D0=CE=CC=CD=CD=CE=D0=D4=D7= +=DA=DB=E2=EFvf^WQMKJIHIJJKKNSX_i}=E9=DF=D8=D3=CF=CC=C9=C6=C5=C4=C4=C4=C4=C4= +=C6=C9=CC=D2=D9=E0=F5n^WRMJGEDCCB?FJCGENa_r=F4=D7=CF=D4=D0=CC=C7=C4=C3=C0= +=BE=BC=BE=C0=C5=CB=D0=DB=EDql`]XTSPNLLLLMLLLLMMOTZ_ck=FA=E3=DA=D4=CF=CB=C8= +=C5=C5=C6=C5=C6=C9=CC=CE=D1=D3=D7=DC=DE=E6=F2p_VPLGB@@AABDHJMS[g=F7=E0=D7= +=CF=CC=C8=C4=C1=C0=BF=C0=C1=C4=C6=C8=CA=CD=CF=D4=DB=E4=FFbXOJFC??>>>?@AEH= +NZn=E3=D5=CD=C7=C3=C0=BF=BE=BE=BE=BE=BE=BE=C0=C3=C7=CC=D5=E5nZOJEB@@??@BC= +FIKMSZj=F7=E3=D7=CE=CA=C7=C5=C5=C4=C5=C5=C4=C5=C7=C9=CC=D0=D6=DD=EA{eZSMI= +FFFGGHJLNORZcs=F1=E4=D9=D1=CF=CC=CB=CA=C9=C9=CA=CB=CB=CC=CE=D3=D9=DE=E8=FD= +k`ZXTRPNOOOPRVXZ^`fmx=F6=EE=EE=EC=E6=DE=DC=DC=DC=DB=D8=D7=D8=D8=DA=DB=DE=E3= +=EA=EF=F7=FF=FCzvpnlljfgedfijkkjgfffjlx=F4=F0=ED=E9=E6=E1=E0=DF=E0=E4=E6=EF= +=F9yrngils}=7F=FE=F7=F1=EC=E9=E6=E4=E3=E3=E4=E6=EC=EF=F4=FDuj`_^[XZVQlZ_d= +Z=FE=F3or=EF=E1=D7=DF=EA=DC=D7=D9=DB=E8=E1=DB=E1=EA=E9=E4=DE=E0=F3=E7=E4=E3= +=E6=FCx=F9|qjhpob]\\^YUZ]]ZWX]^]^do=F7=ED=E8=DF=DB=DA=DB=DD=D9=D3=D1=CF=D0= +=D2=D3=D6=D8=D9=DA=DC=E1=F5yohb^\[[ZYXXYYYZ[ZYY[^ejy=F0=E6=DD=D9=D8=D5=D0= +=CF=CE=CE=CE=CF=D2=D5=D9=DC=E3=F8od\UONMLLLNOORW\es=F9=EA=DE=D7=D1=CF=CC=CA= +=C9=C9=C9=CA=CB=CD=CF=D4=D8=DD=E1=EEzkc]VOKIGEDDEGIKNS[do=F5=E3=D8=D0=CC=C8= +=C5=C2=C0=C0=C0=C1=C5=C8=CB=CE=D4=DD=E9{cYQLIGECCCCDEHKOV_p=EE=DC=D5=CE=CB= +=C9=C6=C3=C2=C1=C1=C3=C4=C7=CA=CE=D3=D8=E3=F7j\UOKHGFEEEFHIKMPV]fy=EA=DE=D8= +=CF=CD=CB=C9=C8=C8=C8=C9=CB=CD=CF=D2=D6=D9=DC=E3=ED=FCoc[UOLKJJJJKMOSY^h=FE= +=E9=DC=D5=CF=CC=C9=C8=C6=C6=C5=C5=C7=CA=CC=CF=D8=E4yf\SOKHFECBBBBDGKR[j=EF= +=DE=D7=CE=CB=C9=C6=C4=C2=C3=C3=C4=C6=C8=C9=CA=CD=D0=D7=DE=EC}f[WROLKIHGHI= +KLMOSY]dks=F7=EA=DF=DD=D8=D2=CF=CE=CC=CA=C9=C9=C9=CA=CB=CD=CF=D3=D8=DD=E1= +=E9=FBk]WQNLJGFFGHHJMQXav=EE=E0=DA=D4=CF=CE=CD=CC=CB=CB=C9=C7=C8=C9=CA=CC= +=CF=D4=DC=E9q_YTQOOOONMLMMNSY_fr=7F=F4=E9=E1=DD=DD=DC=DA=D8=D7=D8=D9=DA=DB= +=DD=DD=DD=E0=E7=ED=F0=FC{vtvv=7F=F3=EF=ED=EB=ED=EE=EF=EF=EF=F2=F8ymlhb^[X= +USTTUUWZZ[[^`i=FC=EA=E1=D9=D3=CE=CB=C9=C7=C5=C5=C7=C9=CC=CF=D7=DE=E9|j_[W= +QNLIHGHJLNSX^gn=FC=EA=E0=DB=D5=CF=CD=CC=CB=CC=CB=CC=CD=CE=D1=D6=DC=E0=E6=F0= +|l_YTOONMMLKKKLLNPW]gv=EF=DF=D8=CF=CB=C8=C5=C4=C2=C2=C3=C4=C6=C8=CB=CE=D4= +=DD=EA=FDka^XRNLJHFEEDEFGJMPV_p=F9=E4=D7=CF=CC=C9=C8=C7=C7=C8=C8=C8=C8=C9= +=CA=CC=CE=D3=DA=E2=F0sf^WOKHFEDEGILRY`n=F8=E5=DB=D5=D2=D0=CF=CE=CD=CD=CD=CE= +=D1=D4=D5=D7=D9=DD=E3=EC=FCulg^YUSONMNORVY\`jt=F7=EA=E5=DF=DC=DB=DA=DA=DA= +=D9=D9=DA=D8=D8=D9=DA=DD=E1=E9=FCrjfa`aefcb__][[\^`dhlnpw=FF=F5=EA=E1=DD=D8= +=D3=CE=CC=CD=CE=CE=CF=D1=D6=DD=E4=ED=FBvc]YUUQOOONMLLLMOQV]j=FE=E9=DE=D7=D3= +=CF=CD=CC=CB=CB=CB=CA=CB=CC=CD=CF=D4=D9=DE=E4=EB=EB=EF=FDxk^WRMLKKKKLNOSW= +[bn~=FB=F4=EC=E7=E3=DD=DC=DA=D7=D4=D3=D2=D0=D0=D1=D4=D6=D8=D9=D9=DB=DF=E4= +=EB=ED=FCywtrmd`_\YUQOMKKLLLMNRY^l=EF=DE=D5=CF=CC=CA=C7=C4=C3=C2=C3=C5=C7= +=C9=CD=D3=DC=EDn^TNKIIIJLNORVX\`el~=EF=E4=DE=DA=D8=D3=D0=CF=CE=CD=CE=CE=D1= +=D7=DD=E9=FDi^XRONMNORW]`el}=F0=EA=E4=DE=DA=DA=DA=DA=D7=D6=D5=D6=D7=D6=D8= +=DA=DC=DE=E2=EA=F3zoh^XTOMLLLNOQVZ_hs=F1=E5=E0=DF=DE=DC=D9=D6=D4=D2=D0=CE= +=CD=CD=CD=CD=CE=CF=D1=D6=DC=E1=F0xf_\VSQOMKKLKLLMNQV\ep=FD=E9=DF=DC=DA=D8= +=D5=D0=CD=CC=CB=C9=C8=C9=CA=CC=CE=D2=D9=E0=EC~k^ZUQOOOPRSV[_``fmt=FD=FB=F6= +=EE=E9=E7=E6=E7=EB=ED=ED=EF=F1=F2=EF=EE=EE=ED=F9}{vvtwx=FF=FA=F1=E8=E5=E3= +=E0=DF=E2=E3=E3=E4=E3=E7=E7=EC=F0=FAunkjjid`__]]^bgijhd__][]ajv=FE=EC=E1=DB= +=D6=D4=D3=D0=CF=CF=CF=CF=D2=D8=DB=DF=E5=E3=EA=F9oc^ZTPNMKLNOUX]afmv=F9=EB= +=E1=DE=DC=DA=DA=D9=D7=D5=D5=D6=D5=D4=D6=D8=D9=DB=DE=E0=E1=E3=E2=E3=EB=FBw= +--hal_9000 +Content-Type: AUDIO/BASIC +Content-Description: I'm sorry, Dave (BASE64) +Content-Transfer-Encoding: BASE64 + +6u75/fv38enj4+Lk5+fs8/3+eHdzb21oY2FgXV1eXFpZWVteY2v66eTd29fV1dfa3N3e3t/f +3+Lk6/L8cG1oXlxaWVlZWFpcXmBkZ2hoa21tbnV5/vTr5ODd3NrZ3Nzd3+Pl4+Df4OTue2pm +X1tZVlVXWl1fYmZtefjv6uTe2djV1dbZ3uXveW5vbWllYWBfX2NmY2JhXlxaW2FrdfDq5N7c +3N3f3+Dl6u309350en1//P59fP79enp2cG1sb3V+9Ozl4d/e39/n7e/29/r+eHFtZl5YU1FQ +UVNWV1ZYW2N19Orf3NjT0M/Ozs7P0dXX2Nve5fR0Zl1YUlBRUlNTVFZZXWJvfu7n4d/h3+Hl +5+rs6urn5OXm5ejv9Pl7a2VlYFxeX19fYWZna3B6+/Ls5N7d3Nzc3uPm6e3+b25qbHJwbGhn +bWxqbnBxc3r68+3o6Ozu7u3s5N7e3ufu9HhsYlxZV1dVVlhbXV9iaHP+7+vo4t7c3Nvd39/f +3tzb3N3e397g6PZ2b2ljX15bWVVTUlNWV1tcXV5kcPHj29bT0dHR0dXa3+rv7+/1/3drZ2Nd +WlhWVVZbYW5/9+/t7enm5eTk4+Xl6fP7/HptamppaGpscHBxevfu6OHf39/f5Or4dnRxc339 +endza2loZGRnaWpoaWxyenx8ff317ero6OPh39/l5+7w9PT0+fr59/5uaWFdXFlXVVNUWV5k +bXp+/PHu6ODc2NbU0tDOzs7P0NPW197o+HZqYFtWU09MSklIR0hISkxOUVZbZH/k2tLMycjI +yMnKzM3O0NPW2t/p+Xl1b2hhXFZST05NTExMTVBXXWdy9urh3dvZ2tvb29ra2trc297j6O30 +d3FqY2BfYmRiZGFfYmdlZF9fY2NjY2hy9urm497b29nZ2dfV1dfa3+fu/HJybmReW1lUU1RW +V1teYml2+/Ty8Ovp5t/c29rY2dvd3+Pn7PD5/nFoZF9fXlxaV1VVU1JSVlpeZG/z5+Dc2dfU +09HPzs7Q1NfY2tzf5ez5fXVtaWNcV1ZUU1JOTEtMTk9VWV1iaW/56d7Z1dHOzs7Oz9HU19jY +2dna293m9nRkWVNPTk1NTExMTlBTWV5ka3zv5t7a19LPzMrJx8fJyszS2+h4Y1ZPTElHRkdI +SUpLTE5PVFtfceze1c/Lx8TDw8PExsjM0dnj82lbVE9MSklISElMTlFWW2Fv9uff3NrY19bV +19jZ2+Dp8vn9eG5qamZlaGxtbG1ycG9xd//z7+/v9PLw7Ofm4+Dg5Ons9XxvZ15aV1ZWVVNS +U1RXW19u+ubb19PRzszKycjIyszP1dvoeGBYU1BOTUtKSUpMTU5QU1ldZn3u5d3a19TSz87O +zs/P0tfc4uv3enBqZWFeWllaWlpbW1xdXVtaW11hZ3L66t/b1tLPzs3LzM3P1tzm9nNlXVdS +TktKSUlJSk1TWFxhce3f2NLNy8jIyMrLzc/T2N3i6PJ1Z19bVlBOT09PUFBQT05NTU5RVl5r +9ODXz8vIxcPCwsTHys/W4fZpXFVPTUpIR0dHSUtNUVpmeufe2tfW1dLS09TV1tbY297g3+Tq +8f5zaWJcWVVUU1RUVVhZXGBt/+7m4+De3d/f5Ofr9vh8f/378e7u7u/6fn58dXVuam9vb3h/ +/3h5dXRubW1z+vPs5t/a19PS1NbZ3un9aV1YVFNST09PT1FUV11ganL+8ejc19bV1dbZ3N3g +5Obp6+7r5+Hi6Ovv9nxxamlnX1xbWllYWVxdX2h58+zo5d/d3eLn5uXn7fb7fnZtaGZiXlxb +W15iZXH86t/b1tLPz8/P0NPX3ur+a2BdWVdVUU9OTUxLSkpNT1VbZHrn3dfSz83NzMrJyMnI +yMnLztLW2+f8a11XU05LSUZEQ0NERUdKTlNZXWBw6d/b19TQ0M/Ozs3Nzs7Pz8/Pz9DT19rc +5PlsX1tXUk9MS0lISEhJTFBWWl1o+ejj39nRzc3OzczKy8/W3OX2c2ddV1NRUlRTVFtmZ2Jh +buzi5O3l29fY3uPg29zl93B0bGRcWVtcXV1dY2z/9vPs5+Tuf/rq4eLp49zc4O318fLz+Hp9 ++Pvx+HZvbXB0amJdW11hXVdSUlZbXVtcbvn8ffjn3tvZ1s/Oz8/Ozs3Nzc7S1tzl7nlqYVdP +Tk5RT01LS01PUVNXWl1fZGp1797c29nWzszO2NzZ2d7uf3rw92xvevz/bmlrdn1ucPLu+XZx +8ejt7/D2+Pjy+Ph1anR5aV9faW9kVlJcaGJdYnB7dGRkc/357d/c3t3Z0M3O0c7LydDc2tjf +Z1VRUlVNR0hOT0tJSk9ZW1Zf4tLP41dQ28LH7GHZv8bex7a4YzlCzbW85Xfdakc7MjVCZett +VkVCRUdKYODbxbeyxUY+X7y62k9Wy8xURVHRxdL76s7J4FVd39DVd2BtcH1ZRUdIZ89WRUJM +2fBVSU9OQc25qrMyKy/Pqa23w7Syby8nLkbIvcHDz+1HOzpFbc7Cw8LM7FJBPj9LWmT/3NXj +Y1hu2c7Oz8/Q2u335dnd9Xro33ZZWGJ5b11bZ2pWTU9UWFdh5XVr39zO4V3qy75ZP8W7t788 +Mzdrx9q6ub/BTzAtNkFY2MO+wt9FP0dVaNTDvLrE3FNCP0FNcexk28zdZVDszsfWX9XI2V5d +59riXFv64G1aZnP7Yl9kcF5LTE9jXEtg3df0W9rO2HBMy7y9v0o8O07Mz7u1t7t1Oi81PEru +wrzBz1VFQERPfMnAvsTXXUQ/PT9HW9jN6HXOy+hbdMq/xuzvyMl3T2nW2WNQY+prTEti8V5J +S2B1VklLZuR0ZfLe09TX1uznyL61v0g4P97L1ce7s71QNjE4Oj5Zzb/E4lRJSUxNZ87AvsbW +bU5GQEJLWn7h0snN6HDkyMzh6su+xXtY+M/vTk/+4F5KS1xbSkRMWFlPTVv+cWl35drOytLX +y8jK2lfyxLe6WTo8b9dtVdS4t9s+NTs8Oz9dzMTPZU9SXVph9c3Av8bR61xPS01TX3XczMbL +3X/u2uBsYfDZ2XNVVWFgVlNaZ3VtX15jZl9eYW/47+7y7Obf19HP0dTU1tni8Wdabd/P21dF +Q09fZmd32M7T91RLSU9bbff07eri397c2NTR1NzndWVeXV5dWFNRVFpfbfHe19TT0dHT2d7o +7ntmX2Fu+/h4b3J1b2lhXV1dW1paXF9qfezf2tnY2NfY19jZ2d57a+3a42JOSk5cXVZZbOPZ +2e5jXFxhbXVqZ2htc/Dj2tDNy8zR3OXs+2tdVU1IRkdLT1llfeHUzc3Oz87Oz9be5u/7dXz8 +fP54amJeWlZVUk9QUFFTV1xfa3vs5NzV0s/P1dzRx8fU+WBcaXhrftrPz9fuXVFRUFBRTktL +T1JXYn3j1tDS1drg5e17ZV5bU1NVWWT039rQysjJyMjLzdfvcGphXFtcWVdXU1JTUlFRU1NU +VlhbZnb36NzWzsvLzMvKys/e5tfP1HxQSkpKS0xUe9zefl1ST05RW2Rsbmxv/ubXzsnEwsPG +y9Ha5XdfUUpFRERERUhPXG/n2tHLyszN0trf5+vp6ezy9vt/eHJvaWVdWFVTVVZXW11gZ2/4 +6eXe2dfV1dXY4uTZ2+Pg9W/9ZVljcHnp5O31cF9YU1JSVlpYVFddZHjs39jV1tXS0tXa4Ol3 +X1lZXGVx9+jd2dnX1NXY2eT7bF5ZVVVVV1laWlldX2JqbXBwbmt1/vfs5+Lc2drZ1dDS1cza +YWnz7GdcZmpwaFZOU1tcW11x+Xr88/rn2+Hn4d7ocG/x6ejy/vfs9mdeZ+buYGzz9e5lW/rv +fmlh+e1t/W7w43vt8OHr8Xt86HJs/XDqc/16/d1e33F63Frcd3TdUvRVXWNU92Xh9npt7uz0 +3frS3+DaX9b66+Pu5Pz4anl4Xn1efPteXWBbZF1aa2BhXWNra/Zh73p563bd593V6tXp3NPi +ytvQ2t/f4fbw6nnvbl5cTGJTa21T8ExfVFVlUGhcbO5ffHdc32/j4uzQ39fY2tfW09XV1OvU +XuBqX+pTeVRnXFtdS1pNW1pV/1fqX+Hq+s/6zN/S0+zG987b2c170GHVXvVdVGlLdklhV0lm +R15OUW9O2V7o/ubY5Nnf09fQ2NDU09jc3Nzp7fXq5mhrX15aVlNYT1xSVk9XT2ZWZP/13+/Z +5c3c09fP0tPZz+bZ8+voX3NOa0tiT19bZFtf/F53eHfn3+vee9Vj23Hg3P/eeN/jZfxYfV34 +c2znX+Ve71ps/mXdV91v5N1fzv/R4NbV/NZtbO5P9UzxU1lkSv9Ick7/WG5tefLt3evS3eLR +3dLX49fl0fTb6evoZ+dUcFxjcmZkamb7W2dVZ2Va7Froaep56u/7/O/2def27m3ra+T94Gzc +YOlhZ2tx6Xzeetrk3uvg5t1152byc15baF5oY1fqafh0a+T8a9pY11ft/ufcXddn2/Ry4Gfo +dmHuYvxX32Lweeft//Hs7/L07W3ob2tb9Xta5UzgXXVeXOD+22nf3tbc393p+dpo0Gvpbt/x +Yvda2lbxXFzuU15TXl9RX1FscV3ie9T24dzr2dv23O/a4+fn49ng+tzueeBa7uZ89lzkb216 +T1ZvTWBOW/FZ2lTk9nTpWthl013q5f/cb/DZ0+7h127Tbfj4a2ph7mjbeOrSZtFp63JndHFW +UV5Rb05fVWVhW11g1GjXd/Pf1X7c3uXV2PnQ78541dra8G9jeG3n71btYXFvSmZNXvxSbVbv +dVt/VdJY6mpn5ONdcO3edeLn2ODO3NHgz93Z1Obm3mzaaPjtUvhLXlBaWUlUTlL+SXlhb/xo +3VzdXNvW897X1tjd387P19PqwuzU6+/bVF1pXORKWEFRTEZUTGpc427vaG3r5t3q3tXU0NzO +y9HN2OLa3u7famlkWV1NTkpPTklYUVlPT1r5cONqz9XK19LO18zg0tDJ2c/bztPqVXZp7llL +U2BwTU1JX1tQT0tTV1ldWF5/8P5+/dzQ287NzcnPz9DG0s7J4MzwcG1qc1NZSk1WTkxCTFBM +VEdcXvBfb+nf1OnY29bR1M3Q19DOzNbU9tjd4utiZWr6XlhSTlhVTkpITFJcU111fHppdN7Y +/u7Ux8vm9NXCxtXg2MvVaGXu2uZYTlh+Z1NOTl5TSEpNTldfUFrZ2eB4XvvTytnq1ci/x97i +0cfJ1e3n2uFoVlFXW1VKRklISUZERUtTTlBe7994X+TLwsTMxLy7vc3gvbnI1e1kbUg4QWLj +4GlPUkk6MzAzO0ZPaebPx8THxcC/vsPCvLzRTER3xspmTHjK0VJATN/O5lxYXlhJQkJGTl5d +Wl5l6uZtUVX72cvP0crV6cO+v7vOTD5GZcu8vsTGzlo8LywvN0FY7dbPys7b6nbo283LzcvG +zG9QSFJhZ2Zq3dPX4ufd0tPgb1xTTk5MT1366ur1dWVo7t3f72laXuLJxtHlbV/UwdNi/V1C +Pz5Bb767xs1vPzc3NjpL7se7uLzFztrh3tXPy8fGw89ZQDk7QkxMTmT66ej5/uzX1Njfe2dl +f+fX0NXa397xX1JTbePfX0xKUXHb0X1IPVLIx8fRSz48TO7Fsra+v95GNzQ2PmTLv7y+y+Ht +a198287IxcrS5U89OTtBS1hfbd3d4uXs3d3Y2+rt9u715djU0t7/Y15dVlRZZ+ndc1NMTlv9 +2tzvX0x1xsXDzVQ+OUR7wrCzvcpqQDc4OUBxx7u7wNNZT1BPYOTPx8bL2vZKOjg7SVlv6uzT +0NjX2dbTz9Dg8HV0fe/l9XxqYWBaVk9PV1pge/VuX1VRXefRztLXZ27Ev8K/5EQ6PV7Ksq+8 +zV8/NDQ3OUrfxcHJ2VhLUFZr18vIxsbJ2VZCPkNVamzx4Njb3NvX0dPY4+p1XV5g/d3c7mNZ +VlVQT1FTXW/v8GBdXmDo3NfX19Rz28DCv8tOOzdF7MGytsPhTTw1ODtCbsm9wMrfT05cbOTW +zszKx9NZQT0+RFFVXOzTz9rY2d3X29/x6Ohtfuzg4vR5Y2VgVE9SX3H/eGxmaGtpc+re5eTc +auTDwr/NSTo4TdS/s7nG3U8+NTY8SOLEvsncck1OWGHs3M7KycnvSD9BTVteXWrb1Nre29HR +1dvu8e/r5+Dc4/V6b3ZtYVZOVGNxaFpXXWZubGVncHBmVuTCwb7MTDw7VMu8s7rE0ltEOTc9 +SffIvsTW/V9dZGr14dnNzdH+Rjs8R1ZUT1j13OLo39HKy8/a3+Pt6+Ha1uD3++/oel1YW2ho +XlpSVV5tdmJZWFlY+svHxtZMPj5Yyby3usHLckk9OkBP88vEyNT6ZFtaXWns39TP1XNJQURI +Tk9RZ+TW19rPycfJztXhemVhb/D2eHn4cltPTlJZYGRgX2Vvfevk6uh7Xd/Hvr7wPzxI2sPC +wsLCzF9ANzY9TurQzdHc6PN3al9u5dfNy9dZRUZSXlRMVeXP2mpr2cjHzM7O1uhsYF1dbOnc +3+9pWFBVWlZPTVNgbGRkXk1V2MO92z87TM6/wcW/urzNVT06QFL23tvZ1dHX62NYXW7v5+h4 +U0VDS1JST1nt09Lc39jNyszP0tTZ6Xlucvv8c2ldVVJccmNOSVN2eVpUVWTdzMPMTjxF3sHD +zci8usdkQTw+SV/8+eTXz9Ppa15g/N3c6fb3Z09GR01YX2nw3NnY087LzM/T2uZ2X1pcZHHy +8P9rXFxpXU1JTFx4eF5Z6MvCyVY8P3nHxdDOvLa95Uc+QklOUVRq39PU5Pb56+Xr7uje+1JJ +SEpNT1z64Nna2tPLxcfNz8/W72ZgaGxfW11dWVZbXFFMUl9jV09OadLJzW9LT+PLzNbNvLa+ +3VFLT01IRkxl4+L6bf3h5HJr6Nv5W1lcVE5PWWdsZ23q2NTVz8fCxcvU3OHwe2dndWpgbu5e +S0xYXFNSXFZd3Nj9UURFU3Xz99e/usHSf2dhT0hIVebX3tzPzdHX0MrO+2P0/kw/Q1FYS0JM +7NxuX9vHydTUy8nR6fXr7XZrdOvf7mhgY2VcVFhXSl3W5VtQUllWVFrqxsHLy8nSdVNQT01R +WGJ55eLezsbI19LGy/ZYVVdPRj9DUVNPWPze3+DW09jb2tzk5N/n4dbOzuHu2tnubujoVGvZ +Y1VRTU1GQUhccFpb5NPxWFt1YU1PdPJx69TGwcXEv73AycrS5GVOSUZDQkZKTVhs7Ov48eDc +5fv37H9o/Of0Zmbt3eb73td328zsfnJhXU9KTmfv/eza1e1ua2RcVlZbWVllb+XY1M7JxcjK +y9DT62RYTUhDQkRLT1hp69zVz83P0tXg/nxkXFxVVF5u7dzy5sXPberd8mhbXebc6tzNzdTe +73plUExMSERGSEtXVl/v7NzT1NbW0t30bGBfXV1me+/h2dLMx8TDwsTHzd/raVFQSUNGSEtK +SXNtT19pWlRUVmJ+7+XZ0c7QzMzMzs/Q1Oj+el9iamBv+vL9cG1gY1pPTk1IR0dHSk9Yb+LV +y8XDwL+/wcTJ0dngbFZZVk9NWHdUWX1mVVVYXVleanf75OZ/7uf8d+zq6evh6/Xg7O/h5t7h +5OPp8mpaVE5LSUhHSkxTXGzp19DNycrKycrNztLZ3vl97WFq1G1f3fpaY2BZXWlkb3d2a19c +XVlWYmRdZXRlYf5zbOzs397h3d3i3+h6bGpbWVlaXWVu7t7a1M/Pz8/R19rj63xfW1tVVE9m ++Vhq4PL84vLw7PZ78u7q+Xz28m9tdmVcXmRdXW1vZn/r5uzm2+bt63RjZl9bXVxcYGhv8+jd +1NTR0c/S2tnucG5nX1tdWVJe6Wpi4+f35PH96OLr4d3b3OTq7/lxdGtjXl9bW1xZX2FfZW1q +ZWltc29ubGFdXVpbX2d77ure0s7MysnIxsrNztXg6vxvXVZUU1dTUllZVlpdXVxdX2x5d/Po +5OTg39/d3uDh7Pp8b2ZeW1lbXF5ma2tyfvj09e3l4ebt9H799vLt5+Le3N3f3t/j4+ju9Xlz +c3Vwa2hnZmNhYWFfY2NkaGtydXVzcm91eHz27enl4+He3t/i6O/0+f16dG1pZ2RgXl5eXl1d +XV5ga37v5d7Z1dPT1dbY29/l6+7v8e7z/X17fXh5en16c3VvaF5ZWFhYWFhaXmFpbW9wdHp3 +c3Fudv727+zp5OHf3NrX1dXW19nd4uvv/Hz+fnx8dW1rZ2NfXFpYVlZYW11fY2lvevTp39nW +1dXT1dnc3+ft93FqZF5dXFpYWFdXV1lbXWNu+e3o4N7e3Nzd3d3e3+Hi4ubq7O/v7fB8cmxn +YF5dXF1eX2JkaG94+fLu6OHg3tzc3t/e3+Lo8P5waGNeXVxbWlhXWVtfZWx7+e/s5uTk5OTn +6Ofo5+rr6Ort7/f/enhxbWtpam1vb25sa2xtb3r27ebh397e3tvZ2dvd4OTq8npmXllXVVZU +UlJSU1RWV1pfaGt48+vg29fS0M/P0dPV2Nvf5ejs8v51dnZ1bmtkXlxaWFdXV1dZXF9iZ27+ +6+Dc2NXU0tLT1Nfb3+jufm9lXVtZWFlbXWBgX15eXl1eYWhwfPrw6Obj3tzZ1tTT1NbX2dvf +4u57cWllYFxZVlZVVFRVVlpdYWp2+Onf2tfT0dLV19vf5e5fXstkRExR09ppYF/v62dtZmla +5NPfaPHkfNfm62FUU8q/72ZIYOhgaPVr9Wne7fRUU/llamnd+X5kd9b8VGLq39ro3NDfatrg +3m7y2tHfe+rqYFdTWU5OTFNdTlBZYG5n9t3X397T1tfV2tXW3Nzb2dzX3N3l6/VzYl1mVVVO +Tk1LSUtOUVVdYnnk5N3b1c/O09LPzdLV1s/Z3u/l6HNfZmdXUVFUUU5OU1pWVmBycGrv2tXY +2tLP1t3T2et69d/rX1t57m5kbu94W1peXFhbXFBUaPDn7d3Kxs7W0M7XcWV0Yk5LT1JNTFl8 +9+7azsnM1tjT4V9TWVxXVVVKXM5f5cdzYWBc6+pd58fM2OXt2PhOVf1pWFvv2uvv2MnM19LO +2W5aUEg+ODc5PkhFTOLPw7++t7O3vcPGzmhKT1NKRUlXY11l7N3tZl5ecH9NP05OSU9PaMnR +W8y0v8TH3dZ3T1zj3vLcycxgUWFURD5FTk9JVPXd4N/LxcnNztJ3TkdGQzw9TGZk89fDt7q/ +u7m+xuBZUlJSSEBNX29qXGXe3mdcZmlZSkhMZVtLXe1ucnvdy8bXUOO1xEtjz+9OP0rSw9vi +vLjZUV5gSj9AWehYXc/GztXPxsjhYl9eRjw8PDw9SlxiWdW7wtbGubvI4drH0VZZ1tBeW+Td +blNWcmNISVhTSEZLU1VRU2/xWV7Z1dvUysh+zrbAXGDDxGE/UcO73mu/uXg/QVJENjdR/U9S +2crdau7T3ltVcW1NRk9XVFBh0srl4cK9x87Kw8HQf9rM+1FacV9PSlRaS0JNWk5JTVxgVVRs +7Xfsz8/Pzs3Mzs3Jx8/Vz1r4xN9KVdhqRD1E69JRU8zGUj5BUEY7P+3P4dS/vMfQysTO7OrU +32FUXF9PT15mT1Lv2exz6c7VX1vt+lxPU2doX2jf5Onc1N7l59vjc2Hu625p+eLhe/Tf+2B7 +5G5ab+pvPUTAxkQ/28ZgOj/RveZ0vLXMVFjoXj5C3cprc8nD31Zq3HdOUfb7T0tVXUxGUPlq +UHzMy9LPxb7F29rN1ntrc3hlX2BkX1xeW09NVFNMTVhcXF5q9uXe2dbU0Nbb1dLSy8vQ0OJR +zr39Q1PaeD42Rt7yR1rHyk9DUWpJPlPT3HvPv7/Q1cfE237a1WRPVVtPREz/akhL39ZwXOjO +z/fz1dD9aeHa7eLX0t91dvRlUE5XWlRZZ2JaX3z4aWfq3fN59eDg5PDYy9/21l3svs9XX+ff +VT5E9NFu+cfG9FBOVUs9QnHtYPPPy9Z9383Yd+/c8VxZXlhMTmXvW1Pdz9bVzMXBy9fOzn55 +72JYamtlYFdYaldMVV5QTlJUVVFUYW5w7+He19Tb0s3R0tLbz9Db41z0vtFQW+/vVUJFZ+Ru +/c3QflhPSkU+RVxjZd7T1tzn39rl6Nzf5+XsfXxqZfPs7XLj1dTa0szL0dzt9exoU1VfWFdb +WVZWVFdVUFJdX1xfYmH953712tTd4tvU1Nze183T39fQ3OplXM7KVU1wdlhJQk38aF/iztz9 +ZFlQSkVOYVxw1tHT09TQ0NjX1Nff4/JoWVNSWlxYVGvg4O3j1s3P5vbe5WZtZmD17m328WNe +YlpaXFlfdmpaW19oZl1t2tbe39XP0OPez9L48Nzc7W5xYWDc6VZPV/ZeQ0FWaXPy08rK13xn +W0tKXG1q49DOztTT09Tf4uj9bWNYT0tLU1ZTUWrk3uPa1dHV2drU2OHh4ff849/c6/by6mpW +VFVUVE5NU1JOTlFTWF519V7+ytF+2svMytDPw8XS193Nx+NZWW5iTENJXG5qb9zbblhOSkU/ +QktUV3vc0s/TzcjJztLR0N39al9fY19aXu3g59rQzsvT3dbcdWtqV1FYVlFUVFRYWVZbWFNX +WFpjaWf44ubb0tbVzsvMz9LN1unf5XT+8GhxblLyzVtHUV9UTklM7+1138zS5eLrb19OUGJr +Y3vb1tPQzc7Pz9Tk+WZXT0tKT1RPT27e6+vTz9vi3+DxbGplZ2docnj/ffjw7v585+t+8ul+ +bXt/cf7m6m5+5uP7YnTxe2xnZm1kU27mTWjD6k1h7nv6W0/cx9ncxsTZ2eNjW09MUFhVXXjs +39/f2tXY5fN1XllPSUpPT0tX6eTe1s/Kxc7TyMvb5ODqfHNfY2piYmRZUFdWUVlbVl1lXWB3 +dn/m5OXY1+Dd2+ry3NfgfenZ301Vy9dOTWJgaFRNe87l787G2t3b9GRaWVxlWV376Xzp3t3d +3eDwdmRbUUxJSkdHTlpebNvRz87KxsfJys/T09Xf6eDwevX9YF9iVU5OTktJSU1PUFRcX2js +3OHd1tTQzs7RycbS2+fhyNVYWPNeT01KTVtaXPnb7u7qb2BdWlpdXmF38evf29na1NHW3N/v +Y1ZWWE5KU3dxa9rPzsvJzczN2uPl+mZnaGZnYV5qYltZWVRSU05KTFNOT1tkZO/e29zYzMrP +zcnIzczL3dzk09b9W15oWE9MS1tkXFx3+mVuX1hXWFNXXF9s8+zn2dPNzMvNztHd73FnWlFV +WVlWY/Lv597X1tff6+1vaWleWVhgXV1dYm51b3zv9nF4+Ht2+u3p397c3Nrb1tTd7dvadGv4 +X05r5llOWlpUT01PYmlt59bU19ba3+x78fptbe/2eOvl6uDd29vh8P1tWk9KS0tOUFh139fV +y8XIy87P1Nrh9/JxYVtgYV1dXl5aVFFOTUxLTVFTWGn56NzX1dPKyczPysfO3/TYxttWYN12 +T0xSYVxXX3p0ZGdiWVVUVVpaW2f9+Ong3drQzc7Qz9no729aT1pYVFhfdOPW2tHIzNvc1vle +X1tWTlBUWVpf+unh5+Ll7f5ucHNnYGVwe+/v9n7w5vT9+H1v+mhc495kb+Hf//nt3tja2s/O +3+3ualhRT09QT09aXWBo/unk3trW2t7p+XFlWVdYW19kd+Xb1dDMyczT1tjrb2ddV1ZTVlxe +Z3v9e/R5aWZnXV5iXmnv5u3j2djb1NTd6OjnZlRr62NTWnNcUVRp+PR+5tHU5Obb5mRicm1k +afrs6+/j2NXW1dbif2VeUUhFRUhJTVVr4dfPyMXExMbIzdTc53VkXltYXF1cW1lXWFhOTE5O +SkpPVVpect/Tz8zEwcLDx8fByeR+3OtWTVNeXFRSX2xYTVFWTklMVFZSXfPd2tLIwsDDxMXL +4HBmVEhAQ0hJSE5s3NPOycXFzNPX3ftnYVxWUlZfZWNr9+js+HZ3ZVhUVVtYVV5+8u/l3NXQ +1ObZyM98ZPR9W1Zi6Nje6NPJ13N87mhSUFhZUE1RXF1ca+PZ3t/e3/pnW1RPSUdLVmf618rE +v769vb7Ey8/bcllQTEpGREdKS0tPVFhYVVRYXV9cXf/e3NjOxsLCw8O/vcLS6eT6Wk1MUVpW +T1BZVU1LTE5MSkpPVFhefNvRzcnGw8TJzc7R5mldWlNOTE9ge+7j187Oz9DP0+JxXlZRTUxM +UFdZXmRy+n12a2d29Xxv/OPb4eHVzc3R19fP1OTk8GhbVlRUVVFVYmphYWlqZl1XW2VnZWzx +39jX1M3KyszO0NPdd15aVkxISU9XVlZi6t7i5dvT1+b16eZ7YGb+83x57N/h7PT1cGBmaFxa +XGhxXmTv3+Ty5dHP3fHj095dVGT5bVlXb93kbWL34Ol0aX7q7m1ofOzo8Prr4t/m7HplX1tU +T0xMUFRTVF5z7OXo2c/OzszJycrNzs7R2uHj525bWVtZTk1QUk5LTE1SUFBcXWNufN3U2dPN +zMzQz83Q3u3e2d92aPrmellXX2JXTU1QVE9NUl1reXl96t3Y2NbQzs7S19XX2t7o7/Z0bGVd +Y2JeXVpWVVNSVllVUltrcmpv59rW2drRzc7S0czN1dnb2udub/lvaWhiV09LS1BPS0tRXWBb +Xm7t6+3e2tPP1drW1NTU2NnZ3Obu7+x1W1xfX1NMTlRTUVVbXml67ubn39rZ3unh2drf5enn +6OPc3N/f3N3scnD/bltTVllUU1ZbXV5janT8/vXs8Pbw7evq8fz+6d/i5ubf3t/j7fHx6+97 +bmt++XdrbG5uaWJmbm1kX2dqal9aYGJfYWv18fbn3dXP0NDQ1dra3uTr5eDp9f/6e2tiXl5a +UU9OUU9NT1FXW1tjfe/o49vZ2NbTzs7U19bS2N/o7Of+Zl9gZGFbWllbXV5fYnHt7/bt4dzi +6/fw8X1uY2VobXtqaPrp535ka+/7Z19lbXBwbv7159vb29vZ1tfc6u3m6vNxaHJxZmBfZ2ld +WlxfX1xYXW14aWZ17+vr6+Xh39nW19rh5drb6fD59/xqXVpdYGFdW15pbWtranz3e3N08eXl +6evs5eb17+7w8nZ2fP34/nR39ufl8Pjr4+v+b3J0c2BaXF5cX2ptb29+7eHh5uHa2d3g4efh +3t3d6HdnaV9XVVFQUlJSVVpfa+7h7/De29jZ5Ond2d/s8e7n6/P27ebj3dzm6+/r4vZuYmr0 +Z1lcW19fWVZUV1lZWltbZPv1+vzu3dnW1dLOzs/W3d3oem5ua2deXGZqY11gbf13ZGJy8ft7 +/O7t9fr45O3/7//48Ovr7+nu7fV2bWloZWBhaGttZV5qfvV9fOzf3+rt4tjc5d7f6fR2a2Ri +X1tZWVtaWldWWF9jbfjv5NfT09HOysjKzM/Nztjb7HBtXlVMSEhHR0VFSU1PUlhZYfzn39va +0czNzs3Lys3P2Nzd5vhpZGNgX1lUVV1dV1teZnRqZmdnffZ2cnjr3t/i39jS1NrW0NPb3+Tn +8W9oYl5aV1ZTT09UWltVVl1fX1xWW3Dv7ejj1s/P0dTQz9LY3N3f3tze7fz/9vlmXWNwZltZ +V1hYV1ZYXF1fXmFpe/l6evPq5ubn3dXU1dfV1dXU1tXY3uXi4fpeWltVTkpGRUhKS05OT1lm +ePjs3dDMy83MyMXHy83NztTd6ebvZ15YWVZMSElKS0tLTlNYW11qd/He1tHV087LzdXX0c/S +2trY3OJ7bHhgWFpYV1FPTk1MTU5SWFdaaP76/uXc2dPV1M/Rz9HY2dja29vd5ebn+PTu+3dq +cG5hXFVTVFFQUVNWV1VXWlpcZGxw8+/x4NbU19jUzs3O09LPztPX3Oz8cmpmXFRXWFlaUVRd +X2NcWmJva2x87eTv+3f77/V9bnzt5ujy6d7Z2+Dg3Nzf7f58cWxoZmFcXWFmZWFldfj3+X/y +6/l8ffz09vHq6Ofn4t3a3ubq6u9uXlthYVtWUVZeX1lWXWdmX19u8enp39nT0NDQzs/R0NLT +19re3+h1Y2BoZllQUVVWUE5PVlhVVlthbnJufvby7vD15t3e4N7c2dfZ2dzf4t7e4+vv5+Tz +d2xqbm5iXWFlaGFcX2NnZWNkanZ6e3n+8u3r8fTt6u/+evnt6+3s5N7i6/Tr6u7w/Px7dHBr +Y11bWltcX2VufPv5+vPr5OXn6+3q6uzt7Ovr7Ozp7fHv8Pt3b2ljYV9haGprbnB5+/f69e3o +5OXj4d/i6/b/eXl4dG5rbGlpaWpqaWhlYV9fXl9ka3L87eXf39/g4N/i5uz19/l4eHr47erk +4t7a297h7Ph/d2xgW1lZWFdXWVxeYmNiZ3F++vHt6ebp8/v07+zp6OTe2tnZ2trb3ObxfG5l +XFdWWFpbW15nbGpvbW99+PDv7Obn5+nn6evv+nl+9vLv8PHw7ezw9vXz8vD6f3d2dnJ8fHt1 +b2lkY2VnZ2dnaGlmaGt1f+7i3dvc3t/k6O/+b2lnZWBcW1paWlxdZG987ePc1tHOzcrJyMrM +z9bZ5fppXVdRTUtKSklHR0dIS09TWF5oeOne2dTRzs3Mzc3Nzc7Q1NbY3OPl7PD8b2NeWlZW +VVZYWFlZWlxeYWVsdvv7fXZ0eXt7+PHy6uPg4N/f3d3f3djW2+bu8/NyX1hXWFhWV11offby +7Obf3d7f4ufs9v53cHJubW1pZWFeXl5fY2lxefTq5+Pi397f4uLm5OXp7e/w9PT9dW5oYV9d +XFxcW1xeZG179/Tq49/f4uTj4N/e3+Hg3+Lo7O/1fnhuZmJgYGFkaG5vbG1tbWplYl5eX19d +Xl9iZWhudfLs6uTf2tfV09PQz8/S1NXU1dfc4ez6c2RbV1VRT01MTEtMTk9UWFlaW15jbfzr +5d/a1tXS0NDPzs7Ozc7Pz9DT1trj8W9gWFNRT01NTEtLTE1PVFdaXmdw/e7o4Nza1tbW1dTU +19jX19fY2drb3ePq8/15bWVdWVdTTktKSk1PT1FUWlxfY2r96dzX0s/OzMrIyMjIycrLzM7U +2+j+a19ZUk1KR0VEQkJDREVGR0pNUlxq7drRzMrIx8bFxcXFxcXGyMrMztDX3ul8X1VPS0dE +QkFCQ0NDRUhKTVFXYHTo29TOy8nIyMfHx8jLzdHY3eXv/nNnYl5bXF5gYV5dW1pZWVpbXV1c +XF1dYGBnbXB69enj3tzb2tjW1NPU09PW2+Hr+25iXFtaWltdX2VqbG5ubm1vcXR+8u3o4d3c +3N/n8HxvamRhXlxbW1tbX2RobHB1evr07ejm5ujk4t/e3tva2NfX2tna3N7f5e39b2JaU09M +S0pJSkxOUVRYXWd57d/Z1NDOzc3My8vNzc3P0tjd6v1vZF1XUE1LS0pKSktNTk9UWV9odPzs +4tvW0s7MzMzLysrKy8zN0djf8m1dVlBNTEtLTExMTU5PVFtkcPvu6OPf3t7b29vZ2dbV1dfZ +2tze39/g5+19bWJcWFNQUFFSUFBTVFVWWl5ndvLi29bRz87Nzc7P0NLT1dnc4uv1e29oY15a +V1ZXVlhYWFlaWllYV1dYWVtdX2Rt/uzf2tfU0dDPzs/Q0dLU19rc3+Hk7fl5bWlmYl5aVlNT +UlJTVlhYV1hYWV5lc/Xr49/b19PPzs3MzM7R1dnf7nJkXFpXVVNSUlNVWFtdXl9gZGVt/vXz +7urm393a2tnX19XU1dbY297k73hpYFxZVlJRUVJTVlteYGh67ePd2dbV1tfX2t3e4ur4dmxq +ZmZfXFlWVFRWWFhYW11fY2316N/a19TRz87Nzc7P0NLV2d3g5/duYVtWUU9OTk1NTU5PUlZZ +Y3D+9Ozl393b2dfW1dbZ3ePr8v54cW5qaGhoa25z/fLy7+vs7u/1+/1+eXr88+7p6Onu+n9y +aWZkYF9dXVxeYWNmbXb97+vp6eTf3t7f3d3c3N3i5+38c25pZl9eXlxcW1taWVlbXV9kZ216 +/vHp5t/c2NTT0tHQzs/P0NLU2N7i6fdwYltUT0xMS0pJSUpMTU9SVVhcaG539uvh2tfSz87M +ysnJysrLzM7R1dre5u18b2ljW1RPTUxKSkhISEhKS05TWV1jbP3m3dfSzsvJx8bFxcbIy87S +2t/o9XFlXFVQTkxJSEZHSUtNUFVbYmp3+O3m39zY0c/Ozc7Ozs/Pz9DT1tjc5O54aF5YUU5N +S0tMTE1PT1NYXF9lcvvr4t3a1tDOzczNztDT19zg5urzc2plYF1dXVxaWltbXV1dXl9eXl5f +X2Robnf06uLd29rX1dTU1dXX2dre4+Xm6u/08/h+e3ZpYV5bWFVSUU9OTk1OUVdcZHPy6ePe +3NnX1tXU1dbX2Nvd3uHi4N/g4uPl6+3u93JnXlpXVVRVV1hZXF5iaW90fPt9d3Vzbmdpa2xv +e/Dp5N/c2djX1tbY2dre4+ry+ndvamhlY2JjYV5dXWBjYmJmaWlrbGtvf/Dr49/e3dzb2drb +3eXvf3Ztamlqa2pnY19cW1pYWFlcYGl2+e3o5uPg397e3Nvb29zc2tnZ2NfY3N/l8HpsX1pY +VFFQT05LTExMTk9TV1xjbfro3tnX09DOzc3NzMvKysnLzM7T2d/tbmFZUU1LSEdFRERFRkdJ +TE9UW2Br9uTZ0szJx8XEw8LCw8THy87W3/BuYFpVT05MSkpKSUlKS0tMTU9RVVtga/Xg2NHN +y8nIx8fJy83S2N/s8/txa2diXVpXVlVTVFVWWl1gaG159+rk3t7e4eTm5OHg3+Ll6u32dm5p +ZWVjZGdpa2xpZWFgX2BkZml0eXx9e/306+fj3tvZ1tXV1dbY2dze4On0/nNkXVtWUU9OTU1O +T1JVWmBqee/n4t7c2tnY2NfU09HP0M/Q09ba3+t+bV9aVk9NS0pKSkxOUFVcbfbn3dnX19ja +3ODk5u3v8fp8c3d7+u/q5ODf3t/i4eHk5ufq7vl6cGpoY19dXFpaW1tcXF1cXFxdYGZrbnP6 +7+vp5ePe29fV1NPQz8/R1Njd4OPq7vN3aV5XUU5MS0pKSUlLTE9UW2Z95dzWz83LycnJycrM +zc7R1dvi7XhqaGNeWFRRTk1MTEtNTU1OUFNYXGJv79/Z1M/MysjIyMnLzM/T19zo/2leV09M +SkhISktOU1phbX/u5+He3NnY2dve4uPh39/g4+jp6ezv8vx6d3R2d3FwbGZiX15bWVlaXFxb +Xl9jbHvw6+fh397d29ra19TT09TU2N3j7P9vZ1xWUU1LS0tMTlBVXW7t3tfT0M7Nzs7Q0tXY +2+TxdmZeWVZUVVVVVldZW1xdYGZtfPnv6+fi4d/f3dra2NbU09bY2tve5e58bGNdWVNPTkxM +S0xOUlheaHny6N7a19TSz87Oz9DR0tPT09fb5PByYVtUUE5LSUhJSUpMTlNZX2z+7OTb1dHP +zc3NzM3Oz9LX293f4+rt8X9sYFtZVFBQUFFTU1daXWRqc3x+fXd0cG1we3/37+jj4N3b19fX +19nb3N7j6vF7bWZgX19fYWNkZmxtfPX3+Xt5d3Bxc293fnt1dHh5/vPu7Ojp6ert7vL5fHVt +amlrbnX89Ovm4uLs+nNqYV1bWFhZXF9jZ215+Ovg3NXPzszLy8zNz9Xc6P5pXFVQTUxLSktM +TExOUVlfaXn26eLh3dva2djY1tTS0tLS09XY2t3i6vZ4bGRiXltbXFtbXFxeYGJfXl1dXV1e +Xl5gZGVpbnR4++vi3djW08/Ozs3Nzc3Oz9TY2+DseWpgV1NPTUxKSklKTE5QVVldYmt38OXg +3dzb2dnZ2NnZ2tvc3N3c29zb29zc4enx/H52bWhhXFxaWFVUVFRTU1VYW19jaXJ+8uzn4d/e +3dva2NjY2drc3+jt7/H1+Pn29PX8eG5tbWpnZV9gYF9fYGBgYWVpamhnZmhtcn379O7m3tnU +0c7P0dXY3OLt+3ZqZWJeW1hXVldZW2BlZmltc3v++fTs5N/d3N3e3t7c3d3e4+v+bmZeWlZS +T09PT1BQU1heav3q3tfRzszKyMfIycnMztPa5PVuXlZPS0lIR0ZGR0lMUFhfanT67OTd2tnY +1tXU09PU1NPV2Nvd3eHo7vT1/HJqX1pYVFNSU1NSUFFTWFtdYm3659zUz83LycnLzM7S2N7l ++mtkXlhTUU9OTUxNTU5RV1xfZnvq4d7Y1dPQzs3Mzc/X3ur7cWxrZV9fX15fYGFgY2psbGts +bm5rbW90ffjx7Ono5+Ph5+rt7/Lu6uvp7vb6eXRsZ2JfX2BiZGhuevnv6ufn6uvvfXhxb21s +bGxzffTw7/D4/nh0dXn78+/v7urn4uDe3dza2tvg5u39a2BcWFVSUlJSUlNVWFxhZW7+7+Xe +3Nzd3t7e3uDe3d3c297i5enu+XpybW5vcnBvbGdqaWxvbWxubm51dXd9/f/59fv7fXRtaGNf +YWNlZ2loaW1udf316+Tf2tfU0dHS1NbZ3N7i6PRzZ15ZWFZXV1lbX2RkZGNgYWRnbHByeHp/ +/318/vjv6OPg397b2dra2tnb3uPo6+/4fX15cW5mX11YVlRTVFZYWVtfYmRrevLn39rY2Nnb +3N7f4OHk5eLi4eLj4d7d3uPp+HJlXVpWUU9OTk9QU1daXmJlaWxwd/zx7OXi3+Df3NnU0dDP +zczMztDV2t7i5e93aF5aVU9NS0tKSkpLTlBTWV1hZnD/9Ozi3dnTz83NzczLzM3Nz9PX3OP3 +bV9YUU5MS0tLSktLS0xOU1hhb/Hj2M/MyMfGxsfIycrLzc7Q1t7odF9XTUlFQ0FAQEBAQUNG +Sk9ZZ/Td08zIw7++vby8vb/CxsrS3ep3X1dQTEhFQ0FAQEBBQkVHSUxRWmnz4djQzMnHxcTD +w8TExsnN09nf6v5tZF9bVlJQT05NTk5PUVRYWl5kcPjs5d/e3Nzc3N3d3+Dk6flyamRjYWBd +XF1eXmJma3bz6uHa1tHPz87Oz8/Q09nk83NmXFZRT01MTE5OUFNXWFlbXWBnbv7v5NvX1NLS +09XX1tfY2NjX19vc4Ory+XdqY15aV1VTU1RVVVVYWVpcXWFmanP+7ufi3tzZ19TT1NTT1NXX +2d7q/WxfWVVUVVZYXF9obnR7+vn69v95e3Nwb29scG9wefzu6+Te2tjZ2Nvd3uDp7fJ6bWxp +ZWRiYWBfXlxcWVdZW19ob/vq4Nze3t3d3+Pm6Ort7/T6fXJtaGJhX19iY2ZmaGx19Ojg2tTS +0c/Oz8/R1Nfc5O90ZV5YU09NS0hHRkVGR0lMTlVebfDh1s/MycjHxMPDw8XHy8/V3u14Z11X +UVFPTk1MTE1OT1NZYGh17ebh3t3b29vb3d/j5Ojt9nZrZF9cW11fX2dveH768ezo5eLd293e +3+Lp6uz0+vb29v92b2tpaGhlXl1eXl9iaWxwef358PP07urn5+ns7/Tz7/Lz9vz///Tu7erq +5+Pk4uDf4u16amNeW1hWVFZYWlxdX2dqcHl9+vHs6OXi4+Ti4uPk4+Ll5+rq7O7u7u3u7Orn +5OLg4uHj5+r3eG9ramhlYl5aVVJQT01NTU5PUVRaYGv97eHd2NLPzs7Nzc3Nzc3Nzs7P1drh +8W9fWVZSTk1MTU1NTk9RVFlfaHB1//b07erk3dnV0tDPzs/S1dvf6/t8cWhkZF9eW1hVU1FQ +UlNXXWRvc/rv597c29rb297j5+rn6efn5+Tj393d3uDj6Ort7Ons7/L/bF1YVE5LSUdGRUZI +TE9XX3Hn2tPOzMrJyMfGxsjKzdLY3ODn7vtvZV5ZV1NRT09PTk5NTE1PUldcX2t88ePc1tHO +zMvJycnLzc7R2eLudWZdV1NPTUxMTEtMTU5OUVddZXD67+bd2NPOzczKysjIyMjJy83R2OP+ +ZFhQTUpIR0VFRUVGSEpLUFdebvXn3dfRzsvLysnKy8zOz9HV19vj6/l0al9bWVhWVVRTU1NU +V1lcX2RmZ2lsb3d5+Ori3dvZ2NfU09LS0tTW2tzg8XZmXVhUU1JQTk5OT1JVV1teYmprb//v +6d/Y0c7LycfHxsXFxsjKztfkcFpPS0dEQkJCQkFFSUlJTE5QWW7f09DX3dnRz87MyMPAwsbM +zs3P09ne3uP6YVZOTEpISEdHR0hISUpNUlxqee3e2tbQz87NzMvMzc7T2+Xp6u7+al9eXl5b +XFxj/W5cU1VcYl5TVmVz7vN1fOnX09Tb5drRzs7U2NrW1Nrj+fzq6fxfVU9TVk9LRUJHS0hE +RUxWYmz93dTRz8vFwL/BxsfHyMnN09DV3+9vXFJPT01NS0lKSEM/QUVITVRl8u3j29HP1dLK +xcLDx8rMztjj6+LY2PNZU1lZUkY/THlXTks9Q2jSy39XUWTP6W7ZzMLI2tzOyM7d39TGye1Y +Vm12WEtHT1tZWFBOVmN8blVLU/LjbFhbdNvS3OPo2srExs3Pzc3P43h++2pWTU1gb1dFP031 +2/xTVGHh0+ReUV3fzc/yXmrczc/qX15929p8XG/Z0dl7aOzX2m1XV27Y3V9LSlv3/FZOWV5l +Zmpx7+xs6NXP4Fjvw7nDTT9ZwLnJZFj772RJP0dSZW9paldNU1RbfO7Zy8XPdl1d7uD1Y2nZ +0udsX2zk3+DWzMnc//bXzu1aVtvRVT8/+9pIODxzxe02LUm2s80/OUR6y8C3rq6yu3c8PErx +y8TDw89WPjk/TG/l6NvmW0Q7ODs/SFtt4Nrb2drYz8K8vsfL18/ExtL4Xm3o61VGSlheWEtF +S1RWT0tPX+rf7+HOyszW3M7L1OTozcvP3lzhY0fczbrKMSgpT7q+0drGwVUvKzJLyr+/wMPP +ZUdK+8m6ubm6w9pSQj9IUWT54+BzXl1aU1N1z8jN+VVj+n5XUV7+4m1PTFZlZmFea/j2bVxi ++N/b29jNys/d6dfU3+fez9bX70lz08rBUTcuOtfHxM3XyNBEMC43U9LExcvO51ZJTmfKvby8 +wszoVUlFS1l26ufl5XhZUl7s2tfg5eb7X1ZaYnD5+XtqYV5kd/f3+fXx8XNkYGb/6N3a29je +7v5/4OD5av3ablL43s3LZD84QWLVvL3Gxs5rQzs4PVnQx8jP8V1aVlVq4tTKyM/vWExGSExP +Wmvr187P1tnW0dDQ0tHR1Nri73xpbH54bF9WUU9PTUtLS0xOT09RWWT+4NjV0M/QzszNzc3O +zs7S5Ovd4+fpZE5OVVVddF9UXFtTW2RbW2FbVFdYVFx869zU0M7JxsfHys/W3O5nWVFNTEpM +T1VecO7h2NPU0M/X3+bzenFjWVZXVldaW11iYVtbW1xeY2567+be29jRzszLycnKy9Di4Nnk +/G5UR0lOTVh0YFdeWlBca15jbltRU09OW3P33tPRzsjHx8XHys7V6G1eUExMTE1SWmL849jS +z8/P0dff9mhaVFBPT05PU1hcX2NkZ2ptb3B+9ure2NTT0dLTzcjGx8nP2ujt6vRmVUpAPkFF +S1lZU1VXVmLu5uDg92hqb3nj1dHNycfGxcbIyszU4HtaS0VBQEBBQ0ZOWGb74NTNy83Oz9XZ +3+fq6vJzbGtv//Hv7O98cmdeWVpcXmFgYGNjaHjt5N3d6m173d7p5fZYVFxbdtHP3Njb9eLT +1NHS6mFZT0xRWV1rcmxvfPns6O71emVdVUxJSkxQWmXx2M3Kx8K/vby+wcjP2utrXldOSkVB +QEBBQ0VFRkhJTFFYaOrb1M3Iw8G/vby9v8HKzMjN4XZYRD9BP0NRUkxOSkVLV1155O50bGFj ++eLZz8zKycnKy87P0tvqblVKR0ZGSEpNVmVpcdfLy8zNycXHz9nX1uF6YVtTT1BTVVRPTEpH +RkVFSlVeXF172MvEwb68vL3FzcfBw8nVX0hDPj9NaPzseVJGQD09QklTaOvh3NzZ18/JxMC/ +wsnU62ZYTkhGS1Jecf715N3g4d3c3Nnc5+34cW1ucHzy7PptYVteX1xZVlVWV1lj/uXg4Nza +1tPS1tzt+uxjVvHb19f2TEJDRVXQwL6/y3NPSERJVWfm1NHX43VlZ/zg1M/V5G1YTk1MR0VJ +VvHb1tXTzcrLzM3T2d3k7O/+a2lmZWtqYFtbXWFiWU9OUFRVVl5vdm1qeeLZ0s/QzMzS4WNd +2MjGytxVRkJDVc+/vcLQZUpCPj5GU+/Sztb2XFRWYunX0dHddltOSkxOTFFt4dPOz83Jx8jI +y8/a397f5XtfVVNXWllTTktNUFJRT05SW2N06OLd19XRzcbDxcjN2OHlclNb3tTZ8lFEQD8+ +S+7Pys3hYVBHRElWftrPzc3Q2eTr39TOzc7Z9VxPTEtJSU5XYnf239bQzs7Oz9LX2tra3uh7 +X1xdX19cWFNSUU9PUVNYW19kZWv74drb5Pbk0cvL0dnd3t3e4uTSyMnUfFJNU1ZaZXJsZmFY +TkpGRUlOVmJ0f/rq39rTzsrJyczP2OR6X19qamxnY2RnbP3m3dze2tnW2eLq6+xwX1xcXlpW +VVVWVVFNTlNbZ2tfXXTk2trf2c7Nz8/Q0M7Q1dfd6Onk7fL6dXBkYmNeWlNQT09OTlFUVFlg +YWBjaGBebu/b09XSz83Nz83Mzc7Pz9HX5ndjXF5gXVdPUFdcV1FPVWBhX29uY2Jmd+/tfG/p +3t7a293f5uDa1Nfl8ffy93VrY2hvdPN1YVtfZ2xtXV54+PlvZ3r+fG126+Tl7ezs9vHg293g +5d7Z4/N+fG9nYV9kW1teXFdSV1hcYFty5ez57dbMztvZz83S29zZ2eN5aGhoYV5eWl1aVVVT +WF5iZWFhaW1vbW764eTr5+De5/T99und3N3a2tnW2uz3fn5zZmRdWFZYXFtXVVp2fXru6Ofh +3Nvc3Nzd3d7sfnx9d2hmZWZteXxpZ3Z8cmxpZ2VoZ2t5eW9v/fR8cfzn3+Po3tzf6Ojf3t7l +7u19cGpgXVhZX19aVVZcYmlw9urq6uro39za2tfX3N3e4N/p7/p8c2dfXl9bWVtcYWRhZ2tv +bWdmeP35+X7t4+fo6ebg6vXt5uXn7Ofk3t/r4t7k6Ph5dWZfW1dXWFhbWllcXGFpbHvw4t7e +4OTh2d3s597Y2ujxf3VsaGptaF9bWV5jX2VobPnv6uDf39za19bY2+Ph3t/sfHNwff9lXVlY +XFtWUU9QUFBVWVhfbnz25NvY0tHQ0M/Pz9HV2tzi6fH5e3h2Zm95bGleXFtcXWBhWlxeaX38 +eXj47fJ5bmdjZWpufHp+6tzY2drY2+Dn7/jz9Xd0a2dobm9kX2py9P1qevDv9fzx9fn2/ezp ++f7x6/Hv6vPz7+7ybmVjY2FeXWBpfntsbXjv8nBqbHv2fvHx6uHn4+Dm7Ozj4+nl7/R6cHNs +a2Vqb2lsdH7/bGNjam5sXl5qbWZkav78evTo3dva1tXPzs7Oz9Pc5O94cVxWWFZWUU1OUlRU +U1ZZXF9fbW5x9urk39zV19fU2NHN19/b1tfc8WzZzWRFR2zT6VJLT2JcTEpMTlfv2dzt/t/O +zM/b29LW4uzw5ej9eezrX1BX+/5XUGjlYFFmd19RVPrZ6Wflz9XrbOjQ2vn67Prw1Nl3XVZe +d+/teGFcdO/j2uxrfP10bX5rXGVjZe3a4WVVXePP0/dRUXfZ5WdWTFnUytteTl/MxNZpYe3Q +ytDka19vZ11bYmZPSlbx32hOT2Hj1uNgWWfYzubl0dhlX9DJ2HtVXN/Z2/JcUFTtzdJ1VVBp +1NhlRkRdfWFo6HtVXN3M0fp43dxu/crMWkpbz8xfRU1w1tl2bGzq1u5n8+fvXWTZzdVlT3bL +0mpWXubW3lpJU2l+e2NPSE/x22ZJRW/L1GNa5s7N0dHOzM7V0c3Mz+t0/O3qck5HSE5aT0hJ +Sk1WX2VjcHvt0s7d6NfO0NXZ1dnk3dbc+Gdu79zfXUxOZPNkTUVNbH9ZT1/z4t/f09Db3trS +0dbf9ObU1ORdUF7e2lVARFrxX05WemtMSWjR1fLqz8nP19LQ2+jZ0N1dU2T1bVlWYe3b5WBU +X9/YbE5VfG1MQklYXFp11s7S08zGxcnMz9fe2tf+T0pQUUtKUWpyTkNayMlaRlX4WEZV0MHC +w7u6ye3q5lhDRVluWll/397VycrZ6OLpV0E8PDw3NjxIXfvaxry4u76+u77L3NzT2mNSXO7o +bWNrcGdWS0hRbVhAPEzwbVJa39NwdcK97kt+yuRCP3PCvszcyMDYTUFCSEtUa33dx8HGycfC +x9Loal5NPTY3Oz07PU1+4urlzsPCx8e/vL7JzsjEytz54dfoVEhPYlM/Oz5GQzw/S2V0Rjvp +ucVJTc3F6E1Vxa2uw8e3uuVDPUFNYl5X3MTI2uHd3Nx2UVRlTjw4Oz4+PUBW2tXy5snAxszJ +vrzE3uLQzuVsf9fQ5F1ac/laR0JITkhAQVB1/FhJaL2/V0vUx/xBRNSztM7MtLdyPD1KUEhF +W8/F1OnUy9Pxa2piZFhFPUBDPz9CT+vYe+rFvsbNxb29x9PNyddtbOLdeFtecWFPTU9ORD5B +R0VDSFvf7UlHx7reU9XI1F1S2ba0xcKxtudHSVNNREZwztV+69LdXFJaZVVERE1GOjpARkVL +atDIzcy/vMHFvbu/ycvJz/9efudkUlZcT0I/SExFPj9GSkhJV+3b18zd0re6zMXBz+p+9dG/ +xc2/wHBHQ0A5NTpFTkxT8djc69vNz9zm4dxyTExcXE5T48zK0s7Cv8rTzcvW721jWExLUVJN +T1peVkxLWWNPTVpiXVtz39TNy8vJ4M66xtrN3GVWVlzs1+HSx95MR0c+OjtHWl1j1cbHy8jB +wMfNz9pvWk9DPkFERUpc39bc08vM2OTe3ndeaP1nX3Pm39/f4ufsaF1xcVdVXVRWZ2do+9/W +12JQxMNk4uRZUU5OZtLPzb6/3m5pTkNAR1dfXefKzs3HxcTHys3bYExJPzY2Oz08QVfa1dTJ +wMHKzs7Q2OTh197l2tDX29rV3XtkVlFcUUZKTEpJSk5aW2nfb0zSve3ZxPJa7O960MbGu7rI +199bSEE/SUxKVvF8fdrV1tbR1uNiVE4/Oj0/QERR+s7Jyb+7vcC/w8nN2OZ+al9eWVdgXlpa +WVBMS01UT0tLUFtbW/3Y19jU68a63NG81lV67HDv19LExNbueU9DPz4/RERLZGNq2M/OyMbG +xszZ61tHQkVEQUxe587NyMHDyMnM1d/9XVNOSkpMTldaXnZvXVlk8PlobfTm/HDq2MzK22Xh +t81RxtVLUFNPWv3pz8XN2+hqTkhBREpJSV30edzOy8bEw8PL3W5ZST45Oj0+RlbyzcbDvry9 +wMXK1OluW1lSUlleZXdtfPFvXltdX1ROTk1PT1Be8tbkT8y7683Fb/rjX3nW2c7AxsvO5Wtc +TEdMSkZNV1Zo5dvOycjFydT0V0tEOzY5PD5FV/DPxsK+vL7Bw8jP1en9/2Vda3n97+zt8m1X +VVlPR0ZGSEZIU2b2X3u8w9q+xOHY7m3Z3v/PxdDY2ehsVUpNTURETlFPX+vaz83IwcbO0t9c +TEZCPTs9Q0xSaNfHv76+u7u/x83Z62RWUUxOT1BXX2dsaFtbXVZUT1FRTk9SXGh+5NjNycfH +xcTIzNDU2Nvj5d/f4/V1Z15XUVBOTk5NTU5PT09RUlVaXmd77+fc1tLPzczMzc/Q1d3f3+z0 +8/T2/nR6eXV4eW9raF1bWVdVVlZXWVlaXF1cYGhve/jt5+fm4N3b19PQzs3LyszO09fd6H9p +X1lWU1JQT09RVFVVWFxbXmBiZmlrde/m3tnX2NnZ3d7i6+rq7vHw7+71/Pv5fXh2a2lpaGxp +aG90dXj08Pf5//t+cnF2c3B0enRx//1++PDt7e3r7fT1/3Jxb3N7/vnx7Obj3tzc3uHi63xv +a2RfYE9Xx2g8Q2jZ6Vpc4e1LR/7tV0jauL53b8/KX0r0wsle/sTCckhWzM5RS+/UYkxc0ddL +Q1VjSj9M6t9p/MvH3Gjnz+NXWt7W/V/izdD6/tfN2Ornz85qWl5mWEtNV1lPTVVaWlZVXWdf +Yvn8bvfe2NXT0crIzMzKycvQ0dPU5Hd3bF5VT05LR0ZHRkVHSk5QVl5g9d7c2dn02LvA2dXH +z3VQX8u/yMW6u85XSkg+NDY+SEVJZ9TT4tjIx9Pu6upbSEdMUVddZvzRysvIxMTByNnn6m9e +VFlgW1NUWl9aU1tgZGFST1xYTE/i0fD22tDL0su7yF3DusfOTDpETEBKyrzEx81kQzoyMjg9 +UNjKyMLFyc/e3trW1dLR1+b+bV5ST11wWFXtz8zNz9PO3VpMUE5FQktl8XBp5uBvVlVcY11b +cdzZ4d/Szs3Lzc/Y1dfXzcnvQWy+z09DOzxBPDpzuLrJy9hXPjM1Rn3Ov7m4usTeZV1fZvHc +0dLgYExDPj0/R0hKa8/Kzc3Hw8x6at3Y4e7kz8nQ39/rW01OTU1WZGZfWlVWUkxJVefcdnLl +18zMyNNVy7W51U8+Q15PTMavtcl6PzUzMTRF2L+7wdd3WEtHTm7Ov73Cy91gTEE9QlVtXmvQ +xMXX/drI0lhQ9czM+Vp91t1kVFZna1NMVXHs6GtXW1pWWF1Ya83Ez39y2cfC0VBB4LzHWkJC +T3VPR8+0uM9dRD5BPj5Tzr68wtX5bGFbZuPNxcbR+1dKQj49RE9OTGDb2eN0/NDN81vuz8nM +193W0dfZ2drb4vxpZ254d15VTkdFTFRWWv3V1nFOV+LRz+pOS8y7xHlIS3fZX1PHtbfGcElC +RkFEV93HxdJoUE1MTVRo283R43leUElJS01X/tzRy8rMy8fL1trc0snJ31hg6eBvT05UV0tC +Rk9VUE1PVFZVVV1x6M7Exc/Z0MnAws7Wcu++us9EPVDtbT493r3FVz08QEE6PU3ex8fU5uLd +5u3dzcG8v8jX73hZR0FMX3d3Znna3WJUX+fedmV55upsYnzV1mZTX+/uZFls2NxfU2Pu/F1b +6dPrW3jPyM/sa1bsxMxbRlTs6VRE9Lm75lL16FA8OU3Yz+r829LnUUhV9dzb1s/R33ReSkNO +Y2xgbtzJyOJv4tDO2OLj1tTf4N/pfm5kYFtPS1NiW1FUYW5aSktm7m5SVPDUzs7I117NusNX +S+bI0EhGw6+9X2nP5UAyOl36T0/o0/tHRlz8XVvaxsv4YufhUUBN7/pZXd3GyenmxsPU5dnN +1H142tPuYWlrXlJNT1VOTFRbWVNYX2BfavPw7+fdzcPD02fbvslYTWvb90dG38LQYufQc0Q8 +RExJTXLV2d/e0tLr7NTJy9HZ1NViS05YSkVMVF9eWGjc2+nZz9Lf9OXf5/7h1+Rw8t95XFps +eFtZZG1hX279dWpha+fm6tHHz/zRvs9haed7T0ZO9u9eY+T1VUhFR0RASVxfadvOzs3KxsPF +yMPCzd/j/F5YV1ZZXFtfbWpkZntzZ2RmX1tWVFdYXGRvc3b/9fjt6OHf3tvW1NLS3N/e3+Di +5eXm7mnf31xbblZOT05OWWJgbujqfP5ybmReYnx3eurd2tPOzs/My8/c5/NlV05MS0lKSkxP +W19v6eDc1M/T1dTV1tnd3uDl7uzq7vp6dm1nX1taWVZUVlZXWl1fX3L5+uro5uLc4t7W3N7f +4dvX2dzW197h5u979vtuZF5cWFZTT09QUVJTVVhcX2Jr/u/m39/d2tnW1dXTz8/Pz8/S1drg +5/pqYl9cWVhWU1BPUFBRU1RVWV1ia3d+++/p4t7c2dfU1NTV1Nba297i6/Ty7+7v8f5yb25n +YF9eXl5eYGNiZWVjYV9fX2BhZWhqbHZ/9PHt6ujk4d/f3t3c3N3h5ufq7/f5+ff4+fr18fX7 +9/L5fXhxbGlkXVtbW1lZW15lbXn37+3q5uXl5ebq6+fk4d7e3uHo7/x/f3x5cm5saGJfW1la +WlpbXmFqc3n78Ork4OHh397c2djX2dzd4et6amdkYF9eXl5iYl9fYWdqamlrbGxtc/338+7p +49/c2NbV1NPW29/i4+v4eHBuZGBeXVxYVFNUVFVXWFldYGZtdvrs6Ojm5N7a2NfY2dvd4eTl +5+zy+Pr+fn5++/t1cG9zcHF2cnBuaWVhZGVla3N5fPz+ff7+//76+//78fDv6+rs6uv0/3dz +cG9ucG9xdHZzcm5vdHV9fvru6+vs7Ozt8fb8/X54eHt++vLw8/X18u7r6Ofl5eXq8P9xaGBb +VlZXWVlaXF9obXN98+rp5uLf397d3d7f3+Hk5+rq6efr7Ozy+3RqZGBdWlpbW1tbW1xeYGRu +/e7j3tvZ2NjY2Nja3OPs/W1kX15dWltcXl9fZXBzfPjv6eXk4eDk5unt9ffz9fjz7+/y7/D2 ++v18dm9tamhqaGVjY2RiZWloa3R5efjx8+/w8e3o4t3b2djZ2t7k6/t1b2tkX1xaWlhYWlpd +Xl5gZm959ezj3tzZ2NfY2Nna3d/j6/d5bmlmY19dW1xcXV5fY2VpdHr99u7n4uHg4uDh4+Xn +6u74eXFvbGha7ORKR8/FP0nLz8zUVFHCwz5M2WxWds7nT/prWv5tVfHJ/FB+8W1179/f0N/v +3eZ67/nu7u/tfW5qXlhcW1xiZWRnbnVvcvPz7OTp7O3r6Ojp+ezu7ep6+n7q4+zf3eLl4O31 +6W5vZFpjWFhcVFpVT1taWV5p+e/y6t3X3t3c3NPb2tPa2drl3tzw6eZxZWZrYl1cXWJlWlNb +XFdbWWXr5vv9+2Z3bHfh7ePX1Nfk4dbV49zb4eFv/v9uX1ZcYltQU1hXVU9WWllydW7p1tXb +3dnQ1drZ2tng8+nsfvvo7ejr+fhvcG1tZWNoZVpTVVlVV15kaGNs8+716NjV7m3v3ulvb+jg +8P5/7+Xc83Ps3+l469ze8PzvdFpf4tfoW1n0eVVOXfBnVmLyaVtcXXLxd2Tr0+hh68zTanrS +z+Pr19T3bN/Z73Dh0ddrWWj5WUtPYGJSTVJSTUxQWFxvb2dg+NnX2NHLycrP1NHIw9Nz0L7S +TUxTZd1fSVbkTTpY30lA4cpgWu/f5VtPXOVxSFPY1mv0y8bW7eLazs/b9N7M0G9LTHR3UUlc +3ud49t/sa3r8enHp1ehkbnlr6NTecmhQRU9hbu1PS8m6bTlH1+5DPui0ttrUtLhWOETyXEJc +wL7dY+rhVUVS1M3rb9/mW0tFR01KRUtm+nZ86dTJzNbYzc3f69bN1uzbzdhwYvDcaE1Na9xu +SEthbkpFV059vMdbTufhSD9I2bO1ysi90jwwO0lPXN7Avs5nXG9hV+rKwsbJzvxQRUJIRUBH +bOVx/dnOzM7V2NbS09XX1tjecV1hc11QUFxQSEtbdmBNT2BrX2hYVcO30U3mxvNCReWyrsbY +vcZBLzhKS0tszMbdUU1ZWk9ezsHEy8/S3llCQVR+XVNtzsneWnjKy21e3c3fX2bj2mpTZ3lX +TFFpYE1OZuHmXVZrcGBo6+lb07i9a1Tc2Es9SsWvvezOwmY2MkJZaPTOwMd1T1ttX2XbxsHL +2/NkTUJDRENPbnZcXuja6Gl11cva/93KzeDu1c3ab2B99mFaZXtsUlBfbWBOT2R/Xlfg5WPN +w9xcZF5GR17XtrLDzMf5OzM/V+3Ty8DC3FNLV19k5M7Fyt1lT0lDPz9FT3XyZmjp1d9w3svG +0fPczM7sddTN4Wxs72lPT1/yZlFWXF9dT0xX+vpp9c7Oa93Fx9phUVFk7eW/tcDZ91dBOTxH +Ztvc1NZ6U0xSY+vSycHDz+1aSkRHSkxPcNva6frg1d3l2cvK3PXn191kXnVvXVJWXVxYX/36 +ZWFqbF9bfdfcYWPez9jj7lfxwsn0V1FOUltbzri91vRoTkA+SH3P0dHS71tLTGHi18/Jx9dl +SkdMRkBM8t1wWmrb2Gtb1L/D2ePMw85tfc3K7FRW8etVSVRtWUpJT09KTlpbT01e18/68N3Z +wL3NYmzU0eFp17ayw25g8lQ9Oknn2mlXVFdNREZU7NrW0NHkXk9TV1JPXN/T5Gly2s/W39fJ +x9Lm7NjR3Xp64u5dU1ZbWFNZbm1TTVRiaFtXd9jabF7mz+vezMvP8ltNXnV4z8LAyN9gST8+ +Q1Zy3NPd+WZZX27gz8bCxcvfYlVOTktITldoYVNRXftzbfXd0tje2NPS2tzY09jm5ubq/Gdd +XmZlWVNSWlxUT09n4vhiavFk6cnIz/hfZPJ+X9O8ub/ZZlFGPz5Ja9vX72VfWFhUXufOyc/W +6G1dTkhITVv88Whm7N7e4N/UzMrMzM3S2t/f2+HvcGhoXVhQTk5NS0pMTkxIS1hdYWzq2dbo +ctS/u8PaedjK0ObVvbe93FROS0I7Pk1uclBKSk1OTFXyz8rJzNPZ6XRgVFRf8en39ufX2e18 +c/Ls8P3p3+jvcnzw9Hx2+e/6bWNkZGRaVVthXlhaZ/30e/3e09Ta3t3c19jb2uf/aWVo++Lc +1dTZ6GFSTU1RW2hqdm9lX2BlbPvq4uPqfWpjXFhWVlheZ3b2597Y0tDQzszNzs/P1Nfd6/l3 +aWRjX1tXUU1LSUpKS0xNUFZcZnzp3NTQz83MzM3MzM3O0tfd6PL9eXdycXFoX1pXVFJSVFda +Xl5dXWRra252fXl6ffz27ebl5ebl5eTj39/f39/e3t3b29zf5uju+nVrZVxaWFZWVldYWlpY +WFdZXmh69+Td29nY2tza2drc3dvb3uPo7e/4fXVvaGZoa2xrbW5taGJiZ2dmZmlra2tucGxp +ZmdscHr06erq7PDt7evo4+Hi5OTk4uLk49/g4ePq8n1qYF5bWVhZWVtbWllaXmJpdu7m39vX +1dTU1dfc3uLt9X52bWZhYGFjaGxtbGtpaWhoam1ucXVzcHB2fPft6eXm5+Xm6ujq6ujo7fZ4 +amZnaGpscHNxa2Zpbm9y/PLr4d/f3t3c3+Xq6/H5eXVvZF5bWVhXV1hZW11kb3v26uHe2tjX +1tfY29/m7/Z+dnJweHZ0bWxraWloaWttbm1rbG1ve379/Pjy9X95e3h2eH1//f/89e/u7O7v +7/Hw+/z29O7r6urr7ezv8/n9d29qZl9cXF9jY2htb3Bz/PPq4d/e3dza293f6PP8c2dgXlpY +V1ZYWFhbXl9kam7+8+jd2dfV1NPU19ve3+Lj5ufp6u72eGxkX1xbXV5eYWNiZGdpbHNwb29u +bW1ub3B3+/Dw8O7t7O7x8e/w8e7q6ujn5N/g3t3d3eHl6PN2b2pkXl1dXFtaV1haW15kbv7v +6efn6ert7/Du6ePg4uHi5+74+/x5cG5ta2trbXJ88+7r7u/r6Ojr7vp2a2FeXl5eYWdtd/71 +8u3p6eXn6+3s7O709vr9/Hp4dG5qZmNjYWNnbnf57+vm4eHi5Obq8/n7fXx1c3V1eHV1en35 +7+rn5ufq7O/9eW9qZmBeXl9fX19gX19gZWhtefbr5uPf3dvb3Nva29vb297i5e9+cm9vamZg +XVtbW1xdW11eXmFlbHb/9Ozi3tzd3dzd3t/f4+z4fm9pZWFgX19eXmBkZmlucHd/9+7n4N3b +2tjV0tHT1Nbb4fB5al9bVVJPTk5PT1FUV1teZmxvevXs5uLe3tza2tnZ2tvb29ze3+Di5Ofu ++3lwbGhkX11cW1xcW19jZ2lqcv718e/s6uvu7/V8cW1ubGtrcf/17ezp4+Dd2tjV1NXZ3+ty +Zl5ZWFVVVlZWWFlZWlxfYmZrdHnw6ePc2tfU0tDP0NHR09XY3ODq9XNmYF5cXVpXVlRSUlNT +VVdYWllbYWVrd/jr4+Dd2djV09HPz9DT1dfa3uPt+nZoYV5bVlVVVllaXmhueP728/P6fnRt +bW1tcHVzdnd1cW9uc3v++vTu6ePh39zc29va2dze4OHf4+bo7Pn+eW9nX1tXVFJQTk5OTk9P +UFNYXmd47eLc1tLPzs7MzMzNztDV2dvf6O7v/W9uaWViX19cWFZTUE9OT09QUlVZXmRsfPDn +39nU0c/Ozs7Ozs7Pz9PX2tzj7P5rXVZQTUtKSklKSktMTlNZX2l57ODZ1NDNzMrKysrLy8zO +0NXZ3efzb19ZVE9MS0tKSkpKS01PU1heanry49zY1dPQzszLysrMzc/R1dvh7nlmW1RST0xK +SUlKS05RWmV17uTd2tjW19jY69m/dUbb4s7MVenVePhZ8dVWWODS3UZkx09VPk7LXO9b+sxI +VFVa+UXn2uvOadDNftDezszp0OLQ3FZ3ZGtmT2x63W153GzpXE9gSE9NTktPa23i7H7Qz+Lv +ysrM1+/KydFc6dP8aVN32XJXV/9cU05KdFlHUWFtT1Pk4tJ6Zs/K2Vbeys7Y6tLF1FVozPJg +U1zSd0tP2mZPUlfnbk9f7/hX/Nn9fmfhz/NV98rZYm3c0edcfs3QbWPb025OWfd0TkhVcFtK +Tn7naF372dzr5NbR1t7Vy8/c2s7T5n7/3uFsW2d+XVNWVE9JRkpLRkNOYmRZXeXU2t/RycfK +zsrFytPQy83X6eXe8WNbY2JUTFBXUEpJUFZOSlBfYVhZde9+debV1tzXysXN2NDIyNbe19Le +b19hXlFPT09PTlNaWFNUbPxtanft5PNy9N/e+3De0Nnz9drY3+/r1M/Z7N3Q32didW9aWFlR +TUxOWl1WWu3b7nXq19PfcGZzZlFLTVVcYnXdzcfEwcHBv8PJ0t/sdlhKPj9TTUBLTUlISUpU ++Glk2cfO4trUz9Df6N3U3/Tt3NHP0M7IxcrU3N9wTT48Pj05NjpBSUpR7s3Ewr66tre8wsXJ +1HdUVFZOSEBCSEpKS09VXF9ZVHjT1NLQ0s3Hyc3GwcHBwsrY42lWS0M/Pj48PDw/RUpSX/fT +y83S1c/M0vln/ujubG7j0srKx7+6uLq9wMTL3l1PSUQ/OzY1Nzk4OTs/SlFNVdvMzM3NzcfC +xsa/vr6+wMfKzNbncFpST0pGRUZKTVBVadrb6OHm4N9tVVRVTUdERU1ZaPrYzMS+vby7ury/ +x83P23NUSkVFQz8/QENGR0VOY2RkXFVUY2tk/uXbz8nKy8nJycrO1dre5O57amx87uvf1NTX +4H14clxNSUZDQT8+QUlSX/bbzcXAvr2+vr/Ey9Dd/1tNRkVFQkNESUtLVmP83vBpa+bZ19vp +4tLO1uD1/Oji8G1lZ250bGl169vU0dHNyc7Z8XJ2bldKR0dLS0lKU2nm2c/Mx8LCxcnO2el2 +X1dMRD9AQkJAQUVLT2D72c/T1dHKxsPDxsTBwsfN193e6mxZT0pJSEZGR0tTXmh56uHj72xj +a2tiWVRVW2JocevXzcjFwr+/v8HEydDd+2FWTEQ/PT4/QENHSk5h8N3Z6nrr19LU29vTzc7W +4v94/m9eWVVXXGVqfuvd087Kx8bJzNXf9GhYTkhEQ0JBQ0hPXXng1cvGxMPExMfM1t/sdlxN +REFDRkhJS01d6dbNz9zbzsjJzdXUzczT6lxTVVNNSERER0pLTFJg7NTMx8PCwsXM0tjgd15Q +S0hIR0dMVmvq29HKxsLBwsXIzdPd+15PSEVGR0VFSk5PV2fl1dx4avPe3OdvcuXb3ehxavrs ++2lcXWlvb3F68t3Ry8fFyMrO1t31YlRLRUJAPz9ARlFj7dnNxr+9vb2+vsHL2+1yWkk/Pj9E +RERHTV3p2tbZ5e7p7Pn9bW/s6PtsX15tc25taWZscXJv/uvZzsrEwMLHy8/T2vRdT0lHREA/ +Q0pWZnvj08zHxcfJzNHd9WFVTktJSElLTVFbdOPa19XPzc3O0t3pe2ZdWldTUlBUWVhaXGT2 +4OT3e/7x9nfx2MzHxMPCwMDGzt38a11PRj89PDw9P0VOXuvWzcnGxMLCxMjLzdTZ6HNfWVVP +SkdFRERERERFR0tTWmjv3dTPy8bBv7++v7/AwsXIzdjlcFlOSUdFQ0JCRUhOUVVZX2x19uvh +3t7d2NTT1NPQz9LV1trc5PH7b2VdVVFPTk1MTE1OUFJXXmp1/+7m39nW1tXT0dLS09LP0NPV +19rf6vP7emxmXllUT01LTE1PUVVaYW356t7Z1dHP0NTV1tjc5OrzfW1lYWBfXVtZW2FhYWVm +amtma292fXVuePr5/X769Onk4N3c29rb29zf4uTl5+zu9/50b29tbWtoYV1cWVlZWlxfXmFs +ffbv5t7a29zc3N/p6Ofu83htaGRfXV9fX2NmbXJ98PPz7Ons9e3o5urv7+zm5+rp5+jv/Xr8 +fv10aGtubW1pa3J4fmtkY2JfWlldaG1sbuvf4OPf2dXX2dze3d/s8/V3bWxoYF9dXl9iZF9l +duv4b3vu5+39/fbo3O1ibdrV3+/j0M/uVVJn+GBUXO/kd15daHlvXVdXXF1YWV9nZ2Fm++Tb +2tfRzs3Pz87P1NnZ2t3i5OXh4ubu9vNsXVpaU0xLTE5MSkpLT1NUV15xfXf43NXc5dvR1N3e +0szLz9LQ0dvw8ebwaWFuf2thYm50YFZPTl35bFZNUGf/Ylp608zV7OHQ0/Vgaezg+G/r2NPb +5N3S0dzq93BaSUFFSUU9PEp843vtyby+zNnLwsv7X+fO21tRb976XWHt429RS05PSENGSk5U +WW16aNi/vcPKzcbM/1zhwr3EzsjH7Uk+PkVEP0FOcOz679rO0N3s73hYRz89PT0/R1d938y/ +vcDCvrm5v8nBvMdwVmnmZUlHWWJKPT5HSD89SFhQSE//8WJo1MDE1NjFvsfj3svL3ejd3VVS +w7nLTEDuzE84Pcy7zFhY2eg+MDI/SkRAVM3Ez9vOxMLO183Fzepu/vJoT1Jv339g9dPNztbO +yMbS9XBlWlFPUFRSUVBPTU5OS0lHS1FPUF3r2Nfh483GyMfFxMLBxM7Z19fN0O3wfU5r0XxI +PT1Y+UE2Rs3F6EtM7Hg9Nj9b6OLey7y7w8zMyMXN1c/Jz+ZjXFNGPTxJXU1BSt3GzXFf1cng +TljQzPxY3L7CYkhxx9RKQnTL60E/aNFnR0/j0XtOW9TIzd3aycv8V1Rt1HBLW8zF2EQ/3brJ +RztMzchPPWC9u85dUPh7Qjc7TfbkfO7SzuBpYfzbzcnJycrR6WVWUU1V9NPmYd/Hws14YtvT +Zkta9nNSTFBjVEdESlNXVU9ZbGtv8d3PzNLd183LzcvEv8DJ0tjd72VdUk1NUE9PTEpKR0JF +UGf7YFNn1dfp7dPCvMTZ39nvYFld7tnd7mxfYXFlWl7t1tfkfO7mcFNLU2v3WVXfyMjjXW/S +111Oec3UWklR3t5VS175alVObdbhYnPT1HlWXtbK2XfcysbRdXnY1e9qePxoWVNTXGhaXVhN +S1FPZ978XFdMXc/QePHKv73H6fjT8E1KV+nP2fTh099oT1L6099mafL8VUE/TGFRRFfPyN1k +7sa+zmbgwcH8Ve3Ky2xLVuJsSEVPXVhMTFZbTUlW8Nztdu/VzNLXzcG+y+TgzszeaWN43t/q +6W9aVEtIVeFkSEtMS0hAQ1zf+n/Pz+b6893b4tnGvsPKy83M2nx/4dzj9WZbV0tEQ0VEPT5L +c+1obN7P1/l618XL29fNytV4ZtrM4Vxw4epcTFXrdklFW25USkpl4GNO+cvO3+zk3+nt2cvN +1tXSztltaNbN419dZt3ZZE5RTURCSEpRY/f2aVZYcmRNXtHGz+7cxsXmYtrHyt3r18nRY2Hj +4FM+P1LtYkpV2c9qTV3Vy95o7NLeX2bo6fhcWGtoVFNfXFRcX2VrZ23l0s/Q0tXPysrQ2dbT +1N9ibOltUklMU2NmTEtQTk1eYXFxWOvCyFFDfMbF4V3Mu8dRUdLH4U9U2tdSSFnj311PZexZ +RlHt2+hv5tHXX05Xbu3m69zNzM/a7u/b2flr/t3Tek5UaVJDQkZOUUlLa/JaVnvc1dTSycPG +zM/LxMLExsvQ1e5TTlhaWVJLSEk/OUFUT1VVVfblTUnhz9bM0c7GzvPpy83UzMvOfk9uz9xO +S37P2kk+Vdl6SUpv1tpv9NLW7N/R03FVdNLXV0pk2/ZKQFDc4ktEYdPcXFbxzdBkXd3WdF3q +z9D/YuDP22d2z8fSee/Qz3VV/s7UX0xRdvJUSFvdeUc/TejjS0Bf1mpHTfHbam3KvshiY8S4 +xl/qu7bLTUrv01Y+RXzvST5EWl5LSl/Z3mJr187W39fPzuBiat3a6/X+8OHqXlhfaHbx+fl/ +Y1zr1/xbWmTv5Gpd/N73cmhcZuLecmBo6dnyV1vl1N9pWmrsd2n439rf4OHt/uzc4vfq29ba +eF/15FtPYXRfaVlOTlVOUFhUW+7fe2Ro+NrP3uzYzs7S39zMydXr39rhfmz76nRVUFJNSklL +TEpMXu9vUFXlzM3e3MjCy9fPw7/L4tvR2mNVVU9NTEpHREFARUpJTGTv+vbm4d3SzcnHysnE +w8jNz8vJzd/o7mJST1FRT01JSEpKS0dFTFZaVVJf/vh99dzLxcjLysfFx8vKxcLI1etpaHFc +T09SUE1HQUNKSUhNVVlYVVhjfd7OyczSz8fHz9jPxsbO53Ty5/hx/vZvX1ZQUE9OTE9RUVFP +T1hgY3Ls3NXU1NHLyMnP29zV0uBuYf3Y3F1PW+z3WExU6uhaT1JaW05KUWRqZmNqftzb2NXT +0M3N1dbT1dfY29nY3eTi7W1aV1dWUExLS0pJTVRaU1Vw1tPr/drKyNbm1cjK4Xnu3O1fXHvi +9FtVY29fWWF5+2JYX+/tambu2dno8eLY2+jz7ODl/WplZGZhW1haXWFeWVxpdHZ+69/c2trW +1dne5uzp6e92aF9cW1teY2doamltfPz++eje3d/r4djW19zZ1trlfHVuZ11ZW1taVlNVWFlW +VldaWltkdu7m4d7d3N3e3tzb29vY1tbV1tfX2Nvc4+97bGJbVVBOTU1NT1NWWV1haXj57ezp +5eLf2tfX19fX2drc3+Xu9/x9b2pmXllTUE9SVVZZWV1oePvw5t7b2tnX1dXV1tTV1dfZ3OHq +8XVjWlRRT09PUFJVVlZbX2Zrb/rr39vW1NLS09TW19vf6Pd1a2JcWllZWlxfZWpzfPz19n15 +d3v/+vn3/np8//X28u7y6uXg3t7e4eXo6Ovv/Hp4cWxgX2BgYGZrbW1qZ2NfX15fY2Ztd/3v +6ufi39/e3eHi4ePk5OXl5+vv8ft2bWpqZ2ZlZ2dobXF7/Pfs6unt/3FqZWBlaWptbnBubHV6 +e/98dXN0d/rv6eTf3+Df397e3Nzb2t7h6e38bWtsZ2RhX11bWFVUVFJRU1NVWFteZnX05dzX +1NDNzc3NzMzNztHW2+LsfGtlY2FcWVtbWVlXVFJTUlJQUFFQUFJTVltkdevc08zIxcPCwsHB +w8XHzM/Y4PVlV05KRkRDQkNDQkJERklNU11u797WzsrIxsTDw8LDxMXIztLP22hUTktMTEhG +SEZBP0FDSVVm9t/Z2NPNycbEw8XIzNHX29zc3+t1YFhPTEtJSUtMTlBRVlpiduvb19PQz87M +y8vMztTc8GxhXFdUVFNSUlVXW11gZWRgXlxeaHzx6N3Z1NHPzs/Oz9DT2N7l6e32dWZdWlhS +Tk1NTk9RU1ZbX2FpdPno39vW0dDQzszNzc7Q1Nfa2+LvdmZeV1FNS0pJSElKSktLTlNYX2l9 +6d/Y08/MycbFxMTExMTGyczS2eD1bl5XUk1KR0VEQ0NCP0ZKQ0dFTmFfcvTXz9TQzMfEw8C+ +vL7AxcvQ2+1xbGBdWFRTUE5MTExMTUxMTExNTU9UWl9ja/rj2tTPy8jFxcbFxsnMztHT19ze +5vJwX1ZQTEdCQEBBQUJESEpNU1tn9+DXz8zIxMHAv8DBxMbIys3P1Nvk/2JYT0pGQz8/Pj4+ +P0BBRUhOWm7j1c3Hw8C/vr6+vr6+wMPHzNXlblpPSkVCQEA/P0BCQ0ZJS01TWmr349fOysfF +xcTFxcTFx8nM0Nbd6ntlWlNNSUZGRkdHSEpMTk9SWmNz8eTZ0c/My8rJycrLy8zO09ne6P1r +YFpYVFJQTk9PT1BSVlhaXmBmbXj27u7s5t7c3Nzb2NfY2Nrb3uPq7/f//Hp2cG5sbGpmZ2Vk +Zmlqa2tqZ2ZmZmpsePTw7enm4eDf4OTm7/l5cm5naWxzfX/+9/Hs6ebk4+Pk5uzv9P11amBf +XltYWlZRbFpfZFr+829y7+HX3+rc19nb6OHb4erp5N7g8+fk4+b8ePl8cWpocG9iXVxcXllV +Wl1dWldYXV5dXmRv9+3o39va293Z09HP0NLT1tjZ2tzh9XlvaGJeXFtbWllYWFlZWVpbWllZ +W15lannw5t3Z2NXQz87Ozs/S1dnc4/hvZFxVT05NTExMTk9PUldcZXP56t7X0c/MysnJycrL +zc/U2N3h7nprY11WT0tJR0VEREVHSUtOU1tkb/Xj2NDMyMXCwMDAwcXIy87U3el7Y1lRTElH +RUNDQ0NERUhLT1ZfcO7c1c7LycbDwsHBw8THys7T2OP3alxVT0tIR0ZFRUVGSElLTVBWXWZ5 +6t7Yz83LycjIyMnLzc/S1tnc4+38b2NbVU9MS0pKSkpLTU9TWV5o/unc1c/MycjGxsXFx8rM +z9jkeWZcU09LSEZFQ0JCQkJER0tSW2rv3tfOy8nGxMLDw8TGyMnKzdDX3ux9ZltXUk9MS0lI +R0hJS0xNT1NZXWRrc/fq393Y0s/OzMrJycnKy83P09jd4en7a11XUU5MSkdGRkdISEpNUVhh +du7g2tTPzs3My8vJx8jJyszP1NzpcV9ZVFFPT09PTk1MTU1OU1lfZnJ/9Onh3d3c2tjX2Nna +293d3eDn7fD8e3Z0dnZ/8+/t6+3u7+/v8vh5bWxoYl5bWFVTVFRVVVdaWltbXmBp/Orh2dPO +y8nHxcXHyczP197pfGpfW1dRTkxJSEdISkxOU1heZ2786uDb1c/NzMvMy8zNztHW3ODm8Hxs +X1lUT09OTU1MS0tLTExOUFddZ3bv39jPy8jFxMLCw8TGyMvO1N3q/WthXlhSTkxKSEZFRURF +RkdKTVBWX3D55NfPzMnIx8fIyMjIycrMztPa4vBzZl5XT0tIRkVERUdJTFJZYG745dvV0tDP +zs3Nzc7R1NXX2d3j7Px1bGdeWVVTT05NTk9SVllcYGp09+rl39zb2tra2dna2NjZ2t3h6fxy +amZhYGFlZmNiX19dW1tcXmBkaGxucHf/9erh3djTzszNzs7P0dbd5O37dmNdWVVVUU9PT05N +TExMTU9RVl1q/une19PPzczLy8vKy8zNz9TZ3uTr6+/9eGteV1JNTEtLS0tMTk9TV1tibn77 +9Ozn493c2tfU09LQ0NHU1tjZ2dvf5Ovt/Hl3dHJtZGBfXFlVUU9NS0tMTExNTlJZXmzv3tXP +zMrHxMPCw8XHyc3T3O1uXlROS0lJSUpMTk9SVlhcYGVsfu/k3trY09DPzs3OztHX3en9aV5Y +Uk9OTU5PUlddYGVsffDq5N7a2tra19bV1tfW2Nrc3uLq83pvaF5YVE9NTExMTk9RVlpfaHPx +5eDf3tzZ1tTS0M7Nzc3Nzs/R1tzh8HhmX1xWU1FPTUtLTEtMTE1OUVZcZXD96d/c2tjV0M3M +y8nIycrMztLZ4Ox+a15aVVFPT09QUlNWW19gYGZtdP379u7p5+bn6+3t7/Hy7+7u7fl9e3Z2 +dHd4//rx6OXj4N/i4+Pk4+fn7PD6dW5ramppZGBfX11dXmJnaWpoZF9fXVtdYWp2/uzh29bU +09DPz8/P0tjb3+Xj6vlvY15aVFBOTUtMTk9VWF1hZm12+evh3tza2tnX1dXW1dTW2Nnb3uDh +4+Lj6/t3 +--hal_9000-- +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: Multiple encapsulation + +Received: from tomobiki-cho.cac.washington.edu by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA17676; Thu, 24 Oct 91 17:34:03 -0700 +Date: Thu, 24 Oct 1991 17:32:56 -0700 (PDT) +From: Mark Crispin <MRC@CAC.Washington.EDU> +Sender: Mark Crispin <mrc@Tomobiki-Cho.CAC.Washington.EDU> +Subject: Here's some more +To: Mark Crispin <MRC@CAC.Washington.EDU> +Message-Id: <MailManager.688350776.11603.mrc@Tomobiki-Cho.CAC.Washington.EDU> +MIME-Version: 1.0 +Content-Type: MULTIPART/MIXED;BOUNDARY="16819560-2078917053-688350843:#11603" + +--16819560-2078917053-688350843:#11603 +Content-Type: APPLICATION/POSTSCRIPT +Content-Transfer-Encoding: BASE64 +Content-Description: The Simpsons!! + +JSEKJSVCb3VuZGluZ0JveDogKGF0ZW5kKQolJVBhZ2VzOiAoYXRlbmQpCiUl +RG9jdW1lbnRGb250czogKGF0ZW5kKQolJUVuZENvbW1lbnRzCiUKJSBGcmFt +ZU1ha2VyIFBvc3RTY3JpcHQgUHJvbG9nIDIuMCwgZm9yIHVzZSB3aXRoIEZy +YW1lTWFrZXIgMi4wCiUgQ29weXJpZ2h0IChjKSAxOTg2LDg3LDg5IGJ5IEZy +YW1lIFRlY2hub2xvZ3ksIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiUK +JSBLbm93biBQcm9ibGVtczoKJQlEdWUgdG8gYnVncyBpbiBUcmFuc2NyaXB0 +LCB0aGUgJ1BTLUFkb2JlLScgaXMgb21pdHRlZCBmcm9tIGxpbmUgMQovRk12 +ZXJzaW9uICgyLjApIGRlZiAKJSBTZXQgdXAgQ29sb3IgdnMuIEJsYWNrLWFu +ZC1XaGl0ZQoJL0ZNUHJpbnRJbkNvbG9yIHN5c3RlbWRpY3QgL2NvbG9yaW1h +Z2Uga25vd24gZGVmCiUgVW5jb21tZW50IHRoaXMgbGluZSB0byBmb3JjZSBi +Jncgb24gY29sb3IgcHJpbnRlcgolICAgL0ZNUHJpbnRJbkNvbG9yIGZhbHNl +IGRlZgovRnJhbWVEaWN0IDE5MCBkaWN0IGRlZiAKc3lzdGVtZGljdCAvZXJy +b3JkaWN0IGtub3duIG5vdCB7L2Vycm9yZGljdCAxMCBkaWN0IGRlZgoJCWVy +cm9yZGljdCAvcmFuZ2VjaGVjayB7c3RvcH0gcHV0fSBpZgolIFRoZSByZWFk +bGluZSBpbiAyMy4wIGRvZXNuJ3QgcmVjb2duaXplIGNyJ3MgYXMgbmwncyBv +biBBcHBsZVRhbGsKRnJhbWVEaWN0IC90bXByYW5nZWNoZWNrIGVycm9yZGlj +dCAvcmFuZ2VjaGVjayBnZXQgcHV0IAplcnJvcmRpY3QgL3JhbmdlY2hlY2sg +e0ZyYW1lRGljdCAvYnVnIHRydWUgcHV0fSBwdXQgCkZyYW1lRGljdCAvYnVn +IGZhbHNlIHB1dCAKbWFyayAKJSBTb21lIFBTIG1hY2hpbmVzIHJlYWQgcGFz +dCB0aGUgQ1IsIHNvIGtlZXAgdGhlIGZvbGxvd2luZyAzIGxpbmVzIHRvZ2V0 +aGVyIQpjdXJyZW50ZmlsZSA1IHN0cmluZyByZWFkbGluZQowMAowMDAwMDAw +MDAwCmNsZWFydG9tYXJrIAplcnJvcmRpY3QgL3JhbmdlY2hlY2sgRnJhbWVE +aWN0IC90bXByYW5nZWNoZWNrIGdldCBwdXQgCkZyYW1lRGljdCAvYnVnIGdl +dCB7IAoJL3JlYWRsaW5lIHsKCQkvZ3N0cmluZyBleGNoIGRlZgoJCS9nZmls +ZSBleGNoIGRlZgoJCS9naW5kZXggMCBkZWYKCQl7CgkJCWdmaWxlIHJlYWQg +cG9wIAoJCQlkdXAgMTAgZXEge2V4aXR9IGlmIAoJCQlkdXAgMTMgZXEge2V4 +aXR9IGlmIAoJCQlnc3RyaW5nIGV4Y2ggZ2luZGV4IGV4Y2ggcHV0IAoJCQkv +Z2luZGV4IGdpbmRleCAxIGFkZCBkZWYgCgkJfSBsb29wCgkJcG9wIAoJCWdz +dHJpbmcgMCBnaW5kZXggZ2V0aW50ZXJ2YWwgdHJ1ZSAKCQl9IGRlZgoJfSBp +ZgovRk1WRVJTSU9OIHsKCUZNdmVyc2lvbiBuZSB7CgkJL1RpbWVzLVJvbWFu +IGZpbmRmb250IDE4IHNjYWxlZm9udCBzZXRmb250CgkJMTAwIDEwMCBtb3Zl +dG8KCQkoRnJhbWVNYWtlciB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoIHBvc3Rz +Y3JpcHRfcHJvbG9nISkKCQlkdXAgPQoJCXNob3cgc2hvd3BhZ2UKCQl9IGlm +Cgl9IGRlZiAKL0ZNTE9DQUwgewoJRnJhbWVEaWN0IGJlZ2luCgkwIGRlZiAK +CWVuZCAKCX0gZGVmIAoJL2dzdHJpbmcgRk1MT0NBTAoJL2dmaWxlIEZNTE9D +QUwKCS9naW5kZXggRk1MT0NBTAoJL29yZ3hmZXIgRk1MT0NBTAoJL29yZ3By +b2MgRk1MT0NBTAoJL29yZ2FuZ2xlIEZNTE9DQUwKCS9vcmdmcmVxIEZNTE9D +QUwKCS95c2NhbGUgRk1MT0NBTAoJL3hzY2FsZSBGTUxPQ0FMCgkvbWFudWFs +ZmVlZCBGTUxPQ0FMCgkvcGFwZXJoZWlnaHQgRk1MT0NBTAoJL3BhcGVyd2lk +dGggRk1MT0NBTAovRk1ET0NVTUVOVCB7IAoJYXJyYXkgL0ZNZm9udHMgZXhj +aCBkZWYgCgkvI2NvcGllcyBleGNoIGRlZgoJRnJhbWVEaWN0IGJlZ2luCgkw +IG5lIGR1cCB7c2V0bWFudWFsZmVlZH0gaWYKCS9tYW51YWxmZWVkIGV4Y2gg +ZGVmCgkvcGFwZXJoZWlnaHQgZXhjaCBkZWYKCS9wYXBlcndpZHRoIGV4Y2gg +ZGVmCglzZXRwYXBlcm5hbWUKCW1hbnVhbGZlZWQge3RydWV9IHtwYXBlcnNp +emV9IGlmZWxzZSAKCXttYW51YWxwYXBlcnNpemV9IHtmYWxzZX0gaWZlbHNl +IAoJe2Rlc3BlcmF0ZXBhcGVyc2l6ZX0gaWYKCS95c2NhbGUgZXhjaCBkZWYK +CS94c2NhbGUgZXhjaCBkZWYKCWN1cnJlbnR0cmFuc2ZlciBjdmxpdCAvb3Jn +eGZlciBleGNoIGRlZgoJY3VycmVudHNjcmVlbiBjdmxpdCAvb3JncHJvYyBl +eGNoIGRlZgoJL29yZ2FuZ2xlIGV4Y2ggZGVmIC9vcmdmcmVxIGV4Y2ggZGVm +CgllbmQgCgl9IGRlZiAKCS9wYWdlc2F2ZSBGTUxPQ0FMCgkvb3JnbWF0cml4 +IEZNTE9DQUwKCS9sYW5kc2NhcGUgRk1MT0NBTAovRk1CRUdJTlBBR0UgeyAK +CUZyYW1lRGljdCBiZWdpbiAKCS9wYWdlc2F2ZSBzYXZlIGRlZgoJMy44NiBz +ZXRtaXRlcmxpbWl0CgkvbGFuZHNjYXBlIGV4Y2ggMCBuZSBkZWYKCWxhbmRz +Y2FwZSB7IAoJCTkwIHJvdGF0ZSAwIGV4Y2ggbmVnIHRyYW5zbGF0ZSBwb3Ag +CgkJfQoJCXtwb3AgcG9wfQoJCWlmZWxzZQoJeHNjYWxlIHlzY2FsZSBzY2Fs +ZQoJL29yZ21hdHJpeCBtYXRyaXggZGVmCglnc2F2ZSAKCX0gZGVmIAovRk1F +TkRQQUdFIHsKCWdyZXN0b3JlIAoJcGFnZXNhdmUgcmVzdG9yZQoJZW5kIAoJ +c2hvd3BhZ2UKCX0gZGVmIAovRk1ERUZJTkVGT05UIHsgCglGcmFtZURpY3Qg +YmVnaW4KCWZpbmRmb250IAoJUmVFbmNvZGUgCgkyIGluZGV4IGV4Y2ggCglk +ZWZpbmVmb250IGV4Y2ggCglzY2FsZWZvbnQgCglGTWZvbnRzIDMgMSByb2xs +IAoJcHV0CgllbmQgCgl9IGJpbmQgZGVmCi9GTU5PUk1BTElaRUdSQVBISUNT +IHsgCgluZXdwYXRoCgkwLjAgMC4wIG1vdmV0bwoJMSBzZXRsaW5ld2lkdGgK +CTAgc2V0bGluZWNhcAoJMCAwIDAgc2V0aHNiY29sb3IKCTAgc2V0Z3JheSAK +CX0gYmluZCBkZWYKCS9meCBGTUxPQ0FMCgkvZnkgRk1MT0NBTAoJL2ZoIEZN +TE9DQUwKCS9mdyBGTUxPQ0FMCgkvbGx4IEZNTE9DQUwKCS9sbHkgRk1MT0NB +TAoJL3VyeCBGTUxPQ0FMCgkvdXJ5IEZNTE9DQUwKL0ZNQkVHSU5FUFNGIHsg +CgllbmQgCgkvRk1FUFNGIHNhdmUgZGVmIAoJL3Nob3dwYWdlIHt9IGRlZiAK +CUZNTk9STUFMSVpFR1JBUEhJQ1MgCglbL2Z5IC9meCAvZmggL2Z3IC91cnkg +L3VyeCAvbGx5IC9sbHhdIHtleGNoIGRlZn0gZm9yYWxsIAoJZnggZnkgdHJh +bnNsYXRlIAoJcm90YXRlCglmdyB1cnggbGx4IHN1YiBkaXYgZmggdXJ5IGxs +eSBzdWIgZGl2IHNjYWxlIAoJbGx4IG5lZyBsbHkgbmVnIHRyYW5zbGF0ZSAK +CX0gYmluZCBkZWYKL0ZNRU5ERVBTRiB7CglGTUVQU0YgcmVzdG9yZQoJRnJh +bWVEaWN0IGJlZ2luIAoJfSBiaW5kIGRlZgpGcmFtZURpY3QgYmVnaW4gCi9z +ZXRtYW51YWxmZWVkIHsKJSVCZWdpbkZlYXR1cmUgKk1hbnVhbEZlZWQgVHJ1 +ZQoJIHN0YXR1c2RpY3QgL21hbnVhbGZlZWQgdHJ1ZSBwdXQKJSVFbmRGZWF0 +dXJlCgl9IGRlZgovbWF4IHsyIGNvcHkgbHQge2V4Y2h9IGlmIHBvcH0gYmlu +ZCBkZWYKL21pbiB7MiBjb3B5IGd0IHtleGNofSBpZiBwb3B9IGJpbmQgZGVm +Ci9pbmNoIHs3MiBtdWx9IGRlZgovcGFnZWRpbWVuIHsgCglwYXBlcmhlaWdo +dCBzdWIgYWJzIDE2IGx0IGV4Y2ggCglwYXBlcndpZHRoIHN1YiBhYnMgMTYg +bHQgYW5kCgl7L3BhcGVybmFtZSBleGNoIGRlZn0ge3BvcH0gaWZlbHNlCgl9 +IGRlZgoJL3BhcGVyc2l6ZWRpY3QgRk1MT0NBTAovc2V0cGFwZXJuYW1lIHsg +CgkvcGFwZXJzaXplZGljdCAxNCBkaWN0IGRlZiAKCXBhcGVyc2l6ZWRpY3Qg +YmVnaW4KCS9wYXBlcm5hbWUgL3Vua25vd24gZGVmIAoJCS9MZXR0ZXIgOC41 +IGluY2ggMTEuMCBpbmNoIHBhZ2VkaW1lbgoJCS9MZXR0ZXJTbWFsbCA3LjY4 +IGluY2ggMTAuMTYgaW5jaCBwYWdlZGltZW4KCQkvVGFibG9pZCAxMS4wIGlu +Y2ggMTcuMCBpbmNoIHBhZ2VkaW1lbgoJCS9MZWRnZXIgMTcuMCBpbmNoIDEx +LjAgaW5jaCBwYWdlZGltZW4KCQkvTGVnYWwgOC41IGluY2ggMTQuMCBpbmNo +IHBhZ2VkaW1lbgoJCS9TdGF0ZW1lbnQgNS41IGluY2ggOC41IGluY2ggcGFn +ZWRpbWVuCgkJL0V4ZWN1dGl2ZSA3LjUgaW5jaCAxMC4wIGluY2ggcGFnZWRp +bWVuCgkJL0EzIDExLjY5IGluY2ggMTYuNSBpbmNoIHBhZ2VkaW1lbgoJCS9B +NCA4LjI2IGluY2ggMTEuNjkgaW5jaCBwYWdlZGltZW4KCQkvQTRTbWFsbCA3 +LjQ3IGluY2ggMTAuODUgaW5jaCBwYWdlZGltZW4KCQkvQjQgMTAuMTI1IGlu +Y2ggMTQuMzMgaW5jaCBwYWdlZGltZW4KCQkvQjUgNy4xNiBpbmNoIDEwLjEy +NSBpbmNoIHBhZ2VkaW1lbgoJZW5kCgl9IGRlZgovcGFwZXJzaXplIHsKCXBh +cGVyc2l6ZWRpY3QgYmVnaW4KCQkvTGV0dGVyIHtsZXR0ZXJ0cmF5fSBkZWYK +CQkvTGV0dGVyU21hbGwge2xldHRlcnRyYXkgbGV0dGVyc21hbGx9IGRlZgoJ +CS9UYWJsb2lkIHsxMXgxN3RyYXl9IGRlZgoJCS9MZWRnZXIge2xlZGdlcnRy +YXl9IGRlZgoJCS9MZWdhbCB7bGVnYWx0cmF5fSBkZWYKCQkvU3RhdGVtZW50 +IHtzdGF0ZW1lbnR0cmF5fSBkZWYKCQkvRXhlY3V0aXZlIHtleGVjdXRpdmV0 +cmF5fSBkZWYKCQkvQTMge2EzdHJheX0gZGVmCgkJL0E0IHthNHRyYXl9IGRl +ZgoJCS9BNFNtYWxsIHthNHRyYXkgYTRzbWFsbH0gZGVmCgkJL0I0IHtiNHRy +YXl9IGRlZgoJCS9CNSB7YjV0cmF5fSBkZWYKCQkvdW5rbm93biB7dW5rbm93 +bn0gZGVmCglwYXBlcnNpemVkaWN0IGR1cCBwYXBlcm5hbWUga25vd24ge3Bh +cGVybmFtZX0gey91bmtub3dufSBpZmVsc2UgZ2V0CgllbmQKCXN0YXR1c2Rp +Y3QgYmVnaW4gc3RvcHBlZCBlbmQgCgl9IGRlZgovbWFudWFscGFwZXJzaXpl +IHsKCXBhcGVyc2l6ZWRpY3QgYmVnaW4KCQkvTGV0dGVyIHtsZXR0ZXJ9IGRl +ZgoJCS9MZXR0ZXJTbWFsbCB7bGV0dGVyc21hbGx9IGRlZgoJCS9UYWJsb2lk +IHsxMXgxN30gZGVmCgkJL0xlZGdlciB7bGVkZ2VyfSBkZWYKCQkvTGVnYWwg +e2xlZ2FsfSBkZWYKCQkvU3RhdGVtZW50IHtzdGF0ZW1lbnR9IGRlZgoJCS9F +eGVjdXRpdmUge2V4ZWN1dGl2ZX0gZGVmCgkJL0EzIHthM30gZGVmCgkJL0E0 +IHthNH0gZGVmCgkJL0E0U21hbGwge2E0c21hbGx9IGRlZgoJCS9CNCB7YjR9 +IGRlZgoJCS9CNSB7YjV9IGRlZgoJCS91bmtub3duIHt1bmtub3dufSBkZWYK +CXBhcGVyc2l6ZWRpY3QgZHVwIHBhcGVybmFtZSBrbm93biB7cGFwZXJuYW1l +fSB7L3Vua25vd259IGlmZWxzZSBnZXQKCWVuZAoJc3RvcHBlZCAKCX0gZGVm +Ci9kZXNwZXJhdGVwYXBlcnNpemUgewoJc3RhdHVzZGljdCAvc2V0cGFnZXBh +cmFtcyBrbm93bgoJCXsKCQlwYXBlcndpZHRoIHBhcGVyaGVpZ2h0IDAgMSAK +CQlzdGF0dXNkaWN0IGJlZ2luCgkJe3NldHBhZ2VwYXJhbXN9IHN0b3BwZWQg +cG9wIAoJCWVuZAoJCX0gaWYKCX0gZGVmCi9zYXZlbWF0cml4IHsKCW9yZ21h +dHJpeCBjdXJyZW50bWF0cml4IHBvcAoJfSBiaW5kIGRlZgovcmVzdG9yZW1h +dHJpeCB7CglvcmdtYXRyaXggc2V0bWF0cml4Cgl9IGJpbmQgZGVmCi9kbWF0 +cml4IG1hdHJpeCBkZWYKL2RwaSAgICA3MiAwIGRtYXRyaXggZGVmYXVsdG1h +dHJpeCBkdHJhbnNmb3JtCiAgICBkdXAgbXVsIGV4Y2ggICBkdXAgbXVsIGFk +ZCAgIHNxcnQgZGVmCi9mcmVxIGRwaSAxOC43NSBkaXYgOCBkaXYgcm91bmQg +ZHVwIDAgZXEge3BvcCAxfSBpZiA4IG11bCBkcGkgZXhjaCBkaXYgZGVmCi9z +YW5nbGUgMSAwIGRtYXRyaXggZGVmYXVsdG1hdHJpeCBkdHJhbnNmb3JtIGV4 +Y2ggYXRhbiBkZWYKL0RpYWNyaXRpY0VuY29kaW5nIFsKLy5ub3RkZWYgLy5u +b3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5u +b3RkZWYKLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5u +b3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYKLy5ub3RkZWYgLy5ub3RkZWYgLy5u +b3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYKLy5u +b3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5u +b3RkZWYgLy5ub3RkZWYKLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5u +b3RkZWYgL3NwYWNlIC9leGNsYW0gL3F1b3RlZGJsCi9udW1iZXJzaWduIC9k +b2xsYXIgL3BlcmNlbnQgL2FtcGVyc2FuZCAvcXVvdGVzaW5nbGUgL3BhcmVu +bGVmdAovcGFyZW5yaWdodCAvYXN0ZXJpc2sgL3BsdXMgL2NvbW1hIC9oeXBo +ZW4gL3BlcmlvZCAvc2xhc2ggL3plcm8gL29uZQovdHdvIC90aHJlZSAvZm91 +ciAvZml2ZSAvc2l4IC9zZXZlbiAvZWlnaHQgL25pbmUgL2NvbG9uIC9zZW1p +Y29sb24KL2xlc3MgL2VxdWFsIC9ncmVhdGVyIC9xdWVzdGlvbiAvYXQgL0Eg +L0IgL0MgL0QgL0UgL0YgL0cgL0ggL0kgL0ogL0sKL0wgL00gL04gL08gL1Ag +L1EgL1IgL1MgL1QgL1UgL1YgL1cgL1ggL1kgL1ogL2JyYWNrZXRsZWZ0IC9i +YWNrc2xhc2gKL2JyYWNrZXRyaWdodCAvYXNjaWljaXJjdW0gL3VuZGVyc2Nv +cmUgL2dyYXZlIC9hIC9iIC9jIC9kIC9lIC9mIC9nIC9oCi9pIC9qIC9rIC9s +IC9tIC9uIC9vIC9wIC9xIC9yIC9zIC90IC91IC92IC93IC94IC95IC96IC9i +cmFjZWxlZnQgL2JhcgovYnJhY2VyaWdodCAvYXNjaWl0aWxkZSAvLm5vdGRl +ZiAvQWRpZXJlc2lzIC9BcmluZyAvQ2NlZGlsbGEgL0VhY3V0ZQovTnRpbGRl +IC9PZGllcmVzaXMgL1VkaWVyZXNpcyAvYWFjdXRlIC9hZ3JhdmUgL2FjaXJj +dW1mbGV4IC9hZGllcmVzaXMKL2F0aWxkZSAvYXJpbmcgL2NjZWRpbGxhIC9l +YWN1dGUgL2VncmF2ZSAvZWNpcmN1bWZsZXggL2VkaWVyZXNpcwovaWFjdXRl +IC9pZ3JhdmUgL2ljaXJjdW1mbGV4IC9pZGllcmVzaXMgL250aWxkZSAvb2Fj +dXRlIC9vZ3JhdmUKL29jaXJjdW1mbGV4IC9vZGllcmVzaXMgL290aWxkZSAv +dWFjdXRlIC91Z3JhdmUgL3VjaXJjdW1mbGV4Ci91ZGllcmVzaXMgL2RhZ2dl +ciAvLm5vdGRlZiAvY2VudCAvc3RlcmxpbmcgL3NlY3Rpb24gL2J1bGxldAov +cGFyYWdyYXBoIC9nZXJtYW5kYmxzIC9yZWdpc3RlcmVkIC9jb3B5cmlnaHQg +L3RyYWRlbWFyayAvYWN1dGUKL2RpZXJlc2lzIC8ubm90ZGVmIC9BRSAvT3Ns +YXNoIC8ubm90ZGVmIC8ubm90ZGVmIC8ubm90ZGVmIC8ubm90ZGVmCi95ZW4g +Ly5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYg +Ly5ub3RkZWYKL29yZGZlbWluaW5lIC9vcmRtYXNjdWxpbmUgLy5ub3RkZWYg +L2FlIC9vc2xhc2ggL3F1ZXN0aW9uZG93bgovZXhjbGFtZG93biAvbG9naWNh +bG5vdCAvLm5vdGRlZiAvZmxvcmluIC8ubm90ZGVmIC8ubm90ZGVmCi9ndWls +bGVtb3RsZWZ0IC9ndWlsbGVtb3RyaWdodCAvZWxsaXBzaXMgLy5ub3RkZWYg +L0FncmF2ZSAvQXRpbGRlCi9PdGlsZGUgL09FIC9vZSAvZW5kYXNoIC9lbWRh +c2ggL3F1b3RlZGJsbGVmdCAvcXVvdGVkYmxyaWdodAovcXVvdGVsZWZ0IC9x +dW90ZXJpZ2h0IC8ubm90ZGVmIC8ubm90ZGVmIC95ZGllcmVzaXMgL1lkaWVy +ZXNpcwovZnJhY3Rpb24gL2N1cnJlbmN5IC9ndWlsc2luZ2xsZWZ0IC9ndWls +c2luZ2xyaWdodCAvZmkgL2ZsIC9kYWdnZXJkYmwKL3BlcmlvZGNlbnRlcmVk +IC9xdW90ZXNpbmdsYmFzZSAvcXVvdGVkYmxiYXNlIC9wZXJ0aG91c2FuZAov +QWNpcmN1bWZsZXggL0VjaXJjdW1mbGV4IC9BYWN1dGUgL0VkaWVyZXNpcyAv +RWdyYXZlIC9JYWN1dGUKL0ljaXJjdW1mbGV4IC9JZGllcmVzaXMgL0lncmF2 +ZSAvT2FjdXRlIC9PY2lyY3VtZmxleCAvLm5vdGRlZiAvT2dyYXZlCi9VYWN1 +dGUgL1VjaXJjdW1mbGV4IC9VZ3JhdmUgL2RvdGxlc3NpIC9jaXJjdW1mbGV4 +IC90aWxkZSAvbWFjcm9uCi9icmV2ZSAvZG90YWNjZW50IC9yaW5nIC9jZWRp +bGxhIC9odW5nYXJ1bWxhdXQgL29nb25layAvY2Fyb24KXSBkZWYKL1JlRW5j +b2RlIHsgCglkdXAgCglsZW5ndGggCglkaWN0IGJlZ2luIAoJewoJMSBpbmRl +eCAvRklEIG5lIAoJCXtkZWZ9IAoJCXtwb3AgcG9wfSBpZmVsc2UgCgl9IGZv +cmFsbAoJRW5jb2RpbmcgU3RhbmRhcmRFbmNvZGluZyBlcSAKCXsKCQkvRW5j +b2RpbmcgRGlhY3JpdGljRW5jb2RpbmcgZGVmCgl9aWYKCWN1cnJlbnRkaWN0 +IAoJZW5kIAoJfSBiaW5kIGRlZgovZ3JheW1vZGUgdHJ1ZSBkZWYKCS9id2lk +dGggRk1MT0NBTAoJL2Jwc2lkZSBGTUxPQ0FMCgkvYnN0cmluZyBGTUxPQ0FM +Cgkvb25iaXRzIEZNTE9DQUwKCS9vZmZiaXRzIEZNTE9DQUwKCS94aW5kZXgg +Rk1MT0NBTAoJL3lpbmRleCBGTUxPQ0FMCgkveCBGTUxPQ0FMCgkveSBGTUxP +Q0FMCi9zZXRwYXR0ZXJuIHsKCSAvYndpZHRoICBleGNoIGRlZgoJIC9icHNp +ZGUgIGV4Y2ggZGVmCgkgL2JzdHJpbmcgZXhjaCBkZWYKCSAvb25iaXRzIDAg +ZGVmICAvb2ZmYml0cyAwIGRlZgoJIGZyZXEgc2FuZ2xlIGxhbmRzY2FwZSB7 +OTAgYWRkfSBpZiAKCQl7L3kgZXhjaCBkZWYKCQkgL3ggZXhjaCBkZWYKCQkg +L3hpbmRleCB4IDEgYWRkIDIgZGl2IGJwc2lkZSBtdWwgY3ZpIGRlZgoJCSAv +eWluZGV4IHkgMSBhZGQgMiBkaXYgYnBzaWRlIG11bCBjdmkgZGVmCgkJIGJz +dHJpbmcgeWluZGV4IGJ3aWR0aCBtdWwgeGluZGV4IDggaWRpdiBhZGQgZ2V0 +CgkJIDEgNyB4aW5kZXggOCBtb2Qgc3ViIGJpdHNoaWZ0IGFuZCAwIG5lCgkJ +IHsvb25iaXRzICBvbmJpdHMgIDEgYWRkIGRlZiAxfQoJCSB7L29mZmJpdHMg +b2ZmYml0cyAxIGFkZCBkZWYgMH0KCQkgaWZlbHNlCgkJfQoJCXNldHNjcmVl +bgoJIHt9IHNldHRyYW5zZmVyCgkgb2ZmYml0cyBvZmZiaXRzIG9uYml0cyBh +ZGQgZGl2IEZNc2V0Z3JheQoJL2dyYXltb2RlIGZhbHNlIGRlZgoJfSBiaW5k +IGRlZgovZ3JheW5lc3MgewoJRk1zZXRncmF5CglncmF5bW9kZSBub3QgewoJ +CS9ncmF5bW9kZSB0cnVlIGRlZgoJCW9yZ3hmZXIgY3Z4IHNldHRyYW5zZmVy +CgkJb3JnZnJlcSBvcmdhbmdsZSBvcmdwcm9jIGN2eCBzZXRzY3JlZW4KCQl9 +IGlmCgl9IGJpbmQgZGVmCgkvSFVFIEZNTE9DQUwKCS9TQVQgRk1MT0NBTAoJ +L0JSSUdIVCBGTUxPQ0FMCgkvQ29sb3JzIEZNTE9DQUwKRk1QcmludEluQ29s +b3IgCgkKCXsKCS9IVUUgMCBkZWYKCS9TQVQgMCBkZWYKCS9CUklHSFQgMCBk +ZWYKCSUgYXJyYXkgb2YgYXJyYXlzIEh1ZSBhbmQgU2F0IHZhbHVlcyBmb3Ig +dGhlIHNlcGFyYXRpb25zIFtIVUUgQlJJR0hUXQoJL0NvbG9ycyAgIAoJW1sw +ICAgIDAgIF0gICAgJSBibGFjawoJIFswICAgIDAgIF0gICAgJSB3aGl0ZQoJ +IFswLjAwIDEuMF0gICAgJSByZWQKCSBbMC4zNyAxLjBdICAgICUgZ3JlZW4K +CSBbMC42MCAxLjBdICAgICUgYmx1ZQoJIFswLjUwIDEuMF0gICAgJSBjeWFu +CgkgWzAuODMgMS4wXSAgICAlIG1hZ2VudGEKCSBbMC4xNiAxLjBdICAgICUg +Y29tbWVudCAvIHllbGxvdwoJIF0gZGVmCiAgICAgIAoJL0JFR0lOQklUTUFQ +Q09MT1IgeyAKCQlCSVRNQVBDT0xPUn0gZGVmCgkvQkVHSU5CSVRNQVBDT0xP +UmMgeyAKCQlCSVRNQVBDT0xPUmN9IGRlZgoJL0sgeyAKCQlDb2xvcnMgZXhj +aCBnZXQgZHVwCgkJMCBnZXQgL0hVRSBleGNoIHN0b3JlIAoJCTEgZ2V0IC9C +UklHSFQgZXhjaCBzdG9yZQoJCSAgSFVFIDAgZXEgQlJJR0hUIDAgZXEgYW5k +CgkJCXsxLjAgU0FUIHN1YiBzZXRncmF5fQoJCQl7SFVFIFNBVCBCUklHSFQg +c2V0aHNiY29sb3J9IAoJCSAgaWZlbHNlCgkJfSBkZWYKCS9GTXNldGdyYXkg +eyAKCQkvU0FUIGV4Y2ggMS4wIGV4Y2ggc3ViIHN0b3JlIAoJCSAgSFVFIDAg +ZXEgQlJJR0hUIDAgZXEgYW5kCgkJCXsxLjAgU0FUIHN1YiBzZXRncmF5fQoJ +CQl7SFVFIFNBVCBCUklHSFQgc2V0aHNiY29sb3J9IAoJCSAgaWZlbHNlCgkJ +fSBiaW5kIGRlZgoJfQoJCgl7CgkvQkVHSU5CSVRNQVBDT0xPUiB7IAoJCUJJ +VE1BUEdSQVl9IGRlZgoJL0JFR0lOQklUTUFQQ09MT1JjIHsgCgkJQklUTUFQ +R1JBWWN9IGRlZgoJL0ZNc2V0Z3JheSB7c2V0Z3JheX0gYmluZCBkZWYKCS9L +IHsgCgkJcG9wCgkJfSBkZWYKCX0KaWZlbHNlCi9ub3JtYWxpemUgewoJdHJh +bnNmb3JtIHJvdW5kIGV4Y2ggcm91bmQgZXhjaCBpdHJhbnNmb3JtCgl9IGJp +bmQgZGVmCi9kbm9ybWFsaXplIHsKCWR0cmFuc2Zvcm0gcm91bmQgZXhjaCBy +b3VuZCBleGNoIGlkdHJhbnNmb3JtCgl9IGJpbmQgZGVmCi9sbm9ybWFsaXpl +IHsgCgkwIGR0cmFuc2Zvcm0gZXhjaCBjdmkgMiBpZGl2IDIgbXVsIDEgYWRk +IGV4Y2ggaWR0cmFuc2Zvcm0gcG9wCgl9IGJpbmQgZGVmCi9IIHsgCglsbm9y +bWFsaXplIHNldGxpbmV3aWR0aAoJfSBiaW5kIGRlZgovWiB7CglzZXRsaW5l +Y2FwCgl9IGJpbmQgZGVmCi9YIHsgCglmaWxscHJvY3MgZXhjaCBnZXQgZXhl +YwoJfSBiaW5kIGRlZgovViB7IAoJZ3NhdmUgZW9maWxsIGdyZXN0b3JlCgl9 +IGJpbmQgZGVmCi9OIHsgCglzdHJva2UKCX0gYmluZCBkZWYKL00ge25ld3Bh +dGggbW92ZXRvfSBiaW5kIGRlZgovRSB7bGluZXRvfSBiaW5kIGRlZgovRCB7 +Y3VydmV0b30gYmluZCBkZWYKL08ge2Nsb3NlcGF0aH0gYmluZCBkZWYKCS9u +IEZNTE9DQUwKL0wgeyAKIAkvbiBleGNoIGRlZgoJbmV3cGF0aAoJbm9ybWFs +aXplCgltb3ZldG8gCgkyIDEgbiB7cG9wIG5vcm1hbGl6ZSBsaW5ldG99IGZv +cgoJfSBiaW5kIGRlZgovWSB7IAoJTCAKCWNsb3NlcGF0aAoJfSBiaW5kIGRl +ZgoJL3gxIEZNTE9DQUwKCS94MiBGTUxPQ0FMCgkveTEgRk1MT0NBTAoJL3ky +IEZNTE9DQUwKCS9yYWQgRk1MT0NBTAovUiB7IAoJL3kyIGV4Y2ggZGVmCgkv +eDIgZXhjaCBkZWYKCS95MSBleGNoIGRlZgoJL3gxIGV4Y2ggZGVmCgl4MSB5 +MQoJeDIgeTEKCXgyIHkyCgl4MSB5MgoJNCBZIAoJfSBiaW5kIGRlZgovUlIg +eyAKCS9yYWQgZXhjaCBkZWYKCW5vcm1hbGl6ZQoJL3kyIGV4Y2ggZGVmCgkv +eDIgZXhjaCBkZWYKCW5vcm1hbGl6ZQoJL3kxIGV4Y2ggZGVmCgkveDEgZXhj +aCBkZWYKCW5ld3BhdGgKCXgxIHkxIHJhZCBhZGQgbW92ZXRvCgl4MSB5MiB4 +MiB5MiByYWQgYXJjdG8KCXgyIHkyIHgyIHkxIHJhZCBhcmN0bwoJeDIgeTEg +eDEgeTEgcmFkIGFyY3RvCgl4MSB5MSB4MSB5MiByYWQgYXJjdG8KCWNsb3Nl +cGF0aAoJMTYge3BvcH0gcmVwZWF0Cgl9IGJpbmQgZGVmCi9DIHsgCglncmVz +dG9yZQoJZ3NhdmUKCVIgCgljbGlwCgl9IGJpbmQgZGVmCi9VIHsgCglncmVz +dG9yZQoJZ3NhdmUKCX0gYmluZCBkZWYKL0YgeyAKCUZNZm9udHMgZXhjaCBn +ZXQKCXNldGZvbnQKCX0gYmluZCBkZWYKL1QgeyAKCW1vdmV0byBzaG93Cgl9 +IGJpbmQgZGVmCi9SRiB7IAoJcm90YXRlCgkwIG5lIHstMSAxIHNjYWxlfSBp +ZgoJfSBiaW5kIGRlZgovVEYgeyAKCWdzYXZlCgltb3ZldG8gCglSRgoJc2hv +dwoJZ3Jlc3RvcmUKCX0gYmluZCBkZWYKL1AgeyAKCW1vdmV0bwoJMCAzMiAz +IDIgcm9sbCB3aWR0aHNob3cKCX0gYmluZCBkZWYKL1BGIHsgCglnc2F2ZQoJ +bW92ZXRvIAoJUkYKCTAgMzIgMyAyIHJvbGwgd2lkdGhzaG93CglncmVzdG9y +ZQoJfSBiaW5kIGRlZgovUyB7IAoJbW92ZXRvCgkwIGV4Y2ggYXNob3cKCX0g +YmluZCBkZWYKL1NGIHsgCglnc2F2ZQoJbW92ZXRvCglSRgoJMCBleGNoIGFz +aG93CglncmVzdG9yZQoJfSBiaW5kIGRlZgovQiB7IAoJbW92ZXRvCgkwIDMy +IDQgMiByb2xsIDAgZXhjaCBhd2lkdGhzaG93Cgl9IGJpbmQgZGVmCi9CRiB7 +IAoJZ3NhdmUKCW1vdmV0bwoJUkYKCTAgMzIgNCAyIHJvbGwgMCBleGNoIGF3 +aWR0aHNob3cKCWdyZXN0b3JlCgl9IGJpbmQgZGVmCgkveCBGTUxPQ0FMCgkv +eSBGTUxPQ0FMCgkvZHggRk1MT0NBTAoJL2R5IEZNTE9DQUwKCS9kbCBGTUxP +Q0FMCgkvdCBGTUxPQ0FMCgkvdDIgRk1MT0NBTAoJL0NvcyBGTUxPQ0FMCgkv +U2luIEZNTE9DQUwKCS9yIEZNTE9DQUwKL1cgeyAKCWRub3JtYWxpemUKCS9k +eSBleGNoIGRlZgoJL2R4IGV4Y2ggZGVmCglub3JtYWxpemUKCS95ICBleGNo +IGRlZgoJL3ggIGV4Y2ggZGVmCgkvZGwgZHggZHggbXVsIGR5IGR5IG11bCBh +ZGQgc3FydCBkZWYKCWRsIDAuMCBndCB7CgkJL3QgY3VycmVudGxpbmV3aWR0 +aCBkZWYKCQlzYXZlbWF0cml4CgkJL0NvcyBkeCBkbCBkaXYgZGVmCgkJL1Np +biBkeSBkbCBkaXYgZGVmCgkJL3IgW0NvcyBTaW4gU2luIG5lZyBDb3MgMC4w +IDAuMF0gZGVmCgkJL3QyIHQgMi41IG11bCAzLjUgbWF4IGRlZgoJCW5ld3Bh +dGgKCQl4IHkgdHJhbnNsYXRlCgkJciBjb25jYXQKCQkwLjAgMC4wIG1vdmV0 +bwoJCWRsIHQgMi43IG11bCBzdWIgMC4wIHJsaW5ldG8KCQlzdHJva2UKCQly +ZXN0b3JlbWF0cml4CgkJeCBkeCBhZGQgeSBkeSBhZGQgdHJhbnNsYXRlCgkJ +ciBjb25jYXQKCQl0IDAuNjcgbXVsIHNldGxpbmV3aWR0aAoJCXQgMS42MSBt +dWwgbmVnICAwLjAgdHJhbnNsYXRlCgkJMC4wIDAuMCBtb3ZldG8KCQl0MiAx +LjcgbXVsIG5lZyAgdDIgMi4wIGRpdiAgICAgbW92ZXRvCgkJMC4wIDAuMCBs +aW5ldG8KCQl0MiAxLjcgbXVsIG5lZyAgdDIgMi4wIGRpdiBuZWcgbGluZXRv +CgkJc3Ryb2tlCgkJdCBzZXRsaW5ld2lkdGgKCQlyZXN0b3JlbWF0cml4CgkJ +fSBpZgoJfSBiaW5kIGRlZgovRyB7IAoJZ3NhdmUKCW5ld3BhdGgKCW5vcm1h +bGl6ZSB0cmFuc2xhdGUgMC4wIDAuMCBtb3ZldG8gCglkbm9ybWFsaXplIHNj +YWxlIAoJMC4wIDAuMCAxLjAgNSAzIHJvbGwgYXJjIAoJY2xvc2VwYXRoIGZp +bGwKCWdyZXN0b3JlCgl9IGJpbmQgZGVmCi9BIHsgCglnc2F2ZQoJc2F2ZW1h +dHJpeAoJbmV3cGF0aAoJMiBpbmRleCAyIGRpdiBhZGQgZXhjaCAzIGluZGV4 +IDIgZGl2IHN1YiBleGNoIAoJbm9ybWFsaXplIDIgaW5kZXggMiBkaXYgc3Vi +IGV4Y2ggMyBpbmRleCAyIGRpdiBhZGQgZXhjaCAKCXRyYW5zbGF0ZSAKCXNj +YWxlIAoJMC4wIDAuMCAxLjAgNSAzIHJvbGwgYXJjIAoJcmVzdG9yZW1hdHJp +eAoJc3Ryb2tlCglncmVzdG9yZQoJfSBiaW5kIGRlZgoJL3ggRk1MT0NBTAoJ +L3kgRk1MT0NBTAoJL3cgRk1MT0NBTAoJL2ggRk1MT0NBTAoJL3h4IEZNTE9D +QUwKCS95eSBGTUxPQ0FMCgkvd3cgRk1MT0NBTAoJL2hoIEZNTE9DQUwKCS9G +TXNhdmVvYmplY3QgRk1MT0NBTAoJL0ZNb3B0b3AgRk1MT0NBTAoJL0ZNZGlj +dHRvcCBGTUxPQ0FMCi9CRUdJTlBSSU5UQ09ERSB7IAoJL0ZNZGljdHRvcCBj +b3VudGRpY3RzdGFjayAxIGFkZCBkZWYgCgkvRk1vcHRvcCBjb3VudCA0IHN1 +YiBkZWYgCgkvRk1zYXZlb2JqZWN0IHNhdmUgZGVmCgl1c2VyZGljdCBiZWdp +biAKCS9zaG93cGFnZSB7fSBkZWYgCglGTU5PUk1BTElaRUdSQVBISUNTIAoJ +MyBpbmRleCBuZWcgMyBpbmRleCBuZWcgdHJhbnNsYXRlCgl9IGJpbmQgZGVm +Ci9FTkRQUklOVENPREUgewoJY291bnQgLTEgRk1vcHRvcCB7cG9wIHBvcH0g +Zm9yIAoJY291bnRkaWN0c3RhY2sgLTEgRk1kaWN0dG9wIHtwb3AgZW5kfSBm +b3IgCglGTXNhdmVvYmplY3QgcmVzdG9yZSAKCX0gYmluZCBkZWYKL2duIHsg +CgkwIAoJewk0NiBtdWwgCgkJY2YgcmVhZCBwb3AgCgkJMzIgc3ViIAoJCWR1 +cCA0NiBsdCB7ZXhpdH0gaWYgCgkJNDYgc3ViIGFkZCAKCQl9IGxvb3AKCWFk +ZCAKCX0gYmluZCBkZWYKCS9zdHIgRk1MT0NBTAovY2ZzIHsgCgkvc3RyIHNs +IHN0cmluZyBkZWYgCgkwIDEgc2wgMSBzdWIge3N0ciBleGNoIHZhbCBwdXR9 +IGZvciAKCXN0ciBkZWYgCgl9IGJpbmQgZGVmCi9pYyBbIAoJMCAwIDAgMCAw +IDAgMCAwIDAgMCAwIDAgMCAwIDAgMDIyMwoJMCAwIDAgMCAwIDAgMCAwIDAg +MCAwIDAgMCAwIDAgMDIyMwoJMAoJezAgaHh9IHsxIGh4fSB7MiBoeH0gezMg +aHh9IHs0IGh4fSB7NSBoeH0gezYgaHh9IHs3IGh4fSB7OCBoeH0gezkgaHh9 +Cgl7MTAgaHh9IHsxMSBoeH0gezEyIGh4fSB7MTMgaHh9IHsxNCBoeH0gezE1 +IGh4fSB7MTYgaHh9IHsxNyBoeH0gezE4IGh4fQoJezE5IGh4fSB7Z24gaHh9 +IHswfSB7MX0gezJ9IHszfSB7NH0gezV9IHs2fSB7N30gezh9IHs5fSB7MTB9 +IHsxMX0gezEyfQoJezEzfSB7MTR9IHsxNX0gezE2fSB7MTd9IHsxOH0gezE5 +fSB7Z259IHswIHdofSB7MSB3aH0gezIgd2h9IHszIHdofQoJezQgd2h9IHs1 +IHdofSB7NiB3aH0gezcgd2h9IHs4IHdofSB7OSB3aH0gezEwIHdofSB7MTEg +d2h9IHsxMiB3aH0KCXsxMyB3aH0gezE0IHdofSB7Z24gd2h9IHswIGJsfSB7 +MSBibH0gezIgYmx9IHszIGJsfSB7NCBibH0gezUgYmx9IHs2IGJsfQoJezcg +Ymx9IHs4IGJsfSB7OSBibH0gezEwIGJsfSB7MTEgYmx9IHsxMiBibH0gezEz +IGJsfSB7MTQgYmx9IHtnbiBibH0KCXswIGZsfSB7MSBmbH0gezIgZmx9IHsz +IGZsfSB7NCBmbH0gezUgZmx9IHs2IGZsfSB7NyBmbH0gezggZmx9IHs5IGZs +fQoJezEwIGZsfSB7MTEgZmx9IHsxMiBmbH0gezEzIGZsfSB7MTQgZmx9IHtn +biBmbH0KCV0gZGVmCgkvc2wgRk1MT0NBTAoJL3ZhbCBGTUxPQ0FMCgkvd3Mg +Rk1MT0NBTAoJL2ltIEZNTE9DQUwKCS9icyBGTUxPQ0FMCgkvY3MgRk1MT0NB +TAoJL2xlbiBGTUxPQ0FMCgkvcG9zIEZNTE9DQUwKL21zIHsgCgkvc2wgZXhj +aCBkZWYgCgkvdmFsIDI1NSBkZWYgCgkvd3MgY2ZzIAoJL2ltIGNmcyAKCS92 +YWwgMCBkZWYgCgkvYnMgY2ZzIAoJL2NzIGNmcyAKCX0gYmluZCBkZWYKNDAw +IG1zIAovaXAgeyAKCWlzIAoJMCAKCWNmIGNzIHJlYWRsaW5lIHBvcCAKCXsJ +aWMgZXhjaCBnZXQgZXhlYyAKCQlhZGQgCgkJfSBmb3JhbGwgCglwb3AgCgkK +CX0gYmluZCBkZWYKL3doIHsgCgkvbGVuIGV4Y2ggZGVmIAoJL3BvcyBleGNo +IGRlZiAKCXdzIDAgbGVuIGdldGludGVydmFsIGltIHBvcyBsZW4gZ2V0aW50 +ZXJ2YWwgY29weSBwb3AKCXBvcyBsZW4gCgl9IGJpbmQgZGVmCi9ibCB7IAoJ +L2xlbiBleGNoIGRlZiAKCS9wb3MgZXhjaCBkZWYgCglicyAwIGxlbiBnZXRp +bnRlcnZhbCBpbSBwb3MgbGVuIGdldGludGVydmFsIGNvcHkgcG9wCglwb3Mg +bGVuIAoJfSBiaW5kIGRlZgovczEgMSBzdHJpbmcgZGVmCi9mbCB7IAoJL2xl +biBleGNoIGRlZiAKCS9wb3MgZXhjaCBkZWYgCgkvdmFsIGNmIHMxIHJlYWRo +ZXhzdHJpbmcgcG9wIDAgZ2V0IGRlZgoJcG9zIDEgcG9zIGxlbiBhZGQgMSBz +dWIge2ltIGV4Y2ggdmFsIHB1dH0gZm9yCglwb3MgbGVuIAoJfSBiaW5kIGRl +ZgovaHggeyAKCTMgY29weSBnZXRpbnRlcnZhbCAKCWNmIGV4Y2ggcmVhZGhl +eHN0cmluZyBwb3AgcG9wIAoJfSBiaW5kIGRlZgoJL2ggRk1MT0NBTAoJL3cg +Rk1MT0NBTAoJL2QgRk1MT0NBTAoJL2xiIEZNTE9DQUwKCS9iaXRtYXBzYXZl +IEZNTE9DQUwKCS9pcyBGTUxPQ0FMCgkvY2YgRk1MT0NBTAovd2J5dGVzIHsg +CglkdXAgCgk4IGVxIHtwb3B9IHsxIGVxIHs3IGFkZCA4IGlkaXZ9IHszIGFk +ZCA0IGlkaXZ9IGlmZWxzZX0gaWZlbHNlCgl9IGJpbmQgZGVmCi9CRUdJTkJJ +VE1BUEJXYyB7IAoJMSB7fSBDT01NT05CSVRNQVBjCgl9IGJpbmQgZGVmCi9C +RUdJTkJJVE1BUEdSQVljIHsgCgk4IHt9IENPTU1PTkJJVE1BUGMKCX0gYmlu +ZCBkZWYKL0JFR0lOQklUTUFQMkJJVGMgeyAKCTIge30gQ09NTU9OQklUTUFQ +YwoJfSBiaW5kIGRlZgovQ09NTU9OQklUTUFQYyB7IAoJL3IgZXhjaCBkZWYK +CS9kIGV4Y2ggZGVmCglnc2F2ZQoJdHJhbnNsYXRlIHJvdGF0ZSBzY2FsZSAv +aCBleGNoIGRlZiAvdyBleGNoIGRlZgoJL2xiIHcgZCB3Ynl0ZXMgZGVmIAoJ +c2wgbGIgbHQge2xiIG1zfSBpZiAKCS9iaXRtYXBzYXZlIHNhdmUgZGVmIAoJ +ciAgICAgICAgICAgICAgICAgICAgCgkvaXMgaW0gMCBsYiBnZXRpbnRlcnZh +bCBkZWYgCgl3cyAwIGxiIGdldGludGVydmFsIGlzIGNvcHkgcG9wIAoJL2Nm +IGN1cnJlbnRmaWxlIGRlZiAKCXcgaCBkIFt3IDAgMCBoIG5lZyAwIGhdIAoJ +e2lwfSBpbWFnZSAKCWJpdG1hcHNhdmUgcmVzdG9yZSAKCWdyZXN0b3JlCgl9 +IGJpbmQgZGVmCi9CRUdJTkJJVE1BUEJXIHsgCgkxIHt9IENPTU1PTkJJVE1B +UAoJfSBiaW5kIGRlZgovQkVHSU5CSVRNQVBHUkFZIHsgCgk4IHt9IENPTU1P +TkJJVE1BUAoJfSBiaW5kIGRlZgovQkVHSU5CSVRNQVAyQklUIHsgCgkyIHt9 +IENPTU1PTkJJVE1BUAoJfSBiaW5kIGRlZgovQ09NTU9OQklUTUFQIHsgCgkv +ciBleGNoIGRlZgoJL2QgZXhjaCBkZWYKCWdzYXZlCgl0cmFuc2xhdGUgcm90 +YXRlIHNjYWxlIC9oIGV4Y2ggZGVmIC93IGV4Y2ggZGVmCgkvYml0bWFwc2F2 +ZSBzYXZlIGRlZiAKCXIgICAgICAgICAgICAgICAgICAgIAoJL2lzIHcgZCB3 +Ynl0ZXMgc3RyaW5nIGRlZgoJL2NmIGN1cnJlbnRmaWxlIGRlZiAKCXcgaCBk +IFt3IDAgMCBoIG5lZyAwIGhdIAoJe2NmIGlzIHJlYWRoZXhzdHJpbmcgcG9w +fSBpbWFnZQoJYml0bWFwc2F2ZSByZXN0b3JlIAoJZ3Jlc3RvcmUKCX0gYmlu +ZCBkZWYKCS9wcm9jMSBGTUxPQ0FMCgkvcHJvYzIgRk1MT0NBTAoJL25ld3By +b2MgRk1MT0NBTAovRm1jYyB7CiAgICAvcHJvYzIgZXhjaCBjdmxpdCBkZWYK +ICAgIC9wcm9jMSBleGNoIGN2bGl0IGRlZgogICAgL25ld3Byb2MgcHJvYzEg +bGVuZ3RoIHByb2MyIGxlbmd0aCBhZGQgYXJyYXkgZGVmCiAgICBuZXdwcm9j +IDAgcHJvYzEgcHV0aW50ZXJ2YWwKICAgIG5ld3Byb2MgcHJvYzEgbGVuZ3Ro +IHByb2MyIHB1dGludGVydmFsCiAgICBuZXdwcm9jIGN2eAp9IGJpbmQgZGVm +Ci9uZ3JheXQgMjU2IGFycmF5IGRlZgovbnJlZHQgMjU2IGFycmF5IGRlZgov +bmJsdWV0IDI1NiBhcnJheSBkZWYKL25ncmVlbnQgMjU2IGFycmF5IGRlZgoJ +L2dyeXQgRk1MT0NBTAoJL2JsdXQgRk1MT0NBTAoJL2dybnQgRk1MT0NBTAoJ +L3JlZHQgRk1MT0NBTAoJL2luZHggRk1MT0NBTAoJL2N5bnUgRk1MT0NBTAoJ +L21hZ3UgRk1MT0NBTAoJL3llbHUgRk1MT0NBTAoJL2sgRk1MT0NBTAoJL3Ug +Rk1MT0NBTAovY29sb3JzZXR1cCB7CgljdXJyZW50Y29sb3J0cmFuc2ZlcgoJ +L2dyeXQgZXhjaCBkZWYKCS9ibHV0IGV4Y2ggZGVmCgkvZ3JudCBleGNoIGRl +ZgoJL3JlZHQgZXhjaCBkZWYKCTAgMSAyNTUgewoJCS9pbmR4IGV4Y2ggZGVm +CgkJL2N5bnUgMSByZWQgaW5keCBnZXQgMjU1IGRpdiBzdWIgZGVmCgkJL21h +Z3UgMSBncmVlbiBpbmR4IGdldCAyNTUgZGl2IHN1YiBkZWYKCQkveWVsdSAx +IGJsdWUgaW5keCBnZXQgMjU1IGRpdiBzdWIgZGVmCgkJL2sgY3ludSBtYWd1 +IG1pbiB5ZWx1IG1pbiBkZWYKCQkvdSBrIGN1cnJlbnR1bmRlcmNvbG9ycmVt +b3ZhbCBleGVjIGRlZgoJCW5yZWR0IGluZHggMSAwIGN5bnUgdSBzdWIgbWF4 +IHN1YiByZWR0IGV4ZWMgcHV0CgkJbmdyZWVudCBpbmR4IDEgMCBtYWd1IHUg +c3ViIG1heCBzdWIgZ3JudCBleGVjIHB1dAoJCW5ibHVldCBpbmR4IDEgMCB5 +ZWx1IHUgc3ViIG1heCBzdWIgYmx1dCBleGVjIHB1dAoJCW5ncmF5dCBpbmR4 +IDEgayBjdXJyZW50YmxhY2tnZW5lcmF0aW9uIGV4ZWMgc3ViIGdyeXQgZXhl +YyBwdXQKCX0gZm9yCgl7MjU1IG11bCBjdmkgbnJlZHQgZXhjaCBnZXR9Cgl7 +MjU1IG11bCBjdmkgbmdyZWVudCBleGNoIGdldH0KCXsyNTUgbXVsIGN2aSBu +Ymx1ZXQgZXhjaCBnZXR9Cgl7MjU1IG11bCBjdmkgbmdyYXl0IGV4Y2ggZ2V0 +fQoJc2V0Y29sb3J0cmFuc2ZlcgoJe3BvcCAwfSBzZXR1bmRlcmNvbG9ycmVt +b3ZhbAoJe30gc2V0YmxhY2tnZW5lcmF0aW9uCgl9IGJpbmQgZGVmCgkvdHJh +biBGTUxPQ0FMCi9mYWtlY29sb3JzZXR1cCB7CgkvdHJhbiAyNTYgc3RyaW5n +IGRlZgoJMCAxIDI1NSB7L2luZHggZXhjaCBkZWYgCgkJdHJhbiBpbmR4CgkJ +cmVkIGluZHggZ2V0IDc3IG11bAoJCWdyZWVuIGluZHggZ2V0IDE1MSBtdWwK +CQlibHVlIGluZHggZ2V0IDI4IG11bAoJCWFkZCBhZGQgMjU2IGlkaXYgcHV0 +fSBmb3IKCWN1cnJlbnR0cmFuc2ZlcgoJezI1NSBtdWwgY3ZpIHRyYW4gZXhj +aCBnZXQgMjU1LjAgZGl2fQoJZXhjaCBGbWNjIHNldHRyYW5zZmVyCn0gYmlu +ZCBkZWYKL0JJVE1BUENPTE9SIHsgCgkvZCA4IGRlZgoJZ3NhdmUKCXRyYW5z +bGF0ZSByb3RhdGUgc2NhbGUgL2ggZXhjaCBkZWYgL3cgZXhjaCBkZWYKCS9i +aXRtYXBzYXZlIHNhdmUgZGVmIAoJY29sb3JzZXR1cAoJL2lzIHcgZCB3Ynl0 +ZXMgc3RyaW5nIGRlZgoJL2NmIGN1cnJlbnRmaWxlIGRlZiAKCXcgaCBkIFt3 +IDAgMCBoIG5lZyAwIGhdIAoJe2NmIGlzIHJlYWRoZXhzdHJpbmcgcG9wfSB7 +aXN9IHtpc30gdHJ1ZSAzIGNvbG9yaW1hZ2UgCgliaXRtYXBzYXZlIHJlc3Rv +cmUgCglncmVzdG9yZQoJfSBiaW5kIGRlZgovQklUTUFQQ09MT1JjIHsgCgkv +ZCA4IGRlZgoJZ3NhdmUKCXRyYW5zbGF0ZSByb3RhdGUgc2NhbGUgL2ggZXhj +aCBkZWYgL3cgZXhjaCBkZWYKCS9sYiB3IGQgd2J5dGVzIGRlZiAKCXNsIGxi +IGx0IHtsYiBtc30gaWYgCgkvYml0bWFwc2F2ZSBzYXZlIGRlZiAKCWNvbG9y +c2V0dXAKCS9pcyBpbSAwIGxiIGdldGludGVydmFsIGRlZiAKCXdzIDAgbGIg +Z2V0aW50ZXJ2YWwgaXMgY29weSBwb3AgCgkvY2YgY3VycmVudGZpbGUgZGVm +IAoJdyBoIGQgW3cgMCAwIGggbmVnIDAgaF0gCgl7aXB9IHtpc30ge2lzfSB0 +cnVlIDMgY29sb3JpbWFnZQoJYml0bWFwc2F2ZSByZXN0b3JlIAoJZ3Jlc3Rv +cmUKCX0gYmluZCBkZWYKL0JJVE1BUEdSQVkgeyAKCTgge2Zha2Vjb2xvcnNl +dHVwfSBDT01NT05CSVRNQVAKCX0gYmluZCBkZWYKL0JJVE1BUEdSQVljIHsg +Cgk4IHtmYWtlY29sb3JzZXR1cH0gQ09NTU9OQklUTUFQYwoJfSBiaW5kIGRl +ZgovRU5EQklUTUFQIHsKCX0gYmluZCBkZWYKZW5kIAolJUVuZFByb2xvZwol +JUJlZ2luU2V0dXAKKDIuMCkgRk1WRVJTSU9OCjEgMSA2MTIgNzkyIDAgMSAx +IEZNRE9DVU1FTlQKL2ZpbGxwcm9jcyAzMiBhcnJheSBkZWYKZmlsbHByb2Nz +IDAgeyAwLjAwMDAwMCBncmF5bmVzcyB9IHB1dApmaWxscHJvY3MgMSB7IDAu +MTAwMDAwIGdyYXluZXNzIH0gcHV0CmZpbGxwcm9jcyAyIHsgMC4zMDAwMDAg +Z3JheW5lc3MgfSBwdXQKZmlsbHByb2NzIDMgeyAwLjUwMDAwMCBncmF5bmVz +cyB9IHB1dApmaWxscHJvY3MgNCB7IDAuNzAwMDAwIGdyYXluZXNzIH0gcHV0 +CmZpbGxwcm9jcyA1IHsgMC45MDAwMDAgZ3JheW5lc3MgfSBwdXQKZmlsbHBy +b2NzIDYgeyAwLjk3MDAwMCBncmF5bmVzcyB9IHB1dApmaWxscHJvY3MgNyB7 +IDEuMDAwMDAwIGdyYXluZXNzIH0gcHV0CmZpbGxwcm9jcyA4IHs8MGYxZTNj +NzhmMGUxYzM4Nz4gOCAxIHNldHBhdHRlcm4gfSBwdXQKZmlsbHByb2NzIDkg +ezwwZjg3YzNlMWYwNzgzYzFlPiA4IDEgc2V0cGF0dGVybiB9IHB1dApmaWxs +cHJvY3MgMTAgezxjY2NjY2NjY2NjY2NjY2NjPiA4IDEgc2V0cGF0dGVybiB9 +IHB1dApmaWxscHJvY3MgMTEgezxmZmZmMDAwMGZmZmYwMDAwPiA4IDEgc2V0 +cGF0dGVybiB9IHB1dApmaWxscHJvY3MgMTIgezw4MTQyMjQxODE4MjQ0Mjgx +PiA4IDEgc2V0cGF0dGVybiB9IHB1dApmaWxscHJvY3MgMTMgezwwMzA2MGMx +ODMwNjBjMDgxPiA4IDEgc2V0cGF0dGVybiB9IHB1dApmaWxscHJvY3MgMTQg +ezw4MDQwMjAxMDA4MDQwMjAxPiA4IDEgc2V0cGF0dGVybiB9IHB1dApmaWxs +cHJvY3MgMTUge30gcHV0CmZpbGxwcm9jcyAxNiB7IDEuMDAwMDAwIGdyYXlu +ZXNzIH0gcHV0CmZpbGxwcm9jcyAxNyB7IDAuOTAwMDAwIGdyYXluZXNzIH0g +cHV0CmZpbGxwcm9jcyAxOCB7IDAuNzAwMDAwIGdyYXluZXNzIH0gcHV0CmZp +bGxwcm9jcyAxOSB7IDAuNTAwMDAwIGdyYXluZXNzIH0gcHV0CmZpbGxwcm9j +cyAyMCB7IDAuMzAwMDAwIGdyYXluZXNzIH0gcHV0CmZpbGxwcm9jcyAyMSB7 +IDAuMTAwMDAwIGdyYXluZXNzIH0gcHV0CmZpbGxwcm9jcyAyMiB7IDAuMDMw +MDAwIGdyYXluZXNzIH0gcHV0CmZpbGxwcm9jcyAyMyB7IDAuMDAwMDAwIGdy +YXluZXNzIH0gcHV0CmZpbGxwcm9jcyAyNCB7PGYwZTFjMzg3MGYxZTNjNzg+ +IDggMSBzZXRwYXR0ZXJuIH0gcHV0CmZpbGxwcm9jcyAyNSB7PGYwNzgzYzFl +MGY4N2MzZTE+IDggMSBzZXRwYXR0ZXJuIH0gcHV0CmZpbGxwcm9jcyAyNiB7 +PDMzMzMzMzMzMzMzMzMzMzM+IDggMSBzZXRwYXR0ZXJuIH0gcHV0CmZpbGxw +cm9jcyAyNyB7PDAwMDBmZmZmMDAwMGZmZmY+IDggMSBzZXRwYXR0ZXJuIH0g +cHV0CmZpbGxwcm9jcyAyOCB7PDdlYmRkYmU3ZTdkYmJkN2U+IDggMSBzZXRw +YXR0ZXJuIH0gcHV0CmZpbGxwcm9jcyAyOSB7PGZjZjlmM2U3Y2Y5ZjNmN2U+ +IDggMSBzZXRwYXR0ZXJuIH0gcHV0CmZpbGxwcm9jcyAzMCB7PDdmYmZkZmVm +ZjdmYmZkZmU+IDggMSBzZXRwYXR0ZXJuIH0gcHV0CmZpbGxwcm9jcyAzMSB7 +fSBwdXQKJSVFbmRTZXR1cAowIDYgL0hlbHZldGljYSBGTURFRklORUZPTlQK +JSVQYWdlOiAiMSIgMQolJUJlZ2luUGFwZXJTaXplOiBMZXR0ZXIKJSVFbmRQ +YXBlclNpemUKNjEyIDc5MiAwIEZNQkVHSU5QQUdFCjcyIDc0NiA1NDAgNzU2 +IFIKNyBYCjAgSwpWCjcyIDMyLjY3IDU0MCA0Mi42NyBSClYKNSBYCjExNSAx +ODAgNi4xNSA2LjE1IDMyMi42OSA0ODIuOTEgRwowLjUgSAoyIFoKMCBYCjEx +NSAxODAgNi4xNSA2LjE1IDMyMi42OSA0ODIuOTEgQQozMjAuNDkgNDg5Ljc3 +IDMyMC40OSA0ODIuOTQgMzIzLjE1IDQ4Mi4wNSAzMjcuOTYgNDg2Ljg2IDQg +TAo3IFgKVgo0NjUuMTQgMTA1LjkxIE0KIDQ2My42MSA4NS45IDQ3MC42IDY2 +Ljk4IDQ3Ni42OCA0OS41NiBECjAgWApOCjQzOCA5My4zNiBNCiA0MzguODEg +NzguMzcgNDQyLjg2IDY3Ljg0IDQ0Ny43MiA1OS43NCBECk4KNDI0LjIzIDk3 +LjgxIE0KIDQyMy40MiA4MS42MSA0MjUuODcgNjkuMTggNDMwLjczIDYxLjA4 +IEQKTgozOTYuNjkgMTAzLjA4IE0KIDM5NS44OCA4Ni44OCAzOTggODAuNTIg +NDAxLjI0IDcxLjIxIEQKTgozOTMuNTIgMTE1LjUxIE0KIDQwMi45NiAxMjQu +MSA0MzMuMTQgMTY4LjQxIDQ0NS4yOSAxNzguMjggRAogNDUxLjI0IDE1My44 +NiA0NDguNzEgMTQ5LjU1IDQ0Ni45MyAxMzguNjcgRAogNDMxLjc1IDEzMC40 +NCA0MjkuNzIgMTIzLjg2IDQ0Mi4yNSAxMjIuNDcgRAogNDQxLjQ5IDExOS4x +OCA0NDEuMjQgMTE4LjY3IDQ0MC45OSAxMTYuNjUgRAogNDIyLjYzIDExMy45 +OSAzOTUuODggMTE0LjE1IDM5NC40MSAxMTMuODYgRAo0IFgKVgo0NzUuNzkg +MTU4LjI5IDQ5OS4yMSAxMjAuODIgNDY2LjE3IDExNy4wMyA0NjkuMjEgMTM1 +LjI1IDQgTApWCjMxMC40MiA1NzguMTcgTQogMzA3LjQ4IDU4Ni42NiAzMDcu +MTggNjAxLjI1IDMxNy43MSA2MDQuOSBECiAzMTQuODcgNjE2LjY0IDMxOC45 +MiA2MTkuMDcgMzIyLjk3IDYyMi43MiBECiAzMjAuMTQgNjMzLjY1IDMyNC4x +OSA2NDEuNzYgMzMxLjg4IDY0MC41NCBECiAzMjcuMDIgNjU2LjM0IDMzNC43 +MiA2NjMuNjMgMzQxLjYgNjY0Ljg0IEQKIDMzNy41NSA2ODEuODUgMzQyLjQx +IDY4NC42OSAzNDguNzYgNjg5Ljg3IEQKIDM0Ni4wNiA3MDguNTggMzU3Ljgg +NzEyLjYzIDM2NS4xIDcxMC4yIEQKIDM2NS41IDcyNy42MiAzNzEuOTggNzI5 +LjY1IDM4MS4zIDczMi40OCBECiAzODAuODkgNzQ2LjY2IDM4OS40IDc0Ni4y +NSAzOTUuODggNzQ2LjY2IEQKIDM5OS4xMiA3NjQuODggNDEyLjA4IDc2My42 +NyA0MTguNTYgNzYyLjQ1IEQKIDQzMy45NSA3NzQuMiA0NDMuNjcgNzc0LjIg +NDUwLjUxIDc2Ny41OCBECiA0NzUuNjcgNzczLjM5IDQ3NC4wNSA3NjQuODgg +NDc2LjE1IDc1OC40MyBECiA0NzYuOTQgNzU3LjkzIDQ3Ny43MiA3NTcuNCA0 +NzguNSA3NTYuODYgRAogNDk2LjMyIDc1OCA0OTEuMDYgNzUxLjExIDQ5MS41 +MSA3NDEuNjUgRAogNTAxLjU5IDczMi40OCA0OTkuOTcgNzI0LjM4IDQ5My44 +OSA3MTcuOSBECiA0OTcuOTQgNzA4Ljk5IDQ5MS44NyA3MDEuNyA0ODcuNDEg +NzAwLjA4IEQKIDQ4Ny40MSA2ODcuOTMgNDg2LjIgNjg2LjMxIDQ3My4yMyA2 +ODYuMzEgRAogNDczLjY0IDY3Ni41OSA0NzUuNjcgNjcwLjUxIDQ1OS4wNiA2 +NjguODkgRAogNDYxLjg5IDY1Ni4zNCA0NTAuNTUgNjUzLjEgNDQ2LjEgNjUx +Ljg4IEQKIDQ0OS4zNCA2MzQuMDYgNDQwLjQzIDYzMi4wNCA0MzUuNTcgNjMw +LjgyIEQKIDQ0MC40MyA2MTcuMDUgNDM0Ljc2IDYxMy40IDQyOC4yOCA2MTEu +NzggRAogNDMzLjE0IDYwMS42NiA0MjcuMDYgNTk0Ljc3IDQyMC4xOCA1OTEu +NTMgRAogNDIyLjYxIDU3OC45OCA0MTYuNTMgNTczLjcxIDQxMS4yNyA1Njgu +ODUgRAogNDE4LjE1IDU1My4wNiA0MDguODQgNTQ1Ljc2IDQwMi44NSA1NDEu +ODcgRAogNDAzLjE3IDUyOC4zNSAzOTUuNDcgNTIyLjY4IDM4OS44IDUxOS44 +NCBECiAzODcuNzggNTA0LjQ1IDM3OC40NiA1MDQuODYgMzcxLjE3IDUwNC4w +NSBECjMgWApWCjAgWApOCjIzMi42NSA1NjYuNDIgMjU2LjY3IDU3NC4zOSAy +MzguMSA1NTMuODIgMyBMCjUgWApWCjIxOS4yMSAxMTcuODcgMjE5LjI5IDEz +NC4yNiAyMjEuNDMgMTM1LjI3IDIyNS44NiAxMzMuMjMgMjI1LjE4IDExOS41 +NiA1IEwKNCBYClYKMTcxLjkgNzcuMTYgMTc4LjMyIDcyLjMyIDIwMC42NiA1 +MC40MiAyMDEuNTkgNDYuNDYgMjAzLjkgNDYuMzcgMjE4LjUyIDY0LjA0IDIx +Ny4yNyA3My4wNQogMjEwLjYzIDc2Ljc1IDggTAowIFgKVgoxMzcuOTggODEu +MjEgMTMyLjkyIDcwLjU3IDEzMS4yNyA2NC4zNyAxNDQuMDUgNTcuOTIgMTQ5 +Ljg4IDcxLjcxIDE1My4yNyA3Ni4zNSAxNTMuMjcgODQuMTIgNyBMClYKMTUz +LjI3IDEwMi42NyBNCiAxMzIuOTIgMTIwLjE5IDEzMi45MiA5MS44NCAxMzYu +NDYgODEuNzEgRAogMTQyLjAzIDc4LjE3IDE0OC41OCA3OC43NiAxNTIuNjYg +NzkuMTggRAo0IFgKVgowIFgKTgoyNzUuNjkgMTAwLjQ0IE0KIDI5MS40MSA5 +Ni41OSAzMjguODUgNzEuMDggMzIwLjI0IDYyLjk4IEQKIDMwOC41OSA1NS44 +OSAyOTEuMDUgNjEuMTQgMjc4LjIyIDU5Ljk0IEQKVgpOCjMwNi4zMiAzMDIu +NDUgMjIyLjkzIDIyNy4wMSAyMDkuMTYgMjAzLjkzIDE2OS4wNiAyMTMuNjUg +MTcwLjY4IDIzMS4wNiAxODQuODYgMjUxLjcyIDIyNi41OCAzMDUuNTkgNyBM +CjQgWApWCjE3Mi43MSA5OC42MiAxNzIuNzEgNzYuNzUgMjE1LjY0IDc2Ljc1 +IDIxNS42NCA5OC4yMiA0IEwKVgowIFgKTgoxOTMuNzcgMTQxLjE1IDIxOS4y +OSAxMzQuMjYgMjE4Ljg4IDk4LjYyIDE3My4xMiA5OC42MiAxNzMuMTIgMTMx +LjQzIDUgTAo0IFgKVgowIFgKTgoyODEuMjYgMTYzLjAyIDI4MS4yNiA5Ny40 +MSAyNTguNTcgMTIzLjMzIDI1OC45OCAxNjMuNDIgNCBMCjQgWApWCjAgWApO +CjI4MS42NiAyNTkuMDEgMjgxLjY2IDE2Ni42NiAyMjQuMTUgMjMxLjA2IDMg +TAo0IFgKVgowIFgKTgoxNzcuMTYgMjI0LjE4IE0KIDE4My4xNSAyMTkuMzYg +MTg4LjkxIDIwMy41MiAxOTAuMTMgMTk1LjgzIEQKIDE4Ni44OCAxOTIuNTkg +MTc3LjI4IDE4OS4wNyAxNzIuMyAxODYuNTEgRAo2IFgKVgowIFgKTgoxNDku +NjIgNTAuOTYgTQogMTQzLjA0IDM4LjkzIDE2MC4zOSA0MC42MiAxNzUuOTUg +NDAuMyBECiAxOTEuMDMgMzkuOTkgMjA3LjM0IDM4LjQyIDIwMC41IDUwLjQ1 +IEQKMyBYClYKMCBYCk4KODkuMjggMTQ4LjQ0IE0KIDg3LjUzIDEzOS4yNyA5 +My4zMiAxMzkuOTMgOTQuMTQgMTMzLjg2IEQKIDkzLjYyIDExOC4yNiA5My42 +NyAxMTEuMjIgOTUuMzUgMTAzLjQ4IEQKIDExNi40MSA5Ny44MSAxMjguNTYg +MTAxLjQ2IDE1NC40OCAxMDIuNjcgRAogMTU1LjcgMTAzLjg5IDE1NC44OSAx +MDUuMSAxNTUuMjkgMTA3LjEzIEQKIDE2Mi4xOCAxMDUuOTEgMTc2LjQyIDEw +OC4wOCAxODUuNjcgMTA3LjUzIEQKIDE4Ni44OCAxMTUuMjMgMTg1LjI2IDEx +OC44NyAxODYuODggMTI4LjU5IEQKIDE5NS4zOSAxMzUuNDggMTk2LjYxIDE0 +MC43NCAxOTUuOCAxNDUuMiBECjMgWApWCjAgWApOCjIzOC43MyA2MjUuOTYg +TQogMjM0LjU2IDYzNC4yOSAyMzAuMTIgNjM3LjYgMjIxLjUxIDYzOS42MyBE +CiAyMDEuNzcgNjY4LjQ5IDE2Mi44NyA2NzQuMTYgMTM4LjQyIDY0Ny43MyBE +CiAxMTQuOTIgNjIyLjMyIDEyMS4yNyA1ODYuNDcgMTUwLjEzIDU1OC42MyBE +CiAxNjMuMTggNTQ2LjEgMTgyLjAyIDUyMS42NyAxNzcuNDcgNDkwLjc4IEQK +TgoxNzQuOTQgNTYyLjY4IDE1My4xNyA1ODEuOTEgMTU3LjcyIDU2MC4xNCAx +NDAuNTEgNTY3Ljc0IDE0OS42MiA1NDIuNDIgNSBMCk4KMTc0LjQzIDU1Mi4w +NCBNCiAxNjAuNjggNTY5LjUxIDEzNC45NCA1MzAuNzggMTY5LjM3IDUzNC4z +MiBECjcgWApWCjAgWApOCjE1OS4yNCA1MzkuODkgTQogMTYwLjc2IDU1My4w +NiAxNzAuMzggNTQ3LjQ5IDE3My40MiA1NDYuOTggRApOCjE3MC4zOCA1MzYu +MzUgTQogMTY0LjMgNTM4Ljg4IDE2NS4zMiA1NDYuNDcgMTcyLjkxIDU0Ni40 +NyBECk4KNyBYCjkwIDQ1MCAxOC40OCAxOC40OCAyMzcuNDYgNjA5LjUxIEcK +MCBYCjkwIDQ1MCAxOC40OCAxOC40OCAyMzcuNDYgNjA5LjUxIEEKNyBYCjkw +IDQ1MCAyMy4yOSAyMi4yOCAyMDkuMzYgNTk0LjA2IEcKMCBYCjkwIDQ1MCAy +My4yOSAyMi4yOCAyMDkuMzYgNTk0LjA2IEEKOTAgNDUwIDIuNzggMi43OCAy +MjEuNzcgNTgzLjY5IEcKOTAgNDUwIDIuNzggMi43OCAyMjEuNzcgNTgzLjY5 +IEEKOTAgNDUwIDIuNzggMi43OCAyNDYuNTggNTk5Ljg5IEcKOTAgNDUwIDIu +NzggMi43OCAyNDYuNTggNTk5Ljg5IEEKMjMyLjY1IDU2Ni40MiBNCiAyMDku +NTcgNTU1LjA4IDE3OC43OSA1MjkuOTcgMjAyLjI4IDUwMi45MyBECiAyMjIu +NjEgNDc5LjYgMjQ5LjM2IDQ4My4xOSAyNTAuODggNTE3LjExIEQKIDI1NC45 +MyA1MjIuMTcgMjYwLjUgNTE4LjEyIDI1OS45OSA1MzIuMyBECjUgWApWCjAg +WApOCjI1NC45MyA1NzQuMzIgTQogMjczLjE1IDU3NS44NCAzMDMuNjMgNTUy +Ljk4IDI3My42NiA1MzcuODcgRAogMjUzLjQxIDUyNy43NCAyMjUuMDYgNTIz +LjY5IDIwMy43OSA1MjUuNzIgRAo1IFgKVgowIFgKTgoyMDcuMzQgNTI5LjI2 +IDIwMC43NiA1MjEuMTYgMiBMCk4KMTY3LjM0IDY2My45MyBNCiAxNTYuOTQg +Njc5IDEyNS4zMiA2NjIuOTIgMTQyLjAzIDYzOC42MiBECk4KMTQ5LjYyIDY1 +Ni44NCBNCiAxMzAuODkgNjYzLjkzIDExNS4yIDY0NS43IDEyNy44NSA2MjYu +OTcgRApOCjE3Ny45OCA0OTguODggTQogMTUwLjY0IDQ5Ny4zNiAyMDkuMzYg +NDc0LjU4IDIzMC4xMiA0NjguNTEgRApOCjE3MC45OSA0OTYuNzYgMTUyLjE1 +IDQ2OC41MSAyIEwKTgoxNTIuMTUgNDY4LjUxIE0KIDE3My40MiA0NDguNzYg +MTk3LjcyIDQ0MC4xNiAyMjQuMDUgNDM3LjYzIEQKTgoyMzAuMTIgNDY4LjUx +IDIyNC4wNSA0MzcuNjMgMiBMCk4KMjQxLjIgNDkyLjM3IDI1MC44OCA0ODgu +MjUgMjYxIDQ4MS42NyAzIEwKTgoyNDEuMiA0OTIuMzcgTQogMjQ5Ljg3IDQ3 +My4wNiAyNzQuNjcgNDI4LjAxIDI3Ny4yIDM5OC4xNCBECiAzMDMuNTMgMzc5 +LjQgMzE0Ljc5IDM1MC41MiAzMTQuMTYgMzEwLjU1IEQKIDMxMi42NCAyOTMu +ODQgMjM4LjQyIDI5MC43IDIxNS42NCAyOTAuMiBECjcgWApWCjAgWApOCjE1 +Ni4yMSA0NjQuOTYgMTQ1LjA3IDQ1MS4yOSAyIEwKTgoxMTUuMiAzODYuNDkg +TQogMTA0LjQ3IDM5My4wMyA5Ny45OCAzOTcuNjMgOTUuNDUgNDA1LjczIEQK +IDk2LjQ2IDQyNS45OCAxMzguNDkgNDY1LjQ3IDE2OC4zNiA0NDcuNzUgRAog +MTg0LjA0IDQzOC4zNSAxNzcuNzIgMzk3LjY1IDE2OC44NiAzODUuNDggRApO +CjEwNi4wOCAzMTEuMDUgNzYuMjEgMzUxLjU2IDg3Ljg2IDM1MC4wNCA4Ny44 +NiAzNjIuMTkgOTguNDkgMzU2LjYyIDk3LjQ4IDM3Mi4zMiAxMDcuMSAzNjMu +NzEKIDEwNS4wNyAzODEuOTMgMTE3LjczIDM3MS4zIDExNi4yMSAzODkuMDIg +MTI4Ljg3IDM3OS40IDEyNy44NSAzOTUuNiAxMzguOTkgMzg3IDEzOC40OSA0 +MDEuNjggMTQ5LjYyIDM5Mi41NwogMTUwLjY0IDQwNS4yMiAxNTYuMjEgMzk2 +LjExIDE2MC4yNiA0MDUuMjIgMTggTApOCjk4LjQ5IDM5OC4xNCBNCiA2NC41 +NyAzNjAuNjcgNjQuOTIgMjkzLjQzIDkzLjkzIDI1NC4zNSBECk4KMTA2LjA4 +IDMxMS4wNSBNCiAxMTMuNjggMzAyLjk1IDExMy42OCAyOTcuODkgMTIwLjc3 +IDI4Ny43NyBECk4KMTIwLjc3IDI4Ny43NyBNCiAxNTAuMTMgMjk1LjM2IDE2 +My44IDI2MS40NCAxMjQuODIgMjY3LjAxIEQKTgozMDYuMzIgMzAyLjQ1IE0K +IDMwMS43NyAyNjYgMjYyLjUyIDIzOC42NiAyMjYuNTggMjMxLjA2IEQKNCBY +ClYKMCBYCk4KMTYwLjI2IDQwNS4yMiBNCiAxNjguMTIgMzg3Ljk2IDE3MS45 +IDM2Ny41NiAxODUuMDcgMzUwLjEgRAogMTkyLjk2IDM1MC41NSAxOTIuOTYg +MzQ5LjMzIDE5NC4xOCAzNDQuOTggRApOCjkwIDQ1MCAxNC41OCAxNy44MiAx +OTEuNzUgMzI2LjY1IEEKOTAgNDUwIDIuNjMgMi42MyAxODkuOTIgMzI5LjI4 +IEcKOTAgNDUwIDIuNjMgMi42MyAxODkuOTIgMzI5LjI4IEEKNyBYCjkwIDQ1 +MCAyMC40NSAyMS4wNiAxNjcuMjQgMzEzLjI4IEcKMCBYCjkwIDQ1MCAyMC40 +NSAyMS4wNiAxNjcuMjQgMzEzLjI4IEEKOTAgNDUwIDIuNjMgMi42MyAxNTcu +NTIgMzEzLjA4IEcKOTAgNDUwIDIuNjMgMi42MyAxNTcuNTIgMzEzLjA4IEEK +MTg3LjcgMzA5LjY0IE0KIDIyMC45MSAzMjguNjcgMjIwLjEgMjk5LjUxIDE5 +OS44NSAyOTYuNjggRAo3IFgKVgowIFgKTgoyMDguNzYgMzAwLjMyIE0KIDIx +NS42NCAyOTAuMiAyMTQuNDMgMjkyLjIyIDIyNS4zNiAyODAuMDcgRAogMjEz +LjYyIDI1OC42IDE3OC4zOCAyNjMuMDYgMTYyLjU4IDI2NC42OCBECjcgWApW +CjAgWApOCjE1OC4xMyAyNjMuMDYgMTY0LjIgMjY3LjUyIDIgTApOCjE5Mi45 +NiAyNjMuODcgTQogMTkyLjU2IDI1OS4wMSAxOTAuMTMgMjU2LjU4IDE4MS4y +MSAyNTYuMTcgRAogMTgwIDI1MC45MSAxNzYuNjYgMjM3Ljk4IDE3Mi41NCAy +MzMuMjQgRAo0IFgKVgowIFgKTgoxNTIuODYgMjM4LjM1IE0KIDE2My44IDIz +MS4wNiAxNzEuMDkgMjM1LjExIDE3NS45NSAyMzQuMyBECiAxNzcuNTcgMjE4 +LjkxIDE3NS41NCAyMTAuODEgMTc2LjM1IDE5OS44OCBECiAxOTcuNTUgMTcx +LjEgMjM2LjI5IDEzNS45NCAxNDIuMzMgMTM3LjEgRAogMTA5LjUzIDEzNy41 +IDU2LjQ3IDE0MS4xNSAxMDQuMjYgMTkxLjM3IEQKNiBYClYKMCBYCk4KMTU0 +Ljg5IDExNC40MiAxNTUuMjkgMTA2LjMyIDIgTApOCjEwNC4yNiAxOTUuMDIg +TQogMTA2LjU2IDE3NC4wOSAxMDIuMjQgMTM5LjEyIDEwNi4yOSAxMjMuNzMg +RAogMTEwLjA5IDExOS40OSAxMTQuMjkgMTE4LjkxIDEyNC4xMSAxMTkuNjgg +RAogMTMyLjIxIDEwNS4xIDEzOC42OSAxMDcuOTQgMTI3LjQ3IDEzNC44NyBE +CiAxMjcuNDcgMTQ5LjA1IDEyNi45NCAxNzIuNzQgMTMyLjYxIDE4OS43NSBE +CjcgWApWCjAgWApOCjEyNC4xMSAxMTkuNjggTQogMTEyLjM2IDg1LjY2IDEw +NS44OCAxMDYuNzIgMTExLjU1IDEwOS4xNSBECjcgWApWCjAgWApOCjEwOS4z +NyAxMjYuNzcgMTA0LjU3IDEyMy4xIDEwMC44OSAxMTQuMTEgMTE3LjIyIDEx +MC4xOSAxMjIuMDMgMTE2LjUyIDEyNS41NyAxMjMuOTkgNiBZCjcgWApWCjEw +OC43MiAxMTguNDcgTQogOTEuMyAxMDUuOTEgMTE0Ljc5IDEwMy4wOCAxMTYu +NDEgMTE2LjQ0IEQKVgowIFgKTgoxMDYuMjkgMTI0Ljk1IE0KIDk3Ljc4IDEy +MS4zIDk0Ljk0IDEwOS4xNSAxMDMuNDUgMTE0LjAxIEQKNyBYClYKMCBYCk4K +MTA3LjAzIDIyMS42MSBNCiAxMDAuNjIgMjExLjIyIDk5IDIwMy4xMiA5OS40 +IDE5OC4yNiBECiAxMDcuMjEgMTkxLjUyIDEyOS4zNyAxODguOTQgMTQwLjcx +IDE5MC4xNiBECiAxNDUuMTcgMTk4LjY2IDEzOC4wOCAyMTIuNjkgMTQxLjAy +IDIyMC40MyBECjYgWApWCjAgWApOCjExOS4yNSAyNDcuNzcgTQogMTI5LjYg +MjQwLjcyIDEzNy45IDIzNy40NSAxNDQuMDQgMjM2LjcgRAogMTYwLjkxIDIz +NC42MyAxNjIuMjggMjUyLjgzIDE0MC41MSAyNTguNCBECiAxMjguMjMgMjYx +LjYxIDEzMC44OSAyNjIuOTYgMTI0LjgyIDI2Ny4wMSBECjcgWApWCjAgWApO +CjkzLjkzIDI1NC4zNSBNCiA4OS44OCAyMTkuOTMgMTM5LjUgMTk1LjYyIDE0 +MS4wMiAyMjAuNDMgRAo3IFgKVgowIFgKTgoxMTUuNyAyMzAuNTYgTQogMTI4 +LjM2IDIxMy4zNCAxNjcuMzQgMjE5LjQyIDE0Ny42IDIzNi4xMyBECjcgWApW +CjAgWApOCjE3Mi43MSAxMDcuMjggMTcyLjcxIDc2Ljc1IDIgTApOCjE1My4y +NyAxMDIuNjcgMTUzLjI3IDc2LjM1IDIgTApOCjE1My4yNyA3Ny4xNiBNCiAx +NjIuOTkgNjguMjQgMTcyLjcxIDczLjEgMTcxLjkgNzcuMTYgRAogMTk4LjIz +IDY3LjAzIDEzNC4yMyA2NC42IDE1My4yNyA3Ny4xNiBECjcgWApWCjAgWApO +CjcgWAo5MCA0NTAgNS44NyA1LjQ3IDE1Ny41MiA2MS41NiBHCjAgWAo5MCA0 +NTAgNS44NyA1LjQ3IDE1Ny41MiA2MS41NiBBCjE3OC4zMiA3Mi4zMiBNCiAx +ODkuMjYgNjguNjcgMjAwLjI1IDYwLjk2IDIwMC42NiA1MC40MiBECjcgWApW +CjAgWApOCjIwMC42NiA1MC40MiAxNTIuMDUgNTAuNDIgMiBMCk4KMTMwLjE4 +IDcyLjcgMTMwLjE4IDEwMC42NSAyIEwKTgoxMDguMzEgOTQuMTcgMTA4LjMx +IDcyLjI5IDIgTApOCjEwOC4yNCA5NC41IE0KIDEwNS45NiA5Ni42NSAxMDQu +NTcgOTcuNjYgMTA0LjY5IDEwMS4zMyBECk4KMTI4LjQ5IDQyLjg1IE0KIDEz +MC40NiA0Mi4xNSAxMzAuMiA2NS45MSAxMzEuOSA2NS4xMyBECiAxNDMuOCA1 +OS42OCAxNTMuMjIgNDkuODcgMTUyLjg2IDQzLjEzIEQKNyBYClYKMCBYCk4K +MTQ5Ljg4IDcxLjcxIE0KIDE0Ni43MSA2Ny4wMyAxNDUuNyA2Ni42NSAxNDQu +MDUgNTcuOTIgRAo3IFgKVgowIFgKTgoxMDIuNjQgNDUuMTYgTQogOTcuMzgg +MzMuODIgMTEzLjQgMzMuNzQgMTI4Ljk3IDMzLjQxIEQKIDE0NC4wNSAzMy4x +IDE1OS43NSAzMS43OSAxNTIuNDYgNDIuMzIgRAozIFgKVgowIFgKTgoxMDQu +MjYgNjYuNjMgTQogMTAxLjgyIDU1LjI4IDEwMi4yNCA0OC40IDEwMy4wNSA0 +NC43NSBECiAxMjAuODcgNDAuMyAxNDAuNzYgNDIuMSAxNTIuOTEgNDIuMzUg +RAo3IFgKVgowIFgKTgoxMDguMzEgNzIuMjkgTQogMTE3LjIyIDY4LjY1IDEy +My4zIDcwLjY3IDEzMC4xOCA3Mi43IEQKIDE0OCA1OC41MyA4Ni4wOSA2MC4y +IDEwNy43MyA3NS4xMyBECjcgWApWCjAgWApOCjEyMi42NiA2Mi4zNSAxMjgu +ODcgNjIuODUgMTMwLjY0IDYzLjk5IDEzMS4yNyA2NC4zNyAxMzEuOSA2NC4y +NSAxMzMuNDIgNjMuNjEgMTMyLjQxIDUxLjQ2CiAxMjUuOTYgNTIuMjIgOCBM +CjcgWApWCjIyMS4zMSAxMzUuMDcgMjA5LjU3IDEyOC41OSAyMDkuNTcgMTM2 +LjI5IDE5NS4zOSAxMzAuMjEgMTk2LjIgMTQ2LjgyIDE3Ny41NyAxNTMuMyAx +ODcuMjkgMTY4LjY5CiAxNjkuNDcgMTgxLjI1IDE5MC4xMyAxOTUuODMgMTg1 +LjY3IDIxNi4wOCAyMTEuNTkgMjEzLjI0IDIyMC41IDIzNi4zMyAyMzkuNTQg +MjIxLjM0IDI2MS40MSAyMzIuMjggMjYyLjIyIDIxMi4wMwogMjc4LjQyIDIx +NC40NiAyNzIuNzUgMTk1LjAyIDI4NS43MSAxODYuOTIgMjc2LjggMTc2LjM5 +IDI4Ni4xMSAxNjUuMDQgMjY4LjQ3IDE1Ny4yNyAyMSBMClYKMCBYCk4KMjEx +LjU5IDE0NS4yIE0KIDIyMi41MyAxMzMuMDUgMjE5LjY5IDEzNC42NyAyNDAu +MzUgMTI5LjQgRApOCjkwIDQ1MCAxNC40MiAxNC45OSAyMTkuNDUgMTcyLjc0 +IEEKOTAgNDUwIDEzLjE2IDEzLjE2IDI1My41MSAxODEuODUgQQo5MCA0NTAg +Mi4wMyAyLjAzIDI1My43MSAxODguNTQgRwo5MCA0NTAgMi4wMyAyLjAzIDI1 +My43MSAxODguNTQgQQo5MCA0NTAgMi4wMyAyLjAzIDIyMi45MyAxODAuMDMg +Rwo5MCA0NTAgMi4wMyAyLjAzIDIyMi45MyAxODAuMDMgQQoxOTcuODIgMTc0 +Ljc3IDIwNS4xMSAxNzQuMzYgMiBMCk4KMjA1LjUyIDE5MC41NiAyMTAuNzgg +MTg0LjQ5IDIgTApOCjIyNS4zNiAxOTYuMjMgMjI0LjE1IDE4Ni45MiAyIEwK +TgoyNDAuMzUgMTk4LjI2IDI0NC44IDE5Mi4xOCAyIEwKTgoyNTQuNTIgMjAx +LjkgMjU0LjUyIDE5NC42MSAyIEwKTgoyNjguNyAxOTcuODUgMjYzLjg0IDE5 +MC4xNiAyIEwKTgoyMzkuMTMgMjIwLjUzIE0KIDI0My4xOCAyMTQuNDYgMjQy +Ljc4IDIxMC40MSAyNDAuMzUgMjA1LjU1IEQKTgoyMTEuNTkgMjExLjYyIE0K +IDIxMS41OSAyMDUuMTQgMjA5LjE2IDIwMy45MyAyMTcuNjcgMTk3LjA0IEQK +TgoyMTcuNjcgMTk3LjA0IDIyNi45OCAyMDMuNTIgMjMzLjQ2IDIwNS4xNCAy +NDAuMzUgMjA1LjU1IDQgTApOCjIzOS4xMyAyMjAuNTMgMjMxLjQ0IDIxMi40 +MyAyMjYuOTggMjEwLjgxIDIxMS41OSAyMTEuNjIgNCBMCk4KMjMxLjQ0IDIx +Mi40MyAyMzMuNDYgMjA1LjE0IDIgTApOCjIyNi45OCAyMTAuODEgMjI2Ljk4 +IDIwMy41MiAyIEwKTgoyMDQuMyAxNTQuNTIgTQogMTg5LjcyIDE1My4zIDIw +My45IDEzOC43MiAyMTEuNTkgMTQ1LjIgRApOCjI0MC43NSAxNjkuOTEgTQog +MjUzLjcxIDE4MC44NCAyNTguOTggMTY0LjIzIDI0My45OSAxNjAuMTggRAo3 +IFgKVgowIFgKTgoyMDQuMTEgMTUxLjY4IE0KIDE5OC44OCAxNTEuMjQgMjAz +Ljk3IDE0Ni4wMSAyMDYuNzMgMTQ4LjM0IEQKTgoyNjUuNDYgMTY3LjQ3IE0K +IDI3My41NiAxNjguNjkgMjcwLjMyIDE1NS43MyAyNjQuNjUgMTU1LjMzIEQK +TgoyNjUuNTkgMTY1LjQ1IE0KIDI2OC4zIDE2NS44NSAyNjcuMjEgMTYxLjUz +IDI2NS4zMiAxNjEuNCBECk4KMjU2LjU1IDE1MS4yOCBNCiAyNDIuMzcgMTc5 +LjYzIDIxOC4yMiAxMTguMjkgMjUzLjc5IDEzMC4xOSBECk4KMjY0LjY1IDE1 +NS4zMyBNCiAyNjMuNDMgMTUyLjA5IDI2My40MyAxNTAuMDYgMjYwLjYgMTQ3 +LjIyIEQKNyBYClYKMCBYCk4KMjI1LjM2IDEzMy44NiAyMjUuMzYgMTIwLjkg +MiBMCk4KMjI1LjM2IDEyMC45IE0KIDIwNi43MyAxMTIuOCAxOTcuNDIgODEu +MjEgMjE2LjQ1IDczLjEgRAo3IFgKVgowIFgKTgoyMjMuMzQgOTIuNTUgTQog +MjE3LjE1IDgyLjQ4IDIxNC44MyA2OS4wNSAyMjAuNSA1OS43NCBECk4KMjE4 +LjQ4IDYzLjk5IE0KIDIxMS41OSA2NC40IDIwMy4wOSA1NS4yOCAyMDMuNDkg +NDUuOTcgRAo3IFgKVgowIFgKTgoyMDMuOSA0Ni4zNyBNCiAxNzguNzkgNDcu +OTkgMTY3Ljg1IDI4LjE1IDIxNC44MyAyOS4zNiBECjcgWApWCjAgWApOCjIx +NC44MyAyOS4zNiBNCiAyMjguMiAxOC4wMiAzMDcuOTkgMjIuODggMjgwLjQ1 +IDQ1LjE2IEQKTgoyNTguNTcgMTIzLjMzIDI1OC41NyAxMzEuODMgMiBMCk4K +MjQ4LjQ1IDE1MC44NyBNCiAyNjkuMTEgMTU3LjM1IDI2OC4zIDEyMy43MyAy +NDkuMjYgMTMxLjQzIEQKNyBYClYKMCBYCk4KMjQ4LjQ1IDE0My45OCBNCiAy +NjQuNjUgMTQ1LjIgMjU1Ljc0IDEzNS44OCAyNDguNDUgMTM3LjUgRApOCjI2 +NC4zIDE1Ni42NCAyNjIuOSAxNTEuOTYgMjYxLjM4IDE0OC45MiAyNTkuMzYg +MTUwLjQ0IDI1Ny43MSAxNTEuNzEgMjU2LjQ1IDE1Ny4yNyA2IEwKNyBYClYK +MjU1LjE4IDEyMy4xIDI1OS4zNiAxMjMuMSAyNTkuMzYgMTE5Ljk0IDMgTApW +CjE5MS4zOSAyNTguMjggMTg4LjQ4IDI1Ni44OCAxODUuNyAyNTYuMTIgMTgz +LjU0IDI0OS4wNCAxOTIuOTEgMjQ4LjkxIDE5NC45MyAyNDkuMTYgNiBMCjQg +WApWCjE5MS45IDI2Mi43MSAxOTEuNjQgMjYwLjkzIDE5MC42MyAyNTkuNDEg +MTg4Ljg2IDI1OC4yOCAxODYuMDcgMjU5LjQxIDUgTAo3IFgKVgoyODEuMTMg +ODMuMjMgMjczLjAzIDgyLjcyIDI3My40MSA3MC45NSAyODIuNjUgNjYuNzgg +NCBMCjAgWApWCjI3NC43NyA3Mi43IE0KIDI4NC4wOSA2Mi4xNyAyODQuMDkg +NTAuODMgMjc5LjIzIDQwLjMgRAo3IFgKVgowIFgKTgoyNTguNiAxMjMuNzMg +TQogMjgyLjUgMTIyLjExIDI4Ni43MyA5Mi4xNCAyNzQuMzcgNzguMzcgRAo3 +IFgKVgowIFgKTgoyNjcuMDggMTA3LjEzIE0KIDI3My4xOCA5Ny4wNSAyNzYu +OCA3Ny41NiAyNzMuOTYgNjYuNjMgRAo3IFgKVgowIFgKTgoxMzcuNiA4MC44 +MyAxMzIuOTIgNzAuNTcgMiBMCk4KMjE3LjEyIDYyLjM1IDIwNi44MyA1Mi45 +OCAyMDQuNjggNDguNTUgMjA0LjQzIDQzLjg3IDIxOC44NiA0OC41NSA1IEwK +NyBYClYKMjMwLjEyIDQ2OC41MSAyNTEuODkgNDQ2LjIzIDI2MSA0ODEuNjcg +MjcyLjY1IDQ0Ni4yMyAyNjAuNSA0NTEuMjkgNSBMCjAgWApOCjIyNy44NCAx +MjAuOTUgMjIzLjQxIDExOS4zIDIyNC40MyAxMTUuNzYgMyBMCjcgWApWCjI1 +Mi45IDU5OC40MiBNCiAyNzguNDIgNTg5LjkxIDI2MSA1NjkuNjYgMjMyLjY1 +IDU2Ni40MiBEClYKMCBYCk4KNSBYCjkwIDQ1MCA2LjQ4IDYuNDggMzYxLjQ1 +IDQ3Ny4zMiBHCjAgWAo5MCA0NTAgNi40OCA2LjQ4IDM2MS40NSA0NzcuMzIg +QQo1IFgKOTAgNDUwIDYuNDggNi40OCAzNDguMDggNDc0Ljg5IEcKMCBYCjkw +IDQ1MCA2LjQ4IDYuNDggMzQ4LjA4IDQ3NC44OSBBCjUgWAo5MCA0NTAgNi40 +OCA2LjQ4IDMzMy4xIDQ3NC4wOCBHCjAgWAo5MCA0NTAgNi40OCA2LjQ4IDMz +My4xIDQ3NC4wOCBBCjUgWAowIDc4IDYuMTUgNi4xNSAzNzAgNDg5LjM5IEcK +MCBYCjAgNzggNi4xNSA2LjE1IDM3MCA0ODkuMzkgQQozMTguMTEgNTg1LjA1 +IE0KIDMyMS4zNSA1ODcuODkgMzIxLjc2IDU4OC4yOSAzMjIuNTcgNTkzLjU2 +IEQKIDMyOS40NSA1ODkuOTEgMzMyLjY5IDU5My41NiAzMzUuMTIgNTk4LjAx +IEQKIDMzOS41OCA1OTEuOTQgMzQ0LjAzIDU5NS4xOCAzNDcuMjcgNTk4LjAx +IEQKIDM0OC4wOCA1ODcuNDggMzU3LjQgNTg4LjcgMzY0LjI5IDU4OS41MSBE +CiAzNjMuNDggNTc4LjE3IDM3Mi43OSA1ODIuNjIgMzc1LjIyIDU4MC42IEQK +IDM3MS45OCA1NjguNDUgMzc5LjY3IDU2OC44NSAzODAuODkgNTY3LjY0IEQK +IDM3NS4yMiA1NjYuMDIgMzcwLjYgNTU2LjggMzc3LjY1IDU1MS44NCBECiAz +NjkuOTUgNTQwLjEgMzc4Ljg2IDUzNi44NSAzODAuODkgNTM2LjQ1IEQKIDM5 +MC42MSA1NDkuNDEgNDAwLjc0IDUxNC41OCAzNzMuMiA1MjAuMjUgRAo3IFgK +VgowIFgKTgo3IFgKOTAgNDUwIDE4LjQzIDIxLjA2IDMyNS4yIDU2NS42MSBH +CjAgWAo5MCA0NTAgMTguNDMgMjEuMDYgMzI1LjIgNTY1LjYxIEEKMzMyLjI5 +IDU1Mi4yNSBNCiAzMDUuNTYgNTc3LjM2IDI5Ni4yNCA1NDAuMSAzMjIuNTcg +NTQwLjEgRAo3IFgKVgowIFgKTgo5MCA0NTAgMi43OCAyLjc4IDMxNC4yMSA1 +NzMuMTUgRwo5MCA0NTAgMi43OCAyLjc4IDMxNC4yMSA1NzMuMTUgQQozNDQu +NDQgNTgxLjQxIDM0MS42IDU4OC4yOSAyIEwKTgozNTQuOTcgNTgxIDM1Ny44 +IDU4Ni4yNyAyIEwKTgozNjMuNDggNTc0LjEyIDM2Ny45MyA1NzkuNzkgMiBM +Ck4KMzY3LjkzIDU2MS45NyAzNzIuMzkgNTY0LjggMiBMCk4KMzI4LjY0IDU4 +Ny40OCAzMjkuMDUgNTk0Ljc3IDIgTApOCjMwOC4zOSA1NzQuOTMgMzAzLjk0 +IDU3OC41NyAyIEwKTgozMTMuMjUgNTgxLjgxIDMwOC44IDU4Ny40OCAyIEwK +TgozMTkuNzMgNTg2LjI3IDMxOC4xMSA1OTEuOTQgMiBMCk4KMzM1LjQzIDU0 +NS40NiAzMzMuMjcgNTQ4LjM3IDMyNC41NCA1NDYuOTggMzI1LjA1IDU0MC41 +MiA0IEwKNyBYClYKMzc4LjA1IDUzMC4zNyBNCiAzODYuOTcgNTM1LjY0IDM4 +Ni41NiA1MjQuMyAzNzguMDUgNTI0LjMgRAowIFgKTgozMDguOSA1MjcuMjkg +TQogMzEyLjg1IDUxOS40NCAzMTIuODUgNTE5LjQ0IDMyMC41NCA1MTMuNzcg +RApOCjM0MC43NCA1NDEuMTYgTQogMzQ4LjcyIDUzNy45OSAzNTUuMTcgNTQw +LjI3IDM1OC40NyA1NDEuNzYgRAogMzY3LjU5IDU0NS45MSAzNjUuMDkgNTI3 +LjM3IDM0My4yNyA1MjkuNTEgRAo3IFgKVgo5MCA0NTAgMTguNDMgMjEuMDYg +MzQ5LjEgNTYwLjc1IEcKMCBYCjkwIDQ1MCAxOC40MyAyMS4wNiAzNDkuMSA1 +NjAuNzUgQQo5MCA0NTAgMi43OCAyLjc4IDM0MS4zNSA1NjUuMDUgRwo5MCA0 +NTAgMi43OCAyLjc4IDM0MS4zNSA1NjUuMDUgQQozNDYuMTggNTMxLjU0IDM2 +My4yNyA1MzYuMSAzNzIuNzcgNTIyLjE3IDM3MS4zNyA1MDIuNDMgMzQ1LjQz +IDUyOS4xMyA1IEwKNyBYClYKMzA3LjE4IDU0OC42IE0KIDI1MC44OCA1MzQu +ODMgMzQ2LjU0IDUxMy4wNSAzNjQuNjkgNTI3Ljk0IEQKMCBYCk4KMzYzLjA3 +IDUzMS4xOCBNCiAzNjUuOSA1MjkuNTYgMzY1LjkgNTI3LjEzIDM2NS41IDUy +My40OSBECk4KMzczLjIgNTIwLjI1IDM3MC43NyA0ODkuODcgMiBMCk4KNSBY +CjkwIDQ1MCA2LjQ4IDYuNDggMzcyLjc5IDQ4My44IEcKMCBYCjkwIDQ1MCA2 +LjQ4IDYuNDggMzcyLjc5IDQ4My44IEEKMzE5LjIzIDQ3MC41MyBNCiAzMTUu +MTggNDM2LjExIDI5NS45NCA0NDQuNzEgMjk2Ljk1IDQxNC4zNCBECiAyOTgu +MDcgMzgwLjc1IDMzNC40MSAzNzkuNCAzMjMuMjggMzE5LjE2IEQKIDMwOC4y +NCAyMzguNzQgMjk3Ljk2IDIyMS45NSAyOTkuOTkgMTUzLjEgRAogMzA3LjA4 +IDEzOS45MyAzNjMuNzggMTI5LjMgMzkxLjEyIDEzNC4zNiBECk4KMzc0LjQx +IDQ3Ny4xMSBNCiAzOTcuNyA0NDAuNjYgNDQ5Ljg1IDQxMy44MyA0MjAuNDgg +MzQ4LjUyIEQKTgozNjUuMyA0MzUuNiBNCiAzODYuMDUgNDIwLjkyIDM5NS40 +MiAzOTMuMDcgMzkwLjM2IDM3MS44MSBECk4KMzgwLjk5IDQxOC44OSBNCiAz +ODIuNTEgMzk1LjEgMzg4LjA4IDM3Mi4zMiAzOTguMiAzNTQuNiBECk4KMzA1 +LjQzIDQ0MC4wMyBNCiAzMjUuNjggNDMxLjkzIDM0OC40NiA0MjkuMjcgMzY4 +LjcxIDQzMi44MiBECk4KMjY0LjA0IDQ0My4xOSBNCiAyODkuMzYgNDQwLjE2 +IDI5OC40NyA0NjQuNDYgMzE4LjIxIDQ2NC40NiBECk4KMjc1LjE4IDQwOS43 +OCBNCiAyODYuMzIgNDExLjggMjg2LjcgNDEyLjA2IDI5Ni44MiA0MTguNjQg +RApOCjI2OS42MSA0NTUuODUgMjg5LjM2IDQ1MC4yOCAyIEwKTgoyOTMuNDkg +MzgzLjAyIDMxMS41MiAzODEuNDIgMiBMCk4KMjg3Ljg0IDQxMi44MiAyODYu +MzggMzkwLjYzIDIgTApOCjQyMi41MSA0NDUuNzMgTQogNDUxLjM2IDQ0MC4x +NiA0MDguODQgNDAwLjY3IDQwOS44NSA0MjkuNTIgRAo3IFgKVgowIFgKTgo0 +MDguMzMgNDY0LjQ2IE0KIDQ0NS4zNCA0NjcuOSA0MDIuODkgNDAwLjY3IDM5 +NS4yOSA0NDMuNyBECjcgWApWCjAgWApOCjM4Mi42NCA0NjYuODYgTQogNDQy +LjM4IDQ5My43IDM4NC45MiA0MDguMzkgMzg2Ljk0IDQ2MS41NSBECjcgWApW +CjAgWApOCjM4MiA0NjYuNDggMzg2LjMxIDQ2MS40MiAyIEwKTgoyNDguNDUg +MTUwLjg3IDI0OC40NSAxNDMuOTggMiBMCk4KMjQ4LjQ1IDEzNy41IDI0OS4y +NiAxMzEuNDMgMiBMCk4KMzI0LjMzIDE0MC4xOCBNCiAzMjYuMjEgMTE1LjYz +IDMyMy43OCAxMDAuMjQgMjk2LjA0IDkwLjkgRApOCjMxMi4zIDc5LjA0IE0K +IDMzNS4xMiA4NC40NSAzNDcuMjcgOTAuOTMgMzUyLjEzIDk1LjM4IEQKIDM1 +Mi41NCA5MC4xMiAzNTEuMzIgODUuMjYgMzUxLjczIDc5Ljk5IEQKIDM0OC4z +NSA3Ny4xNiAzNDMuNjMgNzQuNzIgMzM2LjAzIDc1LjI4IEQKIDMzNC41NCA3 +NS4xNyAzMzguNSA3OS43OSAzMzUuNTMgNzkuMTggRAogMzMxLjcgNzguMzkg +MzI1LjMxIDcyLjk5IDMxOC4xMSA3MS44OSBECjIgWApWCjAgWApOCjM0OS43 +IDEzNS4wNyAzNTIuMTMgOTUuMzggMiBMCk4KMzc3LjY3IDEzMy4xNCBNCiAz +NzguNjMgMTA5LjcgMzk0LjYgODYuNjMgMzcxIDc4LjU2IEQKIDM1Ni4xMiA3 +My41IDM1Mi42OSA2Ni4xMSAzNDguNDkgNjMuMzkgRApOCjM4Mi45MiA1OC41 +MyBNCiAzNjYuMzEgNjAuMTUgMzUyLjk0IDUwLjgzIDM0OC40OSA2My4zOSBE +CiAzMjAuNTQgMzkuNDkgMzUwLjUxIDQ1LjU2IDM3NS42MyA0Ni4zNyBECjIg +WApWCjAgWApOCjQ0NS4yOSAyMjcuMDEgNDcyLjgzIDIyMS4zNCA0NzIuODMg +MjM4LjM1IDQ5Mi4yNyAyMzkuMTYgNDg4LjIyIDI1OC42IDUwNi40NSAyNzEu +MTYgNDg5Ljg0IDI4OC41OAogNTA2Ljg1IDMxMi4wNyA0ODAuMTIgMzE3LjMz +IDQ4Ny4wMSAzNDYuMDkgNDU1LjgyIDM0MC4wMSA0NDUuMjkgMzYyLjcgNDIy +LjIgMzQ2LjQ5IDM5Ny45IDM1NSAzOTMuMDQgMzMxLjEKIDM3MS4xNyAzMzAu +MjkgMzgwLjA4IDI5OS41MSAxNyBMCk4KNyBYCjkwIDQ1MCAxOS4wNCAyMS40 +NyAzOTIuNjQgMjgzLjcyIEcKMCBYCjkwIDQ1MCAxOS4wNCAyMS40NyAzOTIu +NjQgMjgzLjcyIEEKNDQxLjY0IDI4My4zMSA0NTAuMTUgMjg1Ljc0IDIgTApO +CjQzNS44OCAyOTQuNDQgNDQxLjY0IDI5OC4zIDIgTApOCjQyNy40MyAyOTku +NyA0MjkuMDkgMzA2LjQgMiBMCk4KNDE1LjI5IDI5OS45MyA0MTQuMSAzMDYu +OCAyIEwKTgo0MDAuODQgMzAzLjA5IDQwMy45OCAzMTEuMjYgMiBMCk4KMzky +LjY0IDMwNS4xOCAzOTEuNDIgMzE0LjUgMiBMCk4KMzgyLjg5IDMwMi4yIDM3 +OS4yNyAzMTAuMDQgMiBMCk4KMzc2LjM1IDI5NC44MyAzNzAuMzYgMjk5LjUx +IDIgTApOCjkwIDQ1MCAyLjYzIDIuNjMgMzg1Ljk1IDI5Ny42OSBHCjkwIDQ1 +MCAyLjYzIDIuNjMgMzg1Ljk1IDI5Ny42OSBBCjM3NS42MyAyNjguMzMgTQog +MzE0Ljg3IDI1OS4wMSA0MTIuMDggMjM1LjkyIDQzMi43MyAyNDQuODMgRApO +CjQzMCAyNDkuNTkgTQogNDMzLjI0IDI0NS41NCA0MzMuNjQgMjQ0LjMzIDQz +My42NCAyMzkuODcgRApOCjM4OC4yMSAyNjIuODMgTQogMzkwLjcgMjY2LjI3 +IDQwMC43NCAyNzIuMjkgNDAxLjUgMjcwLjMgRAogNDAyLjI2IDI2OC4yOCA0 +MDMuMjcgMjY2IDQwNS44IDI2My44NCBECiA0MDcuODMgMjYyLjExIDM5MC45 +OSAyNTkuNDEgMzg5LjczIDI2MC44MSBECjcgWApWCjkwIDQ1MCAyMS4wNiAy +MS40NyA0MjAuOTkgMjc5LjI2IEcKMCBYCjkwIDQ1MCAyMS4wNiAyMS40NyA0 +MjAuOTkgMjc5LjI2IEEKOTAgNDUwIDIuNjMgMi42MyA0MTEuNDcgMjg4LjM3 +IEcKOTAgNDUwIDIuNjMgMi42MyA0MTEuNDcgMjg4LjM3IEEKNDAwLjMzIDI3 +NC44MSBNCiAzODIuNTEgMjkxLjgyIDM1OS4wMiAyNjcuOTIgMzg4LjU5IDI2 +MS40NCBECjcgWApWCjAgWApOCjQ0My42NyAyNTIuMTMgTQogNDYwLjI1IDI2 +My4yMiA0NjYuNzYgMjMyLjI4IDQ0Mi40NSAyMzIuMjggRApOCjQ0Ni4yNCAy +NDYuNDggTQogNDUzLjcgMjUxLjQ3IDQ1Ni42MyAyMzcuNTQgNDQ1LjY5IDIz +Ny41NCBECk4KMzg5LjQgMjQ2LjA1IE0KIDQwNy4zNSAyMzIuOTkgNDE2LjEz +IDIwNy4xNyA0MDYuODEgMTc5LjYzIEQKTgo3IFgKOTAgNDUwIDUuODcgNS44 +NyA0MDYuMjEgMjA2Ljk3IEcKMCBYCjkwIDQ1MCA1Ljg3IDUuODcgNDA2LjIx +IDIwNi45NyBBCjcgWAo5MCA0NTAgNS44NyA1Ljg3IDQxNi4zMyAyMDMuMzIg +RwowIFgKOTAgNDUwIDUuODcgNS44NyA0MTYuMzMgMjAzLjMyIEEKNyBYCjkw +IDQ1MCA1Ljg3IDUuODcgNDI5LjI5IDIwNS43NSBHCjAgWAo5MCA0NTAgNS44 +NyA1Ljg3IDQyOS4yOSAyMDUuNzUgQQo0NDQuODggMTc4LjAxIE0KIDQyOS40 +OSAxNzUuNTggNDIwLjU4IDE3Mi43NCA0MDQuNzkgMTgwLjAzIEQKIDQwMy42 +OSAxNzQuNjEgMzk2LjY5IDEyNi4xNiAzNzQuODIgMTEwLjc3IEQKIDM4NC41 +NCAxMTAuMzcgMzg2Ljk3IDExMi44IDM5NC42NiAxMTQuMDEgRAo0IFgKVgow +IFgKTgozOTQuNjYgMTE0LjAxIDM4OC41OSA5Ny44MSA0MDQuMzggMTA3Ljk0 +IDQwNy4yMiA4Ny42OSA0MjIuNjEgMTAwLjY1IDQzMC43MSA4NC44NSA0NDIu +ODYgOTkuMDMKIDQ1OS40NiA4NC44NSA0NjMuOTIgMTA2LjMyIDQ4MS43NCA5 +NS43OSA0ODEuMzQgMTE0LjgyIDQ5OC4zNSAxMDcuMTMgNDk1LjkyIDEyMC40 +OSAxMyBMCjQgWApWCjAgWApOCjQ3NS4yOSAxNTkuNzYgTQogNDgxLjM0IDE0 +NS42IDQ5Ny45NCAxMjkuODEgNTA4LjQ4IDEyMy4zMyBECiA1MDAuMzcgMTIw +LjkgNTAwLjc4IDEyMC45IDQ5NS45MiAxMjAuNDkgRAo0IFgKVgowIFgKTgo0 +NDIuMDUgMjMyLjI4IE0KIDQ0NS42OSAyMjMuMzcgNDQ4LjkzIDIxOC4xIDQ0 +OS4zNCAyMTIuMDMgRAogNDgwLjUzIDE5Mi41OSA0NzguOTEgMTU0LjUyIDQ2 +OS4xOCAxMzUuMDcgRAogNDcxLjYxIDExNi4wNCA0NjYuMzUgMTA5Ljk2IDQ2 +Mi4zIDExMi4zOSBECjcgWApWCjAgWApOCjQ2MS4wOCAxMjAuNDkgTQogNDY0 +LjczIDEwMS40NiA0NDguMTIgMTAwLjI0IDQ1MS43NyAxMjAuMDkgRAo3IFgK +VgowIFgKTgo0NTEuNzcgMTIwLjA5IE0KIDQ0NS4yOSAxMDcuMTMgNDM2LjM4 +IDEwOS41NiA0NDMuNjcgMTI0Ljk1IEQKNyBYClYKMCBYCk4KNDQyLjQ1IDEy +Mi41MiBNCiA0MjYuNjYgMTI0LjU0IDQzNS45NyAxMzEuODMgNDQ2LjkxIDEz +OC43MiBECiA0NDkuMzQgMTQ2LjAxIDQ1MC45NiAxNjIuMjEgNDQzLjY3IDE4 +NC40OSBECk4KNyBYCjkwIDQ1MCA1Ljg3IDUuODcgNDUxLjE2IDIxNC42NiBH +CjAgWAo5MCA0NTAgNS44NyA1Ljg3IDQ1MS4xNiAyMTQuNjYgQQo3IFgKOTAg +NDUwIDUuODcgNS44NyA0NDEuMDQgMjA5LjQgRwowIFgKOTAgNDUwIDUuODcg +NS44NyA0NDEuMDQgMjA5LjQgQQo0NzYuODggNDkuMjEgTQogNDkxLjA2IDMy +LjIgMzg5LjggMTcuNiA0MzEuMTEgNDcuOTkgRAogNDMzLjU0IDQzLjU0IDQz +NC4zNSA0MS45MiA0MzcuMTkgMzcuNDYgRAogNDQwLjQzIDM5LjA4IDQ0Mi4z +IDQwLjE2IDQ0Ny4zMSA0Mi43MyBECiA0NDYuNSA0Ny45OSA0NDMuNjcgNTAu +NDIgNDQwLjgzIDU1LjY5IEQKIDQ0My45IDU3LjQxIDQ0NC45MSA1OC40MiA0 +NDcuMzEgNTkuNzQgRAogNDU0LjYgNTUuNjkgNDU2LjIyIDUwLjQyIDQ1OS40 +NiA0Mi4zMiBECiA0NjcuOTcgNDUuOTcgNDc0Ljc5IDUwLjI0IDQ3Ny4yOSA0 +OS4yMSBECjYgWApWCjAgWApOCjQzMC43MSA2MC45NiBNCiA0NDQuODggNDMu +OTQgMzQ2LjA2IDMxLjM5IDM4Ny4zNyA2MS43NyBECiAzODkuOCA1Ny4zMSAz +OTEuODMgNTYuMDkgMzk0LjY2IDUxLjY0IEQKIDM5Ny45IDUzLjI2IDM5Ni4x +MyA1MS45IDQwMS4xNCA1NC40NyBECiA0MDAuMzMgNTkuNzQgMzk3LjUgNjIu +MTcgMzk0LjY2IDY3LjQzIEQKIDM5Ni40MyA2OS4wNSAzOTguMiA3MC4xOSA0 +MDEuMTQgNzEuNDggRAogNDA4LjQzIDY3LjQzIDQxMC4wNSA2Mi4xNyA0MTMu +MjkgNTQuMDcgRAogNDIxLjggNTcuNzIgNDI4LjM2IDYxLjk4IDQzMC44NiA2 +MC45NiBECjYgWApWCjAgWApOCjQzMS4xMSA0Ny45OSA0NDAuODMgNTUuNjkg +MiBMCk4KMzg3LjM3IDYxLjc3IDM5NC42NiA2Ny40MyAyIEwKTgozMjAuNTQg +NTEzLjc3IDMyMC41NCA0ODIuOTQgMiBMCk4KNSBYCjkwIDQ1MCA2LjQ4IDYu +NDggMzE5LjczIDQ3Ni41MSBHCjAgWAo5MCA0NTAgNi40OCA2LjQ4IDMxOS43 +MyA0NzYuNTEgQQowIEYKKE9yaWdpbmFsIGltYWdlIHNjYW5uZWQgZnJvbSBM +QSBUKSAwIC0yNzAgNTgwLjM4IDE4LjMgVEYKKGltZXMgYnkgRG91ZyBLcmF1 +c2UpIDAgLTI3MCA1ODAuMzggMTA5LjA2IFRGCihUKSAwIC0yNzAgNTg2LjU3 +IDE4LjMgVEYKKHJhY2VkIGluIEZyYW1lIE1ha2VyIGJ5IENodWNrIE11c2Np +YW5vKSAwIC0yNzAgNTg2LjU3IDIxLjc0IFRGCihDb3B5cmlnaHQsIDE5OTAs +IEVsIEJhcnRvIEVudGVycHJpc2VzKSAwIC0yNzAgNTkyLjc2IDE4LjMgVEYK +Rk1FTkRQQUdFCiUlRW5kUGFnZTogIjEiIDAKJSVUcmFpbGVyCiUlQm91bmRp +bmdCb3g6IDAgMCA2MTIgNzkyCiUlUGFnZXM6IDEgLTEKJSVEb2N1bWVudEZv +bnRzOiBIZWx2ZXRpY2EKCgo= + +--16819560-2078917053-688350843:#11603 +Content-Type: BINARY;name="Alices_PDP-10" +Content-Transfer-Encoding: BASE64 +Content-Description: Alice's PDP-10 w/ TECO & DDT + +CQkJCUFsaWNlJ3MgUERQLTEwCgo7OzsgV2l0aCB0aGFua3MgKGFuZCBhcG9s +b2dpZXMpIHRvIENocmlzIFN0YWN5LCBBbGFuIFdlY2hzbGVyLCBOb2VsIENo +aWFwcGEsCjs7OyBMYXJyeSBBbGxlbiwgYW5kIG9mIGNvdXJzZSBBcmxvIEd1 +dGhyaWUsIGFuZCBwYXJ0aWN1bGFybHkgdG8gQW5uIE1hcmllIEZpbm4KOzs7 +IHdobyBpcyBhIGtpbmQgc291bCBhbmQgbm90IGF0IGFsbCBsaWtlIHRoZSBw +ZXJzb24gcG9ydHJheWVkIGhlcmVpbi4KOzs7CQkJCQkJCQktLSBzcmEgMyBN +YXkgODUKClRoaXMgc29uZyBpcyBjYWxsZWQgIkFsaWNlJ3MgUERQLTEwIi4g +IEJ1dCBBbGljZSBkb2Vzbid0IG93biBhIFBEUC0xMCwgaW4gZmFjdApBbGlj +ZSBpc24ndCBldmVuIGluIHRoZSBzb25nLiAgSXQncyBqdXN0IHRoZSBuYW1l +IG9mIHRoZSBzb25nLiAgVGhhdCdzIHdoeSBJCmNhbGxlZCB0aGlzIHNvbmcg +IkFsaWNlJ3MgUERQLTEwIi4KCllvdSBzZWUsIGl0IGFsbCBzdGFydGVkIGFi +b3V0IHR3byBpbmNvbXBhdGlibGUgbW9uaXRvciB2ZXJzaW9ucyBhZ28sIGFi +b3V0IHR3bwptb250aHMgYWdvIG9uIGEgVHVlc2RheSwgd2hlbiBteSBmcmll +bmQgYW5kIEkgU1VQRFVQJ2Qgb3ZlciB0byBNSVQtT1ogdG8gcGljawp1cCBz +b21lIGhhY2tlcnMgdG8gZ28gb3V0IGZvciBhIENoaW5lc2UgZGlubmVyLiAg +QnV0IEFJIGhhY2tlcnMgZG9uJ3QgbGl2ZSBvbgpNSVQtT1osIHRoZXkgbGl2 +ZSBvbiB2YXJpb3VzIGFzc29ydGVkIGxpc3BtcyBhbmQgc3VjaCwgYW5kIHNl +ZWluZyBhcyBhbmQgaG93CnRoZXkgbmV2ZXIgbG9nIGluIGV4Y2VwdCB2aWEg +dGhlIGZpbGUgc2VydmVyLCB0aGV5IGhhZG4ndCBnb3R0ZW4gYXJvdW5kIHRv +CmRvaW5nIGZpbGVzeXN0ZW0gZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBhIGxv +bmcgdGltZS4KCldlIGdvdCBvdmVyIHRoZXJlLCBzYXcgNjAwIHBhZ2VzIGZy +ZWUsIDEwMDAwIHBhZ2VzIGluIHVzZSBvbiBhIDUgcGFjayBQUzosIGFuZApk +ZWNpZGVkIGl0IHdvdWxkIGJlIGEgZnJpZW5kbHkgZ2VzdHVyZSB0byBydW4g +Q0hFQ0tEIGZvciB0aGVtIGFuZCB0cnkgdG8KcmVjbGFpbSBzb21lIG9mIHRo +YXQgbG9zdCBzcGFjZS4gIFNvIHdlIHJlbG9hZGVkIHRoZSBzeXN0ZW0gd2l0 +aCB0aGUgZmxvcHBpZXMKYW5kIHRoZSBzd2l0Y2ggcmVnaXN0ZXJzIGFuZCBv +dGhlciBpbXBsZW1lbnRzIG9mIGRlc3RydWN0aW9uLCBhbmQgYW5zd2VyZWQg +IlkiCnRvIFJVTiBDSEVDS0Q/CgpCdXQgd2hlbiB3ZSBnb3QgdGhlIHN5c3Rl +bSB1cCBhbmQgdHJpZWQgdG8gcmVsZWFzZSBhbGwgdGhlIGxvc3QgcGFnZXMg +dGhlcmUgd2FzCmEgbG91ZCBiZWVwaW5nIGFuZCBhIGJpZyBtZXNzYWdlIGZs +YXNoZWQgdXAgb24gb3VyIHNjcmVlbiBzYXlpbmc6CiAgICAgICAgICAgICAg +ICAgICAgICBQRVJNSVNTSU9OIERFTklFRCBCWSBBQ0oKCldlbGwsIHdlJ2Qg +bmV2ZXIgaGVhcmQgb2YgYSB2ZXJzaW9uIG9mIEFDSiB0aGF0IHdvdWxkIGxl +dCB5b3UgZ28gaW50byBNRERUIGZyb20KQU5PTllNT1VTIGJ1dCBub3QgcnVu +IENIRUNLRCwgYW5kIHNvLCB3aXRoIHRlYXJzIGluIG91ciBleWVzLCB3ZSBo +ZWFkZWQgb2ZmCm92ZXIgdGhlIENoYW9zbmV0IGxvb2tpbmcgZm9yIGEgZmls +ZXN5c3RlbSB3aXRoIGVub3VnaCBmcmVlIHBhZ2VzIHRvIHdyaXRlIG91dAp0 +aGUgTE9TVC1QQUdFUy5CSU4gZmlsZS4gIERpZG4ndCBmaW5kIG9uZS4uLgoK +VW50aWwgd2UgZ290IHRvIFhYLTExLCBhbmQgYXQgdGhlIG90aGVyIGVuZCBv +ZiBYWC0xMSB3YXMgYW5vdGhlciBNSVQgVHdlbmV4LAphbmQgaW4gUFM6PE9Q +RVJBVE9SPiBvbiB0aGF0IE1JVCBUd2VuZXggd2FzIGFub3RoZXIgTE9TVC1Q +QUdFUy5CSU4gZmlsZS4gIEFuZAp3ZSBkZWNpZGVkIHRoYXQgb25lIGJpZyBM +T1NULVBBR0VTLkJJTiBmaWxlIHdhcyBiZXR0ZXIgdGhhbiB0d28gbGl0dGxl +CkxPU1QtUEFHRVMuQklOIGZpbGUsIGFuZCByYXRoZXIgdGhhbiBwYWdlIHRo +YXQgb25lIGluIHdlIHRob3VnaHQgd2UnZCB3cml0ZQpvdXJzIG91dC4gIFNv +IHRoYXQncyB3aGF0IHdlIGRpZC4KCldlbnQgYmFjayB0byBPWiwgZm91bmQg +c29tZSBoYWNrZXJzIGFuZCB3ZW50IG91dCBmb3IgYSBDaGluZXNlIGRpbm5l +ciB0aGF0CmNvdWxkbid0IGJlIGJlYXQsIGFuZCBkaWRuJ3QgZ2V0IHVwIHVu +dGlsIHRoZSBuZXh0IG1vcm5pbmcgd2hlbiB3ZSBnb3QgYSBTRU5ECmZyb20g +QW5uIE1hcmllIEZpbm4uICBTaGUgc2FpZCwgIktpZCwgd2UgZm91bmQgeW91 +ciBpbml0aWFscyBpbiBTSVhCSVQgaW4gdGhlCnJpZ2h0IGhhbGYgb2YgYSBQ +T1BKIGF0IHRoZSBlbmQgb2YgYSB0d28gbWVnYXdvcmQgY29yZSBkdW1wIGZ1 +bGwgb2YgZ2FyYmFnZSwKanVzdCB3YW50ZWQgdG8ga25vdyBpZiB5b3UgaGFk +IGFueSBpbmZvcm1hdGlvbiBhYm91dCBpdCIuICBBbmQgSSBzYWlkLCAiWWVz +Cm1hJ2FtIEFubiBNYXJpZSwgSSBjYW5ub3QgdGVsbCBhIGxpZSwgSSBwdXQg +dGhhdCBYVU5BTUUgaW50byB0aGF0IGhhbGZ3b3JkIi4KCkFmdGVyIHRhbGtp +bmcgYmFjayBhbmQgZm9ydGggd2l0aCBBbm4gZm9yIGFib3V0IDQ1IG1lc3Nh +Z2VzIHdlIGFycml2ZWQgYXQgdGhlCnRydXRoIG9mIHRoZSBtYXR0ZXIgYW5k +IEFubiBzYWlkIHRoYXQgd2UgaGFkIHRvIGdvIHJlYnVpbGQgdGhlIGJpdHRh +YmxlIGFuZCB3ZQphbHNvIGhhZCB0byBjb21lIGRvd24gYW5kIHRhbGsgdG8g +aGVyIGluIHJvb20gTkU0My01MDEuICBOb3cgZnJpZW5kcywgdGhlcmUgd2Fz +Cm9ubHkgb25lIG9mIHR3byB0aGluZ3MgdGhhdCBBbm4gY291bGQgb2YgZG9u +ZSB3aXRoIHVzIGRvd24gYXQgcm9vbSA1MDEsIGFuZCB0aGUKZmlyc3Qgb25l +IHdhcyB0aGF0IHNoZSBjb3VsZCBoYXZlIGhpcmVkIHVzIG9uIHRoZSBzcG90 +IGZvciBhY3R1YWxseSBrbm93aW5nCmVub3VnaCBhYm91dCBUd2VuZXggdG8g +c2NyZXcgaXQgdXAgdGhhdCBiYWRseSwgd2hpY2ggd2Fzbid0IHZlcnkgbGlr +ZWx5IGFuZCB3ZQpkaWRuJ3QgZXhwZWN0IGl0LCBhbmQgdGhlIG90aGVyIHdh +cyB0aGF0IHNoZSBjb3VsZCBoYXZlIGJhd2xlZCB1cyBvdXQgYW5kIHRvbGQK +dXMgbmV2ZXIgdG8gYmUgc2VlbiBoYWNraW5nIGZpbGVzeXN0ZW1zIGFnYWlu +LCB3aGljaCB3YXMgd2hhdCB3ZSBleHBlY3RlZC4gIEJ1dAp3aGVuIHdlIGdv +dCB0byByb29tIDUwMSB3ZSBkaXNjb3ZlcmVkIHRoYXQgdGhlcmUgd2FzIGEg +dGhpcmQgcG9zc2liaWxpdHkgdGhhdAp3ZSBoYWRuJ3QgZXZlbiBjb3VudGVk +IHVwb24sIGFuZCB3ZSB3YXMgYm90aCBpbW1lZGlhdGVseSBkZS13aGVlbGVk +LgpDRCVESVInZWQuICBBbmQgSSBzYWlkICJBbm4sIEkgZG9uJ3QgdGhpbmsg +SSBjYW4gcmVidWlsZCB0aGUgYml0dGFibGUgd2l0aCB0aGlzCmhlcmUgRklM +RVMtT05MWSBiaXQgc2V0LiIgIEFuZCBzaGUgc2FpZCAiWE9GRiwga2lkLCBn +ZXQgaW50byB0aGlzIFVEUCBwYWNrZXQiCmFuZCB0aGF0J3Mgd2hhdCB3ZSBk +aWQgYW5kIHJvZGUgdXAgdG8gdGhlIHNxdWFyZSBicmFja2V0IGFzY2l6IHNs +YXNoIHNjZW5lIG9mCnRoZSBjcmltZSBzbGFzaCBjbG9zZSBzcXVhcmUgYnJh +Y2tldC4KCk5vdyBmcmllbmRzLCBJIHdhbnQgdG8gdGVsbCB5b3UgYWJvdXQg +dGhlIG5pbnRoIGZsb29yIG9mIGJ1aWxkaW5nIE5FNDMgd2hlcmUKdGhpcyBo +YXBwZW5lZC4gIFRoZXkgZ290IHRocmVlIEtMMTBzLCAyNCBMSVNQTXMsIGFu +ZCBhYm91dCAzMiBWQVhlbiBydW5uaW5nIDQuMgp1bml4LiAgQnV0IHdoZW4g +d2UgZ290IHRvIHRoZSBzcXVhcmUgYnJhY2tldCBhc2NpeiBzbGFzaCBzY2Vu +ZSBvZiB0aGUgY3JpbWUKc2xhc2ggY2xvc2Ugc3F1YXJlIGJyYWNrZXQgdGhl +cmUgd2FzIGZpdmUgdHdlbmV4IGhhY2tlcnMgcGFzdCBhbmQgcHJlc2VudCwg +dGhpcwpiZWluZyB0aGUgYmlnZ2VzdCBsb3NzYWdlIHlldCBieSBhbiBSTVMg +Y2xvbmUgYW5kIGV2ZXJ5Ym9keSB3YW50ZWQgdG8gZ2V0IGluCnRoZWlyIHN1 +Z2dlc3Rpb24gZm9yIGEgbmV3IHN5c3RlbSBkYWVtb24gdGhhdCB3b3VsZCBo +YXZlIGtlcHQgaXQgZnJvbSBldmVyCmhhdmluZyBoYXBwZW5lZCBpbiB0aGUg +Zmlyc3QgcGxhY2UuICBBbmQgdGhleSB3YXMgdXNpbmcgdXAgYWxsIGtpbmRz +IG9mCmRlYnVnZ2luZyBlcXVpcG1lbnQgdGhhdCB0aGV5IGhhZCBseWluZyBh +cm91bmQgb24gVjNBIFNXU0tJVCB0YXBlcy4gIFRoZXkgd2VyZQpkb2luZyBE +U3MsIE1PTlJEcywgYW5kIFJTVFJTSHMsIGFuZCB0aGV5IG1hZGUgMjcwMDAg +cGFnZXMgb2YgY29yZSBkdW1wcyBhbmQKcGhvdG8gZmlsZXMgb24gYW4gUlAw +NiB3aXRoIGNvbW1lbnRzIGFuZCAtUkVBRC0uLVRISVMtIGZpbGVzIHRvIGJl +IHVzZWQgYXMKZXZpZGVuY2UgYWdhaW5zdCB1cy4KCkFmdGVyIHRoZSBvcmRl +YWwsIEFubiB0b29rIHVzIGJhY2sgZG93bnN0YWlycyBhbmQgbGVmdCB1cyB3 +aXRoIHRoZSBDTFUgaGFja2Vycy4KU2hlIHNhaWQgIktpZCwgSSdtIGdvbm5h +IGxlYXZlIHlvdSB3aXRoIHRoZSBDTFUgaGFja2Vycy4gIEkgd2FudCB5b3Vy +IGpzeXMKbWFudWFsIGFuZCB5b3VyIFJPTE0gRFRJIi4gIEkgc2FpZCAiQW5u +LCBJIGNhbiB1bmRlcnN0YW5kIHlvdXIgd2FudGluZyBteSBqc3lzCm1hbnVh +bCBzbyBJIHdvbid0IHJlbWluZCB0aGUgQ0xVIGhhY2tlcnMgb2YgZ3JvZHkg +dGhpbmdzIGxpa2Ugb3BlcmF0aW5nCnN5c3RlbXMsIGJ1dCB3aGF0IGRvIHlv +dSB3YW50IG15IERUSSBmb3I/IiBhbmQgc2hlIHNhaWQgIktpZCwgd2UgZG9u +J3Qgd2FudCBhbnkKVlRTIGVycm9ycyIuICBJIHNhaWQgIkFubiwgZGlkIHlv +dSB0aGluayBJIHdhcyBnb2luZyB0byB0cnkgdG8gY3Jhc2ggdGhlIHN5c3Rl +bQpmb3IgbGl0dGVyaW5nPyIgIEFubiBzYWlkIHRoYXQgc2hlIHdhcyBtYWtp +bmcgc3VyZSwgYW5kIGZyaWVuZHMsIEFubiB3YXMsCidjYXVzZSBzaGUgY2xl +YXJlZCBhbGwgbXkgbGVmdC1oYW5kIHByaXZzIGJpdHMgc28gSSBjb3VsZG4n +dCBsb2dvdXQuICBBbmQgc2hlCmRpc2FibGVkIHRoZSBUUkVQTEFDRSBjb21t +YW5kIHNvIEkgY291bGRuJ3QgY3JvY2sgaW4gYW4gWENUIFswXSBpbnN0cnVj +dGlvbiwKY2F1c2UgYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiBpbnRlcnJ1cHQg +dG8gTUVYRUMsIGFuZCBzbmVhayBpbnRvIE1ERFQuICBZZWFoLApBbm4gd2Fz +IG1ha2luZyBzdXJlLCBhbmQgaXQgd2FzIGFib3V0IGZvdXIgb3IgZml2ZSBo +b3VycyBsYXRlciB0aGF0IENoaWFwcGEKKHJlbWVtYmVyIENoaWFwcGE/ICBU +aGlzIHNvbmcncyBuZXZlciBldmVuIG1lbnRpb25lZCBDaGlhcHBhKSBDaGlh +cHBhIGNhbWUgYnkKYW5kIHdpdGggYSBmZXcgZ3JhdHVpdG91cyBpbnN1bHRz +IHRvIHRoZSBDTFUgaGFja2VycyBiYWlsZWQgdXMgb3V0IG9mIHRoZXJlLAph +bmQgd2Ugd2VudCBvdXQgYW5kIGhhZCBhbm90aGVyIENoaW5lc2UgZGlubmVy +IHRoYXQgY291bGRuJ3QgYmUgYmVhdCwgYW5kCmRpZG4ndCBnZXQgdXAgdW50 +aWwgdGhlIG5leHQgbW9ybmluZyB3aGVuIHdlIGFsbCBoYWQgdG8gZ28gdG8g +TENTIENvbXB1dGF0aW9uYWwKUmVzb3VyY2VzIHN0YWZmIG1lZXRpbmcuCgpX +ZSB3YWxrZWQgaW4sIHNhdCBkb3duLiAgQW5uIGNhbWUgaW4gd2l0aCB0aGUg +UlAwNiBkaXNrIHBhY2sgd2l0aCB0aGUgMjcwMDAKcGFnZXMgd2l0aCB0aGUg +Y29tbWVudHMgYW5kIHRoZSAtUkVBRC0uLVRISVMtIGZpbGVzIGFuZCBhIHR3 +byBsaXRlciBjb2ZmZWUgbXVnLApzYXQgZG93bi4gIEVzdGhlciBGZWxpeCBj +b21lcyBpbiBzYXlzICJBbGwgcmlzZSIsIHdlIHN0b29kIHVwLCBBbm4gc3Rv +b2QgdXAKd2l0aCB0aGUgMjcwMDAgcGFnZSBSUDA2IHBhY2ssIGFuZCBEYXZl +IENsYXJrIGNvbWVzIGluIHdpdGggYW4gSUJNIFBDLiAgSGUgc2l0cwpkb3du +LCB3ZSBzaXQgZG93biwgQW5uIGxvb2tzIGF0IHRoZSBJQk0gUEMuICBUaGVu +IGF0IHRoZSAyNzAwMCBwYWdlIFJQMDYgcGFjaywKdGhlbiBhdCB0aGUgSUJN +IFBDLCB0aGVuIGF0IHRoZSAyNzAwMCBwYWdlIFJQMDYgcGFjaywgYW5kIGJl +Z2FuIHRvIGNyeSwgYmVjYXVzZQpBbm4gaGFkIGNvbWUgdG8gdGhlIHJlYWxp +emF0aW9uIHRoYXQgaXQgd2FzIGEgdHlwaWNhbCBjYXNlIG9mIDM2JTg9PTQg +YW5kIHRoYXQKdGhlcmUgd2FzIG5vIHdheSB0byBkaXNwbGF5IHRob3NlIGxh +c3QgZm91ciBiaXRzLCBhbmQgdGhhdCBEYXZlIHdhc24ndCBnb25uYQpsb29r +IGF0IHRoZSAyNzAwMCBwYWdlcyBvZiBjb3JlIGR1bXBzIGFuZCBwaG90byBm +aWxlcyBvbiB0aGUgUlAwNiBwYWNrIHdpdGggdGhlCmNvbW1lbnRzIGFuZCAt +UkVBRC0uLVRISVMtIGZpbGVzIGV4cGxhaW5pbmcgd2hhdCBlYWNoIG9uZSB3 +YXMgdG8gYmUgdXNlZCBhcwpldmlkZW5jZSBhZ2FpbnN0IHVzLgoKQW5kIHdl +IHdlcmUgcGVybWFuZW50bHkgYXNzaWduZWQgdG8gdGhlIGJhdGNoIGRyZWdz +IHF1ZXVlIGFuZCBoYWQgdG8gcmVidWlsZAp0aGUgYml0dGFibGUgKGluIHRo +ZSBiYXRjaCBkcmVncyBxdWV1ZSkuICBCdXQgdGhhdCdzIG5vdCB3aGF0IEkg +Y2FtZSBoZXJlIHRvCnRhbGsgYWJvdXQuICBJIGNhbWUgaGVyZSB0byB0YWxr +IGFib3V0IERFQy4KIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGV5 +IGdvdCBhIGJ1aWxkaW5nIHVwIHRoZXJlIGluIE1hcmxib3JvIHdoZXJlIHlv +dSB3YWxrIGluIGFuZCBnZXQgYXZlcnRlZCwKZGl2ZXJ0ZWQsIGludmVydGVk +LCByZXZlcnRlZCwgYW5kIHBlcnZlcnRlZC4gIEkgd2VudCB1cCB0aGVyZSBv +bmUgZGF5IHRvIHBpY2sKdXAgYSBuZXcgY29weSBvZiB0aGUgdG9vbHMgdGFw +ZS4gIERyb3ZlIGRvd24gdG8gUGhpbGx5IGZvciBhIEdyZWF0ZnVsIERlYWQK +Y29uY2VydCB0aGUgbmlnaHQgYmVmb3JlLCBzbyBJIGxvb2tlZCBhbmQgZmVs +dCBteSBiZXN0IHdoZW4gSSB3ZW50IGluIHRoYXQKbW9ybmluZy4gICdDYXVz +ZSBJIHdhbnRlZCB0byBsb29rIGxpa2UgYSByZWFsIGxpdmUgdHdlbmV4IGhh +Y2tlciBmcm9tIE1JVC4gIEkKd2FudGVkIHRvIGZlZWwgbGlrZSwgSSB3YW50 +ZWQgdG8gYmUgYSByZWFsIGxpdmUgdHdlbmV4IGhhY2tlciBmcm9tIE1JVC4g +IEkKd2Fsa2VkIGluIGFuZCBJIHdhcyBodW5nIGRvd24sIGJydW5nIGRvd24s +IGh1bmcgdXAsIGFuZCBzcGFjZWQgb3V0LiAgVGhlCnJlY2VwdGlvbmlzdCBo +YW5kcyBiZSBhIHBpZWNlIG9mIHBhcGVyIHNheWluZyAiS2lkLCB0aGUgRURJ +VC0yMCBtYWludGFpbmVycyBhcmUKcG9sbGluZyB1c2VyIG9waW5pb25zIHRv +ZGF5IGFuZCB3b3VsZCBsaWtlIHlvdSB0byBzdG9wIGJ5IHJvb20gNjA0IHdo +aWxlIHlvdSdyZQpoZXJlLiIKCkkgd2Fsa2VkIGluIHRoZXJlIGFuZCBJIHNh +aWQgIkRyb2lkcywgSSB3YW50IHRvIGxvc2UuICBJIG1lYW4sIEkgd2FudCB0 +byBsb3NlLgpJIHdhbnQgdG8gc2VlIGxpbmUgZWRpdG9ycyBvbiBDUlRzIGFu +ZCBudWxscyBpbiBteSBmaWxlcy4gIFdyaXRlIDM2IGJpdCBhc2NpaQp0aGF0 +IGNhbid0IGJlIHJlYWQgZXhjZXB0IHdpdGggdGhlIG1vbml0b3IgZmlsdGVy +aW5nIGl0LiAgSSBtZWFuIExPU0UsIExPU0UsCkxPU0UhIiAgQW5kIEkgc3Rh +cnRlZCBqdW1waW5nIHVwIGFuZCBkb3duIHllbGxpbmcgIkxPU0UsIExPU0Ui +LCBhbmQgS2V2aW4KUGFldHpvbGQgY2FtZSBpbiB3ZWFyaW5nIGhpcyBtb29z +ZSBlYXIgaGF0IGFuZCBzdGFydGVkIGp1bXBpbmcgdXAgYW5kIGRvd24gd2l0 +aAptZSB5ZWxsaW5nICJMT1NFLCBMT1NFIiwgYW5kIGEgREVDIHNhbGVzIHJl +cCBjYW1lIG92ZXIsIHB1dCBhbiBhcm0gYXJvdW5kIG15CnNob3VsZGVyLCBh +bmQgc2FpZCAiSG93J2QgeW91IGxpa2UgbWUgdG8gc2hvdyB5b3UgYSAqcmVh +bCogZWRpdG9yIHRoYXQgaGFzCm1hY3JvcyBhbmQgdGhpbmdzIGxpa2UgdGhh +dD8gIFdlIGhhdmUgb25lLCBpdCdzIGNhbGxlZCBUVi4uLi4iCgpEaWRuJ3Qg +ZmVlbCB0b28gZ29vZCBhYm91dCBpdC4KClByb2NlZWRlZCBvbiBkb3duIHRo +ZSBoYWxsIGdldHRpbmcgbW9yZSBkaXZlcnNpb25zIGFuZCBwZXJ2ZXJzaW9u +cy4gIE1hbiwgSSB3YXMKaW4gdGhlcmUgZm9yIHR3byBob3VycywgdGhyZWUg +aG91cnMsIGZvdXIgaG91cnMsIEkgd2FzIGluIHRoZXJlIGZvciBhIGxvbmcK +dGltZSwgYW5kIHRoZXkgd2FzIGRvaW5nIGFsbCBraW5kcyBvZiBtZWFuIG5h +c3R5IHVnbHkgdGhpbmdzLCBhbmQgSSB3YXMganVzdApoYXZpbmcgYSB0b3Vn +aCB0aW1lIHRoZXJlLiAgVGhleSB3YXMgZGl2ZXJ0aW5nIGFuZCBpbnZlcnRp +bmcgZXZlcnkgc2luZ2xlIHBhcnQKb2YgbWUgYW5kIHRoZXkgd2FzIGxlYXZp +bmcgbm8gYml0IHVudG91Y2hlZC4KCkZpbmFsbHkgSSBnb3QgdG8gdGhlIHZl +cnkgbGFzdCBvZmZpY2UgKEknZCBiZWVuIGluIGFsbCB0aGUgcmVzdCksIHRo +ZSB2ZXJ5IGxhc3QKZGVzaywgYWZ0ZXIgdGhhdCB3aG9sZSBiaWcgdGhpbmcg +dGhlcmUsIGFuZCBJIHdhbGsgb3ZlciBhbmQgc2F5ICJ3aGF0IGRvIHlvdQp3 +YW50PyIgYW5kIHRoZSBtYW4gc2F5cyAiS2lkLCB3ZSBvbmx5IGdvdCBvbmUg +cXVlc3Rpb246IGhhdmUgeW91IGV2ZXIgYmVlbgpkZXdoZWVsZWQ/IgoKU28g +SSBwcm9jZWVkZWQgdG8gdGVsbCBoaW0gdGhlIHN0b3J5IG9mIHRoZSAxMDYw +MCBwYWdlIGZpdmUgcGFjayBQUzogIHdpdGggZnVsbApvcmNoZXN0cmF0aW9u +IGFuZCBmaXZlIHBhcnQgaGFybW9ueSBhbmQgb3RoZXIgcGhlbm9tZW5hIGFu +ZCBoZSBzdG9wcGVkIG1lIHJpZ2h0CnRoZXJlIGFuZCBzYWlkICJLaWQsIGRp +ZCB5b3UgZXZlciBnZXQgaGF1bGVkIG9uIHRoZSBjYXJwZXQgZm9yIGl0PyIK +ClNvIEkgcHJvY2VlZGVkIHRvIHRlbGwgaGltIGFib3V0IHRoZSAyNzAwMCBw +YWdlIFJQMDYgcGFjayB3aXRoIHRoZSBjb21tZW50cyBhbmQKdGhlIC1SRUFE +LS4tVEhJUy0gZmlsZXMgYW5kIGhlIHN0b3BwZWQgbWUgcmlnaHQgdGhlcmUg +YW5kIHNhaWQgIktpZCwgSSB3YW50IHlvdQp0byBnbyBzaXQgb3ZlciB0aGVy +ZSBvbiB0aGF0IGJlbmNoIG1hcmtlZCBMYXJnZSBTeXN0ZW1zIFNJRy4gIE5P +VywgS0lEISIKCkksIEkgd2Fsa2VkIG92ZXIgdG8gdGhlIGJlbmNoIHRoZXJl +Li4uIFNlZSwgdGhlIExDRyBncm91cCBpcyB3aGVyZSB0aGV5IHB1dCB5b3UK +aWYgdGhleSB0aGluayB5b3UgbWF5IG5vdCBiZSBjb21wYXRpYmxlIHdpdGgg +dGhlIHJlc3Qgb2YgREVDJ3MgcHJvZHVjdCBsaW5lLgoKVGhlcmUgd2FzIGFs +bCBraW5kcyBvZiBtZWFuIG5hc3R5IHVnbHkgcGVvcGxlIHRoZXJlIG9uIHRo +ZSBiZW5jaC4uLiBDaGFvc25ldApkZXNpZ25lcnMuLi4gTGlzcCBoYWNrZXJz +Li4uIFRFQ08gaGFja2Vycy4gIFRFQ08gaGFja2VycyByaWdodCB0aGVyZSBv +biB0aGUKYmVuY2ggd2l0aCBtZSEgIEFuZCB0aGUgbWVhbmVzdCBvbmUgb2Yg +dGhlbSwgdGhlIGhhaXJpZXN0IFRFQ08gaGFja2VyIG9mIHRoZW0KYWxsIHdh +cyBjb21pbmcgb3ZlciB0byBtZS4gIEFuZCBoZSB3YXMgbWVhbiBhbmQgbmFz +dHkgYW5kIGhvcnJpYmxlIGFuZAp1bmRvY3VtZW50ZWQgYW5kIGFsbCBraW5k +cyBvZiBzdHVmZi4gIEFuZCBoZSBzYXQgZG93biBuZXh0IHRvIG1lIGFuZCBz +YWlkOgogCi4oNjc1MDQxNjQwNzQ0LmY2dzAwNzE0MTAwNDc0NS5mNnc2NDM3 +MDAwMDAwMDAuZjYpLC5meCpbMEBmdF5dMCR3XlwKCkFuZCBJIHNhaWQgIkkg +ZGlkbid0IGdldCBub3RoaW5nLCBJIGhhZCB0byByZWJ1aWxkIHRoZSBiaXR0 +YWJsZSBpbiBxdWV1ZSBzaXgiCmFuZCBoZSBzYWlkOgogCi4oNjc1MDQxNjQw +MDY3LmY2dzQxNjMwMDcxNTc2NS5mNncwMDQ0NDU2NzUwNDUuZjYKICA0NTU0 +NDU0NDAwNDYuZjZ3NTc2MjAwNTM1MTQ0LmY2dzM3MDAwMDAwMDAwMC5mNgop +LC5meCpbMEBmdF5dMCR3XlwKCkFuZCBJIHNhaWQgIkxpdHRlcmluZyIuICBB +bmQgdGhleSBhbGwgbW92ZWQgYXdheSBmcm9tIG1lIG9uIHRoZSBiZW5jaCB0 +aGVyZSwKd2l0aCB0aGUgaGFpcnkgZXllYmFsbCBhbmQgYWxsIGtpbmRzIG9m +IG1lYW4gbmFzdHkgdWdseSBzdHVmZiB1bnRpbCBJIHNhaWQgImFuZAptYWtp +bmcgdW5kb2N1bWVudGVkIGNoYW5nZXMgdG8gdGhlIGRlZmF1bHQgRU1BQ1Mg +a2V5IGJpbmRpbmdzIi4gIEFuZCB0aGV5IGFsbApjYW1lIGJhY2ssIHNob29r +IG15IGhhbmQsIGFuZCB3ZSBoYWQgYSBncmVhdCB0aW1lIG9uIHRoZSBiZW5j +aCB0YWxraW5nIGFib3V0CkNoYW9zbmV0IGhhY2tpbmcgYW5kIExpc3AgaW50 +ZXJwcmV0ZXJzIHdyaXR0ZW4gaW4gVEVDTywgYW5kIGV2ZXJ5dGhpbmcgd2Fz +CmZpbmUuICBBbmQgd2Ugd2VyZSBlYXRpbmcgUGVraW5nIHJhdnMgYW5kIHNt +b2tpbmcgYWxsIGtpbmRzIG9mIHRoaW5ncyB1bnRpbCB0aGUKZ3V5IGZyb20g +RERDIGNhbWUgb3ZlciwgaGFkIHNvbWUgcGFwZXIgaW4gaGlzIGhhbmQsIHNh +aWQ6CgpLSURTLVRISVMtU1BSLUZPUk0tSEFTLUZJRlRZLUVJR0hULUxJTkVT +LVRISVJUWS1TRVZFTi1CT1hFUy1BTictU0lYVFktRUlHSFQKUVVFU1RJT05T +LVdFLVdBTlQtVE8tS05PVy1USEUtREVUQUlMUy1PRi1USEUtQlVHLVRIRS1M +T0FELUZBQ1RPUi1XSEVOLUlUCkhBUFBFTkVELUFORC1BTlktT1RIRVItS0lO +RC1PRi1USElORy1ZT1UtR09ULVRPLVNBWS1XRS1XQU5ULVRPLUtOT1ctVEhF +LUYtUwpHVVknUy1OQU1FLUFORC1IT1ctTUFOWS1UUkFDS1MtT04tWU9VUi1U +QVBFLURSSVZFLUFORC1BTlktT1RIRVItS0lORC1PRi1USElORwpZT1UtR09U +LVRPLVNBWQoKYW5kIGhlIHRhbGtlZCBmb3IgZm9ydHktZml2ZSBtaW51dGVz +IGFuZCBub2JvZHkgdW5kZXJzdG9vZCBhIHdvcmQgdGhhdCBoZSBzYWlkCm9y +IHdoeSB3ZSB3ZXJlIGRvaW5nIHRoaXMgYnV0IHdlIGhhZCBmdW4gZmlsbGlu +ZyBvdXQgdGhlIGZvcm1zIGluIHRyaXBsaWNhdGUKYW5kIHNwZWN1bGF0aW5n +IG9uIHdoeSB3ZSB3ZXJlIGZpbGxpbmcgb3V0IFNQUnMgb24gdW5zdXBwb3J0 +ZWQgcHJvZHVjdHMuCgpJIGZpbGxlZCBvdXQgdGhlIHNwZWNpYWwgZm9ybSB3 +aXRoIHRoZSBmb3VyLWxldmVsIG1hY3JvIGRlZmluaW5nIG1hY3Jvcy4gIFR5 +cGVkCml0IGluIHRoZXJlIGp1c3QgbGlrZSBpdCB3YXMgYW5kIGV2ZXJ5dGhp +bmcgd2FzIGZpbmUuICBBbmQgSSBwdXQgZG93biBteQprZXlib2FyZCwgYW5k +IEkgc3dpdGNoZWQgYnVmZmVycywgYW5kIHRoZXJlIC4uLiBpbiB0aGUgb3Ro +ZXIgYnVmZmVyLi4uIGNlbnRlcmVkCmluIHRoZSBvdGhlciBidWZmZXIuLi4g +YXdheSBmcm9tIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgYnVmZmVyLi4uIGlu +CnBhcmVudGhlc2VzLCBjYXBpdGFsIGxldHRlcnMsIGluIHJldmVyc2Ugdmlk +ZW8sIHJlYWQgdGhlIGZvbGxvd2luZyB3b3JkczoKCiJLaWQsIGhhdmUgeW91 +IHRha2VuIHRoZSBgYFZNUyBmb3IgVE9QUy0yMCBtYW5hZ2VycycnIGNvdXJz +ZSB5ZXQ/IgoKSSB3YWxrZWQgb3ZlciB0byB0aGUgbWFuIGFuZCBJIHNhaWQg +Ik1pc3RlciwgeW91IGdvdCBhIGxvdCBvZiBkYW1uZWQgZ2FsbAphc2tpbmcg +bWUgaWYgSSd2ZSB0YWtlbiB0aGUgYGBWTVMgZm9yIFRPUFMtMjAgbWFuYWdl +cnMnJyBjb3Vyc2UgeWV0LiAgSSBtZWFuLi4uCkkgbWVhbi4uLiBJIG1lYW4s +IEknbSBzaXR0aW5nIGhlcmUgb24gdGhlIGJlbmNoLCBJJ20gc2l0dGluZyBo +ZXJlIG9uIHRoZSBMQ0cKU0lHIGJlbmNoLCAnY2F1c2UgeW91IHdhbnQgdG8g +a25vdyBpZiBJJ20gYnJhaW5kYW1hZ2VkIGVub3VnaCB0cmFkZSBteSBQRFAt +MTAKZm9yIHBhcnRpYWwgY3JlZGl0IG9uIGEgc3lzdGVtIHRoYXQgZG9lc24n +dCBldmVuIGhhbmRsZSBmaWxlbmFtZSBjb21wbGV0aW9uCmFmdGVyIGJlaW5n +IGEgbGl0dGVyYnVnLiIKCkhlIGxvb2tlZCBhdCBtZSBhbmQgc2FpZCAiS2lk +LCB0aGUgZnJvbnQgb2ZmaWNlIGRvbid0IGxpa2UgeW91ciBraW5kLCBzbyB3 +ZSdyZQpnb2luZyB0byBwdXQgeW91IG9uIG91ciBWQVgvVk1TIG1haWxpbmcg +bGlzdC4iICBBbmQgZnJpZW5kcywgc29tZXdoZXJlIGRvd24gaW4KdGhlIE5F +NDMgcmVjZWl2aW5nIHJvb20gaXMgYSBsYXJnZSB0cmFzaCBiYXJyZWwgd2l0 +aCBhIGJpZyBzaWduIG9uIGl0IHRoYXQgc2F5cwoiVkFYL1ZNUyBkb2N1bWVu +dHMiLgoKQW5kIHRoZSBvbmx5IHJlYXNvbiBJJ20gc2luZ2luZyB5b3UgdGhl +IHNvbmcgbm93IGlzIHRoYXQgc29tZWRheSB5b3UgbWF5IGtub3cKc29tZWJv +ZHkgaW4gYSBzaW1pbGFyIHNpdHVhdGlvbi4uLiBvciB5b3UgbWF5IGJlIGlu +IGEgc2ltaWxhciBzaXR1YXRpb24uICBBbmQKaWYgeW91J3JlIGluIGEgc2l0 +dWF0aW9uIGxpa2UgdGhhdCB0aGVyZSdzIG9ubHkgb25lIHRoaW5nIHlvdSBj +YW4gZG8sIGFuZAp0aGF0J3MgY2FsbCB1cCB0aGUgRGlnaXRhbCBFZHVjYXRp +b25hbCBTZXJ2aWNlcyBvZmZpY2UgbmVhcmVzdCB5b3UgYW5kIHNpbmcKIllv +dSBjYW4gaGFjayBhbnl0aGluZyB5b3Ugd2FudCB3aXRoIFRFQ08gYW5kIERE +VCIgYW5kIGhhbmcgdXAuCgpZb3Uga25vdywgaWYgb25lIHBlcnNvbiwganVz +dCBvbmUgcGVyc29uLCBkb2VzIGl0LCB0aGV5IG1heSB0aGluayBoZSdzIHJl +YWxseQpkYW5nZXJvdXMgYW5kIHRoZXkgd29uJ3QgdGFrZSBoaXMgbWFjaGlu +ZS4KCkFuZCBpZiB0d28gcGVvcGxlIGRvIGl0LCBpbiBoYXJtb255LCB0aGV5 +IG1heSB0aGluayB0aGV5J3JlIGJvdGggSVRTIGhhY2tlcnMKYW5kIHRoZXkg +d29uJ3QgdG91Y2ggZWl0aGVyIG9mIHRoZW0uCgpBbmQgaWYgdGhyZWUgcGVv +cGxlIGRvIGl0ISAgQ2FuIHlvdSBpbWFnaW5lIHRocmVlIHBlb3BsZSBjYWxs +aW5nIHVwLCBzaW5naW4nIGEKYmFyIG9mICJBbGljZSdzIFBEUC0xMCIgYW5k +IGhhbmdpbmcgdXA/ICBUaGV5IG1heSB0aGluayBpdCdzIGFuIHJlLWltcGxl +bWVudGEtCnRpb24gb2YgdGhlIENoYW9zbmV0IHByb3RvY29sLgoKQW5kIGNh +biB5b3UgaW1hZ2luZSBmaWZ0eSBwZW9wbGUgYSBkYXk/ICBJIHNhaWQgRklG +VFkgcGVvcGxlIGEgZGF5LCBjYWxsaW5nIHVwLApzaW5naW4nIGEgYmFyIG9m +ICJBbGljZSdzIFBEUC0xMCIgYW5kIGhhbmdpbmcgdXA/ICBGcmllbmRzLCB0 +aGV5IG1heSB0aGluayBpdCdzCmEgTU9WRU1FTlQsIGFuZCB0aGF0J3Mgd2hh +dCBpdCBpczogVEhFIDM2LUJJVCBBTlRJLUxPU1NBR0UgTU9WRU1FTlQhICBB +bmQgYWxsCnlvdSBnb3R0YSBkbyB0byBqb2luIGlzIHRvIHNpbmcgaXQgdGhl +IG5leHQgdGltZSBpdCBjb21lcyB1cCB0byB0aGUgaGVhZCBvZiB0aGUKR09M +U1QuCiAKV2l0aCBmZWVsaW4nLgogCiAKWW91IGNhbiBoYWNrIGFueXRoaW5n +IHlvdSB3YW50LCB3aXRoIFRFQ08gYW5kIEREVC4KWW91IGNhbiBoYWNrIGFu +eXRoaW5nIHlvdSB3YW50LCB3aXRoIGp1c3QgVEVDTyBhbmQgRERULgokVSBp +biBhbmQgYmVnaW4gdG8gaGFjay4KVHdpZGRsZSBiaXRzIGluIGEgY29yZSBk +dW1wIGFuZCB3cml0ZSBpdCBiYWNrLgpZb3UgY2FuIGhhY2sgYW55dGhpbmcg +eW91IHdhbnQsIHdpdGggVEVDTyBhbmQgRERULgooQnV0IGJlIGNhcmVmdWwg +dHlwaW5nIDxSRVQ+KQpKdXN0IHdpdGggVEVDTyBhbmQgRERUIQo= + +--16819560-2078917053-688350843:#11603 +Content-Type: MESSAGE/RFC822 +Content-Description: Going deeper + +Date: Thu, 24 Oct 1991 17:08:20 -0700 (PDT) +From: Nathaniel S. Borenstein <nsb@thumper.bellcore.com> +Subject: A Multipart message +MIME-Version: 1.0 +Content-type: multipart/mixed;boundary=foobarbazola +To: nsb@thumper.bellcore.com + +--foobarbazola + +This is a text prefix. +You should be able to read this, no matter where you are. + +Once you've had a chance to read this, interesting things should start to +happen. In particular, a picture and audio should appear, +more or less *in parallel*. + +After that, an atomicmail message will ask you a few questions. +--foobarbazola +Content-type: multipart/parallel;boundary=seconddivider + +--seconddivider +Content-type: image/gif +Content-Transfer-Encoding: base64 +Content-Description: Bunny + +R0lGODdhQAHIAKMAAP///7YAAP+RkbZIALZtSP/akdq2kba2tm1tbf9tbW3/bf//bW1t//9t/23//wAAACwAAAAAQAHIAEAE/lDJSau9OOvNu/9gKI5kaZ5oqq5s675wLM90bd94ru987//AoHBI5D0OyKQy+XgYntBoc7l8FK/YrPAh6Hq9x2X02Sw/BugB +AOAcU98Hq3ZOr5+aazY+z++3x4CBBlNwYVRydomKi3+AZg8BkZKTkmWCl5gGSIRwSk2LoKE6jxKNgQdsCaqqD2ummbCCm3GdtYiiuLkWR3xJfb/Av0jBxHlIUrGXtHJhX85gTLrSobzF1tfY2J1NmFwC0Rjez1+b0+Z0htnq2rXtcR6Etx/iX/Ln96PuqOv8 +xvrt9vAJHDjBkD5j/fr9cxeQoENdBm1VeKVpX0IAx6BEXLjR08OP/rmOGBxZ0FMyQR0XFlIZJ49Bdu9AygSSchOsmiy5RWF56GLMmUBz4Cw0ZijRWDzftFq3FGPDoFBRGN12KYyhq0iT2vL5NOo9iiencgR7EqVWjgnLeSXohGzZt3ADMdNpdpvbsl3X6tV7 +N66jvYADF6wai2JewYgTK17MuPGoXQrsWTnsuLLly5gza97MubOMMjzLeB6dZSjKpXQdASTNukVTPXuKbbIkxczOpJRb694l1w8lSn2TcZolcbfxC20zoYJUJkATVhj9wiIuFtxxwcOHqVPi6BFe6U9ms0kiwMzq61B5KbnInl3worR+Rj4w7plV9DLDtN+P +EXe4cWpt/kDPM/LhJ81G/KV1Vm4GOiZWgtudZV2DmVX3UxsWQbjGAeFJeAiFmE11i0hlwaGah/ExNFFEDIIokBnIHYIXikpJ+Np2Lbo4TXWGcWTTSR7eGGGOOipioUnwcZQMjS0pJFKRPzxCSghHVgGeMkz2pFCBUMbwXmGg2SXll35VmdN81nhCZJczjOnm +m6KNYspsZMa1Jps61vnWnXjimRoZmTTCZ5+E+kmBZJIVqqgJU8ID46KQRirppJRWaumlmGaq6aacuvZmp5Rmh+KgoFY2VVE3FVcqZ1LSyV1RTQSQhhqunKLiqg4OWM8er5IhZRq13sYRrosJmU2dog5LLGCC/pbhUmyuMHflIB3VROqyopD1GiS/TaKncp4A +dC226EzHbbeVRDfItFCEqyy5+PS1HCurJNAKh+zKEl+V48JbA2h9qAlWhnwE960bIsVxZL/+3kEwhBl12Alh4C0zHxL1ZcdwwyVUs9/DHwPql8WlYFwfNFxyTIPHGrYc8J/dVLHLyeSkrDIMHoPsMkz/zGUGgTYXRPM3G9+sAcs7y7bg0c4E2IGuXQRttMO+ +JM2zSkU/HefUK9S0odXCBMn1gQeBHbaNY2e7EEJm9zdq2kZibZPOEGcpNdxB8HjobRpGbLfTeBMh4oqYrJdmEhqZycStgQ9h1Ig/Tqv4Sj1f7Eey/482rkLCi8vHop1/E5cTRjjem7XmGVhbWOhOBMkV6jY8XpVWthW+IHt3w051zyfmBKSNuJ8Ou5mvLLwk +jcbKZrruLCgO1khHTZdl8ml+wnwKkxtce1aspyX8pDCn+maQ+Qob+iYKfr/owVIgz36g51fBz4Q3/xF++dK5CZdY3lUV5ogbydzw3oe/bmyNcHI5BAFRcr1iFVAuDUzMAm8SQcVMkIEVZMzzbvKXDFaIFDAToAdHmLfmkbAxiUrhCTcjD0RYz3qRWeFl4ETD +T8nwhjjMoQ53yMMe+vCHQAyiEIdIxCIa8YhITKISHRemQhxwiWyZHBNgCEVcNFFMY7KF+v6q6IJkyWh12+AiOtxxGviFUYxFMM8b5MKtgtXljGg0gq6gh6/amGFWwWof4+J4A6jVQwx2vCOw2OCGd/GxTa7YFbT8gThqlWGQczrTIRF5kfdwY2mT/ExCDua8 +TL6gDdta5OWulBJrebJrvSmYc8xQiXwFUIunvANKVImuSFxQYqIrRCxHoC1a1tI5BazCHncpIOWc65f3Wlf5ZjMWYh5NmbJgA7qcpa5gdq5nW/yhvFyxigd0c0MPbNe+JOnMvSknFfWyFzjD2S6rhGaXLCpF4aJFTUKyU5xT4JcYW/WGgEXMEaMszLSWYRUv +fkiJ+klQI0l5JfEYRJHVQiLSWv62hMP9E5oje5IhaDacbOLtJR/TTnsy8j6SNWNoV5FohujWtmBw6GCzgNzQykM/IKajpfxBVkoPNVOa5g6HE8XplqZYmG/UNDI9/akMWcZSoTKSIcUTx1GFNjSlnrAaTW2pfyZSH8Ahh2ZWvWpWwYbJrxKIQX4kWhAT6tQN +lTV1UiUS1MJawZu21a20AwEVqUQPj/orInd9KjnLyYGUfA2nYiOsgMrWNuQpNnWMbSwqEvvYQ/2jrY6tbMkue1izMcmvPKxOLySbWcUeya1a/exjLcSM8JC1Iqotp94G41qX4Yt1sq2cOcWpUPPJDY6n5N9EsDRWf+oRN+cJrm5LJv8vw/XiolLMJXAPJUIj +Dq4kcSifQXOyXE74Y0xErJZHNhu5MkX3EGOxiBofVgXQwotzooMckvZ3voW5YqxN2pB739vEvQZwT/Wl3Zb2itDopepv0aVe9biIk76cV03ivJ33qjgUt5yXNoAA3uuWKKI36mN70pOwkzispN5h7XciHrFKT5wk33FPw9mwiFfXipsWlzjErltHS2Zs0xrb +mCHHQ56T6LpU2iXwml/EcY7n96QiOm92KRpJkD87YesuyIDtDU59NxzeK4czfgpWnuYwzMZG7UKKt4wwmKsMN07WN81kiB8T2Dw2Aj64vPi78zbS12Z2JRjOx5VzUF06mz6kJ86Vb7pnzEIzvoOyFa90ahwoFZ2/55EZylr8lgilFMH7URo8BNaWEwu431VJ +Sbs1THVuwscJQGtEs33UH6VLDWvaKprWtY7Mp3Gda1e/Otc98PUggO0DbQmng8QONkoEWpRk523Z3Wi2s5kIq2gTeNpz4DS2PajqbvN625Gp7tHEDW4ctLAgcylIuQUHGRWu23Htjve7t3CoM0Nm3sE2Ib5zEQEAOxoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= +--seconddivider +Content-type: audio/basic +Content-Transfer-Encoding: base64 +Content-Description: TV Theme songs + +8vp7cnRvc29ubWxcUebUX0tM1N5bauLZ5ejv2N5772hiX1lVVFdZWWPm0dDU1+LubmZhW1VXXVlfdOnZ0tHPz9TY3/ZgV1VUV2Lw7e/0cmRcV1FPUFZeb+7g2dLOzc7U5HJfYFxYWF/66uni3el0Zl5ZXFtdZnPx4djOyMXGz3FJPkzjXFVf/NfX2dzf5vj2 +fXn39OLe9k46N1zAwM1maM7wVkxLW+bQ1dzi49zW0NDX4mBAOVfHyNDcdHfe4mdbUUtHTnXYz8/U09Ta2dTQ7UhJ1cvnT0VP//fd2O9WRkI+PEVlzsC/yM7PycG+vcpFOO69zF9PbOx+YFJJOzY2MzM8X8i7u7y7uLOxtsRLQ8m+2U5KXurcWVNRRTs3My0q +LkDZv7+8tq+trrHGU9i5vtxUVW3ldFJPRzszMi4qKS9Oxbu8tq6qqay31Me3v9tRT2p3X05IPzwxLi8tKSk0aMO/vrSurKuvvb+ysr/mWGH1Z0tFPz01LS4vLiwvTcO5v8K6tK+wt7evr7nJ6+7qa05DPjs4ListLS0uO9C2tsDBvbm1trKur7W9zeF8Xk1F +Pjo3MSsrLSwtL027rrK9vbq1sa+trrK4v8vacVZORT88OTAqLCsrLDFnubK9wLixraysrrG4vszkaVtaW1tbXllDQlBd7GJLQj04NTg9RlJgeuna0tDV2dfQzczJxcPL6M2+u8VZPDQxMDM4P0pQWmfu3dbb4ePc0czIw7+/zta+t7rdRDg0MzM3PkhPVl58 +4Nra3t/b0szIw7++w9jNu7W67EM5NjY4PEFITFVgde/k3+br4tnPy8XBwdJq28a5uc9SPzk2OD1FTVRn+Ofb2Nbe3tXOysbExMjn787FurnFbEE5PTw4Nj1aU09f4dbZ29nLzc3IysnReOrWzsXBxd1NOzU0NzxBT23h1cvL2e9pX15u8drO1tvN0c/Gv8LU +fltMRkM/Pj08PT9HU23s3dbPycS+vsnMy8vBvsV3RDkxLi4zOj5FSU/XubS0srKys7S2ucJhPzQyPkc5MzAwMC8xOd2qqauqrK6xtLvLTzUxRfpMOjI5UkY6MzNdr7K2sLS1u8TdYExGPjIySeXc63xQPT7PrbPFzMjE2mlNRklOREJKbdTV5djFy7usu9No +SGzb/E5EOS8qLj7nx7/DzNi9paSrtEgzPWDyUz8/PC4wOkZ76lI/SrSpr620vs5RP2DK7z88Uezc1NPV3XTCr8htSzw0KSQkLlXi139R6b2sp6y3ppicqLfhSzcnHR0jKikpIx0dJEq1qqOYkZWXnaq9xHArJztMQTstHxoaHy05b6uorKeoqbG72i86p6m8 +v8s7Jyg38MG1pqm7zkU1LSceFhEorautyllGxqikn5yWmaKpuMZWNiccEw0bNC0eGB03rqGfn5eUmZqfpaiwyz4qHBcoRiQgKC09Rz47YcLHr6Whpq+5x1gsJXGtbU+8vMi4w+G4sdZeRDUtIx0bGxoisaO6v6edn6OjpJ6Yoayyy1UvIh0XDg8pLRwYIEW8 +pJ2dmJGVmZykrMBlPCkaHOndKh0eKCg0RztHwcy+qKOhqa+zzi4uq6fSODhvbLevytO3x0Q9LiojHRscHB6/n7G3qZyfnZ2mp6CmtLrOVDYpHxoVDxcgGh8u5K6kn6KdlpWam5+ntc1FLiQbHicocM/qOygrKCxJW8+rpqu0s7nLTC46XsiioaSwYlZKSr/Q +OjYuKSMeGxodJFN41p2Xk5ijpqmpn6Kzvuw/LiciHBQQGx0YK1Gwo6alqqeZmJydpK24yVY0IhwrLx8rab7IRDw2MzAyXL69zNrOz+o/M1TyPGquop+lqrC+3E5PRzo3NS8tLSorOT452qugnqSqrrrMYVhZT0xBNzQyLisuKy/ptauorK+1vcra19R2WlBA +Pj85LiouX7mvrK+1vM1XQT9LWFdeX0pHU2VGLzq+r62vtbq7yVA/P0VAOzk5ODY6REo3Pbyspqessba7zmpLQj04Nzc2NjY+Tzs317aurK61urrCzuDreUtLcFU+MDlKNC5NvbOwtLi9y9J9VFZST1Rk6eh+7+pnT1RcUklITVNVVFlb69LPzczN0+NfVFRT +Yebc5+PQy9V9Tz8/QUBBSVNq4NXW29TFv8LKzczS9XJgTlVkYFZPU1xeWVJJQUpia+jIt7O3uLvJ1vVOPDY6UVtPT0Y+PD88OtKnqa2tsrrCzWxFNS82S0o9NC43QGmsqq6ts7nG12tJPDg0MDE0Liw1WK+en5+pub/rW0Q3Mi0qKywsKzA/r5udo7XMyLmy +u95EOTIsKSgoKD61tbndW8m8uLu5wcv2SEg/Li25oqeuPzVETE1HPzguJiMnMdqinZ+fs97NxctNKiQzVEw6PLCdoaOseDMuLConHx0fKCwsUJ2Sko6TrkVV2MTORi4mIh4aH0tsWL21JB9Vwaiip6+3ub/UrqWuqqmlvRweIyQuMjI1NTEwOE3NtKujnKo0 +PklNTTEtMUJX07mvrqytr6u9MjhEQTUsLC88OjM+3rmup6Kr32vYzb/eTktGQjcxOU1KPWLNZM63tLS1wOZj9tzg53teSkw+KiktR7musbi7yd3i3t/Px8TXPDU4Nj5GMzXmvbW0tra5v8LBWz9Z3s3ZRDUyMDEuOtK2r7GxtcrWw73E4U5JSkpDOzY1NzI5 +5sO+tLG1u8PN0971eG1eVEY/PDY1Nzvit7KxtLi+xcjS29vwYE9FQTs2OkA+O0nNu7i4urq/xM3o1NF+b/5PPjY2Ozc2RM+7t7rBwcnT0dLS315TVEc9OT9NRkltxLq4uby8xdHkdmtcT09iWUc9PTw3RN7Curq7vsHNbU9e3+lVSU5QSkQ/OT3rwrq3ur7F +xcXM3X5uWElHS01HPkBDTdjHycu7vsy+v83T5uP9WElHSkc7NjU9a9PEvr27vcfSz8ra6eBeV1VJPjg0LS5D4sO7vL67t7m+w9j5Vz84NzU1Oz86PVzOt66xtri7wdlXOzIxLzI7Qk/jwN9S1sW4rq+6zFY+OzYvLTZGx6qwsLfZ4Fp1Tz40LS4vLzBFpJSd +p7G4v95JNSwgHBwcHDKmk5mbn6Wnv1xNNyQbFRIdapyboqOnpamtu10uIB0YEzucrKmiqq/E0EAxKiUhHCmgmaqfoq6tqLM9Jh0aFRTVnb3IzK2oqqmlsOc6Gxyfla6+LiwvKSMgHxwsNs2LiJGWq1c0RDMoHBURDxDOj5idqb6oqK23xkMqHS0mtpK3sD1J +Yy0mIB0aLKOnNJaModREqq/VQSsdHMlcHhlFqigpX7Osnpmdp5edXSQznz0ZEBMVDxgptI+LlKipi5arQxwgHRgREtCdrkYkm6RPyDK2rrr+O7OqKy0vmYytzhoZHxgXFiqdnqw0OI6RlKVduzMlHyTMwyYaCyTCITy8kY6Ynqygma88HR2j0B0RDRIRHzuo +jImSoUuVjarvGx4ZEhAVxJejbBospOinra2lv1kuM8m7s8y0jqVYIBEcFxQRFryWqzHFhYWPmjQ7OSAeHSTcKhQMFD3kl5mUj5ums8CioDUbGLQ9EwwX0jkuKTWljJGfspOOujQWFQ8aXmi6np80GSasQrexsq0+LBkkmY2YsbeTsS0dEx0XEQ4UQ5+voY+C +hZepJywpGhoaHTUrDwwZtpmMjpCTqMBSMuenNBstxB0PFzuwTSQpQaiNlLehjprbIxEYLs3KzjvCxhgYS8i7qrmqxRwfr5+Zj6ZmoqZKKxcZHhALCgwui4mTiIWPnz0tVysZFREPHRMKZpOcl5KVk5u2bz0pP8MbH14hSq7IttMnFxQgsZGdqo+atzISJaKg +r/4tI0w5Fi9fJ3Dfy7I1LKqZnJaTuradzS0bFBoTDAkJFZuBh4qEjZ3BJSksIRwWDw4VGSeamJqSm5+irb5JLSJIyBoiuq2gvTpbIhQTHUSfkaWfkr0mN06lobnELBsbTi0dPS01ukIrsp6XlqaqnKNNqaw1IRMPEgwFDTKbhYWNiouYqkIkJyEWEg4ID1TL +nJarop2fn6PDXk8mH0EdGaealZ7wNyQWDxEb4JSWqJmrL2ipl5arSycbFik0HDc3HScrLquUjo6ar7WlScGpQCgZEw8IBQ0jo4uEio+MlZ/DMzAkGg4IDBy8pK2hrbuon5uisFkvLR0cSr6elpqsPiwfFQ4PGzSllKq+nZWZnZqfvDIeGRYaOyYaHxwbMpmS +ko+YpLTWo6d4tPooGQ8LCA0VIKSQiIaRj5Ccqc81HxQLBQse9Jefs7ZOtp2YnKXRLiQZFEKopJGSotopGxcQDQ8dwpKcPKSRkI+PnbUxGxoXFio5GxwPDDiXj42Lk6K0Q7OdutBOKxwLCRYcFxcvp5GEi4+PmqT+MSMPDBgcGyOdltHSL02pnJyqxzkaDySf +k6KalavTLB8aEg4OEyG3n5qNjY+QkKC5TSIaExIYMiAPCRG2l42Oi5KfrlhZopu8RyAXCggXIh8eSLuji4iPk5SbrjgaDAwdJyIksJe8Py1Bs5uYpbgrFBo5s5SYmZi5Xi8hGBgRDA4PG5SHjI2Tjo+hyUQsHxsTDx4eDRsmLq2WjIuRnaKvzLWr1zUaDhwt +JR0aJE3dtZiTl5yoy0InFh4+P0s8Sa6pu7LC676yvzkiGSDBt8V3zqOhvLjCYVI5LSgqJSTfr6mwvqScrLPIRl9fRyseGRs6yLm3uamftbOst7hmSEQyHxwuVFhFNm+lq6usxbi6w9c8KCw8Pz9CRv2xy9WzyMXRzsA/IyxV2MLGZFCrqcK52dNNNzUpIDDV +z+rTwM2ooq6sv9FDMjIrICQ1Slla19Gqn66xvbu5zEQuKCw+RUpNRzlau8KyrbO3vdNIMjFgyM9uPDFJsbnXzM/K1WNHPjZARkJc3tvXraq0uNdnWkg4KiEvatbZ6uXYr6mzrrO9zT0vKCUvOz5W7F1OuqSqp6/Q3GFPNC88V0c6Nzg5XK+/vLK7vsz4TE5P +XubX1FY1OMfP18dcTE9ANkPZu7rXYlVMZq+vvrr2RDUwM0FORExd8fTj46qktLjOxsVoODI0NDQ0NzxOUbirsqqtt8hUOztFS0ZFRDcsLNOptbq8w8nhXERdzNNNQljuTd2uwVNIRkdESkZT89bDv9L0TPStrbjA1Fg5LCYvWHZYYllcWM2qp7G61EdFUElF +RzwzODw6PE21qbu9uLe84lRT8ONPT1A/Nis3yMe6vcbL18zGv8Pb6Gs8NjvhtuNNTlZMPEJa29JZVsa7x2PVsLa6vuFSNi0pKjdLbNzrZ92zo6iurrz9NTI7SVY7LjA6OTtnr622uMPCzdtiW9nE1lZJPDIzV3pS1MvUalLPurvCy+tVSTk43rbJ3UI6TkdE +ZdTd09bjd1dXw6+6tLfZSz04ODYzPklQXk1GvKOmrbPG3lQ+R0c6OzgxMjo9U7mysay7zn9d295MUM7HbD02O87F481PQENATcO7x9fp+G585L27xb12NDM/R0pCR3bIxs/19r+0v7yyxVc5NTw+Ojs+PkdbY82pqKuy21pIRlRNPj8/OC41QVW6tbSvuL/Z +Vunac1ppz19FPj7Sv9fuSD9GT3jwxb6/xllBT+S2sMLIYj4xMz08SElX19997+W5q7G7035SUk45OTtIXkM7SGXDrqywu95BPkdNbWxkfk47OUTkta+6zGts2dbpX1FLRUNHR0pXxrm9vdtPRkpUU2F/XVBKREBPs6qxudNSPkFKQkFEPj9AaMrPuKyvuM5s +T0ZYW0w+PU9EQUZcvK6zudFUUUxFP2X9YFZER0laxbi9xNRVS/nvWv5r4O1HRkhOzrrA9/RxUldJTevaz+NNTFxs4buwvclmTlVGQkRGTEI7PEbsw6+rs7S/1+tPRkJAOzQ0O0NJUb2rr7jJaWRaUkVDT1xoaWXy276zxX9MPkVCRExh693Vy8TJ1Me2vMpm +Pj5AP0BNa9LfTkdNb825uL2+zvJYSldfQjk0OD5JZNC1rbC1v8LGW0xKTE04LjA6S3LFtbe1wu1eTeXR3OllX313ee3Cu/BFPERJPkhf7uZeWeHJvr+6tLvUS0NCODk9P0xVbGFSUdm3sLa+xtftTUhSZE88ODhLaN2/srPAzt7Y39zkZ0hDRz9BRUtjz8K/ +wcrdVkti3PxiXVRWVVTexLrBdkE8Slnt5FpKSUt/zb+1tbO+zO1KPzw8PDs8RlHi1eLZv7Cwub/Pb09IUU5CPzk2OU7TyL7BzMnT3c/IvcVePzw/PT5LWtjP587V9nla+dfY4/vrbvrS0sW/0dhQOTk/WupuZGlqb9G6uLGxzl5JPT4/Q0Y+PkNPTmrJysO3 +t7rB08zZ/VlMRTo7NzQ8Tty8vMDM5cu/vcTL6UY+PUNUZ97CyvpvTU3n1GxWTEhe7dTEx8i6udJlRzxBR0ZNTkteaXjJv7+3s8dgQzpAWF1OQjk9RUjrw7+9t7zHzdDLyNZnTTo3OTo/Uu7QwMHKzdvVvsDM0vNQPj5KWmP21+BPUFlOW3T38/ztbGTVw7/G +xL7cUEtDQ0RLT0FARFHozbqzs7O/3W1gZUU+QTk3NkXt7tLAuLO8xtLYxdlfRz5GPDo/QU/qycJ/UmfZyM2+w31oT09ZW2xfbtpnR0Bezn5282T8du3YzsK+v8HE0FJLWklISEFDOzxK9cy/trW3vNN452ZfTz86NDQ7XOXnzsjBwcnLx8fHz3lLREM/R0pN +bdvK0Xvx08nIxsn0Vko/RVfy1N7l6mBr2M/pZGFORVb8283Hvsbb5XpYVFVNQT5BQEZHWdnHurS3vcbR325tU0I9PD88PFDfysbLx8rDur29xtxPOTs+PkVQZ3T4zt/szsa7x9PRf1NNR0ZKXV9Y8mhkYl7Kyu9oW1JV28fJwsfV21lVa1ZfXE1JRUhJXd/M +vr++t7vEzXhtWVJMQj8+SU1R2NLs2NnLvcbLwXde70ZDTl9PUU5DT2rb4Xj179rgz8fW3HtUYGFRTkZKd9jb2Np7fOt83MnEvsthUEVDZsm/yOpKQEZBQ09X2cjKv75n4sDL121NQD42NELYuM5fz1VE8ca5vL/Ob1Q/P3RGP9njWEdMVdzGxsPCvcDKzEg/ ++ExBRUFJQE/m1sO4tsta2Ng4etlIT0NIP0Bcyru2t87sw080dUs7R01ifObj2MK4tsTnz0cuU/9HXF1ZWlV7yLWsrbnS2TorOzw2RWnv7P9u3Mm8tLS3tvo0PDYvP3FrUkE6S8S0rquts3E5Pjg3Rtj7Sz4zOP26sq6srsBqRzw1MUvg+lc9Nk/Ata2ts8Ru +Pjc5MT3h3l46LTbMqqGkq7t7Oy8vKi5MUFA+Lix3opyfpLHKSjUwKClHWEczJyA4n5aZn67KRS8rKDPO0U0wJh4mrZmbn63CbjYpLVvBy08xKB8fWp2bnqjEUi4iNrOst2oxJh8eL6qam5+xezUiLbyzvN04KyQgLr6inZ6mvkclIGOyt8M/KyEdJdShm5qf +uE0pHS66rrJgKx8bHTmnnJqdrdE4JivPrK7LMCIcGS2km5yers06JibuqKe3OSUbFSWgmZyertwwHyTIqqq+NyYeFx+klpqfr8ovHTCxrrDXMyIdGRu6lZabprkuHPimr7tfPyccGBkxnZecpLc4H9GgqK3JVy0eGBgmuZ2coro3HT+eoKW00TghGRcidKad +n630HyGqoKOt2zsmHRgeSaKXm6jMKBxqoqKnyzgjGxgcRJ+WmqXELhwwqJ+kxDsmHBcVL56Ym6bBNR02pZ6fskkmHRkVJqCbnqfFLBxKnpyerlEnGxkXIKaanqLMJB+5nqCltk4qHBsdH7ydn560JiS4n6KswT8sHxoaH2Khnp6pLCK9n5+nsWItHxoXHT2v +pKCkTiDjnJugsN41JBwYGzSyp6erySQvo5qcpb8/JRwZGSm3oqGrzSUhtZuaoLtEJRsbGiiunqKszCshyZybn7s6IhscGx+0m56kyiYivJybn69KJBkZGx7Fnp+k6iEurpyaoa1LJRsbHR9IqqOlWx8+qp2bpKtxKh8bGh9Dv62juypDrJ+bo6rlLCMeGhw8 +xLqnrzZDqZ2Zo63dLSEcGho8uMyvrUUvuZ6XnavIMiYeHBktuMe7tkor96GXmqazQSgdHBwrxLqxuEEiNKiWlJ+tRicdGhokzaqotDwgO6aYlaGuRiUdGxsjS66lrjkj6qialJ+tVSYeHBsjR8Cxch4eZ72kl5ufrG0/Pzg5PDQ6LBccT8momZygp7jNc0ZA +RjUuKRgaP2y5npyfprbI0Vk/RD8zLh0YMNm1n5+oqrXI6UtJ7WM0KR4YJ9K3npujqLTH2k1FXVw6KyAXHVa8o5yjp6+/ye7mzt1ALCEYGjzPq52krLvMx9XQxMTXQCYYGzNTuqSnr7rMx9bOwMncRygdKT5YuqSjssHiytxx62BtSycfMkz0u6WgrbjZYEhE +TkE+OyghN0xN1a2hrbztWkxDTVh53zkmOWFe4ryruutCPkpjwb/SytIvOexR+8uxvt5bTlhJWkkzMMxeObm6uLarr8LkRjswNjkvNsYtKLitqqihpbjQRzQoIyMqbkRHy7Oprq+rrNE8KyYkKuitrKG58LfL2VtXUiwkIiM9sqGVmZ+zejskJCQqLSMn26ud +mZ+jrX4mIScoIiAttJ+cmaKrwVw1KCIdIR8iQ7uWjJWet0gzJyUkJB4iSSykj6Gdq7hdKh8fJy3Dpjwpm5WotjU9LSEeIiRtornp2I+VuMZBKhYXHzG9obPROcuQlK04HBgZHiuxnaOo1z+fkZ83FxwaGSC1nrevyUyejJNIEBIdJihQpLi72ii4jI+tFQ4a +ICzDmJ6uxSw2lZGlHAwWGiM6npmkpugtnYuXRQsOFx4ut5uqq8c5Y46NrxkMFhkke5eaqbRBMKiLmyEMEBsfMqqbrKetWbmLkCcPDhoeJGCdpLSvSU6Miy4XDhgpMtafmquo3DWUkSAaEBQkJDewlZygqlaYjDcaEQ0eKStTn52mo8CqjK0ZFw8dKio8oJSg +p7jUk5YdFA8YKSgvupacoaG8nY1tExISJSksP5+bqqO8rY6lFhIQHjQvOKiUn6Guu5GdGRMOFionLOCal5+fo5ObJBgSFCspISutl5+inpqdQRwYFixELz3Bm56rn6qy3B4aFiA6LznlmZCeoK68uSMZFRw6Li5Ho5Sfpp2lxSYZGBs6OTFUspiYn5+lqS8Y +FxUkNio3SKKUmpmZnMwcFRYiNikmKdGcoJ+amKkpGxssRDE0LmSfoqikr7QrHB4kPEY9LnObmJaaU8EqFRgcP2w9OOyel5SWM7y8GhURHTNE0bWek46QQT+uIhcTGSEeIjezkYuMo+CkLRsZGSMmJiorsZeRlbikxC4kGyk2OTMtyZuaoTRMvzQuJ0NgPDg4 +xJmTls0lKxYXIUW+v7/X25+Qj6YsORwRDxIhSbKmoZaKjKgvyzcZEREVFRYmrpOEhZm5rb0mGRocHBkcISacipihmpi6Ix4jKyooNDetmi0Y6Jaaxj85MzMvRcOhj6oaGiYnHje6r6q69bygjZI1HywtGw8PGEmkopuUiYqyJTRxMRgQERITFzmYhICMxtSw +0CgZGhkXFBcer4ySop6YnMMoISMkIyQor5U0FSKnkJm1RjMpLDxdn47SHBweKCZftay0uL/En4udLispNiEVCxA+pJ2clomQTlPjr+oiDgwODRBlk4SAl7a2pqHCIBUWDg4SGVmMkJuamJKgRh4lHRscHj6bzRIfooqNmzgwJR4qOLSToRsYGTFvsLS4tVxn +VqiPmUcvKDdAJQ8NHtagopWNmLHJybq0zxoLDA0WKJyJjpKcpaShoUYSERITFRk61ZqRk5KUlqsfGyEcHyA9Lh0cM5iNi5HiIicgLz+8uDEoJCooxZKcXt86Rlyvn7JqNTg8UWQcDCO0qJ6clqW/ybSvsLUvDgkMDjKWjZOXoaeloJutHAsODxMgMS+akJKP +lpWePRYZGhorKxIdNd6Zj4uMniQeJSZ6+RogQCs6PqmWl7pLzT7Gsigot2bMV0BLMx8d3rOfmL8rs7Gpo7K5SRwKDBRHlJzGoJufm56epkoPCw4PISYqn5GTj5SWm6clFBcUHyEPEi2vjouMjpfXGiEiOzoVEyUsOMGjj42bPjEuTn4gIjzZROZbSnbdNdus +o6wnKmykqKisxk8uFA4eRLP9wKeam5uanqnIIg4QFBYWId6Xjo6Pl5ykxBwYGxgOCxA1npiNjY+Tny8eLCoaDg8cT2SqmpWRlq0yV0YnGRkmw8jLwdrGsad+vKs/Ih8uqqGmpLpiMiYUHLPZLjlApZebl52pvEEXDhgPDyXHnI6UlZabn6c5GB4OCAsPLZuP +jIuQmJysKjIdDA4OGD3IqpaWj4+W2jk3FRcWGjy1v7jFsZ+fs7uuKRwcIfugp66vv3pBLSxKIygvPbeamJ2dqb9SLhgZFRUcIrmUjZGVm6Grzx8YEwwNECSpkI+PkZWapFUfGA4ODhMorqCYj4+SmKc1HxkWFBYh0b3FsKSalZW+KCEeICMvvKu0s77Cw69S +Ijs2MDFBqZufo6+9wc4mDREdHj21nZKXmJuiqLQ7EA0PDRMoxJqPjo6Vmp2oHg4PDRIWHs2cmJmTj5GU6xYZFRUWGkOuvq+dmJ2VnyImIx4jIjq1zcCutrCephseNC1HScigoq+svr6zVhIOHR9Dw7ialJqanqWoyBcKDQ4ZLEadj5OTlJaXni4NDQ4QFhcx +nJiSjpGQlawbEhQTFhgeZ8C1mpeTjpdGGx0dHyMjRrzCtL6ym5tIIiotNT9KvqWsr76/rskkFRwdKr65pZiYm6Gtq8MtEAsOFjo41paRkJGYmqbgGQsNDxUZKaGZmY6QkpefQxEQERMWGi7CqZaVlZCVpCQbHRodHCbht7Kyq5ubn1QkKyQsLDC5rLSvtbrX +3jIcJjZHa0ytnqShqLC8zScNDhsrQcSilJeZm6WrsUMSDRESGCa7m5OPj5WcoLMdDxQSFRkcR6eYk5WQk5jOGBkXFRscLr3DtKiZl5ufMigqHyQgLbS2u7C9xrioPB87Nz0+T6eosKqvt73qGw8iLy/luJ6Ynp6kq7nLJQ8SEhQnY6SSk5SXm6KuQRMQFBQY +FyWomJaPj5KZqiMUGRYXGB/ryOSnl5SSlbkkIx0cHCF8tMS5ubqunq8yUj0wLCdbr7avsLS6zjEYHzMxzMqqnKKorbGyvEkZDhEUJlC0k4+Ulp2ms9AhDxESEhUdrpSWj46Rl5/+FhIUExcaL8vOoZOUk5GcMRscFhgbLLm/urO9qZmavDI4JyEiKru3u62y +ssX9MiMwP05iXqqir6uvs7/XNhMOFiRltpmQmJufqLTDThgNERAUG9mUkY6OlJqksSUPEhITFxxQtKCTk4+Ql7QaFRYVGR1EtsO9u6GWlprOKiccHR0ysrSxub6+va3FKz1LRzhCra+2uL+/y+0kDxgxR8+plpaeoq++y8wxEQ4REhxmmpCPkJaepqxxGQ4S +EBQXKq+aj4+QlJiiMRQTExUYIsi8uKyck5GSpSUcHBgYHW26vrO5vraenOw4Ti0kJOK0xbm8ws/NShwZPE/QuqSao6att8fWWR8ODxIdWKeQjpGWn6myvDARDhAQEhq0lJCOj5OaosgaDxMSFRcywsOilJCTkZldGBgWFRgqvMu5u76umJGhPS8sIR8ow7+6 +tcj9S1M9Kjvi6dbPoaCoqrbBbEYtFAwSH+Svl5CXmJ2kt81SHw0ODw8Y1ZGQjo6WnqivOBMPExAVH2LLoI+OkJOZriIUFxMWHT931b29pJSQl6woJh0aIEPC3Mls6U5OvaxNQ9BATrqnr663w1s7NCEPETLjvJ6TmJyhqbLD2TEVCw4OF8iSkJCQmJ6pr9Yj +DxAQDxguwJ2Nj5CUm6RVFxATEhorTUDbu52Pj5GcNxkcGRoq3+vhb0pO/6SWqDFCMypMra+8uczYQTwyHhYuz22rm5uko6uvv+tEIg4KDxjElZCTlZuhqLTBQRgLDQ4TJ66Wjo+RlJylvCgODxARHj1JT66XjY+Rl64cEhcVIE31Qko9Trmbj5fKJikgJ9i3 +wcToT0s7NTw7MUlP3KifqKuwubvPRS4bCw0f052UlZmdpamvv3stEAsODh2sko+Qk5eep7DrHA0PDxUrOUiokY6RlJmjPhQUFRctPC82PlKulY6Sni4dIB49vt1hSTw4OT/Cn7IuQznWpaqwt7vCXzsxKxgOJciwmZeeoqeqsL3fPB4MCw8Wr5GTlZaanqix +wjsVDA8PHDRDppGPk5SbpLUnEhUVHDQuLzZPqJKQlZixHxsfJuXmRz80NTY/tJiaSCw6Nbyts7bJeEQ1Li4pHSXQ1qWboKSprLS+cTspFQsOGbySl5eYnaGnrLriJw4LDhQtX5+QkpWYnaSs3xwQFBYlKyg3f5+RkpeapTkYGx428jg4LzE0TKmWlqwsJClG +rr2+zVY7MTAtNVBLPEy7n6SoqK62x2k0KyISDBrOmZiamp+lqqu7dTUZCwwRH8udkpaXmp2lr7g2FQ8SGSorNtCdk5WYnKO7JBgcIz44LzAvON+flZed0h8gK9C7ztRFNi8wMkyrpEAwW7ipr6y3xd5PNSsrHxMaz6WbnZ+lq620wvNFKBMLDxvNmpWZnJ6j +qK614CURDxUiLTK+m5OXmp+mrHMdFh0sMysvLzXSnJWanKkwGyNBzHZVOS8yNTFCo5mwLC/wsLCvtct9QTIrLSshIEayoZ6kp62ts75aPC4fEA0X25mYmpyhqKuvuMY7Gg4PHCw0tZmXm5yhrK67MRcWIS4rLDA3wZyWnZ2j0R8bLF5sRTwvLi42cJ+VoVIn +Nr2vt7vOZDsuKiowN0xLdKugp6mrr7vTSTIuJxoOE12Zmp6eo6essMbbSSURDhkpNrOXmJyepK2ys/8gExkoLS0zOLuZl56hpbE7HB8+Ujo2Mi8zONWfmJ6uLCFPt7vC2UA2MS4qL02tvy7DpquurrfB2EcxLS0mGRI5nJ2enqetr7XL+04wHg8SJDyslpme +n6WuurzjMxkSHysrNEixmZmeo6ivzykYJD83NDYwMTy6nZufpdshKMzMdnFDODMxLC7Un6I9N7KstLO60WZDMiwuKyQdLqWeoKKor7S73EQ6MScaDxlBppibnqKqsL7L6zsjEhQpLzFPqJmcnqKttso/HRgrODM5ODQ/rJmcn6K1Lxww21tRQTUxNDM2vZye +vTI/try8v/xIPjYtLC0tOEvOpZ+kqLK9zHNCOjMrIhYUNJ+anJ2jrLTA3U06LhwSHC8x2Z6XnZ+irbnNUCgXHDEvMzw3Q6eYnaClslogHz1HPUU3Ly4zPK6an6pPKWq6ycd3PjIyMC4uMMetVrufp6uvvvxNQjYyLSkeFCadmZ2cpLDBxutOOy4kFRMmOMqa +l5+ipq+9zVAzHBQhNS87Qd6imp2fo7HTLxohQDs/PTAsL1ujmJ6jsysp089tZj0wLC0tMkWtnshGq6evsMNMODcxLi4rJx4lppqenaSyyORNPTwwKR0TGjywmJeeoqq0wMxVNycWFis2Nk60m5qfoaauyUEfFyk8Mjo2LzHPnZidoa4+Hi3dSUhBMi0uLjPZ +n5usP02stcDJSjg0MS4wLy0yQr6enKGotMlpRDc3NC0nGhMtoZeZnKCtutliRjYsHhMcOTVNppeanqOttc1KKRcZMjEvNzhAsJqbnp+r0CYcN0U2OzMvLjA0upqZobsw7LPS70Y8My4rLC8x8qu/tpyjrbrMVzwzLy8rKSIXIZ2Vm52jrcLvRz01LycYFCg+ +9Z6Wmp6jrr3aSDIfFSA4LTAyWqOXm56grME3HB9BODIuLC0sPKqXmp+pPCrXz0g+My8rKisuOq+brFyoorO+fEY2MC4sKysrIiellZydpbHHbkk6NC4qHxQZP7WZlpyepq/E5kc0KRgVJy4sOcydmJudoq3BVCUYKTssLSkpLX6el5udpM4kL89APzctKCgr +L1WjmKDW5ai1yN0+NC8vLCsqKzhbt5ybn6a46Uk/OjUtKCYbEimjl5ecoKq1x/lAMSwfEhkvLD2tmZqdnaKtyV81GhkxListKi7Ampeanqe3Lx4+TTU3LCclKC/AnJmdqzvltd/kPjEsKSkrKy35pa6um6GpufZDNTIwLCYmJRofoJWZmp+sxN1fQzItKBoT +IzNIoZeanqCoss5SOiYXHi4mLCs3r5qZnJ+puEsiI0YzMiwmJSY1r5manqToNMbeR0IyLScoKywvvZugvaGgsrt5RzIvMC0mJCgkKKWUnJyjr8xcWUExKiggFhkybp6WnJ6lrLfKTjwuHRgoKCUtRKSZm5yfrL3YMR8uOSkqJicoOqaXmp6iuDE+yT06Misn +JSgsObGanK+xo7bVbz82LiwpJiMlLU6rmJugpLLIaUw+NiskIBwYKLedmJyepKy6zFg5LygaHSskK3efmZydoqu/aUEmIjcrJCQjKEihmJueprNVLmBNMS8pJiQlKUWmmZ2itrCv22I9NC0pJycmJS+yoZ+Zn6m5y2xAODEsJSEgHSGumJqdn6m6zNxbOi4o +HxskKSvHnZqfoaixxvRIMyUoLCQkIylhn5qdnqaz1D47VDguKCQjIyhQn5mdoKu9uclXPDEtJiIjJyc7qJyinp+su/JQOTAvLSYiIyIpsJibnqOtvvRdTjsvLCUeICgwtZucoKWttcNtSzksJyknJiYqy56cnp+qt8tVOzc1LSgjIiIm/p2Znp+oudDbWDou +KSUgIiUpRaGZnqCmrsDtSzguLCsoIyMoPqianJ6lschuUkg9LyonJiYlM62bnqOos77NZj84NzEmIiYlLMKdnqChrLzW4e0/Li0nISAhKNKcm5+iqKu2V0o8LSkiICImKmqfmpubqbe/VT8yLSooJiMiJ22bmKKfqrnfSkE7Ny0oJScyLzCom6KlrbnL2lQ6 +NDI+OiIiJiu0np+io63E53LSxTUnKB8fHym+nJygpK2tqL42OCskIB4fISvMnpydl57Bzlo2LyooIyQjIijYl5GgpKrGc0I6MjAuJyQmMt3gp5ulp6/A7FZNOTIuM2Q2ICg0rp6lpquzyF9KSb3NJiQiHiArtJ2foaexvKynQi0uIx8eHx8stZyeoJuYrUte +NCwpJiIiJCUsvpiPlqmuzEc8My0rLCglJCrOop+epKu32k09PjcwLSxFxyojUaigp6i0vtFYRTx6rz8fIx8gMqqfpKGptcm9pbMsLCUeHh8gLqubn6Ghm51oOzcoJyMfHiInMq+alI+fw808NS4rJiYmJSUobZiTpKSsxWA/NjAzLywpNL3RKdefpKmrvPdf +TT84Qre2KR8jIECmoaqorr7q5q6kVSUnHh4eITWonaKjqaObrDUzKiQhHx4fJTumm5mPlbldQy4sKCUiIyMlJ1KVjJuoqtNHOTErLCwqJyhjr9u9naWsr8pKPT02MzBwrXAgIShgo6WrrrjRZUrSpqwuIiEcHSJNpJ+jpK2wnp3ULC0kHx4eHiRZn5yelJCh +STwvJiUjHx8hIilflouQo7PPODAuKScoJSQmNa+gn5+jrLrfPjQ2Ly0tM7+uOiEwtaOorLPCbUFAQrajyiMfHxwnwaGjpKq3ybCdqTYnJR0cHR4nvZ6foJyVmcAwLiUhIR4dHyIqvZiOjZi6ZDkrKyclJyYiJCrCl4+cp6nMTTgvLi0qKyxEr7svO6WkrK7B +ZEM6NjZVqqs5Hh8fLK2hqKivxnjWp5/AKSEfGx0eLa2doaKjnZikRykpIB4dHR4hL6yZlI2Qp0M2KyQkIiEgHyEnXJSKlKWuyjcuKykoKCcnK82suriioq+00kM2MS8vNcaovSweJU6npKqsut1LRsWjqFEiHh0bHz2mn6SkrKyenbctJCMcHBscIEKhm5uR +j5zRLi0iISAeHh4hJlyVio6ateI3KysmJSUlJCY7rp+anaaqv3s5Ly0tLS47t65vJia8paertNFOPjpEs6O3LRwdHCLRoqOmqLXArZ2maiUgHRocHCHlnp2emZKWqzcoJh8fHRwdHyjLmIyMkqhOOSkmJCIhICEhKcyZjpWoqsBINCwqKCsqK0avtkQ1raCr +rLv1Pjk2M1erqmQiGx4ntaCmqa685c2mn7A2Hh0aGxwmup6eoKCbl5/HKCQgHRwbHB4qt5qSjI+ddC4sIyMgHx4dHyREl4qOnbHEOy4qKScmKCYrzauzr6agqrHFTDcuLy80yam4Ox0eNq6iqau62UxEwqOlxiYbHBkcLayeo6OpqJycqj4hIRwaGhweLaqa +mZCOl64vKyUfHx4dHB4iOpqJjJSr6D0qKSYmJCMiIzWypJuapqq8dj0yLSwsLDm6rs4sH1CopquuxFI/O0qyoq4+HBsbHDumnqWmrriqnJ+7Kh4dGRobHzamm52YkJShViYmHx0cGxscIj2djIuPnl45KyYlJCIfHx8o5Z6RkKKst0s4Ly0oKisrQ7OzcS7b +oKmus8tBNzk3aKmnxigaHB5GpKGorbbOyKWdqU8eHBkYGh9IpJ2fnpmVnK8uIyEcGxobGyBOno+MjZe6MS8mIyIhHh0fITeejYyZrrpGLywsKCUoJirarrnFtqGosrtiPC8zNDi/p7VGHhok+6KlqbHG5Vi3n6K2KxkaGBog+6CfoaOimZmi3yIhHRoZGhsf ++52Wj4yTpDcrKCAgHx0bHSArp4uKkabYSS0rKigjIyQjN7Ospp+lqbXNTjovLjAvRa+txTAbJ76kp6u151tJ7qqfq14cGBkZIsifpaWor6Kanq0uHR0ZGBocIdOcm5aOkpzJKCghHx4dGxsfKa2Mio6Z2T0vKSgmJCAhICjLppyTnq+w7EE0LysrLC/frbfy +JyevpayuvFU+Pj/Fo6a8KxcZGiW6oKerrbuxnZym1h8bGRgaHCe/nJ6ckpGapzYjIx0dGxsbHiuwj4qNk68xLiglJCEeHR8hPKeWjZaytmM3Ly0qJykoNLmuvGQ5rKWysctLNjc4R62ks1seGB0qrqKprbbIzqicoq4vGRoXGBwrsp+hoZqUmJ/DIh8dGxoa +Gx0trJSNjZGePSkqISEfHhsdHyyskIuPo8dpMy0sKSUkJCdirrKvraqosrzhRjUwMTLWqbHGMxkcNqymrK/I71W7n6Cqzx4WGBccMqmipqWkmZiepzcdHRkYGhsdMqaYkI2RmbgpJyIeHh0bGx4mto6Kjpa+PTEoKCYjICEgMLeuppidsrLLSzkvLCwsObWu +v9onHVOprK+260hCYaqfqbI0GBcZHUWmpquprqGZnaK8IhoaFxkaHjyinJiOkpmiPiEhHRwbGRodJL6Oio6QpjUtKSQkIB4dHibVqp+Pkq681ToyLSooKS3ur7u+ZCzZprK1wUw5OT6/o6iy2SEWGR9+payws7+xnZ2kqzwaGBcXGh9foqGdkpKbnrUnHR0a +GRkZGya3j4uOj5r7JygiHx8dHBwgQKiZjY6exVE2KiomIyMlNbq2vra2r620wuk9Ly8wSayntL49HBgovaiutcPx0qadpam+JhYXFxknvKOno5mUmp6mSx0bGhcYGBsor5OMjpGYrSwgIBwdGxkaHS2pkYyNla42LiUkIx8fICfnsbusm5uzu8pCNiwrKzHA +p7O9zy4cMK2vtLzpRkK5n6SrsT8aFBcZLq2orKujmZqgpLkqGRkVFhgbMaiZj42TmKLqIB0cGhoYGRsmqo2LjZCeQycnHyAeHh4fOLazpJGQpc3dNCwoJiYnQa+xwsFmNkmstcDLRDcxU6qjrbHVKxYVHDyqra+1taCboaWtdh4VFxUYHEaln5WOlJqfrzEb +HBkXFxgaIa2MjI+QmbclIR8cHRwcGyfJrJ2Ojpi5PjMlJCEhIizMsb++v6+qs7bNVDguLDO/pauyw0kiFiDarbK3wN2xnp+nrL40FxQVFR/fpqedkpWcn6rNIRgZFRUWGCGvjoyPkZmmOx4eHBsaGRkeRaiWjI2ToDorJR8gHh8jOre6vbKel6rJzTwuKCYo +QK2qt8F4Oh4kurG7wWxCZKifqKu2fCETFBcjvamtp5qWnaCnsz0bFxYUFhgmrpONjpKZoronGxwaGRcYGyunkYyOkZnKJCEeHR0cHSV6ub6ql4+bxVI3KSUiIyrRrLvC1GY+Prqyw9BFNTXBo6irsss5GxMYK7Wss7Com52ipq7FKhYTFBQYKa6ckI6VmaGs +Vh4YGRcWFhggr46MjpCXqDAdHhwbGxscLr25pJKNk6ZCLicgIB8hM7e5xcfQuaiuwMJdOiwqOa+nrrLKUiwYFzezs7q+xaiepKetuksdERMUGDKso5mPlpuhqrkxGRcXFBYXHcKOi46Ql6DKIhscGhoZGR9isZ+OjZKaySYjHx4eHiNNusvFw6uZnMvcTi4o +Jipqqa61xGU/KB07rb3D1kzLo6GoqrbVLxgRFRo7q6ujlZadoKix3yUVFRQTFhzvkoyPkJigrz4cGRoXFxcaLbKcjY2SlqguHh8cHB0dKNfAx7ejkpOrUkIsJCQkLrqsub/pVkE3VLC83ls4Obeiqau000ElFBMdQqywr6CZnaGlsL5AGxIUExUdYpqOj5KY +oau/KxgZFxUWFx/Gl42MkZWf1B8dHRobGx0zwsawnZCQnMcuKx8gHyM8tbvHzl7wuKu9wfk7LytCrKitsM5OMx4UHt6yuLu0op2io6245CsVEhUUHtefl4+TmZ+pslsfFhcTExYaO5eMjo+Wnq80GxwaGBkZH0+9r5iOj5alLyUiHR4eJVa6zsjbxqSYrPra +MSooLOSprrPEWEAvHR+8s8jD47yhoqarudI8HhETFh7Cp6KUlJueqK/FNBgUFBEUGS2ajI+Plp6qzCQZGxcWFxorvamUjJCUnO8hIB0bHR4q28fPwLeckZ3nSjEjIyQuvq26v21JQTQwv7Lm7UE/taKoq7PNTy0ZERglu6yunpecoKSuumUjExMTExkrn46O +kZWeqLRAHBgYFBUWHVGhkYyQlJuvKxweGhobHS/M0r2rl4+XrTctIh8gIzq2usvWTlnSr7S+00Y2Lkirpq2vylY6JxYYM7m0uq6fnKKjrbnXNxkQExMYMaaWj5KXnqivzCkXFxQSFRktn46Nj5SbqGAeHBsXGRkfScO6oJGOlZ1VJiQdHh8kU7rPz/7tspuh +2dc6Kyks4aqutMVPPjQhG0SxycTOuaCipqu6z0cmFBEVGT6ooJSSmZ2nrrtLHRQUERMYI6KMjY+UnKa4LxsaFxYXGCnKtJuOj5SZsygfHhscHSrYzt7NzaaUl7lTOSYkJS+6rbm/VT89Ny7sr9PcUkqvoaeqttJRMh0SFR1oq62clZqfpa+76iwWEhIRFiGn +jY6QlJ6nsXMgFxcUFBUdTKuWjZCUmac9Hh0aGhseNtDaxbackJSiVS8mHyElQrO6yHRFR1+0r7/TTDkwUqqprrTVTjcqGRUnxrO3qpycoqWvu9dBHhESEhYpqZOPkZaeqK/ANBkWFBIUGS6kkI2QlJqkwyQbGxgZGiFS2cmplo+Vm78oIx0dHyfZvd7nTk3B +nZ3Id0AsKi3EqrK1ykw6NCUbMbXCv76qnqSnrbvRTiwXEBMXM6qckZKZnqmwvlUhFBMREhYjoY6OkJScprU6GxkXFhcZMNHDn5CPlZiqLh4dGxweNcXz+n3+q5aWrk47KCUlO7CyusVMPTk2MFC3zd1l2qelq6282EszHxMSG0StqZiUm5+ps7/vMhkQEREV +H6SNj5GVnaey0SYYFxUUFiL4tZqOkJSZo1geHBsZGyNTfVfjzaGTlJ/3LSYfHyjctMbMTD47R7mvwtJXPTq/pq6vutpLNiwbEx/dtLKgl52iqLK+4EgiEhAREyKoj4+Slp6os787GxUVEhMaO6uWjZGVmqO7KBoaGBgcLWZM5rebkZSZsyohHh0fM7vK41lC +Qe+hnLpiTS8tP62ttbjWTTYzJxolvr7Br56eqKiyvupOLxkPERQmrJWQlJifqrS/eicVEhERFymlko6RlZulsUgdFxgWGB9HVeyqlo+VmKQ6Hh0bHCV8yFVaRkjCm5WnTDorJCvPrru710g3NTErM8TF782uoaqrsb/bTDgjFA8XK6+dk5Wbn6qywNM9HRER +ERQhpY+PkZadqLHJLBcWFhQZLVz4o5KQlpmgxyAaGxkdM9ZJTU1TsJiSnL8tKB8iO7a7xdRGOzY677bD3GtG2qqqr7C+1Uo4LR4RFzi2qJiWnqOstMPdTioUDhESHamPkZOWnqm1wEgfFBQSFCJM0p+PkJWZobI0GhkZGSVOTERX8KeUkpimMiAfHSnPu9Ti +RTw4PrmerUZRMzW9rLW1vt1JNS8pGxhDuLqfmaCnrLS/4FE1Hg8PEhuuj5GUl5+ptr/iMRgREhEbOr+dj5GVmqOv5CQWGBcbMEc8TdKhkpSYnt0eHBwePsLuVkM7O0WumJ1jOC8mSLC2vL/qSjYxLyojQrnYrJ2hq6y1vtpOOSkYDhIcvJOTlpqhrLbB30Uj +EQ8RFCu5mo+TlpumsMQ9GhUXFiI+PEfAnZGVmZ2wKhkcGyjd/0dEPD5eppWYrTMpIirBtsHE/kU3MTA5X9nWbtWppa6vt8PdSTctIhMQHsqblZicpK22w+VLMxoODxIftpeQk5ecp7LB4ioWFBQZLz5Ft5qQlZmfrFwdGBodOF07Pjo/0p+UmJ9gIB8gPrvN +0l8+NzIzRaukaEhK1aqwtLjI4EY2LSsfFSC9p5mYn6avtcLdSjkmEw4RGr6TkpWYnqm1w99BHhESFCA8Qq6WkZaaoa7CLhgWGSJDNzg7Q7ybk5mcricbHifczGlYOzg0OvCfmLY4OTa/r7y70P5DNS0sLCEnxrejmqSqsrnF70g2LR0PDxnmkpOXmaCqtr/u +Uy4XDxEYMF2qk5KWmqGvvmojFRYbKzsxPUqtlpOZnKdJHBofMdRLQzY1NT2+m5WhUikqObm/yttRPjEuLDFC3dzXtaClr7O+yWpKNC0nGQ8Yb5eTmZukrLi+5E08IhEOFCLUoZGUmJylssfWOBsSFh0xMjhnppSVmZ6ovykYGiJBTTg3MTdFrJeWnK8pHyha +veDgSjswLy42vaC2QNuzqLS3v9NfRTUrKyQZGGSfl5mep7K7yOdEOywaDg8bdpuTlZmeqbPK304pFRAWIzU2y56Slpmfq7hMHxYbKUI0MzQ4aaKUmJukRh0dLt3uUEQzLi4xPauYoko3T7i1wcP8Tz0zKyssKCdcrZ6aoqq2v899RDYuIxYPF1aWk5eaoKu3 +xP5VNx4QEBsuPriYk5iboK683jAZFBwtMS41OMWbk5mcosAmGR84XUA9MC0uNHCglZyzLipNvsjRekQ6MCwrL0C7vd6rnqWvt8feWkQzLSgfFBRGmJWZm6awvcpjRzsqGA4TJEiplJSZnKSwxdVEJRQUHy0uMkOvl5SZnaS1Px0YJD8/NTAsLjm3mpWao0gf +KHPMbl4+My0sKzDNn6RM8qupt7zNXEo9MSoqJh4aO56Ymp6ouMbTXkA6Lh8SDhtXnpOVmp6ns8fYUzIcEBYlLjFxopWWmp6otm0rFxgqOi8uLS1BqJaXmqC9JRsv91lKPi8rLC04r5mcuzZds7rFzFRCPDIrKysqMlCwnZuhqbnO3FxCOS8mHBATQ5mUl5qi +rLnM+U45KBYPGiwzypuVmZugrLrdPSAUGy4uLC8uWZ+VmJufsTwcHTxWQj0vKiwvSaSWmqVKKVq+zdlWOzYvKiosNrqt966dpa672WJOPjYuKCIZEi6ZlZmbpLG9zG9MPC4eEBEjOrWXlZqcoq690kwuGhMfLisvNcmblZmcorH8JxghQzw1LikqL9udlZqf +uyUm7NNbUDovLCoqLUymncRWqae2vdZORj41LSonIhwrn5aanKW2xs9mST0vJRkPGD2plpWbnqayxNdONyQUFCYsLDyxmZaanaWy1zsdFyw+Ly4rKTG7mpaanqw4HS/QT0o9LiorKzDNnZmoR2ysucjQTT07MiwqKCgvQrSbmp+putjxWEM7LycfFRAuoJaX +m6CrtsrcUDotHA8aLSxGp5eYmp2ns9FOLBgbOC8rLSo0rpeWmp6s5iEdRVU8Oy0nKCszuJqZn78u17fc2007NC8rKiosXa2/q5qkrLzeWE1DOzEoJB0TIJ2VmZujr73L41k9MCYVESYwTJ+Wmp2fq7fTUTgfFSMxKCwrOqqWmJufrsoxGyVdOTYtJycqOq2X +mZ6qMyy/z2ZSOzEsKyosMMGeq9efo7S85VNCPzcvKSUjHB6llJycpbTL2HtPPjEpHREZNmudlpueo628zlg+LRkYLCopLkejl5mcn67HTSUbN0MvLScoKT+nlpmepe8kO8NJTDgvKSgpKziymp/RuqS6xuZMPTg0LSkmJicstZabnqe60GxpSj8yKiMZFCu6 +nJWcnqixv89kPzQiFR4uJzBjn5ibnaSxzF02HSFDLSooJypFoZaanqa9LSXeWD46LSgmKixCqZicrmGys97WRz4zMSwpKCgxz6+fmaGpvdhcT0c8MyklHxYerpqXnKCsvMnkXT00KhoXKSouwpyYnZ6otM9dQiccLTEmKSYsYJ2Wm56ouEclNew4OSwnJSct +Xp+YnKPbUbfxbEY3MCsqKCkpO6uirJyisL1nV0A/ODEpJSUeHq6Wm5ykr8ba+VY+My4hGB8vMK+amp6hq7nNWUkzHyEvJigoLcObmJyerL14LihHOi8sJCUlLs+cmJ2gujvj0kdHMy4pJycpLE+fm6ylornCaEs+OTUuKiUmJymwlZyepbjNZF1KPzEsJhwb +Kz2qmJyfprDA1VY/OSkeJykkKjGympqdoK3F60AqMD0sKiQjJi+2mZieoa9NQNlIPTQsKCQmKTHInJmkq6m43mZAOTEuKyglJSxLp5mcoKm+8E9IPjkwKSYiHidkopidoaq6z/hWPTYvJSEnJio/p5mcn6Wwy2ZROC4yLSYkIyY1q5ianqay0UVKRTYvKiQi +JCc2r5qanqazv31NPjQuLCcmJiYuuZubnqKuxV5IPzk1LygkJScsyZuZn6Ovw/hWTTwyLiomJCUrX5+an6GrudVRRj84LiglISMnQaKZnZ+pus7kTjk1LSciICMnQaOYnJ6irtRfSjgyLCklJCYoOamWmJ6nst5OPjcyLiwmIyQqRqybmqCnt99URT84MCwp +LCokL7mcnKGlscPvTD86QD0mIiQiKtKdm56grb/q18o8LS0kISAiKd+cmZ6gp6nDP0MzLSkkISElKlqfmJearrz9PjowLiooJSIkKsqZmZ6grb5bRj05Ni4rJis8KzWlmp6jqrvhX0c7NjdQLx8kIy6wm52ipbLOXVfF2SoqJB8fISy5mpqfo62trEk2Nioo +IR8fIy67m5mZlqfh9Dw2LisoJCQjJCy4kpOioa/PSjw3Ly8sJyQmPVxPn5qhpbHITUdANjAvPE4jHyg6pZyfpau55ExHark9IiUfICE2qZucn6ezuqq4LzMrJSAeHyE2qpmcnZmd8kU/LiwnJiAgIyQwrJKOnaqvY0M2MiwrKyYiJDG5qJ+aoqi56kU8PDUv +LC5aQB8q1J+do6a0wmlKPj/CvSYfIh4kQqKcn6Grvde1p0ooLSEfHR8hP6KanaCemq02Py4pJiIfHiIlPaWVj5Ksuuo6Ni0rKCgjIiMqtpWYn5+tv089NTMwLComN8YvJ7Cdn6WrvvZQPzs0SrNMHSEgJc6fnqOlsMRm4qquLCclHR4eJF+em56hqZ+d7y81 +KCUgHh0gJ2OemZWOnfVwOS8rKCUiISAjJ8aPjqGjrd9ENjAtLSooJCjpvTytmqKnr8tMRD43NDPbti0dJCu5nZ+mqrbXWk3Fps4jIh4cHibJnpyhpa+vn6c1LCshHh0dHinInJqbkpS2Pj8uKScjHx8gIirFkoqWqK7ePDQvKiopJiMkN6+opJugqrbgQDk5 +My8tNsLLJCA4rp6jqbHCa0lBSbOpNh4fHR0qt56foqi2w6yevCopIx0cHR4qtZubnpqUnU44MSglIh4dHyEsu5aMjp+84jgvLCgmJiIhIinDmJWdoqrBWzszMy8tLCpAtFYkQ6Wfpqq52k9BPzpyqrclHh8eL6yeo6Stu9nJpKFOJiQdGx0eLK6bnZ+jnJiu +Ni8pIh8dHB4gLa+Zko2UtVI8LSsoJCMgHyElRZeMl6Wpykk5MC8uKyonKs+vTFufn6qswllDPDk4N8ysUx8eITGon6eossx7W7ygrDAfHhscHy+qnKCiqKucncgtKiMeHRwdITGrmZmRjp9eOTIoJyMgHx4gJTqcio6frsk8My8rKykmIyQzs6utn5+qs85E +Ozg0MDA5vbM2HiNJp6CprLvlT0tgr6HDJR0dGx85p52ipa24qpukRCckHRscHCA3ppqdmZKXtDcvKSMiHh0dHyQ7n4yLlazuQS4tKigmIyEhKN+fl5mjqLf9PzY1Ly4tLEOxvi4mz6GlqrDGWURCP+moqjweHB0fTKOfpqq2ycSjnbUtIB4aGxwhQ6Kcn5+a +lZ/4LCoiHx0cHR4lTp6QjI6ffjwwKikmJCAfICQ3oI6Poay6RzkvLywqKSgq2q3POrueqa247UY6Ojk6w6a+KxweI9ygpKiuwdtouJ6j9CMdGxocI9yfnqKkppqarDkmJB0cGxweJeicmJCNmLkyMCglIyEeHR4iLaiLi5mtxEIwLiwqJyYkJDOyrK+noKiy +v1M+NjU0ND+xrV8kHS27oKertdpYTnarn7AxGxsaGye9nqOmqbKlmp/EJyIeGhsbHie9m5uYj5SjQysrIiEfHRweIi6rjIqQoXNHLiwqKCUiISEo0aSclqKqs+5DNTEtLi0vXa67PiExqqWrr79SQT9Cy6Sn3SEZHBstrp+nqq+/uJ6cqkEeHhoZGx4tr5ue +nZWTnLcsKCMeHhwcHCAxqI+LjpnNNDAnKCUjHx4fIzyjko6bsbVOODEuKykqKS+9rsRASqOmr7PRRzY6OUKxpLg5GxsfOKahqa+70eOsnKO9JhobGBsfO6eeoaOelpqmTCIjHRsaGxwfP6KUjY2VqjAsKCMiIB4cHiEtpY2Lk6rGTi8uLColJiYmSq2vrqql +qLS/WDsvLzEyZ6qv2igaJN+kp6y13llNyqKfrUUbGRkaIeSho6anqp2Zn7MpHx4aGhocIeedmZKNk55XJyggHx4dGxwfLKiLio+dfD4tKSgmIyAgIS64qJ2Voq616kAyLiorLDa8rr5YICmxpquvvVc+Pk+voKm9JRgaGii2n6errrepm56nUx4cGRgaHCe8 +nZ2ZkJOcrisjIB0dGxobHi2mjIqOlb0xLSYkIyEeHR4n3aKWjZmyuFQ2LiwoJygsT7G2vkc7qaexttFDMzQ416eot0MbGBwtraOqsLvPvaCdprUoGRkXGRwvrZ+inpaUnKJcICAdGxoaGx40oo6LjZKjNSonISAgHx4hKd6cko+Yvj4yJycpKyouNfqknqGi +yzxJOzYwLSwzRsSqo6OqaigtNTxRXVRMXc+5rqqqwyomKy07VNrAta+wtrOwwS4lLCsuOUf6vK6opqapujIgJyouOT9EbMKzq6ejpcQrJycoMDtHZs3BuLCrqLJBNz02NDU7SN/At7Syr7o8LjxCWezzUVDtyLy2sLg/JiwxPWjMvru3u8K/urtdKiktLjpN +2r6xq6qrrrfmKyUsLjc/SGXJta2qp6evRCcqKy45RFTnybu1rqqrwDc3NzE2O0FQ2MG7ubSzxzg1SEpZXk1KXtnHvbi2yjQqNT5Wz8XFwcHEwr67wT8pLTE5T9bEuK+ur7S7xEYnKS8xOkBO3bqvq6mqrcktJistNT5IUPXGua6rqaxtMjUwMjo+R2LPxL+7 +tLDMPEpVUltJREtvz8S+vL9rLzRMXcnFyM3Y1tDMxsHcMSkwOE7Pxbq2tLW9x8reNSgtMjZAT96+tK2srrC8RCgqLjM/R0xfzrqvrKqquD8vMS84PURT99HHv7eusu9BTUpFPz1BTPzNx8S/wFc4RV3ez9jxWF3n1szBv2cvMT5L6dDBvry7w8zKxl9i5snL +3XllZu/b3n5fVk5LTWNy78zGz9/p7m9idO/3WU9PTFZv38i/xdtfXWn/9u/iX0xOUV3t1snK0OB5amT48m75a1JTWl9cXtrLzeVxallj6eXd4mNORkpTZuPPzexjcnXt1NDXcVROTlFXduDPyM/f3Nvf7O/p9GBOTU1OYdzJw8vfZFZbbuXq9F9JSE1WddbH +yN5nXWtu9tzs+XNYU1llcnXZzdHtXm1obtzW2N9sWU5PYOjMys/7VF1269bT1nlOTFBkeOfQ09nvYm/z6ehramRaVFJfYm3XzM7be2pVU2ju5G9dTkpXet/NxMffXF9z7eng6WNZVVhp5dvY1dDY5/x1bV9mcW5gWFhXVWTfysjV9ltXW2j37eptUE5Z+NrX +y8zhbF5kZmp6Y15ma/f87OHp0svO42ZhVU9f/d3feG9faujazMnQckxOVWXr7ef9W1tk/evn2tvmcl1mXmBzaXL9Z1pZXl1h3svI2WReWVp84uLvZlBNWuzRyMTH3VlWX2Ns/mlXUlRj7uTb1c/P3GhXWVVRW2z182FdZWrw1cjJ2GRNT1p82drrblNQXu/d +2M3S911b/uft3+xubGZmZ3n3et3Q1OdfYmpm7t/h/11XT1Z23szL2W5PVGnz5e15Wk1PW/bd4NbT335hY2JjaWBfbHBxannl4c/Fx9pjWFRWbt/d9GBaWWfcz83Kz3VNTVxrdnR0ZVtfevPq4OHd2eJyYFtdZ3ro3+1mYF5eetvLyNlkV1Zf79nd621TUV/o +0M/Ny91jW2RkZXxoXGFn+e3w29jTzdJ8UlJPTV355eZlX2Vm59TOzttfSUpWauLl9fVeWmzv39rU1NzwZW52aPH4cu32aGVz8OXSyMjVX1ZWT115a2FdU1Be48/IyMvdU0xVWFljYltbX3be1tLNztHcZU9QVVNaavTkf2nw5d7QyczdZU5NVmnn431zXlRk +4tfWzs7jZFddbmZsc1xcXlxfft/h1szQ4V5UW1VYZ2lfWVdWX+PTysfS6llOWWNpbnJoXF504M7Py8jU6GdYV1teXWJyfvN8+tve2M3T/FhPT1JcbvDvcXRoaOTX2NLU9ltYXmx+ee/3aWpuanzj4NfR2ev8bHJ6am98bltbX2nn2MzHzuD2ZF9jZV5ZWVNU +YfzXz83Hz+9oXlZPU1ZYX19len7b1tfO0/lWUlNTXW196nds/m/o2dXS1+tiYXf+5d7m4m5bX2Boe+ba1t3+cX9v/v1maV1PTVNd/trOy8/rd3RfZGxhWFZRU2bk0srIyc/6XmJdVVlcW2NpceXY0s3Nz9b4WFRWVF1udPX6a/rm4NnS1eVuWVplZm1+Z2Vf +VFpu7urd19vje236bGFmWFdZVVRc/uPRycvP3v7zbV9nYFlWVlt62tHMx8vR5GdqZVlTUlJVXGN63djTy8/Z7V9WU1FWXmJob3F94Nzazs/eb1xcZGZrfH1ubGZn8+Hk3NTZ3+379fZ6em1fXFpZXvji08rM1N3s+25eW1hVT09XZt7UzsfJ1ORuYllRTk1P +UFdl/dnOzcjL23ZdV1FSV11qbHHp39XP0M3P42BZXmVud3b2fWlvbvvq7uTf63Ft+fn17XtvXlNTVVtq79fNz9vl297q/WNZU01MU2Ho183JytHe4O5tYltTUlBWafDbz8rIy9r9cG5eWlxbXltba+vc19PQ1+plXGFgZGtjYWdhZm787ujc4/hqbPd6b/Z8 +bGZcXWB48ebW0dXf6d7f7+95Zl1ZV1lp69vPztPc8fl1ZF5bVlFRVmB+49rOzdbmdnFsY11bWl5iZGvx3dvSztXpb2ViYGl5b2prb27+5N3Wz9bvaWz3fXN6e29nY2Nm++nl2Nbd7Pz09/51aWJaVVZWYfzez9DZ5/R9bGZjXVxXUVVd/eHZzcrR4fh+bWlq +X2FmaG1z6NbRzs3X9GdnXVtndHlqXmRqdOnh2tnhaVljbXB8ff79Z2Fka/jn3tvd6f309X7v+m5qXVZZX2zr1MvN1+jk5n15cV9cV09SYurZ0MvL0+v7/2JdXllWW11hbPPd08/S3W5dYFtWX2xvaV5fa/7q3dbb6mdYX2119fPy7nptcfTs5djZ3+j79v50 +7+rw/mpdWV9pcd/V2ettcP5zePh0YlpUUFz65djR1Nvs9/N3a25qXlxfYmzs39PN0Nrqdm5mX2f99XJlYGrs4NrR2OxrXl9r++vo7XRlYV908u/g6HBob399ffTr7HNgXFVZYWTx3eP/cXr+9uzq7mpXU1BZ9t7Vz9fg5+Pn6uv4e2JWWmFs7ODY0Nbm+3lk +Xl9eanVkXmBn8eHc2N10Xl5bYfjl4+h3am9v+unp5OpqXm/28uff3t/wZ2RiaHz159ze7+7s9ejh6O9tWlhYXfzc1dbefXj0fXb8cmZdUlVifebd2dnffmZpX1peXV9ramhufunb1dfe/19gXl1/4N7g83j159/c2NzwZFlgfffp4eXp+2pmaWxrevx9/3F0 ++3j75OPycWFcXGNy39LW3vdy/fp/7/BuXlhYaOXa0s7U3vJ0cG1maW1maHX+7t/d2tHU4XhfWlhXY+3m7PN6cfXj4NredFpSVGB3693h/G1sZ2x/fPPvbmZpb/Xv7uLd6XVsY2N4893P1N3rfn306unsb1pWV17r2tLP235lZ2Zna2hmXlhdcPTd2trV2e5q +ZF9eYmh+7fv7f3Lu3dnW3HtcWl1n7d7a3vptcnvy4d/g7WdaYXns39/i5/BuaWhmb3nx5Ot4dHJv/Ojn8nRdWFhbb+XZ1eFtX2ZwdvT8aV1YXG7v2tPR0trrb21uamxydPf69Ojr49zU1eB5W1ZYW2zt6up7am977Obf4XdcU1hqfuXe4uz8d3F1/v726e78 +a239/fHk3uh+aF5eaPbc09TefWpv+/Hs7HBdV1tq69zSz9frbmNgZWRiZmJkZ2z25t7a1df1YFdSVFhi+/Z+c2xy9eDd2t5zW1ZceOzi3OLveX348OHg4N/wdm9v+fj79PV4ZWNgX27x3tbd72teX2VwdHBlWVZecODW0M7a8mhiY2VraGBeX2vy5NfT0tDX +6WleWlhcavju9/Lu7eLX1Nbc/FtTVl5t++nteGx08ere3ODwaFxbXWVzev54cmdnbXL57uPf7HNnYGJpf+71/WpiZ37e1dDP2vJta3d4+/ttYV1je+rZ09TW4v5gW1xaWl1jamtv9Ozf2dTU4HxcVVVda/fs6/5ve+3f29nb7mddX2/25uLn7v51b3rz6+nh +3+n8fPz89e7q+mxfW1tl7dzU09v3a2hub29xZFpUWGby29TT2ed2Y15gYF9fYWVmbPHk29bT1N/+ZF5fZnjs5eTueP/t3tra2+5lW11p/u3o93BjXWJr9unn5Ot6bG/6/Hx9dm1gXF9n+t/W0NPd/GdobHJzbmhgXWT/39LNzdXpbGJkZ2tsZ2VmZnvl29bU +1druZVtaXWJrcnZ4bmx18eDa2uD8X1ldZXT8+m9iXV5s/Orj4ebzdG7/7erv9XhybGdv++fb1dPY4vN3dnN3empfW1pfcefZ1NPc9GlkamhiYV1bXF5x69zV1NXc6HZmYGBfZWhqbm/+8eLa08/Y7WpfYWpx+fT9bWZr/uTb2trf9G5qefXyfGxlXl9ka3rs +4tva4vF6dW1rZmZgWlZXXm7p29XV3fhrZGZpZWBcW1xo9N/Vz8/S3PF2bGhmZ2prbXB27+be2tra5GxcWl1lbXp7b2piaW/z4uHk8G5laXzu6ev9bGJeZm157efi4ury9Ozp7fhya2VeYGr84NnU1dzrfHh0endqYF1cZHjr3NjX2+lwZ2traWViX2JlbH3w +5eHi5+9tX19iZ21zcWxoZmpy9N/b3OP7cn/u5uXo83ZpYmz97eTf3uPv+vLu7PJ6Zl5dWlxjcu/i3N7p/H3/fHd8bWFdW2Fu8N7Z19rl/HX7+XZyamRjZnju5drX19vk8nNxc3N1d29saG7569/b2d3ubGNpb3v8f3JqZGRv+ern5un3bWlve/7/e2tgXV1g +aH/p4d/n9Hn87e3v735oX15r9ODY1NTa5PX69vZ4bGVfXl9s+une29vj+21paGhna2xlZGRs/+rf3Nvg+mtqdPv9+fd0a2hqdfTk4eHi6vb+8ejq7e58a2ZpbW/x4t3e6O728unq8f1uY1pbY3br4dzd6fx1c3r9dmddW1teZ33m397f7XFrbmtpaWtrZWZ0 +9erd2NnZ3vFucH3y9Pfxe21uevrr39/o8ndrbHH8/Hp4bmdgZWxtfu3m5/b+8e7q6ez5c21fXGJw7OXf3efw7urq6er0bWVhaG/+4t3c3OPy/fLyfXd2dnBobXp/7eTi6PF2aWlw/ff8fnVmZWxxffPu+m1mZnF++fH6eG9nX2Rqb3vw5+Tp8enl5OHj7H5x +ZmJoeujg3+Ht//zu7fX2d2FcW19qee3k5enydmpvfXBtb25uaGt78+be3ef7cGZlb33183tza2/16eTj4eh9bm/56enq6/p4cW1uefPz7ejr73p68vT07vpqX19eY3bu4uLtfm9x+/N6cWpeWFpic/Tq5OXu/3dxd/d+c3p3efry6uXe29rf9nJsaG998uv2 +enZ5/e/q7O58YVtfavjv8vB+cnF6enn4+Pr4enl+/Ozs7urvemtpZ2d96d7c5e739+zn6/N7amBkcPLg3Nze6vr+/H7+eW1pZ2l3+PHo4t/h63NnYmBkanP/fG9tcXz05+XseWJcXmn/7/D3eW9w+u7r5OPp8fz87Ofk5ent9XxtbW1u/Ojh4u18cnT9+/p4 +a2JdXml+5t3e5vpvbnr5+n9waGlu/u3o5N/g6vluaGtwdf3u7evu9PDt6ODe6n9pYWV57ufl7PT/fPjv7u3ue2pmaXfv7vL1/HRvbW1ubHX58vh8b213/H//emtlX19neerf3ufu8/Pr5uvw/21qbvzq4uDe3ub3fHZ2fG9qbnJzd3Z5+ezn6PNvZF5fanr2 +7fN7e/rz7efl6X5nYmh77ery8/T5/PTu7u7t7e72+/z67uvr7O31em9uc/nk3d/se3V3ffj9e29mYGJy8+jh5Oj1b2prbWtmYWJma3b79+/l4uj4bGNfYGdz8ejo7vHr5N7b2+L2al9ldPLs7/j+/n337ezr8n1sZ2Zpbm9zeXx5dnNwcn3z5eTr/mtobn/4 +8/J7bGts/+rh3eHwfHJyffT2e3Zycv7v5+Tl3+Dr/G5qZ2pucvvz+3hzfO/o4uDsb19dX2l7+/h4a2xuefbt7PdxZF9janF1cXR3cXF5/vXt5uDh6PR/eP7v7e3t/G9scP3p39zh829sbm51eG1oYWBneO/o5OPn73lucG1sbm93fHv7+fHq4t7h6n5mYmRs +//Hq7f599urm4N7l9HVrcn7x7PH09fl9/vLx7+3w9fp5eXV5+/n5enFpYmZt+efj6f1qZ2tyen12amNiZXL26ePl6vJ+eH/4+n9+/fn18O3p5N7c4ez+a2ZocX75+PxvaXD97+rl729lYGRu//b8e3VycXP47u3p6vP8e379+vT5+ndvbmt17+Xd3OHsfXl9 +9fL4+HVpaW7559/b3ebyfXd3fXdta2tqbXX57urk5Ox9cmxnZ2xtb3Jtampv/e3o5ut3ZmZpbv709/n+/vfu5t/e4Ojv+vn19vX5+/l/d3x///Tr5+vyem5tbXJ1b29tZGRree7j3uLr+nx7c3h8bmpqaW/87OTg3+Dl7/34e29zcnV7fv/47ebf3d/j73Bs +bXL99vj+enV4+O/p4+n0e29xeHl8eHBubGlqcXN3+PLx9X1zbm1xc21qamVja37p3dja3+ny+vz79n5uamxy9ubg3t7i7Pp0b21oZmZma3B1ffTu6ujr9XpsaGpufvj4fnZ5e/bt6ePo9Xt1e/rv7vT6fnl5fu/r7Ofn6+vt7/Dy8v53cW1ubnn27ePf5+76 +enV1dm5qZWFjaHbx6uXl6/l1b2tqaGVjYmNqc3v37+3q7fX9/Xt7+/v38fX48+/q5+Ti5fB9enn/9PR9eXJsbm53/vz7/3l1ff58fnxxbW1pbG9zfvfs6Ons8PT6/v50bWpkZGt67eLc3N/l7vD4fHltaGdobn7u5+He3+Pr+X51bmxpa25ydXz38+7p7PR8 +bGhpa3V4cnJuampwd3z3+n10b3J1d3v+e3d6eXz17+vl4ODj6O3u8Pb5em9tamtx/e7m4eXt+Xlxb2tqaGNjYmh19+3n4+bu+Xl3dnN3cm5zdXv57evp5+ny/np++PXv7/b4+3/98+3s6ent8Pf18fLw8Ph6dHJyc3727Ont8vj5+v55b2tpZmVobXn67uru +9P55dG9ua2dmZmdtd/Hn4N3f5+vu8vj5+316ff738Orn5+Xn7/19enp6dW9xbm5xcXl++fTy/Xp8f/379vv+eW9vb3X99u3r7/Tz7/Hy9Px4eHd3ef707efk5urt7vP7/H53dXByd//v6ubj6fV+eXRvb3JwcnN0dnr78+/u9npvbWxsbnFzdXRxcnN4e/35 +fHVyevnv6+jp6uzx9fb08e7r6+7x8e7w7uzz+3x0bmpqcHr58vf+f314eXp2b21qam53+e7q5+vx+P9+e318dXV3eX367+nl4ebs8vr9/vTx9PT6/Pj17+7s6+71/f349fH1/n96dXRxdnl/9/j7fXz/fH39eHFsaWhnam96+PX5fnwuc25kAAAAIAAA9RIA +AAABAAAfQAAAAAEAAAAAAAAAAP//////////////////////////////////////9//////////////////////////////////////////////3//////////f///////////////////////////////////////////////////////////////////// +////9/////////////////////////////////////////////////////////////////////////////////////////////f/////////9/////////////////////////f/////////9/////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9//////////3//////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////f39/f////////////////////////////////////////////////39/f39/////////////////////////////f39/f///f/////////////////////9/f3/////3d3d3d3d//3 +6+fr7/f///93d3d3d29va2/d1dXd5+93b29vb29rb29vd3f/9+/v7+/v9/93b29vb///////d3d3b3f379PT33dnY2NnZ2dra2dnZ2dr//fv7+vv7+//d3d39//r/+fr593b59vv62tr729jX1tZX2drZ2drb19dY+/3zsTN2dXr4+v3b29fWV3LvsjP0edn +WU9ITUtGP0ZAPkJMSkzn79vXzs7Lx8fKzMjHxcC6uLm8vsDHyNVda0m0vlk+PDw1Ozs6Pj4+PkQ9OD9NTEtJTlVPTl1fVWv//+/b9+vCyL6/vMO7u7y6urq8vbu2t8W/xL29z8Vn06i4Z2dJQDUxLzAmZ0g/LSssLC8zMjg9O0E+T3dv38rNysjZ69PN2dXr +193M28vL0ca7s7Kztba2tbWztsSloau2vbvNb2dTTUo+ODc2OTQxNTI2LzU0Njc7ND9DPUxPUznd4/drXcbBy8Hb511d/8jJy9HO39nCzdvGT6OrucXDt9vFzctPqry91ztCNjg6NThAODk4OD1HQUVES0w8OWNLV0VRSl1d49Nva8vMurqut7q8tLi7vsF3 +p6a1v8a/T1v//2NLPEdCPzM6NTw8PUNDS1NX7/9f/1tZTkk6R0NKQUv/V1NbU01Ta+vjv7u/wb20uru7vbefrcHM2WtR7909rsJjb005Mj04ND1LQ0xMX1XVzNnLvtHra01L92tKR11LZ05NPknbX8LLxsbMxL7Vzs1LtqrCvdXJQFFOUeddSUpfSTw9U0NB +SFFna+dvY83L3dPBz+dnREFPQ/dba1FKRU9DOV1K23fDzMbBvcLGwmO1p7bJxsVr69fXX6m7xN9PYzZBNztMQz1ZSURZ691j68vJ53dCV05DSUFEREZPPTpIV0Zr39vR2efF1dPP37KqvNfLv1vFyc/M42tn1U1PVWt3SlHvd2NjW1lvY2Pb5+NXWVE9Se9b +U0dKSj85ODpBPvfRz8e7vry/vcD3oqq+y8DGXdfPY7WmycjnTz5BQ0U9/2NKU1lJVWdvX2/R92dRUVFJS0dLRD89Pj05PUVN69nLy73Fv8m/vcetp7PJxsr348bTxs1fS1tMP0U7REBJTWdMRkJATEpRVWNbV1lESU3n691dT1VTSzhFSkhv38jIvrW5xLW0 +w7yhrsu/zvdb3VNCpsXTd1cyODk4Nz9AOkxFPkR3TE7/3f/vZ1ljY1Ff71tdVU1PPUdnRsnTz8m3u8y+vrrEsaWxx9HZTULO3c7bTkhdQzY8OzY7PkNDRFM+QFFMTXfrb2fnd2dvxs7A2dnfY11HTWtZZ8nTvb+6wcnDvMZDobDK31vvOl//OanLZ19bNi46 +NTVEP0lNSUNN6/9Ozs7f2+t322/N18rLb9njZ09DW1l3yO+8y83PyczHyDursMZXTVcwX2tf70ZATkA4Mjk3NUM/X1tJUVXr53fJz8zLzc/Z17vBu7rX281RSEREb07nw8jAytnNxczD782sw1tXTTg+Pry8XVtjQS0yNzI0PWtIZ11XZ87I78jGxsjJzczJ +yMzKwN3bzltERELfWd3Ly87b1c7X281rU6vLR0w8NzTnSlNMPz89NTU4NjdCTe9v6+fXzsjLwb++xsnP0b27ur28289dS0U5P05CzffXzuPd3cfNyvdFqrldT0s6Ojmux+tZSTgwMjM5N2tGZ9X/6/++xsbDv8HLyNvNvsHCw7/TxVdRQjpKUUXXa/9jU+/j +X9/bbzWrr+M9QUs0SmddX1VPUUU9Nz88093vzcPN18PAy8fCxtHb79u6vcjIx8ljW0I+N0VCX3dv12Nvd9vd59vZNMeu50RNWyurw+fNS0c4Pj02Pk9Z99XVwcHOvsLBysHEx9vvxcvE49nX0U9FRzw3O0HrWWNrXVtvZ3dv498/N6nJPGNVQUxZ68prX1FK +PTs83f/d58bAy9fFw8vJzMbL52/TvcPP79/fVT5APjI+RMpD99Xj69vX1+/X/0g1pclN9zy6vsrP30o6REI3NldX3/fVwr2/wr7Evc3Gztnd1dfX71HbUV08QDo6O0BnV2dd52PX3f/fd9lvYzeoyVvn909HxtfL61FLQjxAR+/rXc3Kxs3bzs/T79vra9Xd +xs3TXWtPa0E/PTxAT0vMa+PR38/T483f5+trPKnJZ+84rb7EzedjOEA+PD9Lb//rzsvEwdnRys7d3e/Z591nU0tVTUtNPTo8PU1ESclra9HXzdnbytPX1903pbPG7+frT+vE529LO0FEQD/RVevV18/Ta9/v2fdnb9f3wM7d205PTUlCOz1JSE9R0WPN38rI +ydHJy83T20y9qb1PPKvDxMdjTjg9SzxGQT7M3/fVycrn/2vj91tb1/dnXUxKU0ZLR0k/RE5VV1frwuvTvs3Iy8bHy9vfVTCnvVXb991Vx/dNR0VFPkdESmvf3d/b19tV/+t3XXfZ39vj01VdTEhJR0pCUVtbd+vTwdfIyMPLysjI3d//PLyx0UKut3fH/0M4 +PT87R09AZ87n09fNze9r2d9vb9fn6+9MU0tdS0NFXUVja9tr593dycXIzc7Gys5j42dNOKu9Y87XTUxvQkw/PTxHTkxOZ8hnb9fv22t36+vv53fC0etfX2dHRUR3Rltv99ff1cbIzcHEz8jO01v3b0wxpq/TRKu8Y19MRTM5NjxNSUVdb9vT2dXL9+9v5+Pv +1ePdUVlfUVdIS1FnZ+PRyu/Nxtm9y8vZ1cvvWUtfRlkwq7vr2WdnPkhMPj49P05vTV3rwm/f1d3MZ1vX12tvvc/V/3dfS0hLR2P3/8zFzczHv73Mxb/by+drTU1ZU1M0qOdTsNtMOj42NTw4SHdTTmPM4+fbz8fRUdXVwGvI1edfV01LTU9AWdnf1cjJyt3X +wNfL49/bZ1NFUU9dVzettcZTTT9EO1U6R0VXa+9nWcnf3d/d0c5Td8vnz8jF19dnWUxET0dG583rzcnIx928zdvF4+djVVdJTV1fT0GlXa/OZ1s2QS4+S09n3WNXyc7VzdvLzf/R08TNzs/T909LQ0hTREj3zdHZx8jT18fKb+dvUVFNSk1RWV1XNLq0Y0c+ +UzNJSk3nW+Pf4/fT1ff32eP/x3f328TOzNXjXUhIQUxKT//Ix93EwsfOzL7Z791OTFNTSU9ZX19bNLSub3dNPT08Rmtjb9lr18vX0dXX48PLzc/JztHb2VdbPUZDUUdV48/NzMXNz8drzs9RT1NPWUpMXVlbY1kvqMpHOV1FOVnv39nv2f/F62/M5/fdys3O +X8nM0ddvd1tFPz9VQXdf28vH1cfMv8zfyV3vY1tRX1tXY11n/z/VvqpVd01DRm9dd3fP39vL/9nfx+/G1cXX1c/j21lVQj45P05Ia+fb2cHb28Pd413vX0xKW2t3X/93Y/dfTy6s70JRTXdRz9vf7+vXd91nV+dj69PPzOPP29vjU1FKSjlNRVvd4+vNwdHd +vsPd32fOS2PvY+vf9+9dZ19RKc+qyetb00dV2W/r2dPbXXdX3ffXzcnK1et3/29OREM6OkpM/93d3c3KxOPNz29rb+tXVf/V5+Pb/2tjU0c4R77LR+vVTu/MY+/TV+NvV/9fZ+Pn1e+/3XdnWVVDR0JJTVXn687X183MxsXV39lja9t339Xb1d3/X09RRzon +p7DfxtnrRedfzuffUVffUV3L1c/d1dfjU1VKSz88PEhPzdfrz87b57zP3dvf91lfz3fdzs3f5/dZTD89OSiot2vT48pK3+/rd0hT409V/9vb99PHyN9XTE5LQUFRS+vd0d/O0//CzdHn79Pj9//J09vMytPrb05DPz47J6yfvMnTzT9d21lfSV9XWUvZ28rd +1dnr2U9JRE1CPlNNz8XI49fTym/JyV3b92f398rT983Na/dXSEA4OjQzU63EZ9vVRdPXVVFLTVtZW3fV2XfGz8/fUURBT0ZJV9fL2crb28bX69nR3//j1c7nwsvXz9HrWU1DPjs9PytCn7Bvy9FLWWdNXUtDTF1n493Oz+Pn43dVP0NRSkxPxMfFzePLy+dn +48FbWdvZ393Hxeff319MRDs8NTdNSjWlt0/Zx3dR9+dPSUVb39//583H19vdWW8+QU1jWdvGx9PdxNHjZ0rv62/nyszFzci819tv/0ZBPD05QkJHMZ+svMbMXTrrXUxPQUnd09/XxM3fZ2Nr/0dEWW9b1dHI0czXZ1tfXVn372vjys3V18rv/19TPj4+Oj83 +5/dCsbCyWc/bSGv3R0hIa9fV78/HyNlR/1VTUUNVX83X08vPz89bTuNJTmfO2cO/v9XPwuNrS08+Pj1DPz9TQUvTn63PxWf/R0dTS01b29HO58rJ31dbXXf/TlNfw2P/57/b/11rWVtNd9HK07zGz9XV605OQz0/PkVBOP9f9zWxrcz3ye88TVM/b3fd/8LV +1ePnU0xRd+drSNPR12vD0d9f60xTU0z/yrzDvMDG1c/rXz9BRj5DR0FHTEY3rsylvc/PSTxBTEz3V93Rzdfd7/ddTl/34+dLzu/nX9/R319fU0lXXefJvsK+v8fZ91VTP0pDRURKTEdPa8tvNaa42etXSTpKX2vdb9XKy/9Zd2NPUffr71HX3+vI3+fn3VtZ +Tldj28O+u8TAxuvrXU5BQ0VGREVXTEtMO6tPp7K5R09EOE7Va1fd49vX505b405P79P/1VN32Wtva9vrVU5bX93Lwr63yMTLX1lCTUdGR0tGTv9BV+Nnaz+9qb1HW0pFVd/348zV1W9fR0prUVXv32/dY+/f0Wdn299Zb11vzsrFvra/zNNrWU5MRUNFTEJZ +TE7nP3ey11+juj9RSU1fzs9fzW93V+9GSXdbV+vXb9Nb73dXTv/R919n5+/HwcO9vb7rb1dOQ0ZTRkhLY09K11vvZ2tnP8W3/0Rr91fj0dPO22NVb0dFZ2f3Wdd33cxXa29r7/fd93fn2dPJxcG/v1vrb1lMR09KSltXUVPnSzyvx85M67JnRGvZd9vjZ19O +XVVrUUhn9//Vb3fN51dZTmfX293b98zMyrzEzMrKRV1RS0ZJTFtOTldJ79nb/1tnYzr/s8VLz87Td83fZ3dMTFNPSHdv11VX487bTFnv/+vZz9Hb08fVxs3N2c9OTm9dSEtTWVFOU+NvT0SxxdNrRlWzx1XHxtVnd1VPTlFRVU9RY9NvY0nba2dGQ2t349HR +y83Hx8TF0e/390lFVVlKVVPZSVdTd8jX2eNMSk4xsrLHd8S/9/dj3XdNR1NVTFfr1WdPVW/nX0ZO59/308/LzdPIz9fv72NnW0x3Z01Zb19jT9vj/1HBu/9vRkqxvt/NwsVrb1VfTUdLWUxNb9lnZ0ldS11XRUtn19fOwMfIysfK2XdnTFlPS11VX1fjb19N +z+//ynfvQk06t7XH1cjFzuNjY3dVP0hTTUfdd19ZSVNOW1dNV+PX0c/HxsnPzszdV2tVWWNv/2tZa/dda2PV2Wf3d93/TMG4vt/Mw8/d911bSUtESE1RXd9nVVf3TGtVUU9X39HOyr/EyMrPy+NPWUtRVWNbXW9f3fdb1//3Z3dTSVVdu8Xb48THzd3jb2NK +T0lITU53a09bT19Ib19bY2vPz8zIw8XJ1dPnY0xPTVf/42Nvb2Pn72/P62d3619X37q+xt3Kxs3RY+ddVUFLUUJKU3ddUU9T611HY11d39PTysO/xM3J4/dnU0pMW2v3XVXd9/fd79/fVWNdTVvVwc/j783Ly93fb2dPRFNVSUxO91NNSUx3701ZV3fO0cvG +xcbDy8n/XVlPSVNn/+vvW+fj/+/PY+tOWVNZXcu9xtnPycbT391da01DSltMTVVnU1VEY2dnW1Vb49HTzcvDwsjMz3dbVVdJSf9jd1tj39vfd85jX1lOTVdbyL/G49PTydPV3/9rT0xRU1dKTlFPUUbna2f/WWvT187Kzc3Mzc/da0tLTklR92drb+fn3eff +129ZWU1Ra+PKycrR0czN3d3va1lXUVlRXVVfT1lJU2vfa3dfd9Pr0c7OzMbJ3+9rSktRS1Ffd19r3+vZ98vj71tOS0dr09nMy8vN59nT6/d3TGNVV01Ra0dNU0vvY93r6+Pd1dHPx8zJzczja19JR0tTW1dfWd3vd+9322tvU0lGV2fR083JwMjRztnn/29f +d2NVTVt3R0hPW2933efr59Pf2dfRysjK1eNbTkdHTF1ZVV/nd9/v98nd/29OREZja9fRzcTFzevT09/v/2dnX1tTa1dLSUv/72ff4/f/2Xfny8vLztvd/1VJTUZMW11ZXefn5+/P591bX09MTXfn48nNw8TLztfj929va19dTG9VU0lOb2P3d+/j/+/T5+vP +y8/M1+t3UUVMTU5rV1t37+vv09/d42NVTklOWffdzsbExc3b59vj7+v/Y1XnW09MU3dOY+Pf4/f/293v483M0dHva11OR0pOTlt3XV3369Pd/3drX1VTT2tn3dfIw8LCx9Pn9+tnb2td91NVTU3/W09r5993d//Z49vbzs3O0eN3WU1LSlVO7+dVY2fX3Xd3 +d/9bTE1Na2Pfz8vAwcnP2+fn5+//b3dbW1lOX2dZU2vd4+tn59ff39XPzs/fb1tPS0xLX1lnZ1tdb93ja/9rY09VTFvr39XJxb/AxMzX43drb2tjY1NPUWtOV19ja+/jd1v329Pf29XN2ffjVU5NTE9vX2NfX+tr5/drd3djXVFL7+/d18jDvsHO0dnnZ3dr +a1lVS1d3XVdf/2dn9+NnZ93n2dfR0c/jb2dOTE1PU/93W13jb2f3d+9jX1dRV1Hf1dPMx8LBv87X0+NVV29fV1NOXWdXW2v/Z2Nv611d3dXZ29XP2e9vY05NS1Fr9+tf9+9nY/93b29jXVtdX9vT0c7IxsbG3efjZ1NVY11VUVNnZ193b+9rY2v3/2/b09vX +ztff519TUU1PV2d3711db2djY3fnXV1XX+930cvLzMnIysrj7913TU5nWVdPY2drb//rb2dbY+vvb8/V59nX5+t3W1lRTlNr72/jZ2dva2Nrd/dvY2937+vbztHP087R2eP/a11ZV2NXUVVjb/937/f/Z19n7+Pn19nb09vr62tXXV1TX3fv9+93XWf/Y2dv +d11fZ/fn39/Tztvb0+vj3/fvb19XW2Nba3dv6+/n92dZY2v/69nX29vn5+t3X1tbWVdr7/fr6/93Y3dnb2drd2/37+/Z49fX2evbd+/va2Njb19ZX11na/fn69/rd19n///j29/b2+Pj63ddWV1jb2d36+d3/2djb2drXWdna/d33d/d2d3Z6/dnb+/3d3dn +W1lf/3f/7+vj3+trX2vvb93b3d/v7+/vZ2tdXWN3a+/n7+vrb2NrZ2dfZ29393fv29vf3df/b/93b/9vZ29nWV13b3fn793j6/9fY3dr69vj3+Pn5/drX2NjZ/9v9+Pv7+9va2tvZ29ra///7+/f3ePd3/dfX2tv5+dv92tjZ+v/9//32/f//19nb3fr29/n +6/f//2tjb11ja//36+vj7+9rb19nb2Nvd+/r/93f39/n71//b2v3/2v//29nd///7+vf3+frY11vd/ff3+Pr5+//b2NjY2N362/v/+/3d29rY2dra2dv7+/r49vZ4+P3Y11nb/fr6/fvb2//9+v/6+Pn/+9jZ3dv7+vn6/f39/93b2tnX2P/9//r6/fr92Nd +Z19rY2/n7+Pr3dnj5+93a2tfZ/93b+v3a29v6+v37+Pr929n/2f/9+fj5+/37/9nY2dja//39//r9/93Z2Nna3drb/f34+fj1+Pv92dfX2f/5+P37/d3a2vv7///9/d3a/9va/f/6+Pv9////29nZ19na+vn9+fn5/9rZ2Nja29369/n59/b5+/3/2djX2v/ +92/r529rb+/r//fv5/93b2dvb2/n3+f//+//b2tra2//6///6+v39/9vY2d3d2937+fr59vr//93XV1n/+Pj5+vj929n7+P/d3fvd2//d3dvb+vn93d393dvZ2dnXWv35+vn5+fvd2tdZ293d+/f6+/j2+fvd/drW2Nv/+/v5+t3b2vv6+v/9+Pr929rb2P/ +9+vn6//vd2tnX2tjd29v9///9/93a2Nv6+v//9/f7+PZ6+93/19Za3fn3+fr6+93Y+/r/2Nv/3f/d3dra+//4+fr/+//a2tdZ19n9+vj//fnb2trd+/j3evv6/f/9+Prd19vZ1ldY2//5+vv92d339nb9/fv/29na2dv73fr5+93/3d3b2vvb3d36+v/9/d3 +d29rd/fv///r93f34+tvZ2NjWV9v9+/v7/f/a+/f2+dv//////fvd//v//f392tn/+/j3dPf7+v//2tv/2djX1tdX/939+vr5+fn429n3ef/Y11nZ//r/29nb2f/6+vd3d/j6/dv//93/2t3X11ra2trd/9n///3/293/2N3Z2tvd/935+fn49/j/2/f53dr +b29n//drb2tjTlfAub7M2fdnY11dX1lTV2NfVWdjX2f//3fn5+/3b3d3Xdnd29/b39/Z293j729dU1VbU1vOyP/Pz99v5+/n/29ZU1NRTVFRUVNZW1NXX3f/79/r1dPP08/IzM3V09nj/+fra11PT0pMR0dNxNNJd7jG3XddT1lrXV/va11v6+fr19vf2dfZ +zt/n7/9vb3f349fnd+9jY2dbW05MSkJDRURBTFXBwNfn29/Z02/Ny8z37+/v39PJzM/P2d/d79vv73dnXWtRb19ZX1tvY29VTF1VW0pFSURLST88TaKpy9XvR0FXU/fZd1tXU09T99PZzM3Tys7Z08/3/2PvY1fR3c/OzdfZb+dra1dRT0dJRUQ/Qjs/rrfZ +729jRlt3d9Vj5+/3d2PK1crRy+vj611fXevTW1Nbd2Nf72f/5+frTvf/709OTE1fVUo1vramwW9NRjRPXUtZR0tPRkRO4+vdyca/zL/CwMvPz8PPx7zO1dXZ2efrd2dKS0tGS0k/Q09ORT5Aq85ZX1UuO0M7PElIQltLa1fJ28q9vcW9vLrDu7rDtbrVwMXN +ycXLzuNO429RTTs+Ozw4LrfbNsauXT7XSy7fXz4/Qzk1PTs/TldRz9X/08zf28/nur+1ur+8trnAvL7AwNt3Y+dRSldITltDRTkuo9NJR0kzRcx3UeNVRHdjVU/RTllTZ2NRQV33Tedn10vv18jLzb3CzLe7vc/d3WtZOtm011c4K7Hrb0FIPkzfzVlva2d3 +69nRz8n328hrRUVJTVNdT8xn7+e+yszB0cnXwcTd9853//dfX0NBPiyqzuNRP0E9wc1b/9VRT1lTWd/T28nL3/9NREc+QDs/SUdfX8n/yc3Gxr+7vr3JxsW+z8b/VUYvq61vO0lnQ1+/S1fnSmvvZ2Nnz+//d1lBPDs+TjpEXVXvysjVs7q7u760vL7Oxc1d +Y1VOST9EN++vyVFGV0rr6+9R2Vljd1FJU+/rS0hIP0A9OTw9PkNOTHfDwsmyuLS1t7q+wcS/ztdMS0hCPiuurNtBRkxFxM/bwcf/09dnS+/v91tTTD0/QTk5Pjk+TVtP1d3NvLmwr7C0s7rCzd3rU0hPSzUuU79ZSUZFSsfXy9XOxnfbWWfd2+dj918/Qj46 +Nz06Pz9ATltv18a6squtr7G6xsvv/0xNRj84R1lKSUQ/SUvZZ9vN1d3DysvZ28rP993ZWUxXS0RNSUVHPkdXTv/T18i7tbGzur3Cz2dbRDw3OkI/PjxBQUNMzu/MwcjJyci7x7+8xtPZd2NIQz8+QUFKSkhMSuN3z8zPv7q+sru7wdPvUU1XRDo1NTQ1Oj1F +Te/V2cbAwcC8u764vMPK0/9fV09MQEk9RkRBRk13TO/fz8a8urO3ssDDyVtBOjo1NDEzOEI/SU1X1+vLusS/urq+vbq7wMrX2VlNRERMPUVFTU5RSE/3Z1fXxb68u7/GwW9ORj83R0BBPDxBRUdNUf/n57mur7S8xczLzd/D13dOTVFJS0ZVTE9PV0R3T+9f +b+/Lv7q9zctXU1FTPkVKTU9OV01LS1dPxNHDzs/Myc7Hys7X219TWfdZWWNfZ1dXZ11VTGtPXU132dPFyb2wuct3X0k5QkI8PD5DOzrZrq6xvMTL79nd98//TF1vW2dvY/9bWf9RP2dXZ09NZ1NZY1nKyc7NvsLZ78rPWV9ORUBB/1NbW2tv2dXVy8vLz//Z +ztv/V1NfW1NVVUlTS0xd72Nra09IzFvL78brvqu12UxFPDo6QEo7xqy0wt/fWWf3X1VrVdld42fZ09nrd8/rd1Hdd3dZRUtAPtvbWVNTVU6vrLDO02tfRU13//9KTUhKQ0Hr4+PT19vO3eP///9jW01jUVdvV2P3y87j51nOW28909vPP8Wqz2djXUA8V0RX +O7qstsBba0NrSmNfd0tAR0tOWetj19fNzePftru/xWvJ1/9GZz9nXUs4orxGTlU/RD9rWf9OS1lNPURvZ03dyse7zr69zM3Rd+f/d11VT1tj087nyr3PTUxIOeM/NajFQEQ8ODE0S0RTRDequdVX984+48Hnt9HFvry+u726vb7EwcfH473K58Zfbzk0Njw4 +NCinvjs9OzUtNkFBV1Nd5/9rZ9dZx8rGubi2vLm7vcS7vbq8v7/LxMPHyde/zVc/UTk2OCwrRcU2LSwqJCwrMzU4PDY7q+fLa29fW8m12bWutq+vqaytqaiop6ijp6WsoaypxtdPRP8xOSOlXS4sKh8hISEkJigjJSMiJygvLi40SUA6T//Vzr66tLeztK6v +raqmqaSmqKeurq+ttsWvn6rBvdE6PDMvNjo1NTMtNMtKRiw7JSoqKiovMDBJRO9R49nIvLu6r66sq72xv8XNvdHZPJ+uvrq9413rb/fRb1dv3T9IUT5LNDczLzgsLjcuNzI3PUVARUZRb9+/uri7x8TOv75ryE3Mprjbwb9O3cZrxL7Gv7jAVaWlrLLvvjE8 +NDkzMjs0OTA1Nzk4PD5T3bnX70c/QjpJQDs9I6DjTM9jRl3Fy7+srrWvsLW2sba9vsO9ycVb5/drUd1bSVFjVU1BRndvY1E5Ni0oLTgqLR+2uTw8Sj1r08r/w7u/t7a70dWfp6yusLnfy9XdyltPx2/v18zL58i9srjCY087KysuKSMoH7Y5LjI2PTM+SFHD +47rCuby1sLa8vrnF1dnVycO/xcS6zb+9v7u+xK21tsHfUTQ1Kj0qJyJOUzIsMy0uOVc9Sc7nzsTT1VO1obC2uGNV72/Nd8TZ97/TvMS9sLiqq6qvtshnPzQ+Li4kLb41Nzw1LkZKNU3nVV3/Tf9r09d3Z+tjRUTb49tZ09tny8K+u7axrKyura+7z1M9Pj0r +Kbq16ztdSTVIW0/3zsbJyUpnb0M3qshd3TAwLjpAOT49OD3fVdnCvK6pqayos7/d4z/vKjVnt9lKZ1lKWcPnysDFyL3T99tT919LOe86MTFAPTk4QzY3R0Jda9PGs7O1tr6/XVk82TkzRbL/3W/j78vXurS2vbuwvMW9z+c1vsfC4y01Mzo5OUU8MzFTPmNb +38TJvLvLzE0/Nj45K9271+dn18nJvbG3rrGysLG9usHJ4/drPGc1NDtLPE5GQj46XTxVWWPG09/d60ZFOTcxOSg/1chJZ+PT2cSyva2zubOvube2w+9nvdvHRTg5SEFBP1VJOE132dHPu77Gx9tNRjYzLjIpLjxfZ01X99nVvb+0s72ztbe4ub7Dz9VORV1H +PkZda2tRX0hnzv/v68XAycPJ/1FAOjcuLzQ7Pkc/SENdX3e/vri+wrvAw73D1dnva1PLSVNMW29nT3dfXevVzdO+ur22u8TN40c9MTcsOTs/S1NjV1njxcS/wcG/xsjF0f9fV0g9VTdAQERjV2vZ/2vEycfMxbq4uLjL2+9HQTQ3P05ZVedd72fvzcXFwsXO +ztHL2XdbUUw6ODM1ODo/R11XUVnTzM3PycG6uLa2vczG40NEO0o+V1dj2WfZ28LHwLW4xcvLx85vTUtHOTMyOzE6PD9LV01VyevPycS/vbu5uL7P4008PUBESu9f1c/Jz+e7xry/u7zJy+tva04/RD00MzA0NjxAP1VNV8n3zcnOy8W7v72+ydXbTUFIQl/f +a+/VzsbZuce7uri4v8rF719VPj48NjQxOzc6R0VKSEzP593Mz8jFxsHAwMnXb0U7RD9FY1njy8nHxL26ura1trvIxfdrV0lBQzg2NTU5N0VBSU1ja9frzMrGysjJzc/nb09EPkRARedb9+vZ2cDHvsC3uba7wsXR/29OSkk8PTs5PkFLUW9r593N28rGyNHP +2+ff619PQjs+Qz9XY1nj08rMyMLEv7y6usfMd1NVWUpGRk9DSU5TTVdr4+fPy87Ry8jO2d//93dPRUc+RkRFR2dZZ/fT19HLzcLJvcTT091rW11TXVlVR05na2Pr18/Zz8rLysfAxM3TY2v/U0ZJQz5EQkNGS1VbX+ff49PKzMfMzv9nY0tNSk5PSEtbb2/j +3dHGx83Av8LGw8PIz8/f3/dLU0hDT1VTT11XY05r/3fn0dfb529OR0pJSUNMTUtdXVFn5//b2cjMy8HCxcXBx8zM0e/V/2dvVV9bXVtjW11j7+vj993vY993Y05PUU9KSExLS0tPZ3f349Xj583JzczMydHV3eP/1+P3/19vU19v32Nb29/n39PV49/Xd/9v +T05RT0lOXVNXTlVj99/d3/dv4+f/09Xb2dfn999rXf9n/+vv7+frb93r39nd69/343djV1dZX19ZUWdjd29j39//29vf49vf7/ff62dr919rY1lfU0xd72Pn0ePn3dHT5+fV5+Pfb2NnXVdvX1lvd//v/9vd69vn/2/r7/9r//9dV2NbY2dbWVlOZ2Nb/+/j +d93Z2d3Z2d/f329j///r/+d339XV5+vd19nVz/f///9vV/dvd1VOTExTTU5bU1lbXWNvd2/f39fX2+Pn7/fvb+f/6+/v79XRzN3/2dn/1czX3evnd2f/a3dTV1NZW1dLUU5PX2tbb2djb2//9+fv0ePv92dvd/9v92tv2dfn3evX3dPN0c/V3ffvb/fn52td +V1tnTlFOVVlXU2tf/+vv6/f3d///Z/f/9+/j39/r7+fT6+vr2dXj693ba11j4/fj1+NrX2NvWVNRUV9fZ1nvZ2djb19bY293b29vb/fn293r729349//6+fX493O3dv//99359nj73drX19dUVdZ7+v/a29vX/9fd//n3+t3XU1ZX2trd/f/d//n4//v5+Pv +4+fX7+//59/X3+f/62f/d2NnX2NrWVnj2+ff3ff3b3fvZ2NbZ19v/2/////35+9vW3f3b+/r7/d3b+v33+vnb2tjb2tnb+fv6/dv/2/v39/r79nj3eNvY2/3//93a2tna29r93fv62ff7293a19jW/f/429fY2NXa13/Y2vf4+/f593X3dHZ3dvX72Nra2f/ +6+fvXWt3/3f/7/f/7/9vb3d39+vj/+93b19bZ05XY1Nj7+Pj2dfn5//j3+fv2d3d9/fv62t3b29na/9rX2dvd//n5+/3W3frZ3fr3W9dWV1bX+t369v/d+Pn59nX6+/va93n7/9v6/9jZ/9jY13r3////2tn/+9v93dn72t34+N3/2tdZ11fZ/93/+vZ4+/f +29vj3ef392NrXWPn/+Pr92tvZ+9nY2f/b+fj9+fvb///d29nd2dfXVtbV/f379vX39/3193n6+vna2tvY1tr7/f//+9va11rb11v73fn3fff92N3d//v5993Z2NjX11vZ//n5+vf6+Pf7+fv9+vv629fY//v9+t3/2dn7+drW2dnX+//5+9r///34/9vb29j +Z29bWWf/3dvd1dfd193j6+/392djVV9rd+/n7/fva193b2f/b2d3b+/vb3f339vr9+9vZ19nZ2dra//3b/fr5+fn9+fn//fv411j9+fv63f3/29n6+9rb/9r/2Nj92dna+/d5+drd29va3f/d+/j2+//92fv6//j3+Pr7+9fVV93Z//3/2/39+/rY2tna/f3 +9+Pv92//9+v/d/fvd2v/93fv39/r9///9+N3d2939/d3b19d//fr9/f/b11vb2Nr6/9v/+vn4/d39/93d29ja2/v4+/r593n69vd3+/f/2dnb2/va/d3X293b/9jd2tb/+9nY//v/+v37+/3d+v37+93b/9rY2djd+vd3d/r4+fd4+939/df/29vZ2dvd+v/ +a2/3d2frd19ja2f/b2/v5+/v3+Pfd29vW1ddb//n69nb4+Pn3ePr7+/3d3f/d2tnX/93/2Nr/3ddd+NnY2v/b3fv59//9+9j/3dvb2Njb29n6+//d+vf493r3+/d493j93d3Y1tr/2/3a+/rb+fvd2N3b/93/2/v7293a2vra29nZ19fY/fr6/fv6/fv4+Pd +3+fr93d363dv/+vv929nb2NfZ3d3b2fv6/d33dvv63f3/2Nnb2Nj///39+vv7/fvd3f37/fn4+vvd/9rX3f3a2d3b2d3Y2/3d/9v5+fnd+f/d2v/a3d36+trb29rZ//n7+vn7+fv7+fv5+/r93f/63f//+/37+93/19jd2v3d2dnZ2t373f/72tva2ddXV9d +Z3fr493j6+/v///v9/d369/v9/f39+v3/+f/6+t3d/f///dvd+9vb/f/93d393dfXWdfXWNnb//r//d3Z2dr63f3393v7/93Z2t3/+vf5+Pn4+/r6+/r5+Pj///rd3f/7+/rb2drX1lr7/fv5+//d2NfY3dfWV9nY2dvZ2Nv9/fn7/fr6+d39+fj2+Pd2efn +3+fj3+fv7/93b29nY2dfa3f3/293Y2Nvb2d3d3dvb11nZ29rb/f/a2vv79/f69PX3dvrZ19jY2dra3dnY2t3a2/v993Z1dvn5+t37+Pnd/9vZ2/f3edra2dna19nXVdXXV9r73fj6293b+fv7+/r7/9vd11j/+/f3d/f293jd+v/3+vn93dva/d3Z2v3d29r +b2dja2dnZ2t3d99r5/fv/+fV4+vd6/ddTe9fWV1v/29dY29ra+vNzMrLzNHX193n699ja09RUU9VWVlTVW/nY19fV11ZV29ra//3///n49vb0czMz8rOy8/L1dfd2df/9+9dZ1dbWVdTTFNMTU1NS0RDU1VKR0xVY1v319nOzdXNztPKysrIyMbLytnR0dXZ +6//3Uc+1uMVnV0k7Pj0+PD07P0lIY1v/6+vV2dPZ9+djY0xrTk9Zb2tjyM/N1czLzs/RyMnPvsjJ0dfvX1tvZ0dTQUfRb1VXVWtXd11351/3291r5+9nV09NR0xHRj1HS1FHT+tf/9XLxr6/vsG8vL27u7q5wsPb4//va1NGMdGnr+tLOzguNTQ6Njk4MzQ8 +TEz/293X3XdrW19VT09jd1v3/2dn08LCv766ube2tbexsK+vr6+vuLi8xrvIsK/JQTYqJCsqKSoqJigsKzEzNENIW1dbW2NTRtfDzevVU1FCQ0ZBSf9r1ee8vbu0s66wra+vsrezt66345+fn6q50TM6MjM0OSsuLysrLjc5MjpDPTs3LjQ3NUTZb1lr40pj +Ss3Az8S8wsnA1b68vLu4vce7zuf/W2tJoayuvM3fREtRTUZHRTxEOT09Pz5RU0xGST07MzY5PeNL/+dOQ0BDQU7V59O1s7a0trCxr7WxurzH1dvRPt2fn7a690EuNS4vQjk1Pjo4P01ISv/fzsPfX1tTY0lMyu//70VDNzBDT0FGRtn/59XCvsO9u7y9w9Xf +72tDrKey173LT0lMPkNORkRNQzpFRkJH79fRz93vX1/v1dnjvM7JY1k9OjtHSkVMxMHP2cLOxcK8yufI2VdV6z5frZ+8u81KPjU3QUFDTklZQkZR41fXzMzKw83/19v351fnXWdZSDk7Qk5RSdnv503rwNHJwLzEyc3ZXUxrNqKpw9/bxz5n/0zf72/N70xE +b1U/X9NV72NRT0hLU1vvw9HvTlc+Ojo/T0jvb83V29PCvcXHwsbb3fdrWVMyuMKlt7jEPWc+TmdL18/dWWP/a1X/69PVZ2dVT0tRT07/UVFIPzwsOTxGQVnj2d//ucXIvru6vsnT1+fP5+9Do7tO50RBT1NGZ8bd2/dbU0xvTm/j719fSj9CX0FIUetVWUg7 +RzUvOz9N19PGy8G1trWus7W8v8TN2czZ0TWfR6my328/TDHO/0NXTEQ/RUo/Q+9jU1FHS09OSVFLa0lVQUA2Pjo/5+PKycjVzLu6xbW5vsPT0dPj/8/ZS622v0lVSz1G22vXT29jRz4+QU1Oa1NbT0VIUWtX/8a+53dNSD4+M01ZStPFyse/uLS/s6+7y8HR +x9/b08xnTq1HtcFTQlNOL09JPEc/PDlBSl1NV/9ZT1//b+Ndus/bSExCTkVBVW/Jx7/Cu8G/v7i8vr7T71vnd11R61E3pNs6PTc/P1Vf319jWUdAOT4+XVNVX01nY/fV62fAxsb3a00/SUhL18PJu7q4t7a4sb23ws3r3+Nrb0//SjynZya+uUdCRks2Pzcw +NTk2OldZb3fR2c7TvsC9wrO4zv9dTVFIQlNjycTGwsK+vsa0xcnZ32Pfa2dOVUo9LaldLjs4NTZET1tPPURBOj1BV0/v13fX09HFxcm7tbrDzU7vQUZGTdHfy9O4ubu5v7LBv8zLd///Z1VHSi05uzwuOia6W1/nSz43Qj43PVlT19Pb18XAwr21va2vuczf +a2s+TD1C/1nV58rGzOfCvOP3b+9j/2PjWUZXM7/LQzdANjA9W053S0BbTztIX1/d2dHbwcC/vcO/s72+zcpTVUZMTUdbym/Pzb3K3b+91W/f4+t3b19OSDgvrkozODYuMTiqu75fX0pIQ0XX1+PdyufR277JwcS3v8fVVUtEPztERE13/8/OwM3nvsXPd+/d +62tnX05FRTWyZzk2OzZKTmfXa01J519FX9XP68vbyb7Lvci+trvHztFXRDxJRD9FXev/18jZa+fF49f36/d369VZW2dNMqtnQjg2QkBJNKiqzuvK40hX0efZze/FwN3N3ce4ytvIZ0o8Nk04Oz5XW1nOzuf31cXZ0+Pj/+ff93dVX0dntVM4Nz9BU/fnzMxb +Z93d52/Kysjfz8nDzczMysnZ0edXQTw4PTk9P05OY9PX3XfZxM/V999v39vj1d/MU7W4z0VDRj3v9//XOqu/u8/fb1Xr9+9v43dra29fzt3GT0xEQTs8R0FFTmtV19Hb79PEz8rZxN3X3+tv78td97nRTkI6Qm/v5+PK/1XR583v2+fn3993//9n52/ZV9dV +QkNBOj4+REdM5+PMxtPTz8HRy8/N69PZ087Tv9FXV8nLY01HTXfr218xyrTD09/dUV1XX+NdV1FT71VV61dESU5ISENHTffdX+fPa///0cXT49fbydfNx8TC02Pr591dX1FP29XL03f32Wv/U/9na1//a1tXT07vX1dXT1NHS0E+P0lOY2//38nZ18jM09Pf +zMvMzM7Kx83N0dvj0ePrXXdd///nSUG5u87b/1lMXV9ZUVtRT2tTSk1GQkFGSUFHUU/n/+/n2d/bzc7N0dfKy8jOxsTHx8fN02PV92dvZ19r4/djXdNdZ01XTk5PV0pOT1NTX1tXd0pMTklLTFFd/9/Zzc3VzMrKzc3b/+PNx8/My8vN09vbd3fvZ1tfXVFd +XVNXV11jX2/3W2tvd/djXWt372ddWU9fT01ZT1fn79fNzNvbzdXn09Xn793J38/R0c/Zb29bWVtXW2tnY2trY1d37/9dZ/9bV2drXV1vWWdnXWdbX3dfW3dr9+fZz8/J483Rz9XV6+d358zd2+fn3ev/W1lXW2dfa2tv/1tdU1dfd//n7+tfa29v92d372tj +Y1NVW1lbXW9j9/fb3c/Xz9XZzdXV2c7VxNXT2+Pfb/9XXV9bW1dXVV1ZV19ZV2dvb2trd29v/3f36/fra29TTmN3Z1dZ6+fn1dvd1+PX39vf6+Pf49/b3d/3d+P/X01bVVv34+fnd2tnd2NXa2Njd2ddW1td9+/n9+d37+9r62/na+vj9+v37+vb4+Pn2/f3 +/3fr29Xn3W93/2dZV1tZW133b3frV1trX1Vrb3f/d+/ja+fX2dfjz9/r//936+P3/2/n92fv//fn92/3Y11nb2/v5+9ra2v3Y1lZT1tVZ+fr699v7+v3d+vf693f4+d3693b3+vn52tfb1n3Z3fr/+dva3dr9+Pr4/9vY3dvWWNr7+t3d2dZUVljd11n5+fr +2+fv43f/79fb4+vd4+vn2dnr1+vja19nZ/dn5/93//fr92NbW19jX3dbb2Nr7+vrd2tn73dZY2tnX+/d5+vj7+ff/3ff7+fv7+vvd+Pd2d/j4/dvY//vd1//72v3b2N3X1tbb2d3b2/3Y2dr/9vvY+vra1dZb11n7///69/3//9vb9nZ49/j3+Pf29Xf3d/d +5+f/a3dj52//a2NjY2tnW1FVVVNZW19dXf/v73ddb/fr5//j7+/f19PX29nX1ePv5+/v6+Prb///3ef/d29va2tna3frb2//Z2dvY1tZV1dbU1dfX29fZ/fv91/j59//793d7+Pf39vVztnj693b9+/r//f/6+Pb6/9vd19bW19ZY2tvY29fY19jX2NZV2Nj +X///6/fj2dnrXe/r7+/r29/v1dfb09vP2+Pj3+Pvb2tj//9vd/9nZ1tbXWdfa2NrY2dnd3d3d3dva2NdZ1tbX2d329/r6/9vd+Pr3+fn3dfX2evb39Xbb2/rd2trY2Nfb/fn3+frd2tvZ11na2trd29jW1tbZ2NjX1lXX2dvd/ff59XO4+Pr4+Pr3+Pj3d/d +3evf3dtv//dv/2dvW2Nv6293729nY2NnY293/3dv//9va/9rd2dfa19rZ2fvd+fd3eNv7/d34+vn2+/d3d/b59nb5/9rb19nXWtRV19n/+/jd2tvd11ZY2vr5+vn7/d373f/a2tvZ2/39/f36+fX19vn7/fn7//r6+vf4+Pv/3djX19na29jY11bb2/r7+/3 +b//vXW//d//37//372/3d+93a2tvd//j9+f33dnr4+v3/2dvb3fv5+v35+fvd29jY2NrZ2tna19v/3d35+Nra/drZ1///+P39+P36+fv92djb/93//f3//fn3+Pna2//92dfa2P/6+fv5+/vZ19va3f/929jZ//v5+PZ3e/373d3a/fr6+fv9/d3d2dra2tn +d29va3d39+Pv4+t3a/fvY2P/7+vr7+vr//93Y2Nja+t3d/93b/d39//n5+/r/2Nvd+fn3+Pf49/n63djY2tvZ3d3a1/3d//3d2trb3djXV9jZ/fn6+vjd/93d2//7+Pv7/f36+vn5+Pnb/93a2v39+/j4+Pv6//v/29v7+//9/9fZ3dr5+9vb2drX11dY/93 +a29rd/93Z2dfX/f/7+/v6+/v3ePj3d/f7+fv7+Pd2+Pn3+Pn7+v/Y11ZX2Nrb2drd293Z2NfX293b2dnZ2t3/3f/9/d3b19j7+vr4+Pn7+fd39/r4+P/7/f37+/36+fn7+v39/9na2dnb29rZ2v39/d3b29nb19jX113//93b+/r//93a3f34+vr4+vj493j +4/f/d2N3/+/j3+Pf7+937/9392dfY1tfY19rb///d2dnb+/37/dva//v5+fr5+f393dva3d3d2/rd3fr7//r62tra/93d//n7/936+fr5+fn/2dnY2/v6+/v5+vv93d3/29va2NnZ2//b3f/b/9vXWtr7+/r5+f/7+vv7+Pnb29vY2f379/r7+/v9/fn6+fn +93dra29va3f/6+v/a2dv//f/a2tvd///a/93//9rZ2Nvb+//92//6+/v6+93b/fr7+fv7+v/7/fv5+f3929vZ2tn/+v/d//f93drd3dr/3dnZ2f/729nd3dra11fd/f/7+vf6//f5+vv3e/3d+9va/f36+/////v//fv73drd2d3/2tvd+fv7/f//2/v72dv +b+/f929ra2drZ293b29v//dvb+/n7/fv/29vd/f34+vr63fv6+fr6+/v/3d3b3f39+//7/f/d/9rY3f3a29v7+frZ2/3a2NnZ2f/7+v/929vd3f39/f/b2trZ2/37+vv4+Pr7+fr4+vr7+/n///39/f/7/dv72tnb3djX2f/5/d3/29nXW93b29v/293/3dv +7+fv6+9vb/d37+vv6/fv9//39/f39+v/d/9v////5+f3/3f3d2t3d3dn//f/b2trb29ra2tn7+vv7/93/+/n5/fv7/f/d2d37+//6+/n92/3////9/93//93/3f////3//93/2tra2f37+vn6//vd2tnb/fr6+fn/293///v/+/37/9rb/9vb///b29vb/// +d+/vd3dvb3f/9/fr63dr/3f/9+/rd+fn7///d3dv////7/fv9/f/d293//f/d/f/b2d3d2t36///////d2936/f/9////+v3/+v3d////29vb3f/9+/v9+/3d293b2/n6+/393dvb/f/7+/36/93a2tva//v9/dv9/d3d/f//293b29v/2dr9+//b3fr6+/v +7/fr7+f3d293d/93/+Pvd293b293d//v//d3/29v7+v3//fv63fv/3d3d3d3a29vb/f/b2/v92t39+93d3f/9/f35/fr5+/3d2/35+v3/+/////39/93/3f/a2dra29vb29vZ2939/f39/9vd///b29v7+v3d3fv5+vv9+/3/+vn/3f/9/9v7+fv73f39+// +b/93Z29vb2dj/3dv/2Nna/93a/////f/b2t3/+/j3+/v5+Pv7+Pr7//r92937+vv/+/v/2tvd29r///v/29vd3djb///b3d3d2//d2tnb2937/f3b//3d////+vr7/fn92//6+vn5+/3//fn6+936+93b2tvb2v/b/d3d3drb2dvZ2drb/fv6/f3d2/3/+/3 +6+v/d/93d2//7+/37+v/a3f36/fv6+//b+vv9//r9/d3d3d3d///93d3/2drb3dvb//37/fv9/9vb/f///fr9293//d3d+/37+/v6/dv///39+vv93f36+/vb+/v/2trb2t3////a3d3b2tra2dnd//v5+fv/293d/f37+v39/fv9////+/v5+vn9293a3f/ +/+//a3f/b2//7/9vd///b/////939/dvb///Z2v////r5+vvd293//fv7+/3/+vr/+/r6+/v7/9nb/f/d/93d3dvd/9rb//3b2//d/9vb3d3d3fv/2937/drd/f3/+vn5+/39/93/+/vd///9/dv9+/39//v7/////f/9/93d2///2t3//f/d29r//fv//9v +//f/d3f37//37+//6+vn93dvb2tv6+f///f393d37+/3//d3b/93d///d3dvb//vb3f/93d3d/f37+f/d3f//29vd//3d/9vd3fv5+v//+//b//v73d39/f/b2/3d3dvd3dv9/f39////3d3//f/9+/3///////v6/9va293a3f/7+/37+/v//fn7+/v7/93 +/+/39//373d3d29v/3dvb293d/////93a2t3/3f/d3dvd/fv7+fn73d3//dv///37/f3d293/+vv//fr7+//9/dvb3f3d3f37/f/d29nb2//////b2t3b/9ra293///37/f36+v3a2//////6+vn4+fr9///7/f///f/b3f3929vd/9rd/9rb293b293b293 +/+//d/f/93d373dvd///9+vn5+///+/37/fv7////3d3d/f3b293///3//93b2t3//939////29vb3f/9/f//3d3/3f/b2/39+/v6+//7+vv/3f/7+/v7/fv9/f3//939/93d3d3b293d3d3b29vd2///3d3b29vb3f/7+/v9/f3//f37+/39+/v7/fv7/d3 +b//39///////9/f/b//v/3d3d/93/+/3/29vb29vb3f//3dvb2tvd//3//fv6+/3///39/f37+//9+vn7/f//29v////9/fv7/93//9vb29va29v/3dvd29vb29vd//3///3//f//+/v6+vv9///9+/3/+/v9/fv6+v3/3f/d3f//29vb3d3/3d3d29ra29v +b//37/f39/f///////f///93d3f39/fv7+/v9/f39//37+/v7+/v7/d3b3dva29vb29v/3d3b3d3d3d3d29v/2939/f///f3//fv6+/39/f39+/r6+/39/f////3/////3dv//f/d293b2tvd3d3//f3//93////d2trb//37+vr7/f39/f////r7///7+/v +9+/v9+/3/3d3d29vb3d3/3f3///3d2trb2tvb293d//3//////f////39///7+/v7/fv/+//9+/v9/////fv7//3//9vd////3d3b29vb//3//9vb29vd/////fv7/d3d3d3//9vb//v7+/r5+//9/d3d3f39/f3///v7+/v93dvb29vd29vb29vb3f///f3 +7/9rb2//b3f3//f/////////9///9/f///fv9/f////39+/39/////////f3//9vb3d3d3f//3d3d/93//f3b29vd////+/v9/f3/2939+/3///v6+/v9/f/7/f/d3d3//f//3f///f3/////3dvb293b3f/d3dv////93dvb2939//37+vv9/f/d/fr7+// +9+/v7+/393f/9/93d//v9/93b29vd3d3d2tvb29vb3d3//93d//39/fr/3d3//fv7+/r7+/v9/f/d/f3///36+/v5+vv/3f3/3f/d/f/d29vb29vb2//d293b29v//d3//////f/9/9vd///9+/37+vv7+/////v5+v///fv//f3/3dvb3dva29v//9vb3d3 +d///9/93b///d3d3////////93f393d3d//37+/v6+vv7+/3///393d39//37/f3929vb3d3d////29vd29vd//////3/3dvb3f/9//39+/v7/fv///39/fv7+/v6/f///93d///b3f/9/f39/93b29vb29rd///d29vd3d3d/f3/3d3//939+/39/f39/f3 +9/f3/3f//+/v7+/v9+/v93dvd3dvb3d3///393dvb29vb2//d3d3b2////fv7+vv93f/9//v7/f39+/v9+/39///9/////////f/9/93/////29vd//39/93d29vb29rb3d3//93b3d3/+/v7/f////3/+/v7+vv9////+/3//93d3f/9/f3//f3//93b2tr +b293//fv9/f/d3dvb293////d/////fv6+/v7/f/d//39/f///93//f39/f3////d3d3d/f3/+/39///d2tv///39/f//3d3b29rb//37/f39/939/f37/f3////////9/f39/d3d//39////29v////9/f37/f/b29va2t3d//37+/3////d3f///fv//// +///37/f39///d3d3//f39/f3//////f3////d3d3d3f////39///d3d3d3f/9+/v9/f/d3d3d3f/9/f///////fv7/f39///d3d3d//3////d3f//////3d3d////////////3dvb29vd3f/9+/39/93d3d3//fv7+/39/f/9/f39/f/d29vb3d3////d3f/ +////9/f//3f/9/f/9/fv9/f3/3f/d3f/9/fv9+///3dvb3d3d///9///////9/f39/f//3f/////9/d3d/93d////3d3//f3///39/f39/f///////////f3////d29vb2///////3d3d////3f/9/93d3d3d/f37/f37+/39/f3////9/f39/f//3d3//// +///////39/f3/3d3////d///d//39////3d3d3f//3d3////9+/v9///9//39/93d3f39/f3///39/f///93//f////39/////////////////////93d3d3d///d3dvb293d3f///////f////v7+/v6+vv9/f3//93////9/f3/////3d3//93b3f////3 +////////d3d3d3d3d293d///////////9/////fv7+/v7+/39+/3//f3//////93//93d3d3d293d293d3dvd///d///d///d3f/////////////////////9/fv7+/v7/f/////9/f39/f/9/f3//93d3dvb293d////29vd/93d///////d/////f39/f3 +9/f///f/////9+/v7/f/////d3f///f//////3f///////93d/////f3/////3d3/////3d3d3f//3d3////////9/f///f39+/v9/f///93d3f/9/f/9/f/9/f/d3d3d3d3//fv9/////////93d3d3d3d3/3f/d//////3//////93//f37/f/9/f39//3 +7/f39/f3///39/////9vb3f//////3d3//9vb3d3d3f/////9/93d3d3d3d3d//////3//fv7/f///93d/f3////////9+/3/3f//3d3d3f/d/////////93d3d3d3f/d//3//////f/////9/f/d/////f3/3f///////////f39/f39/f/////////9/fv +7/f3/3f///93d//3//93d/93d3d3d3d3d3d3d///////9+/3//////////93d/////fv9/////////////fv9/f39/////f///////93/3dvd3dvb293//93d3d3d//3//////f39/f39/f37+/v7+/v9/f//3d3d//39/f3////d//////////////3//// +/3d3d3d3d3d3d3d3////////d//////39///9+/37+/39/f393f////39///d3d3/3d3d3d3d//////////39///d3f//////////////3d3///////////39//39//39/93///39+/v9/f39/f//////////3d3////////d3f/d/////////f///////// +/3d3///////39/f39/////////f39+/39/////////////93d3d3d3d3d3f//3d3d/93d///9/f3///////////39/f39//////39/f//3d3//f39/f39/f3/3d3//////////////93d/93d3d3d3d3/3d3//f////////////39/f39/f39/f3////d3d3 +//93/3d3d///d3f//3d3////9/f///f/////////////////9/93d3f/d//////3////////////////d///////9/////93/////3f////39///////9//3//////////f39/f//3dvd3f/////d3f////////////////3///////3///39///d//////3 +////////////////////9/f3///////////3/////////////////3f////////////////3//////////f3//f///////////f////39///////d///9/////////////////////////93d////3d3/////3d3///39/f///////////////////////// +////9///////9/f3//93d/////////////////////////////////////////f////////39//37/f/////d3f/////////d//////////////39/f39////////////3d3d///////d3f/////////////d////3f///93d3f////////////3/3f///93 +////9/f39/////////f///////////////93d///////d3d3///////3//////////f3//////f39/f/////9/f3///39///d////////////////3d3d///////////////9///////d///////////////////////d///9+/39/f///////////////// +//93d///////9/////93///39///////////////////////9/f///////f39/f39/f////39/////////f//////3f/9//////////3/////3d3d/////f39////////////////3d3///39/f39/////////////////////93d3d3///v//93//////// +//////////f3////////////////////////9/f3////////////////////////////////////////////////////9/f/////////9/93d3d3d3f/////////////////////////////////////9/////////f3/////////////3d3d3d3//////93 +d/////f3///39/f/////////////////////9///////////9/f39////////3f///////93d////////3d3///////3///3////9/f39/f///////////f//////////////////3d3d////////////3d3d3f/////d3d3d/////////f3////9/f///f3 +///3//////f3//////////////f3//////93d////////3d3//93d3d3d3f///////////////f39/f39/f39//////39////////////3f///93d3f/d3f/////////d3f///////93d/////////f///////f39///////9/f////////////3//////// +9/f///93d///////////////////////////////////////9/////f/////////////////////////////////////////////////////9//////////3////////////////////////////9/////////////////////f////////////////39/f3 +///////39/////////////////////////////93d/////////93///39////3f////////3//93//////f/////9///////d////////+///3d3///////////////////////3//f3////////////////9///////9//3//////////93d/////////// +/////////////////////////3f/////////////d//////////////////////3////d3f/////////d3d3d3f//////3d3///////////////39/f3//////f///f/////////9/f39//3//////93d/////////93d3d3///////////3//////f///// +/////////////3f//////////////////////////3d3//////////93d3f////////////////////////////3//////////////////////////////////////////////f/////////9//////////3//////////////f////////////////////3 +9////////////////////////////3f/////////////9/f////////////3////////////////////////////////////////////////////////////////////////////////9////////////////3d3///////3//////////f///////////// +////////////////////////////////////d3f/////////d3d3d///////////////9/////////////////////////////////////////////f///93/////////////3f///////////////////f///////f39/////////////////////93d/// +d3f///////93//////////////////f///////////////////////////////////////////////93/3f///////////////////////////f39///////////////////////////////////////////////d3d3d/////////////////////////// +///////////////////////////////////////////////////////////////////////////////////39+/////////39/f///////////////93d3d3//////////////////////f///////////////////////////////////////////////// +////d3d3d///////////////////////9///9///9//3//////////////f3////////////9/////////////////93///////////////////////39/f///////////////////////////////////////////////////93d/////////////////// +///////////////////////////3//f39/f///93d//////////////////3//////////////f39///////9//3//////////////////////////////////////////////////////93d3f///////////////////////////////////////////// +////9/f3////////////////////////////////////////9/f39///////9//////////3/////////////////////3f//////////////////////////////////////////////////////////////////3d3d///////////////d/////f///// +//////////////////////////////////////////////////////////f///f////////////////////3////////////////////////////////d///////////////////////////////////////////////////////9/////////////////// +///////////////////////////////39/f///////////////////////////////////f/////////9///////d/////////////////////////////////////////////////////////////////////////////////////////////////////// +//////f39///////////////9//////////////////////////////////////////////////////////////39//////////////////////////////////////////////////////////////////////////////39//3//////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3//////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/////////////////////////////////// +///////////////////////////////////////////////////////////////////////////3///////////////////////////////////////////////////////////////////3////////////////////////9/////////////////////// +////////////////////////d/////////////////////////////////////f/////////////////////////////////////////////9/////////////////////////f///////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////9/////////////////////f/////////9/////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////3//////////////f///////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////3////////////////////////////////////////////////////9//////////3////////////////////////9/////////////////////////////////////////////// +//////////////////////////////f39/////////f////////////////////////////////////////////////////3///39/f///////////////////////////fv9///d/////93///3/////////////3d3d3d3d///////9/f39/f39/f3//// +////////d3d3d3d3d3d3d3d3////9/f39/f3//93d29vb29vb3d3d///9+/v7+vr4+Pj5+vr7+/v9/93b2tnZ2NfX2Nr/+/r6+/v9+/v7+/r7+/v9+/n6+v3d29nY19fX11dX19ja2939+/n49/f3d3f49/j5+fr5+v3d29nXVlXV1fr1dn/Y19dXWNn49/b +69nb2dvT0dPX1+9vWVFJRENDQ0dPT13/39vTyr++vb7BxMPHzc/T5/dXUUhCPDs6NDzTwOdfW11VU1nTztXLzNHd38zKzs7R219jVU9IUU5Zb+vX19fNzM3IxsfKz9vvX1FOSkVFPz07OzUxMjUzNjXvur/N3cfBvLm5t6+0tra3vby5vr+/xtF3S0VBPz9E +P0BLTEpARVPb21VNV0tDOjo8Pj0+OUe7zedHOzo2NzastN3/49vPxbavp62wr6y5ubmxt7vFxNvvV0dRRUpPR0VGPT5APjg4PUM9ODgyMjA8OkBbW1dZUUlDR01ANq6pwl9r2dndxciwtL65ubvBura5s7m3u87L2dV329//0/frUVNXQ+NdUU5CPTAvLzEs +O87VX0c6PDYxOTc0t7bIZ11r/8jFwLS/xs3L1WfRys7R0dvX31nvz8HJvru5t7vFwsTn2b/G409PSD01OTk2ODg9PDk5Mzk+OTBTsdNIW1VJ1Wu+sL3Jw8LKv7+5vMDCxd/3d1X37/fZycPCyuPX0+9Xys/3Rz09LjCv0UxESkEzOjc2QkQ/Pi6px2/nd/d3 +58fCttPZ2cTFyrq5uMDDys7f/1/L1cvR0ctv/93Z/8zO399KSUVDP0JGPENGQjlFSUZJWWtPTarEW1FPT1N3ysfBWdfOyMTEurrD3dvva0VFR01v38/K1cr3587jb83L3WNdXy+ux9dGRTktNDQ0PUo+UWc4qLPX2//fSMjb58prd9HbzcC6vMrX29/ba1tN +39/KzdHLz9vTys3N693NT1lTRkBDST46Ozs2NkpETF3/6z3BqMVJ/1tXyNfvy3fj387Cz8C/yc9fb2dOR1ndy7/D1b7L1c3GxtXO0cDOZ0vGrV/bOjUsLS4sL0BCO1VnLE+nwU/j3V+/yM/C78nFw72/ub7EzXdfb1lCVVnP0c/nzdXX0cvL1+/fd/dTa1FL +RFE9MTMwLzEyRUZLV+tHLKW/S1lfY8vK3fe/38DFvL+7u7/O1VXnVU9j2bjBwMq9wsPRz9Ff13df90U8qudCRD8tJSwrKy9AO0XdVddDxKrB987L08fK58HDxsO4u8fKxdn3VW9vRE5M0dfZy8/K2eff2W9OTEdNW/dZTj1ERjUuLzM0NF9Lb+vX10w3pLlv +wOu7z8jZyri7u7u4vLy+0/9ZUU1FTVvn02vIxtvf92tbY0hnTFM9X7DvS0c+LywvLS45TUZv5+u81VGir9G/zb3Kx//fzrnJv8HBy7/jUUFERDY7PkpbY1Xby93/a/ffU1NJVVnJb+tXX0dFNzIzNTpZWefjvt93Obyqxd/Cy9nLwtvHscm+vsnNzudNRTtJ +PjtGQ9dR78zX2f9rT19O42t3a8+rz8FTSTQyMi42OEZLy1/IxMZTRaG577/N2cfVW+fCu8++0/fXb01EQD89Oj87UVdVd9nN729rW2NPU3fN/8Lrv1VJa1M1Oj9AT2PRz8jP0WM2n7bLyePHzcjX1b26zL7H13frR0Q4Pzw/PT5PW9tfzc/VZ1njVV/v789J +or251Ug7OjYvODtOV81vy8jD3zmktL1338930efvZ7zrws7va+9VQT9BO0E+OUbdW1XFzNFfX2tVX19fzee51cjJW1lVPjg7QlXb1dXbwd1rP6ukuWvTz+PF4//Tws3VyltVTUY9Nz46SEBAP+PDY8HFydvf12fXyNfXvqayvdFVPTs+KzI7QmNrX8zTyVkz +n6u/19/3/91XX9/R0d3OY1tdSj48QTtBRTc7791rzcLMy9vr0+PZ28XMw7zJxedfTkM4NzhTSN9P0d/ZQzOhtsjjd+9nzl1r19fT281PXVlLPztIO0xTTEz3vtnHvsHD09vV3cXRPqGtvb3/bzRGNzIyNjlCYz++X9VbMK2uvs3fY2PZ2U/Xzu+/619Id05B +Pz48P0U+U/fZ2c6+ysfN787f09/L2b/Ru83nS1E/Ozo7TEfjSdNLT0kvtLa//+NV78fT48rHd+vFW1lPUT8/P0pVVVXfxLrRwb2/y8hr42/M69+hscnO50E0PjgwOTQ7Q0tMv9drTDSftszK62fv0dnn1cld0W9dUWdJSEI/SEhDSVvI0cvCwMPDyf/V2+vX +y9XFz9VdZz9CPDU4OkJCSVfjTkdHMam1v+fOa//Ax83IvdnM1WfdT1tCTURMY1ndW8DEysDAxdHNVWNT9zqttb7I40swQD8wMTAyPEI6RtPn7102oq+7z9N3UcnZz8vH2czd51P3T1NFREpRSFt3w8PRv8DCxNXfX29fW93R78rdU0M6Pzg3Mj07RD1VU1dO +TzKgsrvby+dnxci+u8nNwsVZT+NPQEdER/dO2c++xtO/vsXI21tdSlk6obPOxsxDMDU4MjUvOkM9Odnr711LQ6GuwcfX3Vff08C778/F3VlPXVE/RD5ISD/fXc/G0cDFvsfRb29ZWdvM0V/D1UY/OTs6MjBJTEVB/01OVUM8oa69ydfL582/urfTy77vWT9L +OkA6Q1VfTtfZvsbbvsfJzeNbV0k7vKm6zr53Mjc0Miw4Mz9JPEDj59X/Vzqfr7rJzNVnz8m7us7Kx8xLQkk6QTk/TEtIW93By9u/xsPMa1dXT2PXy87v1e9KPzc8Lzg+RElNRl1f32tGxp+vyL7RyszDwrG31+u7T006PzM1Pz9vY09MucTX68LE1dFZVV1H +N6SwtcvR4zI+MTEsOTlGU0xMW8V331dHn7C9wMPT18nLtLnOZ79OXT5FODRCQVVNR07EzMfVy8vH/19MX1fj0cLGzGPVSzg3PC88S0prTllJX+PR7zilrLzKy8f/v7+yu8RvzlE3PDM3N0RP6+td586/yePK3df3U09ZOa6us7vEa0FBNDE1NjFCRVVZ729r +yddLPp+z18PK48/KyrW7z1n3UTc1STE1SEpfVVVd/77P18bT1etVV+Pd18y/xcxvX1k2NDo/PkxF3V9RT+vf3eNKobfFz7/X07++urrVd0xLLzI2NDVGY/dja+fPzMPL2dXZ51tXZ1WmsrrDwFs+QS4rPjwwSk5vV3d3a2vHX0ejtcTJz8Xrv8O/t+ddTUI6 +LzcyOExAXU5fVf/Hxd/Z2WffXffJztHCv8PKz0s6QS9XPElNU+NKY/93d9X/OJ+zws7BwNG+ybm660dEODgrPTE9TF9rZ8t30crDa8bvZ99vTc+ksbm6xOdCQTI2Mz81ONNIY13/b13/d/+/qrrX0cLDyL/EwrxXVUk4NDI5NDhrP3fr7+vXxdXVyF1b1+fP +vcLGxbzf11tNNzVJSEVAd0tdQVv/b1tbQ6apv9vOu8G+wr2/y0hHPzAsPTk9PtlfzszZ1cjJ68TKb+vn90Kfqbi8v8s9QjwvLzs5OjjvUdtVVe9n52dOp6i938zGxb2+x853U0RBNC8vQzdISff379HZzcr/wd33/87Lw7y7ysbJz29HPzc1P05EQUlvSVFT +22vrVUalqLvfvb3Ht7vHxVs+PTsxLjQ3V1V3/8jbydvAyVvE5+P/zkeun667xMNFPj43Lzs2NDHdQWtnX1nv79lvO66tvd/JvM64vMjLTD0+PDcxNTk81T7Z03fT2cbVY8Zvd9vNx723v83JvUtVQDs6O0VLN1FKU0tOX+f/90lEo7S7xru6vru2x8VENT04 +LjI6QE732+u8zs3XxtdLy1/r299Fn6m0wsfKNz44NDo1NDo+RE/P61VZ3d/JRUCisr/Xv7vAvL/dzUk0PD02NDlEX1dbytPf0d/R20z/92vLx8W+ucPM08xPQkI5OjtDPE09S0Nv3+//5+NPPZ+ywL66ubu3w8j3QC41NC84P093Vdd3vd3b49NrSGd3a9FI +raGttMLGXTw/OTo1MC9GTTtFXV/bVdHO61VEn7C8vrzDvbvf12s8MDg9ODVISWNHz+/bx3ff0V9dWWPjyb3Ht77Fz8hvSj09Pjc5PURBP0xVU8vNb9Vj42elsLy2ury4usvOVzMtMDc7OlPnTFvPztlry0zjSVVrZ+Pn36Klr7++30o+Pjo8Mi4/Pkg+4+tf +W8Vv0dVMvaavvbm8vr3CXeNVLzM1PTs9Tv9FTs/v3VP//+vfPGdn2b+8u7fExcnTTkU/RDw3O0w/RUlV3ffV687nvUS0p6q5tLm1vcNnWzooLi09O0Nn609byMj3U0LdY1dRW+vZTcykqLa6wllDPTk5OTAvW0FCT/fX2/93v+/JO6ekrr69uLvB60x3Ni4x +PEVBTGf3Q93vy11JRuPNP0Z328u8vrq8v9XOd0I4Rjo5ODpLTkRbY9fN39vKw+c5oqGru7q3u8rVSUMtKi40PkdP69FEzMrTa0FC7+dZR+/Z40GfrLOzxetMPTs3NjYuOD1GQOv/38/Z68LLykzZn6bAuLi7601JPzctL0BKR0z/d01V3dlfTD7Pb11NY8jF +ur/BvsFd42M9Rjw3OztBPz9MY2Pdy+fbvN3IVzafp7q4t7tvbz44MiwsPklPT99fd/fN129NPtXZZ1Xfx+fboLW4tedRSj06Njg1LkpEP1lb3d/V78O53dPVSqmisr+4vkNEQDc7MDRKW19ZXVdv31nV/0dvb+NOZ93Vvr29xsHNW1VPQkI2OT06Qk9JQctb +xdvTx8HNztXT05+mvLPL/0Y3MjE4MEZbb/df92vBX+d3d09I429Z091Co6y1ybtRQD5LPjU1MTlKRk9Ezsznzsm/48zOxMREoZ+uxONPODw5N0BCR1trd01N/9Vdb2fPUV9nX2/Vyb+8w8bO208+Sz5END08Qz9Mb0zrd7/KvMTRyc2+vFHTn6/L1VE4NDYy +PT1IU1PXW1fXxF1X51NnQGtby99XvKSuvtnEUzpCO0MzOS0+Qkpf28/f17rTt+vbwcDE/0WfreNvOjo1Pj9NXVVJT/dXUevba1XLTuNLVe/Tzci7u77K21tKPDs9Qzk7OUZGT1fZ19nPwcHB0dO9vL/F/6Wrv1dJNzY6QUFVU0pNb+dR293vVV//50hRZ93d +QqCsscn3XTxBOjtAOTQxP0xVa86/0cTGxr/d0cO+x85nq6y8RD46OkVXXetNS09B71Vf52ffTGvNWVF398fCvbzB6+dMOEU4PTtHPDpFXVFV277IvcTOutnDv73Ex+OvrbtPPzc6PUdMTFVEU0drZ1/r99tBQvfvWVvdQqimrbfv1TxARD07QzY4Mkhd9//I +vr6+z7rjys/Cys7R36uw0UY/O0NMWXdXS0dIQlVv/13TXVFfU8lZ39O/wbq6xuP/Qz85OThCPT09S11X58rFvMjHx3fByb3GxsS+s8DPQzs8PElNUVdIPllAd+/fV85PSVl3yV/j72ezp62/2103Szo7PD85OD1CXePjv8G40cvHW8rKw8/OxsG80+tCPENE +79tXTkxFSEVj4+Pra293Wf/E99fNvry+wet3Qz07Nzo8Qj5ET1tK99W9vcPBv9HjusO9w8XCvsTrX0Q7QERPU0pJSEBLRefb99lTW2dnd8/jyc/CtbO3xXdJPEA8Pz9FQj9TTkxjy76+xsy+4/+9zszJ38vB3VdMRD5FW/9jT01bT0tV48rbY+tj3+PnxsvH +w7y9v9HjST8zNzw+RUZFU2NVR9nGu83JycLj18HFxcPNxr7ra01ESEZXVWtLSU1XSllVzM9TW0/f3+Pby8vJv7vAzN9TQDo8PkJHS0Vrb1NT48C71czGvf/JzcnMzNPDz19KVT1KSmNjW0dFX01ZT1nK3Vv/b+fXxtO/w8K/wsz/TUA4NDg9QUtKWef/WVHT +uLzNzcK+zsnExMnJ08bnW01NRUZDTVNOS0RPV1VNT8/nTmPr18/Hyby6wLy+yNtLQzg3O0JDR1FO6+/vX86+vtfXzMDM29PLx9XR02tNTktBU1NVVU5ISFFrU0pjzudf9+PVxefDwbrExtHfVT46NzQ8QEVPV2/n/3fnyb/BzePLwMTLycu/zNPTZ09JS0RL +Y0lVTE5IW2dfVWffUVtv28vG18a/wMrK7+NMQj0+PUdLTV1Z393f3dXRv8vZ487E4+vbycrM42NTSUtHSFfdW1tMU1Nd/1lfZ83dX3fdxM/PzMfIzutZd0xCQD5CSVNfa3fn2evZ4+PE0ff31cPj29nVys/vVV9MT1NLU99va1dfW+/j/19n2W9OZ8zCzdnC +ycrPb1NbR0RAP0tKT1Nrb+/O787T27//d+fK1dnd1c/HzP9nTltfVV9nz/dZWWNZ7/9vU1vdX1lnztnNd9nZ3WtbT1FLSEVBV1db5+ff287Zz9Xjw/db68fR1ePf09XZa1NTT1tMT1n//11fZ29v52tjT99L/+/K1c7b19Hn6/dXV1FPS01fW2/v9+/T293T +0f/Kd//V69vj993X09VvW0xbX19rb9n/Y29jd193Z1NO51Xvz+/J1d3n329nW1tdU1FOU1lv79fn49fX1+ff/91rVdPj1ePr69vd32d3TlVnWWNn4/93//93//93V3dbV9XX69HP5+tva2dZXU9jT1ldWWNn2dvj3dPV32/NXf/j/93n593d387jd/dVXf/3 +b+vd9+dr72f3WV9O31dd993n2dH/91/3WVf/U2NTWWtdd+vd1dnn09133fdvY2tn3dXj39/n0+9r/1NZZ19fX+9r72//Z+9dd91bV1vr5+/X0+PrX1v3WWNj/2dn72Nr6+fV0+fX29//a2P/Z//332vX4//Z52djU1t3Y/f/5/fna+//52P/Z2dvd//b39vV +3e9vX11jZ2NrZ2N3Z1/d59/X7+v/d/9f91tna+fb7/fZ693f7/9bY/ddZ2dr5//jd+f/b/dda1lf/+fr387n929nW2Nja/93a3dna9/r2d/j9+N3a19fZ2d39+v/5+vv3d//a11j92drd/fj9+f/7993Y2/3Z2fn2Xfn0/d392NZb29na1lnX/9369/b5+fn +Y/9rZ1tvY3fb5+v/3efZ2+PnWW//Y2df9/fn52P342tjX3dXX3fvd+fV9/fvX1tb/3fn9//ja9/n2dvv699va2dbY29db+tvY//rd+Pr93dZY/dvb2ff6+fn9+ffb2dr73dr2+dv59vv63dnX/dr//9rXfdn6+vf2ffn/1tZY19rY1//4/dj9+Nv2e/n73df +b2drY+fb49135+Prd1/rb2fr43fr1+9va2NVZ2tvd29n73fn69vj7/fvZ1tdXf//Xf/j52v35+Pb//f3Z2ff/29r593j3evv6+trY/dna+P3b//r52f/XVv/b/dva1//6/fj29fvd2dnWWNfb/djb+PfY+v359/n69/3Z3fva2vd19vj6/f/62tbZ2tbd/f/ +9///b2djW2dv9/dv/+/n693Z2ff372ddWWf/72Nr/+9j6+fr729vb2tv//d3b+fX393v9/fva2drb2//b+///+t3b2N3Z/ffb2f//+/v39vb/2d3Y1lfY2/vXf//63f/49/f/+vnb19v/2v/3dnX4+93d+t3W2t3b3d373f/b2d3Z2f//+N3Z/fv7/fn3d93 +d29jWV1n9/9v73fv59/f4+t3929n9+9v93ff5+fva/dr729fZ29vb2//9+f//293///v529j9+P34+ff42tva2NZX2P/b2/v9+/3593n5//jb1tn92fv793d5+dr72//b2dn///3a//rb2v//2d3b//rb2f/4//n393372trY1tdd/d3///v/+/f4/f/Z29n +Y3f3/3d35+v37////+t3Z2d3b3dnd+Pr//frd2//6/9na+/v/+vn4+9rb29nW11vb2936+t3993n5/f/919bd3drb+ff4+t39/9rd+9na3fv/2f/4+////dr9//r62t39+f/99/n7/9na11fY3dvb2/343fn3+/3d19vW13352935/f373f393f3b3drZ/// +Z/fd5+9372f/5+t3a///63f/6+Nn/3dvY1v/b29rd+v/b9/f6+v/b19VVf/r79/T3+v/d/9nZ29ra2tvb3dvd+fn////d//v3f9v///v9+fn5/fv/2tnZ/93d2/34/933efv93dvZ11Z7/9399/v/29rd293b2NrX2NnZ3fv493v63dr63fr//fr6+/37+dv +Y/dnX1ln993Z18/V3e/j/29nX19bVVVrZ/fn3e/3d/9ja29jXWdrY293d93OztXb2+Pn4933Z2dva2Nvb29rd+f3a/fv//9jd3dnY+/X62drZ1FTa2dnb1137/937/fn3+fn29POz9PP29nvd01FPzY8ycvfa9/R43ddV2dba19f393d4+vHz7+/wcfb53dZ +TUlTXV//79/b29PN083XZ1VR/0dHPj4/PTw+Ozs7177H62Pv79vKxsLCw8THyby7uLu8ur7Av83X41FMR0ZBOjs+Q0tHSUtNSkdMVUs2M1m9y19ZVdfZb2tdRj5KTkpPW1tMY19jzMO5vru8vru5s7W2uby8v8XRyM/dZ0s8R0hET01MSD9KUT1LTD46r669 +71FHQ0JCR0c8O0tITEl3b8HBvby0tbu3ur/Ay83bZ1VPQzs2MDs8NTE3Niq4vd9JUUA2UVdCoKe0zsfZ0+ddZ1nvSe9BRXdvxc7AvLi5ure3ub/Da1VVW0g3N1FJ20NOQUz3Pf9KWU1ZT01PRN2ftl/fUUM+Rjw4b0g+REA6TE3Ty729vriyt6+/vMvd60lb +Wz9DSsfjX1NrTKG8xd/3PzRGSUFPM62p0TzvVztHPE1JT0n/SU1Md9W/ubivsriyuLTA5+M/bzs7PklIQl1n/2tJwUZHXU5fWWdCSfdFL6PIQD83Ly5FNUtNWU9DV11X1bu4r6ytrrWvsrrGW0o4LDI4V0pRWVtHob20x+9RRsjjU2tZR1csn8ZGWz4vT91A +PlE9Sk9LUdXJuriwrq+1urm61V9BVTdENlM2PDg8U1U+19O9X8vZz1PR4+dP/y6hyU9XSz9FUT1GS0NGPk9Pa+u0u7CqrLO6t8HjSUouOjpIOVtCPbesu+/DWURfwndKZ1tf929HLZ+5Y+db2Tr3Pz/I/0hva0j/zL22u7S6u9Pn30ZVRDY4NTozQjpdVVNr +18DR08nf7+9Xd+9PRy5dpsZHZ7w3b99JT11jTldPTOOxwLyyu7fT3VE+Pj04OEF3OTmmtLTb0//vzs7vsG9A4+vnWfdOMKC6TkjnPjjMSl1nTkPrW0s+xrbIvsm/wc9TRFc/RTcvRzM8QE9fzc2+vbu4z7+13VPX32dMPTOit11fTMJIa+9KSkE9Q0tBW1HB +t7u+xt3VXVNnQ1lXQVvNV8fCvsjEybzHyMfTytPIZ+fOW13bunfnSUBjR0bb2UljREhDS1NI0dPP09fvXVs8/0ZVPkFBX0/Z99fXxsHEv8rI273H7+PN51dn27/H00pMY01PS9VFU0VHSllZUUvD3e/jZ1NIQUpVz9Nn/75LznddXdHH1cDKzefjxt/n0+s+ +/8/VUUNEPUl3Z83P4//3UUdn59F32c/V59tnZ0tnX1NOU0/XVdN3z9vRwc/O19nIa+fr49vdWU1LREVIRTxDa01fZ3fv2ePXb9Hb7+PV6+/nz+fXd9H/999r59HrTHdZXf//b+/Hb//d0Wdd3WtER05HV1VNSv9f1+fjzdvV7+tj3dXb1dHP49/322/32+vr +69Nvzdtra913X//jXWP/5/frXe9dW0tZV0tITkZXWeffd9l339137/f/4+fb09n/63fj/2/j4+/NZ+vLa1NTX0pda93b3/drX9/T1dN3Sj9OT0FKa1Xvd+PM39vKzc/X0dPV09nO/+drWUFGS1dOd3dPS1FMSUdKW93v4+vT29vLz9/r3cvMwMO+zsrNzMLD +w8PCw8HKztHd12tfS0Q/ODI0MjI4NTU4Ojc8OTc4ODc8OT5JP0JjuLG0uL67vLmvuLe1ubWurqypqaimpKWprLG+zv9ZR0U+OzZXMjMvMSwrKSssKiYjIiEfHy8yLywtLjFBRNG8wL68r7Gvq6eipKajpaapq6iqrLK3ubvJycDL0/f3V04/Qj05MSssKbas +wVU0KyEoJycpLS8uNS83RW/GwLGzqquxub7Va1lPY9fT59nAtbS6sLi1uruysr/A69td97673Ts7MjMuLCkrLScxLzc8U//n1/dra9lVSefv69fj0WfTvsO+r7OtrK2yuMO5vdf/QUmfoa/XXS8rNi4uMiwmMy4wMllfZ0/Iu9lLVUlAMzAzNDQ/Y0vJwbWu +qbCssLmxtbO+2d01pafC0b7rOdfPT2dHREzrOkTr38hZ00pJODAuLygmJCYsLTE5QlNrwri/w7/Fur68ubzETqqfn6e10U1N611C3zZNX8HfuraysLCvvrTjTTQ2IiEiICksLSozPj7PzLzC0cHZtb7VX9cqn66wyUhjX8LNycP/58DCuLeyr6+zsrvCZz85 +MCsvLScsNSwxLz00SUxXymdvX3dd601fSSyfn7G2wjBvQmtGXfdVu8a1sqqmqaqoqL+tyGM7KjUoKzsvOTc5R0TTV+fDRVM7Y0c/MiwhoOs2Okw4Z0drd+tj28LLvbqsqKmqqq65229dPS8yOzQ6W1dMTVfDxLXEvsVjW09GPzcwHz+1odvvQyv3KTlCLzpB +TnfGv6alo6SrqLHDz1c8Ni45M/863W/3xruuq7DIr8RXwudAMiohoNMuLyswNyw7NEgzOjxG/1nVra6xsbzfU0BFOjg+Pv/DvbvIvbi2r6autba0ysXOSDcuJ6VO57LvRTBnMDQ7LTE1QTRVXc61tK69ve//SP85PjwwQNlb0+O+sqispqivr8XHr8VJPUMu +qPc+OiwvPjA+Oj80OkE6OU/PzrXTyEI6My03Li42PU7LzrvAt7CqpqSqr7O1v8vOTz9CKp9vrLr/VT5IND5NLjk1PztJ48O+rtdXRzk8NjYxLjM2RG9Pb925taqmrKy8ucbDyk5DOiahuF9NSzM92TzvXUhJSe9HS867v8Oz51EvLi4tMCw6MWfZb8vGvrav +r7Gyx8njb09bP0gtr7BJu6nOS8NVRkXVOlVV70vItri9urVRQj47Oi48PTs561FO68PGuLWpuLXA3UxK9zZNMSus9zg9QC5rxkrj71fTd8BvwL+zwMPOzDw4Li44OTpFY2uvwLi7t7CurrO9a/89QDQuOirbrMMpvqln38JfW0dOPF13Y/fGvr3Du+fZPDs+ +VTXva1lNw87Iw7Wzr7Krvs5vQjs1Kzo1NLzKOzU7QTxbU1v362Pb377JvsK2xsHbV1cvPD03SVFr/7vCrruyvKu0tLXNRzw0NS0sMDLdwXcwLK68wMfL61Fb1/fvz1/jx8LD1+9NRDw9X0PH48F3usi5urixrrOuw+tVOy80LjAw3ddPNzQvPkDXNsXRZ9fK +18e/x8y/1+dOUzRCNEc8W9fZxrC9rLStrq2wtctvTzYyMjMzLDvA9z0wLLvCtO/Z21VOz13fy29j51VdU1s5O1dTa2/3vcC7wbi6sbivtLi7WVdDNDY8NjI+5+ffQUo+RFddP7vj78TPa8nN0dHTW0xfOz0+W0xGT//j0bXHrbeztbrHz2NKQjg4SDg8Pl3j +z1tXX9FfuuO1ytPM12djd1lZW1FFVUY+QkZNW2vr11m+77rnzcHKxtXPXU9OTmtRW0nn09Pv5+Nfb8BRt8LDzMbZb9Vv/293QkZFQD5JT08/S1ld29m7z8TG09dnd0ZNPTxOTTtH/9/n23fP18Xbzr6+y9XFztnRy+9rVUxVTVNOd293V3fT12PjzONZW2dV +Sz9JSEhISV9Va+vv19V3//dr/9nMvL3Ry7vExMrF2dPvd1NXV1dva1dMZ2tTXf/M2ffZ729RTUZKRklLU0xdVf/f3e/b291Xa8vfZ2PM59f/63fn91nf59935+dnd9nP4+/rxd3r92vnb1dbW0tfVU9Xz9vf69/r52tZV2Nfydf399/b1+vvY29jY+/32ef3 +7/9P92fr79Pbd2tbd2//WWv/d1lvY19bWV/r3+/r691359fvXV/vX2tVUVVVa1H/69nRy87X5+fP493j3/9bVU9jW1t3Z1fj99fjzufZ1dn39/9jXevv42fvb+fna11jVVFVWW9d//d37/fv3ffX39XOU/dTd2d3a/dn/+/j59fV48/P1XdvX+dZ92//a2Pv +/3dVU0xTSFNf72fj7+NbY+fv3e/j3+9fW2Pnb3fZ5+/f2dnf09Hbzsrj9+ddU/93b2djY1H3X1tfX1Vbb29f7+Nja13ja+vb59nZa29na19d/3dj6/fjzNvv3c3N0dnb62Nr92dZXV1rb2dTXU9XT01dX/ff4+djY+tn99/X32//Vef/9//X5+fV3dff5+fd +1efj69frVWvb629v92dVTV1fV0pOa3drb/d3Y13j///349v/XW9v62dr0Wtr7+vr3+Pf39PV793v73fr//fr/2f/52Nr91tdUVNnZ2tva91fZ2f/7+Pva1tfW/drY3fr59v/79fn3+f309vra/fvVV3rd+t33f9bZ9/ra29n39vn1+Pd/3ff99vb4+djW19j +/11rb1lfa3fja11jY+/jb+fn/3dra1//Y2//Z1vn7/dn/+/n6+fn2dvr42tv99/f59trb/fvb2tn72/v7+N3593//+Pv72tjWVVd/1tdY1Vd9+NfY2Nv6+ff3c/d69/Z7+/Z/2tnX//v52935+9j92/n73fv7+/3W/f3Z13r4//n//9vWV1v/1lVWfdv9+fb +5+fj29//3+/j//f/7+v39/9j9+v/3+v/72/vb+Pj2f9rXVVrY1Vn71dXd+//W2Nn7/ff29/v793Z39vb6+/3V2//d11r6+fr79nf5+drW3dnY93vX19da2Nnb3dnX/ffb2tdXedv6+Pb193f52v3///nd2Pv6+/vZ/9j7+t3393j62/vZ+tv6193b29r/2dd +a1Vb/+//a+//a+/b2ePn/+ff793f72drZ2dnW11nb3djZ+fv6/dr793v9+/3Z1trb3f/d3dna2/j919fa+9v3dnn3e/j4//f39Vnb2f/d2tvd2tnX+/r/2vvZ2//X/fj92vrd//3a11ra1tv5+//Xet3Y93d3+dv6/f/7+vf6+/3/+vnd3dn5/9vd3fn7+Nj +a2/3b+v/719372tnY2NXZ+Pn/+f3Z29j//f3Z3fr6//v93dna2//5+/v7+fv9+vb3evvd+/v9/fv63dr5+P392djW1lfd+frd+dbW2/33/dn73dj/3frXWddX11n73fb3dnn63f33eP39+/b3+PV7///319ja19jZ+vX93djXWP37//vY2///2NjY1tnY2N3 +d2f//+///+Pb4+frZ2//7/fn///r2dvd3ffrZ2/r//dvd+tbXWtv33f/7//3629rW11nWWtda11r39fn6+Pj4+P/Z2/33+Prd+vn7+/3/29jb+fn69/n72/vd+t3b+P3/29fb19jX2NZX2dnb///d+vv4+v3b2/34+/j93d37/f/Z2vn9/fn5+f/59//X2d3 +72/v6+fr5+d3b2NvY19dX1tdd3fn4//n5/f3a+/n2+//5/93/19na2dn9+N37+Prb/f39+fr92/f4+f/b2Nja2dva+f/3+f3a2/v4///d//r99/jY1336+N3b2drXf/3/193b3fnX2f3b2t3/+//7+Prd+/363fn9/93/+/v///va//n52v/23dj7+/vd2vv +9/dj6/93a+frb2d39/9vZ+/j3ed3Z2drZ2t3d+936/939+Pj2+PvZ19fY/drZ3fr49/va2tv7+fda2/3b+/ra2drY2d359n35+vva3dd99/n4+Pn///rd2/3///n42tf/1Vjd///a19jZ2N36+/3/+djY1t3/2NjX3fn5+/n7/f33+/v293b3+P/3+vj2ePf +3ev3d/9XT1tVb29fd2dbY/9rd29nb29na3dvXWv39+9d7+v//+vr49nX2ePr9+/n6+vr4+/v5+/r92t319vrd2dvXVlrb/9n//fra2NrY19fY3dvY19rW11vZ+/v69/d3+fn6/fr3+PZ39/f5/dna+f/6+9n529ra+fvd2t3/29va29nXWNn929fb2trZ2tn +Z/fv5+vn5+vv3d1vb3fv//f/b2/v393f4+Prb2/va/93b3d3b3fvd3f3b293a2tjW1lnZ3d3/+937+9v7+fr7+fn529vd2tn9+936+//9/9r/+vr593d6/9373djd/fv73drd2drb2djZ2vr92Nva3fv6+fr6/f/7/dvZ2tr9//r9+Prd+/n72f/5+P/7+fj +7+/n6+vr/29jZ2tfa3dvZ/f/b/93//9n/+/nb29jb3f/9/fv9//j729j92//d+fb3+vj3+v3d/fr33dv////b//vb2v39/dvX2fvZ2trb29v//93a3f/6+Pvb/9va/93a/9379/36+ff6/fd5+/39/9vb2tdY2//d293/2dr7/fv5+t3b2tfd2//7+/r93fr +93d39293b//v//fr5/f3593f7+v/Z2drZ2tv//9v//9vZ2v/b+/v//dvb///d+///+/v//9nb/f3d2/v7+9r9+/v5+ff3+/v6/dna29v/+vv/3drX1lja19n5+Pn4/drZ2dv7/f/b/9vZ2t3d2Nvd//r93dv7+939+/v9+v/d3f//+vf4+fn3ef36+Pr9+fr +/29fX3drb+/r7/93/2Nna3d3Y19ja2dfd/f//+/3629vb2tra/f/79/f6/fv92dv4/fn4+/nb29rY93b2+//Z2NfX2Nnd+9va/93a2fv69/3/3drY29va2drb3fr4+/v4+/v4+vr49nf4+tjZ29rb3f//+vr6+/r5/f3d2NrZ1tZWV1jY3dd/2tZb2/b5+PT +2dfVb9v/b2dnW1dZWV9ZVWdrX+ff09vR2c7T2dfOzs/Z23djWdn/Y11NVVVNR0ZFQEBF3b7G2fdrV1dZa3fX19PMzdvN0dnTzcrNzNPb52t3a//n//9vWVVXV01IRklLRT1DXf9JR05VZ2///93TztXFxMjDxcHHycrX3efj9+/3///j69lj2c3n2XdnZ09T +UXdHZ05CUUxLTkdITVNTzbi/yf/n91tPW1ldS0I4Qrvr12tXSVdJTFXv92P/083GvsfBvrqysrW2vcHIvl3dZ1VMS0M/STw7PEFIRkRZwNtASVU/Q0FNSk9FT0JDSUpIZ1Nb32fdb2Nna1/HxsG9sbSyramrrqappKuqsbu2tsu8uG9POy4tJCcpJW8tKiEj +JyAoKy81NzZEr7/H29lfPkxLPUJBNzdCQ0pnwLu9r6mrqqempaipoqSoqKuprKirqrS4w+dXPjUlTLlGKCgpISEnKygnJyUtLSctQT4zTuNNV07/2W9T38rKsrSsra2ssKytq6q2scjPyuPvxb/Kw8XZwdHNXzGsujxVOTkqLyssMSkkxd88Kzs9JS8+Q0lP +TT9PX0Lrx7+7rayrp6yvrKKqrrevsMpf311d329Ob+9rTT0xK6fbPUJjQywzMDg9TlFAS3dN9/9COUVLTTo3OTw2MjU6Rf9vvaits6uqqKmxrq6528f/xudrb2vG729NPD0sJ6jLNUk8Rj1MRFFEOKO1yUlZP0JVPllvRTJMQzgvOkJGS9vIvbyzrKaqr6+y +wr5PyFtZS0ZOSuNNS009bzkrn7JbytdNTdU/Sc5HTk5TSWNZPD9APz9LNDc5Ni4yMTxDW8y+wL6srKqlq7K0sve2vetXY1XD087Z2UZrXyyiv79NQfc4SWdNL6TB/2NTPTI2NjZHPjk7Nj45PDQ5RUVfzcXHvruvo6+ssbuw78/JZ2PIyMDG2dtdTFlfXTKf +rc277+M8R0z/PjkxNT0vLjIyMi46NjMxODU8Nj5DVffLu7a3rqmmo6qssrm3u8bJ71m8zsHZ70s/V1NrKq6uz99vWS9MOSaqSDwvZywoMzsxMzc3PS84REVAQ//Jx765ubGmqaqop7K7uKvbwb7f78PJz8pVW1tLRkMrb63XPkk0NjdFNjY+LTM+LzY6PzY+ +QU4/PkVNVVvv18/Lt8C9saurrKiqr8Svr8LPy+v/x93V605PQ0dHTz0vq9s3P1MvPT0kql9ZM004LD86REdDRl1bTWv/01+9wcC7v7qzr7Cvr6e2t769t9/FxtPLyd9RTEE+Pzs5NDCsYzRdNygvOTc2NzE3SP9CU0tP91vr1edP2dHPY7/EwbzKubu0sLCu +r66/vcDOS11R99tv/1dHQD9GOD4zJabOTEI7My86Kay2Tj87QkNVW1NXXVfr0WPTy8jAube7uK61uri0t7m5vd9nv05JSVFETktTQT9BNjg2OTwkp77nQzo9N1NPT0Q+PldZymfZ1cbT48bE5+vOyMa/yMq4yb/Jx77K0bK6yV3/V0dETU5XTEk8Pz04Qjk4 +NSOnsv87Sz8+QjkwpsHZzMTGd8DPy8Pf27zP99vD193Ay7m8ycvIwMLVyNvjRVc7SzpPPDw+Pjo8Njo2MDo7J7euyU/n70/ny87Ld2vG27zJxsLF2+PfzVlNU/drZ2/T389ra9fdWb29xttnd1U4vlP3PkZVREhNRTw+PEEta6y7S05nV29HTqm/ytHNW+/D +68zN/13Lym9rzstVzMxr529Ma2f3U01ZZ0NES0BI2U1ZUVtrTVVNUU33/09XrLDL0/fv/2Nd6+93W9tMUcTP293ra1HfT1tX611nvmfZ929r3+PGzcnVb2NCPz/TSVFHTm9V/0lIWV1nT9W2tbvH08/ZX0qqtLvT39c/vT2/SGdRVV9PTFVRTkvOT1VXTkdT +W19KZ2NdUUrnVUxvxU1nd+vvb2/v/+tPyLquuLzN39vO2+f/11tT509HSlfbTEhPSEZATUJXTc5nUU9RU113b+Pjzd93b+NjVcl3/9XZ/+PrV99b/89TZ8W2u8PXz1XfsbW7ztlOQkTGSltHPkVJUT9LRUb/SFlZUVVvUWNMX1XK0ePj09fvusHEzsrf19fX +2dnZxdXby8/I411jT0xTUV1XZ05NRudJW01fW1NdT1FPZ+v3b9/rVWv/b3fb99HXZ+vjb3fE48ndztPR0+Pv683f1+vMzMbM2fdZU+tZWVtfTktHa0pRPkNHV1lLRUtnUWdnd2//3e/Vd/fVzcPGxcXD0by8yc/d1dXf619r1+dva9nXa2djWVFRW05HT01I +RT1VZ01OU05PTU1TW2Nd43fv4+PZ7//R19fRzMjByMrXw7zJyM7P2dHVztHV39nb39/3X05CRkBKUUdLS0REQUxvSUNGT1dXZ1VVX19vb/fX1dvT49fTz8nFxcnCx8vDusXM38/d3dHX72fra3dd619XSEpHS0RJRkhMT1FTT1VVRFVNVUtvW1Vn6+ff987f +1dfXysjExMTHy8XFzs7O0cjV7/d3919ZX1VPXV1bX11LUURNSVNRR0xKWWNXa2drXV9ra9F379nV19fN3dfZ09n3z9nRxsbK0dXR1dPV23djY11jY1tRWVdPTk9ZVUhOSV9LTllba/9312/v4//r/2vv79/369/j493d2+fj4+ffz9vb1c/R2dnd1+Pd5/dX +Y1dbX01OW1ddUV1ZTFVOY19b/1tjW2f/7//363dr7+Pd49/f2dnT093V0d/b6+/f6+PZ3+fn6+vn93fvXVVZY2NdW1VfWW9bZ2dRTk5jW0trb3dv793nW2/f3+93693f39fN09HZ1dXX3dfr593d99vdb+P/d/9vb+ddVU9ZTkxLSFlRT1lbd19nZ2tjd+Pr +/93d49/r19Hb2//v39vv/+/n2efX4933Z///687n0+trb/dfa19jY1lRV1VnWV9XX2Nna2tj/1VdXev39+/j29fP2ePn39vd6/9v3//f6+/f49/n2fdrb2Nf72trd2dfZ1tnZ11nb2dZV19XZ13362tj72vr///v63fd39fX39vd1dXd19fd693Zb2P/9//3 +b13/XU1TVVNZY2t3b2N3d3drb/fvb2Nn//f3Z2/36+/j9+v3X+/Za//vz9/b49/v9+vd3+tja//jb/fv5+tv9+Nva2djXWNfY2NnVVtdV1VbWV9fX2Nj7+Pv993f39XX09v/d9/d3c7R4+vZ5+vj5+vr//dr93d3/2f//+tj/1tTT09ZV11bW1lXV2NnW29n +63fr59/Z69vj5+fb3evd3+/n2dv349fj39/d5+/f5+vfd1t3/2dnY2drZ2NVXVlPVVVXV19nd2Nda11bd2N3b+9v6+fb29vf39fd0c7O0d/Ly9nPztXr3/dvd3djX19ZT1NbWVdVWWdfW1FbT1NPU11rd+/v6//r3+9359/n99vj0dnZ09vd2dfb3efj7+Pr +Z2ff62tv/2tnZ3drZ11VV29jY2ddY19fb/9nX19bWVlra3f/7//v5+/b3dnT1c7Tz8/P09vr59/n9/dj9+9j929vY2Nna11ZVVVfX1Vba2NbZ2f3b29jWWdfd3f/6+vr49/d99vb59ff293f3d/n49PR5/fr7+vr9///d11ZV2ddd+93W1tv/1trXVdj/3f3 +d/d37/9352Njb19rX//r4+tv7/d35+fj3ePb2dXb09fvY//v59/v//93b19rZ11dZ3djZ2NfZ/93V2Nrb2v/63f/d2fv/3fr9+Pf6//j39/n3efr5+9372/369/d5/9fb29jb3djd293a3fr9//n7+9r93dnb2NRW19rW2//d/fr/+tva+P/9//r5+vn3dvj +4+Pn5+vn6+vr9/fv/2Nbb193b2djb293b2dvZ3d363df72//42tv/9//39/3//9vd/f3/+/35+fv5//r5+vn5/93a29vZ/fv7+9rZ11ra2drb2Nna2djb+/r9+vf9+fn9///Z1t36+/r6+Pn7/9va2tvd/dvd+vr7+/n7+Pj/+vr9+/////v92djXV1na3f/ +Y2vn7+9nd+939/f/a+v3d+9vX2vv5+/f6+Pv63f3b29vb/d3///373dva/9na29r93f36+Pv79/3b/939/f/9933d3fn629v6+93d/dra19bWWf//+tv7/fvd/d3////d+//9+vj9//3/3fv7/93/2/v3/9vd2dfY29vd2dv6+Pn7//j9//n5+vn6/fj33dn +b2/r73d3Z2ddZ2NdY2//5+v///f//293b293b3fv/+/r9/fj/29392/v/2//7/f/9+/v9+/d3efv9//3/2drb/fn9+/f63dv929ra2//b29vb2tjX2tdW2dvZ293d+frZ3drY/fn7/f37+fb4+v35+vj7+Pj5+vn39/vd3fv/+/3/2trX2NjWVljZ3dva2tv +/29r9/dna3drb3f34+vr5/9nd/93//f//+/v59/n4+vv39vj5+fj9/9va3d3//9vd2tfb3dra/93d3dvd///Z13//2tnb2tja2//72dnb2/v9+/39+/n39/n4+fn5/f35+//7+vj6+/v6+/v73d3b2Nvb2dZW1tdXV1v79/b393j6//v/2tnd//vd11dX1td +Z3fn6+ff3dnb2ePn/2/3d19dX2dnX2935+Pf2dfZ4+vf4/9jX1tXU1dfa2trd/f3b+fd39XX2dHb7/dnX05XV1dfZ/f3///j39/r3ePr911ZT05OUVdn693Tzs/RzcLFzM/T2XdbSktIQ0dIS1Vf/+Pf59/Vy9Pf3XdfUU9VUU9Vd+fr1czMycjLycHEzd3/ +Z01DQ0NFR0tOT11r69/f4+Pd29v35+v/XV1r93fv3dnRzdPTz83V2+P/Y1lOTEpLTk5RV1tbb3fn29HRzc/b1dn3Z19OU1lb7+/3493Z09HRycvP3/d3W0VAQUJHT09fY2tr493ZzsfJz9ff7+9XTk1VX1/r7+ff3czPyMfHys/rX0xFRD4+QE5bZ2dv49PL +x8S/wsjP71dKQElFQ0tba+vb0c/JxcrMxs3dd19MPzw7RUlOV2vf49vMw7+/vb/GzN1rT0E+QU5JTFFbb+//39HPz9fX2+9fb11MTlNZ39/b2dnM08nDx8zZ52tdSUU/Oz5BRGddXf/v29fRzsXO29Xd519bW1VXW2vdys3bzsjCytXX71dbWUlNRD9JRkhK +W+P3b93Nx8zNzs/f2+/r/19LT09rb+vFz8rGy9vN7/9ZU0hPS09OQT9BSUxX28zNyc7Vz93MysTHzu9dTENGTEtNZ+fr17i91dff51vvZ09RSUI9PENXb93PwsLIy9XVz87j4+9rW09dT0dJa1VO/7vR3d3vb1VRUWtvT01IRD9BWe/Rz8W9vcS+wr+/2dXO +1+v/419FR1F3TevFw7tPY1lXTkhTT0tIPzw+PkNT79vnysDRa1NVa1VO3fd3991jWWdd1+fvvqywu83F087Rzc7j4/9TS0ZIT/dr3WNnv6+6yOfvTFdvY3fdRTs9Pm9DQ0PGqrJXO0M9Ozo8PUA4NjM1NztPd2/fz+N3TUZLV9/ZyMLCuMDR48W/v8q0qKOs +vtvjv8q/tbm+xsz3TUlfd3dCMkapsMxOPjk8QUZOWfdXNi8vPEU2Ok63uFk5MUg5NUtOSUg/PTk5Pmvb62fj2ed3T1Vnzcy7t7OusL/VY73F5+esoafTz1nP3czAub3J1dtLP0NLd1c4O6axwF9CNDZEQk1r0e89NjE7QTUzOK21xWc2PD8+R+fj91FPPDw8 +StXM2dnZ3+9j/1dZz9fVv7u2zVlK39NnQ8ChrbhVb0zj09vGu7jN0WM/PkBVy9HrP8antddTSTo7VVXfy1sxOTA9ODcvq8m+sUo/PlVFTdlvW1dRQD5IQvfI1//Mzutv42NnyMXNx7G0xd1vStFnO6Otvr5IUVXHXW/Cutvbb084Oj1G529FMqOtx0I+QzJd +Z0zMvzlBOTk4RjHGrcS9ukc7QFVCb2tTSmtLOj5APs/V2c3G391n4+POvLq8rKu0vM/jW8BV75+vvstjTENjSevF2UpKQz8xMzU8Sz88Pi6jvkY6RUw9PVe8zko5QT9NVS+hrr/HrVs7Z0pr0/dNV0pZSExKSMHG08y9z9NvXczj18Tnr63ZzufjRGsyzKrG +38tdOkVjRlvB41FRPTo9NTg/Yz5OWT66rXdP62syOte70WM+Rkg+d02ir+evtclP90tF2eNn31VTWd1BU8zIXb/Z0dVvRtvX61dduLPR40fZOz84zKx363dIOTxCOktH4/dnPzg8PDo9/0lj1Ui+pbxfzs1jO8Wuts1KTsxR3Uihrr6rtcvOa0RC2U1H22NM +TVFNW9fP78tv2VlRPkxdV0JTxLrNdz9TQzwsvq3n21NKPT4+OWc+OV3EXT5KPUpR21vvyGs5t6i/y87FOsSyxb5fXULHXTGisrmpzd3I31tC1UxCVWc6SUQ7X+Nfb8nN//9XPkpVSUpLvtfI1UtGPUEsvqzO0VdLNkNIPk5OOUlP3dtZRUFba1n3yff/RZ+6 +wnfZTFO6xb/H6z+5VTWlrqmu08fJvU5N59tI/19bT0VITWdVa9FrW19NPkE+RT1XyWPrX0w+PUIotqzD50ZZOUI3O11vO0r/705TY9XRze/Lyc/dOJ+uwFX/zc/DycXZ513KYzKjo6zfwt9VwEZOUW8+U13vOE9LSu//Y8vX21NRSj5BQEXNxW9310dERUUl +QKy9U0d3NkA4M0FORz5Z91U5QO/Tys7Tws3ZOJ+oumPbv7/Nv8HIyVHVRT2fpLjruudXwVdGS1NDQWNrNTk6XU1r/8vR3VVrVzg9PEfO01t33f9ERUYoya69a0ZjP1U6N0lPRD7Vz2dPREnLzr3Hus33N6apulvvu87/193F11VLPMmfsr13y19r42tLbz47 +QO8/Qz09R1NZV3fX40H/TkE+Ql3R213j3cxdZz0rq7G702P/QeM/SFVdR013zV/dSlPnY9HIvsn3QFOjv81Tx9NHU1nA0V83NVufwL7Pyf9d6+d3TzpEWU4/WT1R/1tV383j42PJ/0hFT1vGz/fv38/d/zQprqnAa1f/U28+S1FNR1tRa033S1ffU0rFusnZ +SUyft8Jnwb5ISL/bd/8vUT2osr1f103OXd/bRjlPV0hRRTpLX1tPU7zZ0+PM3VlFUc2933fny8vdWTUrqre1W1VbR2NAPEtIS1FMTVFRRUxdUUnjur1v7zpfo7vZxr9AW+9NR1vPL2OqucVvy0/Rd9HX6z9nWVVRTkFC71NTXcnGytXD0/dT27nL2eNn2Xdr +Ri86q8LDd29HTmtESU1BP0c9PUY+SFVrTktnzb7v3ec4obe+12PTRVNFT7BCJrWru8/Fz1W/ztXB70FR3U1Ob1FE41NVX9/KwsLB09l3zsHbd2/V90jvQi0sqc3b5+dAWd9XXUFPPk8/Pz89R0NdT1lZWce/2f8toa+4Rc5ZN0hNuucwJ6mqwcPrw/+9ze+8 +7z9J11dPY09B111r79nEwLfEys/MvcfvZ+vHQEzbPC42p8vnzt87RXdOWUM/O1E/PDg7OkJNSlFZSMC7x0wroqK7d2PrN1m7RU41LLSsvM3bym/H09vD2WdG2VVLV1FP11/Vzc7PvbbB2869vN/n291jQlnbTixXqblb2V9LS2tdW0I/PlM9ODg5O09OSlFX +RL68zj4quKG1RkzrOL87RV8vJqqtxcnP2ffP292+yFdf21VJQ2NVZ1vXx8jBuLi8ysm0um/B2etfTktjSinKpbtv4+tBX+dTT047Pko7MzU2N1s/Qk1nW9e450kzd5/F50b3x10xR0o4Jaitv8PP23e/29W8v2tj/1c/SE1fa+fZy8q+t7e/w72xvdvN291T +S0rrRCixp7/b59lHV+dEa0k2PUs6Li4zOkk8RU1ZVeu920M51Z+33UTFsS48XUM1Kqevv7nP2ePNzsjJvt9ZX01FPD5jVU3TysnDvLfEzbmyvU93yv9KSk5XPif3qr3X79trU093z04+QU48NDA1PD49QWfN2f/PvUw8z5+400O3xi49O0QsL62zvr3XW8/v +y8K/vtfnV0NJOjxfW0LZxLu5v7W8yriwwV/ny1dASUNLNSq8sMV3zedO30zvzuM/QkVJMTM5PkQ/S//Ly87Zz9Hf95+vyVe/Uy86OzwoS6230b69TWvjXc7Bze9nPkM9M0VZU0jVyL+7ube8trSzwOvN119PSz5FNyqrs73nxN1Pa+/XztFAQENAMjQ6P0Y+ +S9vLytHX5923PrCpxNnHRy05OS8nL6zG18W7T+dn0cbHx+P3O0A0O0BrUVPjxsa7vbe7uK/Mw9fVb09TR0A/Mi6ossHvu81Ha+PK2dlPP0E7Ojg5Q0lDTM/EzsvVX8euO66qwbY7QjE9Ni0p3bTf58K6SGdVxsRjyMjnNjM6PUBvRFfbxr/Bt7fCr7PCy7/P +WUlCQFE3MTqqtd/IudNT/+vD11VvSz42OzQ8Rk9AW9fHxcvHV8u5TLahs688MDU0NC0p37RdTse1SlFZyb/vXbpvPS89PD1TRUPnwb7AvLu8rbe+ysrHWUI/QUs5Mmuls1+9vM/r482/xVdB3UMyMTk7Qk1GTtvOxsvJd7zNRz2fuatFLzMxMisrsblPTL66 +71trx8vOWcPIRiw7OkQ+TUJvu8C+wLm3rrnKusrvb047PUQ9LTqjtmfZtd/v/8u/2c9RX0Y2Lz86RkZJTWvRzsvJU7HfYzWlr6tIMjkuLywrrrNdRM6350xn69lr79F3RSstPUBDTkJXu7vGurqyqre8v7XR/0pHP0lFMz6jtM7Rtc7Z68LDy1vbT0kwLzo6 +P0dCRHfvX9PTZ7fbTzWrpaZDMDYxLSsqvrFrR/+0zFlX1cpjTb7nUzAuPkJLSUh3vLrFubq1rrW8w7/GT01IOz8/LeensN3dvMvR99m+yU1r3UEzMjs9QUtESs3Zb9/F0bfR/1UxoZ9bNzU4KioqrrZdQFHCw+tM0cjfSdPHQTYuPT1HREvfxr7BvryvtLG5 +wMnV3UhEOzo7L6qrutfvxP/LY2vAzFNn90UwNjk7P0lCWc/rZ9/Rv7PJz28vtJ/MRzc5KSc2rb53S1fOvNFXz8nRXdfO/zszPEhGQk1v08TCwL6vt7m1wsrZWUg/OzM0LrixvuP/zt/ZY//Cyktdb0IyNz09SEpGb9Hj/8zXyrHFxMk/Tp+u2zw5LyI+rd1f +UVN3xs1Vzc3RY/dVXzw6NzpGO0d348bJv7+ttLa3wc3vW0s+PzQtNq2xznfR98nn/8/Bymv/Wz02Nz49OktL/9/v3cbVybPCxc9IPp+uxj84MCDCt99bTV1Iw8z30c7n9+tKWUdCOjdLPkXv38/Bu7qstrK1v8n/Vz8+PDAlPqvA993ZUb//X8/Iz03vTzs5 +Oz4/OUhKd9ff0cPNuri7vstZa+Oou1U3NCOyt2tbT/9HyNPT29ddd29LSExIOjo/PUbd9+u/vryturK1v83/V0I6Oi8mvq/nd9vdUch3Z8vK3U7dVz08Nz9FPj3n2d/b08nbs7y6vdHXvz2nvk89Lz28w0lRWVlP69fJ69NZa1dEPl09PEE/OGvb2+e9v7+r +tbO1vsx3XVc8OjMqrrjRV9dbTsvr79vZ60pbRjs5MzlAQDpFz2/v79Hfs7a9v9nbuy+ksWs1L0q51V9N91n3682+2etb/1dHP2NIPjw9N07r12PEx7+usri3vclvX1E5Ni0rrbXn59fbUcnZ3c/X52f3RkM7OzY8OztCze/f1+vVuLa7x93Fvyuyrd0uK8G+ +VUROZ1NRX9G+31db905BPUxbRTs6REl3zf/Oz7qvrrS0ub3vV2NDOyw9r7j//9HZXd3Vzs3b5/f3RERDODw4OjdN/2vv3V9jubW3vOPIvC7Lqdk/Ka7MT0RIa1lTTcu9xmNv71NDPkNVVzc3O1dZ1d/V2bi0rrK3t73XV2NINi13uMnvV+/v4+PVw8vXb+Nr +R0lIPkQ+OjhK/+fZ391vuba0uXfEuD0rpMc+K63OPEpBXUt3PtHEyFNTY0lEPT5ZXTcyOEzj48nfzbu1rq+4trrKW29TNC7ZvWNb9+933d/nvc/Z7+P/RUxETEQ9PDU7Z9HjyuPfvLq0umPLrkMnq6s6OK6+MEdTQFtfQVfFxVlNd0pGRDxnU1E1Okf319XT +07i8rq63ubfEVWNLMCmywUFE19tTxl/XvMd3d+PXS0pJVUk6PTs+TdXLzczrtrywuf9rrkouKadFzbfONDVKPkpPPVvX2d9OVz9DPj9Mb0Y/OkhP0cnI1bm4r6qxuLK6z2tXOje2wj9FY29V2VnbxMROW2NnRUBDTkc4Nz09RVPXy8/nubyuvcvRr0tFLsy7 +rrrfSDg+P1lTRM5f3+93W0VFRURJW0M9OUZRW87I08C+uK21vbe+z29fNPfBzTtCW09n09/MxMtjWff3TkFHX0Y2MjtESkhn09HZwcCzts7Is3dHOC+qpsZXV0g2Pl9Ta8xRXc3Pa1FVSFdTTUw9P05dV2PDwcLGt6+0vL3Lz2s/M7ndRDtBSUJHX9Xjz/// +XWvvV0tJ/0s6NDlRWU7v38u/vb+2ssXGre9VPymmp85IXVMwO0lNztNfTtPZb01LS1NTQFlEPU9jXVnjvbrGtrGutsLHyuM0y8lZOjlAR05KQde/21vfV19rV05VZ103NjhFXVv3zv+/t8G5tb7Lr/dnRCmuo8hPTmc1OEg8yr5rPtXO1UpMRFVMPD5FPUBO +T0/b29O9ubmzssfRxdc1sbtGOzs/R2dVT2O9zXfXZ+PTXVtVZ1c3NTlEU1fdyNHrsrK+urzXs9tPPj+/pcJfSVVCNz1MTOvdP1/vzE9DQltLRjpMRT5NWf/fx9fBtby0sc3Xx2NKr8U8OkU+R2NnXdnT48HnUWfXX1lRa0s9NDhDVWfrw8nbv766uLr3tc1K +ObtCpMDrSElbN0VZV1df20Jf0fc/QklJPTlPRj9DXefjzcHfxbC2tsbXyEdMrN07NEk/RVtd99vM52/EV+vfXW9rVV1CPT5Ka1fLv8TZuMnEr713ssE+P7REu7XnV0RNMkJVSlFLPVFn3V0/R0lEQDr/S09A39PRzrnMyrmuucbZ00e1tlc8OUBEQkxX1d/L +2WPPy+9bVXdfSkpGQT9D61HGyL/dtM3XvrNXwsc4yaw9b67DVVNHNkZVSF33PD3P210/TElKQD5ZY1NGb9HTy77Dy768r8z360+oxUE+O0JISz7j1f/rzV1Pd8dPUWNvTEs/RT1DVWvXx87RvMHZyb7Gy80zra89K6i2409BPUxOTkfXTDdGwONDRk5XRT9V +63dT3d/L073Eyr6/t7v/TMWqz0c+QDxHSTxdzF1j091NWdXfV0tVQUg+RD1HV3fZ48fGy77LzM7R57k3tLZAJ++syu9JQD9fU0bbZ0I/3czVP05LW0dL49dv59Hvx7vCzL+/vr3ETb2rvkZBPTxATDhFb99V/9dLY2NjWWtdQ0lNSURFV+vd3dG81bvE08zI +Wbv3sLtEOiuovr9GR0w/U01ja1NBV+/JRElFTEpEa93n2dvn777C08bBwLrTSrKowkdGQTo+SjtHd1dr5+dOW99jU1tOU0dNTUJLVXfV38rFw8S+09HA7//MsLz3Pyqssb5NR1lAPmdPX1lFTl3RTT5PRE5IS87f29vf58u+zNPAwb3JR7euv1NISzZBSD5L +XUlO22dRY9lrXU9KRlNJR0hKU1vn283Aw8W779HDyUCrssnbSS09q7pbSWNCPuNdTGdOR13VVzpLSUxCT9Pn3evZ6+PFvXfXwMPRT6q75/dJQTg8P0JRXUVf1W93W9fn609KSUxMT0dXTVl3683Ixs7A2dfIzUGuodNTZzMuqrfPZ2dIP11vT99vS/fP50NK +QUpMSe/N32vn22/Xv9FvyMrXWam7W05bQzY5OkJJSkBrd2df7+fX11U/V09IZ19nTufZ0c2+vsPFxMrLz0GqoMdHT0syqrvFWVU4Nk9XSFdvPnfj40BZTD1TVVnTznf/3ePNy8tnxsb/b6e90VdKUTo7NUZIRjlZ41Fb91vj3VNERm9FP+vvU03X18jBvLvT +u8HFz0PDorVTV0guqa2+119MM1lrR013PkNrY0Y/Wz48T1//5+9f3V/d0c5rzchP96ax59tTQ0JAOztVTEBJ0+9M3/ff2+tKTlP/SkzJW1Nf187Hx77V477Pbz/AqLFOY0ko2am9d+9GOEhnTUjvV0Fnb2NKSlNFSPfXyd//29//zsdd3cdVW6etz+/bSDpG +TjlETT1K4/9jWd3d32NHVUxVU09XX2tZ/9vLxcDG68LM7z69rqvHRU8yQaq3yVk8OjtVS1lIX0pXX2trSE1RU03du9dv98vf1cvH38NfR6atwtN3V0M+PE5FRTpK72djZ1vT03dLXW9OSWNnUUfdWf/nxcbK98LDbzy3rr6xSzs5Na27tVM6Nz5MSllPTFNN +X13dUU1N12dV1bjnVd3F187FxdHPS6arssPbT1lMPTzvQjs92/93UVlr42dLSFtLSE/jV0ZF519nd8fR2e/CXznnrb7Dvz0yNqy3yds5MjlRTl9RT01LWVnbY1lf59VZzs/H32/LzdfCxdHj96ats7/LRUlrQj9BSEE6Vef3Y1dv9+NjVV1KU1NdX01LQ3fV +V9vX39f/YzO9r8/buEItNq61x0Y9OjlMVW9nVVlXZ9nTb1/R593rwsXV783Vz92/vs9TvqiuuL7dT0hKR0dANzxHRmtnb1tfd/9Pa1NRU3dXUWtfSUpfzWPX3cfrZzqysc/rvVkvLa6yxE02NEFETl1rV0pNSmPPWWPn3WdbvcHbX9/L3+fBxMZNraiztrzK +XVFGQVdBNDY9VVNTU1tVZ1VHX1VKTfddTFvjTUtr39vTz8rrW+ett8fRt3c1NquxtU44MzhLVVt3VUdMR2PZXVt361VP18T/V1Nj9+vVz91Xr6y9u7bMXUpGR09JOTk8S2fdV+9r72dVV2djb+f/W2/341Xnb13jxc/jSL+vudvjuMU0NauzwFM4NzQ+TG9v +UUNKR13v62fj91NjzdHR51tX79vK1W9dq63CyrjCb19EU04/OzlBQ1Xv9/93b1tdWVtX1d93a9nfXWPr/1X/1c7vRLKwu+djy783PquyxkQ6ODU5RUx3TD5AR1n/d1nV/1tnzNv/92NZW/fO1/fjqa+5ybe+0+tHX2tGPD5JRVfv61fNX2Nfd/9R69Fr7+vZ +WU9n/05d78xJS7i2x+9Z9749Q6+zyj84Nzc1PUPnQkY6TVd37//T2W/nysn3Z2NrXePVy0OurLS/wLfBzeNG//9COz1ESkzvZ+dn51f3Z+tZ3dPr4+PT/2dTY1lV6/9Vd6q+1edrU75FN6+03Uc7NTQ3O0ZOTjg9RlFf/+vb4+Pf1cb/Z1FR7+/XXU6srLfD +wre6xN9Vd29DP0Y/Q1n/413ZZ1nv9+9f29/r0dXT51tdVVdZ42c7/63F3+trS8TZW6633UM7NTE0O05PQzg5Pedf//fN59XVzsjvX1lMY9XHVU2pq8S8xLq5vl9V71tAQkJAPUT/0XdjTV9b02vv29f3ys/M1WddVVdO22c9vrHBWdX3R13K0a2150JCPTI2 +O0hjRTU1RFHbY+PO2d/Nys5vZ1NIX2fXSuOtsMbOyby7v9VT30xFQ0VDO0NX09lnR1H/4+/309Hb08nF0Xf3WVFTX2dEs7vE///Xa1HMs624Z0RBPzY0PkVZSzU1QWdrXc7T09fOwc7rY1FLVf9vP/etuM/VxMO6v99rY0tFRUFBPD1X791dSk5R7/fnytvX +ytO/zev/W1lXW1FRr7bN/2PfTl/Hqa3AWUdDQjk3OkpPQDU7QGNn793H187Lycn/X05NX/dnQr+yv8rfysPAvO/ZX0pFSkI+PkFT499NSFdX/1v/38Xby8rGxdt3W2PvVUjEscLNZ1tPWUCxpa/NRUtFQzs4QU1OQTE6SFldWdPVytPLxdf3X05Td99OVbO9 +zsXdyMfByc3Pb0lCV0tDP0pX3+NIQ07vX19n487L1cfJy9t3U13/SkayuP/f51NLTTvFpLHjSkhLRT87R1VNPzM5Q/9nd+vXyMjJw9n/71td9+9X67LD3cvOzsbH2c7E70RCTElDP0JZ4/9NQEtr/2f/59fXyMbKzs/rY2dvSlG3uF3j32dHTTvIo6/PRkVE +PkY9R1VLPTU3Q1fvb/fX1cu9yd1360//52tPvLS+/9HPzMHH19/VxkZIR00/SkVZ9+NOP0hbW/fn59nd47vL0dXnY91nQVOxvU5T3U9NTzm+pLDBRkVAQj5LRU1HPDY3RE9n6+PXzs7Iu+fr62NvzWtVr7bIW8/V2b/I293bb2dNRUZGQkxXW11LREFOTWPX +09XZ18fGzszX92frS821y29R0UlLTjrBpa7bd0Y9QUFDTk9AODY6P1FTa9vVz8zDzdvLd2v/12/fsLjZd9vR3b/BzNPX/2tOU0RKR0rvY09LREdGT05v1dXf2crj077vd29dRbm80VdV3VdMRT27qq3RW0pPP0ZHV1lBOTY9QklZb+PVzMjCyev30V/v50zb +rr9fW+vT2crNytHd/+tXRWdHT1f/WVNLS0tGV1330c3Mys/V2dfFZ/9KUbTAZ0tZX11NPjpfra3Ra0w7U0NFVU8/OzU8P0dd/93Xz7+9zNndd9nb50jEsLtZV9vTz8fL083Md+9vTUFVWVdrU0hXTEhDSWP/1dfOxtHb19Hr0dlFY7G950xfW1tjQDtPrq61 +b08+PEVPVV89Njw7PUZOY+/d58m60+fb51/X30e6tMfZV+vRz8nKzNPP3//vV0hCTttrT0ZPb0pDSV/d09fPyMzbzs/T3+tVb7S/X1lZV09fRD7vsreyd0xDPz9H/1M7Njg+PkRNa+/j4829zuvf52/3/121tsj/92/nzdPKy83f49v/X0tKUffZWURZVU9D +SGPZ19nJys3OzdfR2/9G77HFW05vUUxjRkDjsb22z1NEQkZGT1c9Njw7RUJHWffd28vE09nn729vV0+vsd1vY2v/yt/Pys7V7/f/X0tLX+9XV01ZX0xMSF3d087Lx8/Px83Oz/dPzLHFX1ldZ1dPRUbbsL+/301EQ0hKUz49Ojs6PkVGT2Pn2c7H1+fn729v +TtG1uNtn51PVzuPTx8vZ1Wtfb1tO9+tfQlH/XUpFTVPr483Jy8vTzsvNzddXuLvG711XU3dKTEvEsL7GyE9JSUlTTEA5OUE5Oz9GTU9v1crJ03df52tjS9+yx3ff207ny9PZys/Ty/9VWW9d7+NPSEdNb0xCR0/n59fJzMzP1c/O0d9nsrzPVeNbU2dLWU66 +r7zGzllHU1lfSkQ7Oz5EQUJETV932c3M12NXZ2dVR8q10U1J3U5n79XZ1dvVz19OUVfn5+9KSlFXUW9VSlXjz83HxsfE1cvTzP/fr7nbV1Vra1VBSv+2tLrPd1tBR3dbSj48Oz09Rk9HTl/XzcfKyu9X//9jS7u11V1OW2/nY93Z1efd1fdVR01n2VlAQU9P +SERLU0lZ59PTzM7F08/R1XfArrvna2NX6/dMStWwsLbRd81MS93nSD4+PT5AQUtVTVHnzsnMz9VjXV1bTrm4yVtNV1td3+/b79/X0f//S0dr011HQFVTTElKRmdVa9fTy83JzMvX713Tr73vY19VWU5dR9W4sbfOa9n/S+fvSz4/P0FHS0hHb1ln18bIzt3/ +Z2tRU7W0yl9OU2djWd3NZ2vb1+f/SUZn61FJQklNTUhKQENn9/f3ysvJy87R90/jrrrVX2NfY1VIWWe4tbbJ52vZWW//SkdCPUNKVU9JT//f48vH09/vd3dTScKxxlNOT1//W1/T2VVj093rV0hv52dITkpHU01JRkZMb+d318nLy83X3U33r7POT19dW1lM +S061tb6+2Vvv2193T0VJPUBIX1tLTmf/zcbMyd/n5+9fS8S0v11OUWP/b2//2+tn79HXWUtfZ2dIS0xGT0xMREdRUVXn29/Kz83V30rvr7fNV1dbV1NOVVm6sbrLzldJ2e9nb01GPD9NXWdXT29r78XG19Xj4+NdS7uyx+9ZV1v39+//d2dr29/TX1NfY19R +T0hBWVFFRkdNV09r3c/dzs/Z70rbsrjfVV1bTVFPV2+9trrG93dM3+tXY1lJPDtjX1VbU+tn48zJzf/X299rU7Wzv2dVd1lr39/jb29b28t391tdV2NnX0o+SGNFQkpNW1Fnb9HK387Tb0VjsLr/VVNnTEZRV92/ucHO3VNP69VOXWdRPDld91VTWf/3483V +y9lv0ddrY6+vwW9Vb3dn79Xf72dnY8jRd29vWU9f/04/P1tOQ0ZOV1lda//Jz93TZ0jPsb/jV05ZXUVJXe+7vMHZ2WNFd81RTXddPTtR711XU29r2dHZ/9Xd6+NnzrCzymtdd3fv79XZb19v99/M3//vX1Nd31lIQ09RTUpMW1VnX/frytnvb07Ftb/vU1dR +TUdITv+9vL/OW/9PU+d3SllfQzxFa2NdW2dv2c7b92/X6+9X2a+2z+9j72/3287jd1nr59vjztv3V2dX72tPRU5RTE5MTFdjY2vf583d/0a6tsRdV1lTTUZOUf+9v7/PXU1ZU9tbV01XRT9IX29fa2dn49Hd////42dn1ay61f//6+9n58nda1nj29nd28zO +/0/3Z2dZTE5OT09RTVVfZ2fb3d9vW1G7ts1XUVlPS0VKWd+9v8DZXU5OV3fnTldJR0VTX3d3//dv39Pd//f3Z2NnvLC60W/v599n48zTXVPn1evZ29ff92ddd1tfV1VRV1NVT11bXf/n091rS9u3v9VNTllRR0NIXdO/v83fV09PVVHZX0VHQUhZX29v/+/3 +29vr72/nZ1dTtq+702/f3df/2c/VW1vn19/f19XXa+/3WVtXW11VWVVRU19bW2vn39ljSFe1vV1XU1NRTEVLW86/wdfnWUtXXVlva1VAQktvZ//3d2vd2evna/djZ09bta++d+/f79nn2c/nZ1/j0+fb28vPd13f70pNY19VXVdOTV9ZUfd33etbSdO6xudJ +V05RTUtRXcq+xNXrT1FXZ113Z1tGPVN3/+fva2vb0+drb11nU03Zt7rF32Pv79/n19djVe/j49nf1c/L22/va2dLd29vd1tPU1tfXW/d599XTL28yvdZS05RSkhVd8i/y+tVWUhTVVtv90hBREVn79vna2/XztlvXfddV0fZsr7T1+tj3+vn191TTtvj5+fb +79HX1f9rW1lZTmP371lTV1//d/fn1edbWbS4zmtZX0pZSUxfzcXAxmtPUU5MWVdd50ZAQk5O69vrY2Pv09trW19nSETKscLv/+v3a+Pf1edbUdfb69/r2dvP2d/nW1lPY03d329ZV1dj6+/n391La7S3zldnW1lKT05rycXCx29NV01bVVtX20w+QE5nU9PZ +a1/v1dVrWVtbSz/Ls8DZW+9f71vd2+NRU+PX4+Pv59Pb1d/bb0xOX2Nn0d9jV1ln3ePf5+tOZ7a4yl9RW09RQ1F3xcfCzG9PU09XX1dX629DPk9Xa2/N919v1dPfX1dbTELKtL3ZY1tjb3dr2+tNU+vb393n59nR29fb61NKXVVnd9N3U09v49/Z4+9KTri4 +ze9VTFlTS0nfxcXIze9VT1NXWV1P7+tLQklVX+PVzv/33czZ/11fT0DCtb7ba19T/1/3a/dLS2Pf39/369nj2+fb92tRTWNX39vfZ1Nb3dXV3/9RUbW6xvdbTklVRVFXxsPHz/9VTVNdWVNTU+9NSEtOa2vO19/n59XT3WtdT0bVtMHX729fa+9r21tMT3fv +39nr/9nZ69/r72tZTElVXddva1VZY93N63dLWbS4zu9ZVU5LTUvjzMTGzmdVVVVja1lRV2dbTExRU2frzOvf39fd3etdS0bHtsPV43dr/3fnd29KT+ff693X493T2+PZ/+9jV01OY/fnW1VTZ2/b2V1Ha7m73VtbUUtLSEpdxcvL02tNT2NvZ2NbU11jXVlV +WWfZ39Pj28/P49lrTEfBtsfX9+9n//f3/1lVS2/d2//Z0d/b193j9//3XU5RV/dna1NVd//d02tIZ7m5311XXUtJR0ldycDT3f9ZR13/W19XV1FdY19VUWfr2+vR2dvO1+t3XUjGtLzX6//v7+fr61VKUVXn2et319vf39/Ta/f/Y09LU2t3WWtfX/fj319K +S7i432NfVU1MSVH/zcfP72NbS1n//19RXVNf73djU1/v3//Z09vZ0+djW0nDtb7X/3dn4/fv709HSGN37+/369nX69/R63fvX1VVV2trVWf/Y2/V3V1RUbi8y29fVU5NSk5ryM7N419NT1tb92tVV1df599dWV9r72//ztnd5+N3TUjVtb/X52dv5+/n91tM +R/f/513f49/Z3d/X22vvWV1ZY1tnY0/da3fv32NHa7a5z/dbW1NTU0z/xdX/21tJTl1Z6+9fW1dr49dVW2tv9+vr2c3d4+93UUjMtsXb//93d+P3Z1VJP13vd2//2ePfb9fb6+///1FnY2//b1dd43fvX2tMWby0xfdnWVlTU07jxtf/a11PTFVv//dXV1Nb +99n/W29va2vr79PM33dbWUrTtrvP92tj//fvd2tLTGP3d2tZa9Xd7/fn9/ff72Nn62tZX1NM59/X/11NX762xnf/Z1lPTEvTw87ZXV9MTE1XXW93V2tnW9vnZ1nvb2/f5+/T091fWUrbt73Rb2d33dHR32NFS19b511dXd/j3d3f3evna1FZ92tZY19Va9Xr +Z1FHSLq3y+drY19bTlfTxdVrWU1VT2dfXe9vV1lbY+/Tb2NjY//R1/fjy91rSETrtrvL5+d3b83X21dPUVljWXdj6+fn39vfd3fnY1132fdTT1VRWXfbd05GRsC1wd1jd1dNSkvjyc//71lPWUlZW3d3611R7+/T3+v/69/T01v/zc//V0lVuLvZ/2fv387R +d1VTVVljV113a+f///fN29vbZ2Nj311TVWNfT2Pj/11JR8G3v/9TV1VLTVndydX3XVFJTUxdX1tjX2NXd+PR2133a9vN193V09X/TEZTubnA/1vd3cnP6/fvV05XTU9nb93R42/f2f9rb+/j/2tMXXdbW1/b21tKRWO8vtnn/1VPTk9rzNHZb01HQ0xXX2Nn +XVdXX2v37+vf1+PV3+PnZ9ffZ0lIvLfBZ+/dysnZ5+9jTVtj/11Tb+vjb+vVzuNj99vjd11db91XWVtZX2NXS1u5vsprUUxfY1ddzsfZZ1VLRUtbV1tPSk5V79/v29v3a//ZztXrd+vrXUtEv7PE73fb49XR1dHrY1FbW01NXdH/693R13fj38/V719ZZ1lf +Z/fv7+9VRUG7vchrU1lTX0xvy8PPb29FP0BLX19ZV29XW2Nf78/b7+vXzuf3Z/f/91s/TLvGb+vRzszK23fvX1VZa1dNW+/n78/O1+ff3efvZ2/vb9/nX19dZ+v/Skq8tsddVWtrXVdVzcbf/1lJREVOW0tHSl1RU1133dPX93fRxt3nb1Ndb1tGVbi8ymPb +3c3Izu/n901bW1lLZ+/v2evnb+f/0c3d611dUe9vV/9dd3djS0zRucBbV2tZV1NnyLvD41tJRkNPT1NXUVtZVVvj2c/J92/nz+tra1nv629GQsG+y2vb1c/J2+f//1VZa0xJTF9r29fbz+P/793r9/9d/2f3Z29bXWtjY0pfvMrrV29v52djyL/Ha11MS0pL +T1NfV2N3Y2/v18/R6+fLxs93XVlfX2dNRN29yvd368zEzXdfX05LTElPW2v/4+/r6//v3e/X3WtfX2ff2/9fVVFdX0trub/bY1tbZ133vr7JY1tXSklKU1dXU1VdVWfvzMfM09fRz89ra19bW3dTQeO7ws9r587I22Nd6+9OTU5MTFdr593f4+v/b+vd0edn +W13nb3dbX/9vZ05Tw8DZa29bW2PXxb3M//9PSUJDSlNOT2dnb2fvz9nd0c3X0d1vd11db/9RRVu9xut308jE0Wv/71lITU1ZTlVr993Z2dPdY2/V72dfWffLzu9dU11bU1dTz8TOXV1jW+PVv8fM709MQUpEVU1RV0hTV/f30eP3ydfX383j91VNd09PRuO5 +vM3vytPP49/T611GUU1VWVvf69Pf2eNbWevJ3+t3b2vd129fV1tbVUxFzL7K91dZU2fnxMLB3VdVR0Q/SEtXWUlVb3f/29PRyM/d/933U01f72tdUV/ExM/b0dPb2+vd/2dbW1dVX05X/+fVzNX32dnX/13352vfyP9TU133Y1NHzsDNV0xZV2/XvLvGY01V +QEJAQ05MSkxv6+t3389v39Hd/87N62dbU1dXS0nGu8rf59nTzdnX319NR1NVXVN30c/O3dnn693V02/v/2/TyNPrZ1tdTkNF/8DC31trW1Pvzr7H709OQj5FRk5PUUpZb1Nd49fj18nV3+vZZ09VY19TTELGtr7N19vj3Xf/61lTY/dvV05b6+fV0dPX/+fT +z+PR19vZ09V3W1NnV1lRTb7Fd1NZXV/bzb7J61lPR0RCPURDREtf///n3dfvb9vj4+PdWVNPXXdfVUfGu8HnY+vj09vR2f9VT19VWVFd/93b1crL1d/V1+fd4+/bycvX529nUUpFVb/F/1FXWWPPvL3N/0lDQDw+Q0lMT19vX1Nj499vY9vT4+PZ729ZW1tV +Rj/LuLzZ59fR3293//dbUVFZVVVf183b19XZ92/32c3NztHKw893Y2NbV0pGTcK/yu9nU1PbwsTNb1FNSkhDRkNFR1drXWNd9+Pr48rG099rX09TV19dU0trtr73Wevn7+drZ2drX2d3Z09RX2Nj49fV3+vVzs/X3dfLyM7jZ11ba11dT8e7zlVMTFPLvbzA +1VlMQkJEQURJTExXX9/X2d139//Z2efj9//v62dVTkdPvL3NX/9fb9vZ2d/nT01JTUdNXWvd29Pdb1Nj3dPP993N08vO1efvW0xMPVG+wuNrZ2/Ixb7L2d1OSUJDP0dVZ+9dd2Nra19r79PNv8nf62NnZ19ZZ0tHw77H29vj9+9dZ19rTlVfa11OU1Ffb2/n +d1tR/9vX08i/ztPjZ19VT1FVSPe5v9NNUVvbxL3I1+NLT09OSUtXTk5MX2/n293P09ndz8fn5//fZ1NbX2dT07zE91dTTf9r39vba05RTEpGS1Vb91lfX1v/2dXn2dfP03fd3dXv/1tNREO/v85bW19vxL+9v85ZRkxAQUNMX1vr79Xfa2tv1+PVzMbb99nZ +1ef/Z1dHS8HJ2+/3d9/Z/+tbXVdRU0hERllfd+drZ09RXWdf68rFxtvT1edZUVFNRkHJvM9db/fbxcXBx+9NRE1PU09nb1VbVd3jY2fn19/Ty7y+09nj62NZV29dU729x2tTU13bd/93a1dOWVFVS01XU05KT09na2fXzsjH0Xfb2/9vVU1NS0zZuc1jU05b +48i+v9f3WUpMRUpTV1NNXWv3Xf/Pz9fby8nK3+fZ2d3n29tdT8O6yF1PVXfn49/R0f9dV0xDQUpbXVtV/3dZUVn318/O03fn993f/1tLTUJPy8zfU1dd3cK8ydP3SkdIS0pMT11jb+Pnb2t3a//bysTCx9HX09nn/29VT9++zGtjd9nR0ev/b2NXT05RV1Vf +V1VTXV9VU1l3683Hz9HN1+d3UUpITEhOwLvVV09Md8S9yNdfR0dLVVFdX11LSUtVXW/j69vRy8bFzdfV2d3nZ1tjU9G3wdtjWV//69fR09l3W09VTllbU05TY1dRW+vTzMrL1Xf/d//fd1dbWURI177TT0hJb8vEyc7bW09OSkJETVFTT1f/d19nb+fZzcrL +zdvj087T3+frUWPBzetr59vZ08/V199fWVdVSk1RU1tj3+tfV1tr99/Zy87R2e/jd2NTU0dH78DPTklN58G9w9d3T0VGSVlbXVFMSkxfV11ZW2v3z83MzcXL0dNvW1ddTHe7vc5v7+vn18/O1+dZWWNbV1fvd2dfV1lPUWfVz9XMzM3X62/d42NTTEhFZ73H +70lITmfP1c/R909HSFFZTk5MR0xOW1dZW+/NyMXOysvf39vT393/V1vNvdX3Y2dn2dHX1+v/b29dTkpMT05b/2tvXW/r3ePRy9XX6/fR0+tnd2tRXcLHY0ZMWePKyMfL3U5FS1tOTExJSElRY2NRV2d32+fjx8DN59vb3f9fV0t3wsvba11v18vO193/VVNT +V1dfX2NnY/9rXWtrZ+vO1dPd49/VzeNbTlVIUc3A41NPTnfNx8XK31dKVW9bVVNTU09VTUxLV+vd09nTzcbJ3+Pj32ddU0hbv73X/1tnd//v99Xjb1ldVU5jZ29TW2djXVtra9PNy83d71/v19fnZ2tOSW/Az3dTSFX3ysbI22dVb+dvU0hFS01ZWVdPXff/ +39nMyszR5+vj3/f/a1NRz73jU1dv39/v69f3X11rX09TW2NPU29362///9/d99nb19nX1dffY/9jSVfHyvdPQU7vyL7Dy11RUVVfUVtPUUtOUUpdX/dvb+fXzN3Oz9XM1d1jW0RM2brDb29nd2dr19HbXV9fXVVV9293b+dnW09T693X3dPX7+/d08/Z929Z +QkLOv9FZR0tn1cvL1f9rZ3dfSkpNU09PUU9dW11ba/fNxc3M1ePn2+Pn51dPa77G0etv/2Nv39/rZ13/529vd1lVX3f/d19f/2dr59fN09fd29vfd2dnRkn3v9NJQET/zcTG1/ddV2NrVVFRTEpGSk1fa2tr9+fj3+PTzNHV299rZ1tZZ7+7xOtVV1X/0dPd +229jb11v/2f/43ddX1V343d349vd3+Pd2dHM1e9VQj9NxcjrSEdVd8jJz9PvX1tXS09JSU1MU19nV1tVY+fd193f19Pd39Pd32tTSv+6wuNva1/r2+vn6+/r3/dnY2fr6//v72djZ1ljb9/Rz9Hd39vX32dTTUVIzsdnR0dR28vN1d9bV1NXX1VNSktITlt3 +d19dZ/d359XTycnT3d/b9+tnWf+7vM5nTmN36+fv6///Y9/j/93n711bV2tvX29r9+PV1dfZ1dHP229VTENHY8HNTkNGZ9vMy9vnV1FTW0tJTEZOSU9dXVtVd/fn5+/f69fX19fP0d/3XWfDusDjY19n9+/33c/R1dv3Z+/na3f/d/djXV9jY+/X1dfv69nb +5+f3WUk9QdfRV0dKY9nNzdf/X1FbY1FHSEdGS1vd2XdjV1dZa+/b1d3Vz9fV0dnfa1/TvcP/WVv/59/r6+dvb+vj9/fjd2tnb+tjXVdnZ3f369fZzsvN6+9dTUtARu/F21NMXevPyt3jZ1FRV1FJVVlXT1NnY1tdWV9nX//f5+vb2dPV29/rXVdfxbvN/1dV +UVtd/9fV6+vd3d//b2N3d/9nV1dZ493Lztfb1d3n3evnY1FGS2vNzVlVV3fXz913X1///1dISEpHTFf/529fW2NbXXfn6//n2dnn38/P1f9f1cPRW1lRV1Vr793d///r33dnX1NZY/f3/2tv93fv69/O09fZ1d/f/1FMSlPOyGNTUefKycrbd1dXU1FRT09P +WWfn3fdnV1VXWWdja2/rzMzP0dnn/1NH3b+/409KSUxVb+/n/2v/b1tbb2v3719TTU1V793Xz8rBy83N19vj905EP0PVub7v79HP1dX3X1lNVVNTT1NMTFn/1+9VR0ZJWffj19vn29Xd187N0WtNVcG801lERElTW///b//O0W9bSklKT1VZVVFj987R283K +ztfR4+Pvb29rY1XbvcH/b9XRyMvV5/9bW1tRUUxMSk3/5+9r/1lPUUlPVW/3187X19HBzltHROPB11FEP0pZ08fb/1//Y1lRUV9RWWvn71tf59Pd49PR0dvRysfb/19PTENRx7vT3dnRx83b/1dNTU1PT0pVa+fO0f9RSkNGVVFja+fXzsfX3dPH41FHPF/D +w91bSUFPW+NjX//v519jV2tZWW9v91Vj99nZzsDCwNfX2f9ja+drW0xPx77K4+Pd2eNfV0ZJT1v3/1tNTUpf/2P/VUlNY19j7+/Ry8rva9PKy+NvT2PLyO9GRUFV19n/a93372NRUVFMR1FbY2/j0cvN59nf3///ztnj79ffa2tP98DC3+/X49fd52tdVU9d +UU1JTV/j4+/jVUpMVVdbW1fd0crN08jAw+9PQT9rxc3vVUdd3edv9+9va01MT01XXf/j32trX2Pv993X19/v0d//a93na1dHTdnD0c7N09f3W0xHSl9v92NPVe/v39nvVUtLUW9v/9/GwMLJ09fRzN1rV0tjwcDXV0tRa1tXX19fXVtfX09VT0tPV19rY2vv +3+Pf5+/v4+NbX+/j7/ddT9/DyNHfY/fnX1tPXWPv52tXUW9db93/W1dba9/n7+fXztHOzszJxcvna09dzsbTXU1NW13v9//na2NPSkRNTUtj99//Y2PX72tjXWNjb/fvb//T0+dLQE3X0dPX393nXVdVVVtj/2NKTm9v59fd32tRW2tr/+/TxsbExsjGwM7X +/01Pb8PG129jY2vna1tdUU9bV09VV01b/+djT1Fja2NbW2trb+dra2Nr711NRU33zMvX19//W1FIS2dv3/9dZ/fv3dnd72NRY9nT3dPLx8bEx9PPz87M62NRXcu/yPdbRU5bV1drW1FjVVtXUUtOXW9vY2/r6+v/Z2tnZ29jXWvXzt1XU0pK18nT12tVY1tN +UV3/52NRVU5OXWfd2WNXZ9nX19/X19fMx8fMzMTDzN9nV93Jyc/3XVdnb2trW2NjUUpJSk5RW+/3Y2dr929LSVNja+9v/+/fztX3U0Y/Y8bDxtfr92NXVV1jY1dnZ1NdZ2vf1/dra2Pr6+vd39PKx87Mz8zK2e9dW1vVv8bXVWNbY1tOU1ddW29VU1VXb+9r +W11b9+tjXV1ja+vn92/32ef3Y01DSe+/vc/rV0xLS1PvY11jV05bXVfv/2tdZ+/d2d/Z3c7Mz9PZ2c7FydPrY13Zvb7NXVNTV2dbb2tv9+9vTk5OV2f37///729jZ2djY2tra//f3efnZ05GQ1HOxdPfXVFNS1FXV2P/TkdJTFNr//dvZ2/V2d3/Z93MzM7O +08rKycjV71fvwL3J52Nbb2dr//dja/djWVlda13//2/v3/9XXVlnZ2v//+fn2+fnWUdBPUvNv8XdW0hOTlFMSFlbU0lISVlra99nWVvr1dvf/9PPz8/TzMnHz8jN62//yL3C1fdrW2dTb//32e//V1ldb29n31vr529nZ2tn713r3+vrb+vv909JPT/fyL/P +Z0xGT0xJRlNbV0xER0tRWWtrWW/v2d1r/93R0dPf08rPysvM1d/nzL3DzO9va2/39+v3393r62tvWWP37//r3f/va29vXVdd59nda2vva1tLQD5M28bL71NKV1dKRk9jU0o+P05TXWdrV2vr3dX3///b29vr28fMy8zIz9n368G+wd9ra1dv/+vf5/fr32dn +T13r7+vv3f9rXWvvY11n3dnd7+fZ529KREJM2cbD1W9ZWV1FR0xZWUpCP0pMXV1nb2f39/dnb2/33/fn383N2dvPyNXfb9W+xttvb11vb2/n//f32+djXV3f//fr39v392/3b2P31cvf5+vf629PRUlK2cjG0f9jWV1FSU5OU0hFRU9OU1lZb2/39//39+vr +3//329XO2dfXytXnb9m9yN9jVVNnb133b2/32/dZTl33///369//9/ff62/329Xf29vZ329XVU9N38rGzd/3b1NISVNjXU5FSUdHTVNd9/f39////29v92dv59vf69vPxs33X9/DyddnV11jb/f3//fn29lZTGdvb//f383jZ/f3b2/329fj29HV42dZV1NK +VdfJz9nb91dTSEpVTUZHSEZHR1Nj9/f//2f3b2/3Y2Pr2dXR3+POzNfjb+PDws7nZ2///29v/+vb3/dVX/f/6//349v3//9n9//n2+fj29n3929dU0dGT9HLx8zVb09NTE9PS0tPT0dKS09nb+P/Z2Nv/+fjb9/f6+v35+PO0dHr99vOwdH3XW9nX2NZ99vV +1edfWV9db2/319fn9/fn2ePj3+fb2+f3/2f/b11NT+fRztHb611TSE1TTExLS0VBQ0pZX29j9+P3//9vY2dv6+Pj69vKyc7n49vTyc7nZ2dvb+fj29vX511fY19jZ2Pjztvb9//n5/f392/b39vV5/9vXU1JSl3OzNHb4/dfTU1PTUtIRkY/QVP34/dfZ/dn +Z/9v9/dv69fb29XOyd/36+ffzMvR1fdnX2Nv9+fb919jZ19jZ2Pj19/rb2f/5/ff39XR3+f3b//3Y1VOTWPOxMrV3+NZTk1ISk9ITVFIQkpRW11Vb/dfX2//6/dvb+vr69/V1efb1dHTzMjP62Nnb/fr99vR62/nb11dVWf36/ff5+vV1d33Y2/d3/f3b/f3 +Z1lbVVXdx8jb4/dnXVVZY2NJRklERElRZ19j/+Nv/29n92dbXW9v69/OytPb5/dvb9fN2/9jY/fn39vb52//X1VVT2/n18/P3W/j6+f//9vX3ePj6+PrZ19ZTUxj28rNzM3Xb05JTk9JR0xLREdVb2dn//f3X19fb2Nf9+PT293X39/j4+vnb/fKzd1vY2P/ +9/fnb19vZ29nX19v//fn6/fj3eP/39PO09////d3b2dZV1t3z8XKzNf/b1lRW1dOTVFMS0dOWVFZX29fZ1/32+t3Z29n/+vb2d3Z39vd/+vTzONnW1139+Pd2d//b11NTFVn/+vr493T0933693f3+tnZ//34+NvW1lXd9fNyc/r/19db19ZUU1KSEhMUVFf +99vZ/2dvd2dnZ2//993X09PT2+v3W1vr0933Z3fb3d/3/29fXVlTS1Vf99/r39/d3/93/+Pr2dnf3+v3/3dVV11dZ//KwsbX42ddXVVVTkxMSk5XW1tnZ2d3W2dv/29vb//d49/f39vb4/93W2fry8rZb13///f3491vb19bWVldX/9n/+vf3f/32dHX2etn +/2dv//9bWWdnb//KxMvVX1tZW1dbX1tfUVFKSFFZZ2f/X2/r69v3///d4//r69HV09vj62d399PjZ2dn63fj49frZ1tNUUhNU1tvb9fP0eP/4+vd9+v/9///3evjb3dnV1/XwsnR///j/3dZW01TTkxMSFdXX2dv/3f/Z3dfX2/34+vbzs7R43dfd19n69PX +9+vr2evr2et3WVVRV1VX/3f//+Pd63f/4+Pr6+Pj6/f/9/9nW19fUV/OwsDP/2dnW1tVW1tXVVVPUVtbX1tXW2dnZ3d369nZ3f//493j4/dv/2dn68/T3fdvb2fr3ePrd29vb1dXW1tfd93Z3ffj2d3Z493db19v////d///W2fvzM3jb29rW19bX2tfX1dN +TE5NU1FTb+Pv7+//9//v7//r2d3d3e/36/9rZ+PZ43dnb//V0dnjb1dTV05XW1tr993Z2d3d6///9+Pr/+/j493d63dXU1dr0crR3e9rZ3d3a19bV09KTVNXW1tb//9nW2N3/+/j3efr1dXV2ff//2dXX//Rzt3n//fj5+f/a19rW1NXU2t39+vn7/f/Z/// +99nZ5/fvd///a29dW1df38zM1edjX11fY2NvZ19fY1dXV01PZ2t3/3f/4+PZ1d3b29/r6//36/93d//VzudvW2fv39/3/2tnW11ZVVdXW2t399/r/+/369//a3f37+Pj6/9nZ11d69XR2/9nXWv//+/n/2ddU01NT1Fda2v///fr4+Pj5//n49/d493b3/9n +XVvn1dfrb3f339vj7/dnV1VPVVtjZ//r493/Z11jb+/r9/f359/f53dnW01NV+PO0d//b293/3dvZ1tnX1VTU1dfd////2v/69/b39vZ1dXX3ePn/3dvb2vf09Prd///7/f/b3dfW19XW19vb2dfa/9ja2dn//f/7+Pr4+/v/2tnW1dRVevKyd1vV11nd+vr +92dvY11ZT1dZW193/+/j49nV29vd5+fn693b5/d3a2/v1dXvb2Nn9+vr5/f/d2tbWVVba2P/6/d3d2d36////3d36+Pn6///Y1lNTFn/1+f/Z19f/+vv/3drW1FMTFNbX3f359/d29vr7+Pb2dvd3dfX293vb2dr49fb73f/7+vj3/9rXVtfX19rZ19v6/fv +d1lfa2t37/fn39vX3/drW1FMTFH32dv/b2Njd/9rX2NfWVVMTFVZXWNrZ//v3dnj39/d29fb19PZ29/n9+/r39PX1+f3/2vv39vr/29rZ2N3a2NjY2tvY1tja2///+vn6/fv/+//Z1lRTVF319Pba1tfY/93d/9rX1lRTE1NUVtnd//r3+//59/f3//3393d +29vf3+fj6+/j3+fv7//f29vj5+vv729vY19rd/f//2v/d29rZ//v39/j9/f/Z2NTTk5Z9+Pfd2dda2//73dfVVNMT1FRWVlfY+fb2+//7/fj5+/j29fX0dvf6/frd/fb29//Z2vr39vn//93//9vXWt3b+93Y2Nna3f//+Pf39/j29/ja11VU1ld/9vZ7/93 +X1lZ/2tnX1FOTU1NWVldZ2vrd293////6//f3+ff39vf2efnd2vn29Xrb2P/79/b9+fn39///293Z/9r/+9nd2dnb+ff3+tv7///Z1tVU11Va+vn72Pfb2NjY1VZXf/vZ11dV1dda+fn/11r59/f69/f59fR0dfZzs3R62tj/9PT2e9jXWt3b29jY2dZU1NT +WVld//9na2v/d1tPW2dr/3f///fb3+9nT0lV2c7R3+//Z2dja29vZ29vY2dvd/fr93d3b////+/3593b39/n49vr/3drZ+vV1+tnb2tvZ19nZ2tnb2djZ2N3/3dvZ2f//3dra29v//f////v9/9vX1VX/9XR3f9nXVtbY/93a29nY2drZ3f/d2tr//fr9+/3 +493n5+/r59vd5+9va+/Z0+NrY2Nrb2tvd3d3/3dfY19rb3f//////29vd29vd3dv//f39/dvX1lVY+Pb3/dvZ11dY2trb/9rW11dY2///3dvd+vv6/9v9+fj4+Pr39/f2+P/Z2/f0d/3d2t3d2///3dv/29ra293b3f/d////2dva29vd//////v//9rW1lR +Xe/Z2/dvW2NjY2Nba29nXVtbX3d39/9ra//v7/f/7+fn5+/j393f3+P//2/f1dnf/3dvb2N3/3fv//9va293/2/3a///d29vd2//b//3//d3////a11RUW/f193/X1tfX11bX29nX1dbXWdrb3drd//v93d39+vr6/fr3+Pj4+Pr9//j19fj/3d3d//////3 +9///d3drb//////3//93d3dva2//9+93d/93a19ZU1/v393/Z11fa11bX29nXVdXX2dvb3drb//37////+/v7//v3+fj5+ff7///39Xb93d3a3f///f////3d3dnb//////3/3dvd/93b3f/7/f//+//d2dZWV/v39vrd29rb1tZXWtrY1tXXV1na3d3d/// +/3d3d3f3///36+fv9+/f6/f/79fd63d3a2//d//////393drb///////7///d/93b//35/f///f/d2tbX19339/r/3dra19dY2NnX11dX2dna2d3d///d//////3///37+fv7+/j7/f/79fb729nZ293b///d//3/2tjZ///////9/93//f/d//37/f39+/3 +/29nZ19349/j7/93b19fZ2tvY11dX11jZ2v/////////d3f/d3f/9/f//+vf4/dv99/f73dra293///////372tjb3d3//f35/d3//93///37/f36+/3/2tra2Nr7+Pr7/f3b2dfX2djXV1fXV1dY2//////d/93d/9vb//v7+vv/+vn6/93/+Pd6/d3d/93 +/3f///f3/2tr////////9/93/3f////39//39///d29rY11n/+fj5+v/Z2NjY2djY2NnX19jZ3d3//93b3f///93//f//////+vr6////+vd4/9vd3dvb2v//+/v/3drb29vd//v7/f////3///3//f39///d3f/b2djd+vr6+//b2tjZ2tjY2NjXVtbY2tv +d2////////93d////////+vn7///9+/n5/93d3f/////9/f/d293d3d3d//v9/////////////////f///9vZ2Njb+/r6/f///9rZ2trZ2NfX11da////3dv/3d3////////9/f/9+vn///////v6+/3//93d/////f/d3d3d3d3d//3////d///////9+/3 +//////93b2tnd+/n4/f///9nZ2Nja2Nna2NdX2dvb293/3d3//////////////f3///37+/v5+/3d3f/////9/f/////d3dvb/////////f39/93//////////93d29va//r5/f//3d3b293d2tfY19fY2t3d2///////3f//293/3f//+/r7///////9+/v +/3d3//////f/////b29rd//37+////////////f///////93d29nZ2//6+/v7/f/b2drb2djZ2djY2///3f///93d3d3/3f///f//////////////+/v//93d///////d/93/3d3d///////////////9+/3////////d29vb//v5+vv9///b2tvb2tra2tn +Y2tva293/3d3d/////93d3f////3//////////fv//9vd///////////d29nb3f///////f3//////////////////93b2///+/r9///d3d3d29ra2dnZ2dra3f/////////d3f///////f39+////93d//39////////////3d3d29nb3f///////////// +/////////////29vd3f//+/n6/f//3d3b29va2tna293d3f/d/93d/////////////////////93d//36///d///////////d3dvb3d3////////////9/f//3f/d////3d3d3f//+/r7/d3d3d3b293d3dva2tra293d/93////////////////9/f3//// +////9/////////////93d2tva2tvd/////f3//////////////////////9vd//r7/f//////3d3a2tva2trb293d3f//////3d3///////39/f//3f//3f/9/f///////////93b29vb2///////////////////////////3d3d3dvd//r6+////93d293 +d3dvb29vd3d3d3d3//////////////////////////////f/////////////////b293d3f///////////////////////////93d//39/////93d3d3//93d29vb29vb2/////////////////////////////////////////3////d293b293d/////// +/////////////////////3dvd///9/f//////////3d3b29vb3d3d3f///93d////////////////////3d3///3////////////d/93d3d3/////////////////////////////3d3d3f///f///93d3d3/////3f/d3d3b293//////////////////// +///////////3//93d/////////93d3d3d3d3////////////////////////////d3f///////93/////////3d3b29vd3f///////////////////////////93d/////////////////93d293d///////////d/////////////////93d293//////// +////////d///d3d3d/////////////////////////////////////////////////93/3d3////////////////////////////////d3d3//////93d///////////d3d3d3d3//////////////////////////////////////////////////93d3f/ +////////////////////////////d3d3d/////////////////93d3d3d///////////////////////////////////////////////////////////////////////////////////////d3d3d///////////////////d3d3d3f///////////////// +/////////////////////////////////////////////////////////////////////3d3d////////////////////3d3d3d3//////////////////////////////////////////////////////////////////////////////////////93d/// +/////////////////3d3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////LnNuZAAAACAAAHDqAAAAAQAAH0AAAAABAAAA +AAAAAADT087My8rM1W9369/j493b4+tvVVFVZ3djXUpVVVlfa2v/39/Z19vb3ePj5+/n3dvNxsLCwL+/wMXIyMzf93dnVVNVTktGQkNAPz9ERUlKV+/r7+/fzczLyMjAv7/Bw8TGycvOztXn/1dIQj89PT9DSU5TWV1j/+PbzsnLysjJxsPDwr/CxMPHy8/P +19/n19XfX1lTTElKS0pJSkpNU1FbZ//r3dfT0dXV19/3Y+u/s7vFy9t358SysLnMa0U/S+/HydtOOTIxOERv901BOTQ3R93Au8TX91X3x7qurrW91V9j6761uMF3PzUzOU3f72tKPDk9Tc67u8TdTkZT1bmytL3Ob0xjzcG3u9VnQz5La8a9xt9KOTc7TNnE +12dIOTg/a8C4uslnQ0NO17qztsLfZ1nTubCtssTdS0FP/8W+3Vc9MDA5R+fjVUI3Mjg/27u3vc13T1Xbvqumsr/rXVfvwbi5yF9HNzU9T//vSjs1LzhI97++1e9LRE3rvLCxt8brX+/Eta6wvttJPkR3v7m6zk05NThH3czNU0A9PTdZ9+fLXe/rY8XTvb/R +003Z49Ovsa2z3ds+Tc3ArbnESzUwKj13zbp3RCwpLCtVysS5X2M7O+PZr6mvrtPdT1W4tq2vx9c2RENOw9vbUTk2KjlE373bzk88Y0PIv7y41873U7/CtbHCwU9VT1XFxL7XXXc6U3dfu+//SjM4NE3Oz8JPTDk1TOe4rrm9WVFDTMG4rqi2vv9NS//AtLS7 +40QuNTtDz8xnTjMwLTFBY9PJ499V793Gtre4usfByru8v71jd1dL2efOzU4/MTAwP3fby1lBPzI7S9uytrrMWUo+/7+vqKy250tLRdO6urHPbz46TlXVvtPRSDw1PU1Z2e9OSTlFSO+7yMfTY2d3xrq0ssDD/+vDxa+wubxMRDk+2efEyk45Ky0uPPdj9z84 +Ni5EZ8KqtbfK/+vrvq2tp7fEQklnVcG7x8A/OS4zSknn/09ONkA9XcbLwdln90nN0cCxysbbX8nZvbjDy0pKOEjOybW5z+c0OTdEv8u/3UQ1KjI767a9u2NNQjrbvLWntbfRW9vfvK+xrb/RPUBTRtnvU/c1OjQ2TD9KQTo/NUlbzrbDvtXXxcqwrrCvzNVM +V8fKubvNTTYzLUDvd79ZRjQpMjZjssa63Ug9PGfPuKu6u19vXV23tLGu1Wc7RFfjvru+x0pKOE/X78ZXTkMzQDpM2WPvS0lNVc7HubfEyVPPvr2ssLG562tM37vBt8xrNy4zMU3NXWs1MCkoNDz3uMq/b1NP77+yq6iztm/Zzcu3u728T0g5QVVb3VVTPjM8 +OVfn/91GUU9Lxsy8uc3rRlHdzLextMHdWT1d09O3v8rjRkVD777HvN9OMjI4Om/L99k/PDQ4W9e9sr+763ffxLWwray9wl3Xx8+5xszNOj80O0tJUzw4MS46OlN3TndDWd/ZtbKwr77C6866ua+uu9NMRDdP093FW0g5LDEyQs3/11M8NDVHY7+xurxrU1VO +w723rL3C92PO177ByMRNW1njwsq+71VON0VJTs9XTzcyODRJ3cm+19dCTefTtKyvrsDF/+O5tq6tvMZFRTpF2e93WTo1KC4vNU9ISkQ0Oj53w7qtr7vJ27+/sa6xr8jrVU7PzsDKXU0yNj0+9/fjRDo5MkBv973FxWtKW2/NtsC8zdFHU9nJt7S+wEpKP1O+ +u7e1zGs4QEFZzdXjVTUyLTxDTcnr/19Aa+/EubWuwcXIyLS2rrK7u/9f71/J3+dLNzUtLz0/Z0tBMy4yOFG+vrG8vs1nxLiuqa+vztVRX8HAwLlvVzM4NTlnd2PnOTYsND1Lycrr40JRTc28vrbB31tNzMi2sLi451ldTsLBurvP0UxJ32PI391XOjkyNE5L +71dLOTVAVdm1u7fFzGPru7KtqK+z6+vv17q2wMZFPiswMjVNST4/LC4qNEZdwMvVz1vFwrOusq+2zMrZvLy3t83bRD5RTN/rb008OjU6U0rjY2NNOUdVz7q6t8/fRkH31cSzubrZb05Rz72+uL/MSEpra8G7y9VAPTU6RD5XWUE+Mjg/Z87LvcHV0+e+tLKt +s7W5zsG+vbK1uetJNjI7P0pRPzwsLS4ySF932/9VPlnIu7CqrrLCx+fAuLe0t8fvP0lGXc/f91E5Mi8+P1FrSkM2ND1F08m/vdX/X1PRxLm/w8hvd87FuLe4zedjSffIwre9v18/OzxI1/f3S0AtLzU8V8vRyGdVRWu/ubSstLnLxr+4r66xtMjvRUtGSFdE +OTQqLS82PERJQjs8PFPPurW2tb7JwcSxra+2wcz/Tdnby8fMX0I7OTx3Z29nSjwzNz1H1dvGx9lfY+vX2cLLx/fv79vJw8i6w8rT39PXysbZxef3/1dNRktIP0k7Pz9EPT5LUU7f68q9vL/CvLq/t7ezsbi3wMjM28tXTko9OTExNjM7NjdDP0BHTf9ny8rD +ubq0tbe1vrW4xLzGwszd90z/W0dZSldDREk5Qjk4Rz1LSUlrTGfj3cDMydXVz//d29nAy72/wMPTy9fVv8i+zdfTd+tRTudVS0JAQTxBPjtXSUpTXePdxcG+t766u7e3urC5vLW9ucff70dJOzU8NzgvLzIwNjk7T0xda/fT18i7uK+zs7a7w8jAwL66ztNv +V05JWU9P61FPRD4+PEFCS29VTVNf6+PJxc7E2+dv69/Xz8vIvMLEzs7V3czPz8LKzf9VS0VLREpXSkk/Ozk6QUVN09fKycvPxbq5uLK2tbq+xsW7u72+y2tHPzY2My42d1M9NzEsLjv/s7LKxmdNa7+rqKitum9Ob8W1r7jNXTsxO1vbxdNIQTAuNTtn3/9X +OzI5QtO4sb/Kdzk/XcyxsrrNb0VE/7eurLfMTj5FZ7+ztcVVPSwuPUzOxVNEMCouSdG8tsTIV+vbvauqrLe9WePCuKirrsxGMyo4O+/ZRTQjJCMtRee1/182Lzt3rqiirLvJPEvjsaOhr9VMKDA6a6ysrVk6JiQ0R7KvvGsvKSQwW7Cnr7hAPTI52bustbpd +O0VB2baqtLrCOFFJ2bq3tu9fLzI8PdVRY0U5Ly1BRM3Mz87j1/e5r62yvLzfycu8rrC10c9OR/dK51M7OS8tKkBDTuc/RTpBP3e1sq68wM/Xv7irq6y7a289Vde6tMr3NDMuOPfMs8dILSgoLVXMs7d3Vy4wO9mvp67Nay8uOF+tp6W01zwuP12wp6ev1zwr +MkTJt7fNNi8mJjJAwMrFXTc6PGO8pqirr1vvZ9WwqKavtE1CTVW/vMBMPickKyw+R05BOzcrO0jfuLi5xsZrx7SvqrCwxtffU83Ew9PbSztVTOvR2+9OSjM/RkX3T0dBTUFdvsO4yHdHRFtvtra6y19nR+vItqyzwUtEN03ZwK27/z0rJy1AXbnGUTgqKSpP +uKeisbtIPkzNraiirb9CNT5Xta2ruVE7JiovPd/dUzUvJyw0V7W2tNNPR0XKsqOjq7FVY1nNtqyux+8vMjQ9zb6461U3Ljg5V9/NSUc7LUFEz7u4uff/OkHjybnDwV3Z9++/ure+vVnvyeO+vcRjWz0yS0j/50E4LTErRd/ZuczZZ1vfuKmmqLPGa1Xjv6yn +rcJVOy09PeO+b0osJR8kNE23vdtDMS8127eqorC8W1VPva+oprjXPjU3W8S8s91rOy44QL67vs46MSkwPsC2u71DPjw/17mvuLtDPD5Jwq6psLhnOEZFx7uwtdt3Lzg5PdPO30Q9Ki02O9nMxd3f71vMu62wsLnMyP/FvLe5x8xGY2tryl1GNzgrMkA/WVNH +Ojo5RMC9trjH1ffvy6ypq67E2UFXTs6wucVZOyw1RHe1uMNXNSorOUq6tM9bNS8vU8uvqrzfODY0X72yqbO/7zpI47uvrLfRWzI4Pdm9ur5ENSkrMEXLyMVLPTg3Vb6rqqqz09Ndzrqtq6+4/0xESOvDuc3jOCwtKjVEa1NIQC43OkrRvbvOyevrxcKzs6++ +yMPdxsrHx9NrPltZZ83T3UlPPD/3W99vTzs6NzrPxr23z+dHTD/3uLixvdNLVf/nr66vu3c/ND9IwLS+zj8zKzE8Z77G/zwzLTRv3bGst75NTlXGs6yossBKPUNfurSuvE86LTA0Z9fX7zQvKS4707m6ulVDPTzjw6ioq693X0Zrvq6qsbpCNzg2d8W3vsxB +Lzc1T9nCyk9DMDM5Rt3EuevnT0JvWcjGv8df1WPNu7e3vb1P5+Njw8XIa1M1O0hB42tZRjkuLEpRybvJzPfvTL+urqmvuMrn/8uzsrK+3Vk3PkD/zv9INC0nLzNDytvnQToxOu/Pr7C6x1VZV7yzraq9yFM/R9G8u7HbTjowOlfEu7nfQDErNT3RvLm9UUE0 +O2+8rrOzXTw8PNu5rKuwxUdIQGPBuLjJdzc4OD5Xz81RVzU0Oz1j2cPRb1tI18y3tLi519X/zry7u7/TRFFbY8vP0VtBLC06P29v71dFOjNd58q5w8t3X0nHtrSutcLZWVnMvLe6yOdKPD5Byr2/ykk4MTc8/8TO6z82MDpvxrS1v188Nzznuq+uu8xVRF2+ +t66uxfc1MDdEzsK82z8sKi8928i/0UU9ND7ZtayqrctrV+u+sKurst9NP0jdx7q+z1kuMC0yRndZRUEvODxE38fC21s/Q+PPubS1vMzvZ7+8ube/50lVT/fR18vrTjo8S13b7/dVQzQ4Z/+/usbRb01Az8W/uMLMWU9Zz7OysbrTSz0+RcjBwM5INzE1Ot+/ +yddAOC45U8W2t7zjSz5RxrisrrrEST1K37yysL73ODM1SNnKyFU/Lis2TNPLv8NVPjQ9b8K5trTXZ2Nvybuvr7fDV09HX8i7xc3vPD8/Rd/V11lMNjQ7Q3fT08znTElnb9PGy83Xd2PJxMG5uL7J2Wtv91dvd2NKQkJBSEJIZ1VGP0VFUWfvz8DGzcbFwby7 +uLW5vL/FzcrOzL/I1+9nRUBCPkJGQz5CPjpASlFb//9jUUhZZ+vMv7q7wNPZxsrHvrzF2eNXVVVV993Zd1dMREM/TP/va1dPT2Nn58W+xd3j72/j38/DvsXGytHNysTGzt1rVURGWWfj/2dKSkA9SE9ra+9VTk1N69HPxcXGz9130cPJwsDA3+//b9vO1d93 +Uz47ODznwMZbRjQ2OmO9u8rnUzc5WcO1rbG6zE9L0cC2sLi+Yz06V93Kv83rRzQzOF3v0+dZPTg/Tc29u7/vST9L38C5ub3Ob1F3wLqyu9NTPDY6U9vIy1FGMTQ9SO/T02dbNj1HZ7u7t7XDyl3JvrewvLvT9+Pju7/ByFVAMTtf587vQjkuMDdXw7y+UT42 +Kz9Vy662u+NMPj69r6ututk1PENZuba4zEA1LTlTzLu87z8tNDNXwLixv8pMNUxXw7C5uNVdQ13KvLC3vchBSE9XzcrJ2U5EOknf69FTVz0yR0XnzN/dTlFGa8G8ubzTW0VM5760sb7bXz84S/fBt9tZOy42OVu+wL5ZSTAxP1nFusfGXVFH9721r7HAxW9b +68q+vsfdU0hDXdvdzElJPjRDSufG599ORkBI18O4vNX3RD5OzbKws71vQTlD28S2wv8/NTA0XcnIuGdNMzE2Ot+/xr/vST9j076vsrm9X2//zrS4ur3VY0zf48y+b2M7Njs+493fb0BBMj1jZ8rTXUU7PEPXtrWxv8xfQ//Ovq7Cw29FNzhdz72472cyNTk8 +28jKzFtNOk/Vzr28xtFOTVPTvcC8z9XdTsnAwLnO0UhBTkvOvb++WU41OFFdv81vRjQxMT/LvbS/2082PVvGsa6xyHdDOWfKt6u8wVs3MzJJ0cC390svMzpFzcLNxz84NDvvy7yzvcJra93Js7a6xm9fTtnPy7j/Z0o5QkFjzd1vQzsxPl/XurTO2UhISlu4 +uLi441M8SN/GtLbIbz85M0fn1b/P/0g4Qz9Xxt/XXT81Plvrx73Mx1lf2+O7uL2909lf47i8tbfNX0NPW9u8ytlBOjExQmfbvfdROTAzPWO8vcX/YzhFd8qvrre9Vz44SsW7srfTUTU6PmPFyMdMPzYxQ2/LuMjIXUFMZ8m5ub7T/z9O48aztr3BU0dIW8a9 +tsH/Rz1Ea9G5vMtJNC4uPmfbvN1dPjI4SNe3urfMYz1JY9Gzrbe3a09GVcfBubv/RDU4OknVb+tbPjw3SlVv0Vt3TE3X0bu4vcDV3XfPu723xdlvRlv30bzP50s6LzlN78zD72c6PD1jt7S2ueNKOUt3xrW3xOtGQT9vycm95048OklnzrzP204/OD5Nb9Hf +a009R0zvvLu+zfdLTXe/t7C2we9ZX+u8r7O3zko4O05nz8TdTDo0MD9j18bXZz4yPEDnt7q6xWtKS2PNvrbAxk1JUVnNwsXHUUI5PExd2e9vTDxCR2/KvrzV3V1J/9PBusfPX1Vn38O4uL7PYz5M/864t73GTT07S/fv2VVGODI1PP/M0c5XRj1Da8u9t8bG +/1/nxrq4s7nL60hf587B92NCNTk6Tevj40Q+MzVFWcK8xNFbTk/Zt7WwuMpXRU73xLS3ve9NNjdN98++32s7NzU73b29uMX/P1Fd27i4wsxIQj9bzsO8v+dGOkZJ48bFxdljTUTr18/XV006OT9H78vPZ01FQE/dx7u/w99Pa9/DsLO1u8NrWdPBvLfB00Q7 +Njxb5+PdSjsvND5M78zZ601BP2vNvbW6ye9HWV/KvL2/ylVEPk3rycf/WTo1PEL/x8jZW0tAS9PHvLjE/0lAR92+tLW+yFtDVefDtre7yV1CQuO9u7i/ZzUxMjZI3+/vSjkyNT9f0cDO2VdJU+fHuba3vcfv08K7t7vC00lFQ0vf1+NRQDUxOEVV193/RDw8 +Quu8urW6yF1O98/AtLm+z19FWf/TxMHZazs9P0vj0c/RWUxGWdnHvMDN40dFT9/Mx8bdW0tFXdXFxNXjW0VJWca7t7/jXz09TVnV21VFOjQ4P//jz9XjRT5Da9G6uba9y+fdx7q3rbO81WtOW9nNz8pdSTk7PENRV05dRTw+Q1Pn08vV0f/n18nEyszN729v +18/T3+tvSkVMTWtvX1NLSUZT3efT19frW2drd9Xbz8nK7+fXys7BysfDytPV0c/RxMPAydHdU01JQEU/Pz9BRD89PURTU11jb+/349XdyMa5tbq9wcLFz8DCyMnnb1lTQ0NVTU5KQTw6PUVHXVljb+Pnb9fCyb/CxMrR1+vRydHL1dXZb3dXWV1j519bU1lv +b93X48r/d+Pj/2v/b2ffX2fv59vr1+9n3d/b19vR2dHK2cjOz9//d01FPjtBQEpLSEZCR0tMWVnvydHV187Hwru6uLW7vsHGxc/GzNfT711TTVNMT0Y9REVGQ0RMSllnd9/by9HRyNfOz9vN29PT29n/3et3d1FZU01MSllRTf9dW11j/2vr//fdZ19n2dHd +yMvNxdPMzcS8x8PD0cvNx8fFvs3ZW0hHQkRCPkI/Pjs4RkZPT09ZV29r2cfNx769vcC6vL69v8HE0e9r42dTU1NMQ0VAPD5CREVHSUdbZ2/r08nGyMzLycnTz9HLxtHVzNn36+dvX///W2djXfd3a2vb0e/39+dnX1tVa/djZ+/3Z+/V2dnLy8/Z39XPyc/V +18mzuetfPzM2O0rX50hBMS42PPfDz9l3PztH1butrbW8zv/fw6+ur7rTU0BHW8q9yvdMOC82RWfXa01FNzRDW8O0ucHfTEdTyLe1uMf/PTtT57m2xGM+MC8668G3yVM2LTI967qtusx3NDVIY7+wvcjXR073u6+ts85vOzpfuaurrsFDMS40Uc3O51U4MTA1 +SGdjX0Q6Ok/VvK61zNFDQdfArqeossZVO0V3yb3Rd0w6NDpN1dXvPzctLDVdtrK7yE8+PEHRvK+0vsxTT2PRu73M01E6R3fZvLfdZ0gzOkvZu7O621c5Ok5fy8X/VUc+ScyzsLXOTz86P8ivqaq1008+OUTjwchvRjIyODhOyFdDOiwtNkrGr67Cz0A6Sve1 +qaissMN348nEu8FnW00+U8nBwvc5MCsqM0fHurzHUT5DROu8uL7Nd0vnyr6vts9ONS00RsmxrsNbNSssNkfTusDM2UdBb+PNyW9TRT9Vw7Kur73RTEBHb7yurrK4329vY8/F21NFOThHX93PUTcwKis4Ucq1utlfPzZH276vr7e7w9nIuLK1w+tHODhGzbS2 +v1cxKSksO+fEws1TPDxFU8m+ydNfTnfEuLGxw/9INT1b2bSuvs9bOTY9U9XF1fdZUVPZvrzHVzw0MjnrtK6wv103Mzpbuq6stb7dTWvRw7e4z2c6OEdV073dSDImJjA6a7u7zlc7NjhG0bu7vr/DxLqvrK28/0tGS+e2ra69XzssKzQ/3cPPd0g3PE33ysrj +d0Y8d8O1q628WzgtMkPMsay02z80MDZBX9l3U0tFSd+/vMVvPzg3P+e6ra+8y0U5Pk/CsrC0ut/318W8t77TVz08X8C6t79KLyYlKzrZvrrVSzoyN0Xvv77P52/rybmsqrS/XT0+T8qvrbDBTjEtLzxv1d3vRjg5P1Pv32dNPzxHzravrrzjRTY9Wc61rrrI +40FFSWfKzfdTPj5P17m0xO9AMi41TLyvsLz/OjMzQ9O+t7jA22vZwry3ucjdTUnnv7ivu2c9LCovM0XZ3VtJODY5QUVRr2tOUWfOtKqqtMlbR0fjta2rsL5NPDc/d8/L31tENTtT783MX0k3M0X3va+ss81DNjtN37qyuM1bRkRKXdvjT0E5OkNfxrvEZz04 +NTtrxLa5w89JPkdXzb3Bxs9r68+5tLS+yls+Tdu4rq2xy0AtLTI+d9HRWz01NTtEY8zrTEM8RefDsa62wv9ISvfDr62yuddGPUJrz9fbXz07P1Hn2WdLPi8vO++/trXCZ0A6R2/RubXA011K99XKu8FbRzw+U9u7t7/fPzQyOFe+tLjHWTs2OUnOxsbKX0hP +4762tLvHW0RNyLavrLHDbzk5QEVn029LOzE1O0hV/1k+Nzg9VcO0tr7bR0JL57asrLC961FNZ8i9vMjvSTlBXdnAy2dMNC44Rte4srnMRzlCVdu7t73MXUhR48/Exe9DODc+Z8S/x1U7NTM7W8y8vMjnRj5FWcm/zttfQ03bwba1vcdXPkrnvq6qrbjfPDxM +/87BxWdANzQ7RVfdY0M5NTpXzL23xGdJP0Vnx7SytbrRX13/yL3Dze9KQUvrxsXTW0AvLTdO0b28y107NjtZ0b+4xedPSG/LxLq4zl9APUZvv7i3v1E2MTM5yLy7wttPQUJJ48zR31c9QVPXvLjB1WNIQWvAuK6vtL1nS2Pjyb6/0088OD9TZ19VQzMuMjlX +w7m81UY1Nj9vu7SzutVnW+fKvba/yutDRm/Nu7rMVT80NkNdxrzGz2M/Q1Hr0cLH23dPXdHCwsfPXT8+Rl/XzcDKUT82NjxT483Ob1FHUf/Xw89vXUVDT+u+uL7Haz89R+fCtrO1u9Hn58zJycLJ71NPW3f342NEOTc3PVF31cnTa0pIRkrn1c3Gys7Oy8XC +ytXbb11308bBydfrSTw9TFNZX2v3WU9XX11VXVtZW1fXw8fNy87jW1vv38/Ry8XN519VTUpMUVVfd9vX5+fnXVFbS09r79/V2dvZ71dfb3ff2ce+vr+6vcXR1+vn793OyONfWU0+OTk/RUdTW2dfY2tbV1tXY/f33cjEycjJ09nva+fVzsvKzMzbY1tMTFtn +Z+vb4+ff92vv//9vb+/b08/TzuNvW1dfa2v31+93Z1tTT0xJSktKV//f3dvn43dXX11d69HT09tvb/9fXffr39PTx8G/wcHCx9Pn/+fX2dfN62NbRj49PkVVY11v929vZ1tvb1lf49XOys/LxtHf3+Pv19Xdzs/d29t3V01JS01NW9v/d+drVVNKT2vn79fN +2d3f7+fj/+fb3+fZ29nX3W9jTEVKT1fv3ffj929jZ11nZ2/r5/fv29vj42tn92/jzsHCv7y/xsvO0dPV19njb2NdX1VGP0FCQkVNWXfZ4+tnTExVX+fTzc3V/2t338O/yNv/UU9ryL68zWNJP0RZ18bDy9tVTFPbxr3G3WdCQ093xb7P71FAPUVdzcDF2Vc+ +Oj1N387L71dIP0vVyL/C2VlNT0PVzNXJX29MTNt3wczOy1vT19O5urfF/1k6TePOtrzPPjY1LkfbwLfP20E6Pz/NwL6+XW89Pm/3uri/wEdRP0zAvbe711kyPT//vsnD2Uw/NU5Zyr/bzEtCW0/NysfMVV8/S9PjwcfT20pXS1HN681rTU0+a+vOv3fnSENL +Ssu9vsBXXTk8TPe5uL7OV2NF58S7srfAyUdLRv/Au73XXTsvPkBnys7VZ0k+PE9rzcbR61NNY1vZ2d3vX19d58nNy9P/WU933cvAzN9fTUxrzcG9wv9rS0lb3ca1wNNNQjM4SdXAt8pbPDo3Q9/FxMFrQDc+Tt3Nw83vU0dI983CwsTXTkdGRHfNzNXfXVf3 +18vCyNvnY+PJwry9xGtTQEFMz8vE2Wc/Pz1V0b7DzF9VP0JXz7660W8/Oz1N07u4vs1RPUNJ47vEw8lJQD1R69XC53dPRFNrycHLyFdRS0X/78nKd/dOUUZr1dXOX09HTPfMwb7V/0M7Pk/Lubm82U86Oj9vvL3I209DPVHRvbS7yVNLS2/EuLa0yu8+QEVX +3cbO01lEPEdj39HR/2NPW2/Ryc//T0FCSXfXys/jS0RHV+PDw8v3V0VO2726tMTfS0E+58WwtrrRWTk9Qt/Bu89rQDk4QGfNxctdOj5BR9m8vb/dRjg+UdnAu8HJ/1FEWffV0+tnVUpjb9fI129RTVP3yr+9w833SVv/zb7AxetMQkJjx8LB1f8+OUFfybO5 +wl9FNDdC78u4xuNIRD1NY8zFxOtTQVFrz73ByNNLRUNf0cXBy9dXU1Vdzs7R91NOTFvn1ct3Uz49RF3Pv8XGY1M/RWfVyL/MzUtISF/NwMXnZ0M5R0zRubzE70o9PGfIu7S5zFVOTE/Vx8S/32NGTWfvzcjna05LTG/MxcjXb1FHTU1v22ddTENKUf/Rz91R +TT9I58a6t77OW1NN47y6uMzIV0VPW9O+vsLvUz48Stu/v89rPzU3OUnXzMXTVT5ATFvOwszPa1NPd8zIx85dTUdFT9vHzM5rTENIW9/IvMvOb05n387AxcTvW01X18K9wM3vQkFDb8LAw8b/ST5JX9/Gxt1KPz4+XdXIv91XPT1HSdO7xMHZUT9O68+9usbM +W01NX8rOyspdV0ZHZ9/IzedMPz5EVePfze9rSkn339HKzttTT1V3x72+0fdNPEVT/77Cy2tLPjxP08u8wc9VTlVfzL7Fv+NXQ0xvzsG7x8tjSkJd1c7ByNn/Sk9X/8zr3Vs/QkZNZ9/RX0w9PElrzcvJyGNMTV/Jv7i6wNFvW/fPu7y93WNEPkpd37vP2Uw9 +NDdHd9/I6088RUVryMXMxmtTRmvXwr290f9NTUvf08/O/05GQU5T3c/fd1dKb+PKx8Tf90lNX8rGvsPBd1VLWee8v73Pd0RJUd/BusXjS0E5RGPXycXrRDs7P2PVw8TbXUVBT1vPvcbF2Wdjd8zExcLvd0xKb9vO23dvQERJV+vn319HPjxR78vEzNVRRktj +wcG8wdPrS0Vn977Aw9tNPj9D/+u/yd9NSENO2cHBvNVbQkdT3by7ychfT0hjzsq9vczPSFNr38LKxcpPS0FVX2/jXVFAOkVHb+fT2VVKR03OzcHKy3dbVd3Ds7e2x+NTSFvRyrfE20M9Nj5d69HJY0s3OTpF68/J2UE9PkNExri6u8Lb29vEvby6xM93T1v3 +4+t3Z0VFSFf359l3WU1FTuvXyszRa0hGV9vEwcPL209MWeu/vb/Ld0ZGUWvZv8fvSj05PU3b18jfWUU+P1njxc3K51tLY+PGvLm/xmtfY9vLz8rGb1VFS1Nv//d3T0BJSFNb/+9XTFFX0c7JyszjX1P/17+/w9PnW01Rb+vG1/dRRkNHV9vZydH/V1fdY2Pd +68jXb1lXb/ffzc3AztfV4+fvzMjMxdXT92NdV+NnTndOTUJDRURRUW/XW11OW19d18/EvcrJ29fTzb+/ur7P219XV0/rb//3Skc9PUFMa09bY0xIPlVn38DNxcd3X2Pf08a6wcTRb/9fb2//zF9jVUNNSVNfb+tb/19Xa1/n3dnM3dHfa//vzs/Tyc/Jzd/X +18zbz8jZ0d3vd2dnV1ldSlFXTExKTVFfWU1jZ2N3b9/b1dHRyM7XzMrHxsrK1dvn/+N3Y11dXU5PTklMS0tJS0xGT11bXf/X1c/P49Pb49nOyMvLzNPX42NvXf937/9jW1FPWVNjd9vna3djV19r59XO2+//d2Pj08XJxcfT19ffzszFys3V629ZV1tOUUhF +R0FCQ0RRSldPUVdv39ndzdHOy8XDw72/xL/Ex83NytnX91VTSUpFU1dKR0c+OztT5+NrUUpJSuvCub3K12td58W6t7bE11lHWe/Rw9f/Qzw6PVfV2d1bRTxBS2/GwMrbWUdIU82/urzRb05Xb8a5tbrLd1NK59W/usfnRTg7PUzbzutNPjc4Pk3OxMfdTktL +V8i6tr7E42vny8K7v8TvX0tJZ9/Z21VEOjk/Sm/d/0g+OzxVzbq5xndTOv/bua21t29JOjvXxq+zwlU0NDJT37m10Us0MzJPzL2122M7OD5Zvbmw0f9MM05dua6srd9vOD/jvK2xsV0+Ly07U77CzEYwMCo6Ssq6w908QjxTzbustrXbWW9Ovrasr8DRP1E+ +T9nJy11LMjQ5OElM50tXSTpMSevfxMfXw13M0c7Hy7/NvsbRxWPjVetv19dbaz5APkJV68Vv20s6QjZMTM+81b9HTz1E0cGutLrZSV1DxLusrbnNPT86Y8e7s99nNy4uOWfVuOtRQCs4Ndm6ra/v9zU6XcSuraq/0z81S+u0srTRPjwqNjz3vcHdNjQrL0Bn +tLu3/z5ANWvKr623vD9XP0zGsq24vj88STvZz7jJ0WMxQDRCa8rD79E4Qkc71dm80c9rPe9IzMm8u8u+487Pz7/Iu+PH0Vt3RVk/U0w/3zpKPjw8NV9CxMXdy0z/RtnOuK64td3f/++8wa66vtU9PTNKU8jKUVkuMiwyW+u613c9Lzs5wL+vsMT3PUJJvrCu +qr/NQjhDS7m2r79LOCs3N9HIvcE+PjEyP+e5wrhNSEU0Tm+5u7jIUWtAb9e5sLW032NTR9XNt8jKXztENktMb91KWTU9P0X348Nb0/9P2d2/wbXKy7/vxcu/xMbGTtdNU11NV0BTN0trPltCTj9GS03M2cfbd2tL2WO8uLq73+dHZ9/Hsbu/d04+PF9jv8LV +SDg4L19VyLvRYzs4M1fNwrDGzU08PT+9u6yuwdlBTVG9trSw2003MjlPy93ATTk0LDY808q9z0tHOE1dvLGzstPnV1/FuK2ztddNU0Fn68TTZ0IzODQ/S2fvSUxNQkpN49W/99//RufryMi5vd3DX+fRzcnRyE/P609jU2NJYztd401rS1NDT0hDydXO019V +SutLwr3Dvtv/Su/RvrCyuM/vRkXrY76+0U08Ni5HQ9/E/2s6NjE93cyyusZdR0lOvLasrL3ZS0pLxby2sd1LNzEwQv/nv11AMy0yNdvHubtdTTpBTMC2t7DP411M78a2urfXTVVDY+vDx81bOj46Rk3Zy2d3PD5DQHfnvtfd/0dnUdXOv73OwN/ZzMm+vrjX +wc9ba0xfSnc/RF08Rj49OkRKPNV3/9lId13L57SvubXEyPfOy8mvtr3ZVz87VUnM1V1RNDArND5Xx9v3QDg2O9/JsrK9201OTMG6r6q5yldDQOvEvrLMd0E2Nznj18DJSz4vNTr3z8++Tkg9PE3dvsi641NVR93FtrK0xF3rY8/DubrM0Ts6PDtP/8dfSjgv +OjhP58XN73dCWf/LvLWzxb/f/8rGvLy439v/SVlNWU1bRDpKOD9GQUVGVTrd1/fN79lj0WPft8G7x8vj4+d3u8LAw2NMRVlOyMTV3UQ8Mz5Ga8Xb10U7OTpbWby9yudHQ0PRy7etvL7vX1Pvu7ivuNdHOTk9a1/T3UU7LzE0Xf/vxU9MQkVjwra2sMPT2f/I +vrGxsbljY0pT58HK4281MTMzPE/nTUs3Lzw5V+u/w8/rS2/bx720tMK91ePMz8jJwN1rb05nW19r309FZ0dNTUtPV189UW9R42trVf9KV8nZyc7R39XP2be7u7nG3XfjVcrG7+tKQTY+PT1vS1dEPDo+U1PCxsfE92fvyce3srm7y9vrz8PIvcXZTD8+PUk+ +TE5DRzg5O01OT81n73ddd+PK27y9zMjTy8vDzse749fjb2/b12PJX01ZSUZFY0x3W0VVRUlHV2930Wfv91tv3cjOvrzHvszVzcO9w7zH02dHQkdRRFdPRUM6ODlIP07bW+9jX2PRyM63u73AxsjJvsO4tr/C2+trZ09Lb0lIPDk4OD44RkdFTUZOTln338rR +ycjMysvDx76+v73FztXZ72vj59vva19jVUdRSlVVT1tTU0lPU0tfVV3j72dX/1/r39HGvr7IxMfLwcO/vb7T/1NGS0ZOVVdPPD85OUFFVXfrd1lbVXfbyL27vcfM08/Cwb62uMfO/1VjWV1jb0Q6OzU6PERTV11GSUpJZ+vMx8jT49vrzcTBvb2+zdXX3c/V +ztXZa09RS1VVY19VTUNJQ0hXXWdrd0hMV1H349PLysrn1dHNw766vb7L1ePr3f93Z11FPT48QENJU01TRklGT2Pvx8bGyNHV3cfCvbm6usXGzM7KysTLz19MQT09PEJAREM8PTk/QU3/d+Nj7+//09PHwcLHy8XKwcXFvsbXd/dd7/f32fdnR0hDQVVT/3dZ +TUNNRVljZ9n/b1dVVWvOyr/BxcfMycu/v7/AwL/Xa2dBOj5NX19AOzcyO0Bbzs/ZUUxDTtvAtLW703dZZ8e3rK63b1VKPNnHvrjnQy0rKzJP58PjSD4tNjpVvLi2xFNJPU/Rua6vtstd613Lv8K42edJPU5K3dffZz9HOENTU89n/1lGW0tb09fO3f/nd8rH +wb7Nxt/Kv825x85nQUo6TFtd70M/NTM+P+vL1eNJTEdMzMC4s8PJX2fNybe0srvP00jjyMi8ytdHOzkwPEVRWUE9NDc/Sffb1+9TWV9vx8LIvdHTa+PDv7a0v91TWUjfyMa+2V9ANjs+Y8vJ00s9NjY+/8a6xONAPkE+3by5scDMXVHZxrixtrzZd0BITl3j +a1tEOTs4PEhOWVVKS0xd99fK18vb08nIu729vt/O18e9vLq/00xBSEhbZ2NXPDg1MjpIXcrva0hAS0r3yL66x8hZ49PXvLm5us3fT2/Z283Ob1lISUdTW09fR0BEPV3v689nY0lJb/fFvsLLZ29N18S/srG7zk1OS//FxsfdRTovMjpMz8/3RDs8Mkfnzra/ +yPdX///Ct7Owu8Rfb9fLu7i6v/9fTUZfWV9bQjwyODo7S0hZTEVNR+fd2cV30e/vysu+u7vC2dP31crDwMbnZ0JGSl/O2d9fPj41O0ZryNfbS0NMP3fby73O0V9b29XDu7u4vszbzcbJxM1nY0JFSEZRRUxAOD04RV9f31dZQ1H/37y3urzb713bxLu1s77P +T1VX2b68wutFPC42OkXj72NGODk1RWfKuMDXT0tfZ8S8uLXDzuNrz8m9u8LRTk5PS+ff22dJSTlCRURfT/dnQU1IY87Cv8/fTVFv2cW4vL7jb05dyry6t8r/Ojw8Ru/j61k8PC85PUXb09P3Rk9H78u9tLa/zNnM2cG9u7rEzM/dz9vKzl93Q0VKP0k9QTo4 +QDtNZ1XfUVtLTffNwbnCyV9vV928tra2yNFIU1Nrv8LI0Uo/NkBKX8/fX0A4PTlV38+/02tORGNvxLy9vdvf7+vEvri1wsZna1tV0d/fXz48NDpKTu9VTjs5PkJnx8O+zdtPV8u/uLO5v/9vW/e+u7u4zd89RkRJ7/93Wzs5MTs+TNvjb1NJU0znzca+y9Xr +a87OvbvCv+Pn2+vK08vZW11GTllV/05VRDtAQ0/r69Nrd05P39PHvsjIb2dZa8TCv7zO2Vdv/9nIzttnQT82QkdM/1tNQTo/QOPT08Pnb2P30de5tb2+3+/n2726trnO60pNd+vIy+dEODcxPFVX91lJNzdAS9PBxcP/Z0pP0cO+tLu9b29nd8a+vbzTYz9H +T1fRzedZPTo1P0pj1+ddTUNVTtnNx77V3+NnzMrBvMPC0dvLzsHGy89PT0VCU09fSEo/Nz1BSWtf91VTSUR3ysC6vL3Z5+/jwby9t8nNY2vn48nH0dFMQTg/R0v3X0tCOT48TNnZzdtXU0dIXbirvb/P9+vfwLy+vNvrUUlv79XP31M9PjpBV1/db1dEOkhV +68HEws5vVUjnyMC6u8ZXTl9XyL69vNlbQT5ISGPdd19CPTc8S07r3V9fRFVrd8XHvr7PytPKv8G7w8bXd87NxcfOzlNRS0VfU11jTEM1O0NGX/frX0tPP13f2cLHydNn52/Ovr68w85nXefjz8rV401IQ0BdU1trSEY8PUhj2d3T51NbWdfFwbvBxdNj3c/C +uru6yv9XTmfn09N3WTo6PD1PW2/3RkA3PE93z8bI2Wd3Wc6/vLi8yd9b993Gur+/01tGS19j499fVzw6PEFfW3fnTEc/S2fbyMnJ3V9r98rDv7nBz29b49XKxszZU0tHSltf73dTSjpBSEvn29PdWU9Hb87JwsfL3e/v98nHysfN1/9Z2f/n2f9nR0NDSl1M +VV9LRj5GTlnd/+fnXf/r08PAvMLG19vOzMHAwL7X5/9d3+fd42NOQUREQ05RVU5JSj1MVVfn/9/vb/f308vNx8fF19HO2c/Lzc/v/1tjY1VZWVVMREZDSk1JXV9nXVdja+PXz8rMysrIzNPFx8bGx8zPz9v35+9vXVlTS0xLREdLS0pKSUdIU1dfb+vd09nb +0czKx8nIyM3Tz8/RysvP2evvb2NfVVVdU0lHTkxMTVFRWVtbXff/Z/ff3dnNz9POy83LzM/NztPf3+vn429bV1dNS05OUVlTUVVXW2f39+ff2+vr49vPy83Pz9Xd49vZ0c/X33dfTlNbVV1jW05HRkNITU9fX1lTVVlV3c/PycrM0dPRz8a/wsHGy9HR0ePP +093rX1VNS01MZ19TT0pKR0lPVe9nZ/93b2vr09PLzM3L19vb1dHXztfd3W9dWVtTRlNOS0xISkhPXWff5/f3d/fv18zJw8nMyM7PzsnGysnP2dv/a2NvW1VbU01LSUlHS0tIW1NPWWdnWWvv79XRzsrP19/V0dXMyMjFztPb43df9/frb11VTVFLSVldX2NV +T0xVW2/j6+vd3+d359HMyMfP12dV/8rCztdrXVtj3+dVS0E4QFnfxb7M60w5PUlnxrq5y99VTGfTyb/A32dvZ+/Fu8DdRDk4OkbrwLnJWT40NDdE28TK01lIUVfrwr3G1VdOZ9HBta+4zWNBSffPv7q/b01BO0dn69v/SURCQ1vbxcp3STs8QFPItbS5zE5G +SU7RurrB0UxKVVvdwMhZQDQxPUrjwLzfUUQ2PVXjv7jEztVvZ9/LwMTV7+vrzb24vMXdQzs7PF/Hyc7XRzo8PkVr91tjRT5T283Bvt1PPTZD2761rbfPZz8/Tf/Ct77O71NKWWfn510+Pz9Dd769wM9KOTY5QtG7vLvGZ2t399fN2+v/U//Fvr293Uc8MzdM +78S8xOdNPjxDV9nCwvdbWVfrxsPI1U9ASU/ZuK+xvm8+Ojo+/8m/w9lPQkVFS2dfVU9CRF/dysLKa008PVf/w7K2vMr3U13n08G+zufj69/KydNdPzg4PVvGu7rHVzo2OD13ycDDze9VX+PRxcjna0ZK682+tr7VSzYyOklnw73RVUM8PUljz8jd/+vv48vA +xM5TRktX3bixsLnOVT9ASnfHwsbTVUZMUWPfZ09IOzpX18W6v99FNjI7Vcm3s7vZV0pKU//Nv8vf493bx8HG30U7OTtI67y4wONMOzc6SdvNycj3VW/f3czV62tLSFnEube0vl87MzpJ3cO4vetJPzxFT//Iz2dZXXfTxbzFZ0U7OkFdvrGxts5NPzxA68XC +wtFZS05d//9dTD85PVPRwr/G/z82NUVn07q2xuNTTF/rz8HD0f9348y8t7zCVzo4OD/Zu7a70Ug5ODlM0cfEzWNRV1vXzs/nW0dFX8u+t7XG7z82PERdyrzF41E/QURHWf9bTFNj3cO6u7/jRj07Rtu6s7K5119MRW/Tx8HF41lPY//b1WtRQTU7U+fFu8DZ +SDY3PEnrvrnE3VtOU1v/z8znY1/30765u8FjRT89R93GvsLXWUQ/QlXb69vfV0tv38/I2fdbPjtF2762srrZQzg9TG/DvLzTWUxIUVdv1W9JR0lV1cC6vNVVQD0/S8+9u7zOW05IT9vOzMnTX2/dzcrR71NANzlN3cjBwd9FNzZAUWPKwNV3V0pv5+PMzV9N +T2vPvrW0vNdKQz9I3b27vMdXRkI+WdHP1ddbS1P/z8zZ611FPUfnyb+6vtlRPEBVXdvBxdtdTU5ZWWPvW0M/RE33xL27yFFBQkZfw7i4vddRS0ZZysDAw9drV2/XxL/P4109O0df0cC+yf8+OD1HW9HGzfdTTFlnZ93XXUlLTmvJv76+20xGR1PRwbzAz19L +SEhX18/X31FHWW/Vw8n3WUA4Q13Ovrm8zk88Pkrvy769zWdPTv/v48/fTUZHSG/Rx8LOa0tDRV/TxMHD011RSEv319HNz2v/283ExMzfUT8/S93LwsLVTDw4Pktd08PbVUtEVevfzctjSkZJXc69u7vLU0JBRuu/ury+901HQ1fn2dPM/1Nb2cvJztdrQT1E +683HvsPdVz9FX/ffyMfdW01X99vf2/dCOT5DW8rDxs9OPDw/Ucq6ur3TV0xKW9nNz87ZZ1fjyL+9wc/vSD5K983CvL/fRj5DTl3vzM1rTk5d29XV2WdAPkRV58bAwetHQT5K/8zBwsrfX1lf48vR91tOQ07bw7q9x9tFNztH787AwMlbPj9O993TxN9TS1XZ +ysfBxmNIPENX28y/v+9RRURJXdfOzddfVU7nz83ba1dGT2PPvbi7xOtHQEZj2cfByeNOR0tn6+vbd0pBPk3by8bJ51U+Oj9O3c3DwdNZTU1T99HLyN1vZ+vRyMfL41NFSFvTw8C9w9tfSU1da+PR0/dVXW/v3+vrZ05ITmfZz8zO60tCP0NVa+/j3WdXV2N3 +///f92dr78/GyM7T905GU3fZz8rDw91r/3ddWWPd1/fnzszv7+//Y1tZb93r59nP62tjV1NNTFdn9//n299rW11bWWPr28/N1d/dd1Vba3ff3dPP0ePd1etdU1VbV1Nd29/v4+drW1ddb+/3383T3d/3b1dXXWdrb/fj3dv/Z/djXWvn4+Pd393Z/2NfY2Nr +7+PZ29PMz9vvY11bXV/v1dnZ1etdVU5VXWN3593nd2Nrd11VY29fXWNn693v6+trV1tv/+vb1czX//9nY2t32c7M087K19/f93dnZ2d3b2v/4/drY2Pr92f/7/f//2tva1NRVVtVX3dv7+fr92tbXf/d1dnZ19fvd+d3Z2/359vd08Xv20xVTUPRyMG+/9dH +SVFOyMXJvf/XSFH/XdvIzNFNSjk/SErP0dHLU04+Rmdjz8fPzll3R2PbRNPn68lZzOfdxtnI2/fnTetR/9f/zf/n3T5rS1fT78HF18tPd0pOZ0/P09/RSW9KT+9TzNvjyVHjVWPV78PRa2c9TT9N/8yutdX/Mjo5Rrmvt8dnOi49S824ucTrPT07d8e/udFd +PzhMW867x9tXPjpDd92/v8tHOUnr27jL02c/PD/fr7Ouw+c7NUB3uKq1vEI5LTFXzbyrzF80MTVLx7KyvFU7KTQ/Z7K0wMQ+My893ciuuc1XPUtNzLnIxlM+PD7Vxr2x71k9O1FjwLa/40U9N1m+xLDIbz4jNLusp66vzUUyLj1rwau7zDw0MTFrysmw/1c5 +M0VXx7TJxj48MEbKzbG7zdM4Skl3uMG9zk9APXf3xsBbUzs/WWu1uLnERT0wQM3GrrvOTTI1ON+6vbVfWT4xT+e9qr3GQzguO3fCr6/GzDM6P0i+u7m7V0I0Q2/dtsXdSzpEQdXBxLpnY0k632PMvWtvQT5FWcTKwFc+PzRN08ewwc1RNjU877a0rsTVPDdA +Xbmss7VnRDY5Z927r9FjNTI1RdG+sb9vSi9GQ1+5yMTjPj08Xd3HwGtdOkNvd7i6xMtHPzpOysW30fdBOExbxbfAxEg+N0LCw7i13VM2NDvbt7GvyWM/MErdyqq950M2MjRXzLy061EuOURVvLi8v0k9NEL3zbrAyt04SVHRvsPFXVNDRcbEvbrvWTY4QFe+ +u7jZUT00TtXIsb7HSzczOee4ubTXTS4vPF25rba5TkAzPWfXt7LNZzc8PnfDubfKX0U1T2vHtcbOVzg9O2vFvLnvXTw6Xe+6uczjPz4/Tr/BvNlGMi06Vc21ur5NOzA1/8W9rsnVPTY+Sb+tsbLjSzI8a8quqbzTODYyQdPBuLlnQDE9SNW8wsRjPz4599PF +vndfOzhMTcW6wMlRRDxVyMO0w99FND9O57a6ue9DLi5TzLuuuso8NzQ7y7q4s9f3Nj5KXbuwvM5IPzlj08m3yXdEMT5B773Dwv9CODVZ27663e86OEpVwLy7yVNIOUfJwLK0wk87PEBvwb230Wc6NEpr07a9wVk9NDn/wb231VcyNTtJw7e8vk8/N0n3yrm2 +ym88QUrbw76+11FAOFvnw7bHz1M5Pj/jwr2/b044Pl/Xu7vC40JAQVW7ubfBYzYtOU3jvL3BVz4xMU7dybbHzj04PUXRt7i87001TevNtK+7yD9BPl/Iv7m8Z0Y2Q0/Ov8bJWT1APuPNv73rXzs1SlfMvsDXTEA7SdvKt8HLZzpCVeu7vrvnTDMwSNnDt73I +QTo4PtnBvLXVVzg9SvfAtb3FT0M5a86/tLjLXzU+Pm/CwL/RRjs2TVnIvNPfQDlDSszLwc1OQjk92826u8BdQEBF5768t83jQjdOd824wcJTPTU3b8O7tsn/MTc6Rsi7vb9OPTBBY867uMbrQEdFzL69uc9dQjdja8S5w8dZPD9J28+9xvdROD5b773Cwuc/ +PDxRwbuzuslBNj5M376/vWdJNDVNZ9m8z3c9OjtL3b2/wetIM0tf2bi0vslHQj3nwL23vN9HOk5fwbrDykw8Ozzfyr2701U7OEhVzsK+304+OEnnz7vBxU88Slvdurq311kzNEjvy7m/zj89OT/jw8K+50w3QU7bw7rE20c+Of/NwLe8yv89TVfHvcC+1UU6 +Pl/nwcXbazo3P07Oyr3LTDs0OU3Mvr6+XUE/SOPDvbTH0UU+V+/JuL3GW0Y2Q1/Nwb7Pazk+Pk7LxszOSzszS1/Pv8TTUT1ETsK7u7fJXUM9Y9/Du8PRWz4+TtvKvc3rTTtDUffHxcTZSj4/UePLv7/HUURNZ9W/vcTjVz9CVd/Z0eNPQz4+WefN093/SD5J +W+POytHvV0pN48rIxr/XXVdd48zBzcbOT01VU+/b087bb1FVZ/9rVe/rV1tbY1lVXffdd2vZ1d3j59/N1d/bz2dVWVdjZ2/f2+9dT1VTUW/Vztv3U19bU1nZzdXf4/9nWWPTx8jTzs7vXffd2c3P2+9fSEhOY2fr3W9dT0lNTVVVa+tnX1trY2/d38zL29PX +09/f1d/K2dvR429bXedf6+dv91lPS1VbTG/db2tXVVFTX1fR09nT1d3vd9PTy8nX1+drVV3r69fR399dUU9R///f0e//X1NTWeN308vn4/9nb+/T28vM/9vn/2tj3e93W1VbUU9TU+tVV2ddZ1lbW1VnUWvfd9nb3ef/3+fNzdXJz9nvb9v/39PdzttvVWPv +X+/d9/9TTk1Td2Pj1/dnV1lfX+fjzcjX09vZ/2/Z49/3Y+9nXVVn52tnd2v3Z19ba2NT53dv929vXV9vb9nR2cTJ3WP/2d/Ixs3O22tVV2tj9+fr91tMRk1XT2/3Z1tNTUxTX1/Rz+Pb3evn2c7RyszXztPd///jd9/b39tvX05NWV/d2V1NRkNHW+fbzmtT +Tkxj58y9v9HdSGNj27u8ue9dPzpVX8DCwNtCRDxMb8W/zd09QD1K48+6x85XREtO08a0wsxnPk9Cd8a5t9nvNkI/QNXKvN3jPDhIOmvny93j2T1XR03rzsPbv//d22PXa8bPx8b3y1tXR1HR3bvN21VBQzpn98i+13c+PjhR78a0xMJNRT1E0cCussJ3Ozo1 +79e4s89vMzo2VcK/ttddNzE6Ssy8tdN3TDFGRcK4sbNnWTM9d8ivsbB3UTcyXd+4trtfOjwuP1nKub/jODguOlvdtLq+S0E9Nd/Er662zztPPVXEtrG/yTs/RD7n27zP11c6SjhGXc/db9U7V0lI/9W/97/d99FfyefI1crG/9VIY11Zd//D69VdSFVF/1HL +yufVSE89T9/NuMvFZ1NDQMvRtbvN1UJJPdnKxLnn/z06OUzNy7rrZ0ExOjjfzby9TU0vNj/jtrivze86NlPvsrKvu2dPMURTyLS2uWNJMjZIV7i9uu88Ni0/TL60usBATTtC58CvtLdbS009a2e9wMfOPUo6QVXZwt/MRE9NP2tZzW/ja0jrSd9v087dwuPL +3d3L58lbzcrTy2/RW+dZU81f41VZSURbQNPnW1lDRTpdScq+78xTd0jry8yzxMPVXVdTysq5w9vrPEQ8/8rBuXdbMzQ2PtHRvM9bOTE9PsC8t7PR3TtJT9OytK/BXzg0Pkq8u7i+UTwuO0HJu7q6SkMzN0TXu7u2X0tIOm9rube3u0pXPkn/xrjCwk1NTENr +d8bV21M+Tj5ZT+t3TFM7S0hb4+/HUd3vb9F3xse+zOvH98/V09Hb30vT3/fZ7+tRdz5r51X3UW9GU0tHyOPN1WNvW9fju7jDxGdVQlFjzL7O20tDOkBrz77L40c7OTrv576/4282OThdxLuvucpFQUNru7exttVCOT5Lwby4vV9CMzk8z8W/vU5EMTI4QMnH +u8lTRzpLb728uLp3b1Fj3765vr9ZSkhLX9/BytFLP0U9UUzX52tnPExER2fTyOvRd+vT68jEucrN2Wf3UXd31+9r11tvT1VZV99P29dvXUldR/9r/8Pb1V1fVVvV0be7yt9TUUnd27m3zdtFQDhT3cy4zONHODQ6W3fBz2tONDU0W8q6ssPbQD4/77q3rrfK +SD0/S8LDtbvjWTc7PmfMxb33TDc3PEzKyb3OU0Y8Tuu8uri592tLXevBvcXISUZARV1rwc/dVTtFP1Pvx8z3XzlBR0rnyL3T21NHd//NwLm/091XX/fd1cTHZ+tPU1VM7+/PX1NjRE9DSk9TV0/P62trW29329+7uMfJ3+dZ09nLucnN60s/SGtvv8nraz04 +NUZdz7/d/0A6N0Pvzbq7x/dLR07GwLe2ydFHPj1Vycm7xW9DNztFz83DvF9JOztH183LvWdMQkBTyL2+utdbUUz30bq7vslJSkJKd8a/ydFAPUA/TuvL3V9CNjs/TuPFyd9rR05j29G8uMjL62ff79fKvsvr31FjVV333+9Nd2dVWU1PZ1tFa9339///Z9tf +977AwcjRZ2/3Z8bDz89vSD5HSv/K1dtnSDxASVnNyttjTDw/V1/GvMbIb0tEY8y+tLrI70Y/SdvOw73jV0I6QHfj18RvTDw3Om/j3cbfX0k/S2/Cw7u62+9VWePBvr2541tVTFPXycnKd0RDQEZv193fXUBAQUZL38/bz2dV///vzLzAycxv5+tf99PT99N3 +V1tFSP//VdnXX2NNR1n3VXfL5+9jS1nf39m+xM/R/2fj19m/vdnvY05PX2fny+tXUUxATUZO61dPTktASVlb39fv2dvvZ9/MzsbHx8jT69nV3d/V7+P3XW9vW09jX19dVVdjWUtVWV/r/+fN2+//2dnJxszDydt3/3dn49nT2WNNS0tJU2vn23dOTUtDTv/n +393/W1NOXd3OyMHFzvdfW93OzcTD3VdOSlHv99/L50xJQ0NdW1ff/1dKRUZOa+/Jxc/3/2Nv18rGvL/T2+dn69XRxtH3X1tNV2Nr5+9dSEk/P1drd/fvX1NXTvfP0cjFx9Pj/+vP19PI0etfX1Nfd2Pf52NMT05ZX2P/3+tXV1dX93f/ys/X7933483RyMjN +2dvvd+/f0c/fZ11bTVFZY/dfU0pMP0NLT2drd2tXVU//39fLz83d7+/Px87Gyc//b19r193d099rTU1MV1ld/2dfSUxMWfdv29Hbd2fd3cjLycLN42vr79vV18n3XU5VT093Z+PrV0dJTUhj3+fZX1VJTFd3zczEzNnrX1tn2c7BtLnZTEA8Re/Iu7/fQDk2 +O2vXwsH/STU1OkzJwrjJ7z8+SF2/trW4z09MV//Fu7q990c/R1nVxMjPTz83PExb0cz3WUA/Q2vZxL/N11VT/9XFvb3L/09PW9/Iys3nTkRAVV/b1dtfQkVCWdnPzudjQ0NT68e/vsvvZ1dd18XFvdnfZ0zOzs3N628+SUFEzNHNb0Q5LzhE673HzUc7Ojhf +xLe0vstHPU5nurCyuW9ZNzxn57q2wc08OjI8/9G703c+Mjs/58O8utlXRT7/z7y1vcFTS1tRyMnCv2trQExdV8332V9ARkJv3dfRWVc/PVlrz8LP0V1NTU/Gwr271+NFSv/Mvb7G70lIO1Xj08rRXTo5Oj9f3c/NX0o9P1/jxr7JzVdZa//Hv7m7zudRa9nb +x8rVZ05MT3f///dJQD8/Ud3R1W9VPT9Lb7u4u8TrXz9P3cm2usTdSTs+Vc6/uc9vPTY4Qu/CwL53QzU3SWvHvMXVTElEZ8nJurvP51Nr782+xMTdUUlP39nN1V9MPD1HSd3f428/OzpG59O9xtVPQ0ZPyru7t8zfTUdr18a5w9lNRz9O2d3MyGNOPEBGTd3v +0eNLS0lj59HEzchv49HdwMvMyuN3WePH0cjdW0hDSmPdztvfRT88PPfPzsXjUTw8QGfBu7zG41U8TWfGtLm/2Uc9P1HLvbnB6zw3OkBdysvMWUQ3OUpb18TM705MSu/PyL7Hze9Z48vCvcHL71NOVe/GyM33Sjo9SFvNzdlnPTc0Qt3Fu7/TTD1AU8m6t7fO +WUI/V9nGtr/PUT48Rl/Txb/3Uzo+RE3OzMrTSkk/Ue/VwsPOb1N378nBx8LTb19Z2dXLxe9nSEZXXdvr71dCPjhR73fN929LP0NKz7/GwtddR1Hrxry2vsdXSklXy8bFv/9OPEBNY8/T3VNAPjpRd+fH2eNPQ1vryLu9xdlrS1PZv7y7xfdFR0pfwsPCzE07 +NT9f18LJ0Ug8ODpb0ce+zmc/PEnvyre5u9NRPklr1b65wMtERUNM39fJzFVGOD1DV+Pj01tFSklv79nI3+djUdvPwsHFyOv//9vHycLP41lEUV/fzd3bW0U6PE1r3913XURFRV3PxMTE22dJVffNw77H12NRR2/Xz8fN51NCS073ztfdZ0ZGSWfV19PnX0dI +Y93DvsXLW1dRX8HAvrzZUT5HX9vCv8PvSzozRFvvydNvQzo6PlnIxr3LZz5ATWfHury9911OW8/EvrzJ50pJUXfXzMzjU0U9S1dr32tfSj1IVd/Tycrnb1NZ2cm/v8LOU1ld68bIw8dvSD9MY+PI0dVXQT4/X+ffyPddRUFMY9fHy8ffW0xvz8zBv8/dTU9b +28bOzs1PS0JO/+Pjd1tDPEFI69Xf3VtNQkXr0cfByt1PUV/bv7m5vctbQFHv076/x+dHOztL49XF0Vs6ODo/98nKwutPQUFnz8O6v8ZrTEtj2cbCv9VjQkhZa8/Tz91HRUJR993R53dLP0tj18/MzGNZT1XMycO8x+tRU2fbwsXDzllJQFXr58zb/0c9O0NX +4+PVb089SVf/y8fO01VPS+vGwr6/z/dNXefJxMnL901LQ2/b2dlvTz88R1Hn29tvT0lBUd/Jv8LF409Xa9G9vb3J90NEW9nKv8fXSj87Q/fPzsb/TT09Q2PdyszTWUc/Ue/OwL7G1VNXa9HDxL/Ea1FIVePNy9HnTT0/RF/v4+NVQzw7TffXyMzrT0ZHb8XC +u7rJ909j3dG+v77Jb0ZJXdvdyc9vQUE/RWvj999XRT5JX+/XydHbVVljzcbHxsz/W0r/08zK0edXRUlR587O1XdOPUJX/9PO0WtJRERVzMjFy9VRTV3Xyb6/wdFjSUzv0czEz+9LRkJRd93n/1NHPUVKZ+Pf3+9LSlf32dXJy9XrY+fNx9HOye939//V1dXv +b1lJS11ja1ljU0xIR1dnZ//34/9v59vRzMzJys/j3dvf1dvbz91rW2drU2fv7/9fX1FXU0pjd2dnd29TV2Nn4+Pf083T7+fT2dfVzcvX629v72Pf3+f/W1VNTEtJX11VT1FOTVljY9fj6+/j7+fXyc7JzM/T193f0czf1+frZ1lZWWNrV19TUU1VV1FXW1dv +VWv/3dvd29Pd2evZz9HX39//a+f36+fj629nV1VvZ2tv62NZU1NZd/f/6+P/X19r99fRzcrP3+fn3+PV0dHb52trZ2dn6/9nX1VOUVFXV2NdU1tfW11n7/fj6+vb2dvX1c7Zz8/Z19XX29/j/+//XV9fWVdRU09ZVU5RUU9VV2v/4+Pf3d/n2c7KzMrM09nr +99/Z2efj42dfW1trb2dbZ1dNU1tbX19vXV9dW3f36+vf2ePb29PNzs/X3d/3393n3ev/a11ZU1tdU1VTS05n62dfTUlMWf/XyNPj91Vr18vAvcTOb11r2czDwM/vTURNVXfPzudOQz4/TGvXz91RQkRJW8/Fv8jZXUxj59G/vcr3V0tP99nJw9dvR0FGTvfN +zdNbRT5EV+vKyNtrSUVM98rDvMXvXVNb48K9vclnTEhNZ+vGxutbRD5GTf/T0fdGPj9Hd9/JzG9OP0V3yr23t8h3RkFf28u9t8f3Z1FOX2Nj909FRFFr683XWUg3Oz9M07q5v9NNRE1O3by5vsTjZ//Z2cnJZ1dCPU3XzMfA60M/NjtRb8/Ax3dNS0hO79XK +1etjd9nMvrzFz1VHTVPrwru/0107PERCa9njY1VDQFdnY9HvTUxDQ+/Cvrq742tTRmPZxbu6wNn3WVXn79/dXUxNTVvPxc7nTDY2Oz5ryMbFx1NCV1ld2crPy9tjzsPJyMprU0E8W93Ov73LV0Q4OUlT38nNd/9jU/fva3dXRE9n476ztLvJSj4/R2vNvLy/ +zE5LSUhTXVlbTUNZ29nO0VNGPDVAWdfAtrjN90dHW/fTw7/Mz8vTy8bP710/PUNP38e8x+9LODQ3QV/Px8nTUVNfVf/P1dndX+fHvr65vu9MOztN78y+uc1jTDs9Q0tf3f9ja3fv19PnY0RCREz327e1u8VfTEpJ58XDvr7XW2dvW/9dT01AP0zZz8bH90U3 +MjlL98i4u9d3TUhTW9vDx8/Z29XNwcPH1U1ESUlrxL3Bx2c8Ojg8U+fr091RTFNRd/dja2dRWcu8u7m803c+PE1n0b25v9tNPkFFRm/fZ1dnX2/Ryc/bSj09QE3Ot7W4xVlKPz9j0cG9vMf/d2tdd1lPUUdBXc3HwsLnVzswOkZT172+1WdJRlVOa9HL49/X +zsS8vsPdSEVESOu8t7rDY0Q8NjtM79/O1VtRX1Vnd1NdY0ZT3cO9t7nK60E+TO/Zv7m+3VlJS0pGUf9VT1NX/8/M091EPT1BT9u8ub3BY0pEQ2/HwL+902fr59/R911bRT5K487Ev9NRODA1Qk/fv7/P50pITERV3//32dnRvry/w2tPTExT3by6vL3vTEA7 +QWNnd8/rTFFfW/drTE9BPEvVw765vM5TPT9Z98+5tcXOX0hTT03j/1NRVVFZ3dHO1Us/QT5H28C/vsdnVUZCd9PVxr7T59fXz8zvZ2tHQFvRy8XB0e9CNj1HSu/FxdtrSEdOSl3v/1tjb/fOwb/Az2NVTUr3wLu7vs/3TT5BT1//1dlnX1FTa19RW1NBSXfb +x73Bxt9HR1dv2b+5vsv3X29ZU2f3TU5PT//T0dXvQjw+PEnrwsHD2WNOQ0Zj1dPHw9XZ0dPJw93v3UdBT9vMv73M/z41O0ZLa8TG2W9IS09ETe9dVVlfd8zGxsh3T01MWdm8uLq802dMQ1Hb3+PO61FTY2/b90xOPjg+Y9XFv8PPTjw/W+/TurfAyndVb/9r +z9V3XVlRX9/X1d1IPz08RtvHxsHOVUtFRG/Z287I63fb0crJ2d9nSUj/zsu/wNH3QDpHU2PTwdf/VUZNVU5361tMT0tZ08fIyXdKR0NKzrm6u7zdX0xFZ93Zz8rdT1tnd+NbV1E/Okvr28y/zt9NPUpd/8u6usbPd2/f/93O3VNZV1XfyMvTYz07OjpPysLF +xOdRRTxL99vTwsRva9/VyMnZ1e9FTO/MyL2+zlc6PUdNX8vC0/dTSVdXUWvjTk5TU3fMyczbSkJCQlvPvL28wOtjTE3nzNXLyHdf59/X1W9bTTk8R3fbycbXXTw4QFF3zbvCy9N37/9Jwcvd//dv98/LzdFdRz87Pk7Xz8rH91FJRE13Z/fP22/j0czL0+fr +T0hb08fDwMjVU0JFTllj18rb52dfY19TWVlTUVFb78zX3+dbSkVDS+fO0cO9zN/3b29dX93G1dvNz+dnTlVbTEtn92d37+/3WVFZV09Z7+PVycfGydXvZ11j993XyMfV52dVSEdIT19bWe/f719j/19RUWPvb+vMxcfV3dv/Y2Pf19nOx8XV/29jT09VX2v3 +39nZ/2tfTkxNUVld593V7293V0tOU1lbb9PKytPOzOdna+vr79XLxMzf4+9RS0xbWV1r7+dbU1dPTExVY2v348/KzsrN3/dvY2fv3czIz9XnV0tKSk1TXe/rd2v3Z1dXW2tjb/fX09XTz9fn7+vr//ff08/T0d33Z1lVV1db/93X2d3va1VNTE5Vd9/n3+Nj +WVtXV11na3f3693Rz9PX3e9rX3fn49XKz9vrY09RVVNnd2//5+9nX1VTWVlj49/TzdXPzdv/9+t39+vr1df3d+t3WU9NTEtKU+vj5+P/U1NTVWvv387Kz9XV2+fZ29/b3+vf593X3etvW09PVVn35+PX2f9XV1VRUVn/4+vv3+NrW1NRV1Vf39XZ1c7V6+Pn +69/r49vX393X1993Z11RTVFVW+vd4/dbTUlMVXfdzMnGy93r/+//99vP2e/j2/9rZ2dnU01OWVNRZ+vjd2drZ1Vbd+ff1c7Jye/dX19nWczIycb/909b/1nZ6/f3U9X3X1tNY0//1+vMTlVXRF1b3b/R301NRUNvzb6+09tFS0xOw7+/vv9bPUZV977CyGdF +STtP69W/4+9LPktI67++v9PfSElfZ8TFzMlfX0tK5//bY1tVQVNb991n/0lNUUnP0czJ/+dZX9vXwcPJ21tnY9/NxcR3XUM9SVXdusHPX0k7PEfvv7rO20hGREfjy8zOY1E+RV3dxL/M1VdNQF/Mz77G0dVVX01f22/X3//vW+v391lJTURV5+/EzN/vTlVP +Z8jIv87rV0lT/8y8ydtIRz48V9PJu+NfPz08QmfGv7/X70tNVWfKyMrD5+9bd8/Tzev/WU9dVd3T691dZ19R53fd/1djS13f2cXV50dBQULvycm72eNKP0VO3b7DwOtvRktb/8HC1dtMVUhO0crByGtMPUZDY8vNxMzra0hjW//L48vZd+Nv09v/Y05bR13d +/85nV09CVU1dzN/VX1lRTtvRw7vT3UhTWW+/ury+d1E7P0lrxb/K41dNPUdd67/R2/9IT0lfzM/F319GP05R3czZy2NnW0v3b+PT687v39Pjze9nU0xvY9HCy8lRTURFXWfRwePvSEhJX87Jv833XUFMV926wMTVTz86R1/OvcnZTkVDPlf328n/d05RZ3fR +zNPTZ29Pd9HPwtPX2VNrW3fP/+dXX2NO2dXZ11FTQUt3/76+zuNKRD1R39O/yt9OP0lK38bMxmNZRUNfd8m4ysxXTD9Cb9G+uc7PTUpJT93f085nd0tX293V7+NjTndf1cXR0W9nVU7v79nba2tITVVX29/jb0xFQl/f0b3Hz1VNR0rjwr+6xuNMSk1dysHM +zVVPQEhn48bI3e9BRkJb1c7EzutnSVdRd9fr2e9fd1nf49/vVWtMUdvjxsjdXU1XUf/JzMbdb0xKZ+vMwdXfSkpESd/NxsHfbz9FRU3MvsLA31lCSlf3xMXV2U1OSFf33c9nX0xFW1fdz9nZXWdjW9XVztfv31v/29nEz91fTFlMX8vKyONjPkBRTuPBystr +VT9Gd+fGv9PfSk1JVc/Myc5rXUBMUV3Ly87ZVU9GZ+/bxNnd61lva9PR2dFdXV1X59fO12tnRktda8nKz+ddWUtd3dvF0+9KRk5R48/OzVtPPUFZXdfCzdNXTkFI38/Dvc/fWV9Td8bJy85vZ01fb9vN3+dTS09L99vn0W9rWVN3Y93d699VY3dn09nV/1VZ +R1fb28bM3U1MU0hvzMvF2/9ITGdnzMTO0VtdR1HXz8nI3/9CS0VOz8rJyvdbR1tf78nV1eNVWVH/39vRb19KRltf29Pd3U1RVVPf383T5+NbZ+fjxc7RX1djU/fNycff70dFT073ydHRa1FARl33zcnb505TTWPPy8rTa1dAU1nfzM7TX01JRGdv28nd32tX +X2PR0c7Lb3dfY9vOxs3Z/0lRUWPT089vY1FLX//Ry+PrS1FdY9PKzONbVT5MZ//Nzdl3T0g/T+PVxsvXX1lbWdXKzcvvZ09Z59fJyNXjS1FNX9/j2d1fX0tbW//V9+trTl1j3c7L11lbSEtv58vFzedKTENJ79nKy99ZSlNd58XLzfdjU0l3zsu/y9VfU09O +39HVzXdnSVdfXdvX5+dVWVdv0dXO2V9RRVFf28vT21dLTEdn69fR/3dMT2/rx8XK51VZS1vTysHH0W9JTk9fzs7M2WdHRU9n58/b41NVTFPfzcrH419GT1Vvz8vX21dVR1dnZ9/vZ19NW1/bzNfZd1dTW+vNw8bP3V1XX//PyM3bZ05LT2vZz9HfUUpKV2/R +yc7VX0tFTv/vzc3ra09ITGvd3dVvWU9TZ+vPx9PbX05VX9nJxcfdZ1FOXd/Iyc3nU0tJTffVztf/TUdKU/fPycvb/1dLV2vjysvRa1lOT1tr6+Pra1VbX11r/9/nd2dn9+vn39vj49/Z3dPf9+dnX/ff3+vvWVdVU13f1dXnb11XU1n31czd93dPT1lv39nd +d19VTFNn3dfT1etrXVl349/by9nvb2trb/fj183bb/9fV1Vdb2/n93d3Z1tjd+/n09Hf92ddXW/n39Xbd2dRSkxRY/fT13drV05RW+fTydXf3/9dZ+PVzsnN0d1vXWP/7+fZ22dbU1FXZ3fr1e9rZ11XXXfr49Xn72tbV1lrd//d7+f3XV1f9+fr29/f73dn +b+vv99Xd5//3d2fv9+/Z//d3Y1VVXV134+vn73dnXWt379fX3+/v/3fvd//n/3ddW1tfb11n72//d/9na+9v69vf2dvn7/fb393P2dfjd2NdX11d/2v3d2NXVV1da+/r2+v3a2N3a+vT29nrb1NTXV/v2dnd72dZWWv3383X3e9jX2t3993R3d//Y2dn9/9v +6/frb1tZXWtfb93f3efn92/vd/fZ3dfd91lZX1/v11v/Rkg+SNHCusr/QjtDQsq5t7//UzpJWce4u7xbZ0E/a9u+xsdLPkY6Z9m+v9PbOUA6Q9e/t8TMQD9EPtvFucDPUThJPXfLv7vV3T9HSE/PzLzR2VdBX0zj0cbG3dlDU1lTY1/PY9HrV/dLV0zd58/B +381MTE9X2d+9xs3jP0E9Tl/FvMjRPkA5QW/Et73FQjs9P9PHtLXCUzk5Rcm7tbDP7zc2OD/DurnBTTcwOUDMs7a8U0AzOUzItLK6U0U1MkrZubK3WTw7Lkvvu668xD8+ND3ju660yUE7OzzTvLO300g2PDd3y7y61185QD5byb+3zd1JQUxF0cW/yOtVO0hE +a9vVzP/rSk1RXfdvyevL12vnW+tbz9fTvdfN71dJV+vvws7nY0E/PFlvxsDX5z9DPVfdzLjG0UM+PkfPzbzC1WM8QUPbw7q5z2s6Pj5dvLm1x1U3NDxNvLa0v01BLzpDv7a1vUs/MDZH3bSzt9VENzVG57Ovtck/ODA9W72yu8o/OzU5Xdm1u8RMPT06d9e5 +uMPLRklFWcy+usfOSkhKR+fbyN/nT0JPSGdf5+dv21/vd9/Xa9lf3dHj32/rT/9d68XZ0/9nSExjY8PJz+NXTT9bV8+9zdFXTj5RX+e8y9NfRDxCZ2+9xM93Q0M+3c28tsvnQUNByFfXudVfQTY6SMXCtsJbSTQ9R868tbnvTjY8R8+0srDNTjo1R2u3tbnL +QD4zPU3Tub/LPz45PlvXtr7C70FFQl3dusXK1z5LRVHdwbzXzkRHV03j3cXv22NJa2PV28/3a9tTb//r1///Sut3a99351FnSWPL48rO42tRVVHTys7La1VETUjnw9XMa04+TVHru83K/0k9Qf/duLfG1UdIPuvNv7PL40g7OU7VybfMY0U0Nkbfxra85002 +Oz7TvLWx01c3NT53vLizx1FEND5TyLm5wEhCNT1O1by7vl9HPkBP2bq+vN1GSj9R77/DzNE+SUpN69G/3cpIR19R39fEd9/vQldLXe/Ra1PXT2v/a+Pr1U3d71/R79Pr12vnx+PN1ePra29Vz9Xj21lRRVdJb8j/3WNKP0Vfd7y/y9lLSj//68a50dlPQz5b +0cq3yd1POzlH38q4vddbOTo868e4ss//Ozg9Z8S/s8NbSTU8SdG+uLtdTzc8SeO8ubjTTj07QVfDwr3TRkM6RlPBv8PJQ0pDSmfXvcrGS0ldV9nOu87M40djV+/ZxudZZz9VV13f19FHZ0ZK53fN0chXZ+NN3ePOz9NvTd9v59Xd13d3SGvjY9n/71NjWVnJ +49vfZ1tM91vPxdvTXVNDXf/Zv9PTa0dCTffZvL/O40U/PmvVv7rOdz46OU7NzbrF7084O0bdyLu8/188PUrrv7q2xP9EQElvw725yVtEO0RRzMnFzkdHPD9P78HJxU9JS0r338HJy9tFVU5r08HI3eNFT1Vf28rGY29HRWdd1dPIb193Rvdv2c/V6073XWff +99Xn509X22PZ29Xv72dPztPV0e9vTVdEY83jzOddR0pOV8bNyc9VS0JPXce9x8djTUZR68m7vstbRz5E792/vtX3Pjo6S93LvNnjRTw/S8zDuLzfTz0/Ts7CvLrjWUA+S93JxL13U0I9SlXLycHvTEs/T13PxMnJTktJS+/Ows3OWUtTT/fVxs/da0lbW+vT +zMtra0dPW2ff3dFXWVVO72/f2dl3T3db59vZ0d3rTtvT083T0XdvSVXN0czb91NJRkXb29PZWU0/SEnVwMbLa1dJSVvXwcHF51tJQ19rxb/Iz0xBPEZv07/P01lCP0Xr08DC029FREXv08nB0e9ORUpv0dfG1eNdSFlf0dfLzv9vS19r6+Pj0WNfVU///9n/ +2+9bX1nr79vj5+9b///Xz9HN499VY2vv19fO/3dPS1tVd+/n71VOR1Nb/9nVzndvV13//9nOyeN3a1v/Z+PMzd9nX0xbVVnd62tZd1FTZ//R08vv/3dPa2vjz9F3zt9TX2dv19XP93dXVWNf393Z2W9fTVdXb+Pv12dfT1dnZ9/f1eNjY1V3b9/R189371/v +393O0893a2db///f2dtvVVdNVVdv5+vjV1lTWWvvz87P229rV2/rzcfNz/93VVljZ/fn2/dTS0lVa9vX2dlbVU5Zd9vT1c5jX1db9+fR1dNvVVtV//fb0dvbVVtXX+vd1dvnVU5VV+/r19Pfb05ZVffn2c3b3VtbX2/n18zV2+dfZ1/v29PO5+9XW11f6+/f +d2dXTFFTZ+/n4/f/V2Njd9fZ1d3bZ2d3b9vX19Xb91dbV2tvb9/r411VU1N3a+fd29NOY29TZ03ryM7D1ddMSVFI38PIvdV3STxJRme+xLzZVz06SUzVvMbBTlNJPuf/w7vT2z5KSVfIxr/Da+9DV//rv7/M00RXQE3Rz7/Oa1M8UUhvzNvRS1FGQdvvxsLj +d0NLa2vEwcbTT1VDW87Tv8jjWTpIQFfEy7/fVUE7VVXNusnLR0c9Qu/GvLrTaz1AQ1fLvcHCa107RUxfyL/JzVNVPk1r48rn52NRX0v349vXd/fj/9tj5+9Zd2fnw9XI/2dLSmPfxbvKy0ZLPkD318G821s7Pz1Oz8jEw2NXPUld/8a/v8VXT0JT49e+xM9r +SVFDb9nn0V1bRkzvd8/Xd19JT3fjyc/Md1NRRvfN077X60pDSFHVvsbCY1U6QlFdwcHG0UdEOkR307q80VtBSUNbxsm8zndRQVtR773Mv+NdTk93/8/I3dNPXVdT42v3d1d3UW/bb9ddU1NT29vKy+fbREtRWcLKxcZrUz1GWe+8w8lnS0Q7TefbvM3ZWURE +RV3Ny7vb90dKXVnZx8/GU2dNT9lv285390tnY+vPd/9TTl9T18/VyllTSUbf48m9zt9KRkBVy8e9v99fPT9GX7u+usBbRDg9Udm2u8JrRD43SN/TucbbUT5CRF/CxrjJY0ZDUVXTvcvEWVNLSHfvz8p390ZMY1nT0+9vUVtVd9Xnz+tbV03v2dXE0dlbS0tT +z8fLxvdfP0RRXcnCzM1RSD1HZ+O/wdn3RUlIW9XXwc7vd0RbWWvO18lvW/9V2+vn02frY2vT583r929KX1tnytnPd09CQVfX073L10xGQEfXwcO722s+P0hvwLrEw1FLO0Jj48O80d8/QDpG3c6/vfdZPURJd8TIw8tXT0BZ787Az9FTRltK48/TzVtdTkfv +b9nP629GTVtVy83GyFlPP13Z37/KzmdJR0Frxsy+zedDQExOz77Kwl1TQkZdZ86+2dVJS0VKd/fMyu/3S2tna9Xv2dNb42ff4+PZW29bT9nnztNrXUFLXWPGzM/3UUU8VdnTv8nOUUlGQ9nEy73b60dFS03Tv8vGW1E9RGN3x77f60NIRVnO1cnKZ1FBWWvR +w87NY0xTS9nTzMX3/01GZ2POx8rNUVNGR9/bwsXZWUBOTl3Jz8bbY0U+Wf/TwMnLUU1GSd3Lzr7d50hLU0/ZyNHLWVdETG9ry9X3d0hZTm/d69PnX11O6+/Xz//dVVPrb87X2+dTY1Nj0ePP729KRFld48fZzFldSEbr1dHB09VNUUhLzsnKw/9ZQEtZ98LD +0dlNT0Fd39XDzudNQ05M38/VxmNbSUj/b87J19FTU1FT09nIy293SE/v78nT1V9LWUtrz9PH7/9CQmdb08XTzFVXQ03X3cvA1ddHUUhTzNPGxWtVP05Xb8TV0f9OST9nZ9fE3d9RSl9P1dfXx2dvZ1fjZ9Pb49VRa29d0XfVXVlvUd/T585j701N92fVztvR +TltBStnjycXr/0VRS1/FzM3OY2c/X2PXws7NY0pXSNvd3cT/91FHZ1PZ2dvPU1NJStn/yMvv70VOa3fH08fvV1FCWd/TxNfXSEVPR+PL08X//0JFX1vVwszHXV1DSdvZyL/X50ZRT13L083NY1NBX2/nyc7ZY0tXSePX38jrY1lHX13dzuPTZ1FZTevrztN3 +705V/2fO29PVVV9TWdvfzNvjW0hfa2/R389bXVFG59vjx+fZT19ZXdfN185vZ0lb73fO0e/nSU9KW9Pr1dlXU0VTX9nI3ddnTFdM29HNw+/vVUhnb87LydNZU0hM79vHzNfvRExRV8zPyNNvSz9N/+PK1c1jU01Hd9vbx9fnT01VV+PN283rZ0pZ93fXz9/b +TT1RyNXv2c5vd1Nna+/na91vV/9d32v332/f/1/Z/+dr999jd/dr32N3XWfrU3fdZ+dZd3fv51vv2WfjZ+Nv69v31+dr3Xfna/fXd+/vX+tfd2/j12d3/133W9/n699f9/dZ/2vb7+d3W3dnX+fv22d371drb2fX699v/29VZ+fv1+/fa3dnUevj99v352Nn +W13r4+vX6+tXd29n4+fv1XdnU2drY+/f5+tja1d3X13d5+/vY3dbd3d30dvv4+/vXefv79fv6913b1v392vd7+/vZ3dd52t34//j/2/3Xe9nZ913//f//1vvd//b/+Pr/3dd5/9r3Xfr/29rW+dvd93/92tv92vja/ffY3d3/+f/5/dr62Nv39vb5+NbRlNX +/+/n72/nWV//b9/f2/9j/1Nn7/fV2dfnY3dbY+Pn1c7Xd1t3V2fd69Pf92dZb1dj2/fX43dfXf9b/9133/f3b1v/WV/fb9/j629f/19n43fn9/f/b99fd99nb1ln08TJb1NNRFH3x7/L/0ZBREvTwb/Hb0w9P2PVwrvEb0xFPVnHxLzJa0o9RU7vvsPK70w+ +QFPfxL3N609GRlHLw8XHW1FIR2PTvb7dXT8+RWvGwr3dSUc8Ru/NvcHVVT5ARWPCvb7TVz48SG/Dur3MTT46PufFubjOUz09QFu9ur3NT0M6SPfPuL/fW0E9RGPGv7zKTz87PU/JvsXDZ0xTWe/Pw89VSD1H38y7uMhLODY4S9PFsrzfVz0/SV3JvcP/XU9J +18TGxvdJPUBEU7m1u71fPDc5Rue5vMXPTEdHXd3Vyf9TSkNn18i5w/dAPDtH2cu6uO9fRz5JXc/KwdVJV0tPyr/EzV8+Oj9L1bW4v99COTlFZ7+6xdFMRkpVzsbG11dHO0rn07m4zW9ANTlK2cS0u9VdPz1Jb93OzltRTFHOvr6/3Uo8Oz9vvLu4vldJPT5O +98rIx+dKWWNvxsTXX0Y4PvfRvbC7zEs4NTx3Vb22xd1LQkpX39fTa1FLRuO+v7zFWUQ6N0Tnv7221V9IQERP3dnX209b59nHxMt3QTo6Rtm/srTBVTs3N0vbyrvJ401DT3fTzc5rR0c+V766ubnbSjg2O0/AvLW330c+QElrzM3Pa01TY9XGx8lbPzo8TeO6 +s7rIU0E8QE//xMLb3VFO79nOz+NRPz9AVb24t7vfPjQ2Pf+9urbDWz89SGPXycz3Q0JNa8W8vsVVPjU8TWu9s73GVzw5PlHfvsfV51FOW9/O2d9RR0RI3by5uMpbPDc7T8i/u7nrV0VCW/fb09tOP01v0b67w2tENTRGZ8ixsrrjQTc3Q3fJvcXXWUxX99HL +3WtGQTxNxby5t89RPTU4Wc/GuL3ZXUlJUWfn399OR2fjzL7AxVk8NTdL37y0t8RRPjw9U9vHxdV3S03r08jG40lCPDt3wLmzuc1HNjQ6b8K5tLvjS0RLWf/V2etKSVf3ycXGzUo5Nz5R0763vtdNP0BIVdvB0dvrTGfbzsnTY0Y/PUvXubm5wl86NDhLzcC8 +uNlPRURda+fP10tATF3Tv76/3Uo2N0RfzbS4vs5KPT5GXc/K29tjU2PdzNXnVUE9PFHFvbq601M9OUXnzse6x2tZSWPd3dvVZ0JBa+PIu7zJbz0zO0dnv7S5yFM/PT5T2cnF129LU//TxcvfWUU8PPfCwbm/21k8OEr318e6yGtXUWfr59/fXz5Ka9vDvr/M +STk4P1fVubi+3UdDP0r31cfj519Hb9XMw81dSD43Rd2+vbe97z83PEzTz7652VlKUffr2dfbTkJMZ8++v77fQjs8SFnVub7E40lFSUxnzdV3601O2czHyd9RQj08TsG9u7zRSTo4QuvLyb3IZ01Ga93f089nQUFT/8K/wcRZPTY+S2O/ub/FY0RCSFfjx9Xj +71Fb38vHze9MQT1B28K+u8l3Pzk+X9HVxb53XUlR29PX1dlVPU9n2769wc5JNzpDW8u4u8JrRz9DWefIx9//Rkpn18XF1WNJPzpZyMe8vtldPzpHb9fOvcpdUVNr39fZ2f8+RmPrxb+/yFU8OEBX17y8wttIRENP79PI6+9XQmPXzcTK/0lAOEfJw8C5xu9B +Oj5L1dnCveNPSlHr59PZ301BS2PVv8G/40Y9PU1jx7q/xmNLSU9378vd9+9NU9fKw8rbX0M8PE7Gv7y9zE86OkBr087AyV9JRmPd187P6z09TWfHvb/Ab0Y2PU5dxbnAxmdGQUhv38TL519HS//PxMrNV0M7PWPOx76/0Uk+QUz399fA53dba9nb3fd3Vz9R +69fBvsLVTjw6TmfVvsLLd0lHSe/bzs3vWUVFb8m9wMz/RTw5SsnAvLrL/0A8QWvZ0cHRX01Nd9/VytfnRD1MX9vBvb5vUT09SWfMwsXRWVNNV+vd2etjTUVZ1cbDy9FvTD1B59PRw8PPU0VPY+sf +--seconddivider-- +This is junk. + +What will it do? +--foobarbazola +Content-type: application/atomicmail + +; This is a a MAGICMAIL message that contains a survey. +; If you are reading this after receiving it in the mail, that +; means that your mail-reading program needs to be upgraded +; to know how to run MAGICMAIL programs. +; +; If you are reading this in the hope of editing your survey +; before sending it, you should start at the END of the message, +; which is where you'll find the parts you're likely to want +; to try to edit. + +(setq newline "\n") + +(setq global-survey-qid-ctr 0) +(setq total-questions 0) + +(defun nextctr () + (setq global-survey-qid-ctr (plus global-survey-qid-ctr 1))) + +; USAGE: (survey-multiple-choice "Which is best? " '("bar" "baz" "ola")) + +(defun informative (p) + (strcat + "#" + (int-to-str global-survey-qid-ctr) + " of " + (int-to-str total-questions) + ": " + p)) + +(defun survey-multiple-choice (prompt choices) + (strcat + (int-to-str (nextctr)) + " (" + prompt + "): " + (car + (car + (select (cons (list "" (informative prompt) NIL NIL) (cons (list "" "" NIL NIL) choices))))) + newline)) + +; USAGE: (survey-short-answer "How are you? ") + +(defun survey-short-answer (prompt) + (strcat + (int-to-str (nextctr)) + " (" + prompt + "): " + (getstring (informative prompt) "") + newline)) + +; USAGE: (survey-integer-answer "How old are you? ") + +(defun survey-integer-answer (prompt) + (strcat + (int-to-str (nextctr)) + " (" + prompt + "): " + (int-to-str (getinteger (informative prompt))) + newline)) + +; USAGE: (survey-boolean-answer "Do you think I'm sexy? ") + +(defun survey-boolean-answer (prompt) + (strcat + (int-to-str (nextctr)) + " (" + prompt + "): " + (cond ((getboolean (informative prompt)) "Yes") + (T "No")) + newline)) + +(defun mapcar (func args) + (cond ((null args) NIL) + (T + (append + (list (magiceval (list func (car args)))) + (mapcar func (cdr args)))))) + +(defun surv-pkg (q) + (list (strcat (int-to-str (nextctr)) + " (" + q + "): ") + (informative q) "" "s")) + +(defun surv-pkg2 (q) + (list (strcat (int-to-str (nextctr)) + " (" + (car q) + "): ") + (informative (car q)) "" (car (cdr q)))) + +(defun formatfillinlist (lis) + (cond + ((null lis) "") + (T (strcat + (car (car lis)) + (sexp-to-str (car (cdr (car lis)))) + newline + (formatfillinlist (cdr lis)))))) + +; USAGE: (survey-simple-form "preface" '("foo" "bar" "baz"))) + +(defun survey-simple-form (preface qlist) + (formatfillinlist + (fillindata + (cons (list "" preface "" "i" NIL NIL) + (mapcar 'surv-pkg qlist))))) + +; USAGE: (survey-complex-form "preface" '('("foo" "i") '("bar" "s") '("baz" "b"))) + +(defun survey-complex-form (preface qlist) + (formatfillinlist + (fillindata + (cons (list "" preface "" "i" NIL NIL) + (mapcar 'surv-pkg2 qlist))))) + +(defun ask-question-set (qlist) + (cond + ((null qlist) "") + (T (strcat + (magiceval + (cons + (car (car qlist)) + (cdr (car qlist)))) + (ask-question-set (cdr qlist)))))) + +(defun qcount (l) + (cond + ((null l) 0) + ((eq 'survey-simple-form (car (cdr (car (car l))))) + (plus (dcount (car (cdr (car (cdr (cdr (car l))))))) + (qcount (cdr l)))) + (T (plus 1 (qcount (cdr l)))))) + +(defun dcount (l) + (cond + ((null l) 0) + (T (plus 1 (dcount (cdr l)))))) + +(defun handle-survey (to cc subject qlist) + (progn + (setq total-questions (qcount qlist)) + (sendmessage + to + cc + subject + (ask-question-set qlist) + NIL + 0 + T))) + +(defun maybe-displaytext (t) + (cond + ((equal t NIL) NIL) + ((equal t "") NIL) + (T (displaytext t)))) + +; This is the user-generated portion of the survey +; Be careful in editing this, because you don't want to +; mess up the LISP syntax. (Be especially careful if you +; don't know how to program in LISP!) +; Note that lines that begin with semicolons are COMMENTS. + +(maybe-displaytext "Thank you for your patience. I would now like to ask you four questions about what this message did when you tried to read it.") +(handle-survey + "nsb" NIL + "Re: Multipart test" + '( + ('survey-multiple-choice "Were you able to read the introductory text?" + '( + "Yes" + "No" + "I don't know" + )) + ('survey-multiple-choice "What happened with the audio part?" + '( + "I heard it fine on my SPARC." + "I saw a message saying I can't read it because I'm not on a SPARC" + "I saw garbage" + "I don't know" + )) + ('survey-multiple-choice "What happened with the picture?" + '( + "I saw the picture just fine" + "I saw a message saying I can't see it unless I run X." + "I saw garbage" + "I don't know." + )) + ('survey-short-answer "Please enter any other comments: ") + )) +(maybe-displaytext "") + +--foobarbazola +Content-Type: MESSAGE/RFC822 +Content-Description: Yet another level deeper... + +Date: Thu, 24 Oct 1991 17:09:10 -0700 (PDT) +From: Nathaniel Borenstein <nsb@thumper.bellcore.com> +Subject: Monster! +MIME-Version: 1.0 +Content-Description: I'm Twying... +Content-Transfer-Encoding: base64 +Content-type: AUDIO/X-SUN + +LnNuZAAAADAAANeKAAAAAQAAH0AAAAABRWxtZXIgRnVkZCB0YWxraW5nAAAAAAAAVFZYan39 ++Flh7N3X6t7f2dzc811za3dsaWhl4tvY3ebd4ej/fnn+cGX+YWNubP3t5d7W2+b3bVhZVVlX +Vmj52s3JxcrLz83Q3d/x/V5QTFFsVllraHPf2mdqXVpcTUZJR05YXV5mYlBqyrmz3y4qKEq0 +qqK4UUU3SGho4M3Gxtpy4djHwc/sVVrTx8PH3+9dVFdNR0VIR0Q+OTpE8cfGXEJI6L64vMbO +z9LrW1dXaO3xaFFt3s/qS0VJUl7r6d/7e/LYxsPJz9Hf+NjKy3NbRUBLvp6nNyIXK7ufmbcz +LDNFzWBmyNTJWk9e2sPJUz44QmfWxNlPSEVOVlvLwL64v/JCO0Hbv7q92N79Y0c/TtO6vdxG +NzdCTEY+Ozc/WMu5vtT29+HZ3MnKz893Tz89S8S2sbK8uLreOS88v62txDswOVbc6kxDP0vp +3u1VQ0Q/Pkk+PEJPSD87NkjFtbrKx7a0vTQoLsGfnaK9X368r7TcQTxQyLe9UDc3Q1dtpZ0j +EAkOPKSMks4iJDavpLq2TGBKNTo3TdN4Qjk/t6egorfb7Mqyt66kqjYXDBVVno+cWx4ZHjRz +xs9BPz1Nzr23t+dKSNSyr7X0zJ6QnBYEBBPEj4qiMiI/rqSwxd3JtupKO07CxD8qJDi9qarq +Lz+pkpAzCQEJNpaIlMopLV2+1zA8O93sPjg94bS1YTs60a6loarH256SrScJCSmni5K2IBwk +S89JPy/lx73J4tGxr7DpMS86tainmKIiFQUNMqCMkKUuIBouMUJAMUtPyLa1uKutq7G6vb+5 +uKmamJ8cCgYQvJWNnMUhISAsKCcrMXu+tL7Bzbi7tsju3bihmp/GIRggbKCeqmAwJiUjJCgq +OUFISOi8r6yxt8C3oJqf3B0XJrKXkZrMKhwcHyQpKS0uNTpU1sq/vr/JtZmRl7IUDxjdlI2R +pkgfJCAmIR8kL0/GxHPqbcnNy7eYkZq5Dg0btoyHjJ5fGyUdHBEMDhg8tq5XPDJuwK+jnZeZ +pzsgKO6ZjoySoNYvIhgSDQ4SHzjf51FMRGHSu6uempmdqre+uKmjpazVNSkhHhwbGxwfKTJA +UVjYtaensmg7XKyZkI+Vna3MPSsfGRYWGB0lKzU8T9SvoKW2MSYsyJ2Vk5icoKCmtjkdFhYZ +HR8iKCw1RtO2pJyirMfCtKumqK29u8rGynhJNCwmIyMhIB8gJCw93LOus7y+tKykoZ+gpKit +srvPSS8mISAhISMiHyAsPXnIwbWtpp6cnJ6gpaWio6a0YzQnHxwaFhQSExgdJzjvvayjnZiX +lZWXmZ6jq7bZQzAlIx8cGhgXFxocIi9Nx7apoZyXlZSWmZ2gpaqy1TwpIR0aGBQUFRgcIS5U +xLSpoZuXlJSWmZ2foaSpuk4tJSIeHBgTEQ8TGB0mNOmvoZuXlpWUk5WZnqe230w3KiIeHBkY +FxcZGx0iKTfqs6efm5iWlJOVmJueprHKSTYqIR0aGBcXFxgbHycxRsmvqKKenZybmpudoaqv +tb9jOSoiHh0cGRYWGBwiL0nBq5+bmZiYl5ianaSuvs3hUDovJCAhIR0ZFhUXGyIuTL6ro5yX +lZSWmJmbn6m4ZD4yKighHh4dHB8mIR0eJi891LyuopuYlpWYnJ6hp7TPRDEqJiAdGxscHiEj +JSo1S2B+xL+so56cnJqZm56iq7C31zorJiIeHh4dHh8jKCouND5Wd72vpaKkoJ6enJ2kq7PG +z1AxLyglJSMiJCIjJyorMzhE9su7rquhnp6dnZ2gpbHE4F5HNzEqKCUkJiUmJCUkKzdJ4tW8 +ua6ppaGinp6io6assLznW0IzLSYhHx8gIyYoLTVBVG/cwby5ta6pqaioqq6xtb7G1GROQz46 +NS4sKSosLDA0NztP/NXAuK+urq2trK2wtLzO1Mr8Wl1KP0Q/Ojk5NjU0NTo+Q05ledzYxsDA +xL+9vbvAyczY5F1ZTEQ/P2vR2U9ISEVIWXXlxsbLzsnd2cjb3t7a4NfZ7+9fWvRJSk5DS1Bn +9HbZyMnOzNHe4dXAyNzscEk+UU5TaMrN6ONjaVtSSUhMUVVf5+/Z2H7c3XdsVmFWT1N53Vpa +XV3tZtHWzr/K2NztSExI98vCxby3yMPdz1NLR0nmSjhIVGVhbtbl9VRiU15JRk5GT2p3W2Ds +0UG3wbzD0cn+XD9WR2FXSFrg4cO+u7/Gv8LJ2eZdTUlNQEU/R0hKWFTqbtZx+XRc/lVVXOhf +bf3Szsu/xLe+u8fXyNPQa9fobHde0kx9UlzZSl08Tj5OTEdWRtFE90JN2UfWRmFnUuZGz05q +bPjIZcfevMrF2bzkYdxf2FdzUs3X3WLew87Jcda+3NhCdOlOTT9gXdg7WVPnzUJKR89PWTxG +5fb1RkruzOjV2NTCyN/haNfc+vDg1FxmTVtdb3dc5WfL//vX6szd3+/50srAycrW1tXoUEJI +VGlcRUlf8droftvPysbN2/Lo9nFZVVFNfXV35mdu/FlLTkpZ7WNOS0lqcWRwZuXP0NHR2uTe +3uR4bfrf7nXrdWjp2d7l5t3c8+DZ9W/f0vB2/tjS2d7dd1RrVUhDRV1aUktNSVJ5VE5LWdvV +yM7Z7dvN4vz+5NTT0t74YnT3ZWFVS05OU1haWPvW1dTc0sS+vcfb5dTbeWFOXm9weV1YUlFO +TU5PbdXn3d7v9dbM0NHcxsDIyeBlXnFZXF1Z6/x/b19STl5VTEpJTl1dWllUT2VpX3f6zcXG +ytfS3tnQ3d3s3e9zcWz2YWN8aF5eaWpoaldXVW3r9tnPxcbIyNLb6n5WU1pTW2ZlXlRPS09O +WltfbmxcS0tPVl5eaerZysPDx8/OzcvT097p41tKQkFGT+TMwcTEze9cQEE/PT5ASmS8tre7 +v8C9sKytuGMzKCYqMkvMubm602lNPjcvKignKi9Kv6qhnp2dnqKosLm2v8lEIhUODA4ZMLOf +m5ufrNQ7KiIiIiYw66ufl5OTlZiboKeurKy+RxwNBQIFDB+/mpGQlqTKMCMcGhkbITO1m5CM +i42Sm6Wuvlg9LSgrLCcfFg4MDxgurpyUlJijvjclHRseJDrGpJqWlpidpqy6z2XEraiv3hsK +AwMKG62QiIiMmtweEg4PFBoq+aOUjYyNk6C7Qjg1O0NDR8Kqq7ooDgUCBxbJkomIjZs9GA4L +Dhcpx52QjIyQmrFJMzNJqpaOk6gXAwAADTSXiYSLmVAZEg0QDxUbOaiRiomLmrUwKitB1b+3 +v7/Lq7DMIQ4IBg8snY2Kj6ksEw8QHCzQqpuTkpOcq0k4Pa+TjZG6EAIBCzWVh4WMsxgOCw8T +FhIYIr2WjIuRn10/RaudmpytxjwzLPC31zIRCAcOOpuMjZJfFhARIDLLuKmjmJebor7bNlmm +j4qRQwkAAAtPjoGBkWMSEhUfHRMPDzKmjYuOqSAZHL2cj5OYrO1xS9JN2jUgFw4RGUykmp20 +NBobHCxLz7aup6Ogp6i1ur3Fu6WXkJhBDgEGFKSKhIqlJA8TFR4ZFxUd7aWXm5+yrayrrsjh +fq6gi4yuGQAACC6Ng4afPBUdQCslDg0TvZWMl0UmIb6dlZ2ju6+kpab+LTaooakeAwAFJJOG +iqAdDxg4+H4sIz6pko+bu2FAz7q8USg8mouKswYAAAynhISPTxoqVKgoFw0bvJSNnUwaLsib +najM466noLjNOEM/W6+pMhcNCBpTmZWc1jcxJ1gtMTRXuqalrbg6T3nEz2m8louNUgUAAyqQ +gomfMyRPPzsTFRxqnZ22IyUyqqSnvde1pJ6rukZHSnlSPrGjWR0JBRXRk4+cMiksPccxLjre +taa2wMHEsrS1uc71mYyLpgYAABmWhoigsEDLKBUOEDK9pVYwKV61u9FJvK2co6q1vL7iVTk4 +RJuXLAwACDWbj5q8RKrHPCgdPaqnw89Wq6Sv22y7rLCoj42TFQAADKmPipumscYoDA4RPr/G +Lytqva9GR9ain6OrrqGkrko/UFLKlp4ZDAIMWZ+ZnJ+qnSsYGym1pcooybSerTwv46253OuP +ho4UAAAKqZKTm5OPnDAHDR29xCYcL6qs1SM2qZqgu8Sol568KjO+vryYmR0MAQcsq5ucl56b +KBIdL7u8Nx/Ir6zEdsKoqLnSTJ+OiZ0KAQken6WbmY6ZOhEKJTzhKi1oqa4tKTOtqa/DqqGl +sFB85Mg+K8+OmBIGARSypq6djZCZFAwg1L05LUSerGY/r6Cgxznkua2ul4+oCQQJHKOunpiN +ny8PDjEvJyBRr5+9KjvOs7yxrJ+ku8e/vs1NJkuOmQ4JBRO4draWhpWfFxRLMB8esaqa/SlI +uruxpaGctNnJvjhgnJsTBwsSsN29noyWuiMROygcHsesobQuzbvCXa6poqu+sLLJPC8rmose +BQsNRkE+n4WJqs8Y1kMYE3efqKQ9vLNFH1yvqKe0qazKKy4pLkKkrhUYEBtQQa2ajaW0JR4v +Hyg8qLClub3N7+3brLeyc8fsW9qsj6gJDBIjuUibjoitQiUeLBEVJqi2t7e4s0UvTK67t7ms +rcZHUGs3LS2ZkBMJDhNEKNWahI6vxSfLHhccqZ6nn6utPygiwrG0q6upw0csRDcmOZeeCw4O +GcItrZKFmq1fKbYfHCmkrrSwv7EzJSnLU3fXu69mSUBPO7GZmxsKFhM7K7qPiY20ty5GGxEh +Zqq4o6Sf1SotPexqtKuhr8XlTzosIx+jkxMKGRVeKEmbiZXCqSq/JBcjsLDIpK6lczE9s9Xb +trWvXz9JUisvs5urDQ0WGzYio4+ImLe3UkYSGCe5w7Ohn6I6MjJcS8yvpKO5w/ppNykizpS8 +Cg8XHTMdqY2JnKKqxdsPEiPXY62inaM8Re/jPfK+p69z3FE4KCvbnpoYBxoSKSFHkYqNppnR +wBsMFyA5OaOfl6XDur3GYrixn6q/veo+LCo2rZ4yChUUFyUcopCLm5mmwUsMDxMiLb2gmpis +rL/eP1HXr6y6sMLkPDNUuKa5DhEXEiscr5eLlJiauq4SDw8cKkKsoZKdn6euvN1tzKzDxd9I +NScmM+u2OA0aGRwvI66bjpqWoaatHRkSHiQ0RrKcnpuipKmy2s6/T0Q1Mi4sLD7PukUeLSUs +NClJ4a2vqKmmo7a6UU1GQjs2QVDJyb60rq6ytcPNdT8zMDIzNTk4MDo9NzoxMkDrwLmuqqmq +rre9ydtMNi4sMDo/Wc28r6qrqquusrzN6kw+MyYiIB8hIycuTM28s66rp6isr7S6yGY9NjY4 +OT1azLesp6Khoqiwv95NOi0hHRwbHB4iLEH9wLKqpaOlqKuxucxLODMxMjIyO2S+sKuop6Wp +sLzVTTktIh4dHh4fJCtBy7erpp+dnp+or7fDaz4uLCwvLzlvv7Krp6Wipq6/5UgzLSIbGhoZ +HB4jLk/DsKijoJ6eoqaststLNi8tMjU7eLytpKCipKartsxNNC4kHBsZGBocHypQxLCrpqCe +naCiqbHA5UMuLjFAZywxraWdnp6aoKxIN7yzSwsFCQsZExw8nY+OlZ2WoLghFxclLil3r5eR +l5ydoay5Qjs7NzctKS23np4jCQwJGBUaxpmJi42gnbojDwkPG1VbpJaNi5OdrKu5wPjdx11E +LyknO8O2wQwHCAccGcqgiYiKk8CsIBwLEh7CoaSVl5CcplfJtMm04rrM5jEnJCQ8cbs3DQwL +EyUvs5uIioqdvU4nHA8bIauinJ2bm6WvNVNKu8HT43NgMC4oLT28rMoTDAoOIy+1pY2KiZbD +OB4cEhUZUamcm52dn6PVPzZQwri//d9YST08ONWvrCQNCwsfO7Gpl42LjKHNIh8ZGhgbMMef +n52koaq9WzpJU8pcWDo7Pz0/Z7m1+xkRDRUq8q6omJSOk5quNyofIh0fJDi5p5ydm56jsMpa +NzYuLy8tLzI+0K6uSSIeHys8VubbvbSpp6OmrbPByU88KyktM0122da/urOzvcDN2WBMPjo7 +OD5HNysrLDA3SEM+V8qvopydoKKkqK28QysjISYsLS82S8y3r62qqqustcpXPTEsJx4aGhse +KCwrNVW5p5yam5qbnJyfsu45LiwrKiYqL0i9r6qnpqeqstJFNy0nIBoXFhkcJSgrOc6to5mZ +mpmZmpyit2w7MS4uLSouPuK9sa+tq6yuuMbpSzspHhkXGBkeISUtTbypnp6enp2dnqKxy04+ +OTMsLC44Zce1r6uoq6mvv+FLOSwfGhgZGx4jJCYy4LSlnp6cmpiZm6W/aUI4LiwmKTFC/cm7 +u7KvsbbF/F1iRSwfGxobHR8eIS1qtKWen5ybmpyeqb7abFk/PTMzOUjt1MC5rqurr7zSVkEy +JRsXFxkbHyEkL+2ypp6fnpyZmpyfrb7Sbz40LCktNUZezr2zrKyvxM7F110uHhgWFxofHxod +K7uknZ2emZeVm6W5zd9IOykwQr2trquurK+7XUY9MjE+yegeDQoMGSc6RKyYkpKjv0hqOSgb +HVGompuXlY+RnsVKWU1CJiQoMy4pICTon+gIAwQVSrqunIaEhJhVKSsfDQ4QQ5+WmZaQk5tp +Lju8yt5E+b5KLikpIS5LtywNDQ4mRO6sloeKj7hINiMTDxwypaiin5qerOJDzczhQ2VFTS4q +LjItNr2dZAoMDSNVyKWOgouPtshAIw4MIjusrqWfmai/393Bd/nDsOhALjU1Lx4p0qU6BgsS +KjI5o4uDk5u4rUAXDhvNy6ukl5mhZtvDUjpKubTLOGlPPSolLE6utwwKGxU5LKSTho6emsH6 +FBISQEReoJuWpK+/rFhD2aqos/tK+S4jJCkjMb68EBEZGTcwqZiJl5qbuPQaFxgxJ9annZ2q +rLCvR0RqwtPiUedNMDg7PEG2pBkLHhEmKbWWi46aj6x5FhcUHhsqpJ6cn52krjpJ5WFavrzC +fDs9NywkPaglCB4YHyLHmZCPpI6gxCAhGhocJauupZ+Ynqe5ucNrW728R0tBOzAuME22Lwss +HxIfP6Whkp2NmrftTCEUHBw9Wa6emZyanam38UhHNTNJNy81PT09uFYOKRwPHCzItZWcjpih +sMEjGB0YIy3Fp5uYkpWco6zSQi8oKScmKDM72a0fHcgUFSA6J7CfnJWcmZ+uKjYdGB0jKUyy +npeVk5Sbo6tOLCQeGRsdLNYcIKYlJ2ixIW2q5q+upbet77pILT9GLDbFwLKinZybnqKv7jss +HRsbGiQ8GDO8Izuvui6cp7mmna+6rU1CLzAvLio9SWmupamfnqWmqsBNOyshIB8jLxwe6yIl +ysIqq5/Kp5isx6TIOFZRKDFRNDfNzcevqailoaOpq7XjOy0nHx4iHxwpMitJyP7gqbG+qKvA +tK7HwrleP1Y4Lj4+Nk7n376ws7mxusbD3U9GOjU4NDE1MC8xPUlvzs65srCsq62vsr7H1FpK +QUI8PTw8P0JTf83Cwby6ubvBzdpbRD04NjQ5OTxASmRf7tnPwr2+vb2/xc7pc1dJSUlPT159 +7M7U1dfW3PDta19MRkE/Ozk8P0ZNaNbMzMO8uLi3uru8wMXGz+3xcmdXUUdLS0dMTE9PT05O +TUtJRkJETU9hb+Da29XV4ujZ3dzXyMbBwsfGzNTc6V5aWnBhX3v8dGdrY1lVVmJmZ19ZZlhO +UFJXVV9f+ufl1dPKx728ubq9v8PK2/pjTkVKR0dFSElKTEVOW1RaVVBXXV5obHB2aW9nWFpX +bNnTzsXBxsTFy83O1d7l7mrn/vn1e917eVRRTEhTTExXW15baV5dWFpeVmRvfPLU1dvc2NXX +2t3r9Pl5ZuPta9jl29ff5nphZFhealtnc2JaXmJfYmVkauDq7d3o4vNsamTz3d3Vz9LU6uHY +fOZ5+f9y8Hvt9Pbv3+Dj4NzY3d7sbXFrXlRtcGp4aV1ZZV9WVlpiX3F9eO7r+n9tXlpTT05Q +U1phZ/HZ1c7S2NTY1uPc0t7m4vv+7uXv6u7+7Wjl4uDm3uji7GJYTUpHSk5QV2d24d3Y2Nze +7Otx5fdeXl5WWWdjXV915uLc293qbvDn3uB3b2VseWxeauDa1M7LzdXY6vjs+2pYWl1eUU5W +UFFb5Orezs3U0svRzdDP2+HxX2VmWFhVUE5eb2/4/vpzaVdcXVthXF9mfurf1dfW3Nz1cWlf +XFx5afXyaGhtZWRkb+vj19fU1trf5u5iZV5iZ2NmW2d+de/b3t/r4OVyaF1YVk1SZF91X3jl +5+fj3+nj393naGBfX21uc3JfXnP5eGd26O3s6ev08eX9bmz7dPrc6ujd19zf6Ozp5O3m52pq +YWlpYl5eXWLu49rT0NPS09Xc6uNka21iaF1PWe7t7X3udm9vdnxjWVpXVFlrXVNkZ2Zq6/Xi +9HX+dfn9bmFmdPPj5Ofk9/zd3tXU3N7b2uDg2eJ3Z2N0enT+9ujf3trj+2FOTU1NS1BPTlhh +Z19jafTp3+PW3u3f7Hdxelpm/fXl39Pa39jT0tjX3+/gZOxqSnBYXmhlTV9fVXl539/VenF9 +V3zrXG3o29LNzcvW397R2dXX59/r/lVNT0pARkxRTVJqetbe2MXXzFn0Wld8VFhXXmtu73Ht +6uHPxtB+09/Z+2Vd29z9Ze/e5Ovo+HrwamlUT0paZlxrYHzy7M3O4U5L1Z6tI05L5ygsJlqm +OsG5nrizRlbdKSEgPyw5Premn6SknaeszNtFOCQeJyUlJr6jUS49Ss9GNDWqnbmvq6Gqtz40 +3CwlIzlK7Me/oKCmr7G730IsMC8tLC4vLC2+l60fMC5RQS8sxJGfoKOdnq52FxscGRQYKDip +pKCbmp2uuUtBPiwnJzIxOTk4Xe7QbNm0nZ45LDL6uL2+y5qVmqGwtnlPHhUVGB4iMj23oqCm +rrPOezcqKSksLTU3QElUV1/Vpp1MMS4v0r6u2qScnZ2nrH7LPiciICQoRUu+qqahpae8x1E1 +LikrKC4xO0E/R0VmZHDOp6C+dzk6cb2z2baxr6mvvkVBMC0rIyMlNT/xz8C0sK+/xudlZ1NK +Ozs5Pj9CRkhRc8/IvqWZp/1AMEjltsbPsbGoqa3VRz4uLykoJi0uMj5AXFzc18XAx7/JyNPk +X09MPz07Pj9RadzJzMW+tKmqt/w9OEnKxL68vb+/zn5VOzg4Nzg6OTc5O0BPdOTez7+9ub2+ +w9LP1MzMysjJxsHFxsnP3GZbZWnr82RURUZJXXhdWk5NVVpRT1NHREA9PT07PkZKbN7SycrJ +xr+8vr2/wsO/wsnT4OzwdFVUW1FXWFFYXlxYVVxoaP7c3d/T193u72BcV1BURkRCP0VMUFpf +WXZ43szJysjFxcPAwcTMz83c2/FmY1pQVFFHQ0VFPz9DSk5MT17u29jc4tDJxMPCv8zW0Pts +XVVWWF1t8fbu3dHNyMO/wsbExs3I0nZqVE9LTkxFQkJJTkhIRENKSUhMR0pRV/9s4dPZ29bN +z8rJ0czLzs3N2dz44trf2t/Y29bPz9HnbmZdXFpUUUxLVFFMV09OWWX8/uZtf2NRV3F7XFVc +c+vYztrr3NvTzdbf5tzY6e1qXV5RWFpeZFxdb+bl6X3+cfB+b+jnb2Nnafjn4uXq7Ozj/Vpb +WV5tZ/39+d7T1NbSzdXMzM/Nys3X7O5iU1BHTlBUbGhkXFhRVGbzY21xYnhgWFVPTlBoZmL1 +++Tj59/o1eHl4OPU3+Po5uTd5+bc6N/l29vu2tzc1+RyY1phVV9sT09iZ2lla/VtZWxfcur8 +4W1bZl/6bFpnbvrm2Hpl++F77NPvaWNYY2rs2NzhbfL6fOfh3t/i39jr5OxebV9naF5rZ1N9 ++FtybdzX087c19n1XXnf1dLecfDP2Hl5U0dMYvz2YltgW/7u7ub9bGZnZl9WV1VUYV5dbVpZ +8+/q39z9bebd1NTc39/Y1tPW5Hfp8Xvc3Nzy7+To7vVZWlFn7+puTVBR/mluVk9hfd74ZmFq +dmz9d2Jhbm5Xa2B88HJgZ9/Z1NvieO3a3s/Ydfnt3enZ2+z9eurd299nbWnn/1BQXGl79Vhb +WFNPV+zf2tLX187HztHOz91+al5x4+by721Vd2pYZ2NqaWVOSEtQW2RaW1VXXVx+6+x99f/s +3N/o5d/8393d2+Lf3+bf1tDM1dTvfnHm5t3c5mVeXk5eWFtkX15XTlhhbGzuY1RUU19re+/R +y87T6H10bl/6xr29zFIxJiYoNruhm5ujukIrJCMkKCwxO1zMua6rqqurrKyvtrvHzNHhRi0g +GhcaJ0qxnpyfprlPNCspLDI9YMu7sq2rq6ytrK+zvMxhQzpAVj0tHxcSExw1uqCbnqe3dDUn +IiYxdbSloqGgoqaqsbq+vLrBwsfIyk4zHhMODREdaaKUkZObri4aEQ4SHTqxnpeUlpqepq6y +tLazraqqtlcmFg4MDhQk6aGZmJ2vOR0VERIZKs+kmpSTlZuirrrEwL2zq6WkrlciEw0OEyJj +pZmXmqPdJRcRERYm5qWZlJOWnKSwzEpNwqyfnaZWGg0JCxAlxZyVkpquMxoRDhAZK8iimZSU +l5yirrS9vbyzr66zx0ImGhQTGCE9tqmipq9fLB4ZGR0u2qqcl5eboq28uq2in6XEKBcPERk6 +qpaSlqk3GA0LDA8cOLainZucnqSjpJ+enaClrrzReEI3Jx0YFhcbJUS4q6av1isfGhsfNMKj +m5eXm6Kuu7OknJmdrycUDA8aQ6SVkZWmOhkNCgsQGzXBp6KeoKOlpaWioZ+hp7HM+2xtVjcg +GA8QFSN1o5qZoLctGRMTGyy1npSSlJujt87etKGYk5qvHA0GCRE6nY+OlqorFw0NDhgjRsGt +qaanpaSkoqKkpqiwtsK8tbfaNBwRDhIZM66bm564Mx0XGSA8t5+cmZyfrrm3vLuxp5+dq+wd +EA0PJcWclZOizygbFhQWGyEsUt63r6ekop6dn6GkqbTAv7yvv3wiFg4NGCmvo5yfq0olHBse +KEjGr66qq6iqqaippqmmo5ucrEwYExAVJO+empq0OhkSDxYeL1XnurqsrKWqqq6usLWxsKmi +n6nLHxUNFia1mJOVsDQYEhEbJj/jvbKxq6+prausrrCwpJ2apNQaDQsSOaGNjJCvIQ8LDhUi +LUdlx7eqpJ+foaOpqq6sqqGepr8cDwoOIsGUkpSxKRUQFRspOkZJ0r6pqKSqs7a9trGelpGb +4RULChR7mYyOmUEYDw8XIi0yLTNeuKCen6zFycetpJ2alpurMQ8OCx+3l46UnykVDQ8THCEn +K0exo5uiqbu9rqadmpSSm7obCwoOP52NjZbPGA8OEhkeHyguv6WamKS4TuS0oZmXmJWcrS8O +DQser5aNl6kfEg4SGCAgKzy9npuYpLzoz66fmpmZl5+6Hg0ND0yjkJOkOBUPDxIWGRkjNa2c +mZyyzv23opqZm5uYnasrDQ0OPp2OjZvMGxMRFhcaFx0wtJudoLL217GhmpyfoJmZozQLCQkm +oI+OoksaGRsfGhcSHDetmp2m2UvNqZ6ZnqWjl5OePwwJCyybjo2iVB4eHx8WEQ8ZS6eXnKjA +bryopKStt6iakp1gDgkNJJyUkqn4MjU3KRYODxlTq5+nwN7Nsqelp6yrmo+Qph4IChBlnpqd +udTdxj0cDQwPIdmtqK6xrKelpKmqq6eclZaqMRIPFy6uqqy9wtnTOR4RDxMfPc62r6qnpaap +rrOxqp6Wl64uERAYL7y4tcS6t7DVKhcSFB0sP2vHr6Senp+kqKqqoZubqkEdFBojRHPpUe3Z +x8RCJx0bHicxPli+qZ+dnqCkp6ytqZ+esj4fHCAxfF1INTc/3uE/KCMjJi0xLzI7cb+zqqal +pKSkn56fr04uKCksNDMuKisuRtnM1eXe2Ma/w9hMQkRR3MO+t7WxqaGgq7h8RkFOOi0lIiEn +N0RJQz5D6svXTDQrKS04T9m+r6ifmJOTmaCtxVtFLyMdHB0hLTU2MDM0QPR/TDw3PFbGuK6s +q6ainpmWl56ns9dNNiccGhgZHSUpLC0yO1PWz3NOQUVd18W7s6ymn5yYlJSYobFPLyMcFhQU +FRgfKTA8TnbJuLm8xcvLxri0r6ypo5+dnJiXmaCwTSofGRcTEhEUGiEtPFLQvrCsrK+/7EpM +69W/s6qjnZuZlpaYnq9SKR4YFBISExYbIzRM3Mq4rqytsL3bV17bxLm2sauknpybm5udo7dM +JR0VEREQEhUdKD6/rKqjoKSoq7fbXk9GT/jCtKukn52cnZ6hpa3fMR4YExARERQWHCY507St +qaWlpqmuvNVaQkRlyLuvqKOfnJubnaGpsn0uHhcSDxASFhoiLEm7qqain6Cjpqy3xX1GOzc6 +Rfq9r6WfnZyeoqy3xEAnHBQQDg8RFRsjMX6sn5ybmZmcnqOuxWk+MjU9SF7Dtqmhn52eoqu7 +3U4wIRkRDg0OExkfLFa5opmVlZWXnJ+lsPY5KiIiKC44asqzo52dnqGqudFQQzMcFhAODQ0U +GzHNrKKYkZSWmZ6pscs7Ly8wMDxS2rqvp6KfoaWrvWk3JyAhIysgFh8dFBAeLCi1opmUjpCT +laGxzTMdHBwYHSw1U7CinZiWlpicqLRjKyMdFxUXGygfGE0fFRw1Ni+YmpWPjI+RlKSuUiUe +HRYVIR8gTLytoJiZmJqdo7VcOSgcGxwYGSQ9IRy8HhUlMDBKlZqOjIyNkZmmriwdGxMOEhkc +JlK5qJ6ZmJuip7dFNiskHh4fHh8mMfXCJWasGi9at8ifjpeMjo+Xn7F0OBoXFg8PFh0fNcy5 +q6Sfn6Koqb59UjUqJCMgISMoME2uxjKeuyrVybdVl5yYj5mWn6tXTiUUFhQQFh0pOsiuop6f +nqK0xfIyLSooJyUpLj0+W8mxnq0qorYgTd2q5ZaXl5CioLZNIB4aDg8UFRsoPtWtqaCbnqGl +rtDeRTMvLCorNDFB5Gnt672om9YtnC0cNMSuxZGdlJGjpLNMFxUUCwwRFh43xaiYmZqYnq62 +zToyLCsrLzdjzXHPy8fqYXi9osocurseMf6ht5eYm4+mu9pSGhEYDw4RFR421LWblpuamp+2 +yEc1Liw3RlRdubO5tbq8z0kzSK2nHh6qJis4p5+elbGUnkUtLSENDxATGxwm7K2xqJiboKms +sr9oPndYRU3KyMnO3cLVY07mXDszXZ2iHC6uOj44q6OUoPKWoT4eJBsPDgoSJB4fxJyenpub +mqbQyLDUPVS/s7vHvqu4R0BVTjIvMz89L1qcmyEjVDf2KDPDlZxBn52rPh4aGRwNCyBFUcam +mZGSn5+cp2Y1OUziT1mzo627yu9ZLyUjKyolKCw6+p+YPCo8Kz8rMDmckq2foKa0PBsQGRUO +FiE9sZ2dmI6Sm6a3b0tIMj3WurCqs73JSDAmIh0fIyMrOEj4qZOZOyseI0k8NzGZk5WUprG9 +7RkMCwoOGh8ss5eQjY+YnJ2pVDcuMlfBvbWprbDNNCMfHx0fHyMvUcy8oZKadTEbHjntTzqf +nJWPmrA4KxgRDwkJEyjPoZWRi4iLkJy2MCsmISItQ7ejrL1PNSkmHxgXGB4sQ1W+mY+bry4W +HjS9xKyfp5SQlaVPHg4PDwsMEhs5no+MiouQlZqrSCcaGiAy4a6mrK+30UApHRcXGh4pMj/g +npGXnVcXGR9aup+erp6cmp2qMA8LCQoRGyM1uJ6QiIeJj529PjArJiAfKG+soJ+xSiskIR8e +GxodI0GkkpCXpyIbITqtn5qoqaWln6bGIRIKBwsRGyxTuqKTjImJjpu2NyUkJSgsMT7Nraus +vD4pIR4fJSkrQ6+fnJvAJx8fOLSal5qetr7ByUwsGQsHBwsYOq+el5WRjo2Okp9oJBobJDRo +xcHKyc3XdT8vJR4gNr+xrmwfGh00qJONj5emyGNIPC8fEQsKDRc5rZ2YmZqYl5aXn7wxHxwe +K0nOwczcdeTKxNDbvLm/6SsZFhkptJeOjI+ap78+KiAWDQoJDBg0rpuWlpebnqKqvk0vJSYq +M0zm2e5QQt+mmpaYtx0PDBAppJKNjpafq7nK4C8XCwUFChlcnI+Oj5SZnaOv/yoaFRQZJjpc ++b+qpJ2g2iwbGyTJnJKMj5Wfr89TNx8UCwcIDh7AmY+Nj5GZoK9wLxwUEBEVHTC6oJ2fzS0e +HSzRnZaRlZqeoaKorFAfEAsMFCu9npiXmZucnqa9MRwUEBIVHTHVt7DJKSAbITqvm5mWnJ+k +pKirxiwbDw8VKMmgmJaUlpaanq5uKx0YFhklP1JLHxMPFCfAl5KSmaWur6y0xycVDQ4WOqSW +j5KVmZqdoK9NKBwYGSJGxsoyFQ4NGkyekpSYqLS8sbjSJhMNDxxanZOPk5WYmp6mujsmHR4q +X/FDGwwLDiSwko6Rmaiytbb1LRQMDBQypJSQkpmcn6OsuU0yLSw8u6u+SRcMCw8fzJ2dnKKo +qKa0OBwNDA8hwpyVk5SYmZ2kvF8xKz2tnZ21HAoHCxvPn5ueoaGcm6E/FQkIDiO4n5mampqZ +napOLi9KxMW8qrC/OBMNCxIet5yXlJmdoq0uHhAOEB9doZWVlZyhsslHTEdMuJyaqGsPCQoT +J76jp56cmZmeORYMChInvqKYl5SUmKTXLCk8S91SYK2mpdQYCwoUKKabnZ+hpqa4JRUMDhjv +pZiXm5+lsufXWL2nmZ++IwwMEyvIqKWmm5iYom4UDQwPHTDUrpyXk5ei5TUvSbexr9c+x52f +qR8JBw4pu5qhpqOeoaUzEg4RI9Siop6kqq+0ybafmpxeHQ0RINimp6eupqanVh4PDhYkSd2/ +vamin6m+SUi+p52eo6/Heq2lyS0RCxAus6OftLyxsV0vEw8ZMrmjoqepuvgzNs2akJlpGg0a +Uaqmt8q6np6uJBIMFyM+6O69p5ucplkxLsmpn6KlqK/E1arMLRwMDRhorZ2cqaioxisbDhUi ++6qcnZ2hukYsN7aXlbkcDg43qpyipaacmKoqDgsMGiUzP76ilpeoQSUtR7auqaadmpy6RbK+ +Ox8KCBNqppqcq6Wgrz0eDRUpxKmfpKGep7lCO76XkaMeDQkd5rGvp52Uj6UpDgsNFxgbI3me +kZSn2jpozclc27KfmqLNNLOetjUNCBI+pqmktqGWmVQeEBQ1zMDTsqycpeMuOVupl5iuIBYQ +HyksQKuWkJKvLxwaGBcRFSW4mpabp6u2vUgwNL6noKSyzE/CnLIcDwgUMq/cr52akpo/Gx4Z +Jy4vRaGbmqZINtu4wa6rm5fMHREUJEDJt5iVkpvFHhgSDg4PGEyel5aeo6u6MCQkN7yqqKWj +rLs/vasnFwwNHcitsJaVkZSsIiMdHiUkLbWcnp+zys/HRE1orJaR0xkSDiAjJzKdko+Ws0Q3 +HQ4LCRIvtqWZlpKVp1g1KzJDYLKfnJ+oxkVZrzAUDQsdNX95n5GPkqbeX0sfGRQeM8O7q6Kc +n67My7/iyLiqqS0ZFRcoLEPSlpOSm6jsPR0PDQwVIDnIoJuWl5yns345NT3rva+rp6/HOCMl +YzccGBMmRUlLrpmUlKKsq647IhocIyUoP7ignJ6dnqW6TTA3TWk4FxoZICwmSLeanJyloqi5 +LiIdHB0bHic9v6ugmJWVmZ2nsdg8LCkpKSsrLi4xS+VJODcvXVlJYMezs7a4r66ts7bAzvlK +ODk6O0VR5svJw7y4ub/S3+tuVUQ8NjY1NDQ0OUBV28bBuLO2vcLM2u9tYk9WYF524d56XmVY +U1xletvV2NHK0d1sWGFUSkdAOjo+PUv40szCu7eysbK2vsfebWRaS0BBRktOWVdf+3t45e1Y +SEA8ODg5Oz08P0NKYNfKv768ubaurrO0uLy8v8xhSUM+P0RLUk9PXE9XYE1OTUpLUmx8ZWh0 +U01UTkhLWerOv7e2tLO0tbS1vMnZeVVGREA8PDw+QE9t9eZvYlFPTUVBQEJBREhERUtYVWnf +1MrBvb27t7W3u73DztDOz9jU3/n/dFpJSkdDRUlOSEdHR0JBSEJBQ0pUXuv3ZHne2sW6tLK0 +s7a4ur/YVk4/Ozw/QUFJTVJaX25SRENDP0hZWGNzc+XZz8zLz9Hc1M7GxsbCxsbAvcbS+FtY +Tk9YTEtLUVhu8nNmVk9OV1xfXmd56vJ2Xk5MTExe6tDLyLy7ure3u8LaXkpESkY/PT9ES2Jf +XltaTUtOSENBRlVr7tra2dnV1dbKy83JxL68uLm9xcvP5m1fYFlMTlNUZWFWT0ZHQ0FDP0BL +U2zw6Op0X1hST05RTlFl2cm/ura2v8S/2M/3emNsaGrj2fpmamFqb2BITEtPYm5aXVpk9m74 +VVJNSm3YysbFvbzCvr/Axd5wTUhaYGj7919YTU1aSEE+QEZy3Gb/9HDhX01JSkhBRFDXzczL +vLe+xMPHz+NfX+fqyGBXz+7N3eXlXlVURE5s3Tw8PkRrQTpO9Fte5cOtrbe6uLXAV0RNOjAv +NENXS1bNtrS7uLW/3UxIRTYtLT/65DUvSExYLTJeur/FqZ+ZnaWoqLY7JB8iHhkbLeS5rZ+X +lpyjrbNkKB4dHx0bHSY2U72uyL69U8k8VrympJ6ampihtuA7IhcREhgdJES5oJmYl5ecqcw3 +KiAbGhoaI7yuJCknKcAlMrSUlJeUl4+aZy0nHBUPEidUdq+dk4+Smp2lbyIaGhsaGiU9VVA+ +PEE2KCQmK7ufLj60z5mmqKKOk6WasarDIxYcGxccGy+6uLyonqClueBoQSwtM0LK4PjT9z0u +KyouJyS5lr0q4jyiofXdm4ymoarRri8ZFSMiHS0zuKCkr6ejyEcpHyg0Ly9zva+35UM/OCot +Lzg7XZyXU1pIOrw9PS+WlayctrVvPxwPIxseKzy9p5iipJ+qsdpBKzY/LThP1dbDWThKTDw+ +SERZ1X1r6FVQoJVSL0U2vdToJq6X17ZKMC82PhQZIB87UcrLoJifnqq1u7bWL1fc27zFfV3A +6D5JNyokLqusMDIjMbeqrzucmp2XukgjNy4XHRYdPr6vv6Wppp+6QS01MTVRNUS7rq+7zT48 +VUI8PUBK0shSv6KnxEkkIjy5t7elu62ep88qIRgaJx4eJzfWqJicnp6qsbrQNSouKztv2sG2 +tcHB0UtCNi0rLDnFurvOPUFMta2pqN3D0t/kQDYeHiAfLjpLUsuuqJ2bnaWzyz07Pjs8O0Jc +ysTCvtpqSDMuTrjBuNwtLzfFr52bsrhOPzs/QCsqHh0oOs22sLm+tru1rrLLRTUrLDg5PUxT +VezNw7a0uMS/sru60EE5LDQ/uaKgm6Otv0IxJiYgGhoaHidAuqqenZ6fpau3wW1BNiolIyMn +METet6+ura+3x/hFQE5SatdoTUdLfrqno5+hrso9LCEfISAkJigrM0zTsKWgn6Gkq7XNZ0w/ +PTw3Mjc4PU3mxb69vb/Fx8PGzvRDOThM5Mewrq6wtslOOy0oJiYnKi84PmTIubOwsLW4v8bN +195xTklJQkE/S2njzr/K1ftNWO7Dv7mzvMThXEI9OjY9Q0xXYe3m9HFj2MrDvbu+ytlhTEg/ +OTg7PEJb49jJx8HCx8zR397qV0k/RlH1yr62tbnB2GdJPjw9PTs/SVNZX1lYW3rm1cW9u7y8 +vcPNc1VDREZIVubOz8/V4Pl3X09Xb9DL1t5/X3PCv728xtJoTkI8PTs6Ozs/SFBVS0hBQkdO +4Me8t7Kxsba/y/JbU01KVVxcZ2poXV5OTVFc2sjOzOJZVG3Yy8HK0N5qZU5KR0VIRExbUEpD +QD08QU3yybivrq2utb/YVkA9PENNU1t3e/7vWlZVTUdGUG/byL7Ey9rubHDf6dnIysbV7PdZ +VU9PPjg4MjM3PUvpw7CrqaanrbW/5k5APDk2OT5IWWTkbVVYTUpd48fL39tTS09e39O3u8TO +U0M0Njg/UF1gRTcxMjdKxbWso6Gjp624zVVFQTk3MzIxNT9GZdPM0M/tfvvazcTPe/8+Oj9Y +2MCzubvVSz85QU9dTEM5KystNmi9sKuoqamusra930w9MSwqLTJCesi+v8TN3ci1sqy9PC8j +Iy7VrKSdqblwOjYyOjc1Jx4fHy3gq5+bm5+kqq2ur71OKx8dHyc2Ud3U419i38a+w2s5OlPc +rrFUPCcnL7OclpKcquExLSsrIx0UDhEaM7CblpSVmJianaSzOyQcGh0mMD1KTFjZyb7FXzsx +KywzOkhD4aymnZ6uwkzux6eirLQ5LCcpKB8eGRocI0O2pJ6dn52cnJ6kukkyKS45RExBOTg6 +OUpOPzQrJSRSq6ag7B8eI82djpGWnbSrrbD7KhEJCg0bN9i1qqWYjYuNl7UrHx0eIBwbHSZV +pZ6frFEvLCstLiYjJSxRppSSlJ8+MzfVr6eyU/hLsaiuTx8RDREVHiouRLadj4uNkp2vwspV +MygeHy1Mvbl6PDQuOUY3KyMiMK6cm55IISs8qZ2dwF9WcK2zXSAUDRIaIjAtL9Kfk42Nkpuj +qqy9RSkcHChCcfZRRVbQu7n5Qy8oNPqrprjyKCxGtKKlqcm+v7DANh0UEhIaHR8kL86il5GT +mJqdn6i/MSIfJCw2PkBE2LCoqK7NNzI7/6+6OCocJ2mnnp+nvq2zsc0tFxAPEx0fIyo2uJyV +k5WZnZ+mrs4zJyYoLTQwMj/fua+ur8NeaGPCsPItIx8yzaqkoqurqLG5Qh8UExEWGx0kNMei +mJaVmJ2gprr9NCgpLTE1Nj/Nta2opqmvtrm7tbFDJx4cK0m2raetqaKqszocEQ8OERMVHSvJ +oJeSkZOXmqG4TS0kIyQkKjFDx7auqaanqrK4wLar0zkmHylGtbOstK6kqbRFJRkZFhQUFBcf +O7ujnJaSk5Wbpr5WNSkjHyAnL0HOua6npaqsrrKpsjYpHyU31sfMrq2hoanNOiseHBgUERYZ +IC9PrZ2WkpKVl5ymvz8qIiAfISQtRMivpaGioKSipb86KigtMjQ567uurbe+zVc0JhwaGhka +Gx4pQbmpoJyYlpeboq7OQi0kHx8jJy9MwquloJ2en5+nusxSOzkzLS8zNT48P0xGPTs2Li0q +KCkqKzA5RFzTvLCtqqSjpaaorbO6x+pPP0E8PEdSbtrHx8bBxtDidFpQU09QTE9USj9CQjs6 +OTYxMjQzOTxCQU1q58W5sa+sqKako6WorLC3wd1ZTz43ODY1NjcyMjc2Njg8PT5KfM/Hv7y9 +v73DzN5bRTs8PDo7PUFDSFdl6dfQzcS5tK+urKyurbC3v9RlR0E/Pzw6OjY1OTo4OTw9QExt +2cnDwL+9vsTcXFFGQ0JGT1dcd2BbXVpOSk5SY868ubSurrCxtLjG31ZIQD9DQkJISUdIRUA7 +PD1ETF3o2czHxcXFx+pcXWFZW97Tz9DMy8zQ6lVGT1Zl6trNxr++ubq8y+R0UUlGSUlEQENF +QkI/Ozg0NjpEVenNx7u4uLm/yNf1++nn3s3OzcW/xcnO5VhRSUdLTFll4NDMzNnhbU9NTE1N +UF5rZfbjZ1ZNST8+QkRQaeTUysHFy9njdk9UV2lr48nGv7y9xsjV8GVTT1RPTm3o38/O3O9o +VUxJTkc/SFpn6NjV4uvd3mZdbe7u2cXDwMHH0/N7cF9WT05LZO/w1NfoX1FOTUxJTE5O/NrW +2eHmXltdWVNLTU1c7tPOzMbMy83U2/diXmFo3dDR1dzM0t3T3WhUWFlPU1xbZHrt+Xp2dmRY +W2Fo9/Xwd29fW1lVVU5TW1JYfdPNyszP0tfZ6GdmZlpSbdrz7tXP39nN53Hhe1Rh7WRvb2rv +2PP02k5JX0dKb/L91M/MxdDUzt7h8nBz5Gte81Zi4O3l51lg309L22pV795W9P1N7F9WVltY +X/VZZeJsZ97iafx7U2dv4M7e2srPydjF41FkP0tISWdO1tT3ur3Dw9tubexHSuc/SV9GaGnL +SkdmQ1xZ4fZywszNw8vHaW5WSuBNU89PdMrl2snNYFfaREf0RfJgZvDnuOnMy2nRRl1dZHVK +3l1t3endR2VOPl9v1OzMxMa517W++Nlj9EXXaUrq5M3kxfBc7klRV1FLUGxKX+TbZ25gPkhA +Pk5EU3tz7M/K2djtZWT6UP3K78rHy8LHxdTW0d5QZ2dbc3rX1NbW4dJLTV1CQU9iSd5oWtDV +7V/ePVLpOEzoWU7Iz9m9d23YRkJfW0jY6VnW9crF3+Bk3lzw5fbJVdrE/cDH93lPZkvx6lbd +WuHQ4s7seU5bWEbiREjI2tm7vcPIwlLYzDxUX0JGV9RZ3NpEeGRaW2VfVdZmWcjN/Wt8aE1K +Sk9NSGHT29/Iyd7P0Pj87GVr3OJb18zo0srQZmXlcmD+4eHr28/K01pX287YQzs9MzAwQdLQ +yLqzusnJ6Vk7Lzc5OT5HZOXQwbqys7W5urvgY7GcrxUZMScbG2Gsoq2qkpWqQE/vGw8RGyYj +N6uYlJeSkJekt8c+IhwdHhsbICQjQpifGSS3eB8qqJ6XoZuMkKtErc8VEBYdHR86r56mqZ2g +yzY/NCIfJCorLzI1sZK7FtvLJxxVo6iWq5qOn91KoS8QGx8tLk2vnputoJmrP0RWJyAlJikk +JCwvPanVGjo2HyFHtq6ZrJiPn7KwoyccKiY9RMyxnqO2n6f3PUk0JionKiwjQpi6DznUHhcp +wNqeR6KOpWm7mC8ZLSxEOOeympywm5yxfLnHPj0vNTMsJjar0hEl8BwXJcM0rc+1k6xf2p82 +G0A4Pz3Nt6GkvaGhwEu3ukxRRUo5LSyrnhgduisdIrVRrsFGlqRNOKHVFikvOjtav6mlxqmh +tky7tHvUz9tJNi6/qRkY0CUZIL7orq/Ul6JIPahfGSo2Pm7CrZ+fuaunyUvLwVjp/FU+SKrT +FyotGxomQlOmRaiWtD+9rx8hLy5M7LqkmqShmqrb5tJLUU5HPjbAqC0cTiQYHS07x8DYmqNH +1K83HiopLj9MtqOlqJ6juMG+y+l2TUI/sqYhIN4dGiJCYKy1vpetO8nAIxwoIzJC96yjqqee +q7/Nb2LnZ+vJvqa+HTswFRkfLkSptJyUssO1PhweHh0mLfepoJ2YmqOsvMvaX0dN7LWlPSPC +HhQbJC9AtbqYpsarxywgJBwhKz+xqKCamp6jq7jI3ks7WLy0Rx5MHhAdIz9NqKqYoLyqXycf +HxsfK0C1qp6bm5+kr8Ta/1c/2K62UyI/Hw4ZGy0zqKGYmKmfuzgnJBoZIShYtqGamZqcoa+4 +00YyOs7LeyItKwwYHCYusqagma2frlU3LB8dKCs+y66hnZycnaSorr7sTV7OUjQeKxkOHRws +O6innZqtq9E5KSUeHiktarennpqanJ6jpq6zwOTHzVU1HSoTDhkYKDukq5iepqfXQikgGh4f +Jk3BqqCbmpqcn6auudtc4FlPNBktFhMfHCw0qbydn6ikvuc+NyYnKCc4V7qqoJ2cnZ6gqK6/ +UD88MjgdGiUOHB4oM8S0uaC5qrjS4005MzswQnrNtaumop+gn6WnrLvQWEo5Px4WJw4ZICU7 +2Ke1m6ikrMvWQTUvNC01PlbCtauopKOio6Sor7rdUkEvOR8ZIg4cHiY37LC2namhrLK7TUA8 +Ni80OErcvbCsqKSlpqWprb/uSzkxLygZKRkYKh5AO7y9q6SjoaqotcfWRTw6NzpCa9TCurOu +qqqtsbjMTDgwKywoHy8dICYiPju4wKuqp6emqa+zwtZJSUBBTF3mzMC6s7Kxtr/RVEg4MjIt +MS8oNCQoJys6PsS+rquko6Cip6myvuFXPjo2OkFLaOzOwL6+wsHM12FEPzo1NS0rKSUoJi0v +QGbMurOqp6Wnp6uutcTqUEk+QT0+Q0/nzL21s7O3uL/RVD85My8qKiUkJCYrLz9axrmtpaGf +oKGmq7C830g1LiwqKy45RvTLv7m5tba8xfZQPjYzLCgkIyQlLjlW2bqvqqCdnJudoKasuM5I +NiwmJCUoKzZF7r+zr7G2u8XqWz8yLisqKSsoKSorMj7fu6ynoZyamZqcn6e00z0sJB8eHiEl +Lj5wyr22s7W3usl1QTYsKSooKSwsLjI5TuO4rqijn52dnJ2eoqmxwlI2LSknJicoKy83P0VO +WvHp5XxoWlpJOjMvLzAzO0JKe9i+tK+rqqenpaanp6qttLvL9UM3MSwpJigmJyotMjxHU2ff +zL/Ey8/sT0xYYczAxsO4vMW8vLm7trCvsrCuub7M3E5APDQvLSwtLS8zODs8P0VKXG1g2VnM +0dC6177Rydde2GLP3v3NwsvGwb69xb2+u8fFwObS62lrR0s8NTktMS4uOS5BRl3K3sPNyM3O +y9nPxt3FscC8zbW6R/JI3jo+Xk/NPsvE+d3hxE9qS0dNPk1NUTxOSD1SRGd3WsfD2721vbvC +wt1eWEZoN098ZPrrq7dV2bDmTd/ouuhWx6nDW6++XzovNC8kJCwoJDI9T9PLsq2xsKm0wL3r +5VlDQkw7N0VMUOWnqCy+rEfCSLnBrTtVm2bLx7jnOT8qSCcbJSclKEvitq2onZ2iqavKWDIo +LCQfIi0tNVXLn5c/35xlyji7xKrCL5Wu1m/PcSIoGisqFx43dEi1qZ+cp6ahqOdnSTguIikw +LSc2Sj9NtJWqLKm7rncwzq6fHrOdt7FLuVH9Hxs5JB4fPd64urmdn6u5r8s/LCYrJyYjMz9a +zsmwsKqamzxZzjdJKjr+nsTonK2t5kMuLygTGyUkLEO9qJyjpaCovk0+NjgtLDhITEvWwru3 +v87I2dufljotxzBnLCo8n74mpri+4TQrMj4YGikmMD50r5yjrqKmtc5NOmZELDRDTFZ8zrOv +tLO2w93AoJ8mLlA9yiw52prANqbdu0cpKDY0GCEqKzk3YK2hra6nqazOTG7XPS8xN0A2Nk+/ +usPHzczQq5xBJ+Ipzjsvy6CeN6Crt7IqKicwGRkuKUM9V6+foqufpqm4W2RoPi0vLzg4LzzX +zeDDv7vL7auaZSa+K8EtINW2uSqjvq+tIUM2KR8fKCc2KkKpq6Ohnpqeqq6txEg3LDExJyo0 +R11f07231eCrodlCuTC49B2+ykXgX1K7vTHa3DZNNixGNig5OkrAz76qqq2oqq+ywNxvU0A7 +Ozg5Ozo+SkZESkpb7dDHyL28vrzBy9BiTUY5O0RCR1BTWFxUTEhFRUtPXuHOwbq3sK6trbGx +tru6u8LSXkxBMzEtKCcnKCksMzlEcdLIvLu4trKur6+ws7jF3F9EOTYzLisrLC02Qm/Hu7Ou +q6qrq6mrsLS6xM78T0Q+PToyLi0uKyYxTXrPv73Fx8C+s6+1v8PRXEpAPzkxLiwsLzM4RFjT +vLWuqqmoqq62w+lQQDs4Nzc4PU7u9e3TztLN1c2+vL28uba4vsXiUkI0LCgkIB8fIycrN0zM +tKuloJ2bnJydoaq52z4uJyIgHh8jKy4yRlNj9um9sa2pqaWioqOmrLrhPC0mHxwZGBscHyk4 +d76vqKGdnJ6en6Onr7nMTz0yLSooJyozOkFq1MXEwbmzr62urKusrbK92UYuJh8aGBYWGBof +KUDHrqSempmZmpygqbHA8ko8NC8sLC01NzQ7QU1g3b2vrKqpqKaprLTF6kIyKiUfHBoaGx0i +KDRUv6ylnpybnJ2gp6686kM6Mi4sLDI6Pj1BPkJNTOS/tK2sqaWlp6q1zWA6KyEdHRwdHyEo +Lz5uxLGqpqKhoaGkp6uyvupJPDQuLzdBQz1HSk1SbtS/s7Cxsayqq6y4yHw7LiUdHBsaGx0i +LT36va2moZ6eoKSqsbrD4FdKQj0/SUY5OTk4O0NYyretqKakpaaqtc9LNS0oIh8fHiAjKC86 +Td7Gu7GrpaOqr7G8zuRLNzz+cvE2IiQsOTVJvKqbl5ucm56ir0cqIx8cGRgaIi04RWe/r6ur +srSxtr3cUUE+PzQuNL2fomEgFxsuNvyxnI6Li5GZo6/hHxQQERkdHyQv2a+tvtHt+NVfPjVF +yL3FTzs2Nj/Gqrw3GxIbKMikmpGOi42Qn8s6IyEdGxwiL1LAxsTQ4/xFNy4vNklv2NLw6GhJ +PN+suT0aDxMdvZ2UlJWVlpepVyEdHiYuMzs+2r6wrrPNUk9qzMrXUkdDREQ7Lyguxa68LBAO +EDSgkI6VmJ6bnqNdJhoaJ0m5uMhESdC1r7Z1OzxSw7TESTAoLDA8VL5gLBoRFRpVrpuZmJyh +o6evz0UtMDR+wLK6xlZZZMy9xcToe+/c33Q7MCckMsCuvisUDw8ouZeSlqC7ycGxs8Q6LCg5 +xqylrMpCOW7LtbO+/UM8QkdEOi0qNOnSXigcFxs5r5iYma7RQ0/8wszpRUBfxaqqqrnVYXDP +t7S0wXRENTAqMlXOWy0XDw4bbJ2Pj5WtUi86XsTF6jg1P8+tpqWvzEU/UM63r7e98zwvLC01 +V0s2HhUQFS2vlZKTpNMtJys/3MPXU1natqykpKm40mp+3sC9wd9bS1TKXjgcFBEWLLuZlZam +zywmJjA+T1FPUGq8tamqqq+2wczLytXH0OBMOTxO6lw0HxcSGymum5WaqeUsKTPvvba/0kdW +WMy8r6mnp6u00FNGYr2+PR8PDQ8pqo+Nj6QuGBQbLOK7vFtOQ8m4qqmtuc3awbOqpKSpuXAy +KSYvNDgoHBYUHz2il5OeyCUaGyjeraaqtNvg2LStpqiuucjjzbSlp8shDQkLH6+Pi42fLBUP +FyjhvMg6LSlKvqeiprDBy8Gvq6iprsVTQFhs10IpHRYaJcGfmp69LRwaJFK4qa67Rj1Zwa2p +p6uzu7urnp6vJw8LCx+0kIuOnywWEBkq07jEMSsrbq2hnqez0vjNu7CutL1rXt7H0jogFxEZ +J7iemqNRJRodK92xrr7dRHC7qqGjprG7tqebm6ssDwsMJKmPi4+rHREPGi3QxU4kICdTraCf +q7560riqp6myw1XbvbfPKhsSFR5qoJyf1CkcHi3Rs6/LSTxNtKagpay2tqqcl52/GgwLFc6W +i46cMBQPFidW3zslHCIwuaejrMXTxa+kn6KqvNC+rKy8LBsTGi21nZ+xKBsXIUG5tsg2LDF/ +raimsby7p5mUnM0XCwwaqI6HjaIjERAbNsXKLh4ZIju0qau66862pp+gqrpp2biwtjkeFxgv +vJyerisVEhkvwK+7UjJB362mqrTOxa2bkI+fMw4KDiyZi4mX2RcQFillyjggGhwybrK4zEpj +tqKbm6Cxy9qzr69MHRUTKbealqBGFxEVJ3WuuuI1PNKuoqSswdG/ppiQlsAbCwwWv5GKjacn +Dw8YLmLVMSMeJkzEs9ZKO2Gtnpqaoa+/ya2nrWccExAev56UnsAfFhckPsbPPzAwf7imqKy4 +xLywo5qWne4aDA4ZtZGKjaMuEhAVJTpQLigkL/u8r8ZqQfSzpZ6epK26tqWiqj4XEA4ex5yW +n8IgGx0qQtVBLikx3K+hpKezvritp5+cmZvBJg4LDieikYyVrCQYFRwlLSohJTDKrqWrvG1X +1bWrqaqyuaqcnacqEgoLHFaZlpiuOionLzc7KSMhMs6pnZ2eqa+6urzAwbGjnqZQGg4MFTun +mpyl/jYuMzovIRoZHzq2oZ6fp7G2uba6wb+rnZqfxyIUEBksxq633D9L5LezxzAcFhggQLWn +oJ6dnp+iq7nZ17mqs1shFBMbPbemtF0yNGKypKfCKxwaIDL7u7aurqiinp+krbu0q6WvPh0R +EBcrTsZCKiMoS7Gfoa5XKiMqQtW4uru/u6+npKamra+rray/NSQdIS7fzWApHRkfNcGpq7b2 +P0Tsu7O0zU05QFvLubKusa2lnqG+PicnLmG+wzofGhghNdG9y0gvLTNRxLW1wNxq17utqqan +qKWem5yqzzUuMT/cTy0ZEg8WIT29ucdPQEjMrKWkrbvZ4Mu0rKimqKytpJ6hvjYhHiAtPDkq +GREQFyE30b/HW1zDrJ+cnKOvxNPMurGrqq2tsKyloLA3IhocIjQ5NCEYFRkmQrmqqK7Fw8Gt +qaertsZp/Ny5rqytsbbCxbmpqNEmExATHjI9PicgHCdDtqKenqq2v8C4u7nM3k9a3buqo5+j +pay6y9O5sWciDwkKDiNUqaqvwOa8saajp7g+MSs0Scy8sa2sqKejpKauus1dQzQ8Tdw9JREJ +CQseeJmTkZakrdnNZEoyIhwaIjS6o5uYl5ufo6yxxM5mUV1GRD9fxs89HgwIBQwer4+LiY+Y +qtFUMiweGRYWHzeznZeVmaCsv8tsWVtR71FWQU/MuLZdHQwHBQ8omYqFh4+dZzQmJSYcGxgd +LcqdlJCSnKvrOzU5VOzOzmBYPj04UbbC/hsLBwcUOJOIg4eRojsrIiAhHRsaHjS2m5SRlqfS +LSgtPsW6tb3Zbjg3LywuMFFCNh8QDw8prY6HhYmVqDknJCIkHh0dIDi9n5iXnK9oLyotQci8 +ucBfRzIvLS0wLTRFaU8sGBUTLK+PiIaIlKM9KCAdHxsYGhsyxpyTk5es+iYgIyhLxrKttrV1 +QS4nKSMpKjzlZOQmJR4tspqLi4mRnrwyLiQoIRkaFyQ9rpuanK5pKiEnMF26t6++zkgvKSAm +Ji02RLmyrL8mJRclbJ2LioaOl61BLx8bFQ0NDRk3rZaUlJ21ajY4TU7MeMbPx7pYRyolIiQt +M0rEuLXHLywfQ66YjI2Mm6d5LS0eHRQNDg8eRKeamZyirKu1r7pOQiw6O09hNy0mKzVWvrm1 +rK2uvDAqHSvHoo+PjZikvzYuIhoUDQwPGjyunZmdnKGfoKmvSDUrKC0vLislJio918G3uq2p +q6xPLR8gQLeYlpSbpKmzt+UxGg8LDRMeN/G4rqGYk4+Sm6tWLiUfHRgVFxspS7qrq66qn52d +qjEgGCLaoJKVmKOmqaixVB8PDAwRGSEkJCpJrJmSj5Oan6asuUciFhEUGiUxQEz8taCYlZee +xlBdza6srMroTMm1s71IKB4dHB4fHh0eJj3DrKamp6ainpyco78yIiAoMTgwJB8kNcmspKKj +paCenqbBPjZR1M1VLyUkLk/P1z0qIyMoLS4qJyk0/7Wqqqutraahn6Orsri4uL3QSTUuLS4y +MC8uLTJHx7ayuMPKxb64vdVVU+XP2E05LiwtLSonJCgxRtG+vbiuqqakpqqvr7O4vsx7VkxT +W09MSEI6PUFBP0ZQVmzhy7+9v8vc6+59Vkc/Ozw/QT0/Pjw9R1h/0MjAwLy3trS1s7i+wsfa +bVdOTVBXVVRUTUZDQ0VGSExJX/Tvz8jK0+ppV05HPzo5OztETnjSy7+8t7Oytbm6vr2/w8TW +7F9TS0NAOjg6PEBPU19za+p9/35yWVleYmX94e12XE5PTU1LQT8/QkpX6Mq/t7Kvrq6wtbq+ +xtLZ4+txWU9SRjw8Ojc2NTU5QlF83cu/vr++vcPR2uBrUF5bWFtWd2BXWE1NUl5k7c/FwsW9 +v8bJ3OpnYF5YV1VfWFZaV0xLS0dIRUdOUVNp69zLyc/W33JcWl1t7dXIwbu4u7/N3V9MTElK +TU5Za+jY3fRvYVZSTUxMTlp4f+HPz+dxVk1KPkJBSE9c7dHBwMnN0c7WdPr17d3OzMvExM/j ++HZ+XWreeXzh3eD0819aTklKQklNUmju1MjBw8vN225hUUxLS1Js9tbM1PpYUU1IR05YX/vU +z8rGxtPv7WNTTE1OT19v+enWztHa3+rvYX3mbunXztLS1NtvVllPS1VdadzLyL/BytHxWU9F +Pz0+Q01fdex7eGVdV1ptan7y3M7LxsLK3fNoUU9JRU9Ua8/Ky8jH0eD5cFxOXFlW69jX1tfa +bltSWFtUWl5u39zg1NTZ7O54ZV1aX2fr1c7EvsLEyMzQ/VdcTEhpTztqu+9T3ks3Nz2+PzJN +XdfMx3XJzkxjd1Bt/1nZyttgw7VebeBZfs5HOMbk+ri9aVHe8T85Qj1FR1rRxMPQtbrcwsvk +dd/Y6UpIV09XXEZMS0RPYmR5y8G/yMXL62dfTEhKRD5IWl1f+9ne9N7S5NvedmbW5evF0dXf +XldSWF32c37JyMbZ59Xw73lqVdxcU9Xv7dPe5dPP18zO4tdmX+tf19/3bltNQ0A5Ojs7Slpw +89PZ+t7d4vbu3tpv7rnPbM9pVlRRT1FmXfrJycbBw8jVzdDY3PxZZmlaaVZiV1dhWnZYWEhN +WFNl8fLc7V5kT1VZU1Rl9WvPxczDzMzN6mzxSUdQTllca1ZoX1peYOp48tDZzcTLys3I4NrG +WTU5Oi82Z9vAsrO3r7jBx0w+OjIsMDs+Z83FubW0s6+xubrL6WdEPTo2Mjk4Qa25JDBFIB4/ +W9inpqKfprOuuDgpKR8eKDBIvq2qpqatsbvU3G9HP0E3LjEvMzR+nJwdH7onGTmnrZ6empSb +vsG0IxceJR4lQuW8tLGutWZG3fdG78VLMjI1MDM6PTk2Ni44m440GbizLDidmJObpJaU1Rsy +LBMPHjE6UWC7rdI94Mo2NMy4v83gY085NVXaQjlJQC5OkpEeJbHGMHybmI+nup2nGA0dGxYc +ObyouH+xqjYiPttBR8m8x0kvN09BPmDJVzxAT9G8mIy4Ma+xt2qrqpekJUfaKQ8bJitSTd6x +qDUjNjYsOWnNrrLg/NQ8Mj0/SmhMO1bHvLStmYufHCUnODNHy52NtWPFVyEaIiHnxnLRsdgq +Li49xrvVv75GLi4uO87FvbCvucjL1Gaejb8bJB1Cwri/kY9OQSYeHysjMqq1urHYNUAwLte7 +52hBKCkyOOCvqa2+Vjc3NjZIpZK6IicfuKiorpeWak4eHCvr38Kls7rWKB4oMTbUv87Ibjw9 +X9C7tb7PUDQvLjFXyudSno22JBgPTKqmq5idsaglGyxLz7XKKzQ7JiUoN6ydo67AUU1MOUPL +v8ZMMDI/SXN9tJS2HBkNLaOWl5WXsKIzGSQvfbS7LTM7LDk4S6udoKxMIyYwOFvLxbrfOS8u +MD9PPjxFSdyakdo5HRylnJiipjQ8UhkcIjWvnq5sSTI+STd6raagqFEvMz16zVxDOCwuLyw8 +w66TlDsrEhm4oJqdnzjRTB8kIzS0pLxnMCI4TGK1q6iirEotJSc7SEtrRkJjWEdj8dC6v7eb +oTYuDxfEm46Plzo3Jh0iHCPvpKCeuygoKju9tLOvuctULSk1Vb6ssL5bLywrLjranpm9MxES +MK6Uk5hTODQsRSomLcmrnqNGJBweOMe3rq+6ub/eXUJG0L67t+g8OjQ5TXmumKZZJg0WMKeR +jZW5xDQ+OyIdIS7KpK/fLBseMeq0sb64vb7EUjc+WdG0tX45LCoydqKfw0EYFjCvko6PqM07 +LE4sIh4jMrahprwrHSAv2q6vs6+wra6+RjYyQNHK9jcnJSznnp6yPBEWK6qOjJK8TiYsPisk +GholvaKeqjEgJDTFqaars7iws8Y+LCcvSlxdOywoPKeXnasdDhkymIuJlbkvHTI0LB8VFiiu +m5aiRyUhLcqttrvfzbzDXzQlICs4W20/MjytmZqhMhAVH6mPio6qQB0oMi8rGhghxJ2TlbAw +HyA4yb7B1NK7tLxSLSMmL0TMzU9Jt52anbsXFBtNlYyMns4hIDIxMh4XGz+ml5WnNx8cJ0Zp +c0hB2rm1xkMpKDRPzcxYOUqqmpuiJw4UH6WOi5KuQiI72FMzGxcitJmSmMMlGx0rS09DQvqw +parNNSYrP1zTWS4pVZ6Ynb4RDBMsmYyMnsk9N6+9OB4VGDOgl5arJhsfLvLFUUvYsqGfr0ws +JzjTyt08Jiq0mp6uHQoOH6eMipKsvk29qzIbEhImqJWWoDccIy9L3T4vT6+gnqtJLC4/zOI1 +JBsd7ZujxyENGNCWioqZbtBgy7YhEhIcbZmRpF4nHzfaUUI3Pqybm6DGKSQtMzoxIx8gLKmW +p2keDyWulo+Ro9uqwcdRGRMcNb2grzQwLjbsXDdVvaibna5eLiUvPTY2MS0uNsecn3YqERjn +nI+PkqWgn8BVGA4QIEO/rkxA1cnHzUM9vKuio7RQPC8sNTQ+TkEqIjSookkgDhm7louNkaWf +pDwlDgsQKu2/r7upo61wMCk+saqts7vExGQ6MjBBSi8gJcWsQisVGLmaj5KUoJ6dORwODhkz +Q1yzq56dtTMwNF29yL+xqaiyOystMjcuIR7hpzIcFRa0m5Wak5aXlzMYExkcKy0vtp+aoLNJ +1b/+T0vcr6Sx0kw3MS0jISguxq8eFBogtKOdnI2OlptIKyklFRskMraqtLquuLvcP0XS9NfH +y8b8NScqLTE0PbS/GxsbKsSro5uMkpahvzYvHRIcHyxSuLqnoqqwtMnr803vwr/XdTs5NzEu +McupIxMcHC8yfrSPj5iZm6tQJBQbGxcaOc6soaCemqO3xcHI50xLZE08PEU+Oty3Ih0nIigq +OsyZnJ6XlaS26S4rHxUVHyEq46yhm5ycm5+tue45LiwsLCkpTLUvJmU9Li1BWrDFy6GeuLCr +veVALiwsHyAvNTjQs6mioJ6dpa+9eTosIx8fICwxLD17SVO8u7qutbSttr6urr7Cz05OSDs7 +Ozc/SU/Pu7Wur7O0vmdDNSspJSQpLi8yPVnfzr+8vri2t7KvsbCytri7wM5dOzUxLjE9Qkpt +z727tbO4v9RlUk1BNjUzNDc5OUNFSv/Xyry4trGurq2trrK8zmpBPD00LzA1O0NPX/Dna2Zc +ZnpaXPf9bVZbVERFPz5IXHjWysS+vru4uru6vcK9wNT2XFJMSEhIRkZGRUlLTFZaWu7o69TU +alZLPj5CQ0hPcHXRw8jKyMbOyMK/xsnJ3NrS2+F2XVVOTE5PS0hFS09RZ2BdXlNOYnlw+Gp8 +3c3FwsvT3F772ujrYv/w1s3X3n/+c37Rv76+wcPBxsjQ805FPjw9Ojs6ODg8RU9kZ+3b3MXD +y87S19bMztDeZllZTVFgXVxnddzNw8XW2N3u6P1xcFRWVk9ce19cYVRQ6drPy9jUzsvQ22NU +VUtNVl126n725N3Z1dr4a27x2u5yVUlIRUhKR0RGSl3s3s/Ozs7PysbM4fNlV1xmYmN0bGXp +3tja3+/27+jNyMHG1djX8mlPR0BBSE902srHyMrIys/nVlZNTVhRUVRNSk1LTVJTYmVw19PG +yM3Mz9/d52VcSklOT1Nf/+Doz8zLzNPb/WR+437i297Y931dS0dEQklW9dLMycDDxMrN8WFf +UU9PWV9VVmtWWVVdXlpvc+zkzM3U0trfe2hMQ0E+Q0pVb+HOwr+/v8fM4nJXUGTwemvo339p +VklIR1Ficc7Ix8W+y9zeVExDPT9IVt7WzcDBv73Eytbf5Ojo3ONka911Wk5CPDs5PEpRXnnn +0dHS0eJvVUxBRUxWcmvmzs3N0uDxa2vm29nKwsC9vsfP71RFPz4+SFTo0se/wMDJz/xkTkpJ +Q0VKV2B3e2NUS0pNTlZn99bKy8O/w8rmXktFPkBARlX708W/w8jJ1NXvWmRWWezb08rM1+la +S0pMSUxb886/vr3CzXxUSz48PUNGT+7Rx8PFxcnOzc/R0t565dDi6djoXEpAPT8/P0hQ+8zG +x8vN71pQTUlGOT58SdDMw8tz/UpkZnru3drQvrq4urzA2XBaTUI+P0VMXOLZ1tdpXFtbSVNQ +SlRi0tW7Z2ttTFU+WElQUdjLwb7Q19Xd6M3K6ExDRFNi48rR4evm/XpbXmRib87EyMl+an5E +Pj5ERkJP5c7Gxrq+wdvr3f9LQEFBSUrWzeHzy87UzNfM29zPxMvS2dzW3lZNR0Q+PU9cVVDn +3mZl/Nrta2N8WE5QVllWS131cF1Td+Jw88u9ube1usHT/L22fjw6OTIvMEXa8HW9r7O+0M9l +Ni40OTk3QtO+xcW3tbm7v8PVTzssQqS2Kzg7PDQoMauxOfW2vNBETLpcKjTTu7zLrp6jr6yo +sd08OkIvIyopLbDDIjItJywlLa+kv6ifoabGScVUKS85csTcsp+hp6yvrMMtKisiHx01pUkg +OzJUMSc8psI+s6+pulV1uT0qN0/HaUmxoKSmqKmu1T1WXzUmRZ1THSweOR4VIq6vS6iqna5O +bK9OKy0+s8ptraGtue/CuUovQj0u+qM9LUccWyYqUaq006zOrUQxM0IpJzX1qK2pnZ6qsb6w +uDwqLi8uLzBHv52wLd4jLSUaLsmsyp2emqdRVk4qHCIqwr6+pp2jq7zM1DwyNji5ny8vOx8t +GBwyslu/o6Sf0Ffc5yUlK1G71rekpbxaR9TC8V2+vsw7NJ6XJjwrLUUYIdKiOrvAqbEsKOdO +KjdRoqG2r6Cx+S0vPComPWzjoaNEsywhMRklWK7Pn6Ofpj84OCkeJi3Oubuon625zsu35T5K +R66dKjNKLjggKc6hRMCvrr80M+tVJDFlsrPOwaSueFfUzHA5a7nNSUOlnS8lKCUoFyO1oNmu +p6PEJiY6Lx8ryKGlrKKcr0o6SUYsJjVhpKUywFk3LyQxu6ntqaamv0I3SS8fK0bBv9a8q8JM +VfhMPjfcu89dW6iaMB82IikZIdmkvq2cnq02MkI7IjPNqq28t6q5QDpCRTk5WMi9op/W2jYl +Kx8mSLLCqqeqtD4tMiodJzXGtbOmnai92FdSPTBG3qKaPbi/LS0eKD++MaufpLJbSD0lGyk1 +VejEsKq/y8LQPzQ2PT1WpKHHvW1JNyIp6cs3v7SvvPrfwT0mOV3XxbmpoLXvz2g9Nzdey/n/ +6Vyony9DPB8jHSjaq92mn6vSNjQ0JR40S97Cr6iovMfAXz5CU85YPaSYNjtYKy4cKN6uSqmc +obF9ZEclHDdOXc+wqajHzrhvMzE4Ojk7t5qo8qzNRicmN0cuNrC5xNTAyUIpOFg/ScSvr8HH +vOpFQ1BFP0j/3lGznFw93iYpHitOsdywnKeyzc1LMyEuOjNPtKuprbWx0jw/TT0/Q01Lu6rr +z9c2MisuPvJHu6u2z9xoQzUuPj07WLy4uLiyt+xKRz89RVRSbZukLqpLLCoiLDs+MqCmqquo +tM85MzsnLTlERNzDr7TCwMdBOlJGOUajozeztUhIL1NRRi61vFXStrxLPUN4P1LGyOvBvLjJ +1MXjPTg2Ly9Lr3VAr/g9Nj5FRjtbtOjVurTP5/VpPzZEUkRuwMrExbq3wcrAzHJhQUGsvS+6 +Ty40OUZcU12uyNLFyGheSkQ9OlrkZNHDyMna0uJRTVtANi8ypK4iocE2WT9TPm48rGLPurnJ +u73YzjtVRTc891TPxsfCxsbQZkE9z7cmTbYuSkjgTMzMsLhqus5RP1NBST/q3E7Ntr6+tLzL +31VJPTY+PDMsVqk0O6Q6RU1hQltsvrfotb3H279aXEFFPzM8XWHuuLm7uLK1wdvkPS61xxi4 +OyFSL18+xEit3sO42eDUzFfNW8fc8cO95MPL3nNTT0hCS0xLTDvJpzBHoyxJPUQ2YHjWwE21 +z8rbxEFLRT1BOkjNzdSwubWytbq7ydZaNzLFvhu/xSDQTsVmscaxvty4S05NWTZPP1FTS+Db +X9C/Zez49W5eVl1FREREuswsr10sVkVTRcdbtcy4uL/Fy8ti50hLSFjf0u27trqytL7J4FI/ +Lyg2uhsisRtAU9hkt7K4rXer6Nl66zVJSD5aQd7Q0sW3wra0uLzCzd5aT2c+NUmuOB6oLidC +OT43v1Kq9ayvvLq83E7iNU01PVtRWbu8xLS1usXJ1V09Rkk8OlQ+RKtLKqcxMuRDSVHPTbNd +sbnNycpGPEEvQjg9Vnp4ta+up66zuc5JRTUuKT+rHyakH0zezWbKsVumUqi8yc/LSzjxNX05 +WNtUT7u8z7rN1mxPUlg/Sk46MUy3JS6qITI/SkzGsq2ovaG2vb+8Vkc6OT0uStrrza2ws7K5 +wc7uSTcuLS0tMz01Ua+9M62+M8ZK1Ux35q+6uqi6tsrfUko7Tjs3VFF7vbG2r7bB3UtEPS8r +K1ZZF0X1HUpCvNSur5+qtqXQ6j1ELzcuPkg33r25sKaqqa64wO5VUj82NTEyLy0pO7IqIbEj +MlRZsbuuq524pK25w1RCNi0tUC9F4M66rKursr7DTDYvLy0sLS82vfoxtHMuUTvn+d+7pa2u +p7u25l1IPCk3Ni1EfLuwqaakqaqvv+o/OC8nICImPkok0WYu5Eu4u720orC2r724Z2pwQi0/ +ODA5ReTZybSrrq6ut9JKQDcrKCYiJk44IW45O0s8r7Cvp5yfnqeoq2RGPzYtLyw5OEvHvbOu +ra61xttQPDQvKyglKD47JjU9LjYs7MDWt6WkpKqqo7bP3l03Lio0QkjItK2opqOjq7fRRy0m +JCQlJig0PjE5TVpcP1nQ1P26q6amqKalrL7O30wyLC0xMj3fvrm1sK2xu8TjUTsvLCssLDk/ +NjU8RTw7SnXMx7y3rqqrqKartr/MXDsxLSwrLTI+WeDJu7e0s7W3v8vgT0U7Nzg8Njc6NTc8 +RVX00cG5sq+tqKepqq+5xWs7LysqKSgtLjhE/cbAvLu5vc3cZ0w/Ojo3NDk7NjpDYsu8s66r +qqyrqquutbnC7Ec3LyspKy0uMztM0723r66yusxzRjg4ODEtLS4yOEThxry5r6qpqKamrbO9 +x9ZUQTozLiwtMjhDX+DPy8i+vcDH3kk2Ly4tKi0tKi03U8G1rKajo6Sjo6arsLjQVkM8Ni8u +LS0vNj9O28fCv7y9xtFaPjcvKykrKy0uMjZD3r6wq6ejoaOlpamutb3WRTcyLSwsLzY7PUFb +4ca9ur3K0+pyVT89OzcwLS8wNDlIYNC8s6unpqOio6eqrbXE5kk4MCsqKistNz9BUW7u5ePl +6+x5W01EPjw7OTU3PUNIX9nHurOuq6qqqKmtsbK2welPPDQwLi4vMTU5PD1DT+7Qy83WzM/X +zczO1X5MPz0/QEdZX2vZx8C8trSytLm5vL/J6VRIRDw6ODg5NjUzMDI6P0RV+dfIwL28uLW2 +ub/L09ja8+zc29LXz83Ixcvdb1pWT1piXWhy9251fPFkTEY+Pz49PjxASlT10MzAv8DKz87M +yNLb3NzydGZjb2ZkZV1VUFNi/OPV0s3N0NnX09tqW05MTURERklMTk9UZubo3NXa3dXQ2dvT +zMjMy8/R0Nr1Y01IT01JTllic+Ha2NbW4mZQUVFOTEpKTlBcZFxo8O7s3urk2eDZ19vQ1dDP +1c/L0HlmYVlZV11p7+bey9Hfz9TY6fnrd2Zna11dU09WWl9mZF9iavvq6HXhzNTZ0tHP2eLc +/WtoVUxFQkJCQ0lWYvbRysjIysbO43Bq/mJaW11SVFtdT0laYV116OLPzMjDwsLDw8vS3+zd +fFpYUE5IR0hJTE9VVV503dfv3tzh7/x6bFhYWVZVVFxpVFNYX3xm3dTaz8bDxMTHyM3X4H1t +T09ZS0hLUFFYX+LX0crNzt1r6G9WfN3Z4d7m3Or3Zk9KRU1OUvzWzMbDxMjHxM7edU9KVkpK +VE1IUFc/TGP37jBERvnG1rtsuL3G4V+4XsxXU0A8TkBrXc/LwsDEvcDK0cfZ5HZlVEJLTlBI +Qk5BRj1AST5QU/vp0sO7v7/DvsLX6FZPQUpHSkpffX3a6s7M2dnPz+7N68zO1cnOzOPH4GpL +Pjw1Njg9PUBY48rBwr/CyszmUldEQktX7cXOxLvnyGvn51beTc7Zwr/DtL25x9PxV0dDPzk+ +PE4/RmV6Y0R2VFtLQWpOSELS5dnQe7vLVV5fSERFQeF378K4ubm8vLLUz7/aS19oSvRATOxC +Wv5wSd9STNVF+OpYY87M1dPfv8ZXVe5FOjk4PTk8ROng0sXQwszK0sbXc+lk29zJytXU18h0 +RUVGTkBDVuPIxL+5trq9vsXfV0Y6Oj48NTg+S1t43ce+zsvMycXZ18/V0czZ6u9cemVIPz8+ +QEc+PlFw19XUzcm/wcjLwczr/33pYFFNSUVJTWT9WktBR0xOWujFvbavsLa6v8nXWko8NTc2 +NTpBT+HPzcnT2s3S1s/h6+JkYV9cUEpJSElVWk1HRUdW683BvLm3tLW5vMnb5F9RSD02NTk9 +Pj9HV2xs19LLwcLAwMXJy9J9VE1TcGNeS0FDTPjLv769v7y2tbW7y3ZMPTk2MzMzNz9Z49TU +231ZUE5MSEpLT3jY0MnJy8bAwcHPXEU+Ql7Sw7zAys7Mw7q8x+FIPDw8P0VBPj1AT+nRycnM +43fl29LS3V5NR0dV4sXAwc1aREBM+8i+w+NTSkxvzsPC1VtFPDo8QEZMSkZIWc68s7C0vvdH +PTs+S1peWktK88Gvq6qvwF07OlPTu7a7yVU/Pkhi1M3dUjkzNjxIaeBcRT0/Tde6srTC3Ec8 +Pj9TYlNNSlD6xrmxr7jG+ldZ5czGydt8SD5CTGPsellCNjI2PVfYyr68vb+9u8LM/Eo5MC8y +ND50y721sbCxtr7F1ntjXm/5amtaSU1MTExJRD45ODs8RWzTyMbCw8TIz9b7T0I7ODk/SFvP +vbWwr7O6v8PKyMPG0O9RSUM7P0ZSbmNVSEQ9QE/nwLa2uL3Hy975fE49NCspKi46T8Wwqaiq +tcbSfPHLv8HKakQ7NjpCYeTyaUU6NjZCYMe1s7S7yu9PR0tJRTswLCwuNV24qKCfpK/GZEpY +zrqytMRgOy4tMDtaaFc+My4tPOe1qaisuulCNzQ3Pj44LysqKzJYt6efn6Ktwt9S2bqvrbjX +QDEuNknZu7zORC4pKTRkuquqr8JOQDc3PkRCOS4qJyw81KyhnJ2msPZCQErJubOz00M7N0bl +yb3KQSsiJCs/vaynq7jRTDw9PD05LyolIys94LCjnp2frLtYPkdL1b65u8bS6m3t0/FsRC4p +Jiw4abWrqay73Ec2NjAtLCgnJyw7XMSvp6KfpK7APTo8XbWvrbLOWEJC69rmWjAnJCc50qyh +oKOuwfI+NjAoJyEdHyMvY72zrqekoKWvyjMsMFOsoZyeq79VPkRPPzIhHBsePbCemZqgsO1C +MiwqJB8eHiYvUb+9vLOsqqe4QSkeLW2mlZOYosFANzY5LiEcGB0twJ6Yl5qouus9MSomIyEp +NUF92eHjYVfQt6+rwS0oIz2nmpKWpMs1LTo9NSodGx41taWiqLvX+23qQy8qKDBXx7rGVzw5 +RmbetamurlssMC3ApJ+cpLbYQ0VcOCwmICxKw6yutbjDubXGXTQoKjJGY0k7Mi4/e9rgPV+t +p5+sLCEeNaabmJ/SO0xuv3YlHBkl1qykp7i7sq2t3S0fHShE/Xs+MTdL0L9YNDavnpqeLx4f +NZ+Xl6NXNUf0/DgZFh04rKWruNG9qqm1TSsqNkRtQzMwLzI3My8yPU7Zqp2en70wQEW5oqSq +sL3Cv00sIBwlMkbPxsizra+4aUA7O0ZOR1Bqan9IODYvMjRAoJmmrh8ePcmenaatpqupwCIb +GiA4TDtSyrOiqvczKjPM08vM4b+43D0lGh0nM1LU3rSuu7uknaeyMRw2yaeZnqKhqbhPHxYY +HCpDebapqa7LLiQlJCszTLKlpKW6SDsuJh8+mZ/LOhAfuramrrSmm6TWNx0qbkJOTXqtnKez +yThTRCoqLz2yq77hPi06NScnISQ5ZsytrLGvnpSf4iMaMMi/rqedmJy2LyMeHx4dKfysoai9 +ylc5MCYoN0vUzvHYy+xfTkVHNzmekLk/JBN7wy6+q6GZnnVATycsIxxVr6ueoa2muS8yKyxE +LzDY1mFYNjFTTTMvKjFbTuu+noyTvDwnT1QiKr+lpq1SY78zHhodNmpGy6ynpbpZyMRPNDBI +wuQ1NT1NWDUvdLzHeUqfjp86KiNISR87pJyfr8CsqS0ZHCI0NTOzmpyksriuZx8eJy83Ljq9 +tXI9OkQ5JB0vnZXeari0oEEzrZ2sREplrzkdJzM8LSg9p6jU2b2us0hKtrz5TUjb2zg0PTYr +KCtDakvJsa+xt6aVnT05OjE1Ijaln6yzq6vbHhgfHhweNbmrsq+mp748PE0/Mjy/tsfQwbvX +Py0srpPaHr0u9Tcdpp+otaumpVAfTjcnHx0220A/q6KkrrWstzo0QkM/MUHIWzo9SU42Kzle +RUH4t621vaiYmsLcuksuICvCWjbptK7UNk9iLCIjKi8qL9e8uK6knqeyr7PSPjhANisuRXBI +RKeStiu0LkQiFb9aVc6vn6XDuaRgNSgpMB4fMk5V6LWho6ypqbNZNDo1KisyOz09Z8HMxr++ +ucW+tre7uquryn5xTUAsLD85MjA9VURDXtpqRj9ISEZObdDKxrSurq6xs7jGzM18VlNSWlRM +TUtMTEc+UlpJaVLnztzQzMzsaklZVEdLQEc+PUZNU1JRUWLr28/FwL+9tbS3t7m/zd74clFH +QkNNT1JUUkw+PURGS1dlZG7UyMrJ0HdUTU5UX1JMU17u7fb2fVlNW2v+3NvW0Ma7u7u6vMXC +u7u9xMvN3N3rWk5JPzk5ODk5NDA0OkZTXOTWzcjDw7/AwsTEv7y5usDL6ltGQDozMTY7QVfu +2c7OzMK+v8HGzc3P0dzg6VhNRkM/PT09QEtY5dPR0NXQ0NHOyszU5d7X2uHqfV5bZXNnXk1J +T1FSUlBWXlxs5dLIxsrLycfGx83cbWxeTUlFPjw5Ojw8Pz9FS1D80snBxMnGv7+/wMXFycfJ +1OFeT0pGT1FbYFBacPHi3dDY9F557N7LzcvHwby/xcnT5GtbV05NRT8+Pj4/QUI/RU9ddGrl +2dfPysHCxczMz9rW2eBsWFFPUk1QV1ZXX37j29vifOzh3NvY0tfY2dHNy8rO0tjq/fx4VUtH +Q0A/Pz8+Pz9DTFdUWmpj6s/Mx8bAw8LAxMHG0+tx7/pfX1tUT1VZT05QUk9Xa/Ph3Orf5OHp +8uN+XVxgbfL86efv3dfOzcvM1uLqaVxYT05LUFxi++rj4uDs3NnSz9POycbHxM3l49bf9l9V +U1NJRUQ/PT0/Pz4/SlJd9ubUz9PO3dnX3dXU19zY3ujd6Ofb2dfRy8rHxsbLyc3ebFlOS0pF +R0hGRERIS0tUXvH169XSzMrKzc/N0Nvc725hV05JSUlIR0VHRkxPU2F34t/Qy8jIxsPAx83O +7l1dUk9WXWd67d3c3crHx8zN1Pd0X1hWTE1PTk5KSU1eXWnc3tfP1MjIysjR1uh3cP7q6+rr ++nNiXVlYUUtNSEdJSlJeaG18d+vt9Ojv9+/o29bS1c7V7Pvo4t7SzM7Pz8/V2+lvXVhcVkxI +SlJQTUxMS1NfX3T45ejh4HJvfeLj4dXQ09zf5+vl4eTn2dvd4O3W1tznZF9SUllUT05PTk1K +SUlNVGLrzsXDwL69wcjL093obE9FSElMTVJYbHH0fX3X2tjPzMvT1NXg4uHudFtPTU9OUFxT +T1dOS1RhbO7OyMHDwsDCys3bZ1dKRkJCQD9ITlZYYWJjbmRaZF9lcefQzMrEw7++x87l6ets +YmFdU1FWWFlacufw59ja4+frZ2RlUE1NSEhLS1VYaeLe29XP2NfW4v3zffrl4+h/6ud0a15o +YVtcavfZ1tjNzdHY19fh3n5kVkxJQUJJSUxZZ/Pazb+8urm5vL/CzOP4bVVMSUdCQE1LS09K +TFZaaW1q9+7h2Nzc7GVral9kWVBOTVJVcPXj09DMysfIyc3X2uT/amxjZWVUXWBcX1xbV+rc +3Njb5+t5dWxga2thX2RtVVtbW253Xl9jc+7n2dnd3NPY5+fvc+79bVxNTVhaa3X28v14ZWRy +e3Tf0M7P3t7W1tLWz9LZ3H1hWk1NSkpIR1Ns3cvBwcLBvsDNzs3U3HdaSkE/Pz5AUFdnbnN1 +buzr2trs8W365O/67nBlX19aT1FdeG3449/i3M/Nz8zKzc7hfmZcal1RT01HTVpeZ+Xg08nJ +ys7g535WUFNTT0xTX3Ty5Whrb112YXvuZXFvbmht7u3d19Xh7m1aUU5beGz3d2Zxe/fl2tnS +2Nrg7eDX3+79dlVOX19oed/Y+lxaVVth7eHu2NbQzczJxMfJzM7P1et9X1hOR0JEQ0dMVW7i +2Xbo2u94/ntwWltSU1NWVVtcXHPu4uzn18/P0dzf4/Dc6fXieHxyaHNt+uLc0tzy7f5s6tvd +1Nbc7e99T1BUVVRWV05TVWBgZ/ns2+Xj/Wjub2haT1dPS1FSWWvq3NbX0tbVycbN09foZGX1 +enf6eX18/WJj8+fo7O/rbGlqX1lec/b6dm5z59nKzc7V6fHf2eHf1tr3aFpURUhfXVxbWVpV +VltkeXZv5eTvfmp78uT9Z1pYV1ll+d3c497W2uLb1M7T2ezq615gXFlqanTs3tvq5NPU2955 +7G5edGBvXk5NSUxSUl737OPd2+V+7Ojz59zu9H1hTUhbWFhuXlxw7+PT1tPP0tfZ3fz93+H9 +eWN3YGj7d3r78+/n7Hlc+t7k5F9RVk9RT1hddezf1dHZ3MzEv7/Dw8ja5H9fW1VPTk5SRkpg +X1hZX15mYmRlfPhyXlpVTkhIV1tp9PDn+erW0dPWz9LX1drn2NXV3O7o5/j57tTR1OX/7P1a +UFxtfV1YV0pHSk5TXWj//u39a/3l19bk2+x45v16bmxeXl5WV1pf6dvf5t/b3NXP3NPQ5eH6 +YFFPUFr6c3z8d/Xt3drOy3flvE9HW0ZWPllJSl5b5tHCvr7Mv8rDzNTV7epZT0pUQ09PXX9l +2VZQVEtFVdxW8dDQZT7aTWxt/klKTlH81sxq2NbN0cS/x8HIxezy31VXVlpVS1deX+vf3t7P +1djY1mhNTVFAPUJGT1XZ09jJzd3d2eFWXlRhSFFKV0xb197JxsHQzuXdYuj57FFVS/bnz9LR +w9TUYtzg+Vf3WU9YRU1Rfs91yszp5ExUSkxeZE9e2/1u0by7tbi6uuPXWU5GQD06PkBFRujL +xcO+u8nX2VROTUg/PTw5OEJw7cW7urzJyU9EQz08OExFRmXu4rmtubaru8W+3NM/S1IvRkI9 +TnC+xc+8zk/1Sk9FVGpDW91d8dDMytfRTkFBPDYyNzo2Zbe4xbeqzb6w43RXXk40T/o4U9Hd +ycK4vsGvvNXNY0U4NzcvMj03PUtIU3npzr+foVCfrCuuSHvPM69APLxRUchsZXdqtjg++y09 +PEjf/LuvvrK16UY0LSMcHx4eLjhZuaSYnqCUm7ivskItODQoLklwfMWorsG2vVk/QjsuLDcy +Ljo8ODtETkc+4Fe9lLIlnS0cryjKzkSet7ecs76q5dtOJEonID8tPVpctry+rsanqE/ZKR0c +GyAnNb21rJ6lo6WfpzVctiAdbPdAyp+it6OrVTknLCAYKC42yK6hn6ekr0g6KyQjJTI9UsrH +nZQ9O5spEC1OIjqpq6WgoJu1PuMjGyAgLy5Iq6yqo6qpp7bFQx8eGhwoN8CloKGkpJqtFSvt +EBfWtrOelpifrdJcHhIbGh8zS66usKGmwMhMNyggNTc2uKqnpbdftp8aCkInD0een5uXmZul +VH5HGyAtMXVKraDkWttLOC2vmau2rjsiGBgpK1CppKCts5q3EB5vHBzCm5ubnp+hLhcmGxYf +Pqi7vJui8i8pNCQZPLavpaWeoNk2RLLPDhHYTR9KlpGvt6Gz7Swxp7Mva7O4SyQxPh8r3K+j +sbehyh4fJj1PXqSrUpubDw4sFxl0pJONm7af3xYdIUi6ZZ6dvlAlJCgdNLiml5qmtiEODxQo +qpaNjpq1vbgNAxUvPa6WjZCsJBwqGRfKmY+avsQ1HBQYMb6zpJ2erDIv4l9GNLKMkx4eeDAR +ElSmoLJWnZ4eFSA0XCzNnKdhKytZMCnPqai2MkDoOk1PO+SRmRMfQh/AXbuLjrFOTTYyFR+i +qaa02Kc/GB0iO9iykZOqJhASFRY2p5WWsEk/vjcNGK+enZ+cl6UiDRlNPueql4+5GxknWjYw +qZeYsywxMyYoLr2urpOgGRgeIC5FrpuQnSs0QSktJmybm565MEUtHjFlqapBQ0lN3jcs3JGc +EBUZHqYxP5KOlrojJGMfGS1LmZvBwkk3KRIcwp+OkKCqMRgXFSiunpmntpmxEAkKG7+km5eO +kLQmGhwoMPqtn5yrTi8jHx8gObynoau7PCftozsTFS2xn6G5p5mzKh8cPrPOvq+jmqszJiI/ +tbisqauxOSUjHRonnqBIPg8auUvCvKyYlKtvKx1TKyI1WJ+Rm6LTJDvJq5+rvMNKQTQoMjk+ +OSgzu8QtHBgfSq+tr6uopqvkLiQoODw/S8yqoKK0RztJ4sDUQjHAkpZ2IA0PQrq+tLasnJzB +Ox4fTjs6OS6xmpmcQR0uOMC0/r7F5dUwISisorHjDw8iOaqzxbWtqp+2KSkeMcpDRVNrp6Kj +o7G7xkA5NzvSt6+zemK7ud03HxslStF2WEt3ubi8Z0Pvyr2+XXDmyLr6R0FA2Ly1wnKpoL1g +GA8eJsWzOz7gu6Gfu8JFRrrT/0EpO9Ht2TM3zb2mo6mqucrA0cpoLzBBPzIsGBYkOLOosa61 +saWvxlgxPUVBTzo4TVDLvsK+xryvs85NtKS1viIUHy68qL3W7e24qspSNCE3S1XKNzE+OcOz +rqOopqi9y2E2LzqzsLdDEhYaKrS/11VOwp6gpbQvPj5Pw+FOfD9XYk+6rqOco7NPN0fpx9A7 +KCg4REIvHBkeK8+1v8jYuKelqL5AQkxP4VNW9vrCxNfW38y8zMael6CpHw0UGT2rubfLVK2h +qq46HiYqTNEtNkpirb9zwcKhnKKlvldJLiYtyWJrKA4SEiSyqp6kq6Wfo6PKJiMdJDU0Wsm3 +oZ+en6amrcHTSjw4LfuoscopEhEYJ1q/zFfcwKuirtQtKUzu10gu1KqclJmjuT47MyxMqKa1 +MQkGChS1nJSVnp6YmqDBFw4OEig5RdjEoJKQkasqIymzmpqf9iQfHykqIjn52LQxGhoaOKid +mp+vtK2srVQlHhwlPtOwq6imqrLMR0A/OyktusW+2x0cJ1efmJusUDI25Uc0IRciMr2hp6io +qqCm7jElPKaZlZzNIhUhv7arHAAAAhOqj4iKkpKPlZXOFAwIESxprayvnZyanzsjKU6el5qu +KR4fLOVBKSMjLEI9KBwfMLCXkpej50xd/NIyHxsZK76kmp2kqbq+0DssHyG1nJyeJg0PGcaV +kpquQEqxsrouDw8WKqWen6a1p5+kqywZHS+pnKHCHxQpqqCbIwQEBR6bi4WMnaassKcpEgwJ +Gc2bj5ejp7u5zj48OWisp6StcD85OjwvOD00OSsfHyVIs6Cdpa/K7spjRjIqLjA9e23Dsq2j +pa68RzowJzGvoKiuHgsOFE2XkZKcwL2xtLI8FxMTH7isoafLu7iyq1AsLTuklZScTRkPFO+p +ncEKBQYWn4qDh5jITz++XRoRChE9oZCRob4tKDlPubi4t8a+vMjURzU12ainrWIcFRcg16aj +qcw/Qtm9uE0qIyjyqaaq4DM6zaOaoL4mFxYkpZSRlCEKCQxKmY2Kmr9LRrqn0CoWDRsur5qf +r2syXsnEyy4sOcKclZajKBAMDBY1raWqayQtWKeVlZuvMysuRL68UUEvNM28rKq5vcq+rK25 +USkfHyMtx6WoqU0fHR0xsZ+dpsM6LzZM0zYoHRciNq2al5eiyj4wPtC4qrPITS4mLa2fmp4b +DQQFEzqPhYOIl8FLPk5cHxcNDBY1n5GPlao0IB0wup6YnatPJyQpRsXoRDMsLi8vLjA1QLym +nZqis0sqJCEpOUFFODzQqpqUk5m6KBgVGR9HpaGevh4cFyawnZKVpdExKDf41b86IBoUIUap +mJaYpMtNO+G2s7DdPikeHjW1qJ1IGQsDCxK3jYaDipm7Lyk4N0YnGhMQHEOfj42PnN0+OMqo +pKbsHxIOFCqrl5KYxh4PDRYtsZubo8Y0NVOyoZ+nXhwTEh6/l4uKjpvoJh0fO7+utyQQCgkU +NpmKiIqYZR8XGyg7cTwhGRQdPKSRjY6XuC8fIjW+oqCpzSkcFxkrTLWt8EAfHCU7npGNjpiv +MhwaHig/T0svIicxtJqRjpKewioeGx4mLzo2Ni4tMjvHr6qmrL5YMCwvNEL53c1zPjs77Lys +pKSlrrm6vLW5xk8qJSIkNThtPSksJkfDoJeVl56vRCofISEsMTU4LzhJ0aqemZeco7rSV0dO +QC8hGBEQFSPcpJiXnrYtHhwkWKibmJ2teywmKD6/rKizVismLF+nmpebrzQeGx8z07mzSS8j +Hyw7sp6bmaC6Nh8aGhwnM0luWnpdxa+kmpaTlZym0y0dFRMWHixZ9t47JCIfMdGilZCRl6PJ +MiQkJzhIYm88MykmL1ynl5COkZu1KRYODxUeO8u8wTMoHyA5u5ySj5CasDofHB4nOU/J0Tkp +HiNDp5GMi4+fRRwVFRkiLkM2KiIcHyhqqJmSkZegvy0fGx8pOWHLxd1aS0/OsaOZk5GXpXAj +FxAQFR0sUmvXUzMuKTm/qJyYmJ2ySSojKDBWvba9Ry4lIze4m5KTmq48Ix0fKU/IvcwyJxsa +JDqunZiXna1WKCEiKDtQxcpPPzA4RsWklo6Nkp9NHBMRFyI7X9swJhwbJ1Gfko2Nj57BJRoX +GB4pPj8yKicsSbqgmJCPk5ijwDEdFhIRFBopRb+0tbfOw7+0pqKiprdXLygrNXq/trTROywr +QMClnJyjyCwdHSpLtK65RhoUExzSn5KQl6dEJSElL0piVykbGBszsZiOjY+Xo66+wcpTPS4e +GxURFREbIz6snpSQkZWcrsUyJh4ZGhgZHyvlqp6WlZWWmJeco7gwGxIOEBUiTcmuscvmTNa1 +rKmy/DIqKzrgw7nORTYtN+60pqOptOhOTUQ9Wri9tE4aFg8XP6+Uj5ebq7OuuclLGxAODRos +xqajnZuZkpOXnsFALCcqIixRP84jExEMGS+xm5qdnKGem6u8LhkWFRooKz3auZ+alpKVmJys +wToiHRkZGyN8vba4PDpFP8LDXWxCV7u1srpeYH5a3DUkJS62nJeXnqquu07srUUiFQMIDxiu +pZiNkI2Nm7AyFBUTDRURGeGqlo6Sj5ShpOQvOC0yQC4rJj+frLglDRUZKDg3856SkI+ntc83 +LhwPExsk5syunZmVl6Cipr9LJhseHx40trCrrejOvkIvKiErNTBC2b+op7GuttlvLiUzPMis +raOfqavBQaiZNBkVCB0iETW2mo2Vn5ibulwXESQYFh0ks5memZOXlqg57c1NXDRLuj8iN6Pn +HBsMISMRJsmclZiej5Cs1CIfJBINGB1Br7aYj5WYnKijwSQlJBgZIPVcNqyurKD4ZKNxLjgs +PkYoO7S/wrzPrb4wQVFqvsvCp63Ry0suXKI9DywbEyYV75qmoJWWnaI+StAXGB8eKjVDoJef +l5qhqMs+zj4rT0lGVS4mvp0gFskYGx8awa7ao4+bnJy3plIcLScUGyIts8enkpmhmqOvvisu +LhQouxIcqSxGo76koFu4rjMrPS0uPStdxDnFrsW5vsGpuMypsN7A4jYuJ76tECO/ESU0Zqau +qJmVsqCjPkolKCodHklHOqqrpqWqp6pQ4uQrMTAsLiolLq+sFrmhF9e3Pa/RzaO526auNL3d +OUYqPUMxSbHfsqSxqaq9t8YwQS8bKa8wErmwGuGhT66mvaS7SK3BLWnWLkFcSvRF2LtUwqq5 +uKvK4FsxNCgeIUKvFRqfFyilV6SuoJ2mtKieKsvWKjwoQDs/TbjHT6a3tq2ts7rC7HwsNi8h +Jy0pJjSzqx+8mh7IpkmuzresX/6z7jfJRzY+Mkg7PL/XRri5c7vCy8xn9GI5N0I3/LA7OqdG +Ma9Ld7lXvb5Oy7td0sJk0U4+2kM/zFJRydXbynR9+FPbY0xWRD8/RUZa2cPP07rg1MzWvdXO +vs3PvL/Dw9dtRTc1My45PDpSS1tc6cbMzMHLaeF+Pm9ISFpVY2XxYcHYw8Pst+PsxObNzszM +xdb14GzM1F7jWVZMOUU/QEM7bDZZO0ZaSM5Ryl2/0ujMUbxnv97Ov0y11bvA671KzkRH2kbH +VW79TPpK8ltN0k3tZUJMNlM8TFBc3UDKR9reXsdgwdzNzru4trq3usTFyr7Fyct220lJQTPW +Ml1BOVQ0TjtfSV1ST35LTF481VJPxEDUTM9OzM5JxFa8ec3K2LjBu7y7yb3Jz8jYzOVqUUtA +P0E7QUw+TUFN80TsbEzBSOlaWfRm1j7CR+fOXb1kwefBzXjGOL1NTc9E61jRV87Kdr1bz9VU +31VLZk1LYklQYu9YvFXbzEfHRldr40TabEDBTtDF5b7HxL7B0cHSwufFWuzOOr49bz9IQ0m5 +LsNWPtI27DpmRk/ONbM+5LtJvlJ1TWFS9t9H0Gj30urh2s/PzNbLzfzo1fNjWu3lXdBj1t1m +3d70Xdf7SOptQHN1a/Fz32bh6/loUVx7Rm1IT05K3lpcbOlW0F7LvULMd13DR+xJfbk1vEfn +vma5QbVzV8I742c9WVZl/M/YyLXRucBxzldRVUA7T0pPZOVt5tPbZcrYyc5OxlZoWuJpUs9k +9Gjazmpy8WFYS+FHTVk/xGYu52E8u95z089OQ8VEVFZZble7Wsu9z7TLt9e+4UXaPE1BWk5n +10vKWcbQ4MdW5EdQTkP2OU/eS7pMz+hpx2HHRcNCPts7ak3kzM/NwM/WucnoxetFV1pDRkJC +TkhLfUn111XXyMnazWXczmrQ0c3O0dfm39hr4k3cWUfWWOpsztjixMrp09vQ4+vfSUo+SE87 +V0pb/WPPa9jJ0GrXwz9TTkVcP1lg3+5c0u3o39hw3vZPc+5q0d5dvt7aylDQyU7S2mlQ4FBO +y05PeXNtfcfc2ctn3FhsV0tlP9lkP2VXWGHnS83NS9NhXWZV4m5o/erm2tvRdtLZz9D90FpW ++OLcUuDNYO7ryeXQaGfPSkpMTkZQ8GTxXWvcWsXd6r/o3cveVOvbas3UZMjZT9Ns8uVZW93R +TlnmSvJQT+9HVUxTXvbUX1pxRk5pXun34+7PyF7XwNzOYeBpSltD6Xv7z2bJzW/Q99/f0N7s +01f620b1XWppYdlNXWhLTufURljOallj1WJM0+v9WWphT3v73OJp9tLlbs/jWszd7Nbm38/r +zsxNUU9qQ1Db6tvse0zoX1fQXNPdXMzXbWTIXl/oR11zemPeycvsyMnq1Mviychuz25SWWpF +S1FFTUlUR2vqSM1tbv5g+Fpuee1f7s/ebNHN7/3g2VVMW11HUGlZavLy7MvEyL7Gx8fZ4mJc +TEhJPFFFRk1uXFDnbM3J0cjQxN7u1llUXWpKXVP9Wk7fbul3bW9uWG7ca+DQ09DMxszN4en0 +WlRKTE9NUVJod2776tLi2NLT1X7fX15KQldJTGFtzM7UycTQ59Lj5Gzf1uPOysfN0NTX11pT +WEdETEc/QkVITk5b7tjTzdLMzNls/WpGRkZESE5ZWH3z8s7Z08fIycPP583Z09Lfz9bfX3vv +XmJSVXBVTUZPc3F23dTIzdnT6n9eWklEQj4/R01KTntm387Yzs3MzcnF0ePe6/brbHJcXGfx +5G7k9up26+9ld3Dd/uXf0srLz8rL325eSkhBPz5DVVVqZtfIxr7GwL7BzNriYVVAQkQ7S1tr +3+fb3ub69+VkXFlQWlpcWmrm6vNy+mxhfephV2RiZ/be3drOyMPHys/P0tXmYlRHRUVFSEhK +UFxl2tHS1tDT5mlZX1lu++jm6uH2ZXra4WpqWE1PS0tPW/XmzsjIy8nExdLe3F9VTE1JRUlJ +Tl3l5NnNx8LEw9HkeWFrXkxMTllha/xyfO9sXGVWUF/609TXy8i/u7y/wsbQ7FtWRz5DQz09 +PD9OdefSyMXFx9ngdFlWT0tFQENNVGL97ubc19vf6npjae725evezszJx8TCxMrU8F5PSk9M +SElPXFzo287JzNPd311PSkdEQUZDSFNZa+vWz9PP0tvm6+fo+GVYUGR6bN3Ny83i+mBYVmNx +av7tavjXzcrGwcLHz9xeUkxMS0tNSUlKSFJd8c/JyMHDycnN2WlfVU1YbXr52dfX6P3haGRf +X2dfWlVeZffkft/i7fBcT0hESEdAQkdLTWbezci/u72/w8nf2+tlZ1lbWV5q59/b2NHP0c/r +/n1xYFZWTVJOWF9n7drW4+xvUk1RTktKTE9YZ+/a087LzdDS52lfXltXUU9OTmHw5tPKxcbI +ydnxfX37W1xVUE1dcGzc1NLMzdZ9aWVPUlVXV01YX/ncz8vJx8nK2N3f7PNlXVRPTVrz4s/U +zN/n+1hcV1JOTEpEQUtTXW/26e3u+G1w/vB4W1daUlvv3NHLx8bHxs7Z4uTh4u/ycF9ra9/e +49nX2fb072FSUk1NSEZHUl97+eXW1s7O2flcXVlNT0xKR0dVd/fd2NXQz9TT1ePb4el0d3n5 +2djSz87Z4Ojv+mJZXFNXbmXo2djV2c7RcXxjTk1JSk5YWVpl9NXOzMvExMPJ0tvsWU5XTUhE +R09Vfv/q1eDfd2xhW15UX15STlZlbfX37uPc3vb0bF9lX2ZqaPDX18vHxcTEx8zU2N1+XEpI +RUpNU1ta8N3a3Njne+n7WVdMR0dASU1WYe/OztDX5Gxwb1pYWmpncdvPzczHw8jO2fZ4ZVFM +S0RCRk1f3tbLwsPExczT3N75YVBIRUpYUl9ub2ry4OvV0M/L0tjq8N3Y1M/Ozc/Y3l1geWFT +TkdDPj9CTGj+187Ky9bt+V1XWE1MRkNHSlh33NHLyMXHysnH0dbeXVBPVVhcderc29zV3Wlo +bWZiV1RVc9ze2c7KytDZ6WtXTE5KRURAPj5GVFfq0s7LzcrNztLg+GxjT09PXH772t/Tz9nY +4d7p3tt8bWRq6t3l7dvW3+j18extXFlWSEBARFRo39jKwr/Av8XJyNntZFlOSUpSVFBe3+vf +2uTm3vRmfu9mT0xZeW9oZ/t7fWhbUU9NRUZLS1Bk48vFwb6/wMXI0c7a8HleXU9NUmV/b3rv +3trX3+Ts+GVaX1hNUF5j+/l1bWBZZVhRVE9PUllZZG/dysjHy9PS1uB1fW5cUkxIREZV9/3j +09TKx8bIzc/e9WJVTUpOWGzv/WRmd93VbXNlYn9ia3bq2MzGxsPKycjN0t3lWEQ9Pj4+SFRr ++dnd28vL0NPX71tMTE5KSE5QTlRYW15+ffbY0MzO2NTX6+7bzcnNztTQ1u1x62dOTEVLTUxX +6NHS0tDKzNfe3OFrV0lGRD49QktPWnH818nLxcPE1e90VVJYW2f0+9/o3Njo3OHg6nZSUFld +ft/Z2Nni5s/O2NXe3G1OSz8/RU1Ubebi2s3Lzs3LzdD9aGJPVWFv6N3h3NzW0t3d4u/nWE5M +S09ZX13v6ejm0s/r5WlNQj08PUFFT1h62dPMx7+/wsHL1X1cWlJWZfjs3d3SzszPy8vM0OJc +SUtGREdLVFZ27uPX2NrV33RSPz4/REpTdOXezcjHwcPJyc/rWk1JS0xNU15u6tnQ0cjFycbU +7lFBQ0VITV9r5uX36+Pc2NDb4vVdWlpZUndx8NbN0czGw8K+xdJ4UlFVWF5ycOjl39vZ0M7N +3O9VQzw9P0BGR0tOVl5e5tze2el7XktKTl1aaG7m0drDxca+xMnV81JNTVxw9t/Wy8jExsfH +y9xvX1NIPkA+P0RIT1Vk6dvWzM7f7mlOPj1IU1rt39/W0dLRys3T131zVUhOXF5+6Nzk18vS +1MrO2Nb6Zk9ITlBXYPPp383KzMjJ1tb+UUs9PElSTFNp9tbMzcm/w8PGz9hdRktOTUv+9HzT +1NPM0dtlVE9LSkRQW1xj49rh2dTa62xkXFlWUkhBTFNbZ33OxsXCwb/Cx8/h9lhER0pKVGLf +2uTf1dXP0+f1al5MSVBVV1pjb/vv393g3OpfWE5MSUVJT1/v3NDPzcbLycvN3GhYT0dDSU1Z +a9/YefrWzsvHyNXjalJLRktTXnTj0dPP3ebV6u5qZF1dWVNu5d7RxsLGy87Rzs/edlBKS0E+ +R05UVvff39POzs3T3mJVTUQ7OkFJTFZ19N/OzMrGzMzQ2tj+dflr7tng1dre1NLQ0NLka1pR +SURDTFpc/dze3tnd2t7laVhbT0hJTVdrcOzW29bP0MvO0uNcT0VCP0BMUWPmzc3OzMnI0u14 +cllYS0hNWnfpzMjIxMTDwcjL1N7+TkxGRUdJTFpeZXTs2dnPztzk5l5ZW3bc3dPN3+t0Z+xr +aFxQUEhIR0lZau3S09fP18/W4vpoT0pFQEJKVl/j0MvPycPBw8nO425aU1FNVl5093zl393c +1c/Q2vRvVlRMSltpal93eltj9Ox673xZT1ROUF5+287K1NPY3NTa3ntcUkxMTUpOYfLa0tTT +zM3N09zk/lFIRUpMTG7Z3d3e3tHL0tfU4mFbVlFVXfPg1c/NyMbIxMDFxs7lYk5KSEVOWm/o +bWJzcmX7aVtOREM/Pj9GT1JUbXPdz87N0MzQ7V1iZmJm/+bfzsnNycTK1MjLb0pJTUtMVv3f +0NTW0cnFzc/R5FRMSEVCP0hLT05RXevW4e7Z0+9oXFBRU1rj3tbe4tnX2+rb2fJlT05SUWv4 +597i6eLb18/Sz9bfaFZISlpd0s7d1M/X1tBhzczffFFkQDpWcOjDxNPJx9btycrPXU5KPj9A +Q01Za19ObdnP2dXN3O3vRjhDYmz10N7SzdtPVmb05PlyV1FUXtXLzMnU1cbFztPP2vpeWk5F +X1dS/V15ZNTZ89z26eV7XEtJTUpIWV76b97b39Xj9W9QTE1ESlVZWeHk8drLx8nHycXfcWFR +YV375d7gZuzay9Dy4PXd6tria1xVXnbp+l9JTFBVbmzf1dtsVGJ+3MK7wdfTzdrTz9n5WUZU +XU5MUVlZT1dSVGdv3fj94mRsXE9XT09a5vVnaX3Z3d/d1dfu2tdvV/PyfNXe2tbPz9nM1tzb +aWFcWllo4uR8dlpfUVd0XV93WUdFTVRFVO9VTt3k2s/R2Nvm23Ro3WVlYOxsb2fczm7g0tra +ye5nfX1PSXjsatHN1trX0NprfnxGUWBSTVFjbFH7X+vS5N7vztDb29HJeuXK0dnUb+1eZ1FL +XX1oRFtSREhk2tnTwtPXyuVuctt7R0ZPQkFRTFdiUXDl28jByMa9xc7Z5V9QdPVMV/5XP27c +SUD9yklbv9JqybzBurW9yL3JVklCPjU5OzY1PD07R1hNPV73TFrPyH7Qv9zVwcPIt7O0tbO6 +xcbSZEVVQTEyODIvPE5ESNR9bMrCxL62uMnLwu7b3m/Q3ejZ39vrR1RmP0tLRlJLSGlv3spk +7cpe2dRY5dtNU2pjfc7MzcPD39ra5F1GQDo5Ny8wOi88Vu3Nus7Hr8G0r7CvrrKzsr+9x8jW +Wz42LCcpKiUpLiwwRXDfuaumpKCipqmuumxFNSglIx4hICEsPTtasr6xn6emnqesq7zRys9B +Ndo2Ikg5J01PLEXVOETTVVzCvbuxsL++t95s105p3WrbyMrGvbu9y8tbPDs6Li00JyIqJic5 +N+2xrqejoJ2en6Gprr9IQDgiKSMcKyclOD/tt66opKOkrrK2Pz43JisoHSIjIy02Rc2vpqin +nJ+mn5+ns6/KLVY0HTEnGygmICswNFPT7si6t6+rqKmnqLOwrMnFnMspoh0fshQmyB8nrCUu +sihJxUdavX1M3+NPxrbEt6vEuKu+uau3uLPjPkQ0Ky4rKjEvND5HX/e9rKytq6usrq6str26 +z0xdTSpAPio9LyYtKykuLi0zNzM6P1DYvq+pp6aloJe+rpkeq7MXsUscW8se1sQfwk897e5I +Ue87N2VAR8fCvK6wsK2tu7rLSV45LjQoKCsrOUtL2Lizta6vt7O0uL7Kzczzy8pO3VM/60lH +TkVANi8qJyknLjY5TVD+x7i2qpzbnpcnm7MeoVwqq88lrGkyrFvjvWM7SDwtPU4+5f1cxMbJ +ucS9wdbvSUE6Mi8yNTA9UklbxOhfu7/Eu7nEyrXGwazJzLjp0MVa3OJJQT00Li8tLjMvMjg3 +PHeuOTuWKjeVI0iZJ06YKVaaKK6ePairUd/YNzFUMDfQOEhvU93dyWjXzj1qSDE+OT9EPsRV +Y7PQy7jDzrzAP83dO9ntW87i7dXBx8q6ysvVRUg8LjQyLzYzMDk7vsI8sbDSura0y7ux1sCu +ylCktjOevT2fNDBwIygvLy9BUDJ1ZzvbQkhxPu6+MT6iHHelGp6sNpmqv56tv67PWEQ8LCw9 +KC05LEZS2MC7ra+urLu60kdUNS4sIyUlIyYtOTJDyV7cwbqur6SnraGksqSiuqioQsVhKzs3 +MT4/MTM+MTc/Lz5LQ7PPLJ44IpogcJwpqKE/rK5Dvls5OTkqJjolLzooSknerrGgoaKfqay3 +0cdTQC4oKSUlJi1DMEu+X8XBvLW6qK65qq6/q6pqrbU4wz8tNC0sNTYqLi8qMzEvPz1sr9k4 +mUQpkyS+liaonjqpqUqvxD1POSssPSw1SStCQTy9zLCorKarsbvZ30hFOi8vLC48KzjaNUnO +WufCvN61qMqzq9Gxrs61us/jbkMwOi0uSi8xOis2MS43Pq42OpkqSZouvZjPV5fQMJQ0QJoi +zrooRzUtNHRPO7pJ/bJSt7fPtOhVTi0tKT0xIsgqJa00Rqe9xaanWqKqLqPEO6k5O+M8XmLN +zsrBUMzuPl4/Q1IwNC8nKjs0Ir9SJ7HJVLissribunOZc1+bT92kL0zRLDg+QkrB0FK6XkvM +OEhOLTkxWDAcqR0omxmvnCyanW+co0KpwjLXPCxGRCdGPCzLXu2rt6ysuLTaaUI5QCstKCEt +MSk2aT/dwry3uq20tqm32a+8Pqy2PalYN7o7SdVcyru93NFxOz8xLjUoLkU4H7L5Fpo4LY8z +qZNUoJ5btMAvNTMlIDAjJUEiOes4srOynqmkp7Sy1lNJNjMqKSooLTlXS+2zvryutLO3rrDI +uL5Myr5JyLw06VIz0UFG2dtt/Xg+P0UtNS8pMykq2Tsgn1ookTW2jk2alsKfoUy9zyg1LyQq +MyAtLyJIPTy0wLKmrKyqtLzFeEY0NCosKyUsLjXp3v6yr7isq66vsrW+xb/oTshOPMgzO+ww +bdpay+VmXko/OTo3NjUwNjM0PV+tMLWXHp6cH5WrK5nYKaE6JaooKrgkNewxPss9fLRruazK +q6y+rLrKw0o/NCwsKCsmKDA7Qka2xsejsrCnrq+yrNHouTA63Cg7TyhTTTvT28e+vb/N0F1L +Rzg9ODE9MjM/zE0wmjgykyW1liimnjmrqDTbtidL2yhC/yU/TSf1STy3ycKvvrq8ytpnSjw2 +Ny8zLzDQRDqkSk2eVbSdt7ShuWCpTCq6JyhIHykwJzZFSOC4vLeturWzzdB5OTMxKSowKS9s +yUO2pOyspbGprquyzKi/NbXIKrq9HsHkHLlDH801KtJnPLy9VbnISchMPF5COUVLvLMunLMk +ki/Jly6mrvHj30kkXSYgMCUjOCosSjhX3cS2rqilpKOoq6+751owKycfICQiKDc8zLSrpZub +op2er6+6TTwwKysoKzQrQ+Q8vbrzt8ZteEg1Ly4pKS0tMTtGWs++tK2pqqykm73Yki4onhco +vh4wVVYsva4wtbRvxK/YSfVVKzpcKkm+TsOqt7Krt8rIVDozMSkmLissXU/YpqOpnpusqKPX +4r84LTMoISgqJy89PErU1OK+vtjFyl/i201k4lpdUFBPXN/x08XXdradxCqZrBi7qhstoDQi +nq8nqadcxau3Nb+6IS5AHiEwKytR007Gs8vBuOpd50o9Sj5EW72fdl2SOciZNrDFy/c52DEx +LDUoIkAsNVv47de/r7Gtqayvr7nVb0w/ODU3Lyw2MTNLRFzCvrSurKiiqLqsvDBTaC44bz9C +Z3N4RuzkQVRFMzI3NjA0PkRGaM3Oybu3t7q+w11QzkxBzWCqmz3VlykpsSc1P0jNP+m78UvB +xTtaYF1EOF4+Me3T9sSwtsnN3j4vNT81N1RUS3rNwsGyo5ytyJ9KK8hN3Unbt1xJUUIpJi4m +IScvNj6/r7SqpKu0u8PbSFNuQj5k7HNPaNBPU+xpR0zpbGi0n7s7o6gsNrTASr+vv8jXyc4x +M0wvKzMuLC8/Rj9LT0xLVWvb0cu5s77LwL3DwsO7vs60lpkhzrAUHxws0Sq5pK/P0sM/Lig4 +LyE0TOzHvK6puLm2v8/Rw9JrWd/4S1BhUEc9QUE0O0db0cqzuayeprnDuEw9ODhOMTpGNS8q +KC8tLz9OdM++tba3raqsrrGtr7u5v95GOjUwLC0uLTY8RVFp18e6uKCb1T2qWCIo97jAvLKj +rknGwzErJisuHSY3NDc0eslluaehp62nruNLQEJCO/XC0NPBtrrd5+ZMq6YqK0McIBslstqz +qKKmyVE9OyMfKCo0Ls+qrKumnqKtraqsut7HVzEvKiwoJzU8RERMz95lzs/R0dG+ur62raq5 +S3I/KCwmN1AxUuPc6E9XSkY+P2vy3r+xrKyppqmtr7W5y15LRTs0MTExLzAxOj5HTVj07NDL +xb26rbJhRjk3Mi5byL+7u7S1yllRUD4xLS81NTtZyL25rq2srrazu8XhYnxNUVFJXFdaal1r +Rzw3NzgyOk1W42JK3OpqafrJz8zP3s3e7mZzztXT1enp+1xRTlxzbWXQvru5trO0trq+zeNT +Pzw0Ly8vLjQ5OkZW8/Lu7Hx03cS9v9X3clVeYeLGwsrNx8TPeVpNTEY/P1Bz5dXJvru8ube2 +t7u6vsHKz9bR11tBOjcvLisqLCssLS4zO0zw2ca4sK+1urzI2NjKvru3t7q4v91VTEpKQTs5 +PD4+Qk7UwL66s6+ytrq+wdVVR0FDPzs9PTo2MzQ0NDQ0MzM4PElw3L6yraqrr7S6vcHCwMPF +v8HLyM3rW05GPjo4Nzo2MjM6SVvXvrOura2rrLG7x+VPQzo2NTAyMzIzNTY4Nzg7PEJDSl/T +wLSrp6WmqKenq7O8yV8/NDAzNTc1NDk9Q0xVX/n9YlpUVVp70cbEv727v8DByNPzXUg+Pzw8 +QUA9PDk4PEhPTExb7//Tvrevrq+wsLG5vLzI0PR5WEQ9NzY8RUlOTlVOTFBFP0ZDQUZGTV7s +3tnP0Mq/vby+wMXJyczP2u7sWUhIPTg5NTU3PEZPY9vEvLWwrq2urq6xub/F1+H1a2hcTkhK +SkRAOzMvLCsrLTU+YePNvbu7vcfN1HlRTkg8PkNLaNfJwbeztbOztLa6vcvu+FtYSUdFQUZI +REM/Pj49SE9a5c7Fwr28vLy/yNHjV0tHPjo7PEVER0lHUFpeTkxGPT9KUWvdyr+7t7W0trKy +uL/M7/NgTU1FSU9PV2Ls3M/MztTpbWRdUk5OSUtERkU/REtTSz8/SFzuz8O7t7K2ubm5vMLK +7lpIREVFSkhMVVpnZGFhV+LnTT87OzxEWXXlzcK+vbu5t7S1vcrcYVxWWE5LVllVUUtITE1Q +TUZKT19kYHzd3N3da19UR0hLRT9BRlPsx7+9uLa1tri6vLzB2XNdWE9QTElISEdDPTo7Nzw/ +NzU3PUpY3c/HuLSzsq6usbO1vs3lWE5JRz87Ozw5OTw8Qk5lXObFvry7t7m7v8twWVY/PUI+ +Ozg/S2fPy764s7G0s7a9wMXjWE1EPDs8OTg1MzY3NTQ2PURAR1Nd7c/KwLu6tLSyr7CxsbK4 +u7/J32JtWktAQEE8PDs8QkpJTVphdOHM0OH/fU9IRTo4OTs5PURO9se9ubazsK+yub6+v8r0 +YGpTSk1OTE9XT0tJQ0NGRz48QEhJVF3+7nzYzs7S2MrIxMC/uLKzsrK0ucDL5lVCPDczMTE0 +MzM6Rk5h9ODVz9nb9l10amZfW2Hz19HLx76/x8PLz9X4Z2tpZlxj5e3g0szLzth9Y11PQTw6 +MzU3Oj5FT1hdZPTOxcO/vbm2srKzrq+ytbrE90s+Ni8vLSssLS0xOT9Z68/Lzr/ByszIzvHu +3u3VycjExMXM09H4bGheYlZOWlp339DCvbm5vL7L3XdNQTg3NDAyNTo+PkBOat/UzcfHv728 +u7u1r6+ws7i8xv1NRj03MjEwMTMzNz1BP0VUVFZrYFNYXmDr2ce9ubW2uLS4wcXI0+5dUVRT +TVVa28/QyMbL3el2WExBQkFBQ0hWaE9ISkZCRUg+P0FGWFl038i8vL26tba6ury7v8zZ1s7c +5dXN2WJdSkA7Ni8tLCwuMDhAZca9u7avs7OyuLzG09/3+11s+d/da/zzWVhdWV7zd/3s3MrK +xcbKxMlwZlFGPjUvLjA0NTpDTU1d0MzKvsDEx8jAu7a2tbGyt7i8wttLPDIuLCoqLC4yPUhf +2MvAu7u3uLq9xsjO3fLm9HtbTE9aX2ZiUlNJRklYfd/JxsLAztDO5GZRSEhFOzxASW/k3en0 +6mpfYmNlXF976NTNwbi3ur3Gw8jR3/TeaVZRS0g/QEg/REtFS09QVVtnXWvd3trLw729vLzA +v8HHyNTna/vZ3Nn0ft9OQz02NzUyMjU3QFfmz8W+ura6vcbOzv5QRz88PD9GTlVU/+vu2tDD +vru3u769vsK7ury/w859alFEOzQtKioqLTU9SlJb4uTbztHNwMDAv8G/u7S1vcrT/U0+PTo3 +Oz09QEhiy76/v7+5u8PCzd3f9lJGRT9DTlRcUVllRUJCQkRKbOTcz8K7uLS3vb7Cxszd6FtP +U0xYat7Szcvdak1HRz04NjM4PD0/SlhtzMrIzNXKycnW6m/dzdXNwb27uL3D3W15WUU8NjQ8 +Pz9NeunSycPDzMvFzd1kVFlndffs3fdacm5RQT4/QD4+QU770sW9ubm6uLfA2NzpW0Q8ODxE +Umhpd/fczcrY5+LeYUhDQ0lnz8rPzszExM/d8ftgRzw9QEpx0cjHxsfBw8vdevN0UUtQUV3V +y87cbF3r3+JaSUtLSENLX+zLxc/Pz/b+YUo+OTc5ODg9Su/Buby6uLq7u8LZ5mRdT0pNUdjJ +1N3g2+rgc1dXTlNWUmB15czJzN98Z1xPTktCP0VERFN138rAwcvN2t/g4HpKSEpQUlNz3MbE +x8zL3drR9FZFSU5SVmL1y729xcnQ4v1bXk0/P0ZPS05t38nIzc7O1s/X23pTWm5hYOvl0dHZ ++mVcT1n4bU9LT1pq8dnHv8HKz99fUk5LQDg2Oz9FTmbWx8PIyc3Z1dLY8ExLV1lYXe7PwcPL +y9fd1NjdXkxSV1VPT1rv1dLa6WVZVlVIRElOWVdf6s/DvsLM2OV8ZW9XTE9eYFJYcuLP0tnm +5H1RVl9STmTr7uPSycfEy8jH0eRZU01FP0FCR01XXnXMxMTDx87g1d7o79bM0MrW4c3LzdHl +42FWTz8/SllPWFZOYezq+HBWW1hOT0hASEpLS0lZ287Jv8LDyNrqY05PXnP62c7Gv76/xs3S +2mtSSERESk9SVn7r2cbEysvV3vZcSkA7PEE8QEhIVHTu3M/Ex8zYd11g+3b32s7KxMXQe3lv +XVJKSURMXWDl187Hvr/O1NHd7WFRS0NNTURSYV7o6H3b5NrO0tfS3+zcbHnm4dfMwMDDy9Vs +VEhEPz0/Q0xfbe3UztDn8dfvYl5dU1hcXPv2d+7s2Nzx9mRYXGNtaH3m5ubw6/LfycvK0ndo +VklFQEBETVViz8nGvr/Ey9LdZFFHQ0lPXFxmfWnUyszIz97kYF9aT115Xk1NTlJqaWNj6dre +7WlbUmhs6tnb28zJx8TR3ndbS0Y/RmN57N3Mxb/DytDtfV1NSUI+RWd54dDMwL7BxdTX1t3m +Zk1AQ0ZFUU9OW+fe2c7P1dz9W01OWFhNUlNr1dXZ6VxXaF5lW1BZZW7l1dPCwcbL5mZjUVRW +UWjw2c/N0cvBv7/G2OhpT01DPjo7PDs9P1LvzMnLx83S2ONYU2VTVlhWVl/m3Nvk19nra15e +7+TayM7Tz8bHz9j5Y3NjUU1QT1J4+vPW2dXU6X1hZXBuRENGRVbc0MjExcDDx8vO1XhNP0A+ +PEdc/d3Jvb2/y9DP3l9KSkg9PUZNWE5RbWdOTVp67Pn52MzMysO/wczP1vNVTVFMTEdLW19f +79HLysS9vcLJ2W1VRD5DQUFDTm7u3N/c3HNZT0tFQkdVZmPZx8XExMPGyNDjfFtLQkxUTVpq +Yl9dZu/n2tXSz9Le6s7Rz8PH12ZabFhaS0tCPTo4NT5a5L29tLSztbq9xM3kSD07PkZU3t3Q +1OHsdmHn6nRzSU1dZ/fM1Nd1bVNLSERIS0NAP0NacdXVzdrGv8PI1Nfc1fRpX3ly0MrHxsvO +0+xSS0U/PDs8TXDIvr27vr3EzNpbRz44Njc2PkVTWHJo6NHNys/Oy87d9+/r4NfS0+/5WPz1 +3PZdWE9IRkVb4sfBwcvKzM3N9VVART5FTFDfzb6+ytvVX3hUSklLXU1YadbCvbu3u8XKytDh +X0Y/OTg6RkxRVnbv3eff1vFxXWFrX1VUbdXbzsvW7mNkWk5LREBRUHHWzLy/uL7K1e5yWVdM +R0hcXunT1M3Szc/16/NUSkNDRklRWF7c0s3Dx8vN1N9dVEQ+Qz8+T23l+3Da19bP2NXkaWRk +2+7bxcbM19fN8FBcSUlBQD9NT2zPxb3CvsPA2c7YdmFHRTs7PU5j583KxsDCysfO4GVZU1h1 +98/O2tfazs3z7lZGQDw2Nzg8Q01v3dfNzM3NztfRzeJ75+Ps39XN2G1sUFVWTlNJTkxP8t3L +vb26ury8ydjlW00/Ozo3NzxIUWLj2NPY1dfc2Nr2X3hwbuHY18/Z3XVTVEZAPjs7RE1S7cm9 +urm7uLrBzNXzWk5HTUpLS1RzbGJkcmVWW1VVYmTl1tXAvL27vMLK0d9xSz49Ojg6SFds79DB +vLu6vsbO1OhfT0RFRkRHR01IR0dITEpMT1VaVubIw7+9uru9v8LMYk5MSD45PEVLS2fZw8XJ +v769wsG/zN1bX+NnU2r6YkxEREQ+ODg7Ojk8TPHVxry2tLW0s7zM4/1QQjk2ODs+Q1Zs/PrU +ys/NxsXI1M/Jw8rb2dfaalZiTz86PDo3OD5ZfdrCure0ure7wM3j4vtaTUtQSUBHYlxPXO59 +ZPbj1t//zsTI1NbJx8zo5OdPPDU0NDMxMzo/S/3Gvbu4tba7w8XI1GNSWWNbVE5RTE1JXFxT +Y2/37NrLv7q8u7e3vMLL7VZEPjcvLi0uNDpDUuTRyr+8uLe6wsjO2/D1ZlVhaFE+Oz5CQD1F +T2D95su/vry0srm8vb/N71lPTUI3NDc6Oj5PW/zf2MS9vsC9u8POy7/E1tTM1O5MQD49Ozc6 +PD5GSnbHv7m1uLzBxsjP+l1IPj02NDM1ODpBTlZq3c/OxsS9ubi7vLu7vsPM421MQzs5Ojc5 +PENOc8/EvLe3ubm6wc3UeFRRRT9DPDU0Nzs8PUdNWHHdysK+vby7vb6+vsDT4Ox5Tzs0MzEx +NjxLZfjOvri3trOzub/H0tfkW01JQz49PTw7PURHRU5b+NjIvrm0tLS1s7i8w9D5WEY6NjM2 +Njs/PEn7yr6+v728v8XHzdp5XFdRS0A8Ozk1Njk8PkBN9tPIvLe0tLS2ube8v8r2Z1RDPDc2 +Ojo+Q0pTYtzLv7/Av8HHz8rJysnU6nFPQTw1MTAwMjU3QmLZwbq2s7O0tLe8xs33WE5CPDw/ +PDs9RkpKVG7XzsrFwb69vbq4vb/Jz9f6XkpEOjY2MzI3O0VWd83Avbq4t7i5ucLL1NrV5mlQ +RTw5NTY6Ojs8QlRu38O4sbKyr7S4u8HWaEw/NzMwLi83Oj9JW+fTxby6ubi8vr7ExcXCzPNW +SUE/Pzs5Ojo6PEdc2sW/vLq5uby9xc7W+FlIPz07Pz48PkBDQEhU7NDLxMbAwLu3t7q+wszc +/lJDPTk1MjI1OTxHcdnKwbm4t7i6usDI0N5ueU9HQzk5Nzg5PENJVePKv7u4tLKxsLK2vMHI +3WdIPjg2NjAyMzY6P0RKdtLNysbGxMPCxcXFzs3P2HBXSkI8ODg3Oz1FWN3Mvrm2t7Sys7e9 +w87XWElAPDw8Ojo6OD1BTV/j1szGw76+ubq9vsXTd01HPjw5NTIxNzxKXt3Mxr69u7q6u7y/ +xs3W1uFkXFVMRz45ODc5PD9OZNnFvrq5t7S0trq9x9xRQjo3Njg4NjU6Qkpm08nBu7q3tbKy +tri+z+ZWTkk+PDk1MjAwMzlFWuHOx8O/vbq8vb3Dz8/0XUtDSEhDQEA9P0JGUP3VycK+u7u5 +trm9v8PN8GBTS0M7Ojs4NjY8QkhZ+uHTxr66t7q6vMbZ8l9TTUNBPj46ODg8Qkxp3MvFxb64 +ubm5uLvG2epqVEtEQTs5OTo+QklYYeDNx728uLi+u73L0e5iYUZFRT9EQ0RIRld78dbLvry9 +u7y+xMvW0+FbWFVKREE8Njc5Oj9LT1Rr39HLy8XHysfJxszZ7fh8YVJMRz49PkBHVnvdz8S8 +ure1uLu9v8jpZVhKSUZCPz48ODo9Q09WZuzs2MnFwcPAx9DW72daVkxRTENFRUNHRklWX2nq +4dvQxry3s7a6v8TM315HQT07Oz1CTWbm18HBvr3Kys/gX2vv+vb0cunbfuZgUE1IRkVPV3zW +0snBwcjVZmNYT05OTU9iaGh++GJeT01PSkhPZd7PysHBxMPHyM3/XVVLSk5RXW1n8d7Z1dzn +/mVUWV9g993Rzc3HxsnP4HdUSUQ/PT0+REhV9v/q4ejqdGz98trQzs3Ozc3T3GddTUI+PkRP +X33SzMnExs3b3PZYTk9c9tzfzsvK1OZpWk1CPj5DTGvY3ce/wr/EytzV2t3mYvvr9uXoffjy +Z1VVT0xaW/vVys3MydXY+1pQRDw8PD1EVl1r4NjS0Nvu6u9tYWhidt7U0MjDysvS3/lXTEZN +VFN059zIxMXI0tfqUktJR0xZaO3TycrU4mBaTkZDRktOZ+z66GxeXU5PTEhOXOjOy8bCwcHI +0fRUS0c/Rk9c3tXHxMjAv8je4eL9a2RbXFxt5Ovz4OpoSj5EPz9FTXD43cu9vLi7wsnW3llR +T05OTUpNTlTh4/tcX15hWlrqz8vJwMPCwtVhQTo4NDU3PE5b2MC+vr7J1OJ4e+re1szHy8zG +ys7bWUY/PT1ATFrr0tLIyMjJ0+bvWE1UT05IVVRZeVttb1hST0xVbNnKycXGycfK3/RNRkhD +Q0tYceXVzMvBxsjMeWVNQENITVVy2NbCvMPCz3dXPzk9ODtJWc3Cu7i6vcPV4G9f7+biz8jH +yL/Ez3pIPTc3OEFKZG3n3m/P1XZTTUlBPkRIWN7ey8rMy81sTEY+PD5KadDEwry4ubW3v8Xa +WUVAQ0VPXWvx4uHc9GXv42JaV1383tzczcvPytdPTUI3NjY7RV/Yy8K/vsHS/FxGP0NIU8/B +v7y7vsXZTkE7MzAzO1HWw7qzrq6xuMvbZkA7NzhCUWXq29vbZlBMVFBITVhi1sG+trO0u8TP +aU5AOz0+RVj+zs3Tz/J5YElHTkpKU17q0MTAv8XfXE4+Ojg1OD5KZ869uLa5v8TnWkxFRk5o +d+HCvb25yeRmQj49Oz5IXPLPwsK9v9zrX0ZFQUFLXnblzMbGxdphUEI6OztBTGXVybq1trnC +2F5DOzo7Qk1b9M/KycPR6OhZTlFKTm3f0s28uru+0tr8TkA/Ozw/R051yb+9vr6/ytvoZWv0 +6NPOycrP7E5KQDg3Njg+Q1/Xw7q9u8rd4VRFRD9BSldifc7HwMl6WE1CQ0xKVHHjzL+7uLS6 +xs7gVU9NRklPVmTdzs3OX1RYTElMT2nf1NjLx83XfUtGQD0+P0RS+t/Mv8G/wdPha05HRkVI +XPXozMHFxMrW6VZEQERHTv3czb67vsDM62tQS0xNTlvm49fP3+dcTkpIREpabO/azsa8vL2/ +yd38X0tKR0FFU17cz8zJ2GhOS0Q+QkVGVuzRw7+8vsjY72VKQURES2Dz0MzMx8zdc15LR01S +V2/e38vDv8TO6WpnRT4/Q0hj7d3Jw8bL1l5WTz0+QEJNZHvQv7/BydRhUUM7SEdO6M/IwL69 +vcLK2t9PQ0A8PEZTcNXIwMnH2OtuSUdCQk1oc+LSxsTO0PhhTz89QENe0si9uLS6wMXU3mRP +U01Iad7dzMjJx9JtU0I5NTY2OUh72snBw8nN3mdKOzY4OT1gz8O7trW4vcvnelJIR0ZQd9nW +ycG/xM/WZ1RGQEJHU3fb18fEy9j/VEpCOj4/QlXizb+7urzJ505AODQ3PUZs1MvAvry8v8p7 +WEg8PT5EX9nKvbi3ub7PWUM5MzQ3PE9o1MG5tLi6yu9UQTs9QE3k3czCv77EzOVhVUpMWFvX +ysO9vb7I1ldBOjYxNDo+UtnJvrm4usLTVUE3Ly8yOkd70b21srS6yW9SQDs6PEdf28e+trKx +tMTvTT47PD9Oa/3Sx8LDx81tTEE5Nzc6RF7ayru3ur/USzw3Mzg6Ql/OxbqzsrS5xWBFNzM0 +Nz5gzsW2sbO1vdhgRTk2NTc+TvfNvri3ub7XUz85Njg7SvDYxrq2t7rC3GRKPj48QVnQxLqz +s7K6yV9HPDg2OkVW3OXJvb3B0H1BNy8uLjE7U+vHubOytrzSV0M5Nzc5Plnexbmysra70FtJ +PTs/Q1Dczca8uLi+x9pRRTs3NzlI8tnLvbm8x91URD05PD1AXtHMv7i7vtVWRDgwLzM4P/HD +vLOusLS91mRGOzc4OUNq3cO1sre5wtlTPTY1Nz5V3Mi9tba9wNdkSTw6Oj1G7sq/trCytsDd +WEE8PD0+Smz53MK/xdBeTEU6OT09RWvVyry4ub3PaU09NjY5Pkps0sW6tre7yNT+Rjw7Oz5P +7s7Bu7q6v83WZUpCP0BBS1v40MO/ws3tYUI6Ozw+Rm/Pxr+9vsPRd04/Ozo+QE9u07+5uLzG +5WxKPT88PkVX7s2/uri5v83STkA9Ojs9SVbcyr+/w8vO2FlNS0lKbd/Sw8O+vcXX7GBIRUdN +UW7tzsXNzM9zU1hIRkNFTVnj2Me/wsbcX0w/Ozo9QkpZbs/Gwr7Fz+Z/YEtLTE9aY+DMxcLB +y9Lkc1xUU1p72dLMyNHbc1RUSUNBP0dMUPfcyMjHxdJ9XE1DQkJESFrwz8PEwsjZ/lxMSD8+ +Slzk07+9v7zE3PxVTExGS0xbdunKxcHBzObqYE1KS1Np+nPn3+La71NXVEtNXW7TycjCvb2/ +wNJjUUQ9PDxGSlbXy8XHycvja1tPVE9KUFZmf+La3Nl9VUpIQEFJT2zm1cbBv7/EzeZ3YVZQ +UFZn3dbMw8XK22BTTEpLTlRq79XPy8XL0fJYTEA+PT4/SVj1zcbEycrXc2VVVU5NS09l+93Q +ys7cf3lYUF1hdd7TzcXCycfPW1JLQ0FER1Bfbd7Ny8vK3GtTR0ZHVnrmzsW+vL69v8zU61pP +TFNZYPrf3dHU1+teaU5ERUNGRkxOYuLn49j7XFxNSkpMUGN18dvf2c3N5G/yaWVwe+/d1MfA +v77A0+h1W1VUTE5q/d/QzdHZ2f1fWU1IRkVLTVdmamz+fGNbaV5aZXhubOTv7N3Z1N3a2O58 ++mleWWZr6ePo5+92Y/xrcO/v8nvp3NDGxcjP5u9nV1BMTk1JSk1o8evU3NPMz+Hd2uTa4tjQ +0tDN2uXlZlVMSEZIWmh16evfztt3aFpPUE1ISlBd9NfX3O5oXE1PW2B969/X0s7Lztbc4ehf +UlVVW1pi5uvc193T2NfPz9Tc43tjV0RLT0xRTVBl++De2tDc92hcZ1hPXlt429TP2NdrVEtM +UllraPDh4ePV1+PqaG9ZYfhza+fc0snK1PV0X1Rbb+zi2/RtdGJeYVlvZ1/v5tfNysTFzc/Q +0dTo3ftfX2BaXVhOUEpOVk9ea1lfZnVxbGNhVlpnYVteZW71bvplWFVUXeXUx8K9ur3Cz2pN +R0hHSk5b5NDHwby+zfVSQ0JERU1Ye9vOxcLN3XdjWUtFPj9CQ0xz7uzl2d/7+W9sYO3c3M/Y +29v6d19keWz73uHZ3O1kY2xp9G72917349rP5HpmU1hXW2dfetnc2t3ocmXmy87JxsjKz9TV +0+VlTUhRXFz4fPvl93FNQDs4Oj9IVOnNwr29vMTbbklAQD1AQ0pb3cm9vsDH5mlcS01NUm7c +y8LCyszO1d3d3N5tbF1T+PFkWExJT1nx3dfMysvXflI/PD5CR0tYftvOyL6/y3tOSklLT1Jc +/N7W2NzgWVT25+TT1NPb1M3W52hOQkZOWfra0MzHxdLcb1A+QENAUGPZzL+2t7/Oak1JTlti +9djKxry7wclkQz46OTk4P0/sztbb5e9wY/J2UkxITFz18GVsT0lMXtDLyMTCv7/Dz/dRRkxV +X2JwzsK7uby+31FIQEdMTkxV9dnO1thhSD5GVlRMSE5yyMTIze9eTk3v2t/a9P7e/e5vSkM9 +TFp9z8W8t7XAyM9UPDM1PkBFR1i+r7CytchcPkdPREFHUV95c97O5V9c3MvPysnVzMfKyc5f +R0Re1t/S09Pb3GhEPzw7ODc6QVjUw7+8vcvrRzIxPFzv7NzaxL68ubrLTz07R0pMYszAwcXL +x9NzUFV+73PkdOn4/2hNQzxCYtXPysi/vsbJ315MNjA0OlrRzcTBvr7X4WxPQDU4PkV3wcjP +xsfJz1pNTlTieejM1dbFwcrZbu5dVXBaUE1COkpdX+ns2NXWv8bVzXpLV+P0fk5CRl/FubSw +r7e7vsxuRjowNDg6yaivKRcVHsyhmpqfoqlBGxMSIE64rKqquTgsNFu1r7CysrrSUFLdv73a +PT3MxLVEFBARH7GflY6OlaM5GxscKklvzt3w4z4tNTvOrKejqb9GLS9BRTMqKCxcua+rKxUY +G76ZlI6PlZ/FHhcaHz3JraSrudUsJCotS8+7s7e4yT0uNzg6Pi83zLu3zBYTGSKglY6Li5Cc +VBUWFx8/TLysra24P0RGSrmzsLRZMCQdIS01QjwrT7zEwhoKDxRNmZCLiYyUoiQWGRk6wa2d +mp6rVygtLEHEtqimsto7LSwuMDYsJDFDTFwYDRcgq5iSjo+WqS4PEBgmuKKamJijvCocHB9G +sqOdnaxdNCguOz4+OkDGs61WDgoOH6eYkY+Ok58wFRgbLeXDq6arvVcsLjTTpqGdnatZJhsb +JUC3sK6/Wrmw7RIFBQ3ul4uJh4iSuxUNDxcnO7Wkm56qWyMfIi9et6mipbJtPVduUE0/Nyoa +FyuznrkYFBq5lZKPk5Wfxh0VGiqxq6Kio6xHGxAVHC7sqJiUl6pILCgnKzdIaE40KCIoS6aa +qRgMDh+mlIuLio2bOxIMCxgvxqaZlJuqKxsaGx8qzqKZm6Kzelo4LS4pJyUkKDXIpp2Xk5ko +CwgLN5qLh4eJj60WCgcNGiZvraCouC0bGhonQrKemZujvkFLVua6u7/lKxwdJ2G7r5+WkdcU +DxDLmY2LjJCctBQKBw0iQLy1qa2vMhkaGizKpZmXn7k5Jiwz6q6tr8owIR4hPMKvp6WdkkUS +ExK0ko6OkZmm5g8MDBE6vauor1E+IRQWHEyek4+RncEqHCM9v62xv0wsKCw/wb3StbGfli0a +GB6cj42Sm7reHwoMDiHCr6qpwTIdDhMi0JuRkZah3C4gJUXYvc1GOzc6SubDvcXPr51OICAk +nI+OkJq01B0ICgoauZ6YmqO3TxwVFh7TqJ6cqLdpNDpXclQvJCYuU7mrn6GinScNDQ1QkomG +h46Zwg8JCA0i3qidnqu2KhkYHE+ooqa4Sjg5VrOttPYmHh4eLMiel5OTIw8PE7OTioiKlJ1j +EhMNFjBJxrm/Ry8ZGBslvJ+YlqBNKR8fNGK3sMhBLCg17K6alZG2DQsLI5qMhoaLlaMbCwgI +HEysoqCu0icRExcsu6KZmJ+6RCgqOGC8wGI2JydCv6qfnZybJAoJCjqYioWHjJGqEwoHDSzS +qaWnsdcfEhESK6uZk5SfvjMeIjmynqG3Oh8bJD6vn5+Zk64VCQYWrJKJiYyOmykPCgwf9Kae +o6vKKBIODx67nZSUmac/GhUcO6WamqNVIBwkXq6kmpSnGQsHE72ZjIuNj5wtEgsLHkiupams +vSwWEhMlvZ+VkpagcR0XGzijl5ae7CIdIkWmlpVREAoLJrSZj42OlrccEw8ZOsmsp6iw8B4U +EhYrw6SamZuhvyscGyi/npicsT4iHCfQn5KSRRILCymul42MjZCqGxANFTXOqp+dpr8fExET +J8unm5mcor8qHxwjRrOfnaa/OiglKTaxmpGeGwwIEl6fkIyLj5o2Ew4PIVe0o5+kvCwTDhEc +Y6aZlZadsjchHyZFsKOforJBJx8oPd2/v7Sdk7ATCAUYrpOLjI+VqxwOCxE8r6Cgq802GxAR +GEKelJCUnrRSJh8oS6ibmp61NiIcHixMxr28rpqdHgsFCjqdjYmMkpw7EQ0OJKydmZ2vSyUS +EBcqp5aSk5yv2isfJC66npqcqjgfGhskO8avsKWYuRIJBRC8l4uJjpakHw4MDSe0oJuftUQk +FRUZKqiWkJGZqcAxHx4kyZyVlZ9OJBkYIUO4r7ekmTwPCAUbqpKKjJKZuRUMChBOqp2dq+Uy +GhEWHseYkY+Unq5dHhccPJyQkJe3JBcSGTmzpq3DopspDggJOJuOio+boD4PDAsasqKanrZO +LBcTGiarlZCQlp68IRATKaSPjpWnLxcPEyPKqa1xUJ6fGw4JEaaSi4uUnqcnDQwLIaqhm6PC +PioXExssopOPjpWrMRUPH8ebj5OezRwSExtZpqbBMDKqmzsRDRGxko+OmKGoMw8NDx+roqKq +20QtGxggO56PkZSmQyccH06pm5mrPCEZGyVKrqi6OS3LnJ0gEA8fmZKPk5yjuh8NDxY/oqaj +r85LJxgbMrCXlZykvkMtKT2yp6zpJh4eIC1Iw7bN6cOjmx4ODxadjouMlJ+zJwoKDR2qpJ+m +tl8wGhQhWpmPkZio3zstLdquqa82HxwdKETGr7xS2KabKA8OFZ6Pi4yXoLgfCgkLHa2knqe3 +yzYaExkunY+OlKXNOyorYK6ho9QqHR0pSLiqt7ulmq4PCgofmIyHi5KauBUGBgotq5+cqbFc +IBIRGu2ZkI6VpVsjGyXrpJmcsTIcGh81uKm0wKiatxMLCSObjoqNlJu6FgkIDTGuoqCtuksf +EhIa3pqRjpKjTx8YIn6jlpimPx0aIDm9sqmcmNwOCAkknY6JjZKb3hMJBw46rp6dqrc/HBAP +F0qckY2PlKAxEg4Y75iPkJxTHRQWKMquqaCZpRoMCRWrkomJjZSnHwoHCRvLo5icpb8lEQ4R +JKmWjo+Um7MiEA8cuJaPkZ9DGxIVJfGvpZuZQRIKCiqjkIqMj5jGFQsJEDmynpufrUMbDw8V +NaSVjpCYpGMkHBonxKCWlqDXJBkaIDfBr6udmUwRCQklpI+JjI+ZTxELCRVQrZudqcIpFQ8Q +G8Oaj46UnrcwHR0n26OcmqC/MB8bHyxjta6zvq6bvBUNCR+fkIuOl5+8Gg0MEVqmnJ2v9TEd +FRYdu5iSkZut8y0fHynTn5udrD8pIR4nO8WqqbtLMT6lmjMUDA7enZSUm56g7hgTDyW0rai5 ++WE/IhweMKealpigqrdJKykvw6Kcn7cwHx0dKD/KsLPBQickLfadnSgWDRLbqpmUlJWZyB4a +Film4rq+vsBWJCElNrGknZ2hrLpCLTI8uqWhp8A3KSUnNUpj1G5ROisqMMmanikYDBmtm4+O +kZSaPxkUDyQ/1rrHzNc7IyQmS6uhnZ+quNczLzhTsqyvt9RENCklKjFH82BLPT5lrperGA8L +I56Qi42QmKIjDw4PLMqzrrvWSyoZGh9XoJiWmaKv2i8qKz23pZ+gs0YmGRkdKvq3ucvatpy8 +DQkHHpiMh4qPnLEXCwsPWZ+YnKzgNB0RFBzDl46OlJ+vVB0WGjeej46Xwx8TDhIeT6qjrsO2 +n68UCggZno2Ii5GfxRcLCw47o5iZpdgqGw8QGECbjoyPl6ZCGQ8XO5yOjZSzHxANFC2unKLq +Okq3ni0NDQ+vj4yMk56/Lw0JDBi1oZyjvTsoGxMZJ6yTjo2UpT8dGSuvmZOYpy8TDREhvJ6d +qzwqXtSpnhgPFBielpCOk5/HKQsPEx+wua65czYsHhst9Z2UmJypyl1MTbmnop+4MCEcITbV +razJVTsu3Ku8mK4OFQsboJqOkpmrrB4OFQ0p4OCvyFdNQyUsOMmbl5ibr9tSOEHKxLq/RTUs +LUdz59XoYuvWTtGqr/gtHiROu6qor661TC8oJi4/SVNYT048MzleuqunqKy4/z05O0ZbeN/J +vLzgVEY9xrdTqJsrFQ4MPpeNio6itC0PDg0Xv5+anLZGLBsZHjakmJidtkNEUMmtr8NBJCMs +Pb+0uK+doqOZHAoKDMmNiIiNplgfCQgLFsKfnZ+5LyETEBs+nI+PmLYxLTrbrKmzcigfJzK/ +qKmnoaydpQ8NDhuVi4iJkKhaFQMHChmxpp+oYy4iFRUiQJ2SlJmrTzkvSLOsq7k5KSYpS7aq +rLyxo5S1DQsKLZKKhouSolgPAwYJL6iioMlAKBwQEh7Tko2NmcwqHRwru56UmK0vGx05r52f +raGcmi8JBwzEj4iGjJOsJwgDBhWvnZmofi0aDwkPIqSPjZCerGMhFRcun46Nl8UgFhYotJ6d +np2YqA8GBRKijYWHi5W3GgYFCSOmmpipUSITCwsUO5iNjJGiXiYaGSm7mY+Rm88lGxwq3Kql +rMC3oKIfCwcNu5SLi5OdvSENDA8qopuZrTcfFhARHeaWjIyUszQfGhwqwJyRkJm+IRUTHEui +k5CbZxsTGDifkJ4lEAsYO8SfmJKSnjAZFRgsPdu6trj8Kx0dJuOooZ+jqLhCKyk5u6OenqO3 +ZDQlICIuz6qmq8Q8KyUoN1zCwbSTmiMQAwkxoI2KjJGYLg8KCB++nZadreYmFBIVMJ+SjZGe +sk4oJytjoZqZn1MjGxYZHi2/qKauQSMdHit4r6Ojr18uKayVxyoRDuuilZafpqZcHRoWPKKc +mqxpSjEkJCnYnJaXo+o4LSQkKT6yqrFbKB8dGx0lPrGkp7k5KSgsRr2so6Ktt5yXTxcLC0OZ +ioiNl6Q/EgwLFdyjmZ7HMiUbGBwrq5WQlKRfLyQfJTWznZylQhsSEBgvtZ6crD8iGx83uJ+c +m4+VJg4HDcOThoWKlKQlDAkIGcykmqXfNSUaGyJSmo+Olqw/LCgmLU+qm5unNxsWFx86u6ir +cyoiJjfyt6eVrRsVDS2ekIuQl6bMGhEPEzzEq63iPTAoJjnZn5WUlaDPLB4fRKWWkZzrHA4O +EyPIqarBMiMjLUnXtq+bkzMWDxCulIyLk5/DKQwLDBnCr6KxSDYqIylYp5KOkpu7Rjk49q2m +qL4tHhgZJTrJuO4zJyc4yrm8tq2wuK/SMiAWI8aZjo+Wti0TDA0SLrGenKO5Szkzb62emZuf +rLrEw7KtuFAlHCEmKC0+7FQtISY278PG3czJy7/GvK2+TzsrMei4p6S110UwLCkoLDZH0MfH +yM+/vbuuqamqrKyssrrTaUU5ODAuMS4uMj1nUzEpLkJZW9mupLwtIjOuoq1gNSs1Vdeurb3F +YjkvKCs4TX3W18bCu62rq6uusLK0r62zyVI8OUNIS0UvJCImKi00PEqysT81O9LCJxkmro6H +iZOrNR0WERUfPrKrvD0oJC/Mp5uXm6W1wsC5sbloKhsaIUC/7jk9qbGvqQwDCAuri4aBiZat +JAsMFCKgnqCkOigeFhkquZaOkZq/LCYpU6+nquQhGRsnzq2ypqOemBoJCw+fioaFj59HGAgF +ChS5o6SsKyYdFxoj6ZyPj5SoPCcdKbqbj46ZzR4UHEOom6TUXtirzA8NDi6RjImPnLUsEQkN +F8iep7QpHBgQEBg6n46Olak7MigmL2ujlJOeySMcIzm0o6Sora6rGwsMEKyQioqSoG0eDAwQ +J6Scm60zHxgTFSBYnJGRmbkzJyElOMKgmZqlUSUfJDjHr6mswee+qMsaDw0koJKNlKHENRsU +Fh+1nZqjRR8ZFhceM6qUj5OjTSkjKjrZrJ2ZnLEuHBodLWu3pp+juy8fHyxUt6qqqJ2XUhAI +Bh+kjomNlJ9+FQ0LFtijmqLqMCMbGR01pJSQlKdXMSgpLEWunJmfxicdGx4qP72loaprIxwd +JD+5pZ6eqFglHB8+rZ2UjqofDQYUM6OQj5GZsCQXEBhGrJucqcc2IR0dKLmemJmo2DQnIyYu +7KujpcEsHRocIjPGpp6grUYoIytfr6WforM/JyQwx6GTl0wZDRA0rpmTlJmkSB0XGCvJr6iz +zkwvJiYra6adnqfHQTApKC1NsqiqyS8iHyEqOua+veY9MTdlw6qblqsdDw0mpZKMjpSfyCAV +ExtOsqetXjAnISApSqeYlpqtUy8lJCv0ppubrC0XExYfOb2rrmEpLkyktxQTEumOioiRonYu +GREYIK+cnqo0HhsdIC/GnY6Pl64rIic3uaCbm6k2GxMVI16vrXYnHh8rXbadrB8cFUiVjoqP +nLk6HBUYG1yvrK86JiIjJjjCoZaXnrk6LjJOvrKvtFAqIB8qRdLDejw0NEBwuauhlr0VEQ9B +lI2KkqHEKxEMDRZXq6SuQi0rJipNqpaPkp7MMSs07LettVwrIB4iMGu2tUwsJy1vuLStra+v +r20eFhtLl46Ola42Gw4MEB/Bo6Or5i4rK0avnpeYo7pRP+y7rq3MOSsoKjM/9cDKXD88S9nL +vMM/Tsi7rbLU8EgrJB8oyKOcnq5lKx0ZGBwqS8OyvM/eY862qJ+eo6uvrqqsrbhWMCgnMElP +TjYqNTE1Ti49a8WcpzoXCxNOlouKkJ/LIBQODh35pZ6uQi0kHyQ3q5aPkJy3TELLrau03TQp +IiMsQc/C+DcqO063lz0PEQw7lI6Kjp21NhQMDxRUp6ml4DMvJyY6y6SSkZemOyoyU6+hn6C2 +Mh8cJkm9rLQ9IyRKr5m+Dw4NMpWQjJOhwSsUCw8XVqWtrzchHxobKMuejo2Rm7jcR0XcvKqf +oq52KyUoNeHBwtJOPjUrMWCtmywPDg3bnJSPm6a6OxgUFB/DurZOKSoqJyg4vpuUlp212+Xf +zrqpm5WarS8bGyIz6b6zv0QtIiU6xaGgHxAMD86fko+UmqJSGhQSJuC/uXY9MSomKju1mpSW +na/C6EdGz66gn6jANyghICYz3q6ruzwgGRohNt+xnpWmHAwGE8iXi4uOlaQoFQ4TM7iko7dU +NCQeHyuumZKTnK/jPS8vPr+mn6O9Lh4aGyAsTbCorugoHBodKVOun52gszcnKDW9qqWkoZat +GQ0GFLuWi4ySnbUfEQ4VUqSYmKfOPScdHSe/nZeZqU4uJyQnL2iqoqnNJhoZGyU3yKSdnq5C +KyozZbiooJ+ozy4jIi1auaumqK/ONCQiKz++qaantUstJSYwVsS3vc7PpaodFA0YqJWNj5uu +cB8SEhY/pJ6fvi4lIB8nOa+XkpajVi0rLDl4t6Wfps0pHBsfLE++rKau5y0iJjHlsKmoqrLW +NigsULSmpa/bPC4uMTlrqp4zGA8RzZ2TkZifr0IcFhYmwa6pukg3MiosPbuemJmiu1tEQUhs +wqulq9coGxsiNceysbxMLiQmMtKtq8REV7ObwBEOD86OioqToMEtEQsOGc2oqcgwKisqLF2p +lo6SnrxFOjk2O166q69hJRoaHy5P1MzuQjQwOti6r66up5maMBUOGKaTjY+csjgYDQwRLayl +psc7Ni4vP7adkI+asjMoKzjFq6iuXCMXFRkq5bS2TiolK0a+raurtOi5pZmdJBERIZ6Rj5Of +vy4WDQ8aPailrbpvST476KublZmivEo6Pl3Ny0ktIB0cIS5K8VQ2MTg/Y9DAt7Gwr7XuPee5 +pqHYNzsySGpMxLK/xU8xNTI1T9m5r7m+yV5KQkrAr6+zxXFSRlHX6VA3LTEzOWja1kQtM0jv +0c7Gu8JOQ269sL1XU8q4uUI2Ly5DaLuorMHuSEBaSne5tMNWPT5NZ9rDvbm/1dPJvrm+5l1R +RjwwNUr8WzksLTA2Rlq4uFI+QEy5r7qvucHMIBok1piPkpy+Kx8ZGSI0yK+z3T0tLlOzn5yf +qb5hY+jIvsk+JBwdKlTD0EE5MzA4VbiioZ6eHQsOFaKKiouVszYZDhIfbJ+hu0ojHR8hPKua +kZKhSCIcKs+onZ+1Nx8bHy/itrPhMiUnNtOnoZ6YLQ4TENCRlI6YtW8gExQcK7uty9QvKDgx +z6KZj4+Yp80xMEBUv7i5vE4sIR8mLjtPTz82LSsvNU/CvZ+cJxkVE7ScmpKesM4jFhkeNa6u +t7FMP1g24qyelpaeqr5KTE5rs6mnqtopHBofLT/dy1kwIR4iL2/JxsanmzgXEhC2mZiTnqm3 +LxoXHDGsqbG1QjU9L0O7pZmWnKez2mxRTb2uqqu/NiMcHSMtRfvO0zwnHyIuT7qvrrC6yOrS +oqUtKh83nJ+ho3dHLxseJDKyp7G57jxGQz7QsaefqsD3PjxGRWvKys1fMygkJCw3SdrCwtBZ +Q0FGbcu6sa6vv87sXG3SuK64zE9LS0VEvaBOHRsVUJ+nm5+zq0wfHx8qzcHUzVQ7QjM4ybio +oa7JWTk2My46Y8m6xV1LOzU5Q3W9tLW5yvRUUvXNwbmxsrjKTDc3Qu/DwMHeYlA/TFrnxsSl +nEAfGhVqp62dprivOiAmJTi8yVzaQDQ1JShJxKigqK/DPTYwLkfQvLC40lg8NTQ4X72zr7fJ +Xj8/SPXBu7e1tsH7RTxN38/Ky8xpOjBZrkceHRxknaakp+xSMBsdJjHBs7u1u9bQVj7Qs6yo +s9fzRTg6Ola/vr/LT0U5MDU+f726u7/qVkdN7MK5u7vFzGNAOjXco8YnJB9enqurqMG8TR4j +LDfAvs25uc7TTkXHubSwv9bqQzg1N1DmaU49ODYuLjU9X9rm1ehWY9a8sa+3vr66qZyuKiIf +NqiurqGvvmseHCkuWM9by8lEOjM00q+rpqettXswMDA0RUJJbk0+My45S3jg8FhaXlPbwLe1 +u8jOv7KfoywfJyqvo72nqVdWJhcmOlKwsLepuEE9ND2+tbSsrrrDSTQ4ODxCOj1DODU0O1zM +wcfO2ODp7N3LwLy+y83KyNxv46+fuiUiIzKwvtKru0lBIB43PF+4xLetyU9MPm+3ubWtsbzO +OjM/PUpWTnv5Oy4wNEJke8/LzNT8fc++urrDx8DBytXoY1nOrrspHyMswLPErKrLay4jPOLZ +uLi6sMY8Pj5C0MfHub77QTEuNj9P6tPM4Ec2Nz5iz8e7vMj3VFRtzsa/wL+/ycvLztLX5GzL +rK1JKSox7sTOvLK5zEIsOFpm1MbLv9U1LjE4R1dRdeNdQzk7S19YZnTb12RJUdC/vb7Av7/J +cG3Vv77H0c/N0GhOVvvjbuft2sXA0DwxMjxh08zBvdlNPztEXmzo2c7cVUNLV05WVGXf+llO +UXTZ2d7c2dXvXmzu7Ofe4dva7ubazsbLzNXV3PNwWm9/9N/lz9Th2VxPSEVKS1hg9dXOys/T +1Otw+G5sd1lWTkpZWFtu8O7scl/q9G5tZFtoa1xfXVNWYvTf3+vl9mlcWmNo5tPOzczQzsvM +y8/R6Xp6WE9OTE5PTVRo9mZiX1xibnv3cX7ebFthWV9cXWFcWmr1fuDX19Pc5N/a39nP2N7t ++m1sbmlmdv14e9/U1NfV09Hc4+tnX1pJREVFSU1QWGzk6ere6mM= + +--foobarbazola-- +--16819560-2078917053-688350843:#11603-- +--owatagusiam-- + diff --git a/tests/tests.cc b/tests/tests.cc @@ -0,0 +1,25 @@ +#include "framework.h" +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <sys/stat.h> +#include <sys/types.h> + +int main(void) +{ + setenv("BINCIMAP_LOGIN", "LOGIN+1", 1); + + FrameWork::setConfig("Mailbox", "path", "Maildir"); + FrameWork::setConfig("Mailbox", "auto create inbox", "yes"); + FrameWork::setConfig("Mailbox", "umask", "077"); + + FrameWork f("../src/bincimapd"); + + f.test("", "1 OK LOGIN completed\r\n"); + f.test("1 NOOP\r\n", "1 OK NOOP completed\r\n"); + f.test("1 CREATE INBOX/TestMailbox\r\n", "1 OK CREATE completed\r\n"); + f.test("1 DELETE INBOX/TestMailbox\r\n", "1 OK DELETE completed\r\n"); + f.test("X LOGOUT\r\n", "X OK LOGOUT completed\r\n"); + + return 0; +}