[CalendarServer-changes] [5920] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Mon Jul 19 18:28:11 PDT 2010


Revision: 5920
          http://trac.macosforge.org/projects/calendarserver/changeset/5920
Author:   glyph at apple.com
Date:     2010-07-19 18:28:10 -0700 (Mon, 19 Jul 2010)
Log Message:
-----------
Merge new-store branch.

Modified Paths:
--------------
    CalendarServer/trunk/calendarserver/tap/util.py
    CalendarServer/trunk/calendarserver/tools/test/test_purge.py
    CalendarServer/trunk/calendarserver/tools/util.py
    CalendarServer/trunk/test
    CalendarServer/trunk/twext/python/datetime.py
    CalendarServer/trunk/twext/python/filepath.py
    CalendarServer/trunk/twext/python/test/test_datetime.py
    CalendarServer/trunk/twext/web2/dav/element/base.py
    CalendarServer/trunk/twext/web2/dav/method/proppatch.py
    CalendarServer/trunk/twext/web2/dav/method/put.py
    CalendarServer/trunk/twext/web2/dav/test/util.py
    CalendarServer/trunk/twistedcaldav/__init__.py
    CalendarServer/trunk/twistedcaldav/directory/addressbook.py
    CalendarServer/trunk/twistedcaldav/directory/calendar.py
    CalendarServer/trunk/twistedcaldav/directory/principal.py
    CalendarServer/trunk/twistedcaldav/directory/test/test_calendar.py
    CalendarServer/trunk/twistedcaldav/directory/test/test_guidchange.py
    CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py
    CalendarServer/trunk/twistedcaldav/directory/test/test_proxyprincipalmembers.py
    CalendarServer/trunk/twistedcaldav/directory/test/test_xmlfile.py
    CalendarServer/trunk/twistedcaldav/extensions.py
    CalendarServer/trunk/twistedcaldav/ical.py
    CalendarServer/trunk/twistedcaldav/index.py
    CalendarServer/trunk/twistedcaldav/method/acl.py
    CalendarServer/trunk/twistedcaldav/method/copymove.py
    CalendarServer/trunk/twistedcaldav/method/copymove_contact.py
    CalendarServer/trunk/twistedcaldav/method/delete.py
    CalendarServer/trunk/twistedcaldav/method/delete_common.py
    CalendarServer/trunk/twistedcaldav/method/mkcalendar.py
    CalendarServer/trunk/twistedcaldav/method/mkcol.py
    CalendarServer/trunk/twistedcaldav/method/post.py
    CalendarServer/trunk/twistedcaldav/method/propfind.py
    CalendarServer/trunk/twistedcaldav/method/put.py
    CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py
    CalendarServer/trunk/twistedcaldav/method/put_common.py
    CalendarServer/trunk/twistedcaldav/method/report.py
    CalendarServer/trunk/twistedcaldav/method/report_common.py
    CalendarServer/trunk/twistedcaldav/resource.py
    CalendarServer/trunk/twistedcaldav/schedule.py
    CalendarServer/trunk/twistedcaldav/scheduling/implicit.py
    CalendarServer/trunk/twistedcaldav/scheduling/processing.py
    CalendarServer/trunk/twistedcaldav/scheduling/utils.py
    CalendarServer/trunk/twistedcaldav/sharing.py
    CalendarServer/trunk/twistedcaldav/static.py
    CalendarServer/trunk/twistedcaldav/test/__init__.py
    CalendarServer/trunk/twistedcaldav/test/test_DAV.py
    CalendarServer/trunk/twistedcaldav/test/test_addressbookmultiget.py
    CalendarServer/trunk/twistedcaldav/test/test_addressbookquery.py
    CalendarServer/trunk/twistedcaldav/test/test_calendarquery.py
    CalendarServer/trunk/twistedcaldav/test/test_collectioncontents.py
    CalendarServer/trunk/twistedcaldav/test/test_index.py
    CalendarServer/trunk/twistedcaldav/test/test_mkcalendar.py
    CalendarServer/trunk/twistedcaldav/test/test_multiget.py
    CalendarServer/trunk/twistedcaldav/test/test_props.py
    CalendarServer/trunk/twistedcaldav/test/test_schedule.py
    CalendarServer/trunk/twistedcaldav/test/test_sharing.py
    CalendarServer/trunk/twistedcaldav/test/test_validation.py
    CalendarServer/trunk/twistedcaldav/test/util.py
    CalendarServer/trunk/twistedcaldav/vcard.py
    CalendarServer/trunk/twistedcaldav/vcardindex.py
    CalendarServer/trunk/txcaldav/calendarstore/file.py
    CalendarServer/trunk/txcaldav/calendarstore/test/__init__.py
    CalendarServer/trunk/txcaldav/calendarstore/test/calendar_store/ho/me/home1/calendar_1/1.ics
    CalendarServer/trunk/txcaldav/calendarstore/test/test_file.py
    CalendarServer/trunk/txcaldav/icalendarstore.py
    CalendarServer/trunk/txcaldav/resource.py
    CalendarServer/trunk/txcarddav/iaddressbookstore.py
    CalendarServer/trunk/txdav/idav.py
    CalendarServer/trunk/txdav/propertystore/base.py
    CalendarServer/trunk/txdav/propertystore/none.py
    CalendarServer/trunk/txdav/propertystore/test/base.py
    CalendarServer/trunk/txdav/propertystore/test/test_none.py
    CalendarServer/trunk/txdav/propertystore/test/test_xattr.py
    CalendarServer/trunk/txdav/propertystore/xattr.py

Added Paths:
-----------
    CalendarServer/trunk/doc/Developer/Calendar Store API.graffle
    CalendarServer/trunk/doc/Developer/Calendar Store Schema.graffle
    CalendarServer/trunk/twistedcaldav/directory/internal.py
    CalendarServer/trunk/twistedcaldav/storebridge.py
    CalendarServer/trunk/twistedcaldav/test/test_wrapping.py
    CalendarServer/trunk/txcaldav/calendarstore/postgres.py
    CalendarServer/trunk/txcaldav/calendarstore/postgres_schema_v1.sql
    CalendarServer/trunk/txcaldav/calendarstore/scheduling.py
    CalendarServer/trunk/txcaldav/calendarstore/test/common.py
    CalendarServer/trunk/txcaldav/calendarstore/test/test_scheduling.py
    CalendarServer/trunk/txcarddav/addressbookstore/
    CalendarServer/trunk/txcarddav/addressbookstore/__init__.py
    CalendarServer/trunk/txcarddav/addressbookstore/file.py
    CalendarServer/trunk/txcarddav/addressbookstore/test/
    CalendarServer/trunk/txcarddav/addressbookstore/test/__init__.py
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/1.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/2.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/3.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/3765A955-1B96-41EA-994D-335192BEDCCD.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44745975-AE6D-4FB0-80A6-A298427E047A.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44EE78BF-8814-4471-899C-92280CEFB098.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/8424B7F0-C878-4722-B522-EBB07CF48AD7.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/934731C6-1C95-4C40-BE1F-FA4215B2307B.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/AFBB77B8-0438-4825-A1DB-A75D76B6C3A8.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E2.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/F0A6918D-8E09-43FA-9684-226810B8A96F.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/FCBA0FA3-00B2-4C95-B4EC-4CCC4843F8B1.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_empty/
    CalendarServer/trunk/txcarddav/addressbookstore/test/common.py
    CalendarServer/trunk/txcarddav/addressbookstore/test/test_file.py
    CalendarServer/trunk/txcarddav/resource.py
    CalendarServer/trunk/txdav/common/
    CalendarServer/trunk/txdav/common/__init__.py
    CalendarServer/trunk/txdav/common/datastore/
    CalendarServer/trunk/txdav/common/datastore/__init__.py
    CalendarServer/trunk/txdav/common/datastore/file.py
    CalendarServer/trunk/txdav/common/icommondatastore.py
    CalendarServer/trunk/txdav/common/inotifications.py
    CalendarServer/trunk/txdav/datastore/
    CalendarServer/trunk/txdav/datastore/__init__.py
    CalendarServer/trunk/txdav/datastore/file.py

Removed Paths:
-------------
    CalendarServer/trunk/doc/Developer/Calendar Store.graffle
    CalendarServer/trunk/doc/Developer/Repository/
    CalendarServer/trunk/txcarddav/addressbookstore/__init__.py
    CalendarServer/trunk/txcarddav/addressbookstore/file.py
    CalendarServer/trunk/txcarddav/addressbookstore/test/
    CalendarServer/trunk/txcarddav/addressbookstore/test/__init__.py
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/1.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/2.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/3.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/3765A955-1B96-41EA-994D-335192BEDCCD.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44745975-AE6D-4FB0-80A6-A298427E047A.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44EE78BF-8814-4471-899C-92280CEFB098.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/8424B7F0-C878-4722-B522-EBB07CF48AD7.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/934731C6-1C95-4C40-BE1F-FA4215B2307B.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/AFBB77B8-0438-4825-A1DB-A75D76B6C3A8.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E2.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/F0A6918D-8E09-43FA-9684-226810B8A96F.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/FCBA0FA3-00B2-4C95-B4EC-4CCC4843F8B1.vcf
    CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_empty/
    CalendarServer/trunk/txcarddav/addressbookstore/test/common.py
    CalendarServer/trunk/txcarddav/addressbookstore/test/test_file.py
    CalendarServer/trunk/txdav/common/__init__.py
    CalendarServer/trunk/txdav/common/datastore/
    CalendarServer/trunk/txdav/common/datastore/__init__.py
    CalendarServer/trunk/txdav/common/datastore/file.py
    CalendarServer/trunk/txdav/common/icommondatastore.py
    CalendarServer/trunk/txdav/common/inotifications.py
    CalendarServer/trunk/txdav/datastore/__init__.py
    CalendarServer/trunk/txdav/datastore/file.py

Property Changed:
----------------
    CalendarServer/trunk/


Property changes on: CalendarServer/trunk
___________________________________________________________________
Modified: svn:mergeinfo
   - /CalendarServer/branches/config-separation:4379-4443
/CalendarServer/branches/egg-info-351:4589-4625
/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
/CalendarServer/branches/users/glyph/sendfdport:5388-5424
/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
/CalendarServer/branches/users/sagen/locations-resources:5032-5051
/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
/CalendarServer/branches/users/sagen/resources-2:5084-5093
   + /CalendarServer/branches/config-separation:4379-4443
/CalendarServer/branches/egg-info-351:4589-4625
/CalendarServer/branches/new-store:5594-5919
/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
/CalendarServer/branches/users/glyph/sendfdport:5388-5424
/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
/CalendarServer/branches/users/sagen/locations-resources:5032-5051
/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
/CalendarServer/branches/users/sagen/resources-2:5084-5093
/CalendarServer/branches/users/wsanchez/transations:5515-5593

Modified: CalendarServer/trunk/calendarserver/tap/util.py
===================================================================
--- CalendarServer/trunk/calendarserver/tap/util.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/calendarserver/tap/util.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -40,6 +40,7 @@
 from twistedcaldav.directory import augment, calendaruserproxy
 from twistedcaldav.directory.aggregate import AggregateDirectoryService
 from twistedcaldav.directory.digest import QopDigestCredentialFactory
+from twistedcaldav.directory.internal import InternalDirectoryService
 from twistedcaldav.directory.principal import DirectoryPrincipalProvisioningResource
 from twistedcaldav.directory.sudo import SudoDirectoryService
 from twistedcaldav.directory.util import NotFilePath
@@ -47,8 +48,7 @@
 from twistedcaldav.notify import installNotificationClient
 from twistedcaldav.resource import CalDAVResource, AuthenticationWrapper
 from twistedcaldav.simpleresource import SimpleResource
-from twistedcaldav.static import CalendarHomeProvisioningFile,\
-    GlobalAddressBookFile
+from twistedcaldav.static import CalendarHomeProvisioningFile
 from twistedcaldav.static import IScheduleInboxFile
 from twistedcaldav.static import TimezoneServiceFile
 from twistedcaldav.static import AddressBookHomeProvisioningFile, DirectoryBackedAddressBookFile
@@ -67,6 +67,8 @@
 from calendarserver.webadmin.resource import WebAdminResource
 from calendarserver.webcal.resource import WebCalendarResource
 
+from txdav.common.datastore.file import CommonDataStore
+
 log = Logger()
 
 
@@ -93,7 +95,6 @@
     webAdminResourceClass        = WebAdminResource
     addressBookResourceClass     = AddressBookHomeProvisioningFile
     directoryBackedAddressBookResourceClass = DirectoryBackedAddressBookFile
-    globalAddressBookResourceClass          = GlobalAddressBookFile
 
     #
     # Setup the Directory
@@ -152,6 +153,14 @@
         wikiDirectory.realmName = baseDirectory.realmName
         directories.append(wikiDirectory)
 
+    #
+    # Add internal directory service
+    # Right now we only use this for CardDAV
+    #
+    if config.EnableCardDAV:
+        internalDirectory = InternalDirectoryService(baseDirectory.realmName)
+        directories.append(internalDirectory)
+
     directory = AggregateDirectoryService(directories)
 
     if sudoDirectory:
@@ -272,18 +281,23 @@
 
     principalCollection = principalResourceClass("/principals/", directory)
 
+    # Need a data store
+    _newStore = CommonDataStore(FilePath(config.DocumentRoot), config.EnableCalDAV, config.EnableCardDAV)
+
     if config.EnableCalDAV:
         log.info("Setting up calendar collection: %r" % (calendarResourceClass,))
         calendarCollection = calendarResourceClass(
             os.path.join(config.DocumentRoot, "calendars"),
             directory, "/calendars/",
+            _newStore,
         )
 
     if config.EnableCardDAV:
         log.info("Setting up address book collection: %r" % (addressBookResourceClass,))
         addressBookCollection = addressBookResourceClass(
             os.path.join(config.DocumentRoot, "addressbooks"),
-            directory, "/addressbooks/"
+            directory, "/addressbooks/",
+            _newStore,
         )
 
         directoryPath = os.path.join(config.DocumentRoot, config.DirectoryAddressBook.name)
@@ -304,24 +318,6 @@
                 if e.errno != errno.ENOENT:
                     log.error("Could not delete: %s : %r" %  (directoryPath, e,))
 
-        if config.GlobalAddressBook.Enabled:
-            log.info("Setting up global address book collection: %r" % (globalAddressBookResourceClass,))
-
-            globalAddressBookCollection = globalAddressBookResourceClass(
-                os.path.join(config.DocumentRoot, config.GlobalAddressBook.Name),
-                principalCollections=(principalCollection,)
-            )
-            if not globalAddressBookCollection.exists():
-                def createGlobalAddressBookIgnoreException():
-                    try:
-                        if not globalAddressBookCollection.exists():
-                            globalAddressBookCollection.createAddressBookCollection()
-                    except OSError, e:
-                        if e.errno != errno.EEXIST:
-                            raise
-
-                addSystemEventTrigger("after", "startup", createGlobalAddressBookIgnoreException)
-
     log.info("Setting up root resource: %r" % (rootResourceClass,))
 
     root = rootResourceClass(
@@ -341,8 +337,6 @@
         root.putChild('addressbooks', addressBookCollection)
         if config.DirectoryAddressBook.Enabled:
             root.putChild(config.DirectoryAddressBook.name, directoryBackedAddressBookCollection)
-        if config.GlobalAddressBook.Enabled:
-            root.putChild(config.GlobalAddressBook.Name, globalAddressBookCollection)            
 
     # /.well-known
     if config.EnableWellKnown:

Modified: CalendarServer/trunk/calendarserver/tools/test/test_purge.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/test/test_purge.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/calendarserver/tools/test/test_purge.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -23,6 +23,7 @@
 from twext.web2.dav import davxml
 from twisted.internet import reactor
 from twisted.internet.defer import inlineCallbacks, Deferred, returnValue
+from twisted.trial.unittest import SkipTest
 from twistedcaldav.config import config
 from twistedcaldav.directory.directory import DirectoryRecord
 from twistedcaldav.test.util import TestCase, CapturingProcessProtocol
@@ -41,6 +42,8 @@
 
 class PurgeOldEventsTestCase(TestCase):
 
+    skip = SkipTest("Needs to be rewritten for new-store")
+
     def setUp(self):
         super(PurgeOldEventsTestCase, self).setUp()
 
@@ -346,6 +349,8 @@
 
 class DeprovisionTestCase(TestCase):
 
+    skip = SkipTest("Needs to be rewritten for new-store")
+
     def setUp(self):
         super(DeprovisionTestCase, self).setUp()
 

Modified: CalendarServer/trunk/calendarserver/tools/util.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/util.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/calendarserver/tools/util.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -28,6 +28,7 @@
 from pwd import getpwnam
 from grp import getgrnam
 
+from twisted.python.filepath import FilePath
 from twisted.python.reflect import namedClass
 from twext.python.log import Logger
 
@@ -42,6 +43,8 @@
 from twistedcaldav.static import CalendarHomeProvisioningFile
 from twistedcaldav.stdconfig import DEFAULT_CONFIG_FILE
 
+from txdav.common.datastore.file import CommonDataStore
+
 log = Logger()
 
 def loadConfig(configFileName):
@@ -60,6 +63,10 @@
     class MyDirectoryService (AggregateDirectoryService):
         def getPrincipalCollection(self):
             if not hasattr(self, "_principalCollection"):
+
+                # Need a data store
+                _newStore = CommonDataStore(FilePath(config.DocumentRoot), True, False)
+
                 #
                 # Instantiating a CalendarHomeProvisioningResource with a directory
                 # will register it with the directory (still smells like a hack).
@@ -67,7 +74,7 @@
                 # We need that in order to locate calendar homes via the directory.
                 #
                 from twistedcaldav.static import CalendarHomeProvisioningFile
-                CalendarHomeProvisioningFile(os.path.join(config.DocumentRoot, "calendars"), self, "/calendars/")
+                CalendarHomeProvisioningFile(os.path.join(config.DocumentRoot, "calendars"), self, "/calendars/", _newStore)
 
                 from twistedcaldav.directory.principal import DirectoryPrincipalProvisioningResource
                 self._principalCollection = DirectoryPrincipalProvisioningResource("/principals/", self)
@@ -132,9 +139,14 @@
         principalCollections=(principalCollection,),
     )
     root.putChild("principals", principalCollection)
+
+    # Need a data store
+    _newStore = CommonDataStore(FilePath(config.DocumentRoot), True, False)
+
     calendarCollection = CalendarHomeProvisioningFile(
         os.path.join(config.DocumentRoot, "calendars"),
         aggregate, "/calendars/",
+        _newStore,
     )
     root.putChild("calendars", calendarCollection)
 

Copied: CalendarServer/trunk/doc/Developer/Calendar Store API.graffle (from rev 5919, CalendarServer/branches/new-store/doc/Developer/Calendar Store API.graffle)
===================================================================
--- CalendarServer/trunk/doc/Developer/Calendar Store API.graffle	                        (rev 0)
+++ CalendarServer/trunk/doc/Developer/Calendar Store API.graffle	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,3025 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>ActiveLayerIndex</key>
+	<integer>0</integer>
+	<key>ApplicationVersion</key>
+	<array>
+		<string>com.omnigroup.OmniGrafflePro</string>
+		<string>138.12.0.121252</string>
+	</array>
+	<key>AutoAdjust</key>
+	<true/>
+	<key>BackgroundGraphic</key>
+	<dict>
+		<key>Bounds</key>
+		<string>{{0, 0}, {756, 553}}</string>
+		<key>Class</key>
+		<string>SolidGraphic</string>
+		<key>ID</key>
+		<integer>2</integer>
+		<key>Style</key>
+		<dict>
+			<key>shadow</key>
+			<dict>
+				<key>Draws</key>
+				<string>NO</string>
+			</dict>
+			<key>stroke</key>
+			<dict>
+				<key>Draws</key>
+				<string>NO</string>
+			</dict>
+		</dict>
+	</dict>
+	<key>CanvasOrigin</key>
+	<string>{0, 0}</string>
+	<key>ColumnAlign</key>
+	<integer>1</integer>
+	<key>ColumnSpacing</key>
+	<real>36</real>
+	<key>CreationDate</key>
+	<string>2010-01-11 11:21:54 -0800</string>
+	<key>Creator</key>
+	<string>Wilfredo Sanchez</string>
+	<key>DisplayScale</key>
+	<string>1p = 1p</string>
+	<key>GraphDocumentVersion</key>
+	<integer>6</integer>
+	<key>GraphicsList</key>
+	<array>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>106</integer>
+			</dict>
+			<key>ID</key>
+			<integer>107</integer>
+			<key>Points</key>
+			<array>
+				<string>{186, 438.25}</string>
+				<string>{146.07, 438.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledDoubleArrow</string>
+					<key>TailArrow</key>
+					<string>FilledArrow</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>70</integer>
+				<key>Info</key>
+				<integer>8</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{66, 425.05}, {79.5703, 26.4}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>106</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Attachment}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>98</integer>
+				<key>Info</key>
+				<integer>1</integer>
+			</dict>
+			<key>ID</key>
+			<integer>104</integer>
+			<key>Points</key>
+			<array>
+				<string>{408.997, 78.8045}</string>
+				<string>{464.075, 121.102}</string>
+				<string>{448.5, 214.75}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>Ball</string>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>100</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>97</integer>
+				<key>Info</key>
+				<integer>1</integer>
+			</dict>
+			<key>ID</key>
+			<integer>103</integer>
+			<key>Points</key>
+			<array>
+				<string>{347.859, 78.8099}</string>
+				<string>{293.5, 121.75}</string>
+				<string>{309.5, 214.75}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>Ball</string>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>100</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{325, 31.5}, {106, 47}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>100</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 IDirectoryRecord (from directory services API)}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>68</integer>
+				<key>Info</key>
+				<integer>8</integer>
+			</dict>
+			<key>ID</key>
+			<integer>98</integer>
+			<key>Points</key>
+			<array>
+				<string>{405.638, 178.64}</string>
+				<string>{448.5, 214.75}</string>
+				<string>{488.5, 248.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>Arrow</string>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>86</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>72</integer>
+				<key>Info</key>
+				<integer>7</integer>
+			</dict>
+			<key>ID</key>
+			<integer>97</integer>
+			<key>Points</key>
+			<array>
+				<string>{347.07, 179.741}</string>
+				<string>{309.5, 214.75}</string>
+				<string>{267.5, 248.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>Arrow</string>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>86</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{326.25, 121.75}, {98.5, 63}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>86</integer>
+			<key>Shape</key>
+			<string>Octagon</string>
+			<key>Style</key>
+			<dict/>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Home Factory\
+(API entrypoint)}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{537, 286.75}, {6, 18}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>YES</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>14</real>
+			</dict>
+			<key>ID</key>
+			<integer>84</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Pad</key>
+				<integer>0</integer>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs30 \cf0 *}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+			<key>Wrap</key>
+			<string>NO</string>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{150.5, 499}, {401, 42}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>Vertical</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>ID</key>
+			<integer>83</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Align</key>
+				<integer>0</integer>
+				<key>Pad</key>
+				<integer>0</integer>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
+
+\f0\fs24 \cf0 *: calendars will have multiple calendar homes, and addressbooks will have multiple addressbook homes, only in the case of sharing.  one home will still be the "primary" home.}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{238, 286.75}, {6, 18}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>YES</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>14</real>
+			</dict>
+			<key>ID</key>
+			<integer>82</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Pad</key>
+				<integer>0</integer>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs30 \cf0 *}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+			<key>Wrap</key>
+			<string>NO</string>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>72</integer>
+			</dict>
+			<key>ID</key>
+			<integer>80</integer>
+			<key>Points</key>
+			<array>
+				<string>{191, 171.25}</string>
+				<string>{227, 230.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>TailArrow</key>
+					<string>FilledArrow</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>78</integer>
+				<key>Info</key>
+				<integer>5</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{150.5, 135.25}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>78</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 iTIP Queue}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>69</integer>
+				<key>Info</key>
+				<integer>1</integer>
+			</dict>
+			<key>ID</key>
+			<integer>54</integer>
+			<key>Points</key>
+			<array>
+				<string>{488.5, 420.25}</string>
+				<string>{416, 361.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledDoubleArrow</string>
+					<key>TailArrow</key>
+					<string>FilledArrow</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>66</integer>
+				<key>Info</key>
+				<integer>3</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>69</integer>
+			</dict>
+			<key>ID</key>
+			<integer>55</integer>
+			<key>Points</key>
+			<array>
+				<string>{488.5, 343.25}</string>
+				<string>{416, 343.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledDoubleArrow</string>
+					<key>TailArrow</key>
+					<string>FilledArrow</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>67</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>69</integer>
+				<key>Info</key>
+				<integer>2</integer>
+			</dict>
+			<key>ID</key>
+			<integer>56</integer>
+			<key>Points</key>
+			<array>
+				<string>{488.5, 266.25}</string>
+				<string>{416, 325.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledDoubleArrow</string>
+					<key>TailArrow</key>
+					<string>FilledArrow</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>68</integer>
+				<key>Info</key>
+				<integer>4</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>69</integer>
+				<key>Info</key>
+				<integer>4</integer>
+			</dict>
+			<key>ID</key>
+			<integer>57</integer>
+			<key>Points</key>
+			<array>
+				<string>{267.5, 420.25}</string>
+				<string>{335, 361.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledDoubleArrow</string>
+					<key>TailArrow</key>
+					<string>FilledArrow</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>70</integer>
+				<key>Info</key>
+				<integer>2</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>69</integer>
+			</dict>
+			<key>ID</key>
+			<integer>58</integer>
+			<key>Points</key>
+			<array>
+				<string>{267.5, 343.25}</string>
+				<string>{335, 343.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledDoubleArrow</string>
+					<key>TailArrow</key>
+					<string>FilledArrow</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>71</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>69</integer>
+				<key>Info</key>
+				<integer>3</integer>
+			</dict>
+			<key>ID</key>
+			<integer>59</integer>
+			<key>Points</key>
+			<array>
+				<string>{267.5, 266.25}</string>
+				<string>{335, 325.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledDoubleArrow</string>
+					<key>TailArrow</key>
+					<string>FilledArrow</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>72</integer>
+				<key>Info</key>
+				<integer>1</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>66</integer>
+			</dict>
+			<key>ID</key>
+			<integer>60</integer>
+			<key>Points</key>
+			<array>
+				<string>{529, 361.25}</string>
+				<string>{529, 420.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledDoubleArrow</string>
+					<key>TailArrow</key>
+					<string>FilledArrow</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>67</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>67</integer>
+			</dict>
+			<key>ID</key>
+			<integer>61</integer>
+			<key>Points</key>
+			<array>
+				<string>{529, 266.25}</string>
+				<string>{529, 325.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledDoubleArrow</string>
+					<key>TailArrow</key>
+					<string>FilledDoubleArrow</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>68</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>70</integer>
+			</dict>
+			<key>ID</key>
+			<integer>63</integer>
+			<key>Points</key>
+			<array>
+				<string>{227, 361.25}</string>
+				<string>{227, 420.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledDoubleArrow</string>
+					<key>TailArrow</key>
+					<string>FilledArrow</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>71</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>71</integer>
+			</dict>
+			<key>ID</key>
+			<integer>64</integer>
+			<key>Points</key>
+			<array>
+				<string>{227, 266.25}</string>
+				<string>{227, 325.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledDoubleArrow</string>
+					<key>TailArrow</key>
+					<string>FilledDoubleArrow</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>72</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{488.5, 420.25}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>66</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 vCard Object}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{488.5, 325.25}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>67</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 Address Book}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{488.5, 230.25}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>68</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 Address Book Home}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{335, 325.25}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>69</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 Dead Property}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{186.5, 420.25}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>70</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 iCalendar Object}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{186.5, 325.25}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>71</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 Calendar}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{186.5, 230.25}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>72</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 Calendar Home}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{52, 8}, {647, 484}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>105</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+		</dict>
+	</array>
+	<key>GridInfo</key>
+	<dict/>
+	<key>GuidesLocked</key>
+	<string>NO</string>
+	<key>GuidesVisible</key>
+	<string>YES</string>
+	<key>HPages</key>
+	<integer>1</integer>
+	<key>ImageCounter</key>
+	<integer>1</integer>
+	<key>KeepToScale</key>
+	<false/>
+	<key>Layers</key>
+	<array>
+		<dict>
+			<key>Lock</key>
+			<string>NO</string>
+			<key>Name</key>
+			<string>Layer 1</string>
+			<key>Print</key>
+			<string>YES</string>
+			<key>View</key>
+			<string>YES</string>
+		</dict>
+	</array>
+	<key>LayoutInfo</key>
+	<dict>
+		<key>Animate</key>
+		<string>NO</string>
+		<key>circoMinDist</key>
+		<real>18</real>
+		<key>circoSeparation</key>
+		<real>0.0</real>
+		<key>layoutEngine</key>
+		<string>dot</string>
+		<key>neatoSeparation</key>
+		<real>0.0</real>
+		<key>twopiSeparation</key>
+		<real>0.0</real>
+	</dict>
+	<key>LinksVisible</key>
+	<string>YES</string>
+	<key>MagnetsVisible</key>
+	<string>NO</string>
+	<key>MasterSheets</key>
+	<array/>
+	<key>ModificationDate</key>
+	<string>2010-01-14 13:46:09 -0800</string>
+	<key>Modifier</key>
+	<string>Glyph Lefkowitz</string>
+	<key>NotesVisible</key>
+	<string>NO</string>
+	<key>Orientation</key>
+	<integer>2</integer>
+	<key>OriginVisible</key>
+	<string>NO</string>
+	<key>PageBreaks</key>
+	<string>YES</string>
+	<key>PrintInfo</key>
+	<dict>
+		<key>NSBottomMargin</key>
+		<array>
+			<string>float</string>
+			<string>41</string>
+		</array>
+		<key>NSLeftMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+		<key>NSOrientation</key>
+		<array>
+			<string>int</string>
+			<string>1</string>
+		</array>
+		<key>NSPaperSize</key>
+		<array>
+			<string>size</string>
+			<string>{792, 612}</string>
+		</array>
+		<key>NSRightMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+		<key>NSTopMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+	</dict>
+	<key>PrintOnePage</key>
+	<false/>
+	<key>QuickLookPreview</key>
+	<data>
+	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
+	iE5xLvIs4jXadChM0DqfkODgpOrb/wMEeayFCmVuZHN0cmVhbQplbmRvYmoKNiAwIG9i
+	ago0Mjg0CmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgNCAwIFIg
+	L1Jlc291cmNlcyA3IDAgUiAvQ29udGVudHMgNSAwIFIgL01lZGlhQm94IFswIDAgNzU2
+	IDU1M10KPj4KZW5kb2JqCjcgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9J
+	bWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gL0NvbG9yU3BhY2UgPDwgL0NzMiAxNyAwIFIK
+	L0NzMSA4IDAgUiA+PiAvRm9udCA8PCAvRjEuMCAxOCAwIFIgPj4gL1hPYmplY3QgPDwg
+	L0ltMyAxMyAwIFIgL0ltNCAxNSAwIFIKL0ltMiAxMSAwIFIgL0ltMSA5IDAgUiA+PiA+
+	PgplbmRvYmoKMTMgMCBvYmoKPDwgL0xlbmd0aCAxNCAwIFIgL1R5cGUgL1hPYmplY3Qg
+	L1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyNTYgL0hlaWdodCAxMzggL0ludGVycG9sYXRl
+	CnRydWUgL0NvbG9yU3BhY2UgMTkgMCBSIC9JbnRlbnQgL1BlcmNlcHR1YWwgL1NNYXNr
+	IDIwIDAgUiAvQml0c1BlckNvbXBvbmVudAo4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+
+	CnN0cmVhbQp4Ae3QAQ0AAADCoPdPbQ8HESgMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM/AwMng8AAQplbmRzdHJlYW0KZW5kb2Jq
+	CjE0IDAgb2JqCjQ4NQplbmRvYmoKMTUgMCBvYmoKPDwgL0xlbmd0aCAxNiAwIFIgL1R5
+	cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyMDQgL0hlaWdodCA5OCAv
+	SW50ZXJwb2xhdGUKdHJ1ZSAvQ29sb3JTcGFjZSAxOSAwIFIgL0ludGVudCAvUGVyY2Vw
+	dHVhbCAvU01hc2sgMjIgMCBSIC9CaXRzUGVyQ29tcG9uZW50CjggL0ZpbHRlciAvRmxh
+	dGVEZWNvZGUgPj4Kc3RyZWFtCngB7dAxAQAAAMKg9U9tDB+IQGHAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY+AwM6kgAAQpl
+	bmRzdHJlYW0KZW5kb2JqCjE2IDAgb2JqCjI4NQplbmRvYmoKMTEgMCBvYmoKPDwgL0xl
+	bmd0aCAxMiAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAy
+	NDIgL0hlaWdodCAxNzAgL0ludGVycG9sYXRlCnRydWUgL0NvbG9yU3BhY2UgMTkgMCBS
+	IC9JbnRlbnQgL1BlcmNlcHR1YWwgL1NNYXNrIDI0IDAgUiAvQml0c1BlckNvbXBvbmVu
+	dAo4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3QMQEAAADCoPVPbQo/
+	iEBhwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwa+AwPiKwABCmVuZHN0cmVhbQplbmRv
+	YmoKMTIgMCBvYmoKNTYyCmVuZG9iago5IDAgb2JqCjw8IC9MZW5ndGggMTAgMCBSIC9U
+	eXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTE1MCAvSGVpZ2h0IDg3
+	MCAvSW50ZXJwb2xhdGUKdHJ1ZSAvQ29sb3JTcGFjZSAxOSAwIFIgL0ludGVudCAvUGVy
+	Y2VwdHVhbCAvU01hc2sgMjYgMCBSIC9CaXRzUGVyQ29tcG9uZW50CjggL0ZpbHRlciAv
+	RmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dABDQAAAMKg909tDjeIQGHAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMPA6MM8/AAEKZW5kc3RyZWFtCmVuZG9iagoxMCAwIG9i
+	agoxMzExMQplbmRvYmoKMjQgMCBvYmoKPDwgL0xlbmd0aCAyNSAwIFIgL1R5cGUgL1hP
+	YmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyNDIgL0hlaWdodCAxNzAgL0NvbG9y
+	U3BhY2UKL0RldmljZUdyYXkgL0ludGVycG9sYXRlIHRydWUgL0JpdHNQZXJDb21wb25l
+	bnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHtXfk/VP0Xr1SSdTIM
+	szBjGSY01oj0KCp7IntZUsgSCfFYQspSIj1KKSS7LKk81fP0+v5r33M+987ca4ypGTNm
+	esz5oZelO+77nvM573M+99732bfPbOYrYL4C5itgvgJ78grs14/9BtcOgB5gzEJ3Yz7k
+	AHymiSKnwVpYHDx48JB+DD7JwoKANz3UFFwAC1APW1oeoc1KN1Mcbml5GD4PYCNqkwJN
+	8FoA2sOI1eqoNZgNmK2uhgfjhxy1gs9D2AS0yWBGvBDLBC6AtbG1s7O3d+Ds1Bzs7e3s
+	bAH4UQKaxLdpYMZche49cuQoorXncI45crlOTs7OPN3N2dnJict1PMbh2CNqAI2Oxtg2
+	ehYjDka8VtbWtnYOHEeuE4/n4srnCwRCoUhXEwoFAj7f1YXHc+I6chzsbK2trRAzLGhj
+	uxkDGuIZ8NqAdx25PBe+QChyE4slEg/PnZiHRCIWu4mEAr4LD0Db29kQzLiejelmKqAh
+	ngGvwzGuswtfKBJLPL28pT6+MpnsOJqftkaOgqN9faTeXp4SsUjId3HmHnMAzBjbxgxt
+	EtAHD1nC+kW8PFeBSOzhJfWV+fmfkMsDg8CCdTM8NFAuP+HvJ/OVenmIRQJXHmKG9WxJ
+	0rZxQpsJaFt7DuAVukk8pTK/AHlQSGhYeHjEqUjKorQz+qhTEeHhYaEhQfIAP5nUU+Im
+	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
+	j+fiyucLBEKhSFcTCgUCPt/VhcdzArgOdrbWxL/6H/rLANHiK8rN8MgMzAyysQNPc445
+	crlOTs7OPN3N2dnJict1PMYB74J7jx6BxxuoFazFmRnsvxI34212SwRtbWMLsO0dODs1
+	B3sAa2tjjXBhl+OgBQa0MVcw+wIiZny0gIA+YgWwATiYra6GB+OHHLU6QuAS95oOXsRO
+	MANoQA2wwdmUWelmisMtwbcQzMhHJuRfpa8p0AcsADbi1ofBJ2EsmyRcGvd+GjY5SwCv
+	s1EfQP6Fz1ReVdP9As5SH2a6AM1nZr4C5itgvgLmK2DYK/B/uvd6oQplbmRzdHJlYW0K
+	ZW5kb2JqCjI1IDAgb2JqCjU5NzEKZW5kb2JqCjIwIDAgb2JqCjw8IC9MZW5ndGggMjEg
+	MCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjU2IC9IZWln
+	aHQgMTM4IC9Db2xvclNwYWNlCi9EZXZpY2VHcmF5IC9JbnRlcnBvbGF0ZSB0cnVlIC9C
+	aXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB
+	7V3pU1J9FNZEkR0UQVkCL26ASDcpUipwYCxTKzUNKx0La8Iw0omJyRYcK0amXErHZcrM
+	SRs1Rx1GHaec9197z8Xet0XMzz/veT7x8T7PWX7b4ZyUFAQqgAqgAqgAKvCrAqmHCL/y
+	OvA38D7yE2lE4yePI0DrQOopKbvcgTOHk35owOEAIUaKgyRIsN+lnsHlZu6CRyx+EOBy
+	M8CUIMIBCvxgn56eAdR5fL5AIBAKhSKCAZ8PJPh8XmYmo8HfFWDop4HXA3mgLhSJxRKp
+	VEY4pFKJWCwCFfggwa4C+wRBgj7YnmEvEktksqxsuTwnR6FQEguFIidHLs/OkskkYhGj
+	APgABEFyARjrM8Zn2EuBu0KZm6dSqTUaLbHQaNQqVV6uUgEaSBMKgAswAiRZCBL0IfAF
+	QmAP5IG5VqfX51MGgkHl6/U6LagAEoACQgGTBpILkMrEPpcHxpdlK3JVwJ0yFBYVlxiN
+	JpOZSJhMRmNJcVGhgQINVLmKbBm4AI/LZMG9DgDmB/qZApFEJleqtHqqoMhoKrVYrTRN
+	HycU8OlWq6XUZCwqoPRalVIuk4jAA9I5SSIAzA+pj5+gr9ZRhSVmi5UuP3HSXlEJcBAI
+	5rsr7CdPlNNWi7mkkNKpEwLwIQkmcYBUMH8mXyiWyXPVOkOxuYy22SscZ5yuKrfb7SES
+	8OFVLucZR4XdRpeZiw06da5cJhbyM8EB/gyAXfMLgL5SrS8wWmjbKYezylN9vqa2rv4i
+	oaivq605X+2pcjpO2WiLsUDPeIBYkMwBGP7g/VKgryswWsvtp13ucxfqLzU2Nbd4iUVL
+	c1PjpfoL59yu0/Zyq7GACQGpCBxgTwCA+2dkCsRZCpXOYCyzVTo9NXUNV7zX29o7bvl8
+	nUTC57vV0d523Xuloa7G46y0lRkNOpUii3GAPQGQegTWPjB/rpYqtpRXuqprLze3tnX4
+	7vjvBbrvB4nE/e7APf8dX0dba/Pl2mpXZbmlmNLmggPAGvhnAmDcH6JfodIXmmm7s7qu
+	0Xvj5m1/INj7MPQoTCgehR72BgP+2zdveBvrqp122lyoVymYDAAB8PsWMMFfkq3UUiVl
+	ttMeoN/u83f3hMJ9T59F+glF5NnTvnCop9vvawcBPKdtZSWUVpktSco/gyeUyvN0BWb6
+	lKvmsre9sysYCj+NDLyMDsYIxWD05UDkaTgU7Ops916ucZ2izQW6PLlUyMvYY39OBk/E
+	uH+RxeZw1zff8HU9CPVFXkRjb4ZH3hKKkeE3seiLSF/oQZfvRnO922GzFDEBIOJBAvzD
+	/zlcvjhLqaFKrPaz5xpab94Nhvr6X8WGRsfGJyeniMTk5PjY6FDsVX9fKHj3ZmvDubN2
+	awmlUWaJ+dwk/AViCH+Dia6ounCl7XYA6Edfj4xNTL+f+ThLJD7OvJ+eGBt5HQUBArfb
+	rlyoqqBNBkgAYkES/pD+5XlHC0vLwf29Hf6e8PNXr0fHpz7Mzn2eXyAS85/nZj9MjY++
+	fvU83OPv8EIAlJcWHs2TwwKwx/6w/EnkTPifOFN96ZovEHoyEBsZn575NP9lcWmZSCwt
+	fpn/NDM9PhIbeBIK+K5dqj5zgkkAcmYB+DP+gb8U+Bdb7c7zjW13guFIdGhsamZuYWl5
+	ZXWNSKyuLC8tzM1MjQ1FI+HgnbbG8067tRj4S5PyF0pzVPmQ/lw1Te3+3scDsdGJD0B/
+	ZW09TijW11ZAgA8To7GBx73+9qYaFyTAfFWOVJjM/kJZjpoyHquoqm3u6Hr45OWbd9Oz
+	84sra/GNzS0isbkRX1tZnJ+dfvfm5ZOHXR3NtVUVx4yUOke2D3+FhjLSle66lluB0LPo
+	0Pj7uS9fV+MbW9uEYmsjvvr1y9z78aHos1DgVkudu5I2UhrF/vxh+QP+V33djyKDwxMz
+	nxdX1oH+t+9E4tv21sb6yuLnmYnhwcijbt9Vhr/JcCD/eq/vfrg/Njr5cX5pNb4J9HeI
+	xPdv25vx1aX5j5Ojsf7wfR8sgPvxh+NvplCm0CTsn4T/PwRi5+/8f7sBS01Lh+0/bP/M
+	xx2ei97OINj/7dTswvJafGv7+w6B7OGTd75vb8XXlhdmp96C/YOd3osex3EzbADhAJCe
+	hvx/OQGh/dH/Mf4x/2H+x/UP13/c/+D+D/e/uP/H8w+e//D8i+d/vP8g8gII73/w/gvv
+	//D+E+9/8f4b7//x/QPff/D9C9//8P0T33/x/Rvf/7H+Aesf/lcA6z+w/gPrP7D+A+s/
+	sP4D6z+w/gPrP7D+A+s/sP4D6z+w/gPrP7D+A+s/CFQA61+w/gXrX7D+BetfsP4F61+w
+	/uVv9S8s//97ygH8D3v/g9/4s7j/Bbv7n7C8/w3L+x+xvf8Vu/ufcVje/47DZXn/Q7b3
+	v2R5/9M0lve/Zfo/s7r/Mbv7X7O9/zn2v2f7/ANm/Al751+ksHz+CfBn+/wbds8/YhyA
+	zfOvgD8TAeydf7YrAHvn3yUmn8IAQNbOP9wVgL3zL3/MvmUmgLJz/in8G4zd82+Zv8Ml
+	FDjC1vnHiT8Esnr+dUKB/2QAJQ4HfrLCX6gAKoAKoAKoAKPAv2Ksf5IKZW5kc3RyZWFt
+	CmVuZG9iagoyMSAwIG9iagoxOTMwCmVuZG9iagoyNiAwIG9iago8PCAvTGVuZ3RoIDI3
+	IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDExNTAgL0hl
+	aWdodCA4NzAgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkgL0ludGVycG9sYXRlIHRydWUg
+	L0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K
+	eAHt3eu313Wd93FFhA0bNiAbNm4BUQ6KgISiIGXisTQMO2iUh5wozEOZOBgzFkZjUZij
+	ok4qZnko0ga1cDQPretfu37bZlah9pprdvO6c63H506t9a5Xaz1uPNd3bzRPOMEjQIAA
+	AQIECBAgQIAAAQIECBAgQIAAAQIECBAg8P+fwIkTb4pHgACB/wWB94Ny4n8fyv/Mzkkn
+	nTT1/XeyR4AAgUkK/LkiUwc9mYjYoC4hQe9/8Zw0dfC/NG3a9OnThzwCBAj8fQKDkkyb
+	NmjK1IkC/c3+TLRnIj3ThoZmzJg5PHizPAIECPw9AhMhmTljaGj6oEATAfro/vxne6YP
+	zRieNXtkZM7ceR4BAgT+ToG5c+eMjMweHp4xNH3Qn4/Oz5/jM9Ge2SNz580fHV2wcGxs
+	bJFHgACByQoMGrJwwejoKfPmDgI0Y2jaxOfPR3z9nDjxU9f0QXvmzJu/YGzR+PjiJUuW
+	nu4RIEBg8gJLlyxZPD6+aGx0/ryRWcODz5+J/Hzwd8/vx2fw4TMyd/7CReNLli47c/mK
+	latWneURIEBgsgKrVq1csfyMZUsXj48tOGXu4PNnkJ/BD18fyM+JU97/8hmZNzo2vnTZ
+	8lVnr16z9tz16z/mESBAYLIC69evW7tm9Vkrly9bMj42Om9kIj8f+vgZfPqcPH1oeBCf
+	RYuXrTjrnHUf27Dxgk2bL9riESBAYLICF23adMHGDevXnXPW8mWnvZ+fwe9+pkw5/ttn
+	4tPnz/FZcsaqNevPu2Dzxy/eeunll19xxZUeAQIEJiFwxRVXXH7Z1ksu3rL5gg3nnrNq
+	2eKx0bmzZw596OPnxCmD3zjPmju6aMkZZ607b9OWSy678tPXbPvs9u3XeQQIEJicwPbt
+	12675lNXXvrJLRduWDuRn/lzZs2YNvUDv/gZ/OA1+PSZP7b4jLPO3bhl65VXX/u5L37p
+	yzfedPMtHgECBCYncPNNN+644QvXbbv6iksuOn+Qn9PGThkZHnz8HP9r5ylTp82YPW/B
+	+LJV6zZ+4vKrt39xx0237tz1zdvvuNMjQIDA5ATuuP22b+z86k07vvDZT1+65fy1K08f
+	H503a2jwx17H/eJnytTpg0+fRUuWr9mw5fJrPrfj5q/tuvPb99y75777vusRIEBgEgL3
+	3Xffnt3f+dbtu/7hphuuu/rSizasXr5k8PEzc/Cj11/XZ/Brn6HhuaPjy85af+HWqz+3
+	46u77rx7z9779/1g//4fegQIEJiEwP79+x/4/v177737jq/f8qXtn/rkBetWLTt1dM7w
+	9JOP+8XPiYNf+8yat3Dx8nPO23LF9i/duutb9+79/v4HDxw8+NDPPAIECExC4KGHDv70
+	wIP7v7d39127brl+2+VbNqw+87SFcwe/+PlgfWbMPmVs6cp1F3zy6i/cvOtbe+7/wY8O
+	PvzoocefeNIjQIDAJASeeOLxQ488/NMHH/jne+/6+o2f/9TFG9euWDI2b/aH6jNt5sjo
+	qYMfvDZfdu2Or9157/37Dzz82JNPPXP42V94BAgQmITAs88efubnTzz6swP7/2n37bfe
+	8Jmtm85ddfqiU0ZmTDv+22fqRH3Gz1i94eNXfu6mXd/ZO4jP408dfu75F1/yCBAgMDmB
+	F59/7vDPDz384wf2fvvrN26//KKPnb1sfP6gPsf9kfuJU6cNz1lw2vI1Gy/+9BdvvWPP
+	vh89fOip557/9ZGXX/EIECAwOYGXj7z0/C+eOvTQg9/bffstn7/q4+etPmN8dPCHXh+o
+	z/ThuQsXr1h7wdZrbtj57b37Dz721HMvHHnl6Kuvve4RIEBgEgKvvfbq0Vd+88KzP3/k
+	Jz+4765br7/64o1rlp82Omfm9A/XZ2zJynWbLt224xv33P/gw08efv7I7177/bFjb3gE
+	CBCYhMCxY8def/WV3zx/+PGf/cs/3b3zhmsuuWDt8sULBn/k/qH6zBtbsmr9psuvvfG2
+	e/cdePSp5379yqt/+I833/qjR4AAgUkIvPXWm2/8/ugrLz33b4/8+P57vrFj29YL161Y
+	Mvgj94+qz9JV6zdfvv2m2/f84OChZ54/cvT3//HHt9951yNAgMAkBN555+233nj933/z
+	q6ce+8m+3bu+cu2lm85dGepz0RXbb77jvv0PPX74hZdfPfbm2+++5xEgQGByAu++/eYf
+	jh55/plDBx/4x2/e+NnL/t/q88SzL77y2rG33nnvvT95BAgQmITAoFhvv3ns1d++cDjW
+	Z/C3ec2at+j0sz625crrbrnzuz/82ZO/eOmV19/447vv/en/eAQIEJiEwJ/+9N47bx17
+	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
+	fZasOnfTZdd+Zdfu7x945OfPvfTy0d+/8eabb3kECBCYhMCbbw7ic/S3L/7iyX/90f3f
+	+fqObVsvXLtiyYKP+slr7tiSlesu3PqZHV//zv0P/uyJZ57/9StHX//9H455BAgQmITA
+	H/7w+9ePvvzSL58+dPCHe7+984ZrPrlx7fLFC+Z8xO995i5cvHztxkuuvv5rd333Bz95
+	5N+eff7Xv/3d0aOvegQIEJiEwNGjR1/57Uu/OvzkIwf27bnz1i98+uLzzznztNE5Mz/4
+	W+dpw3MWnLb8nPMvvurzt9x+7/cefOixnx/+1Yu/OXLktx4BAgQmIXDkyJFfv/DLw08+
+	evCH999z282fu2rLhtVnjI+OzJx2/J95nTRt5sjo+BmrN2y5YvuN37j7u/t+/NBjTz79
+	7C+f9wgQIDBZgeeeferJRx56cN+eu3Z++drLN68/a9mp80dmfLA+J88YmX/qslXrN23d
+	9qVbb9+994EfHXzk0JNPPf30Mx4BAgQmI/D00z9/8tC//vTBfXu/881brr9m64XrVi1d
+	dMrsoZOnHPfX+5x08ozZp4wtWbF248Wf+vyNO+/cvXffvxw4+PAjjz52yCNAgMAkBB57
+	7NFHHj54YP/3v3vPHV/78nVXfeL8NcuXjM2b9cH6TDl5aNa8hYvPXL3hosu3XX/L1++8
+	Z8/9+/Y/eODAT37qESBAYBICP/nJgR8/uH/fP+25+/adN33xM5duXn/2GeODP3D/QH1O
+	GNRneM7o+LJV6y745Ke233Dzzm/edc+evfd/b59HgACByQp875/37vnOXbd97abrr73q
+	4o1rVy5dNDoyPP3kv/7bvE44YcrU6TNHBj96LV/9sc1bP739+q98dedtd3zr7t27d9/r
+	ESBAYDICu3ffc/ddd+zaecuXv3jtVZdsWn/2mYsXzps9Y9pxf5PpoD4nTRuaNXd0/PSV
+	a87bsvWqbdddv+Omr/7Dzm/s2nWbR4AAgUkI7Nq16xs7/+GrN+744vbPXHnJ5g3nLF96
+	6ujED14nfeDb56TBj14jpywc/Oy19rxNF1961dXXXvf567+0Y8eXPQIECExOYMeOG67/
+	/PZtV1956Sc2bViz8vTxBfNGZk4/+bi/3OeEE06cMnXajOE588dOW7ZqzfqNmz9xyWVX
+	XnX1Nds8AgQITFrgM9dcfdUVl37y45vOX3/OitPHF54yMjw0+MHrr//AfaI+g4+fmbPn
+	TuRnxeq1Hzv/ws1bPnHxJVu3XuoRIEBgcgJbt15y8Se2bLrgvPVrz15++vjY/DmzJj59
+	PlCfE6YMPn6GhifyM770zJVnr1m3fsN5Gy+48MJNHgECBCYncOGFGzeet2H92nPOXnnG
+	0vGF8+fOnjl08tQpx//a588fP9Pfz8/CUxeffsbylWetPmfN2rXrPAIECExWYO3aNavP
+	XrVy+bKlpy1acMqc2YOfuz786TP40WvK1JMn8jNn3ujYqeNLli5bduby5StWrFjpESBA
+	YDICg34sX37msmVLF48vWjg6b2TWzEF8Bp8+x//aZ/B/sjr4zc9EfmYOj8ydN7pgbFCg
+	8dMWL/EIECAweYHFp42Pnzq2cHT+vDkjwzP+RnxOOPH9r59pQ0PDs0YGATpl/ujoggUL
+	PQIECExeYMHo6Oj8U+bNHZk9PHNo+kd/+Ux8/AzyM/j8GfRn5vDwrNkjIyNz5sz1CBAg
+	MHmBOXMGJZk9a3jw3TPRnpM+4seu9//xFhP5mejPydOmDw3NmDFzECGPAAECf4/AzJkz
+	ZwwNTaTn/fZ8+Hc+//XP1vlzf06aOijQoEGDN90jQIDA5AUmMjKRk6kTnz2DD58P/cL5
+	v+Iz8a8nvl+giY8gjwABAv8bAhPdmShPTM9fMjT4D3oECBD43xH4S1r8OwIECBAgQIAA
+	AQIECBAgQIAAAQIECBAg0BH4v12XVLAKZW5kc3RyZWFtCmVuZG9iagoyNyAwIG9iagox
+	MDEyMQplbmRvYmoKMjIgMCBvYmoKPDwgL0xlbmd0aCAyMyAwIFIgL1R5cGUgL1hPYmpl
+	Y3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyMDQgL0hlaWdodCA5OCAvQ29sb3JTcGFj
+	ZQovRGV2aWNlR3JheSAvSW50ZXJwb2xhdGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4
+	IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae2c+VeS6xbHLc0BlUEBEURQ
+	FESRQVEUU3HCFMwpjFIJxTScG1DLUsyBxMwhNbXEIYeyTJvsNK37r939vNjqHsXynLXu
+	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
+	9x7VERtno1KBVnqNV8ZP47nxxfhlbBjPgH6sdtd7fP/p4xV117Y+PPmNetw5rr2dG1Vh
+	VnFlC93/xzKEj9knOabB06FZWGvYduQPmsxMsAwoxH8FPpf6khNV3NXu7bhFEsxQPixs
+	JbpLVG4p1Oo9g0qsHCvYAHZwksQsWhy4U2u6OXh32CJ6bflNV7Lrhv769nr72vIebcqo
+	KSgTzbNEZpSxW6Pk3Xjb/WaREZ84Or7nvYpayf5JRRA/hTlaKvIUVfRWUNbEb2cOfhu2
+	flw/pef1Qf08CT2tn9Gv6KMRvgx0Sc/Cc1Efo0nwsGkh4hKgioMz1E5UY40D4inx8rRb
+	ZJH9D0AZ/WYKZW5kc3RyZWFtCmVuZG9iagoyOSAwIG9iago3MDQKZW5kb2JqCjE3IDAg
+	b2JqClsgL0lDQ0Jhc2VkIDI4IDAgUiBdCmVuZG9iagozMCAwIG9iago8PCAvTGVuZ3Ro
+	IDMxIDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURl
+	Y29kZSA+PgpzdHJlYW0KeAHtWmdUFU2T7pkbuYHMJeecg+TMJeeckXxJkiSDiAKSVZIi
+	oiQRA6ggKIKiIAgoGBBEzGBCUFCQoBJkB339vt2zZ3/t/lv7nJl+prq6q5m60110PQBI
+	lvtFR4fDAICIyLgYB1OqgJu7hwDuGYDAlpAHEPwCYqMN7OyskKf/oaw8RrSRMiq7NRaf
+	K5NuH9euzsmy9Lv12lJX/odOf8RMMYhBACA7RMAa/BsHbmH/3zhpCyfGRcchOvu3cECI
+	H9IO1SBYJsbJwRDBdwHAk4J/YbonW9j/F2Z6t4X9/GKCAeCcR/QF/PyCEczF+Bv7b2GF
+	LZwQEIyMz4XMAcscGRgaiYgQG1jdQFpsAABiJxGdwMDYgAgAxPEAwNSIiCikXXLrnUgE
+	RMcgfSWRC4hsvTukRkpUNAAaVcjcTvxb5icHQFs9APS3/i0TUweA4QYAPQP/li06/Hqf
+	EOVBbNA2pV/DQSQqAJhXm5uLYgDgSgDYKN7cXDuxublRBwDqBQDd4QHxMQm/dAF6q8IA
+	AmAArIAT8AFhIAFkgRJQA1pAHxgDC2ALnIA78AYBIAREgBiQCFJBOsgGBaAIHAYVoBqc
+	BGfBBdACroBOcBP0gyEwDMbAMzAJ3oOPYB4sgzUIgnAQCWKGOCA+SBSShhQhdUgXMoYs
+	IQfIHfKFgqAIKB5KhTKhfKgEOgrVQmegZqgd6oZuQ8PQE2gSmoEWoFUYhokwK8wDi8Jy
+	sBqsD1vAjrAXHARHw8lwJnwAPgLXwo3wZbgLHoQfwRPwR3gJ3kQRUGwoAZQ0Sg1FRVmj
+	3FE0VDQqFZWLOoSqQZ1DdaD6UCOoV6hPqO9oNJoJzYeWQWugTdBOaD90FDoVnY8uR59C
+	X0L3oB+iJ9Cf0esYIoYLI4FRw5hiXDA0TBxmH6YUU4dpxfRiRjFvMYtYFJYVK4JVwRpj
+	XbDB2CRsHrYC24i9jr2PncR+xaFwbDhxnAbOCueNi8Zl4spwZ3DXcPdxr3FLeDyeGy+P
+	p+Jd8GH4NHwJ/hT+Kv4+/i3+Gx2JTpBOlc6Szpcuni6frobuMt0Q3STdCoFEECJoEGwJ
+	NEIqoYRwltBNGCd8JmKIvERloiUxgLiLWEpsJPYSnxMXSSSSCEmH5EKKJOWQaklXSaOk
+	OTKWLEDWJDuRI8m55BPkTvI4eYGeRC9OT6XfTp9EX0rfRD9IP8UAM/AxaDK4MMQwHGRo
+	ZLjN8I4RYuRj1GJ0Y0xgLGW8yHifcZaJwCTBZMIUyJTJVMvUzTTB9JOZl1mb2ZM5hbmC
+	uYP5KfMPFk4WDRZ3lhSWCpZrLM9Z1ll5WXVZfVjTWU+w3mJ9z4Zjk2SzZItgK2JrYRtj
+	+0bhouhQfCmZlNOUQcpndmZ2FXZ39t3sJ9j72T9yMHAoc7hz7Oao47jNMcfJwqnO6c25
+	j7OBc5hzhYuXy5ArjKuI6wrXK24styy3E3cqdx33EPciDzePIU84zyGe6zxTvPS8ary+
+	vPm8rbwv+bB8CnwefPv4LvA94Ufxy/K78WfyX+B/KoAWUBDwFMgRaBV4JUgQVBMMECwU
+	7BScEWITogpFC1UKDQp9FxYVdhROF24SfilCEtEUCRU5ItIvsiwqIuokminaKvpGjFmM
+	KhYjVic2Ko4SVxaniZeJD4h/l5CS8JQ4IHFDYl5SSNJZMkeyQ3JWil/KQSpLql3qkzSf
+	tIN0tvRV6c8yQjIuMvkyXTJLspKy3rKlsrdlN+S2yYXKVck9kifKG8gnyl+Qf6fAreCg
+	kKdwU+G7ooJisGK14rgSg5KZ0l6ldqWFbVLbArYd3zamzKBsppyh3Km8oqKgEqZSrzKh
+	yqXqrFqkOqSGVaOqpal1qC2rK6pHqDeoT2kIa/hqVGo802TXdNIs0XygRday1MrTGtDG
+	ahtpZ2r36EA6+jp7dLp0furq6qbp3tD9qaent0evWx/oG+hn6N8ywBiYGuQaDFJJVBtq
+	MXXUkGLoZnjM8JWRoBHN6IzRrLGCcZxxu/G6ib5JlsmgKb2po+lR01dmwmahZk1my+Za
+	5unmAxb0Fs4WxyzeWEpZ7rRstwJWZlZFVk+sBaxDrC9ar9pQbfbbjNny2QbbXrRdszO2
+	K7R7ai9iH2nf4YB2sHWocHjvqOiY6njbidXJ1+m80w9nE+cS5wkXGZcUlwFXVld/12bX
+	n25WbhVuM+7q7tnuYx4iHnEevZ4sngGeLV4oL0evOq+l7UbbD2+f8lbzzvN+5iPjk+Yz
+	7CvkG+c74MfpF+7X5c/sT/PvCCAF+AZcCsQHegVepGFoHrSmIHSQe1BTMDrYI7g5BBvi
+	FdISShfqE9oWRg4LDOvcwbJjx47ecO7w2PChCOGI1IixSLnInMjJKM2o0qi5aNPo2ui1
+	nS47m2OIMUExN2N5YpNiR+Pk4wriPsQbxtfErye4J7QlsiRGJ95Pkk7KS/qQbJxclwKn
+	+KZ07eLbtXvXi1Tt1GOpa7s9d19L405LTXuxR2dP1Z7Nvb57e9KF07PSP2SYZzRm0mdG
+	Z47uU913dN96lm9Wb7Z4dkH2lxynnPZc3tz03Kk8q7yL+ZT81Pw3BWYFF/az7t+1/80B
+	swNNB9kPph18X2hdeLmItyir6HOxS3FXiURJcclqaWDpvUNqh2oPEw/HH54ssyi7fETg
+	SMGRb+X+5fePah49VcFckVbx6ZjrsVvHFY9XV5Iqkys/VDlX9VYrVtfUMNTsrpmt9awd
+	OqF5oqGOqy6/bvVk2Mnn9Vb1nafkTlWfZjydcXrpDO3Mk7MWZzsb5BtONLI15jaunYs6
+	9/a8y/mhC3oXWpskmiqbmZpzmtcv7rz4oWV7y2ireWvXJdVL5y+LXD7WxtyWdwW6knxl
+	oT20/XWHR8fIVcurt67pXrvSqdDZcF3ketUNzhulXfRded3o7j3dqzcTbi70RPTM9Ab1
+	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
+	oiDXdKCfkSVS8yDXz+jwXzw4RAfiokU6OyKyLSwT6W9j+w/WDYoxcUAw0heyi46jbmEO
+	BAdFx9k5/SNPSwkxtEEwCZEfosUa/xmnJszPAuGgAXpE3hIT7+CMYBEEd8cmOBojmBHB
+	71JCnFz/0VkKpBn9I4fhoFAT8986MHNonPmWLVbkHzChHVGWW3NAbMGqwBKEAxqIRxhf
+	NBCJ7KlWwBBZWX/fZUEQ8ENaEpC2WLADTCE4AukRhfSJQrDAP3qG/01i8qtfMNLvv44o
+	gPDLohBrf2z+tiOA2PwzZigIRPAfuR9iY6tta3axPqEZ/7b5R2NrvF+zUWhUmFFY/zMn
+	tBhaCa2CpiJxpS5aAwigKWguIIus++poA7QeWgtp0wAm4B0ycvCfOW6NH9ESlFAelazp
+	EoK0bv3t/n9akdVmSzv0X8//bQYg9P7sldk/M0D4k784gcibBljET8cRXh4AfUm7927V
+	/7nE0ZK2uILAMCo6OSY0OCROwABhTdJkBMwjA+RkBJQUFBXAfwBMLNjWCmVuZHN0cmVh
+	bQplbmRvYmoKMzEgMCBvYmoKNjA0NQplbmRvYmoKMTkgMCBvYmoKWyAvSUNDQmFzZWQg
+	MzAgMCBSIF0KZW5kb2JqCjMyIDAgb2JqCjw8IC9MZW5ndGggMzMgMCBSIC9OIDMgL0Fs
+	dGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4
+	AYVUz2sTQRT+Nm6p0CIIWmsOsniQIklZq2hF1Db9EWJrDNsftkWQZDNJ1m426+4mtaWI
+	5OLRKt5F7aEH/4AeevBkL0qFWkUo3qsoYqEXLfHNbky2perAzn7z3jfvfW923wANctI0
+	9YAE5A3HUqIRaWx8Qmr8iACOoglBNCVV2+xOJAZBg3P5e+fYeg+BW1bDe/t3snetmtK2
+	mgeE/UDgR5rZKrDvF3EKWRICiDzfoSnHdAjf49jy7I85Tnl4wbUPKz3EWSJ8QDUtzn9N
+	uFPNJdNAg0g4lPVxUj6c14uU1x0HaW5mxsgQvU+QprvM7qtioZxO9g6QvZ30fk6z3j7C
+	IcILGa0/RriNnvWM1T/iYeGk5sSGPRwYNfT4YBW3Gqn4NcIUXxBNJ6JUcdkuDfGYrv1W
+	8kqCcJA4ymRhgHNaSE/XTG74uocFfSbXE6/id1ZR4XmPE2fe1N3vRdoCrzAOHQwaDJoN
+	SFAQRQRhmLBQQIY8GjE0snI/I6sGG5N7MnUkart0YkSxQXs23D23UaTdPP4oInGUQ7UI
+	kvxB/iqvyU/lefnLXLDYVveUrZuauvLgO8XlmbkaHtfTyONzTV58ldR2k1dHlqx5erya
+	7Bo/7FeXMeaCNY/Ec7D78S1flcyXKYwUxeNV8+pLhHVaMTffn2x/Oz3iLs8utdZzrYmL
+	N1abl2f9akj77qq8k+ZV+U9e9fH8Z83EY+IpMSZ2iuchiZfFLvGS2EurC+JgbccInZWG
+	KdJtkfok1WBgmrz1L10/W3i9Rn8M9VGUGczSVIn3f8IqZDSduQ5v+o/bx/wX5PeK558o
+	Ai9s4MiZum1Tce8QoWWlbnOuAhe/0X3wtm5ro344/ARYPKsWrVI1nyC8ARx2h3oe6CmY
+	05aWzTlShyyfk7rpymJSzFDbQ1JS1yXXZUsWs5lVYul22JnTHW4coTlC98SnSmWT+q/x
+	EbD9sFL5+axS2X5OGtaBl/pvwLz9RQplbmRzdHJlYW0KZW5kb2JqCjMzIDAgb2JqCjcz
+	NwplbmRvYmoKOCAwIG9iagpbIC9JQ0NCYXNlZCAzMiAwIFIgXQplbmRvYmoKNCAwIG9i
+	ago8PCAvVHlwZSAvUGFnZXMgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0gL0NvdW50IDEg
+	L0tpZHMgWyAzIDAgUiBdID4+CmVuZG9iagozNCAwIG9iago8PCAvVHlwZSAvQ2F0YWxv
+	ZyAvT3V0bGluZXMgMiAwIFIgL1BhZ2VzIDQgMCBSIC9WZXJzaW9uIC8xLjQgPj4KZW5k
+	b2JqCjIgMCBvYmoKPDwgL0xhc3QgMzUgMCBSIC9GaXJzdCAzNiAwIFIgPj4KZW5kb2Jq
+	CjM2IDAgb2JqCjw8IC9QYXJlbnQgMzcgMCBSIC9Db3VudCAwIC9EZXN0IFsgMyAwIFIg
+	L1hZWiAwIDU1MyAwIF0gL1RpdGxlIChDYW52YXMgMSkKPj4KZW5kb2JqCjM3IDAgb2Jq
+	Cjw8ID4+CmVuZG9iagozNSAwIG9iago8PCAvUGFyZW50IDM3IDAgUiAvQ291bnQgMCAv
+	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
+	MFyw2Cm71YqNNrvNZkPYipHVpYOU1Wa12S1GiktBWOsyIopVkQJGDIgjVHRgBGZlLpBf
+	wZRcmTU1OHSSUVk+iK6EalJcLEnwYhgrqCaSioLXadJL00shPJ0O248FhFuq289pFP4k
+	H+9LVqbkIY/alYf9HKS8cjEPuzUQ+IRAHqjq0jqXJh/EPprl4wNq7E2ILB2R9rDUOZ4p
+	JMpN4QAvaJDIXm7+bPLPlsb2nzogccLa45u8Batj0xel7mo+edtoYIv/jX0FmyDFdBzM
+	LPzkEq5JMASwyMb7z662aa2rf7y1FVPtEndcAIH3XewNWDNAczgmZVdK8iGAtoR0vGos
+	rmEbcD27gG02rGQF03E43LEiO3aEyr2ix9+oW6pbbqB1LrfBYaRFl8nA+HUpPheSyey8
+	S0H5HXbB4zO6fSY6N2mB3RYU/L6AHOh8Udx680Z5FfSsd0FUlpaWRRMsVJxQCiVtYBbs
+	nOlke8fAQYmtkRbzyD7I8S7sxrAlmo0g/7Mx6OOE3+jqDc8vGzkvZjtD7d27+O3Fc6ZN
+	Z3laocu6KlcySr65+O5YyRnasWTTU8WumJzalTs7umZvvndZ5+tTg1UGUV867dtHc+3R
+	LhAmIqwZkB1guwwL2TDnQjzFCEQZQ9co2scy1zirQBQbotdeBda/OqCPEXEGOBNJqRUL
+	mHMx7ZsxLXui+/u/sGpYiHD9AU2OX5ZOf5LgXK8UfRQanpaD5RqFXekI5NdoFsgWavhi
+	QaeU0fY8PkXm1CidJelUVrDkSAlVkpfm02l4VnAEks2OCO4Kec1ONx9wZikoZ4GilC8t
+	dRj4YNreFNsoe9AxLikw3Dpy1E/xdhjQUbwNJcQ76Cdkn74SPT0ozsr6QNATjidEz+rL
+	6iNqC8yFJOZSC4uMybC6fLgwSUQWl11EJo8BzItkVESJyOY0izBgCCTuJts0UWpAuOFZ
+	KSayL4/EapyEYW824oRO7U0GJveOwvlkOrUGaASfgHWQDKYVifwFwwqL9Fi9rO72hm1i
+	a97iOblTcO8oo/L+ux8uEeV72e+eP9G+3OxTurRpGf5ZaSZZ0a/u2Xri2Paut2dkjN39
+	mNHBqVWO7Pl4kZBhyZw5ZULalDd21tTsiG53JNP0WiVX7g3VLPzJg1tf0OMrZA20xz9m
+	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
+	4LUiFFKyQBsebrLrlEoFC+5Z+IPp6pXBUbU8gh8K6XXgjuA5hiUNOV4mwPE2KVeTA22F
+	EoYtvYqJdrdOs+q0hR04jJYS61ZpTg+WEL/k0qVLQduzU/l2QksFkPP9X114853f9MbO
+	Hb/06+OxXwBJe+kJ14/S1dcu0COvvwYEhbVjjI2V7DFyv+PN0I+6jA9a9lhoos8O19Xo
+	6nXz+RX0Cn6DYQfcktlh3G7abt6L9po0NWi8sdp8zshUsG+w1Dp2N9qN97B7zWxKKmsx
+	mk2g4xuViiSnoCaKgskOBCU8YTZaupWPmEBfeDfBwcB6tVcsNxEyseyAxHnWbAtousCI
+	xRhIF9IZ4SqKabHObLawGBPmtoATnJCGRALEQIXcnKXSwXw+R1M8JQnFAmJ8FxaNwkVA
+	GZoWz/jvn1P+ZOeT/qArO02Tl61hR6ljbW+BE5fJnh97LPb1y7F5vZzwgooTLcKWFKYO
+	WPE+QivpF2+B/zf4Z78MKKTBz0Tu2qjgbEeLnMQfIt2NCcKtmAw4V8uHWzEFqAhVoEpU
+	Jf2Hw1j4px7yfwy18D8At0j/azEZ/n/iVjQNTUf1qAFuAM2UPkZWAZZSHNzaQdPGz6i6
+	ZUx6Tcui9pa2BXOboCZRS5qA2QP/OYDQuwBXAK5CJQMAd3xwCsAwgAqAqQDNAG0AawC2
+	ALwA0AtwGuBdgCsAV2HwDIABIAVgGEAFwFSAZoA2gDUAWwBeAOgFOA3wLsAVgKtAGAbA
+	AJACMAygAmAqQHO8/wd4osE0Rp4h+eQh+dQh+eCQPLmJdGN/ZHZuzGcNyY8Ykh89JF8+
+	JD9mSB7Gc1P/VUPyNUPyoHjf1P6WIfmJQ/LkpPFG/CcPyQMtb6onHHFj+zlD8nOH5JuH
+	5CUev2E+5g2pnz8k3zokv2BIfuGQ/B1D8ouG5KX/Gb3h+8Q6vXE8dw7JLxmSXzYkf9eQ
+	fNuQ/PIh+fYh+RVD8h0k/38GpnvKCmVuZHN0cmVhbQplbmRvYmoKMzkgMCBvYmoKMTAx
+	NDMKZW5kb2JqCjQwIDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAvQXNjZW50
+	IDc3MCAvQ2FwSGVpZ2h0IDczNyAvRGVzY2VudCAtMjMwIC9GbGFncyAzMgovRm9udEJC
+	b3ggWy05NTEgLTQ4MSAxNDQ1IDExMjJdIC9Gb250TmFtZSAvVktaRk9DK0hlbHZldGlj
+	YSAvSXRhbGljQW5nbGUgMAovU3RlbVYgMCAvTWF4V2lkdGggMTUwMCAvWEhlaWdodCA2
+	MzcgL0ZvbnRGaWxlMiAzOCAwIFIgPj4KZW5kb2JqCjQxIDAgb2JqClsgMjc4IDAgMzU1
+	IDAgMCAwIDAgMCAzMzMgMzMzIDM4OSAwIDI3OCAwIDI3OCAwIDAgMCAwIDAgMCAwIDAg
+	MCAwIDAgMjc4IDAKMCAwIDAgMCAwIDY2NyA2NjcgNzIyIDcyMiAwIDYxMSAwIDcyMiAy
+	NzggMCAwIDAgMCAwIDc3OCA2NjcgNzc4IDcyMiAwIDYxMQowIDAgMCAwIDAgMCAwIDAg
+	MCAwIDAgMCA1NTYgNTU2IDUwMCA1NTYgNTU2IDI3OCA1NTYgNTU2IDIyMiAyMjIgNTAw
+	IDIyMiA4MzMKNTU2IDU1NiA1NTYgMCAzMzMgNTAwIDI3OCA1NTYgNTAwIDcyMiAwIDUw
+	MCBdCmVuZG9iagoxOCAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5
+	cGUgL0Jhc2VGb250IC9WS1pGT0MrSGVsdmV0aWNhIC9Gb250RGVzY3JpcHRvcgo0MCAw
+	IFIgL1dpZHRocyA0MSAwIFIgL0ZpcnN0Q2hhciAzMiAvTGFzdENoYXIgMTIxIC9FbmNv
+	ZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+PgplbmRvYmoKNDIgMCBvYmoKKFVudGl0bGVk
+	KQplbmRvYmoKNDMgMCBvYmoKKE1hYyBPUyBYIDEwLjYuMiBRdWFydHogUERGQ29udGV4
+	dCkKZW5kb2JqCjQ0IDAgb2JqCihHbHlwaCBMZWZrb3dpdHopCmVuZG9iago0NSAwIG9i
+	agooT21uaUdyYWZmbGUgUHJvZmVzc2lvbmFsKQplbmRvYmoKNDYgMCBvYmoKKEQ6MjAx
+	MDAxMTQyMTQ2MThaMDAnMDAnKQplbmRvYmoKMSAwIG9iago8PCAvVGl0bGUgNDIgMCBS
+	IC9BdXRob3IgNDQgMCBSIC9Qcm9kdWNlciA0MyAwIFIgL0NyZWF0b3IgNDUgMCBSIC9D
+	cmVhdGlvbkRhdGUKNDYgMCBSIC9Nb2REYXRlIDQ2IDAgUiA+PgplbmRvYmoKeHJlZgow
+	IDQ3CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDA2MTQ4MiAwMDAwMCBuIAowMDAwMDUw
+	MDg2IDAwMDAwIG4gCjAwMDAwMDQ0MDAgMDAwMDAgbiAKMDAwMDA0OTkyMyAwMDAwMCBu
+	IAowMDAwMDAwMDIyIDAwMDAwIG4gCjAwMDAwMDQzODAgMDAwMDAgbiAKMDAwMDAwNDUw
+	NCAwMDAwMCBuIAowMDAwMDQ5ODg3IDAwMDAwIG4gCjAwMDAwMDY3NTUgMDAwMDAgbiAK
+	MDAwMDAyMDA4NyAwMDAwMCBuIAowMDAwMDA1OTUyIDAwMDAwIG4gCjAwMDAwMDY3MzUg
+	MDAwMDAgbiAKMDAwMDAwNDcwMSAwMDAwMCBuIAowMDAwMDA1NDA3IDAwMDAwIG4gCjAw
+	MDAwMDU0MjcgMDAwMDAgbiAKMDAwMDAwNTkzMiAwMDAwMCBuIAowMDAwMDQyNzg0IDAw
+	MDAwIG4gCjAwMDAwNjExMDkgMDAwMDAgbiAKMDAwMDA0ODk5MCAwMDAwMCBuIAowMDAw
+	MDI2MjkzIDAwMDAwIG4gCjAwMDAwMjg0MTUgMDAwMDAgbiAKMDAwMDAzODc3MiAwMDAw
+	MCBuIAowMDAwMDQxOTM1IDAwMDAwIG4gCjAwMDAwMjAxMDkgMDAwMDAgbiAKMDAwMDAy
+	NjI3MiAwMDAwMCBuIAowMDAwMDI4NDM2IDAwMDAwIG4gCjAwMDAwMzg3NTAgMDAwMDAg
+	biAKMDAwMDA0MTk1NiAwMDAwMCBuIAowMDAwMDQyNzY0IDAwMDAwIG4gCjAwMDAwNDI4
+	MjEgMDAwMDAgbiAKMDAwMDA0ODk2OSAwMDAwMCBuIAowMDAwMDQ5MDI3IDAwMDAwIG4g
+	CjAwMDAwNDk4NjcgMDAwMDAgbiAKMDAwMDA1MDAwNiAwMDAwMCBuIAowMDAwMDUwMjQ5
+	IDAwMDAwIG4gCjAwMDAwNTAxMzQgMDAwMDAgbiAKMDAwMDA1MDIyNyAwMDAwMCBuIAow
+	MDAwMDUwMzQyIDAwMDAwIG4gCjAwMDAwNjA1NzYgMDAwMDAgbiAKMDAwMDA2MDU5OCAw
+	MDAwMCBuIAowMDAwMDYwODIzIDAwMDAwIG4gCjAwMDAwNjEyODQgMDAwMDAgbiAKMDAw
+	MDA2MTMxMSAwMDAwMCBuIAowMDAwMDYxMzYzIDAwMDAwIG4gCjAwMDAwNjEzOTcgMDAw
+	MDAgbiAKMDAwMDA2MTQ0MCAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDQ3IC9Sb290
+	IDM0IDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8MjcxMmU2MjU3ZDg2ZmVmMzU1YTAwNjEz
+	ZGE5ODQzYTY+CjwyNzEyZTYyNTdkODZmZWYzNTVhMDA2MTNkYTk4NDNhNj4gXSA+Pgpz
+	dGFydHhyZWYKNjE2MDIKJSVFT0YKMSAwIG9iago8PC9BdXRob3IgKFdpbGZyZWRvIFNh
+	bmNoZXpcbkdseXBoIExlZmtvd2l0eikvQ3JlYXRpb25EYXRlIChEOjIwMTAwMTExMTky
+	MTAwWikvQ3JlYXRvciAoT21uaUdyYWZmbGUgUHJvZmVzc2lvbmFsIDUuMi4xKS9Nb2RE
+	YXRlIChEOjIwMTAwMTE0MjE0NjAwWikvUHJvZHVjZXIgNDMgMCBSIC9UaXRsZSAoQ2Fs
+	ZW5kYXIgU3RvcmUuZ3JhZmZsZSk+PgplbmRvYmoKeHJlZgoxIDEKMDAwMDA2MjcwMCAw
+	MDAwMCBuIAp0cmFpbGVyCjw8L0lEIFs8MjcxMmU2MjU3ZDg2ZmVmMzU1YTAwNjEzZGE5
+	ODQzYTY+IDwyNzEyZTYyNTdkODZmZWYzNTVhMDA2MTNkYTk4NDNhNj5dIC9JbmZvIDEg
+	MCBSIC9QcmV2IDYxNjAyIC9Sb290IDM0IDAgUiAvU2l6ZSA0Nz4+CnN0YXJ0eHJlZgo2
+	MjkxMwolJUVPRgo=
+	</data>
+	<key>QuickLookThumbnail</key>
+	<data>
+	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
+	HBuoZAXwYxOIdg+YDQCJtSRQg4b4bZ7YLYMgIgAAChfVf1pwoYgIAA8BAAADAAAAAQBx
+	AAABAQADAAAAAQBbAAABAgADAAAABAAAGJYBAwADAAAAAQAFAAABBgADAAAAAQACAAAB
+	EQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAAAQBbAAABFwAE
+	AAAAAQAAF9QBHAADAAAAAQABAAABPQADAAAAAQACAAABUgADAAAAAQABAAABUwADAAAA
+	BAAAGJ6HcwAHAAApmAAAGKYAAAAAAAgACAAIAAgAAQABAAEAAQAAKZhhcHBsAgAAAG1u
+	dHJSR0IgWFlaIAfaAAEAAgAAABwACmFjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+	AAAAAAD21gABAAAAANMtYXBwbB5XET7FGnu84JaBzKU8KrcAAAAAAAAAAAAAAAAAAAAA
+	AAAAAAAAAAAAAAAAAAAAEXJYWVoAAAFQAAAAFGdYWVoAAAFkAAAAFGJYWVoAAAF4AAAA
+	FHd0cHQAAAGMAAAAFGNoYWQAAAGgAAAALHJUUkMAAAHMAAAIDGdUUkMAAAnYAAAIDGJU
+	UkMAABHkAAAIDGFhcmcAABnwAAAAIGFhZ2cAABoQAAAAIGFhYmcAABowAAAAIHZjZ3QA
+	ABpQAAAGEm5kaW4AACBkAAAGPmRlc2MAACakAAAAZGRzY20AACcIAAACQm1tb2QAAClM
+	AAAAKGNwcnQAACl0AAAAJFhZWiAAAAAAAABvcAAAOZ4AAAGiWFlaIAAAAAAAAGEuAAC2
+	pQAADsRYWVogAAAAAAAAJjgAAA++AADCx1hZWiAAAAAAAADzUgABAAAAARbPc2YzMgAA
+	AAAAAQxCAAAF3v//8yYAAAeSAAD9kf//+6L///2jAAAD3AAAwGxjdXJ2AAAAAAAABAAA
+	AAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8
+	AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANoA4ADlAOoA8AD1APsB
+	AQEHAQwBEgEYAR4BJQErATEBOAE+AUUBSwFSAVkBYAFmAW0BdQF8AYMBigGSAZkBoQGo
+	AbABuAHAAcgB0AHYAeAB6QHxAfoCAgILAhQCHAIlAi4CNwJAAkoCUwJcAmYCcAJ5AoMC
+	jQKXAqECqwK1Ar8CygLUAt8C6gL0Av8DCgMVAyADKwM3A0IDTQNZA2UDcAN8A4gDlAOg
+	A6wDuQPFA9ID3gPrA/gEBAQRBB4ELAQ5BEYEVARhBG8EfASKBJgEpgS0BMIE0QTfBO4E
+	/AULBRoFKAU3BUcFVgVlBXQFhAWTBaMFswXDBdMF4wXzBgMGFAYkBjUGRQZWBmcGeAaJ
+	BpoGqwa9Bs4G4AbyBwMHFQcnBzkHTAdeB3AHgweWB6gHuwfOB+EH9AgICBsILwhCCFYI
+	agh+CJIIpgi6CM4I4wj3CQwJIQk2CUsJYAl1CYoJoAm1CcsJ4An2CgwKIgo5Ck8KZQp8
+	CpIKqQrACtcK7gsFCx0LNAtLC2MLewuTC6sLwwvbC/MMDAwkDD0MVgxuDIcMoQy6DNMM
+	7Q0GDSANOg1UDW4NiA2iDbwN1w3xDgwOJw5CDl0OeA6TDq8Oyg7mDwIPHg86D1YPcg+O
+	D6sPyA/kEAEQHhA7EFgQdhCTELEQzhDsEQoRKBFGEWQRgxGhEcAR3xH+Eh0SPBJbEnoS
+	mhK5EtkS+RMZEzkTWRN6E5oTuxPbE/wUHRQ+FF8UgRSiFMQU5RUHFSkVSxVtFZAVshXV
+	FfcWGhY9FmAWgxanFsoW7hcSFzUXWRd9F6IXxhfqGA8YNBhZGH0YoxjIGO0ZExk4GV4Z
+	hBmqGdAZ9hodGkMaahqQGrca3hsGGy0bVBt8G6MbyxvzHBscQxxsHJQcvRzmHQ4dNx1g
+	HYodsx3dHgYeMB5aHoQerh7YHwMfLR9YH4Mfrh/ZIAQgMCBbIIcgsyDeIQohNyFjIY8h
+	vCHpIhUiQiJwIp0iyiL4IyUjUyOBI68j3SQMJDokaSSXJMYk9SUkJVQlgyWzJeImEiZC
+	JnImoybTJwMnNCdlJ5Ynxyf4KCooWyiNKL4o8CkiKVUphym5KewqHypSKoUquCrrKx4r
+	UiuGK7or7iwiLFYsiiy/LPQtKS1eLZMtyC39LjMuaS6eLtQvCy9BL3cvri/kMBswUjCJ
+	MMEw+DEwMWcxnzHXMg8ySDKAMrgy8TMqM2MznDPVNA80SDSCNLw09jUwNWo1pTXfNho2
+	VTaQNss3BjdCN343uTf1ODE4bTiqOOY5IzlgOZ052joXOlQ6kjrPOw07SzuJO8c8BjxE
+	PIM8wj0BPUA9fz2/Pf4+Pj5+Pr4+/j8/P38/wEAAQEFAgkDEQQVBR0GIQcpCDEJOQpFC
+	00MWQ1hDm0PeRCFEZUSoROxFMEV0RbhF/EZARoVGykcOR1NHmUfeSCNIaUivSPVJO0mB
+	ScdKDkpVSptK4ksqS3FLuEwATEhMkEzYTSBNaE2xTfpOQk6MTtVPHk9nT7FP+1BFUI9Q
+	2VEkUW5RuVIEUk9SmlLlUzFTfFPIVBRUYFStVPlVRlWSVd9WLFZ6VsdXFFdiV7BX/lhM
+	WJpY6Vk4WYZZ1VokWnRaw1sTW2NbslwDXFNco1z0XURdlV3mXjdeiV7aXyxffl/QYCJg
+	dGDHYRlhbGG/YhJiZWK5YwxjYGO0ZAhkXGSxZQVlWmWvZgRmWWavZwRnWmewaAZoXGiy
+	aQlpX2m2ag1qZGq8axNra2vDbBtsc2zLbSNtfG3Vbi5uh27gbzpvk2/tcEdwoXD7cVZx
+	sHILcmZywXMcc3hz03QvdIt053VDdaB1/HZZdrZ3E3dwd854K3iJeOd5RXmjegJ6YHq/
+	ex57fXvcfDx8m3z7fVt9u34bfnx+3H89f55//4BggMKBI4GFgeeCSYKrgw6DcIPThDaE
+	mYT8hWCFw4YnhouG74dUh7iIHYiBiOaJTImxihaKfIrii0iLrowUjHuM4o1Ija+OF45+
+	juWPTY+1kB2QhZDukVaRv5IokpGS+pNkk82UN5ShlQuVdZXglkqWtZcgl4uX95himM6Z
+	OpmmmhKafprrm1ebxJwxnJ+dDJ15neeeVZ7DnzGfoKAPoH2g7KFbocuiOqKqoxqjiqP6
+	pGqk26VMpbymLqafpxCngqf0qGWo2KlKqbyqL6qiqxWriKv7rG+s461WrcuuP66zryiv
+	nbARsIew/LFxseeyXbLTs0mzv7Q2tK21JLWbthK2ibcBt3m38bhpuOG5WrnSuku6xLs+
+	u7e8MLyqvSS9nr4ZvpO/Dr+JwATAf8D6wXbB8cJtwunDZsPixF/E3MVZxdbGU8bRx07H
+	zMhKyMnJR8nGykXKxMtDy8LMQszBzUHNwc5CzsLPQ8/D0ETQxtFH0cjSStLM007T0NRT
+	1NbVWNXb1l7W4tdl1+nYbdjx2XXZ+tp/2wPbiNwO3JPdGd2e3iTeqt8x37fgPuDF4Uzh
+	0+Ja4uLjauPy5HrlAuWL5hPmnOcl56/oOOjC6Uzp1upg6urrdev/7IrtFu2h7izuuO9E
+	79DwXPDp8XXyAvKP8xzzqvQ39MX1U/Xh9m/2/veM+Bv4qvk5+cn6Wfro+3j8CPyZ/Sn9
+	uv5L/tz/bmN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBK
+	AE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYA
+	ywDQANUA2gDgAOUA6gDwAPUA+wEBAQcBDAESARgBHgElASsBMQE4AT4BRQFLAVIBWQFg
+	AWYBbQF1AXwBgwGKAZIBmQGhAagBsAG4AcAByAHQAdgB4AHpAfEB+gICAgsCFAIcAiUC
+	LgI3AkACSgJTAlwCZgJwAnkCgwKNApcCoQKrArUCvwLKAtQC3wLqAvQC/wMKAxUDIAMr
+	AzcDQgNNA1kDZQNwA3wDiAOUA6ADrAO5A8UD0gPeA+sD+AQEBBEEHgQsBDkERgRUBGEE
+	bwR8BIoEmASmBLQEwgTRBN8E7gT8BQsFGgUoBTcFRwVWBWUFdAWEBZMFowWzBcMF0wXj
+	BfMGAwYUBiQGNQZFBlYGZwZ4BokGmgarBr0GzgbgBvIHAwcVBycHOQdMB14HcAeDB5YH
+	qAe7B84H4Qf0CAgIGwgvCEIIVghqCH4IkgimCLoIzgjjCPcJDAkhCTYJSwlgCXUJigmg
+	CbUJywngCfYKDAoiCjkKTwplCnwKkgqpCsAK1wruCwULHQs0C0sLYwt7C5MLqwvDC9sL
+	8wwMDCQMPQxWDG4MhwyhDLoM0wztDQYNIA06DVQNbg2IDaINvA3XDfEODA4nDkIOXQ54
+	DpMOrw7KDuYPAg8eDzoPVg9yD44Pqw/ID+QQARAeEDsQWBB2EJMQsRDOEOwRChEoEUYR
+	ZBGDEaERwBHfEf4SHRI8ElsSehKaErkS2RL5ExkTORNZE3oTmhO7E9sT/BQdFD4UXxSB
+	FKIUxBTlFQcVKRVLFW0VkBWyFdUV9xYaFj0WYBaDFqcWyhbuFxIXNRdZF30XohfGF+oY
+	Dxg0GFkYfRijGMgY7RkTGTgZXhmEGaoZ0Bn2Gh0aQxpqGpAatxreGwYbLRtUG3wboxvL
+	G/McGxxDHGwclBy9HOYdDh03HWAdih2zHd0eBh4wHloehB6uHtgfAx8tH1gfgx+uH9kg
+	BCAwIFsghyCzIN4hCiE3IWMhjyG8IekiFSJCInAinSLKIvgjJSNTI4EjryPdJAwkOiRp
+	JJckxiT1JSQlVCWDJbMl4iYSJkImciajJtMnAyc0J2UnlifHJ/goKihbKI0ovijwKSIp
+	VSmHKbkp7CofKlIqhSq4KusrHitSK4YruivuLCIsViyKLL8s9C0pLV4tky3ILf0uMy5p
+	Lp4u1C8LL0Evdy+uL+QwGzBSMIkwwTD4MTAxZzGfMdcyDzJIMoAyuDLxMyozYzOcM9U0
+	DzRINII0vDT2NTA1ajWlNd82GjZVNpA2yzcGN0I3fje5N/U4MThtOKo45jkjOWA5nTna
+	Ohc6VDqSOs87DTtLO4k7xzwGPEQ8gzzCPQE9QD1/Pb89/j4+Pn4+vj7+Pz8/fz/AQABA
+	QUCCQMRBBUFHQYhBykIMQk5CkULTQxZDWEObQ95EIURlRKhE7EUwRXRFuEX8RkBGhUbK
+	Rw5HU0eZR95II0hpSK9I9Uk7SYFJx0oOSlVKm0riSypLcUu4TABMSEyQTNhNIE1oTbFN
+	+k5CToxO1U8eT2dPsU/7UEVQj1DZUSRRblG5UgRST1KaUuVTMVN8U8hUFFRgVK1U+VVG
+	VZJV31YsVnpWx1cUV2JXsFf+WExYmljpWThZhlnVWiRadFrDWxNbY1uyXANcU1yjXPRd
+	RF2VXeZeN16JXtpfLF9+X9BgImB0YMdhGWFsYb9iEmJlYrljDGNgY7RkCGRcZLFlBWVa
+	Za9mBGZZZq9nBGdaZ7BoBmhcaLJpCWlfabZqDWpkarxrE2tra8NsG2xzbMttI218bdVu
+	Lm6HbuBvOm+Tb+1wR3ChcPtxVnGwcgtyZnLBcxxzeHPTdC90i3TndUN1oHX8dll2tncT
+	d3B3zngreIl453lFeaN6Anpger97Hnt9e9x8PHybfPt9W327fht+fH7cfz1/nn//gGCA
+	woEjgYWB54JJgquDDoNwg9OENoSZhPyFYIXDhieGi4bvh1SHuIgdiIGI5olMibGKFop8
+	iuKLSIuujBSMe4zijUiNr44Xjn6O5Y9Nj7WQHZCFkO6RVpG/kiiSkZL6k2STzZQ3lKGV
+	C5V1leCWSpa1lyCXi5f3mGKYzpk6maaaEpp+muubV5vEnDGcn50MnXmd555VnsOfMZ+g
+	oA+gfaDsoVuhy6I6oqqjGqOKo/qkaqTbpUylvKYupp+nEKeCp/SoZajYqUqpvKovqqKr
+	FauIq/usb6zjrVaty64/rrOvKK+dsBGwh7D8sXGx57JdstOzSbO/tDa0rbUktZu2EraJ
+	twG3ebfxuGm44blaudK6S7rEuz67t7wwvKq9JL2evhm+k78Ov4nABMB/wPrBdsHxwm3C
+	6cNmw+LEX8TcxVnF1sZTxtHHTsfMyErIyclHycbKRcrEy0PLwsxCzMHNQc3BzkLOws9D
+	z8PQRNDG0UfRyNJK0szTTtPQ1FPU1tVY1dvWXtbi12XX6dht2PHZddn62n/bA9uI3A7c
+	k90Z3Z7eJN6q3zHft+A+4MXhTOHT4lri4uNq4/LkeuUC5YvmE+ac5yXnr+g46MLpTOnW
+	6mDq6ut16//siu0W7aHuLO6470Tv0PBc8OnxdfIC8o/zHPOq9Df0xfVT9eH2b/b+94z4
+	G/iq+Tn5yfpZ+uj7ePwI/Jn9Kf26/kv+3P9uY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZ
+	AB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA
+	mgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDaAOAA5QDqAPAA9QD7AQEBBwEMARIBGAEe
+	ASUBKwExATgBPgFFAUsBUgFZAWABZgFtAXUBfAGDAYoBkgGZAaEBqAGwAbgBwAHIAdAB
+	2AHgAekB8QH6AgICCwIUAhwCJQIuAjcCQAJKAlMCXAJmAnACeQKDAo0ClwKhAqsCtQK/
+	AsoC1ALfAuoC9AL/AwoDFQMgAysDNwNCA00DWQNlA3ADfAOIA5QDoAOsA7kDxQPSA94D
+	6wP4BAQEEQQeBCwEOQRGBFQEYQRvBHwEigSYBKYEtATCBNEE3wTuBPwFCwUaBSgFNwVH
+	BVYFZQV0BYQFkwWjBbMFwwXTBeMF8wYDBhQGJAY1BkUGVgZnBngGiQaaBqsGvQbOBuAG
+	8gcDBxUHJwc5B0wHXgdwB4MHlgeoB7sHzgfhB/QICAgbCC8IQghWCGoIfgiSCKYIugjO
+	COMI9wkMCSEJNglLCWAJdQmKCaAJtQnLCeAJ9goMCiIKOQpPCmUKfAqSCqkKwArXCu4L
+	BQsdCzQLSwtjC3sLkwurC8ML2wvzDAwMJAw9DFYMbgyHDKEMugzTDO0NBg0gDToNVA1u
+	DYgNog28DdcN8Q4MDicOQg5dDngOkw6vDsoO5g8CDx4POg9WD3IPjg+rD8gP5BABEB4Q
+	OxBYEHYQkxCxEM4Q7BEKESgRRhFkEYMRoRHAEd8R/hIdEjwSWxJ6EpoSuRLZEvkTGRM5
+	E1kTehOaE7sT2xP8FB0UPhRfFIEUohTEFOUVBxUpFUsVbRWQFbIV1RX3FhoWPRZgFoMW
+	pxbKFu4XEhc1F1kXfReiF8YX6hgPGDQYWRh9GKMYyBjtGRMZOBleGYQZqhnQGfYaHRpD
+	GmoakBq3Gt4bBhstG1QbfBujG8sb8xwbHEMcbByUHL0c5h0OHTcdYB2KHbMd3R4GHjAe
+	Wh6EHq4e2B8DHy0fWB+DH64f2SAEIDAgWyCHILMg3iEKITchYyGPIbwh6SIVIkIicCKd
+	Isoi+CMlI1MjgSOvI90kDCQ6JGkklyTGJPUlJCVUJYMlsyXiJhImQiZyJqMm0ycDJzQn
+	ZSeWJ8cn+CgqKFsojSi+KPApIilVKYcpuSnsKh8qUiqFKrgq6yseK1Irhiu6K+4sIixW
+	LIosvyz0LSktXi2TLcgt/S4zLmkuni7ULwsvQS93L64v5DAbMFIwiTDBMPgxMDFnMZ8x
+	1zIPMkgygDK4MvEzKjNjM5wz1TQPNEg0gjS8NPY1MDVqNaU13zYaNlU2kDbLNwY3Qjd+
+	N7k39TgxOG04qjjmOSM5YDmdOdo6FzpUOpI6zzsNO0s7iTvHPAY8RDyDPMI9AT1APX89
+	vz3+Pj4+fj6+Pv4/Pz9/P8BAAEBBQIJAxEEFQUdBiEHKQgxCTkKRQtNDFkNYQ5tD3kQh
+	RGVEqETsRTBFdEW4RfxGQEaFRspHDkdTR5lH3kgjSGlIr0j1STtJgUnHSg5KVUqbSuJL
+	KktxS7hMAExITJBM2E0gTWhNsU36TkJOjE7VTx5PZ0+xT/tQRVCPUNlRJFFuUblSBFJP
+	UppS5VMxU3xTyFQUVGBUrVT5VUZVklXfVixWelbHVxRXYlewV/5YTFiaWOlZOFmGWdVa
+	JFp0WsNbE1tjW7JcA1xTXKNc9F1EXZVd5l43Xole2l8sX35f0GAiYHRgx2EZYWxhv2IS
+	YmViuWMMY2BjtGQIZFxksWUFZVplr2YEZllmr2cEZ1pnsGgGaFxosmkJaV9ptmoNamRq
+	vGsTa2trw2wbbHNsy20jbXxt1W4ubodu4G86b5Nv7XBHcKFw+3FWcbByC3JmcsFzHHN4
+	c9N0L3SLdOd1Q3Wgdfx2WXa2dxN3cHfOeCt4iXjneUV5o3oCemB6v3see3173Hw8fJt8
+	+31bfbt+G358ftx/PX+ef/+AYIDCgSOBhYHngkmCq4MOg3CD04Q2hJmE/IVghcOGJ4aL
+	hu+HVIe4iB2IgYjmiUyJsYoWinyK4otIi66MFIx7jOKNSI2vjheOfo7lj02PtZAdkIWQ
+	7pFWkb+SKJKRkvqTZJPNlDeUoZULlXWV4JZKlrWXIJeLl/eYYpjOmTqZppoSmn6a65tX
+	m8ScMZyfnQydeZ3nnlWew58xn6CgD6B9oOyhW6HLojqiqqMao4qj+qRqpNulTKW8pi6m
+	n6cQp4Kn9KhlqNipSqm8qi+qoqsVq4ir+6xvrOOtVq3Lrj+us68or52wEbCHsPyxcbHn
+	sl2y07NJs7+0NrSttSS1m7YStom3Abd5t/G4abjhuVq50rpLusS7Pru3vDC8qr0kvZ6+
+	Gb6Tvw6/icAEwH/A+sF2wfHCbcLpw2bD4sRfxNzFWcXWxlPG0cdOx8zISsjJyUfJxspF
+	ysTLQ8vCzELMwc1BzcHOQs7Cz0PPw9BE0MbRR9HI0krSzNNO09DUU9TW1VjV29Ze1uLX
+	Zdfp2G3Y8dl12fraf9sD24jcDtyT3Rndnt4k3qrfMd+34D7gxeFM4dPiWuLi42rj8uR6
+	5QLli+YT5pznJeev6DjowulM6dbqYOrq63Xr/+yK7Rbtoe4s7rjvRO/Q8Fzw6fF18gLy
+	j/Mc86r0N/TF9VP14fZv9v73jPgb+Kr5OfnJ+ln66Pt4/Aj8mf0p/br+S/7c/25wYXJh
+	AAAAAAADAAAAAmZmAADypwAADVkAABPQAAALA3BhcmEAAAAAAAMAAAACZmYAAPKnAAAN
+	WQAAE9AAAAsDcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACwN2Y2d0AAAAAAAA
+	AAAAAwEAAAIAAAARAE8AwAE1AacCKQKoAzgD0QRyBSEF2gaYB2MIPwkjCg8LDQwRDSUO
+	PQ9cEIcRuxL2FDsVexbKGBYZaRrBHBgddB7QIC0hkyMbJKEmLCezKUUq0ixlLfovkDEm
+	MsM0XTX6N5g5OTrXPHo+Gj++QWFDAkSqRk5H9UmdS0JMzE4TT1FQj1HNUw1UTVWOVs9Y
+	EFlUWpZb110aXltfn2DiYiVjamStZfFnNWh6ab9rBmwpbTFuNm87cEFxRnJKc050UnVW
+	dlh3WXhaeVp6WntYfFd9VH5Rf02ASoFGgkKDPYQ3hTCGKocmiCKJHoobixmMF40WjheP
+	F5AZkRySH5MjlCeVLZYzlzmYP5lFmkibSZxKnUyeTZ9PoFGhUqJTo1OkU6VTplKnUahP
+	qU2qSqtHrEWtQq4/r0CwS7FesnCzg7SWtai2ubfKuNy57Lr7vAq9Gb4nvzTAQsFOwlvD
+	Z8R0xXvGc8dnyFrJTco+yy/MHs0NzfvO5s/Q0LnRoNKG02rUTtUw1hLW9NfV2KXZc9pB
+	2w3b2tyk3W3eNd7838DgguFE4gTiwuN+5Dnk9OWu5mbnG+fF6GzpE+m56lzq/+ue7Dzs
+	1+1u7gTulu8m77PwPfDG8Uzx0vJa8uTzcfP99IX1DfWQ9hP2kfcO94n4BfiB+P/5iPoY
+	+sP7k/yd/g///wAAAAwAOACJAQEBTgGvAhsCgAL1A2cD5gRqBPsFjwYvBt0HlAhXCSYJ
+	/ArgC9EMzw3bDu4QDBEvEmATmRTaFiEXcBjAGhgbeRzrHnMf+yGGIxIkniYpJ7UpOirB
+	LEItxC9BMLkyMjOfNQ02dzfaOTo6kzvqPT4+kD/eQSpCc0OxRNpGAUcoSFBJdkqeS8RM
+	6U4OTzNQV1F6Up1TvlTfVgBXIFhAWV9afVucXLtd2V75YAthEmIYYx9kJWUsZjJnOGg8
+	aUBqQ2tFbERtQm5AbztwNHEtciNzGHQMdP918Xbdd8F4pXmJem57VHw6fSF+Cn7zf92A
+	yYG1gqKDkIR9hWyGW4dMiDyJLIodiw6MAIzyjeWO2I/NkMKRuJKtk6OUmpWPloWXephu
+	mWGaU5tEnDSdJJ4TnwGf86DwofOi9qP5pPul/ab9p/2o/an7qvmr96z2rfSu8q/ysPCx
+	8LLxs/O097YCtw24GLkiuiu7NLw7vUK+SL9OwFPBWcJew2TEasVxxnjHgciJyZLKjcuE
+	zHzNdc5tz2XQXNFT0krTQNQ11SjWG9cM1/3Y69nY2sXbsNyY3XzeXt9B4CThB+Hp4svj
+	ruSP5W/mT+cu6Azo6enE6p7rd+xQ7SvuD+757+bw1fHH8rvzsPSn9Z/2mPeR+Ij5fvpy
+	+2X8Vf1C/i3/F///AAAAEQBPAMABLAGMAgQCYQLRA0QDvgQ9BMAFRQXKBlcG6weACBwI
+	uAlaCgIKrQteDBYMzA2IDkoPDw/VEKARbxJAExQT6BTAFbgWyxfoGQYaJRtCHGUdhR6l
+	H8cg6SIMIzEkUCV0JpYnuCjdKgArIixFLWkuiy+vMNIx9jMbNDc1JzYWNwg3+jjtOeA6
+	1DvIPL09sj6oP55AlUGMQoRDfER0RW1GZkdfSFpJVUpQS0tMPE0lTg1O9U/dUMdRsVKa
+	U4RUblVZVkRXLlgYWQRZ71raW8Zcsl2eXotfeGBlYUtiJGL7Y9Jkq2WDZlxnNGgMaOVp
+	vWqWa25sRW0dbfRuy2+jcHpxUnIpcwBz0XSadV92I3bod614dHk6egJ6ynuSfFx9Jn3w
+	frt/h4BTgSCB7YK6g4mEV4UmhfSGw4eSiGGJMIoAitCLoYxyjUSOFo7pj7yQj5FjkjeT
+	DJPhlLeVjJZll0SYJZkHmemay5uunJCddJ5XnzugIKEEoemiz6O1pJulgaZop0+oPak7
+	qkSrTaxXrWKuba94sIaxlLKjs7O0xLXWtui3/LkQuiW7O7xSvXK+pb/fwRzCW8OdxOPG
+	LMd5yMjKG8twzMbOH8950NTSM9OQ1O7WTtev2Q/abtv83cXfl+Ft40nlL+cj6SjrRO13
+	78fyM/S992X6Kf0I//8AAG5kaW4AAAAAAAAGNgAApaEAAFanAABPbwAAoWgAACX9AAAO
+	0gAAUA0AAFQ5AAL1wgACXrgAAZHrAAMBAAACAAAABQAPAB0ALQA/AFIAZwB8AJIAqQDA
+	ANgA8AEJASMBPQFYAXMBjwGrAckB5wIFAiUCRQJmAocCqgLNAvEDFgM8A2MDhwOrA9AD
+	9gQcBEQEawSTBLwE5gUQBToFZgWSBb4F7AYZBkgGdwanBtcHCAc6B2wHnwfTCAcIPAhy
+	CKgI3wkXCVAJiQnCCf0KOAp0CrAK7QsrC2oLqQv4DE8Mpw0ADVsNtg4TDnEO0A8wD5IP
+	9RBYEL0RJBGMEfUSYBLLEzgTphQWFIYU+BVsFeAWVhbNF0UXvhg4GMsZaBoHGqgbSxvw
+	HJgdQh3vHp0fTyAEILshdSIxIvEjsyR4JUAmCibXJ6YoeClNKiUrACvdLLotmi58L18w
+	RDErMhMy/TPpNNU1xDa0N6Y4mTmOOoU7fjx4PXc+ez+CQItBlkKkQ7RExkXbRvNIDkkr
+	SktLb0yVTb9O61AaUUxSgFO3VPBWJFdKWHFZm1rGW/RdJF5YX45gxWIAYz5kf2XCZwho
+	UmmcauxsPW2QbuZwPnGjcyR0pnYtd7h5R3rcfHV+En+3gWKDEYTHhoSIRooNi9qNq4+A
+	kYCTiJWXl6yZypvxniCgW6KhpPCnTam0rCSunrEfs922rLmKvHq/gMKhxeXJS8zX0IjU
+	W9ga28rfpeOs5+nsTvCv9LH38Ppu/En9tv7o//8AAAAHABYAKwBEAF8AfACZALcA1QD0
+	ARMBMgFRAXABkAGwAdEB8gITAjUCVwJ6Ap0CwQLmAwsDMANWA3oDngPCA+gEDgQ0BFwE
+	hAStBNcFAQUtBVoFhwW2BeYGFgZIBnsGrwblBxsHVAeNB8gIBAhCCIIIwwkGCUsJkQnZ
+	CiIKbQq6CwgLWAuqDAQMYgzBDSINhA3oDk0OtA8dD4gP9BBiENIRRBG3Ei0SpRMeE5kU
+	FhSVFRYVmRYdFqMXKxe1GD8Y1xl0GhIashtVG/kcoB1JHfUepB9VIAogwiF+Ijwi/yPF
+	JI4lXCYtJwEn2ii1KZ8qjit/LHItZi5dL1YwTzFLMkgzRzRINUo2TzdWOF45aDp1O4U8
+	lj2qPr8/10DwQgtDKERGRWdGikevSNhKA0syTGVNnE7WUBVRWFKeU+hVNVZ3V61Y51oj
+	W2NcpV3sXzZggmHSYyZkfGXUZy9ojWnra01ssG4Ub3pw4HI+c550/3Zkd815OHqofBt9
+	kX8KgIaCBoOHhQqGkIgXiaCLKoy1jkKP0ZGAkzGU45aYmE+aC5vKnYufUaEcou2kwaac
+	qHuqYqxOrj6wNbI2tEi2W7hxuoq8p77JwO3DGcVKx3/JvcwAzkzQntL21VXXnNnS3AXe
+	NuBk4o/kuebj6Q3rOe1p76Dx3PQh9m74xfsl/Y///wAAAAUAEQAkADsAVgB2AJgAvQDl
+	AQ8BOwFoAZgByQH8AjECZwKfAtkDFQNSA4YDuQPsBCEEVwSPBMcFAQU9BXoFuAX4BjkG
+	ewbABwUHTAeVB98IKgh3CMYJFglnCbsKDwplCr0LFgtwC88MQQy2DSwNpA4eDpoPGA+Y
+	EBoQnhEkEawSNhLCE1AT4BRyFQYVnRY0Fs4XahgIGK8ZXxoSGscbfxw4HPQdsx50Hzcf
+	/SDGIZEiXiMuJAAk1SWsJoUnYSg/KSYqISsfLB8tIi4oLzIwPjFOMmEzeDSSNbA20jf2
+	OR86Sjt5PKs99T9MQKdCBUNlRMhGLUeVSP9Ka0vbTUxOwFA3UbFTLVSsVi1XtVk+Wstc
+	Wl3tX4JhGWKzZFBl72eRaTVq3GyGbjJv4XGNcy100HZ1eB15x3t1fSN+1ICIgj+D94Wy
+	h2+JL4ryjLaOfZAzkcaTW5TxlomYIZm7m1ic856QoC6hzaNtpQ2msKhRqfarm61Bruiw
+	kLIls6S1IraguB25mLsTvIu+A794wO3CYcPTxUXGtsgoyZrLDMx+zfHPYdDV0knTv9U0
+	1qrYIdma2xXckd3V3wDgI+FG4mjji+Sr5cvm6OgC6RrqLes97EntTu5R703wRvE68inz
+	E/P59Nz1uvaV9234QPkS+d/6rPt0/Dz8//3C/oL/Qf//AABkZXNjAAAAAAAAAApDb2xv
+	ciBMQ0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAASAAAADG5s
+	TkwAAAAWAAAA6GRhREsAAAAcAAAA/nBsUEwAAAASAAABGmVuVVMAAAASAAABLG5iTk8A
+	AAASAAABPmZyRlIAAAAWAAABUHB0QlIAAAAYAAABZnB0UFQAAAAWAAABfnpoQ04AAAAM
+	AAABlGVzRVMAAAASAAABoGphSlAAAAAOAAABsnJ1UlUAAAAkAAABwHN2U0UAAAAQAAAB
+	5HpoVFcAAAAOAAAB9GRlREUAAAAQAAACAmZpRkkAAAAQAAACEml0SVQAAAAUAAACImtv
+	S1IAAAAMAAACNgBLAGwAZQB1AHIAZQBuAC0ATABDAEQATABDAEQALQBmAGEAcgB2AGUA
+	cwBrAOYAcgBtAEsAbwBsAG8AcgAgAEwAQwBEAEMAbwBsAG8AcgAgAEwAQwBEAEYAYQBy
+	AGcAZQAtAEwAQwBEAEwAQwBEACAAYwBvAHUAbABlAHUAcgBMAEMARAAgAEMAbwBsAG8A
+	cgBpAGQAbwBMAEMARAAgAGEAIABDAG8AcgBlAHNfaYJyACAATABDAEQATABDAEQAIABj
+	AG8AbABvAHIwqzDpMPwAIABMAEMARAQmBDIENQRCBD0EPgQ5ACAEFgQaAC0ENAQ4BEEE
+	PwQ7BDUEOQBGAOQAcgBnAC0ATABDAERfaYJybbJmdphveTpWaABGAGEAcgBiAC0ATABD
+	AEQAVgDkAHIAaQAtAEwAQwBEAEwAQwBEACAAYwBvAGwAbwByAGnO7LfsACAATABDAEQA
+	AG1tb2QAAAAAAAAGEAAAnKMAAAAAxXh9gAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENv
+	cHlyaWdodCBBcHBsZSwgSW5jLiwgMjAxMAA=
+	</data>
+	<key>ReadOnly</key>
+	<string>NO</string>
+	<key>RowAlign</key>
+	<integer>1</integer>
+	<key>RowSpacing</key>
+	<real>36</real>
+	<key>SheetTitle</key>
+	<string>Canvas 1</string>
+	<key>SmartAlignmentGuidesActive</key>
+	<string>YES</string>
+	<key>SmartDistanceGuidesActive</key>
+	<string>YES</string>
+	<key>UniqueID</key>
+	<integer>1</integer>
+	<key>UseEntirePage</key>
+	<false/>
+	<key>VPages</key>
+	<integer>1</integer>
+	<key>WindowInfo</key>
+	<dict>
+		<key>CurrentSheet</key>
+		<integer>0</integer>
+		<key>ExpandedCanvases</key>
+		<array>
+			<dict>
+				<key>name</key>
+				<string>Canvas 1</string>
+			</dict>
+		</array>
+		<key>Frame</key>
+		<string>{{1, 0}, {1022, 878}}</string>
+		<key>ListView</key>
+		<true/>
+		<key>OutlineWidth</key>
+		<integer>142</integer>
+		<key>RightSidebar</key>
+		<false/>
+		<key>ShowRuler</key>
+		<true/>
+		<key>Sidebar</key>
+		<false/>
+		<key>SidebarWidth</key>
+		<integer>120</integer>
+		<key>VisibleRegion</key>
+		<string>{{-25, -13}, {806.4, 579.2}}</string>
+		<key>Zoom</key>
+		<real>1.25</real>
+		<key>ZoomValues</key>
+		<array>
+			<array>
+				<string>Canvas 1</string>
+				<real>1.25</real>
+				<real>1</real>
+			</array>
+		</array>
+	</dict>
+	<key>saveQuickLookFiles</key>
+	<string>YES</string>
+</dict>
+</plist>

Copied: CalendarServer/trunk/doc/Developer/Calendar Store Schema.graffle (from rev 5919, CalendarServer/branches/new-store/doc/Developer/Calendar Store Schema.graffle)
===================================================================
--- CalendarServer/trunk/doc/Developer/Calendar Store Schema.graffle	                        (rev 0)
+++ CalendarServer/trunk/doc/Developer/Calendar Store Schema.graffle	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,4462 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>ActiveLayerIndex</key>
+	<integer>0</integer>
+	<key>ApplicationVersion</key>
+	<array>
+		<string>com.omnigroup.OmniGrafflePro</string>
+		<string>138.14.0.129428</string>
+	</array>
+	<key>AutoAdjust</key>
+	<true/>
+	<key>BackgroundGraphic</key>
+	<dict>
+		<key>Bounds</key>
+		<string>{{0, 0}, {756, 553}}</string>
+		<key>Class</key>
+		<string>SolidGraphic</string>
+		<key>ID</key>
+		<integer>2</integer>
+		<key>Style</key>
+		<dict>
+			<key>shadow</key>
+			<dict>
+				<key>Draws</key>
+				<string>NO</string>
+			</dict>
+			<key>stroke</key>
+			<dict>
+				<key>Draws</key>
+				<string>NO</string>
+			</dict>
+		</dict>
+	</dict>
+	<key>CanvasOrigin</key>
+	<string>{0, 0}</string>
+	<key>ColumnAlign</key>
+	<integer>1</integer>
+	<key>ColumnSpacing</key>
+	<real>36</real>
+	<key>CreationDate</key>
+	<string>2010-06-17 13:40:02 -0400</string>
+	<key>Creator</key>
+	<string>Wilfredo Sanchez</string>
+	<key>DisplayScale</key>
+	<string>1p = 1p</string>
+	<key>GraphDocumentVersion</key>
+	<integer>6</integer>
+	<key>GraphicsList</key>
+	<array>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>200</integer>
+			</dict>
+			<key>ID</key>
+			<integer>201</integer>
+			<key>Points</key>
+			<array>
+				<string>{299.179, 299.839}</string>
+				<string>{289.26, 368.737}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>11</integer>
+				<key>Info</key>
+				<integer>1</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{258.5, 369.188}, {57, 30.5}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>200</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 notify token}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{156.75, 137.75}, {81, 32.625}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>199</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 iCalendar text}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>197</integer>
+			</dict>
+			<key>ID</key>
+			<integer>198</integer>
+			<key>Points</key>
+			<array>
+				<string>{612.375, 286.171}</string>
+				<string>{679.84, 305.852}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>54</integer>
+				<key>Info</key>
+				<integer>12</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{672.625, 299.25}, {81, 32.625}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>197</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 iCalendar type}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>195</integer>
+			</dict>
+			<key>ID</key>
+			<integer>196</integer>
+			<key>Points</key>
+			<array>
+				<string>{79.375, 194.25}</string>
+				<string>{69.25, 194.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>161</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{-2, 182.75}, {70.75, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>195</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 changes}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>193</integer>
+			</dict>
+			<key>ID</key>
+			<integer>194</integer>
+			<key>Points</key>
+			<array>
+				<string>{97.6559, 177.185}</string>
+				<string>{84.0168, 168.114}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>161</integer>
+				<key>Info</key>
+				<integer>13</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>199</integer>
+			</dict>
+			<key>ID</key>
+			<integer>189</integer>
+			<key>Points</key>
+			<array>
+				<string>{142.537, 177.025}</string>
+				<string>{168.746, 166.025}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>161</integer>
+				<key>Info</key>
+				<integer>14</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>186</integer>
+			</dict>
+			<key>ID</key>
+			<integer>188</integer>
+			<key>Points</key>
+			<array>
+				<string>{119.875, 176.25}</string>
+				<string>{119.875, 147.875}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>161</integer>
+				<key>Info</key>
+				<integer>6</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{48.625, 147.375}, {43, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>193</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 md5}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{79.375, 114.75}, {81, 32.625}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>186</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 iCalendar uid}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>180</integer>
+			</dict>
+			<key>ID</key>
+			<integer>181</integer>
+			<key>Points</key>
+			<array>
+				<string>{447.026, 295.507}</string>
+				<string>{454.064, 309.128}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>53</integer>
+				<key>Info</key>
+				<integer>15</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{443.625, 308.875}, {32.5, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>180</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 \ul \ulc0 rid}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>25</integer>
+			</dict>
+			<key>ID</key>
+			<integer>177</integer>
+			<key>Points</key>
+			<array>
+				<string>{571.728, 258.21}</string>
+				<string>{565.738, 238.743}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>54</integer>
+				<key>Info</key>
+				<integer>6</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>171</integer>
+			</dict>
+			<key>ID</key>
+			<integer>176</integer>
+			<key>Points</key>
+			<array>
+				<string>{594.537, 259.462}</string>
+				<string>{622.457, 215.346}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>54</integer>
+				<key>Info</key>
+				<integer>14</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{521.125, 213.875}, {81, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>25</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>GapRatio</key>
+					<real>0.5</real>
+					<key>Width</key>
+					<real>4</real>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 attendees}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{591.625, 192.125}, {76.5, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>171</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 organizer}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{79.375, 176.25}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>161</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>1</string>
+						<key>g</key>
+						<string>0.720683</string>
+						<key>r</key>
+						<string>0.545455</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 iTIP message}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>157</integer>
+			</dict>
+			<key>ID</key>
+			<integer>158</integer>
+			<key>Points</key>
+			<array>
+				<string>{160.569, 294.747}</string>
+				<string>{158.979, 308.79}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>4</integer>
+				<key>Info</key>
+				<integer>5</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{141.375, 309.25}, {32.5, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>157</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 \ul \ulc0 rid}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>144</integer>
+			</dict>
+			<key>ID</key>
+			<integer>155</integer>
+			<key>Points</key>
+			<array>
+				<string>{527.75, 381.688}</string>
+				<string>{563.956, 398.549}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>139</integer>
+				<key>Info</key>
+				<integer>5</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>147</integer>
+			</dict>
+			<key>ID</key>
+			<integer>154</integer>
+			<key>Points</key>
+			<array>
+				<string>{527.75, 381.688}</string>
+				<string>{512.801, 428.329}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>139</integer>
+				<key>Info</key>
+				<integer>5</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>148</integer>
+			</dict>
+			<key>ID</key>
+			<integer>153</integer>
+			<key>Points</key>
+			<array>
+				<string>{527.75, 381.688}</string>
+				<string>{557.692, 428.71}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>139</integer>
+				<key>Info</key>
+				<integer>5</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>145</integer>
+			</dict>
+			<key>ID</key>
+			<integer>152</integer>
+			<key>Points</key>
+			<array>
+				<string>{527.75, 381.688}</string>
+				<string>{502.79, 394.905}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>139</integer>
+				<key>Info</key>
+				<integer>5</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>143</integer>
+			</dict>
+			<key>ID</key>
+			<integer>151</integer>
+			<key>Points</key>
+			<array>
+				<string>{594.033, 295.128}</string>
+				<string>{621.037, 345.559}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>54</integer>
+				<key>Info</key>
+				<integer>15</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{539.5, 428.688}, {51, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>148</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 md5}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{483.5, 428.688}, {51, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>147</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 size}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{450.25, 391.062}, {62, 30.5}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>145</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 content\
+type}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{559.125, 394.812}, {43, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>144</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 path}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{580.625, 345.75}, {98.5, 32.625}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>143</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 attachments\
+mode}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>54</integer>
+				<key>Info</key>
+				<integer>16</integer>
+			</dict>
+			<key>ID</key>
+			<integer>140</integer>
+			<key>Points</key>
+			<array>
+				<string>{550.412, 346.462}</string>
+				<string>{550.943, 294.688}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>DoubleBar</string>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>CrowBall</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>139</integer>
+				<key>Info</key>
+				<integer>14</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>74</integer>
+				<key>Info</key>
+				<integer>5</integer>
+			</dict>
+			<key>ID</key>
+			<integer>95</integer>
+			<key>Points</key>
+			<array>
+				<string>{424.875, 259.062}</string>
+				<string>{424.875, 206.562}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>CrowBall</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>DoubleBar</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>53</integer>
+				<key>Info</key>
+				<integer>6</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{487.25, 345.688}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>139</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>1</string>
+						<key>g</key>
+						<string>0.720683</string>
+						<key>r</key>
+						<string>0.545455</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 Attachment}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>134</integer>
+			</dict>
+			<key>ID</key>
+			<integer>138</integer>
+			<key>Points</key>
+			<array>
+				<string>{299.25, 299.344}</string>
+				<string>{385.781, 359.37}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>136</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>133</integer>
+			</dict>
+			<key>ID</key>
+			<integer>137</integer>
+			<key>Points</key>
+			<array>
+				<string>{299.25, 254.344}</string>
+				<string>{280.665, 236.247}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>11</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>132</integer>
+			</dict>
+			<key>ID</key>
+			<integer>136</integer>
+			<key>Points</key>
+			<array>
+				<string>{299.25, 299.344}</string>
+				<string>{319.186, 335.71}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>11</integer>
+				<key>Info</key>
+				<integer>1</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>131</integer>
+			</dict>
+			<key>ID</key>
+			<integer>135</integer>
+			<key>Points</key>
+			<array>
+				<string>{298.937, 299.733}</string>
+				<string>{269.393, 336.473}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>11</integer>
+				<key>Info</key>
+				<integer>1</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{363.625, 358.688}, {75.5, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>134</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 message}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{242.75, 213.875}, {53.5, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>133</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 status}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{296.5, 335.625}, {62, 30.5}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>132</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 sharee seen}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{229.312, 335.625}, {57, 30.5}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>131</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 owner seen}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>124</integer>
+			</dict>
+			<key>ID</key>
+			<integer>126</integer>
+			<key>Points</key>
+			<array>
+				<string>{139.693, 294.25}</string>
+				<string>{123.706, 307.777}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>4</integer>
+				<key>Info</key>
+				<integer>16</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{81.625, 305.5}, {53.5, 30.5}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>124</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 owner\
+uid}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>114</integer>
+			</dict>
+			<key>ID</key>
+			<integer>115</integer>
+			<key>Points</key>
+			<array>
+				<string>{612.375, 258.688}</string>
+				<string>{628.258, 242.493}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>54</integer>
+				<key>Info</key>
+				<integer>2</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{621.625, 221.188}, {32.5, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>114</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 \ul \ulc0 rid}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>4</integer>
+				<key>Info</key>
+				<integer>3</integer>
+			</dict>
+			<key>ID</key>
+			<integer>113</integer>
+			<key>Points</key>
+			<array>
+				<string>{119.875, 212.25}</string>
+				<string>{120.125, 258.25}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>DoubleBar</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>CrowBall</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>161</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>93</integer>
+			</dict>
+			<key>ID</key>
+			<integer>110</integer>
+			<key>Points</key>
+			<array>
+				<string>{612.375, 268.734}</string>
+				<string>{680.43, 247.847}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>54</integer>
+				<key>Info</key>
+				<integer>11</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>108</integer>
+			</dict>
+			<key>ID</key>
+			<integer>109</integer>
+			<key>Points</key>
+			<array>
+				<string>{299.25, 254.344}</string>
+				<string>{334.16, 234.611}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>11</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{325, 213.875}, {51, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>108</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 mode}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>106</integer>
+			</dict>
+			<key>ID</key>
+			<integer>107</integer>
+			<key>Points</key>
+			<array>
+				<string>{298.823, 299.604}</string>
+				<string>{205.253, 356.767}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>11</integer>
+				<key>Info</key>
+				<integer>1</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{146.25, 354.5}, {75.5, 30.5}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>106</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 resource name}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>104</integer>
+			</dict>
+			<key>ID</key>
+			<integer>105</integer>
+			<key>Points</key>
+			<array>
+				<string>{424.875, 295.062}</string>
+				<string>{406.711, 308.293}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>53</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{364.625, 305.125}, {51, 30.5}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>104</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 sync token}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{663, 101.312}, {37.625, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>8</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{0, -1}</string>
+				<string>{0.95, -0.308}</string>
+				<string>{0.608, 0.808}</string>
+				<string>{-0.608, 0.808}</string>
+				<string>{-0.95, -0.308}</string>
+			</array>
+			<key>Shape</key>
+			<string>Cross</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.269368</string>
+						<key>g</key>
+						<string>0.225937</string>
+						<key>r</key>
+						<string>1</string>
+					</dict>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 rid}</string>
+			</dict>
+			<key>TextRelativeArea</key>
+			<string>{{0.318, 0.345}, {0.363, 0.345}}</string>
+			<key>Wrap</key>
+			<string>NO</string>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{335.5, 126.938}, {58.375, 30.5}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>178</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 viewer uid}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>178</integer>
+			</dict>
+			<key>ID</key>
+			<integer>179</integer>
+			<key>Points</key>
+			<array>
+				<string>{401.049, 170.257}</string>
+				<string>{381.446, 155.125}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>74</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>54</integer>
+				<key>Info</key>
+				<integer>3</integer>
+			</dict>
+			<key>ID</key>
+			<integer>96</integer>
+			<key>Points</key>
+			<array>
+				<string>{465.375, 206.562}</string>
+				<string>{531.375, 258.688}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>DoubleBar</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>CrowBall</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>74</integer>
+				<key>Info</key>
+				<integer>1</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>74</integer>
+				<key>Info</key>
+				<integer>4</integer>
+			</dict>
+			<key>ID</key>
+			<integer>94</integer>
+			<key>Points</key>
+			<array>
+				<string>{183.287, 259.025}</string>
+				<string>{256.625, 206.312}</string>
+				<string>{384.375, 206.562}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>CrowBall</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>DoubleBar</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>4</integer>
+				<key>Info</key>
+				<integer>14</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{672.625, 221.5}, {81, 32.625}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>93</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 iCalendar text}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>89</integer>
+			</dict>
+			<key>ID</key>
+			<integer>91</integer>
+			<key>Points</key>
+			<array>
+				<string>{612.375, 294.688}</string>
+				<string>{631.542, 313.339}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>54</integer>
+				<key>Info</key>
+				<integer>1</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>88</integer>
+			</dict>
+			<key>ID</key>
+			<integer>90</integer>
+			<key>Points</key>
+			<array>
+				<string>{612.375, 276.688}</string>
+				<string>{672.125, 276.688}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>54</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{617.125, 312.625}, {51, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>89</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 name}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{672.625, 260.375}, {81, 32.625}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>88</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 iCalendar uid}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>77</integer>
+			</dict>
+			<key>ID</key>
+			<integer>79</integer>
+			<key>Points</key>
+			<array>
+				<string>{447.537, 171.337}</string>
+				<string>{469.076, 152.714}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>74</integer>
+				<key>Info</key>
+				<integer>14</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>76</integer>
+			</dict>
+			<key>ID</key>
+			<integer>78</integer>
+			<key>Points</key>
+			<array>
+				<string>{424.875, 170.562}</string>
+				<string>{424.875, 154.188}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>74</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{455.75, 130.688}, {51, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>77</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 value}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{399.375, 130.688}, {51, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>76</integer>
+			<key>Shape</key>
+			<string>Circle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.541917</string>
+						<key>g</key>
+						<string>1</string>
+						<key>r</key>
+						<string>0.543865</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 name}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{384.375, 170.562}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>74</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>1</string>
+						<key>g</key>
+						<string>0.720683</string>
+						<key>r</key>
+						<string>0.545455</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 Resource Property}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>53</integer>
+			</dict>
+			<key>ID</key>
+			<integer>56</integer>
+			<key>Points</key>
+			<array>
+				<string>{531.375, 276.688}</string>
+				<string>{465.375, 277.062}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>DoubleBar</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>CrowBall</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>11</integer>
+				<key>Info</key>
+				<integer>3</integer>
+			</dict>
+			<key>ID</key>
+			<integer>15</integer>
+			<key>Points</key>
+			<array>
+				<string>{384.375, 277.062}</string>
+				<string>{330.25, 276.844}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>CrowBall</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>53</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{531.375, 258.688}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>54</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>1</string>
+						<key>g</key>
+						<string>0.720683</string>
+						<key>r</key>
+						<string>0.545455</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 Calendar Object}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{384.375, 259.062}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>53</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>1</string>
+						<key>g</key>
+						<string>0.720683</string>
+						<key>r</key>
+						<string>0.545455</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 Calendar}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{120.125, 258.25}, {81, 36}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>4</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{1, 1}</string>
+				<string>{1, -1}</string>
+				<string>{-1, -1}</string>
+				<string>{-1, 1}</string>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+				<string>{-0.5, -0.233518}</string>
+				<string>{-0.491442, 0.260063}</string>
+				<string>{0.507118, -0.224086}</string>
+				<string>{0.507118, 0.267179}</string>
+				<string>{-0.27431, -0.474028}</string>
+				<string>{0.27978, -0.478478}</string>
+				<string>{0.293938, 0.543044}</string>
+				<string>{-0.286232, 0.553804}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>1</string>
+						<key>g</key>
+						<string>0.720683</string>
+						<key>r</key>
+						<string>0.545455</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs24 \cf0 Calendar Home}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>11</integer>
+				<key>Info</key>
+				<integer>4</integer>
+			</dict>
+			<key>ID</key>
+			<integer>13</integer>
+			<key>Points</key>
+			<array>
+				<string>{201.125, 276.25}</string>
+				<string>{268.25, 276.844}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Cap</key>
+					<integer>0</integer>
+					<key>HeadArrow</key>
+					<string>0</string>
+					<key>HopLines</key>
+					<true/>
+					<key>HopType</key>
+					<integer>1</integer>
+					<key>Join</key>
+					<integer>0</integer>
+					<key>TailArrow</key>
+					<string>CrowBall</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>4</integer>
+				<key>Info</key>
+				<integer>7</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{268.25, 254.344}, {62, 45}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>11</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{0, 1}</string>
+				<string>{0, -1}</string>
+				<string>{1, 0}</string>
+				<string>{-1, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Diamond</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0</string>
+						<key>g</key>
+						<string>0.95051</string>
+						<key>r</key>
+						<string>1</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Bind}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+	</array>
+	<key>GridInfo</key>
+	<dict>
+		<key>GridSpacing</key>
+		<real>2.4000000953674316</real>
+		<key>MajorGridSpacing</key>
+		<integer>10</integer>
+		<key>ShowsGrid</key>
+		<string>YES</string>
+	</dict>
+	<key>GuidesLocked</key>
+	<string>NO</string>
+	<key>GuidesVisible</key>
+	<string>YES</string>
+	<key>HPages</key>
+	<integer>1</integer>
+	<key>ImageCounter</key>
+	<integer>1</integer>
+	<key>KeepToScale</key>
+	<false/>
+	<key>Layers</key>
+	<array>
+		<dict>
+			<key>Lock</key>
+			<string>NO</string>
+			<key>Name</key>
+			<string>Layer 1</string>
+			<key>Print</key>
+			<string>YES</string>
+			<key>View</key>
+			<string>YES</string>
+		</dict>
+	</array>
+	<key>LayoutInfo</key>
+	<dict>
+		<key>Animate</key>
+		<string>NO</string>
+		<key>circoMinDist</key>
+		<real>18</real>
+		<key>circoSeparation</key>
+		<real>0.0</real>
+		<key>layoutEngine</key>
+		<string>dot</string>
+		<key>neatoSeparation</key>
+		<real>0.0</real>
+		<key>twopiSeparation</key>
+		<real>0.0</real>
+	</dict>
+	<key>LinksVisible</key>
+	<string>NO</string>
+	<key>MagnetsVisible</key>
+	<string>NO</string>
+	<key>MasterSheets</key>
+	<array/>
+	<key>ModificationDate</key>
+	<string>2010-06-24 16:52:25 -0400</string>
+	<key>Modifier</key>
+	<string>Glyph Lefkowitz</string>
+	<key>NotesVisible</key>
+	<string>NO</string>
+	<key>Orientation</key>
+	<integer>2</integer>
+	<key>OriginVisible</key>
+	<string>NO</string>
+	<key>PageBreaks</key>
+	<string>YES</string>
+	<key>PrintInfo</key>
+	<dict>
+		<key>NSBottomMargin</key>
+		<array>
+			<string>float</string>
+			<string>41</string>
+		</array>
+		<key>NSLeftMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+		<key>NSOrientation</key>
+		<array>
+			<string>int</string>
+			<string>1</string>
+		</array>
+		<key>NSPaperSize</key>
+		<array>
+			<string>size</string>
+			<string>{792, 612}</string>
+		</array>
+		<key>NSRightMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+		<key>NSTopMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+	</dict>
+	<key>PrintOnePage</key>
+	<false/>
+	<key>QuickLookPreview</key>
+	<data>
+	JVBERi0xLjMKJcTl8uXrp/Og0MTGCjUgMCBvYmoKPDwgL0xlbmd0aCA2IDAgUiAvRmls
+	dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAG1nUuTHMltx+/1Keo4e2BvvR9Hi7bD
+	0sV6MEIHhw/0aNZLmbO7GnIly5/evz8ygczuru4ZKWxtKDgEC1lIFBKPfyJz/tT+pv1T
+	2/HfOi/tPI/ty1P7+/aH9tv3X/r28Uvb239fHtt33Wlu9f/qwe/ab3/99PL49NPXnz9+
+	bl4+MdSisbp23tplHtqp607Lts7t43P77S+f+/Yff+SF3/726fPHr5/+/PT+x88/vnx6
+	fvr68umxhb3nBfvczX3Ttbxy2PfTMPPHdlrmZWif23HsjLIup16Uz/HMPKZnoCxb/Uzz
+	uf0+niojfcfLfsX//5hm+v53JnbX/u49k0AO/nunP6QShE+iNMM8ncZp3M5F2UQpoiC1
+	PXMmSn7GRalH+p1U8v7LIHXbvCsBXAU+YUT5xYe2H7KAA0L2p3Hb1r0dT/O079vWfEDX
+	/9yfOqbx4bv239qHX3z6Rp9vaB9+8B/+8E377+2HX7X/9IGXd2iiQxPVe23ijSbe76dl
+	mMZ2QISpHxemXmk4T0tTuOQ2tXU93HxCmNHd1GhAvtQwJdq4dIs0p8eWbuK5Qc/ZS5gY
+	zy3GO07Dnp+btx3aJjuYRj7u0G+ndZnEO52GLfPup33AoId1Pk3LwsuYxt5tG5T1NC7z
+	nviGhR/W7TQPa99gcP2KEiUak942Jt0vp2WandKJMp2mzV638QOyiG08jcM4pMG7dW2M
+	IpF4fWfjTLyj18sQclpZWnDNp7XDcoZ1PHWbibSels7GGU99N/BPeXJNTO6xzeZiq5P1
+	OPGfFuY6dAtv6rVw+qE79VL7jG7mFmXt+l/L13t5aorpH32ympchznn95clWG15VDdEv
+	LPb8sdOSvzDVQYtnW8b23dheGGnz8N5N86P/8Nl/ePIfavNNBh0Pv7Rh0c2ZLb4qFZ+4
+	6yZMo2e9nC+d5uFf/NU/+g/PSFOWjrvJGx9i3Jgyuhjm9bTrh63nIzT42O9qzYWbKc/v
+	p066tOflk+85iQnFysnK3PQWrVtU3zGvbmg/yB6Kv4iPMF3M9uH9x89PP/zh48s37Yc/
+	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
+	vJF9um7UIgg8iG5cE2oRBGxUK2PIoQZEsnwkc1mdkq4B0IxqPp93jB6acAnSHQrGl+Uk
+	FYjR7bj2ThNpSBCUIqfPryybI8ia3x9kFYEdnrmOXRwCSD2ER83oPzhGFhtRHitiNX3n
+	v0Hv1rHq+v1HPTq0Zlkr770exnh9fbVl9UsM7uWJOqDHTZD4RX7gxJWaTnSxBL+mDOeP
+	z+OicN3VrvT3N/8L8KUQDQplbmRzdHJlYW0KZW5kb2JqCjYgMCBvYmoKMTA0OTUKZW5k
+	b2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCA0IDAgUiAvUmVzb3VyY2Vz
+	IDcgMCBSIC9Db250ZW50cyA1IDAgUiAvTWVkaWFCb3ggWzAgMCA3NTYgNTUzXQo+Pgpl
+	bmRvYmoKNyAwIG9iago8PCAvUHJvY1NldCBbIC9QREYgL1RleHQgL0ltYWdlQiAvSW1h
+	Z2VDIC9JbWFnZUkgXSAvQ29sb3JTcGFjZSA8PCAvQ3MxIDggMCBSCi9DczIgMTEgMCBS
+	ID4+IC9Gb250IDw8IC9GMS4wIDEyIDAgUiA+PiAvWE9iamVjdCA8PCAvSW0xIDkgMCBS
+	ID4+ID4+CmVuZG9iago5IDAgb2JqCjw8IC9MZW5ndGggMTAgMCBSIC9UeXBlIC9YT2Jq
+	ZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTIwIC9IZWlnaHQgMTE2IC9JbnRlcnBv
+	bGF0ZQp0cnVlIC9Db2xvclNwYWNlIDEzIDAgUiAvSW50ZW50IC9QZXJjZXB0dWFsIC9T
+	TWFzayAxNCAwIFIgL0JpdHNQZXJDb21wb25lbnQKOCAvRmlsdGVyIC9GbGF0ZURlY29k
+	ZSA+PgpzdHJlYW0KeAHt0AENAAAAwqD3T20PBxEoDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+	YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+	DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+	AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+	YMCAAQMGngcGoyAAAQplbmRzdHJlYW0KZW5kb2JqCjEwIDAgb2JqCjIwNQplbmRvYmoK
+	MTQgMCBvYmoKPDwgL0xlbmd0aCAxNSAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUg
+	L0ltYWdlIC9XaWR0aCAxMjAgL0hlaWdodCAxMTYgL0NvbG9yU3BhY2UKL0RldmljZUdy
+	YXkgL0ludGVycG9sYXRlIHRydWUgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9G
+	bGF0ZURlY29kZSA+PgpzdHJlYW0KeAHtmvdbU9n2xmdQ6b0XqaFIE0GkKYg0iQKhDxiE
+	QJxIR0PVKDWClFBCL4YWKaEKolO+3//tvuucgATDzLn3Zn667l98Tp7jeVlr7732Z621
+	f/rpx/jhgf9ZD/yMYfTdoF//OZdoFa9cuXKVGdeusf/iB+Yv+Ue0WVEoXsMwNjY5G8bG
+	9MvVq4y2waXJubATkiampqZmZubmFswwNzczww8mEL/KmG1QfzPGQpVEIWhpaWV9Nqws
+	LS0szBlpxmYDmkyyZKuJqZmFhZW1ja2dnb2DgyOGg4O9nZ2tjbWVhYWZqQnZbGRkOGFW
+	1tjUzNzC2sbOzsHRydnFxdUNw9XFxdnJ0cHOzsbawtzM1JgVNtDSZmVN4GEra4g6u7i5
+	e3h6enljeHl6eri7uThDGjabw2TGYsMI/0xOJllrW3tHFzcPTy8fX55/QEBgYECAP8/X
+	x8vTw83F0d4WJrPCBlpbRkZYUabmljDW2dXD04fnH3gjODSMGaHBNwL9eT6eHq7OMNnS
+	nFxtZGQQe2GuVtbRxR2qgcGh4RGRUbejMW5HRUaEhwYHQtndxVErfMXIIAb/DHNNzCys
+	7UjWLzA4LCIyOiYu4W4ixt2EuJjoyIiw4EA/VtjCDFNsGF3GXAsrWwcXdy+/wNCIqJj4
+	e0nJqWkZGGmpyUn34mOiIkID/bzcXRxsrSzg6SuGcDS52cTM0sbeGdYGhUXeiU9MTnvI
+	z8oRYORk8R+mJSfG34kMC4LFzvY2ljDYII6Gm41N4WUnN5KNik18kMHPzissLnmCUVJc
+	mJfNz3iQGBtFwm5OdtYw2CCO/tmIMdfR5bpvYFhkXFIqPye/+Em5qEr87Jm4SlT+pDg/
+	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
+	Ighaaw6yeJAiSVmraEXUNv0RYmsM2x+2RZBkM0nWbjbr7ia1pYjk4tEq3kXtoQf/gB56
+	8GQvSoVaRSjeqyhioRct8c1uTLal6sDOfvPeN+99b3bfAA1y0jT1gATkDcdSohFpbHxC
+	avyIAI6iCUE0JVXb7E4kBkGDc/l759h6D4FbVsN7+3eyd62a0raaB4T9QOBHmtkqsO8X
+	cQpZEgKIPN+hKcd0CN/j2PLsjzlOeXjBtQ8rPcRZInxANS3Of024U80l00CDSDiU9XFS
+	PpzXi5TXHQdpbmbGyBC9T5Cmu8zuq2KhnE72DpC9nfR+TrPePsIhwgsZrT9GuI2e9YzV
+	P+Jh4aTmxIY9HBg19PhgFbcaqfg1whRfEE0nolRx2S4N8Ziu/VbySoJwkDjKZGGAc1pI
+	T9dMbvi6hwV9JtcTr+J3VlHheY8TZ97U3e9F2gKvMA4dDBoMmg1IUBBFBGGYsFBAhjwa
+	MTSycj8jqwYbk3sydSRqu3RiRLFBezbcPbdRpN08/igicZRDtQiS/EH+Kq/JT+V5+ctc
+	sNhW95Stm5q68uA7xeWZuRoe19PI43NNXnyV1HaTV0eWrHl6vJrsGj/sV5cx5oI1j8Rz
+	sPvxLV+VzJcpjBTF41Xz6kuEdVoxN9+fbH87PeIuzy611nOtiYs3VpuXZ/1qSPvuqryT
+	5lX5T1718fxnzcRj4ikxJnaK5yGJl8Uu8ZLYS6sL4mBtxwidlYYp0m2R+iTVYGCavPUv
+	XT9beL1Gfwz1UZQZzNJUifd/wipkNJ25Dm/6j9vH/Bfk94rnnygCL2zgyJm6bVNx7xCh
+	ZaVuc64CF7/RffC2bmujfjj8BFg8qxatUjWfILwBHHaHeh7oKZjTlpbNOVKHLJ+TuunK
+	YlLMUNtDUlLXJddlSxazmVVi6XbYmdMdbhyhOUL3xKdKZZP6r/ERsP2wUvn5rFLZfk4a
+	1oGX+m/AvP1FCmVuZHN0cmVhbQplbmRvYmoKMTcgMCBvYmoKNzM3CmVuZG9iago4IDAg
+	b2JqClsgL0lDQ0Jhc2VkIDE2IDAgUiBdCmVuZG9iagoxOCAwIG9iago8PCAvTGVuZ3Ro
+	IDE5IDAgUiAvTiAxIC9BbHRlcm5hdGUgL0RldmljZUdyYXkgL0ZpbHRlciAvRmxhdGVE
+	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
+	28AT8dx4Obwh3gUfik/CF+Jr8e34MfwcfouChkKQQo3CksKb4ghFDkUVRRvFCMUHii0C
+	LUGYoEGwIwQSEglFhHpCL+EVYYVIJPIRVYnWxADiCWIRsYH4iDhD/ElJRylGqUfpShlN
+	eZqymrKT8gXlColEEiJpk1xIUaTTpBrSA9Ib0gYVPZUUlQmVN9VxqlKqZqoxqq/UFNSC
+	1DrUbtRx1IXUt6hHqBdpKGiEaPRoPGmO0ZTS3KGZoFmlpaeVpbWkDaHNpq2l7aedp8PR
+	CdEZ0HnTpdBV0j2gm6VH0fPT69GT6ZPpq+h76T8wYBmEGUwYAhmyGK4zDDMsMdIxKjA6
+	MMYyljLeZ5xmQjEJMZkwBTPlMDUyPWfaZOZk1mH2Yc5grmceY15nYWfRZvFhyWS5wfKM
+	ZZOVh9WANYj1LGsL62s2NJsYmzXbYbYLbL1si+wM7OrsZPZM9kb2KQ6YQ4zDhiOeo5Jj
+	iGOVk4vTiDOMs5jzAeciFxOXNlcgVz5XO9cCNz23JncAdz53B/cnHkYeHZ5gniKeHp4l
+	Xg5eY95o3ku8w7xbfMJ89nxJfDf4XvMT+FX4ffnz+bv5lwS4BSwEEgTqBKYEKQRVBP0F
+	zwn2Ca4LCQs5CqULtQjNC7MImwjHCdcJvxIhiWiJhItUiDwVxYqqiAaJnhd9IgaLKYr5
+	i5WKjYjD4kriAeLnxUclMBKqEqESFRITkpSSOpIxknWSM1JMUuZSSVItUl+lBaRdpM9K
+	90n/klGUCZapknkpSydrKpsk2ya7LCcmR5YrlXsqT5I3lD8u3yr/XUFcwUfhgsKkIr2i
+	hWK6YrfijpKyUoRSvdKCsoCyh3KZ8oQKg4qVSrbKI1WMqq7qcdV7qj/VlNSi1BrVvqlL
+	qgep16rP7xPe57Ovat+sBp+Gp8YljWlNHk0PzYua01q8Wp5aFVrvtPm1vbWvaM/piOoE
+	6lzT+aoroxuh26S7rqemd1SvUx+lb6SfqT9sQGdgb1Bi8MaQz9DPsM5wyUjRKN6o0xhj
+	bGZ81njChNOEbFJjsmSqbHrUtMeM0szWrMTsnbmYeYR5mwVsYWqRZ/Fqv+D+0P0tlsDS
+	xDLP8rWVsFW41V1rrLWVdan1RxtZmwSbPlt6W3fbWts1O127HLuX9iL20fbdDtQOrg41
+	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
+	bkMj0CJMgMVhCzgCLoF74RUUP8oBlY16gNpBq6BjEI1mA6OOScT0Y+mx7tjr2B2cFe4y
+	bhvvgL9FQUcRRTFJ0CRcJpKIMcRpSjPKVkT5KKIiUiVRbVLHUK/QRNGs0cbTwXSZ9Az0
+	5QwSDG2MZoxvmaKZqZhrWYxZFlhPscmzvWRP4ZDmeMmZzqXI9Z67kMeMF+a9xxfLr8z/
+	U6AdOf/mwoxIfV8pGiAmLbYm3iGRKekoJSy1KT0ic0X2hJybvKaCgCKNEkppS3lTZVsN
+	VifuY9EQ1lTTstIO0EnVrdLr1Z8zxBuJGZuZhJieMWsxn95PaaluFWJdYTNlx2hv65Dv
+	+NyZxeXAgQuu79xE3MM87nkRyK7eDb54Py//jkDuoMTg96HGh66F00QcjnwbbRrTGit6
+	5Hw8Q8LpY8TjWYlUSfkpnKm16aonBzLds9ZOnc2ROjOSG5nPVtBzLryYt+RZWdYF/YvQ
+	pa7K1Mvm1cxX39c2X8us92rQaOS4tdM02zJ0p+3u9fvVHVe7bj7o6B3tmx9ADfEO6z0J
+	GMt72vn8+wvBly6vs942z0zO/vhImhf6pLPo/jVx6fLy4x8b60I/nbayd3r2+I/0lZfb
+	ix4AotRF5Mc3u7srQgDgcgHYez9sVezu7lQixcYrADqD/9HW9yZjaQAoQ+IMAA/jZk/s
+	ff67/ReQ10TuCmVuZHN0cmVhbQplbmRvYmoKMjEgMCBvYmoKNTcwOAplbmRvYmoKMTMg
+	MCBvYmoKWyAvSUNDQmFzZWQgMjAgMCBSIF0KZW5kb2JqCjQgMCBvYmoKPDwgL1R5cGUg
+	L1BhZ2VzIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdIC9Db3VudCAxIC9LaWRzIFsgMyAw
+	IFIgXSA+PgplbmRvYmoKMjIgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL091dGxpbmVz
+	IDIgMCBSIC9QYWdlcyA0IDAgUiAvVmVyc2lvbiAvMS40ID4+CmVuZG9iagoyIDAgb2Jq
+	Cjw8IC9MYXN0IDIzIDAgUiAvRmlyc3QgMjQgMCBSID4+CmVuZG9iagoyNCAwIG9iago8
+	PCAvUGFyZW50IDI1IDAgUiAvQ291bnQgMCAvRGVzdCBbIDMgMCBSIC9YWVogMCA1NTMg
+	MCBdIC9UaXRsZSAoQ2FudmFzIDEpCj4+CmVuZG9iagoyNSAwIG9iago8PCA+PgplbmRv
+	YmoKMjMgMCBvYmoKPDwgL1BhcmVudCAyNSAwIFIgL0NvdW50IDAgL0Rlc3QgWyAzIDAg
+	UiAvWFlaIDAgNTUzIDAgXSAvVGl0bGUgKENhbnZhcyAxKQo+PgplbmRvYmoKMjYgMCBv
+	YmoKPDwgL0xlbmd0aCAyNyAwIFIgL0xlbmd0aDEgMTM5ODggL0ZpbHRlciAvRmxhdGVE
+	ZWNvZGUgPj4Kc3RyZWFtCngBvTt5fFTV1ffet86a2feVycxksi9kI4GMIQlhCYZFSNBg
+	whoQFBCCoUKjQoGIKCCLYK2ohQBihpDKAMWPIghYq2itC7VWK1q65Gf7fWgVmJnv3Dch
+	Qn5tf/7RX+fl3P29d+85557tvixdsmw2UqEOxKD6aS2L5iDpV/BzhMjlmQtbFiXr+lrI
+	35zZttSTrHNpCDEL5iyauzBZF59ESO6cu6C9/37DLIRc51pnt0Au/a5DWtQKDckqHgp5
+	auvCpQ8k67peyJ9ccN/M/n6DBerjFrY80P9+9BHUPfe2LJydHF+wA/LURffdv7S/ngn5
+	gkVLZvePxw0wv7cQhlY/ug/J0D1IQARp4GpCSLgsdyIWemk//GZlKrbcnVL+FdKKUv3u
+	usel/DXvz9/7Zvb1oGKT+C00yG6MpzkfiocQUmLo71NsGuiR7oPEH0WTMqJoNEAFQCFA
+	RsZtFtSB96AnAJ4FYNA8/ChqB1gP8BQAO1DaB7Wj+NEeVgwfw+3IhseEFax7ssHqtsgV
+	7neimO99xv2h5bPj2ArU+xRbe1RIdpscP4t/gmYhN/4p8uMVqBal4Z2HQwvczdC1Dy0C
+	6ABgpBTjfT2ufPcrOBP5WQz3BJCLxS+7/5iX5f48L0pwj/tUMMpC9gsX1MIp7pPOZ9z/
+	45zrfgXgQLJrfwhGvOze51zg3uKK4p097s3OKIZ7NiWzZU649WX3wtA296w8qX/ctig5
+	0OMuhf4pYYW7qMTrLnRecucEoyKGepZznDs971fuVLgRhnngof6w1u1wbnEPgy6Xszo4
+	DOA43o93oXS8q8c/xn0MirDcw6NDJdui+AeHa9Py/FG8IlxUm7YtVBv0h8a5/aGaYBDK
+	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
+	A//cMp/2QfUVtP7/Emw0UQplbmRzdHJlYW0KZW5kb2JqCjI3IDAgb2JqCjkzMzMKZW5k
+	b2JqCjI4IDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAvQXNjZW50IDc3MCAv
+	Q2FwSGVpZ2h0IDczNyAvRGVzY2VudCAtMjMwIC9GbGFncyAzMgovRm9udEJCb3ggWy05
+	NTEgLTQ4MSAxNDQ1IDExMjJdIC9Gb250TmFtZSAvTktKTVdQK0hlbHZldGljYSAvSXRh
+	bGljQW5nbGUgMAovU3RlbVYgMCAvTWF4V2lkdGggMTUwMCAvWEhlaWdodCA1NDAgL0Zv
+	bnRGaWxlMiAyNiAwIFIgPj4KZW5kb2JqCjI5IDAgb2JqClsgMjc4IDAgMCAwIDAgMCAw
+	IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1NTYgMCAwIDAgMCAwIDAgMCAwIDAg
+	MCAwIDY2Nwo2NjcgNzIyIDAgMCAwIDAgNzIyIDI3OCAwIDAgMCAwIDAgNzc4IDY2NyAw
+	IDcyMiAwIDYxMSAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCA1NTYgNTU2IDUwMCA1NTYg
+	NTU2IDI3OCA1NTYgNTU2IDIyMiAyMjIgNTAwIDIyMiA4MzMgNTU2IDU1NiA1NTYgMCAz
+	MzMKNTAwIDI3OCA1NTYgNTAwIDcyMiA1MDAgNTAwIDUwMCBdCmVuZG9iagoxMiAwIG9i
+	ago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9OS0pN
+	V1ArSGVsdmV0aWNhIC9Gb250RGVzY3JpcHRvcgoyOCAwIFIgL1dpZHRocyAyOSAwIFIg
+	L0ZpcnN0Q2hhciAzMiAvTGFzdENoYXIgMTIyIC9FbmNvZGluZyAvTWFjUm9tYW5FbmNv
+	ZGluZwo+PgplbmRvYmoKMzAgMCBvYmoKKE1hYyBPUyBYIDEwLjYuNCBRdWFydHogUERG
+	Q29udGV4dCkKZW5kb2JqCjMxIDAgb2JqCihEOjIwMTAwNjI0MjIxMzQ3WjAwJzAwJykK
+	ZW5kb2JqCjEgMCBvYmoKPDwgL1Byb2R1Y2VyIDMwIDAgUiAvQ3JlYXRpb25EYXRlIDMx
+	IDAgUiAvTW9kRGF0ZSAzMSAwIFIgPj4KZW5kb2JqCnhyZWYKMCAzMgowMDAwMDAwMDAw
+	IDY1NTM1IGYgCjAwMDAwMzQ2MzYgMDAwMDAgbiAKMDAwMDAyNDE2NyAwMDAwMCBuIAow
+	MDAwMDEwNjEyIDAwMDAwIG4gCjAwMDAwMjQwMDQgMDAwMDAgbiAKMDAwMDAwMDAyMiAw
+	MDAwMCBuIAowMDAwMDEwNTkxIDAwMDAwIG4gCjAwMDAwMTA3MTYgMDAwMDAgbiAKMDAw
+	MDAxNzIzNCAwMDAwMCBuIAowMDAwMDEwODc3IDAwMDAwIG4gCjAwMDAwMTEzMDIgMDAw
+	MDAgbiAKMDAwMDAxODA5OCAwMDAwMCBuIAowMDAwMDM0MzY3IDAwMDAwIG4gCjAwMDAw
+	MjM5NjcgMDAwMDAgbiAKMDAwMDAxMTMyMiAwMDAwMCBuIAowMDAwMDE2MzUzIDAwMDAw
+	IG4gCjAwMDAwMTYzNzQgMDAwMDAgbiAKMDAwMDAxNzIxNCAwMDAwMCBuIAowMDAwMDE3
+	MjcwIDAwMDAwIG4gCjAwMDAwMTgwNzggMDAwMDAgbiAKMDAwMDAxODEzNSAwMDAwMCBu
+	IAowMDAwMDIzOTQ2IDAwMDAwIG4gCjAwMDAwMjQwODcgMDAwMDAgbiAKMDAwMDAyNDMz
+	MCAwMDAwMCBuIAowMDAwMDI0MjE1IDAwMDAwIG4gCjAwMDAwMjQzMDggMDAwMDAgbiAK
+	MDAwMDAyNDQyMyAwMDAwMCBuIAowMDAwMDMzODQ3IDAwMDAwIG4gCjAwMDAwMzM4Njgg
+	MDAwMDAgbiAKMDAwMDAzNDA5MyAwMDAwMCBuIAowMDAwMDM0NTQyIDAwMDAwIG4gCjAw
+	MDAwMzQ1OTQgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAzMiAvUm9vdCAyMiAwIFIg
+	L0luZm8gMSAwIFIgL0lEIFsgPDA5MzRlMDNkM2I1ZmE0ZGNkMjkyZDMzNmE3ZDc5MmMz
+	Pgo8MDkzNGUwM2QzYjVmYTRkY2QyOTJkMzM2YTdkNzkyYzM+IF0gPj4Kc3RhcnR4cmVm
+	CjM0NzExCiUlRU9GCjEgMCBvYmoKPDwvQXV0aG9yIChXaWxmcmVkbyBTYW5jaGV6XG5H
+	bHlwaCBMZWZrb3dpdHopL0NyZWF0aW9uRGF0ZSAoRDoyMDEwMDYxNzE3NDAwMFopL0Ny
+	ZWF0b3IgKE9tbmlHcmFmZmxlIFByb2Zlc3Npb25hbCA1LjIuMikvTW9kRGF0ZSAoRDoy
+	MDEwMDYyNDIwNTIwMFopL1Byb2R1Y2VyIDMwIDAgUiAvVGl0bGUgKENhbGVuZGFyIFN0
+	b3JlIFNjaGVtYS5ncmFmZmxlKT4+CmVuZG9iagp4cmVmCjEgMQowMDAwMDM1NTA5IDAw
+	MDAwIG4gCnRyYWlsZXIKPDwvSUQgWzwwOTM0ZTAzZDNiNWZhNGRjZDI5MmQzMzZhN2Q3
+	OTJjMz4gPDA5MzRlMDNkM2I1ZmE0ZGNkMjkyZDMzNmE3ZDc5MmMzPl0gL0luZm8gMSAw
+	IFIgL1ByZXYgMzQ3MTEgL1Jvb3QgMjIgMCBSIC9TaXplIDMyPj4Kc3RhcnR4cmVmCjM1
+	NzI5CiUlRU9GCg==
+	</data>
+	<key>QuickLookThumbnail</key>
+	<data>
+	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
+	AADoemhUVwAAAAgAAADoZGVERQAAAAgAAADoZmlGSQAAAAgAAADoaXRJVAAAAAgAAADo
+	a29LUgAAAAgAAADoAGkATQBhAGN0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSwgSW5jLiwg
+	MjAxMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNSAAEAAAABFs9YWVogAAAA
+	AAAAc1AAADrMAAAB0lhZWiAAAAAAAABgfAAAuFwAABQ3WFlaIAAAAAAAACMKAAAM2AAA
+	vSNjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADYAOwBAAEUASgBPAFQA
+	WQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8AowCoAK0AsgC3ALwAwQDGAMsA0ADV
+	ANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4B
+	dQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJB
+	AksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MD
+	TwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSM
+	BJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYG
+	FgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfS
+	B+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J
+	5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwq
+	DEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO
+	0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGq
+	EckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U
+	8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhl
+	GIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCoc
+	Uhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBs
+	IJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNol
+	CSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQ
+	KgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4v
+	JC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSe
+	NNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6
+	sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDn
+	QSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tH
+	wEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63
+	TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9W
+	XFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4a
+	XmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1m
+	kmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8e
+	b3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4
+	bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HN
+	gjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL
+	/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0
+	lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNih
+	R6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axc
+	rNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4
+	WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRR
+	xM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrR
+	PNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c
+	3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr
+	++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH
+	+lf65/t3/Af8mP0p/br+S/7c/23//3BhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AA
+	AArAdmNndAAAAAAAAAAAAAMBAAACAAAAEQBPAMABSwHvApUDWgQ+BTQGRgdlCKYJ4Qs9
+	DJkOAQ9tEOQSZBPrFWMW4RhkGd4bTRy2Hh0fciC6IfIjHyQ3JUEmRydDKDopNSooKx4s
+	ES0ELfcu6C/aMMwxvzKyM6M0kjWCNnA3XThIOTU6HjsGO+481z3APqo/mkCPQYpCiUOL
+	RI9FkkaTR5RIlUmVSpRLkUyOTYtOiE+FUINRg1KEU4NUhFWEVoJXgVh/WXtaeFtzXG5d
+	aV5kX2NgZWFrYnVjgWSOZZtmp2ezaL5pyGrRa9ps423sbvZwA3ESciVzOXRQdWd2fXeR
+	eKd5unrOe+F88n4DfxCAGoEggiODIoQghRyGGIcUiA+JCooEiv2L9ozvjeiO4Y/ckNiR
+	1ZLTk9KU0pXRls+XzZjKmciaxJvAnLyduJ61n7Sgt6G+osij1KTipe+m/agKqRaqI6su
+	rDmtRK5Or1iwYLFnsm2zcrR3tXu2freBuIS5h7qJu4u8jb2Ovo+/ksCVwZrCn8OkxKrF
+	rsaxx7XIuMm7yr3LvszAzcHOwc+/0LvRtdKs06LUl9WM1oHXdthq2V3aUdtE3DfdKt4c
+	3w3f/uDt4drixeOx5JvlheZv51noQukr6hTq/evm7M3tte6d74XwbvFY8kLzLfQZ9QX1
+	8Pbc98b4sfmc+ob7cPxa/UP+Lf8W//8AAAARAE8AwAFCAdEChwNSBCUFGgYuB0gIbgmz
+	CwIMYg2+DyYQkxIKE4kVBBZ7F/oZZhrZHD4dmB7rIDQhaCKPI6kktSW4JrcnsSioKZ8q
+	liuLLH4tcS5iL1UwRzE7Mi0zHzQRNQE18jbhN9A4vjmqOpY7gDxrPVU+Pz8qQBpBDkIE
+	Qv1D9kTvRehG4UfYSM5JxEq4S6xMoE2SToZPeVBwUWlSZlNjVGJVX1ZdV1pYVVlRWktb
+	RVw+XTdeMV8rYChhJ2IoYypkLGUvZjBnMWgxaTFqMGsvbC1tLG4sby5wNXFBclFzZHR6
+	dY92pXe5eM554Xr1fAd9GX4pfzeAQ4FKgk+DUIRQhU+GTodMiEmJRopCiz+MOo02jjGP
+	LZAqkSiSKJMnlCeVJ5YmlyWYJJkimiCbHZwanRaeE58RoBKhFKIYox+kJ6UvpjanPahE
+	qUuqUqtXrF2tYq5nr26wdrF/somzlbShta22ubfEuM+52rrju+28974AvwjAD8EWwhzD
+	IcQlxSnGLccwyDPJNco3yznMO808zj3PPtBA0ULSRdNI1EvVT9ZS11TYV9lZ2lvbXNxe
+	3V7eXd9a4FPhSOI44yXkEOT55eLmyuey6Jrpgepo60/sNu0d7gPu6+/U8MHxsPKi85b0
+	jPWB9nb3a/hg+VX6Svs+/DH9Jf4Z/wz//wAAABEATwDAAUIB0QJ4AzgECwUABgAHHwhS
+	CYgKzAwpDYEO5hBTEc0TQBSzFiwXpBkYGoob8B1RHqcf7yEwIl8jfySVJaQmriexKLMp
+	tSq1K7Ussi2vLq4vrDCoMaQyoDObNJc1kjaKN4M4fDlyOmY7WjxNPUA+ND8qQCNBHkIc
+	Qx1EHUUgRiBHIEgeSR1KGUsWTBBNDE4HTwJP/1D8UftS+lP8VPxV/Fb7V/lY9lnyWu5b
+	6VzkXd9e21/YYNZh12LZY91k4WXjZuVn52joaelq6WvobOdt527ob+1w9nICcxJ0JHU2
+	dkl3W3hteXx6jHucfKp9t37Cf8mAy4HJgsSDu4SyhaeGnIeQiIWJeIpri12MT41BjjOP
+	J5AckRSSDZMJlAaVA5YAlv2X+Zj1mfCa65vlnOCd2p7Tn8+gzKHKosqjy6TMpc6mzqfP
+	qM+pz6rNq82sy63KrsmvybDKsc2y0bPVtNq137bjt+e46rntuvC78rz0vfW+97/3wPfB
+	+ML4w/jE+MX3xvbH9cjzyfHK78vtzOrN5s7jz+DQ3NHY0tPTztTI1cLWvNe12K7Zp9qf
+	25jcj92H3n3fc+Bn4VniSeM45CblE+YA5uzn2OjE6bDqm+uG7HHtXO5H7zTwI/EX8g/z
+	C/QK9Qr2CvcK+Ar5CfoI+wf8Bv0F/gP/Af//AABuZGluAAAAAAAABjYAAKZFAABVtQAA
+	TMwAAJ5IAAAk8AAADQ4AAFANAABUOQACI9cAAgKPAAH9cAADAQAAAgAAAAUADAAVAB4A
+	KAAyAD0ASABTAGAAbAB5AIcAlQCkALMAwwDTAOQA9QEIARsBLwFDAVkBbwGHAaABugHV
+	AfICEQIyAlYCfAKmAtQDBAM4A28DpwPjBCAEYASiBOYFLQV1BcAGDAZbBq0HAQdYB7EI
+	DghsCM4JMwmaCgMKbwrbC0cLsgwdDIkM9g1lDdcOSw7BDzoPtRAzELQRNhG7EkISyxNV
+	E+AUbhT+FZAWJRa8F1YX8xiSGTQZ2RqAGykb0hx7HSMdyx50Hx4fyiB5ISoh3SKTI0wk
+	ByTEJYQmRScHJ8koiylNKhAq0yuZLGEtLC34LsgvmTBtMUQyHTL6M9w0wzWwNqI3mTiU
+	OZI6kzuXPJ09pz60P8RA10HsQwREHUU3RlJHbkiLSapKzEvxTRlORE9yUKNR11MOVEhV
+	gla9V/ZZLFphW5Vcyl4BXzpgdmG1YvZkOmWBZstoF2lnarpsEW1sbspwLHGRcvl0ZHXS
+	d0N4t3oue6d9JH6kgCWBqIMrhK+GNYe9iUiK14xpjf6PlpExks+UcZYVl72ZaZsbnNSe
+	k6BZoiSj9KXGp5ypdqtTrTOvF7D/sum02LbLuMO6wrzHvtPA48L4xRHHLclNy3HNmc/F
+	0fTUKNZf2Jna1t0U31LhkuPT5hfoX+qq7PrvTfGk8//2XvjA+yf9kf//AAAABQANABUA
+	HwApADMAPgBKAFYAYgBvAHwAigCZAKgAuADIANkA6gD8AQ8BIwE3AUwBYwF6AZIBrAHH
+	AeQCAgIiAkUCagKTAr4C7gMgA1UDjQPHBAMEQQSCBMUFCwVSBZwF5wY1BoUG1wcsB4MH
+	3Qg5CJgI+glfCcYKMAqcCwoLeAvmDFYMxg05Da4OJQ6fDxwPmxAdEKIRKRG0EkASzxNe
+	E+4UfhUQFaMWORbRF2wYChiqGU0Z8xqbG0Yb8xyhHVAd/x6wH2IgFiDMIYYiQSMAI8Ek
+	hSVLJhQm3yerKHcpQSoKKtIrmixiLSwt+C7HL5gwazFBMhky9DPRNLI1lzaAN284Yzlc
+	Olg7WDxaPWA+aD90QIJBk0KnQ75E10XyRw1IKklISmlLi0yxTdlPBFAyUWNSl1POVQhW
+	RVeDWMFZ/1s9XHpduF73YDlhfmLFZA9lXGarZ/5pU2qrbAVtX267cBZxc3LQdC91kXb1
+	eFx5xnsyfKJ+FH+JgQGCfYP7hX2HA4iNihqLqo09jtSQbZIJk6mVS5bxmJmaRZvznaOf
+	VaEIor2kdKYtp+mpqatrrTCu+LDEspK0ZLY7uBe5/Lvsvei/8cIDxBzGOshcyoHMq87Y
+	0QrTP9V417TZ8twt3mTgluLF5PLnIOlS64btv+/68jn0fPbD+Q37Wv2r//8AAAAFAA0A
+	FgAgACoANQBAAEsAWABkAHIAfwCOAJwArAC8AMwA3QDvAQIBFQEpAT4BUwFqAYEBmgG0
+	Ac8B7AIKAisCTQJyApoCxQLzAyMDVgOMA8MD/QQ4BHYEtgT4BTsFgQXJBhMGXwatBv0H
+	UAelB/wIVgizCRIJdAnYCj4KpQsNC3YL4AxLDLgNJg2YDgsOgg76D3YP8xB0EPYRexIC
+	EooTFBOfFCwUuhVLFd8WdRcOF6oYSBjpGY0aMxrbG4QcLxzbHYceNR7kH5YgSyECIbwi
+	eCM3I/kkviWEJkwnFSfcKKMpaSovKvYrvyyKLVcuJy76L88wpjGAMl4zPjQkNRA2Azb7
+	N/o4/DoCOws8GD0nPjo/UEBpQYVCpEPFROdGCEcqSEtJbUqQS7dM4E4MTztQbVGiUtpU
+	FVVTVpRX1lkYWltbnlziXihfcGC8YgpjXGSwZghnYmi/ah9rgWzkbkhvrHEQcndz33VK
+	drh4KXmdexR8jn4Lf4uBDoKUhB2Fqoc5iMqKX4v2jZGPLpDPknOUGpXEl3GZIZrVnIue
+	RKABocGjhaVMpxeo5Kq2rIquYrA9shyz/bXjt8y5urutvae/qMGxw7/F0cfoygPMIc5D
+	0GnSk9TA1vHZJdta3YvftuHY4/TmDegm6kHsX+6B8KXyzfT49yb5WPuM/cT//wAAc2Yz
+	MgAAAAAAAQxCAAAF3v//8yYAAAeSAAD9kf//+6L///2jAAAD3AAAwGxtbW9kAAAAAAAA
+	BhAAAJy1AAAAAMZ644AAAAAAAAAAAAAAAAAAAAAA
+	</data>
+	<key>ReadOnly</key>
+	<string>NO</string>
+	<key>RowAlign</key>
+	<integer>1</integer>
+	<key>RowSpacing</key>
+	<real>36</real>
+	<key>SheetTitle</key>
+	<string>Canvas 1</string>
+	<key>SmartAlignmentGuidesActive</key>
+	<string>YES</string>
+	<key>SmartDistanceGuidesActive</key>
+	<string>YES</string>
+	<key>UniqueID</key>
+	<integer>1</integer>
+	<key>UseEntirePage</key>
+	<false/>
+	<key>VPages</key>
+	<integer>1</integer>
+	<key>WindowInfo</key>
+	<dict>
+		<key>CurrentSheet</key>
+		<integer>0</integer>
+		<key>ExpandedCanvases</key>
+		<array>
+			<dict>
+				<key>name</key>
+				<string>Canvas 1</string>
+			</dict>
+		</array>
+		<key>Frame</key>
+		<string>{{106, -31}, {1791, 1200}}</string>
+		<key>ListView</key>
+		<true/>
+		<key>OutlineWidth</key>
+		<integer>142</integer>
+		<key>RightSidebar</key>
+		<false/>
+		<key>ShowRuler</key>
+		<true/>
+		<key>Sidebar</key>
+		<true/>
+		<key>SidebarWidth</key>
+		<integer>120</integer>
+		<key>VisibleRegion</key>
+		<string>{{-33, 0}, {821, 550.5}}</string>
+		<key>Zoom</key>
+		<real>2</real>
+		<key>ZoomValues</key>
+		<array>
+			<array>
+				<string>Canvas 1</string>
+				<real>2</real>
+				<real>1</real>
+			</array>
+		</array>
+	</dict>
+	<key>saveQuickLookFiles</key>
+	<string>YES</string>
+</dict>
+</plist>

Deleted: CalendarServer/trunk/doc/Developer/Calendar Store.graffle
===================================================================
--- CalendarServer/trunk/doc/Developer/Calendar Store.graffle	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/doc/Developer/Calendar Store.graffle	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,3025 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>ActiveLayerIndex</key>
-	<integer>0</integer>
-	<key>ApplicationVersion</key>
-	<array>
-		<string>com.omnigroup.OmniGrafflePro</string>
-		<string>138.12.0.121252</string>
-	</array>
-	<key>AutoAdjust</key>
-	<true/>
-	<key>BackgroundGraphic</key>
-	<dict>
-		<key>Bounds</key>
-		<string>{{0, 0}, {756, 553}}</string>
-		<key>Class</key>
-		<string>SolidGraphic</string>
-		<key>ID</key>
-		<integer>2</integer>
-		<key>Style</key>
-		<dict>
-			<key>shadow</key>
-			<dict>
-				<key>Draws</key>
-				<string>NO</string>
-			</dict>
-			<key>stroke</key>
-			<dict>
-				<key>Draws</key>
-				<string>NO</string>
-			</dict>
-		</dict>
-	</dict>
-	<key>CanvasOrigin</key>
-	<string>{0, 0}</string>
-	<key>ColumnAlign</key>
-	<integer>1</integer>
-	<key>ColumnSpacing</key>
-	<real>36</real>
-	<key>CreationDate</key>
-	<string>2010-01-11 11:21:54 -0800</string>
-	<key>Creator</key>
-	<string>Wilfredo Sanchez</string>
-	<key>DisplayScale</key>
-	<string>1p = 1p</string>
-	<key>GraphDocumentVersion</key>
-	<integer>6</integer>
-	<key>GraphicsList</key>
-	<array>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>106</integer>
-			</dict>
-			<key>ID</key>
-			<integer>107</integer>
-			<key>Points</key>
-			<array>
-				<string>{186, 438.25}</string>
-				<string>{146.07, 438.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledDoubleArrow</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>70</integer>
-				<key>Info</key>
-				<integer>8</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{66, 425.05}, {79.5703, 26.4}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>106</integer>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Attachment}</string>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>98</integer>
-				<key>Info</key>
-				<integer>1</integer>
-			</dict>
-			<key>ID</key>
-			<integer>104</integer>
-			<key>Points</key>
-			<array>
-				<string>{408.997, 78.8045}</string>
-				<string>{464.075, 121.102}</string>
-				<string>{448.5, 214.75}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>Ball</string>
-					<key>LineType</key>
-					<integer>1</integer>
-					<key>TailArrow</key>
-					<string>0</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>100</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>97</integer>
-				<key>Info</key>
-				<integer>1</integer>
-			</dict>
-			<key>ID</key>
-			<integer>103</integer>
-			<key>Points</key>
-			<array>
-				<string>{347.859, 78.8099}</string>
-				<string>{293.5, 121.75}</string>
-				<string>{309.5, 214.75}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>Ball</string>
-					<key>LineType</key>
-					<integer>1</integer>
-					<key>TailArrow</key>
-					<string>0</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>100</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{325, 31.5}, {106, 47}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>100</integer>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 IDirectoryRecord (from directory services API)}</string>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>68</integer>
-				<key>Info</key>
-				<integer>8</integer>
-			</dict>
-			<key>ID</key>
-			<integer>98</integer>
-			<key>Points</key>
-			<array>
-				<string>{405.638, 178.64}</string>
-				<string>{448.5, 214.75}</string>
-				<string>{488.5, 248.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>Arrow</string>
-					<key>LineType</key>
-					<integer>1</integer>
-					<key>TailArrow</key>
-					<string>0</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>86</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>72</integer>
-				<key>Info</key>
-				<integer>7</integer>
-			</dict>
-			<key>ID</key>
-			<integer>97</integer>
-			<key>Points</key>
-			<array>
-				<string>{347.07, 179.741}</string>
-				<string>{309.5, 214.75}</string>
-				<string>{267.5, 248.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>Arrow</string>
-					<key>LineType</key>
-					<integer>1</integer>
-					<key>TailArrow</key>
-					<string>0</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>86</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{326.25, 121.75}, {98.5, 63}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>86</integer>
-			<key>Shape</key>
-			<string>Octagon</string>
-			<key>Style</key>
-			<dict/>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Home Factory\
-(API entrypoint)}</string>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{537, 286.75}, {6, 18}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FitText</key>
-			<string>YES</string>
-			<key>Flow</key>
-			<string>Resize</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>14</real>
-			</dict>
-			<key>ID</key>
-			<integer>84</integer>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Pad</key>
-				<integer>0</integer>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs30 \cf0 *}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-			<key>Wrap</key>
-			<string>NO</string>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{150.5, 499}, {401, 42}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FitText</key>
-			<string>Vertical</string>
-			<key>Flow</key>
-			<string>Resize</string>
-			<key>ID</key>
-			<integer>83</integer>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Align</key>
-				<integer>0</integer>
-				<key>Pad</key>
-				<integer>0</integer>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
-
-\f0\fs24 \cf0 *: calendars will have multiple calendar homes, and addressbooks will have multiple addressbook homes, only in the case of sharing.  one home will still be the "primary" home.}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{238, 286.75}, {6, 18}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FitText</key>
-			<string>YES</string>
-			<key>Flow</key>
-			<string>Resize</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>14</real>
-			</dict>
-			<key>ID</key>
-			<integer>82</integer>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Pad</key>
-				<integer>0</integer>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs30 \cf0 *}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-			<key>Wrap</key>
-			<string>NO</string>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>72</integer>
-			</dict>
-			<key>ID</key>
-			<integer>80</integer>
-			<key>Points</key>
-			<array>
-				<string>{191, 171.25}</string>
-				<string>{227, 230.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>0</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>78</integer>
-				<key>Info</key>
-				<integer>5</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{150.5, 135.25}, {81, 36}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>78</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{1, 1}</string>
-				<string>{1, -1}</string>
-				<string>{-1, -1}</string>
-				<string>{-1, 1}</string>
-				<string>{0, 1}</string>
-				<string>{0, -1}</string>
-				<string>{1, 0}</string>
-				<string>{-1, 0}</string>
-				<string>{-0.5, -0.233518}</string>
-				<string>{-0.491442, 0.260063}</string>
-				<string>{0.507118, -0.224086}</string>
-				<string>{0.507118, 0.267179}</string>
-				<string>{-0.27431, -0.474028}</string>
-				<string>{0.27978, -0.478478}</string>
-				<string>{0.293938, 0.543044}</string>
-				<string>{-0.286232, 0.553804}</string>
-			</array>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 iTIP Queue}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>69</integer>
-				<key>Info</key>
-				<integer>1</integer>
-			</dict>
-			<key>ID</key>
-			<integer>54</integer>
-			<key>Points</key>
-			<array>
-				<string>{488.5, 420.25}</string>
-				<string>{416, 361.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledDoubleArrow</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>66</integer>
-				<key>Info</key>
-				<integer>3</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>69</integer>
-			</dict>
-			<key>ID</key>
-			<integer>55</integer>
-			<key>Points</key>
-			<array>
-				<string>{488.5, 343.25}</string>
-				<string>{416, 343.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledDoubleArrow</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>67</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>69</integer>
-				<key>Info</key>
-				<integer>2</integer>
-			</dict>
-			<key>ID</key>
-			<integer>56</integer>
-			<key>Points</key>
-			<array>
-				<string>{488.5, 266.25}</string>
-				<string>{416, 325.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledDoubleArrow</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>68</integer>
-				<key>Info</key>
-				<integer>4</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>69</integer>
-				<key>Info</key>
-				<integer>4</integer>
-			</dict>
-			<key>ID</key>
-			<integer>57</integer>
-			<key>Points</key>
-			<array>
-				<string>{267.5, 420.25}</string>
-				<string>{335, 361.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledDoubleArrow</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>70</integer>
-				<key>Info</key>
-				<integer>2</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>69</integer>
-			</dict>
-			<key>ID</key>
-			<integer>58</integer>
-			<key>Points</key>
-			<array>
-				<string>{267.5, 343.25}</string>
-				<string>{335, 343.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledDoubleArrow</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>71</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>69</integer>
-				<key>Info</key>
-				<integer>3</integer>
-			</dict>
-			<key>ID</key>
-			<integer>59</integer>
-			<key>Points</key>
-			<array>
-				<string>{267.5, 266.25}</string>
-				<string>{335, 325.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledDoubleArrow</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>72</integer>
-				<key>Info</key>
-				<integer>1</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>66</integer>
-			</dict>
-			<key>ID</key>
-			<integer>60</integer>
-			<key>Points</key>
-			<array>
-				<string>{529, 361.25}</string>
-				<string>{529, 420.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledDoubleArrow</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>67</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>67</integer>
-			</dict>
-			<key>ID</key>
-			<integer>61</integer>
-			<key>Points</key>
-			<array>
-				<string>{529, 266.25}</string>
-				<string>{529, 325.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledDoubleArrow</string>
-					<key>TailArrow</key>
-					<string>FilledDoubleArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>68</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>70</integer>
-			</dict>
-			<key>ID</key>
-			<integer>63</integer>
-			<key>Points</key>
-			<array>
-				<string>{227, 361.25}</string>
-				<string>{227, 420.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledDoubleArrow</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>71</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>71</integer>
-			</dict>
-			<key>ID</key>
-			<integer>64</integer>
-			<key>Points</key>
-			<array>
-				<string>{227, 266.25}</string>
-				<string>{227, 325.25}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledDoubleArrow</string>
-					<key>TailArrow</key>
-					<string>FilledDoubleArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>72</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{488.5, 420.25}, {81, 36}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>66</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{1, 1}</string>
-				<string>{1, -1}</string>
-				<string>{-1, -1}</string>
-				<string>{-1, 1}</string>
-				<string>{0, 1}</string>
-				<string>{0, -1}</string>
-				<string>{1, 0}</string>
-				<string>{-1, 0}</string>
-				<string>{-0.5, -0.233518}</string>
-				<string>{-0.491442, 0.260063}</string>
-				<string>{0.507118, -0.224086}</string>
-				<string>{0.507118, 0.267179}</string>
-				<string>{-0.27431, -0.474028}</string>
-				<string>{0.27978, -0.478478}</string>
-				<string>{0.293938, 0.543044}</string>
-				<string>{-0.286232, 0.553804}</string>
-			</array>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 vCard Object}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{488.5, 325.25}, {81, 36}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>67</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{1, 1}</string>
-				<string>{1, -1}</string>
-				<string>{-1, -1}</string>
-				<string>{-1, 1}</string>
-				<string>{0, 1}</string>
-				<string>{0, -1}</string>
-				<string>{1, 0}</string>
-				<string>{-1, 0}</string>
-				<string>{-0.5, -0.233518}</string>
-				<string>{-0.491442, 0.260063}</string>
-				<string>{0.507118, -0.224086}</string>
-				<string>{0.507118, 0.267179}</string>
-				<string>{-0.27431, -0.474028}</string>
-				<string>{0.27978, -0.478478}</string>
-				<string>{0.293938, 0.543044}</string>
-				<string>{-0.286232, 0.553804}</string>
-			</array>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 Address Book}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{488.5, 230.25}, {81, 36}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>68</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{1, 1}</string>
-				<string>{1, -1}</string>
-				<string>{-1, -1}</string>
-				<string>{-1, 1}</string>
-				<string>{0, 1}</string>
-				<string>{0, -1}</string>
-				<string>{1, 0}</string>
-				<string>{-1, 0}</string>
-				<string>{-0.5, -0.233518}</string>
-				<string>{-0.491442, 0.260063}</string>
-				<string>{0.507118, -0.224086}</string>
-				<string>{0.507118, 0.267179}</string>
-				<string>{-0.27431, -0.474028}</string>
-				<string>{0.27978, -0.478478}</string>
-				<string>{0.293938, 0.543044}</string>
-				<string>{-0.286232, 0.553804}</string>
-			</array>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 Address Book Home}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{335, 325.25}, {81, 36}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>69</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{1, 1}</string>
-				<string>{1, -1}</string>
-				<string>{-1, -1}</string>
-				<string>{-1, 1}</string>
-				<string>{0, 1}</string>
-				<string>{0, -1}</string>
-				<string>{1, 0}</string>
-				<string>{-1, 0}</string>
-				<string>{-0.5, -0.233518}</string>
-				<string>{-0.491442, 0.260063}</string>
-				<string>{0.507118, -0.224086}</string>
-				<string>{0.507118, 0.267179}</string>
-				<string>{-0.27431, -0.474028}</string>
-				<string>{0.27978, -0.478478}</string>
-				<string>{0.293938, 0.543044}</string>
-				<string>{-0.286232, 0.553804}</string>
-			</array>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 Dead Property}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{186.5, 420.25}, {81, 36}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>70</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{1, 1}</string>
-				<string>{1, -1}</string>
-				<string>{-1, -1}</string>
-				<string>{-1, 1}</string>
-				<string>{0, 1}</string>
-				<string>{0, -1}</string>
-				<string>{1, 0}</string>
-				<string>{-1, 0}</string>
-				<string>{-0.5, -0.233518}</string>
-				<string>{-0.491442, 0.260063}</string>
-				<string>{0.507118, -0.224086}</string>
-				<string>{0.507118, 0.267179}</string>
-				<string>{-0.27431, -0.474028}</string>
-				<string>{0.27978, -0.478478}</string>
-				<string>{0.293938, 0.543044}</string>
-				<string>{-0.286232, 0.553804}</string>
-			</array>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 iCalendar Object}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{186.5, 325.25}, {81, 36}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>71</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{1, 1}</string>
-				<string>{1, -1}</string>
-				<string>{-1, -1}</string>
-				<string>{-1, 1}</string>
-				<string>{0, 1}</string>
-				<string>{0, -1}</string>
-				<string>{1, 0}</string>
-				<string>{-1, 0}</string>
-				<string>{-0.5, -0.233518}</string>
-				<string>{-0.491442, 0.260063}</string>
-				<string>{0.507118, -0.224086}</string>
-				<string>{0.507118, 0.267179}</string>
-				<string>{-0.27431, -0.474028}</string>
-				<string>{0.27978, -0.478478}</string>
-				<string>{0.293938, 0.543044}</string>
-				<string>{-0.286232, 0.553804}</string>
-			</array>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 Calendar}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{186.5, 230.25}, {81, 36}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>72</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{1, 1}</string>
-				<string>{1, -1}</string>
-				<string>{-1, -1}</string>
-				<string>{-1, 1}</string>
-				<string>{0, 1}</string>
-				<string>{0, -1}</string>
-				<string>{1, 0}</string>
-				<string>{-1, 0}</string>
-				<string>{-0.5, -0.233518}</string>
-				<string>{-0.491442, 0.260063}</string>
-				<string>{0.507118, -0.224086}</string>
-				<string>{0.507118, 0.267179}</string>
-				<string>{-0.27431, -0.474028}</string>
-				<string>{0.27978, -0.478478}</string>
-				<string>{0.293938, 0.543044}</string>
-				<string>{-0.286232, 0.553804}</string>
-			</array>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 Calendar Home}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{52, 8}, {647, 484}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>105</integer>
-			<key>Shape</key>
-			<string>Rectangle</string>
-		</dict>
-	</array>
-	<key>GridInfo</key>
-	<dict/>
-	<key>GuidesLocked</key>
-	<string>NO</string>
-	<key>GuidesVisible</key>
-	<string>YES</string>
-	<key>HPages</key>
-	<integer>1</integer>
-	<key>ImageCounter</key>
-	<integer>1</integer>
-	<key>KeepToScale</key>
-	<false/>
-	<key>Layers</key>
-	<array>
-		<dict>
-			<key>Lock</key>
-			<string>NO</string>
-			<key>Name</key>
-			<string>Layer 1</string>
-			<key>Print</key>
-			<string>YES</string>
-			<key>View</key>
-			<string>YES</string>
-		</dict>
-	</array>
-	<key>LayoutInfo</key>
-	<dict>
-		<key>Animate</key>
-		<string>NO</string>
-		<key>circoMinDist</key>
-		<real>18</real>
-		<key>circoSeparation</key>
-		<real>0.0</real>
-		<key>layoutEngine</key>
-		<string>dot</string>
-		<key>neatoSeparation</key>
-		<real>0.0</real>
-		<key>twopiSeparation</key>
-		<real>0.0</real>
-	</dict>
-	<key>LinksVisible</key>
-	<string>YES</string>
-	<key>MagnetsVisible</key>
-	<string>NO</string>
-	<key>MasterSheets</key>
-	<array/>
-	<key>ModificationDate</key>
-	<string>2010-01-14 13:46:09 -0800</string>
-	<key>Modifier</key>
-	<string>Glyph Lefkowitz</string>
-	<key>NotesVisible</key>
-	<string>NO</string>
-	<key>Orientation</key>
-	<integer>2</integer>
-	<key>OriginVisible</key>
-	<string>NO</string>
-	<key>PageBreaks</key>
-	<string>YES</string>
-	<key>PrintInfo</key>
-	<dict>
-		<key>NSBottomMargin</key>
-		<array>
-			<string>float</string>
-			<string>41</string>
-		</array>
-		<key>NSLeftMargin</key>
-		<array>
-			<string>float</string>
-			<string>18</string>
-		</array>
-		<key>NSOrientation</key>
-		<array>
-			<string>int</string>
-			<string>1</string>
-		</array>
-		<key>NSPaperSize</key>
-		<array>
-			<string>size</string>
-			<string>{792, 612}</string>
-		</array>
-		<key>NSRightMargin</key>
-		<array>
-			<string>float</string>
-			<string>18</string>
-		</array>
-		<key>NSTopMargin</key>
-		<array>
-			<string>float</string>
-			<string>18</string>
-		</array>
-	</dict>
-	<key>PrintOnePage</key>
-	<false/>
-	<key>QuickLookPreview</key>
-	<data>
-	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
-	iE5xLvIs4jXadChM0DqfkODgpOrb/wMEeayFCmVuZHN0cmVhbQplbmRvYmoKNiAwIG9i
-	ago0Mjg0CmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgNCAwIFIg
-	L1Jlc291cmNlcyA3IDAgUiAvQ29udGVudHMgNSAwIFIgL01lZGlhQm94IFswIDAgNzU2
-	IDU1M10KPj4KZW5kb2JqCjcgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9J
-	bWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gL0NvbG9yU3BhY2UgPDwgL0NzMiAxNyAwIFIK
-	L0NzMSA4IDAgUiA+PiAvRm9udCA8PCAvRjEuMCAxOCAwIFIgPj4gL1hPYmplY3QgPDwg
-	L0ltMyAxMyAwIFIgL0ltNCAxNSAwIFIKL0ltMiAxMSAwIFIgL0ltMSA5IDAgUiA+PiA+
-	PgplbmRvYmoKMTMgMCBvYmoKPDwgL0xlbmd0aCAxNCAwIFIgL1R5cGUgL1hPYmplY3Qg
-	L1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyNTYgL0hlaWdodCAxMzggL0ludGVycG9sYXRl
-	CnRydWUgL0NvbG9yU3BhY2UgMTkgMCBSIC9JbnRlbnQgL1BlcmNlcHR1YWwgL1NNYXNr
-	IDIwIDAgUiAvQml0c1BlckNvbXBvbmVudAo4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+
-	CnN0cmVhbQp4Ae3QAQ0AAADCoPdPbQ8HESgMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
-	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
-	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
-	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
-	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
-	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
-	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
-	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
-	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
-	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM/AwMng8AAQplbmRzdHJlYW0KZW5kb2Jq
-	CjE0IDAgb2JqCjQ4NQplbmRvYmoKMTUgMCBvYmoKPDwgL0xlbmd0aCAxNiAwIFIgL1R5
-	cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyMDQgL0hlaWdodCA5OCAv
-	SW50ZXJwb2xhdGUKdHJ1ZSAvQ29sb3JTcGFjZSAxOSAwIFIgL0ludGVudCAvUGVyY2Vw
-	dHVhbCAvU01hc2sgMjIgMCBSIC9CaXRzUGVyQ29tcG9uZW50CjggL0ZpbHRlciAvRmxh
-	dGVEZWNvZGUgPj4Kc3RyZWFtCngB7dAxAQAAAMKg9U9tDB+IQGHAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY+AwM6kgAAQpl
-	bmRzdHJlYW0KZW5kb2JqCjE2IDAgb2JqCjI4NQplbmRvYmoKMTEgMCBvYmoKPDwgL0xl
-	bmd0aCAxMiAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAy
-	NDIgL0hlaWdodCAxNzAgL0ludGVycG9sYXRlCnRydWUgL0NvbG9yU3BhY2UgMTkgMCBS
-	IC9JbnRlbnQgL1BlcmNlcHR1YWwgL1NNYXNrIDI0IDAgUiAvQml0c1BlckNvbXBvbmVu
-	dAo4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3QMQEAAADCoPVPbQo/
-	iEBhwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
-	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
-	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
-	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
-	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
-	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
-	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
-	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
-	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
-	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
-	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwa+AwPiKwABCmVuZHN0cmVhbQplbmRv
-	YmoKMTIgMCBvYmoKNTYyCmVuZG9iago5IDAgb2JqCjw8IC9MZW5ndGggMTAgMCBSIC9U
-	eXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTE1MCAvSGVpZ2h0IDg3
-	MCAvSW50ZXJwb2xhdGUKdHJ1ZSAvQ29sb3JTcGFjZSAxOSAwIFIgL0ludGVudCAvUGVy
-	Y2VwdHVhbCAvU01hc2sgMjYgMCBSIC9CaXRzUGVyQ29tcG9uZW50CjggL0ZpbHRlciAv
-	RmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dABDQAAAMKg909tDjeIQGHAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMPA6MM8/AAEKZW5kc3RyZWFtCmVuZG9iagoxMCAwIG9i
-	agoxMzExMQplbmRvYmoKMjQgMCBvYmoKPDwgL0xlbmd0aCAyNSAwIFIgL1R5cGUgL1hP
-	YmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyNDIgL0hlaWdodCAxNzAgL0NvbG9y
-	U3BhY2UKL0RldmljZUdyYXkgL0ludGVycG9sYXRlIHRydWUgL0JpdHNQZXJDb21wb25l
-	bnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHtXfk/VP0Xr1SSdTIM
-	szBjGSY01oj0KCp7IntZUsgSCfFYQspSIj1KKSS7LKk81fP0+v5r33M+987ca4ypGTNm
-	esz5oZelO+77nvM573M+99732bfPbOYrYL4C5itgvgJ78grs14/9BtcOgB5gzEJ3Yz7k
-	AHymiSKnwVpYHDx48JB+DD7JwoKANz3UFFwAC1APW1oeoc1KN1Mcbml5GD4PYCNqkwJN
-	8FoA2sOI1eqoNZgNmK2uhgfjhxy1gs9D2AS0yWBGvBDLBC6AtbG1s7O3d+Ds1Bzs7e3s
-	bAH4UQKaxLdpYMZche49cuQoorXncI45crlOTs7OPN3N2dnJict1PMbh2CNqAI2Oxtg2
-	ehYjDka8VtbWtnYOHEeuE4/n4srnCwRCoUhXEwoFAj7f1YXHc+I6chzsbK2trRAzLGhj
-	uxkDGuIZ8NqAdx25PBe+QChyE4slEg/PnZiHRCIWu4mEAr4LD0Db29kQzLiejelmKqAh
-	ngGvwzGuswtfKBJLPL28pT6+MpnsOJqftkaOgqN9faTeXp4SsUjId3HmHnMAzBjbxgxt
-	EtAHD1nC+kW8PFeBSOzhJfWV+fmfkMsDg8CCdTM8NFAuP+HvJ/OVenmIRQJXHmKG9WxJ
-	0rZxQpsJaFt7DuAVukk8pTK/AHlQSGhYeHjEqUjKorQz+qhTEeHhYaEhQfIAP5nUU+Im
-	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
-	j+fiyucLBEKhSFcTCgUCPt/VhcdzArgOdrbWxL/6H/rLANHiK8rN8MgMzAyysQNPc445
-	crlOTs7OPN3N2dnJict1PMYB74J7jx6BxxuoFazFmRnsvxI34212SwRtbWMLsO0dODs1
-	B3sAa2tjjXBhl+OgBQa0MVcw+wIiZny0gIA+YgWwATiYra6GB+OHHLU6QuAS95oOXsRO
-	MANoQA2wwdmUWelmisMtwbcQzMhHJuRfpa8p0AcsADbi1ofBJ2EsmyRcGvd+GjY5SwCv
-	s1EfQP6Fz1ReVdP9As5SH2a6AM1nZr4C5itgvgLmK2DYK/B/uvd6oQplbmRzdHJlYW0K
-	ZW5kb2JqCjI1IDAgb2JqCjU5NzEKZW5kb2JqCjIwIDAgb2JqCjw8IC9MZW5ndGggMjEg
-	MCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjU2IC9IZWln
-	aHQgMTM4IC9Db2xvclNwYWNlCi9EZXZpY2VHcmF5IC9JbnRlcnBvbGF0ZSB0cnVlIC9C
-	aXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB
-	7V3pU1J9FNZEkR0UQVkCL26ASDcpUipwYCxTKzUNKx0La8Iw0omJyRYcK0amXErHZcrM
-	SRs1Rx1GHaec9197z8Xet0XMzz/veT7x8T7PWX7b4ZyUFAQqgAqgAqgAKvCrAqmHCL/y
-	OvA38D7yE2lE4yePI0DrQOopKbvcgTOHk35owOEAIUaKgyRIsN+lnsHlZu6CRyx+EOBy
-	M8CUIMIBCvxgn56eAdR5fL5AIBAKhSKCAZ8PJPh8XmYmo8HfFWDop4HXA3mgLhSJxRKp
-	VEY4pFKJWCwCFfggwa4C+wRBgj7YnmEvEktksqxsuTwnR6FQEguFIidHLs/OkskkYhGj
-	APgABEFyARjrM8Zn2EuBu0KZm6dSqTUaLbHQaNQqVV6uUgEaSBMKgAswAiRZCBL0IfAF
-	QmAP5IG5VqfX51MGgkHl6/U6LagAEoACQgGTBpILkMrEPpcHxpdlK3JVwJ0yFBYVlxiN
-	JpOZSJhMRmNJcVGhgQINVLmKbBm4AI/LZMG9DgDmB/qZApFEJleqtHqqoMhoKrVYrTRN
-	HycU8OlWq6XUZCwqoPRalVIuk4jAA9I5SSIAzA+pj5+gr9ZRhSVmi5UuP3HSXlEJcBAI
-	5rsr7CdPlNNWi7mkkNKpEwLwIQkmcYBUMH8mXyiWyXPVOkOxuYy22SscZ5yuKrfb7SES
-	8OFVLucZR4XdRpeZiw06da5cJhbyM8EB/gyAXfMLgL5SrS8wWmjbKYezylN9vqa2rv4i
-	oaivq605X+2pcjpO2WiLsUDPeIBYkMwBGP7g/VKgryswWsvtp13ucxfqLzU2Nbd4iUVL
-	c1PjpfoL59yu0/Zyq7GACQGpCBxgTwCA+2dkCsRZCpXOYCyzVTo9NXUNV7zX29o7bvl8
-	nUTC57vV0d523Xuloa7G46y0lRkNOpUii3GAPQGQegTWPjB/rpYqtpRXuqprLze3tnX4
-	7vjvBbrvB4nE/e7APf8dX0dba/Pl2mpXZbmlmNLmggPAGvhnAmDcH6JfodIXmmm7s7qu
-	0Xvj5m1/INj7MPQoTCgehR72BgP+2zdveBvrqp122lyoVymYDAAB8PsWMMFfkq3UUiVl
-	ttMeoN/u83f3hMJ9T59F+glF5NnTvnCop9vvawcBPKdtZSWUVpktSco/gyeUyvN0BWb6
-	lKvmsre9sysYCj+NDLyMDsYIxWD05UDkaTgU7Ops916ucZ2izQW6PLlUyMvYY39OBk/E
-	uH+RxeZw1zff8HU9CPVFXkRjb4ZH3hKKkeE3seiLSF/oQZfvRnO922GzFDEBIOJBAvzD
-	/zlcvjhLqaFKrPaz5xpab94Nhvr6X8WGRsfGJyeniMTk5PjY6FDsVX9fKHj3ZmvDubN2
-	awmlUWaJ+dwk/AViCH+Dia6ounCl7XYA6Edfj4xNTL+f+ThLJD7OvJ+eGBt5HQUBArfb
-	rlyoqqBNBkgAYkES/pD+5XlHC0vLwf29Hf6e8PNXr0fHpz7Mzn2eXyAS85/nZj9MjY++
-	fvU83OPv8EIAlJcWHs2TwwKwx/6w/EnkTPifOFN96ZovEHoyEBsZn575NP9lcWmZSCwt
-	fpn/NDM9PhIbeBIK+K5dqj5zgkkAcmYB+DP+gb8U+Bdb7c7zjW13guFIdGhsamZuYWl5
-	ZXWNSKyuLC8tzM1MjQ1FI+HgnbbG8067tRj4S5PyF0pzVPmQ/lw1Te3+3scDsdGJD0B/
-	ZW09TijW11ZAgA8To7GBx73+9qYaFyTAfFWOVJjM/kJZjpoyHquoqm3u6Hr45OWbd9Oz
-	84sra/GNzS0isbkRX1tZnJ+dfvfm5ZOHXR3NtVUVx4yUOke2D3+FhjLSle66lluB0LPo
-	0Pj7uS9fV+MbW9uEYmsjvvr1y9z78aHos1DgVkudu5I2UhrF/vxh+QP+V33djyKDwxMz
-	nxdX1oH+t+9E4tv21sb6yuLnmYnhwcijbt9Vhr/JcCD/eq/vfrg/Njr5cX5pNb4J9HeI
-	xPdv25vx1aX5j5Ojsf7wfR8sgPvxh+NvplCm0CTsn4T/PwRi5+/8f7sBS01Lh+0/bP/M
-	xx2ei97OINj/7dTswvJafGv7+w6B7OGTd75vb8XXlhdmp96C/YOd3osex3EzbADhAJCe
-	hvx/OQGh/dH/Mf4x/2H+x/UP13/c/+D+D/e/uP/H8w+e//D8i+d/vP8g8gII73/w/gvv
-	//D+E+9/8f4b7//x/QPff/D9C9//8P0T33/x/Rvf/7H+Aesf/lcA6z+w/gPrP7D+A+s/
-	sP4D6z+w/gPrP7D+A+s/sP4D6z+w/gPrP7D+A+s/CFQA61+w/gXrX7D+BetfsP4F61+w
-	/uVv9S8s//97ygH8D3v/g9/4s7j/Bbv7n7C8/w3L+x+xvf8Vu/ufcVje/47DZXn/Q7b3
-	v2R5/9M0lve/Zfo/s7r/Mbv7X7O9/zn2v2f7/ANm/Al751+ksHz+CfBn+/wbds8/YhyA
-	zfOvgD8TAeydf7YrAHvn3yUmn8IAQNbOP9wVgL3zL3/MvmUmgLJz/in8G4zd82+Zv8Ml
-	FDjC1vnHiT8Esnr+dUKB/2QAJQ4HfrLCX6gAKoAKoAKoAKPAv2Ksf5IKZW5kc3RyZWFt
-	CmVuZG9iagoyMSAwIG9iagoxOTMwCmVuZG9iagoyNiAwIG9iago8PCAvTGVuZ3RoIDI3
-	IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDExNTAgL0hl
-	aWdodCA4NzAgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkgL0ludGVycG9sYXRlIHRydWUg
-	L0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K
-	eAHt3eu313Wd93FFhA0bNiAbNm4BUQ6KgISiIGXisTQMO2iUh5wozEOZOBgzFkZjUZij
-	ok4qZnko0ga1cDQPretfu37bZlah9pprdvO6c63H506t9a5Xaz1uPNd3bzRPOMEjQIAA
-	AQIECBAgQIAAAQIECBAgQIAAAQIECBAg8P+fwIkTb4pHgACB/wWB94Ny4n8fyv/Mzkkn
-	nTT1/XeyR4AAgUkK/LkiUwc9mYjYoC4hQe9/8Zw0dfC/NG3a9OnThzwCBAj8fQKDkkyb
-	NmjK1IkC/c3+TLRnIj3ThoZmzJg5PHizPAIECPw9AhMhmTljaGj6oEATAfro/vxne6YP
-	zRieNXtkZM7ceR4BAgT+ToG5c+eMjMweHp4xNH3Qn4/Oz5/jM9Ge2SNz580fHV2wcGxs
-	bJFHgACByQoMGrJwwejoKfPmDgI0Y2jaxOfPR3z9nDjxU9f0QXvmzJu/YGzR+PjiJUuW
-	nu4RIEBg8gJLlyxZPD6+aGx0/ryRWcODz5+J/Hzwd8/vx2fw4TMyd/7CReNLli47c/mK
-	latWneURIEBgsgKrVq1csfyMZUsXj48tOGXu4PNnkJ/BD18fyM+JU97/8hmZNzo2vnTZ
-	8lVnr16z9tz16z/mESBAYLIC69evW7tm9Vkrly9bMj42Om9kIj8f+vgZfPqcPH1oeBCf
-	RYuXrTjrnHUf27Dxgk2bL9riESBAYLICF23adMHGDevXnXPW8mWnvZ+fwe9+pkw5/ttn
-	4tPnz/FZcsaqNevPu2Dzxy/eeunll19xxZUeAQIEJiFwxRVXXH7Z1ksu3rL5gg3nnrNq
-	2eKx0bmzZw596OPnxCmD3zjPmju6aMkZZ607b9OWSy678tPXbPvs9u3XeQQIEJicwPbt
-	12675lNXXvrJLRduWDuRn/lzZs2YNvUDv/gZ/OA1+PSZP7b4jLPO3bhl65VXX/u5L37p
-	yzfedPMtHgECBCYncPNNN+644QvXbbv6iksuOn+Qn9PGThkZHnz8HP9r5ylTp82YPW/B
-	+LJV6zZ+4vKrt39xx0237tz1zdvvuNMjQIDA5ATuuP22b+z86k07vvDZT1+65fy1K08f
-	H503a2jwx17H/eJnytTpg0+fRUuWr9mw5fJrPrfj5q/tuvPb99y75777vusRIEBgEgL3
-	3Xffnt3f+dbtu/7hphuuu/rSizasXr5k8PEzc/Cj11/XZ/Brn6HhuaPjy85af+HWqz+3
-	46u77rx7z9779/1g//4fegQIEJiEwP79+x/4/v177737jq/f8qXtn/rkBetWLTt1dM7w
-	9JOP+8XPiYNf+8yat3Dx8nPO23LF9i/duutb9+79/v4HDxw8+NDPPAIECExC4KGHDv70
-	wIP7v7d39127brl+2+VbNqw+87SFcwe/+PlgfWbMPmVs6cp1F3zy6i/cvOtbe+7/wY8O
-	PvzoocefeNIjQIDAJASeeOLxQ488/NMHH/jne+/6+o2f/9TFG9euWDI2b/aH6jNt5sjo
-	qYMfvDZfdu2Or9157/37Dzz82JNPPXP42V94BAgQmITAs88efubnTzz6swP7/2n37bfe
-	8Jmtm85ddfqiU0ZmTDv+22fqRH3Gz1i94eNXfu6mXd/ZO4jP408dfu75F1/yCBAgMDmB
-	F59/7vDPDz384wf2fvvrN26//KKPnb1sfP6gPsf9kfuJU6cNz1lw2vI1Gy/+9BdvvWPP
-	vh89fOip557/9ZGXX/EIECAwOYGXj7z0/C+eOvTQg9/bffstn7/q4+etPmN8dPCHXh+o
-	z/ThuQsXr1h7wdZrbtj57b37Dz721HMvHHnl6Kuvve4RIEBgEgKvvfbq0Vd+88KzP3/k
-	Jz+4765br7/64o1rlp82Omfm9A/XZ2zJynWbLt224xv33P/gw08efv7I7177/bFjb3gE
-	CBCYhMCxY8def/WV3zx/+PGf/cs/3b3zhmsuuWDt8sULBn/k/qH6zBtbsmr9psuvvfG2
-	e/cdePSp5379yqt/+I833/qjR4AAgUkIvPXWm2/8/ugrLz33b4/8+P57vrFj29YL161Y
-	Mvgj94+qz9JV6zdfvv2m2/f84OChZ54/cvT3//HHt9951yNAgMAkBN555+233nj933/z
-	q6ce+8m+3bu+cu2lm85dGepz0RXbb77jvv0PPX74hZdfPfbm2+++5xEgQGByAu++/eYf
-	jh55/plDBx/4x2/e+NnL/t/q88SzL77y2rG33nnvvT95BAgQmITAoFhvv3ns1d++cDjW
-	Z/C3ec2at+j0sz625crrbrnzuz/82ZO/eOmV19/447vv/en/eAQIEJiEwJ/+9N47bx17
-	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
-	fZasOnfTZdd+Zdfu7x945OfPvfTy0d+/8eabb3kECBCYhMCbbw7ic/S3L/7iyX/90f3f
-	+fqObVsvXLtiyYKP+slr7tiSlesu3PqZHV//zv0P/uyJZ57/9StHX//9H455BAgQmITA
-	H/7w+9ePvvzSL58+dPCHe7+984ZrPrlx7fLFC+Z8xO995i5cvHztxkuuvv5rd333Bz95
-	5N+eff7Xv/3d0aOvegQIEJiEwNGjR1/57Uu/OvzkIwf27bnz1i98+uLzzznztNE5Mz/4
-	W+dpw3MWnLb8nPMvvurzt9x+7/cefOixnx/+1Yu/OXLktx4BAgQmIXDkyJFfv/DLw08+
-	evCH999z282fu2rLhtVnjI+OzJx2/J95nTRt5sjo+BmrN2y5YvuN37j7u/t+/NBjTz79
-	7C+f9wgQIDBZgeeeferJRx56cN+eu3Z++drLN68/a9mp80dmfLA+J88YmX/qslXrN23d
-	9qVbb9+994EfHXzk0JNPPf30Mx4BAgQmI/D00z9/8tC//vTBfXu/881brr9m64XrVi1d
-	dMrsoZOnHPfX+5x08ozZp4wtWbF248Wf+vyNO+/cvXffvxw4+PAjjz52yCNAgMAkBB57
-	7NFHHj54YP/3v3vPHV/78nVXfeL8NcuXjM2b9cH6TDl5aNa8hYvPXL3hosu3XX/L1++8
-	Z8/9+/Y/eODAT37qESBAYBICP/nJgR8/uH/fP+25+/adN33xM5duXn/2GeODP3D/QH1O
-	GNRneM7o+LJV6y745Ke233Dzzm/edc+evfd/b59HgACByQp875/37vnOXbd97abrr73q
-	4o1rVy5dNDoyPP3kv/7bvE44YcrU6TNHBj96LV/9sc1bP739+q98dedtd3zr7t27d9/r
-	ESBAYDICu3ffc/ddd+zaecuXv3jtVZdsWn/2mYsXzps9Y9pxf5PpoD4nTRuaNXd0/PSV
-	a87bsvWqbdddv+Omr/7Dzm/s2nWbR4AAgUkI7Nq16xs7/+GrN+744vbPXHnJ5g3nLF96
-	6ujED14nfeDb56TBj14jpywc/Oy19rxNF1961dXXXvf567+0Y8eXPQIECExOYMeOG67/
-	/PZtV1956Sc2bViz8vTxBfNGZk4/+bi/3OeEE06cMnXajOE588dOW7ZqzfqNmz9xyWVX
-	XnX1Nds8AgQITFrgM9dcfdUVl37y45vOX3/OitPHF54yMjw0+MHrr//AfaI+g4+fmbPn
-	TuRnxeq1Hzv/ws1bPnHxJVu3XuoRIEBgcgJbt15y8Se2bLrgvPVrz15++vjY/DmzJj59
-	PlCfE6YMPn6GhifyM770zJVnr1m3fsN5Gy+48MJNHgECBCYncOGFGzeet2H92nPOXnnG
-	0vGF8+fOnjl08tQpx//a588fP9Pfz8/CUxeffsbylWetPmfN2rXrPAIECExWYO3aNavP
-	XrVy+bKlpy1acMqc2YOfuz786TP40WvK1JMn8jNn3ujYqeNLli5bduby5StWrFjpESBA
-	YDICg34sX37msmVLF48vWjg6b2TWzEF8Bp8+x//aZ/B/sjr4zc9EfmYOj8ydN7pgbFCg
-	8dMWL/EIECAweYHFp42Pnzq2cHT+vDkjwzP+RnxOOPH9r59pQ0PDs0YGATpl/ujoggUL
-	PQIECExeYMHo6Oj8U+bNHZk9PHNo+kd/+Ux8/AzyM/j8GfRn5vDwrNkjIyNz5sz1CBAg
-	MHmBOXMGJZk9a3jw3TPRnpM+4seu9//xFhP5mejPydOmDw3NmDFzECGPAAECf4/AzJkz
-	ZwwNTaTn/fZ8+Hc+//XP1vlzf06aOijQoEGDN90jQIDA5AUmMjKRk6kTnz2DD58P/cL5
-	v+Iz8a8nvl+giY8gjwABAv8bAhPdmShPTM9fMjT4D3oECBD43xH4S1r8OwIECBAgQIAA
-	AQIECBAgQIAAAQIECBAg0BH4v12XVLAKZW5kc3RyZWFtCmVuZG9iagoyNyAwIG9iagox
-	MDEyMQplbmRvYmoKMjIgMCBvYmoKPDwgL0xlbmd0aCAyMyAwIFIgL1R5cGUgL1hPYmpl
-	Y3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyMDQgL0hlaWdodCA5OCAvQ29sb3JTcGFj
-	ZQovRGV2aWNlR3JheSAvSW50ZXJwb2xhdGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4
-	IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae2c+VeS6xbHLc0BlUEBEURQ
-	FESRQVEUU3HCFMwpjFIJxTScG1DLUsyBxMwhNbXEIYeyTJvsNK37r939vNjqHsXynLXu
-	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
-	9x7VERtno1KBVnqNV8ZP47nxxfhlbBjPgH6sdtd7fP/p4xV117Y+PPmNetw5rr2dG1Vh
-	VnFlC93/xzKEj9knOabB06FZWGvYduQPmsxMsAwoxH8FPpf6khNV3NXu7bhFEsxQPixs
-	JbpLVG4p1Oo9g0qsHCvYAHZwksQsWhy4U2u6OXh32CJ6bflNV7Lrhv769nr72vIebcqo
-	KSgTzbNEZpSxW6Pk3Xjb/WaREZ84Or7nvYpayf5JRRA/hTlaKvIUVfRWUNbEb2cOfhu2
-	flw/pef1Qf08CT2tn9Gv6KMRvgx0Sc/Cc1Efo0nwsGkh4hKgioMz1E5UY40D4inx8rRb
-	ZJH9D0AZ/WYKZW5kc3RyZWFtCmVuZG9iagoyOSAwIG9iago3MDQKZW5kb2JqCjE3IDAg
-	b2JqClsgL0lDQ0Jhc2VkIDI4IDAgUiBdCmVuZG9iagozMCAwIG9iago8PCAvTGVuZ3Ro
-	IDMxIDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURl
-	Y29kZSA+PgpzdHJlYW0KeAHtWmdUFU2T7pkbuYHMJeecg+TMJeeckXxJkiSDiAKSVZIi
-	oiQRA6ggKIKiIAgoGBBEzGBCUFCQoBJkB339vt2zZ3/t/lv7nJl+prq6q5m60110PQBI
-	lvtFR4fDAICIyLgYB1OqgJu7hwDuGYDAlpAHEPwCYqMN7OyskKf/oaw8RrSRMiq7NRaf
-	K5NuH9euzsmy9Lv12lJX/odOf8RMMYhBACA7RMAa/BsHbmH/3zhpCyfGRcchOvu3cECI
-	H9IO1SBYJsbJwRDBdwHAk4J/YbonW9j/F2Z6t4X9/GKCAeCcR/QF/PyCEczF+Bv7b2GF
-	LZwQEIyMz4XMAcscGRgaiYgQG1jdQFpsAABiJxGdwMDYgAgAxPEAwNSIiCikXXLrnUgE
-	RMcgfSWRC4hsvTukRkpUNAAaVcjcTvxb5icHQFs9APS3/i0TUweA4QYAPQP/li06/Hqf
-	EOVBbNA2pV/DQSQqAJhXm5uLYgDgSgDYKN7cXDuxublRBwDqBQDd4QHxMQm/dAF6q8IA
-	AmAArIAT8AFhIAFkgRJQA1pAHxgDC2ALnIA78AYBIAREgBiQCFJBOsgGBaAIHAYVoBqc
-	BGfBBdACroBOcBP0gyEwDMbAMzAJ3oOPYB4sgzUIgnAQCWKGOCA+SBSShhQhdUgXMoYs
-	IQfIHfKFgqAIKB5KhTKhfKgEOgrVQmegZqgd6oZuQ8PQE2gSmoEWoFUYhokwK8wDi8Jy
-	sBqsD1vAjrAXHARHw8lwJnwAPgLXwo3wZbgLHoQfwRPwR3gJ3kQRUGwoAZQ0Sg1FRVmj
-	3FE0VDQqFZWLOoSqQZ1DdaD6UCOoV6hPqO9oNJoJzYeWQWugTdBOaD90FDoVnY8uR59C
-	X0L3oB+iJ9Cf0esYIoYLI4FRw5hiXDA0TBxmH6YUU4dpxfRiRjFvMYtYFJYVK4JVwRpj
-	XbDB2CRsHrYC24i9jr2PncR+xaFwbDhxnAbOCueNi8Zl4spwZ3DXcPdxr3FLeDyeGy+P
-	p+Jd8GH4NHwJ/hT+Kv4+/i3+Gx2JTpBOlc6Szpcuni6frobuMt0Q3STdCoFEECJoEGwJ
-	NEIqoYRwltBNGCd8JmKIvERloiUxgLiLWEpsJPYSnxMXSSSSCEmH5EKKJOWQaklXSaOk
-	OTKWLEDWJDuRI8m55BPkTvI4eYGeRC9OT6XfTp9EX0rfRD9IP8UAM/AxaDK4MMQwHGRo
-	ZLjN8I4RYuRj1GJ0Y0xgLGW8yHifcZaJwCTBZMIUyJTJVMvUzTTB9JOZl1mb2ZM5hbmC
-	uYP5KfMPFk4WDRZ3lhSWCpZrLM9Z1ll5WXVZfVjTWU+w3mJ9z4Zjk2SzZItgK2JrYRtj
-	+0bhouhQfCmZlNOUQcpndmZ2FXZ39t3sJ9j72T9yMHAoc7hz7Oao47jNMcfJwqnO6c25
-	j7OBc5hzhYuXy5ArjKuI6wrXK24styy3E3cqdx33EPciDzePIU84zyGe6zxTvPS8ary+
-	vPm8rbwv+bB8CnwefPv4LvA94Ufxy/K78WfyX+B/KoAWUBDwFMgRaBV4JUgQVBMMECwU
-	7BScEWITogpFC1UKDQp9FxYVdhROF24SfilCEtEUCRU5ItIvsiwqIuokminaKvpGjFmM
-	KhYjVic2Ko4SVxaniZeJD4h/l5CS8JQ4IHFDYl5SSNJZMkeyQ3JWil/KQSpLql3qkzSf
-	tIN0tvRV6c8yQjIuMvkyXTJLspKy3rKlsrdlN+S2yYXKVck9kifKG8gnyl+Qf6fAreCg
-	kKdwU+G7ooJisGK14rgSg5KZ0l6ldqWFbVLbArYd3zamzKBsppyh3Km8oqKgEqZSrzKh
-	yqXqrFqkOqSGVaOqpal1qC2rK6pHqDeoT2kIa/hqVGo802TXdNIs0XygRday1MrTGtDG
-	ahtpZ2r36EA6+jp7dLp0furq6qbp3tD9qaent0evWx/oG+hn6N8ywBiYGuQaDFJJVBtq
-	MXXUkGLoZnjM8JWRoBHN6IzRrLGCcZxxu/G6ib5JlsmgKb2po+lR01dmwmahZk1my+Za
-	5unmAxb0Fs4WxyzeWEpZ7rRstwJWZlZFVk+sBaxDrC9ar9pQbfbbjNny2QbbXrRdszO2
-	K7R7ai9iH2nf4YB2sHWocHjvqOiY6njbidXJ1+m80w9nE+cS5wkXGZcUlwFXVld/12bX
-	n25WbhVuM+7q7tnuYx4iHnEevZ4sngGeLV4oL0evOq+l7UbbD2+f8lbzzvN+5iPjk+Yz
-	7CvkG+c74MfpF+7X5c/sT/PvCCAF+AZcCsQHegVepGFoHrSmIHSQe1BTMDrYI7g5BBvi
-	FdISShfqE9oWRg4LDOvcwbJjx47ecO7w2PChCOGI1IixSLnInMjJKM2o0qi5aNPo2ui1
-	nS47m2OIMUExN2N5YpNiR+Pk4wriPsQbxtfErye4J7QlsiRGJ95Pkk7KS/qQbJxclwKn
-	+KZ07eLbtXvXi1Tt1GOpa7s9d19L405LTXuxR2dP1Z7Nvb57e9KF07PSP2SYZzRm0mdG
-	Z47uU913dN96lm9Wb7Z4dkH2lxynnPZc3tz03Kk8q7yL+ZT81Pw3BWYFF/az7t+1/80B
-	swNNB9kPph18X2hdeLmItyir6HOxS3FXiURJcclqaWDpvUNqh2oPEw/HH54ssyi7fETg
-	SMGRb+X+5fePah49VcFckVbx6ZjrsVvHFY9XV5Iqkys/VDlX9VYrVtfUMNTsrpmt9awd
-	OqF5oqGOqy6/bvVk2Mnn9Vb1nafkTlWfZjydcXrpDO3Mk7MWZzsb5BtONLI15jaunYs6
-	9/a8y/mhC3oXWpskmiqbmZpzmtcv7rz4oWV7y2ireWvXJdVL5y+LXD7WxtyWdwW6knxl
-	oT20/XWHR8fIVcurt67pXrvSqdDZcF3ketUNzhulXfRded3o7j3dqzcTbi70RPTM9Ab1
-	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
-	oiDXdKCfkSVS8yDXz+jwXzw4RAfiokU6OyKyLSwT6W9j+w/WDYoxcUAw0heyi46jbmEO
-	BAdFx9k5/SNPSwkxtEEwCZEfosUa/xmnJszPAuGgAXpE3hIT7+CMYBEEd8cmOBojmBHB
-	71JCnFz/0VkKpBn9I4fhoFAT8986MHNonPmWLVbkHzChHVGWW3NAbMGqwBKEAxqIRxhf
-	NBCJ7KlWwBBZWX/fZUEQ8ENaEpC2WLADTCE4AukRhfSJQrDAP3qG/01i8qtfMNLvv44o
-	gPDLohBrf2z+tiOA2PwzZigIRPAfuR9iY6tta3axPqEZ/7b5R2NrvF+zUWhUmFFY/zMn
-	tBhaCa2CpiJxpS5aAwigKWguIIus++poA7QeWgtp0wAm4B0ycvCfOW6NH9ESlFAelazp
-	EoK0bv3t/n9akdVmSzv0X8//bQYg9P7sldk/M0D4k784gcibBljET8cRXh4AfUm7927V
-	/7nE0ZK2uILAMCo6OSY0OCROwABhTdJkBMwjA+RkBJQUFBXAfwBMLNjWCmVuZHN0cmVh
-	bQplbmRvYmoKMzEgMCBvYmoKNjA0NQplbmRvYmoKMTkgMCBvYmoKWyAvSUNDQmFzZWQg
-	MzAgMCBSIF0KZW5kb2JqCjMyIDAgb2JqCjw8IC9MZW5ndGggMzMgMCBSIC9OIDMgL0Fs
-	dGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4
-	AYVUz2sTQRT+Nm6p0CIIWmsOsniQIklZq2hF1Db9EWJrDNsftkWQZDNJ1m426+4mtaWI
-	5OLRKt5F7aEH/4AeevBkL0qFWkUo3qsoYqEXLfHNbky2perAzn7z3jfvfW923wANctI0
-	9YAE5A3HUqIRaWx8Qmr8iACOoglBNCVV2+xOJAZBg3P5e+fYeg+BW1bDe/t3snetmtK2
-	mgeE/UDgR5rZKrDvF3EKWRICiDzfoSnHdAjf49jy7I85Tnl4wbUPKz3EWSJ8QDUtzn9N
-	uFPNJdNAg0g4lPVxUj6c14uU1x0HaW5mxsgQvU+QprvM7qtioZxO9g6QvZ30fk6z3j7C
-	IcILGa0/RriNnvWM1T/iYeGk5sSGPRwYNfT4YBW3Gqn4NcIUXxBNJ6JUcdkuDfGYrv1W
-	8kqCcJA4ymRhgHNaSE/XTG74uocFfSbXE6/id1ZR4XmPE2fe1N3vRdoCrzAOHQwaDJoN
-	SFAQRQRhmLBQQIY8GjE0snI/I6sGG5N7MnUkart0YkSxQXs23D23UaTdPP4oInGUQ7UI
-	kvxB/iqvyU/lefnLXLDYVveUrZuauvLgO8XlmbkaHtfTyONzTV58ldR2k1dHlqx5erya
-	7Bo/7FeXMeaCNY/Ec7D78S1flcyXKYwUxeNV8+pLhHVaMTffn2x/Oz3iLs8utdZzrYmL
-	N1abl2f9akj77qq8k+ZV+U9e9fH8Z83EY+IpMSZ2iuchiZfFLvGS2EurC+JgbccInZWG
-	KdJtkfok1WBgmrz1L10/W3i9Rn8M9VGUGczSVIn3f8IqZDSduQ5v+o/bx/wX5PeK558o
-	Ai9s4MiZum1Tce8QoWWlbnOuAhe/0X3wtm5ro344/ARYPKsWrVI1nyC8ARx2h3oe6CmY
-	05aWzTlShyyfk7rpymJSzFDbQ1JS1yXXZUsWs5lVYul22JnTHW4coTlC98SnSmWT+q/x
-	EbD9sFL5+axS2X5OGtaBl/pvwLz9RQplbmRzdHJlYW0KZW5kb2JqCjMzIDAgb2JqCjcz
-	NwplbmRvYmoKOCAwIG9iagpbIC9JQ0NCYXNlZCAzMiAwIFIgXQplbmRvYmoKNCAwIG9i
-	ago8PCAvVHlwZSAvUGFnZXMgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0gL0NvdW50IDEg
-	L0tpZHMgWyAzIDAgUiBdID4+CmVuZG9iagozNCAwIG9iago8PCAvVHlwZSAvQ2F0YWxv
-	ZyAvT3V0bGluZXMgMiAwIFIgL1BhZ2VzIDQgMCBSIC9WZXJzaW9uIC8xLjQgPj4KZW5k
-	b2JqCjIgMCBvYmoKPDwgL0xhc3QgMzUgMCBSIC9GaXJzdCAzNiAwIFIgPj4KZW5kb2Jq
-	CjM2IDAgb2JqCjw8IC9QYXJlbnQgMzcgMCBSIC9Db3VudCAwIC9EZXN0IFsgMyAwIFIg
-	L1hZWiAwIDU1MyAwIF0gL1RpdGxlIChDYW52YXMgMSkKPj4KZW5kb2JqCjM3IDAgb2Jq
-	Cjw8ID4+CmVuZG9iagozNSAwIG9iago8PCAvUGFyZW50IDM3IDAgUiAvQ291bnQgMCAv
-	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
-	MFyw2Cm71YqNNrvNZkPYipHVpYOU1Wa12S1GiktBWOsyIopVkQJGDIgjVHRgBGZlLpBf
-	wZRcmTU1OHSSUVk+iK6EalJcLEnwYhgrqCaSioLXadJL00shPJ0O248FhFuq289pFP4k
-	H+9LVqbkIY/alYf9HKS8cjEPuzUQ+IRAHqjq0jqXJh/EPprl4wNq7E2ILB2R9rDUOZ4p
-	JMpN4QAvaJDIXm7+bPLPlsb2nzogccLa45u8Batj0xel7mo+edtoYIv/jX0FmyDFdBzM
-	LPzkEq5JMASwyMb7z662aa2rf7y1FVPtEndcAIH3XewNWDNAczgmZVdK8iGAtoR0vGos
-	rmEbcD27gG02rGQF03E43LEiO3aEyr2ix9+oW6pbbqB1LrfBYaRFl8nA+HUpPheSyey8
-	S0H5HXbB4zO6fSY6N2mB3RYU/L6AHOh8Udx680Z5FfSsd0FUlpaWRRMsVJxQCiVtYBbs
-	nOlke8fAQYmtkRbzyD7I8S7sxrAlmo0g/7Mx6OOE3+jqDc8vGzkvZjtD7d27+O3Fc6ZN
-	Z3laocu6KlcySr65+O5YyRnasWTTU8WumJzalTs7umZvvndZ5+tTg1UGUV867dtHc+3R
-	LhAmIqwZkB1guwwL2TDnQjzFCEQZQ9co2scy1zirQBQbotdeBda/OqCPEXEGOBNJqRUL
-	mHMx7ZsxLXui+/u/sGpYiHD9AU2OX5ZOf5LgXK8UfRQanpaD5RqFXekI5NdoFsgWavhi
-	QaeU0fY8PkXm1CidJelUVrDkSAlVkpfm02l4VnAEks2OCO4Kec1ONx9wZikoZ4GilC8t
-	dRj4YNreFNsoe9AxLikw3Dpy1E/xdhjQUbwNJcQ76Cdkn74SPT0ozsr6QNATjidEz+rL
-	6iNqC8yFJOZSC4uMybC6fLgwSUQWl11EJo8BzItkVESJyOY0izBgCCTuJts0UWpAuOFZ
-	KSayL4/EapyEYW824oRO7U0GJveOwvlkOrUGaASfgHWQDKYVifwFwwqL9Fi9rO72hm1i
-	a97iOblTcO8oo/L+ux8uEeV72e+eP9G+3OxTurRpGf5ZaSZZ0a/u2Xri2Paut2dkjN39
-	mNHBqVWO7Pl4kZBhyZw5ZULalDd21tTsiG53JNP0WiVX7g3VLPzJg1tf0OMrZA20xz9m
-	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
-	4LUiFFKyQBsebrLrlEoFC+5Z+IPp6pXBUbU8gh8K6XXgjuA5hiUNOV4mwPE2KVeTA22F
-	EoYtvYqJdrdOs+q0hR04jJYS61ZpTg+WEL/k0qVLQduzU/l2QksFkPP9X114853f9MbO
-	Hb/06+OxXwBJe+kJ14/S1dcu0COvvwYEhbVjjI2V7DFyv+PN0I+6jA9a9lhoos8O19Xo
-	6nXz+RX0Cn6DYQfcktlh3G7abt6L9po0NWi8sdp8zshUsG+w1Dp2N9qN97B7zWxKKmsx
-	mk2g4xuViiSnoCaKgskOBCU8YTZaupWPmEBfeDfBwcB6tVcsNxEyseyAxHnWbAtousCI
-	xRhIF9IZ4SqKabHObLawGBPmtoATnJCGRALEQIXcnKXSwXw+R1M8JQnFAmJ8FxaNwkVA
-	GZoWz/jvn1P+ZOeT/qArO02Tl61hR6ljbW+BE5fJnh97LPb1y7F5vZzwgooTLcKWFKYO
-	WPE+QivpF2+B/zf4Z78MKKTBz0Tu2qjgbEeLnMQfIt2NCcKtmAw4V8uHWzEFqAhVoEpU
-	Jf2Hw1j4px7yfwy18D8At0j/azEZ/n/iVjQNTUf1qAFuAM2UPkZWAZZSHNzaQdPGz6i6
-	ZUx6Tcui9pa2BXOboCZRS5qA2QP/OYDQuwBXAK5CJQMAd3xwCsAwgAqAqQDNAG0AawC2
-	ALwA0AtwGuBdgCsAV2HwDIABIAVgGEAFwFSAZoA2gDUAWwBeAOgFOA3wLsAVgKtAGAbA
-	AJACMAygAmAqQHO8/wd4osE0Rp4h+eQh+dQh+eCQPLmJdGN/ZHZuzGcNyY8Ykh89JF8+
-	JD9mSB7Gc1P/VUPyNUPyoHjf1P6WIfmJQ/LkpPFG/CcPyQMtb6onHHFj+zlD8nOH5JuH
-	5CUev2E+5g2pnz8k3zokv2BIfuGQ/B1D8ouG5KX/Gb3h+8Q6vXE8dw7JLxmSXzYkf9eQ
-	fNuQ/PIh+fYh+RVD8h0k/38GpnvKCmVuZHN0cmVhbQplbmRvYmoKMzkgMCBvYmoKMTAx
-	NDMKZW5kb2JqCjQwIDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAvQXNjZW50
-	IDc3MCAvQ2FwSGVpZ2h0IDczNyAvRGVzY2VudCAtMjMwIC9GbGFncyAzMgovRm9udEJC
-	b3ggWy05NTEgLTQ4MSAxNDQ1IDExMjJdIC9Gb250TmFtZSAvVktaRk9DK0hlbHZldGlj
-	YSAvSXRhbGljQW5nbGUgMAovU3RlbVYgMCAvTWF4V2lkdGggMTUwMCAvWEhlaWdodCA2
-	MzcgL0ZvbnRGaWxlMiAzOCAwIFIgPj4KZW5kb2JqCjQxIDAgb2JqClsgMjc4IDAgMzU1
-	IDAgMCAwIDAgMCAzMzMgMzMzIDM4OSAwIDI3OCAwIDI3OCAwIDAgMCAwIDAgMCAwIDAg
-	MCAwIDAgMjc4IDAKMCAwIDAgMCAwIDY2NyA2NjcgNzIyIDcyMiAwIDYxMSAwIDcyMiAy
-	NzggMCAwIDAgMCAwIDc3OCA2NjcgNzc4IDcyMiAwIDYxMQowIDAgMCAwIDAgMCAwIDAg
-	MCAwIDAgMCA1NTYgNTU2IDUwMCA1NTYgNTU2IDI3OCA1NTYgNTU2IDIyMiAyMjIgNTAw
-	IDIyMiA4MzMKNTU2IDU1NiA1NTYgMCAzMzMgNTAwIDI3OCA1NTYgNTAwIDcyMiAwIDUw
-	MCBdCmVuZG9iagoxOCAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5
-	cGUgL0Jhc2VGb250IC9WS1pGT0MrSGVsdmV0aWNhIC9Gb250RGVzY3JpcHRvcgo0MCAw
-	IFIgL1dpZHRocyA0MSAwIFIgL0ZpcnN0Q2hhciAzMiAvTGFzdENoYXIgMTIxIC9FbmNv
-	ZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+PgplbmRvYmoKNDIgMCBvYmoKKFVudGl0bGVk
-	KQplbmRvYmoKNDMgMCBvYmoKKE1hYyBPUyBYIDEwLjYuMiBRdWFydHogUERGQ29udGV4
-	dCkKZW5kb2JqCjQ0IDAgb2JqCihHbHlwaCBMZWZrb3dpdHopCmVuZG9iago0NSAwIG9i
-	agooT21uaUdyYWZmbGUgUHJvZmVzc2lvbmFsKQplbmRvYmoKNDYgMCBvYmoKKEQ6MjAx
-	MDAxMTQyMTQ2MThaMDAnMDAnKQplbmRvYmoKMSAwIG9iago8PCAvVGl0bGUgNDIgMCBS
-	IC9BdXRob3IgNDQgMCBSIC9Qcm9kdWNlciA0MyAwIFIgL0NyZWF0b3IgNDUgMCBSIC9D
-	cmVhdGlvbkRhdGUKNDYgMCBSIC9Nb2REYXRlIDQ2IDAgUiA+PgplbmRvYmoKeHJlZgow
-	IDQ3CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDA2MTQ4MiAwMDAwMCBuIAowMDAwMDUw
-	MDg2IDAwMDAwIG4gCjAwMDAwMDQ0MDAgMDAwMDAgbiAKMDAwMDA0OTkyMyAwMDAwMCBu
-	IAowMDAwMDAwMDIyIDAwMDAwIG4gCjAwMDAwMDQzODAgMDAwMDAgbiAKMDAwMDAwNDUw
-	NCAwMDAwMCBuIAowMDAwMDQ5ODg3IDAwMDAwIG4gCjAwMDAwMDY3NTUgMDAwMDAgbiAK
-	MDAwMDAyMDA4NyAwMDAwMCBuIAowMDAwMDA1OTUyIDAwMDAwIG4gCjAwMDAwMDY3MzUg
-	MDAwMDAgbiAKMDAwMDAwNDcwMSAwMDAwMCBuIAowMDAwMDA1NDA3IDAwMDAwIG4gCjAw
-	MDAwMDU0MjcgMDAwMDAgbiAKMDAwMDAwNTkzMiAwMDAwMCBuIAowMDAwMDQyNzg0IDAw
-	MDAwIG4gCjAwMDAwNjExMDkgMDAwMDAgbiAKMDAwMDA0ODk5MCAwMDAwMCBuIAowMDAw
-	MDI2MjkzIDAwMDAwIG4gCjAwMDAwMjg0MTUgMDAwMDAgbiAKMDAwMDAzODc3MiAwMDAw
-	MCBuIAowMDAwMDQxOTM1IDAwMDAwIG4gCjAwMDAwMjAxMDkgMDAwMDAgbiAKMDAwMDAy
-	NjI3MiAwMDAwMCBuIAowMDAwMDI4NDM2IDAwMDAwIG4gCjAwMDAwMzg3NTAgMDAwMDAg
-	biAKMDAwMDA0MTk1NiAwMDAwMCBuIAowMDAwMDQyNzY0IDAwMDAwIG4gCjAwMDAwNDI4
-	MjEgMDAwMDAgbiAKMDAwMDA0ODk2OSAwMDAwMCBuIAowMDAwMDQ5MDI3IDAwMDAwIG4g
-	CjAwMDAwNDk4NjcgMDAwMDAgbiAKMDAwMDA1MDAwNiAwMDAwMCBuIAowMDAwMDUwMjQ5
-	IDAwMDAwIG4gCjAwMDAwNTAxMzQgMDAwMDAgbiAKMDAwMDA1MDIyNyAwMDAwMCBuIAow
-	MDAwMDUwMzQyIDAwMDAwIG4gCjAwMDAwNjA1NzYgMDAwMDAgbiAKMDAwMDA2MDU5OCAw
-	MDAwMCBuIAowMDAwMDYwODIzIDAwMDAwIG4gCjAwMDAwNjEyODQgMDAwMDAgbiAKMDAw
-	MDA2MTMxMSAwMDAwMCBuIAowMDAwMDYxMzYzIDAwMDAwIG4gCjAwMDAwNjEzOTcgMDAw
-	MDAgbiAKMDAwMDA2MTQ0MCAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDQ3IC9Sb290
-	IDM0IDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8MjcxMmU2MjU3ZDg2ZmVmMzU1YTAwNjEz
-	ZGE5ODQzYTY+CjwyNzEyZTYyNTdkODZmZWYzNTVhMDA2MTNkYTk4NDNhNj4gXSA+Pgpz
-	dGFydHhyZWYKNjE2MDIKJSVFT0YKMSAwIG9iago8PC9BdXRob3IgKFdpbGZyZWRvIFNh
-	bmNoZXpcbkdseXBoIExlZmtvd2l0eikvQ3JlYXRpb25EYXRlIChEOjIwMTAwMTExMTky
-	MTAwWikvQ3JlYXRvciAoT21uaUdyYWZmbGUgUHJvZmVzc2lvbmFsIDUuMi4xKS9Nb2RE
-	YXRlIChEOjIwMTAwMTE0MjE0NjAwWikvUHJvZHVjZXIgNDMgMCBSIC9UaXRsZSAoQ2Fs
-	ZW5kYXIgU3RvcmUuZ3JhZmZsZSk+PgplbmRvYmoKeHJlZgoxIDEKMDAwMDA2MjcwMCAw
-	MDAwMCBuIAp0cmFpbGVyCjw8L0lEIFs8MjcxMmU2MjU3ZDg2ZmVmMzU1YTAwNjEzZGE5
-	ODQzYTY+IDwyNzEyZTYyNTdkODZmZWYzNTVhMDA2MTNkYTk4NDNhNj5dIC9JbmZvIDEg
-	MCBSIC9QcmV2IDYxNjAyIC9Sb290IDM0IDAgUiAvU2l6ZSA0Nz4+CnN0YXJ0eHJlZgo2
-	MjkxMwolJUVPRgo=
-	</data>
-	<key>QuickLookThumbnail</key>
-	<data>
-	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
-	HBuoZAXwYxOIdg+YDQCJtSRQg4b4bZ7YLYMgIgAAChfVf1pwoYgIAA8BAAADAAAAAQBx
-	AAABAQADAAAAAQBbAAABAgADAAAABAAAGJYBAwADAAAAAQAFAAABBgADAAAAAQACAAAB
-	EQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAAAQBbAAABFwAE
-	AAAAAQAAF9QBHAADAAAAAQABAAABPQADAAAAAQACAAABUgADAAAAAQABAAABUwADAAAA
-	BAAAGJ6HcwAHAAApmAAAGKYAAAAAAAgACAAIAAgAAQABAAEAAQAAKZhhcHBsAgAAAG1u
-	dHJSR0IgWFlaIAfaAAEAAgAAABwACmFjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-	AAAAAAD21gABAAAAANMtYXBwbB5XET7FGnu84JaBzKU8KrcAAAAAAAAAAAAAAAAAAAAA
-	AAAAAAAAAAAAAAAAAAAAEXJYWVoAAAFQAAAAFGdYWVoAAAFkAAAAFGJYWVoAAAF4AAAA
-	FHd0cHQAAAGMAAAAFGNoYWQAAAGgAAAALHJUUkMAAAHMAAAIDGdUUkMAAAnYAAAIDGJU
-	UkMAABHkAAAIDGFhcmcAABnwAAAAIGFhZ2cAABoQAAAAIGFhYmcAABowAAAAIHZjZ3QA
-	ABpQAAAGEm5kaW4AACBkAAAGPmRlc2MAACakAAAAZGRzY20AACcIAAACQm1tb2QAAClM
-	AAAAKGNwcnQAACl0AAAAJFhZWiAAAAAAAABvcAAAOZ4AAAGiWFlaIAAAAAAAAGEuAAC2
-	pQAADsRYWVogAAAAAAAAJjgAAA++AADCx1hZWiAAAAAAAADzUgABAAAAARbPc2YzMgAA
-	AAAAAQxCAAAF3v//8yYAAAeSAAD9kf//+6L///2jAAAD3AAAwGxjdXJ2AAAAAAAABAAA
-	AAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8
-	AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANoA4ADlAOoA8AD1APsB
-	AQEHAQwBEgEYAR4BJQErATEBOAE+AUUBSwFSAVkBYAFmAW0BdQF8AYMBigGSAZkBoQGo
-	AbABuAHAAcgB0AHYAeAB6QHxAfoCAgILAhQCHAIlAi4CNwJAAkoCUwJcAmYCcAJ5AoMC
-	jQKXAqECqwK1Ar8CygLUAt8C6gL0Av8DCgMVAyADKwM3A0IDTQNZA2UDcAN8A4gDlAOg
-	A6wDuQPFA9ID3gPrA/gEBAQRBB4ELAQ5BEYEVARhBG8EfASKBJgEpgS0BMIE0QTfBO4E
-	/AULBRoFKAU3BUcFVgVlBXQFhAWTBaMFswXDBdMF4wXzBgMGFAYkBjUGRQZWBmcGeAaJ
-	BpoGqwa9Bs4G4AbyBwMHFQcnBzkHTAdeB3AHgweWB6gHuwfOB+EH9AgICBsILwhCCFYI
-	agh+CJIIpgi6CM4I4wj3CQwJIQk2CUsJYAl1CYoJoAm1CcsJ4An2CgwKIgo5Ck8KZQp8
-	CpIKqQrACtcK7gsFCx0LNAtLC2MLewuTC6sLwwvbC/MMDAwkDD0MVgxuDIcMoQy6DNMM
-	7Q0GDSANOg1UDW4NiA2iDbwN1w3xDgwOJw5CDl0OeA6TDq8Oyg7mDwIPHg86D1YPcg+O
-	D6sPyA/kEAEQHhA7EFgQdhCTELEQzhDsEQoRKBFGEWQRgxGhEcAR3xH+Eh0SPBJbEnoS
-	mhK5EtkS+RMZEzkTWRN6E5oTuxPbE/wUHRQ+FF8UgRSiFMQU5RUHFSkVSxVtFZAVshXV
-	FfcWGhY9FmAWgxanFsoW7hcSFzUXWRd9F6IXxhfqGA8YNBhZGH0YoxjIGO0ZExk4GV4Z
-	hBmqGdAZ9hodGkMaahqQGrca3hsGGy0bVBt8G6MbyxvzHBscQxxsHJQcvRzmHQ4dNx1g
-	HYodsx3dHgYeMB5aHoQerh7YHwMfLR9YH4Mfrh/ZIAQgMCBbIIcgsyDeIQohNyFjIY8h
-	vCHpIhUiQiJwIp0iyiL4IyUjUyOBI68j3SQMJDokaSSXJMYk9SUkJVQlgyWzJeImEiZC
-	JnImoybTJwMnNCdlJ5Ynxyf4KCooWyiNKL4o8CkiKVUphym5KewqHypSKoUquCrrKx4r
-	UiuGK7or7iwiLFYsiiy/LPQtKS1eLZMtyC39LjMuaS6eLtQvCy9BL3cvri/kMBswUjCJ
-	MMEw+DEwMWcxnzHXMg8ySDKAMrgy8TMqM2MznDPVNA80SDSCNLw09jUwNWo1pTXfNho2
-	VTaQNss3BjdCN343uTf1ODE4bTiqOOY5IzlgOZ052joXOlQ6kjrPOw07SzuJO8c8BjxE
-	PIM8wj0BPUA9fz2/Pf4+Pj5+Pr4+/j8/P38/wEAAQEFAgkDEQQVBR0GIQcpCDEJOQpFC
-	00MWQ1hDm0PeRCFEZUSoROxFMEV0RbhF/EZARoVGykcOR1NHmUfeSCNIaUivSPVJO0mB
-	ScdKDkpVSptK4ksqS3FLuEwATEhMkEzYTSBNaE2xTfpOQk6MTtVPHk9nT7FP+1BFUI9Q
-	2VEkUW5RuVIEUk9SmlLlUzFTfFPIVBRUYFStVPlVRlWSVd9WLFZ6VsdXFFdiV7BX/lhM
-	WJpY6Vk4WYZZ1VokWnRaw1sTW2NbslwDXFNco1z0XURdlV3mXjdeiV7aXyxffl/QYCJg
-	dGDHYRlhbGG/YhJiZWK5YwxjYGO0ZAhkXGSxZQVlWmWvZgRmWWavZwRnWmewaAZoXGiy
-	aQlpX2m2ag1qZGq8axNra2vDbBtsc2zLbSNtfG3Vbi5uh27gbzpvk2/tcEdwoXD7cVZx
-	sHILcmZywXMcc3hz03QvdIt053VDdaB1/HZZdrZ3E3dwd854K3iJeOd5RXmjegJ6YHq/
-	ex57fXvcfDx8m3z7fVt9u34bfnx+3H89f55//4BggMKBI4GFgeeCSYKrgw6DcIPThDaE
-	mYT8hWCFw4YnhouG74dUh7iIHYiBiOaJTImxihaKfIrii0iLrowUjHuM4o1Ija+OF45+
-	juWPTY+1kB2QhZDukVaRv5IokpGS+pNkk82UN5ShlQuVdZXglkqWtZcgl4uX95himM6Z
-	OpmmmhKafprrm1ebxJwxnJ+dDJ15neeeVZ7DnzGfoKAPoH2g7KFbocuiOqKqoxqjiqP6
-	pGqk26VMpbymLqafpxCngqf0qGWo2KlKqbyqL6qiqxWriKv7rG+s461WrcuuP66zryiv
-	nbARsIew/LFxseeyXbLTs0mzv7Q2tK21JLWbthK2ibcBt3m38bhpuOG5WrnSuku6xLs+
-	u7e8MLyqvSS9nr4ZvpO/Dr+JwATAf8D6wXbB8cJtwunDZsPixF/E3MVZxdbGU8bRx07H
-	zMhKyMnJR8nGykXKxMtDy8LMQszBzUHNwc5CzsLPQ8/D0ETQxtFH0cjSStLM007T0NRT
-	1NbVWNXb1l7W4tdl1+nYbdjx2XXZ+tp/2wPbiNwO3JPdGd2e3iTeqt8x37fgPuDF4Uzh
-	0+Ja4uLjauPy5HrlAuWL5hPmnOcl56/oOOjC6Uzp1upg6urrdev/7IrtFu2h7izuuO9E
-	79DwXPDp8XXyAvKP8xzzqvQ39MX1U/Xh9m/2/veM+Bv4qvk5+cn6Wfro+3j8CPyZ/Sn9
-	uv5L/tz/bmN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBK
-	AE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYA
-	ywDQANUA2gDgAOUA6gDwAPUA+wEBAQcBDAESARgBHgElASsBMQE4AT4BRQFLAVIBWQFg
-	AWYBbQF1AXwBgwGKAZIBmQGhAagBsAG4AcAByAHQAdgB4AHpAfEB+gICAgsCFAIcAiUC
-	LgI3AkACSgJTAlwCZgJwAnkCgwKNApcCoQKrArUCvwLKAtQC3wLqAvQC/wMKAxUDIAMr
-	AzcDQgNNA1kDZQNwA3wDiAOUA6ADrAO5A8UD0gPeA+sD+AQEBBEEHgQsBDkERgRUBGEE
-	bwR8BIoEmASmBLQEwgTRBN8E7gT8BQsFGgUoBTcFRwVWBWUFdAWEBZMFowWzBcMF0wXj
-	BfMGAwYUBiQGNQZFBlYGZwZ4BokGmgarBr0GzgbgBvIHAwcVBycHOQdMB14HcAeDB5YH
-	qAe7B84H4Qf0CAgIGwgvCEIIVghqCH4IkgimCLoIzgjjCPcJDAkhCTYJSwlgCXUJigmg
-	CbUJywngCfYKDAoiCjkKTwplCnwKkgqpCsAK1wruCwULHQs0C0sLYwt7C5MLqwvDC9sL
-	8wwMDCQMPQxWDG4MhwyhDLoM0wztDQYNIA06DVQNbg2IDaINvA3XDfEODA4nDkIOXQ54
-	DpMOrw7KDuYPAg8eDzoPVg9yD44Pqw/ID+QQARAeEDsQWBB2EJMQsRDOEOwRChEoEUYR
-	ZBGDEaERwBHfEf4SHRI8ElsSehKaErkS2RL5ExkTORNZE3oTmhO7E9sT/BQdFD4UXxSB
-	FKIUxBTlFQcVKRVLFW0VkBWyFdUV9xYaFj0WYBaDFqcWyhbuFxIXNRdZF30XohfGF+oY
-	Dxg0GFkYfRijGMgY7RkTGTgZXhmEGaoZ0Bn2Gh0aQxpqGpAatxreGwYbLRtUG3wboxvL
-	G/McGxxDHGwclBy9HOYdDh03HWAdih2zHd0eBh4wHloehB6uHtgfAx8tH1gfgx+uH9kg
-	BCAwIFsghyCzIN4hCiE3IWMhjyG8IekiFSJCInAinSLKIvgjJSNTI4EjryPdJAwkOiRp
-	JJckxiT1JSQlVCWDJbMl4iYSJkImciajJtMnAyc0J2UnlifHJ/goKihbKI0ovijwKSIp
-	VSmHKbkp7CofKlIqhSq4KusrHitSK4YruivuLCIsViyKLL8s9C0pLV4tky3ILf0uMy5p
-	Lp4u1C8LL0Evdy+uL+QwGzBSMIkwwTD4MTAxZzGfMdcyDzJIMoAyuDLxMyozYzOcM9U0
-	DzRINII0vDT2NTA1ajWlNd82GjZVNpA2yzcGN0I3fje5N/U4MThtOKo45jkjOWA5nTna
-	Ohc6VDqSOs87DTtLO4k7xzwGPEQ8gzzCPQE9QD1/Pb89/j4+Pn4+vj7+Pz8/fz/AQABA
-	QUCCQMRBBUFHQYhBykIMQk5CkULTQxZDWEObQ95EIURlRKhE7EUwRXRFuEX8RkBGhUbK
-	Rw5HU0eZR95II0hpSK9I9Uk7SYFJx0oOSlVKm0riSypLcUu4TABMSEyQTNhNIE1oTbFN
-	+k5CToxO1U8eT2dPsU/7UEVQj1DZUSRRblG5UgRST1KaUuVTMVN8U8hUFFRgVK1U+VVG
-	VZJV31YsVnpWx1cUV2JXsFf+WExYmljpWThZhlnVWiRadFrDWxNbY1uyXANcU1yjXPRd
-	RF2VXeZeN16JXtpfLF9+X9BgImB0YMdhGWFsYb9iEmJlYrljDGNgY7RkCGRcZLFlBWVa
-	Za9mBGZZZq9nBGdaZ7BoBmhcaLJpCWlfabZqDWpkarxrE2tra8NsG2xzbMttI218bdVu
-	Lm6HbuBvOm+Tb+1wR3ChcPtxVnGwcgtyZnLBcxxzeHPTdC90i3TndUN1oHX8dll2tncT
-	d3B3zngreIl453lFeaN6Anpger97Hnt9e9x8PHybfPt9W327fht+fH7cfz1/nn//gGCA
-	woEjgYWB54JJgquDDoNwg9OENoSZhPyFYIXDhieGi4bvh1SHuIgdiIGI5olMibGKFop8
-	iuKLSIuujBSMe4zijUiNr44Xjn6O5Y9Nj7WQHZCFkO6RVpG/kiiSkZL6k2STzZQ3lKGV
-	C5V1leCWSpa1lyCXi5f3mGKYzpk6maaaEpp+muubV5vEnDGcn50MnXmd555VnsOfMZ+g
-	oA+gfaDsoVuhy6I6oqqjGqOKo/qkaqTbpUylvKYupp+nEKeCp/SoZajYqUqpvKovqqKr
-	FauIq/usb6zjrVaty64/rrOvKK+dsBGwh7D8sXGx57JdstOzSbO/tDa0rbUktZu2EraJ
-	twG3ebfxuGm44blaudK6S7rEuz67t7wwvKq9JL2evhm+k78Ov4nABMB/wPrBdsHxwm3C
-	6cNmw+LEX8TcxVnF1sZTxtHHTsfMyErIyclHycbKRcrEy0PLwsxCzMHNQc3BzkLOws9D
-	z8PQRNDG0UfRyNJK0szTTtPQ1FPU1tVY1dvWXtbi12XX6dht2PHZddn62n/bA9uI3A7c
-	k90Z3Z7eJN6q3zHft+A+4MXhTOHT4lri4uNq4/LkeuUC5YvmE+ac5yXnr+g46MLpTOnW
-	6mDq6ut16//siu0W7aHuLO6470Tv0PBc8OnxdfIC8o/zHPOq9Df0xfVT9eH2b/b+94z4
-	G/iq+Tn5yfpZ+uj7ePwI/Jn9Kf26/kv+3P9uY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZ
-	AB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA
-	mgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDaAOAA5QDqAPAA9QD7AQEBBwEMARIBGAEe
-	ASUBKwExATgBPgFFAUsBUgFZAWABZgFtAXUBfAGDAYoBkgGZAaEBqAGwAbgBwAHIAdAB
-	2AHgAekB8QH6AgICCwIUAhwCJQIuAjcCQAJKAlMCXAJmAnACeQKDAo0ClwKhAqsCtQK/
-	AsoC1ALfAuoC9AL/AwoDFQMgAysDNwNCA00DWQNlA3ADfAOIA5QDoAOsA7kDxQPSA94D
-	6wP4BAQEEQQeBCwEOQRGBFQEYQRvBHwEigSYBKYEtATCBNEE3wTuBPwFCwUaBSgFNwVH
-	BVYFZQV0BYQFkwWjBbMFwwXTBeMF8wYDBhQGJAY1BkUGVgZnBngGiQaaBqsGvQbOBuAG
-	8gcDBxUHJwc5B0wHXgdwB4MHlgeoB7sHzgfhB/QICAgbCC8IQghWCGoIfgiSCKYIugjO
-	COMI9wkMCSEJNglLCWAJdQmKCaAJtQnLCeAJ9goMCiIKOQpPCmUKfAqSCqkKwArXCu4L
-	BQsdCzQLSwtjC3sLkwurC8ML2wvzDAwMJAw9DFYMbgyHDKEMugzTDO0NBg0gDToNVA1u
-	DYgNog28DdcN8Q4MDicOQg5dDngOkw6vDsoO5g8CDx4POg9WD3IPjg+rD8gP5BABEB4Q
-	OxBYEHYQkxCxEM4Q7BEKESgRRhFkEYMRoRHAEd8R/hIdEjwSWxJ6EpoSuRLZEvkTGRM5
-	E1kTehOaE7sT2xP8FB0UPhRfFIEUohTEFOUVBxUpFUsVbRWQFbIV1RX3FhoWPRZgFoMW
-	pxbKFu4XEhc1F1kXfReiF8YX6hgPGDQYWRh9GKMYyBjtGRMZOBleGYQZqhnQGfYaHRpD
-	GmoakBq3Gt4bBhstG1QbfBujG8sb8xwbHEMcbByUHL0c5h0OHTcdYB2KHbMd3R4GHjAe
-	Wh6EHq4e2B8DHy0fWB+DH64f2SAEIDAgWyCHILMg3iEKITchYyGPIbwh6SIVIkIicCKd
-	Isoi+CMlI1MjgSOvI90kDCQ6JGkklyTGJPUlJCVUJYMlsyXiJhImQiZyJqMm0ycDJzQn
-	ZSeWJ8cn+CgqKFsojSi+KPApIilVKYcpuSnsKh8qUiqFKrgq6yseK1Irhiu6K+4sIixW
-	LIosvyz0LSktXi2TLcgt/S4zLmkuni7ULwsvQS93L64v5DAbMFIwiTDBMPgxMDFnMZ8x
-	1zIPMkgygDK4MvEzKjNjM5wz1TQPNEg0gjS8NPY1MDVqNaU13zYaNlU2kDbLNwY3Qjd+
-	N7k39TgxOG04qjjmOSM5YDmdOdo6FzpUOpI6zzsNO0s7iTvHPAY8RDyDPMI9AT1APX89
-	vz3+Pj4+fj6+Pv4/Pz9/P8BAAEBBQIJAxEEFQUdBiEHKQgxCTkKRQtNDFkNYQ5tD3kQh
-	RGVEqETsRTBFdEW4RfxGQEaFRspHDkdTR5lH3kgjSGlIr0j1STtJgUnHSg5KVUqbSuJL
-	KktxS7hMAExITJBM2E0gTWhNsU36TkJOjE7VTx5PZ0+xT/tQRVCPUNlRJFFuUblSBFJP
-	UppS5VMxU3xTyFQUVGBUrVT5VUZVklXfVixWelbHVxRXYlewV/5YTFiaWOlZOFmGWdVa
-	JFp0WsNbE1tjW7JcA1xTXKNc9F1EXZVd5l43Xole2l8sX35f0GAiYHRgx2EZYWxhv2IS
-	YmViuWMMY2BjtGQIZFxksWUFZVplr2YEZllmr2cEZ1pnsGgGaFxosmkJaV9ptmoNamRq
-	vGsTa2trw2wbbHNsy20jbXxt1W4ubodu4G86b5Nv7XBHcKFw+3FWcbByC3JmcsFzHHN4
-	c9N0L3SLdOd1Q3Wgdfx2WXa2dxN3cHfOeCt4iXjneUV5o3oCemB6v3see3173Hw8fJt8
-	+31bfbt+G358ftx/PX+ef/+AYIDCgSOBhYHngkmCq4MOg3CD04Q2hJmE/IVghcOGJ4aL
-	hu+HVIe4iB2IgYjmiUyJsYoWinyK4otIi66MFIx7jOKNSI2vjheOfo7lj02PtZAdkIWQ
-	7pFWkb+SKJKRkvqTZJPNlDeUoZULlXWV4JZKlrWXIJeLl/eYYpjOmTqZppoSmn6a65tX
-	m8ScMZyfnQydeZ3nnlWew58xn6CgD6B9oOyhW6HLojqiqqMao4qj+qRqpNulTKW8pi6m
-	n6cQp4Kn9KhlqNipSqm8qi+qoqsVq4ir+6xvrOOtVq3Lrj+us68or52wEbCHsPyxcbHn
-	sl2y07NJs7+0NrSttSS1m7YStom3Abd5t/G4abjhuVq50rpLusS7Pru3vDC8qr0kvZ6+
-	Gb6Tvw6/icAEwH/A+sF2wfHCbcLpw2bD4sRfxNzFWcXWxlPG0cdOx8zISsjJyUfJxspF
-	ysTLQ8vCzELMwc1BzcHOQs7Cz0PPw9BE0MbRR9HI0krSzNNO09DUU9TW1VjV29Ze1uLX
-	Zdfp2G3Y8dl12fraf9sD24jcDtyT3Rndnt4k3qrfMd+34D7gxeFM4dPiWuLi42rj8uR6
-	5QLli+YT5pznJeev6DjowulM6dbqYOrq63Xr/+yK7Rbtoe4s7rjvRO/Q8Fzw6fF18gLy
-	j/Mc86r0N/TF9VP14fZv9v73jPgb+Kr5OfnJ+ln66Pt4/Aj8mf0p/br+S/7c/25wYXJh
-	AAAAAAADAAAAAmZmAADypwAADVkAABPQAAALA3BhcmEAAAAAAAMAAAACZmYAAPKnAAAN
-	WQAAE9AAAAsDcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACwN2Y2d0AAAAAAAA
-	AAAAAwEAAAIAAAARAE8AwAE1AacCKQKoAzgD0QRyBSEF2gaYB2MIPwkjCg8LDQwRDSUO
-	PQ9cEIcRuxL2FDsVexbKGBYZaRrBHBgddB7QIC0hkyMbJKEmLCezKUUq0ixlLfovkDEm
-	MsM0XTX6N5g5OTrXPHo+Gj++QWFDAkSqRk5H9UmdS0JMzE4TT1FQj1HNUw1UTVWOVs9Y
-	EFlUWpZb110aXltfn2DiYiVjamStZfFnNWh6ab9rBmwpbTFuNm87cEFxRnJKc050UnVW
-	dlh3WXhaeVp6WntYfFd9VH5Rf02ASoFGgkKDPYQ3hTCGKocmiCKJHoobixmMF40WjheP
-	F5AZkRySH5MjlCeVLZYzlzmYP5lFmkibSZxKnUyeTZ9PoFGhUqJTo1OkU6VTplKnUahP
-	qU2qSqtHrEWtQq4/r0CwS7FesnCzg7SWtai2ubfKuNy57Lr7vAq9Gb4nvzTAQsFOwlvD
-	Z8R0xXvGc8dnyFrJTco+yy/MHs0NzfvO5s/Q0LnRoNKG02rUTtUw1hLW9NfV2KXZc9pB
-	2w3b2tyk3W3eNd7838DgguFE4gTiwuN+5Dnk9OWu5mbnG+fF6GzpE+m56lzq/+ue7Dzs
-	1+1u7gTulu8m77PwPfDG8Uzx0vJa8uTzcfP99IX1DfWQ9hP2kfcO94n4BfiB+P/5iPoY
-	+sP7k/yd/g///wAAAAwAOACJAQEBTgGvAhsCgAL1A2cD5gRqBPsFjwYvBt0HlAhXCSYJ
-	/ArgC9EMzw3bDu4QDBEvEmATmRTaFiEXcBjAGhgbeRzrHnMf+yGGIxIkniYpJ7UpOirB
-	LEItxC9BMLkyMjOfNQ02dzfaOTo6kzvqPT4+kD/eQSpCc0OxRNpGAUcoSFBJdkqeS8RM
-	6U4OTzNQV1F6Up1TvlTfVgBXIFhAWV9afVucXLtd2V75YAthEmIYYx9kJWUsZjJnOGg8
-	aUBqQ2tFbERtQm5AbztwNHEtciNzGHQMdP918Xbdd8F4pXmJem57VHw6fSF+Cn7zf92A
-	yYG1gqKDkIR9hWyGW4dMiDyJLIodiw6MAIzyjeWO2I/NkMKRuJKtk6OUmpWPloWXephu
-	mWGaU5tEnDSdJJ4TnwGf86DwofOi9qP5pPul/ab9p/2o/an7qvmr96z2rfSu8q/ysPCx
-	8LLxs/O097YCtw24GLkiuiu7NLw7vUK+SL9OwFPBWcJew2TEasVxxnjHgciJyZLKjcuE
-	zHzNdc5tz2XQXNFT0krTQNQ11SjWG9cM1/3Y69nY2sXbsNyY3XzeXt9B4CThB+Hp4svj
-	ruSP5W/mT+cu6Azo6enE6p7rd+xQ7SvuD+757+bw1fHH8rvzsPSn9Z/2mPeR+Ij5fvpy
-	+2X8Vf1C/i3/F///AAAAEQBPAMABLAGMAgQCYQLRA0QDvgQ9BMAFRQXKBlcG6weACBwI
-	uAlaCgIKrQteDBYMzA2IDkoPDw/VEKARbxJAExQT6BTAFbgWyxfoGQYaJRtCHGUdhR6l
-	H8cg6SIMIzEkUCV0JpYnuCjdKgArIixFLWkuiy+vMNIx9jMbNDc1JzYWNwg3+jjtOeA6
-	1DvIPL09sj6oP55AlUGMQoRDfER0RW1GZkdfSFpJVUpQS0tMPE0lTg1O9U/dUMdRsVKa
-	U4RUblVZVkRXLlgYWQRZ71raW8Zcsl2eXotfeGBlYUtiJGL7Y9Jkq2WDZlxnNGgMaOVp
-	vWqWa25sRW0dbfRuy2+jcHpxUnIpcwBz0XSadV92I3bod614dHk6egJ6ynuSfFx9Jn3w
-	frt/h4BTgSCB7YK6g4mEV4UmhfSGw4eSiGGJMIoAitCLoYxyjUSOFo7pj7yQj5FjkjeT
-	DJPhlLeVjJZll0SYJZkHmemay5uunJCddJ5XnzugIKEEoemiz6O1pJulgaZop0+oPak7
-	qkSrTaxXrWKuba94sIaxlLKjs7O0xLXWtui3/LkQuiW7O7xSvXK+pb/fwRzCW8OdxOPG
-	LMd5yMjKG8twzMbOH8950NTSM9OQ1O7WTtev2Q/abtv83cXfl+Ft40nlL+cj6SjrRO13
-	78fyM/S992X6Kf0I//8AAG5kaW4AAAAAAAAGNgAApaEAAFanAABPbwAAoWgAACX9AAAO
-	0gAAUA0AAFQ5AAL1wgACXrgAAZHrAAMBAAACAAAABQAPAB0ALQA/AFIAZwB8AJIAqQDA
-	ANgA8AEJASMBPQFYAXMBjwGrAckB5wIFAiUCRQJmAocCqgLNAvEDFgM8A2MDhwOrA9AD
-	9gQcBEQEawSTBLwE5gUQBToFZgWSBb4F7AYZBkgGdwanBtcHCAc6B2wHnwfTCAcIPAhy
-	CKgI3wkXCVAJiQnCCf0KOAp0CrAK7QsrC2oLqQv4DE8Mpw0ADVsNtg4TDnEO0A8wD5IP
-	9RBYEL0RJBGMEfUSYBLLEzgTphQWFIYU+BVsFeAWVhbNF0UXvhg4GMsZaBoHGqgbSxvw
-	HJgdQh3vHp0fTyAEILshdSIxIvEjsyR4JUAmCibXJ6YoeClNKiUrACvdLLotmi58L18w
-	RDErMhMy/TPpNNU1xDa0N6Y4mTmOOoU7fjx4PXc+ez+CQItBlkKkQ7RExkXbRvNIDkkr
-	SktLb0yVTb9O61AaUUxSgFO3VPBWJFdKWHFZm1rGW/RdJF5YX45gxWIAYz5kf2XCZwho
-	UmmcauxsPW2QbuZwPnGjcyR0pnYtd7h5R3rcfHV+En+3gWKDEYTHhoSIRooNi9qNq4+A
-	kYCTiJWXl6yZypvxniCgW6KhpPCnTam0rCSunrEfs922rLmKvHq/gMKhxeXJS8zX0IjU
-	W9ga28rfpeOs5+nsTvCv9LH38Ppu/En9tv7o//8AAAAHABYAKwBEAF8AfACZALcA1QD0
-	ARMBMgFRAXABkAGwAdEB8gITAjUCVwJ6Ap0CwQLmAwsDMANWA3oDngPCA+gEDgQ0BFwE
-	hAStBNcFAQUtBVoFhwW2BeYGFgZIBnsGrwblBxsHVAeNB8gIBAhCCIIIwwkGCUsJkQnZ
-	CiIKbQq6CwgLWAuqDAQMYgzBDSINhA3oDk0OtA8dD4gP9BBiENIRRBG3Ei0SpRMeE5kU
-	FhSVFRYVmRYdFqMXKxe1GD8Y1xl0GhIashtVG/kcoB1JHfUepB9VIAogwiF+Ijwi/yPF
-	JI4lXCYtJwEn2ii1KZ8qjit/LHItZi5dL1YwTzFLMkgzRzRINUo2TzdWOF45aDp1O4U8
-	lj2qPr8/10DwQgtDKERGRWdGikevSNhKA0syTGVNnE7WUBVRWFKeU+hVNVZ3V61Y51oj
-	W2NcpV3sXzZggmHSYyZkfGXUZy9ojWnra01ssG4Ub3pw4HI+c550/3Zkd815OHqofBt9
-	kX8KgIaCBoOHhQqGkIgXiaCLKoy1jkKP0ZGAkzGU45aYmE+aC5vKnYufUaEcou2kwaac
-	qHuqYqxOrj6wNbI2tEi2W7hxuoq8p77JwO3DGcVKx3/JvcwAzkzQntL21VXXnNnS3AXe
-	NuBk4o/kuebj6Q3rOe1p76Dx3PQh9m74xfsl/Y///wAAAAUAEQAkADsAVgB2AJgAvQDl
-	AQ8BOwFoAZgByQH8AjECZwKfAtkDFQNSA4YDuQPsBCEEVwSPBMcFAQU9BXoFuAX4BjkG
-	ewbABwUHTAeVB98IKgh3CMYJFglnCbsKDwplCr0LFgtwC88MQQy2DSwNpA4eDpoPGA+Y
-	EBoQnhEkEawSNhLCE1AT4BRyFQYVnRY0Fs4XahgIGK8ZXxoSGscbfxw4HPQdsx50Hzcf
-	/SDGIZEiXiMuJAAk1SWsJoUnYSg/KSYqISsfLB8tIi4oLzIwPjFOMmEzeDSSNbA20jf2
-	OR86Sjt5PKs99T9MQKdCBUNlRMhGLUeVSP9Ka0vbTUxOwFA3UbFTLVSsVi1XtVk+Wstc
-	Wl3tX4JhGWKzZFBl72eRaTVq3GyGbjJv4XGNcy100HZ1eB15x3t1fSN+1ICIgj+D94Wy
-	h2+JL4ryjLaOfZAzkcaTW5TxlomYIZm7m1ic856QoC6hzaNtpQ2msKhRqfarm61Bruiw
-	kLIls6S1IraguB25mLsTvIu+A794wO3CYcPTxUXGtsgoyZrLDMx+zfHPYdDV0knTv9U0
-	1qrYIdma2xXckd3V3wDgI+FG4mjji+Sr5cvm6OgC6RrqLes97EntTu5R703wRvE68inz
-	E/P59Nz1uvaV9234QPkS+d/6rPt0/Dz8//3C/oL/Qf//AABkZXNjAAAAAAAAAApDb2xv
-	ciBMQ0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAASAAAADG5s
-	TkwAAAAWAAAA6GRhREsAAAAcAAAA/nBsUEwAAAASAAABGmVuVVMAAAASAAABLG5iTk8A
-	AAASAAABPmZyRlIAAAAWAAABUHB0QlIAAAAYAAABZnB0UFQAAAAWAAABfnpoQ04AAAAM
-	AAABlGVzRVMAAAASAAABoGphSlAAAAAOAAABsnJ1UlUAAAAkAAABwHN2U0UAAAAQAAAB
-	5HpoVFcAAAAOAAAB9GRlREUAAAAQAAACAmZpRkkAAAAQAAACEml0SVQAAAAUAAACImtv
-	S1IAAAAMAAACNgBLAGwAZQB1AHIAZQBuAC0ATABDAEQATABDAEQALQBmAGEAcgB2AGUA
-	cwBrAOYAcgBtAEsAbwBsAG8AcgAgAEwAQwBEAEMAbwBsAG8AcgAgAEwAQwBEAEYAYQBy
-	AGcAZQAtAEwAQwBEAEwAQwBEACAAYwBvAHUAbABlAHUAcgBMAEMARAAgAEMAbwBsAG8A
-	cgBpAGQAbwBMAEMARAAgAGEAIABDAG8AcgBlAHNfaYJyACAATABDAEQATABDAEQAIABj
-	AG8AbABvAHIwqzDpMPwAIABMAEMARAQmBDIENQRCBD0EPgQ5ACAEFgQaAC0ENAQ4BEEE
-	PwQ7BDUEOQBGAOQAcgBnAC0ATABDAERfaYJybbJmdphveTpWaABGAGEAcgBiAC0ATABD
-	AEQAVgDkAHIAaQAtAEwAQwBEAEwAQwBEACAAYwBvAGwAbwByAGnO7LfsACAATABDAEQA
-	AG1tb2QAAAAAAAAGEAAAnKMAAAAAxXh9gAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENv
-	cHlyaWdodCBBcHBsZSwgSW5jLiwgMjAxMAA=
-	</data>
-	<key>ReadOnly</key>
-	<string>NO</string>
-	<key>RowAlign</key>
-	<integer>1</integer>
-	<key>RowSpacing</key>
-	<real>36</real>
-	<key>SheetTitle</key>
-	<string>Canvas 1</string>
-	<key>SmartAlignmentGuidesActive</key>
-	<string>YES</string>
-	<key>SmartDistanceGuidesActive</key>
-	<string>YES</string>
-	<key>UniqueID</key>
-	<integer>1</integer>
-	<key>UseEntirePage</key>
-	<false/>
-	<key>VPages</key>
-	<integer>1</integer>
-	<key>WindowInfo</key>
-	<dict>
-		<key>CurrentSheet</key>
-		<integer>0</integer>
-		<key>ExpandedCanvases</key>
-		<array>
-			<dict>
-				<key>name</key>
-				<string>Canvas 1</string>
-			</dict>
-		</array>
-		<key>Frame</key>
-		<string>{{1, 0}, {1022, 878}}</string>
-		<key>ListView</key>
-		<true/>
-		<key>OutlineWidth</key>
-		<integer>142</integer>
-		<key>RightSidebar</key>
-		<false/>
-		<key>ShowRuler</key>
-		<true/>
-		<key>Sidebar</key>
-		<false/>
-		<key>SidebarWidth</key>
-		<integer>120</integer>
-		<key>VisibleRegion</key>
-		<string>{{-25, -13}, {806.4, 579.2}}</string>
-		<key>Zoom</key>
-		<real>1.25</real>
-		<key>ZoomValues</key>
-		<array>
-			<array>
-				<string>Canvas 1</string>
-				<real>1.25</real>
-				<real>1</real>
-			</array>
-		</array>
-	</dict>
-	<key>saveQuickLookFiles</key>
-	<string>YES</string>
-</dict>
-</plist>

Modified: CalendarServer/trunk/test
===================================================================
--- CalendarServer/trunk/test	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/test	2010-07-20 01:28:10 UTC (rev 5920)
@@ -21,8 +21,13 @@
 
 wd="$(cd "$(dirname "$0")" && pwd -L)";
 
-. support/py.sh;
+DAVD=cal;
 
+. support/build.sh;
+
+do_setup="false";
+do_get="false";
+
 random="--random=$(date "+%s")";
 no_colour="";
 until_fail="";
@@ -62,14 +67,14 @@
 done;
 shift $((${OPTIND} - 1));
 
+export PYTHONPATH="${wd}";
+dependencies;
 if [ -d "${wd}/../Twisted" ]; then
   trial="${wd}/../Twisted/bin/trial";
 else
   trial="$(type -p trial)";
 fi;
 
-export PYTHONPATH="$("${wd}/run" -p)";
-
 if [ $# -gt 0 ]; then
     test_modules="$@";
 else

Modified: CalendarServer/trunk/twext/python/datetime.py
===================================================================
--- CalendarServer/trunk/twext/python/datetime.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twext/python/datetime.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -147,6 +147,14 @@
     def dateOrDatetime(self):
         return self._dateOrDatetime
 
+    def timetuple(self):
+        #
+        # This is required to make comparison with datetimes work. See:
+        # http://bugs.python.org/issue8005
+        # http://docs.python.org/release/2.6.5/library/datetime.html#datetime.date.day
+        #
+        return self._dateOrDatetime.timetuple()
+
     def iCalendarString(self):
         if self._isDatetime:
             return dateTimeToString(self._dateOrDatetime)

Modified: CalendarServer/trunk/twext/python/filepath.py
===================================================================
--- CalendarServer/trunk/twext/python/filepath.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twext/python/filepath.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -31,14 +31,14 @@
 from types import FunctionType, MethodType
 from errno import EINVAL
 
-from twisted.python.filepath import FilePath
+from twisted.python.filepath import FilePath as _FilePath
 
 from stat import S_ISDIR
 
-class CachingFilePath(FilePath, object):
+class CachingFilePath(_FilePath, object):
     """
-    A descendent of L{twisted.python.filepath.FilePath} which implements a more
-    aggressive caching policy.
+    A descendent of L{_FilePath} which implements a more aggressive caching
+    policy.
     """
 
     _listdir = _listdir         # integration points for tests
@@ -56,11 +56,11 @@
     @property
     def siblingExtensionSearch(self):
         """
-        Dynamically create a version of L{FilePath.siblingExtensionSearch} that
+        Dynamically create a version of L{_FilePath.siblingExtensionSearch} that
         uses a pluggable 'listdir' implementation.
         """
         return MethodType(FunctionType(
-                FilePath.siblingExtensionSearch.im_func.func_code,
+                _FilePath.siblingExtensionSearch.im_func.func_code,
                 {'listdir': self._retryListdir,
                  'basename': _basename,
                  'dirname': _dirname,
@@ -121,20 +121,19 @@
 
     def moveTo(self, destination, followLinks=True):
         """
-        Override L{FilePath.moveTo}, updating extended cache information if
+        Override L{_FilePath.moveTo}, updating extended cache information if
         necessary.
         """
-        try:
-            return super(CachingFilePath, self).moveTo(destination, followLinks)
-        except OSError:
-            raise
-        else:
-            self.changed()
+        result = super(CachingFilePath, self).moveTo(destination, followLinks)
+        self.changed()
+        # Work with vanilla FilePath destinations to pacify the tests. 
+        if hasattr(destination, "changed"):
+            destination.changed()
 
 
     def remove(self):
         """
-        Override L{FilePath.remove}, updating extended cache information if
+        Override L{_FilePath.remove}, updating extended cache information if
         necessary.
         """
         try:

Modified: CalendarServer/trunk/twext/python/test/test_datetime.py
===================================================================
--- CalendarServer/trunk/twext/python/test/test_datetime.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twext/python/test/test_datetime.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -46,6 +46,10 @@
 
 
 class DatetimeTests(TestCase):
+    @testUnimplemented
+    def test_timetuple(self):
+        raise NotImplementedError()
+
     @timezones
     def test_date_date(self, tz):
         d = date.today()
@@ -231,7 +235,7 @@
 
     @testUnimplemented
     def test_compare(self):
-        raise NotImplemented
+        raise NotImplementedError()
 
     @featureUnimplemented
     def test_overlapsWith(self):

Modified: CalendarServer/trunk/twext/web2/dav/element/base.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/element/base.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twext/web2/dav/element/base.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -75,11 +75,11 @@
     protected          = False         # See RFC 3253 section 1.4.1
     unregistered       = False         # Subclass of factory; doesn't register
 
-    def qname(self):
-        return (self.namespace, self.name)
+    def qname(cls):
+        return (cls.namespace, cls.name)
 
-    def sname(self):
-        return "{%s}%s" % (self.namespace, self.name)
+    def sname(cls):
+        return "{%s}%s" % (cls.namespace, cls.name)
 
     qname = classmethod(qname)
     sname = classmethod(sname)

Modified: CalendarServer/trunk/twext/web2/dav/method/proppatch.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/method/proppatch.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twext/web2/dav/method/proppatch.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -97,7 +97,7 @@
 
             properties = container.children
 
-            def do(action, property):
+            def do(action, property, removing=False):
                 """
                 Perform action(property, request) while maintaining an
                 undo queue.
@@ -122,13 +122,19 @@
                     yield x
                     x.getResult()
                 except KeyError, e:
-                    # Convert KeyError exception into HTTPError
-                    responses.add(
-                        Failure(exc_value=HTTPError(StatusResponse(responsecode.FORBIDDEN, str(e)))),
-                        property
-                    )
-                    yield False
-                    return
+                    # Removing a non-existent property is OK according to WebDAV
+                    if removing:
+                        responses.add(responsecode.OK, property)
+                        yield True
+                        return
+                    else:
+                        # Convert KeyError exception into HTTPError
+                        responses.add(
+                            Failure(exc_value=HTTPError(StatusResponse(responsecode.FORBIDDEN, str(e)))),
+                            property
+                        )
+                        yield False
+                        return
                 except:
                     responses.add(Failure(), property)
                     yield False
@@ -153,7 +159,7 @@
                         gotError = True
             elif isinstance(setOrRemove, davxml.Remove):
                 for property in properties:
-                    ok = waitForDeferred(do(self.removeProperty, property))
+                    ok = waitForDeferred(do(self.removeProperty, property, True))
                     yield ok
                     ok = ok.getResult()
                     if not ok:

Modified: CalendarServer/trunk/twext/web2/dav/method/put.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/method/put.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twext/web2/dav/method/put.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -54,24 +54,15 @@
         yield parent
         parent = parent.getResult()
 
+        if not parent.exists():
+            raise HTTPError(
+                StatusResponse(
+                    responsecode.CONFLICT,
+                    "cannot PUT to non-existent parent"))
         x = waitForDeferred(parent.authorize(request, (davxml.Bind(),)))
         yield x
         x.getResult()
 
-    if self.fp.exists():
-        if not self.fp.isfile():
-            log.err("Unable to PUT to non-file: %s" % (self.fp.path,))
-            raise HTTPError(StatusResponse(
-                responsecode.FORBIDDEN,
-                "The requested resource exists but is not backed by a regular file."
-            ))
-    else:
-        if not self.fp.parent().isdir():
-            log.err("No such directory: %s" % (self.fp.path,))
-            raise HTTPError(StatusResponse(
-                responsecode.CONFLICT,
-                "Parent collection resource does not exist."
-            ))
 
     #
     # HTTP/1.1 (RFC 2068, section 9.6) requires that we respond with a Not

Modified: CalendarServer/trunk/twext/web2/dav/test/util.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/test/util.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twext/web2/dav/test/util.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -35,7 +35,7 @@
 from twext.web2.http import HTTPError, StatusResponse
 from twext.web2 import responsecode
 from twext.web2.dav import davxml
-from twext.web2.dav.fileop import rmdir
+
 from twext.web2.dav.resource import TwistedACLInheritable
 from twext.web2.dav.static import DAVFile
 from twext.web2.dav.util import joinURL
@@ -185,9 +185,8 @@
 
     def tearDown(self):
         unittest.TestCase.tearDown(self)
-        if hasattr(self, "_docroot"):
-            rmdir(self._docroot)
 
+
     def mkdtemp(self, prefix):
         """
         Creates a new directory in the document root and returns its path and

Modified: CalendarServer/trunk/twistedcaldav/__init__.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/__init__.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/__init__.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,3 +1,4 @@
+# -*- test-case-name: twistedcaldav -*-
 ##
 # Copyright (c) 2005-2010 Apple Inc. All rights reserved.
 #

Modified: CalendarServer/trunk/twistedcaldav/directory/addressbook.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/addressbook.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/directory/addressbook.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -113,12 +113,12 @@
         # See DirectoryPrincipalProvisioningResource.__init__()
         return self.directory.principalCollection.principalForRecord(record)
 
-    def homeForDirectoryRecord(self, record):
+    def homeForDirectoryRecord(self, record, request):
         uidResource = self.getChild(uidsResourceName)
         if uidResource is None:
             return None
         else:
-            return uidResource.getChild(record.guid)
+            return uidResource.homeResourceForRecord(record, request)
 
     ##
     # DAV
@@ -150,17 +150,18 @@
     def url(self):
         return joinURL(self._parent.url(), self.recordType)
 
-    def getChild(self, name, record=None):
+    def locateChild(self, request, segments):
         self.provision()
+        name = segments[0]
         if name == "":
-            return self
+            return (self, segments[1:])
 
+        record = self.directory.recordWithShortName(self.recordType, name)
         if record is None:
-            record = self.directory.recordWithShortName(self.recordType, name)
-            if record is None:
-                return None
+            return None, []
 
-        return self._parent.homeForDirectoryRecord(record)
+        return (self._parent.homeForDirectoryRecord(record, request),
+                segments[1:])
 
     def listChildren(self):
         if config.EnablePrincipalListings:
@@ -213,17 +214,8 @@
         return joinURL(self.parent.url(), uidsResourceName)
 
     def getChild(self, name, record=None):
-        self.provision()
-        if name == "":
-            return self
+        raise NotImplementedError("DirectoryAddressBookHomeUIDProvisioningResource.getChild no longer exists.")
 
-        if record is None:
-            record = self.directory.recordWithUID(name)
-            if record is None:
-                return None
-
-        return self.provisionChild(name)
-
     def listChildren(self):
         # Not a listable collection
         raise HTTPError(responsecode.FORBIDDEN)
@@ -387,12 +379,6 @@
     def resourceType(self, request):
         return succeed(davxml.ResourceType.sharedaddressbook)
 
-    def url(self):
-        return joinURL("/", config.GlobalAddressBook.Name, "/")
-
-    def canonicalURL(self, request):
-        return succeed(self.url())
-
     def defaultAccessControlList(self):
 
         aces = (

Modified: CalendarServer/trunk/twistedcaldav/directory/calendar.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/calendar.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/directory/calendar.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,3 +1,4 @@
+# -*- test-case-name: twistedcaldav.directory.test.test_calendar -*-
 ##
 # Copyright (c) 2006-2009 Apple Inc. All rights reserved.
 #
@@ -117,12 +118,12 @@
         # See DirectoryPrincipalProvisioningResource.__init__()
         return self.directory.principalCollection.principalForRecord(record)
 
-    def homeForDirectoryRecord(self, record):
+    def homeForDirectoryRecord(self, record, request):
         uidResource = self.getChild(uidsResourceName)
         if uidResource is None:
             return None
         else:
-            return uidResource.getChild(record.uid)
+            return uidResource.homeResourceForRecord(record, request)
 
     ##
     # DAV
@@ -154,17 +155,18 @@
     def url(self):
         return joinURL(self._parent.url(), self.recordType)
 
-    def getChild(self, name, record=None):
+    def locateChild(self, request, segments):
         self.provision()
+        name = segments[0]
         if name == "":
-            return self
+            return (self, segments[1:])
 
+        record = self.directory.recordWithShortName(self.recordType, name)
         if record is None:
-            record = self.directory.recordWithShortName(self.recordType, name)
-            if record is None:
-                return None
+            return None, []
 
-        return self._parent.homeForDirectoryRecord(record)
+        return (self._parent.homeForDirectoryRecord(record, request),
+                segments[1:])
 
     def listChildren(self):
         if config.EnablePrincipalListings:
@@ -217,17 +219,8 @@
         return joinURL(self.parent.url(), uidsResourceName)
 
     def getChild(self, name, record=None):
-        self.provision()
-        if name == "":
-            return self
+        raise NotImplementedError("DirectoryCalendarProvisioningResource.getChild no longer exists.")
 
-        if record is None:
-            record = self.directory.recordWithUID(name)
-            if record is None:
-                return None
-
-        return self.provisionChild(name)
-
     def listChildren(self):
         # Not a listable collection
         raise HTTPError(responsecode.FORBIDDEN)
@@ -285,58 +278,10 @@
             )
         for name, cls in childlist:
             child = self.provisionChild(name)
-            assert isinstance(child, cls), "Child %r is not a %s: %r" % (name, cls.__name__, child)
+            # assert isinstance(child, cls), "Child %r is not a %s: %r" % (name, cls.__name__, child)
             self.putChild(name, child)
 
-    def provisionDefaultCalendars(self):
 
-        # Disable notifications during provisioning
-        if hasattr(self, "clientNotifier"):
-            self.clientNotifier.disableNotify()
-
-        def setupFreeBusy(_):
-            # Default calendar is initially opaque to freebusy
-            child.writeDeadProperty(caldavxml.ScheduleCalendarTransp(caldavxml.Opaque()))
-
-            # FIXME: Shouldn't have to call provision() on another resource
-            # We cheat here because while inbox will auto-provision itself when located,
-            # we need to write a dead property to it pre-emptively.
-            # This will go away once we remove the free-busy-set property on inbox.
-
-            # Set calendar-free-busy-set on inbox
-            inbox = self.getChild("inbox")
-            inbox.provision()
-            inbox.processFreeBusyCalendar(childURL, True)
-
-            # Default calendar is marked as the default for scheduling
-            inbox.writeDeadProperty(caldavxml.ScheduleDefaultCalendarURL(davxml.HRef(childURL)))
-
-            return self
-
-        try:
-            self.provision()
-
-            childName = "calendar"
-            childURL = joinURL(self.url(), childName)
-            child = self.provisionChild(childName)
-            assert isinstance(child, CalDAVResource), "Child %r is not a %s: %r" % (childName, CalDAVResource.__name__, child)
-
-            d = child.createCalendarCollection()
-            d.addCallback(setupFreeBusy)
-        except:
-            # We want to make sure to re-enable notifications, so do so
-            # if there is an immediate exception above, or via errback, below
-            if hasattr(self, "clientNotifier"):
-                self.clientNotifier.enableNotify(None)
-            raise
-
-        # Re-enable notifications
-        if hasattr(self, "clientNotifier"):
-            d.addCallback(self.clientNotifier.enableNotify)
-            d.addErrback(self.clientNotifier.enableNotify)
-
-        return d
-
     def provisionChild(self, name):
         raise NotImplementedError("Subclass must implement provisionChild()")
 

Copied: CalendarServer/trunk/twistedcaldav/directory/internal.py (from rev 5919, CalendarServer/branches/new-store/twistedcaldav/directory/internal.py)
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/internal.py	                        (rev 0)
+++ CalendarServer/trunk/twistedcaldav/directory/internal.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,125 @@
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+Directory service implementation for internal purposes - e.g. public
+calendars, addressbooks, directory gateway, global address book.
+"""
+
+__all__ = [
+    "InternalDirectoryService",
+]
+
+from twext.web2.dav.auth import IPrincipalCredentials
+
+from twisted.cred.error import UnauthorizedLogin
+
+from twistedcaldav.directory.directory import DirectoryService, DirectoryRecord
+from twistedcaldav.directory.directory import UnknownRecordTypeError
+
+class InternalDirectoryService(DirectoryService):
+    """
+    L{IDirectoryService} implementation for internal record types.
+    """
+    baseGUID = "80DED344-B79F-46AF-B05B-E35D737BC19A"
+
+    realmName = None
+
+    plistFile = None
+
+    supportedRecordTypes = ("public",)
+
+    def __repr__(self):
+        return "<%s %r>" % (self.__class__.__name__, self.realmName)
+
+    def __init__(self, realm):
+        super(InternalDirectoryService, self).__init__()
+
+        self.realmName = realm
+        self._records()
+
+    def _records(self):
+        """
+        Build the list of records.
+        
+        Right now we want public/global and public/directory for
+        global and directory address books.
+        """
+        
+        if not hasattr(self, "_cachedRecords"):
+            self._cachedRecords = (
+                InternalDirectoryRecord(
+                    self,
+                    "public",
+                    "4F00E8BA-7B45-42E9-B9D1-F499B6A2E887",
+                    "global",
+                    False,
+                    True
+                ),
+                InternalDirectoryRecord(
+                    self,
+                    "public",
+                    "1BC554CC-DBD6-4454-8423-2637A9B681DC",
+                    "directory",
+                    False,
+                    True
+                ),
+            )
+        return self._cachedRecords
+
+    def recordTypes(self):
+        return InternalDirectoryService.supportedRecordTypes
+
+    def listRecords(self, recordType):
+        if recordType not in InternalDirectoryService.supportedRecordTypes:
+            raise UnknownRecordTypeError(recordType)
+
+        return self._records()
+
+    def recordWithShortName(self, recordType, shortName):
+        if recordType not in InternalDirectoryService.supportedRecordTypes:
+            raise UnknownRecordTypeError(recordType)
+
+        for record in self._records():
+            if shortName in record.shortNames:
+                return record
+
+    def requestAvatarId(self, credentials):
+        credentials = IPrincipalCredentials(credentials)
+        raise UnauthorizedLogin("No such user: %s" % (credentials.credentials.username,))
+
+
+class InternalDirectoryRecord(DirectoryRecord):
+    """
+    L{DirectoryRecord} implementation for internal records.
+    """
+
+    def __init__(self, service, recordType, guid, shortName,
+                enabledForCalendaring=None, enabledForAddressBooks=None,):
+        super(InternalDirectoryRecord, self).__init__(
+            service=service,
+            recordType=recordType,
+            guid=guid,
+            shortNames=(shortName,),
+            fullName=shortName,
+            enabledForCalendaring=enabledForCalendaring,
+            enabledForAddressBooks=enabledForAddressBooks,
+        )
+
+        self.enabled = True     # Explicitly enabled
+
+    def verifyCredentials(self, credentials):
+        return False

Modified: CalendarServer/trunk/twistedcaldav/directory/principal.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/principal.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/directory/principal.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -873,7 +873,7 @@
             return False
 
     def scheduleInbox(self, request):
-        home = self.calendarHome()
+        home = self.calendarHome(request)
         if home is None:
             return succeed(None)
 
@@ -887,7 +887,7 @@
         
         notification = None
         if config.Sharing.Enabled:
-            home = self.calendarHome()
+            home = self.calendarHome(request)
             if home is not None:    
                 notification = home.getChild("notification")
     
@@ -916,42 +916,54 @@
             return None
 
     def addressBookHomeURLs(self):
-        home = self.addressBookHome()
-        if home is None:
-            return ()
-        else:
-            return (home.url(),)
+        homeURL = self._addressBookHomeChildURL(None)
+        return (homeURL,) if homeURL else ()
 
     def _homeChildURL(self, name):
         if not hasattr(self, "calendarHomeURL"):
-            home = self.calendarHome()
-            if home is None:
-                self.calendarHomeURL = None
+            if not hasattr(self.record.service, "calendarHomesCollection"):
                 return None
-            else:
-                self.calendarHomeURL = home.url()
-            
+            self.calendarHomeURL = joinURL(
+                self.record.service.calendarHomesCollection.url(),
+                uidsResourceName,
+                self.record.uid
+            )
         url = self.calendarHomeURL
         if url is None:
             return None
         else:
             return joinURL(url, name) if name else url
 
-    def calendarHome(self):
+    def calendarHome(self, request):
         # FIXME: self.record.service.calendarHomesCollection smells like a hack
         # See CalendarHomeProvisioningFile.__init__()
         service = self.record.service
         if hasattr(service, "calendarHomesCollection"):
-            return service.calendarHomesCollection.homeForDirectoryRecord(self.record)
+            return service.calendarHomesCollection.homeForDirectoryRecord(self.record, request)
         else:
             return None
 
-    def addressBookHome(self):
+    def _addressBookHomeChildURL(self, name):
+        if not hasattr(self, "addressBookHomeURL"):
+            if not hasattr(self.record.service, "addressBookHomesCollection"):
+                return None
+            self.addressBookHomeURL = joinURL(
+                self.record.service.addressBookHomesCollection.url(),
+                uidsResourceName,
+                self.record.uid
+            )
+        url = self.addressBookHomeURL
+        if url is None:
+            return None
+        else:
+            return joinURL(url, name) if name else url
+
+    def addressBookHome(self, request):
         # FIXME: self.record.service.addressBookHomesCollection smells like a hack
         # See AddressBookHomeProvisioningFile.__init__()
         service = self.record.service
         if hasattr(service, "addressBookHomesCollection"):
-            return service.addressBookHomesCollection.homeForDirectoryRecord(self.record)
+            return service.addressBookHomesCollection.homeForDirectoryRecord(self.record, request)
         else:
             return None
 

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_calendar.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_calendar.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_calendar.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -14,57 +14,25 @@
 # limitations under the License.
 ##
 
-import os
-
 from twisted.internet.defer import inlineCallbacks
 from twext.web2.dav import davxml
 from twext.web2.test.test_server import SimpleRequest
 
 from twistedcaldav import caldavxml
-from twistedcaldav.directory import augment
-from twistedcaldav.directory.principal import DirectoryPrincipalProvisioningResource
-from twistedcaldav.directory.test.test_xmlfile import xmlFile, augmentsFile
-from twistedcaldav.directory.xmlfile import XMLDirectoryService
-from twistedcaldav.static import CalendarHomeProvisioningFile
 
-import twistedcaldav.test.util
-from twistedcaldav.config import config
+from twistedcaldav.test.util import TestCase
 
-class ProvisionedCalendars (twistedcaldav.test.util.TestCase):
+class ProvisionedCalendars (TestCase):
     """
     Directory service provisioned principals.
     """
     def setUp(self):
         super(ProvisionedCalendars, self).setUp()
-        
-        # Setup the initial directory
-        self.xmlFile = os.path.join(config.DataRoot, "accounts.xml")
-        fd = open(self.xmlFile, "w")
-        fd.write(open(xmlFile.path, "r").read())
-        fd.close()
-        self.directoryService = XMLDirectoryService({'xmlFile' : "accounts.xml"})
-        augment.AugmentService = augment.AugmentXMLDB(xmlFiles=(augmentsFile.path,))
-        
-        # Set up a principals hierarchy for each service we're testing with
-        name = "principals"
-        url = "/" + name + "/"
 
-        provisioningResource = DirectoryPrincipalProvisioningResource(url, self.directoryService)
-
-        self.site.resource.putChild("principals", provisioningResource)
-
+        self.createStockDirectoryService()
         self.setupCalendars()
 
-        self.site.resource.setAccessControlList(davxml.ACL())
 
-    def setupCalendars(self):
-        calendarCollection = CalendarHomeProvisioningFile(
-            os.path.join(self.docroot, "calendars"),
-            self.directoryService,
-            "/calendars/"
-        )
-        self.site.resource.putChild("calendars", calendarCollection)
-
     def test_NonExistentCalendarHome(self):
 
         def _response(resource):

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_guidchange.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_guidchange.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_guidchange.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -13,62 +13,34 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
-from twistedcaldav.directory.principal import DirectoryPrincipalProvisioningResource
-from twistedcaldav.static import CalendarHomeProvisioningFile
 from twistedcaldav.directory.directory import DirectoryService
 
-import os
-
 from twext.web2.dav import davxml
 from twext.web2.dav.resource import AccessDeniedError
 from twext.web2.test.test_server import SimpleRequest
 
-from twistedcaldav.directory.xmlfile import XMLDirectoryService
-from twistedcaldav.directory.test.test_xmlfile import xmlFile, augmentsFile
+from twistedcaldav.test.util import TestCase, xmlFile
 
-import twistedcaldav.test.util
-from twistedcaldav.directory import augment
 
-
-class ProvisionedPrincipals (twistedcaldav.test.util.TestCase):
+class ProvisionedPrincipals(TestCase):
     """
     Directory service provisioned principals.
     """
     def setUp(self):
         super(ProvisionedPrincipals, self).setUp()
-        
-        # Setup the initial directory
-        self.xmlFile = os.path.abspath(self.mktemp())
-        fd = open(self.xmlFile, "w")
-        fd.write(open(xmlFile.path, "r").read())
-        fd.close()
-        self.directoryService = XMLDirectoryService({'xmlFile' : self.xmlFile})
-        augment.AugmentService = augment.AugmentXMLDB(xmlFiles=(augmentsFile.path,))
-        
-        # Set up a principals hierarchy for each service we're testing with
-        name = "principals"
-        url = "/" + name + "/"
 
-        provisioningResource = DirectoryPrincipalProvisioningResource(url, self.directoryService)
-
-        self.site.resource.putChild("principals", provisioningResource)
-
+        # Setup the initial directory
+        self.createStockDirectoryService()
         self.setupCalendars()
 
         self.site.resource.setAccessControlList(davxml.ACL())
 
-    def setupCalendars(self):
-        calendarCollection = CalendarHomeProvisioningFile(
-            os.path.join(self.docroot, "calendars"),
-            self.directoryService,
-            "/calendars/"
-        )
-        self.site.resource.putChild("calendars", calendarCollection)
 
     def resetCalendars(self):
         del self.site.resource.putChildren["calendars"]
         self.setupCalendars()
 
+
     def test_guidchange(self):
         """
         DirectoryPrincipalResource.proxies()
@@ -80,10 +52,9 @@
         
         def privs1(result):
             # Change GUID in record
-            fd = open(self.xmlFile, "w")
-            fd.write(open(xmlFile.path, "r").read().replace(oldUID, newUID))
-            fd.close()
-            fd = None
+            self.xmlFile.setContent(
+                xmlFile.getContent().replace(oldUID, newUID)
+            )
 
             # Force re-read of records (not sure why _fileInfo has to be wiped here...)
             self.directoryService._fileInfo = (0, 0)

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -35,6 +35,8 @@
 from twistedcaldav.directory.principal import DirectoryCalendarPrincipalResource
 
 import twistedcaldav.test.util
+from txdav.common.datastore.file import CommonDataStore
+from twisted.python.filepath import FilePath
 
 
 class ProvisionedPrincipals (twistedcaldav.test.util.TestCase):
@@ -356,6 +358,9 @@
         # Need to create a calendar home provisioner for each service.
         calendarRootResources = {}
 
+        # Need a data store
+        _newStore = CommonDataStore(FilePath(self.docroot), True, False)
+
         for directory in self.directoryServices:
             url = "/homes_" + directory.__class__.__name__ + "/"
             path = os.path.join(self.docroot, url[1:])
@@ -364,7 +369,12 @@
                 rmdir(path)
             os.mkdir(path)
 
-            provisioningResource = CalendarHomeProvisioningFile(path, directory, url)
+            provisioningResource = CalendarHomeProvisioningFile(
+                path,
+                directory,
+                url,
+                _newStore
+            )
 
             calendarRootResources[directory.__class__.__name__] = provisioningResource
 

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_proxyprincipalmembers.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_proxyprincipalmembers.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_proxyprincipalmembers.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -19,8 +19,7 @@
 from twext.web2.dav import davxml
 
 from twistedcaldav.directory.directory import DirectoryService
-from twistedcaldav.directory.test.test_xmlfile import xmlFile, augmentsFile,\
-    proxiesFile
+from twistedcaldav.test.util import xmlFile, augmentsFile, proxiesFile
 from twistedcaldav.directory.principal import DirectoryPrincipalProvisioningResource
 from twistedcaldav.directory.xmlaccountsparser import XMLAccountsParser
 from twistedcaldav.directory.xmlfile import XMLDirectoryService
@@ -34,7 +33,7 @@
     """
     Directory service provisioned principals.
     """
-    
+
     @inlineCallbacks
     def setUp(self):
         super(ProxyPrincipals, self).setUp()

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_xmlfile.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_xmlfile.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_xmlfile.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -14,20 +14,14 @@
 # limitations under the License.
 ##
 
-import os
-
 from twext.python.filepath import CachingFilePath as FilePath
 
-from twistedcaldav.test.util import TestCase
 from twistedcaldav.directory import augment
 from twistedcaldav.directory.directory import DirectoryService
 import twistedcaldav.directory.test.util
 from twistedcaldav.directory.xmlfile import XMLDirectoryService
+from twistedcaldav.test.util import TestCase, xmlFile, augmentsFile
 
-xmlFile = FilePath(os.path.join(os.path.dirname(__file__), "accounts.xml"))
-augmentsFile = FilePath(os.path.join(os.path.dirname(__file__), "augments.xml"))
-proxiesFile = FilePath(os.path.join(os.path.dirname(__file__), "proxies.xml"))
-
 # FIXME: Add tests for GUID hooey, once we figure out what that means here
 
 class XMLFileBase(object):
@@ -104,7 +98,8 @@
     """
     def service(self):
         directory = XMLDirectoryService({'xmlFile' : self.xmlFile()}, alwaysStat=True)
-        augment.AugmentService = augment.AugmentXMLDB(xmlFiles=(self.augmentsFile().path,))
+        self.patch(augment, "AugmentService",
+                   augment.AugmentXMLDB(xmlFiles=(self.augmentsFile().path,)))
         return directory
 
     def test_changedXML(self):
@@ -304,5 +299,10 @@
     ))
 
     def test_recordTypesSubset(self):
-        directory = XMLDirectoryService({'xmlFile' : self.xmlFile(), 'recordTypes' : (DirectoryService.recordType_users, DirectoryService.recordType_groups)}, alwaysStat=True)
+        directory = XMLDirectoryService(
+            {'xmlFile' : self.xmlFile(), 
+             'recordTypes' : (DirectoryService.recordType_users, 
+                              DirectoryService.recordType_groups)}, 
+            alwaysStat=True
+        )
         self.assertEquals(set(("users", "groups")), set(directory.recordTypes()))

Modified: CalendarServer/trunk/twistedcaldav/extensions.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/extensions.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/extensions.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -443,152 +443,8 @@
         returnValue(MultiStatusResponse(responses))
 
 
-class DAVResource (DirectoryPrincipalPropertySearchMixIn, SudoersMixin, SuperDAVResource, LoggingMixIn):
-    """
-    Extended L{twext.web2.dav.resource.DAVResource} implementation.
-    """
-    http_REPORT = http_REPORT
+class DirectoryRenderingMixIn(object):
 
-
-class DAVPrincipalResource (DirectoryPrincipalPropertySearchMixIn, SuperDAVPrincipalResource, LoggingMixIn):
-    """
-    Extended L{twext.web2.dav.static.DAVFile} implementation.
-    """
-
-    def liveProperties(self):
-        return super(DAVPrincipalResource, self).liveProperties() + (
-            (calendarserver_namespace, "expanded-group-member-set"),
-            (calendarserver_namespace, "expanded-group-membership"),
-            (calendarserver_namespace, "record-type"),
-        )
-
-    http_REPORT = http_REPORT
-
-    @inlineCallbacks
-    def readProperty(self, property, request):
-        if type(property) is tuple:
-            qname = property
-        else:
-            qname = property.qname()
-
-        namespace, name = qname
-
-        if namespace == dav_namespace:
-            if name == "resourcetype":
-                rtype = (yield self.resourceType(request))
-                returnValue(rtype)
-
-        elif namespace == calendarserver_namespace:
-            if name == "expanded-group-member-set":
-                principals = (yield self.expandedGroupMembers())
-                returnValue(customxml.ExpandedGroupMemberSet(
-                    *[davxml.HRef(p.principalURL()) for p in principals]
-                ))
-
-            elif name == "expanded-group-membership":
-                principals = (yield self.expandedGroupMemberships())
-                returnValue(customxml.ExpandedGroupMembership(
-                    *[davxml.HRef(p.principalURL()) for p in principals]
-                ))
-
-            elif name == "record-type":
-                if hasattr(self, "record"):
-                    returnValue(customxml.RecordType(self.record.recordType))
-                else:
-                    raise HTTPError(StatusResponse(
-                        responsecode.NOT_FOUND,
-                        "Property %s does not exist." % (qname,)
-                    ))
-
-
-
-        result = (yield super(DAVPrincipalResource, self).readProperty(property, request))
-        returnValue(result)
-
-    def groupMembers(self):
-        return succeed(())
-
-    def expandedGroupMembers(self):
-        return succeed(())
-
-    def groupMemberships(self):
-        return succeed(())
-
-    def expandedGroupMemberships(self):
-        return succeed(())
-
-    def resourceType(self, request):
-        # Allow live property to be overridden by dead property
-        if self.deadProperties().contains((dav_namespace, "resourcetype")):
-            return succeed(self.deadProperties().get((dav_namespace, "resourcetype")))
-        if self.isCollection():
-            return succeed(davxml.ResourceType(davxml.Principal(), davxml.Collection()))
-        else:
-            return succeed(davxml.ResourceType(davxml.Principal()))
-
-
-class DAVFile (SudoersMixin, SuperDAVFile, LoggingMixIn):
-    """
-    Extended L{twext.web2.dav.static.DAVFile} implementation.
-    """
-    def readProperty(self, property, request):
-        if type(property) is tuple:
-            qname = property
-        else:
-            qname = property.qname()
-
-        if qname == (dav_namespace, "resourcetype"):
-            return self.resourceType(request)
-
-        return super(DAVFile, self).readProperty(property, request)
-
-    def resourceType(self, request):
-        # Allow live property to be overridden by dead property
-        if self.deadProperties().contains((dav_namespace, "resourcetype")):
-            return succeed(self.deadProperties().get((dav_namespace, "resourcetype")))
-        if self.isCollection():
-            return succeed(davxml.ResourceType.collection)
-        return succeed(davxml.ResourceType.empty)
-
-    def render(self, request):
-        if not self.fp.exists():
-            return responsecode.NOT_FOUND
-
-        if self.fp.isdir():
-            if request.path[-1] != "/":
-                # Redirect to include trailing '/' in URI
-                return RedirectResponse(request.unparseURL(path=urllib.quote(urllib.unquote(request.path), safe=':/')+'/'))
-            else:
-                ifp = self.fp.childSearchPreauth(*self.indexNames)
-                if ifp:
-                    # Render from the index file
-                    return self.createSimilarFile(ifp.path).render(request)
-
-                return self.renderDirectory(request)
-
-        try:
-            f = self.fp.open()
-        except IOError, e:
-            import errno
-            if e[0] == errno.EACCES:
-                return responsecode.FORBIDDEN
-            elif e[0] == errno.ENOENT:
-                return responsecode.NOT_FOUND
-            else:
-                raise
-
-        response = Response()
-        response.stream = FileStream(f, 0, self.fp.getsize())
-
-        for (header, value) in (
-            ("content-type", self.contentType()),
-            ("content-encoding", self.contentEncoding()),
-        ):
-            if value is not None:
-                response.headers.setHeader(header, value)
-
-        return response
-
     def directoryStyleSheet(self):
         return (
             "th, .even td, .odd td { padding-right: 0.5em; font-family: monospace}"
@@ -796,7 +652,11 @@
                 contentType = rtypes
             else:
                 mimeType = child.contentType()
-                contentType = "%s/%s" % (mimeType.mediaType, mimeType.mediaSubtype)
+                if mimeType is None:
+                    print 'BAD contentType() IMPLEMENTATION', child
+                    contentType = 'application/octet-stream'
+                else:
+                    contentType = "%s/%s" % (mimeType.mediaType, mimeType.mediaSubtype)
                 if rtypes:
                     contentType += " %s" % (rtypes,)
         else:
@@ -818,7 +678,176 @@
 
 
 
+class DAVResource (DirectoryPrincipalPropertySearchMixIn,
+                   SudoersMixin, SuperDAVResource, LoggingMixIn,
+                   DirectoryRenderingMixIn):
+    """
+    Extended L{twext.web2.dav.resource.DAVResource} implementation.
+    """
+    http_REPORT = http_REPORT
 
+    def render(self, request):
+        if not self.exists():
+            return responsecode.NOT_FOUND
+
+        if self.isCollection():
+            return self.renderDirectory(request)
+        return super(DAVResource, self).render(request)
+
+
+    def resourceType(self, request):
+        # Allow live property to be overridden by dead property
+        if self.deadProperties().contains((dav_namespace, "resourcetype")):
+            return succeed(self.deadProperties().get((dav_namespace, "resourcetype")))
+        return succeed(davxml.ResourceType())
+
+
+
+class DAVPrincipalResource (DirectoryPrincipalPropertySearchMixIn,
+                            SuperDAVPrincipalResource, LoggingMixIn,
+                            DirectoryRenderingMixIn):
+    """
+    Extended L{twext.web2.dav.static.DAVFile} implementation.
+    """
+
+    def liveProperties(self):
+        return super(DAVPrincipalResource, self).liveProperties() + (
+            (calendarserver_namespace, "expanded-group-member-set"),
+            (calendarserver_namespace, "expanded-group-membership"),
+            (calendarserver_namespace, "record-type"),
+        )
+
+    http_REPORT = http_REPORT
+
+    @inlineCallbacks
+    def readProperty(self, property, request):
+        if type(property) is tuple:
+            qname = property
+        else:
+            qname = property.qname()
+
+        namespace, name = qname
+
+        if namespace == dav_namespace:
+            if name == "resourcetype":
+                rtype = (yield self.resourceType(request))
+                returnValue(rtype)
+
+        elif namespace == calendarserver_namespace:
+            if name == "expanded-group-member-set":
+                principals = (yield self.expandedGroupMembers())
+                returnValue(customxml.ExpandedGroupMemberSet(
+                    *[davxml.HRef(p.principalURL()) for p in principals]
+                ))
+
+            elif name == "expanded-group-membership":
+                principals = (yield self.expandedGroupMemberships())
+                returnValue(customxml.ExpandedGroupMembership(
+                    *[davxml.HRef(p.principalURL()) for p in principals]
+                ))
+
+            elif name == "record-type":
+                if hasattr(self, "record"):
+                    returnValue(customxml.RecordType(self.record.recordType))
+                else:
+                    raise HTTPError(StatusResponse(
+                        responsecode.NOT_FOUND,
+                        "Property %s does not exist." % (qname,)
+                    ))
+
+
+
+        result = (yield super(DAVPrincipalResource, self).readProperty(property, request))
+        returnValue(result)
+
+    def groupMembers(self):
+        return succeed(())
+
+    def expandedGroupMembers(self):
+        return succeed(())
+
+    def groupMemberships(self):
+        return succeed(())
+
+    def expandedGroupMemberships(self):
+        return succeed(())
+
+    def resourceType(self, request):
+        # Allow live property to be overridden by dead property
+        if self.deadProperties().contains((dav_namespace, "resourcetype")):
+            return succeed(self.deadProperties().get((dav_namespace, "resourcetype")))
+        if self.isCollection():
+            return succeed(davxml.ResourceType(davxml.Principal(), davxml.Collection()))
+        else:
+            return succeed(davxml.ResourceType(davxml.Principal()))
+
+
+
+class DAVFile (SudoersMixin, SuperDAVFile, LoggingMixIn,
+               DirectoryRenderingMixIn):
+    """
+    Extended L{twext.web2.dav.static.DAVFile} implementation.
+    """
+    def readProperty(self, property, request):
+        if type(property) is tuple:
+            qname = property
+        else:
+            qname = property.qname()
+
+        if qname == (dav_namespace, "resourcetype"):
+            return self.resourceType(request)
+
+        return super(DAVFile, self).readProperty(property, request)
+
+    def resourceType(self, request):
+        # Allow live property to be overridden by dead property
+        if self.deadProperties().contains((dav_namespace, "resourcetype")):
+            return succeed(self.deadProperties().get((dav_namespace, "resourcetype")))
+        if self.isCollection():
+            return succeed(davxml.ResourceType.collection)
+        return succeed(davxml.ResourceType.empty)
+
+    def render(self, request):
+        if not self.fp.exists():
+            return responsecode.NOT_FOUND
+
+        if self.fp.isdir():
+            if request.path[-1] != "/":
+                # Redirect to include trailing '/' in URI
+                return RedirectResponse(request.unparseURL(path=urllib.quote(urllib.unquote(request.path), safe=':/')+'/'))
+            else:
+                ifp = self.fp.childSearchPreauth(*self.indexNames)
+                if ifp:
+                    # Render from the index file
+                    return self.createSimilarFile(ifp.path).render(request)
+
+                return self.renderDirectory(request)
+
+        try:
+            f = self.fp.open()
+        except IOError, e:
+            import errno
+            if e[0] == errno.EACCES:
+                return responsecode.FORBIDDEN
+            elif e[0] == errno.ENOENT:
+                return responsecode.NOT_FOUND
+            else:
+                raise
+
+        response = Response()
+        response.stream = FileStream(f, 0, self.fp.getsize())
+
+        for (header, value) in (
+            ("content-type", self.contentType()),
+            ("content-encoding", self.contentEncoding()),
+        ):
+            if value is not None:
+                response.headers.setHeader(header, value)
+
+        return response
+
+
+
 class ReadOnlyWritePropertiesResourceMixIn (object):
     """
     Read only that will allow writing of properties resource.

Modified: CalendarServer/trunk/twistedcaldav/ical.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/ical.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/ical.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1765,10 +1765,13 @@
         """
         Test for the existence of one or more properties in any component.
         
-        @param properties: property names to test for
-        @type properties: C{list} or C{tuple}
+        @param properties: property name(s) to test for
+        @type properties: C{list}, C{tuple} or C{str}
         """
 
+        if isinstance(properties, str):
+            properties = (properties,)
+            
         for property in properties:
             if self.hasProperty(property):
                 return True
@@ -1779,6 +1782,29 @@
 
         return False
 
+    def getFirstPropertyInAnyComponent(self, properties):
+        """
+        Get the first of any set of properties in any component.
+        
+        @param properties: property name(s) to test for
+        @type properties: C{list}, C{tuple} or C{str}
+        """
+
+        if isinstance(properties, str):
+            properties = (properties,)
+            
+        for property in properties:
+            props = tuple(self.properties(property))
+            if props:
+                return props[0]
+
+        for component in self.subcomponents():
+            prop = component.getFirstPropertyInAnyComponent(properties)
+            if prop:
+                return prop
+
+        return None
+
     def hasPropertyValueInAllComponents(self, property):
         """
         Test for the existence of a property with a specific value in any sub-component.

Modified: CalendarServer/trunk/twistedcaldav/index.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/index.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/index.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,3 +1,4 @@
+# -*- test-case-name: twistedcaldav.test.test_index -*-
 ##
 # Copyright (c) 2005-2010 Apple Inc. All rights reserved.
 #
@@ -31,7 +32,6 @@
 ]
 
 import datetime
-import os
 import time
 import hashlib
 
@@ -118,7 +118,7 @@
             C{resource.isPseudoCalendarCollection()} returns C{True}.)
         """
         self.resource = resource
-        db_filename = os.path.join(self.resource.fp.path, db_basename)
+        db_filename = self.resource.fp.child(db_basename).path
         super(AbstractCalendarIndex, self).__init__(db_filename, False)
 
     def create(self):
@@ -260,7 +260,7 @@
         @return: a C{list} of all names that exist
         """
         statement = "select NAME from RESOURCE where NAME in ("
-        for ctr, ignore_name in enumerate(names):
+        for ctr in (item[0] for item in enumerate(names)):
             if ctr != 0:
                 statement += ", "
             statement += ":%s" % (ctr,)
@@ -1025,14 +1025,6 @@
     """
     Schedule collection index - does not require UID uniqueness.
     """
-    def __init__(self, resource):
-        """
-        @param resource: the L{twistedcaldav.static.CalDAVFile} resource to
-            index. C{resource} must be a calendar collection (i.e.
-            C{resource.isPseudoCalendarCollection()} returns C{True}.)
-        """
-        assert resource.isPseudoCalendarCollection() and not resource.isCalendarCollection(), "non-calendar collection resource %s has no index." % (resource,)
-        super(IndexSchedule, self).__init__(resource)
 
     def reserveUID(self, uid): #@UnusedVariable
         """

Modified: CalendarServer/trunk/twistedcaldav/method/acl.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/acl.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/acl.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -41,7 +41,7 @@
     # homes cannot have ACL's set, and calendar/address object resources too.
     #
 
-    if self.fp.exists():
+    if self.exists():
         if isinstance(self, CalendarHomeFile) or isinstance(self, AddressBookHomeFile):
             raise HTTPError(responsecode.NOT_ALLOWED)
 

Modified: CalendarServer/trunk/twistedcaldav/method/copymove.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/copymove.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/copymove.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -84,8 +84,8 @@
     # Check for existing destination resource
     overwrite = request.headers.getHeader("overwrite", True)
     if destination.exists() and not overwrite:
-        log.err("Attempt to copy onto existing file without overwrite flag enabled: %s"
-                % (destination.fp.path,))
+        log.err("Attempt to copy onto existing resource without overwrite flag enabled: %s"
+                % (destination,))
         raise HTTPError(StatusResponse(
             responsecode.PRECONDITION_FAILED,
             "Destination %s already exists." % (destination_uri,))
@@ -163,8 +163,8 @@
     # Check for existing destination resource
     overwrite = request.headers.getHeader("overwrite", True)
     if destination.exists() and not overwrite:
-        log.err("Attempt to copy onto existing file without overwrite flag enabled: %s"
-                % (destination.fp.path,))
+        log.err("Attempt to copy onto existing resource without overwrite flag enabled: %s"
+                % (destination,))
         raise HTTPError(StatusResponse(
             responsecode.PRECONDITION_FAILED,
             "Destination %s already exists." % (destination_uri,)
@@ -228,8 +228,8 @@
     destinationcal = False
     
     # Check the source path first
-    if not self.fp.exists():
-        log.err("File not found: %s" % (self.fp.path,))
+    if not self.exists():
+        log.err("Resource not found: %s" % (self,))
         raise HTTPError(StatusResponse(
             responsecode.NOT_FOUND,
             "Source resource %s not found." % (request.uri,)

Modified: CalendarServer/trunk/twistedcaldav/method/copymove_contact.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/copymove_contact.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/copymove_contact.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -71,8 +71,8 @@
     # Check for existing destination resource
     overwrite = request.headers.getHeader("overwrite", True)
     if destination.exists() and not overwrite:
-        log.err("Attempt to copy onto existing file without overwrite flag enabled: %s"
-                % (destination.fp.path,))
+        log.err("Attempt to copy onto existing resource without overwrite flag enabled: %s"
+                % (destination,))
         raise HTTPError(StatusResponse(
             responsecode.PRECONDITION_FAILED,
             "Destination %s already exists." % (destination_uri,))
@@ -141,8 +141,8 @@
     # Check for existing destination resource
     overwrite = request.headers.getHeader("overwrite", True)
     if destination.exists() and not overwrite:
-        log.err("Attempt to copy onto existing file without overwrite flag enabled: %s"
-                % (destination.fp.path,))
+        log.err("Attempt to copy onto existing resource without overwrite flag enabled: %s"
+                % (destination,))
         raise HTTPError(StatusResponse(
             responsecode.PRECONDITION_FAILED,
             "Destination %s already exists." % (destination_uri,)
@@ -206,8 +206,8 @@
     destinationadbk = False
     
     # Check the source path first
-    if not self.fp.exists():
-        log.err("File not found: %s" % (self.fp.path,))
+    if not self.exists():
+        log.err("Resource not found: %s" % (self,))
         raise HTTPError(StatusResponse(
             responsecode.NOT_FOUND,
             "Source resource %s not found." % (request.uri,)

Modified: CalendarServer/trunk/twistedcaldav/method/delete.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/delete.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/delete.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -39,8 +39,8 @@
     # index file has the entry for the deleted calendar component removed.
     #
 
-    if not self.fp.exists():
-        log.err("File not found: %s" % (self.fp.path,))
+    if not self.exists():
+        log.err("Resource not found: %s" % (self,))
         raise HTTPError(responsecode.NOT_FOUND)
 
     depth = request.headers.getHeader("depth", "infinity")

Modified: CalendarServer/trunk/twistedcaldav/method/delete_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/delete_common.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/delete_common.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -22,31 +22,16 @@
 __all__ = ["DeleteResource"]
 
 from twisted.internet.defer import inlineCallbacks, returnValue
-from twext.web2 import responsecode
-from twext.web2.dav.fileop import delete
-from twext.web2.dav.http import ResponseQueue, MultiStatusResponse
-from twext.web2.dav.util import joinURL
-from twext.web2.http import HTTPError, StatusResponse
 
 from twext.python.log import Logger
-from twext.web2.dav.http import ErrorResponse
 
-from twistedcaldav.caldavxml import caldav_namespace, ScheduleTag
-from twistedcaldav.config import config
-from twistedcaldav.customxml import calendarserver_namespace
-from twistedcaldav.memcachelock import MemcacheLock, MemcacheLockTimeoutError
-from twistedcaldav.method.report_common import applyToAddressBookCollections, applyToCalendarCollections
-from twistedcaldav.resource import isCalendarCollectionResource,\
-    isPseudoCalendarCollectionResource, isAddressBookCollectionResource
-from twistedcaldav.scheduling.implicit import ImplicitScheduler
-
 log = Logger()
 
 class DeleteResource(object):
-    
+
     def __init__(self, request, resource, resource_uri, parent, depth,
         internal_request=False, allowImplicitSchedule=True):
-        
+
         self.request = request
         self.resource = resource
         self.resource_uri = resource_uri
@@ -55,403 +40,17 @@
         self.internal_request = internal_request
         self.allowImplicitSchedule = allowImplicitSchedule
 
-    def validIfScheduleMatch(self):
-        """
-        Check for If-ScheduleTag-Match header behavior.
-        """
-        
-        # Only when a direct request
-        if not self.internal_request:
-            header = self.request.headers.getHeader("If-Schedule-Tag-Match")
-            if header:
-                # Do "precondition" test
-                matched = False
-                if self.resource.exists() and self.resource.hasDeadProperty(ScheduleTag):
-                    scheduletag = self.resource.readDeadProperty(ScheduleTag)
-                    matched = (scheduletag == header)
-                if not matched:
-                    log.debug("If-Schedule-Tag-Match: header value '%s' does not match resource value '%s'" % (header, scheduletag,))
-                    raise HTTPError(responsecode.PRECONDITION_FAILED)
-            
-            elif config.Scheduling.CalDAV.ScheduleTagCompatibility:
-                # Actually by the time we get here the pre-condition will already have been tested and found to be OK
-                # (CalDAVFile.checkPreconditions) so we can ignore this case.
-                pass
 
     @inlineCallbacks
-    def deleteResource(self, delresource, deluri, parent):
-        """
-        Delete a plain resource which may be a collection - but only one not containing
-        calendar resources.
-
-        @param delresource:
-        @type delresource:
-        @param deluri:
-        @type deluri:
-        @param parent:
-        @type parent:
-        """
-
-        # Do quota checks before we start deleting things
-        myquota = (yield delresource.quota(self.request))
-        if myquota is not None:
-            old_size = (yield delresource.quotaSize(self.request))
-        else:
-            old_size = 0
-        
-        # Do delete
-        response = (yield delete(deluri, delresource.fp, self.depth))
-
-        # Adjust quota
-        if myquota is not None:
-            yield delresource.quotaSizeAdjust(self.request, -old_size)
-
-        if response == responsecode.NO_CONTENT:
-            if isPseudoCalendarCollectionResource(parent):
-                newrevision = (yield parent.bumpSyncToken())
-                index = parent.index()
-                index.deleteResource(delresource.fp.basename(), newrevision)
-                
-        returnValue(response)
-
-    @inlineCallbacks
-    def deleteCalendarResource(self, delresource, deluri, parent):
-        """
-        Delete a single calendar resource and do implicit scheduling actions if required.
-
-        @param delresource:
-        @type delresource:
-        @param deluri:
-        @type deluri:
-        @param parent:
-        @type parent:
-        """
-
-        # TODO: need to use transaction based delete on live scheduling object resources
-        # as the iTIP operation may fail and may need to prevent the delete from happening.
-    
-        # Do If-Schedule-Tag-Match behavior first
-        self.validIfScheduleMatch()
-
-        # Do quota checks before we start deleting things
-        myquota = (yield delresource.quota(self.request))
-        if myquota is not None:
-            old_size = (yield delresource.quotaSize(self.request))
-        else:
-            old_size = 0
-        
-        scheduler = None
-        lock = None
-        if not self.internal_request and self.allowImplicitSchedule:
-            # Get data we need for implicit scheduling
-            calendar = (yield delresource.iCalendarForUser(self.request))
-            scheduler = ImplicitScheduler()
-            do_implicit_action, _ignore = (yield scheduler.testImplicitSchedulingDELETE(self.request, delresource, calendar))
-            if do_implicit_action:
-                # Cannot do implicit in sharee's shared calendar
-                isvirt = (yield parent.isVirtualShare(self.request))
-                if isvirt:
-                    raise HTTPError(ErrorResponse(
-                        responsecode.FORBIDDEN,
-                        (calendarserver_namespace, "sharee-privilege-needed",),
-                        description="Sharee's cannot schedule"
-                    ))
-                lock = MemcacheLock("ImplicitUIDLock", calendar.resourceUID(), timeout=60.0)
-
-        try:
-            if lock:
-                yield lock.acquire()
-    
-            # Do delete
-            response = (yield delete(deluri, delresource.fp, self.depth))
-
-            # Adjust quota
-            if myquota is not None:
-                yield delresource.quotaSizeAdjust(self.request, -old_size)
-    
-            if response == responsecode.NO_CONTENT:
-                newrevision = (yield parent.bumpSyncToken())
-                index = parent.index()
-                index.deleteResource(delresource.fp.basename(), newrevision)
-    
-                # Do scheduling
-                if scheduler and not self.internal_request and self.allowImplicitSchedule:
-                    yield scheduler.doImplicitScheduling()
-    
-        except MemcacheLockTimeoutError:
-            raise HTTPError(StatusResponse(responsecode.CONFLICT, "Resource: %s currently in use on the server." % (deluri,)))
-    
-        finally:
-            if lock:
-                yield lock.clean()
-                
-        returnValue(response)
-
-    @inlineCallbacks
-    def deleteCalendar(self, delresource, deluri, parent):
-        """
-        Delete an entire calendar collection by deleting each child resource in turn to
-        ensure that proper implicit scheduling actions occur.
-        
-        This has to emulate the behavior in fileop.delete in that any errors need to be
-        reported back in a multistatus response.
-        """
-
-        # Not allowed to delete the default calendar
-        default = (yield delresource.isDefaultCalendar(self.request))
-        if default:
-            log.err("Cannot DELETE default calendar: %s" % (delresource,))
-            raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (caldav_namespace, "default-calendar-delete-allowed",)))
-
-        if self.depth != "infinity":
-            msg = "Client sent illegal depth header value for DELETE: %s" % (self.depth,)
-            log.err(msg)
-            raise HTTPError(StatusResponse(responsecode.BAD_REQUEST, msg))
-
-        # Check virtual share first
-        isVirtual = yield delresource.isVirtualShare(self.request)
-        if isVirtual:
-            log.debug("Removing shared calendar %s" % (delresource,))
-            yield delresource.removeVirtualShare(self.request)
-            returnValue(responsecode.NO_CONTENT)
-
-        log.debug("Deleting calendar %s" % (delresource.fp.path,))
-
-        errors = ResponseQueue(deluri, "DELETE", responsecode.NO_CONTENT)
-
-        for childname in delresource.listChildren():
-
-            childurl = joinURL(deluri, childname)
-            child = (yield self.request.locateChildResource(delresource, childname))
-
-            try:
-                yield self.deleteCalendarResource(child, childurl, delresource)
-            except:
-                errors.add(childurl, responsecode.BAD_REQUEST)
-
-        # Now do normal delete
-
-        # Handle sharing
-        wasShared = (yield delresource.isShared(self.request))
-        if wasShared:
-            yield delresource.downgradeFromShare(self.request)
-
-        # Change CTag
-        yield delresource.bumpSyncToken()
-        more_responses = (yield self.deleteResource(delresource, deluri, parent))
-        
-        if isinstance(more_responses, MultiStatusResponse):
-            # Merge errors
-            errors.responses.update(more_responses.children)                
-
-        response = errors.response()
-        
-        if response == responsecode.NO_CONTENT:
-            # Do some clean up
-            yield delresource.deletedCalendar(self.request)
-
-        returnValue(response)
-
-    @inlineCallbacks
-    def deleteCollection(self):
-        """
-        Delete a regular collection with special processing for any calendar collections
-        contained within it.
-        """
-        if self.depth != "infinity":
-            msg = "Client sent illegal depth header value for DELETE: %s" % (self.depth,)
-            log.err(msg)
-            raise HTTPError(StatusResponse(responsecode.BAD_REQUEST, msg))
-
-        log.debug("Deleting collection %s" % (self.resource.fp.path,))
-
-        errors = ResponseQueue(self.resource_uri, "DELETE", responsecode.NO_CONTENT)
- 
-        @inlineCallbacks
-        def doDeleteCalendar(delresource, deluri):
-            
-            delparent = (yield delresource.locateParent(self.request, deluri))
-
-            response = (yield self.deleteCalendar(delresource, deluri, delparent))
-
-            if isinstance(response, MultiStatusResponse):
-                # Merge errors
-                errors.responses.update(response.children)                
-
-            returnValue(True)
-
-        yield applyToCalendarCollections(self.resource, self.request, self.resource_uri, self.depth, doDeleteCalendar, None)
-
-        # Now do normal delete
-        more_responses = (yield self.deleteResource(self.resource, self.resource_uri, self.parent))
-        
-        if isinstance(more_responses, MultiStatusResponse):
-            # Merge errors
-            errors.responses.update(more_responses.children)                
-
-        response = errors.response()
-
-        returnValue(response)
-
-    @inlineCallbacks
-    def deleteAddressBookResource(self, delresource, deluri, parent):
-        """
-        Delete a single addressbook resource and do implicit scheduling actions if required.
-
-        @param delresource:
-        @type delresource:
-        @param deluri:
-        @type deluri:
-        @param parent:
-        @type parent:
-        """
-
-        # TODO: need to use transaction based delete on live scheduling object resources
-        # as the iTIP operation may fail and may need to prevent the delete from happening.
-    
-        # Do quota checks before we start deleting things
-        myquota = (yield delresource.quota(self.request))
-        if myquota is not None:
-            old_size = (yield delresource.quotaSize(self.request))
-        else:
-            old_size = 0
-        
-        try:
-    
-            # Do delete
-            response = (yield delete(deluri, delresource.fp, self.depth))
-
-            # Adjust quota
-            if myquota is not None:
-                yield delresource.quotaSizeAdjust(self.request, -old_size)
-    
-            if response == responsecode.NO_CONTENT:
-                newrevision = (yield parent.bumpSyncToken())
-                index = parent.index()
-                index.deleteResource(delresource.fp.basename(), newrevision)    
-    
-        except MemcacheLockTimeoutError:
-            raise HTTPError(StatusResponse(responsecode.CONFLICT, "Resource: %s currently in use on the server." % (deluri,)))
-    
-                
-        returnValue(response)
-
-    @inlineCallbacks
-    def deleteAddressBook(self, delresource, deluri, parent):
-        """
-        Delete an entire addressbook collection by deleting each child resource in turn to
-        ensure that proper implicit scheduling actions occur.
-        
-        This has to emulate the behavior in fileop.delete in that any errors need to be
-        reported back in a multistatus response.
-        """
-
-
-        if self.depth != "infinity":
-            msg = "Client sent illegal depth header value for DELETE: %s" % (self.depth,)
-            log.err(msg)
-            raise HTTPError(StatusResponse(responsecode.BAD_REQUEST, msg))
-
-        # Check virtual share first
-        isVirtual = yield delresource.isVirtualShare(self.request)
-        if isVirtual:
-            log.debug("Removing shared address book %s" % (delresource,))
-            yield delresource.removeVirtualShare(self.request)
-            returnValue(responsecode.NO_CONTENT)
-
-        log.debug("Deleting addressbook %s" % (delresource.fp.path,))
-
-        errors = ResponseQueue(deluri, "DELETE", responsecode.NO_CONTENT)
-
-        for childname in delresource.listChildren():
-
-            childurl = joinURL(deluri, childname)
-            child = (yield self.request.locateChildResource(delresource, childname))
-
-            try:
-                yield self.deleteAddressBookResource(child, childurl, delresource)
-            except:
-                errors.add(childurl, responsecode.BAD_REQUEST)
-
-        # Now do normal delete
-
-        # Handle sharing
-        wasShared = (yield delresource.isShared(self.request))
-        if wasShared:
-            yield delresource.downgradeFromShare(self.request)
-
-        yield delresource.bumpSyncToken()
-        more_responses = (yield self.deleteResource(delresource, deluri, parent))
-        
-        if isinstance(more_responses, MultiStatusResponse):
-            # Merge errors
-            errors.responses.update(more_responses.children)                
-
-        response = errors.response()
-        
-        returnValue(response)
-
-    @inlineCallbacks
-    def deleteCollectionAB(self):
-        # XXX CSCS-MERGE this needs to be merged into deleteCollection
-        """
-        Delete a regular collection with special processing for any addressbook collections
-        contained within it.
-        """
-        if self.depth != "infinity":
-            msg = "Client sent illegal depth header value for DELETE: %s" % (self.depth,)
-            log.err(msg)
-            raise HTTPError(StatusResponse(responsecode.BAD_REQUEST, msg))
-
-        log.debug("Deleting collection %s" % (self.resource.fp.path,))
-
-        errors = ResponseQueue(self.resource_uri, "DELETE", responsecode.NO_CONTENT)
- 
-        @inlineCallbacks
-        def doDeleteAddressBook(delresource, deluri):
-            
-            delparent = (yield delresource.locateParent(self.request, deluri))
-
-            response = (yield self.deleteAddressBook(delresource, deluri, delparent))
-
-            if isinstance(response, MultiStatusResponse):
-                # Merge errors
-                errors.responses.update(response.children)                
-
-            returnValue(True)
-
-        yield applyToAddressBookCollections(self.resource, self.request, self.resource_uri, self.depth, doDeleteAddressBook, None)
-
-        # Now do normal delete
-        more_responses = (yield self.deleteResource(self.resource, self.resource_uri, self.parent))
-        
-        if isinstance(more_responses, MultiStatusResponse):
-            # Merge errors
-            errors.responses.update(more_responses.children)                
-
-        response = errors.response()
-
-        returnValue(response)
-
-    @inlineCallbacks
     def run(self):
+        # FIXME: this code-path shouldn't actually be used, as the things
+        # with storeRemove on them also have their own http_DELETEs.
+        response = (
+            yield self.resource.storeRemove(
+                self.request, 
+                not self.internal_request and self.allowImplicitSchedule,
+                self.resource_uri
+            )
+        )
 
-        if isCalendarCollectionResource(self.parent):
-            response = (yield self.deleteCalendarResource(self.resource, self.resource_uri, self.parent))
-            
-        elif isCalendarCollectionResource(self.resource):
-            response = (yield self.deleteCalendar(self.resource, self.resource_uri, self.parent))
-
-        elif isAddressBookCollectionResource(self.parent):
-            response = (yield self.deleteAddressBookResource(self.resource, self.resource_uri, self.parent))
-
-        elif isAddressBookCollectionResource(self.resource):
-            response = (yield self.deleteAddressBook(self.resource, self.resource_uri, self.parent))
-
-        elif self.resource.isCollection():
-            response = (yield self.deleteCollection())
-
-        else:
-            response = (yield self.deleteResource(self.resource, self.resource_uri, self.parent))
-
         returnValue(response)

Modified: CalendarServer/trunk/twistedcaldav/method/mkcalendar.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/mkcalendar.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/mkcalendar.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -50,8 +50,7 @@
     yield parent.authorize(request, (davxml.Bind(),))
 
     if self.exists():
-        log.err("Attempt to create collection where file exists: %s"
-                % (self.fp.path,))
+        log.err("Attempt to create collection where resource exists: %s"  % (self,))
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
             (davxml.dav_namespace, "resource-must-be-null"))
@@ -59,7 +58,7 @@
 
     if not parent.isCollection():
         log.err("Attempt to create collection with non-collection parent: %s"
-                % (self.fp.path,))
+                % (self,))
         raise HTTPError(ErrorResponse(
             responsecode.CONFLICT,
             (caldavxml.caldav_namespace, "calendar-collection-location-ok"))
@@ -78,9 +77,6 @@
     if doc is not None:
         makecalendar = doc.root_element
         if not isinstance(makecalendar, caldavxml.MakeCalendar):
-            # Clean up
-            if self.fp.exists(): self.fp.remove()
-
             error = ("Non-%s element in MKCALENDAR request body: %s"
                      % (caldavxml.MakeCalendar.name, makecalendar))
             log.err(error)
@@ -104,9 +100,8 @@
                     errors.add(responsecode.OK, property)
     
         if got_an_error:
-            # Clean up
-            if self.fp.exists(): self.fp.remove()
-
+            # Force a transaction error and proper clean-up
+            self.transactionError()
             errors.error()
             raise HTTPError(MultiStatusResponse([errors.response()]))
 

Modified: CalendarServer/trunk/twistedcaldav/method/mkcol.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/mkcol.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/mkcol.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -53,8 +53,8 @@
     yield parent.authorize(request, (davxml.Bind(),))
 
     if self.exists():
-        log.err("Attempt to create collection where file exists: %s"
-                % (self.fp.path,))
+        log.err("Attempt to create collection where resource exists: %s"
+                % (self,))
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
             (davxml.dav_namespace, "resource-must-be-null"))
@@ -62,7 +62,7 @@
 
     if not parent.isCollection():
         log.err("Attempt to create collection with non-collection parent: %s"
-                % (self.fp.path,))
+                % (self,))
         raise HTTPError(ErrorResponse(
             responsecode.CONFLICT,
             (davxml.dav_namespace, "collection-location-ok"))
@@ -111,9 +111,6 @@
         # Parse response body
         mkcol = doc.root_element
         if not isinstance(mkcol, mkcolxml.MakeCollection):
-            # Clean up
-            if self.fp.exists(): self.fp.remove()
-
             error = ("Non-%s element in MKCOL request body: %s"
                      % (mkcolxml.MakeCollection.name, mkcol))
             log.err(error)
@@ -177,8 +174,7 @@
     
         if got_an_error:
             # Clean up
-            if self.fp.exists(): self.fp.remove()
-
+            self.transactionError()
             errors.error()
             raise HTTPError(MultiStatusResponse([errors.response()]))
 

Modified: CalendarServer/trunk/twistedcaldav/method/post.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/post.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/post.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -90,7 +90,7 @@
                 raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (caldav_namespace, "valid-calendar-data"), description="No calendar data"))
 
             # Create a new name if one was not provided
-            name =  md5(str(calendardata) + str(time.time()) + self.fp.path).hexdigest() + ".ics"
+            name =  md5(str(calendardata) + str(time.time()) + request.path).hexdigest() + ".ics"
         
             # Get a resource for the new item
             newchildURL = joinURL(parentURL, name)
@@ -139,7 +139,7 @@
                 raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (carddav_namespace, "valid-address-data"), description="No address data"))
 
             # Create a new name if one was not provided
-            name =  md5(str(vcarddata) + str(time.time()) + self.fp.path).hexdigest() + ".vcf"
+            name =  md5(str(vcarddata) + str(time.time()) + request.path).hexdigest() + ".vcf"
         
             # Get a resource for the new item
             newchildURL = joinURL(parentURL, name)

Modified: CalendarServer/trunk/twistedcaldav/method/propfind.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/propfind.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/propfind.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -51,7 +51,7 @@
     Respond to a PROPFIND request. (RFC 2518, section 8.1)
     """
     if not self.exists():
-        log.err("File not found: %s" % (self.fp.path,))
+        log.err("Resource not found: %s" % (self,))
         raise HTTPError(responsecode.NOT_FOUND)
 
     #

Modified: CalendarServer/trunk/twistedcaldav/method/put.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/put.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/put.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -82,7 +82,6 @@
             raise HTTPError(StatusResponse(responsecode.BAD_REQUEST, str(e)))
 
     elif isAddressBookCollectionResource(parent):
-        self.fp.restat(False)
 
         # Content-type check
         content_type = request.headers.getHeader("content-type")
@@ -125,7 +124,7 @@
             request.extendedLogItems = {}
         clength = request.headers.getHeader("content-length", 0)
         if clength == 0:
-            clength = self.fp.getsize()
+            clength = self.contentLength()
         request.extendedLogItems["cl"] = str(clength)
         
         returnValue(result)

Modified: CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -20,117 +20,33 @@
 
 __all__ = ["StoreAddressObjectResource"]
 
-import os
 import types
 
 from twisted.internet import reactor
 from twisted.internet.defer import Deferred, inlineCallbacks, succeed
 from twisted.internet.defer import returnValue
-from twisted.python import failure
-from twext.python.filepath import CachingFilePath as FilePath
 from twext.web2 import responsecode
 from twext.web2.dav import davxml
 from twext.web2.dav.element.base import dav_namespace
-from twext.web2.dav.fileop import delete
 from twext.web2.dav.http import ErrorResponse
 from twext.web2.dav.resource import TwistedGETContentMD5
 from twext.web2.dav.stream import MD5StreamWrapper
 from twext.web2.dav.util import joinURL, parentForURL
 from twext.web2.http import HTTPError
 from twext.web2.http import StatusResponse
+from twext.web2.http_headers import MimeType, generateContentType
 from twext.web2.stream import MemoryStream
 
 from twistedcaldav.config import config
 from twistedcaldav.carddavxml import NoUIDConflict, carddav_namespace
-from twistedcaldav.fileops import copyToWithXAttrs
-from twistedcaldav.fileops import putWithXAttrs
-from twistedcaldav.fileops import copyWithXAttrs
 from twistedcaldav.vcard import Component
 from twistedcaldav.vcardindex import ReservationError
 from twext.python.log import Logger
-#from twistedcaldav.scheduling.implicit import ImplicitScheduler
 
 log = Logger()
 
 class StoreAddressObjectResource(object):
     
-    class RollbackState(object):
-        """
-        This class encapsulates the state needed to rollback the entire PUT/COPY/MOVE
-        transaction, leaving the server state the same as it was before the request was
-        processed. The DoRollback method will actually execute the rollback operations.
-        """
-        
-        def __init__(self, storer):
-            self.storer = storer
-            self.active = True
-            self.source_copy = None
-            self.destination_copy = None
-            self.destination_created = False
-            self.source_deleted = False
-            self.source_index_deleted = False
-            self.destination_index_deleted = False
-        
-        def Rollback(self):
-            """
-            Rollback the server state. Do not allow this to raise another exception. If
-            rollback fails then we are going to be left in an awkward state that will need
-            to be cleaned up eventually.
-            """
-            if self.active:
-                self.active = False
-                log.debug("Rollback: rollback")
-                try:
-                    if self.source_copy and self.source_deleted:
-                        self.source_copy.moveTo(self.storer.source.fp)
-                        log.debug("Rollback: source restored %s to %s" % (self.source_copy.path, self.storer.source.fp.path))
-                        self.source_copy = None
-                        self.source_deleted = False
-                    if self.destination_copy:
-                        self.storer.destination.fp.remove()
-                        log.debug("Rollback: destination restored %s to %s" % (self.destination_copy.path, self.storer.destination.fp.path))
-                        self.destination_copy.moveTo(self.storer.destination.fp)
-                        self.destination_copy = None
-                    elif self.destination_created:
-                        if self.storer.destinationadbk and self.storer.indexdestination:
-                            self.storer.doRemoveDestinationIndex()
-                            log.debug("Rollback: destination index removed %s" % (self.storer.destination.fp.path,))
-                            self.destination_index_deleted = False
-                        self.storer.destination.fp.remove()
-                        log.debug("Rollback: destination removed %s" % (self.storer.destination.fp.path,))
-                        self.destination_created = False
-                    if self.destination_index_deleted:
-                        # Must read in vcard for destination being re-indexed
-                        self.storer.doDestinationIndex(self.storer.destination.vCard())
-                        self.destination_index_deleted = False
-                        log.debug("Rollback: destination re-indexed %s" % (self.storer.destination.fp.path,))
-                    if self.source_index_deleted:
-                        self.storer.doSourceIndexRecover()
-                        self.destination_index_deleted = False
-                        log.debug("Rollback: source re-indexed %s" % (self.storer.source.fp.path,))
-                except:
-                    log.err("Rollback: exception caught and not handled: %s" % failure.Failure())
-
-        def Commit(self):
-            """
-            Commit the resource changes by wiping the rollback state.
-            """
-            if self.active:
-                log.debug("Rollback: commit")
-                self.active = False
-                if self.source_copy:
-                    self.source_copy.remove()
-                    log.debug("Rollback: removed source backup %s" % (self.source_copy.path,))
-                    self.source_copy = None
-                if self.destination_copy:
-                    self.destination_copy.remove()
-                    log.debug("Rollback: removed destination backup %s" % (self.destination_copy.path,))
-                    self.destination_copy = None
-                self.destination_created = False
-                self.source_deleted = False
-                self.source_index_deleted = False
-                self.destination_index_deleted = False
-
     class UIDReservation(object):
         
         def __init__(self, index, uid, uri):
@@ -229,9 +145,7 @@
         self.deletesource = deletesource
         self.indexdestination = indexdestination
         
-        self.rollback = None
         self.access = None
-        self.newrevision = None
 
     def fullValidation(self):
         """
@@ -275,9 +189,9 @@
             else:
                 # Get UID from original resource
                 self.source_index = self.sourceparent.index()
-                self.uid = self.source_index.resourceUIDForName(self.source.fp.basename())
+                self.uid = self.source_index.resourceUIDForName(self.source.name())
                 if self.uid is None:
-                    log.err("Source vcard does not have a UID: %s" % self.source.fp.basename())
+                    log.err("Source vcard does not have a UID: %s" % self.source.name())
                     raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (carddav_namespace, "valid-addressbook-object-resource")))
 
                 # FIXME: We need this here because we have to re-index the destination. Ideally it
@@ -299,7 +213,7 @@
         """
         result = True
         message = ""
-        filename = self.destination.fp.basename()
+        filename = self.destination.name()
         if filename.startswith("."):
             result = False
             message = "File name %s not allowed in vcard collection" % (filename,)
@@ -371,12 +285,12 @@
 
         # Adjust for a move into same vcard collection
         oldname = None
-        if self.sourceparent and (self.sourceparent.fp.path == self.destinationparent.fp.path) and self.deletesource:
-            oldname = self.source.fp.basename()
+        if self.sourceparent and (self.sourceparent == self.destinationparent) and self.deletesource:
+            oldname = self.source.name()
 
         # UID must be unique
         index = self.destinationparent.index()
-        if not index.isAllowedUID(uid, oldname, self.destination.fp.basename()):
+        if not index.isAllowedUID(uid, oldname, self.destination.name()):
             rname = index.resourceNameForUID(uid)
             # This can happen if two simultaneous PUTs occur with the same UID.
             # i.e. one PUT has reserved the UID but has not yet written the resource,
@@ -388,10 +302,10 @@
             message = "Address book resource %s already exists with same UID %s" % (rname, uid)
         else:
             # Cannot overwrite a resource with different UID
-            if self.destination.fp.exists():
-                olduid = index.resourceUIDForName(self.destination.fp.basename())
+            if self.destination.exists():
+                olduid = index.resourceUIDForName(self.destination.name())
                 if olduid != uid:
-                    rname = self.destination.fp.basename()
+                    rname = self.destination.name()
                     result = False
                     message = "Cannot overwrite vcard resource %s with different UID %s" % (rname, olduid)
         
@@ -426,64 +340,49 @@
 
         returnValue(None)
 
-    def setupRollback(self):
-        """
-        We may need to restore the original resource data if the PUT/COPY/MOVE fails,
-        so rename the original file in case we need to rollback.
-        """
-
-        def _createRollbackPath(path):
-            parent, child = os.path.split(path)
-            child = "." + child + ".rollback"
-            return os.path.join(parent, child)
-
-        self.rollback = StoreAddressObjectResource.RollbackState(self)
-        self.overwrite = self.destination.exists()
-        if self.overwrite:
-            self.rollback.destination_copy = FilePath(_createRollbackPath(self.destination.fp.path))
-            copyToWithXAttrs(self.destination.fp, self.rollback.destination_copy)
-            log.debug("Rollback: backing up destination %s to %s" % (self.destination.fp.path, self.rollback.destination_copy.path))
-        else:
-            self.rollback.destination_created = True
-            log.debug("Rollback: will create new destination %s" % (self.destination.fp.path,))
-
-        if self.deletesource:
-            self.rollback.source_copy = FilePath(_createRollbackPath(self.source.fp.path))
-            copyToWithXAttrs(self.source.fp, self.rollback.source_copy)
-            log.debug("Rollback: backing up source %s to %s" % (self.source.fp.path, self.rollback.source_copy.path))
-
     @inlineCallbacks
     def doStore(self):
         # Do put or copy based on whether source exists
-        if self.source is not None:
-            response = (yield copyWithXAttrs(self.source.fp, self.destination.fp, self.destination_uri))
+        source = self.source
+        if source is not None:
+            # Retrieve information from the source, in case we have to delete
+            # it.
+            sourceProperties = dict(source.newStoreProperties().iteritems())
+            sourceText = source.vCardText()
+
+            # Delete the original source if needed (for example, if this is a
+            # same-calendar MOVE of a calendar object, implemented as an
+            # effective DELETE-then-PUT).
+            if self.deletesource:
+                yield self.doSourceDelete()
+
+            response = (yield self.destination.storeStream(MemoryStream(sourceText)))
+            self.destination.newStoreProperties().update(sourceProperties)
         else:
-            if self.vcarddata is None:
-                self.vcarddata = str(self.vcard)
-            md5 = MD5StreamWrapper(MemoryStream(self.vcarddata))
-            response = (yield putWithXAttrs(md5, self.destination.fp))
+            response = (yield self.doStorePut())
     
-            # Finish MD5 calculation and write dead property
-            md5.close()
-            md5 = md5.getMD5()
-            self.destination.writeDeadProperty(TwistedGETContentMD5.fromString(md5))
-    
         returnValue(response)
 
     @inlineCallbacks
-    def doSourceDelete(self):
-        # Delete index for original item
-        if self.sourceadbk:
-            self.newrevision = (yield self.sourceparent.bumpSyncToken())
-            self.source_index.deleteResource(self.source.fp.basename(), self.newrevision)
-            self.rollback.source_index_deleted = True
-            log.debug("Source index removed %s" % (self.source.fp.path,))
+    def doStorePut(self):
 
-        # Delete the source resource
-        delete(self.source_uri, self.source.fp, "0")
-        self.rollback.source_deleted = True
-        log.debug("Source removed %s" % (self.source.fp.path,))
+        if self.vcarddata is None:
+            self.vcarddata = str(self.vcard)
+        md5 = MD5StreamWrapper(MemoryStream(self.vcarddata))
+        response = (yield self.destination.storeStream(md5))
 
+        # Finish MD5 calculation and write dead property
+        md5.close()
+        md5 = md5.getMD5()
+        self.destination.writeDeadProperty(TwistedGETContentMD5.fromString(md5))
+
+        returnValue(response)
+
+    @inlineCallbacks
+    def doSourceDelete(self):
+        # Delete the source resource
+        yield self.source.storeRemove(self.request, self.source_uri)
+        log.debug("Source removed %s" % (self.source,))
         returnValue(None)
 
     @inlineCallbacks
@@ -509,51 +408,6 @@
 
         returnValue(None)
 
-    def doSourceIndexRecover(self):
-        """
-        Do source resource indexing. This only gets called when restoring
-        the source after its index has been deleted.
-        
-        @return: None if successful, ErrorResponse on failure
-        """
-        
-        # Add or update the index for this resource.
-        self.source_index.addResource(self.source.fp.basename(), self.vcard, self.newrevision)
-
-    def doDestinationIndex(self, vcardtoindex):
-        """
-        Do destination resource indexing, replacing any index previous stored.
-        
-        @return: None if successful, ErrorResponse on failure
-        """
-        
-        # Delete index for original item
-        if self.overwrite:
-            self.doRemoveDestinationIndex()
-        
-        # Add or update the index for this resource.
-        try:
-            self.destination_index.addResource(self.destination.fp.basename(), vcardtoindex, self.newrevision)
-            log.debug("Destination indexed %s" % (self.destination.fp.path,))
-        except (ValueError, TypeError), ex:
-            msg = "Cannot index vcard resource: %s" % (ex,)
-            log.err(msg)
-            raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (carddav_namespace, "valid-address-data"), description=msg))
-
-        self.destination.writeDeadProperty(davxml.GETContentType.fromString("text/vcard"))
-        return None
-
-    def doRemoveDestinationIndex(self):
-        """
-        Remove any existing destination index.
-        """
-        
-        # Delete index for original item
-        if self.destinationadbk:
-            self.destination_index.deleteResource(self.destination.fp.basename(), None)
-            self.rollback.destination_index_deleted = True
-            log.debug("Destination index removed %s" % (self.destination.fp.path,))
-
     @inlineCallbacks
     def run(self):
         """
@@ -572,7 +426,9 @@
             if self.destinationadbk:    
                 # Reserve UID
                 self.destination_index = self.destinationparent.index()
-                reservation = StoreAddressObjectResource.UIDReservation(self.destination_index, self.uid, self.destination_uri)
+                reservation = StoreAddressObjectResource.UIDReservation(
+                    self.destination_index, self.uid, self.destination_uri
+                )
                 if self.indexdestination:
                     yield reservation.reserve()
             
@@ -588,38 +444,19 @@
             # Get current quota state.
             yield self.checkQuota()
 
-            # Initialize the rollback system
-            self.setupRollback()
-
-            """
-            Handle actual store operations here.
-            
-            The order in which this is done is import:
-                
-                1. Do store operation for new data
-                2. Delete source and source index if needed
-                3. Do new indexing if needed
-                
-            Note that we need to remove the source index BEFORE doing the destination index to cover the
-            case of a resource being 'renamed', i.e. moved within the same collection. Since the index UID
-            column must be unique in SQL, we cannot add the new index before remove the old one.
-            """
-    
             # Do the actual put or copy
             response = (yield self.doStore())
             
-            # Delete the original source if needed.
-            if self.deletesource:
-                yield self.doSourceDelete()
-    
-            # Index the new resource if storing to a vcard.
+            # Remember the resource's content-type.
             if self.destinationadbk:
-                self.newrevision = (yield self.destinationparent.bumpSyncToken())
-                result = self.doDestinationIndex(self.vcard)
-                if result is not None:
-                    self.rollback.Rollback()
-                    returnValue(result)
-    
+                content_type = self.request.headers.getHeader("content-type")
+                if content_type is None:
+                    content_type = MimeType("text", "vcard",
+                                            params={"charset":"utf-8"})
+                self.destination.writeDeadProperty(
+                    davxml.GETContentType.fromString(generateContentType(content_type))
+                )
+
             # Delete the original source if needed.
             if self.deletesource:
                 yield self.doSourceQuotaCheck()
@@ -628,21 +465,16 @@
             if self.destquota is not None:
                 yield self.doDestinationQuotaCheck()
     
-            # Can now commit changes and forget the rollback details
-            self.rollback.Commit()
-    
             if reservation:
                 yield reservation.unreserve()
     
             returnValue(response)
     
         except Exception, err:
+
             if reservation:
                 yield reservation.unreserve()
     
-            # Roll back changes to original server state. Note this may do nothing
-            # if the rollback has already occurred or changes already committed.
-            if self.rollback:
-                self.rollback.Rollback()
+            # FIXME: transaction needs to be rolled back.
 
             raise err

Modified: CalendarServer/trunk/twistedcaldav/method/put_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/put_common.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/put_common.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -21,23 +21,22 @@
 
 __all__ = ["StoreCalendarObjectResource"]
 
-import os
 import types
 import uuid
 
 from twisted.internet import reactor
 from twisted.internet.defer import Deferred, inlineCallbacks, succeed
 from twisted.internet.defer import returnValue
-from twisted.python import failure
-from twext.python.filepath import CachingFilePath as FilePath
+from twisted.python.failure import Failure
+
+from twext.web2.dav.util import joinURL, parentForURL
 from twext.web2 import responsecode
 from twext.web2.dav import davxml
 from twext.web2.dav.element.base import dav_namespace
 from twext.web2.dav.element.base import PCDATAElement
-from twext.web2.dav.fileop import delete
+
 from twext.web2.dav.resource import TwistedGETContentMD5
 from twext.web2.dav.stream import MD5StreamWrapper
-from twext.web2.dav.util import joinURL, parentForURL
 from twext.web2.http import HTTPError
 from twext.web2.http import StatusResponse
 from twext.web2.http_headers import generateContentType, MimeType
@@ -48,7 +47,7 @@
 from twext.web2.dav.http import ErrorResponse
 
 from twistedcaldav.config import config
-from twistedcaldav.caldavxml import NoUIDConflict, ScheduleTag
+from twistedcaldav.caldavxml import ScheduleTag, NoUIDConflict
 from twistedcaldav.caldavxml import NumberOfRecurrencesWithinLimits
 from twistedcaldav.caldavxml import caldav_namespace, MaxAttendeesPerInstance
 from twistedcaldav.customxml import calendarserver_namespace ,\
@@ -56,98 +55,18 @@
     TwistedScheduleMatchETags
 from twistedcaldav.customxml import TwistedCalendarAccessProperty
 from twistedcaldav.datafilters.peruserdata import PerUserDataFilter
-from twistedcaldav.fileops import copyToWithXAttrs, copyXAttrs
-from twistedcaldav.fileops import putWithXAttrs
-from twistedcaldav.fileops import copyWithXAttrs
+
 from twistedcaldav.ical import Component, Property
 from twistedcaldav.index import ReservationError
 from twistedcaldav.instance import TooManyInstancesError,\
     InvalidOverriddenInstanceError
 from twistedcaldav.memcachelock import MemcacheLock, MemcacheLockTimeoutError
-from twistedcaldav.method.delete_common import DeleteResource
 from twistedcaldav.scheduling.implicit import ImplicitScheduler
 
 log = Logger()
 
 class StoreCalendarObjectResource(object):
-    
-    class RollbackState(object):
-        """
-        This class encapsulates the state needed to rollback the entire PUT/COPY/MOVE
-        transaction, leaving the server state the same as it was before the request was
-        processed. The DoRollback method will actually execute the rollback operations.
-        """
-        
-        def __init__(self, storer):
-            self.storer = storer
-            self.active = True
-            self.source_copy = None
-            self.destination_copy = None
-            self.destination_created = False
-            self.source_deleted = False
-            self.source_index_deleted = False
-            self.destination_index_deleted = False
-        
-        def Rollback(self):
-            """
-            Rollback the server state. Do not allow this to raise another exception. If
-            rollback fails then we are going to be left in an awkward state that will need
-            to be cleaned up eventually.
-            """
-            if self.active:
-                self.active = False
-                log.debug("Rollback: rollback")
-                try:
-                    if self.source_copy and self.source_deleted:
-                        self.source_copy.moveTo(self.storer.source.fp)
-                        log.debug("Rollback: source restored %s to %s" % (self.source_copy.path, self.storer.source.fp.path))
-                        self.source_copy = None
-                        self.source_deleted = False
-                    if self.destination_copy:
-                        self.storer.destination.fp.remove()
-                        log.debug("Rollback: destination restored %s to %s" % (self.destination_copy.path, self.storer.destination.fp.path))
-                        self.destination_copy.moveTo(self.storer.destination.fp)
-                        self.destination_copy = None
-                    elif self.destination_created:
-                        if self.storer.destinationcal:
-                            self.storer.doRemoveDestinationIndex()
-                            log.debug("Rollback: destination index removed %s" % (self.storer.destination.fp.path,))
-                            self.destination_index_deleted = False
-                        self.storer.destination.fp.remove()
-                        log.debug("Rollback: destination removed %s" % (self.storer.destination.fp.path,))
-                        self.destination_created = False
-                    if self.destination_index_deleted:
-                        # Must read in calendar for destination being re-indexed
-                        self.storer.doDestinationIndex(self.storer.destination.iCalendar())
-                        self.destination_index_deleted = False
-                        log.debug("Rollback: destination re-indexed %s" % (self.storer.destination.fp.path,))
-                    if self.source_index_deleted:
-                        self.storer.doSourceIndexRecover()
-                        self.destination_index_deleted = False
-                        log.debug("Rollback: source re-indexed %s" % (self.storer.source.fp.path,))
-                except:
-                    log.err("Rollback: exception caught and not handled: %s" % failure.Failure())
 
-        def Commit(self):
-            """
-            Commit the resource changes by wiping the rollback state.
-            """
-            if self.active:
-                log.debug("Rollback: commit")
-                self.active = False
-                if self.source_copy:
-                    self.source_copy.remove()
-                    log.debug("Rollback: removed source backup %s" % (self.source_copy.path,))
-                    self.source_copy = None
-                if self.destination_copy:
-                    self.destination_copy.remove()
-                    log.debug("Rollback: removed destination backup %s" % (self.destination_copy.path,))
-                    self.destination_copy = None
-                self.destination_created = False
-                self.source_deleted = False
-                self.source_index_deleted = False
-                self.destination_index_deleted = False
-
     class UIDReservation(object):
         
         def __init__(self, index, uid, uri, internal_request):
@@ -254,7 +173,7 @@
             log.err("deletesource=%s\n" % (deletesource,))
             log.err("isiTIP=%s\n" % (isiTIP,))
             raise
-    
+
         self.request = request
         self.sourcecal = sourcecal
         self.destinationcal = destinationcal
@@ -271,11 +190,10 @@
         self.allowImplicitSchedule = allowImplicitSchedule
         self.internal_request = internal_request
         self.processing_organizer = processing_organizer
-        
-        self.rollback = None
+
         self.access = None
-        self.newrevision = None
 
+
     @inlineCallbacks
     def fullValidation(self):
         """
@@ -362,9 +280,9 @@
             else:
                 # Get UID from original resource
                 self.source_index = self.sourceparent.index()
-                self.uid = self.source_index.resourceUIDForName(self.source.fp.basename())
+                self.uid = self.source_index.resourceUIDForName(self.source.name())
                 if self.uid is None:
-                    log.err("Source calendar does not have a UID: %s" % self.source.fp.basename())
+                    log.err("Source calendar does not have a UID: %s" % self.source)
                     raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (caldav_namespace, "valid-calendar-object-resource")))
 
                 # FIXME: We need this here because we have to re-index the destination. Ideally it
@@ -409,34 +327,30 @@
         """
         Check for If-ScheduleTag-Match header behavior.
         """
-        
         # Only when a direct request
         self.schedule_tag_match = False
         if not self.isiTIP and not self.internal_request:
             header = self.request.headers.getHeader("If-Schedule-Tag-Match")
             if header:
-                # Do "precondition" test
-                
-                # If COPY/MOVE get Schedule-Tag on source, else use destination
-                def _getScheduleTag(resource):
-                    return resource.readDeadProperty(ScheduleTag) if resource.exists() and resource.hasDeadProperty(ScheduleTag) else None
-
-                scheduletag = _getScheduleTag(self.source if self.source else self.destination)
-                if scheduletag != header:
-                    log.debug("If-Schedule-Tag-Match: header value '%s' does not match resource value '%s'" % (header, scheduletag,))
-                    raise HTTPError(responsecode.PRECONDITION_FAILED)
+                # If COPY/MOVE get Schedule-Tag on source, PUT use destination
+                if self.source:
+                    matcher = self.source
+                    self.source.validIfScheduleMatch(self.request)
+                else:
+                    matcher = self.destination
+                matcher.validIfScheduleMatch(self.request)
                 self.schedule_tag_match = True
-            
             elif config.Scheduling.CalDAV.ScheduleTagCompatibility:
                 # Compatibility with old clients. Policy:
                 #
                 # 1. If If-Match header is not present, never do smart merge.
-                # 2. If If-Match is present and the specified ETag is considered a "weak" match to the
-                #    current Schedule-Tag, then do smart merge, else reject with a 412.
+                # 2. If If-Match is present and the specified ETag is
+                #    considered a "weak" match to the current Schedule-Tag,
+                #    then do smart merge, else reject with a 412.
                 #
-                # Actually by the time we get here the pre-condition will already have been tested and found to be OK,
-                # so we can just always do smart merge now if If-Match is present.
-
+                # Actually by the time we get here the pre-condition will
+                # already have been tested and found to be OK, so we can just
+                # always do smart merge now if If-Match is present.
                 self.schedule_tag_match = self.request.headers.getHeader("If-Match") is not None
 
     def validResourceName(self):
@@ -445,7 +359,7 @@
         """
         result = True
         message = ""
-        filename = self.destination.fp.basename()
+        filename = self.destination.name()
         if filename.startswith("."):
             result = False
             message = "File name %s not allowed in calendar collection" % (filename,)
@@ -585,48 +499,7 @@
                 
         return succeed(None)
 
-    def noUIDConflict(self, uid):
-        """
-        Check that the UID of the new calendar object conforms to the requirements of
-        CalDAV, i.e. it must be unique in the collection and we must not overwrite a
-        different UID.
-        @param uid: the UID for the resource being stored.
-        @return: tuple: (True/False if the UID is valid, log message string,
-            name of conflicted resource).
-        """
 
-        result = True
-        message = ""
-        rname = ""
-
-        # Adjust for a move into same calendar collection
-        oldname = None
-        if self.sourceparent and (self.sourceparent.fp.path == self.destinationparent.fp.path) and self.deletesource:
-            oldname = self.source.fp.basename()
-
-        # UID must be unique
-        index = self.destinationparent.index()
-        if not index.isAllowedUID(uid, oldname, self.destination.fp.basename()):
-            rname = index.resourceNameForUID(uid)
-            # This can happen if two simultaneous PUTs occur with the same UID.
-            # i.e. one PUT has reserved the UID but has not yet written the resource,
-            # the other PUT tries to reserve and fails but no index entry exists yet.
-            if rname is None:
-                rname = "<<Unknown Resource>>"
-            
-            result = False
-            message = "Calendar resource %s already exists with same UID %s" % (rname, uid)
-        else:
-            # Cannot overwrite a resource with different UID
-            if self.destination.fp.exists():
-                olduid = index.resourceUIDForName(self.destination.fp.basename())
-                if olduid != uid:
-                    rname = self.destination.fp.basename()
-                    result = False
-                    message = "Cannot overwrite calendar resource %s with different UID %s" % (rname, olduid)
-        
-        return result, message, rname
-
     @inlineCallbacks
     def checkQuota(self):
         """
@@ -656,32 +529,7 @@
 
         returnValue(None)
 
-    def setupRollback(self):
-        """
-        We may need to restore the original resource data if the PUT/COPY/MOVE fails,
-        so rename the original file in case we need to rollback.
-        """
 
-        def _createRollbackPath(path):
-            parent, child = os.path.split(path)
-            child = "." + child + ".rollback"
-            return os.path.join(parent, child)
-
-        self.rollback = StoreCalendarObjectResource.RollbackState(self)
-        self.overwrite = self.destination.exists()
-        if self.overwrite:
-            self.rollback.destination_copy = FilePath(_createRollbackPath(self.destination.fp.path))
-            copyToWithXAttrs(self.destination.fp, self.rollback.destination_copy)
-            log.debug("Rollback: backing up destination %s to %s" % (self.destination.fp.path, self.rollback.destination_copy.path))
-        else:
-            self.rollback.destination_created = True
-            log.debug("Rollback: will create new destination %s" % (self.destination.fp.path,))
-
-        if self.deletesource:
-            self.rollback.source_copy = FilePath(_createRollbackPath(self.source.fp.path))
-            copyToWithXAttrs(self.source.fp, self.rollback.source_copy)
-            log.debug("Rollback: backing up source %s to %s" % (self.source.fp.path, self.rollback.source_copy.path))
-
     def truncateRecurrence(self):
         
         if config.MaxInstancesForRRULE != 0:
@@ -724,6 +572,50 @@
         
         returnValue(new_has_private_comments)
 
+
+    def noUIDConflict(self, uid): 
+        """ 
+        Check that the UID of the new calendar object conforms to the requirements of 
+        CalDAV, i.e. it must be unique in the collection and we must not overwrite a 
+        different UID. 
+        @param uid: the UID for the resource being stored. 
+        @return: tuple: (True/False if the UID is valid, log message string, 
+            name of conflicted resource). 
+        """ 
+        
+        result = True 
+        message = "" 
+        rname = "" 
+        
+        # Adjust for a move into same calendar collection 
+        oldname = None 
+        if self.sourceparent and (self.sourceparent == self.destinationparent) and self.deletesource: 
+            oldname = self.source.name() 
+        
+        # UID must be unique 
+        index = self.destinationparent.index() 
+        if not index.isAllowedUID(uid, oldname, self.destination.name()): 
+            rname = index.resourceNameForUID(uid) 
+            # This can happen if two simultaneous PUTs occur with the same UID. 
+            # i.e. one PUT has reserved the UID but has not yet written the resource, 
+            # the other PUT tries to reserve and fails but no index entry exists yet. 
+            if rname is None: 
+                rname = "<<Unknown Resource>>" 
+            result = False 
+            message = "Calendar resource %s already exists with same UID %s" % (rname, uid) 
+        else: 
+            # Cannot overwrite a resource with different UID 
+            if self.destination.exists(): 
+                olduid = index.resourceUIDForName(self.destination.name()) 
+                if olduid != uid: 
+                    rname = self.destination.name() 
+                    result = False 
+                    message = "Cannot overwrite calendar resource %s with different UID %s" % (rname, olduid) 
+         
+        return result, message, rname 
+
+
+
     @inlineCallbacks
     def doImplicitScheduling(self):
 
@@ -831,12 +723,26 @@
         yield self.mergePerUserData()
 
         # Do put or copy based on whether source exists
-        if self.source is not None:
+        source = self.source
+        if source is not None:
+            # Retrieve information from the source, in case we have to delete
+            # it.
+            sourceProperties = dict(source.newStoreProperties().iteritems())
+            if not implicit:
+                # Only needed in implicit case; see below.
+                sourceText = source.iCalendarText()
+
+            # Delete the original source if needed (for example, if this is a
+            # same-calendar MOVE of a calendar object, implemented as an
+            # effective DELETE-then-PUT).
+            if self.deletesource:
+                yield self.doSourceDelete()
+
             if implicit:
                 response = (yield self.doStorePut())
-                copyXAttrs(self.source.fp, self.destination.fp)
             else:
-                response = (yield copyWithXAttrs(self.source.fp, self.destination.fp, self.destination_uri))
+                response = (yield self.destination.storeStream(MemoryStream(sourceText)))
+            self.destination.newStoreProperties().update(sourceProperties)
         else:
             response = (yield self.doStorePut())
     
@@ -858,7 +764,7 @@
         if self.calendardata is None:
             self.calendardata = str(self.calendar)
         md5 = MD5StreamWrapper(MemoryStream(self.calendardata))
-        response = (yield putWithXAttrs(md5, self.destination.fp))
+        response = yield self.destination.storeStream(md5)
 
         # Finish MD5 calculation and write dead property
         md5.close()
@@ -869,18 +775,9 @@
 
     @inlineCallbacks
     def doSourceDelete(self):
-        # Delete index for original item
-        if self.sourcecal:
-            self.newrevision = (yield self.sourceparent.bumpSyncToken())
-            self.source_index.deleteResource(self.source.fp.basename(), self.newrevision)
-            self.rollback.source_index_deleted = True
-            log.debug("Source index removed %s" % (self.source.fp.path,))
-
         # Delete the source resource
-        delete(self.source_uri, self.source.fp, "0")
-        self.rollback.source_deleted = True
-        log.debug("Source removed %s" % (self.source.fp.path,))
-  
+        yield self.source.storeRemove(self.request, False, self.source_uri)
+        log.debug("Source removed %s" % (self.source,))
         returnValue(None)
 
     @inlineCallbacks
@@ -906,68 +803,7 @@
 
         returnValue(None)
 
-    def doSourceIndexRecover(self):
-        """
-        Do source resource indexing. This only gets called when restoring
-        the source after its index has been deleted.
-        
-        @return: None if successful, ErrorResponse on failure
-        """
-        
-        # Add or update the index for this resource.
-        try:
-            self.source_index.addResource(self.source.fp.basename(), self.calendar, self.newrevision)
-        except TooManyInstancesError, ex:
-            raise HTTPError(ErrorResponse(
-                responsecode.FORBIDDEN,
-                    NumberOfRecurrencesWithinLimits(PCDATAElement(str(ex.max_allowed)))
-                ))
-            return None
 
-    def doDestinationIndex(self, caltoindex):
-        """
-        Do destination resource indexing, replacing any index previous stored.
-        
-        @return: None if successful, ErrorResponse on failure
-        """
-        
-        # Delete index for original item
-        if self.overwrite:
-            self.doRemoveDestinationIndex()
-        
-        # Add or update the index for this resource.
-        try:
-            self.destination_index.addResource(self.destination.fp.basename(), caltoindex, self.newrevision)
-            log.debug("Destination indexed %s" % (self.destination.fp.path,))
-        except TooManyInstancesError, ex:
-            log.err("Cannot index calendar resource as there are too many recurrence instances %s" % self.destination)
-            raise HTTPError(ErrorResponse(
-                responsecode.FORBIDDEN,
-                NumberOfRecurrencesWithinLimits(PCDATAElement(str(ex.max_allowed)))
-            ))
-        except (ValueError, TypeError), ex:
-            msg = "Cannot index calendar resource: %s" % (ex,)
-            log.err(msg)
-            raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (caldav_namespace, "valid-calendar-data"), description=msg))
-
-        content_type = self.request.headers.getHeader("content-type")
-        if not self.internal_request and content_type is not None:
-            self.destination.writeDeadProperty(davxml.GETContentType.fromString(generateContentType(content_type)))
-        else:
-            self.destination.writeDeadProperty(davxml.GETContentType.fromString(generateContentType(MimeType("text", "calendar", params={"charset":"utf-8"}))))
-        return None
-
-    def doRemoveDestinationIndex(self):
-        """
-        Remove any existing destination index.
-        """
-        
-        # Delete index for original item
-        if self.destinationcal:
-            self.destination_index.deleteResource(self.destination.fp.basename(), None)
-            self.rollback.destination_index_deleted = True
-            log.debug("Destination index removed %s" % (self.destination.fp.path,))
-
     @inlineCallbacks
     def run(self):
         """
@@ -978,30 +814,34 @@
 
         try:
             reservation = None
-            
+
             # Handle all validation operations here.
             yield self.fullValidation()
 
             # Reservation and UID conflict checking is next.
-            if self.destinationcal:    
+            if self.destinationcal:
                 # Reserve UID
                 self.destination_index = self.destinationparent.index()
-                reservation = StoreCalendarObjectResource.UIDReservation(self.destination_index, self.uid, self.destination_uri, self.internal_request or self.isiTIP)
+                reservation = StoreCalendarObjectResource.UIDReservation(
+                    self.destination_index, self.uid, self.destination_uri,
+                    self.internal_request or self.isiTIP
+                )
                 yield reservation.reserve()
-            
-                # UID conflict check - note we do this after reserving the UID to avoid a race condition where two requests
-                # try to write the same calendar data to two different resource URIs.
-                if not self.isiTIP:
-                    result, message, rname = self.noUIDConflict(self.uid)
-                    if not result:
+                # UID conflict check - note we do this after reserving the UID to avoid a race condition where two requests 
+                # try to write the same calendar data to two different resource URIs. 
+                if not self.isiTIP: 
+                    result, message, rname = self.noUIDConflict(self.uid) 
+                    if not result: 
                         log.err(message)
                         raise HTTPError(ErrorResponse(responsecode.FORBIDDEN,
-                            NoUIDConflict(davxml.HRef.fromString(joinURL(parentForURL(self.destination_uri), rname.encode("utf-8"))))
-                        ))
-            
+                            NoUIDConflict(davxml.HRef.fromString(
+                                joinURL(parentForURL(self.destination_uri),
+                                        rname.encode("utf-8"))))))
+
+
             # Get current quota state.
             yield self.checkQuota()
-    
+
             # Handle RRULE truncation
             rruleChanged = self.truncateRecurrence()
 
@@ -1023,8 +863,7 @@
             
                     # Now forcibly delete the event
                     if self.destination.exists():
-                        deleter = DeleteResource(self.request, self.destination, self.destination_uri, self.destinationparent, "0", internal_request=True)
-                        yield deleter.run()
+                        yield self.destination.storeRemove(self.request, False, self.destination_uri)
                     else:
                         msg = "Attendee cannot create event for Organizer: %s" % (implicit_result,)
                         log.err(msg)
@@ -1039,26 +878,9 @@
             else:
                 is_scheduling_resource, data_changed, did_implicit_action = implicit_result
 
-            # Initialize the rollback system
-            self.setupRollback()
-
-            """
-            Handle actual store operations here.
-            
-            The order in which this is done is import:
-                
-                1. Do store operation for new data
-                2. Delete source and source index if needed
-                3. Do new indexing if needed
-                
-            Note that we need to remove the source index BEFORE doing the destination index to cover the
-            case of a resource being 'renamed', i.e. moved within the same collection. Since the index UID
-            column must be unique in SQL, we cannot add the new index before remove the old one.
-            """
-    
             # Do the actual put or copy
             response = (yield self.doStore(data_changed))
-            
+
             # Must not set ETag in response if data changed
             if did_implicit_action or rruleChanged:
                 def _removeEtag(request, response):
@@ -1125,18 +947,16 @@
                 elif not self.destinationcal:
                     self.destination.removeDeadProperty(TwistedCalendarHasPrivateCommentsProperty)                
 
-            # Delete the original source if needed.
-            if self.deletesource:
-                yield self.doSourceDelete()
-    
-            # Index the new resource if storing to a calendar.
+            # Remember the resource's content-type.
             if self.destinationcal:
-                self.newrevision = (yield self.destinationparent.bumpSyncToken())
-                result = self.doDestinationIndex(self.calendar)
-                if result is not None:
-                    self.rollback.Rollback()
-                    returnValue(result)
-    
+                content_type = self.request.headers.getHeader("content-type")
+                if self.internal_request or content_type is None:
+                    content_type = MimeType("text", "calendar",
+                                            params={"charset":"utf-8"})
+                self.destination.writeDeadProperty(
+                    davxml.GETContentType.fromString(generateContentType(content_type))
+                )
+
             # Delete the original source if needed.
             if self.deletesource:
                 yield self.doSourceQuotaCheck()
@@ -1145,22 +965,20 @@
             if self.destquota is not None:
                 yield self.doDestinationQuotaCheck()
     
-            # Can now commit changes and forget the rollback details
-            self.rollback.Commit()
-    
             if reservation:
                 yield reservation.unreserve()
     
             returnValue(response)
     
         except Exception, err:
+            # Preserve the real traceback to display later, since the error-
+            # handling here yields out of the generator and thereby shreds the
+            # stack.
+            f = Failure()
             if reservation:
                 yield reservation.unreserve()
     
-            # Roll back changes to original server state. Note this may do nothing
-            # if the rollback has already occurred or changes already committed.
-            if self.rollback:
-                self.rollback.Rollback()
+            # FIXME: transaction needs to be rolled back.
 
             if isinstance(err, InvalidOverriddenInstanceError):
                 raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (caldav_namespace, "valid-calendar-data"), description="Invalid overridden instance"))
@@ -1170,4 +988,9 @@
                         NumberOfRecurrencesWithinLimits(PCDATAElement(str(err.max_allowed)))
                     ))
             else:
+                # Display the traceback.  Unfortunately this will usually be
+                # duplicated by the higher-level exception handler that captures
+                # the thing that raises here, but it's better than losing the
+                # information.
+                f.printTraceback()
                 raise err

Modified: CalendarServer/trunk/twistedcaldav/method/report.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/report.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/report.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -47,8 +47,8 @@
     """
     Respond to a REPORT request. (RFC 3253, section 3.6)
     """
-    if not self.fp.exists():
-        log.err("File not found: %s" % (self.fp.path,))
+    if not self.exists():
+        log.err("Resource not found: %s" % (self,))
         raise HTTPError(responsecode.NOT_FOUND)
 
     #

Modified: CalendarServer/trunk/twistedcaldav/method/report_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/report_common.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/method/report_common.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -557,10 +557,6 @@
     
                 if calendar.mainType() == "VEVENT":
                     processEventFreeBusy(calendar, fbinfo, timerange, tzinfo)
-                    
-                    # Lets also force an index rebuild for this resource so that next time we have the fbtype set
-                    calresource.index().addResource(name, calendar, None, reCreate=True)
-
                 elif calendar.mainType() == "VFREEBUSY":
                     processFreeBusyFreeBusy(calendar, fbinfo, timerange)
                 elif calendar.mainType() == "VAVAILABILITY":

Modified: CalendarServer/trunk/twistedcaldav/resource.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/resource.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/resource.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,3 +1,4 @@
+# -*- test-case-name: twistedcaldav.test.test_resource -*-
 ##
 # Copyright (c) 2005-2010 Apple Inc. All rights reserved.
 #
@@ -39,7 +40,7 @@
 from twext.web2.dav.http import ErrorResponse
 
 from twisted.internet import reactor
-from twisted.internet.defer import Deferred, succeed
+from twisted.internet.defer import Deferred, succeed, maybeDeferred
 from twisted.internet.defer import inlineCallbacks, returnValue
 from twext.web2 import responsecode
 from twext.web2.dav import davxml
@@ -72,6 +73,7 @@
 from twistedcaldav.sharing import SharedCollectionMixin
 from twistedcaldav.vcard import Component as vComponent
 
+from txdav.common.icommondatastore import InternalDataStoreError
 
 ##
 # Sharing Conts
@@ -156,6 +158,108 @@
         return super(CalDAVResource, self).render(request)
 
 
+    _associatedTransaction = None
+    _transactionError = False
+
+    def associateWithTransaction(self, transaction):
+        """
+        Associate this resource with a L{txcaldav.idav.ITransaction}; when this
+        resource (or any of its children) are rendered successfully, commit the
+        transaction.  Otherwise, abort the transaction.
+
+        @param transaction: the transaction to associate this resource and its
+            children with.
+
+        @type transaction: L{txcaldav.idav.ITransaction} 
+        """
+        # FIXME: needs to reject association with transaction if it's already
+        # got one (resources associated with a transaction are not reusable)
+        self._associatedTransaction = transaction
+
+
+    def propagateTransaction(self, otherResource):
+        """
+        Propagate the transaction associated with this resource to another
+        resource (which should ostensibly be a child resource).
+
+        @param otherResource: Another L{CalDAVResource}, usually one being
+            constructed as a child of this one.
+
+        @type otherResource: L{CalDAVResource} (or a subclass thereof)
+        """
+        if not self._associatedTransaction:
+            raise RuntimeError("No associated transaction to propagate")
+        otherResource.associateWithTransaction(self._associatedTransaction)
+
+
+    def transactionError(self):
+        self._transactionError = True
+
+
+    def renderHTTP(self, request):
+        """
+        Override C{renderHTTP} to commit the transaction when the resource is
+        successfully rendered.
+
+        @param request: the request to generate a response for.
+        @type request: L{twext.web2.iweb.IRequest}
+        """
+        d = maybeDeferred(super(CalDAVResource, self).renderHTTP, request)
+        def succeeded(result):
+            if self._associatedTransaction is not None:
+                if self._transactionError:
+                    self._associatedTransaction.abort()
+                else:
+                    self._associatedTransaction.commit()
+            return result
+        return d.addCallback(succeeded)
+
+
+    # Begin transitional new-store resource interface:
+
+    def copyDeadPropertiesTo(self, other):
+        """
+        Copy this resource's dead properties to another resource.  This requires
+        that the new resource have a back-end store.
+
+        @param other: a resource to copy all properites to.
+        @type other: subclass of L{CalDAVResource}
+        """
+        self.newStoreProperties().update(other.newStoreProperties())
+
+
+    def newStoreProperties(self):
+        """
+        Return an L{IMapping} that represents properties.  Only available on
+        new-storage objects.
+        """
+        raise NotImplementedError("%s does not implement newStoreProperties" %
+                                  (self,))
+        
+    
+    def storeRemove(self, *a, **kw):
+        """
+        Remove this resource from storage.
+        """
+        raise NotImplementedError("%s does not implement storeRemove" %
+                                  (self,))
+
+
+    def storeStream(self, stream):
+        """
+        Store the content of the stream in this resource, as it would via a PUT.
+
+        @param stream: The stream containing the data to be stored.
+        @type stream: L{IStream}
+        
+        @return: a L{Deferred} which fires with an HTTP response.
+        @rtype: L{Deferred}
+        """
+        raise NotImplementedError("%s does not implement storeStream"  %
+                                  (self,))
+
+    # End transitional new-store interface 
+
     ##
     # WebDAV
     ##
@@ -776,11 +880,13 @@
         def gotChild(child, childpath):
             if child.isSpecialCollection(type):
                 callback(child, childpath)
-            elif child.isCollection():
-                if depth == "infinity":
-                    fc = child.findSpecialCollections(type, depth, request, callback, privileges)
-                    fc.addCallback(lambda x: reactor.callLater(0, getChild))
-                    return fc
+                
+            # No more regular collections
+            #elif child.isCollection():
+            #    if depth == "infinity":
+            #        fc = child.findSpecialCollections(type, depth, request, callback, privileges)
+            #        fc.addCallback(lambda x: reactor.callLater(0, getChild))
+            #        return fc
 
             reactor.callLater(0, getChild)
 
@@ -890,7 +996,11 @@
         an infinite loop.  A subclass must override one of both of these
         methods.
         """
-        calendar_data = self.iCalendarText(name)
+        
+        try:
+            calendar_data = self.iCalendarText(name)
+        except InternalDataStoreError:
+            return None
 
         if calendar_data is None: return None
 
@@ -982,7 +1092,10 @@
         an infinite loop.  A subclass must override one of both of these
         methods.
         """
-        vcard_data = self.vCardText(name)
+        try:
+            vcard_data = self.vCardText(name)
+        except InternalDataStoreError:
+            return None
 
         if vcard_data is None: return None
 

Modified: CalendarServer/trunk/twistedcaldav/schedule.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/schedule.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/schedule.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,5 +1,6 @@
+# -*- test-case-name: twistedcaldav.directory.test.test_calendar -*-
 ##
-# Copyright (c) 2005-2007 Apple Inc. All rights reserved.
+# Copyright (c) 2005-2010 Apple Inc. All rights reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -36,7 +37,10 @@
 from twext.web2.http_headers import MimeType
 
 from twistedcaldav import caldavxml
-from twistedcaldav.caldavxml import caldav_namespace
+from twext.web2.dav.element.rfc2518 import HRef
+from txdav.propertystore.base import PropertyName
+from twistedcaldav.caldavxml import caldav_namespace, Opaque,\
+    CalendarFreeBusySet, ScheduleCalendarTransp
 from twistedcaldav.config import config
 from twistedcaldav.customxml import calendarserver_namespace
 from twistedcaldav.resource import CalDAVResource
@@ -122,7 +126,13 @@
         if qname == (caldav_namespace, "calendar-free-busy-set"):
             # Always return at least an empty list
             if not self.hasDeadProperty(property):
-                returnValue(caldavxml.CalendarFreeBusySet())
+                top = self.parent.url()
+                values = []
+                for cal in self.parent._newStoreCalendarHome.calendars():
+                    prop = cal.properties().get(PropertyName.fromString(ScheduleCalendarTransp.sname())) 
+                    if prop == ScheduleCalendarTransp(Opaque()):
+                        values.append(HRef(joinURL(top, cal.name())))
+                returnValue(CalendarFreeBusySet(*values))
         elif qname == (caldav_namespace, "schedule-default-calendar-URL"):
             # Must have a valid default
             try:
@@ -221,16 +231,30 @@
         First see if "calendar" exists in the calendar home and pick that. Otherwise
         create "calendar" in the calendar home.
         """
-        
         calendarHomeURL = self.parent.url()
-        defaultCalendarURL = (yield joinURL(calendarHomeURL, "calendar"))
+        defaultCalendarURL = joinURL(calendarHomeURL, "calendar")
         defaultCalendar = (yield request.locateResource(defaultCalendarURL))
         if defaultCalendar is None or not defaultCalendar.exists():
-            self.parent.provisionDefaultCalendars()
-        else:
-            self.writeDeadProperty(caldavxml.ScheduleDefaultCalendarURL(davxml.HRef(defaultCalendarURL)))
-        returnValue(caldavxml.ScheduleDefaultCalendarURL(davxml.HRef(defaultCalendarURL)))
+            getter = iter(self.parent._newStoreCalendarHome.calendars())
+            # FIXME: the back-end should re-provision a default calendar here.
+            # Really, the dead property shouldn't be necessary, and this should
+            # be entirely computed by a back-end method like 'defaultCalendar()'
+            try:
+                aCalendar = getter.next()
+            except StopIteration:
+                raise RuntimeError("No calendars at all.")
 
+            defaultCalendarURL = joinURL(calendarHomeURL, aCalendar.name())
+
+        self.writeDeadProperty(
+            caldavxml.ScheduleDefaultCalendarURL(
+                davxml.HRef(defaultCalendarURL)
+            )
+        )
+        returnValue(caldavxml.ScheduleDefaultCalendarURL(
+            davxml.HRef(defaultCalendarURL))
+        )
+
 class ScheduleOutboxResource (CalendarSchedulingCollectionResource):
     """
     CalDAV schedule Outbox resource.

Modified: CalendarServer/trunk/twistedcaldav/scheduling/implicit.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/implicit.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/scheduling/implicit.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -383,8 +383,8 @@
 
         # Get owner's calendar-home
         calendar_owner_principal = (yield self.resource.resourceOwnerPrincipal(self.request))
-        calendar_home = calendar_owner_principal.calendarHome()
-        
+        calendar_home = calendar_owner_principal.calendarHome(self.request)
+
         check_parent_uri = parentForURL(check_uri)[:-1] if check_uri else None
 
         # FIXME: because of the URL->resource request mapping thing, we have to force the request

Modified: CalendarServer/trunk/twistedcaldav/scheduling/processing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/processing.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/scheduling/processing.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -431,20 +431,27 @@
         # refresh them. To prevent a race we need a lock.
         lock = MemcacheLock("ImplicitUIDLock", calendar.resourceUID(), timeout=60.0)
 
+        # Note that this lock also protects the request, as this request is
+        # being re-used by potentially multiple transactions and should not be
+        # used concurrency (the locateResource cache needs to be cleared each
+        # time, by inNewTransaction). -glyph
         try:
             yield lock.acquire()
-
-            # Send out a reply
-            log.debug("ImplicitProcessing - recipient '%s' processing UID: '%s' - auto-reply: %s" % (self.recipient.cuaddr, self.uid, partstat))
-            from twistedcaldav.scheduling.implicit import ImplicitScheduler
-            scheduler = ImplicitScheduler()
-            yield scheduler.sendAttendeeReply(self.request, resource, calendar, self.recipient)
-
         except MemcacheLockTimeoutError:
-            
             # Just try again to get the lock
             reactor.callLater(2.0, self.sendAttendeeAutoReply, *(calendar, resource, partstat))
-    
+        else:
+            txn = resource.inNewTransaction(self.request)
+            try:
+                # Send out a reply
+                log.debug("ImplicitProcessing - recipient '%s' processing UID: '%s' - auto-reply: %s" % (self.recipient.cuaddr, self.uid, partstat))
+                from twistedcaldav.scheduling.implicit import ImplicitScheduler
+                scheduler = ImplicitScheduler()
+                yield scheduler.sendAttendeeReply(self.request, resource, calendar, self.recipient)
+            except:
+                txn.abort()
+            else:
+                txn.commit()
         finally:
             yield lock.clean()
 
@@ -652,14 +659,11 @@
         @param name: the resource name to write into, or {None} to write a new resource.
         @type name: C{str}
         """
-        
-        from twistedcaldav.method.delete_common import DeleteResource
         delchild = collection.getChild(name)
         childURL = joinURL(collURL, name)
         self.request._rememberResource(delchild, childURL)
+        yield delchild.storeRemove(self.request, False, childURL)
 
-        deleter = DeleteResource(self.request, delchild, childURL, collection, "0", internal_request=True)
-        yield deleter.run()
 
     def changeAttendeePartstat(self, attendees, partstat):
         """

Modified: CalendarServer/trunk/twistedcaldav/scheduling/utils.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/utils.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/scheduling/utils.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -33,7 +33,7 @@
 
     if principal and principal.locallyHosted():
         # Get principal's calendar-home
-        calendar_home = principal.calendarHome()
+        calendar_home = principal.calendarHome(request)
         
         # FIXME: because of the URL->resource request mapping thing, we have to force the request
         # to recognize this resource

Modified: CalendarServer/trunk/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/sharing.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/sharing.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -172,9 +172,9 @@
         
         # Get the home collection
         if self.isCalendarCollection():
-            home = principal.calendarHome()
+            home = principal.calendarHome(request)
         elif self.isAddressBookCollection():
-            home = principal.addressBookHome()
+            home = principal.addressBookHome(request)
         else:
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
@@ -206,6 +206,11 @@
         self._isVirtualShare = True
         self._shareePrincipal = shareePrincipal
         self._share = share
+        
+        if hasattr(self, "_newStoreCalendar"):
+            self._newStoreCalendar.setSharingUID(self._shareePrincipal.principalUID())
+        elif hasattr(self, "_newStoreAddressBook"):
+            self._newStoreAddressBook.setSharingUID(self._shareePrincipal.principalUID())
 
     def isVirtualShare(self, request):
         """ Return True if this is a shared calendar collection """
@@ -216,15 +221,21 @@
         
         # Remove from sharee's calendar/address book home
         if self.isCalendarCollection():
-            shareeHome = self._shareePrincipal.calendarHome()
+            shareeHome = self._shareePrincipal.calendarHome(request)
         elif self.isAddressBookCollection():
-            shareeHome = self._shareePrincipal.addressBookHome()
+            shareeHome = self._shareePrincipal.addressBookHome(request)
         return shareeHome.removeShare(request, self._share)
 
     @inlineCallbacks
     def resourceType(self, request):
-        
-        rtype = (yield super(SharedCollectionMixin, self).resourceType(request))
+        superObject = super(SharedCollectionMixin, self)
+        try:
+            superMethod = superObject.resourceType
+        except AttributeError:
+            rtype = davxml.ResourceType()
+        else:
+            rtype = (yield superMethod(request))
+
         isVirt = (yield self.isVirtualShare(request))
         if isVirt:
             rtype = davxml.ResourceType(
@@ -479,9 +490,9 @@
         sharee = self.principalForCalendarUserAddress(record.userid)
         if sharee:
             if self.isCalendarCollection():
-                shareeHome = sharee.calendarHome()
+                shareeHome = sharee.calendarHome(request)
             elif self.isAddressBookCollection():
-                shareeHome = sharee.addressBookHome()
+                shareeHome = sharee.addressBookHome(request)
             yield shareeHome.removeShareByUID(request, record.inviteuid)
     
             # If current user state is accepted then we send an invite with the new state, otherwise
@@ -513,11 +524,11 @@
         # Locate notifications collection for user
         sharee = self.principalForCalendarUserAddress(record.userid)
         if sharee is None:
-            raise ValueError("sharee is None but userid was valid before")
-        notifications = (yield request.locateResource(sharee.notificationURL()))
+            raise ValueError("sharee is None but userid was valid before")        
+        notifications = self._newStoreParentHome._transaction.notificationsWithUID(sharee.principalUID())
         
         # Look for existing notification
-        oldnotification = (yield notifications.getNotifictionMessageByUID(request, record.inviteuid))
+        oldnotification = notifications.notificationObjectWithUID(record.inviteuid)
         if oldnotification:
             # TODO: rollup changes?
             pass
@@ -545,7 +556,7 @@
         ).toxml()
         
         # Add to collections
-        yield notifications.addNotification(request, record.inviteuid, xmltype, xmldata)
+        notifications.writeNotificationObject(record.inviteuid, xmltype, xmldata)
 
     @inlineCallbacks
     def removeInvite(self, record, request):

Modified: CalendarServer/trunk/twistedcaldav/static.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/static.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/static.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,3 +1,4 @@
+# -*- test-case-name: twistedcaldav.test -*-
 ##
 # Copyright (c) 2005-2010 Apple Inc. All rights reserved.
 #
@@ -57,7 +58,7 @@
 from twext.web2.dav import davxml
 from twext.web2.dav.element.base import dav_namespace
 from twext.web2.dav.fileop import mkcollection, rmdir
-from twext.web2.dav.http import ErrorResponse
+from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
 from twext.web2.dav.idav import IDAVResource
 from twext.web2.dav.method import put_common, delete_common
 from twext.web2.dav.noneprops import NonePropertyStore
@@ -65,6 +66,7 @@
 from twext.web2.dav.resource import davPrivilegeSet
 from twext.web2.dav.util import parentForURL, bindMethods, joinURL
 from twext.web2.http_headers import generateContentType, MimeType
+from txdav.idav import AlreadyFinishedError
 
 from twistedcaldav import caldavxml
 from twistedcaldav import carddavxml
@@ -74,10 +76,12 @@
 from twistedcaldav.config import config
 from twistedcaldav.customxml import TwistedCalendarAccessProperty, TwistedScheduleMatchETags
 from twistedcaldav.datafilters.peruserdata import PerUserDataFilter
+from twistedcaldav.directory.internal import InternalDirectoryRecord
+from twistedcaldav.directory.util import NotFilePath
 from twistedcaldav.extensions import DAVFile, CachingPropertyStore
 from twistedcaldav.linkresource import LinkResource, LinkFollowerMixIn
 from twistedcaldav.memcachelock import MemcacheLock, MemcacheLockTimeoutError
-from twistedcaldav.memcacheprops import MemcachePropertyCollection
+
 from twistedcaldav.freebusyurl import FreeBusyURLResource
 from twistedcaldav.ical import Component as iComponent
 from twistedcaldav.ical import Property as iProperty
@@ -125,15 +129,17 @@
             (caldav_namespace, "calendar-collection-location-ok")
         )
 
+
+
 class CalDAVFile (LinkFollowerMixIn, CalDAVResource, DAVFile):
     """
     CalDAV-accessible L{DAVFile} resource.
     """
-    def __repr__(self):
-        if self.isCalendarCollection():
-            return "<%s (calendar collection): %s>" % (self.__class__.__name__, self.fp.path)
-        else:
-            return super(CalDAVFile, self).__repr__()
+#    def __repr__(self):
+#        if self.isCalendarCollection():
+#            return "<%s (calendar collection): %s>" % (self.__class__.__name__, self.fp.path)
+#        else:
+#            return super(CalDAVFile, self).__repr__()
 
     def __eq__(self, other):
         if not isinstance(other, CalDAVFile):
@@ -187,6 +193,9 @@
 
     def deadProperties(self, caching=True):
         if not hasattr(self, "_dead_properties"):
+            # FIXME: this code should actually be dead, as the property store
+            # should be initialized as part of the traversal process.
+ 
             # Get the property store from super
             deadProperties = super(CalDAVFile, self).deadProperties()
 
@@ -203,18 +212,27 @@
     ##
 
     def createCalendar(self, request):
-        #
-        # request object is required because we need to validate against parent
-        # resources, and we need the request in order to locate the parents.
-        #
+        """
+        External API for creating a calendar.  Verify that the parent is a
+        collection, exists, is I{not} a calendar collection; that this resource
+        does not yet exist, then create it.
 
+        @param request: the request used to look up parent resources to
+            validate.
+
+        @type request: L{twext.web2.iweb.IRequest}
+
+        @return: a deferred that fires when a calendar collection has been
+            created in this resource.
+        """
         if self.fp.exists():
             log.err("Attempt to create collection where file exists: %s" % (self.fp.path,))
             raise HTTPError(StatusResponse(responsecode.NOT_ALLOWED, "File exists"))
 
-        if not os.path.isdir(os.path.dirname(self.fp.path)):
-            log.err("Attempt to create collection with no parent: %s" % (self.fp.path,))
-            raise HTTPError(StatusResponse(responsecode.CONFLICT, "No parent collection"))
+        # newStore guarantees that we always have a parent calendar home
+        #if not self.fp.parent().isdir():
+        #    log.err("Attempt to create collection with no parent: %s" % (self.fp.path,))
+        #    raise HTTPError(StatusResponse(responsecode.CONFLICT, "No parent collection"))
 
         #
         # Verify that no parent collection is a calendar also
@@ -235,28 +253,22 @@
         parent.addCallback(_defer)
         return parent
 
+
     def createCalendarCollection(self):
-        #
-        # Create the collection once we know it is safe to do so
-        #
-        def onCalendarCollection(status):
-            if status != responsecode.CREATED:
-                raise HTTPError(status)
+        """
+        Internal API for creating a calendar collection.
 
-            # Initialize CTag on the calendar collection
-            d1 = self.bumpSyncToken()
+        This will immediately create the collection without performing any
+        verification.  For the normal API, see L{CalDAVFile.createCalendar}.
 
-            # Calendar is initially transparent to freebusy
-            self.writeDeadProperty(caldavxml.ScheduleCalendarTransp(caldavxml.Transparent()))
+        The default behavior is to return a failing Deferred; for a working
+        implementation, see L{twistedcaldav.legacy}.
 
-            # Create the index so its ready when the first PUTs come in
-            d1.addCallback(lambda _: self.index().create())
-            d1.addCallback(lambda _: status)
-            return d1
+        @return: a L{Deferred} which fires when the underlying collection has
+            actually been created.
+        """
+        return fail(NotImplementedError())
 
-        d = self.createSpecialCollection(davxml.ResourceType.calendar)
-        d.addCallback(onCalendarCollection)
-        return d
 
     def createSpecialCollection(self, resourceType=None):
         #
@@ -286,37 +298,39 @@
     def iCalendarRolledup(self, request):
         if self.isPseudoCalendarCollection():
 
+
+# FIXME: move cache implementation!
             # Determine the cache key
-            isvirt = (yield self.isVirtualShare(request))
-            if isvirt:
-                principal = (yield self.resourceOwnerPrincipal(request))
-                if principal:
-                    cacheKey = principal.principalUID()
-                else:
-                    cacheKey = "unknown"
-            else:
-                isowner = (yield self.isOwner(request, adminprincipals=True, readprincipals=True))
-                cacheKey = "owner" if isowner else "notowner"
+#            isvirt = (yield self.isVirtualShare(request))
+#            if isvirt:
+#                principal = (yield self.resourceOwnerPrincipal(request))
+#                if principal:
+#                    cacheKey = principal.principalUID()
+#                else:
+#                    cacheKey = "unknown"
+#            else:
+#                isowner = (yield self.isOwner(request, adminprincipals=True, readprincipals=True))
+#                cacheKey = "owner" if isowner else "notowner"
                 
             # Now check for a cached .ics
-            rolled = self.fp.child(".subscriptions")
-            if not rolled.exists():
-                try:
-                    rolled.makedirs()
-                except IOError, e:
-                    log.err("Unable to create internet calendar subscription cache directory: %s because of: %s" % (rolled.path, e,))
-                    raise HTTPError(ErrorResponse(responsecode.INTERNAL_SERVER_ERROR))
-            cached = rolled.child(cacheKey)
-            if cached.exists():
-                try:
-                    cachedData = cached.open().read()
-                except IOError, e:
-                    log.err("Unable to open or read internet calendar subscription cache file: %s because of: %s" % (cached.path, e,))
-                else:
-                    # Check the cache token
-                    token, data = cachedData.split("\r\n", 1)
-                    if token == self.getSyncToken():
-                        returnValue(data)
+#            rolled = self.fp.child(".subscriptions")
+#            if not rolled.exists():
+#                try:
+#                    rolled.makedirs()
+#                except IOError, e:
+#                    log.err("Unable to create internet calendar subscription cache directory: %s because of: %s" % (rolled.path, e,))
+#                    raise HTTPError(ErrorResponse(responsecode.INTERNAL_SERVER_ERROR))
+#            cached = rolled.child(cacheKey)
+#            if cached.exists():
+#                try:
+#                    cachedData = cached.open().read()
+#                except IOError, e:
+#                    log.err("Unable to open or read internet calendar subscription cache file: %s because of: %s" % (cached.path, e,))
+#                else:
+#                    # Check the cache token
+#                    token, data = cachedData.split("\r\n", 1)
+#                    if token == self.getSyncToken():
+#                        returnValue(data)
 
             # Generate a monolithic calendar
             calendar = iComponent("VCALENDAR")
@@ -366,10 +380,10 @@
             # Cache the data
             data = str(calendar)
             data = self.getSyncToken() + "\r\n" + data
-            try:
-                cached.open(mode='w').write(data)
-            except IOError, e:
-                log.err("Unable to open or write internet calendar subscription cache file: %s because of: %s" % (cached.path, e,))
+#            try:
+#                cached.open(mode='w').write(data)
+#            except IOError, e:
+#                log.err("Unable to open or write internet calendar subscription cache file: %s because of: %s" % (cached.path, e,))
                 
             returnValue(calendar)
 
@@ -416,6 +430,19 @@
         return calendar_data
 
     def createAddressBook(self, request):
+        """
+        External API for creating an addressbook.  Verify that the parent is a
+        collection, exists, is I{not} an addressbook collection; that this resource
+        does not yet exist, then create it.
+
+        @param request: the request used to look up parent resources to
+            validate.
+
+        @type request: L{twext.web2.iweb.IRequest}
+
+        @return: a deferred that fires when an addressbook collection has been
+            created in this resource.
+        """
         #
         # request object is required because we need to validate against parent
         # resources, and we need the request in order to locate the parents.
@@ -425,9 +452,10 @@
             log.err("Attempt to create collection where file exists: %s" % (self.fp.path,))
             raise HTTPError(StatusResponse(responsecode.NOT_ALLOWED, "File exists"))
 
-        if not os.path.isdir(os.path.dirname(self.fp.path)):
-            log.err("Attempt to create collection with no parent: %s" % (self.fp.path,))
-            raise HTTPError(StatusResponse(responsecode.CONFLICT, "No parent collection"))
+        # newStore guarantees that we always have a parent calendar home
+        #if not os.path.isdir(os.path.dirname(self.fp.path)):
+        #    log.err("Attempt to create collection with no parent: %s" % (self.fp.path,))
+        #    raise HTTPError(StatusResponse(responsecode.CONFLICT, "No parent collection"))
 
         #
         # Verify that no parent collection is a calendar also
@@ -449,24 +477,19 @@
         return parent
 
     def createAddressBookCollection(self):
-        #
-        # Create the collection once we know it is safe to do so
-        #
-        def onAddressBookCollection(status):
-            if status != responsecode.CREATED:
-                raise HTTPError(status)
+        """
+        Internal API for creating an addressbook collection.
 
-            # Initialize CTag on the address book collection
-            d1 = self.bumpSyncToken()
+        This will immediately create the collection without performing any
+        verification.  For the normal API, see L{CalDAVFile.createAddressBook}.
 
-            # Create the index so its ready when the first PUTs come in
-            d1.addCallback(lambda _: self.index().create())
-            d1.addCallback(lambda _: status)
-            return d1
+        The default behavior is to return a failing Deferred; for a working
+        implementation, see L{twistedcaldav.legacy}.
 
-        d = self.createSpecialCollection(davxml.ResourceType.addressbook) #@UndefinedVariable
-        d.addCallback(onAddressBookCollection)
-        return d
+        @return: a L{Deferred} which fires when the underlying collection has
+            actually been created.
+        """
+        return fail(NotImplementedError())
 
     @inlineCallbacks
     def vCardRolledup(self, request):
@@ -603,8 +626,9 @@
         """
         Create a new sync-token which is also the ctag.
         """
+        # FIXME: new implementation is in txcaldav.file, this should be
+        # deleted.
         assert self.isCollection()
-        
         # Initialise it
         caluuid = uuid4()
         revision = 1
@@ -647,11 +671,6 @@
             if not child.startswith(".")
         ]
 
-    def propertyCollection(self):
-        if not hasattr(self, "_propertyCollection"):
-            self._propertyCollection = MemcachePropertyCollection(self)
-        return self._propertyCollection
-
     def createSimilarFile(self, path):
         if self.comparePath(path):
             return self
@@ -659,48 +678,9 @@
         similar = super(CalDAVFile, self).createSimilarFile(path)
 
         if isCalendarCollectionResource(self):
+            raise RuntimeError("Calendar collection resources should really "
+                               "be represented by a different class.")
 
-            # Short-circuit stat with information we know to be true at this point
-            if isinstance(path, FilePath) and hasattr(self, "knownChildren"):
-                if os.path.basename(path.path) in self.knownChildren:
-                    path.existsCached = True
-                    path.isDirCached = False
-
-            #
-            # Override the dead property store
-            #
-            superDeadProperties = similar.deadProperties
-
-            def deadProperties():
-                if not hasattr(similar, "_dead_properties"):
-                    similar._dead_properties = self.propertyCollection().propertyStoreForChild(
-                        similar,
-                        superDeadProperties(caching=False)
-                    )
-                return similar._dead_properties
-
-            similar.deadProperties = deadProperties
-
-            #
-            # Override DELETE, MOVE
-            #
-            for method in ("DELETE", "MOVE"):
-                method = "http_" + method
-                original = getattr(similar, method)
-
-                @inlineCallbacks
-                def override(request, original=original):
-
-                    # Call original method (which is deferred)
-                    response = (yield original(request))
-
-                    # Wipe the cache
-                    similar.deadProperties().flushCache()
-
-                    returnValue(response)
-
-                setattr(similar, method, override)
-
         return similar
 
     ##
@@ -861,28 +841,44 @@
             super(AutoProvisioningFileMixIn, self)._initTypeAndEncoding()
 
 
-class CalendarHomeProvisioningFile (AutoProvisioningFileMixIn, DirectoryCalendarHomeProvisioningResource, DAVFile):
+class CalendarHomeProvisioningFile(AutoProvisioningFileMixIn, 
+                                   DirectoryCalendarHomeProvisioningResource,
+                                   DAVFile):
     """
     Resource which provisions calendar home collections as needed.
     """
-    def __init__(self, path, directory, url):
+
+    def __init__(self, path, directory, url, store):
         """
-        @param path: the path to the file which will back the resource.
+        Initialize this L{CalendarHomeProvisioningFile}.
+
+        @param path: the path to the filesystem directory which will back the
+            resource.
+
+        @type path: L{FilePath}
+
         @param directory: an L{IDirectoryService} to provision calendars from.
-        @param url: the canonical URL for the resource.
+
+        @param url: the canonical URL for this L{CalendarHomeProvisioningFile} 
+            resource.
         """
         DAVFile.__init__(self, path)
         DirectoryCalendarHomeProvisioningResource.__init__(self, directory, url)
+        self._newStore = store
 
+
     def provisionChild(self, name):
         if name == uidsResourceName:
             return CalendarHomeUIDProvisioningFile(self.fp.child(name).path, self)
 
         return CalendarHomeTypeProvisioningFile(self.fp.child(name).path, self, name)
 
+
     def createSimilarFile(self, path):
         raise HTTPError(responsecode.NOT_FOUND)
 
+
+
 class CalendarHomeTypeProvisioningFile (AutoProvisioningFileMixIn, DirectoryCalendarHomeTypeProvisioningResource, DAVFile):
     def __init__(self, path, parent, recordType):
         """
@@ -893,6 +889,46 @@
         DAVFile.__init__(self, path)
         DirectoryCalendarHomeTypeProvisioningResource.__init__(self, parent, recordType)
 
+
+
+def _transactionFromRequest(request, newStore):
+    """
+    Return the associated transaction from the given HTTP request, creating a
+    new one from the given data store if none has yet been associated.
+
+    Also, if the request was not previously associated with a transaction, add
+    a failsafe transaction-abort response filter to abort any transaction which
+    has not been committed or aborted by the resource which responds to the
+    request.
+
+    @param request: The request to inspect.
+    @type request: L{IRequest}
+
+    @param newStore: The store to create a transaction from.
+    @type newStore: L{IDataStore}
+
+    @return: a transaction that should be used to read and write data
+        associated with the request.
+    @rtype: L{ITransaction} (and possibly L{ICalendarTransaction} and
+        L{IAddressBookTransaction} as well.
+    """
+    TRANSACTION_KEY = '_newStoreTransaction'
+    transaction = getattr(request, TRANSACTION_KEY, None)
+    if transaction is None:
+        transaction = newStore.newTransaction(repr(request))
+        def abortIfUncommitted(request, response):
+            try:
+                transaction.abort()
+            except AlreadyFinishedError:
+                pass
+            return response
+        abortIfUncommitted.handleErrors = True
+        request.addResponseFilter(abortIfUncommitted)
+        setattr(request, TRANSACTION_KEY, transaction)
+    return transaction
+
+
+
 class CalendarHomeUIDProvisioningFile (AutoProvisioningFileMixIn, DirectoryCalendarHomeUIDProvisioningResource, DAVFile):
     def __init__(self, path, parent, homeResourceClass=None):
         """
@@ -905,9 +941,25 @@
         else:
             self.homeResourceClass = homeResourceClass
 
-    def provisionChild(self, name):
+
+    def locateChild(self, request, segments):
+
+        name = segments[0]
+        if name == "":
+            return (self, ())
+
         record = self.directory.recordWithUID(name)
+        if record:
+            return (self.homeResourceForRecord(record, request), segments[1:])
+        else:
+            return (None, ())
 
+    def homeResourceForRecord(self, record, request):
+        self.provision()
+        transaction = _transactionFromRequest(request, self.parent._newStore)
+
+        name = record.uid
+
         if record is None:
             log.msg("No directory record with GUID %r" % (name,))
             return None
@@ -920,7 +972,7 @@
         
         if record.locallyHosted():
             childPath = self.fp.child(name[0:2]).child(name[2:4]).child(name)
-            child = self.homeResourceClass(childPath.path, self, record)
+            child = self.homeResourceClass(childPath.path, self, record, transaction)
     
             if not child.exists():
                 self.provision()
@@ -947,25 +999,7 @@
                             ))
                         child.fp.changed()
                         break
-                else:
-                    #
-                    # NOTE: provisionDefaultCalendars() returns a deferred, which we are ignoring.
-                    # The result being that the default calendars will be present at some point
-                    # in the future, not necessarily right now, and we don't have a way to wait
-                    # on that to finish.
-                    #
-                    child.provisionDefaultCalendars()
-    
-                    #
-                    # Try to work around the above a little by telling the client that something
-                    # when wrong temporarily if the child isn't provisioned right away.
-                    #
-                    if not child.exists():
-                        raise HTTPError(StatusResponse(
-                            responsecode.SERVICE_UNAVAILABLE,
-                            "Provisioning calendar home."
-                        ))
-    
+
                 assert child.exists()
         
         else:
@@ -989,7 +1023,8 @@
     def url(self):
         return joinURL(self.parent.url(), self.record.uid)
 
-class CalendarHomeFile (AutoProvisioningFileMixIn, SharedHomeMixin, DirectoryCalendarHomeResource, CalDAVFile):
+class CalendarHomeFile(AutoProvisioningFileMixIn, SharedHomeMixin, 
+                       DirectoryCalendarHomeResource, CalDAVFile):
     """
     Calendar home collection resource.
     """
@@ -1003,27 +1038,69 @@
             (customxml.calendarserver_namespace, "xmpp-server"),
         )
 
-    def __init__(self, path, parent, record):
+    def __init__(self, path, parent, record, transaction):
         """
         @param path: the path to the file which will back the resource.
         """
 
+        self.associateWithTransaction(transaction)
+
         # TODO: when calendar home gets a resourceID( ) method, remove
         # the "id=record.uid" keyword from this call:
         self.clientNotifier = ClientNotifier(self, id=record.uid)
-
+        storeHome = transaction.calendarHomeWithUID(record.uid)
+        if storeHome is not None:
+            created = False
+        else:
+            storeHome = transaction.calendarHomeWithUID(
+                record.uid, create=True
+            )
+            created = True
+        self._newStoreCalendarHome = storeHome
         CalDAVFile.__init__(self, path)
         DirectoryCalendarHomeResource.__init__(self, parent, record)
+        from twistedcaldav.storebridge import _NewStorePropertiesWrapper
+        self._dead_properties = _NewStorePropertiesWrapper(
+            self._newStoreCalendarHome.properties()
+        )
+        if created:
+            # This is a bit of a hack.  Really we ought to be always generating
+            # this URL live from a back-end method that tells us what the
+            # default calendar is.
+            inbox = self.getChild("inbox")
+            childURL = joinURL(self.url(), "calendar")
+            inbox.processFreeBusyCalendar(childURL, True)
 
+
+    def sharesDB(self):
+        """
+        Retrieve the new-style shares DB wrapper.
+        """
+        if not hasattr(self, "_sharesDB"):
+            self._sharesDB = self._newStoreCalendarHome.retrieveOldShares()
+        return self._sharesDB
+
+
+    def exists(self):
+        # FIXME: tests
+        return True
+    
+    
+    def quotaSize(self, request):
+        # FIXME: tests, workingness
+        return succeed(0)
+
+
     def provision(self):
-        result = super(CalendarHomeFile, self).provision()
-        if config.Sharing.Enabled and config.Sharing.Calendars.Enabled:
+        if config.Sharing.Enabled and config.Sharing.Calendars.Enabled and self.fp.exists():
             self.provisionShares()
-        return result
+        return
 
     def provisionChild(self, name):
+        from twistedcaldav.storebridge import StoreScheduleInboxFile
+        from twistedcaldav.storebridge import DropboxCollection
         if config.EnableDropBox:
-            DropBoxHomeFileClass = DropBoxHomeFile
+            DropBoxHomeFileClass = DropboxCollection
         else:
             DropBoxHomeFileClass = None
 
@@ -1037,8 +1114,13 @@
         else:
             NotificationCollectionFileClass = None
 
+
+        # For storebridge stuff we special case this
+        if name == "notification":
+            return self.createNotificationsFile(self.fp.child(name).path)
+
         cls = {
-            "inbox"        : ScheduleInboxFile,
+            "inbox"        : StoreScheduleInboxFile,
             "outbox"       : ScheduleOutboxFile,
             "dropbox"      : DropBoxHomeFileClass,
             "freebusy"     : FreeBusyURLFileClass,
@@ -1052,12 +1134,46 @@
             return child
         return self.createSimilarFile(self.fp.child(name).path)
 
+    def createNotificationsFile(self, path):
+        
+        txn = self._newStoreCalendarHome._transaction
+        notifications = txn.notificationsWithUID(self._newStoreCalendarHome.uid())
+
+        from twistedcaldav.storebridge import StoreNotificationCollectionFile
+        similar = StoreNotificationCollectionFile(
+            notifications, self._newStoreCalendarHome,
+            path, self,
+        )
+        self.propagateTransaction(similar)
+        similar.clientNotifier = self.clientNotifier.clone(similar,
+            label="collection")
+        return similar
+
     def createSimilarFile(self, path):
 
         if self.comparePath(path):
             return self
         else:
-            similar = CalDAVFile(path, principalCollections=self.principalCollections())
+            if not isinstance(path, FilePath):
+                path = FilePath(path)
+            newCalendar = self._newStoreCalendarHome.calendarWithName(
+                path.basename()
+            )
+            if newCalendar is None:
+                # Local imports.due to circular dependency between modules.
+                from twistedcaldav.storebridge import (
+                     ProtoCalendarCollectionFile)
+                similar = ProtoCalendarCollectionFile(
+                    self._newStoreCalendarHome,
+                    path, principalCollections=self.principalCollections()
+                )
+            else:
+                from twistedcaldav.storebridge import CalendarCollectionFile
+                similar = CalendarCollectionFile(
+                    newCalendar, self._newStoreCalendarHome,
+                    path, principalCollections=self.principalCollections()
+                )
+            self.propagateTransaction(similar)
             similar.clientNotifier = self.clientNotifier.clone(similar,
                 label="collection")
             return similar
@@ -1210,17 +1326,6 @@
         ScheduleFile.__init__(self, path, parent)
         ScheduleInboxResource.__init__(self, parent)
 
-    def provision(self):
-        if self.provisionFile():
-
-            # Initialize CTag on the calendar collection
-            self.bumpSyncToken()
-
-            # Initialize the index
-            self.index().create()
-
-        return super(ScheduleInboxFile, self).provision()
-
     def __repr__(self):
         return "<%s (calendar inbox collection): %s>" % (self.__class__.__name__, self.fp.path)
 
@@ -1237,12 +1342,22 @@
     Calendar scheduling outbox collection resource.
     """
     def __init__(self, path, parent):
-        ScheduleFile.__init__(self, path, parent)
+        ScheduleFile.__init__(self, NotFilePath(isdir=True), parent)
         ScheduleOutboxResource.__init__(self, parent)
 
+    def deadProperties(self):
+        if not hasattr(self, "_dead_properties"):
+            self._dead_properties = NonePropertyStore(self)
+        return self._dead_properties
+
+    def etag(self):
+        return None
+
     def provision(self):
-        self.provisionFile()
-        return super(ScheduleOutboxFile, self).provision()
+        """
+        Schedule outboxes do not need to be provisioned; they shouldn't store
+        anything.
+        """
 
     def __repr__(self):
         return "<%s (calendar outbox collection): %s>" % (self.__class__.__name__, self.fp.path)
@@ -1255,6 +1370,13 @@
     def supportedPrivileges(self, request):
         return succeed(sendSchedulePrivilegeSet)
 
+    def report_urn_ietf_params_xml_ns_caldav_calendar_query(self, request, calendar_query):
+        return succeed(MultiStatusResponse(()))
+        
+    def report_urn_ietf_params_xml_ns_caldav_calendar_multiget(self, request, multiget):
+        responses = [davxml.StatusResponse(href, davxml.Status.fromResponseCode(responsecode.NOT_FOUND)) for href in multiget.resources]
+        return succeed(MultiStatusResponse((responses)))
+
 class IScheduleInboxFile (ReadOnlyResourceMixIn, IScheduleInboxResource, CalDAVFile):
     """
     Server-to-server scheduling inbox resource.
@@ -1390,7 +1512,7 @@
     def checkPrivileges(self, request, privileges, recurse=False, principal=None, inherited_aces=None):
         return succeed(None)
 
-class NotificationCollectionFile(ReadOnlyResourceMixIn, AutoProvisioningFileMixIn, NotificationCollectionResource, CalDAVFile):
+class NotificationCollectionFile(ReadOnlyResourceMixIn, NotificationCollectionResource, CalDAVFile):
     """
     Notification collection resource.
     """
@@ -1410,8 +1532,8 @@
 
     def _writeNotification(self, request, uid, rname, xmltype, xmldata):
         
+        # TODO: use the generic StoreObject api so that quota, sync-token etc all get changed properly
         child = self.createSimilarFile(self.fp.child(rname).path)
-
         def _defer(_):
             child.writeDeadProperty(davxml.GETContentType.fromString(generateContentType(MimeType("text", "xml", params={"charset":"utf-8"}))))
             child.writeDeadProperty(customxml.NotificationType(xmltype))
@@ -1424,8 +1546,8 @@
         d.addCallback(_defer)
         return d
 
+
     def _deleteNotification(self, request, rname):
-        
         child = self.createSimilarFile(self.fp.child(rname).path)
         url = request.urlForResource(self)
         url = joinURL(url, rname)
@@ -1456,7 +1578,7 @@
     """
     Resource which provisions address book home collections as needed.
     """
-    def __init__(self, path, directory, url):
+    def __init__(self, path, directory, url, store):
         """
         @param path: the path to the file which will back the resource.
         @param directory: an L{IDirectoryService} to provision address books from.
@@ -1464,7 +1586,9 @@
         """
         DAVFile.__init__(self, path)
         DirectoryAddressBookHomeProvisioningResource.__init__(self, directory, url)
+        self._newStore = store
 
+
     def provisionChild(self, name):
         if name == uidsResourceNameAddressBook:
             return AddressBookHomeUIDProvisioningFile(self.fp.child(name).path, self)
@@ -1496,9 +1620,24 @@
         else:
             self.homeResourceClass = homeResourceClass
 
-    def provisionChild(self, name):
+    def locateChild(self, request, segments):
+
+        name = segments[0]
+        if name == "":
+            return (self, ())
+
         record = self.directory.recordWithUID(name)
+        if record:
+            return (self.homeResourceForRecord(record, request), segments[1:])
+        else:
+            return (None, ())
 
+    def homeResourceForRecord(self, record, request):
+        self.provision()
+        transaction = _transactionFromRequest(request, self.parent._newStore)
+
+        name = record.uid
+
         if record is None:
             log.msg("No directory record with GUID %r" % (name,))
             return None
@@ -1510,7 +1649,7 @@
         assert len(name) > 4
         
         childPath = self.fp.child(name[0:2]).child(name[2:4]).child(name)
-        child = self.homeResourceClass(childPath.path, self, record)
+        child = self.homeResourceClass(childPath.path, self, record, transaction)
 
         if not child.exists():
             self.provision()
@@ -1577,24 +1716,51 @@
             (customxml.calendarserver_namespace, "xmpp-server"),
         )
 
-    def __init__(self, path, parent, record):
+    def __init__(self, path, parent, record, transaction):
         """
         @param path: the path to the file which will back the resource.
         """
 
+        self.associateWithTransaction(transaction)
+
         # TODO: when addressbook home gets a resourceID( ) method, remove
         # the "id=record.uid" keyword from this call:
         self.clientNotifier = ClientNotifier(self, id=record.uid)
-
+        self._newStoreAddressBookHome = (
+            transaction.addressbookHomeWithUID(record.uid, create=True)
+        )
         CalDAVFile.__init__(self, path)
         DirectoryAddressBookHomeResource.__init__(self, parent, record)
 
+        from twistedcaldav.storebridge import _NewStorePropertiesWrapper
+        self._dead_properties = _NewStorePropertiesWrapper(
+            self._newStoreAddressBookHome.properties()
+        )
+
+
+    def sharesDB(self):
+        """
+        Retrieve the new-style shares DB wrapper.
+        """
+        if not hasattr(self, "_sharesDB"):
+            self._sharesDB = self._newStoreAddressBookHome.retrieveOldShares()
+        return self._sharesDB
+
+
+    def exists(self):
+        # FIXME: tests
+        return True
+    
+    
+    def quotaSize(self, request):
+        # FIXME: tests, workingness
+        return succeed(0)
+
+
     def provision(self):
-        result = super(AddressBookHomeFile, self).provision()
         if config.Sharing.Enabled and config.Sharing.AddressBooks.Enabled:
             self.provisionShares()
         self.provisionLinks()
-        return result
 
     def provisionLinks(self):
         
@@ -1602,7 +1768,7 @@
             if config.GlobalAddressBook.Enabled:
                 self.putChild(
                     config.GlobalAddressBook.Name,
-                    LinkResource(self, joinURL("/", config.GlobalAddressBook.Name, "/")),
+                    LinkResource(self, "/addressbooks/public/global/addressbook/"),
                 )
             self._provisionedLinks = True
 
@@ -1628,7 +1794,38 @@
         if self.comparePath(path):
             return self
         else:
-            similar = CalDAVFile(path, principalCollections=self.principalCollections())
+            if not isinstance(path, FilePath):
+                path = FilePath(path)
+
+            # Check for public/global path
+            from twistedcaldav.storebridge import (
+                AddressBookCollectionFile,
+                ProtoAddressBookCollectionFile,
+                GlobalAddressBookCollectionFile,
+                ProtoGlobalAddressBookCollectionFile,
+            )
+            mainCls = AddressBookCollectionFile
+            protoCls = ProtoAddressBookCollectionFile
+            if isinstance(self.record, InternalDirectoryRecord):
+                if "global" in self.record.shortNames:
+                    mainCls = GlobalAddressBookCollectionFile
+                    protoCls = ProtoGlobalAddressBookCollectionFile
+
+            newAddressBook = self._newStoreAddressBookHome.addressbookWithName(
+                path.basename()
+            )
+            if newAddressBook is None:
+                # Local imports.due to circular dependency between modules.
+                similar = protoCls(
+                    self._newStoreAddressBookHome,
+                    path, principalCollections=self.principalCollections()
+                )
+            else:
+                similar = mainCls(
+                    newAddressBook, self._newStoreAddressBookHome,
+                    path, principalCollections=self.principalCollections()
+                )
+            self.propagateTransaction(similar)
             similar.clientNotifier = self.clientNotifier.clone(similar,
                 label="collection")
             return similar

Copied: CalendarServer/trunk/twistedcaldav/storebridge.py (from rev 5919, CalendarServer/branches/new-store/twistedcaldav/storebridge.py)
===================================================================
--- CalendarServer/trunk/twistedcaldav/storebridge.py	                        (rev 0)
+++ CalendarServer/trunk/twistedcaldav/storebridge.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,2025 @@
+# -*- test-case-name: twistedcaldav.test.test_wrapping -*-
+##
+# Copyright (c) 2005-2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+Wrappers to translate between the APIs in L{txcaldav.icalendarstore} and
+L{txcarddav.iaddressbookstore} and those in L{twistedcaldav}.
+"""
+
+import hashlib
+
+from urlparse import urlsplit
+
+from twisted.internet.defer import succeed, inlineCallbacks, returnValue
+from twisted.internet.protocol import Protocol
+from twisted.python.util import FancyEqMixin
+
+from twext.python import vcomponent
+from twext.python.filepath import CachingFilePath as FilePath
+from twext.python.log import Logger
+
+from twext.web2.http_headers import ETag, MimeType
+from twext.web2.dav.http import ErrorResponse, ResponseQueue
+from twext.web2.dav.element.base import dav_namespace
+from twext.web2.responsecode import (
+    FORBIDDEN, NO_CONTENT, NOT_FOUND, CREATED, CONFLICT, PRECONDITION_FAILED,
+    BAD_REQUEST, OK, NOT_IMPLEMENTED, NOT_ALLOWED)
+from twext.web2.dav import davxml
+from twext.web2.dav.resource import TwistedGETContentMD5, TwistedACLInheritable
+from twext.web2.dav.util import parentForURL, allDataFromStream, joinURL, \
+    davXMLFromStream
+from twext.web2.http import HTTPError, StatusResponse, Response
+from twext.web2.stream import ProducerStream, readStream
+
+from twistedcaldav.static import CalDAVFile, ScheduleInboxFile, \
+    NotificationCollectionFile, NotificationFile, GlobalAddressBookFile
+from twistedcaldav.vcard import Component as VCard
+from twistedcaldav.resource import CalDAVResource
+
+from txdav.common.icommondatastore import NoSuchObjectResourceError, \
+    InternalDataStoreError
+from txdav.propertystore.base import PropertyName
+
+from twistedcaldav.caldavxml import ScheduleTag, caldav_namespace
+from twistedcaldav.scheduling.implicit import ImplicitScheduler
+from twistedcaldav.memcachelock import MemcacheLock, MemcacheLockTimeoutError
+
+from twisted.python.log import err as logDefaultException
+from twistedcaldav.method.propfind import http_PROPFIND
+
+log = Logger()
+
+
+class _NewStorePropertiesWrapper(object):
+    """
+    Wrap a new-style property store (a L{txdav.idav.IPropertyStore}) in the old-
+    style interface for compatibility with existing code.
+    """
+
+    # FIXME: UID arguments on everything need to be tested against something.
+    def __init__(self, newPropertyStore):
+        """
+        Initialize an old-style property store from a new one.
+
+        @param newPropertyStore: the new-style property store.
+        @type newPropertyStore: L{txdav.idav.IPropertyStore}
+        """
+        self._newPropertyStore = newPropertyStore
+
+    @classmethod
+    def _convertKey(cls, qname):
+        namespace, name = qname
+        return PropertyName(namespace, name)
+
+
+    # FIXME 'uid' here should be verifying something.
+    def get(self, qname, uid=None):
+        """
+        
+        """
+        try:
+            return self._newPropertyStore[self._convertKey(qname)]
+        except KeyError:
+            raise HTTPError(StatusResponse(
+                    NOT_FOUND,
+                    "No such property: {%s}%s" % qname))
+
+
+    def set(self, property, uid=None):
+        """
+        
+        """
+        self._newPropertyStore[self._convertKey(property.qname())] = property
+
+
+    def delete(self, qname, uid=None):
+        """
+        
+        """
+        del self._newPropertyStore[self._convertKey(qname)]
+
+
+    def contains(self, qname, uid=None, cache=True):
+        """
+        
+        """
+        return (self._convertKey(qname) in self._newPropertyStore)
+
+
+    def list(self, uid=None, filterByUID=True, cache=True):
+        """
+        
+        """
+        return [(pname.namespace, pname.name) for pname in
+                self._newPropertyStore.keys()]
+
+
+
+def requiresPermissions(*permissions, **kw):
+    """
+    A decorator to wrap http_ methods in, to indicate that they should not be
+    run until the current user principal has been authorized for the given
+    permission set.
+    """
+    fromParent = kw.get('fromParent')
+    # FIXME: direct unit tests
+    def wrap(thunk):
+        def authAndContinue(self, request):
+            if permissions:
+                d = self.authorize(request, permissions)
+            else:
+                d = succeed(None)
+            if fromParent:
+                d.addCallback(
+                    lambda whatever:
+                        request.locateResource(parentForURL(request.uri))
+                ).addCallback(
+                    lambda parent:
+                        parent.authorize(request, fromParent)
+                )
+            d.addCallback(lambda whatever: thunk(self, request))
+            return d
+        return authAndContinue
+    return wrap
+
+
+
+class _CalendarChildHelper(object):
+    """
+    Methods for things which are like calendars.
+    """
+
+    def _initializeWithCalendar(self, calendar, home):
+        """
+        Initialize with a calendar.
+
+        @param calendar: the wrapped calendar.
+        @type calendar: L{txcaldav.icalendarstore.ICalendar}
+
+        @param home: the home through which the given calendar was accessed.
+        @type home: L{txcaldav.icalendarstore.ICalendarHome}
+        """
+        self._newStoreCalendar = calendar
+        self._newStoreParentHome = home
+        self._dead_properties = _NewStorePropertiesWrapper(
+            self._newStoreCalendar.properties()
+        )
+
+
+    def index(self):
+        """
+        Retrieve the new-style index wrapper.
+        """
+        return self._newStoreCalendar.retrieveOldIndex()
+
+
+    def invitesDB(self):
+        """
+        Retrieve the new-style invites DB wrapper.
+        """
+        if not hasattr(self, "_invitesDB"):
+            self._invitesDB = self._newStoreCalendar.retrieveOldInvites()
+        return self._invitesDB
+
+    def exists(self):
+        # FIXME: tests
+        return True
+
+
+    @classmethod
+    def transform(cls, self, calendar, home):
+        """
+        Transform C{self} into a L{CalendarCollectionFile}.
+        """
+        self.__class__ = cls
+        self._initializeWithCalendar(calendar, home)
+
+
+    def createSimilarFile(self, path):
+        """
+        Create a L{CalendarObjectFile} or L{ProtoCalendarObjectFile} based on a
+        path object.
+        """
+        if not isinstance(path, FilePath):
+            path = FilePath(path)
+
+        newStoreObject = self._newStoreCalendar.calendarObjectWithName(
+            path.basename()
+        )
+
+        if newStoreObject is not None:
+            similar = CalendarObjectFile(newStoreObject, path,
+                principalCollections=self._principalCollections)
+        else:
+            # FIXME: creation in http_PUT should talk to a specific resource
+            # type; this is the domain of StoreCalendarObjectResource.
+            # similar = ProtoCalendarObjectFile(self._newStoreCalendar, path)
+            similar = ProtoCalendarObjectFile(self._newStoreCalendar, path,
+                principalCollections=self._principalCollections)
+
+        # FIXME: tests should be failing without this line.
+        # Specifically, http_PUT won't be committing its transaction properly.
+        self.propagateTransaction(similar)
+        return similar
+
+
+    def quotaSize(self, request):
+        # FIXME: tests, workingness
+        return succeed(0)
+
+
+
+class StoreScheduleInboxFile(_CalendarChildHelper, ScheduleInboxFile):
+
+    def __init__(self, *a, **kw):
+        super(StoreScheduleInboxFile, self).__init__(*a, **kw)
+        self.parent.propagateTransaction(self)
+        home = self.parent._newStoreCalendarHome
+        storage = home.calendarWithName("inbox")
+        if storage is None:
+            # raise RuntimeError("backend should be handling this for us")
+            # FIXME: spurious error, sanity check, should not be needed;
+            # unfortunately, user09's calendar home does not have an inbox, so
+            # this is a temporary workaround.
+            home.createCalendarWithName("inbox")
+            storage = home.calendarWithName("inbox")
+        self._initializeWithCalendar(
+            storage,
+            self.parent._newStoreCalendarHome
+        )
+
+
+    def isCollection(self):
+        return True
+
+
+    def provisionFile(self):
+        pass
+
+
+    def provision(self):
+        pass
+
+
+
+class _GetChildHelper(CalDAVResource):
+
+    def locateChild(self, request, segments):
+        if segments[0] == '':
+            return self, segments[1:]
+        return self.getChild(segments[0]), segments[1:]
+
+
+    def getChild(self, name):
+        return None
+
+
+    def readProperty(self, property, request):
+        if type(property) is tuple:
+            qname = property
+        else:
+            qname = property.qname()
+
+        if qname == (dav_namespace, "resourcetype"):
+            return self.resourceType(request)
+        return super(_GetChildHelper, self).readProperty(property, request)
+
+
+    def davComplianceClasses(self):
+        return ("1", "access-control")
+
+
+    @requiresPermissions(davxml.Read())
+    def http_GET(self, request):
+        return super(_GetChildHelper, self).http_GET(request)
+
+
+    http_PROPFIND = http_PROPFIND
+
+
+
+class DropboxCollection(_GetChildHelper):
+    """
+    A collection of all dropboxes (containers for attachments), presented as a
+    resource under the user's calendar home, where a dropbox is a
+    L{CalendarObjectDropbox}.
+    """
+    # FIXME: no direct tests for this class at all.
+
+    def __init__(self, path, parent, *a, **kw):
+        # FIXME: constructor signature takes a 'path' because CalendarHomeFile
+        # requires it, but we don't need it (and shouldn't have it) eventually.
+        super(DropboxCollection, self).__init__(
+            *a, principalCollections=parent.principalCollections(), **kw)
+        self._newStoreCalendarHome = parent._newStoreCalendarHome
+        parent.propagateTransaction(self)
+
+
+    def isCollection(self):
+        """
+        It is a collection.
+        """
+        return True
+
+
+    def getChild(self, name):
+        calendarObject = self._newStoreCalendarHome.calendarObjectWithDropboxID(name)
+        if calendarObject is None:
+            return NoDropboxHere()
+        objectDropbox = CalendarObjectDropbox(
+            calendarObject, principalCollections=self.principalCollections()
+        )
+        self.propagateTransaction(objectDropbox)
+        return objectDropbox
+
+
+    def resourceType(self, request):
+        return succeed(davxml.ResourceType.dropboxhome)
+
+
+    def listChildren(self):
+        l = []
+        for everyCalendar in self._newStoreCalendarHome.calendars():
+            for everyObject in everyCalendar.calendarObjects():
+                l.append(everyObject.dropboxID())
+        return l
+
+
+
+class NoDropboxHere(_GetChildHelper):
+
+    def isCollection(self):
+        return False
+
+
+    def http_GET(self, request):
+        return NOT_FOUND
+
+
+    def http_MKCALENDAR(self, request):
+        return NOT_ALLOWED
+
+
+    def http_MKCOL(self, request):
+        return NOT_IMPLEMENTED
+
+
+
+class CalendarObjectDropbox(_GetChildHelper):
+    """
+    A wrapper around a calendar object which serves that calendar object's
+    attachments as a DAV collection.
+    """
+
+    def __init__(self, calendarObject, *a, **kw):
+        super(CalendarObjectDropbox, self).__init__(*a, **kw)
+        self._newStoreCalendarObject = calendarObject
+
+
+    def isCollection(self):
+        return True
+
+
+    def resourceType(self, request):
+        return succeed(davxml.ResourceType.dropbox)
+
+
+    def getChild(self, name):
+        attachment = self._newStoreCalendarObject.attachmentWithName(name)
+        if attachment is None:
+            result = ProtoCalendarAttachment(
+                self._newStoreCalendarObject,
+                name,
+                principalCollections=self.principalCollections())
+        else:
+            result = CalendarAttachment(
+                self._newStoreCalendarObject,
+                attachment, principalCollections=self.principalCollections())
+        self.propagateTransaction(result)
+        return result
+
+
+    @inlineCallbacks
+    def http_ACL(self, request):
+        """
+        Don't ever actually make changes, but attempt to deny any ACL requests
+        that refer to permissions not referenced by attendees in the iCalendar
+        data.
+        """
+        attendees = self._newStoreCalendarObject.component().getAttendees()
+        attendees = [attendee.split("urn:uuid:")[-1] for attendee in attendees]
+        document = yield davXMLFromStream(request.stream)
+        for ace in document.root_element.children:
+            for element in ace.children:
+                if isinstance(element, davxml.Principal):
+                    for href in element.children:
+                        principalURI = href.children[0].data
+                        uidsPrefix = '/principals/__uids__/'
+                        if not principalURI.startswith(uidsPrefix):
+                            # Unknown principal.
+                            returnValue(FORBIDDEN)
+                        principalElements = principalURI[
+                            len(uidsPrefix):].split("/")
+                        if principalElements[-1] == '':
+                            principalElements.pop()
+                        if principalElements[-1] in ('calendar-proxy-read',
+                                                     'calendar-proxy-write'):
+                            principalElements.pop()
+                        if len(principalElements) != 1:
+                            returnValue(FORBIDDEN)
+                        principalUID = principalElements[0]
+                        if principalUID not in attendees:
+                            returnValue(FORBIDDEN)
+        returnValue(OK)
+
+
+    def http_MKCOL(self, request):
+        return CREATED
+
+
+    def http_DELETE(self, request):
+        return NO_CONTENT
+
+
+    def listChildren(self):
+        l = []
+        for attachment in self._newStoreCalendarObject.attachments():
+            l.append(attachment.name())
+        return l
+
+
+    def accessControlList(self, *a, **kw):
+        """
+        All principals identified as ATTENDEEs on the event for this dropbox
+        may read all its children.
+        """
+        d = super(CalendarObjectDropbox, self).accessControlList(*a, **kw)
+        def moreACLs(originalACL):
+            othersCanWrite = (
+                self._newStoreCalendarObject.attendeesCanManageAttachments()
+            )
+            originalACEs = list(originalACL.children)
+            cuas = self._newStoreCalendarObject.component().getAttendees()
+            newACEs = []
+            for calendarUserAddress in cuas:
+                principal = self.principalForCalendarUserAddress(
+                    calendarUserAddress
+                )
+                principalURL = principal.principalURL()
+                if othersCanWrite:
+                    privileges = [davxml.Privilege(davxml.All())]
+                else:
+                    privileges = [
+                        davxml.Privilege(davxml.Read()),
+                        davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet())
+                    ]
+                newACEs.append(davxml.ACE(
+                    davxml.Principal(davxml.HRef(principalURL)),
+                    davxml.Grant(*privileges),
+                    davxml.Protected(),
+                    TwistedACLInheritable(),
+                ))
+            return davxml.ACL(*tuple(newACEs + originalACEs))
+        d.addCallback(moreACLs)
+        return d
+
+
+
+class ProtoCalendarAttachment(_GetChildHelper):
+
+    def __init__(self, calendarObject, attachmentName, **kw):
+        super(ProtoCalendarAttachment, self).__init__(**kw)
+        self.calendarObject = calendarObject
+        self.attachmentName = attachmentName
+
+
+    def isCollection(self):
+        return False
+
+
+    def http_DELETE(self, request):
+        return NO_CONTENT
+
+
+    # FIXME: Permissions should dictate a different response, sometimes.
+    def http_GET(self, request):
+        return NOT_FOUND
+
+
+    @requiresPermissions(fromParent=[davxml.Bind()])
+    def http_PUT(self, request):
+        # FIXME: direct test
+        # FIXME: transformation?
+
+        content_type = request.headers.getHeader("content-type")
+        if content_type is None:
+            content_type = MimeType("application", "octet-stream")
+
+        t = self.calendarObject.createAttachmentWithName(
+            self.attachmentName,
+            content_type,
+        )
+        def done(ignored):
+            t.loseConnection()
+            return CREATED
+        return readStream(request.stream, t.write).addCallback(done)
+
+
+
+class CalendarAttachment(_GetChildHelper):
+
+    def __init__(self, calendarObject, attachment, **kw):
+        super(CalendarAttachment, self).__init__(**kw)
+        self._newStoreCalendarObject = calendarObject
+        self._newStoreAttachment = attachment
+
+
+    def etag(self):
+        # FIXME: test
+        md5 = self._newStoreAttachment.md5()
+        return ETag(md5)
+
+
+    def contentType(self):
+        # FIXME: test
+        return self._newStoreAttachment.contentType()
+
+
+    def getChild(self, name):
+        return None
+
+
+    @requiresPermissions(davxml.WriteContent())
+    def http_PUT(self, request):
+        # FIXME: direct test
+        # FIXME: refactor with ProtoCalendarAttachment.http_PUT
+        # FIXME: CDT test to make sure that permissions are enforced.
+
+        content_type = request.headers.getHeader("content-type")
+        if content_type is None:
+            content_type = MimeType("application", "octet-stream")
+
+        t = self._newStoreAttachment.store(content_type)
+        def done(ignored):
+            t.loseConnection()
+            return NO_CONTENT
+        return readStream(request.stream, t.write).addCallback(done)
+
+
+    @requiresPermissions(davxml.Read())
+    def http_GET(self, request):
+        stream = ProducerStream()
+        class StreamProtocol(Protocol):
+            def dataReceived(self, data):
+                stream.write(data)
+            def connectionLost(self, reason):
+                stream.finish()
+        self._newStoreAttachment.retrieve(StreamProtocol())
+        return Response(OK, {"content-type":self.contentType()}, stream)
+
+    @requiresPermissions(fromParent=[davxml.Unbind()])
+    def http_DELETE(self, request):
+        self._newStoreCalendarObject.removeAttachmentWithName(
+            self._newStoreAttachment.name()
+        )
+        del self._newStoreCalendarObject
+        self.__class__ = ProtoCalendarAttachment
+        return NO_CONTENT
+
+
+    def isCollection(self):
+        return False
+
+
+
+class CalendarCollectionFile(_CalendarChildHelper, CalDAVFile):
+    """
+    Wrapper around a L{txcaldav.icalendar.ICalendar}.
+    """
+
+    def __init__(self, calendar, home, *args, **kw):
+        """
+        Create a CalendarCollectionFile from a L{txcaldav.icalendar.ICalendar}
+        and the arguments required for L{CalDAVFile}.
+        """
+        super(CalendarCollectionFile, self).__init__(*args, **kw)
+        self._initializeWithCalendar(calendar, home)
+
+
+    def isCollection(self):
+        return True
+
+
+    def isCalendarCollection(self):
+        """
+        Yes, it is a calendar collection.
+        """
+        return True
+
+
+    @requiresPermissions(fromParent=[davxml.Unbind()])
+    @inlineCallbacks
+    def http_DELETE(self, request):
+        """
+        Override http_DELETE to validate 'depth' header. 
+        """
+
+        depth = request.headers.getHeader("depth", "infinity")
+        if depth != "infinity":
+            msg = "illegal depth header for DELETE on collection: %s" % (
+                depth,
+            )
+            log.err(msg)
+            raise HTTPError(StatusResponse(BAD_REQUEST, msg))
+        response = (yield self.storeRemove(request, True, request.uri))
+        returnValue(response)
+
+
+    @inlineCallbacks
+    def storeRemove(self, request, implicitly, where):
+        """
+        Delete this calendar collection resource, first deleting each contained
+        calendar resource.
+
+        This has to emulate the behavior in fileop.delete in that any errors
+        need to be reported back in a multistatus response.
+
+        @param request: The request used to locate child resources.  Note that
+            this is the request which I{triggered} the C{DELETE}, but which may
+            not actually be a C{DELETE} request itself.
+
+        @type request: L{twext.web2.iweb.IRequest}
+
+        @param implicitly: Should implicit scheduling operations be triggered
+            as a resut of this C{DELETE}?
+
+        @type implicitly: C{bool}
+
+        @param where: the URI at which the resource is being deleted.
+        @type where: C{str}
+
+        @return: an HTTP response suitable for sending to a client (or
+            including in a multi-status).
+
+         @rtype: something adaptable to L{twext.web2.iweb.IResponse}
+        """
+
+        # Not allowed to delete the default calendar
+        default = (yield self.isDefaultCalendar(request))
+        if default:
+            log.err("Cannot DELETE default calendar: %s" % (self,))
+            raise HTTPError(ErrorResponse(FORBIDDEN,
+                            (caldav_namespace,
+                             "default-calendar-delete-allowed",)))
+
+        # Is this a sharee's view of a shared calendar?  If so, they can't do
+        # scheduling onto it, so just delete it and move on.
+        isVirtual = yield self.isVirtualShare(request)
+        if isVirtual:
+            log.debug("Removing shared calendar %s" % (self,))
+            yield self.removeVirtualShare(request)
+            returnValue(NO_CONTENT)
+
+        log.debug("Deleting calendar %s" % (self,))
+
+        # 'deluri' is this resource's URI; I should be able to synthesize it
+        # from 'self'.
+
+        errors = ResponseQueue(where, "DELETE", NO_CONTENT)
+
+        for childname in self.listChildren():
+
+            childurl = joinURL(where, childname)
+
+            # FIXME: use a more specific API; we should know what this child
+            # resource is, and not have to look it up.  (Sharing information
+            # needs to move into the back-end first, though.)
+            child = (yield request.locateChildResource(self, childname))
+
+            try:
+                yield child.storeRemove(request, implicitly, childurl)
+            except:
+                logDefaultException()
+                errors.add(childurl, BAD_REQUEST)
+
+        # Now do normal delete
+
+        # Handle sharing
+        wasShared = (yield self.isShared(request))
+        if wasShared:
+            yield self.downgradeFromShare(request)
+
+        # Actually delete it.
+        self._newStoreParentHome.removeCalendarWithName(
+            self._newStoreCalendar.name()
+        )
+        self.__class__ = ProtoCalendarCollectionFile
+        del self._newStoreCalendar
+
+        # FIXME: handle exceptions, possibly like this:
+
+        #        if isinstance(more_responses, MultiStatusResponse):
+        #            # Merge errors
+        #            errors.responses.update(more_responses.children)
+
+        response = errors.response()
+
+        if response == NO_CONTENT:
+            # Do some clean up
+            yield self.deletedCalendar(request)
+
+        returnValue(response)
+
+
+    def http_COPY(self, request):
+        """
+        Copying of calendar collections isn't allowed.
+        """
+        # FIXME: no direct tests
+        return FORBIDDEN
+
+
+    # FIXME: access control
+    @inlineCallbacks
+    def http_MOVE(self, request):
+        """
+        Moving a calendar collection is allowed for the purposes of changing
+        that calendar's name.
+        """
+        defaultCalendar = (yield self.isDefaultCalendar(request))
+        # FIXME: created to fix CDT test, no unit tests yet
+        sourceURI = request.uri
+        destinationURI = urlsplit(request.headers.getHeader("destination"))[2]
+        if parentForURL(sourceURI) != parentForURL(destinationURI):
+            returnValue(FORBIDDEN)
+        destination = yield request.locateResource(destinationURI)
+        # FIXME: should really use something other than 'fp' attribute.
+        basename = destination.fp.basename()
+        calendar = self._newStoreCalendar
+        calendar.rename(basename)
+        CalendarCollectionFile.transform(destination, calendar,
+                                         self._newStoreParentHome)
+        del self._newStoreCalendar
+        self.__class__ = ProtoCalendarCollectionFile
+        self.movedCalendar(request, defaultCalendar,
+                           destination, destinationURI)
+        returnValue(NO_CONTENT)
+
+
+
+class NoParent(CalDAVFile):
+    def http_MKCALENDAR(self, request):
+        return CONFLICT
+
+
+    def http_PUT(self, request):
+        return CONFLICT
+
+
+
+class ProtoCalendarCollectionFile(CalDAVFile):
+    """
+    A resource representing a calendar collection which hasn't yet been created.
+    """
+
+    def __init__(self, home, *args, **kw):
+        """
+        A placeholder resource for a calendar collection which does not yet
+        exist, but will become a L{CalendarCollectionFile}.
+
+        @param home: The calendar home which will be this resource's parent,
+            when it exists.
+
+        @type home: L{txcaldav.icalendarstore.ICalendarHome}
+        """
+        self._newStoreParentHome = home
+        super(ProtoCalendarCollectionFile, self).__init__(*args, **kw)
+
+
+    def isCollection(self):
+        return True
+
+    def createSimilarFile(self, path):
+        # FIXME: this is necessary for 
+        # twistedcaldav.test.test_mkcalendar.
+        #     MKCALENDAR.test_make_calendar_no_parent - there should be a more
+        # structured way to refuse creation with a non-existent parent.
+        return NoParent(path)
+
+
+    def provisionFile(self):
+        """
+        Create a calendar collection.
+        """
+        # FIXME: there should be no need for this.
+        return self.createCalendarCollection()
+
+
+    def createCalendarCollection(self):
+        """
+        Override C{createCalendarCollection} to actually do the work.
+        """
+        d = succeed(CREATED)
+
+        calendarName = self.fp.basename()
+        self._newStoreParentHome.createCalendarWithName(calendarName)
+        newStoreCalendar = self._newStoreParentHome.calendarWithName(
+            calendarName
+        )
+        CalendarCollectionFile.transform(
+            self, newStoreCalendar, self._newStoreParentHome
+        )
+        return d
+
+
+    def exists(self):
+        # FIXME: tests
+        return False
+
+
+    def provision(self):
+        """
+        This resource should do nothing if it's provisioned.
+        """
+        # FIXME: should be deleted, or raise an exception
+
+
+    def quotaSize(self, request):
+        # FIXME: tests, workingness
+        return succeed(0)
+
+
+
+class CalendarObjectFile(CalDAVFile, FancyEqMixin):
+    """
+    A resource wrapping a calendar object.
+    """
+
+    compareAttributes = '_newStoreObject'.split()
+
+    def __init__(self, calendarObject, *args, **kw):
+        """
+        Construct a L{CalendarObjectFile} from an L{ICalendarObject}.
+
+        @param calendarObject: The storage for the calendar object.
+        @type calendarObject: L{txcaldav.icalendarstore.ICalendarObject}
+        """
+        super(CalendarObjectFile, self).__init__(*args, **kw)
+        self._initializeWithObject(calendarObject)
+
+
+    def isCollection(self):
+        return False
+
+
+    def inNewTransaction(self, request):
+        """
+        Implicit auto-replies need to span multiple transactions.  Clean out
+        the given request's resource-lookup mapping, transaction, and re-look-
+        up my calendar object in a new transaction.
+
+        Return the new transaction so it can be committed.
+        """
+        # FIXME: private names from 'file' implementation; maybe there should
+        # be a public way to do this?  or maybe we should just have a real
+        # queue.
+        objectName = self._newStoreObject.name()
+        calendarName = self._newStoreObject._calendar.name()
+        homeUID = self._newStoreObject._calendar._calendarHome.uid()
+        store = self._newStoreObject._transaction.store()
+        txn = store.newTransaction("new transaction for " + self._newStoreObject.name())
+        newObject = (txn.calendarHomeWithUID(homeUID)
+                        .calendarWithName(calendarName)
+                        .calendarObjectWithName(objectName))
+        request._newStoreTransaction = txn
+        request._resourcesByURL.clear()
+        request._urlsByResource.clear()
+        self._initializeWithObject(newObject)
+        return txn
+
+
+    def exists(self):
+        # FIXME: Tests
+        return True
+
+
+    def name(self):
+        return self._newStoreObject.name()
+
+
+    def etag(self):
+        # FIXME: far too slow to be used for real, but I needed something to
+        # placate the etag computation in the case where the file doesn't exist
+        # yet (an uncommited transaction creating this calendar file)
+
+        # FIXME: direct tests
+        try:
+            if self.hasDeadProperty(TwistedGETContentMD5):
+                return ETag(str(self.readDeadProperty(TwistedGETContentMD5)))
+            else:
+                return ETag(
+                    hashlib.new("md5", self.iCalendarText()).hexdigest(),
+                    weak=False
+                )
+        except (NoSuchObjectResourceError, InternalDataStoreError):
+            # FIXME: a workaround for the fact that DELETE still rudely vanishes
+            # the calendar object out from underneath the store, and doesn't
+            # call storeRemove.
+            return None
+
+
+    def newStoreProperties(self):
+        return self._newStoreObject.properties()
+
+
+    def quotaSize(self, request):
+        # FIXME: tests
+        return succeed(len(self._newStoreObject.iCalendarText()))
+
+
+    def iCalendarText(self, ignored=None):
+        assert ignored is None, "This is a calendar object, not a calendar"
+        return self._newStoreObject.iCalendarText()
+
+
+    @requiresPermissions(fromParent=[davxml.Unbind()])
+    def http_DELETE(self, request):
+        """
+        Override http_DELETE to validate 'depth' header. 
+        """
+        return self.storeRemove(request, True, request.uri)
+
+
+    @inlineCallbacks
+    def storeStream(self, stream):
+        # FIXME: direct tests
+        component = vcomponent.VComponent.fromString(
+            (yield allDataFromStream(stream))
+        )
+        self._newStoreObject.setComponent(component)
+        returnValue(NO_CONTENT)
+
+
+    def validIfScheduleMatch(self, request):
+        """
+        Check to see if the given request's C{If-Schedule-Tag-Match} header
+        matches this resource's schedule tag.
+
+        @raise HTTPError: if the tag does not match.
+
+        @return: None
+        """
+        # Note, internal requests shouldn't issue this.
+        header = request.headers.getHeader("If-Schedule-Tag-Match")
+        if header:
+            # Do "precondition" test
+            matched = False
+            if self.hasDeadProperty(ScheduleTag):
+                scheduletag = self.readDeadProperty(ScheduleTag)
+                matched = (scheduletag == header)
+            if not matched:
+                log.debug(
+                    "If-Schedule-Tag-Match: header value '%s' does not match resource value '%s'" %
+                    (header, scheduletag,))
+                raise HTTPError(PRECONDITION_FAILED)
+
+
+    @inlineCallbacks
+    def storeRemove(self, request, implicitly, where):
+        """
+        Delete this calendar object and do implicit scheduling actions if
+        required.
+
+        @param request: Unused by this implementation; present for signature
+            compatibility with L{CalendarCollectionFile.storeRemove}.
+
+        @type request: L{twext.web2.iweb.IRequest}
+
+        @param implicitly: Should implicit scheduling operations be triggered
+            as a resut of this C{DELETE}?
+
+        @type implicitly: C{bool}
+
+        @param where: the URI at which the resource is being deleted.
+        @type where: C{str}
+
+        @return: an HTTP response suitable for sending to a client (or
+            including in a multi-status).
+
+         @rtype: something adaptable to L{twext.web2.iweb.IResponse}
+        """
+
+        # TODO: need to use transaction based delete on live scheduling object
+        # resources as the iTIP operation may fail and may need to prevent the
+        # delete from happening.
+
+        isinbox = self._newStoreObject._calendar.name() == "inbox"
+
+        # Do If-Schedule-Tag-Match behavior first
+        if not isinbox:
+            self.validIfScheduleMatch(request)
+
+        # Do quota checks before we start deleting things
+        myquota = (yield self.quota(request))
+        if myquota is not None:
+            old_size = (yield self.quotaSize(request))
+        else:
+            old_size = 0
+
+        scheduler = None
+        lock = None
+        if not isinbox and implicitly:
+            # Get data we need for implicit scheduling
+            calendar = (yield self.iCalendarForUser(request))
+            scheduler = ImplicitScheduler()
+            do_implicit_action, _ignore = (
+                yield scheduler.testImplicitSchedulingDELETE(
+                    request, self, calendar
+                )
+            )
+            if do_implicit_action:
+                lock = MemcacheLock(
+                    "ImplicitUIDLock", calendar.resourceUID(), timeout=60.0
+                )
+
+        try:
+            if lock:
+                yield lock.acquire()
+
+            storeCalendar = self._newStoreObject._calendar
+            # Do delete
+
+            # FIXME: public attribute please.  Should ICalendar maybe just have
+            # a delete() method?
+            storeCalendar.removeCalendarObjectWithName(
+                self._newStoreObject.name()
+            )
+
+            # FIXME: clean this up with a 'transform' method
+            self._newStoreParentCalendar = storeCalendar
+            del self._newStoreObject
+            self.__class__ = ProtoCalendarObjectFile
+
+            # Adjust quota
+            if myquota is not None:
+                yield self.quotaSizeAdjust(request, -old_size)
+
+            # Do scheduling
+            if not isinbox and implicitly:
+                yield scheduler.doImplicitScheduling()
+
+        except MemcacheLockTimeoutError:
+            raise HTTPError(StatusResponse(
+                CONFLICT,
+                "Resource: %s currently in use on the server." % (where,))
+            )
+
+        finally:
+            if lock:
+                yield lock.clean()
+
+        returnValue(NO_CONTENT)
+
+
+    def _initializeWithObject(self, calendarObject):
+        self._newStoreObject = calendarObject
+        self._dead_properties = _NewStorePropertiesWrapper(
+            self._newStoreObject.properties()
+        )
+
+
+    @classmethod
+    def transform(cls, self, calendarObject):
+        self.__class__ = cls
+        self._initializeWithObject(calendarObject)
+
+
+
+class ProtoCalendarObjectFile(CalDAVFile, FancyEqMixin):
+
+    compareAttributes = '_newStoreParentCalendar'.split()
+
+    def __init__(self, parentCalendar, *a, **kw):
+        super(ProtoCalendarObjectFile, self).__init__(*a, **kw)
+        self._newStoreParentCalendar = parentCalendar
+
+
+    @inlineCallbacks
+    def storeStream(self, stream):
+        # FIXME: direct tests 
+        component = vcomponent.VComponent.fromString(
+            (yield allDataFromStream(stream))
+        )
+        self._newStoreParentCalendar.createCalendarObjectWithName(
+            self.fp.basename(), component
+        )
+        CalendarObjectFile.transform(self, self._newStoreParentCalendar.calendarObjectWithName(self.fp.basename()))
+        returnValue(CREATED)
+
+
+    def createSimilarFile(self, name):
+        return None
+
+
+    def isCollection(self):
+        return False
+
+    def exists(self):
+        # FIXME: tests
+        return False
+
+
+    def name(self):
+        return self.fp.basename()
+
+    def quotaSize(self, request):
+        # FIXME: tests, workingness
+        return succeed(0)
+
+
+
+class _AddressBookChildHelper(object):
+    """
+    Methods for things which are like addressbooks.
+    """
+
+    def _initializeWithAddressBook(self, addressbook, home):
+        """
+        Initialize with a addressbook.
+
+        @param addressbook: the wrapped addressbook.
+        @type addressbook: L{txcarddav.iaddressbookstore.IAddressBook}
+
+        @param home: the home through which the given addressbook was accessed.
+        @type home: L{txcarddav.iaddressbookstore.IAddressBookHome}
+        """
+        self._newStoreAddressBook = addressbook
+        self._newStoreParentHome = home
+        self._dead_properties = _NewStorePropertiesWrapper(
+            self._newStoreAddressBook.properties()
+        )
+
+
+    def index(self):
+        """
+        Retrieve the new-style index wrapper.
+        """
+        return self._newStoreAddressBook.retrieveOldIndex()
+
+
+    def invitesDB(self):
+        """
+        Retrieve the new-style invites DB wrapper.
+        """
+        if not hasattr(self, "_invitesDB"):
+            self._invitesDB = self._newStoreAddressBook.retrieveOldInvites()
+        return self._invitesDB
+
+    def exists(self):
+        # FIXME: tests
+        return True
+
+
+    @classmethod
+    def transform(cls, self, addressbook, home):
+        """
+        Transform C{self} into a L{AddressBookCollectionFile}.
+        """
+        self.__class__ = cls
+        self._initializeWithAddressBook(addressbook, home)
+
+
+    def createSimilarFile(self, path):
+        """
+        Create a L{AddressBookObjectFile} or L{ProtoAddressBookObjectFile} based on a
+        path object.
+        """
+        if not isinstance(path, FilePath):
+            path = FilePath(path)
+
+        newStoreObject = self._newStoreAddressBook.addressbookObjectWithName(
+            path.basename()
+        )
+
+        if newStoreObject is not None:
+            similar = AddressBookObjectFile(newStoreObject, path,
+                principalCollections=self._principalCollections)
+        else:
+            # FIXME: creation in http_PUT should talk to a specific resource
+            # type; this is the domain of StoreAddressBookObjectResource.
+            # similar = ProtoAddressBookObjectFile(self._newStoreAddressBook, path)
+            similar = ProtoAddressBookObjectFile(self._newStoreAddressBook, path,
+                principalCollections=self._principalCollections)
+
+        # FIXME: tests should be failing without this line.
+        # Specifically, http_PUT won't be committing its transaction properly.
+        self.propagateTransaction(similar)
+        return similar
+
+
+    def quotaSize(self, request):
+        # FIXME: tests, workingness
+        return succeed(0)
+
+
+
+class AddressBookCollectionFile(_AddressBookChildHelper, CalDAVFile):
+    """
+    Wrapper around a L{txcarddav.iaddressbook.IAddressBook}.
+    """
+
+    def __init__(self, addressbook, home, *args, **kw):
+        """
+        Create a AddressBookCollectionFile from a L{txcarddav.iaddressbook.IAddressBook}
+        and the arguments required for L{CalDAVFile}.
+        """
+        super(AddressBookCollectionFile, self).__init__(*args, **kw)
+        self._initializeWithAddressBook(addressbook, home)
+
+
+    def isCollection(self):
+        return True
+
+
+    def isAddressBookCollection(self):
+        """
+        Yes, it is a calendar collection.
+        """
+        return True
+
+
+    @requiresPermissions(fromParent=[davxml.Unbind()])
+    @inlineCallbacks
+    def http_DELETE(self, request):
+        """
+        Override http_DELETE to validate 'depth' header. 
+        """
+        depth = request.headers.getHeader("depth", "infinity")
+        if depth != "infinity":
+            msg = "illegal depth header for DELETE on collection: %s" % (
+                depth,
+            )
+            log.err(msg)
+            raise HTTPError(StatusResponse(BAD_REQUEST, msg))
+        response = (yield self.storeRemove(request, request.uri))
+        returnValue(response)
+
+
+    @inlineCallbacks
+    def storeRemove(self, request, where):
+        """
+        Delete this addressbook collection resource, first deleting each contained
+        addressbook resource.
+
+        This has to emulate the behavior in fileop.delete in that any errors
+        need to be reported back in a multistatus response.
+
+        @param request: The request used to locate child resources.  Note that
+            this is the request which I{triggered} the C{DELETE}, but which may
+            not actually be a C{DELETE} request itself.
+
+        @type request: L{twext.web2.iweb.IRequest}
+
+        @param where: the URI at which the resource is being deleted.
+        @type where: C{str}
+
+        @return: an HTTP response suitable for sending to a client (or
+            including in a multi-status).
+
+         @rtype: something adaptable to L{twext.web2.iweb.IResponse}
+        """
+
+        # Check virtual share first
+        isVirtual = yield self.isVirtualShare(request)
+        if isVirtual:
+            log.debug("Removing shared calendar %s" % (self,))
+            yield self.removeVirtualShare(request)
+            returnValue(NO_CONTENT)
+
+        log.debug("Deleting addressbook %s" % (self,))
+
+        # 'deluri' is this resource's URI; I should be able to synthesize it
+        # from 'self'.
+
+        errors = ResponseQueue(where, "DELETE", NO_CONTENT)
+
+        for childname in self.listChildren():
+
+            childurl = joinURL(where, childname)
+
+            # FIXME: use a more specific API; we should know what this child
+            # resource is, and not have to look it up.  (Sharing information
+            # needs to move into the back-end first, though.)
+            child = (yield request.locateChildResource(self, childname))
+
+            try:
+                yield child.storeRemove(request, childurl)
+            except:
+                logDefaultException()
+                errors.add(childurl, BAD_REQUEST)
+
+        # Now do normal delete
+
+        # Handle sharing
+        wasShared = (yield self.isShared(request))
+        if wasShared:
+            yield self.downgradeFromShare(request)
+
+        # Actually delete it.
+        self._newStoreParentHome.removeAddressBookWithName(
+            self._newStoreAddressBook.name()
+        )
+        self.__class__ = ProtoAddressBookCollectionFile
+        del self._newStoreAddressBook
+
+        # FIXME: handle exceptions, possibly like this:
+
+        #        if isinstance(more_responses, MultiStatusResponse):
+        #            # Merge errors
+        #            errors.responses.update(more_responses.children)
+
+        response = errors.response()
+
+        returnValue(response)
+
+
+    def http_COPY(self, request):
+        """
+        Copying of addressbook collections isn't allowed.
+        """
+        # FIXME: no direct tests
+        return FORBIDDEN
+
+
+    # FIXME: access control
+    @inlineCallbacks
+    def http_MOVE(self, request):
+        """
+        Moving a addressbook collection is allowed for the purposes of changing
+        that addressbook's name.
+        """
+        # FIXME: created to fix CDT test, no unit tests yet
+        sourceURI = request.uri
+        destinationURI = urlsplit(request.headers.getHeader("destination"))[2]
+        if parentForURL(sourceURI) != parentForURL(destinationURI):
+            returnValue(FORBIDDEN)
+        destination = yield request.locateResource(destinationURI)
+        # FIXME: should really use something other than 'fp' attribute.
+        basename = destination.fp.basename()
+        addressbook = self._newStoreAddressBook
+        addressbook.rename(basename)
+        AddressBookCollectionFile.transform(destination, addressbook,
+                                         self._newStoreParentHome)
+        del self._newStoreAddressBook
+        self.__class__ = ProtoAddressBookCollectionFile
+        returnValue(NO_CONTENT)
+
+
+
+class ProtoAddressBookCollectionFile(CalDAVFile):
+    """
+    A resource representing an addressbook collection which hasn't yet been created.
+    """
+
+    def __init__(self, home, *args, **kw):
+        """
+        A placeholder resource for an addressbook collection which does not yet
+        exist, but will become a L{AddressBookCollectionFile}.
+
+        @param home: The addressbook home which will be this resource's parent,
+            when it exists.
+
+        @type home: L{txcarddav.iaddressbookstore.IAddressBookHome}
+        """
+        self._newStoreParentHome = home
+        super(ProtoAddressBookCollectionFile, self).__init__(*args, **kw)
+
+
+    def isCollection(self):
+        return True
+
+
+    def createSimilarFile(self, path):
+        # FIXME: this is necessary for 
+        # twistedcaldav.test.test_mkcol.
+        #     MKCOL.test_make_addressbook_no_parent - there should be a more
+        # structured way to refuse creation with a non-existent parent.
+        return NoParent(path)
+
+
+    def provisionFile(self):
+        """
+        Create an addressbook collection.
+        """
+        # FIXME: this should be done in the backend; provisionDefaultAddressBooks
+        # should go away.
+        return self.createAddressBookCollection()
+
+
+    def createAddressBookCollection(self):
+        """
+        Override C{createAddressBookCollection} to actually do the work.
+        """
+        d = succeed(CREATED)
+
+        Name = self.fp.basename()
+        self._newStoreParentHome.createAddressBookWithName(Name)
+        newStoreAddressBook = self._newStoreParentHome.addressbookWithName(
+            Name
+        )
+        AddressBookCollectionFile.transform(
+            self, newStoreAddressBook, self._newStoreParentHome
+        )
+        return d
+
+
+    def exists(self):
+        # FIXME: tests
+        return False
+
+
+    def provision(self):
+        """
+        This resource should do nothing if it's provisioned.
+        """
+        # FIXME: should be deleted, or raise an exception
+
+
+    def quotaSize(self, request):
+        # FIXME: tests, workingness
+        return succeed(0)
+
+
+class GlobalAddressBookCollectionFile(_AddressBookChildHelper, GlobalAddressBookFile):
+    """
+    Wrapper around a L{txcarddav.iaddressbook.IAddressBook}.
+    """
+
+    def __init__(self, addressbook, home, *args, **kw):
+        """
+        Create a GlobalAddressBookCollectionFile from a L{txcarddav.iaddressbook.IAddressBook}
+        and the arguments required for L{CalDAVFile}.
+        """
+        super(GlobalAddressBookCollectionFile, self).__init__(*args, **kw)
+        self._initializeWithAddressBook(addressbook, home)
+
+
+    def isCollection(self):
+        return True
+
+    def isAddressBookCollection(self):
+        """
+        Yes, it is a calendar collection.
+        """
+        return True
+
+class ProtoGlobalAddressBookCollectionFile(GlobalAddressBookFile):
+    """
+    A resource representing an addressbook collection which hasn't yet been created.
+    """
+
+    def __init__(self, home, *args, **kw):
+        """
+        A placeholder resource for an addressbook collection which does not yet
+        exist, but will become a L{GlobalAddressBookCollectionFile}.
+
+        @param home: The addressbook home which will be this resource's parent,
+            when it exists.
+
+        @type home: L{txcarddav.iaddressbookstore.IAddressBookHome}
+        """
+        self._newStoreParentHome = home
+        super(ProtoGlobalAddressBookCollectionFile, self).__init__(*args, **kw)
+
+
+    def isCollection(self):
+        return True
+
+
+    def createSimilarFile(self, path):
+        # FIXME: this is necessary for 
+        # twistedcaldav.test.test_mkcol.
+        #     MKCOL.test_make_addressbook_no_parent - there should be a more
+        # structured way to refuse creation with a non-existent parent.
+        return NoParent(path)
+
+
+    def provisionFile(self):
+        """
+        Create an addressbook collection.
+        """
+        # FIXME: this should be done in the backend; provisionDefaultAddressBooks
+        # should go away.
+        return self.createAddressBookCollection()
+
+
+    def createAddressBookCollection(self):
+        """
+        Override C{createAddressBookCollection} to actually do the work.
+        """
+        d = succeed(CREATED)
+
+        Name = self.fp.basename()
+        self._newStoreParentHome.createAddressBookWithName(Name)
+        newStoreAddressBook = self._newStoreParentHome.addressbookWithName(
+            Name
+        )
+        GlobalAddressBookCollectionFile.transform(
+            self, newStoreAddressBook, self._newStoreParentHome
+        )
+        return d
+
+
+    def exists(self):
+        # FIXME: tests
+        return False
+
+
+    def provision(self):
+        """
+        This resource should do nothing if it's provisioned.
+        """
+        # FIXME: should be deleted, or raise an exception
+
+
+    def quotaSize(self, request):
+        # FIXME: tests, workingness
+        return succeed(0)
+
+
+
+class AddressBookObjectFile(CalDAVFile, FancyEqMixin):
+    """
+    A resource wrapping a addressbook object.
+    """
+
+    compareAttributes = '_newStoreObject'.split()
+
+    def __init__(self, Object, *args, **kw):
+        """
+        Construct a L{AddressBookObjectFile} from an L{IAddressBookObject}.
+
+        @param Object: The storage for the addressbook object.
+        @type Object: L{txcarddav.iaddressbookstore.IAddressBookObject}
+        """
+        super(AddressBookObjectFile, self).__init__(*args, **kw)
+        self._initializeWithObject(Object)
+
+
+    def inNewTransaction(self, request):
+        """
+        Implicit auto-replies need to span multiple transactions.  Clean out the
+        given request's resource-lookup mapping, transaction, and re-look-up my
+        addressbook object in a new transaction.
+
+        Return the new transaction so it can be committed.
+        """
+        # FIXME: private names from 'file' implementation; maybe there should be
+        # a public way to do this?  or maybe we should just have a real queue.
+        objectName = self._newStoreObject.name()
+        Name = self._newStoreObject._addressbook.name()
+        homeUID = self._newStoreObject._addressbook._addressbookHome.uid()
+        store = self._newStoreObject._transaction.store()
+        txn = store.newTransaction("new AB transaction for " + self._newStoreObject.name())
+        newObject = (txn.HomeWithUID(homeUID)
+                        .addressbookWithName(Name)
+                        .addressbookObjectWithName(objectName))
+        request._newStoreTransaction = txn
+        request._resourcesByURL.clear()
+        request._urlsByResource.clear()
+        self._initializeWithObject(newObject)
+        return txn
+
+
+    def isCollection(self):
+        return False
+
+    def exists(self):
+        # FIXME: Tests
+        return True
+
+
+    def name(self):
+        return self._newStoreObject.name()
+
+    def etag(self):
+        # FIXME: far too slow to be used for real, but I needed something to
+        # placate the etag computation in the case where the file doesn't exist
+        # yet (an uncommited transaction creating this addressbook file)
+
+        # FIXME: direct tests
+        try:
+            if self.hasDeadProperty(TwistedGETContentMD5):
+                return ETag(str(self.readDeadProperty(TwistedGETContentMD5)))
+            else:
+                return ETag(
+                    hashlib.new("md5", self.vCardText()).hexdigest(),
+                    weak=False
+                )
+        except (NoSuchObjectResourceError, InternalDataStoreError):
+            # FIXME: a workaround for the fact that DELETE still rudely vanishes
+            # the addressbook object out from underneath the store, and doesn't
+            # call storeRemove.
+            return None
+
+
+    def newStoreProperties(self):
+        return self._newStoreObject.properties()
+
+
+    def quotaSize(self, request):
+        # FIXME: tests
+        return succeed(len(self._newStoreObject.vCardText()))
+
+
+    def vCardText(self, ignored=None):
+        assert ignored is None, "This is a addressbook object, not a addressbook"
+        return self._newStoreObject.vCardText()
+
+
+    @requiresPermissions(fromParent=[davxml.Unbind()])
+    def http_DELETE(self, request):
+        """
+        Override http_DELETE to validate 'depth' header. 
+        """
+        return self.storeRemove(request, request.uri)
+
+
+    @inlineCallbacks
+    def storeStream(self, stream):
+        # FIXME: direct tests
+        component = VCard.fromString(
+            (yield allDataFromStream(stream))
+        )
+        self._newStoreObject.setComponent(component)
+        returnValue(NO_CONTENT)
+
+
+    @inlineCallbacks
+    def storeRemove(self, request, where):
+        """
+        Remove this addressbook object.
+        """
+        # Do quota checks before we start deleting things
+        myquota = (yield self.quota(request))
+        if myquota is not None:
+            old_size = (yield self.quotaSize(request))
+        else:
+            old_size = 0
+
+        try:
+
+            storeAddressBook = self._newStoreObject._addressbook
+
+            # Do delete
+
+            # FIXME: public attribute please
+            storeAddressBook.removeAddressBookObjectWithName(self._newStoreObject.name())
+
+            # FIXME: clean this up with a 'transform' method
+            self._newStoreParentAddressBook = storeAddressBook
+            del self._newStoreObject
+            self.__class__ = ProtoAddressBookObjectFile
+
+            # Adjust quota
+            if myquota is not None:
+                yield self.quotaSizeAdjust(request, -old_size)
+
+        except MemcacheLockTimeoutError:
+            raise HTTPError(StatusResponse(CONFLICT, "Resource: %s currently in use on the server." % (where,)))
+
+        returnValue(NO_CONTENT)
+
+
+    def _initializeWithObject(self, Object):
+        self._newStoreObject = Object
+        self._dead_properties = _NewStorePropertiesWrapper(
+            self._newStoreObject.properties()
+        )
+
+
+    @classmethod
+    def transform(cls, self, Object):
+        self.__class__ = cls
+        self._initializeWithObject(Object)
+
+
+
+class ProtoAddressBookObjectFile(CalDAVFile, FancyEqMixin):
+
+    compareAttributes = '_newStoreParentAddressBook'.split()
+
+    def __init__(self, parentAddressBook, *a, **kw):
+        super(ProtoAddressBookObjectFile, self).__init__(*a, **kw)
+        self._newStoreParentAddressBook = parentAddressBook
+
+
+    @inlineCallbacks
+    def storeStream(self, stream):
+        # FIXME: direct tests 
+        component = VCard.fromString(
+            (yield allDataFromStream(stream))
+        )
+        self._newStoreParentAddressBook.createAddressBookObjectWithName(
+            self.fp.basename(), component
+        )
+        AddressBookObjectFile.transform(self, self._newStoreParentAddressBook.addressbookObjectWithName(self.fp.basename()))
+        returnValue(CREATED)
+
+
+    def createSimilarFile(self, name):
+        return None
+
+
+    def isCollection(self):
+        return False
+
+
+    def exists(self):
+        # FIXME: tests
+        return False
+
+
+    def name(self):
+        return self.fp.basename()
+
+    def quotaSize(self, request):
+        # FIXME: tests, workingness
+        return succeed(0)
+
+
+class _NotificationChildHelper(object):
+    """
+    Methods for things which are like notification objects.
+    """
+
+    def _initializeWithNotifications(self, notifications, home):
+        """
+        Initialize with a notification collection.
+
+        @param notifications: the wrapped notification collection backend
+            object.
+        @type notifications: L{txdav.common.inotification.INotificationCollection}
+
+        @param home: the home through which the given notification collection
+            was accessed.
+        @type home: L{txdav.icommonstore.ICommonHome}
+        """
+        self._newStoreNotifications = notifications
+        self._newStoreParentHome = home
+        self._dead_properties = _NewStorePropertiesWrapper(
+            self._newStoreNotifications.properties()
+        )
+
+
+    def notificationsDB(self):
+        """
+        Retrieve the new-style index wrapper.
+        """
+        return self._newStoreNotifications.retrieveOldIndex()
+
+
+    def exists(self):
+        # FIXME: tests
+        return True
+
+
+    @classmethod
+    def transform(cls, self, notifications, home):
+        """
+        Transform C{self} into a L{NotificationCollectionFile}.
+        """
+        self.__class__ = cls
+        self._initializeWithNotifications(notifications, home)
+
+
+    def createSimilarFile(self, path):
+        """
+        Create a L{NotificationObjectFile} or L{ProtoNotificationObjectFile} based on a
+        path object.
+        """
+        if not isinstance(path, FilePath):
+            path = FilePath(path)
+
+        newStoreObject = self._newStoreNotifications.notificationObjectWithName(
+            path.basename()
+        )
+
+        if newStoreObject is not None:
+            similar = StoreNotificationObjectFile(newStoreObject, path, self)
+        else:
+            # FIXME: creation in http_PUT should talk to a specific resource
+            # type; this is the domain of StoreCalendarObjectResource.
+            # similar = ProtoCalendarObjectFile(self._newStoreCalendar, path)
+            similar = ProtoStoreNotificationObjectFile(self._newStoreNotifications, path, self)
+
+        # FIXME: tests should be failing without this line.
+        # Specifically, http_PUT won't be committing its transaction properly.
+        self.propagateTransaction(similar)
+        return similar
+
+
+    def quotaSize(self, request):
+        # FIXME: tests, workingness
+        return succeed(0)
+
+
+
+class StoreNotificationCollectionFile(_NotificationChildHelper,
+                                      NotificationCollectionFile):
+    """
+    Wrapper around a L{txcaldav.icalendar.ICalendar}.
+    """
+
+    def __init__(self, notifications, home, *args, **kw):
+        """
+        Create a CalendarCollectionFile from a L{txcaldav.icalendar.ICalendar}
+        and the arguments required for L{CalDAVFile}.
+        """
+        super(StoreNotificationCollectionFile, self).__init__(*args, **kw)
+        self._initializeWithNotifications(notifications, home)
+
+
+    def isCollection(self):
+        return True
+
+
+    @inlineCallbacks
+    def http_DELETE(self, request):
+        """
+        Override http_DELETE to reject. 
+        """
+        raise HTTPError(StatusResponse(FORBIDDEN, "Cannot delete notification collections"))
+
+
+    def http_COPY(self, request):
+        """
+        Copying of calendar collections isn't allowed.
+        """
+        raise HTTPError(StatusResponse(FORBIDDEN, "Cannot copy notification collections"))
+
+
+    @inlineCallbacks
+    def http_MOVE(self, request):
+        """
+        Moving a calendar collection is allowed for the purposes of changing
+        that calendar's name.
+        """
+        raise HTTPError(StatusResponse(FORBIDDEN, "Cannot move notification collections"))
+
+
+
+class StoreNotificationObjectFile(NotificationFile):
+    """
+    A resource wrapping a calendar object.
+    """
+
+    def __init__(self, notificationObject, *args, **kw):
+        """
+        Construct a L{CalendarObjectFile} from an L{ICalendarObject}.
+
+        @param calendarObject: The storage for the calendar object.
+        @type calendarObject: L{txcaldav.icalendarstore.ICalendarObject}
+        """
+        super(StoreNotificationObjectFile, self).__init__(*args, **kw)
+        self._initializeWithObject(notificationObject)
+
+
+    def isCollection(self):
+        return False
+
+
+    def exists(self):
+        # FIXME: Tests
+        return True
+
+
+    def etag(self):
+        # FIXME: far too slow to be used for real, but I needed something to
+        # placate the etag computation in the case where the file doesn't exist
+        # yet (an uncommited transaction creating this calendar file)
+
+        # FIXME: direct tests
+        try:
+            if self.hasDeadProperty(TwistedGETContentMD5):
+                return ETag(str(self.readDeadProperty(TwistedGETContentMD5)))
+            else:
+                return ETag(
+                    hashlib.new("md5", self.text()).hexdigest(),
+                    weak=False
+                )
+        except NoSuchObjectResourceError:
+            # FIXME: a workaround for the fact that DELETE still rudely vanishes
+            # the calendar object out from underneath the store, and doesn't
+            # call storeRemove.
+            return None
+
+
+    def newStoreProperties(self):
+        return self._newStoreObject.properties()
+
+
+    def quotaSize(self, request):
+        # FIXME: tests
+        return succeed(len(self._newStoreObject.xmldata()))
+
+
+    def text(self, ignored=None):
+        assert ignored is None, "This is a notification object, not a notification"
+        return self._newStoreObject.xmldata()
+
+
+    @requiresPermissions(fromParent=[davxml.Unbind()])
+    def http_DELETE(self, request):
+        """
+        Override http_DELETE to validate 'depth' header. 
+        """
+        return self.storeRemove(request, request.uri)
+
+
+    @inlineCallbacks
+    def storeRemove(self, request, where):
+        """
+        Remove this notification object.
+        """
+        # Do quota checks before we start deleting things
+        myquota = (yield self.quota(request))
+        if myquota is not None:
+            old_size = (yield self.quotaSize(request))
+        else:
+            old_size = 0
+
+        try:
+
+            storeNotifications = self._newStoreObject._notificationCollection
+
+            # Do delete
+
+            # FIXME: public attribute please
+            storeNotifications.removeNotificationObjectWithName(self._newStoreObject.name())
+
+            # FIXME: clean this up with a 'transform' method
+            self._newStoreParentNotifications = storeNotifications
+            del self._newStoreObject
+            self.__class__ = ProtoStoreNotificationObjectFile
+
+            # Adjust quota
+            if myquota is not None:
+                yield self.quotaSizeAdjust(request, -old_size)
+
+        except MemcacheLockTimeoutError:
+            raise HTTPError(StatusResponse(CONFLICT, "Resource: %s currently in use on the server." % (where,)))
+
+        returnValue(NO_CONTENT)
+
+
+    def _initializeWithObject(self, notificationObject):
+        self._newStoreObject = notificationObject
+        self._dead_properties = _NewStorePropertiesWrapper(
+            self._newStoreObject.properties()
+        )
+
+
+    @classmethod
+    def transform(cls, self, notificationObject):
+        self.__class__ = cls
+        self._initializeWithObject(notificationObject)
+
+
+
+class ProtoStoreNotificationObjectFile(NotificationFile):
+
+    def __init__(self, parentNotifications, *a, **kw):
+        super(ProtoStoreNotificationObjectFile, self).__init__(*a, **kw)
+        self._newStoreParentNotifications = parentNotifications
+
+
+    def isCollection(self):
+        return False
+
+
+    def exists(self):
+        # FIXME: tests
+        return False
+
+
+    def quotaSize(self, request):
+        # FIXME: tests, workingness
+        return succeed(0)
+
+
+

Modified: CalendarServer/trunk/twistedcaldav/test/__init__.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/__init__.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/__init__.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,3 +1,4 @@
+# -*- test-case-name: twistedcaldav.test -*-
 ##
 # Copyright (c) 2005-2007 Apple Inc. All rights reserved.
 #

Modified: CalendarServer/trunk/twistedcaldav/test/test_DAV.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_DAV.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/test_DAV.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -27,10 +27,20 @@
 import twext.web2.dav.test.test_put
 import twext.web2.dav.test.test_report
 import twext.web2.dav.test.test_report_expand
+from twisted.trial.unittest import SkipTest
 
-class ACL           (twext.web2.dav.test.test_acl.ACL                    ): resource_class = MyResource
+def ignored(self):
+    raise SkipTest("method requires backing store objects, tested elsewhere")
+
+class ACL           (twext.web2.dav.test.test_acl.ACL                    ):
+    resource_class = MyResource
+    test_DELETE = ignored
+
 class COPY          (twext.web2.dav.test.test_copy.COPY                  ): resource_class = MyResource
-class DELETE        (twext.web2.dav.test.test_delete.DELETE              ): resource_class = MyResource
+class DELETE        (twext.web2.dav.test.test_delete.DELETE              ):
+    resource_class = MyResource
+    test_DELETE = ignored
+
 class LOCK_UNLOCK   (twext.web2.dav.test.test_lock.LOCK_UNLOCK           ): resource_class = MyResource
 class MKCOL         (twext.web2.dav.test.test_mkcol.MKCOL                ): resource_class = MyResource
 class MOVE          (twext.web2.dav.test.test_move.MOVE                  ): resource_class = MyResource

Modified: CalendarServer/trunk/twistedcaldav/test/test_addressbookmultiget.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_addressbookmultiget.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/test_addressbookmultiget.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -25,13 +25,13 @@
 from twext.web2.dav.util import davXMLFromStream
 from twext.web2.test.test_server import SimpleRequest
 
-import twistedcaldav.test.util
 from twistedcaldav import carddavxml
 from twistedcaldav import vcard
 from twistedcaldav.index import db_basename
 from twistedcaldav.config import config
+from twistedcaldav.test.util import AddressBookHomeTestCase
 
-class AddressBookMultiget (twistedcaldav.test.util.TestCase):
+class AddressBookMultiget (AddressBookHomeTestCase):
     """
     addressbook-multiget REPORT
     """

Modified: CalendarServer/trunk/twistedcaldav/test/test_addressbookquery.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_addressbookquery.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/test_addressbookquery.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -25,12 +25,12 @@
 from twext.web2.dav.util import davXMLFromStream
 from twext.web2.test.test_server import SimpleRequest
 
-import twistedcaldav.test.util
 from twistedcaldav import carddavxml, vcard
 from twistedcaldav.index import db_basename
 from twistedcaldav.config import config
+from twistedcaldav.test.util import AddressBookHomeTestCase
 
-class AddressBookQuery (twistedcaldav.test.util.TestCase):
+class AddressBookQuery (AddressBookHomeTestCase):
     """
     addressbook-query REPORT
     """

Modified: CalendarServer/trunk/twistedcaldav/test/test_calendarquery.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_calendarquery.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/test_calendarquery.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -26,14 +26,14 @@
 from twext.web2.dav.util import davXMLFromStream
 from twext.web2.test.test_server import SimpleRequest
 
-import twistedcaldav.test.util
 from twistedcaldav import caldavxml
 from twistedcaldav import ical
 from twistedcaldav.index import db_basename
 from twistedcaldav.query import calendarqueryfilter
 from twistedcaldav.config import config
+from twistedcaldav.test.util import HomeTestCase
 
-class CalendarQuery (twistedcaldav.test.util.TestCase):
+class CalendarQuery (HomeTestCase):
     """
     calendar-query REPORT
     """
@@ -293,6 +293,8 @@
 
         if os.path.exists(calendar_path): rmdir(calendar_path)
 
+        mkrequest = SimpleRequest(self.site, "MKCALENDAR", calendar_uri)
+
         def do_report(response):
             response = IResponse(response)
 
@@ -323,6 +325,4 @@
 
             return self.send(request, do_test)
 
-        request = SimpleRequest(self.site, "MKCALENDAR", calendar_uri)
-
-        return self.send(request, do_report)
+        return self.send(mkrequest, do_report)

Modified: CalendarServer/trunk/twistedcaldav/test/test_collectioncontents.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_collectioncontents.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/test_collectioncontents.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -14,9 +14,8 @@
 # limitations under the License.
 ##
 
-import os
-
 from twisted.internet.defer import DeferredList
+from twext.python.filepath import CachingFilePath as FilePath
 from twext.web2 import responsecode
 from twext.web2.iweb import IResponse
 from twext.web2.stream import MemoryStream, FileStream
@@ -27,41 +26,48 @@
 from twistedcaldav.memcachelock import MemcacheLock
 from twistedcaldav.memcacher import Memcacher
 from twistedcaldav.method.put_common import StoreCalendarObjectResource
-import twistedcaldav.test.util
 
-class CollectionContents (twistedcaldav.test.util.TestCase):
+
+from twistedcaldav.test.util import HomeTestCase
+
+class CollectionContents(HomeTestCase):
     """
     PUT request
     """
-    data_dir = os.path.join(os.path.dirname(__file__), "data")
 
+    dataPath = FilePath(__file__).sibling("data")
+
     def setUp(self):
-        
         # Need to fake out memcache
         def _getFakeMemcacheProtocol(self):
-            
             result = super(MemcacheLock, self)._getMemcacheProtocol()
             if isinstance(result, Memcacher.nullCacher):
                 result = self._memcacheProtocol = Memcacher.memoryCacher()
-            
             return result
-        
-        MemcacheLock._getMemcacheProtocol = _getFakeMemcacheProtocol
 
+        self.patch(MemcacheLock, "_getMemcacheProtocol",
+                   _getFakeMemcacheProtocol)
+
         # Need to not do implicit behavior during these tests
         def _fakeDoImplicitScheduling(self):
             return False, False, False
-        
-        StoreCalendarObjectResource.doImplicitScheduling = _fakeDoImplicitScheduling
 
+        self.patch(StoreCalendarObjectResource , "doImplicitScheduling",
+                   _fakeDoImplicitScheduling)
+
+        # Tests in this suite assume that the root resource is a calendar home.
+        # FIXME: there should be a centralized way of saying 'make this look
+        # like a calendar home'
         super(CollectionContents, self).setUp()
 
+
     def test_collection_in_calendar(self):
         """
         Make (regular) collection in calendar
         """
         calendar_path, calendar_uri = self.mkdtemp("collection_in_calendar")
-        os.rmdir(calendar_path)
+        calPath = FilePath(calendar_path)
+        calPath.remove()
 
         def mkcalendar_cb(response):
             response = IResponse(response)
@@ -75,7 +81,7 @@
                 if response.code != responsecode.FORBIDDEN:
                     self.fail("Incorrect response to nested MKCOL: %s" % (response.code,))
 
-            nested_uri  = os.path.join(calendar_uri, "nested")
+            nested_uri = "/".join([calendar_uri, "nested"])
 
             request = SimpleRequest(self.site, "MKCOL", nested_uri)
             self.send(request, mkcol_cb)
@@ -95,27 +101,37 @@
         finally:
             dst_file.close()
 
+    def openHolidays(self):
+        """
+        Open the 'Holidays.ics' calendar.
+
+        @return: an open file pointing at the start of Holidays.ics
+
+        @rtype: C{file}
+        """
+        f = self.dataPath.child("Holidays.ics").open()
+        self.addCleanup(f.close)
+        return f
+
+
     def test_monolithic_ical(self):
         """
         Monolithic iCalendar file in calendar collection
         """
         # FIXME: Should FileStream be OK here?
-        dst_file = file(os.path.join(self.data_dir, "Holidays.ics"))
-        try:
-            stream = FileStream(dst_file)
-            return self._test_file_in_calendar("monolithic iCalendar file in calendar", (stream, responsecode.FORBIDDEN))
-        finally:
-            dst_file.close()
+        dst_file = self.openHolidays()
+        stream = FileStream(dst_file)
+        return self._test_file_in_calendar("monolithic iCalendar file in calendar", (stream, responsecode.FORBIDDEN))
 
+
     def test_single_events(self):
         """
         Single events in calendar collection
         """
         work = []
 
-        stream = file(os.path.join(self.data_dir, "Holidays.ics"))
-        try: calendar = Component.fromStream(stream)
-        finally: stream.close()
+        stream = self.openHolidays()
+        calendar = Component.fromStream(stream)
 
         for subcomponent in calendar.subcomponents():
             if subcomponent.name() == "VEVENT":
@@ -126,20 +142,24 @@
 
         return self._test_file_in_calendar("single event in calendar", *work)
 
+
     def test_duplicate_uids(self):
         """
         Mutiple resources with the same UID.
         """
-        stream = file(os.path.join(self.data_dir, "Holidays", "C318AA54-1ED0-11D9-A5E0-000A958A3252.ics"))
+        stream = self.dataPath.child(
+            "Holidays").child(
+            "C318AA54-1ED0-11D9-A5E0-000A958A3252.ics").open()
         try: calendar = str(Component.fromStream(stream))
         finally: stream.close()
 
         return self._test_file_in_calendar(
             "mutiple resources with the same UID",
-            (MemoryStream(calendar), responsecode.CREATED  ),
+            (MemoryStream(calendar), responsecode.CREATED),
             (MemoryStream(calendar), responsecode.FORBIDDEN),
         )
 
+
     def _test_file_in_calendar(self, what, *work):
         """
         Creates a calendar collection, then PUTs a resource into that collection
@@ -147,7 +167,8 @@
         PUT request matches the given response_code.
         """
         calendar_path, calendar_uri = self.mkdtemp("calendar")
-        os.rmdir(calendar_path)
+        calPath = FilePath(calendar_path)
+        calPath.remove()
 
         def mkcalendar_cb(response):
             response = IResponse(response)
@@ -155,7 +176,7 @@
             if response.code != responsecode.CREATED:
                 self.fail("MKCALENDAR failed: %s" % (response.code,))
 
-            if not os.path.isdir(calendar_path):
+            if not calPath.isdir():
                 self.fail("MKCALENDAR did not create a collection")
 
             ds = []
@@ -164,12 +185,11 @@
             for stream, response_code in work:
                 def put_cb(response, stream=stream, response_code=response_code):
                     response = IResponse(response)
-    
+
                     if response.code != response_code:
                         self.fail("Incorrect response to %s: %s (!= %s)" % (what, response.code, response_code))
 
-                dst_uri  = os.path.join(calendar_uri, "dst%d.ics" % (c,))
-    
+                dst_uri = "/".join([calendar_uri, "dst%d.ics" % (c,)])
                 request = SimpleRequest(self.site, "PUT", dst_uri)
                 request.headers.setHeader("if-none-match", "*")
                 request.headers.setHeader("content-type", MimeType("text", "calendar"))
@@ -187,11 +207,9 @@
         """
         Make sure database files are not listed as children.
         """
-        colpath = self.site.resource.fp.path
-        fd = open(os.path.join(colpath, "._bogus"), "w")
-        fd.close()
-        fd = open(os.path.join(colpath, "bogus"), "w")
-        fd.close()
+        colpath = self.site.resource.fp
+        colpath.child("._bogus").touch()
+        colpath.child("bogus").touch()
         children = self.site.resource.listChildren()
         self.assertTrue("bogus" in children)
         self.assertFalse("._bogus" in children)
@@ -201,7 +219,8 @@
         Make (regular) collection in calendar
         """
         calendar_path, calendar_uri = self.mkdtemp("dot_file_in_calendar")
-        os.rmdir(calendar_path)
+        calPath = FilePath(calendar_path)
+        calPath.remove()
 
         def mkcalendar_cb(response):
             response = IResponse(response)
@@ -215,11 +234,14 @@
                 if response.code != responsecode.FORBIDDEN:
                     self.fail("Incorrect response to dot file PUT: %s" % (response.code,))
 
-            stream = file(os.path.join(self.data_dir, "Holidays", "C318AA54-1ED0-11D9-A5E0-000A958A3252.ics"))
+            stream = self.dataPath.child(
+                "Holidays").child(
+                "C318AA54-1ED0-11D9-A5E0-000A958A3252.ics"
+            ).open()
             try: calendar = str(Component.fromStream(stream))
             finally: stream.close()
 
-            event_uri  = os.path.join(calendar_uri, ".event.ics")
+            event_uri = "/".join([calendar_uri, ".event.ics"])
 
             request = SimpleRequest(self.site, "PUT", event_uri)
             request.headers.setHeader("content-type", MimeType("text", "calendar"))

Modified: CalendarServer/trunk/twistedcaldav/test/test_index.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_index.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/test_index.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -30,6 +30,31 @@
 import datetime
 import os
 
+
+class MinimalResourceReplacement(object):
+    """
+    Provide the minimal set of attributes and methods from CalDAVFile required
+    by L{Index}.
+    """
+
+    def __init__(self, filePath):
+        self.fp = filePath
+
+
+    def isCalendarCollection(self):
+        return True
+
+
+    def getChild(self, name):
+        # FIXME: this should really return something with a child method
+        return self.fp.child(name)
+
+
+    def initSyncToken(self):
+        pass
+
+
+
 class SQLIndexTests (twistedcaldav.test.util.TestCase):
     """
     Test abstract SQL DB class
@@ -38,7 +63,10 @@
     def setUp(self):
         super(SQLIndexTests, self).setUp()
         self.site.resource.isCalendarCollection = lambda: True
-        self.db = Index(self.site.resource)
+        self.indexDirPath = self.site.resource.fp
+        # FIXME: since this resource lies about isCalendarCollection, it doesn't
+        # have all the associated backend machinery to actually get children.
+        self.db = Index(MinimalResourceReplacement(self.indexDirPath))
 
 
     def test_reserve_uid_ok(self):
@@ -231,7 +259,7 @@
             revision += 1
             calendar = Component.fromString(calendar_txt)
             if ok:
-                f = open(os.path.join(self.site.resource.fp.path, name), "w")
+                f = open(os.path.join(self.indexDirPath.path, name), "w")
                 f.write(calendar_txt)
                 del f
 
@@ -405,7 +433,7 @@
             revision += 1
             calendar = Component.fromString(calendar_txt)
 
-            f = open(os.path.join(self.site.resource.fp.path, name), "w")
+            f = open(os.path.join(self.indexDirPath.path, name), "w")
             f.write(calendar_txt)
             del f
 
@@ -804,7 +832,7 @@
             revision += 1
             calendar = Component.fromString(calendar_txt)
 
-            f = open(os.path.join(self.site.resource.fp.path, name), "w")
+            f = open(os.path.join(self.indexDirPath.path, name), "w")
             f.write(calendar_txt)
             del f
 

Modified: CalendarServer/trunk/twistedcaldav/test/test_mkcalendar.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_mkcalendar.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/test_mkcalendar.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -13,11 +13,11 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
-from twisted.internet.defer import inlineCallbacks
-from twistedcaldav import index
 
 import os
 
+from twisted.internet.defer import inlineCallbacks
+
 from twext.web2 import responsecode
 from twext.web2.iweb import IResponse
 from twext.web2.stream import MemoryStream
@@ -25,11 +25,10 @@
 from twext.web2.dav.fileop import rmdir
 from twext.web2.test.test_server import SimpleRequest
 
-import twistedcaldav.test.util
 from twistedcaldav import caldavxml
-from twistedcaldav.static import CalDAVFile
+from twistedcaldav.test.util import HomeTestCase
 
-class MKCALENDAR (twistedcaldav.test.util.TestCase):
+class MKCALENDAR (HomeTestCase):
     """
     MKCALENDAR request
     """
@@ -41,37 +40,36 @@
         """
         Make calendar
         """
-        uri  = "/calendar_make"
+        uri  = "/calendar_make/"
         path = os.path.join(self.docroot, uri[1:])
 
         if os.path.exists(path):
             rmdir(path)
 
+        request = SimpleRequest(self.site, "MKCALENDAR", uri)
+
+        @inlineCallbacks
         def do_test(response):
             response = IResponse(response)
 
-            if not os.path.isdir(path):
+            if response.code != responsecode.CREATED:
+                self.fail("Incorrect response to successful MKCALENDAR: %s"
+                          % (response.code,))
+            resource = (yield request.locateResource(uri))
+
+            if not resource:
                 self.fail("MKCALENDAR made no calendar")
 
-            resource = CalDAVFile(path)
             if not resource.isCalendarCollection():
                 self.fail("MKCALENDAR made non-calendar collection")
 
-            if response.code != responsecode.CREATED:
-                self.fail("Incorrect response to successful MKCALENDAR: %s"
-                          % (response.code,))
-
-            if not os.path.exists(os.path.join(path, index.db_basename)):
-                self.fail("Did not create index file when creating a calendar")
-
-        request = SimpleRequest(self.site, "MKCALENDAR", uri)
         return self.send(request, do_test)
 
     def test_make_calendar_with_props(self):
         """
         Make calendar with properties (CalDAV-access-09, section 5.3.1.2)
         """
-        uri  = "/calendar_prop"
+        uri  = "/calendar_prop/"
         path = os.path.join(self.docroot, uri[1:])
 
         if os.path.exists(path):
@@ -84,7 +82,7 @@
             if response.code != responsecode.CREATED:
                 self.fail("MKCALENDAR failed: %s" % (response.code,))
 
-            resource = CalDAVFile(path)
+            resource = (yield request.locateResource(uri))
             if not resource.isCalendarCollection():
                 self.fail("MKCALENDAR made non-calendar collection")
 
@@ -108,7 +106,7 @@
                           % (caldavxml.SupportedCalendarComponentSet.qname(),
                              supported_components[0].toxml(), caldavxml.CalendarComponent(name="VEVENT").toxml()))
 
-            tz = yield resource.readProperty(caldavxml.CalendarTimeZone, None)
+            tz = (yield resource.readProperty(caldavxml.CalendarTimeZone, None))
             tz = tz.calendar()
             self.failUnless(tz.resourceType() == "VTIMEZONE")
             self.failUnless(tuple(tz.subcomponents())[0].propertyValue("TZID") == "US-Eastern")
@@ -156,7 +154,7 @@
         """
         Make calendar with no parent
         """
-        uri  = "/no/parent/for/calendar"
+        uri  = "/no/parent/for/calendar/"
 
         def do_test(response):
             response = IResponse(response)
@@ -173,16 +171,37 @@
         """
         Make calendar on existing resource
         """
-        uri  = "/calendar_on_resource"
+        uri  = "/calendar_on_resource/"
         path = os.path.join(self.docroot, uri[1:])
 
         if not os.path.exists(path):
-            f = open(path, "w")
+            f = open(path[:-1], 'w')
             f.close()
 
         def do_test(response):
             response = IResponse(response)
 
+            if response.code != responsecode.NOT_ALLOWED:
+                self.fail("Incorrect response to MKCALENDAR on existing resource: %s" % (response.code,))
+
+            # FIXME: Check for DAV:resource-must-be-null element
+
+        request = SimpleRequest(self.site, "MKCALENDAR", uri)
+        return self.send(request, do_test)
+
+    def test_make_calendar_on_collection(self):
+        """
+        Make calendar on existing collection
+        """
+        uri  = "/calendar_on_resource/"
+        path = os.path.join(self.docroot, uri[1:])
+
+        if not os.path.exists(path):
+            os.mkdir(path)
+
+        def do_test(response):
+            response = IResponse(response)
+
             if response.code != responsecode.FORBIDDEN:
                 self.fail("Incorrect response to MKCALENDAR on existing resource: %s" % (response.code,))
 
@@ -195,7 +214,7 @@
         """
         Make calendar in calendar
         """
-        first_uri  = "/calendar_in_calendar"
+        first_uri  = "/calendar_in_calendar/"
         first_path = os.path.join(self.docroot, first_uri[1:])
 
         if os.path.exists(first_path): rmdir(first_path)

Modified: CalendarServer/trunk/twistedcaldav/test/test_multiget.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_multiget.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/test_multiget.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -26,13 +26,13 @@
 from twext.web2.dav.util import davXMLFromStream
 from twext.web2.test.test_server import SimpleRequest
 
-import twistedcaldav.test.util
 from twistedcaldav import caldavxml
 from twistedcaldav import ical
 from twistedcaldav.index import db_basename
+from twistedcaldav.test.util import HomeTestCase
 from twistedcaldav.config import config
 
-class CalendarMultiget (twistedcaldav.test.util.TestCase):
+class CalendarMultiget (HomeTestCase):
     """
     calendar-multiget REPORT
     """
@@ -127,7 +127,7 @@
 SUMMARY:New Year's Day
 END:VEVENT
 END:VCALENDAR
-""",
+""".replace("\n", "\r\n"),
             "bad":"""BEGIN:VCALENDAR
 CALSCALE:GREGORIAN
 PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
@@ -140,7 +140,7 @@
 SUMMARY:Valentine's Day
 END:VEVENT
 END:VCALENDAR
-"""
+""".replace("\n", "\r\n")
         }
 
         yield self.simple_event_multiget("/calendar_multiget_events/", okuids, baduids, data)
@@ -155,7 +155,7 @@
 BEGIN:VEVENT
 UID:bad
 DTSTART;VALUE=DATE:20020214
-DTEND;VALUE=DATE:20020""")
+DTEND;VALUE=DATE:20020""".replace("\n", "\r\n"))
         f.close
 
         okuids = ["good", ]

Modified: CalendarServer/trunk/twistedcaldav/test/test_props.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_props.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/test_props.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -25,9 +25,9 @@
 from twext.web2.test.test_server import SimpleRequest
 from twistedcaldav import caldavxml
 
-import twistedcaldav.test.util
+from twistedcaldav.test.util import HomeTestCase
 
-class Properties (twistedcaldav.test.util.TestCase):
+class Properties(HomeTestCase):
     """
     CalDAV properties
     """

Modified: CalendarServer/trunk/twistedcaldav/test/test_schedule.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_schedule.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/test_schedule.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -26,20 +26,20 @@
 from twistedcaldav import caldavxml
 from twistedcaldav.static import ScheduleInboxFile
 
-import twistedcaldav.test.util
+from twistedcaldav.test.util import HomeTestCase
 
-class Properties (twistedcaldav.test.util.TestCase):
+class Properties (HomeTestCase):
     """
     CalDAV properties
     """
-    def test_missing_free_busy_set_prop(self):
+    def test_free_busy_set_prop(self):
         """
         Test for PROPFIND on Inbox with missing calendar-free-busy-set property.
         """
 
         inbox_uri  = "/inbox/"
-        inbox_path = os.path.join(self.docroot, "inbox")
-        self.site.resource.putChild("inbox", ScheduleInboxFile(inbox_path, self.site.resource))
+        #inbox_path = os.path.join(self.docroot, "inbox")
+        #self.site.resource.putChild("inbox", ScheduleInboxFile(inbox_path, self.site.resource))
 
         def propfind_cb(response):
             response = IResponse(response)
@@ -71,8 +71,8 @@
                 if not free_busy_set:
                     self.fail("Expected CalDAV:calendar-free-busy-set element; but got none.")
 
-                if free_busy_set.children:
-                    self.fail("Expected empty CalDAV:calendar-free-busy-set element; but got %s." % (free_busy_set.children,))
+                if not free_busy_set.children:
+                    self.fail("Expected non-empty CalDAV:calendar-free-busy-set element.")
 
             return davXMLFromStream(response.stream).addCallback(got_xml)
 

Modified: CalendarServer/trunk/twistedcaldav/test/test_sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_sharing.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/test_sharing.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -38,7 +38,7 @@
             self.homepath = "/calendars/__uids__/%s" % (cuaddr[7:].split('@')[0],)
             self.displayname = cuaddr[7:].split('@')[0].upper()
 
-        def calendarHome(self):
+        def calendarHome(self, request):
             class FakeHome(object):
                 def removeShareByUID(self, request, uid):pass
             return FakeHome()

Modified: CalendarServer/trunk/twistedcaldav/test/test_validation.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_validation.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/test_validation.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -39,8 +39,14 @@
         """
         Set up some CalDAV stuff.
         """
-        self.destination = CalDAVFile(self.mktemp())
-        self.destinationParent = CalDAVFile(self.mktemp())
+        
+        class CalDAVFileWithName(CalDAVFile):
+            
+            def name(self):
+                return self.fp.basename()
+
+        self.destination = CalDAVFileWithName(self.mktemp())
+        self.destinationParent = CalDAVFileWithName(self.mktemp())
         self.sampleCalendar = Component.fromString("""
 BEGIN:VCALENDAR
 VERSION:2.0

Copied: CalendarServer/trunk/twistedcaldav/test/test_wrapping.py (from rev 5919, CalendarServer/branches/new-store/twistedcaldav/test/test_wrapping.py)
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_wrapping.py	                        (rev 0)
+++ CalendarServer/trunk/twistedcaldav/test/test_wrapping.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,423 @@
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+Tests for the interaction between model-level and protocol-level logic.
+"""
+
+from twext.web2.server import Request
+from twext.web2.responsecode import OK, UNAUTHORIZED
+from twext.web2.http_headers import Headers
+from txdav.idav import AlreadyFinishedError
+
+from twext.web2.dav import davxml
+from twistedcaldav.config import config
+
+from twisted.internet.defer import inlineCallbacks, returnValue
+
+from twistedcaldav.ical import Component as VComponent
+from twistedcaldav.vcard import Component as VCComponent
+
+from twistedcaldav.storebridge import ProtoCalendarCollectionFile, \
+    ProtoAddressBookCollectionFile, DropboxCollection
+
+from twistedcaldav.test.util import TestCase
+
+from txcaldav.calendarstore.file import CalendarStore, CalendarHome
+from txcaldav.calendarstore.test.test_file import event4_text
+
+from txcarddav.addressbookstore.file import AddressBookStore, AddressBookHome
+from txcarddav.addressbookstore.test.test_file import vcard4_text
+
+
+class FakeChanRequest(object):
+    def writeHeaders(self, code, headers):
+        self.code = code
+        self.headers = headers
+    def registerProducer(self, producer, streaming):
+        pass
+    def write(self, data):
+        pass
+    def unregisterProducer(self):
+        pass
+    def abortConnection(self):
+        pass
+    def getHostInfo(self):
+        return '127.0.0.1', False
+    def getRemoteHost(self):
+        return '127.0.0.1'
+    def finish(self):
+        pass
+
+
+
+
+class WrappingTests(TestCase):
+    """
+    Tests for L{twistedcaldav.static.CalDAVFile} creating the appropriate type
+    of txcaldav.calendarstore.file underlying object when it can determine what
+    type it really represents.
+    """
+
+    def setUp(self):
+        # Mostly copied from
+        # twistedcaldav.directory.test.test_calendar.ProvisionedCalendars; this
+        # should probably be refactored, perhaps even to call (some part of) the
+        # actual root-resource construction logic?
+        super(WrappingTests, self).setUp()
+
+        # Setup the initial directory
+        self.createStockDirectoryService()
+        self.setupCalendars()
+
+
+    def populateOneObject(self, objectName, objectText):
+        """
+        Populate one calendar object in the test user's calendar.
+
+        @param objectName: The name of a calendar object.
+        @type objectName: str
+        @param objectText: Some iCalendar text to populate it with.
+        @type objectText: str
+        """
+        record = self.directoryService.recordWithShortName("users", "wsanchez")
+        uid = record.uid
+        # XXX there should be a more test-friendly way to ensure the directory
+        # actually exists
+        try:
+            self.calendarCollection._newStore._path.createDirectory()
+        except:
+            pass
+        txn = self.calendarCollection._newStore.newTransaction()
+        home = txn.calendarHomeWithUID(uid, True)
+        cal = home.calendarWithName("calendar")
+        cal.createCalendarObjectWithName(objectName, VComponent.fromString(objectText))
+        txn.commit()
+
+
+    def populateOneAddressBookObject(self, objectName, objectText):
+        """
+        Populate one addressbook object in the test user's addressbook.
+
+        @param objectName: The name of a addressbook object.
+        @type objectName: str
+        @param objectText: Some iVcard text to populate it with.
+        @type objectText: str
+        """
+        record = self.directoryService.recordWithShortName("users", "wsanchez")
+        uid = record.uid
+        # XXX there should be a more test-friendly way to ensure the directory
+        # actually exists
+        try:
+            self.addressbookCollection._newStore._path.createDirectory()
+        except:
+            pass
+        txn = self.addressbookCollection._newStore.newTransaction()
+        home = txn.addressbookHomeWithUID(uid, True)
+        adbk = home.addressbookWithName("addressbook")
+        if adbk is None:
+            home.createAddressBookWithName("addressbook")
+            adbk = home.addressbookWithName("addressbook")
+        adbk.createAddressBookObjectWithName(objectName, VCComponent.fromString(objectText))
+        txn.commit()
+
+
+    requestUnderTest = None
+
+    @inlineCallbacks
+    def getResource(self, path):
+        """
+        Retrieve a resource from the site.
+
+        @param path: the path from the root of the site (not starting with a
+            slash)
+
+        @type path: C{str}
+        """
+        if self.requestUnderTest is None:
+            req = self.requestForPath(path)
+            self.requestUnderTest = req
+        else:
+            req = self.requestUnderTest
+        aResource = yield req.locateResource(
+            "http://localhost:8008/" + path
+        )
+        returnValue(aResource)
+
+
+    def commit(self):
+        """
+        Since C{getResource} treats this test case as a resource, it will have
+        an associated transaction.  Commit that transaction to bring the
+        filesystem into a consistent state.
+        """
+        self.requestUnderTest._newStoreTransaction.commit()
+
+
+    def requestForPath(self, path):
+        """
+        Get a L{Request} with a L{FakeChanRequest} for a given path.
+        """
+        headers = Headers()
+        headers.addRawHeader("Host", "localhost:8008")
+        chanReq = FakeChanRequest()
+        req = Request(
+            site=self.site,
+            chanRequest=chanReq,
+            command='GET',
+            path=path,
+            version=('1', '1'),
+            contentLength=0,
+            headers=headers
+        )
+        req.credentialFactories = {}
+        return req
+
+
+    @inlineCallbacks
+    def test_autoRevertUnCommitted(self):
+        """
+        Resources that need to read from the back-end in a transaction will be
+        reverted by a response filter in the case where the request does not
+        commit them.  This can happen, for example, with resources that are
+        children of non-existent (proto-)resources.
+        """
+        for pathType in ['calendar', 'addressbook']:
+            req = self.requestForPath('/%ss/users/wsanchez/%s/forget/it'
+                                      % (pathType, pathType))
+            yield req.process()
+            self.assertEquals(req.chanRequest.code, 404)
+            self.assertRaises(AlreadyFinishedError,
+                              req._newStoreTransaction.commit)
+
+
+    @inlineCallbacks
+    def test_simpleRequest(self):
+        """
+        Sanity check and integration test: an unauthorized request of calendar
+        and addressbook resources results in an L{UNAUTHORIZED} response code.
+        """
+        for pathType in ['calendar', 'addressbook']:
+            req = self.requestForPath('/%ss/users/wsanchez/%s/'
+                                      % (pathType, pathType))
+            yield req.process()
+            self.assertEquals(req.chanRequest.code, UNAUTHORIZED)
+
+
+    def test_createStore(self):
+        """
+        Creating a CalendarHomeProvisioningFile will create a paired
+        CalendarStore.
+        """
+        self.assertIsInstance(self.calendarCollection._newStore, CalendarStore)
+        self.assertEquals(self.calendarCollection._newStore._path,
+                          self.site.resource.fp)
+
+
+    @inlineCallbacks
+    def test_lookupCalendarHome(self):
+        """
+        When a L{CalDAVFile} representing an existing calendar home is looked
+        up in a CalendarHomeFile, it will create a corresponding
+        L{CalendarHome} via C{newTransaction().calendarHomeWithUID}.
+        """
+        calDavFile = yield self.getResource("calendars/users/wsanchez/")
+        self.commit()
+        self.assertEquals(calDavFile.fp, calDavFile._newStoreCalendarHome._path)
+        self.assertIsInstance(calDavFile._newStoreCalendarHome, CalendarHome)
+
+
+    @inlineCallbacks
+    def test_lookupDropboxHome(self):
+        """
+        When dropboxes are enabled, the 'dropbox' child of the user's calendar
+        home should be a L{DropboxCollection} wrapper around the user's
+        calendar home, with the dropbox-home resource type.
+        """
+        self.patch(config, "EnableDropBox", True)
+        dropBoxResource = yield self.getResource(
+            "calendars/users/wsanchez/dropbox"
+        )
+        self.commit()
+        self.assertIsInstance(dropBoxResource, DropboxCollection)
+        self.assertEquals((yield dropBoxResource.resourceType(None)),
+                          davxml.ResourceType.dropboxhome)
+
+
+    @inlineCallbacks
+    def test_lookupExistingCalendar(self):
+        """
+        When a L{CalDAVFile} representing an existing calendar collection is
+        looked up in a L{CalendarHomeFile} representing a calendar home, it
+        will create a corresponding L{Calendar} via
+        C{CalendarHome.calendarWithName}.
+        """
+        calDavFile = yield self.getResource("calendars/users/wsanchez/calendar")
+        self.commit()
+        self.assertEquals(calDavFile.fp, calDavFile._newStoreCalendar._path)
+        self.assertEquals((yield calDavFile.resourceType(None)),
+                          davxml.ResourceType.calendar)
+
+
+    @inlineCallbacks
+    def test_lookupNewCalendar(self):
+        """
+        When a L{CalDAVFile} which represents a not-yet-created calendar
+        collection is looked up in a L{CalendarHomeFile} representing a calendar
+        home, it will initially have a new storage backend set to C{None}, but
+        when the calendar is created via a protocol action, the backend will be
+        initialized to match.
+        """
+        calDavFile = yield self.getResource("calendars/users/wsanchez/frobozz")
+        self.assertIsInstance(calDavFile, ProtoCalendarCollectionFile)
+        calDavFile.createCalendarCollection()
+        self.commit()
+        self.assertEquals(calDavFile.fp, calDavFile._newStoreCalendar._path)
+
+
+    @inlineCallbacks
+    def test_lookupSpecial(self):
+        """
+        When a L{CalDAVFile} I{not} representing a calendar collection - one of
+        the special collections, like the dropbox or freebusy URLs - is looked
+        up in a L{CalendarHomeFile} representing a calendar home, it will I{not}
+        create a corresponding L{Calendar} via C{CalendarHome.calendarWithName}.
+        """
+        for specialName in ['dropbox', 'freebusy', 'notifications']:
+            calDavFile = yield self.getResource(
+                "calendars/users/wsanchez/%s" % (specialName,)
+            )
+            self.assertIdentical(
+                getattr(calDavFile, "_newStoreCalendar", None), None
+            )
+        self.commit()
+
+
+    @inlineCallbacks
+    def test_lookupCalendarObject(self):
+        """
+        When a L{CalDAVFile} representing an existing calendar object is looked
+        up on a L{CalDAVFile} representing a calendar collection, a parallel
+        L{CalendarObject} will be created (with a matching FilePath).
+        """
+        self.populateOneObject("1.ics", event4_text)
+        calDavFileCalendar = yield self.getResource(
+            "calendars/users/wsanchez/calendar/1.ics"
+        )
+        self.commit()
+        self.assertEquals(calDavFileCalendar._newStoreObject._path,
+                          calDavFileCalendar.fp)
+        self.assertEquals(calDavFileCalendar._principalCollections,
+                          frozenset([self.principalsResource]))
+
+
+    @inlineCallbacks
+    def test_lookupNewCalendarObject(self):
+        """
+        When a L{CalDAVFile} representing a new calendar object on a
+        L{CalDAVFile} representing an existing calendar collection, the list of
+        principal collections will be propagated down to it.
+        """
+        calDavFileCalendar = yield self.getResource(
+            "calendars/users/wsanchez/calendar/xyzzy.ics"
+        )
+        self.commit()
+        self.assertEquals(calDavFileCalendar._principalCollections,
+                          frozenset([self.principalsResource]))
+
+
+    def test_createAddressBookStore(self):
+        """
+        Creating a AddressBookHomeProvisioningFile will create a paired
+        AddressBookStore.
+        """
+        self.assertIsInstance(self.addressbookCollection._newStore, AddressBookStore)
+        self.assertEquals(self.addressbookCollection._newStore._path,
+                          self.site.resource.fp)
+
+
+    @inlineCallbacks
+    def test_lookupAddressBookHome(self):
+        """
+        When a L{CalDAVFile} representing an existing addressbook home is looked up
+        in a AddressBookHomeFile, it will create a corresponding L{AddressBookHome}
+        via C{newTransaction().addressbookHomeWithUID}.
+        """
+        calDavFile = yield self.getResource("addressbooks/users/wsanchez/")
+        self.commit()
+        self.assertEquals(calDavFile.fp, calDavFile._newStoreAddressBookHome._path)
+        self.assertIsInstance(calDavFile._newStoreAddressBookHome, AddressBookHome)
+
+
+    @inlineCallbacks
+    def test_lookupExistingAddressBook(self):
+        """
+        When a L{CalDAVFile} representing an existing addressbook collection is
+        looked up in a L{AddressBookHomeFile} representing a addressbook home, it will
+        create a corresponding L{AddressBook} via C{AddressBookHome.addressbookWithName}.
+        """
+        calDavFile = yield self.getResource("addressbooks/users/wsanchez/addressbook")
+        self.commit()
+        self.assertEquals(calDavFile.fp, calDavFile._newStoreAddressBook._path)
+
+
+    @inlineCallbacks
+    def test_lookupNewAddressBook(self):
+        """
+        When a L{CalDAVFile} which represents a not-yet-created addressbook
+        collection is looked up in a L{AddressBookHomeFile} representing a addressbook
+        home, it will initially have a new storage backend set to C{None}, but
+        when the addressbook is created via a protocol action, the backend will be
+        initialized to match.
+        """
+        calDavFile = yield self.getResource("addressbooks/users/wsanchez/frobozz")
+        self.assertIsInstance(calDavFile, ProtoAddressBookCollectionFile)
+        calDavFile.createAddressBookCollection()
+        self.commit()
+        self.assertEquals(calDavFile.fp, calDavFile._newStoreAddressBook._path)
+
+
+    @inlineCallbacks
+    def test_lookupAddressBookObject(self):
+        """
+        When a L{CalDAVFile} representing an existing addressbook object is looked
+        up on a L{CalDAVFile} representing a addressbook collection, a parallel
+        L{AddressBookObject} will be created (with a matching FilePath).
+        """
+        self.populateOneAddressBookObject("1.vcf", vcard4_text)
+        calDavFileAddressBook = yield self.getResource(
+            "addressbooks/users/wsanchez/addressbook/1.vcf"
+        )
+        self.commit()
+        self.assertEquals(calDavFileAddressBook._newStoreObject._path,
+                          calDavFileAddressBook.fp)
+        self.assertEquals(calDavFileAddressBook._principalCollections,
+                          frozenset([self.principalsResource]))
+
+
+    @inlineCallbacks
+    def test_lookupNewAddressBookObject(self):
+        """
+        When a L{CalDAVFile} representing a new addressbook object on a
+        L{CalDAVFile} representing an existing addressbook collection, the list of
+        principal collections will be propagated down to it.
+        """
+        calDavFileAddressBook = yield self.getResource(
+            "addressbooks/users/wsanchez/addressbook/xyzzy.ics"
+        )
+        self.commit()
+        self.assertEquals(calDavFileAddressBook._principalCollections,
+                          frozenset([self.principalsResource]))

Modified: CalendarServer/trunk/twistedcaldav/test/util.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/util.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/test/util.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -28,18 +28,27 @@
 
 from twisted.python.failure import Failure
 from twisted.internet.base import DelayedCall
-from twisted.internet.defer import succeed, fail
+from twisted.internet.defer import succeed, fail, inlineCallbacks, returnValue
 from twisted.internet.error import ProcessDone
 from twisted.internet.protocol import ProcessProtocol
 
 from twext.python.memcacheclient import ClientFactory
+from twext.python.filepath import CachingFilePath as FilePath
 import twext.web2.dav.test.util
+from twext.web2.dav import davxml
 from twext.web2.http import HTTPError, StatusResponse
 
 from twistedcaldav import memcacher
 from twistedcaldav.config import config
-from twistedcaldav.static import CalDAVFile
+from twistedcaldav.static import CalDAVFile, CalendarHomeProvisioningFile,\
+    AddressBookHomeProvisioningFile
+from twistedcaldav.directory.xmlfile import XMLDirectoryService
+from twistedcaldav.directory import augment
+from twistedcaldav.directory.principal import (
+    DirectoryPrincipalProvisioningResource)
 
+from txdav.common.datastore.file import CommonDataStore
+
 DelayedCall.debug = True
 
 def _todo(f, why):
@@ -50,9 +59,72 @@
 testUnimplemented = lambda f: _todo(f, "Test unimplemented")
 todo = lambda why: lambda f: _todo(f, why)
 
+dirTest = FilePath(__file__).parent().sibling("directory").child("test")
+
+xmlFile = dirTest.child("accounts.xml")
+augmentsFile = dirTest.child("augments.xml")
+proxiesFile = dirTest.child("proxies.xml")
+
 class TestCase(twext.web2.dav.test.util.TestCase):
     resource_class = CalDAVFile
 
+    def createStockDirectoryService(self):
+        """
+        Create a stock C{directoryService} attribute and assign it.
+        """
+        self.xmlFile = FilePath(config.DataRoot).child("accounts.xml")
+        self.xmlFile.setContent(xmlFile.getContent())
+
+        # *temporarily* set up an augment service so this directory service will
+        # work.
+        self.patch(augment, "AugmentService", augment.AugmentXMLDB(
+                xmlFiles=(augmentsFile.path,)
+            )
+        )
+
+        self.directoryService = XMLDirectoryService(
+            {'xmlFile' : "accounts.xml"}
+        )
+
+        # FIXME: see FIXME in DirectoryPrincipalProvisioningResource.__init__;
+        # this performs a necessary modification to the directory service
+        # object for it to be fully functional.
+        self.principalsResource = DirectoryPrincipalProvisioningResource(
+            "/principals/", self.directoryService
+        )
+
+
+    def setupCalendars(self):
+        """
+        Set up the resource at /calendars (a L{CalendarHomeProvisioningFile}),
+        and assign it as C{self.calendarCollection}.
+        """
+        path = self.site.resource.fp.child("calendars")
+        path.createDirectory()
+
+        # Need a data store
+        _newStore = CommonDataStore(self.site.resource.fp, True, False)
+
+        self.calendarCollection = CalendarHomeProvisioningFile(
+            path,
+            self.directoryService,
+            "/calendars/",
+            _newStore
+        )
+        self.site.resource.putChild("calendars", self.calendarCollection)
+
+        path = self.site.resource.fp.child("addressbooks")
+        path.createDirectory()
+
+        self.addressbookCollection = AddressBookHomeProvisioningFile(
+            path,
+            self.directoryService,
+            "/addressbooks/",
+            _newStore
+        )
+        self.site.resource.putChild("addressbooks", self.addressbookCollection)
+
+
     def setUp(self):
         super(TestCase, self).setUp()
 
@@ -210,7 +282,146 @@
 
         return verifyChildren(root, structure)
 
+class norequest(object):
+    def addResponseFilter(self, filter):
+        "stub; ignore me"
 
+
+class HomeTestCase(TestCase):
+    """
+    Utility class for tests which wish to interact with a calendar home rather
+    than a top-level resource hierarchy.
+    """
+
+    def setUp(self):
+        """
+        Replace self.site.resource with an appropriately provisioned
+        CalendarHomeFile, and replace self.docroot with a path pointing at that
+        file.
+        """
+        super(HomeTestCase, self).setUp()
+
+        fp = FilePath(self.mktemp())
+
+        self.createStockDirectoryService()
+
+        # Need a data store
+        _newStore = CommonDataStore(fp, True, False)
+
+        self.homeProvisioner = CalendarHomeProvisioningFile(
+            os.path.join(fp.path, "calendars"),
+            self.directoryService, "/calendars/",
+            _newStore
+        )
+        
+        def _defer(_):
+            # Commit the transaction
+            self.site.resource._associatedTransaction.commit()
+            
+        return self._refreshRoot().addCallback(_defer)
+
+    @inlineCallbacks
+    def _refreshRoot(self):
+        """
+        Refresh the user resource positioned at the root of this site, to give
+        it a new transaction.
+        """
+        users = self.homeProvisioner.getChild("users")
+        user, ignored = (yield users.locateChild(norequest(), ["wsanchez"]))
+
+        # Force the request to succeed regardless of the implementation of
+        # accessControlList.
+        user.accessControlList = lambda request, *a, **k: succeed(
+            self.grantInherit(davxml.All())
+        )
+
+        # Fix the site to point directly at the user's calendar home so that we
+        # can focus on testing just that rather than hierarchy traversal..
+        self.site.resource = user
+
+        # Fix the docroot so that 'mkdtemp' will create directories in the right
+        # place (beneath the calendar).
+        self.docroot = user.fp.path
+
+    @inlineCallbacks
+    def send(self, request, callback):
+        """
+        Override C{send} in order to refresh the 'user' resource each time, to
+        get a new transaction to associate with the calendar home.
+        """
+        yield self._refreshRoot()
+        result = (yield super(HomeTestCase, self).send(request, callback))
+        returnValue(result)
+
+class AddressBookHomeTestCase(TestCase):
+    """
+    Utility class for tests which wish to interact with a addressbook home rather
+    than a top-level resource hierarchy.
+    """
+
+    def setUp(self):
+        """
+        Replace self.site.resource with an appropriately provisioned
+        AddressBookHomeFile, and replace self.docroot with a path pointing at that
+        file.
+        """
+        super(AddressBookHomeTestCase, self).setUp()
+
+        fp = FilePath(self.mktemp())
+
+        self.createStockDirectoryService()
+
+        # Need a data store
+        _newStore = CommonDataStore(fp, True, False)
+
+        self.homeProvisioner = AddressBookHomeProvisioningFile(
+            os.path.join(fp.path, "addressbooks"),
+            self.directoryService, "/addressbooks/",
+            _newStore
+        )
+        
+        def _defer(_):
+            # Commit the transaction
+            self.site.resource._associatedTransaction.commit()
+            
+        return self._refreshRoot().addCallback(_defer)
+
+    @inlineCallbacks
+    def _refreshRoot(self):
+        """
+        Refresh the user resource positioned at the root of this site, to give
+        it a new transaction.
+        """
+        users = self.homeProvisioner.getChild("users")
+        user, ignored = (yield users.locateChild(norequest(), ["wsanchez"]))
+
+        # Force the request to succeed regardless of the implementation of
+        # accessControlList.
+        user.accessControlList = lambda request, *a, **k: succeed(
+            self.grantInherit(davxml.All())
+        )
+
+        # Fix the site to point directly at the user's calendar home so that we
+        # can focus on testing just that rather than hierarchy traversal..
+        self.site.resource = user
+
+        # Fix the docroot so that 'mkdtemp' will create directories in the right
+        # place (beneath the calendar).
+        self.docroot = user.fp.path
+
+    @inlineCallbacks
+    def send(self, request, callback):
+        """
+        Override C{send} in order to refresh the 'user' resource each time, to
+        get a new transaction to associate with the calendar home.
+        """
+        yield self._refreshRoot()
+        result = (yield super(AddressBookHomeTestCase, self).send(request, callback))
+        returnValue(result)
+
+
+
+
 class InMemoryPropertyStore(object):
     def __init__(self):
         class _FauxPath(object):

Modified: CalendarServer/trunk/twistedcaldav/vcard.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/vcard.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/vcard.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -19,6 +19,7 @@
 """
 
 __all__ = [
+    "InvalidVCardDataError",
     "Property",
     "Component",
 ]
@@ -35,6 +36,9 @@
 
 vCardProductID = "-//CALENDARSERVER.ORG//NONSGML Version 1//EN"
 
+class InvalidVCardDataError(ValueError):
+    pass
+
 class Property (object):
     """
     vCard Property
@@ -133,9 +137,9 @@
         try:
             return clazz(None, vobject=readComponents(stream).next())
         except vParseError, e:
-            raise ValueError(e)
+            raise InvalidVCardDataError(e)
         except StopIteration, e:
-            raise ValueError(e)
+            raise InvalidVCardDataError(e)
 
     @classmethod
     def fromIStream(clazz, stream):
@@ -255,7 +259,7 @@
         """
         properties = tuple(self.properties(name))
         if len(properties) == 1: return properties[0]
-        if len(properties) > 1: raise ValueError("More than one %s property in component %r" % (name, self))
+        if len(properties) > 1: raise InvalidVCardDataError("More than one %s property in component %r" % (name, self))
         return None
         
     def properties(self, name=None):
@@ -282,7 +286,7 @@
     def propertyValue(self, name):
         properties = tuple(self.properties(name))
         if len(properties) == 1: return properties[0].value()
-        if len(properties) > 1: raise ValueError("More than one %s property in component %r" % (name, self))
+        if len(properties) > 1: raise InvalidVCardDataError("More than one %s property in component %r" % (name, self))
         return None
 
 
@@ -306,7 +310,7 @@
             return result
 
         elif len(properties) > 1:
-            raise ValueError("More than one %s property in component %r" % (name, self))
+            raise InvalidVCardDataError("More than one %s property in component %r" % (name, self))
         else:
             return None
 
@@ -339,14 +343,14 @@
         """
         @raise ValueError: if the given vcard data is not valid.
         """
-        if self.name() != "VCARD": raise ValueError("Not a vcard")
+        if self.name() != "VCARD": raise InvalidVCardDataError("Not a vcard")
 
         version = self.propertyValue("VERSION")
-        if version != "3.0": raise ValueError("Not a version 2.0 vCard (version=%s)" % (version,))
+        if version != "3.0": raise InvalidVCardDataError("Not a version 2.0 vCard (version=%s)" % (version,))
 
         uid = self.propertyValue("UID")
         if uid is None:
-            raise ValueError("All vCards must have UIDs")
+            raise InvalidVCardDataError("All vCards must have UIDs")
 
     def transformAllFromNative(self):
         self._vobject = self._vobject.transformFromNative()

Modified: CalendarServer/trunk/twistedcaldav/vcardindex.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/vcardindex.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/twistedcaldav/vcardindex.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -230,7 +230,10 @@
         db_filename = os.path.join(self.resource.fp.path, db_basename)
         super(AddressBookIndex, self).__init__(db_filename, False)
 
-        if config.Memcached.Pools.Default.ClientEnabled:
+        if (
+            hasattr(config, "Memcached") and
+            config.Memcached.Pools.Default.ClientEnabled
+        ):
             self.reserver = MemcachedUIDReserver(self)
         else:
             self.reserver = SQLUIDReserver(self)
@@ -441,6 +444,26 @@
                         % (name, self.resource))
                 self.deleteResource(name, None)
 
+    def bruteForceSearch(self):
+        """
+        List the whole index and tests for existence, updating the index
+        @return: all resources in the index
+        """
+        # List all resources
+        rowiter = self._db_execute("select NAME, UID from RESOURCE")
+
+        # Check result for missing resources:
+
+        for row in rowiter:
+            name = row[0]
+            if self.resource.getChild(name.encode("utf-8")):
+                yield row
+            else:
+                log.err("AddressBook resource %s is missing from %s. Removing from index."
+                        % (name, self.resource))
+                self.deleteResource(name)
+
+
     def _db_version(self):
         """
         @return: the schema version assigned to this index.

Modified: CalendarServer/trunk/txcaldav/calendarstore/file.py
===================================================================
--- CalendarServer/trunk/txcaldav/calendarstore/file.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcaldav/calendarstore/file.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,3 +1,4 @@
+# -*- test-case-name: txcaldav.calendarstore.test.test_file -*-
 ##
 # Copyright (c) 2010 Apple Inc. All rights reserved.
 #
@@ -20,343 +21,292 @@
 
 __all__ = [
     "CalendarStore",
+    "CalendarStoreTransaction",
     "CalendarHome",
     "Calendar",
     "CalendarObject",
 ]
 
-import errno
+import hashlib
 
-from zope.interface import implements
+from errno import ENOENT
 
-from twext.python.filepath import CachingFilePath as FilePath
-from twisted.internet.defer import inlineCallbacks
+from twisted.internet.interfaces import ITransport
+from twisted.python.failure import Failure
+from txdav.propertystore.xattr import PropertyStore
 
-from twext.python.log import LoggingMixIn
+from twext.python.vcomponent import InvalidICalendarDataError
 from twext.python.vcomponent import VComponent
-from twext.python.vcomponent import InvalidICalendarDataError
+from twext.web2.dav.element.rfc2518 import ResourceType, GETContentType
+from twext.web2.dav.resource import TwistedGETContentMD5
+from twext.web2.http_headers import generateContentType
 
-from txdav.propertystore.xattr import PropertyStore
 
-from txcaldav.icalendarstore import ICalendarStore, ICalendarHome
+from twistedcaldav import caldavxml, customxml
+from twistedcaldav.caldavxml import ScheduleCalendarTransp, Opaque
+from twistedcaldav.index import Index as OldIndex, IndexSchedule as OldInboxIndex
+from twistedcaldav.sharing import InvitesDatabase
+
+from txcaldav.icalendarstore import IAttachment
 from txcaldav.icalendarstore import ICalendar, ICalendarObject
-from txcaldav.icalendarstore import CalendarNameNotAllowedError
-from txcaldav.icalendarstore import CalendarObjectNameNotAllowedError
-from txcaldav.icalendarstore import CalendarAlreadyExistsError
-from txcaldav.icalendarstore import CalendarObjectNameAlreadyExistsError
-from txcaldav.icalendarstore import NotFoundError
-from txcaldav.icalendarstore import NoSuchCalendarError
-from txcaldav.icalendarstore import NoSuchCalendarObjectError
-from txcaldav.icalendarstore import InvalidCalendarComponentError
-from txcaldav.icalendarstore import InternalDataStoreError
+from txcaldav.icalendarstore import ICalendarHome
 
-from twistedcaldav.index import Index as OldIndex
-from twistedcaldav.memcachelock import MemcacheLock, MemcacheLockTimeoutError
 
+from txdav.common.datastore.file import CommonDataStore, CommonStoreTransaction, \
+    CommonHome, CommonHomeChild, CommonObjectResource
+from txdav.common.icommondatastore import InvalidObjectResourceError, \
+    NoSuchObjectResourceError, InternalDataStoreError
+from txdav.datastore.file import writeOperation, hidden
+from txdav.propertystore.base import PropertyName
 
-class CalendarStore(LoggingMixIn):
-    implements(ICalendarStore)
+from zope.interface import implements
 
-    calendarHomeClass = property(lambda _: CalendarHome)
+CalendarStore = CommonDataStore
 
-    def __init__(self, path):
-        """
-        @param path: a L{FilePath}
-        """
-        assert isinstance(path, FilePath)
+CalendarStoreTransaction = CommonStoreTransaction
 
-        self.path = path
-
-        if not path.isdir():
-            # FIXME: Add CalendarStoreNotFoundError?
-            raise NotFoundError("No such calendar store")
-
-    def __repr__(self):
-        return "<%s: %s>" % (self.__class__.__name__, self.path.path)
-
-    def calendarHomeWithUID(self, uid, create=False):
-        if uid.startswith("."):
-            return None
-
-        assert len(uid) >= 4
-
-        childPath = self.path.child(uid[0:2]).child(uid[2:4]).child(uid)
-
-        if not childPath.isdir():
-            if create:
-                childPath.makedirs()
-            else:
-                return None
-
-        return CalendarHome(childPath, self)
-
-
-class CalendarHome(LoggingMixIn):
+class CalendarHome(CommonHome):
     implements(ICalendarHome)
 
-    calendarClass = property(lambda _: Calendar)
+    def __init__(self, uid, path, calendarStore, transaction):
+        super(CalendarHome, self).__init__(uid, path, calendarStore, transaction)
 
-    def __init__(self, path, calendarStore):
-        self.path = path
-        self.calendarStore = calendarStore
+        self._childClass = Calendar
 
-    def __repr__(self):
-        return "<%s: %s>" % (self.__class__.__name__, self.path)
 
-    def uid(self):
-        return self.path.basename()
-
-    def calendars(self):
-        return (
-            self.calendarWithName(name)
-            for name in self.path.listdir()
-            if not name.startswith(".")
-        )
-
     def calendarWithName(self, name):
-        if name.startswith("."):
+        if name == 'dropbox':
+            # "dropbox" is a file storage area, not a calendar.
             return None
-
-        childPath = self.path.child(name)
-        if childPath.isdir():
-            return Calendar(childPath, self)
         else:
-            return None
+            return self.childWithName(name)
 
-    def createCalendarWithName(self, name):
-        if name.startswith("."):
-            raise CalendarNameNotAllowedError(name)
 
-        childPath = self.path.child(name)
+    createCalendarWithName = CommonHome.createChildWithName
+    removeCalendarWithName = CommonHome.removeChildWithName
 
-        try:
-            childPath.createDirectory()
-        except (IOError, OSError), e:
-            if e.errno == errno.EEXIST:
-                raise CalendarAlreadyExistsError(name)
-            raise
+    def calendars(self):
+        for child in self.children():
+            if child.name() in ('dropbox', 'notification'):
+                continue
+            yield child
 
-    def removeCalendarWithName(self, name):
-        if name.startswith("."):
-            raise NoSuchCalendarError(name)
 
-        childPath = self.path.child(name)
-        try:
-            childPath.remove()
-        except (IOError, OSError), e:
-            if e.errno == errno.ENOENT:
-                raise NoSuchCalendarError(name)
-            raise
+    def calendarObjectWithDropboxID(self, dropboxID):
+        """
+        Implement lookup with brute-force scanning.
+        """
+        for calendar in self.calendars():
+            for calendarObject in calendar.calendarObjects():
+                if dropboxID == calendarObject.dropboxID():
+                    return calendarObject
 
-    def properties(self):
-        if not hasattr(self, "_properties"):
-            self._properties = PropertyStore(self.path)
-        return self._properties
 
+    @property
+    def _calendarStore(self):
+        return self._dataStore
 
-class Calendar(LoggingMixIn):
-    implements(ICalendar)
 
-    calendarObjectClass = property(lambda _: CalendarObject)
+    def created(self):
+        self.createCalendarWithName("calendar")
+        defaultCal = self.calendarWithName("calendar")
+        props = defaultCal.properties()
+        props[PropertyName(*ScheduleCalendarTransp.qname())] = ScheduleCalendarTransp(
+            Opaque())
+        self.createCalendarWithName("inbox")
 
-    def __init__(self, path, calendarHome):
-        self.path = path
-        self.calendarHome = calendarHome
 
-    def __repr__(self):
-        return "<%s: %s>" % (self.__class__.__name__, self.path.path)
 
-    def index(self):
-        if not hasattr(self, "_index"):
-            self._index = Index(self)
-        return self._index
+class Calendar(CommonHomeChild):
+    """
+    File-based implementation of L{ICalendar}.
+    """
+    implements(ICalendar)
 
-    def name(self):
-        return self.path.basename()
+    def __init__(self, name, calendarHome, realName=None):
+        """
+        Initialize a calendar pointing at a path on disk.
 
-    def ownerCalendarHome(self):
-        return self.calendarHome
+        @param name: the subdirectory of calendarHome where this calendar
+            resides.
+        @type name: C{str}
 
-    def _calendarObjects_index(self):
-        return self.index().calendarObjects()
+        @param calendarHome: the home containing this calendar.
+        @type calendarHome: L{CalendarHome}
 
-    def _calendarObjects_listdir(self):
-        return (
-            self.calendarObjectWithName(name)
-            for name in self.path.listdir()
-            if not name.startswith(".")
-        )
+        @param realName: If this calendar was just created, the name which it
+        will eventually have on disk.
+        @type realName: C{str}
+        """
 
-    calendarObjects = _calendarObjects_index
+        super(Calendar, self).__init__(name, calendarHome, realName)
 
-    def calendarObjectWithName(self, name):
-        childPath = self.path.child(name)
-        if childPath.isfile():
-            return CalendarObject(childPath, self)
-        else:
-            return None
+        self._index = Index(self)
+        self._invites = Invites(self)
+        self._objectResourceClass = CalendarObject
 
-    def calendarObjectWithUID(self, uid):
-        raise NotImplementedError()
 
-    def createCalendarObjectWithName(self, name, component):
-        if name.startswith("."):
-            raise CalendarObjectNameNotAllowedError(name)
+    @property
+    def _calendarHome(self):
+        return self._home
 
-        childPath = self.path.child(name)
-        if childPath.exists():
-            raise CalendarObjectNameAlreadyExistsError(name)
 
-        calendarObject = CalendarObject(childPath, self)
-        calendarObject.setComponent(component)
+    def resourceType(self):
+        return ResourceType.calendar
 
-    def removeCalendarObjectWithName(self, name):
-        if name.startswith("."):
-            raise NoSuchCalendarObjectError(name)
 
-        childPath = self.path.child(name)
-        if childPath.isfile():
-            childPath.remove()
-        else:
-            raise NoSuchCalendarObjectError(name)
+    ownerCalendarHome = CommonHomeChild.ownerHome
+    calendarObjects = CommonHomeChild.objectResources
+    calendarObjectWithName = CommonHomeChild.objectResourceWithName
+    calendarObjectWithUID = CommonHomeChild.objectResourceWithUID
+    createCalendarObjectWithName = CommonHomeChild.createObjectResourceWithName
+    removeCalendarObjectWithName = CommonHomeChild.removeObjectResourceWithName
+    removeCalendarObjectWithUID = CommonHomeChild.removeObjectResourceWithUID
+    calendarObjectsSinceToken = CommonHomeChild.objectResourcesSinceToken
 
-    def removeCalendarObjectWithUID(self, uid):
-        raise NotImplementedError()
 
-    def syncToken(self):
+    def calendarObjectsInTimeRange(self, start, end, timeZone):
         raise NotImplementedError()
 
-    @inlineCallbacks
-    def _updateSyncToken(self, reset=False):
-        return
 
-        lock = MemcacheLock("Calendar", self.fp.path, timeout=60.0)
-        try:
-            try:
-                yield lock.acquire()
-            except MemcacheLockTimeoutError:
-                raise InternalDataStoreError("Timed out on calendar lock")
+    def initPropertyStore(self, props):
+        # Setup peruser special properties
+        props.setSpecialProperties(
+            (
+                PropertyName.fromElement(caldavxml.CalendarDescription),
+                PropertyName.fromElement(caldavxml.CalendarTimeZone),
+            ),
+            (
+                PropertyName.fromElement(customxml.GETCTag),
+                PropertyName.fromElement(caldavxml.SupportedCalendarComponentSet),
+                PropertyName.fromElement(caldavxml.ScheduleCalendarTransp),
+            ),
+        )
 
-            def newToken():
-                raise NotImplementedError()
+    def _doValidate(self, component):
+        # FIXME: should be separate class, not separate case!
+        if self.name() == 'inbox':
+            component.validateComponentsForCalDAV(True)
+        else:
+            component.validateForCalDAV()
 
-            if reset:
-                token = newToken()
 
-            raise NotImplementedError(token)
+class CalendarObject(CommonObjectResource):
+    """
+    @ivar _path: The path of the .ics file on disk
 
-        finally:
-            yield lock.clean()
+    @type _path: L{FilePath}
+    """
+    implements(ICalendarObject)
 
+    def __init__(self, name, calendar):
+        super(CalendarObject, self).__init__(name, calendar)
+        self._attachments = {}
 
-        raise NotImplementedError()
 
-    def calendarObjectsInTimeRange(self, start, end, timeZone):
-        raise NotImplementedError()
+    @property
+    def _calendar(self):
+        return self._parentCollection
 
-    def calendarObjectsSinceToken(self, token):
-        raise NotImplementedError()
 
-    def properties(self):
-        if not hasattr(self, "_properties"):
-            self._properties = PropertyStore(self.path)
-        return self._properties
-
-
-class CalendarObject(LoggingMixIn):
-    implements(ICalendarObject)
-
-    def __init__(self, path, calendar):
-        self.path = path
-        self.calendar = calendar
-
-    def __repr__(self):
-        return "<%s: %s>" % (self.__class__.__name__, self.path.path)
-
-    def name(self):
-        return self.path.basename()
-
+    @writeOperation
     def setComponent(self, component):
         if not isinstance(component, VComponent):
-            raise TypeError(VComponent)
+            raise TypeError(type(component))
 
         try:
             if component.resourceUID() != self.uid():
-                raise InvalidCalendarComponentError(
+                raise InvalidObjectResourceError(
                     "UID may not change (%s != %s)" % (
                         component.resourceUID(), self.uid()
                      )
                 )
-        except NoSuchCalendarObjectError:
+        except NoSuchObjectResourceError:
             pass
 
         try:
-            component.validateForCalDAV()
+            self._calendar._doValidate(component)
         except InvalidICalendarDataError, e:
-            raise InvalidCalendarComponentError(e)
+            raise InvalidObjectResourceError(e)
 
+        newRevision = self._calendar._updateSyncToken() # FIXME: test
+        self._calendar.retrieveOldIndex().addResource(
+            self.name(), component, newRevision
+        )
+
         self._component = component
-        if hasattr(self, "_text"):
-            del self._text
+        # FIXME: needs to clear text cache
 
-        fh = self.path.open("w")
-        try:
-            fh.write(str(component))
-        finally:
-            fh.close()
+        def do():
+            # Mark all properties as dirty, so they can be added back
+            # to the newly updated file.
+            self.properties().update(self.properties())
 
-    def component(self):
-        if not hasattr(self, "_component"):
-            text = self.iCalendarText()
-
+            backup = None
+            if self._path.exists():
+                backup = hidden(self._path.temporarySibling())
+                self._path.moveTo(backup)
+            fh = self._path.open("w")
             try:
-                component = VComponent.fromString(text)
-            except InvalidICalendarDataError, e:
-                raise InternalDataStoreError(
-                    "File corruption detected (%s) in file: %s"
-                    % (e, self.path.path)
-                )
+                # FIXME: concurrency problem; if this write is interrupted
+                # halfway through, the underlying file will be corrupt.
+                fh.write(str(component))
+            finally:
+                fh.close()
 
-            del self._text
-            self._component = component
+            # Now re-write the original properties on the updated file
+            self.properties().flush()
 
-        return self._component
+            def undo():
+                if backup:
+                    backup.moveTo(self._path)
+                else:
+                    self._path.remove()
+            return undo
+        self._transaction.addOperation(do, "set calendar component %r" % (self.name(),))
 
-    def iCalendarText(self):
-        #
-        # Note I'm making an assumption here that caching both is
-        # redundant, so we're caching the text if it's asked for and
-        # we don't have the component cached, then tossing it and
-        # relying on the component if we have that cached. -wsv
-        #
-        if not hasattr(self, "_text"):
-            if hasattr(self, "_component"):
-                return str(self._component)
+    def component(self):
+        if self._component is not None:
+            return self._component
+        text = self.iCalendarText()
 
-            try:
-                fh = self.path.open()
-            except IOError, e:
-                if e[0] == errno.ENOENT:
-                    raise NoSuchCalendarObjectError(self)
+        try:
+            component = VComponent.fromString(text)
+        except InvalidICalendarDataError, e:
+            raise InternalDataStoreError(
+                "File corruption detected (%s) in file: %s"
+                % (e, self._path.path)
+            )
+        return component
 
-            try:
-                text = fh.read()
-            finally:
-                fh.close()
 
-            if not (
-                text.startswith("BEGIN:VCALENDAR\r\n") or
-                text.endswith("\r\nEND:VCALENDAR\r\n")
-            ):
-                raise InternalDataStoreError(
-                    "File corruption detected (improper start) in file: %s"
-                    % (self.path.path,)
-                )
+    def iCalendarText(self):
+        if self._component is not None:
+            return str(self._component)
+        try:
+            fh = self._path.open()
+        except IOError, e:
+            if e[0] == ENOENT:
+                raise NoSuchObjectResourceError(self)
+            else:
+                raise
 
-            self._text = text
+        try:
+            text = fh.read()
+        finally:
+            fh.close()
 
-        return self._text
+        if not (
+            text.startswith("BEGIN:VCALENDAR\r\n") or
+            text.endswith("\r\nEND:VCALENDAR\r\n")
+        ):
+            raise InternalDataStoreError(
+                "File corruption detected (improper start) in file: %s"
+                % (self._path.path,)
+            )
+        return text
 
+
     def uid(self):
         if not hasattr(self, "_uid"):
             self._uid = self.component().resourceUID()
@@ -370,50 +320,244 @@
     def organizer(self):
         return self.component().getOrganizer()
 
-    def properties(self):
-        if not hasattr(self, "_properties"):
-            self._properties = PropertyStore(self.path)
-        return self._properties
 
+    def createAttachmentWithName(self, name, contentType):
+        """
+        Implement L{ICalendarObject.removeAttachmentWithName}.
+        """
+        # Make a (FIXME: temp, remember rollbacks) file in dropbox-land
+        attachment = Attachment(self, name)
+        self._attachments[name] = attachment
+        return attachment.store(contentType)
 
-class Index (object):
-    #
-    # OK, here's where we get ugly.
-    # The index code needs to be rewritten also, but in the meantime...
-    #
-    class StubResource(object):
+
+    def removeAttachmentWithName(self, name):
         """
-        Just enough resource to keep the Index class going.
+        Implement L{ICalendarObject.removeAttachmentWithName}.
         """
-        def __init__(self, calendar):
-            self.calendar = calendar
-            self.fp = self.calendar.path
+        # FIXME: rollback, tests for rollback
+        self._dropboxPath().child(name).remove()
+        if name in self._attachments:
+            del self._attachments[name]
 
-        def isCalendarCollection(self):
-            return True
 
-        def getChild(self, name):
-            calendarObject = self.calendar.calendarObjectWithName(name)
-            if calendarObject:
-                class ChildResource(object):
-                    def __init__(self, calendarObject):
-                        self.calendarObject = calendarObject
+    def attachmentWithName(self, name):
+        # Attachments can be local or remote, but right now we only care about
+        # local.  So we're going to base this on the listing of files in the
+        # dropbox and not on the calendar data.  However, we COULD examine the
+        # 'attach' properties.
 
-                    def iCalendar(self):
-                        return self.calendarObject.component()
+        if name in self._attachments:
+            return self._attachments[name]
+        # FIXME: cache consistently (put it in self._attachments)
+        if self._dropboxPath().child(name).exists():
+            return Attachment(self, name)
+        else:
+            # FIXME: test for non-existent attachment.
+            return None
 
-                return ChildResource(calendarObject)
-            else:
-                return None
 
-        def bumpSyncToken(self, reset=False):
-            return self.calendar._updateSyncToken(reset)
+    def attendeesCanManageAttachments(self):
+        return self.component().hasPropertyInAnyComponent("X-APPLE-DROPBOX")
 
 
+    def dropboxID(self):
+        # FIXME: direct tests
+        dropboxProperty = self.component().getFirstPropertyInAnyComponent("X-APPLE-DROPBOX")
+        if dropboxProperty is not None:
+            componentDropboxID = dropboxProperty.value().split("/")[-1]
+            return componentDropboxID
+        attachProperty = self.component().getFirstPropertyInAnyComponent("ATTACH")
+        if attachProperty is not None:
+            # Make sure the value type is URI
+            valueType = attachProperty.params().get("VALUE", ("TEXT",))
+            if valueType[0] == "URI": 
+                # FIXME: more aggressive checking to see if this URI is really the
+                # 'right' URI.  Maybe needs to happen in the front end.
+                attachPath = attachProperty.value().split("/")[-2]
+                return attachPath
+        
+        return self.uid() + ".dropbox"
+
+
+    def _dropboxPath(self):
+        dropboxPath = self._parentCollection._home._path.child(
+            "dropbox"
+        ).child(self.dropboxID())
+        if not dropboxPath.isdir():
+            dropboxPath.makedirs()
+        return dropboxPath
+
+
+    def attachments(self):
+        # See comment on attachmentWithName.
+        return [Attachment(self, name)
+                for name in self._dropboxPath().listdir()]
+
+    def initPropertyStore(self, props):
+        # Setup peruser special properties
+        props.setSpecialProperties(
+            (
+            ),
+            (
+                PropertyName.fromElement(customxml.TwistedCalendarAccessProperty),
+                PropertyName.fromElement(customxml.TwistedSchedulingObjectResource),
+                PropertyName.fromElement(caldavxml.ScheduleTag),
+                PropertyName.fromElement(customxml.TwistedScheduleMatchETags),
+                PropertyName.fromElement(customxml.TwistedCalendarHasPrivateCommentsProperty),
+                PropertyName.fromElement(caldavxml.Originator),
+                PropertyName.fromElement(caldavxml.Recipient),
+                PropertyName.fromElement(customxml.ScheduleChanges),
+            ),
+        )
+
+
+contentTypeKey = PropertyName.fromElement(GETContentType)
+md5key = PropertyName.fromElement(TwistedGETContentMD5)
+
+class AttachmentStorageTransport(object):
+
+    implements(ITransport)
+
+    def __init__(self, attachment, contentType):
+        """
+        
+        @param attachment:
+        @type attachment:
+        """
+        self._attachment = attachment
+        self._contentType = contentType
+        self._file = self._attachment._computePath().open("w")
+
+
+    def write(self, data):
+        # FIXME: multiple chunks
+        self._file.write(data)
+
+
+    def loseConnection(self):
+        # FIXME: do anything
+        self._file.close()
+
+        md5 = hashlib.md5(self._attachment._computePath().getContent()).hexdigest()
+        props = self._attachment._properties()
+        props[contentTypeKey] = GETContentType(generateContentType(self._contentType))
+        props[md5key] = TwistedGETContentMD5.fromString(md5)
+        props.flush()
+
+
+class Attachment(object):
+    """
+    An L{Attachment} is a container for the data associated with a I{locally-
+    stored} calendar attachment.  That is to say, there will only be
+    L{Attachment} objects present on the I{organizer's} copy of and event, and
+    only for C{ATTACH} properties where this server is storing the resource.
+    (For example, the organizer may specify an C{ATTACH} property that
+    references an URI on a remote server.)
+    """
+
+    implements(IAttachment)
+
+    def __init__(self, calendarObject, name):
+        self._calendarObject = calendarObject
+        self._name = name
+
+
+    def name(self):
+        return self._name
+
+
+    def _properties(self):
+        """
+        Create and return a private xattr L{PropertyStore} for storing some of
+        the data about this L{Attachment}.  This is private because attachments
+        do not (currently) require arbitrary dead property storage, but older
+        servers did store useful information about attachments in xattr
+        properties in the filesystem.
+        """
+        return PropertyStore(
+            self._calendarObject._parentCollection._home.peruser_uid(),
+            self._calendarObject._parentCollection._home.uid(),
+            self._computePath
+        )
+
+
+    def contentType(self):
+        return self._properties()[contentTypeKey].mimeType()
+
+
+    def store(self, contentType):
+        return AttachmentStorageTransport(self, contentType)
+
+    def retrieve(self, protocol):
+        # FIXME: makeConnection
+        # FIXME: actually stream
+        # FIMXE: connectionLost
+        protocol.dataReceived(self._computePath().getContent())
+        # FIXME: ConnectionDone, not NotImplementedError
+        protocol.connectionLost(Failure(NotImplementedError()))
+
+
+    def md5(self):
+        return self._properties()[md5key]
+
+
+    def _computePath(self):
+        dropboxPath = self._calendarObject._dropboxPath()
+        return dropboxPath.child(self.name())
+
+
+
+class CalendarStubResource(object):
+    """
+    Just enough resource to keep the calendar's sql DB classes going.
+    """
+
     def __init__(self, calendar):
         self.calendar = calendar
-        self._oldIndex = OldIndex(Index.StubResource(calendar))
+        self.fp = self.calendar._path
 
+    def isCalendarCollection(self):
+        return True
+
+    def getChild(self, name):
+        calendarObject = self.calendar.calendarObjectWithName(name)
+        if calendarObject:
+            class ChildResource(object):
+                def __init__(self, calendarObject):
+                    self.calendarObject = calendarObject
+
+                def iCalendar(self):
+                    return self.calendarObject.component()
+
+            return ChildResource(calendarObject)
+        else:
+            return None
+
+    def bumpSyncToken(self, reset=False):
+        # FIXME: needs direct tests
+        return self.calendar._updateSyncToken(reset)
+
+
+    def initSyncToken(self):
+        # FIXME: needs direct tests
+        self.bumpSyncToken(True)
+
+class Index(object):
+    #
+    # OK, here's where we get ugly.
+    # The index code needs to be rewritten also, but in the meantime...
+    #
+    def __init__(self, calendar):
+        self.calendar = calendar
+        stubResource = CalendarStubResource(calendar)
+        if self.calendar.name() == 'inbox':
+            indexClass = OldInboxIndex
+        else:
+            indexClass = OldIndex
+        self._oldIndex = indexClass(stubResource)
+
+
     def calendarObjects(self):
         calendar = self.calendar
         for name, uid, componentType in self._oldIndex.bruteForceSearch():
@@ -424,3 +568,14 @@
             calendarObject._componentType = componentType
 
             yield calendarObject
+
+
+class Invites(object):
+    #
+    # OK, here's where we get ugly.
+    # The index code needs to be rewritten also, but in the meantime...
+    #
+    def __init__(self, calendar):
+        self.calendar = calendar
+        stubResource = CalendarStubResource(calendar)
+        self._oldInvites = InvitesDatabase(stubResource)

Copied: CalendarServer/trunk/txcaldav/calendarstore/postgres.py (from rev 5919, CalendarServer/branches/new-store/txcaldav/calendarstore/postgres.py)
===================================================================
--- CalendarServer/trunk/txcaldav/calendarstore/postgres.py	                        (rev 0)
+++ CalendarServer/trunk/txcaldav/calendarstore/postgres.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,32 @@
+# -*- test-case-name: txcaldav.calendarstore.test.test_postgres -*-
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+PostgreSQL data store.
+"""
+
+__all__ = [
+    "CalendarStore",
+    "CalendarHome",
+    "Calendar",
+    "CalendarObject",
+]
+
+from twisted.python.modules import getModule
+
+
+v1_schema = getModule(__name__).filePath.sibling("postgres_schema_v1.sql").getContent()

Copied: CalendarServer/trunk/txcaldav/calendarstore/postgres_schema_v1.sql (from rev 5919, CalendarServer/branches/new-store/txcaldav/calendarstore/postgres_schema_v1.sql)
===================================================================
--- CalendarServer/trunk/txcaldav/calendarstore/postgres_schema_v1.sql	                        (rev 0)
+++ CalendarServer/trunk/txcaldav/calendarstore/postgres_schema_v1.sql	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,137 @@
+-----------------
+-- Resource ID --
+-----------------
+
+create sequence RESOURCE_ID_SEQ;
+
+
+-----------------
+- Calendar Home -
+-----------------
+
+create table CALENDAR_HOME (
+  RESOURCE_ID varchar(255) primary key default nextval(’RESOURCE_ID_SEQ’),
+  OWNER_UID   varchar(255) not null unique,
+);
+
+
+-----------------
+- Calendar Bind -
+-----------------
+
+-- Joins CALENDAR_HOME and CALENDAR
+
+create table CALENDAR_BIND (
+  CALENDAR_HOME_RESOURCE_ID varchar(255) not null references CALENDAR_HOME,
+  CALENDAR_RESOURCE_ID      varchar(255) not null references CALENDAR,
+  CALENDAR_RESOURCE_NAME    varchar(255) not null,
+  CALENDAR_MODE             int          not null,
+  SEEN_BY_OWNER             bool         not null,
+  SEEN_BY_SHAREE            bool         not null,
+  STATUS                    integer      not null,
+  MESSAGE                   text,                  -- FIXME: xml?
+
+  primary key(CALENDAR_HOME_RESOURCE_ID, CALENDAR_RESOURCE_ID),
+  unique(CALENDAR_HOME_RESOURCE_ID, CALENDAR_RESOURCE_NAME),
+);
+
+-- Enumeration of calendar bind modes
+
+create table CALENDAR_BIND_MODE (
+  ID          int         primary key,
+  DESCRIPTION varchar(16) not null unique,
+);
+
+insert into CALENDAR_MODE values (0, "own"  );
+insert into CALENDAR_MODE values (1, "read" );
+insert into CALENDAR_MODE values (2, "write");
+
+-- Enumeration of statuses
+
+create table CALENDAR_BIND_STATUS (
+  ID          int         primary key,
+  DESCRIPTION varchar(16) not null unique,
+);
+
+insert into CALENDAR_BIND_STATUS values (0, "invited" );
+insert into CALENDAR_BIND_STATUS values (1, "accepted");
+insert into CALENDAR_BIND_STATUS values (2, "declined");
+
+
+------------
+- Calendar -
+------------
+
+create table CALENDAR (
+  RESOURCE_ID varchar(255) primary key default nextval(’RESOURCE_ID_SEQ’),
+  SYNC_TOKEN  varchar(255),
+);
+
+
+-------------------
+- Calendar Object -
+-------------------
+
+create table CALENDAR_OBJECT (
+  RESOURCE_ID          varchar(255) primary key default nextval(’RESOURCE_ID_SEQ’),
+  CALENDAR_RESOURCE_ID varchar(255) not null references CALENDAR,
+  RESOURCE_NAME        varchar(255) not null,
+  ICALENDAR_TEXT       text         not null,
+  ICALENDAR_UID        varchar(255) not null,
+  ICALENDAR_TYPE       varchar(255) not null,
+  ATTACHMENTS_MODE     int          not null,
+  ORGANIZER            varchar(255),
+  ORGANIZER_OBJECT     varchar(255) references CALENDAR_OBJECT,
+
+  unique(CALENDAR_RESOURCE_ID, RESOURCE_NAME),
+  unique(CALENDAR_RESOURCE_ID, ICALENDAR_UID),
+);
+
+-- Enumeration of attachment modes
+
+create table CALENDAR_OBJECT_ATTACHMENTS_MODE (
+  ID          int         primary key,
+  DESCRIPTION varchar(16) not null unique,
+);
+
+insert into CALENDAR_MODE values (0, "read" );
+insert into CALENDAR_MODE values (1, "write");
+
+
+--------------
+- Attachment -
+--------------
+
+create table ATTACHMENT (
+  CALENDAR_OBJECT varchar(255) not null references CALENDAR_OBJECT,
+  CONTENT_TYPE    varchar(255) not null,
+  SIZE            int          not null,
+  MD5             char(32)     not null,
+  PATH            varchar(255) not null unique,
+);
+
+----------------
+- iTIP Message -
+----------------
+
+create table ITIP_MESSAGE (
+  CALENDAR_RESOURCE_ID varchar(255) not null references CALENDAR,
+  ICALENDAR_TEXT       text         not null,
+  ICALENDAR_UID        varchar(255) not null,
+  MD5                  char(32)     not null,
+  CHANGES              text         not null,
+);
+
+
+---------------------
+- Resource Property -
+---------------------
+
+create table RESOURCE_PROPERTY (
+  RESOURCE_ID varchar(255) not null, -- foreign key: *.RESOURCE_ID
+  NAME        varchar(255) not null,
+  VALUE       text         not null, -- FIXME: xml?
+  VIEWER_UID  varchar(255),
+
+  primary key(RESOURCE_ID, NAME, VIEWER_UID),
+);

Copied: CalendarServer/trunk/txcaldav/calendarstore/scheduling.py (from rev 5919, CalendarServer/branches/new-store/txcaldav/calendarstore/scheduling.py)
===================================================================
--- CalendarServer/trunk/txcaldav/calendarstore/scheduling.py	                        (rev 0)
+++ CalendarServer/trunk/txcaldav/calendarstore/scheduling.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,161 @@
+# -*- test-case-name: txcaldav.calendarstore.test.test_scheduling -*-
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+from zope.interface.declarations import implements
+from txcaldav.icalendarstore import ICalendarHome, ICalendar, ICalendarObject,\
+    ICalendarTransaction
+from txdav.idav import IDataStore
+from twisted.python.util import FancyEqMixin
+from twisted.python.components import proxyForInterface
+
+
+
+class ImplicitTransaction(
+        proxyForInterface(ICalendarTransaction,
+                          originalAttribute="_transaction")):
+    """
+    Wrapper around an L{ICalendarStoreTransaction}.
+    """
+
+    def __init__(self, transaction):
+        """
+        Initialize an L{ImplicitTransaction}.
+
+        @type transaction: L{ICalendarStoreTransaction}
+        """
+        self._transaction = transaction
+
+
+    def calendarHomeWithUID(self, uid, create=False):
+        # FIXME: 'create' flag
+        newHome = super(ImplicitTransaction, self
+            ).calendarHomeWithUID(uid, create)
+#        return ImplicitCalendarHome(newHome, self)
+        if newHome is None:
+            return None
+        else:
+            # FIXME: relay transaction
+            return ImplicitCalendarHome(newHome, None)
+
+
+
+class ImplicitCalendarHome(
+        proxyForInterface(ICalendarHome, "_calendarHome")
+    ):
+
+    implements(ICalendarHome)
+
+    def __init__(self, calendarHome, transaction):
+        """
+        Initialize L{ImplicitCalendarHome} with an underlying
+        calendar home and L{ImplicitTransaction}.
+        """
+        self._calendarHome = calendarHome
+        self._transaction = transaction
+
+
+#    def properties(self):
+#        # FIXME: wrap?
+#        return self._calendarHome.properties()
+
+    def calendars(self):
+        for calendar in super(ImplicitCalendarHome, self).calendars():
+            yield ImplicitCalendar(self, calendar)
+
+    def createCalendarWithName(self, name):
+        self._calendarHome.createCalendarWithName(name)
+
+    def removeCalendarWithName(self, name):
+        self._calendarHome.removeCalendarWithName(name)
+
+
+    def calendarWithName(self, name):
+        calendar = self._calendarHome.calendarWithName(name)
+        if calendar is not None:
+            return ImplicitCalendar(self, calendar)
+        else:
+            return None
+
+
+
+class ImplicitCalendarObject(object):
+    implements(ICalendarObject)
+    def setComponent(self, component): ""
+    def component(self): ""
+    def iCalendarText(self): ""
+    def uid(self): ""
+    def componentType(self): ""
+    def organizer(self): ""
+    def properties(self):""
+
+
+
+class ImplicitCalendar(FancyEqMixin,
+                       proxyForInterface(ICalendar, "_subCalendar")):
+
+    compareAttributes = ['_subCalendar', '_parentHome']
+
+    def __init__(self, parentHome, subCalendar):
+        self._parentHome = parentHome
+        self._subCalendar = subCalendar
+
+#    def ownerCalendarHome(self):
+#        return self._parentHome
+#    def calendarObjects(self):
+#        # FIXME: wrap
+#        return self._subCalendar.calendarObjects()
+#    def calendarObjectWithUID(self, uid): ""
+#    def createCalendarObjectWithName(self, name, component):
+#        # FIXME: implement most of StoreCalendarObjectResource here!
+#        self._subCalendar.createCalendarObjectWithName(name, component)
+#    def removeCalendarObjectWithName(self, name):
+#        # FIXME: implement deletion logic here!
+#        return self._subCalendar.removeCalendarObjectWithName(name)
+#    def removeCalendarObjectWithUID(self, uid): ""
+#    def syncToken(self): ""
+#    def calendarObjectsInTimeRange(self, start, end, timeZone): ""
+#    def calendarObjectsSinceToken(self, token): ""
+#    def properties(self):
+#        # FIXME: probably need to wrap this as well
+#        return self._subCalendar.properties()
+#
+#    def calendarObjectWithName(self, name):
+#        #FIXME: wrap
+#        return self._subCalendar.calendarObjectWithName(name)
+
+
+class ImplicitStore(object):
+    """
+    This is a wrapper around an L{ICalendarStore} that implements implicit
+    scheduling.
+    """
+
+    implements(IDataStore)
+
+    def __init__(self, calendarStore):
+        """
+        Create an L{ImplicitStore} wrapped around another
+        L{ICalendarStore} provider.
+        """
+        self._calendarStore = calendarStore
+
+
+    def newTransaction(self):
+        """
+        Wrap an underlying L{ITransaction}.
+        """
+        return ImplicitTransaction(
+                    self._calendarStore.newTransaction())

Modified: CalendarServer/trunk/txcaldav/calendarstore/test/__init__.py
===================================================================
--- CalendarServer/trunk/txcaldav/calendarstore/test/__init__.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcaldav/calendarstore/test/__init__.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,3 +1,4 @@
+# -*- test-case-name: txcaldav.calendarstore.test -*-
 ##
 # Copyright (c) 2010 Apple Inc. All rights reserved.
 #

Modified: CalendarServer/trunk/txcaldav/calendarstore/test/calendar_store/ho/me/home1/calendar_1/1.ics
===================================================================
--- CalendarServer/trunk/txcaldav/calendarstore/test/calendar_store/ho/me/home1/calendar_1/1.ics	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcaldav/calendarstore/test/calendar_store/ho/me/home1/calendar_1/1.ics	2010-07-20 01:28:10 UTC (rev 5920)
@@ -2,6 +2,23 @@
 VERSION:2.0
 PRODID:-//Apple Inc.//iCal 4.0.1//EN
 CALSCALE:GREGORIAN
+BEGIN:VTIMEZONE
+TZID:US/Pacific
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+DTSTART:20070311T020000
+TZNAME:PDT
+TZOFFSETTO:-0700
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+DTSTART:20071104T020000
+TZNAME:PST
+TZOFFSETTO:-0800
+END:STANDARD
+END:VTIMEZONE
 BEGIN:VEVENT
 ATTENDEE;CN="Wilfredo Sanchez";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:mailt
  o:wsanchez at apple.com
@@ -21,7 +38,6 @@
 BEGIN:VALARM
 X-WR-ALARMUID:DB39AB67-449C-441C-89D2-D740B5F41A73
 TRIGGER;VALUE=DATE-TIME:20090324T180009Z
-ATTACH;VALUE=URI:Basso
 ACTION:AUDIO
 END:VALARM
 END:VEVENT

Copied: CalendarServer/trunk/txcaldav/calendarstore/test/common.py (from rev 5919, CalendarServer/branches/new-store/txcaldav/calendarstore/test/common.py)
===================================================================
--- CalendarServer/trunk/txcaldav/calendarstore/test/common.py	                        (rev 0)
+++ CalendarServer/trunk/txcaldav/calendarstore/test/common.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,1027 @@
+# -*- test-case-name: txcaldav.calendarstore -*-
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+Tests for common calendar store API functions.
+"""
+
+from zope.interface.verify import verifyObject
+from zope.interface.exceptions import (
+    BrokenMethodImplementation, DoesNotImplement)
+
+from twisted.internet.defer import Deferred, inlineCallbacks
+from twisted.internet.protocol import Protocol
+
+from txdav.idav import IPropertyStore, IDataStore, AlreadyFinishedError
+from txdav.propertystore.base import PropertyName
+
+from txdav.common.icommondatastore import HomeChildNameAlreadyExistsError, \
+    ICommonTransaction
+from txdav.common.icommondatastore import InvalidObjectResourceError
+from txdav.common.icommondatastore import NoSuchHomeChildError
+from txdav.common.icommondatastore import NoSuchObjectResourceError
+from txdav.common.icommondatastore import ObjectResourceNameAlreadyExistsError
+
+from txcaldav.icalendarstore import (
+    ICalendarObject, ICalendarHome,
+    ICalendar, IAttachment, ICalendarTransaction)
+
+from twext.python.filepath import CachingFilePath as FilePath
+from twext.web2.dav import davxml
+from twext.web2.http_headers import MimeType
+from twext.web2.dav.element.base import WebDAVUnknownElement
+from twext.python.vcomponent import VComponent
+
+
+storePath = FilePath(__file__).parent().child("calendar_store")
+
+homeRoot = storePath.child("ho").child("me").child("home1")
+
+cal1Root = homeRoot.child("calendar_1")
+
+calendar1_objectNames = [
+    "1.ics",
+    "2.ics",
+    "3.ics",
+]
+
+
+home1_calendarNames = [
+    "calendar_1",
+    "calendar_2",
+    "calendar_empty",
+]
+
+
+event4_text = (
+    "BEGIN:VCALENDAR\r\n"
+      "VERSION:2.0\r\n"
+      "PRODID:-//Apple Inc.//iCal 4.0.1//EN\r\n"
+      "CALSCALE:GREGORIAN\r\n"
+      "BEGIN:VTIMEZONE\r\n"
+        "TZID:US/Pacific\r\n"
+        "BEGIN:DAYLIGHT\r\n"
+          "TZOFFSETFROM:-0800\r\n"
+          "RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\n"
+          "DTSTART:20070311T020000\r\n"
+          "TZNAME:PDT\r\n"
+          "TZOFFSETTO:-0700\r\n"
+        "END:DAYLIGHT\r\n"
+        "BEGIN:STANDARD\r\n"
+          "TZOFFSETFROM:-0700\r\n"
+          "RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\n"
+          "DTSTART:20071104T020000\r\n"
+          "TZNAME:PST\r\n"
+          "TZOFFSETTO:-0800\r\n"
+        "END:STANDARD\r\n"
+      "END:VTIMEZONE\r\n"
+      "BEGIN:VEVENT\r\n"
+        "CREATED:20100203T013849Z\r\n"
+        "UID:uid4\r\n"
+        "DTEND;TZID=US/Pacific:20100207T173000\r\n"
+        "TRANSP:OPAQUE\r\n"
+        "SUMMARY:New Event\r\n"
+        "DTSTART;TZID=US/Pacific:20100207T170000\r\n"
+        "DTSTAMP:20100203T013909Z\r\n"
+        "SEQUENCE:3\r\n"
+        "BEGIN:VALARM\r\n"
+          "X-WR-ALARMUID:1377CCC7-F85C-4610-8583-9513D4B364E1\r\n"
+          "TRIGGER:-PT20M\r\n"
+          "ATTACH;VALUE=URI:Basso\r\n"
+          "ACTION:AUDIO\r\n"
+        "END:VALARM\r\n"
+      "END:VEVENT\r\n"
+    "END:VCALENDAR\r\n"
+)
+
+
+
+event4notCalDAV_text = (
+    "BEGIN:VCALENDAR\r\n"
+      "VERSION:2.0\r\n"
+      "PRODID:-//Apple Inc.//iCal 4.0.1//EN\r\n"
+      "CALSCALE:GREGORIAN\r\n"
+      "BEGIN:VEVENT\r\n"
+        "CREATED:20100203T013849Z\r\n"
+        "UID:4\r\n"
+        "DTEND;TZID=US/Pacific:20100207T173000\r\n" # TZID without VTIMEZONE
+        "TRANSP:OPAQUE\r\n"
+        "SUMMARY:New Event\r\n"
+        "DTSTART;TZID=US/Pacific:20100207T170000\r\n"
+        "DTSTAMP:20100203T013909Z\r\n"
+        "SEQUENCE:3\r\n"
+        "BEGIN:VALARM\r\n"
+          "X-WR-ALARMUID:1377CCC7-F85C-4610-8583-9513D4B364E1\r\n"
+          "TRIGGER:-PT20M\r\n"
+          "ATTACH;VALUE=URI:Basso\r\n"
+          "ACTION:AUDIO\r\n"
+        "END:VALARM\r\n"
+      "END:VEVENT\r\n"
+    "END:VCALENDAR\r\n"
+)
+
+
+
+event1modified_text = event4_text.replace(
+    "\r\nUID:uid4\r\n",
+    "\r\nUID:uid1\r\n"
+)
+
+
+
+class CommonTests(object):
+    """
+    Tests for common functionality of interfaces defined in
+    L{txcaldav.icalendarstore}.
+    """
+
+    requirements = {
+        "home1": {
+            "calendar_1": {
+                "1.ics": cal1Root.child("1.ics").getContent(),
+                "2.ics": cal1Root.child("2.ics").getContent(),
+                "3.ics": cal1Root.child("3.ics").getContent()
+            },
+            "calendar_empty": {},
+            "not_a_calendar": None
+        },
+        "not_a_home": None
+    }
+
+    def storeUnderTest(self):
+        """
+        Subclasses must override this to return an L{ICommonDataStore} provider
+        which adheres to the structure detailed by L{CommonTests.requirements}.
+        This attribute is a dict of dict of dicts; the outermost layer
+        representing UIDs mapping to calendar homes, then calendar names mapping
+        to calendar collections, and finally calendar object names mapping to
+        calendar object text.
+        """
+        raise NotImplementedError()
+
+
+    lastTransaction = None
+    savedStore = None
+
+    def transactionUnderTest(self):
+        """
+        Create a transaction from C{storeUnderTest} and save it as
+        C[lastTransaction}.  Also makes sure to use the same store, saving the
+        value from C{storeUnderTest}.
+        """
+        if self.lastTransaction is not None:
+            return self.lastTransaction
+        if self.savedStore is None:
+            self.savedStore = self.storeUnderTest()
+        txn = self.lastTransaction = self.savedStore.newTransaction()
+        return txn
+
+
+    def commit(self):
+        """
+        Commit the last transaction created from C{transactionUnderTest}, and
+        clear it.
+        """
+        self.lastTransaction.commit()
+        self.lastTransaction = None
+
+
+    def abort(self):
+        """
+        Abort the last transaction created from C[transactionUnderTest}, and
+        clear it.
+        """
+        self.lastTransaction.abort()
+        self.lastTransaction = None
+
+
+    def tearDown(self):
+        if self.lastTransaction is not None:
+            self.commit()
+
+
+    def homeUnderTest(self):
+        """
+        Get the calendar home detailed by C{requirements['home1']}.
+        """
+        return self.transactionUnderTest().calendarHomeWithUID(
+            "home1")
+
+
+    def calendarUnderTest(self):
+        """
+        Get the calendar detailed by C{requirements['home1']['calendar_1']}.
+        """
+        return self.homeUnderTest().calendarWithName("calendar_1")
+
+
+    def calendarObjectUnderTest(self):
+        """
+        Get the calendar detailed by
+        C{requirements['home1']['calendar_1']['1.ics']}.
+        """
+        return self.calendarUnderTest().calendarObjectWithName("1.ics")
+
+
+    def assertProvides(self, interface, provider):
+        """
+        Verify that C{provider} properly provides C{interface}
+
+        @type interface: L{zope.interface.Interface}
+        @type provider: C{provider}
+        """
+        try:
+            verifyObject(interface, provider)
+        except BrokenMethodImplementation, e:
+            self.fail(e)
+        except DoesNotImplement, e:
+            self.fail("%r does not provide %s.%s" %
+                (provider, interface.__module__, interface.getName()))
+
+
+    def test_calendarStoreProvides(self):
+        """
+        The calendar store provides L{IDataStore} and its required attributes.
+        """
+        calendarStore = self.storeUnderTest()
+        self.assertProvides(IDataStore, calendarStore)
+
+
+    def test_transactionProvides(self):
+        """
+        The transactions generated by the calendar store provide
+        L{ICommonStoreTransaction}, L{ICalendarTransaction}, and their
+        respectively required attributes.
+        """
+        txn = self.storeUnderTest().newTransaction()
+        self.assertProvides(ICommonTransaction, txn)
+        self.assertProvides(ICalendarTransaction, txn)
+
+
+    def test_homeProvides(self):
+        """
+        The calendar homes generated by the calendar store provide
+        L{ICalendarHome} and its required attributes.
+        """
+        self.assertProvides(ICalendarHome, self.homeUnderTest())
+
+
+    def test_calendarProvides(self):
+        """
+        The calendars generated by the calendar store provide L{ICalendar} and
+        its required attributes.
+        """
+        self.assertProvides(ICalendar, self.calendarUnderTest())
+
+
+    def test_calendarObjectProvides(self):
+        """
+        The calendar objects generated by the calendar store provide
+        L{ICalendarObject} and its required attributes.
+        """
+        self.assertProvides(ICalendarObject, self.calendarObjectUnderTest())
+
+
+    def test_calendarHomeWithUID_exists(self):
+        """
+        Finding an existing calendar home by UID results in an object that
+        provides L{ICalendarHome} and has a C{uid()} method that returns the
+        same value that was passed in.
+        """
+        calendarHome = (self.storeUnderTest().newTransaction()
+                        .calendarHomeWithUID("home1"))
+
+        self.assertEquals(calendarHome.uid(), "home1")
+        self.assertProvides(ICalendarHome, calendarHome)
+
+
+    def test_calendarHomeWithUID_absent(self):
+        """
+        L{ICommonStoreTransaction.calendarHomeWithUID} should return C{None}
+        when asked for a non-existent calendar home.
+        """
+        self.assertEquals(
+            self.storeUnderTest().newTransaction()
+            .calendarHomeWithUID("xyzzy"),
+            None
+        )
+
+
+    def test_calendarWithName_exists(self):
+        """
+        L{ICalendarHome.calendarWithName} returns an L{ICalendar} provider,
+        whose name matches the one passed in.
+        """
+        home = self.homeUnderTest()
+        for name in home1_calendarNames:
+            calendar = home.calendarWithName(name)
+            self.assertProvides(ICalendar, calendar)
+            self.assertEquals(calendar.name(), name)
+
+
+    def test_calendarRename(self):
+        """
+        L{ICalendar.rename} changes the name of the L{ICalendar}.
+        """
+        home = self.homeUnderTest()
+        calendar = home.calendarWithName("calendar_1")
+        calendar.rename("some_other_name")
+        def positiveAssertions():
+            self.assertEquals(calendar.name(), "some_other_name")
+            self.assertEquals(calendar, home.calendarWithName("some_other_name"))
+            self.assertEquals(None, home.calendarWithName("calendar_1"))
+        positiveAssertions()
+        self.commit()
+        home = self.homeUnderTest()
+        calendar = home.calendarWithName("some_other_name")
+        positiveAssertions()
+        # FIXME: revert
+        # FIXME: test for multiple renames
+        # FIXME: test for conflicting renames (a->b, c->a in the same txn)
+
+
+    def test_calendarWithName_absent(self):
+        """
+        L{ICalendarHome.calendarWithName} returns C{None} for calendars which
+        do not exist.
+        """
+        self.assertEquals(self.homeUnderTest().calendarWithName("xyzzy"),
+                          None)
+
+
+    def test_createCalendarWithName_absent(self):
+        """
+        L{ICalendarHome.createCalendarWithName} creates a new L{ICalendar} that
+        can be retrieved with L{ICalendarHome.calendarWithName}.
+        """
+        home = self.homeUnderTest()
+        name = "new"
+        self.assertIdentical(home.calendarWithName(name), None)
+        home.createCalendarWithName(name)
+        self.assertNotIdentical(home.calendarWithName(name), None)
+        def checkProperties():
+            calendarProperties = home.calendarWithName(name).properties()
+            self.assertEquals(
+                calendarProperties[
+                    PropertyName.fromString(davxml.ResourceType.sname())
+                ],
+                davxml.ResourceType.calendar) #@UndefinedVariable
+        checkProperties()
+        self.commit()
+
+        # Make sure it's available in a new transaction; i.e. test the commit.
+        home = self.homeUnderTest()
+        self.assertNotIdentical(home.calendarWithName(name), None)
+        home = self.calendarStore.newTransaction().calendarHomeWithUID(
+            "home1")
+        # Sanity check: are the properties actually persisted?
+        # FIXME: no independent testing of this right now
+        checkProperties()
+
+
+    def test_createCalendarWithName_exists(self):
+        """
+        L{ICalendarHome.createCalendarWithName} raises
+        L{CalendarAlreadyExistsError} when the name conflicts with an already-
+        existing 
+        """
+        for name in home1_calendarNames:
+            self.assertRaises(
+                HomeChildNameAlreadyExistsError,
+                self.homeUnderTest().createCalendarWithName, name
+            )
+
+
+    def test_removeCalendarWithName_exists(self):
+        """
+        L{ICalendarHome.removeCalendarWithName} removes a calendar that already
+        exists.
+        """
+        home = self.homeUnderTest()
+        # FIXME: test transactions
+        for name in home1_calendarNames:
+            self.assertNotIdentical(home.calendarWithName(name), None)
+            home.removeCalendarWithName(name)
+            self.assertEquals(home.calendarWithName(name), None)
+
+
+    def test_removeCalendarWithName_absent(self):
+        """
+        Attempt to remove an non-existing calendar should raise.
+        """
+        home = self.homeUnderTest()
+        self.assertRaises(NoSuchHomeChildError,
+                          home.removeCalendarWithName, "xyzzy")
+
+
+    def test_calendarObjects(self):
+        """
+        L{ICalendar.calendarObjects} will enumerate the calendar objects present
+        in the filesystem, in name order, but skip those with hidden names.
+        """
+        calendar1 = self.calendarUnderTest()
+        calendarObjects = list(calendar1.calendarObjects())
+
+        for calendarObject in calendarObjects:
+            self.assertProvides(ICalendarObject, calendarObject)
+            self.assertEquals(
+                calendar1.calendarObjectWithName(calendarObject.name()),
+                calendarObject
+            )
+
+        self.assertEquals(
+            list(o.name() for o in calendarObjects),
+            calendar1_objectNames
+        )
+
+
+    def test_calendarObjectsWithRemovedObject(self):
+        """
+        L{ICalendar.calendarObjects} skips those objects which have been
+        removed by L{Calendar.removeCalendarObjectWithName} in the same
+        transaction, even if it has not yet been committed.
+        """
+        calendar1 = self.calendarUnderTest()
+        calendar1.removeCalendarObjectWithName("2.ics")
+        calendarObjects = list(calendar1.calendarObjects())
+        self.assertEquals(set(o.name() for o in calendarObjects),
+                          set(calendar1_objectNames) - set(["2.ics"]))
+
+
+    def test_ownerCalendarHome(self):
+        """
+        L{ICalendar.ownerCalendarHome} should match the home UID.
+        """
+        self.assertEquals(
+            self.calendarUnderTest().ownerCalendarHome().uid(),
+            self.homeUnderTest().uid()
+        )
+
+
+    def test_calendarObjectWithName_exists(self):
+        """
+        L{ICalendar.calendarObjectWithName} returns an L{ICalendarObject}
+        provider for calendars which already exist.
+        """
+        calendar1 = self.calendarUnderTest()
+        for name in calendar1_objectNames:
+            calendarObject = calendar1.calendarObjectWithName(name)
+            self.assertProvides(ICalendarObject, calendarObject)
+            self.assertEquals(calendarObject.name(), name)
+            # FIXME: add more tests based on CommonTests.requirements
+
+
+    def test_calendarObjectWithName_absent(self):
+        """
+        L{ICalendar.calendarObjectWithName} returns C{None} for calendars which
+        don't exist.
+        """
+        calendar1 = self.calendarUnderTest()
+        self.assertEquals(calendar1.calendarObjectWithName("xyzzy"), None)
+
+
+    def test_removeCalendarObjectWithUID_exists(self):
+        """
+        Remove an existing calendar object.
+        """
+        calendar = self.calendarUnderTest()
+        for name in calendar1_objectNames:
+            uid = (u'uid' + name.rstrip(".ics"))
+            self.assertNotIdentical(calendar.calendarObjectWithUID(uid),
+                                    None)
+            calendar.removeCalendarObjectWithUID(uid)
+            self.assertEquals(
+                calendar.calendarObjectWithUID(uid),
+                None
+            )
+            self.assertEquals(
+                calendar.calendarObjectWithName(name),
+                None
+            )
+
+
+    def test_removeCalendarObjectWithName_exists(self):
+        """
+        Remove an existing calendar object.
+        """
+        calendar = self.calendarUnderTest()
+        for name in calendar1_objectNames:
+            self.assertNotIdentical(
+                calendar.calendarObjectWithName(name), None
+            )
+            calendar.removeCalendarObjectWithName(name)
+            self.assertIdentical(
+                calendar.calendarObjectWithName(name), None
+            )
+
+
+    def test_removeCalendarObjectWithName_absent(self):
+        """
+        Attempt to remove an non-existing calendar object should raise.
+        """
+        calendar = self.calendarUnderTest()
+        self.assertRaises(
+            NoSuchObjectResourceError,
+            calendar.removeCalendarObjectWithName, "xyzzy"
+        )
+
+
+    def test_calendarName(self):
+        """
+        L{Calendar.name} reflects the name of the calendar.
+        """
+        self.assertEquals(self.calendarUnderTest().name(), "calendar_1")
+
+
+    def test_calendarObjectName(self):
+        """
+        L{ICalendarObject.name} reflects the name of the calendar object.
+        """
+        self.assertEquals(self.calendarObjectUnderTest().name(), "1.ics")
+
+
+    def test_component(self):
+        """
+        L{ICalendarObject.component} returns a L{VComponent} describing the
+        calendar data underlying that calendar object.
+        """
+        component = self.calendarObjectUnderTest().component()
+
+        self.failUnless(
+            isinstance(component, VComponent),
+            component
+        )
+
+        self.assertEquals(component.name(), "VCALENDAR")
+        self.assertEquals(component.mainType(), "VEVENT")
+        self.assertEquals(component.resourceUID(), "uid1")
+
+
+    def test_iCalendarText(self):
+        """
+        L{ICalendarObject.iCalendarText} returns a C{str} describing the same
+        data provided by L{ICalendarObject.component}.
+        """
+        text = self.calendarObjectUnderTest().iCalendarText()
+        self.assertIsInstance(text, str)
+        self.failUnless(text.startswith("BEGIN:VCALENDAR\r\n"))
+        self.assertIn("\r\nUID:uid1\r\n", text)
+        self.failUnless(text.endswith("\r\nEND:VCALENDAR\r\n"))
+
+
+    def test_calendarObjectUID(self):
+        """
+        L{ICalendarObject.uid} returns a C{str} describing the C{UID} property
+        of the calendar object's component.
+        """
+        self.assertEquals(self.calendarObjectUnderTest().uid(), "uid1")
+
+
+    def test_organizer(self):
+        """
+        L{ICalendarObject.organizer} returns a C{str} describing the calendar
+        user address of the C{ORGANIZER} property of the calendar object's
+        component.
+        """
+        self.assertEquals(
+            self.calendarObjectUnderTest().organizer(),
+            "mailto:wsanchez at apple.com"
+        )
+
+
+    def test_calendarObjectWithUID_absent(self):
+        """
+        L{ICalendar.calendarObjectWithUID} returns C{None} for calendars which
+        don't exist.
+        """
+        calendar1 = self.calendarUnderTest()
+        self.assertEquals(calendar1.calendarObjectWithUID("xyzzy"), None)
+
+
+    def test_calendars(self):
+        """
+        L{ICalendarHome.calendars} returns an iterable of L{ICalendar}
+        providers, which are consistent with the results from
+        L{ICalendar.calendarWithName}.
+        """
+        # Add a dot directory to make sure we don't find it
+        # self.home1._path.child(".foo").createDirectory()
+        home = self.homeUnderTest()
+        calendars = list(home.calendars())
+
+        for calendar in calendars:
+            self.assertProvides(ICalendar, calendar)
+            self.assertEquals(calendar,
+                              home.calendarWithName(calendar.name()))
+
+        self.assertEquals(
+            list(c.name() for c in calendars),
+            home1_calendarNames
+        )
+
+
+    def test_calendarsAfterAddCalendar(self):
+        """
+        L{ICalendarHome.calendars} includes calendars recently added with
+        L{ICalendarHome.createCalendarWithName}.
+        """
+        home = self.homeUnderTest()
+        before = set(x.name() for x in home.calendars())
+        home.createCalendarWithName("new-name")
+        after = set(x.name() for x in home.calendars())
+        self.assertEquals(before | set(['new-name']), after)
+
+
+    def test_createCalendarObjectWithName_absent(self):
+        """
+        L{ICalendar.createCalendarObjectWithName} creates a new
+        L{ICalendarObject}.
+        """
+        calendar1 = self.calendarUnderTest()
+        name = "4.ics"
+        self.assertIdentical(calendar1.calendarObjectWithName(name), None)
+        component = VComponent.fromString(event4_text)
+        calendar1.createCalendarObjectWithName(name, component)
+
+        calendarObject = calendar1.calendarObjectWithName(name)
+        self.assertEquals(calendarObject.component(), component)
+
+
+    def test_createCalendarObjectWithName_exists(self):
+        """
+        L{ICalendar.createCalendarObjectWithName} raises
+        L{CalendarObjectNameAlreadyExistsError} if a calendar object with the
+        given name already exists in that calendar.
+        """
+        self.assertRaises(
+            ObjectResourceNameAlreadyExistsError,
+            self.calendarUnderTest().createCalendarObjectWithName,
+            "1.ics", VComponent.fromString(event4_text)
+        )
+
+
+    def test_createCalendarObjectWithName_invalid(self):
+        """
+        L{ICalendar.createCalendarObjectWithName} raises
+        L{InvalidCalendarComponentError} if presented with invalid iCalendar
+        text.
+        """
+        self.assertRaises(
+            InvalidObjectResourceError,
+            self.calendarUnderTest().createCalendarObjectWithName,
+            "new", VComponent.fromString(event4notCalDAV_text)
+        )
+
+
+    def test_setComponent_invalid(self):
+        """
+        L{ICalendarObject.setComponent} raises L{InvalidICalendarDataError} if
+        presented with invalid iCalendar text.
+        """
+        calendarObject = self.calendarObjectUnderTest()
+        self.assertRaises(
+            InvalidObjectResourceError,
+            calendarObject.setComponent,
+            VComponent.fromString(event4notCalDAV_text)
+        )
+
+
+    def test_setComponent_uidchanged(self):
+        """
+        L{ICalendarObject.setComponent} raises L{InvalidCalendarComponentError}
+        when given a L{VComponent} whose UID does not match its existing UID.
+        """
+        calendar1 = self.calendarUnderTest()
+        component = VComponent.fromString(event4_text)
+        calendarObject = calendar1.calendarObjectWithName("1.ics")
+        self.assertRaises(
+            InvalidObjectResourceError,
+            calendarObject.setComponent, component
+        )
+
+
+    def test_calendarHomeWithUID_create(self):
+        """
+        L{ICommonStoreTransaction.calendarHomeWithUID} with C{create=True}
+        will create a calendar home that doesn't exist yet.
+        """
+        txn = self.transactionUnderTest()
+        noHomeUID = "xyzzy"
+        calendarHome = txn.calendarHomeWithUID(
+            noHomeUID,
+            create=True
+        )
+        def readOtherTxn():
+            return self.savedStore.newTransaction().calendarHomeWithUID(
+                noHomeUID)
+        self.assertProvides(ICalendarHome, calendarHome)
+        # A concurrent transaction shouldn't be able to read it yet:
+        self.assertIdentical(readOtherTxn(), None)
+        self.commit()
+        # But once it's committed, other transactions should see it.
+        self.assertProvides(ICalendarHome, readOtherTxn())
+
+
+    def test_setComponent(self):
+        """
+        L{CalendarObject.setComponent} changes the result of
+        L{CalendarObject.component} within the same transaction.
+        """
+        component = VComponent.fromString(event1modified_text)
+
+        calendar1 = self.calendarUnderTest()
+        calendarObject = calendar1.calendarObjectWithName("1.ics")
+        oldComponent = calendarObject.component()
+        self.assertNotEqual(component, oldComponent)
+        calendarObject.setComponent(component)
+        self.assertEquals(calendarObject.component(), component)
+
+        # Also check a new instance
+        calendarObject = calendar1.calendarObjectWithName("1.ics")
+        self.assertEquals(calendarObject.component(), component)
+
+
+    def checkPropertiesMethod(self, thunk):
+        """
+        Verify that the given object has a properties method that returns an
+        L{IPropertyStore}.
+        """
+        properties = thunk.properties()
+        self.assertProvides(IPropertyStore, properties)
+
+
+    def test_homeProperties(self):
+        """
+        L{ICalendarHome.properties} returns a property store.
+        """
+        self.checkPropertiesMethod(self.homeUnderTest())
+
+
+    def test_calendarProperties(self):
+        """
+        L{ICalendar.properties} returns a property store.
+        """
+        self.checkPropertiesMethod(self.calendarUnderTest())
+
+
+    def test_calendarObjectProperties(self):
+        """
+        L{ICalendarObject.properties} returns a property store.
+        """
+        self.checkPropertiesMethod(self.calendarObjectUnderTest())
+
+
+    def test_newCalendarObjectProperties(self):
+        """
+        L{ICalendarObject.properties} returns an empty property store for a
+        calendar object which has been created but not committed.
+        """
+        calendar = self.calendarUnderTest()
+        calendar.createCalendarObjectWithName(
+            "4.ics", VComponent.fromString(event4_text)
+        )
+        newEvent = calendar.calendarObjectWithName("4.ics")
+        self.assertEquals(newEvent.properties().items(), [])
+
+
+    def test_setComponentPreservesProperties(self):
+        """
+        L{ICalendarObject.setComponent} preserves properties.
+
+        (Some implementations must go to extra trouble to provide this
+        behavior; for example, file storage must copy extended attributes from
+        the existing file to the temporary file replacing it.)
+        """
+        propertyName = PropertyName("http://example.com/ns", "example")
+        propertyContent = WebDAVUnknownElement("sample content")
+        propertyContent.name = propertyName.name
+        propertyContent.namespace = propertyName.namespace
+
+        self.calendarObjectUnderTest().properties()[
+            propertyName] = propertyContent
+        self.commit()
+        # Sanity check; are properties even readable in a separate transaction?
+        # Should probably be a separate test.
+        self.assertEquals(
+            self.calendarObjectUnderTest().properties()[propertyName],
+            propertyContent)
+        obj = self.calendarObjectUnderTest()
+        event1_text = obj.iCalendarText()
+        event1_text_withDifferentSubject = event1_text.replace(
+            "SUMMARY:CalDAV protocol updates",
+            "SUMMARY:Changed"
+        )
+        # Sanity check; make sure the test has the right idea of the subject.
+        self.assertNotEquals(event1_text, event1_text_withDifferentSubject)
+        newComponent = VComponent.fromString(event1_text_withDifferentSubject)
+        obj.setComponent(newComponent)
+
+        # Putting everything into a separate transaction to account for any
+        # caching that may take place.
+        self.commit()
+        self.assertEquals(
+            self.calendarObjectUnderTest().properties()[propertyName],
+            propertyContent
+        )
+
+
+    eventWithDropbox = "\r\n".join("""
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051222T205953Z
+CREATED:20060101T150000Z
+DTSTART;TZID=US/Eastern:20060101T100000
+DURATION:PT1H
+SUMMARY:event 1
+UID:event1 at ninevah.local
+ORGANIZER:user01
+ATTENDEE;PARTSTAT=ACCEPTED:user01
+ATTACH;VALUE=URI:/calendars/users/home1/some-dropbox-id/some-dropbox-id/caldavd.plist
+X-APPLE-DROPBOX:/calendars/users/home1/dropbox/some-dropbox-id
+END:VEVENT
+END:VCALENDAR
+    """.strip().split("\n"))
+
+    def test_dropboxID(self):
+        """
+        L{ICalendarObject.dropboxID} should synthesize its dropbox from the X
+        -APPLE-DROPBOX property.
+        """
+        cal = self.calendarUnderTest()
+        cal.createCalendarObjectWithName("drop.ics", VComponent.fromString(
+                self.eventWithDropbox
+            )
+        )
+        obj = cal.calendarObjectWithName("drop.ics")
+        self.assertEquals(obj.dropboxID(), "some-dropbox-id")
+
+
+    def test_indexByDropboxProperty(self):
+        """
+        L{ICalendarHome.calendarObjectWithDropboxID} will return a calendar
+        object in the calendar home with the given final segment in its C{X
+        -APPLE-DROPBOX} property URI.
+        """
+        objName = "with-dropbox.ics"
+        cal = self.calendarUnderTest()
+        cal.createCalendarObjectWithName(
+            objName, VComponent.fromString(
+                self.eventWithDropbox
+            )
+        )
+        self.commit()
+        home = self.homeUnderTest()
+        cal = self.calendarUnderTest()
+        fromName = cal.calendarObjectWithName(objName)
+        fromDropbox = home.calendarObjectWithDropboxID("some-dropbox-id")
+        self.assertEquals(fromName, fromDropbox)
+
+
+    @inlineCallbacks
+    def createAttachmentTest(self, refresh):
+        """
+        Common logic for attachment-creation tests.
+        """
+        obj = self.calendarObjectUnderTest()
+        t = obj.createAttachmentWithName("new.attachment", MimeType("text", "x-fixture"))
+        t.write("new attachment")
+        t.write(" text")
+        t.loseConnection()
+        obj = refresh(obj)
+        class CaptureProtocol(Protocol):
+            buf = ''
+            def dataReceived(self, data):
+                self.buf += data
+            def connectionLost(self, reason):
+                self.deferred.callback(self.buf)
+        capture = CaptureProtocol()
+        capture.deferred = Deferred()
+        attachment = obj.attachmentWithName("new.attachment")
+        self.assertProvides(IAttachment, attachment)
+        attachment.retrieve(capture)
+        data = yield capture.deferred
+        self.assertEquals(data, "new attachment text")
+        contentType = attachment.contentType()
+        self.assertIsInstance(contentType, MimeType)
+        self.assertEquals(contentType, MimeType("text", "x-fixture"))
+        self.assertEquals(attachment.md5(), '50a9f27aeed9247a0833f30a631f1858')
+        self.assertEquals(
+            [attachment.name() for attachment in obj.attachments()],
+            ['new.attachment']
+        )
+
+
+    def test_createAttachment(self):
+        """
+        L{ICalendarObject.createAttachmentWithName} will store an
+        L{IAttachment} object that can be retrieved by
+        L{ICalendarObject.attachmentWithName}.
+        """
+        return self.createAttachmentTest(lambda x: x)
+
+
+    def test_createAttachmentCommit(self):
+        """
+        L{ICalendarObject.createAttachmentWithName} will store an
+        L{IAttachment} object that can be retrieved by
+        L{ICalendarObject.attachmentWithName} in subsequent transactions.
+        """
+        def refresh(obj):
+            self.commit()
+            return self.calendarObjectUnderTest()
+        return self.createAttachmentTest(refresh)
+
+
+    def test_removeAttachmentWithName(self, refresh=lambda x:x):
+        """
+        L{ICalendarObject.removeAttachmentWithName} will remove the calendar
+        object with the given name.
+        """
+        def deleteIt(ignored):
+            obj = self.calendarObjectUnderTest()
+            obj.removeAttachmentWithName("new.attachment")
+            obj = refresh(obj)
+            self.assertIdentical(
+                None, obj.attachmentWithName("new.attachment")
+            )
+            self.assertEquals(list(obj.attachments()), [])
+        return self.test_createAttachmentCommit().addCallback(deleteIt)
+
+
+    def test_removeAttachmentWithNameCommit(self):
+        """
+        L{ICalendarObject.removeAttachmentWithName} will remove the calendar
+        object with the given name.  (After commit, it will still be gone.)
+        """
+        def refresh(obj):
+            self.commit()
+            return self.calendarObjectUnderTest()
+        return self.test_removeAttachmentWithName(refresh)
+
+
+    def test_noDropboxCalendar(self):
+        """
+        L{ICalendarObject.createAttachmentWithName} may create a directory
+        named 'dropbox', but this should not be seen as a calendar by
+        L{ICalendarHome.calendarWithName} or L{ICalendarHome.calendars}.
+        """
+        obj = self.calendarObjectUnderTest()
+        t = obj.createAttachmentWithName("new.attachment", MimeType("text", "plain"))
+        t.write("new attachment text")
+        t.loseConnection()
+        self.commit()
+        self.assertEquals(self.homeUnderTest().calendarWithName("dropbox"),
+                          None)
+        self.assertEquals(
+            set([n.name() for n in self.homeUnderTest().calendars()]),
+            set(home1_calendarNames))
+
+
+    def test_finishedOnCommit(self):
+        """ 
+        Calling L{ITransaction.abort} or L{ITransaction.commit} after
+        L{ITransaction.commit} has already been called raises an
+        L{AlreadyFinishedError}.
+        """
+        self.calendarObjectUnderTest()
+        txn = self.lastTransaction
+        self.commit()
+        self.assertRaises(AlreadyFinishedError, txn.commit)
+        self.assertRaises(AlreadyFinishedError, txn.abort)
+
+

Modified: CalendarServer/trunk/txcaldav/calendarstore/test/test_file.py
===================================================================
--- CalendarServer/trunk/txcaldav/calendarstore/test/test_file.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcaldav/calendarstore/test/test_file.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -18,450 +18,186 @@
 File calendar store tests.
 """
 
-from zope.interface.verify import verifyObject, BrokenMethodImplementation
-
 from twext.python.filepath import CachingFilePath as FilePath
 from twisted.trial import unittest
 
 from twext.python.vcomponent import VComponent
 
-from txdav.idav import IPropertyStore
+from txdav.common.icommondatastore import HomeChildNameNotAllowedError
+from txdav.common.icommondatastore import ObjectResourceNameNotAllowedError
+from txdav.common.icommondatastore import ObjectResourceUIDAlreadyExistsError
+from txdav.common.icommondatastore import NoSuchHomeChildError
+from txdav.common.icommondatastore import NoSuchObjectResourceError
 
-from txcaldav.icalendarstore import ICalendarStore, ICalendarHome
-from txcaldav.icalendarstore import ICalendar, ICalendarObject
-from txcaldav.icalendarstore import CalendarNameNotAllowedError
-from txcaldav.icalendarstore import CalendarObjectNameNotAllowedError
-from txcaldav.icalendarstore import CalendarAlreadyExistsError
-from txcaldav.icalendarstore import CalendarObjectNameAlreadyExistsError
-from txcaldav.icalendarstore import CalendarObjectUIDAlreadyExistsError
-from txcaldav.icalendarstore import NoSuchCalendarError
-from txcaldav.icalendarstore import NoSuchCalendarObjectError
-from txcaldav.icalendarstore import InvalidCalendarComponentError
-
 from txcaldav.calendarstore.file import CalendarStore, CalendarHome
 from txcaldav.calendarstore.file import Calendar, CalendarObject
 
+from txcaldav.calendarstore.test.common import (
+    CommonTests, event4_text, event1modified_text)
+
 storePath = FilePath(__file__).parent().child("calendar_store")
 
-home1_calendarNames = (
-    "calendar_1",
-    "calendar_2",
-    "calendar_empty",
-)
-
-calendar1_objectNames = (
-    "1.ics",
-    "2.ics",
-    "3.ics",
-)
-
-event4_text = (
-    "BEGIN:VCALENDAR\r\n"
-      "VERSION:2.0\r\n"
-      "PRODID:-//Apple Inc.//iCal 4.0.1//EN\r\n"
-      "CALSCALE:GREGORIAN\r\n"
-      "BEGIN:VTIMEZONE\r\n"
-        "TZID:US/Pacific\r\n"
-        "BEGIN:DAYLIGHT\r\n"
-          "TZOFFSETFROM:-0800\r\n"
-          "RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\n"
-          "DTSTART:20070311T020000\r\n"
-          "TZNAME:PDT\r\n"
-          "TZOFFSETTO:-0700\r\n"
-        "END:DAYLIGHT\r\n"
-        "BEGIN:STANDARD\r\n"
-          "TZOFFSETFROM:-0700\r\n"
-          "RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\n"
-          "DTSTART:20071104T020000\r\n"
-          "TZNAME:PST\r\n"
-          "TZOFFSETTO:-0800\r\n"
-        "END:STANDARD\r\n"
-      "END:VTIMEZONE\r\n"
-      "BEGIN:VEVENT\r\n"
-        "CREATED:20100203T013849Z\r\n"
-        "UID:uid4\r\n"
-        "DTEND;TZID=US/Pacific:20100207T173000\r\n"
-        "TRANSP:OPAQUE\r\n"
-        "SUMMARY:New Event\r\n"
-        "DTSTART;TZID=US/Pacific:20100207T170000\r\n"
-        "DTSTAMP:20100203T013909Z\r\n"
-        "SEQUENCE:3\r\n"
-        "BEGIN:VALARM\r\n"
-          "X-WR-ALARMUID:1377CCC7-F85C-4610-8583-9513D4B364E1\r\n"
-          "TRIGGER:-PT20M\r\n"
-          "ATTACH;VALUE=URI:Basso\r\n"
-          "ACTION:AUDIO\r\n"
-        "END:VALARM\r\n"
-      "END:VEVENT\r\n"
-    "END:VCALENDAR\r\n"
-)
-
-event1modified_text = event4_text.replace(
-    "\r\nUID:uid4\r\n",
-    "\r\nUID:uid1\r\n"
-)
-
-event4notCalDAV_text = (
-    "BEGIN:VCALENDAR\r\n"
-      "VERSION:2.0\r\n"
-      "PRODID:-//Apple Inc.//iCal 4.0.1//EN\r\n"
-      "CALSCALE:GREGORIAN\r\n"
-      "BEGIN:VEVENT\r\n"
-        "CREATED:20100203T013849Z\r\n"
-        "UID:4\r\n"
-        "DTEND;TZID=US/Pacific:20100207T173000\r\n" # TZID without VTIMEZONE
-        "TRANSP:OPAQUE\r\n"
-        "SUMMARY:New Event\r\n"
-        "DTSTART;TZID=US/Pacific:20100207T170000\r\n"
-        "DTSTAMP:20100203T013909Z\r\n"
-        "SEQUENCE:3\r\n"
-        "BEGIN:VALARM\r\n"
-          "X-WR-ALARMUID:1377CCC7-F85C-4610-8583-9513D4B364E1\r\n"
-          "TRIGGER:-PT20M\r\n"
-          "ATTACH;VALUE=URI:Basso\r\n"
-          "ACTION:AUDIO\r\n"
-        "END:VALARM\r\n"
-      "END:VEVENT\r\n"
-    "END:VCALENDAR\r\n"
-)
-
-
 def _todo(f, why):
     f.todo = why
     return f
 
+
+
 featureUnimplemented = lambda f: _todo(f, "Feature unimplemented")
 testUnimplemented = lambda f: _todo(f, "Test unimplemented")
 todo = lambda why: lambda f: _todo(f, why)
 
 
-class PropertiesTestMixin(object):
-    def test_properties(self):
-        properties = self.home1.properties()
-
-        self.failUnless(
-            IPropertyStore.providedBy(properties),
-            properties
-        )
-
-
 def setUpCalendarStore(test):
     test.root = FilePath(test.mktemp())
     test.root.createDirectory()
 
-    calendarPath = test.root.child("store")
+    storeRootPath = test.storeRootPath = test.root.child("store")
+    calendarPath = storeRootPath.child("calendars").child("__uids__")
+    calendarPath.parent().makedirs()
     storePath.copyTo(calendarPath)
 
-    test.calendarStore = CalendarStore(calendarPath)
+    test.calendarStore = CalendarStore(storeRootPath)
+    test.txn = test.calendarStore.newTransaction()
     assert test.calendarStore is not None, "No calendar store?"
 
+
+
 def setUpHome1(test):
     setUpCalendarStore(test)
-    test.home1 = test.calendarStore.calendarHomeWithUID("home1")
+    test.home1 = test.txn.calendarHomeWithUID("home1")
     assert test.home1 is not None, "No calendar home?"
 
+
+
 def setUpCalendar1(test):
     setUpHome1(test)
     test.calendar1 = test.home1.calendarWithName("calendar_1")
     assert test.calendar1 is not None, "No calendar?"
 
 
+
 class CalendarStoreTest(unittest.TestCase):
+    """
+    Test cases for L{CalendarStore}.
+    """
+
     def setUp(self):
         setUpCalendarStore(self)
 
-    def test_interface(self):
-        """
-        Interface is completed and conforming.
-        """
-        try:
-            verifyObject(ICalendarStore, self.calendarStore)
-        except BrokenMethodImplementation, e:
-            self.fail(e)
 
-    def test_init(self):
-        """
-        Ivars are correctly initialized.
-        """
-        self.failUnless(
-            isinstance(self.calendarStore.path, FilePath),
-            self.calendarStore.path
-        )
-
-    def test_calendarHomeWithUID_exists(self):
-        """
-        Find an existing calendar home by UID.
-        """
-        calendarHome = self.calendarStore.calendarHomeWithUID("home1")
-
-        self.failUnless(isinstance(calendarHome, CalendarHome))
-
-    def test_calendarHomeWithUID_absent(self):
-        """
-        Missing calendar home.
-        """
-        self.assertEquals(
-            self.calendarStore.calendarHomeWithUID("xyzzy"),
-            None
-        )
-
-    def test_calendarHomeWithUID_create(self):
-        """
-        Create missing calendar home.
-        """
-        calendarHome = self.calendarStore.calendarHomeWithUID(
-            "xyzzy",
-            create=True
-        )
-
-        self.failUnless(isinstance(calendarHome, CalendarHome))
-        self.failUnless(calendarHome.path.isdir())
-
-    def test_calendarHomeWithUID_create_exists(self):
-        """
-        Create missing calendar home.
-        """
-        calendarHome = self.calendarStore.calendarHomeWithUID("home1")
-
-        self.failUnless(isinstance(calendarHome, CalendarHome))
-
     def test_calendarHomeWithUID_dot(self):
         """
         Filenames starting with "." are reserved by this
         implementation, so no UIDs may start with ".".
         """
         self.assertEquals(
-            self.calendarStore.calendarHomeWithUID("xyzzy"),
+            self.calendarStore.newTransaction().calendarHomeWithUID("xyzzy"),
             None
         )
 
 
-class CalendarHomeTest(unittest.TestCase, PropertiesTestMixin):
+
+class CalendarHomeTest(unittest.TestCase):
+
     def setUp(self):
         setUpHome1(self)
 
-    def test_interface(self):
-        """
-        Interface is completed and conforming.
-        """
-        try:
-            verifyObject(ICalendarHome, self.home1)
-        except BrokenMethodImplementation, e:
-            self.fail(e)
 
     def test_init(self):
         """
-        Ivars are correctly initialized.
+        L{CalendarHome} has C{_path} and L{_calendarStore} attributes,
+        indicating its location on disk and parent store, respectively.
         """
         self.failUnless(
-            isinstance(self.home1.path, FilePath),
-            self.home1.path
+            isinstance(self.home1._path, FilePath),
+            self.home1._path
         )
         self.assertEquals(
-            self.home1.calendarStore,
+            self.home1._calendarStore,
             self.calendarStore
         )
 
-    def test_uid(self):
-        """
-        UID is correct.
-        """
-        self.assertEquals(self.home1.uid(), "home1")
 
-    def test_calendars(self):
-        """
-        Find all of the calendars.
-        """
-        # Add a dot directory to make sure we don't find it
-        self.home1.path.child(".foo").createDirectory()
-
-        calendars = tuple(self.home1.calendars())
-
-        for calendar in calendars:
-            self.failUnless(isinstance(calendar, Calendar), calendar)
-
-        self.assertEquals(
-            tuple(c.name() for c in calendars),
-            home1_calendarNames
-        )
-
-    def test_calendarWithName_exists(self):
-        """
-        Find existing calendar by name.
-        """
-        for name in home1_calendarNames:
-            calendar = self.home1.calendarWithName(name)
-            self.failUnless(isinstance(calendar, Calendar), calendar)
-            self.assertEquals(calendar.name(), name)
-
-    def test_calendarWithName_absent(self):
-        """
-        Missing calendar.
-        """
-        self.assertEquals(self.home1.calendarWithName("xyzzy"), None)
-
     def test_calendarWithName_dot(self):
         """
         Filenames starting with "." are reserved by this
         implementation, so no calendar names may start with ".".
         """
         name = ".foo"
-        self.home1.path.child(name).createDirectory()
+        self.home1._path.child(name).createDirectory()
         self.assertEquals(self.home1.calendarWithName(name), None)
 
-    def test_createCalendarWithName_absent(self):
-        """
-        Create a new calendar.
-        """
-        name = "new"
-        assert self.home1.calendarWithName(name) is None
-        self.home1.createCalendarWithName(name)
-        self.failUnless(self.home1.calendarWithName(name) is not None)
 
-    def test_createCalendarWithName_exists(self):
-        """
-        Attempt to create an existing calendar should raise.
-        """
-        for name in home1_calendarNames:
-            self.assertRaises(
-                CalendarAlreadyExistsError,
-                self.home1.createCalendarWithName, name
-            )
-
     def test_createCalendarWithName_dot(self):
         """
         Filenames starting with "." are reserved by this
         implementation, so no calendar names may start with ".".
         """
         self.assertRaises(
-            CalendarNameNotAllowedError,
+            HomeChildNameNotAllowedError,
             self.home1.createCalendarWithName, ".foo"
         )
 
-    def test_removeCalendarWithName_exists(self):
-        """
-        Remove an existing calendar.
-        """
-        for name in home1_calendarNames:
-            assert self.home1.calendarWithName(name) is not None
-            self.home1.removeCalendarWithName(name)
-            self.assertEquals(self.home1.calendarWithName(name), None)
 
-    def test_removeCalendarWithName_absent(self):
-        """
-        Attempt to remove an non-existing calendar should raise.
-        """
-        self.assertRaises(
-            NoSuchCalendarError,
-            self.home1.removeCalendarWithName, "xyzzy"
-        )
-
     def test_removeCalendarWithName_dot(self):
         """
         Filenames starting with "." are reserved by this
         implementation, so no calendar names may start with ".".
         """
         name = ".foo"
-        self.home1.path.child(name).createDirectory()
+        self.home1._path.child(name).createDirectory()
         self.assertRaises(
-            NoSuchCalendarError,
+            NoSuchHomeChildError,
             self.home1.removeCalendarWithName, name
         )
 
-class CalendarTest(unittest.TestCase, PropertiesTestMixin):
+
+
+class CalendarTest(unittest.TestCase):
+
     def setUp(self):
         setUpCalendar1(self)
 
-    def test_interface(self):
-        """
-        Interface is completed and conforming.
-        """
-        try:
-            verifyObject(ICalendar, self.calendar1)
-        except BrokenMethodImplementation, e:
-            self.fail(e)
 
     def test_init(self):
         """
-        Ivars are correctly initialized.
+        L{Calendar.__init__} sets private attributes to reflect its constructor
+        arguments.
         """
         self.failUnless(
-            isinstance(self.calendar1.path, FilePath),
+            isinstance(self.calendar1._path, FilePath),
             self.calendar1
         )
         self.failUnless(
-            isinstance(self.calendar1.calendarHome, CalendarHome),
-            self.calendar1.calendarHome
+            isinstance(self.calendar1._calendarHome, CalendarHome),
+            self.calendar1._calendarHome
         )
 
-    def test_name(self):
-        """
-        Name is correct.
-        """
-        self.assertEquals(self.calendar1.name(), "calendar_1")
 
-    def test_ownerCalendarHome(self):
+    def test_useIndexImmediately(self):
         """
-        Owner is correct.
+        L{Calendar._index} is usable in the same transaction it is created, with
+        a temporary filename.
         """
-        # Note that here we know that home1 owns calendar1
-        self.assertEquals(
-            self.calendar1.ownerCalendarHome().uid(),
-            self.home1.uid()
-        )
+        self.home1.createCalendarWithName("calendar2")
+        calendar = self.home1.calendarWithName("calendar2")
+        index = calendar._index
+        self.assertEquals(set(index.calendarObjects()),
+                          set(calendar.calendarObjects()))
+        self.txn.commit()
+        self.txn = self.calendarStore.newTransaction()
+        self.home1 = self.txn.calendarHomeWithUID("home1")
+        calendar = self.home1.calendarWithName("calendar2")
+        # FIXME: we should be curating our own index here, but in order to fix
+        # that the code in the old implicit scheduler needs to change.  This
+        # test would be more effective if there were actually some objects in
+        # this list.
+        index = calendar._index
+        self.assertEquals(set(index.calendarObjects()),
+                          set(calendar.calendarObjects()))
 
-    def _test_calendarObjects(self, which):
-        # Add a dot file to make sure we don't find it
-        self.home1.path.child(".foo").createDirectory()
 
-        methodName = "_calendarObjects_%s" % (which,)
-        method = getattr(self.calendar1, methodName)
-        calendarObjects = tuple(method())
-
-        for calendarObject in calendarObjects:
-            self.failUnless(
-                isinstance(calendarObject, CalendarObject),
-                calendarObject
-            )
-
-        self.assertEquals(
-            tuple(o.name() for o in calendarObjects),
-            calendar1_objectNames
-        )
-
-    def test_calendarObjects_listdir(self):
-        """
-        Find all of the calendar objects using the listdir
-        implementation.
-        """
-        return self._test_calendarObjects("listdir")
-
-    @todo("Index is missing 1.ics?")
-    def test_calendarObjects_index(self):
-        """
-        Find all of the calendar objects using the index
-        implementation.
-        """
-        return self._test_calendarObjects("index")
-
-    def test_calendarObjectWithName_exists(self):
-        """
-        Find existing calendar object by name.
-        """
-        for name in calendar1_objectNames:
-            calendarObject = self.calendar1.calendarObjectWithName(name)
-            self.failUnless(
-                isinstance(calendarObject, CalendarObject),
-                calendarObject
-            )
-            self.assertEquals(calendarObject.name(), name)
-
-    def test_calendarObjectWithName_absent(self):
-        """
-        Missing calendar object.
-        """
-        self.assertEquals(self.calendar1.calendarObjectWithName("xyzzy"), None)
-
     def test_calendarObjectWithName_dot(self):
         """
         Filenames starting with "." are reserved by this
@@ -469,9 +205,10 @@
         ".".
         """
         name = ".foo.ics"
-        self.home1.path.child(name).touch()
+        self.home1._path.child(name).touch()
         self.assertEquals(self.calendar1.calendarObjectWithName(name), None)
 
+
     @featureUnimplemented
     def test_calendarObjectWithUID_exists(self):
         """
@@ -487,35 +224,7 @@
             self.calendar1.calendarObjectWithName("1.ics").component()
         )
 
-    @featureUnimplemented
-    def test_calendarObjectWithUID_absent(self):
-        """
-        Missing calendar object.
-        """
-        self.assertEquals(self.calendar1.calendarObjectWithUID("xyzzy"), None)
 
-    def test_createCalendarObjectWithName_absent(self):
-        """
-        Create a new calendar object.
-        """
-        name = "4.ics"
-        assert self.calendar1.calendarObjectWithName(name) is None
-        component = VComponent.fromString(event4_text)
-        self.calendar1.createCalendarObjectWithName(name, component)
-
-        calendarObject = self.calendar1.calendarObjectWithName(name)
-        self.assertEquals(calendarObject.component(), component)
-
-    def test_createCalendarObjectWithName_exists(self):
-        """
-        Attempt to create an existing calendar object should raise.
-        """
-        self.assertRaises(
-            CalendarObjectNameAlreadyExistsError,
-            self.calendar1.createCalendarObjectWithName,
-            "1.ics", VComponent.fromString(event4_text)
-        )
-
     def test_createCalendarObjectWithName_dot(self):
         """
         Filenames starting with "." are reserved by this
@@ -523,11 +232,12 @@
         ".".
         """
         self.assertRaises(
-            CalendarObjectNameNotAllowedError,
+            ObjectResourceNameNotAllowedError,
             self.calendar1.createCalendarObjectWithName,
             ".foo", VComponent.fromString(event4_text)
         )
 
+
     @featureUnimplemented
     def test_createCalendarObjectWithName_uidconflict(self):
         """
@@ -538,42 +248,22 @@
         assert self.calendar1.calendarObjectWithName(name) is None
         component = VComponent.fromString(event1modified_text)
         self.assertRaises(
-            CalendarObjectUIDAlreadyExistsError,
+            ObjectResourceUIDAlreadyExistsError,
             self.calendar1.createCalendarObjectWithName,
             name, component
         )
 
-    def test_createCalendarObjectWithName_invalid(self):
-        """
-        Attempt to create a calendar object with a invalid iCalendar text
-        should raise.
-        """
-        self.assertRaises(
-            InvalidCalendarComponentError,
-            self.calendar1.createCalendarObjectWithName,
-            "new", VComponent.fromString(event4notCalDAV_text)
-        )
 
-    def test_removeCalendarObjectWithName_exists(self):
+    def test_removeCalendarObject_delayedEffect(self):
         """
-        Remove an existing calendar object.
+        Removing a calendar object should not immediately remove the underlying
+        file; it should only be removed upon commit() of the transaction.
         """
-        for name in calendar1_objectNames:
-            assert self.calendar1.calendarObjectWithName(name) is not None
-            self.calendar1.removeCalendarObjectWithName(name)
-            self.assertEquals(
-                self.calendar1.calendarObjectWithName(name),
-                None
-            )
+        self.calendar1.removeCalendarObjectWithName("2.ics")
+        self.failUnless(self.calendar1._path.child("2.ics").exists())
+        self.txn.commit()
+        self.failIf(self.calendar1._path.child("2.ics").exists())
 
-    def test_removeCalendarObjectWithName_absent(self):
-        """
-        Attempt to remove an non-existing calendar object should raise.
-        """
-        self.assertRaises(
-            NoSuchCalendarObjectError,
-            self.calendar1.removeCalendarObjectWithName, "xyzzy"
-        )
 
     def test_removeCalendarObjectWithName_dot(self):
         """
@@ -582,40 +272,105 @@
         ".".
         """
         name = ".foo"
-        self.calendar1.path.child(name).touch()
+        self.calendar1._path.child(name).touch()
         self.assertRaises(
-            NoSuchCalendarObjectError,
+            NoSuchObjectResourceError,
             self.calendar1.removeCalendarObjectWithName, name
         )
 
-    @featureUnimplemented
-    def test_removeCalendarObjectWithUID_exists(self):
+
+    def _refresh(self):
         """
-        Remove an existing calendar object.
+        Re-read the (committed) home1 and calendar1 objects in a new
+        transaction.
         """
-        for name in calendar1_objectNames:
-            uid = name.rstrip(".ics")
-            assert self.calendar1.calendarObjectWithUID(uid) is not None
-            self.calendar1.removeCalendarObjectWithUID(uid)
-            self.assertEquals(
-                self.calendar1.calendarObjectWithUID(uid),
-                None
-            )
-            self.assertEquals(
-                self.calendar1.calendarObjectWithName(name),
-                None
-            )
+        self.txn = self.calendarStore.newTransaction()
+        self.home1 = self.txn.calendarHomeWithUID("home1")
+        self.calendar1 = self.home1.calendarWithName("calendar_1")
 
+
+    def test_undoCreateCalendarObject(self):
+        """
+        If a calendar object is created as part of a transaction, it will be
+        removed if that transaction has to be aborted.
+        """
+        # Make sure that the calendar home is actually committed; rolling back
+        # calendar home creation will remove the whole directory.
+        self.txn.commit()
+        self._refresh()
+        self.calendar1.createCalendarObjectWithName(
+            "sample.ics",
+            VComponent.fromString(event4_text)
+        )
+        self._refresh()
+        self.assertIdentical(
+            self.calendar1.calendarObjectWithName("sample.ics"),
+            None
+        )
+
+
+    def doThenUndo(self):
+        """
+        Commit the current transaction, but add an operation that will cause it
+        to fail at the end.  Finally, refresh all attributes with a new
+        transaction so that further operations can be performed in a valid
+        context.
+        """
+        def fail():
+            raise RuntimeError("oops")
+        self.txn.addOperation(fail, "dummy failing operation")
+        self.assertRaises(RuntimeError, self.txn.commit)
+        self._refresh()
+
+
+    def test_undoModifyCalendarObject(self):
+        """
+        If an existing calendar object is modified as part of a transaction, it
+        should be restored to its previous status if the transaction aborts.
+        """
+        originalComponent = self.calendar1.calendarObjectWithName(
+            "1.ics").component()
+        self.calendar1.calendarObjectWithName("1.ics").setComponent(
+            VComponent.fromString(event1modified_text)
+        )
+        # Sanity check.
+        self.assertEquals(
+            self.calendar1.calendarObjectWithName("1.ics").component(),
+            VComponent.fromString(event1modified_text)
+        )
+        self.doThenUndo()
+        self.assertEquals(
+            self.calendar1.calendarObjectWithName("1.ics").component(),
+            originalComponent
+        )
+
+
+    def test_modifyCalendarObjectCaches(self):
+        """
+        Modifying a calendar object should cache the modified component in
+        memory, to avoid unnecessary parsing round-trips.
+        """
+        modifiedComponent = VComponent.fromString(event1modified_text)
+        self.calendar1.calendarObjectWithName("1.ics").setComponent(
+            modifiedComponent
+        )
+        self.assertIdentical(
+            modifiedComponent,
+            self.calendar1.calendarObjectWithName("1.ics").component()
+        )
+
+
     @featureUnimplemented
     def test_removeCalendarObjectWithUID_absent(self):
         """
         Attempt to remove an non-existing calendar object should raise.
         """
         self.assertRaises(
-            NoSuchCalendarObjectError,
+            NoSuchObjectResourceError,
             self.calendar1.removeCalendarObjectWithUID, "xyzzy"
         )
 
+
     @testUnimplemented
     def test_syncToken(self):
         """
@@ -623,6 +378,7 @@
         """
         raise NotImplementedError()
 
+
     @testUnimplemented
     def test_calendarObjectsInTimeRange(self):
         """
@@ -630,6 +386,7 @@
         """
         raise NotImplementedError()
 
+
     @testUnimplemented
     def test_calendarObjectsSinceToken(self):
         """
@@ -639,114 +396,63 @@
         raise NotImplementedError()
 
 
-class CalendarObjectTest(unittest.TestCase, PropertiesTestMixin):
+
+class CalendarObjectTest(unittest.TestCase):
     def setUp(self):
         setUpCalendar1(self)
         self.object1 = self.calendar1.calendarObjectWithName("1.ics")
 
-    def test_interface(self):
-        """
-        Interface is completed and conforming.
-        """
-        try:
-            verifyObject(ICalendarObject, self.object1)
-        except BrokenMethodImplementation, e:
-            self.fail(e)
 
     def test_init(self):
         """
-        Ivars are correctly initialized.
-        """
+        L{CalendarObject} has instance attributes, C{_path} and C{_calendar},
+        which refer to its position in the filesystem and the calendar in which
+        it is contained, respectively.
+        """ 
         self.failUnless(
-            isinstance(self.object1.path, FilePath),
-            self.object1.path
+            isinstance(self.object1._path, FilePath),
+            self.object1._path
         )
         self.failUnless(
-            isinstance(self.object1.calendar, Calendar),
-            self.object1.calendar
+            isinstance(self.object1._calendar, Calendar),
+            self.object1._calendar
         )
 
-    def test_name(self):
-        """
-        Name is correct.
-        """
-        self.assertEquals(self.object1.name(), "1.ics")
 
-    def test_setComponent(self):
+    def test_componentType(self):
         """
-        Rewrite component.
+        Component type is correct.
         """
-        component = VComponent.fromString(event1modified_text)
+        self.assertEquals(self.object1.componentType(), "VEVENT")
 
-        calendarObject = self.calendar1.calendarObjectWithName("1.ics")
-        oldComponent = calendarObject.component() # Trigger caching
-        assert component != oldComponent
-        calendarObject.setComponent(component)
-        self.assertEquals(calendarObject.component(), component)
 
-        # Also check a new instance
-        calendarObject = self.calendar1.calendarObjectWithName("1.ics")
-        self.assertEquals(calendarObject.component(), component)
 
-    def test_setComponent_uidchanged(self):
-        component = VComponent.fromString(event4_text)
+class FileStorageTests(CommonTests, unittest.TestCase):
+    """
+    File storage tests.
+    """
 
-        calendarObject = self.calendar1.calendarObjectWithName("1.ics")
-        self.assertRaises(
-            InvalidCalendarComponentError,
-            calendarObject.setComponent, component
-        )
-
-    def test_setComponent_invalid(self):
-        calendarObject = self.calendar1.calendarObjectWithName("1.ics")
-        self.assertRaises(
-            InvalidCalendarComponentError,
-            calendarObject.setComponent,
-            VComponent.fromString(event4notCalDAV_text)
-        )
-
-    def test_component(self):
+    def storeUnderTest(self):
         """
-        Component is correct.
+        Create and return a L{CalendarStore} for testing.
         """
-        component = self.object1.component()
+        setUpCalendarStore(self)
+        return self.calendarStore
 
-        self.failUnless(
-            isinstance(component, VComponent),
-            component
-        )
 
-        self.assertEquals(component.name(), "VCALENDAR")
-        self.assertEquals(component.mainType(), "VEVENT")
-        self.assertEquals(component.resourceUID(), "uid1")
-
-    def text_iCalendarText(self):
+    def test_init(self):
         """
-        iCalendar text is correct.
+        L{CalendarStore} has a C{_path} attribute which refers to its
+        constructor argument.
         """
-        text = self.object1.iCalendarText()
+        self.assertEquals(self.storeUnderTest()._path,
+                          self.storeRootPath)
 
-        self.failUnless(text.startswith("BEGIN:VCALENDAR\r\n"))
-        self.failUnless("\r\nUID:uid-1\r\n" in text)
-        self.failUnless(text.endswith("\r\nEND:VCALENDAR\r\n"))
 
-    def test_uid(self):
+    def test_calendarObjectsWithDotFile(self):
         """
-        UID is correct.
+        Adding a dotfile to the calendar home should not increase
         """
-        self.assertEquals(self.object1.uid(), "uid1")
+        self.homeUnderTest()._path.child(".foo").createDirectory()
+        self.test_calendarObjects()
 
-    def test_componentType(self):
-        """
-        Component type is correct.
-        """
-        self.assertEquals(self.object1.componentType(), "VEVENT")
-
-    def test_organizer(self):
-        """
-        Organizer is correct.
-        """
-        self.assertEquals(
-            self.object1.organizer(),
-            "mailto:wsanchez at apple.com"
-        )

Copied: CalendarServer/trunk/txcaldav/calendarstore/test/test_scheduling.py (from rev 5919, CalendarServer/branches/new-store/txcaldav/calendarstore/test/test_scheduling.py)
===================================================================
--- CalendarServer/trunk/txcaldav/calendarstore/test/test_scheduling.py	                        (rev 0)
+++ CalendarServer/trunk/txcaldav/calendarstore/test/test_scheduling.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,48 @@
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+Tests for L{txcaldav.calendarstore.scheduling}.
+"""
+
+from twisted.trial.unittest import TestCase
+from txcaldav.calendarstore.test.common import CommonTests
+from txcaldav.calendarstore.test.test_file import setUpCalendarStore
+from txcaldav.calendarstore.scheduling import ImplicitStore
+
+simpleEvent = """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DTEND:20080601T130000Z
+ORGANIZER:mailto:user1 at example.com
+ATTENDEE:mailto:user1 at example.com
+ATTENDEE:mailto:user2 at example.com
+END:VEVENT
+END:VCALENDAR
+"""
+
+class ImplicitStoreTests(CommonTests, TestCase):
+    """
+    Tests for L{ImplicitSchedulingStore}.
+    """
+
+    def storeUnderTest(self):
+        setUpCalendarStore(self)
+        self.implicitStore = ImplicitStore(self.calendarStore)
+        return self.implicitStore

Modified: CalendarServer/trunk/txcaldav/icalendarstore.py
===================================================================
--- CalendarServer/trunk/txcaldav/icalendarstore.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcaldav/icalendarstore.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,3 +1,4 @@
+# -*- test-case-name: txcaldav.calendarstore -*-
 ##
 # Copyright (c) 2010 Apple Inc. All rights reserved.
 #
@@ -13,152 +14,62 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
+from txdav.common.icommondatastore import ICommonTransaction
 
 """
 Calendar store interfaces
 """
 
-# FIXME:  Still to do:
-# - Where to defer?
-# - commit() and abort()
+from zope.interface import Interface
 
+
 __all__ = [
-    # Exceptions
-    "CalendarStoreError",
-    "NameNotAllowedError",
-    "CalendarNameNotAllowedError",
-    "CalendarObjectNameNotAllowedError",
-    "AlreadyExistsError",
-    "CalendarAlreadyExistsError",
-    "CalendarObjectNameAlreadyExistsError",
-    "CalendarObjectUIDAlreadyExistsError",
-    "NotFoundError",
-    "NoSuchCalendarError",
-    "NoSuchCalendarObjectError",
-    "InvalidCalendarComponentError",
-    "InternalDataStoreError",
-
     # Classes
-    "ICalendarStore",
+    "ICalendarTransaction",
     "ICalendarHome",
     "ICalendar",
     "ICalendarObject",
 ]
 
-from zope.interface import Interface #, Attribute
 
-from datetime import datetime, date, tzinfo
-from twext.python.vcomponent import VComponent
-from txdav.idav import IPropertyStore
+# The following imports are used by the L{} links below, but shouldn't actually
+# be imported.as they're not really needed.
 
+# from datetime import datetime, date, tzinfo
 
-#
-# Exceptions
-#
+# from twext.python.vcomponent import VComponent
 
-class CalendarStoreError(RuntimeError):
-    """
-    Calendar store generic error.
-    """
+# from txdav.idav import IPropertyStore
+# from txdav.idav import ITransaction
 
-class NameNotAllowedError(CalendarStoreError):
+class ICalendarTransaction(ICommonTransaction):
     """
-    Attempt to create an object with a name that is not allowed.
+    Transaction functionality required to be implemented by calendar stores.
     """
 
-class CalendarNameNotAllowedError(NameNotAllowedError):
-    """
-    Calendar name not allowed.
-    """
-
-class CalendarObjectNameNotAllowedError(NameNotAllowedError):
-    """
-    Calendar object name not allowed.
-    """
-
-class AlreadyExistsError(CalendarStoreError):
-    """
-    Attempt to create an object that already exists.
-    """
-
-class CalendarAlreadyExistsError(AlreadyExistsError):
-    """
-    Calendar already exists.
-    """
-
-class CalendarObjectNameAlreadyExistsError(AlreadyExistsError):
-    """
-    A calendar object with the requested name already exists.
-    """
-
-class CalendarObjectUIDAlreadyExistsError(AlreadyExistsError):
-    """
-    A calendar object with the requested UID already exists.
-    """
-
-class NotFoundError(CalendarStoreError):
-    """
-    Requested data not found.
-    """
-
-class NoSuchCalendarError(NotFoundError):
-    """
-    The requested calendar does not exist.
-    """
-
-class NoSuchCalendarObjectError(NotFoundError):
-    """
-    The requested calendar object does not exist.
-    """
-
-class InvalidCalendarComponentError(CalendarStoreError):
-    """
-    Invalid calendar component.
-    """
-
-class InternalDataStoreError(CalendarStoreError):
-    """
-    Uh, oh.
-    """
-
-
-#
-# Interfaces
-#
-
-class ICalendarStore(Interface):
-    """
-    Calendar store
-    """
     def calendarHomeWithUID(uid, create=False):
         """
-        Retrieve the calendar home for the principal with the given
-        C{uid}.
+        Retrieve the calendar home for the principal with the given C{uid}.
 
-        If C{create} is true, create the calendar home if it doesn't
+        If C{create} is C{True}, create the calendar home if it doesn't
         already exist.
 
         @return: an L{ICalendarHome} or C{None} if no such calendar
-        home exists.
+            home exists.
         """
 
 
+#
+# Interfaces
+#
+
 class ICalendarHome(Interface):
     """
-    Calendar home
-
-    A calendar home belongs to a specific principal and contains the
-    calendars which that principal has direct access to.  This
-    includes both calendars owned by the principal as well as
-    calendars that have been shared with and accepts by the principal.
+    An L{ICalendarHome} is a collection of calendars which belongs to a
+    specific principal and contains the calendars which that principal has
+    direct access to.  This includes both calendars owned by the principal as
+    well as calendars that have been shared with and accepts by the principal.
     """
-    # FIXME: We need a principal interface somewhere, possibly part of
-    # an idirectory rework.  IDirectoryRecord may be close...
-    #def owner():
-    #    """
-    #    Retrieve the owner principal for this calendar home.
-    #    @return: a ???
-    #    """
 
     def uid():
         """
@@ -184,6 +95,23 @@
             exists.
         """
 
+
+    def calendarObjectWithDropboxID(dropboxID):
+        """
+        Retrieve an L{ICalendarObject} by looking up its attachment collection
+        ID.
+
+        @param dropboxID: The name of the collection in a dropbox corresponding
+            to a collection in the user's dropbox.
+
+        @type dropboxID: C{str}
+
+        @return: the calendar object identified by the given dropbox.
+
+        @rtype: L{ICalendarObject}
+        """
+
+
     def createCalendarWithName(name):
         """
         Create a calendar with the given C{name} in this calendar
@@ -221,6 +149,21 @@
     shared with other principals, granting them read-only or
     read/write access.
     """
+
+    def name():
+        """
+        Identify this calendar uniquely, as with
+        L{ICalendarHome.calendarWithName}.
+
+        @return: the name of this calendar.
+        @rtype: C{str}
+        """
+
+    def rename(name):
+        """
+        Change the name of this calendar.
+        """
+
     def ownerCalendarHome():
         """
         Retrieve the calendar home for the owner of this calendar.
@@ -336,9 +279,10 @@
     """
     Calendar object
 
-    A calendar object decribes an event, to-do, or other iCalendar
+    A calendar object describes an event, to-do, or other iCalendar
     object.
     """
+
     def setComponent(component):
         """
         Rewrite this calendar object to match the given C{component}.
@@ -396,3 +340,125 @@
 
         @return: an L{IPropertyStore}.
         """
+
+
+    def dropboxID():
+        """
+        An identifier, unique to the calendar home, that specifies a location
+        where attachments are to be stored for this object.
+
+        @return: the value of the last segment of the C{X-APPLE-DROPBOX}
+            property.
+
+        @rtype: C{string}
+        """
+
+
+    def createAttachmentWithName(name, contentType):
+        """
+        Add an attachment to this calendar object.
+
+        @param name: An identifier, unique to this L{ICalendarObject}, which
+            names the attachment for future retrieval.
+
+        @type name: C{str}
+
+        @param contentType: a slash-separated content type.
+
+        @type contentType: C{str}
+
+        @return: the same type as L{IAttachment.store} returns.
+        """
+
+
+    def attachmentWithName(name):
+        """
+        Retrieve an attachment from this calendar object.
+
+        @param name: An identifier, unique to this L{ICalendarObject}, which
+            names the attachment for future retrieval.
+
+        @type name: C{str}
+        """
+        # FIXME: MIME-type?
+
+
+    def attachments():
+        """
+        List all attachments on this calendar object.
+
+        @return: an iterable of L{IAttachment}s
+        """
+
+
+    def removeAttachmentWithName(name):
+        """
+        Delete an attachment with the given name.
+
+        @param name: The basename of the attachment (i.e. the last segment of
+            its URI) as given to L{attachmentWithName}.
+        @type name: C{str}
+        """
+
+
+
+class IAttachment(Interface):
+    """
+    Information associated with an attachment to a calendar object.
+    """
+
+    def name():
+        """
+        A short name, unique to this attachment's L{ICalendarObject}.
+
+        @rtype: C{str}
+        """
+
+
+    def contentType():
+        """
+        A slash-separated content type of the body of this attachment.
+
+        @rtype: C{str}
+        """
+
+
+    def md5():
+        """
+        The MD5 hex digest of this attachment's contents.
+
+        @rtype: C{str}
+        """
+
+
+    def store(contentType):
+        """
+        @param contentType: The content type of the data which will be stored.
+        @type contentType: C{str}
+
+        @return: An L{ITransport}/L{IConsumer} provider that will store the
+            bytes passed to its 'write' method.
+
+            The caller of C{store} must call C{loseConnection} on its result to
+            indicate that the attachment upload was successfully completed.  If
+            the transaction associated with this upload is committed or aborted
+            before C{loseConnection} is called, the upload will be presumed to
+            have failed, and no attachment data will be stored.
+        """
+        # If you do a big write()/loseConnection(), how do you tell when the
+        # data has actually been written?  you don't: commit() ought to return
+        # a deferred anyway, and any un-flushed attachment data needs to be
+        # dealt with by that too.
+
+
+    def retrieve(protocol):
+        """
+        Retrieve the content of this attachment into a protocol instance.
+
+        @param protocol: A protocol which will receive the contents of the
+            attachment to its C{dataReceived} method, and then a notification
+            that the stream is complete to its C{connectionLost} method.
+        @type protocol: L{IProtocol}
+        """
+
+

Modified: CalendarServer/trunk/txcaldav/resource.py
===================================================================
--- CalendarServer/trunk/txcaldav/resource.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcaldav/resource.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -31,11 +31,14 @@
 import urllib
 
 from twext.python.log import LoggingMixIn
+from twext.web2.dav.element.base import dav_namespace
 from twext.web2.http_headers import MimeType
 from twext.web2.http import RedirectResponse, Response
 from twext.web2.stream import MemoryStream
 
-from twistedcaldav import config
+from twistedcaldav import caldavxml
+from twistedcaldav.caldavxml import caldav_namespace
+from twistedcaldav.config import config
 from twistedcaldav.extensions import DAVResource
 
 

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/__init__.py
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/__init__.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/__init__.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,19 +0,0 @@
-##
-# Copyright (c) 2010 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-"""
-Addressbook stores.
-"""

Copied: CalendarServer/trunk/txcarddav/addressbookstore/__init__.py (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/__init__.py)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/__init__.py	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/__init__.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,19 @@
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+Addressbook stores.
+"""

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/file.py
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/file.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/file.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,311 +0,0 @@
-# -*- test-case-name: txcarddav.addressbookstore.test.test_file -*-
-##
-# Copyright (c) 2010 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-"""
-File addressbook store.
-"""
-
-__all__ = [
-    "AddressBookStore",
-    "AddressBookStoreTransaction",
-    "AddressBookHome",
-    "AddressBook",
-    "AddressBookObject",
-]
-
-from errno import ENOENT
-
-from twext.web2.dav.element.rfc2518 import ResourceType
-
-from twistedcaldav.sharing import InvitesDatabase
-from twistedcaldav.vcard import Component as VComponent, InvalidVCardDataError
-from twistedcaldav.vcardindex import AddressBookIndex as OldIndex
-
-from txcarddav.iaddressbookstore import IAddressBook, IAddressBookObject
-from txcarddav.iaddressbookstore import IAddressBookHome
-
-from txdav.common.datastore.file import CommonDataStore, CommonHome,\
-    CommonStoreTransaction, CommonHomeChild, CommonObjectResource,\
-    CommonStubResource
-from txdav.common.icommondatastore import InvalidObjectResourceError,\
-    NoSuchObjectResourceError, InternalDataStoreError
-from txdav.datastore.file import hidden, writeOperation
-from txdav.propertystore.base import PropertyName
-
-from twistedcaldav import customxml, carddavxml
-
-from zope.interface import implements
-
-AddressBookStore = CommonDataStore
-
-AddressBookStoreTransaction = CommonStoreTransaction
-
-class AddressBookHome(CommonHome):
-
-    implements(IAddressBookHome)
-
-    def __init__(self, uid, path, addressbookStore, transaction):
-        super(AddressBookHome, self).__init__(uid, path, addressbookStore, transaction)
-
-        self._childClass = AddressBook
-
-    addressbooks = CommonHome.children
-    addressbookWithName = CommonHome.childWithName
-    createAddressBookWithName = CommonHome.createChildWithName
-    removeAddressBookWithName = CommonHome.removeChildWithName
-
-    @property
-    def _addressbookStore(self):
-        return self._dataStore
-
-    def created(self):
-        self.createAddressBookWithName("addressbook")
-
-class AddressBook(CommonHomeChild):
-    """
-    File-based implementation of L{IAddressBook}.
-    """
-    implements(IAddressBook)
-
-    def __init__(self, name, addressbookHome, realName=None):
-        """
-        Initialize an addressbook pointing at a path on disk.
-
-        @param name: the subdirectory of addressbookHome where this addressbook
-            resides.
-        @type name: C{str}
-
-        @param addressbookHome: the home containing this addressbook.
-        @type addressbookHome: L{AddressBookHome}
-
-        @param realName: If this addressbook was just created, the name which it
-        will eventually have on disk.
-        @type realName: C{str}
-        """
-        
-        super(AddressBook, self).__init__(name, addressbookHome, realName)
-
-        self._index = Index(self)
-        self._invites = Invites(self)
-        self._objectResourceClass = AddressBookObject
-
-    @property
-    def _addressbookHome(self):
-        return self._home
-
-    def resourceType(self):
-        return ResourceType.addressbook
-
-    ownerAddressBookHome = CommonHomeChild.ownerHome
-    addressbookObjects = CommonHomeChild.objectResources
-    addressbookObjectWithName = CommonHomeChild.objectResourceWithName
-    addressbookObjectWithUID = CommonHomeChild.objectResourceWithUID
-    createAddressBookObjectWithName = CommonHomeChild.createObjectResourceWithName
-    removeAddressBookObjectWithName = CommonHomeChild.removeObjectResourceWithName
-    removeAddressBookObjectWithUID = CommonHomeChild.removeObjectResourceWithUID
-    addressbookObjectsSinceToken = CommonHomeChild.objectResourcesSinceToken
-
-
-    def initPropertyStore(self, props):
-        # Setup peruser special properties
-        props.setSpecialProperties(
-            (
-                PropertyName.fromElement(carddavxml.AddressBookDescription),
-            ),
-            (
-                PropertyName.fromElement(customxml.GETCTag),
-            ),
-        )
-
-    def _doValidate(self, component):
-        component.validForCardDAV()
-
-
-class AddressBookObject(CommonObjectResource):
-    """
-    """
-    implements(IAddressBookObject)
-
-    def __init__(self, name, addressbook):
-
-        super(AddressBookObject, self).__init__(name, addressbook)
-
-
-    @property
-    def _addressbook(self):
-        return self._parentCollection
-
-    @writeOperation
-    def setComponent(self, component):
-        if not isinstance(component, VComponent):
-            raise TypeError(type(component))
-
-        try:
-            if component.resourceUID() != self.uid():
-                raise InvalidObjectResourceError(
-                    "UID may not change (%s != %s)" % (
-                        component.resourceUID(), self.uid()
-                     )
-                )
-        except NoSuchObjectResourceError:
-            pass
-
-        try:
-            self._addressbook._doValidate(component)
-        except InvalidVCardDataError, e:
-            raise InvalidObjectResourceError(e)
-
-        newRevision = self._addressbook._updateSyncToken() # FIXME: test
-        self._addressbook.retrieveOldIndex().addResource(
-            self.name(), component, newRevision
-        )
-
-        self._component = component
-        # FIXME: needs to clear text cache
-
-        def do():
-            # Mark all properties as dirty, so they can be added back
-            # to the newly updated file.
-            self.properties().update(self.properties())
-
-            backup = None
-            if self._path.exists():
-                backup = hidden(self._path.temporarySibling())
-                self._path.moveTo(backup)
-            fh = self._path.open("w")
-            try:
-                # FIXME: concurrency problem; if this write is interrupted
-                # halfway through, the underlying file will be corrupt.
-                fh.write(str(component))
-            finally:
-                fh.close()
-
-            # Now re-write the original properties on the updated file
-            self.properties().flush()
-
-            def undo():
-                if backup:
-                    backup.moveTo(self._path)
-                else:
-                    self._path.remove()
-            return undo
-        self._transaction.addOperation(do, "set addressbook component %r" % (self.name(),))
-
-
-    def component(self):
-        if self._component is not None:
-            return self._component
-        text = self.vCardText()
-
-        try:
-            component = VComponent.fromString(text)
-        except InvalidVCardDataError, e:
-            raise InternalDataStoreError(
-                "File corruption detected (%s) in file: %s"
-                % (e, self._path.path)
-            )
-        return component
-
-
-    def vCardText(self):
-        if self._component is not None:
-            return str(self._component)
-        try:
-            fh = self._path.open()
-        except IOError, e:
-            if e[0] == ENOENT:
-                raise NoSuchObjectResourceError(self)
-            else:
-                raise
-
-        try:
-            text = fh.read()
-        finally:
-            fh.close()
-
-        if not (
-            text.startswith("BEGIN:VCARD\r\n") or
-            text.endswith("\r\nEND:VCARD\r\n")
-        ):
-            raise InternalDataStoreError(
-                "File corruption detected (improper start) in file: %s"
-                % (self._path.path,)
-            )
-        return text
-
-
-    def uid(self):
-        if not hasattr(self, "_uid"):
-            self._uid = self.component().resourceUID()
-        return self._uid
-
-
-class AddressBookStubResource(CommonStubResource):
-    """
-    Just enough resource to keep the addressbook's sql DB classes going.
-    """
-
-    def isAddressBookCollection(self):
-        return True
-
-    def getChild(self, name):
-        addressbookObject = self.resource.addressbookObjectWithName(name)
-        if addressbookObject:
-            class ChildResource(object):
-                def __init__(self, addressbookObject):
-                    self.addressbookObject = addressbookObject
-
-                def iAddressBook(self):
-                    return self.addressbookObject.component()
-
-            return ChildResource(addressbookObject)
-        else:
-            return None
-
-
-class Index(object):
-    #
-    # OK, here's where we get ugly.
-    # The index code needs to be rewritten also, but in the meantime...
-    #
-    def __init__(self, addressbook):
-        self.addressbook = addressbook
-        stubResource = AddressBookStubResource(addressbook)
-        self._oldIndex = OldIndex(stubResource)
-
-
-    def addressbookObjects(self):
-        addressbook = self.addressbook
-        for name, uid, componentType in self._oldIndex.bruteForceSearch():
-            addressbookObject = addressbook.addressbookObjectWithName(name)
-
-            # Precache what we found in the index
-            addressbookObject._uid = uid
-            addressbookObject._componentType = componentType
-
-            yield addressbookObject
-
-
-class Invites(object):
-    #
-    # OK, here's where we get ugly.
-    # The index code needs to be rewritten also, but in the meantime...
-    #
-    def __init__(self, addressbook):
-        self.addressbook = addressbook
-        stubResource = AddressBookStubResource(addressbook)
-        self._oldInvites = InvitesDatabase(stubResource)

Copied: CalendarServer/trunk/txcarddav/addressbookstore/file.py (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/file.py)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/file.py	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/file.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,311 @@
+# -*- test-case-name: txcarddav.addressbookstore.test.test_file -*-
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+File addressbook store.
+"""
+
+__all__ = [
+    "AddressBookStore",
+    "AddressBookStoreTransaction",
+    "AddressBookHome",
+    "AddressBook",
+    "AddressBookObject",
+]
+
+from errno import ENOENT
+
+from twext.web2.dav.element.rfc2518 import ResourceType
+
+from twistedcaldav.sharing import InvitesDatabase
+from twistedcaldav.vcard import Component as VComponent, InvalidVCardDataError
+from twistedcaldav.vcardindex import AddressBookIndex as OldIndex
+
+from txcarddav.iaddressbookstore import IAddressBook, IAddressBookObject
+from txcarddav.iaddressbookstore import IAddressBookHome
+
+from txdav.common.datastore.file import CommonDataStore, CommonHome,\
+    CommonStoreTransaction, CommonHomeChild, CommonObjectResource,\
+    CommonStubResource
+from txdav.common.icommondatastore import InvalidObjectResourceError,\
+    NoSuchObjectResourceError, InternalDataStoreError
+from txdav.datastore.file import hidden, writeOperation
+from txdav.propertystore.base import PropertyName
+
+from twistedcaldav import customxml, carddavxml
+
+from zope.interface import implements
+
+AddressBookStore = CommonDataStore
+
+AddressBookStoreTransaction = CommonStoreTransaction
+
+class AddressBookHome(CommonHome):
+
+    implements(IAddressBookHome)
+
+    def __init__(self, uid, path, addressbookStore, transaction):
+        super(AddressBookHome, self).__init__(uid, path, addressbookStore, transaction)
+
+        self._childClass = AddressBook
+
+    addressbooks = CommonHome.children
+    addressbookWithName = CommonHome.childWithName
+    createAddressBookWithName = CommonHome.createChildWithName
+    removeAddressBookWithName = CommonHome.removeChildWithName
+
+    @property
+    def _addressbookStore(self):
+        return self._dataStore
+
+    def created(self):
+        self.createAddressBookWithName("addressbook")
+
+class AddressBook(CommonHomeChild):
+    """
+    File-based implementation of L{IAddressBook}.
+    """
+    implements(IAddressBook)
+
+    def __init__(self, name, addressbookHome, realName=None):
+        """
+        Initialize an addressbook pointing at a path on disk.
+
+        @param name: the subdirectory of addressbookHome where this addressbook
+            resides.
+        @type name: C{str}
+
+        @param addressbookHome: the home containing this addressbook.
+        @type addressbookHome: L{AddressBookHome}
+
+        @param realName: If this addressbook was just created, the name which it
+        will eventually have on disk.
+        @type realName: C{str}
+        """
+        
+        super(AddressBook, self).__init__(name, addressbookHome, realName)
+
+        self._index = Index(self)
+        self._invites = Invites(self)
+        self._objectResourceClass = AddressBookObject
+
+    @property
+    def _addressbookHome(self):
+        return self._home
+
+    def resourceType(self):
+        return ResourceType.addressbook
+
+    ownerAddressBookHome = CommonHomeChild.ownerHome
+    addressbookObjects = CommonHomeChild.objectResources
+    addressbookObjectWithName = CommonHomeChild.objectResourceWithName
+    addressbookObjectWithUID = CommonHomeChild.objectResourceWithUID
+    createAddressBookObjectWithName = CommonHomeChild.createObjectResourceWithName
+    removeAddressBookObjectWithName = CommonHomeChild.removeObjectResourceWithName
+    removeAddressBookObjectWithUID = CommonHomeChild.removeObjectResourceWithUID
+    addressbookObjectsSinceToken = CommonHomeChild.objectResourcesSinceToken
+
+
+    def initPropertyStore(self, props):
+        # Setup peruser special properties
+        props.setSpecialProperties(
+            (
+                PropertyName.fromElement(carddavxml.AddressBookDescription),
+            ),
+            (
+                PropertyName.fromElement(customxml.GETCTag),
+            ),
+        )
+
+    def _doValidate(self, component):
+        component.validForCardDAV()
+
+
+class AddressBookObject(CommonObjectResource):
+    """
+    """
+    implements(IAddressBookObject)
+
+    def __init__(self, name, addressbook):
+
+        super(AddressBookObject, self).__init__(name, addressbook)
+
+
+    @property
+    def _addressbook(self):
+        return self._parentCollection
+
+    @writeOperation
+    def setComponent(self, component):
+        if not isinstance(component, VComponent):
+            raise TypeError(type(component))
+
+        try:
+            if component.resourceUID() != self.uid():
+                raise InvalidObjectResourceError(
+                    "UID may not change (%s != %s)" % (
+                        component.resourceUID(), self.uid()
+                     )
+                )
+        except NoSuchObjectResourceError:
+            pass
+
+        try:
+            self._addressbook._doValidate(component)
+        except InvalidVCardDataError, e:
+            raise InvalidObjectResourceError(e)
+
+        newRevision = self._addressbook._updateSyncToken() # FIXME: test
+        self._addressbook.retrieveOldIndex().addResource(
+            self.name(), component, newRevision
+        )
+
+        self._component = component
+        # FIXME: needs to clear text cache
+
+        def do():
+            # Mark all properties as dirty, so they can be added back
+            # to the newly updated file.
+            self.properties().update(self.properties())
+
+            backup = None
+            if self._path.exists():
+                backup = hidden(self._path.temporarySibling())
+                self._path.moveTo(backup)
+            fh = self._path.open("w")
+            try:
+                # FIXME: concurrency problem; if this write is interrupted
+                # halfway through, the underlying file will be corrupt.
+                fh.write(str(component))
+            finally:
+                fh.close()
+
+            # Now re-write the original properties on the updated file
+            self.properties().flush()
+
+            def undo():
+                if backup:
+                    backup.moveTo(self._path)
+                else:
+                    self._path.remove()
+            return undo
+        self._transaction.addOperation(do, "set addressbook component %r" % (self.name(),))
+
+
+    def component(self):
+        if self._component is not None:
+            return self._component
+        text = self.vCardText()
+
+        try:
+            component = VComponent.fromString(text)
+        except InvalidVCardDataError, e:
+            raise InternalDataStoreError(
+                "File corruption detected (%s) in file: %s"
+                % (e, self._path.path)
+            )
+        return component
+
+
+    def vCardText(self):
+        if self._component is not None:
+            return str(self._component)
+        try:
+            fh = self._path.open()
+        except IOError, e:
+            if e[0] == ENOENT:
+                raise NoSuchObjectResourceError(self)
+            else:
+                raise
+
+        try:
+            text = fh.read()
+        finally:
+            fh.close()
+
+        if not (
+            text.startswith("BEGIN:VCARD\r\n") or
+            text.endswith("\r\nEND:VCARD\r\n")
+        ):
+            raise InternalDataStoreError(
+                "File corruption detected (improper start) in file: %s"
+                % (self._path.path,)
+            )
+        return text
+
+
+    def uid(self):
+        if not hasattr(self, "_uid"):
+            self._uid = self.component().resourceUID()
+        return self._uid
+
+
+class AddressBookStubResource(CommonStubResource):
+    """
+    Just enough resource to keep the addressbook's sql DB classes going.
+    """
+
+    def isAddressBookCollection(self):
+        return True
+
+    def getChild(self, name):
+        addressbookObject = self.resource.addressbookObjectWithName(name)
+        if addressbookObject:
+            class ChildResource(object):
+                def __init__(self, addressbookObject):
+                    self.addressbookObject = addressbookObject
+
+                def iAddressBook(self):
+                    return self.addressbookObject.component()
+
+            return ChildResource(addressbookObject)
+        else:
+            return None
+
+
+class Index(object):
+    #
+    # OK, here's where we get ugly.
+    # The index code needs to be rewritten also, but in the meantime...
+    #
+    def __init__(self, addressbook):
+        self.addressbook = addressbook
+        stubResource = AddressBookStubResource(addressbook)
+        self._oldIndex = OldIndex(stubResource)
+
+
+    def addressbookObjects(self):
+        addressbook = self.addressbook
+        for name, uid, componentType in self._oldIndex.bruteForceSearch():
+            addressbookObject = addressbook.addressbookObjectWithName(name)
+
+            # Precache what we found in the index
+            addressbookObject._uid = uid
+            addressbookObject._componentType = componentType
+
+            yield addressbookObject
+
+
+class Invites(object):
+    #
+    # OK, here's where we get ugly.
+    # The index code needs to be rewritten also, but in the meantime...
+    #
+    def __init__(self, addressbook):
+        self.addressbook = addressbook
+        stubResource = AddressBookStubResource(addressbook)
+        self._oldInvites = InvitesDatabase(stubResource)

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/__init__.py
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/__init__.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/__init__.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,20 +0,0 @@
-# -*- test-case-name: txcarddav.addressbookstore.test -*-
-##
-# Copyright (c) 2010 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-"""
-AddressBook store tests.
-"""

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/__init__.py (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/__init__.py)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/__init__.py	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/__init__.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,20 @@
+# -*- test-case-name: txcarddav.addressbookstore.test -*-
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+AddressBook store tests.
+"""

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/1.vcf
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/1.vcf	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/1.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,12 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:Thompson;Default;;;
-FN:Default Thompson
-EMAIL;type=INTERNET;type=WORK;type=pref:lthompson at example.com
-TEL;type=WORK;type=pref:1-555-555-5555
-TEL;type=CELL:1-444-444-4444
-item1.ADR;type=WORK;type=pref:;;1245 Test;Sesame Street;California;11111;USA
-item1.X-ABADR:us
-UID:uid1
-NOTE:CardDAV protocol updates
-END:VCARD

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/1.vcf (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/1.vcf)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/1.vcf	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/1.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,12 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Thompson;Default;;;
+FN:Default Thompson
+EMAIL;type=INTERNET;type=WORK;type=pref:lthompson at example.com
+TEL;type=WORK;type=pref:1-555-555-5555
+TEL;type=CELL:1-444-444-4444
+item1.ADR;type=WORK;type=pref:;;1245 Test;Sesame Street;California;11111;USA
+item1.X-ABADR:us
+UID:uid1
+NOTE:CardDAV protocol updates
+END:VCARD

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/2.vcf
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/2.vcf	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/2.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,17 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:Contact;Mulberry;;;
-FN:Mulberry Contact
-NICKNAME:mulberry
-ORG:Apple Inc.;
-EMAIL;type=INTERNET;type=WORK;type=pref:mulberry at example.com
-TEL;type=HOME;type=pref:777-777-7777
-TEL;type=WORK:8888888888
-TEL;type=WORK;type=FAX:5555555555
-item1.ADR;type=WORK;type=pref:;;1234 Infinite Circle;Exampletino\, CA 99999;USA;;
-item1.X-ABADR:us
-NOTE:This is a contact created in Mulberry.
-item2.URL;type=pref:http://www.example.com/~magic
-item2.X-ABLabel:_$!<HomePage>!$_
-UID:uid2
-END:VCARD

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/2.vcf (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/2.vcf)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/2.vcf	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/2.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,17 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Contact;Mulberry;;;
+FN:Mulberry Contact
+NICKNAME:mulberry
+ORG:Apple Inc.;
+EMAIL;type=INTERNET;type=WORK;type=pref:mulberry at example.com
+TEL;type=HOME;type=pref:777-777-7777
+TEL;type=WORK:8888888888
+TEL;type=WORK;type=FAX:5555555555
+item1.ADR;type=WORK;type=pref:;;1234 Infinite Circle;Exampletino\, CA 99999;USA;;
+item1.X-ABADR:us
+NOTE:This is a contact created in Mulberry.
+item2.URL;type=pref:http://www.example.com/~magic
+item2.X-ABLabel:_$!<HomePage>!$_
+UID:uid2
+END:VCARD

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/3.vcf
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/3.vcf	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/3.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,12 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:Kawado;Saeko;;;
-FN:Snow Leopard
-ORG:Snow Leopard;
-EMAIL;type=INTERNET;type=WORK;type=pref:snowleopard at example.com
-TEL;type=WORK;type=pref:777-777-7777
-item1.ADR;type=WORK;type=pref:;;1 Fidel Ave. Suite 100;Mountain Top;CA;99999;USA
-item1.X-ABADR:us
-X-ABShowAs:COMPANY
-UID:uid3
-END:VCARD

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/3.vcf (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/3.vcf)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/3.vcf	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_1/3.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,12 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Kawado;Saeko;;;
+FN:Snow Leopard
+ORG:Snow Leopard;
+EMAIL;type=INTERNET;type=WORK;type=pref:snowleopard at example.com
+TEL;type=WORK;type=pref:777-777-7777
+item1.ADR;type=WORK;type=pref:;;1 Fidel Ave. Suite 100;Mountain Top;CA;99999;USA
+item1.X-ABADR:us
+X-ABShowAs:COMPANY
+UID:uid3
+END:VCARD

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/3765A955-1B96-41EA-994D-335192BEDCCD.vcf
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/3765A955-1B96-41EA-994D-335192BEDCCD.vcf	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/3765A955-1B96-41EA-994D-335192BEDCCD.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,18 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:InfoIn;All;;;
-FN:All InfoIn
-ORG:allinfo Company;
-EMAIL;type=INTERNET;type=WORK;type=pref:allinfomationin at example.com
-TEL;type=WORK;type=pref:777-777-7777
-TEL;type=CELL:8888888888
-item1.ADR;type=WORK;type=pref:;;1 Gally Street Apt #2;Mountain Top;CA;99999;USA
-item1.X-ABADR:us
-X-YAHOO;type=WORK;type=pref:saeko.where at example.com
-X-YAHOO-ID;type=WORK;type=pref:saeko.where at example.com
-item2.X-ABRELATEDNAMES;type=pref:Mayumi Yan
-item2.X-ABLabel:_$!<Friend>!$_
-item3.X-ABRELATEDNAMES:Shane
-item3.X-ABLabel:_$!<Assistant>!$_
-UID:3765A955-1B96-41EA-994D-335192BEDCCD
-END:VCARD

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/3765A955-1B96-41EA-994D-335192BEDCCD.vcf (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/3765A955-1B96-41EA-994D-335192BEDCCD.vcf)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/3765A955-1B96-41EA-994D-335192BEDCCD.vcf	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/3765A955-1B96-41EA-994D-335192BEDCCD.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,18 @@
+BEGIN:VCARD
+VERSION:3.0
+N:InfoIn;All;;;
+FN:All InfoIn
+ORG:allinfo Company;
+EMAIL;type=INTERNET;type=WORK;type=pref:allinfomationin at example.com
+TEL;type=WORK;type=pref:777-777-7777
+TEL;type=CELL:8888888888
+item1.ADR;type=WORK;type=pref:;;1 Gally Street Apt #2;Mountain Top;CA;99999;USA
+item1.X-ABADR:us
+X-YAHOO;type=WORK;type=pref:saeko.where at example.com
+X-YAHOO-ID;type=WORK;type=pref:saeko.where at example.com
+item2.X-ABRELATEDNAMES;type=pref:Mayumi Yan
+item2.X-ABLabel:_$!<Friend>!$_
+item3.X-ABRELATEDNAMES:Shane
+item3.X-ABLabel:_$!<Assistant>!$_
+UID:3765A955-1B96-41EA-994D-335192BEDCCD
+END:VCARD

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44745975-AE6D-4FB0-80A6-A298427E047A.vcf
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44745975-AE6D-4FB0-80A6-A298427E047A.vcf	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44745975-AE6D-4FB0-80A6-A298427E047A.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,12 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:Mariotte;WithNote;;;
-FN:WithNote Mariotte
-EMAIL;type=INTERNET;type=WORK;type=pref:withnmariotte at example.com
-TEL;type=WORK;type=pref:1-777-777-7777
-TEL;type=CELL:1-8888888888
-item1.ADR;type=WORK;type=pref:;;1 North Blvd;Cupertino;CA;99999;United States
-item1.X-ABADR:us
-NOTE: Address book server test contact that hsa note field filled in.
-UID:44745975-AE6D-4FB0-80A6-A298427E047A
-END:VCARD

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44745975-AE6D-4FB0-80A6-A298427E047A.vcf (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44745975-AE6D-4FB0-80A6-A298427E047A.vcf)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44745975-AE6D-4FB0-80A6-A298427E047A.vcf	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44745975-AE6D-4FB0-80A6-A298427E047A.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,12 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Mariotte;WithNote;;;
+FN:WithNote Mariotte
+EMAIL;type=INTERNET;type=WORK;type=pref:withnmariotte at example.com
+TEL;type=WORK;type=pref:1-777-777-7777
+TEL;type=CELL:1-8888888888
+item1.ADR;type=WORK;type=pref:;;1 North Blvd;Cupertino;CA;99999;United States
+item1.X-ABADR:us
+NOTE: Address book server test contact that hsa note field filled in.
+UID:44745975-AE6D-4FB0-80A6-A298427E047A
+END:VCARD

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44EE78BF-8814-4471-899C-92280CEFB098.vcf
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44EE78BF-8814-4471-899C-92280CEFB098.vcf	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44EE78BF-8814-4471-899C-92280CEFB098.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,11 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:Śuterry;HiAscii;;;
-FN:HiAscii Śuterry
-EMAIL;type=INTERNET;type=WORK;type=pref:hiascii at example.com
-TEL;type=WORK;type=pref:777-777-7777
-TEL;type=CELL:8888888888
-item1.ADR;type=WORK;type=pref:;;1 ïlena;Paris;Paris;77777;France
-item1.X-ABADR:us
-UID:44EE78BF-8814-4471-899C-92280CEFB098
-END:VCARD

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44EE78BF-8814-4471-899C-92280CEFB098.vcf (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44EE78BF-8814-4471-899C-92280CEFB098.vcf)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44EE78BF-8814-4471-899C-92280CEFB098.vcf	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/44EE78BF-8814-4471-899C-92280CEFB098.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,11 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Śuterry;HiAscii;;;
+FN:HiAscii Śuterry
+EMAIL;type=INTERNET;type=WORK;type=pref:hiascii at example.com
+TEL;type=WORK;type=pref:777-777-7777
+TEL;type=CELL:8888888888
+item1.ADR;type=WORK;type=pref:;;1 ïlena;Paris;Paris;77777;France
+item1.X-ABADR:us
+UID:44EE78BF-8814-4471-899C-92280CEFB098
+END:VCARD

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/8424B7F0-C878-4722-B522-EBB07CF48AD7.vcf
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/8424B7F0-C878-4722-B522-EBB07CF48AD7.vcf	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/8424B7F0-C878-4722-B522-EBB07CF48AD7.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,12 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:バイト;ダブル;;;
-FN:ダブル バイト
-EMAIL;type=INTERNET;type=WORK;type=pref:doublebytes at example.com
-TEL;type=WORK;type=pref:777-777-7777
-TEL;type=CELL:8888888888
-item1.ADR;type=WORK;type=pref:;;1-23-4 Irohacho #2;Tokyo;Japan;33-3333;Japan
-item1.X-ABADR:us
-NOTE:日本ですよ。
-UID:8424B7F0-C878-4722-B522-EBB07CF48AD7
-END:VCARD

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/8424B7F0-C878-4722-B522-EBB07CF48AD7.vcf (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/8424B7F0-C878-4722-B522-EBB07CF48AD7.vcf)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/8424B7F0-C878-4722-B522-EBB07CF48AD7.vcf	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/8424B7F0-C878-4722-B522-EBB07CF48AD7.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,12 @@
+BEGIN:VCARD
+VERSION:3.0
+N:バイト;ダブル;;;
+FN:ダブル バイト
+EMAIL;type=INTERNET;type=WORK;type=pref:doublebytes at example.com
+TEL;type=WORK;type=pref:777-777-7777
+TEL;type=CELL:8888888888
+item1.ADR;type=WORK;type=pref:;;1-23-4 Irohacho #2;Tokyo;Japan;33-3333;Japan
+item1.X-ABADR:us
+NOTE:日本ですよ。
+UID:8424B7F0-C878-4722-B522-EBB07CF48AD7
+END:VCARD

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/934731C6-1C95-4C40-BE1F-FA4215B2307B.vcf
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/934731C6-1C95-4C40-BE1F-FA4215B2307B.vcf	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/934731C6-1C95-4C40-BE1F-FA4215B2307B.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,993 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:Picture;With;;;
-FN:With Picture
-EMAIL;type=INTERNET;type=WORK;type=pref:withpicture at example.com
-TEL;type=WORK;type=pref:777-777-7777
-TEL;type=CELL:8888888888
-item1.ADR;type=WORK;type=pref:;;1234 Golly Street;Sunnyside;CA;99999;USA
-item1.X-ABADR:us
-PHOTO;BASE64:
-  /9j/4AAQSkZJRgABAQAAAQABAAD/7QA8UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAB8cAVoAAx
-  sl RxwCAAACAAIcAhkAC1Bob3RvIEJvb3RoAP/iG6hJQ0NfUFJPRklMRQABAQAAG5hhcHBsAgA
-  AAG1u dHJSR0IgWFlaIAfaAAEAEwAJADEABGFjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-  AAAAAAD2 1gABAAAAANMtYXBwbFYcEOZVYuhIRg5LwLIi62wAAAAAAAAAAAAAAAAAAAAAAAAAA
-  AAAAAAAAAAA AAAAEXJYWVoAAAFQAAAAFGdYWVoAAAFkAAAAFGJYWVoAAAF4AAAAFHd0cHQAAA
-  GMAAAAFGNoYWQA AAGgAAAALHJUUkMAAAHMAAAIDGdUUkMAAAnYAAAIDGJUUkMAABHkAAAIDGF
-  hcmcAABnwAAAAIGFh Z2cAABoQAAAAIGFhYmcAABowAAAAIHZjZ3QAABpQAAAAMG5kaW4AABqA
-  AAAAOGRlc2MAABq4AAAA ZGRzY20AABscAAAALm1tb2QAABtMAAAAKGNwcnQAABt0AAAAJFhZW
-  iAAAAAAAAB7vQAAQXsAAAJL WFlaIAAAAAAAAFYqAACp0AAAFF9YWVogAAAAAAAAJO8AABS1AA
-  C8glhZWiAAAAAAAADz2AABAAAA ARYIc2YzMgAAAAAAAQu3AAAFlv//81cAAAcpAAD91///+7f
-  ///2mAAAD2gAAwPZjdXJ2AAAAAAAA BAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUA
-  SgBPAFQAWQBeAGMAaABtAHIAdwB8AIEA hgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0
-  ADVANoA4ADlAOoA8AD1APsBAQEHAQwBEgEY AR4BJQErATEBOAE+AUUBSwFSAVkBYAFmAW0BdQ
-  F8AYMBigGSAZkBoQGoAbABuAHAAcgB0AHYAeAB 6QHxAfoCAgILAhQCHAIlAi4CNwJAAkoCUwJ
-  cAmYCcAJ5AoMCjQKXAqECqwK1Ar8CygLUAt8C6gL0 Av8DCgMVAyADKwM3A0IDTQNZA2UDcAN8
-  A4gDlAOgA6wDuQPFA9ID3gPrA/gEBAQRBB4ELAQ5BEYE VARhBG8EfASKBJgEpgS0BMIE0QTfB
-  O4E/AULBRoFKAU3BUcFVgVlBXQFhAWTBaMFswXDBdMF4wXz BgMGFAYkBjUGRQZWBmcGeAaJBp
-  oGqwa9Bs4G4AbyBwMHFQcnBzkHTAdeB3AHgweWB6gHuwfOB+EH 9AgICBsILwhCCFYIagh+CJI
-  Ipgi6CM4I4wj3CQwJIQk2CUsJYAl1CYoJoAm1CcsJ4An2CgwKIgo5 Ck8KZQp8CpIKqQrACtcK
-  7gsFCx0LNAtLC2MLewuTC6sLwwvbC/MMDAwkDD0MVgxuDIcMoQy6DNMM 7Q0GDSANOg1UDW4Ni
-  A2iDbwN1w3xDgwOJw5CDl0OeA6TDq8Oyg7mDwIPHg86D1YPcg+OD6sPyA/k EAEQHhA7EFgQdh
-  CTELEQzhDsEQoRKBFGEWQRgxGhEcAR3xH+Eh0SPBJbEnoSmhK5EtkS+RMZEzkT WRN6E5oTuxP
-  bE/wUHRQ+FF8UgRSiFMQU5RUHFSkVSxVtFZAVshXVFfcWGhY9FmAWgxanFsoW7hcS FzUXWRd9
-  F6IXxhfqGA8YNBhZGH0YoxjIGO0ZExk4GV4ZhBmqGdAZ9hodGkMaahqQGrca3hsGGy0b VBt8G
-  6MbyxvzHBscQxxsHJQcvRzmHQ4dNx1gHYodsx3dHgYeMB5aHoQerh7YHwMfLR9YH4Mfrh/Z IA
-  QgMCBbIIcgsyDeIQohNyFjIY8hvCHpIhUiQiJwIp0iyiL4IyUjUyOBI68j3SQMJDokaSSXJMYk
-  9SUkJVQlgyWzJeImEiZCJnImoybTJwMnNCdlJ5Ynxyf4KCooWyiNKL4o8CkiKVUphym5KewqHy
-  pS KoUquCrrKx4rUiuGK7or7iwiLFYsiiy/LPQtKS1eLZMtyC39LjMuaS6eLtQvCy9BL3cvri/
-  kMBsw UjCJMMEw+DEwMWcxnzHXMg8ySDKAMrgy8TMqM2MznDPVNA80SDSCNLw09jUwNWo1pTXf
-  Nho2VTaQ Nss3BjdCN343uTf1ODE4bTiqOOY5IzlgOZ052joXOlQ6kjrPOw07SzuJO8c8BjxEP
-  IM8wj0BPUA9 fz2/Pf4+Pj5+Pr4+/j8/P38/wEAAQEFAgkDEQQVBR0GIQcpCDEJOQpFC00MWQ1
-  hDm0PeRCFEZUSo ROxFMEV0RbhF/EZARoVGykcOR1NHmUfeSCNIaUivSPVJO0mBScdKDkpVSpt
-  K4ksqS3FLuEwATEhM kEzYTSBNaE2xTfpOQk6MTtVPHk9nT7FP+1BFUI9Q2VEkUW5RuVIEUk9S
-  mlLlUzFTfFPIVBRUYFSt VPlVRlWSVd9WLFZ6VsdXFFdiV7BX/lhMWJpY6Vk4WYZZ1VokWnRaw
-  1sTW2NbslwDXFNco1z0XURd lV3mXjdeiV7aXyxffl/QYCJgdGDHYRlhbGG/YhJiZWK5YwxjYG
-  O0ZAhkXGSxZQVlWmWvZgRmWWav ZwRnWmewaAZoXGiyaQlpX2m2ag1qZGq8axNra2vDbBtsc2z
-  LbSNtfG3Vbi5uh27gbzpvk2/tcEdw oXD7cVZxsHILcmZywXMcc3hz03QvdIt053VDdaB1/HZZ
-  drZ3E3dwd854K3iJeOd5RXmjegJ6YHq/ ex57fXvcfDx8m3z7fVt9u34bfnx+3H89f55//4Bgg
-  MKBI4GFgeeCSYKrgw6DcIPThDaEmYT8hWCF w4YnhouG74dUh7iIHYiBiOaJTImxihaKfIrii0
-  iLrowUjHuM4o1Ija+OF45+juWPTY+1kB2QhZDu kVaRv5IokpGS+pNkk82UN5ShlQuVdZXglkq
-  WtZcgl4uX95himM6ZOpmmmhKafprrm1ebxJwxnJ+d DJ15neeeVZ7DnzGfoKAPoH2g7KFbocui
-  OqKqoxqjiqP6pGqk26VMpbymLqafpxCngqf0qGWo2KlK qbyqL6qiqxWriKv7rG+s461WrcuuP
-  66zryivnbARsIew/LFxseeyXbLTs0mzv7Q2tK21JLWbthK2 ibcBt3m38bhpuOG5WrnSuku6xL
-  s+u7e8MLyqvSS9nr4ZvpO/Dr+JwATAf8D6wXbB8cJtwunDZsPi xF/E3MVZxdbGU8bRx07HzMh
-  KyMnJR8nGykXKxMtDy8LMQszBzUHNwc5CzsLPQ8/D0ETQxtFH0cjS StLM007T0NRT1NbVWNXb
-  1l7W4tdl1+nYbdjx2XXZ+tp/2wPbiNwO3JPdGd2e3iTeqt8x37fgPuDF 4Uzh0+Ja4uLjauPy5
-  HrlAuWL5hPmnOcl56/oOOjC6Uzp1upg6urrdev/7IrtFu2h7izuuO9E79Dw XPDp8XXyAvKP8x
-  zzqvQ39MX1U/Xh9m/2/veM+Bv4qvk5+cn6Wfro+3j8CPyZ/Sn9uv5L/tz/bmN1 cnYAAAAAAAA
-  EAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0A cgB3AHwA
-  gQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2gDgAOUA6gDwAPUA+wEB AQcBD
-  AESARgBHgElASsBMQE4AT4BRQFLAVIBWQFgAWYBbQF1AXwBgwGKAZIBmQGhAagBsAG4AcAB yA
-  HQAdgB4AHpAfEB+gICAgsCFAIcAiUCLgI3AkACSgJTAlwCZgJwAnkCgwKNApcCoQKrArUCvwLK
-  AtQC3wLqAvQC/wMKAxUDIAMrAzcDQgNNA1kDZQNwA3wDiAOUA6ADrAO5A8UD0gPeA+sD+AQEBB
-  EE HgQsBDkERgRUBGEEbwR8BIoEmASmBLQEwgTRBN8E7gT8BQsFGgUoBTcFRwVWBWUFdAWEBZM
-  FowWz BcMF0wXjBfMGAwYUBiQGNQZFBlYGZwZ4BokGmgarBr0GzgbgBvIHAwcVBycHOQdMB14H
-  cAeDB5YH qAe7B84H4Qf0CAgIGwgvCEIIVghqCH4IkgimCLoIzgjjCPcJDAkhCTYJSwlgCXUJi
-  gmgCbUJywng CfYKDAoiCjkKTwplCnwKkgqpCsAK1wruCwULHQs0C0sLYwt7C5MLqwvDC9sL8w
-  wMDCQMPQxWDG4M hwyhDLoM0wztDQYNIA06DVQNbg2IDaINvA3XDfEODA4nDkIOXQ54DpMOrw7
-  KDuYPAg8eDzoPVg9y D44Pqw/ID+QQARAeEDsQWBB2EJMQsRDOEOwRChEoEUYRZBGDEaERwBHf
-  Ef4SHRI8ElsSehKaErkS 2RL5ExkTORNZE3oTmhO7E9sT/BQdFD4UXxSBFKIUxBTlFQcVKRVLF
-  W0VkBWyFdUV9xYaFj0WYBaD FqcWyhbuFxIXNRdZF30XohfGF+oYDxg0GFkYfRijGMgY7RkTGT
-  gZXhmEGaoZ0Bn2Gh0aQxpqGpAa txreGwYbLRtUG3wboxvLG/McGxxDHGwclBy9HOYdDh03HWA
-  dih2zHd0eBh4wHloehB6uHtgfAx8t H1gfgx+uH9kgBCAwIFsghyCzIN4hCiE3IWMhjyG8Ieki
-  FSJCInAinSLKIvgjJSNTI4EjryPdJAwk OiRpJJckxiT1JSQlVCWDJbMl4iYSJkImciajJtMnA
-  yc0J2UnlifHJ/goKihbKI0ovijwKSIpVSmH Kbkp7CofKlIqhSq4KusrHitSK4YruivuLCIsVi
-  yKLL8s9C0pLV4tky3ILf0uMy5pLp4u1C8LL0Ev dy+uL+QwGzBSMIkwwTD4MTAxZzGfMdcyDzJ
-  IMoAyuDLxMyozYzOcM9U0DzRINII0vDT2NTA1ajWl Nd82GjZVNpA2yzcGN0I3fje5N/U4MTht
-  OKo45jkjOWA5nTnaOhc6VDqSOs87DTtLO4k7xzwGPEQ8 gzzCPQE9QD1/Pb89/j4+Pn4+vj7+P
-  z8/fz/AQABAQUCCQMRBBUFHQYhBykIMQk5CkULTQxZDWEOb Q95EIURlRKhE7EUwRXRFuEX8Rk
-  BGhUbKRw5HU0eZR95II0hpSK9I9Uk7SYFJx0oOSlVKm0riSypL cUu4TABMSEyQTNhNIE1oTbF
-  N+k5CToxO1U8eT2dPsU/7UEVQj1DZUSRRblG5UgRST1KaUuVTMVN8 U8hUFFRgVK1U+VVGVZJV
-  31YsVnpWx1cUV2JXsFf+WExYmljpWThZhlnVWiRadFrDWxNbY1uyXANc U1yjXPRdRF2VXeZeN
-  16JXtpfLF9+X9BgImB0YMdhGWFsYb9iEmJlYrljDGNgY7RkCGRcZLFlBWVa Za9mBGZZZq9nBG
-  daZ7BoBmhcaLJpCWlfabZqDWpkarxrE2tra8NsG2xzbMttI218bdVuLm6HbuBv Om+Tb+1wR3C
-  hcPtxVnGwcgtyZnLBcxxzeHPTdC90i3TndUN1oHX8dll2tncTd3B3zngreIl453lF eaN6Anpg
-  er97Hnt9e9x8PHybfPt9W327fht+fH7cfz1/nn//gGCAwoEjgYWB54JJgquDDoNwg9OE NoSZh
-  PyFYIXDhieGi4bvh1SHuIgdiIGI5olMibGKFop8iuKLSIuujBSMe4zijUiNr44Xjn6O5Y9N j7
-  WQHZCFkO6RVpG/kiiSkZL6k2STzZQ3lKGVC5V1leCWSpa1lyCXi5f3mGKYzpk6maaaEpp+muub
-  V5vEnDGcn50MnXmd555VnsOfMZ+goA+gfaDsoVuhy6I6oqqjGqOKo/qkaqTbpUylvKYupp+nEK
-  eC p/SoZajYqUqpvKovqqKrFauIq/usb6zjrVaty64/rrOvKK+dsBGwh7D8sXGx57JdstOzSbO
-  /tDa0 rbUktZu2EraJtwG3ebfxuGm44blaudK6S7rEuz67t7wwvKq9JL2evhm+k78Ov4nABMB/
-  wPrBdsHx wm3C6cNmw+LEX8TcxVnF1sZTxtHHTsfMyErIyclHycbKRcrEy0PLwsxCzMHNQc3Bz
-  kLOws9Dz8PQ RNDG0UfRyNJK0szTTtPQ1FPU1tVY1dvWXtbi12XX6dht2PHZddn62n/bA9uI3A
-  7ck90Z3Z7eJN6q 3zHft+A+4MXhTOHT4lri4uNq4/LkeuUC5YvmE+ac5yXnr+g46MLpTOnW6mD
-  q6ut16//siu0W7aHu LO6470Tv0PBc8OnxdfIC8o/zHPOq9Df0xfVT9eH2b/b+94z4G/iq+Tn5
-  yfpZ+uj7ePwI/Jn9Kf26 /kv+3P9uY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AM
-  gA3ADsAQABFAEoATwBUAFkA XgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtw
-  C8AMEAxgDLANAA1QDaAOAA5QDq APAA9QD7AQEBBwEMARIBGAEeASUBKwExATgBPgFFAUsBUgF
-  ZAWABZgFtAXUBfAGDAYoBkgGZAaEB qAGwAbgBwAHIAdAB2AHgAekB8QH6AgICCwIUAhwCJQIu
-  AjcCQAJKAlMCXAJmAnACeQKDAo0ClwKh AqsCtQK/AsoC1ALfAuoC9AL/AwoDFQMgAysDNwNCA
-  00DWQNlA3ADfAOIA5QDoAOsA7kDxQPSA94D 6wP4BAQEEQQeBCwEOQRGBFQEYQRvBHwEigSYBK
-  YEtATCBNEE3wTuBPwFCwUaBSgFNwVHBVYFZQV0 BYQFkwWjBbMFwwXTBeMF8wYDBhQGJAY1BkU
-  GVgZnBngGiQaaBqsGvQbOBuAG8gcDBxUHJwc5B0wH XgdwB4MHlgeoB7sHzgfhB/QICAgbCC8I
-  QghWCGoIfgiSCKYIugjOCOMI9wkMCSEJNglLCWAJdQmK CaAJtQnLCeAJ9goMCiIKOQpPCmUKf
-  AqSCqkKwArXCu4LBQsdCzQLSwtjC3sLkwurC8ML2wvzDAwM JAw9DFYMbgyHDKEMugzTDO0NBg
-  0gDToNVA1uDYgNog28DdcN8Q4MDicOQg5dDngOkw6vDsoO5g8C Dx4POg9WD3IPjg+rD8gP5BA
-  BEB4QOxBYEHYQkxCxEM4Q7BEKESgRRhFkEYMRoRHAEd8R/hIdEjwS WxJ6EpoSuRLZEvkTGRM5
-  E1kTehOaE7sT2xP8FB0UPhRfFIEUohTEFOUVBxUpFUsVbRWQFbIV1RX3 FhoWPRZgFoMWpxbKF
-  u4XEhc1F1kXfReiF8YX6hgPGDQYWRh9GKMYyBjtGRMZOBleGYQZqhnQGfYa HRpDGmoakBq3Gt
-  4bBhstG1QbfBujG8sb8xwbHEMcbByUHL0c5h0OHTcdYB2KHbMd3R4GHjAeWh6E Hq4e2B8DHy0
-  fWB+DH64f2SAEIDAgWyCHILMg3iEKITchYyGPIbwh6SIVIkIicCKdIsoi+CMlI1Mj gSOvI90k
-  DCQ6JGkklyTGJPUlJCVUJYMlsyXiJhImQiZyJqMm0ycDJzQnZSeWJ8cn+CgqKFsojSi+ KPApI
-  ilVKYcpuSnsKh8qUiqFKrgq6yseK1Irhiu6K+4sIixWLIosvyz0LSktXi2TLcgt/S4zLmku ni
-  7ULwsvQS93L64v5DAbMFIwiTDBMPgxMDFnMZ8x1zIPMkgygDK4MvEzKjNjM5wz1TQPNEg0gjS8
-  NPY1MDVqNaU13zYaNlU2kDbLNwY3Qjd+N7k39TgxOG04qjjmOSM5YDmdOdo6FzpUOpI6zzsNO0
-  s7 iTvHPAY8RDyDPMI9AT1APX89vz3+Pj4+fj6+Pv4/Pz9/P8BAAEBBQIJAxEEFQUdBiEHKQgx
-  CTkKR QtNDFkNYQ5tD3kQhRGVEqETsRTBFdEW4RfxGQEaFRspHDkdTR5lH3kgjSGlIr0j1STtJ
-  gUnHSg5K VUqbSuJLKktxS7hMAExITJBM2E0gTWhNsU36TkJOjE7VTx5PZ0+xT/tQRVCPUNlRJ
-  FFuUblSBFJP UppS5VMxU3xTyFQUVGBUrVT5VUZVklXfVixWelbHVxRXYlewV/5YTFiaWOlZOF
-  mGWdVaJFp0WsNb E1tjW7JcA1xTXKNc9F1EXZVd5l43Xole2l8sX35f0GAiYHRgx2EZYWxhv2I
-  SYmViuWMMY2BjtGQI ZFxksWUFZVplr2YEZllmr2cEZ1pnsGgGaFxosmkJaV9ptmoNamRqvGsT
-  a2trw2wbbHNsy20jbXxt 1W4ubodu4G86b5Nv7XBHcKFw+3FWcbByC3JmcsFzHHN4c9N0L3SLd
-  Od1Q3Wgdfx2WXa2dxN3cHfO eCt4iXjneUV5o3oCemB6v3see3173Hw8fJt8+31bfbt+G358ft
-  x/PX+ef/+AYIDCgSOBhYHngkmC q4MOg3CD04Q2hJmE/IVghcOGJ4aLhu+HVIe4iB2IgYjmiUy
-  JsYoWinyK4otIi66MFIx7jOKNSI2v jheOfo7lj02PtZAdkIWQ7pFWkb+SKJKRkvqTZJPNlDeU
-  oZULlXWV4JZKlrWXIJeLl/eYYpjOmTqZ ppoSmn6a65tXm8ScMZyfnQydeZ3nnlWew58xn6CgD
-  6B9oOyhW6HLojqiqqMao4qj+qRqpNulTKW8 pi6mn6cQp4Kn9KhlqNipSqm8qi+qoqsVq4ir+6
-  xvrOOtVq3Lrj+us68or52wEbCHsPyxcbHnsl2y 07NJs7+0NrSttSS1m7YStom3Abd5t/G4abj
-  huVq50rpLusS7Pru3vDC8qr0kvZ6+Gb6Tvw6/icAE wH/A+sF2wfHCbcLpw2bD4sRfxNzFWcXW
-  xlPG0cdOx8zISsjJyUfJxspFysTLQ8vCzELMwc1BzcHO Qs7Cz0PPw9BE0MbRR9HI0krSzNNO0
-  9DUU9TW1VjV29Ze1uLXZdfp2G3Y8dl12fraf9sD24jcDtyT 3Rndnt4k3qrfMd+34D7gxeFM4d
-  PiWuLi42rj8uR65QLli+YT5pznJeev6DjowulM6dbqYOrq63Xr /+yK7Rbtoe4s7rjvRO/Q8Fz
-  w6fF18gLyj/Mc86r0N/TF9VP14fZv9v73jPgb+Kr5OfnJ+ln66Pt4 /Aj8mf0p/br+S/7c/25w
-  YXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAALA3BhcmEAAAAAAAMA AAACZmYAAPKnAAANW
-  QAAE9AAAAsDcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACwN2Y2d0 AAAAAAAAAAEAAQ
-  AAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAAAAAABAABuZGluAAAAAAAAADAA AKPAAABXwAA
-  ASsAAAJ5AAAAlQAAAEwAAAFBAAABUQAACMzMAAjMzAAIzM2Rlc2MAAAAAAAAACkNp bmVtYSBI
-  RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAA
-  AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAc AE
-  MAaQBuAGUAbQBhACAASABEAABtbW9kAAAAAAAABhAAAJIjAgAqqcBCT4AAAAAAAAAAAAAAAAAA
-  AAAAdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUsIEluYy4sIDIwMTAA/+EAQEV4aWYAAE1NACoAAA
-  AI AAGHaQAEAAAAAQAAABoAAAAAAAKgAgAEAAAAAQAAAoCgAwAEAAAAAQAAAeAAAAAA/9sAQwA
-  CAgIC AgECAgICAgICAwMGBAMDAwMHBQUEBggHCAgIBwgICQoNCwkJDAoICAsPCwwNDg4ODgkL
-  EBEPDhEN Dg4O/9sAQwECAgIDAwMGBAQGDgkICQ4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OD
-  g4ODg4ODg4O Dg4ODg4ODg4ODg4ODg4O/8AAEQgB4AKAAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQ
-  EBAAAAAAAAAAAB AgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhN
-  RYQcicRQygZGhCCNC scEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RV
-  VldYWVpjZGVmZ2hpanN0 dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4u
-  brCw8TFxsfIycrS09TV1tfY 2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQ
-  EAAAAAAAABAgMEBQYHCAkKC//E ALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXE
-  TIjKBCBRCkaGxwQkjM1LwFWJy0QoW JDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZX
-  WFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5u
-  sLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp 6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A+To438
-  n5HVipGCR1q/Em6JiwOc9PrUEKbY8KCd3SrsUZ UfNk7sZA9ayje2jCbjHboWoh5gIJCsp71PH
-  ErQltrDcfXrTQvz4I4zwAeasLE8bcA4HTNNU07u+o oKLd0yaJFEWQCGwCD6CtJBFsOCSx6nNV
-  wuxE+Q5HC59KsxxuACNufUjpWjp33ZLm0TwpsdgnO3HG fWrSjEnG7nr+VQRIWYqQ3J4q7GMNn
-  OCTilaNxzaT1Y+NWSJQw6Lipo13RM3pgfjUa5RzuO5asxKi kEkYA6VqtI+pLaWhZZRJFGDlyM
-  kY71MgUIecgjn61HbguCjoyg9+lSxoVbDHbnkkjpWaj0fQldri g52+4yaFj2y8AqvbmlCls4O
-  DnAJ9Ksqylxxz0Fa81mrIt3jHTqKkW/DZ5PJxUgQhmByXBz+lAAUA k9D2qcbAFZTuPcntUOUm
-  7Iq17SYigNGoYbiF7UhGJfQAZz2zUiliduRwdtTkYQhSFXd1NDk927lR Scit85kG3gnHFLhwA
-  FHOc/Wp4wNuVHHc1IACxB7D16VE2+a6QX3uiEJlD8pyTkj0p2394QQSQMYF SnOSMhe3Sm7Cjq
-  mecck1fNeOpMoprRgFOCOetOcMSrHg9elPAxIN2MHkcdqcRltuDg85rG0m9EFu zI/LRWwAScZ
-  Jz1qdYQ6EkYZe1KiFnG0qPXNPwSQpJI7Y705yfRltSe5XdHLbu2enpT1HzorHOBjH tUmxhkkP
-  j+VTJGwYFgNp6k9qXncIzTViAxgAjsPU0Kn4euas+WcOx4GaBHk7sL1GM96q65Xd3KjF W0ZFj
-  aSQQ425NSrGSARwTkA9s0qRqCSenQVZCrsO0MOelRKSTSSM3q9Csy5Us3LnH51IYyYs5zg8 U4
-  JyTtJwanCsEwMHDZxjkD3q4JNle8rscgySOM/xe9O2sMdTjJx9KmSJt7FgASevtT1j3MCucg9/
-  SpcnfVGcVGz1K5A3K5545+tChshh1PUmrYjUxlQCy57elBSQPwowDjmm9VuNP3WV+EYEhsZwD7
-  1J 5J8hPmBPU+9WFBEhLAcgHkd6MFQvTI45PQVV9dUOzbuiqy7QY14wc59qV41LYHJz61Oqqck
-  5Ck55 70BAH3N+B9aXMloWm4+RD5fBU8Z70/CGIIRkgCpH+UZYZUd6REClRz64PUVUWum5Ls3e
-  40KOWPJJ ySO1O2ARk7SecjHrUx4G7aCuc1IIt5G3PqwpXfVA1FSRXXPkruO3PApArlxhgFAw1
-  WOA4UgLzyT/ ACppUuu3B2selWvd3RDTTd1Yr/OZM54PU+1QqDu5OwDocdauldockfTNQAttBl
-  AKdiB1pdW2i3Hm V0tCA9HwDgNjFVHAM24Da2CRn0q80eWPGFIz9DVdo+u75h0yKiN4PRgrRV7
-  3KgDbl24B5xnvUbB9 x2jAH86uBBgsM5XvnpUBDEE7lJ7itLoEkiIKwO5Dgn1HWlbywxDk5HQ+
-  9TE7odqDaucjPUVGw+Ut wxPYCsVBbBy8xG65jcHJycDHeq4j3LuHAA+6fX1q9jeMgDJ6HFQbS
-  YsZ6frXRBNJ3JbtuisBiTK8 8jj3pXZyjsOCCOoqfaDKCo+975pxVhHtwAMYJNZ631FzK+xS2h
-  gxYcqvr1qIYDbiCMj86uGPDBWH TuO9Q+UCgC/fz1NaXhs2a+0SVkQBR5me5/Wo2CkMGyvHU/W
-  rRTM23DZzyewprKwKbgSMdMVlzLWx GiaZWZjgncMdAKh2MZPu4wME5qw6cL8v3RSNteQqnUD5
-  qSduhUndaFJ0zDg9R1xUBjDJtwdpXIIq 4yb3L7H9wTTHXbBtTHzdCaq/K77icVoomeYiybHO0
-  d6rSJt6EEdiexrTKtxsXLY5Paq7RMJgSAV9 AO9aRloxwhzbsoup2LzkHjFV5EJCg4Cgg5J71o
-  vHvZQT8oyenJqJok3spy2RkUmna19yNFKyZmkF Qp77TkfWmYAUKwK854rQ8tGiBLLnuPU01kX
-  G/cCc8nHFRey1KbVrWM4oPvAhWB4J7etV2RfkUckN lauunm4JAHJOMVXlj2gEHoM5qKcYq/mV
-  Dkdmys20naecZGRVcqQAduATyPStJAB8q7Xz6dxULsm0 gRk49T1pTcl0M5rXRGaYwqAschhgj
-  pz2pohVSH5DAYPPerk4Aj2k8KPkJqMqhVsjA+8aykoyV1qy KrbdmcPbIxtyuVDk8fnU6rIGwd
-  ofkdO3rTIInVztB4HrV6AMW3Pznnnr9K0Ti/e6lxS2JI0Cpuxu I6Cre1WXBIyM8jtUaBWcFM4
-  PcnirO35gvOSMgY61cZrZjcHGWwi7iuCcj+Ee1X9hXaW4GOcnvUSq DtAIYDgEVbRCBubJwcVS
-  kk77EX5unyFQnapVjwfWrigjkHDcHJ5qFVIjD4G0jgkd6srGGm5IU4ye a05+idg93axKCN6kr
-  vBPIFWU2iR8grn7opIIwTtDAgc4qYRESj5DhelJVOgRkh6K5X5uFHT3NWM5 D56ds0kSkCMEdu
-  hqVEEm4ZAb+lNpLV7DhK716CAgAZIXb6ipCSUYfx54I9KcEGdzfMO3vUwUsQdp 9zUOSvciDs7
-  iRhfJAI3AEDOeasEqVZQhB3YzTFXksFOMAjPQ1KuWl5GOetOUrlNSXoBQHaOjcfnU ka5U8YHb
-  PenlOeDnjipowcruCliMAAVkqivoTKWtyNFwrZHy+3rTRlnYpww9RVlk25yehAxTdv8A dGQD0
-  qlO+xoprls9xrMCB8wyf0pCuWHfHenCPMuzGOeuKmSM7kBIZTyfX6VF9GPVOxCvLZPOD27V KE
-  bIJypB4PtTyquWCgkcdOtSohG35WbB4FKLk7hLyIwrGU7umck461OqnIBABxxgUoV15QBhyRxU
-  6eYeoyMfLxRe1rpBza3bsQZQjcfu9TUygsrkKewB7U7CBcbcZOOaeyB9wG4ZYdDilLlRLV43aI
-  TG uPmJ6cD0p21sBODjgcdqnxmPIU8cD6UuTtw2D6cYzQ46FySk1cjCfu8MMgHjFAQlNoGVz1q
-  4qghS VyT2oC4QYVjk5JHalC9rijOMVpoVkUhyQC4x0FWQB5bYG3d1Y/yp+z+JAct/KpnX5Azj
-  bz0NNTaY k4vcr7ZNoyQwHT61NtO44OM/p7U5doVdx5IPSpgCEAGCTxWmluxUdFqyMAhcHO3GK
-  cSfJORkAjp6 U9cFgMH/AGs96fszGV2n1xUzXSwKdyIE7GUjjqPWmMMjoTk8+9TjG7ZyzY5FLt
-  3KNwwR29KXw9Ac bNELITCVOGbsQKaAxkI6AdzVkgliFU7R3pdqm4YlSoOMZp82gcyk7EGNyjc
-  QwxggU0A+aXCYY+tW lTO3b3PXFKEKJwCcVSfvWsVztIgbe23cPy70/Y2CBnPXr0qVfmBVl4Jy
-  MU9IwAR0HbJ6Ucz6IzTa 1kyLYMDncWHTHU0NkAKFxjjOOlP2Ethn4HpSAbnz144BPNNy1CMdd
-  dSsWy43jdj26UhH948jsBUp QtIwxtIPT0pWX94GUHO386huI3Ho0UXjV3ZS5Uk5AzTRGFkJOc
-  dvarGBvxgk7eD6VHs3RKTuDZwc 96J3ve5bTatcpMSrPgD73PFJJHnHG47cjjvVh4w82GO3NN2
-  lmbkbRwvrRGpZak8qbK4RdoPc56U1 Yssc8Lj8an2FWA2kDrmjaSJF7Acgd6qE2nZAoroVzkRh
-  MHryR601lLK/RecdKsbVQhs5BOMZppUD LDoWyM/zpuUn5lUuVN6FFDhsgcKecUOQVODhifu1b
-  KjcSBt9TUJQqRlcE8Z60m1fUUpq2xAQxG4Y yM5yKiY8jcV6YOBirexgvIyvUkVXKhotuNp7E+
-  9J27ExlddyJkzGqA8g4+opgQ+YTuyoOfc1MQm/ axIIXtSIqHDchgp4zS5ujJcXazKnl43NnIL
-  fjTCWBJ+UZzxire0OMgYXnPNRMpZQNpx9KtSuh3Kp QH0BA4Gar/NuJVlK5wAfSr5HAJwQOw6i
-  oiBsJI2nODx1pqL6FOS27lRlj3ZUnntmogqtuyCBwTV4 qBDwPusB7moggxgMApOSKz5o3sDir
-  XKJiGAD/A3B9cVG4zCCAADkZx61oFi2F2NtyeSKg6wfKowD 0I6+9a03fWRn71ym0YEW3AyOp9
-  aq7Au4ckdh6f8A160Xj/dDdnPbNQeSCDuJIz69TVWuro0VmUHC 7AuGG3pVfyQ1xt3YBB4NaDQ
-  7Mt1LHHNRybWK7mULjhhwBUPmbuiZtRdkzLwF2quA5GR9KrvG29lY ckdfStJkJj3BVYLxkVCV
-  dUBxuycnik5a3BN82hQ2c/N8317VAY2JZuMY45q+6b0Jyc+npVRl2Abu F6hu2ayjPmlpv6BNy
-  scWkR3jy2LAnB9quLjesZZX+nGDTY1jLkYZT6E9asDHnMccqeKelryZTjL1 FjYKFB7cYq2u1S
-  u70xn29KYqLlTtPIz06VONznDHCYHUd61cby00RKcXezJgQASANuMgDrU6FimE yVwBmmIMbVy
-  B2JI4qwmVOM454GOoqXZIlOUVoTJhjtY8A4/GrCqC+FPze/NV0CEMNxGfSrKAL8oy W65PaiKT
-  WzE27WluWgxVtnG4kc46+1Wgrn7o4zwT2qqh+QO3UNjOPWrhP7kBWUELzSu001oRy20S J0VVG
-  7JYHoKkjAAdz8pNNjKsFVVZiF69qVmDBAM5x2rSMeZe87lXT0JFXmMs4GB/KnLkRhgxyR2/ Wl
-  2guoxyeeakj27UGQp64PaovJO6Qk3HbUWP7/Xv8ue9TkOzPtA4PpQEBnDg8Dr6GpSPkLA8Yxij
-  nTZq7qwJnYA+SSOwxzUwVlkG44OM/SowMptTjB6mpwoZSTnI7Z7VTb6iWj2H5wDlctjIPpTRyw
-  zn 3xT1RSRklcdc1IFCsGzjI9O9ZxUNbAnbWxXCKThSR3GT0zU5XaVXOWPp3pwX93uCk/NyalR
-  RyWyp BOM9jROS66E8zvoNU4I+Vl55JqULnc/IYniiMeZHuHQHk9jT1x5mARzzjHIp8umxq3ro
-  PXBVQMgj v2qQLu3jBUfWpPLOVw67SvI9akXaRxlm74PWnLTUjpdkIiHnsDkgHIqdFYxFmVcjv
-  ilCsMSLxz1N SspDc4xjJFQotyuLV69CGMkPyOnftineWwkIC5FPKDY69SDSKjFzjKgf3jRbRt
-  sbgl5Cbdy4YEYA BqTaCjIOdvB9alVG8xsLlcYA9akCYIAOecDNPmu97FJx7kYwD042kcdqVc7
-  djfMAOB3p3zbgOPfj rUobLDK9tpx2pRi7aohNX1GgKAoIB9Tj9Kbty6gZHGf/AK1WNoQhscA0
-  9VHILA5746VVkXGViEr8 4VO1WAFADt0xg+1TBQCCRnjOaDGrx/KOSOM9KhN3DmVyodyvlRkg5
-  6cmnsN8gYqykjBx61N5W5lH LEccdTStGQQAhD9GJqrpyDroQfO0ez15/AUpOTt2HINSiLPAzu
-  we9PIIBADZI4/xofI1sNMhKYkB /g6/So1VPMU/MCw/vVcyWhIBDY4IqIgAqMHjP+RUwV2xvfc
-  RP9Y3QkYwaXG+ZW3Acf8A6qGUlAFw CD940Z287d+ey0cvYjldrpjH+/k/dJzSIcHd/CR8pqZQ
-  Cxdl3Hdzjpmoir8jrk4A9PWtFcE00MIA BLN8xP6VEdwZW4wPxqc4Uj5fl7Z7VEyjcSu7BPU9A
-  aUtgcrtXehCQxcE460wuRKqEdRgVOR84Bx0 /P3prYAUYDY6kVCk7lOGlyFolCbm5btUBBVs42
-  qvT6mpMNwwbryBUwAywyCSfyrR3jZkxauVAoK4 bOM8HNC4yybfmPUipNuUAYZOfzoCsZAOAev
-  /ANamo33L+FXW5WZFEhHX0BpxXzHcgDdx19BUzEbi WXBJPHeo0UtJvCsgHBU+lTL4dTOfe5Xd
-  B5pZuMHIUd6iYZbvgkVbkG1TznHf0qFkzI46D+92qeZ7 iSRWcZn2nIbODzTCpGSMHB61YZf3b
-  ZGAO+eTVd4yA2MnPvQk927DVlKxG6jBJwcnk+lQmMFTjJA7 9KlkBWLnO3pinEfIQpHT8qpNtI
-  NU79Cru2odvA6NSMjcBTkY61JtJhDNjlhkAdKeU+UgOFbPJP8A KrejuOL10RVK7IyGI64B9Kj
-  2Ah9wPTKk1O0bFgjnbu6d6btAdhtLc4P+NLRa9yb62bKm3EQDA4xk ketMaM43Y/i6Y5FW2UHG
-  Bmo34PAy9KU7i1asirIGKY7kjgVEQSp3HbjjPqKsSKQTj0BNMPzbsYLd 89Kq+qsVfuQk5YFun
-  QAjioyp2KQDyc1aZThkG3JHSo/4FTBOD8xH6UlG6egnLQolN2dvQDnNVGBC 4AUg9citd1YLjK
-  nJxgcVUkiUQMG4YccU4ya06Cg0tWZ3lLu+X7uM4BqrInzttcH6VpHcG/2T271W aMoF55Kk+9S
-  k3rsaK6bszPkiITczAFuQPQVUMSlPmOQvH1rSePMALZLH37VWkiXJ2HaOvNVzWRPN b1OQ4YLt
-  VTjrxU8cQMiylcDrnHenIvzljjcTgAd6nXIjYN0B5XuKxTd9URHR3S3ARE5wAARmpo1Q hiQ2R
-  j5T1BpQF25DfLwQfapFXDuFBwTz64rW11ZsfM7bCoMHOCTjn61OpUv8yjJ6EdqbyoI5JPPW pl
-  GG46EdamMW90Wo6PUkCAN/CBnJOKsKp2fKC7dGqNYgmCT1NXIwPIC9VPP4+lVTcWmupM5K2jJI
-  1O1QBwTnj6VZjj2jcWyccj3qJUwqYJXnvVlVUBSCBk9D2qV7quZubY5RkEDIAHGKlVeMbSpzzU
-  aq AQc4GOBVhAH4JwelP3+UpxaW+g+NldSDw+MEU5QWlBAx2xjrTEVftDY5I61Nyr5IJPt0pcj
-  TLj7z 0JkY45IBI6YqQr8gHUDpxUaIABtB5PP1q7tGPccYNS0oscFyvQYnzH5cZPTFTKORwRxw
-  PWkC5BOM g8DFSrncFPUcim1bUUnfW4g+VMhSc9c1IY8y7ucA9DQY9/GTz3HSplAEOQDknvT3W
-  gruyY1FyhLn AHIx61LtBjDf7XNNCtySMZ6gU5cnae/92okubqNJLYkCbVIGMY605OeSAPl60r
-  DYM9MYxzTwMvgH APX0ojZ7scZN6MlVCyKXGAv4VKFUSsSQBnK+4qJA7Bg2Qo6L6fWrqrGdxUb
-  l449KblyqzYWdvIjV RvwPnDcn8KmweODgccinEYlAwMdqUoTIoLdOabWt2Jt3syHbmTcOucED
-  uaVtoVQ3BPGTUxjIz6hs 5qTblG+Xjd+lU5K1xrTV7FYJljlzgHOe1TbeSVVs49e9O4JcsMKT0
-  FSKQrjB4789awblbRAoys2Q KSrD5Tk8gnpVhUAKkLuGCTShN69yw6Uqn5ioBU9+atJuzsN2+H
-  uC5VyzggehqVETaBtzz69RTkiM krPj5SvQ84qRlOQxI2jsKeknbqNWTsmO2AH3HamfMpXcBnG
-  Tx0qTkwED0zn0pu3OCRnjinFa6kNN qzDsc8DI5pwB35Jy3b3p3BTIBA6nNAQl+CM96hrW76By
-  WtYjA+YKpw3XB600LIsvIOO4P6VM0Yxu AO49TT8HA7GqUU3ce22hCMkDPDdzSYUjef8AgIqXy
-  y2Rnae9DR7EHoOopJR72BRs1Z7kecJxt56i onGEOB8zDtUyoAvBOKQ7BKvXJAzzTh1sCa2K4f
-  BVf4R0A/nTF5OC+M9qtMIyWO3B6A1CF3bcA8Lx xThNrQJLaxExHmE9RxgetM25cAErg8ZqfGE
-  IYYbFRH5SgK5yOPXNTzeYN3diEjAOBnLcYprIRIVY YGOtT7S67sYYjcaZ5TYJIOc4BpJWepLT
-  tbYYRmIKFI3dKhIw6jnuM9quKH/dgjgc5xUG3Mm/rk/d x0q0+bQtVJR0RFyGVSQcDgUMAXkJU
-  gk5OP5VPtDOcckHtUcyEoSAVJPA9Kq8X6kc3NIr7cyAMDgj jHtRkrICSAT7VMuPkJyG757Gkb
-  PJK5J6YpO70YSd20VHUvHu3AnPboajbCOFOArHBq2w27VAHTp6 UEApjAPf6VU2r2HotEUnU7m
-  Kjfnt6VGwcnbt2kDnjp71aIDMVOdxOQe2Ka6kZ+916VLp3KXLzLuZ +Nr84Y+9H7sx4XhzyRVn
-  y9z/ACglsY3f1qLYBDjGCT1o91oLK+4xwTGGjAbPUCoMZi+YgOOntUxy nVie4x2pzKu7jJDHG
-  aHZLREu97FSSNmdVLDdnAIFMbchCEAsBzVqRS0eSOfT+tRTZMTv6kA4pqVk KMddSmR8wDZwR8
-  xqPgP0zxx71ZCKpyQcBe571AB1yRuHFVKSauXBLUjI5BK4Lc4PVaj2neVcbV6H AqVVLMcfNxy
-  TTSDuBJ68GpgrPUma7kZCMDjIG7hqgWT5dp5OCOP51aZVdODx6VF5ahSxI3H5sY7V cWr+YrNL
-  QiK8DeOT0AqHY2/Zt4znJqwSx9MY4JFRYYHrhRyfrR7NpPQUm7FKdRvHXKjk+tVH+b7o IbsfQ
-  VpMv7sBgOhzkVAy/IW4AwO1EZpoqLcUrGbJBjb1YdiOlVJUGG2Ho2AOta7BQW6nB5qjKWZA Rh
-  cHJOOvvSjNteRK35n+Jx2zLkFgB1x3qwvlvCSDknuPT3pkKctv+ZmH5VbWFfKP8K+1S3Hlu0VT
-  UktBiKcxqMHaMfWpxuMhJGMcYNBVdyYyScZ9qlCjJOfl3Zya0m9UiHT1fMJ/GyhSnOSakRQck5
-  JH 8IPSnCIhiSmSGxmpYgysWABOemKlRvKyKUktiVUVlIySOuM81NHGpmj+96gg96EXeylDjHH
-  Tp9au Ip3cYP0p8zQRu9ESAHY2SBhh19KeFbaVHzKCOlNwjxkMD8w5we9Tqu3Z8hPfg011E2kt
-  h3lg4JyA Dz7VKuQcfLkHPPYUKMyZJ2jqM96kCq4BAZiTyajTVMvVR1YKpbBHIz27VaWMKvJye
-  3vUIiKybRke v+NWgCFBPJxzTlJP4SVGSSdxIwjOWyRnselWE+Y8fNkcUxAxVTtB+g6Va8sYIT
-  txnNRdKSTKbYCJ ieMrgjgVKsZYNjIG7IzzRGDu4BG08GpVXMiu+evABpzk2LXdkUauHOCMHqK
-  mUbZguCR0JPalYEKw PUdcCnxgNEzEYI9TWU00hWd7oQJ8mCc4HBqQIqKpzu29/Q0oBOFwATzU
-  xBCMduOeRUtONrlNydk7 EcQDIykEtnj29qmaPJXAK4680KOFbBJI7elPCbo1wduFJwfSq91dC
-  rPo7Eq/eUBflxxUwABOcgf1 pqACFN5UsecipkAMg3Hg88UoyVr2JVm7Dgm9t3UEZFP2hFBJxu
-  55pFB3gKrFgOlPKMV3N3PB7VTv a7GoJvYRow+5lYDP5mlXIZOp4pdjBFUtlRnGKkERBBIbnt3
-  FO91ua83LFJ7BtT5jwBnFO2jPsB19 KkCkgLtO3GfrSgEvgkAEdMcmkrcy0FGzW+gxQCoKgtzj
-  ilwROARySefapgm04UfNnnFKfvqSvXpU 3voTe70/EWNZd3P44qRwfOAAHPUYpEVmkYDpnjH6i
-  pwrB9nU4x9KmWjJu1Ig8vLAFTg9DninKCV2 gd+CalUk8A/MTmpFIbKt1rbm01RTjK9yAAyOfu
-  qRwB604ghAuMMcGpU6kDGD3I5FIqfMWJwVOMno aj3t0hTjeRCsZXJbGPrSYPmYP3SMZqcbiow
-  uQvf8aUhCVycEH7o61oovqGlyAwhFzye3JpPvNjnb jg1Ic/eLA59+lIMeaG2nG39ahxa3KbaV
-  2RqpPzbhjBycVEUxGoI5PB561YOzgdCOvvTijMSy8qDk AGs3U5CFzXuykw7DnHQe1NHCHjBzz
-  U+MlQwwCOPemMm98DGM9a1TuhtQZAdzEuudpOee1K8ZIjA4 GcZqVdzPtBG0j06CkMTAbVy2Dk
-  k0ot37F1IrS7IGDrnHQjFOKtt4BJH8qs+WPLKnOexzTFVlQKCc k9x0FJz0uZOloVlGZc5xx0P
-  WmlNrLkH1B9qteWeD0JGaULx1DN2HpVRWliZR5VdbFXauQAOvJwaJ NocgDdnpk/pVp4gTkgjn
-  gd6Ro2YLhQB6nnmnyor3U1YoFPn5ZeuAaYYzgAjLDg81om3KgMSOpxgV EFBfKc84PPSn7ttAU
-  le5RcEsdq/IMc1AEZpGypxnj3960XSQEkqcZwABTGDIuSuG7E96b006im2m upRMYDE49vrTcE
-  5bBzjvVzbwCwJpCpCBQMjHQ1jJNNXHvdGeRj5lznOPlqNVUMhUqX27SDVpk53Y YAVDJEzSDkK
-  DVJSW5KtaxTkwBgEE9+KjI4AwTkVZljjyfm+YDGPemmPKKB/31VruXzqBUGCp2ggA bagkTajD
-  kAt69/SrTnAcFW4P51WkHAbady9vWkpMKl3a5G2DHs7tzioZFbzNoAHPYfrUrhjhlO1Q e9MZR
-  5rLuJY9MdqqTWmolFpX6EGMZAYDuD60MCVBf0z9aTB3KpHzECjDAEMQCtJQ1LuyMhsZUcdO el
-  JsUplWAYDGPUVKcHpjgcj1NLjMK7gFbkkdOKpS+8ht21Kzrh/7xxx6YpOAuOhz0xUuR5YGRkcH
-  im7kGSfWhQbQlq7MpFSZNxOBjvUbkBdxGQTzV0puk44P9KqyREbSMYBPXvWnkJK7V9ikwwrDac
-  no KoyRjA7FupNarRsAxIJdT+BqnIoHJwxNYqd37o2r2OSVAH4GTjC+9SiIlP4hgYPPWiNd77O
-  hJzU6 AeYcnkeveiEWndijKXzGoCHGep5H0qdAAEfHBHBqRFH3mU4fJ4pUA2hdp5Hr0q/djqhR
-  ldXGkjyj jOSct7VYgwfmZl4OD6Gh1Uop2MrVaSNBGcDHPU9DRNqMdQ91LUBh5o3UjgnIq0oKH
-  LL8nG0+ntUK Bvk3LtYrk8dCKuqSQC/3OpBpJ6aIbTi7t7iCE+XkcEHOB6VNGgx0ZVbqSc0Ko8
-  xtpLcYODVlVxDw 2OOQR0qm77j1T1ZGisFYZQgcDAqzHt2lMYx/OnIMrx2qxGAJMbcEc896xem
-  w48sVdoYqc8DIIx15 pQgXDEcHg896kMbs8gzhQePpUmzKkcsMnJPrVQlpZDjo9BYlcxsqgZHT
-  PcetWUXy4+oJzSxx4hQn IYggCp0T5cBSXHOaiSbIkuXYYiK7cH5icnBqQja4KA4VtuMVKNq4b
-  GWyMYqRkPmAg9fmxVySSByf qVwuGJbI78+lPXaTtwMZ/KnbSzgYYnOfrTRw6sw+XoR3xWerRV
-  lF3e5MFKjOw4HJz1p+A8oySccq PX60IPlDBWwTzk9KaquFJXnBwPU1Lbej0Jv5jWB8racx5xg
-  +gqeMkZx82FI3evtTQvmJgttbpzTx Gylg2CMYAFOyvqbuCfUkiX92rZGO6+lW1TIwQduetQxD
-  5WVvbOfSreAm0cgYzyaOfo2TNxi9NRMv t447fWpduIvusefu55FQ5YMDj3z1Bq0qsTubPsBVq
-  KWz0Ks762EjjBwwPc5zUvJcAggAZ3HtQPvk 8BfSpQrllHXNS7bszlve43nb6+9TKp2EgBsDOA
-  OaRYz9OM4zV+9vZb65SaZY1YRqg8pNowPp396i bk9LaepajzPRmfg5BKnlue1TMmZcAHJ5APp
-  T+NoCdz370pG1x/Hx2pqLbuK1t9xgRkXeCCCecVN5 b+Q/UH1oQMEVWUk54o2s0yqrMuBg5PU1
-  pZ6CteWoKo3biMBTyaVTmMhyFOPSgxs0PzffHWpApxyM Y4FTy8q3KlFNakQiJYdQQeT/ACqRB
-  hQuQMg4BGakAyoyOB3po5OSmMjr7VTTb1Rnz31vcRQNmRyp 600xqJ+clgORnmpAMoB1Q8ijaD
-  8zHH+16099UNR1uV2QbuhHp/jQFXaC/BwenFWFUFJG5PHY1Hsd WBbgEdetZ7p3ZUrIiCEZC9y
-  MsfaoWOZCMhc9fSrbgEsGVjxke9QDbnLAL8vfvRG27VxKz2IlTOD0 471GUUkHIABq0QGTABPP
-  H+FIsW4LkHimhQ5lqyExlV29s5yKcFcENwDg9qlGPPK5G0E4HrQYyeit nPXNXSWqvsZ2VyFjn
-  eo4bIIzT1jTbvY4PYetTGIh8hRtH51IqEE5TaeM0pRXQ1bKeHIPy5xx0p6R F2Bx1HDdqvqik5
-  cbDg/Q0rRhIDg4GOtQ5JWJk/spbmf5Q3Hb3PGaaqDewPYY/Grvl7lDZAyMA4pp UGfnhh7VUUK
-  a7lVe7MM7fWqzrlchcAHJxWg0YGdoJWhYSVK4ySMnPtWqilqNNJ7FBl+fAzzVdoix GQSoHb1r
-  U8k5Axs5PXtUHlPg8fMvUe9C0d0yYyd7GcIct3z6VE8e5dwyW9PSr5+7u2kjdULJzuCk HJyPW
-  p13Zo7bGcVLSsM/MePpUEifeHBx1NX3Tjbzu/vYqCQARAEEsfQ1knF7MUU07FCRG3AhR24x z7
-  1BJGBvYZX6mtArlivO4HNUpPvsCOR3q1JPboHNLmKkoUx7sbiRyAagkGYgeSw4xVvZhRgZbHT2
-  qsy7mIH8XQ0Jx7g+V9SEgDkc+tRBSCHHHPGe9Tsq5ywO7HrUHP8AF8wWko3ZCiloiJgGdjkfSg
-  nI baARxjingMYCP4euMc0mEIB3gY+8K1lBRHzJ6kIUs2NuHz29aCrdcZI4/OnHGVfJPGBj+dO
-  KEqVA IyecnvTSW9ynOzTSGPGViAwCOnHWoXTbg5Hr9atlGVCHXPriq7cI2MZDDnqKE3bUUOaW
-  xHtJTBHI NV5CMgEgHkirjcy/eBJ64qPYm8qCG5y2am9tQta6KbqcbsZz1xWdKFXLMpJA4wa0Z
-  G/dfM2FJzmq L7TMSGAX0PUirjFv3rCglbU5gI4j4252nGBT448oqgdfzpVJVmABGehNTopfGC
-  MjP41Ki0op7E87 WiSBFILqc8HP41Oqh2OGAOMn61AgKguMlu/vVqMAptcYz07YFU6cbrW4NRX
-  QkWPFxgkMAD+NTeSS BlwOfTpTWXaVyCX3Yx7VaUOzZUcZwKlT00exMVZjfKZ12hup/MVaUMAd
-  zKADjBFLs4I6joAvUmpo 1fG35ST1z0xVJprc0cm9LhkqAFAzj045qZIzu5OSq80KAQC4LKRzg
-  4xU6D98Aepx1pN8q0H7vKHl k7XBwAatJy24gknoaiWMMw56enSrMarGuQ3bvzUWctLi0+YBVz
-  xn73Q9c1LHDlgTnGfyqeJN5DYA 559qkCncBjAPT3odrWW5MXK46OPERJIJAyfzqXy2EkpJxkZ
-  XHepY9oX58cHp6VJtVwMkjBznPWiD aRUpcysiDYcAYIPoamcr5XzIyYbrUwUljkg5GcntTfvb
-  gAGX3qGtSoK2+xERgccseSSOBTNi7Mry QclR71Y45DEc+1Q+VsACFsk561UU+4rx6gpIifeQA
-  TwKQ7vOKFW2Zxu9Klk+cfLjrxxSkseA3XkV KvLYPdWohUxlVGNucZqXbk5GB3570iYYDJyOuK
-  lUZJwQDnafapd47sFG7HwuGcHIIJqYrtUEjLHr UIj+f3x0FWAm2QJnIA7mhRb1iNQSJljUgFs
-  57c1Y2ttByB/eqCIh5VHXvVlQFOfU80Wa3KkmtEOw fLCLHjA9OvNSiP7rbjkjkUcHAwSMcVYV
-  Ay7gu0k8Amna7uhX8hnlqNp5zjBz0zT/AC+eF6DvUywn eRn5QevvTzFzuAI7EUdRwik73KqJw
-  OwBxzUm3EXylQcd6mCOFYcD5snPenhVVtxIJJ5HoablO+hT ty2GBGf72MZyGFBDbUyoGfQVaA
-  O3gAY60hVyCSFDdv8AGjfcmMYy1IgvGADnPfvUvlZbHY5PFAUF l3blyM9elLsbJJyOMGs5pqV
-  0LlTVrkBQNnnDdMZpWGCB9457DrUoQE4OOBTdjbeBuOeNv86pK8bi Sa0uR45XgAE8CkIBf7wH
-  J4x0q0wIAUqOnJxTAozyRhTx70lrrsDepDtG0IWGc9cU0g+bjBbH86nO 3eSRnB4pAp39MN/Oh
-  WauKz2ZAc4XbjJ5INQFQxOEJIHGKuH74yVB9cVGw67APbFXDUFHl1KoG+P7 rEg9qeiHYeMHPe
-  pwhRctyp7U8gKv3TkcDjrmhtDjdvQhaLMZKDcQc5pyIVZOOCMkGpEVs9CFxyB6 1KxJcFQMdia
-  SvYSp3umRffBKr3wMVIsMjElmGSMkY6elShQsauDkk8gdKlCKWGCSV6gd6Iu2liL8 qsVvLDqF
-  79/rR5DNK2WBAGDnpVsR8YwQcdaapYAZIPvjrT1GpaalIoVwB0757U7ZldxXqcVa2jyv xxz3p
-  AoVsO6sMZzVSiujLeq0KjRfMQAVPoaaAWHVSPbg1awAz91PWo9i7cdT1wKztzego766FYqd 2W
-  bPrxUZRSd24sOTnNWNowzFSOw5poT5cDA7E1qlrvYTSKDoVL7cbcA59feqzLuwWyfpxmr5DZIT
-  BUdPpUUiZB2kYbr7VMnfdjaa3RmvtbHynHtVSRFwDtJwOMelakiquFIKkjqaqSg+Ruxls4z2xU
-  cz a0KppddTKnD4QqOW6VVmQguA3zZwR71pN0wc5zwKqug2sfmOTkVV7eQNqKM6XIjBHBIxVdg
-  Rkg5I 4Aq267gcsCR0A71Ds3SMWXaCRn61T1WoorS7Km1uMjGBTTwhJXBPXjrUroVbuU3du9I+
-  Fl6qeMjN Du3ZA4EDDahYnAI6U0xlWOFGcDPvT8HY2c7u2akWMeXnlznrmqlLRGclGG/UrBAXY
-  N6jgdqD8vQE 89TUmAXYchup96UHjdkYA446U1d9DW15e9sNyfNAxkE/pUPAOBjGcgYqdchieK
-  YynfkjOWolG8bh F2TRXIJyAueM8VAAAzNnDn9assA4OzcSc57Ux1VoY/UDqO1EWuVXFdJGfKo
-  LfN2GMVVdQI/ubsdV xzV+VSCwAPzEduaqyZIZsFfqaqN09xt30RzGAJMLjG3gVLGEEMW/qD1F
-  RjcAHI/H1qYHLsevoPT1 p662MG4t2JT8+CFIUHjijZnag5GOfpUwLBlxjaVwvFCEHIzyp61nG
-  pNPRF35rpIlJbJPbjFWowRG Cx6dPU1WBLI2Msc1OoHkDJI9vSnyXVy46R2LCKwk4X5BjBqym4
-  Lk/Xiod6MwyG4461OAw5ByB2NK K0ZEo/zDtuUKg7geRg1ZjU+WeMgcD1piA+YdwGVHHFTRjbt
-  ZeMjBz70NN2Vxuy2JwihcNkEdcd81 OBGG+ZgMdSKjjyVxtYe5HWrJVMJ0PsOtTfQbtzWHqFWJ
-  eCDmrCK0sakcbT0oVB5TKcbhknNWYubf BOCcEKOopw1iDVtLD0QmIsANucY71Kik4yuec0kSF
-  pHboB2p20E919M1K6hyXYIvzcZYHoe30pyx gBU+73P0qZFORtIyD0ppVmlbAANKTb6g1LoyB+
-  5Tpu7imMjYJzyeRgdqtDhcFc4HT0ppHHHzZ6Yq nIlS0sQlSqk8YA/Ko/KbKMCPKUZNWCreWpz
-  kEcj3pVLbSqr94c8dKhKUXdMcFf0GgDfgsPy6VIqj YAx9/rS7dibQCQeckU5fvBQBnPU1HNdm
-  junoPCrvycBck4FTKrFchhgnqeabG2VZTjgYB9aspGdg A9OnaiLktBx3HJGFB44z1xViNCbgF
-  VO0DAz2poBOAAcdqtqTvUMM5AB7Uc0ktyLvcUJ83TcAOcVM qAzEnK46Aninhf3hO3p39akZN8
-  vPyj1p01Lc0i9fUaqkZ6lieBUyBgpyj+1SxodqrjBweT3qVIiQ OowepqrX1sZyiQ4byk2jnHc
-  U5YlLtvGT2IqYxsYiFOSDg0oRliA4PPPrTXky3tqRIMlh2xT3Rtqc YGOM09FDOF6Lg80/6AkA
-  49aOV7ia1uV9u9tv3mI5pAjE/N0I5qwvysTlVOeQe9GwBiOpxnFG2iJc tdNCHywGIJGDxkd6Z
-  tZQWC7WHBH1qyCAjAcjOeabyMbs5I5JrJxaditdSEqdoUDH071GinkjDDIz kdasBVY/KrA4OM
-  96Ty+VxnC9MGr5rKxMo2SZAIyMgDqeSe1OdSBwuQDwKslQfYAdD1pgjxyTwOAK FZopR01Kyod
-  58wbe3P8AOoWAVioBGF5Iq+yhYMN14yfemsmC3HOaIvleocz3K+C2FI4zmnYJjAIz /M1KEIVe
-  Rzxn0p6ALJubOBkCqnZvTUGVwu1WDKQM+vNIFO8hmG32FW3BHJwf6UhwULdeelLmsiYu T6EeB
-  nIDA+hFCBstg/NiplT5iMb365BqTO2MkDDg5YU4zsu4KWpCBzywGCM5qUL83IBUDjFOdV3D 5h
-  83r2qMKu9s8jtg0KSlqx8rlqgKl5QUX5TyM1HtGWPAOec1OMoMZIA6AdqaQoRjz9aLvoK1tyP5
-  JeGwvFQuqqgIP3jx7VPgHAPOB2ppTn5iMKck4qnZE31K7Rgjbn5aidh5RIyGLVaPKjjqQTgVA4
-  GT gYPai19Ane5WkwUO3GSvPvVUjEOHDZP3jVzcykEKHGeRUEjP8oIzlc5os27Ar7dDPlUBDyT
-  gd6qh Q4DE5GOlaLKpBBbnghu2KpOGbG3AwcYx1pabLc1im42RVZQMAfMQccVRdWBPB4/WtHcC
-  zYwMYxkV UcNhgSFPv1NRJyi1clU0tDPkj+QsoxjoRVKUtvywAbPKitBowoIfIBHFQSKu7JUlg
-  vBFVfTVaj52 ml0KZA8rHUkVWdNx4OCSO1XnRwm47QPYVHngYUgjgn6UczW24Nte8iu0P7/ZnO
-  By3bNI5bdtVtuD gD2qVl3KnUk54B5qEI7H5R8o4IPWq1t7zH5takYBUMAQ3PIApuTsG5SOMmp
-  2iCsSScDrTCcp9OmK 0g7aolct9iONgQoZSM8g4psgCjG8D0OamyA2DgAdD601gwTGwnjk1Upa
-  3JUnFpWKyjM2Mjj0HFQs NpUNkGrMqb4s459qrEMgALDnnkVKSfW7E3e8iGQ5Dbhxk45qkcM+5
-  RkYzzVxtxJBxVSRvLj27eB2 xzTUWjVL3fM5bdu5cnGOmasjBb5Qc/xH0qoqhQyuQ4H3CKsJIq
-  hVJwT61PNFrTc5X8PmTqHDFj8w xxjvUy/eUkblzVbcywkEgNnj3qdJGdQw2/THH1ocnbUtO9r
-  lsMoBKgc9DntU0aYLfOOeTxVdFVnC qdwPX2q2VUZ/hI6AnNSk0xNJK1ydAqbSRxyOKmjznAO5
-  umPSqy8sMg7Satp/ruy55zitG0tLjUep MnDHnBJwc1aViCxwuMDjFVwvPykEnnpVmI/MOMA9c
-  9jUTit3qhuS5kmizHubO4AAHGMVJ5W6bI4x 1zTVA8zkkDA6dc1PuYBduGDdRilG0dEaJuOqWp
-  biIZUyMnGAR3FWlCrKMc5HNQxJt5bk9QasY3Ho cHr60Kd2Qvi2FRMLnc3XkZqwi55JyAM9OlM
-  wwwCNzZxVpcKi5BII5NJspxaIwGCAhSvzCkO4NIcY GR19anZQ0eAxGeQKiAwzNznPSmttUSo6
-  7jDhkI54HNR5CDBU4PerI3BMHBweOKMA4LY9MGlJ8ysy tnsVuSS33jjj0pVA8oZBJ6ilB2DC4
-  INOB/eqTzgHJ7VlPRWG4ybsNwwXJztqVI1eQnngc+9NJY8h SwUZwKmjBUHaDu6Gm9tB8slG1h
-  8cYAVlIPHI9KsqpUsRjnqPSkAywBG0Hmp40Y4YDA60r31Y7skT HIPHNWSmTnBOaIugAUk44Pr
-  VgKCRnuOT2FF1zaISs2EasEAYc/xfWrKAZGcHmnImX5yVx2qcLjrg 8gCtZVL6Gb3uMjAMmATk
-  dasAMFORwMjNKoDBmA4AxkCngcKAwx1JxUX1vsauOl0AjcL1JJ9KFG0Y bIXvkVJltz5I+Xoe2
-  KeD8/zY2gdxQrtXHPoQhQWODz2o34l+bgjqcdak48wgKeRUY5yx6elVGCl8 RUrdxMKzNn74pp
-  B5ZSCdv+RUu1g7BsEY5I44p4iw5wGOzGMd6TcY7shuKGbRtweh6cUzZuBxk461 OVBUNyAOcUg
-  VA+TwGHOegqVKz0E3G2pA0Z8xSMgEYBpmwGIBQwYnAFWvLyowR14B707YWkDKBn17 VV0yeezv
-  cg8vJUhcr60YViQcepx2qTBE2F+YL05qdkUpv4B6ips2y29SiYmfaoOR700pubGCSPvE VcyNm
-  Rgtn8hQyhWyMHjPHen72w9ehRUMp4AGBzTtpJZccfSrZ2luAWyM8DrUQD4JOeveq3VxWSaZ Bz
-  zuXk80pUByGyAeKsnHA3AknnjimOiqAyEhQO/NRe+yFomRB9qrtBye9OC7lc8nJAFLwpC53ev1
-  qVscgpgZ7etVDcmWm5HgkHLKoPHIpiqozk5Iz0p2wZY88nIBpM7fw4OKculgcLIUlQvUMM8Uxs
-  bQ B0J6UhHXdxj7tHCt8x68jntUR0eg9JdAfaCSDjB/OmMOuDkdzUoG5GJI44qDJDY4xyTQr7d
-  Qcbaj PmKEH2PSmO373joD1p5kyDzk9uKiOdhGCxYZAHatNiZJW0KsknynYnUHr2qEhfKcsSTg
-  Cp8DhQck dRUDhxk4BBIzipUo27AovRFaR1wV2NtJ49qruy4wePWrxUkglehPJPBqiVLMpdG+b
-  7px6U5W0sSr NWuVSueR8ueSTVaVSJDjGR2PXFWn+8wY8fyqq4ypK5OTyc9qvlu9TXZ3KjKTzz
-  z0qu4ZigVSMAZP rVp0G9gAwBxwarMWG0cHA/GsrXbS/EpQbTdyuyHYp2tg9vaoVAOBwT3qSQM
-  yr1X09qjbakxIBAzx n9avl7mKg2vQYygTIRkgdcetN2/OCGUDrjH60/c+8k4BPI96coACse+d
-  wqm31HV5lYjZSWzncoFQ uA+8N8oB6nip+fLZsgI3AJpjnEm3cuTgn2qU+wlK1m27orMCFUBSx
-  x+VNbMkZDvhQw6cVZbAcAq3 3aikAyApHyjn1NUpN6JWDmTXvIrOjAMVO4KePeo5DuAyMjPQda
-  mLAqSoJBODz+tVmz5WBx6moa7h K60KrszHgcjrVd0weeHHUE9amcMMAAnjPFR7gG3OTuz3rdt
-  pJi5mk9NDjY1Ckclhk4qXc2NyqDt9 qrhpRMWG0fUVKoLBN5Kk4wKiCVtWh6W1ZIrSyFQw9uB6
-  1cVNiYPHTr61WCDBJfkn5cfrVtGVsDna RkUpaPRFqXRLQtRYCAMRz3FTRsr8569/Wq4XbsBwy
-  Afw9asqMOjDHoBRrvuQ5R5diYKckndhTxir kYJfBPbA9qpBf3ipuIx6981eiwG69u9DslqSk7
-  E8ZXcSf4atxIoB5OOvTvVVQQdv97HarUZ+RgCB kd6Tu9i7K9rFkDKqGJyeQfWrUa4b1I6jv9a
-  rK24qehA/KrW3d1ID4AIHem22yox0szSiI81iFBIG M468VYRfnXBHIyQfWqUHAByx46DrV5cG
-  3yMdce9Q6coshLWxajUAZHJx6Ui8rypIJp4+VVLNjIwf rSlHVSgOQeh9Kuj5lJ20FH3nIxnPH
-  HQU+OMAgbx170mweuOak2bHBYnJPWsp2u9SddiCQAyqOCQM getRyBW4UFcdfxq2RkhsDHqKjc
-  BztIyM8047JNGvw6opjG3aMEr0p467SAwJ6etTCNR04zR067Sf aiatr1BSSV+hCissnB6jlT1
-  xVuLcVCYBJ6eppoXBUgdanjC5zv29xU3VtiZrm1QqowYHGOO4zVmM MiNkYAIH1qOMLvwWOSep
-  q2MK23IDDgZp8y2aKtZEkZBwRkgdhU678BAvPeo1Q7hhGUnnHtWiqsij GDgUKTWwJxWlhY0Uq
-  ufl9asKijhQTzknPFRhTjnk+1Tx8NnaQQO1G+7EpNdAC4fKjqeRTzy7FlAz 0FSMoDhiflJ5FI
-  yoZFzk4HUVSSkwbjfmeg4YECqy+5NOIBU4GfWgKwiOG3YNOLED5lJ4OQDUcqWy CPLuiLYdvA2
-  +uaCoD9Rn0xUm7jHQ459qYUYliGUn2PJptoq4m1TgnJLdvSpNrA5UbgBg4pyYwO2R wTQEGeG3
-  AHHB70tGzPnSViHJdQudqmjywAOSeOD2qUtiYkqRxT02lVyeAMe5qrS3aNZaLyGKpEee G7ChE
-  lckMdo7YFTortIG424x0p4HBA7fr7VHMldEvV6WINiqAARuxz7+9KBxlVJI7VYSIPg9Oxpw T5
-  SF7HiiTRL1ZXEZZCSoUHpTNjM53AD+oq0uPKAz17UeUcdOn6ZpN2dmVJJPVFOOPapY7d2etMZN
-  x6g55NWyCpyB8gqJl3AsMD1HcVUVuwk9SuF8sZUA7h82e1MJAZQG3ADk4q75bmMg7QD047VWZd
-  pb ONhPFQnd2QWTYwEmMFgHOeMDt60jH5G2jvnHvTmXLjnGeDjvRsweOctiqtswirDQDu+cgHr
-  UDKPM IU85qUgrGAw7kdaXaSm4FQT7d6ak4vUhy1uRKocc5ODUe07sEEkH5cmpTGynIdeOuPWm
-  kqOW6ZOM VUXqW72uMDsuflBye3Smg5U9h796kC/IvB55qJicjAx6ZqHHrbUl6sj2YZm3A/3eK
-  h+UPnIyM5NT uGB7HsDjrUL8IitsPckU0iZOxXZ/vBRlgM8dSarNllBww4yee9Wn3NI23A4yOK
-  idiJFBHUdaFo9E XIqtln28mPqaqPvxkk+w7c1eGwyDaedvIzUMoIySc5I6DpTcrbg5JOyM9lG
-  7aMbcYyahZG3ZwVxV mYMQfmG44NVnL7MZ4GOPem17oc7lqyo4PlhmPJPTvUG0AvjnuAetWJFb
-  eCQWAOKrudr5b5cjj6UO zVjRp21e5AyDb5jbunK1FIC8KnGORnI6VZO10DFiD2FRE7l2nqR0q
-  rS00MG0upVIyhZM5AOc0pGY 9+04IyamG0M3XpyMd6Yy/uxgNucDPoKTTk7GvM7bkW0AxlsgDj
-  BNI4ILYVSfUjpVoRAHghiOlMyN r7sY5FVdOWphKzd2yg24yE5zkYxUbxnJIzx0NWnQhAcgnHG
-  B1FNO4xkk4XGF9aG23p0HzRVuUqMC FIGM9yRxWczvgkD25H51fdWWQ5yQx6elQOVKkAAkrkjH
-  elGV9C9tTPJJU/KzkH17VCwBRhkjPTNX MAnBBGRyAarSZ2hgQMcEYpxbb1By10RxAR2DHaw2n
-  vU4wEDclx0FRZPnbVHB65NSr/q/mwSPSnaa 3WhnGMpOxIkYcqSSM9BVpOAAgyqnGfWokRTJye
-  /SrUaFM9CSc1LlZ2RUn/Kx6D5k3E46H1q2QTMv zDnt6UyPY0jZHfr6U9UbILevH0rSTbI5dUi
-  wIxuDHd+BqyobrjPNQxbVcjdk+/NTICrBdrgE5JJr K8upspa7k6glsAkHHFXUXDIQM4B/Gq0b
-  KNvRmHJx9atBQNrBjgHOParcrWZLm5aNXLShCFYkg55A q6FGdzHn+9VWMANuySAMgetXI+Y8k
-  YO4Yz6U7q17ii2mWkAVVbgn1FX0j4Udx6iqaj7gHJ3VeiBc 5OSOq4qJau6HfXUsIw2gn5yemO
-  lWUzk4Xgd6gj4QYUdenpVgYJYsTszwB1py2JaSe4w/cGfv/Snq uSpY8gZ5HWpAAyBipCA85PW
-  m8Ky7eR79qhtWdhJdLDFUsxIZcdcYoCnBJUkAcU/bmQtwVHXbQwBD Ku7pwM1Tir6s0TuiLAJw
-  x6DnFRNwTwc9qsBMQvkEnIwaTaRJkjGBSja9nqJct9AHysw4J7HHFSIm HHTBHFNXAycZOOpNW
-  YwrsgByMZIrOTsrlNW+YRhUm5G8Hgn3qxg7iDgcYyajYbQchWXqNvepskjb jt8opxSdmPVsmj
-  JyAWB9eOlaKKTlgRgcEVSjGcHaScfSr6qCPQEZNXNx6E3k1ZE4BXBYZHQU7LC4 BYZBPUUiqRG
-  AgOc5INToEIGckg4UZ6VKskNNpa7j2GSBjjGQaYNocEhvb3pyZUYLAH3puO+B6del LZgiTIEn
-  Q7j2NJ87yMT0xmmgsOh4A5yOTTgrErjOP50k3uUoqIMGRiw+6Rkk01sja5xu64p0mTEQ 3AzTC
-  6tHySCOo9adkyYRfVCnJ6nnPrT14kBBAznioYwc7gc46A1KhJcswBXODijW+5vbSyQ/hijb Xb
-  Pp2qVVTzM+vWmqpUZ3LjPSpgqFxjj+9k03boZbxtIMLtAyQc+tSIAYzn5cdz3pCwLYHJ7Yp4AL
-  bW4XPPNZuPViau0mRgMsxKsGHoKmCEkYU8ZIHpT9pU7sYXPFNAdZyVILMc/hVKTa3LsmtBCpOF
-  AA 9OKWVBv2jPIyTmpI4280biAR2oCKfvE49aUY31bM07S1ICi8ZyQOvNQ7EycffPUE9KsnAfB
-  ySTz7 VGUVXbB3MT070WaepSVr3ZWdWCbGJwOgqJjgJ3HHFWnDOw5xyOMUwqMtjHDdT60NpbkS
-  baRX24wQ jYJORTXIwoIwR0+vensjEAjPShozgFCpwDmnyxHBJdSAoG+YZb0GajcELjcAMdKsY
-  /dsCME4Ix2p N2YBjacdeOarm122G073IQqrGzFWwegJpjBSwYKcE8CrBi/dAksuB0NDLk9cY6
-  ij3G7CUnzXuVDu EgBztHTimEDByxBPSrRGXwrDH8xVXYJGAPU84pytYaW5HJneMsCOPzqFhuY
-  p1OcD6VaaLGOMAdjT HCBgWIBApSfREN32Kflny8HOcYB71DJEzHjqBz9atOPnznGDnk9KgYP5
-  Xy/Mfapemty48zXmUplI A2qzNjGRVd1eNRvUirrABn6g8d6pS7i+SSf5E04663G7oqspI3EHn
-  mqzFVG4DGD3qydwbaPSoJSu SvGT2xVySJnLVXKxJLKvzZ5JNV2A8vjax28DFWJOm3BJPTFV8f
-  vOeBSslcE7FfgpknbjtSAF5c4y CPpxVna2SdoIz3FRHaGyM5zx70k09A50lfYiKBo/pwDTQCG
-  yvOGxx2qQ7NuQrZDcinMP3jHGMnkV TSSVyXKzSRE2M7h1PXHemeWrAF+GI4FSbQhAOPahm4x0
-  JPGe1OVraAo2d7laSNsIy8YHQiq0iHLs WAK4wParxU8gsT61CwBWQMM/Lx70SlqiXOy5Uigy7
-  pGLbj0JPaqjhWkbI2kdavHeocYx04NUyjA8 nODyfU04xS2ZTs7vqUnwp3AgfhVaQFXzjapGST
-  V+URhlGeRnI9OKpH51XJ4C8+1XGTetxKz1OGRH XcDx9asx7gCQBuxk8UkSs7Efe+lWYlZRtI3
-  Ang+tSut3sZ36WEVC0W98KCQRjirKFgQMlhu5zTNp Jz2z8q5596sRxEfJyxJyOcmlLk5WaWtH
-  XYcrMJNvUHjA7VaUoyqSTlSAfc1GigTjIx681ZQASKcZ BGcinFWjYVknZDgpzvZhjdgECrfBA
-  ywztzjHeokUgbsrgcnI71IpJVeV3d+KUWzRt3LUWBGDxuPT /CrKhmlIJGR6DqKgQgkbcZA54q
-  ypDMrEgHGc1lZpkJ66Muop2oCQCO/Y1cQfKpPfpz2qpGcBQCNn bPfNaMIUJn5S49appvcce7L
-  MKhSGHIJAq3GoTGc/n0qpHxKp6gnIFX41LMGOMHnFJvuOTV7lvomF GQCSakKkrljnIzxUXcbT
-  nd2FS4G1T/CB07inTTRCg1G6Q4DCZVlYDOOKcf3sYIHJ75oiXfvDEKM8 U4K2xQqkjtVcqva+o
-  S27jUTG49e4pxUKvuRUyjLnbkAg5yKaDlScZGCOnNZ2uaJ63IGTjklh/CV7 077rDb1I5BpzKT
-  EqnjIwKbtZVGeDuwM85qVDogatuAWNwDnHHSnLgElTtBPODTiCGXJUIO+KcQuM cHb7VUlbR7C
-  +1zE6BSGGak27skZHGefamAEFdoABGcVJEH5LE4PAzUpMaSaumWYlZpc89KuqSpxg A9PpVeKN
-  hGfmJz6VOi5JwNpB6k048vQNd2WflKhs8qe3enqh3lhwe5ojAEahirDHHvQFY4YHK45q k7PQN
-  3qSMVyCoJbvzQ5yFDEKew70oAIBIPB4pCSc5HIPU0nFNXQknsMD4O1OWxRhiAd4JHtSqB5i j2
-  60joAcp1+vWqtdGrS5rCgk5JwfrSkArzgE0iqQ5I5AGKcuHwOgrFtqW4SsnoMUjzAVOTnpUyqG
-  JwCPX61EmFbI5yOanVVZCyMc5zyf0qpRd7kys3cVIyRyGGeetTlcgEYz1I9qSPlQ3HTgCpQPl4
-  wW 6fhQpS26GbkubXoL1YN1xx0p2wALngE8jv8AWm/MHx3qwqq0ZKZLdDROTXU21vZAflwFcNg
-  88dKV hsdWxkbevvSbEaIspJYHOD3FO/e+YMKOnSiLu9EDbuG0GNmw27sD3poG3g5IzkAU8OPL
-  Kty9O2bc EDBxnk1V7XQa21GsmSrE4JPP0qDy/wB4SMjHUntU+zd1O0DjOaTYFLMx9MUrPl3Mp
-  S7MpucDLDq2 aaykJkcgmp9mVbODgcH2qEAhMA9+/an00NY2IAJGyCpOc5x2oZWBOVJ+Xip1yM
-  jIBPrTWLAgsCeM ZqVo7ESqW2RXwfLz91elRONuBjIq0yfNkg8DpTCAxUbWHGDRfUV0lcjHCjq
-  fQGmhOehJY1JJuWba vX0IzTdpI3Ecn+VDWgOOt9rkBB5JGDjBqLBRzgEsB1q2R8nIO4+1NbJb
-  aCuc8gindsV1LS5TzkkS McgVE8fI+Uk9B6GrLIxkZuFxycimFQYyRnccY5q7NLRjjZ7FNlLFt
-  q4GOaruDtUc5A4Aq0V4JAY5 zxUcnyxqXAXAqLaA+XoUXHOTgMB0qjJkSABgcDpjmtGQ5XcF5I
-  wapgNuycZHBJq1dxLc5LqUmH38 kBic1E5LNkgA1cypUsu0MQeTVNwBGScnPIqJxu1czTUpabl
-  BlIkKkcN055qHC72KqST2PNWySGJ6 ZHGRUJQEHBye+PSteW6syp9rkZHyg7wdvHHeowu5VB+X
-  6npUhIJxyF7+xpm3EuQS6Zx71PK72bJj OVmhNuEO5gR600xksfm3dKlUAsVwCucj3oCBo22sR
-  g0c043JipRd0MCoVBAbKnp61CoBlJ6kt0qx 5alzgkY5+tMkTanyDJ3ZOPXFOD08hyV3vqViWD
-  MMADtUAAMbnDcNzV4gBFU/ewMmq7HAYdM0SfMy HorWKTJukZ+QO/1qlInPJBbqeKuurByM4H8
-  6glRfMwW249aXO47Mr2fZmcY/nbcpJbuKptxPg4K4 xj3rSk3IWwQwHT2qhIrlCRg554HSrU0x
-  p6WbOTRcKu0jp2p4R3dQWGcZwBjFNRW81t3HHIFW/LO1 WBz+FVCavqzBSEKuBlyBsOOPepVGE
-  B3HjgGlBA2ZXI6kZ61MFOSI+M8gHtUxkn0L1vqCLgjcCy9R irMbbhnAwTUfV1Gff6VMgJjOSM
-  54IpuF1sXZrccBhsn0xU6hWCtnPHWmqNxIALHpx3qVFAAUgg9R T0tpuVa7J9gRMqu7ng1cjBf
-  kId+MYqBcjb0VcdxVpEODIWAHQYqOawrW1ZcjRvKAPQfdJFXIlKx9 MYPaq0R/dBScqOM/yq6u
-  4qQDjP3ie1SnKXkTF9WW4wjELnHynbmrUKu6Zx04OPWqgTJ3dyOFFWEY jOcnHUDvRGBV7rQux
-  qI5h1IFSnIQHI46+hqDkhSowD1zUysFbOM9unQ1ST1ZKvfclU7HyTtB7GpT kP8AKcHGc9qiLo
-  8Y5B569Kk+UF9z5AXFZ6PdGkeZvTQAoZSQ3OOMVKoHA+YZ96jXbs4buB0p+AFT HT1zV811a5k
-  m0mMdVDKc5YcAf1pz7gABjOeR60qjdIWOGbOOBUgHO0927dai7RbnZLuQqp8ojg5P GR0qRVzk
-  cYByPWgrmRuRweacOH9QAMkUpO6Ls2rdRyZaQEHoOKurlmxjKkn8KrxjlvlYgAbWHcVO AQ27J
-  UEZxUyV3oQ4q+hOmAo6lhxyasCNkbkbh0z6VXADMVGMjn61bRSF+6SDxgdacUoaopavUkVf lD
-  EEAHGKtqPkLbhtHU4qFVygKhgw65OalQ7WOcFcYx6Vo5NqyCK0EB+Qb+mc8Gnkcnn60KMLuJVu
-  OlPADkAg5xSaT6FNkZjxFuORnktTGyd+CBg8Va2g5zzjpzUAYBSpPKjAx3rNNvVgm5q1iMbg+5
-  iM GnjY0nJxx60vCg7uv8vakCZBCg9eM9vam2xqKd7jesgUY+tSqm0gZKkN/OmquJV5+cE1MQS
-  MBWIB 5x3o5ul7FbpxFO8QFRjcDgEDFTAd8980i8QscHr370oYttIwfUY6VUddzLWyViQEuwcL
-  x0x71MIg sg3NhvQVAMEDBBqYN+93MpB6VN0ti32RIVO9FXovBNOZk8rvjOajDHL4VmPfnpQAo
-  CyNknqc0Nu+ hDTtqA2vIxHy9+e9SM7PGGQY9vaoWc7vkA2njHpT2J4weh4IpN6mjSVhCwNtzk
-  c8imhwW5yaeXV0 wfvHgimAgwbOMnnPpSdiXqtRjfMSNw44ppXBIII4AP1p3zFCSm0n1poAdwV
-  JIHv1pxTfUUpRURjf MgGCec5HpTOOOScHpUw+U9Rnp9aiI+bB45qvIhNNJiEjzCOCc81XIJGS
-  cKDxVlgmCCGwTkmmEHYT jgnkGpSHpazI2PAZjls5pnU4XIyM89qlbaoye3603PzBR6Von0BbX
-  IzGVjB3fMcd6a6Ig3KCSelS KzZG5lJ9AKYzPvIUA49qmfNcabvZkRVmPrxVQgnGTsA447fWrW
-  87sdW9B6VC5UA9s9c1pG6bVimn flRXO7zc8kAdKjdQ/BwQRwakKbpAobnvzUZyCNvPH5Vb1ZF
-  7PzKpxxuBHWqMwMaHaR16H0q6yZbh sZHWqskZLbWHzMRg1DXW44pLR9ShKm0jZjOOAPTvUGxV
-  XGc8cZPNaJUeaQB8o79aqsuCx2nJOR/9 al7Rtb6jnJJ2RU2ZTpxVTb5bHGSxIAJq6cknquByP
-  eoTBlGG4jnijp7zMltuVCoZs45BxkHFMZSk m3ORjmrAjw4Qk8rwfemiP5sSAkY4x60pWS3NFN
-  dWRk7uCNvYkDpQFMbcuNwbn3pxXClgSQH55qRg JFXbg85xRaL3FvsiJRuGQcDviggAHoV60rB
-  vNwcbc9vamlDjCnIIyfarml1JnFt3RWLF5gwUehpr Iw+7gZ7kVO+PLHzDcBjAqEqWAUsQuKUo
-  p67B73QpNgxnI46E1TYARu4+bB6E81fZFIAzuJ549qqS EFCF7cHjpVJLboS+YzphnG4jBPQCq
-  sh4I5znn/CtB9rjGMcdfWqZCGFjyR156k0TjJx2L9pFnGxq fMyh3DoWzmr6HcQQQFAwR3Bquh
-  CgkJtbPSrCcHOzAPIFOfvPbQlwdlbQWPltpzkDPPerQ2uQO55x moFyowV+dhj6CrMZBTGVz6i
-  m77obTTv1HoFHyqMnv3qUR9DuBA6rimffjXt1JPSpVQqc57c81DXN G97DSVrtEyMQqEkKu3nj
-  vUyguQeD6moE6fPkZXFW40AT7/A7DvUyShHmsTzpeoLndllZgep9Kuxf fycBTxj1qJcCIY6Ed
-  KtoFKHbhmBHAosmjWUls0WQAYuAQc4q8v8Aqxz04J/CqcI2yNuGVbnirMfz L8wwrGny+RC3Vn
-  oWoyAkec/1FWdzcEDI6Zx0quNm8YVsgY61ZjdmBjYqFz6cmla3vA9XsWBtaPqd 3bmgEp83U1G
-  pAZeQewFKchGJKjFXzW6jhF7E4O0DcAR6YpxfdI+evrUIztyD9OetPjIYnOBjrxWc 5ajhuy4j
-  qVPTcKC/Izg8c4qsjEYHr1yKnj3CbgruPXNTFxTuE421uSGTbGxOcZwR0pQ7bgzfIoGe e9MRC
-  7fMAFJ5Bp7YRxhhwMYNXzK7FzReg7ftckc5OPrTxnhR/EC2KRM8Zwdwz0xUyBAoAB3j37VL 5V
-  uipTfzHxgkK2GxjHWrKLulYMCcjiohyAEBwD1qZQwAOwnI5GeRSbbegJ29SzHtwOhHtU652lhk
-  A8CoUVi+1Qx4GKsxAlCjL3wKm7QNO5KNyE4yccE1MBhF4OGODxzSLtzhfQk89TU6nCrlcccE0+
-  Zl uOl7CkDYAuOOB60zHzgsCMDGalx3GOCOaNoJ6d+lUpaWIWzGlQ2WRgcDr6VAIv3zn7pz909
-  asNhV AAw3tSEjILAsfSqvJBzS2uQgLyGbBznrSgENkfTmnhwWOFGW9qMZbcSOOwqeWW7NNle4
-  nzHqvfqK lBwSCc5NICVQkkFhxSkAkEDnpUu7Rj1JFEag4ySQD1oJONvyqTzigY243DGfTrSg5
-  5OA3ao6XLjo rpEgwgCPtIJzkdqewPOc7ycDPtURIJyMA+lAJ2A9fTmjVoTpteQ9tyq2Dg/zpU
-  IOM8nv6Co2bCqN wIHWmFsSkLycVbV1YqK5r3JgMHJ4BPp1pWkUbcMMDrxUCsW65GKU/KNhIPv
-  ik4rqDi21Zkm8M5bg c0ib/M3ZGMYxTVwEw2cdqeWOMEZHqO1K6UtBuTfxEZb5iSdvfB70hJ3c
-  MOOOO9KQpTK85PNLwW2j gHkE0732I0TuxXOFUNgjPaowuG9QelBY7SFBLHoKZLuZRs3Z6U1Cx
-  UJ3W+4b2LfMDjPHsKc2S3yq eOtKuSfmUjaMGmM4XLhjz0FK6bIabdyPq3HU8nNBC4BwST6dqX
-  n5W9RSbcgNjJIwMHGKvbUf2tQY plQDxVc56qeTxxU7ECPbtwRxn1qAqWIw23mnF9w212GFSkY
-  cDJ796iZg7AYI7kVLkrGCxJOcYNVn G2HGCSD97NKMXJtsnrfqRsjLKCpGMdahYAZ67/6VZcFz
-  klRxjmomAyOo9CD1q4yktFuaOStoVZFz GTg9MjHpVcjMmCSvy4BNWWO5sjdjoQDVeQMMEqxI4
-  Jq0/PYmWjViswKqRkMw64qiwyuOcZ4z3q8c FsqGI/izUEqKHXnk9ABWMnrsTblVmUjtV+Qy54
-  PNV2V/KbBHtVtwTKOhUHHAqux2uu4jGeKuyd+4 4SkVfmyoztz1zUhB8wc4UDNPZVKlgcYH5VA
-  MqMhs/XuKHZ2Ha6GFS0yqxAXGSR3NIwJlBQYOMmpZ FJxnpmkUjadoOQehqua2qKsnoiMKqRtu
-  3EgcEGmFxJz82QMHFTgATkHJ7gE9qCdqA4C4PTFDehjz cujK2Ar9Dnjj1qOUhRgnqRyKsSAZI
-  zyevtUDpiQK/OSM1EprqDty6FcqfNyD7/SqEjYkPOT0IFXZ AVZtp5J69uKrv5bFixPJ5x61p0
-  7jgktbGcyAuD0x0xVZowzlOq+1XziOTP3htwRjoaqSkHkcYGM1 HLK4ubojkPvFSdoBOSas7AE
-  G0hhnINVQyliuGzjqDxU68lAXA44AFaJPe47qysTocN84wvYmpgBt +XrVc5zgncegx61OmTwS
-  OmD9aSuVyJa3LKKWVWI9gRUirhMkr1PB54qJcLgAE+ozTxh2ySAc0byu LVq0noSInO7D8HFXc
-  qrKuDuyfxqvgg4JHJ4xUi/NIm48jk570NXd29hP3tyyhOzcAF6EAjpV2I5l VhwCpJB61VjIyM
-  9CfzFXEJyWGBk4A9KzS966QnGz9S4p3Jwd3Ye1PQlY2DfezkVXjOG5DAjjd2q2 CDyPmboT2NU
-  48m5TdtCZJMKWB3ZGPpUgXMI2MRjjr1NV4353KoAqRcsSobGTnPvUweumg7u9yzuV IVJznNPV
-  wR94bD0JFVSdu0EhlBwaeJPkZgv0HYVnpzXKUmuhYXJlYKSBjIzUqs3mKmVAI5qgJDuL Drjmn
-  7jhXJwCPTkVcXd2Bxv1NNJCi4Cgj37UAsxP971FUxk42tz2FWQcsDnaaizT0Iah0ZaB3oWd WJ
-  xnIPFSId4XYhZsc+xzVRSuOjYX361ZR/3gI4B9KqT8tRtcsdUWN37wg/fLZAP8qnwS2SSv4VWU
-  rHPl+hGAT0qwHYkuMYGOKrXroVzNapElvn5vfnPrVwN0KnnuPSq6BQ4Byccn2q0CPlLcA5/Cp5
-  rv QiW5OobOQTz29KtRYHBP3ujZqCLDtlQ2QOM1MgOz5x0PGKe+5SldpFsBTtwCOevapgmcr19
-  ahjIZ eFbC9h3qbpJ0OSPzqW+g1fqxBncV56/ypwIJUknOaQGTaQVBJ6cUuMR5wOOM4qXbqH2h
-  8h/djODg 4x3pmSX6hR6kcUobcSCp68e9DcnJ4wO9XDXQE9NXqMCFSem007arjKsowOlCnEXBy
-  e3eg7SQccjj IqZKT6h7smOHC4PBPOaRi20fIVGOtPx8qgkHFBVi2T09qmLSdw5etyJC4TcQcZ
-  qYAFjgZPUUDqVw fpSjIO3+8OvrRJ3Fa6GthGVQNxx1FNb50IB255Apejlt2frScoMDBOemKd0
-  hpW1AYCjcDzySaXHz LkjIprPztJwAOKRQTk8nPr3pNuw3orpbgN3mfMOvHBoBfcegUHAzRk7t
-  vUA8HFRKWyQScn1quYnV u5M0jgHBBPXpTEOF+Y9cjFMwBwTlh70pY5zlcAdMUou1mSmuxIvTq
-  SM9u1OWQZIYYOOCahVwEzkf 7VIXDBmAyQcGm3HZlpq6uWc5XaSBgdqrlmLDaQe5UCm4IkHzA8
-  c0xxhmBb5s8e1NJb7mkZa+RYZm DYztOO9J95sFlA+lRo+Y8MAcjJ9qRc7gwzjHc9KOVcphysn
-  C4TBIJ6cVH0bdznpjNGcNjB/wppKs oKsAwoW4SWgz5wzEnoKbzuwSAByD9aduycAn+lNwfIO5
-  TnGAattpotJ7MhcsPQ9jx0ph3NCM7Tg4 HvTmHOPmI9B2NM+QykANjHek3Ym12J8ipuY5YdR61
-  XOCQcgDv7VY6jrtB65qu+ORxzyKT9NQd9iB yGZhk5A4A9ar7vMxnltozU7DJ3Y4Ze3aoSAIsj
-  vxmqjazuVFt6FR2YSbVBIIzxUBVjggexBFWzgI eRnHBqrsJhUcjPOfWiTe6DmuyqyEKxbJOeB
-  3qFsHB2MMHknuasOSM5Ukg4TmoWGGIySOhyetOXMt yNempWPO5cYBppXC7QOVP5VI3DAAdev4
-  U1wGHOVLfeOajV69DRu6sR43HGfb6UwoVcZBwB1FThcM No3etRF3MhJVuTz9K0jonZkp6asGJ
-  6gD61Ccs5DKT6e1WAGw2VyQeKaWGSp6gVN0tLApLsVnBZkI IL4IpoX5NxYFyp21MQS3GMdc1A
-  WLnHAYfnSvpfYznC+xA5xGobBJGRxVR24G5So7/Wr5Q7SrMAcd COao/el28HgHPrTg9BK1io4
-  VmByCx5J7VUkVckHOPbvV9ioUjgLyBntVNvv4PHcVd3fmKsrHCs4A JzgZ/WrMeUAYENniqabV
-  y+dw6gVZQltwyFOKpT1aREoO1uxZGS2cFsnp6VaHXd2FV0w0KnOCDzip kxkgnPpUxipFddSwv
-  LbtrKNufxqwpRh3BPP1NV494Qcg/hUi4Dlic44wDTabauO/ctIMoRjkdR70 DktuBJ2kU2Mkjd
-  jaAck+9ShxtJ2nGaiKd9iabd9CaD5XxlSFOBmrkZUzAnIxyeaqJgK2whcc5Izi rS+WyI/8Q4I
-  FTK6Zc1zKz3L4KKp3MuC1OQpuPPHb1NVlEXKHnHfPalVUMm4E+mKrlb6kq0VroW1K hyACMjgV
-  JvZSMkZA9Kq4c5JcZB5x3qfefLBGCp7YqOZCV97DkcEAPkjrkU7IIJw3QnGagLjACgk9 8elER
-  z8vTHB5qancqK5ndE8TAncrY453U9STMy9eeKqqymTAbkA4GamRmEgUZ6c+1S79zVxu9S+j EA
-  MNp4yTUyliqsDwRVRGJj3YwmfwqxG6s+3BCf1pRm9yHpsifB3evParablTIxgjBz2qoGw+CDx3
-  NTxk4OMkHsa0c+rFzXLgctDtYAkdxU6nJJ45HPtVRFQg5OCe2atg7WPBA71CcFsOL5XoWULMdp
-  Gc 9cHrVtSTyV9s+lUo5GVCzHHt6VajYSBSSVHrn3rSLb2QSve7LaEqCBkHpmrqBnChuD1qivM
-  pI5bv zVlM7QxbDZwTUyfUvR77l0ElxnoBjjvSsZQpyQAvbFQopwDv5I4HpVgIOm73+tVFRQnK
-  2lwDOQu4 HI6gdxT+DyuWA5poOMNuDMBgAVIMNICflUjpWc22tQe1xSR8u0Y96XaQVx827nFRq
-  ylM5LY6c9KA SGJXp/DSSsKy3Q8d/lxzxgUhQEv/AHjjimCbkECpl4O853N29KPeiXyu2ogwSM
-  UpyJNrEEegphwT nawPQDNPUuGDHAOeuOtCVtSLu+40BSm3BGCSDSZO7g5OOfanNnftA3c9R0o
-  OMt8vQYzVPcL3XcEC 9W4PrjioyzHKtnAPBFPCj7rHr71ExypAPvRC8gTtLVXHMGCbmXcN/FRj
-  7/3sAngUMSyKCTtHPB61 GrfvcnIB9fWlumXyt6Cl8ZCgkg4HvQCGIDDoeTmmM2COmF60ze2d4
-  6UPVE8rS1JSwK8Yz3JoJ2jI PamEfPnIwByaVFCpkHdgnrTjZLUNtRCyliBkg9hT1wApXHI5qM
-  AGZmORTcAcjI9OetVdNBKVlZD2 bDdB1496UMG6kEDvQHyvPODzx2pnmDAIHOKSetlqTZtbD94
-  4BXHbPrTgxZsggKBgjFV925+AQONw PWpMp3DdOvrVyaTVg9nJLUkZcg5fIJ4+lIGb5sLxnGaY
-  7sQMD5T3xSKxZckMOefShXaHeyuLnEpU jk8k0g3k/eGMU0yKxwMjPIJqHe3lY/DP8qOVvoFlL
-  R6ExJD5TaOMHioWIDLgjOMU4EBipbf6ketR yKu4NtIbriohDUGmpWSGEkqVZgSOtQORuAU4PY
-  VK23ZuIYHBzUJx5anBGRyaq73CU2RFzu29s8kd 6rktjpgZqd3BO0YA3Yz61DKWCAYAI5px7Eq
-  pJ+RHKoVMnG4DkVUkOIQR261MzfvWOC2Tk88VH+7U 53cEcjvTk+hUYpLUiYq0obepxwBVZ2Bc
-  hlzj0qaTBwwBHQAmoHUMc9+MAGs7q7uJWIcrszg49M00 kH72eRz7VMyAOFHT161C3DgkgjIAq
-  opJ3KcvdtEQBOmcHd601lRZGwe2BmnkHeTzuBz9aQkSOR1G 0+1PmSepOuxGM5x3HvUL5DtgDI
-  +YHHWrGQkJbGD71Fu3tvAbrg47U4xdr20HKKWr0IZMiMltxBPH PIpgUKpZc8HP1FPk3FVCklS
-  agAMjKORj360ON1uRb3dxj/MCWIAJ4XviqzIFlPUMOOv6VYZguAyM AD96q5ZndiQpHUcc+9Uk
-  76E3sUpN2/bwRnioZVxl3bPGAF71ZfiWQH5cEYPYmqsvzYK9O496HC5b fVs84R2AYbcYOFwOt
-  XI2yyMM4Ixu9aqLtL71O4dMmrkbjcowvfpTSM38VlqWo/uBSWUE8GrUYVYz 13AcelVY8BWx85
-  x8oqePJwSu0AHH0qlrpcat1LYHyqADgHjmphjaQeR3xwahRlEOcHOelPicknO3 g4pxTWpa12R
-  cGQcDC80qsFnJwORxTIySoB6E8kdqmVdvyfKMEjLd6ykv5jO6UtSRPM2nbgKfUVMv yocHAzjJ
-  FQJ8seSx9zUyNubJ5XPSqjF9Byk2ix0ZmXG3PrVpWROSBheCfU1XQuWZSVUDse9SDIJY gHIII
-  Hb0rKXM3YrSyvuKwypKZVsjK+tSOSFyGyR1wOlKq/KRnnHBoEacqWJPpnpU86e41JOOpHuV UG
-  0Zz0yakRgRjODnJHemupOdowMcH3pEG6QgZB6YNNxTSuyNL7kvfK4BHUkVYiO5m3lcD8KhWPLg
-  kZ9hVlQHKlcHPUd6hJPRG0dOpImAdgJXsQasxjawAGMnkGq6lVnJxnnH0q3zkjPfGarpsRK6aT
-  ZN jhufoT0p6SNtwe3GcVCqknaCCAM4qYcKwzuz0AoXK99y5rSxbUq8jZbGDkVYT98nU7emapR
-  D5iww uF6N3q3CwEG0NnDU5abGMrpouZIk6ggdqtRsocgkbQetU+d+TgjHFW1I2ZI4OM02rW7F
-  u76FtHUZ AxgHHH86tR4xk8gjNUozk/KeM81YXk/Id3baPSlyrqLmaL4KhAnDDqMVIpz8wByD6
-  1TUsspzjHGB irHKwBjkY5PpSa6I1cLJXe5L0bOQAO38qcSdyjrtPJxUR8tlC5OCMHB704AZXL
-  EgHnnvT6ahovUc NoZiCMN93NOVy0Q2j5sc0HhBgZOO3egHK4zjNRZ9NQUtbsXy1IOVx2z2Bpx
-  YiM45IOKZvJbB4GOD mlj5AJbJx0Bq9be8TNO97kjcw5CkECpVKeWrMGJpMAZIIwRSbcBiTkbe
-  3SpWqNJO6sKANrMemaib 3O0HvmnAtnnOBxStngEgVPK76C5bakIyvzDP3T15pBhgMEBunNLkg
-  YKlU7saGIVc8Z6gVdnuydLX IwSHbcQRTWcA4bkAce9O6zcDJpSMYbIwexHUVOtx8sXKxGCDtI
-  AzjPPvTGxtH97HSrG1WTnqTyem KgUDcSwJYHr2qU3dg1Faobt/dkK2455poyJFye3SnbSJSRy
-  SM8dKMDhwwIwQRWkX3JlorDRsaQBm IGOcGmlSAQvOemKGCbG2LknjOaQBgpGeBjH+FCknqNKy
-  0Yi/LhS3Q8GpG7kYAHQ0w5CnC5oPmEjI CjuSOKaSbuym2noxQABnrntUaSFUwcjnBzSkgnCk4
-  xnPpSAkldwHQ9qclbSxMpRa11JztI+U9+/r TWwS3BHPTPeoySytIBkdsUwlSmWbIx196m7urF
-  RejfQA2JFO0/WnbhkgLgYz7ZpOkQbjpjJ70xiG CjPA5JrR8vVC01Y8bcBdrHb6Hk1GTtbC88c
-  k9qeCQTg9fX1qNmEfmF1znHA71mnYzbTZE+OVyTnt moWYlAQOg4FSN9/c+cnOMdqhyuOWyQO1
-  XZNjjdvQY3IC7MN14qFiRIBgZxzUhwW3Bvm9PWoiSykA c5wKlvUbkra7EGQf4TkDFQE4dhlcH
-  n8KmLDldrKCeCTVZnLYLHg8VTTew4yitRsg+UbTu9PYmo3A DKBj1OKexAcEHPXP0pGZnjGAAo
-  GCSOtDctmRyIiJXlSDuzzjtSPFkDq2R1HSl5ySwJHTI/lQ27dw VAz0PahSl00HGTjezIG/1QQ
-  NkmmbFVjyW7A1Lg7MdRnP0qPYCHCkqpbrnpTcrIUX2InG6Tg4cdc9 KEyqjcCpPB96kbAcgr0H
-  B9aYR+7BwxGM4pSldFtXepAWKv1xlc4qAtnayDDemanckS/dzjp9KiZQ qgMTg+ntVJkVHFWTd
-  iuQxQn5iOpx2qB8/MAwBY9D1/CpnPyl92Ez09aquTztb/cNJe90DlS1uR5U qM5J7+1Z5YbiGB
-  9jVuRm5jUZ+YZPr61TZAFDbScngD0pyavYSTtc87ixsQKeec1bGFkAABHXFVVE eGVD1PAHarE
-  IXzVdcjj5iTVuV7a3Q4zsrXL0ZGwFR0PHtVhRluCc5yQD2qqpyfkOBnknvVuJwpAB DNmjmdrk
-  pxT0JwvzblBOexqwuSuCAORg1GxYxZACkHrUiBccg8UuZ213CKb1J4wc7WPy+pHWpesi gnAx3
-  7mqyHMyhmyAMfWrAwYgwHI9KLNOzHLe5MpZiFA2/L0I6VMpfy92Ax74qFEK3GSTyKl2soAG QW
-  Hc0khtxvYsfwDOemCfepg42luhJxk1AjbSdxUknke9TKA2A3A5ODWeq0Y07bCgsfunJ9RUqFto
-  wQSSckimxhAxxuAx1oVgZAT8v8PNOydgt0SFCfMRlyoGSe1SAbWUg7gOtOU5+RjjJ/SpG3kHao
-  Ax 6VEm7ibb0sEe5pl9WP6VPG6rMAOQM9KbhgDgcjgZFS42MQMZzSdt0OmlLRk6KNnbGD1qfLG
-  PCkHA HBqBAzIvb1qwF4AXk45xTstFcTjrrqSKuCOeCcilCsJFJI46cdRSD7ucccZqQuCOCMk9
-  xT1T0Qcz Ww/7pJDAsTVoEBME8DgEVAGAO9zyFySasRhfL6gA9aTk1rYuMu5YTaxXBx3ye9Wt2
-  EUDOD1NVkOY 0Cge9WAm9VVux4NTz2SbBSu0pFuNj5pXv296mVtrj5s8cYqpGnIOcsTwAasoGO
-  1gvfJ47VpHlLdk X42/ixn6mp9w5YHPYiqiq52v0XH51KuTwpyAMfWhW2M5RVxYx84fIwRwDVl
-  eFAAzk5qNUBReMEDF OG7ewOQc5z2oqT1Vyp3k7IcMSDAzx+pp5RgrOoBbHI9cVEnXjIXNWTnp
-  0PbNEk4kt9GRkBsDjjqO 9TZ4Hy9+/eoVADswyTmrC/NtJBA7kdqzfmXJJWHgfJ0Aye/anAMmV
-  fBBHQd6a2FOSS3vS9cAKWAH WoSuHKnsxrcIOABngnvTAGLDPzZPb0qXAaPAwwz1xSqsm8sF2g
-  DtWnoKM+UY4zDuOcg4AqJgzDJA Crz05qwpyQGIHHpUZ3BieAOmCKIprcIbtkeDuBxgdeRTScg
-  579KmGSF/rTHUjAGCR6UpJXHFvqQy sVxgY4wajA3YBOPpUx5cAjnsKT58j5Rj6U0tBOViA/cA
-  2sB2+lLtJ3K65QnjHepmXbGV5bPSohu2 YY5XOFIq17y2Ji7bETDkAYVccEimlWEYCjJBqT5WB
-  G7GTwaQ/e8vuO9Zv3XsU5PsNziIE5zmo9+S 3JxnkUuG3AE5UnimswHyMMA9CKtJkpxTIyq/L8
-  56dzTkILfN8x6AU18bhyO/5Uwbig5ByOaJ2a3N LpbEzPhBheD61EwJwSvy5xigMxIUMoXqCaY
-  pVW+ZiRjjB604NWtYjl0JQ5CFcj5egIpuAYznAx2P Wm5J3E8YOM0EER5B+b0qWS7XGFxtLc4J
-  xj0puQckndmlCtyTnHVhTAp2sBjHqa0TQ1roGVMuVJK+ lQyJG+4rzxzg0YAPI4J4NNYDeckjn
-  J96lysEbt77ERDBVJ2kN7VAygMfmIbPNSSBmjyT3zxUZXA4 OeRyfemtdWJu6K8pG3uSeeDUWc
-  lQpUkL1x0qRvlySRuP3jUBKHAGAGPrUt23GrdCJmcPuK9BgDFO WQNER8qjOeaR/vZznj0/Wq+
-  D5oKk4xkVbUXZFOKepIW+YgnHtTCW3HjoKUDdzjnuKQLiQYbBXjBo uuUTmrWGniMdeTk+9MJ4
-  OMnNSjHkr8pHXgnkVEWO7GKaV9h0+wmNqKW6kdTTONjYJAx1PQU4McKv 3hg5FI20dTgHsam7u
-  ZXalZlUsSm3BbnOc9qZIpB2McjBqVyQ3TAH3ahYhw5LY+tDjLmukO22hA4A jC5DA8darZzCVU
-  g4qZ/kUMMEHggVBjO48DPFVLSxMdXcpyttQ8nPt+tVXBK5ByoH61ckC7diqSPX PaqTDGRk4z0
-  9qLrSxS+E873DDLjkHr61ZBAZTn0yBVNPMSLLkMw68VbQLnewbLeh9KttWeu5MlFL YtxZMf8A
-  cye9XE27lLEDA7VWAX95huBg/jVhcmXPDLu6+lZX1Ha6si+CGfIzsPr61KhYgchWxjFV k++Cc
-  jP6VYUETbu2Oc09X1M9k0TbNhwPvZ/Onpy5Cgpz0NMT95yxAAGOalj25JXcwzyaqTdrGu6e pY
-  yWPXHTBqQAsm7dkZOKQGP+LIAqQhfLYLu3LgVClZp2JtrqIiuYyM5I6mpSVZGL5OBxikBwxUL1
-  pGJUggZBGD35pNu+ptT31LDBBIGbcvy9/wCVOxmJeCfm5FNAKSGRnVs44IqcDLqVOBu5FHM1pc
-  mT UXYWJW8ggkZB+WpxH8oIz7/X0pvUlcEYPapVA3kFuOg96h3uKKbTuKu8ybenPBqyPmZecHG
-  fwFRK p8sgDBLcH1qwEIwTwONpppsG0x6lQOCORkj0qVeUBGTnsOtIEyoUDgdDUu0cc7ferc4/
-  ChSn1uOU MMhuB6HqKcqgHBJPNCr8ud2cjJPvUrR4iXJ5HXFTKdnbuNSkxVCiFSTu9vSpxgfNn
-  BBweKhjDNE4 4GSCPcVJgBSCQ+DzSTsF3HZlhJdhK5VgQSMCpkyQobrgc+9VyoI3cg8AAVYi++
-  RgMq9xSvFJ2RSU Wty4vEn38EDr71bUs6hQSQOpqmoBw4PzA4YZq0GGFVSPT/8AXTitBa6WLPI
-  UnPBqwDsKFSpK9cVX TOFB5wKlVl8s4GT0U+9PltoNp2SLOTuPoTjpRywPPfrUKu2BgEjOalU/
-  Jg/LzjFTblKcZfMmxggE fMOTin7v3hAy2T+VIuGVW3bh6ipo1IBLAZxwacprRii0tGhgzgjHO
-  4U8u+WG3cM/dWl24+Y04ZKc MBkVDs9UFpIcqqFBLKWPYnpinDIbbuyG9KaFyvBUHGfpT0IT5g
-  u4nsaNWOT6CEqVA6Y7CmsHLDaa njjDOcgHnkCmvHj5lO0981UJpj92/L37jX5iwAcetMVJATu
-  +nSnlmA5KrkdMdabglQRyP4setONl qOV4dhpyOMd/yphA5K8MDx78VO5UJnPzMckZqA8rnBAP
-  SktRNcqIlU4GcjnrT2+UsecZ4NLtHmIr HaOetOCsVyQdopylsTe0tSPBJAOGGDUDcr2AHarB7
-  YOc9hUfJcgEKO5I71PNbcSTTuQNjaNqkf7W KjOBOSzAqR+dSSKVLbRkgjimsOWPdTjGKZUOVO
-  7GMdx+XqOeahLDOD97vmpNoL8sOnzVD97cMDOe TVWSiHKlsN35KnaRtGMnpTc8sScZ6cVL90f
-  ezngccVFsHkkNnJPrUc0dWyelkIfkUMRz0znpUZ3Z P8QJ7dqe2ApVidh6+1R4USPubGcc1am7
-  rqSko6XBV+TLHgHtQeMlckgfMc0mVDE8njof0pSNifK2 T/EAaTlc0vZaiFiQo6Meuab8vz8+m
-  OafuUkZ4brVZztAJHQYFCvs0TFJ6j5JFEeGXnOD61DLJhQM Yz09hTmysW7GTjnio2BJBOMnnG
-  OlOLsEbbkLMyhj2A/WomJIU4PQcVLksXyNvOCCKrmTpubsCcUW bb6icbIhD/vgS2QTnHrUTcS
-  c4Ck8EipJGDSbeAP61AVyqqwPc7aqST0M5JrXYhYsVJYgYPXFKxOz jGGFMJCyDP3M8j09ajZg
-  pDLz754FG0i0uVXHKF3jduyDliDTiwMvUDPTNR5bJLDHYUAZTLYyD0FW pNi57eg4l/MHQL61E
-  5bIAHyjnipC22M54FBcCQggEgUlUaaVgTTVkMVnk5VMHPTHNMfJX7w3HrxT s/6QCFJ9SDS9mA
-  AIzxmolP3hSdtCsC7Lt28k5we1QSMPL5UlurAVJJncSAxHIAHeoDgDoTxVx01K dmiLg78gjJy
-  BVNiRJlgd3UDPSrbLsUEA8jpmqLuASwDHI70Xv0IptJtdCCRz5uw4UpyWHQ1TkGSC HBLA5C+l
-  XsgIzMADjvWax3YUIw56miM0nsXDV3jsefgsdyqA2CMmrYIJBQ9OoPrVE8bemDx8tWou GYEHn
-  APtVSXKm0ZO+7Lkb87cjsT71fUdSCAx5wRVJFXaB/FjrVuHzDArEZOMKfWlOF2pJmr6P8y/ CM
-  k5G4ntUw7gg5OKrRsGbK/fU5zVsllJOMZpRSvqZuVxdoB2qee2R1q1Fnapwc96gQ9CQeCfxqVS
-  ehO3PSrUtGW4uSLIO1/mUN6CpF3NMyg7ecmokGIyZDnI5PvU+R5KgZzt59aye+w3Lp3H4AgHyN
-  vI 496OhRcEHoc+tIUyuDkDqM9qfGr/ADcBiT37U6clcUb8trljaXkYsjEHgVJGCMEABc8imAk
-  8dV9q mCfLwGU+9EovUHK2iJV2gSEg5zzzUyqiDPUkcVCnO5SQRjJqUZDoPLPy8DIrNRaZpfrc
-  kxu43fLn irURJTDjPcCmooDcYbdzUyFVHGS2cE0m76WJVncevy52thsd6kT5W5xkjqaAuHI6g
-  9falLELgYLd qqEuZWQpaj8YQ/KRxgUuFCjG4kfeye9NXeXxnJ6gEdalDqwwQWOMDFDlYfNdWF
-  QcKSpBPGc0+NC6 ttZeeo9KaC2wK3GetKMK+A4I9Kh33Qoxdrkq7gy57DOfWrKoFAIJBPqaqDI
-  GMHaauhFIyT8w6iql JrdFyjH0J02qSeemTzVuL7o+6Sc4/wAKpKMsArAnuvtVwMoIO3kdqfK7
-  DUL6J2LYKiNQCUYdQak4 bIVl3dsVCq7hllKn1PvU8S+UVbaWAGMUaJeZLvF6EyAiLYzADvx3q
-  RQ5Vdy7sDkAVBltxYLu5B9a urnduHLEdBScrPUavFkijg49cY9KeciPackn3pi7mXGw89frUy
-  5ITIPHU0l7u4pNSWgg2hQvJ5pP 48EEc5Ap5X5/lIOeRUjACIc8HuaTbsKLaV7jVXqcc5wBU2H
-  BALIGbtiq4DBCSAQORzT18wgMWXP0 5FO19bml2KU2S7MnB64NOHQgAbS2eaaH/eZyC+O/ak3M
-  2FwPU4FJvUqbskrgAPNy2ScVLujSMdTn oO31qJQyynOCMc5605l6HJOeAPaok13M5STdhPmbI
-  KgDPWmncI8feHsKk3nagTHTkmo3yF3D8QKa auJybeoE7iWyDTSV8gZbOcZA9akDAgnYQ2PmNR
-  Md6gEr1p7ly9NBhUFyfmGcVWJAdN3G5Sx9varT kAnad1QO6nICgYwCTVQeu1xOV9LXRA25lDt
-  yQe1RcKflbLHn1qct+76dT2qry78HC4xnFO7e+xSl aOpICokwcEc9BUPl7W4PGM5zS5AJCtjt
-  zSFl3lmPTr2FKO9kzNq5Ex2oFTO71J4NRlgX5baQ2SKl b7vp+FRyDcAcgYHJIpy8h82uhG+Sv
-  Xv+dIMrIQenFOJPlhQM49RmmseORgk5B9KTTaDV3EO7Chuu MZHalAKklRnHQ0jOhHIYkYyaaA
-  AM5LZGeDxT3uNu0dR2CS2c5x26VAyjJGCRwMelTDduy+BG1RBR v45GeTnpSunsRGdncQ4VQoB
-  LBehNQMWdQVG3Pb0qRwDyxII6EVC5XYBuG4ngU0+ZBZXuyJziY9el VpCpi3A855qeRT5hySST
-  1qCQgDYwwM9cVUddAT8yFyoj3kc54yeoqq0iAfezj3qZshcHHI4qux3D sW6dKpIm1yLPRTkA5
-  xmlfDRDhT601gUTaTvXoAOpNRD/AFIYqwGfm56VN0nqU+e+iHdQGyMU9Xyh ABHPU1CcrMQeRn
-  IPajcxK7gADyMd6q/NuOUko7DiwAAI5I70mSI0zxnjB60qYxjGD15pA+ZMMVPH 5UOavawlG+o
-  8sBCdqncO/vTH3gglgvHUU1nGNwJb6Um/12kHqTWV12FJtLRaCZOAVB5PXqKrswGA e/A4qRid
-  pAHocCq8m4nkAHvmtORNh53IflDFdxyF71Ucose7nkcVO/31BBBJqCVVI2Kc+nvRdpak ucb7l
-  Vy5baBkd8VRlYHhvlIORirjMSwAypA6mqLsvmY43E8H0pWQk9Tz8KpjJDFgO3pVqHAtx8pL E5
-  BzUChIpujONw4FW12F8E4I4rZWWjRKqPlS3LaffXH3ic5q1HzGrfN16dhVKHkxkZy3I5rSjc4J
-  I4J5A7VHLJbMq6jqSqQANox6+1XomDIN3JAPPUVUTmRQoAJHQirCLhlGCAOtFr+opJPUlBUqrD
-  Ab r7VYXPDsASTnj2qCM/OwwAM8ZGashQ5BcgqAfu+tN8yfkaaLUdGHkUZxnGasqo2jLbiQcKO
-  tRKmR hRgYJ68inqSsiY+7twKE+bWxklfW5YjJ+VcEt/dNTKMIG3Luzk8dPaoVBV+Dn196lUDa
-  3t/D9KV0 nojWy2JMDbyQzHONtTooG4knHHNQJ83JUDPIOKtpvEI3Lyeg/pR0stxxajoJySxwT
-  zjIq1FxKuQe mMGoUwQepOMfSnqCZPXuSKmWq1Y3YljO6VVIKnGB9KtooE45xkY57VXUkyLkj7
-  tWgcle+BzUXtsT JvZDt+JTnJGe1TrzGVAJXvnqKrZ6dAOpzT45SBuyDn06VVna6C2mhOA20FT
-  vA9OopSxVidnBHGO9 RlnKrg4PAp+T0JyAODjrSk4p6iV7oAflUkdD3NTHbkA9AB0FRBXJUYYn
-  HFSP9xF3Ddijmje472ej JshpAoI2jgipRu3KVyQDzVSMb1O1stnJJqzGxKk5xxwaUk7jcGti0
-  rLn7uCOM1ZyXG48jPFUlYlF Lde4Aq2kgEcfqRyKIxafcIt3ukWs7Y8iTI3DrVtQfmzzz1qih4
-  AwMdR71dDkNwcelKo5dR2luiwM LwBxjgk1OnyKQoJPc5qIEFACBjP409VyMgj3oik9bDb93sX
-  EwARzxwOaUfK5xkIetRxklxjr+hqT d8w6An1ovyuxLbt5D9+F6cdD9KVgNw3nGRkc05mwoPyk
-  49Ka+PL+YZ44OKEwjN20QDiU+XkjPc9a d8y5bB3E0ijcvAKnGeOhoEjPnkL+FQm3ctvqG1DI2
-  44yOMUb1BAGSSOQO1DGMg8nIOevWmgHYflx 82QfarUrIIO6Ji29BjAwcc+lDEeQCOe4qBR+/w
-  C4X1p+cuMlR7VD3FyNvUXdhSPvetB3CPkYY8ke lIWZlzlR+HWmM2VGQSc4x7U1eW5Suh7PkAA
-  84wfeo88KBgtio2YuxXBPTBpWxwOVApyVlqLlVtRj MzEHG1c1G2OR8pB/SnM/zYbkED8KjYnb
-  kcjuaq7W+hU1MhLgkgnA7ZFRMyD937Zp8o7gYOM4JppC qSxxnGckcVNnYhxttqRA5k6gEdc0O
-  +EVtpIPX2prHKliQD14FIZCUyFHsDVKydxxetxh6sXIOeQB 2pn8POQemeooOGl3g4bFMBONzZ
-  HfHpmktdWKT5XYT5WRc5B9QakPEHPXvTHIkIKnnoP60gLNuwVJ zTTuKb2YnO3HGO9KcKByOBk
-  H1qPc3CjB5546UbS7ZzznI+lVJdxTaaJWc/LyvTn2qsTjncCM9hUj KB909ByM1GwG5iAC23JW
-  iDgtCIciegh5UAj+HOf8arSKoZT0zz9KezNtzjaCBkU1pQFJzyOoHaqb lH4TTkb0WxGzNhQAC
-  MZ5qkfkQ5+YZ4PrU5kZyw+ZT6mqrnaFUnJ5zU6MXLb1GM5zlVLehqEswTgd uuOKeS6ttGCeB0
-  qs7Yf7rZ579az0voC0VmhpYEEpyAc47ioeWYgA46nmnOxDKyjjZ27mmBSGyCCc c4q5WWw7voR
-  lHKgHAyN2acmQoO7JOce1NO5txPUnJA9qe7jyVClSx7DtTdSTtZD57jix8tS5AJOS MUpaPYxC
-  nkY96rjO5QQWJ/KkYsEyeB3I70pQ6tEQsP6SgjB5GRS5bzmGR6jiogf3bHIB/XFMZ2ST KsOec
-  EVad2kiUkk2JJuaYOHGc9qa7Ycg84OCKc+DEoCkAdvX3qq0owxwPcGh2Za1WiB2ONxB3AcE 9q
-  ol9wH8QBzuFTOTI20KykcnP8qqMCAQflwOhppxvZkxtfXcYSqtnJYEdfT0qhNuMrbQCoHX1qy7
-  rsIRh1/Sq0j7V27i2eeB0NCdpbWEna7OBjLrcgyqT34q1GvKNtYk8cGq0QO/5zyw5J9Par8ZKQ
-  4O OeFNaKKixSUlui1Ep+UYPX8h6VdiQjoG5PQ1SjOUwuR6k96vh2CrgjJ65FJyadkEd9CdOHH
-  zZPoO 1WFKYBBye9V1XEoKsGJ9quRgA7SoBx19aXNd6blOcbk65CBSQT16danwR8qg5POagVm2
-  qrLjaMA1 bQqqhiRzwKcrp6oIpLzQ7bv27Th8/NS/MzgNkbR9MilC7SCp5H86k2tkM4JyP1oTX
-  cjn7f8ABJUK mJwGABHyk09B8rBcnA596ZCRtA6sOOKl5Ac7eSeah26LUpSbRYiZSNjIV2jjNT
-  DhVPU44HpVYOS3 KHgdh14qbBaMGs0rajknFpskTJkPG0A9+9T4POM7SaroMRbG5HHNT7hyw3d
-  fWolZsaqST10JsgKN 3UcVKpCSYBPoc1WDYOeWBxUpbc20AMc9/Wrd4vTQcnZ2ROhyWx90HmhW
-  B42j1BHpTchF54Oe5pqn bHzwTVpXQ7LcslsJk5G09RSo75IBAye4qBWIX5sjihWxkEgqTkGs7
-  LZ7iastNS3ucyZJyMYGKAxW VlCsx3dahYgIdvXsKlUkrgHBbrSdkitbX2LEfJ+VgpI6Y61MgH
-  mEBlyBwPWqu4hl4yvX3qWJjjad pbGOByKLahHa5cQncp64HfvVxVBTIK4Pas9XPC5B9asoWUA
-  44oS0ugvZdjQUgyEggLwB7VaQlgwO Ce+KqIyBgRk9yD0NWFbdHlQQSMginH3mRz3diynKEnJJ
-  6j0qwvRMZyOoHeqiHG7nBzzmp0fadwPT pnvUSUraGlu7Lqv84HAOQcCpFTPLNli35VSUBRuOd
-  zcA5zVkNgYzk5GTWlraoU79CT+IqzAk+lOG DjPJHUCoULeYN3DE9COtSBwDsIAbqTRPunqTKo
-  3uPBZQT37Ugww+Vc8cgUxm+fgHavSkLYOTgYqI pmlpJXH7gCFw24npSbgVIJOOn1phb5g4PX7
-  xNIpBlZ/4c4ApuKWqTJfw3bJozxtY5WkYgHK5Oema YDjIU8Z545oYFkUYJwucipi7SuxqUn6D
-  95Em08EHnjv6Um853bScnr6U0H58nrjvSFvlBwVB7Vcm mKKtqOBbcCMNgc0yXnaPmzu9aQnK7
-  kYEHoaYzhXGWww6A0t3oHQa7EggjAA4Pf6UxORxuzt6mnkk RAZU46Co2ZSSQ4HajWzByfLYgl
-  B6McA9aYPvYGcEkYNSO4XGQSe1QNJlkHXvn1oTk42Y76CEcjJI I9aYx+ckEnjIx6U44bkHnJx
-  moJTtAABxkHNS7kryEcsWLAjoBjvSlMKScn3qMsN5zxk9D2pu5t5x 86YzxTk5dNAVO7JFPy9V
-  zt49qUYCYHPTkVAhJhztOfbtS5AMgXOd2atxSbQSbegrsAMLxzxmgFsj CnkZyD0PpTfTuBjJp
-  ruTFlfuk4oa6WFKAfMcsx9M8UwkdCc9uO9Mzt+UHqcZ9qiB2uTtNEvImEls h7FtoA5UdCB1qA
-  suWGC307VI0hOcjAYZzmq2TlyF6EfjSd+U1jGUU7sVmLP2UDnJFVnALYIJ460r 5KjqSfQVCzA
-  uCxGSOMdqmDa0Iv1GEnc2OhqBlHzbvl9z2pzOvGC27GDVc5GSx3Y4xVxWlx2k1dDM qBvHHPy8
-  00u2SMKG3dMdKRSGB9M5xUJIOCTknk+xqFHmTZTk0tR2SsuQMAr1NIULOjA/MwzxUTZV 9ucZ7
-  ntR5gV9xJwea0SaWhE6bvpuSMWWTHLEelM8xS6gZzjBz3o85TICSMAHFRNIPLD8ccAYqEm9 ZI
-  E7rRakm4lmXCnnrURxj5/vZqMFcsTkEnkZxikkC79yt823nPNN6MnlvuSNJk8YHHB9aqM20tuO
-  4Me3YCpN/wA7AgAYyc1XLsycYwy9SKuF9hW5XqhrFN+QTtHU5qvM3ICjJbgnOcUjEH5FPINRMQ
-  xA OVLcYB5qrK97jvHQgZPk7YI7dAaqsCsjgHB75q1ICq8ZfmqTjc53EqCKOfm0voEXdO7OOUj
-  zF+cE dh9KvoWZo2ypXb0xWdGSQPfjNXot4QKE4J3DNae0bCSdrMuwhS6hsEYyAK0Yvmj2kEkd
-  CKpxkM46 YI5AFXEUmIEMN4GM1EbvYybu9CULmJeAFBwR0NXN5BH8LDgk1XjVSSVyST8wzU0RG
-  4koTim02+Yt O/QskZB2LtVj1z1qyhOeQox61XRsDplQcfn3qyAQxkwS3AI/rSumrMWpOQxLbg
-  Cc4BoX7+WcD19q i39CPqQaeOHPQkgcVlGLvfsEJ6PsTL94lTjI6irEbkPh0bb3NU1CrErZIP8
-  AFz3q0h3x8sc7uRVS lfRAn1LC8KDnHf6UsbjyyRwM/eqKM8HJOOQOakT5QCOVzihrqUlH5lkN
-  lV6EYORilUkgbSD9KgDB 3AY4bGB71LnfGAg24GBUxTiU5cr0Jy6CNskAjoM0oBOSGHTg1CcEB
-  iMPtAyacSQgZSG5xTdltcLt 6LQduywyS+DnOaejfvgx5zke1V1ZuQBk+1OVgHJUcAHNNyfUuN
-  +m5cJJZRjnufpSYJCsB823oKgD 5YkkA4596AxKHJwAO1TTk73YlK3Uubl8vkbGyAMmpI+ZgDk
-  ADHJqmADLw+H9D3qRXy4HIyOppyin 1J3TLSkh/vcY71KrfviRnnrz1qupDfNnvU6fMVGPmB7C
-  lJdy+ZblxXQsDjCscD2q4gG1MsDxjGf0 rOU4IBx1/KrcQIj5OBUPR2XUlzvHVl5MmTDcY6GrU
-  U3zFTngZGKoxv8Au++OhA61ZR8OuVx7049g 1toaMUihQzKST61JGCy7eAR0zVIM2Bt+bnGM1Y
-  DAxnIII75oQ4rtoXg2FI9B19KkjI8xx3H61VQq eTnb9alXaXwThQM5HehWdkNJJWJvNcxgsrA
-  5wD6CnqGWQh+gXvUcZDKFB/E05WzknIIPQ1T0dloR a6FBUgDPvTyxzkABQOtQh1VjgcHOBSKw
-  8woT9PpQrvVjlAnRlCHHzHdTSPkLcjB4/CmsF8vjOAOv rQFQIM7sEHPNZ8yvuCjyq7GrIS2Oz
-  HJp5kCH5mHFRLsU4zyBwfamsCAG3AnFaJxbsXzJsl+8MFgx BHSnbsSAEEjHGahRv3OSQWzk4p
-  u4MSec9AM1m1d3uNkiyElRwo7DFMO4jAIZsZBo6qG4zSAZdWJH XnFXzaaEuKirsRuyngk5zUT
-  OhdCFIwMZ9akdzvPTj261AwO08HcOnHFKyW+j9SkrLcj5YAqRjFMw pXcGAYHAqQ8n5QNpHFQk
-  FkBQAE8nNCm0gspDWUFm5xnmomBO7d0B59qlwA5Qg9Ofr7VCTtRiSfoe 9SpXVkyXroMccEHHT
-  J4pmQY1XcFwMk0u0MysTheuKiPRiULHGMA1XLrqxqSTSaAyeXFxjrT92Y2X bgdSR2qDBO4MNo
-  B4pwZmwQQvrx1FVaSsyZWtckLZTtx6VE4PlkZwueBipN4VT0AHTPpVZiruMucd cE4pRm7jWm4
-  0nbCQxIPIFNZgB8xzwKQMecjg9CaiLDCknGOufSm5N9NAlKLsx+4spG4Edj6VE7bl U5LAc5X6
-  0jN8+ARsx1A601G29BgHORUpNq4p8rSbImIR2AYgHqPSoWJ3YAPrT3YEMRjrmoCQS+GI JpXuh
-  +VyNiS/ODt4+tRZwgxktnk1IwYsF3Dbjiq0nB2c4BBq4S3QOXQa/CnjC54yOajI/d5AP5VI ZC
-  FcfeUtkH6VBJJIXDBTt9BUpyetiOW+vRDB8wCk5HXIppAMTBSODhaQvmQj7vFQOcgqeBjPHHPp
-  VR10RXs5Rt9485wSBgg85/nR5gORj5VqKNS0LKTgHpzSNjIXJVfX6UNO+opqO7HeYfMACk57+t
-  IW QuScHA7U3eABxyehqsTlAAGxuzk+lOe3mRTS5idpBtDYZc9agbhz1Cg8Uudm4daiZgAoYdO
-  BikuZ 7lp+RDkl8bSoHrUL7V2u2ckZ4PepGV+X5yemKruchQykHr7YrX7VhcuuhHIwzlTgexql
-  Ix2Nhhz0 Bq2xBBGRuPI4qhKxDk4yB2p00kyVHXU5WIPgA/Kd3TFacbHYM9CeMCscvm4AVmZFP
-  PbNaceMgsTg t096cIppSe4oQdveZfhU+YeeM8CrUf3mYfdPvVeIncdw4Pp2qyqho9xOPl49qa
-  31B1d7F2LiIgkZ xjHerYOVAY4XntyKpL9xVzweCcd6tDccLwAG5JqJKzUuwKVtbEqn5gUxgcc
-  +lWI/u5LZ5yBnrVcB t+Bjk849KsIACUK4zycGkpNsi2t7DwckqMktzmnD5hnkc4564qLJLjgh
-  exFPBbaMnopyfeqcXpct Su/dHsSzsNwx64qxESyBcgKO4qqB8vUcDp3qdXAI4KkfeqbJ+Zb8y
-  yrNsYgfP7VOrYUBmJY/rVJW RQ5JIG4Y96lWQPGNnDdBnvUTve2we0didWywC7SM5b2NWFbMi/
-  3vSqQLo42kBe4I5NO4JZt25uow ad76kc3NKzLgIIO7JK/ewabuwMgg5GcHtVbAC5IIGRg5608
-  Hk4H+9mk7l1Hd9hxyuMnGTz9alU4P tnJNV0O1/mDHJyfapI2UrlclT696mV2hy12J94BYYLEn
-  I9qkJTyzhtxJ6f1qtyZSHODnqKdgAk5z 7UJx0voJSTdkWS6hyQcfhT4h+9y2eDwKpqGExYsCM
-  8CrCtgEEng9fU1F7PRluLtYthgpcjIOe9Tx bsh0OCfWqZYspPXBH4VYVzs+8oDD8jWqatohpO
-  yRfUlQTkAk4GatRnIznORgVnIExgszccc1Yhbk FidvQKDWTjzEWT2NKNmO4NxgdRVgHLrwTn0
-  qipWRv3bDGOc1aTy9u1m556U3ZO1hve5cUtuKqOCc VbVSAehPQ1TiK+UD2xVuMk9hgqKcm3r0
-  QStLoTJklSwzxjC1Lg7lAIVQOM1ArFMsMdOB7VIrgxqS ec8j0qk29hWcWTpkKMMB6e9SEneDk
-  HnBqEFdoK9hkCnZLLlVbJGcmm2+oJXWmhPG+ZmIC8c8iohg yjcBk9KcG2Rg8ZxyPSkDqcDgMe
-  pFTFNXaCKiODYO1jgLwR60KN8h+b5cZ+tMYswXaBz0NMLFc5Bc AYODilyaaGyjpZMmZflxwoH
-  eoxjaf4mB4pT+8AIOBtzg1AASCoO0g9SaairE+9Lcn2gcgH5l7dBT VZApbhiDjg0zls5bjouO
-  KamDn5WH9fepkronybJfMAk5+Yd81FuYEkHPPbpQW/esAMHbQMFkG5Sc Z4pOKaG1FbiYfYGYk
-  U08qPmKgDn2pWJVflHbpmoHLAAjPv71XvSe4K+iYhOGyOw6CkyMhiMEjqPW lXOct1DcZpjDL9
-  T1zUpp+odbXGM2wl1OXPvUBILIT09aectk4/D0prAbQOrY6elKLj1FfR3ISylT jJCjFRMGVXJ
-  OB1B9amcEJtUbsjJA9fSmHLR/Mp+lOUtdBR03GphHLHJZhjFNdnyNoAH0pGKonck/ 3jSO7Lyg
-  GAvI9qbb0E0ubUiZ8SHcSQTgYHFNJBBUsu7AIGKc3zbWUnGM/SqxY88jIPHHJzTSG7dx zNghi
-  eAOMDrUTsrSA/eHTA707dmM7uD0AqEKxXIXAB60PVXvYmLsrLccVUIpOc9jnioyYtuBk8fN z3
-  pxb5twO4jjHamEfeIGB/OhOyTuDhciZsqQoBNMJznO0euRTyPnycAZ60xuWAJGAfSnv0KurWKs
-  jFcYPA4zTGwTubn/ABqdii43Ju5/CoGBEXHXGcelSlfQr2t0QSMVGMAsB0qEO5UnIz6YqTlosD
-  rx zUMshUkDH9aqTSurERtuiOTb5YycMDjNV9xwTkccHFSuysfm7rkc4qH5TDwCCPyoVt2Cm3o
-  MGQD1 BPIJody7M2cLn86YzKYs8l88AGneYwjw6YHvROVlexXNqMZkYKqdcVG+WTb368GgqPu5
-  wB3qMD94 R3xkGtoqDs0wtZWuPATGMtk9CTTC43MAR+NGAB7fyqJt2PlGQeR71D1l7pDV72Gqj
-  LIdxyR0qJ2O MLgt/EfSnklfvZHrmoyDypXhl7VMoO+pm5JNMrsMxkrgtjvWZNkQspPzAf5NXi
-  eOAwYDnFUJs5Zc 5OevrW9JvpsXFOMrtHNwKAFBYMScjHetCF87Wbam0YOfSstFO7cSPp6VfVs
-  NgDdu5OPSs4qLd0Ja q5qxvldxwUzzVhY2Mqsp3DHOKrQqRlScjsPWrilhGQN3J/Orje/MiG0r
-  8rLqgbQeQccg9jUiFjuG CTuAxUMZwuHwSefepkJDll4c0ScloKCstSVMA8ghgeecUoblMZwR6
-  9aiAORgFjnluxp5faQGG054 PrSUXzaDdtEiZT8uPm5PQ9qkz8uN25h1+tRIMyckZzjJp7IpkL
-  Ek5ORipvFsttbk5kAx90NSugd9 24rzwPUU0FQG3dB1NM3dGB+mO9KnJ3skCT3uTO2U2EfKp6m
-  pgVUgJ1B4J71W3YOMFjn9KlKn76hv qe1Nyv5BBPUsB3Eg+RmKipN4+V8HHt2qDLBSQQSOpp4I
-  P8SjPNRFue5UoqLLDOcKu0AkdaaNzcEg rjFMUEDcpL8/L3NOyrEhmAA6g0pNJ3QLmXmKWY5+Y
-  eoxTg4C9Qfp61CVBG9enYCpDgKTtx9fypXY udOKDzB5I5781OHEjEoM88VWiKbyB+JNTK+0n5
-  MDoDVW622CKS0sS+ZsfdkYPQd6nV2JGcdPTqaq 7htUnle/t7ipVQkKwJ2rkY96W+5bk3HYvq3
-  yqdw3Z5WrMcnzdm4x0qjGNoBYjGeo71bDDIUfpURm m7WEloWlbDYxwO9SIwyrAH3qBSNp3ckH
-  oPWrMZ3rgYJBzVRnZbBbsi3HgkscYPAAq2iN8wAHHVjV FFZl5YDvirIBwu3K/Ng5NEn5iXxWu
-  aSsoVFBwvcCrKEAtnP0qggJjKnbkDOcdasoDsUg9PWnN3Wj HZbEjt/CDwecjtVlSBncPmA5NQ
-  BcFQVOegp4Y43ngHr7Uoy7FxkraEylcHHBzyDVne7TFVIA61VB woB4PBI9alz1ZelEo66slyb
-  RNht+5iMY4wKe+1o9xPscDqarA7WQYzxzz3pzEhwGUnjnFFpJlXF3 7DtByMjHrim7ShJHIJzz
-  3oY7WG7oB6UhfAIyNmeDTadrIcJauw7cDxtJUDk/0qPy24xnceoPamBg rHJy3UUquTIxJx7+t
-  JOUdkEnLuOG3zfmDeoxSfLuY/NjPODTfMCyHnIIwaY2GYkZLEYIBoctrkPV 6inAYsMkAcjPNI
-  rKr+uO9NHQEEbv4hmgFsDcoGGyaHJNWKkiRmQrnkccGmE/KAOVApCQCoYgZ7Zq PI3YXcDnj2p
-  uy3Jd2tGDZGC2cHrn1pgYgZPrn1pc8sXwwzjHpUXykswOc9qS5Wxy0Qrk7QFYMSOv qaiJUD+8
-  3c04hD1JJzxg9KRVz0IwTyPSiVSCTfYhy2ZDIu3ocE8ioy2EAY4APX3qRvl2AfMp61Vc HcB94
-  fw+1SrSdmXGLkxjjdIkhODjilIOCScHOPanHBAOctTWweeDx+taXb2JmrvcR8KjBcg9OarF WB
-  5wf73tUzMSncc9fWoGJJIUEnHBPem/dVib2dxkpbegUAn1HekYZbkbexx0p45kUlh6sMVHklWO
-  Cc96zUrrQtSXYa0ZTJUg4681EWcOA3TsfWnO+IgT1xyKaSdv3SCeMU+l5BJNIRmAYgjd6H1phK
-  rG ASMAdCacQPN5YEY4xUUgHBIJA6e9OEbbmfuN2sV3zv4OVJPJ7Uxcqwyy7duQcdanLNvZSpw
-  AOKrn DBsrsGOAaOddTXV+hXZgcYYFgckAdagchs7Rk9Qo61OxCyA8MT1qttOeCO+D60JrbuDV
-  newwg7SQ Ac8cjpUBkJypAU55OKldiqbXHU5qqQGlY5znGMd6laXRiovqIwKuwIwAfvAVCPMAI
-  fLMTkGldynG QADgmohvZevGOfrWkNVdm0bN3X/DjxzGcMAT3Peo844OSxHPtS7ioIABY8gYpA
-  Bt3Akdcj3ppva+ gOpaLQ0BgAOdw6/jSO+F2hTkcDmlLsY1XK/722ojlZgQMjj5vU1XNd3fQzu
-  t2DszSnI2gDkY61Dy Mj+NutWS+ZCRjOOpqgWBdwFJOeTQouXQatezRC5LHpgDg8VSc7Fz6nqa
-  tyA/Pk5x29aoykkHd8oL fLQuW2oSbscvEXB3N0HUHvWhEAATjHGV5rNgceUzltwPQetXomAUM
-  Qxz94U3F3aasT8PwmxGSU3b vmOMe9XEfaoHKjOBjnis+3G4ggjYq45/lV5CCwyvy579qFCysh
-  Xu7dS6Dld2R14NS5CEHIJJ4qoA d3UYHBFWVIbjac4x9fehwT3ZK0JFdgeOFzyalCKTnDH0qDG
-  Fznv0qSMFgRg8HjNVL+6Va71Jd7KR 8wJPQVKWAYAdCcE+hqujqJRwNygjPapAGweMemai10KS
-  8rEgQK2c8Hkg+tKPuEkY5qNVwCS3U5NS bCBgklQeRUu17FRaHn5lxzn+I+tSoSFIBwB6+tVVf
-  ORjBzhfcd6njUM5xuwf1pTWlnsOcblnduxu UghsfWkOBM67h97oBSKTGCf4u+ecUiBmf5uAe9
-  EYJq/RCT0vHYsLuIBJKrgjPYGmtIwTG0DI5OKX DDojAY6noTTWfcF44OaElo0aQemmogB24BO
-  Ac/SpWHDBWzznB71Dvw5wCASMj3p7EOcjIYcnHpV2 bJcFLqSEKZAo4HU49KcBtAcE4xzk0wMh
-  JxnJ64peUCYO5AORWEZu9gndLyLOAxwMFs8VLGWwvXB6 1SXesi844I5qaORiegwBjNU4y5bvY
-  bskncuq245XO0Hmrsajdy3zHkc9KooPlJ6BQB9TU8LZ5IJI bn3FTvpHYpu0dy6rkoqjBz6CrM
-  YbaT3PcVVTZ1Ugk9u9TI58xQcL/e9qpXtYWltGaEO5lJIG7PQd atKAY1bsRwKqL9xQA/Xr61Z
-  ickfwlQeKXJLdMSRbT5ARnag6GrAJLp/e9+9VUfeCcHnpxU5diBu5 7Ad6qFuZ33HFSUtiz5jb
-  23HhjwKeoVQwLfMBjGelVjzjJwOwqUMdw45NJJLbQNVt1LQZWIODtI5N P3oMYI56k9BVNZOgJ
-  z3x61MAShYY+hokrEyunqywHUD5myCeo705STjHQAgfWq2/quDjscUuS020 EjA5Oe9EdtirW2
-  Jzgq28YYjjPpTcbcDdxjkVG0mTg8sMA+1EcqLMSQxAPr1os+XQlybdkOZwJPmX K5GPpTGYLJx
-  1I9aN5KjcFVevNMbeu45UjORx+lCkirJhkiHaMZ9x1pCMMmWGTyCO1RF22MxTPWgP iE8AEf5x
-  R1KvfdKw7euCcMMDFMySmwsGJ6GoSSAOhXv7GgsxYlfl9eKTTuHLtaxMSWy5IJHA9qYC dzHID
-  DpxUO7Oed3c4oDgxkkgMBjFVJMlwWo9m3AABgAevqaZtYMTn5c8UEqDhSffmoncbM5AGMcV F7
-  6WFboPXBlHOcGkLnO3BxUGSGU5Bx0AphdnYnjj0qlRT2Y4au9ywx+U8/w9PxqNiDEW6cimLKS4
-  LbdvUkd6Vj5iuSAVJ7UJNOwnF3SYwcg/UEVGzH94QdpzgDFPHTYDt96TehfO5cdTQ3dkR0ukVi
-  Qs Pynvj3pN/wC5YL1zg56ipyEaL1btioXVgzbSvXoKlyj3EktmyAqythTzjmkYsiK2Rk4PSpM
-  KEOSd x/Wq5yHAAyB0qU5PU2u7DmZc5wCfWo+THubnBwMUH+7kDI4yKR2xGAOfWr5Laoydo2Eb
-  arBiSCeM VCzFmQHsMfWpc8c9e2KjfcTkOARV3TKtdDcgjdzkngVUk28lsgnoKmztnbecY+6Kj
-  b5n3EcEcmpb irNAlZ67FVmUM7gDBHeqzE+XnrjJwPrVqZx8uQSuB+VU2fdJgKetJy5TS7b22K
-  7kc43FTzzVd5dq Y4Ge+OtTSBQ4CnHt61C5VtpAwAeAeorRxW7J5o3vYPl3hB+vvULZIC7Tx1N
-  K2dmWyQDmkVkZujZ6 4rNcqRN1zXEEny8DvlcjtURkG4b/AJVPb0pzkYK5yWGQF7VCS0jbSR26
-  itb2d7D5Fa6HEkMSD26e ntTS+dwB2kcn2PpTG2iUjOPm7/zpp/iLE57+5qtRJXsmSFsBGP3jz
-  VRzk+hxyfWpBvaLocVE5UPG OhBxTp3TEmkRuwE2Wxg+lULggN1wMA81ckZQxU4K5+UiqExOeR
-  uQjrjrQtdNrgpdzlLcLt2nue/r V5CDcKT17g1TVmEYBKqSCcEdKnjyp6goRxn1pxmpRV9xcrR
-  sqSIwFwcHnFWY2YcBwQKzF/eR9Tw2 G9quptC5Vvm4xnuB1qFbW7ErPQ1g4OC3c4qZJcSbkPAH
-  f+VUIwSmVPfuasglUzgjjOe1WlGWjMuV bssmYmFRgcYzxzUivuIXlXHBqHLBjnAA6kipQqgoc
-  8k4J9aJuNti+aNuxOFUHO3cR90jvUse0yY2 sGAHWq4DKxDAlQ3B9KkQcr13Dk1k0mm2UpO2g5
-  QDPySd2fyoO7eu4nBFI3EhOcL0zT2zxyDjnFCY 7dmPGDjAO5epqQf3s8YxioEJ8tTzyOR3zUg
-  OUwzYHXP0qbu9rijpLQnX7xLHginKwMeXGCTUKA7Q Mg7jU552pj5geBim7LSxd3fcUM28bySN
-  pwBSfOCAD25GKjLOW4+THHI6ikjU/OfmLA8VUYpapgpv XUnBAj+YZYnj2pW2FxtIA24z60Fw2
-  Mqxz/FTCVYZA2gHPX9KNXrYyTe9iRGRdxYEgDjFODqUyAWV uuOxqH5ZGbAIBHTPenKxCJzg9R
-  7Vnyxi79S0kt1qyePGdrA5xjJqWNV285GTjmojk5crtxUqkG2Y k7z14FP2lxxeti4BmE4557V
-  ZR8EYZeOnpioIyFOBgAjBz3qUDg8AjHbtWSnG9jaLi4l8EBV6MT/d 71YABbI45qjCFb7pIGOR
-  6VawAB97d654q+ZNkpR2vY0oxmHk8dRnvU0WDJllwM96pRD5gCe3HPtV 5WXCBlOSOue1Jc1tD
-  Nx6LUn8shixb5cZODUytmIdMDoTVZDuBwdwJzipWKiLGCCCCaHZ9Q12LHmf N8oUEAcmpFLlmx
-  jAPp0quDuUkDL5FTLkPgZG73pylG4XdrJC5AHzcMD1/pUqOcDLDkflUDZMzIeA uDk96RDgtxw
-  OgzV8nPqXJpKzJiWLAnB9cVIZG3HLA9s1AN23Bz/hSY2p3Yk5Yil7t0Q5XsiZD++D MwPHPvSg
-  nBGB1yCahyHwRkDHQinA/MduSDyD6CqcmU273uSbsyKcbgTSOxy2eFx61Hu3IMHJA59q iJBY5
-  BIPIJrJJp3C33Em4mDryp549aZuA/2Wx0Paos4yM9emKXdn+JQQOBjvTkne4pX7A0uZXB5R ue
-  D0pA2EBDHA61Az5IIQ5Jwab0Hy/Pxzmh9UEGm9SYuBk5xjj61BG4JI7Z/E0zcMckEn17VCXKue
-  wzwR0rS9o2YOyLJkG4rjn69KYGCtlhnnj0quXbeSB8vGfembgWVhnJPc1HvdGOfTm1sWgyqAc5
-  5z SkqVDD5SeeKr72YLhcADoKRSzsRnr93j86Ol7hJR6FjLAAgDIyMAU3ewjQFSF7ketRlmwOm
-  WPIpy ksm0YUA5we9Ta24003ddBWcA5/p0NIrAKC4UkjsKQkLxtLHdwR6U6QgQBgCAOORVwu1a
-  xKvIYGHz Y5HsaiJcyZCkc80rn5xkgITkgdqjLeYCoODn8aU421Y5JSkrobI53YZCee1QgrwcN
-  05Ge9PYqsIU /M/cUw5ZAQRVr3V6kPYYxAm7n1wcUEgRMU4U+v8AOgsMKWIzjkVE6kng4Hfnis
-  5PYbswZioBOHx3 FR7gz4Gdx7D2okKiJuTnoTUAbEhAPAAJwOa2i9DSUdE0xzk7y2OAeMjp9aq
-  vuZAM9QMAVYEm5Sg6 EZqAgeVgj5T3704zsmmjL3272sRHgnLDaowc1VdiR8hHP3j3xUrqC2GY
-  sSc9euO1VmYZZh8ox0NZ JXC+mpAzjaFK98Bqru2A5XGCcZxxUhy0o+7jGM9qiYbot3Bwegq52
-  SL1lZCMvzjJ+UDmoCxzkrgA 8mlYtglgctyfbFJIVXf8w3HHFZp9EJaaDfNydwPU56U1RmZstt
-  PPXvTQSFHzDI6D1p24hgGGTtNW 9CXGw1SAdg5XPJpPlDFEJPuaa20LlGPH60Fj8zgj3x2oe+r
-  G72uMbgkk5QnjFR5DjAPQ9+tBYHcx Ofl4AqM+oPPc+tW5XVzJS11K8u3e/GFU9aoyktje6g5/
-  MetWJGYI2RuGc/Sq0pVTlFJ479jVOTlG yZautf8AI5SMtKRwR6A96uIMRkvztzgVQi3ZJzkMc
-  DHarS+aCfYDGRSg76tk2cn2NGDLg46Edv4q tIWBIUFRjlj/ACrOjkOGz94A4CjGKtJlgNxIXP
-  AzTs7astrlgaSEh1O4qDyCatpuEqh2Jfb09az0 KeV3yDgjPSraksDI5Jx6U4prXoRFrYuId0o
-  BJDHOM96srgJt5z3HrVIK7Mr5AYcirEeTnuTgDAqb LdBbXcsB2aZfmO2p1yIjtOXzwB1NVeQw
-  QnA5O4jgVMpwwYn5QOtHu9LBp3JlbABCtjHPFNLfJtJy yjkAc89KGZxvAPyjHNIoOZGLBvXFV
-  G6V7jSVtCdSuxcNtcgcmn/dIUAMevFVQ5WLOFHapFLBtzDg 8E9vrWbpu92aOF47FknCphfwBp
-  4bMYf5s98/yqJPvbicANjrSNIFyAOjc0lByZMVJqyROwVlO0nr gUAKrhQ2GJyMmo8hWYtnO7j
-  3pw+djgEknjFTy9wimtCQFi/JGAccjrSgkvkfdB6VF1YAnjvz0pFP +kDdwo6Z7Vak0i5OKehI
-  h/dEcbi3GO9Skny2+XjcMYqsXCttB6HginjcioSCV7+9Z1IpPzGnqtCy WDMx3deasBsY2jO0Y
-  PvVPzE3jIyuKmhYs+Typ9qhpJik4vVFoHJ4ywPbNXkPyYbIU/mazyMNuALD 2PWrYKkDkqfQ+l
-  Obi2mNSfQvRHPygMBmrCu+/DLuAbg/1qou/goRluoNWkIWXG8EDgiiKT95jcW0 y7ESQSPvdDV
-  xQUVQysR0+maoQPjb1GRmrMbnbnJGPXmh/F5Ecr6F4Hy4Tzk9x3pUJfGSMDqMVEGx uZj6dafv
-  XaQrAgcHHWk0gu7WJsjzRtJI9qN37veu4E9aqpIN2Oq59amG5WY7sqT0rT4dRqNupYST OflJx
-  xUhZVjU4JzwKqxHI3MduTkink/u2wQcdDU/MTUWyRmZioDdjg0FyBjBJI7VArDcCM7s4p4J bB
-  bIbg1EnYNVp0LGW2bgdxxzx3pAxL9QGPXiq4O0sOeT60iFlLbs4/h9abcXqg0ZMZSIsdTjBIHF
-  DkeXGD90Dj3quzjeQVYgjpS5XYDg5B6Z6Umr6hyajzIWITjIYYNM5MjAnoRzTC5eY7SMk/Lx+V
-  Re Zg8tznJq3toilFW0JJCGIAb5hy3tVdnKMGwfmPTPanMAZHYA5LDAFQOT5uCc4PGaFq7MqPY
-  eSDnI ZQOBk1A7nkxlQMdSP1p5ZjGSRk96hZ9q/Njbjn1xTjduxKuhWcsgBK9QRjvSbgH6Ajoc
-  DvUGcqCO gPSlyhcBj3zwalvoyZJvRonZgAAThgeSPWlVgp6E88c1XEuG+ccnue9CnccqRgdhT
-  vrqwTsixE37 3kEHOeTU/mZyEA39c1TEkaz7gWz2p6kFgUYBei+tDjZ3a0CUepbA+QkMCB3xUR
-  J3krx7Z4qNiyFl PcY49aUMhUZ4yPWnDmtcLisQVLEdeMmmvnawXHHem4DHhjjPAph8wgYyfXF
-  S9VqNOMhJCSEPAzxU OSHb+HnPPSpSNpyPTjPrUEj/ACsAOeBTbVhJdENdhtTZtb+8RUO4AlSe
-  e1K4ZITk44qDqSw+4OAe tVpYdl0ZKzA5yTioy2NwyMjofam9X5yQR096iZmUsTjavAoTjazHK
-  0WrClhuwOucZHpTHD7Gw459 ulIz/ug2BuIOAOtQblRck/Nt6ZqeRPYUY3I2l+ZdpUgDP4VXMg
-  MZAUnBJBpAzCViFyOhpu/94eR0 xjFXyRWlhcq16jH24Vty4B6Adc1UkkI3JhQAe4709w/PKbB
-  3xVZ93m/Ng88E0RjHVFQ31FILxgZA 44GKrF1D/Nz1GfU1K+4jeO3FRsBtAce+aatorkyu3zDQ
-  Dx37kU0LtZiSSccc08ZUqOQDn/8AVTXO 11BGPX/ClOWtgc3JaC7gykg59qiB4yWUKRnn0pec4
-  4A6moZWG0EAYB5I6CiGl0jPmauhQY1QYPP6 VGZG344A9xTSf3TBCAcdD2pj/KQcj0OPWnNt6W
-  uNxtqROWxhsbjxnHBqnL5iySE8j+H2qVjtUt82 BkcnpVZyzEnO0gZwTUrnirrcqk3FnMoFZSM
-  nIPPsam3MqZyc5G6qyFDtByB61KSwK7fulT1Nb02p PkbFCfOXBOD1YZ+nXFXbeUmND/F/Ks1N
-  vm4PzY4AFWomKjA4IGeaThFaW1JaSdjTjZSCFHG45zzj 61MjgySDJOOlZsMrgeUFwauI24ggB
-  eOR60rSStYIxcXroaCy5QY5bp+FWklGAOQV61nAbnyCQe5q VQiyHcwI4ORRypPbUtST3NMN8h
-  JU5wM5qRJS3yMPlAwDjrVNGBJ35H49qkRwQevqvtVciT0Kv5bF osQNucZ7U9WY4I645I7mq6k
-  EAntyc08PlvMAxyciqTSexE2nsSxmQjgKTnk4qT5sNuPfp61WL/IM kkjsKkTax3fMWHbNZOLS
-  ci2tidB90BiQRkg1YVhjoMZ9KqAgAqM5wATUwRRCGLcdeKzlNaLqTKLW o/zMR53oVye3NPDNs
-  4YAbutV2UeWQAVwRtzTztb5NxY5HT+VaqXLG44vlSaHnaYiQQW3cnPFCnbJ nIJ9xTPlRDkHIy
-  eaQujfN944zgVF27dhqzW1yQyq2xM5OetOUzSOSBhe31qDzNpBMZweoxzVjcfL BQrzyBUybto
-  S5vsSA4ZiSd2fwqyPmiYAhXBqiCS+Xz6nHaplY4CgEg1EU76Cv1ZfRxsIZieRg1bj dTM2RgDu
-  azI5CJAxPy9GJHQ1c3Hy02+mC2M5ob63K5tDQibDgEH5hn6VZjI6Lwcck1RR+FUN8xGc elWVY
-  7h3GODRF2K23Reib94MOMhcgYq6shBIY8HI+tZiY3jHLY5x2qwrbiRnqauotnuKW2rLgkYf KC
-  ckdDVhjj5Mc7dwqisgG2Rh16D+dTGTc6nhvQ09biU1cs+YDtBHG3kjvThKMb9rECqxZhHy6g/T
-  ofSnBm8plbkg8epNFkDkm7ItiRWdgSMgYwO9GflxkYYVAM7gDwSckgU7cAcFx0NZKLvfcXXQlO
-  0K Q3zD245pDNu2kcHOPoKrmRQwRiXGM8HrTy2JMAqAOuacoq1maKyWo9WZXBYgnHSpeDzkjnH
-  Xiq6u zA4BJHT3pWkURnggZ5FKdrabmUtWmTl03D+Jj+mKiZsPkKykng9qg3MjoY1Zwe4/lQST
-  FvOd3YZp xSTsy2rInQZJzjI6c1FvVAey+4/Wog5zvORk460oCnJORgc+/NUopJpkKbUrsVpAE
-  65weTUb8kk4 B64PWlDYBPBXd0qu7MA2GXI6Aj9KlRUmXFtrQC7MeCMY4pCcsSQ3A7UbiAASOn
-  YUxuFBJ4H605WS CU76XGNjgYO3tUeflyGUYPzE9qCQyEbu361BuInA5IAzz3qqabjdFNN2J8/
-  KOdx7VIoB+YEe1VlI LKd2MHjPepuTu4ycZPNQp3eo5/DclHI5OR1z/SnoQuGGNpORVeMHAJwC
-  vT2pzMwj3ZJx6Cq5r3I2 67lnfucjIzjOD3pPMbLJ8u/OR/hUO5XjQ888/WlDK7Es2DnPPYYo0
-  S1JSTeqJTy69jjioSSzHk4z g4pxfMTHjp8opm44APB6kd6Oa6uO3RBIQGGM4Ax1qBypJy4Az0
-  70rP8AJ1yQ3PtUZfJwAMepHein a9hra41i+0Asufeo9xMJXIUDBzimtJkAnp1J9aY7Mq4JB7c
-  d6bTfQGlLqIznLZ7ntwTUDOC3cknI 9qldm8oAKC3fFVVYb2JIyetSo21auIWORTKQWzkHmoWw
-  ASGzx1NTOyiM44B6MB0qoVAlJzv+Xrmq VrdhOXYQsHQ4wr+lQH5lY5A5HSib5ckZBGDTVfgsS
-  o6np1qpNdCYySdrETAFT83IPrVZidzNkHtj FTtIARhSQc81A58uMOgJJ4ORRdtFvfyItwYspB
-  OB2prL/o4LHljnGeKU4YnjBx9KgYqI+pLA560J pNJEtdEDsfl5AGaRtvmMfmPI6GmuS6rgZwc
-  emTSrw4O5cE/NmrltZEpaNtjQ5MZPJB7Y5qFlxGzI cHuD3pWYtKcDJPSq7FgwQsGIB6Ci2uhX
-  PZWHO+bfI4yO45FRO2QQx4OMmnsy8YOFPXNRMwwU424y OKm7a02Jb6WK7kqzBsHBwM96rvgxb
-  jnrxUhO6Rh94YBzmqUhbywp+bk4Naq0ZJX1Hfn0OaVmBw2O OelSCUNtKHcvIqrHiQ78nKnnnr
-  VxDhfkwPTIpKKb5uoc0bNrqTq+VYDO4kfjVrBJzzjg7qrKSrkM ue4x2qwjbshc4PJJ9aG1cSl
-  ZbFtWCyEg5weoqyGBjHXLHNUlZFBAYccEVZRiHxjgD07VD91Dbk1c vrgOBndyCMVZYgMB1GDt
-  OKpoTgBCCMfL/jVgblxlgSDyxHFCfVCk3uWkYr8p5JGcjoanJwPTjnmq qEgKQRycCnqxySxUj
-  2FUtWJa6l778RAYcenehThixIK5waqKQV3Ipz9aCxymDjHUUkpWZcWnp0L2 7AZGxjtx1oBHlk
-  LgHpzVXeTtZ+BgYAp4kB+bgc85ocJLYOVK6SLqkbwrNyVxxSkjYOcDIyKqiQ7g WxwMcDvS7+j
-  jle4qfZtvUtKz3LIYgkHLAHpUuWRC4AA3DHvVQElcHC89TR5hGd2WA5FW7WaQra/o WncswLDA
-  waiB+fPPHpQZAzEHAGR/+qotxwAMH09qhb6ExbtZqxM8hwzbScfrSJJ1G5Rxx7VXL/Ju H5e1K
-  N4fGzI7nFTy2+I2SsXQxfcSdw3DO2pEdhls/TFU1fYjKDwx9KsIxchPup9OtTNSvqZKbitC 5F
-  Io2jgluevFXRKTIEJwO2Ky4yAcKQVBJJx0qzC28lyDg5/Cl7jfMLmcmaQbCb8jhueeatLIzHrw
-  elZqksSCpVeM81ZSQKMD5gXz9KSSvoyoq2xphwp8wn5c4wOoqZWbPDDJ5OOlZccn77BG5Tzx7V
-  dV wMEcZGTU8/Ky57abl9GUjG7d7elPWTqvJJ6Gs9HbqBxg4zU0LuwUEEgLkt6GtL2V2yaitZp
-  F4N9z JJyccVMCobnkY79RVIvhVPTj73anKxKgnJ5GeetO8rXuKMVqjQV/lPzDJqMygwg7SWHB
-  qMSKof5c 5OMelJhd+7kDvRdaihZbkhZty52gZ9Ke0gyeRjFQAOJSeo4xn0ppYYAP0pWTVjRS1
-  0LBmIfCHHAJ JoeXEhLdevHvVbdjnHQflSblKN1YD35NDjGJPLbct7yqqPfJpTKM4PUHt3quGV
-  iOchvSmJgH7rHa MHmp5Y31E9XqtiXeS5JXqeMUrKzSAbdox92oXZnU+x4pu5mdxnGDketXEpw
-  2bH7nLjO3AFNdSpPB L9aYWGGJPWo5pG2BOcj86Uua+hV76iuRvBz0HamBizNwRt9+tBx8rbXA
-  2VGwKsPmOxuQauLurDbW 0RJCBIpz82OcUAEHhgVNMBO4MT14z6VG2clFDDkEZqeS79A5+ZrXY
-  mfgLjv+lSEEREr8pz371CCu SGBwB0qMj90x5GW4PahxStYlSu73LasScMw47Cl8zJTuuccGqw
-  bDh8hmyQRinq6iNhkKO+exqGnb QN3ZFkkLEMck9famkgEvkF81XD8rn1/KpGkVkJKkDuaTi1o
-  Db2JCB5YGTu6ioncHaeQT1/wpuT5K tzwcnJqMOzBtykKTnPvVJcruhRl+A5mC8DJz3pm9lG11
-  IZumaU4AJYhR1x3qJ2BbeMgD5sH071Sd 9LCnNRFYKVCg9Bgiq7MFlIc4HT6Uu9ch+vHTvUBYt
-  IzldyZArWF0rkpNK4M5KEg9DnH0qENmDpli Tx60skp35UYUcEe1RO4weOMYX1qJPsK1la2orE
-  BNmd2R3/hqvwAVB4xkihpBkDn0YUw4ZGyMccYq oRvuNq71GHexJHzY9aiJf5m4PTIpzMyOCAW
-  Ug/yqPK+WE2NnBwc0QulsU7Kz6EW0+SwLZ9R+NRs3 y4ZsnPBFOH3/AJQRxyDURwM78Ar2pv3m
-  J2bI3I3MAQA3vyKiLHJC8sODTz87EEHnmo1IBw3IzQ2k tR8sVqwHACBucc+1Rs23O0n3zTcru
-  Y5O4DkZpnmbc56+9K2l0Q5/IduZW+XHGSeKruQWDZySOR6V MMKBkj3NVzlpCSyZI+UAdKFbuV
-  HRa7jG27cLxnrk1CThWHJwOQKkcbtuMFfb3qu0qguFU5HynFXL
-  l5dTOd1qxgYfaS4U4KY4NUJA23byzdMDrVl2D2+5c9gT71Rk++cB85yMmiEXF2Jb5ndH/9k=
-UID:934731C6-1C95-4C40-BE1F-FA4215B2307B
-END:VCARD

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/934731C6-1C95-4C40-BE1F-FA4215B2307B.vcf (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/934731C6-1C95-4C40-BE1F-FA4215B2307B.vcf)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/934731C6-1C95-4C40-BE1F-FA4215B2307B.vcf	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/934731C6-1C95-4C40-BE1F-FA4215B2307B.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,993 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Picture;With;;;
+FN:With Picture
+EMAIL;type=INTERNET;type=WORK;type=pref:withpicture at example.com
+TEL;type=WORK;type=pref:777-777-7777
+TEL;type=CELL:8888888888
+item1.ADR;type=WORK;type=pref:;;1234 Golly Street;Sunnyside;CA;99999;USA
+item1.X-ABADR:us
+PHOTO;BASE64:
+  /9j/4AAQSkZJRgABAQAAAQABAAD/7QA8UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAB8cAVoAAx
+  sl RxwCAAACAAIcAhkAC1Bob3RvIEJvb3RoAP/iG6hJQ0NfUFJPRklMRQABAQAAG5hhcHBsAgA
+  AAG1u dHJSR0IgWFlaIAfaAAEAEwAJADEABGFjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+  AAAAAAD2 1gABAAAAANMtYXBwbFYcEOZVYuhIRg5LwLIi62wAAAAAAAAAAAAAAAAAAAAAAAAAA
+  AAAAAAAAAAA AAAAEXJYWVoAAAFQAAAAFGdYWVoAAAFkAAAAFGJYWVoAAAF4AAAAFHd0cHQAAA
+  GMAAAAFGNoYWQA AAGgAAAALHJUUkMAAAHMAAAIDGdUUkMAAAnYAAAIDGJUUkMAABHkAAAIDGF
+  hcmcAABnwAAAAIGFh Z2cAABoQAAAAIGFhYmcAABowAAAAIHZjZ3QAABpQAAAAMG5kaW4AABqA
+  AAAAOGRlc2MAABq4AAAA ZGRzY20AABscAAAALm1tb2QAABtMAAAAKGNwcnQAABt0AAAAJFhZW
+  iAAAAAAAAB7vQAAQXsAAAJL WFlaIAAAAAAAAFYqAACp0AAAFF9YWVogAAAAAAAAJO8AABS1AA
+  C8glhZWiAAAAAAAADz2AABAAAA ARYIc2YzMgAAAAAAAQu3AAAFlv//81cAAAcpAAD91///+7f
+  ///2mAAAD2gAAwPZjdXJ2AAAAAAAA BAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUA
+  SgBPAFQAWQBeAGMAaABtAHIAdwB8AIEA hgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0
+  ADVANoA4ADlAOoA8AD1APsBAQEHAQwBEgEY AR4BJQErATEBOAE+AUUBSwFSAVkBYAFmAW0BdQ
+  F8AYMBigGSAZkBoQGoAbABuAHAAcgB0AHYAeAB 6QHxAfoCAgILAhQCHAIlAi4CNwJAAkoCUwJ
+  cAmYCcAJ5AoMCjQKXAqECqwK1Ar8CygLUAt8C6gL0 Av8DCgMVAyADKwM3A0IDTQNZA2UDcAN8
+  A4gDlAOgA6wDuQPFA9ID3gPrA/gEBAQRBB4ELAQ5BEYE VARhBG8EfASKBJgEpgS0BMIE0QTfB
+  O4E/AULBRoFKAU3BUcFVgVlBXQFhAWTBaMFswXDBdMF4wXz BgMGFAYkBjUGRQZWBmcGeAaJBp
+  oGqwa9Bs4G4AbyBwMHFQcnBzkHTAdeB3AHgweWB6gHuwfOB+EH 9AgICBsILwhCCFYIagh+CJI
+  Ipgi6CM4I4wj3CQwJIQk2CUsJYAl1CYoJoAm1CcsJ4An2CgwKIgo5 Ck8KZQp8CpIKqQrACtcK
+  7gsFCx0LNAtLC2MLewuTC6sLwwvbC/MMDAwkDD0MVgxuDIcMoQy6DNMM 7Q0GDSANOg1UDW4Ni
+  A2iDbwN1w3xDgwOJw5CDl0OeA6TDq8Oyg7mDwIPHg86D1YPcg+OD6sPyA/k EAEQHhA7EFgQdh
+  CTELEQzhDsEQoRKBFGEWQRgxGhEcAR3xH+Eh0SPBJbEnoSmhK5EtkS+RMZEzkT WRN6E5oTuxP
+  bE/wUHRQ+FF8UgRSiFMQU5RUHFSkVSxVtFZAVshXVFfcWGhY9FmAWgxanFsoW7hcS FzUXWRd9
+  F6IXxhfqGA8YNBhZGH0YoxjIGO0ZExk4GV4ZhBmqGdAZ9hodGkMaahqQGrca3hsGGy0b VBt8G
+  6MbyxvzHBscQxxsHJQcvRzmHQ4dNx1gHYodsx3dHgYeMB5aHoQerh7YHwMfLR9YH4Mfrh/Z IA
+  QgMCBbIIcgsyDeIQohNyFjIY8hvCHpIhUiQiJwIp0iyiL4IyUjUyOBI68j3SQMJDokaSSXJMYk
+  9SUkJVQlgyWzJeImEiZCJnImoybTJwMnNCdlJ5Ynxyf4KCooWyiNKL4o8CkiKVUphym5KewqHy
+  pS KoUquCrrKx4rUiuGK7or7iwiLFYsiiy/LPQtKS1eLZMtyC39LjMuaS6eLtQvCy9BL3cvri/
+  kMBsw UjCJMMEw+DEwMWcxnzHXMg8ySDKAMrgy8TMqM2MznDPVNA80SDSCNLw09jUwNWo1pTXf
+  Nho2VTaQ Nss3BjdCN343uTf1ODE4bTiqOOY5IzlgOZ052joXOlQ6kjrPOw07SzuJO8c8BjxEP
+  IM8wj0BPUA9 fz2/Pf4+Pj5+Pr4+/j8/P38/wEAAQEFAgkDEQQVBR0GIQcpCDEJOQpFC00MWQ1
+  hDm0PeRCFEZUSo ROxFMEV0RbhF/EZARoVGykcOR1NHmUfeSCNIaUivSPVJO0mBScdKDkpVSpt
+  K4ksqS3FLuEwATEhM kEzYTSBNaE2xTfpOQk6MTtVPHk9nT7FP+1BFUI9Q2VEkUW5RuVIEUk9S
+  mlLlUzFTfFPIVBRUYFSt VPlVRlWSVd9WLFZ6VsdXFFdiV7BX/lhMWJpY6Vk4WYZZ1VokWnRaw
+  1sTW2NbslwDXFNco1z0XURd lV3mXjdeiV7aXyxffl/QYCJgdGDHYRlhbGG/YhJiZWK5YwxjYG
+  O0ZAhkXGSxZQVlWmWvZgRmWWav ZwRnWmewaAZoXGiyaQlpX2m2ag1qZGq8axNra2vDbBtsc2z
+  LbSNtfG3Vbi5uh27gbzpvk2/tcEdw oXD7cVZxsHILcmZywXMcc3hz03QvdIt053VDdaB1/HZZ
+  drZ3E3dwd854K3iJeOd5RXmjegJ6YHq/ ex57fXvcfDx8m3z7fVt9u34bfnx+3H89f55//4Bgg
+  MKBI4GFgeeCSYKrgw6DcIPThDaEmYT8hWCF w4YnhouG74dUh7iIHYiBiOaJTImxihaKfIrii0
+  iLrowUjHuM4o1Ija+OF45+juWPTY+1kB2QhZDu kVaRv5IokpGS+pNkk82UN5ShlQuVdZXglkq
+  WtZcgl4uX95himM6ZOpmmmhKafprrm1ebxJwxnJ+d DJ15neeeVZ7DnzGfoKAPoH2g7KFbocui
+  OqKqoxqjiqP6pGqk26VMpbymLqafpxCngqf0qGWo2KlK qbyqL6qiqxWriKv7rG+s461WrcuuP
+  66zryivnbARsIew/LFxseeyXbLTs0mzv7Q2tK21JLWbthK2 ibcBt3m38bhpuOG5WrnSuku6xL
+  s+u7e8MLyqvSS9nr4ZvpO/Dr+JwATAf8D6wXbB8cJtwunDZsPi xF/E3MVZxdbGU8bRx07HzMh
+  KyMnJR8nGykXKxMtDy8LMQszBzUHNwc5CzsLPQ8/D0ETQxtFH0cjS StLM007T0NRT1NbVWNXb
+  1l7W4tdl1+nYbdjx2XXZ+tp/2wPbiNwO3JPdGd2e3iTeqt8x37fgPuDF 4Uzh0+Ja4uLjauPy5
+  HrlAuWL5hPmnOcl56/oOOjC6Uzp1upg6urrdev/7IrtFu2h7izuuO9E79Dw XPDp8XXyAvKP8x
+  zzqvQ39MX1U/Xh9m/2/veM+Bv4qvk5+cn6Wfro+3j8CPyZ/Sn9uv5L/tz/bmN1 cnYAAAAAAAA
+  EAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0A cgB3AHwA
+  gQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2gDgAOUA6gDwAPUA+wEB AQcBD
+  AESARgBHgElASsBMQE4AT4BRQFLAVIBWQFgAWYBbQF1AXwBgwGKAZIBmQGhAagBsAG4AcAB yA
+  HQAdgB4AHpAfEB+gICAgsCFAIcAiUCLgI3AkACSgJTAlwCZgJwAnkCgwKNApcCoQKrArUCvwLK
+  AtQC3wLqAvQC/wMKAxUDIAMrAzcDQgNNA1kDZQNwA3wDiAOUA6ADrAO5A8UD0gPeA+sD+AQEBB
+  EE HgQsBDkERgRUBGEEbwR8BIoEmASmBLQEwgTRBN8E7gT8BQsFGgUoBTcFRwVWBWUFdAWEBZM
+  FowWz BcMF0wXjBfMGAwYUBiQGNQZFBlYGZwZ4BokGmgarBr0GzgbgBvIHAwcVBycHOQdMB14H
+  cAeDB5YH qAe7B84H4Qf0CAgIGwgvCEIIVghqCH4IkgimCLoIzgjjCPcJDAkhCTYJSwlgCXUJi
+  gmgCbUJywng CfYKDAoiCjkKTwplCnwKkgqpCsAK1wruCwULHQs0C0sLYwt7C5MLqwvDC9sL8w
+  wMDCQMPQxWDG4M hwyhDLoM0wztDQYNIA06DVQNbg2IDaINvA3XDfEODA4nDkIOXQ54DpMOrw7
+  KDuYPAg8eDzoPVg9y D44Pqw/ID+QQARAeEDsQWBB2EJMQsRDOEOwRChEoEUYRZBGDEaERwBHf
+  Ef4SHRI8ElsSehKaErkS 2RL5ExkTORNZE3oTmhO7E9sT/BQdFD4UXxSBFKIUxBTlFQcVKRVLF
+  W0VkBWyFdUV9xYaFj0WYBaD FqcWyhbuFxIXNRdZF30XohfGF+oYDxg0GFkYfRijGMgY7RkTGT
+  gZXhmEGaoZ0Bn2Gh0aQxpqGpAa txreGwYbLRtUG3wboxvLG/McGxxDHGwclBy9HOYdDh03HWA
+  dih2zHd0eBh4wHloehB6uHtgfAx8t H1gfgx+uH9kgBCAwIFsghyCzIN4hCiE3IWMhjyG8Ieki
+  FSJCInAinSLKIvgjJSNTI4EjryPdJAwk OiRpJJckxiT1JSQlVCWDJbMl4iYSJkImciajJtMnA
+  yc0J2UnlifHJ/goKihbKI0ovijwKSIpVSmH Kbkp7CofKlIqhSq4KusrHitSK4YruivuLCIsVi
+  yKLL8s9C0pLV4tky3ILf0uMy5pLp4u1C8LL0Ev dy+uL+QwGzBSMIkwwTD4MTAxZzGfMdcyDzJ
+  IMoAyuDLxMyozYzOcM9U0DzRINII0vDT2NTA1ajWl Nd82GjZVNpA2yzcGN0I3fje5N/U4MTht
+  OKo45jkjOWA5nTnaOhc6VDqSOs87DTtLO4k7xzwGPEQ8 gzzCPQE9QD1/Pb89/j4+Pn4+vj7+P
+  z8/fz/AQABAQUCCQMRBBUFHQYhBykIMQk5CkULTQxZDWEOb Q95EIURlRKhE7EUwRXRFuEX8Rk
+  BGhUbKRw5HU0eZR95II0hpSK9I9Uk7SYFJx0oOSlVKm0riSypL cUu4TABMSEyQTNhNIE1oTbF
+  N+k5CToxO1U8eT2dPsU/7UEVQj1DZUSRRblG5UgRST1KaUuVTMVN8 U8hUFFRgVK1U+VVGVZJV
+  31YsVnpWx1cUV2JXsFf+WExYmljpWThZhlnVWiRadFrDWxNbY1uyXANc U1yjXPRdRF2VXeZeN
+  16JXtpfLF9+X9BgImB0YMdhGWFsYb9iEmJlYrljDGNgY7RkCGRcZLFlBWVa Za9mBGZZZq9nBG
+  daZ7BoBmhcaLJpCWlfabZqDWpkarxrE2tra8NsG2xzbMttI218bdVuLm6HbuBv Om+Tb+1wR3C
+  hcPtxVnGwcgtyZnLBcxxzeHPTdC90i3TndUN1oHX8dll2tncTd3B3zngreIl453lF eaN6Anpg
+  er97Hnt9e9x8PHybfPt9W327fht+fH7cfz1/nn//gGCAwoEjgYWB54JJgquDDoNwg9OE NoSZh
+  PyFYIXDhieGi4bvh1SHuIgdiIGI5olMibGKFop8iuKLSIuujBSMe4zijUiNr44Xjn6O5Y9N j7
+  WQHZCFkO6RVpG/kiiSkZL6k2STzZQ3lKGVC5V1leCWSpa1lyCXi5f3mGKYzpk6maaaEpp+muub
+  V5vEnDGcn50MnXmd555VnsOfMZ+goA+gfaDsoVuhy6I6oqqjGqOKo/qkaqTbpUylvKYupp+nEK
+  eC p/SoZajYqUqpvKovqqKrFauIq/usb6zjrVaty64/rrOvKK+dsBGwh7D8sXGx57JdstOzSbO
+  /tDa0 rbUktZu2EraJtwG3ebfxuGm44blaudK6S7rEuz67t7wwvKq9JL2evhm+k78Ov4nABMB/
+  wPrBdsHx wm3C6cNmw+LEX8TcxVnF1sZTxtHHTsfMyErIyclHycbKRcrEy0PLwsxCzMHNQc3Bz
+  kLOws9Dz8PQ RNDG0UfRyNJK0szTTtPQ1FPU1tVY1dvWXtbi12XX6dht2PHZddn62n/bA9uI3A
+  7ck90Z3Z7eJN6q 3zHft+A+4MXhTOHT4lri4uNq4/LkeuUC5YvmE+ac5yXnr+g46MLpTOnW6mD
+  q6ut16//siu0W7aHu LO6470Tv0PBc8OnxdfIC8o/zHPOq9Df0xfVT9eH2b/b+94z4G/iq+Tn5
+  yfpZ+uj7ePwI/Jn9Kf26 /kv+3P9uY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AM
+  gA3ADsAQABFAEoATwBUAFkA XgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtw
+  C8AMEAxgDLANAA1QDaAOAA5QDq APAA9QD7AQEBBwEMARIBGAEeASUBKwExATgBPgFFAUsBUgF
+  ZAWABZgFtAXUBfAGDAYoBkgGZAaEB qAGwAbgBwAHIAdAB2AHgAekB8QH6AgICCwIUAhwCJQIu
+  AjcCQAJKAlMCXAJmAnACeQKDAo0ClwKh AqsCtQK/AsoC1ALfAuoC9AL/AwoDFQMgAysDNwNCA
+  00DWQNlA3ADfAOIA5QDoAOsA7kDxQPSA94D 6wP4BAQEEQQeBCwEOQRGBFQEYQRvBHwEigSYBK
+  YEtATCBNEE3wTuBPwFCwUaBSgFNwVHBVYFZQV0 BYQFkwWjBbMFwwXTBeMF8wYDBhQGJAY1BkU
+  GVgZnBngGiQaaBqsGvQbOBuAG8gcDBxUHJwc5B0wH XgdwB4MHlgeoB7sHzgfhB/QICAgbCC8I
+  QghWCGoIfgiSCKYIugjOCOMI9wkMCSEJNglLCWAJdQmK CaAJtQnLCeAJ9goMCiIKOQpPCmUKf
+  AqSCqkKwArXCu4LBQsdCzQLSwtjC3sLkwurC8ML2wvzDAwM JAw9DFYMbgyHDKEMugzTDO0NBg
+  0gDToNVA1uDYgNog28DdcN8Q4MDicOQg5dDngOkw6vDsoO5g8C Dx4POg9WD3IPjg+rD8gP5BA
+  BEB4QOxBYEHYQkxCxEM4Q7BEKESgRRhFkEYMRoRHAEd8R/hIdEjwS WxJ6EpoSuRLZEvkTGRM5
+  E1kTehOaE7sT2xP8FB0UPhRfFIEUohTEFOUVBxUpFUsVbRWQFbIV1RX3 FhoWPRZgFoMWpxbKF
+  u4XEhc1F1kXfReiF8YX6hgPGDQYWRh9GKMYyBjtGRMZOBleGYQZqhnQGfYa HRpDGmoakBq3Gt
+  4bBhstG1QbfBujG8sb8xwbHEMcbByUHL0c5h0OHTcdYB2KHbMd3R4GHjAeWh6E Hq4e2B8DHy0
+  fWB+DH64f2SAEIDAgWyCHILMg3iEKITchYyGPIbwh6SIVIkIicCKdIsoi+CMlI1Mj gSOvI90k
+  DCQ6JGkklyTGJPUlJCVUJYMlsyXiJhImQiZyJqMm0ycDJzQnZSeWJ8cn+CgqKFsojSi+ KPApI
+  ilVKYcpuSnsKh8qUiqFKrgq6yseK1Irhiu6K+4sIixWLIosvyz0LSktXi2TLcgt/S4zLmku ni
+  7ULwsvQS93L64v5DAbMFIwiTDBMPgxMDFnMZ8x1zIPMkgygDK4MvEzKjNjM5wz1TQPNEg0gjS8
+  NPY1MDVqNaU13zYaNlU2kDbLNwY3Qjd+N7k39TgxOG04qjjmOSM5YDmdOdo6FzpUOpI6zzsNO0
+  s7 iTvHPAY8RDyDPMI9AT1APX89vz3+Pj4+fj6+Pv4/Pz9/P8BAAEBBQIJAxEEFQUdBiEHKQgx
+  CTkKR QtNDFkNYQ5tD3kQhRGVEqETsRTBFdEW4RfxGQEaFRspHDkdTR5lH3kgjSGlIr0j1STtJ
+  gUnHSg5K VUqbSuJLKktxS7hMAExITJBM2E0gTWhNsU36TkJOjE7VTx5PZ0+xT/tQRVCPUNlRJ
+  FFuUblSBFJP UppS5VMxU3xTyFQUVGBUrVT5VUZVklXfVixWelbHVxRXYlewV/5YTFiaWOlZOF
+  mGWdVaJFp0WsNb E1tjW7JcA1xTXKNc9F1EXZVd5l43Xole2l8sX35f0GAiYHRgx2EZYWxhv2I
+  SYmViuWMMY2BjtGQI ZFxksWUFZVplr2YEZllmr2cEZ1pnsGgGaFxosmkJaV9ptmoNamRqvGsT
+  a2trw2wbbHNsy20jbXxt 1W4ubodu4G86b5Nv7XBHcKFw+3FWcbByC3JmcsFzHHN4c9N0L3SLd
+  Od1Q3Wgdfx2WXa2dxN3cHfO eCt4iXjneUV5o3oCemB6v3see3173Hw8fJt8+31bfbt+G358ft
+  x/PX+ef/+AYIDCgSOBhYHngkmC q4MOg3CD04Q2hJmE/IVghcOGJ4aLhu+HVIe4iB2IgYjmiUy
+  JsYoWinyK4otIi66MFIx7jOKNSI2v jheOfo7lj02PtZAdkIWQ7pFWkb+SKJKRkvqTZJPNlDeU
+  oZULlXWV4JZKlrWXIJeLl/eYYpjOmTqZ ppoSmn6a65tXm8ScMZyfnQydeZ3nnlWew58xn6CgD
+  6B9oOyhW6HLojqiqqMao4qj+qRqpNulTKW8 pi6mn6cQp4Kn9KhlqNipSqm8qi+qoqsVq4ir+6
+  xvrOOtVq3Lrj+us68or52wEbCHsPyxcbHnsl2y 07NJs7+0NrSttSS1m7YStom3Abd5t/G4abj
+  huVq50rpLusS7Pru3vDC8qr0kvZ6+Gb6Tvw6/icAE wH/A+sF2wfHCbcLpw2bD4sRfxNzFWcXW
+  xlPG0cdOx8zISsjJyUfJxspFysTLQ8vCzELMwc1BzcHO Qs7Cz0PPw9BE0MbRR9HI0krSzNNO0
+  9DUU9TW1VjV29Ze1uLXZdfp2G3Y8dl12fraf9sD24jcDtyT 3Rndnt4k3qrfMd+34D7gxeFM4d
+  PiWuLi42rj8uR65QLli+YT5pznJeev6DjowulM6dbqYOrq63Xr /+yK7Rbtoe4s7rjvRO/Q8Fz
+  w6fF18gLyj/Mc86r0N/TF9VP14fZv9v73jPgb+Kr5OfnJ+ln66Pt4 /Aj8mf0p/br+S/7c/25w
+  YXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAALA3BhcmEAAAAAAAMA AAACZmYAAPKnAAANW
+  QAAE9AAAAsDcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACwN2Y2d0 AAAAAAAAAAEAAQ
+  AAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAAAAAABAABuZGluAAAAAAAAADAA AKPAAABXwAA
+  ASsAAAJ5AAAAlQAAAEwAAAFBAAABUQAACMzMAAjMzAAIzM2Rlc2MAAAAAAAAACkNp bmVtYSBI
+  RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAA
+  AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAc AE
+  MAaQBuAGUAbQBhACAASABEAABtbW9kAAAAAAAABhAAAJIjAgAqqcBCT4AAAAAAAAAAAAAAAAAA
+  AAAAdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUsIEluYy4sIDIwMTAA/+EAQEV4aWYAAE1NACoAAA
+  AI AAGHaQAEAAAAAQAAABoAAAAAAAKgAgAEAAAAAQAAAoCgAwAEAAAAAQAAAeAAAAAA/9sAQwA
+  CAgIC AgECAgICAgICAwMGBAMDAwMHBQUEBggHCAgIBwgICQoNCwkJDAoICAsPCwwNDg4ODgkL
+  EBEPDhEN Dg4O/9sAQwECAgIDAwMGBAQGDgkICQ4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OD
+  g4ODg4ODg4O Dg4ODg4ODg4ODg4ODg4O/8AAEQgB4AKAAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQ
+  EBAAAAAAAAAAAB AgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhN
+  RYQcicRQygZGhCCNC scEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RV
+  VldYWVpjZGVmZ2hpanN0 dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4u
+  brCw8TFxsfIycrS09TV1tfY 2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQ
+  EAAAAAAAABAgMEBQYHCAkKC//E ALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXE
+  TIjKBCBRCkaGxwQkjM1LwFWJy0QoW JDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZX
+  WFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5u
+  sLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp 6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A+To438
+  n5HVipGCR1q/Em6JiwOc9PrUEKbY8KCd3SrsUZ UfNk7sZA9ayje2jCbjHboWoh5gIJCsp71PH
+  ErQltrDcfXrTQvz4I4zwAeasLE8bcA4HTNNU07u+o oKLd0yaJFEWQCGwCD6CtJBFsOCSx6nNV
+  wuxE+Q5HC59KsxxuACNufUjpWjp33ZLm0TwpsdgnO3HG fWrSjEnG7nr+VQRIWYqQ3J4q7GMNn
+  OCTilaNxzaT1Y+NWSJQw6Lipo13RM3pgfjUa5RzuO5asxKi kEkYA6VqtI+pLaWhZZRJFGDlyM
+  kY71MgUIecgjn61HbguCjoyg9+lSxoVbDHbnkkjpWaj0fQldri g52+4yaFj2y8AqvbmlCls4O
+  DnAJ9Ksqylxxz0Fa81mrIt3jHTqKkW/DZ5PJxUgQhmByXBz+lAAUA k9D2qcbAFZTuPcntUOUm
+  7Iq17SYigNGoYbiF7UhGJfQAZz2zUiliduRwdtTkYQhSFXd1NDk927lR Scit85kG3gnHFLhwA
+  FHOc/Wp4wNuVHHc1IACxB7D16VE2+a6QX3uiEJlD8pyTkj0p2394QQSQMYF SnOSMhe3Sm7Cjq
+  mecck1fNeOpMoprRgFOCOetOcMSrHg9elPAxIN2MHkcdqcRltuDg85rG0m9EFu zI/LRWwAScZ
+  Jz1qdYQ6EkYZe1KiFnG0qPXNPwSQpJI7Y705yfRltSe5XdHLbu2enpT1HzorHOBjH tUmxhkkP
+  j+VTJGwYFgNp6k9qXncIzTViAxgAjsPU0Kn4euas+WcOx4GaBHk7sL1GM96q65Xd3KjF W0ZFj
+  aSQQ425NSrGSARwTkA9s0qRqCSenQVZCrsO0MOelRKSTSSM3q9Csy5Us3LnH51IYyYs5zg8 U4
+  JyTtJwanCsEwMHDZxjkD3q4JNle8rscgySOM/xe9O2sMdTjJx9KmSJt7FgASevtT1j3MCucg9/
+  SpcnfVGcVGz1K5A3K5545+tChshh1PUmrYjUxlQCy57elBSQPwowDjmm9VuNP3WV+EYEhsZwD7
+  1J 5J8hPmBPU+9WFBEhLAcgHkd6MFQvTI45PQVV9dUOzbuiqy7QY14wc59qV41LYHJz61Oqqck
+  5Ck55 70BAH3N+B9aXMloWm4+RD5fBU8Z70/CGIIRkgCpH+UZYZUd6REClRz64PUVUWum5Ls3e
+  40KOWPJJ ySO1O2ARk7SecjHrUx4G7aCuc1IIt5G3PqwpXfVA1FSRXXPkruO3PApArlxhgFAw1
+  WOA4UgLzyT/ ACppUuu3B2selWvd3RDTTd1Yr/OZM54PU+1QqDu5OwDocdauldockfTNQAttBl
+  AKdiB1pdW2i3Hm V0tCA9HwDgNjFVHAM24Da2CRn0q80eWPGFIz9DVdo+u75h0yKiN4PRgrRV7
+  3KgDbl24B5xnvUbB9 x2jAH86uBBgsM5XvnpUBDEE7lJ7itLoEkiIKwO5Dgn1HWlbywxDk5HQ+
+  9TE7odqDaucjPUVGw+Ut wxPYCsVBbBy8xG65jcHJycDHeq4j3LuHAA+6fX1q9jeMgDJ6HFQbS
+  YsZ6frXRBNJ3JbtuisBiTK8 8jj3pXZyjsOCCOoqfaDKCo+975pxVhHtwAMYJNZ631FzK+xS2h
+  gxYcqvr1qIYDbiCMj86uGPDBWH TuO9Q+UCgC/fz1NaXhs2a+0SVkQBR5me5/Wo2CkMGyvHU/W
+  rRTM23DZzyewprKwKbgSMdMVlzLWx GiaZWZjgncMdAKh2MZPu4wME5qw6cL8v3RSNteQqnUD5
+  qSduhUndaFJ0zDg9R1xUBjDJtwdpXIIq 4yb3L7H9wTTHXbBtTHzdCaq/K77icVoomeYiybHO0
+  d6rSJt6EEdiexrTKtxsXLY5Paq7RMJgSAV9 AO9aRloxwhzbsoup2LzkHjFV5EJCg4Cgg5J71o
+  vHvZQT8oyenJqJok3spy2RkUmna19yNFKyZmkF Qp77TkfWmYAUKwK854rQ8tGiBLLnuPU01kX
+  G/cCc8nHFRey1KbVrWM4oPvAhWB4J7etV2RfkUckN lauunm4JAHJOMVXlj2gEHoM5qKcYq/mV
+  Dkdmys20naecZGRVcqQAduATyPStJAB8q7Xz6dxULsm0 gRk49T1pTcl0M5rXRGaYwqAschhgj
+  pz2pohVSH5DAYPPerk4Aj2k8KPkJqMqhVsjA+8aykoyV1qy KrbdmcPbIxtyuVDk8fnU6rIGwd
+  ofkdO3rTIInVztB4HrV6AMW3Pznnnr9K0Ti/e6lxS2JI0Cpuxu I6Cre1WXBIyM8jtUaBWcFM4
+  PcnirO35gvOSMgY61cZrZjcHGWwi7iuCcj+Ee1X9hXaW4GOcnvUSq DtAIYDgEVbRCBubJwcVS
+  kk77EX5unyFQnapVjwfWrigjkHDcHJ5qFVIjD4G0jgkd6srGGm5IU4ye a05+idg93axKCN6kr
+  vBPIFWU2iR8grn7opIIwTtDAgc4qYRESj5DhelJVOgRkh6K5X5uFHT3NWM5 D56ds0kSkCMEdu
+  hqVEEm4ZAb+lNpLV7DhK716CAgAZIXb6ipCSUYfx54I9KcEGdzfMO3vUwUsQdp 9zUOSvciDs7
+  iRhfJAI3AEDOeasEqVZQhB3YzTFXksFOMAjPQ1KuWl5GOetOUrlNSXoBQHaOjcfnU ka5U8YHb
+  PenlOeDnjipowcruCliMAAVkqivoTKWtyNFwrZHy+3rTRlnYpww9RVlk25yehAxTdv8A dGQD0
+  qlO+xoprls9xrMCB8wyf0pCuWHfHenCPMuzGOeuKmSM7kBIZTyfX6VF9GPVOxCvLZPOD27V KE
+  bIJypB4PtTyquWCgkcdOtSohG35WbB4FKLk7hLyIwrGU7umck461OqnIBABxxgUoV15QBhyRxU
+  6eYeoyMfLxRe1rpBza3bsQZQjcfu9TUygsrkKewB7U7CBcbcZOOaeyB9wG4ZYdDilLlRLV43aI
+  TG uPmJ6cD0p21sBODjgcdqnxmPIU8cD6UuTtw2D6cYzQ46FySk1cjCfu8MMgHjFAQlNoGVz1q
+  4qghS VyT2oC4QYVjk5JHalC9rijOMVpoVkUhyQC4x0FWQB5bYG3d1Y/yp+z+JAct/KpnX5Azj
+  bz0NNTaY k4vcr7ZNoyQwHT61NtO44OM/p7U5doVdx5IPSpgCEAGCTxWmluxUdFqyMAhcHO3GK
+  cSfJORkAjp6 U9cFgMH/AGs96fszGV2n1xUzXSwKdyIE7GUjjqPWmMMjoTk8+9TjG7ZyzY5FLt
+  3KNwwR29KXw9Ac bNELITCVOGbsQKaAxkI6AdzVkgliFU7R3pdqm4YlSoOMZp82gcyk7EGNyjc
+  QwxggU0A+aXCYY+tW lTO3b3PXFKEKJwCcVSfvWsVztIgbe23cPy70/Y2CBnPXr0qVfmBVl4Jy
+  MU9IwAR0HbJ6Ucz6IzTa 1kyLYMDncWHTHU0NkAKFxjjOOlP2Ethn4HpSAbnz144BPNNy1CMdd
+  dSsWy43jdj26UhH948jsBUp QtIwxtIPT0pWX94GUHO386huI3Ho0UXjV3ZS5Uk5AzTRGFkJOc
+  dvarGBvxgk7eD6VHs3RKTuDZwc 96J3ve5bTatcpMSrPgD73PFJJHnHG47cjjvVh4w82GO3NN2
+  lmbkbRwvrRGpZak8qbK4RdoPc56U1 Yssc8Lj8an2FWA2kDrmjaSJF7Acgd6qE2nZAoroVzkRh
+  MHryR601lLK/RecdKsbVQhs5BOMZppUD LDoWyM/zpuUn5lUuVN6FFDhsgcKecUOQVODhifu1b
+  KjcSBt9TUJQqRlcE8Z60m1fUUpq2xAQxG4Y yM5yKiY8jcV6YOBirexgvIyvUkVXKhotuNp7E+
+  9J27ExlddyJkzGqA8g4+opgQ+YTuyoOfc1MQm/ axIIXtSIqHDchgp4zS5ujJcXazKnl43NnIL
+  fjTCWBJ+UZzxire0OMgYXnPNRMpZQNpx9KtSuh3Kp QH0BA4Gar/NuJVlK5wAfSr5HAJwQOw6i
+  oiBsJI2nODx1pqL6FOS27lRlj3ZUnntmogqtuyCBwTV4 qBDwPusB7moggxgMApOSKz5o3sDir
+  XKJiGAD/A3B9cVG4zCCAADkZx61oFi2F2NtyeSKg6wfKowD 0I6+9a03fWRn71ym0YEW3AyOp9
+  aq7Au4ckdh6f8A160Xj/dDdnPbNQeSCDuJIz69TVWuro0VmUHC 7AuGG3pVfyQ1xt3YBB4NaDQ
+  7Mt1LHHNRybWK7mULjhhwBUPmbuiZtRdkzLwF2quA5GR9KrvG29lY ckdfStJkJj3BVYLxkVCV
+  dUBxuycnik5a3BN82hQ2c/N8317VAY2JZuMY45q+6b0Jyc+npVRl2Abu F6hu2ayjPmlpv6BNy
+  scWkR3jy2LAnB9quLjesZZX+nGDTY1jLkYZT6E9asDHnMccqeKelryZTjL1 FjYKFB7cYq2u1S
+  u70xn29KYqLlTtPIz06VONznDHCYHUd61cby00RKcXezJgQASANuMgDrU6FimE yVwBmmIMbVy
+  B2JI4qwmVOM454GOoqXZIlOUVoTJhjtY8A4/GrCqC+FPze/NV0CEMNxGfSrKAL8oy W65PaiKT
+  WzE27WluWgxVtnG4kc46+1Wgrn7o4zwT2qqh+QO3UNjOPWrhP7kBWUELzSu001oRy20S J0VVG
+  7JYHoKkjAAdz8pNNjKsFVVZiF69qVmDBAM5x2rSMeZe87lXT0JFXmMs4GB/KnLkRhgxyR2/ Wl
+  2guoxyeeakj27UGQp64PaovJO6Qk3HbUWP7/Xv8ue9TkOzPtA4PpQEBnDg8Dr6GpSPkLA8Yxij
+  nTZq7qwJnYA+SSOwxzUwVlkG44OM/SowMptTjB6mpwoZSTnI7Z7VTb6iWj2H5wDlctjIPpTRyw
+  zn 3xT1RSRklcdc1IFCsGzjI9O9ZxUNbAnbWxXCKThSR3GT0zU5XaVXOWPp3pwX93uCk/NyalR
+  RyWyp BOM9jROS66E8zvoNU4I+Vl55JqULnc/IYniiMeZHuHQHk9jT1x5mARzzjHIp8umxq3ro
+  PXBVQMgj v2qQLu3jBUfWpPLOVw67SvI9akXaRxlm74PWnLTUjpdkIiHnsDkgHIqdFYxFmVcjv
+  ilCsMSLxz1N SspDc4xjJFQotyuLV69CGMkPyOnftineWwkIC5FPKDY69SDSKjFzjKgf3jRbRt
+  sbgl5Cbdy4YEYA BqTaCjIOdvB9alVG8xsLlcYA9akCYIAOecDNPmu97FJx7kYwD042kcdqVc7
+  djfMAOB3p3zbgOPfj rUobLDK9tpx2pRi7aohNX1GgKAoIB9Tj9Kbty6gZHGf/AK1WNoQhscA0
+  9VHILA5746VVkXGViEr8 4VO1WAFADt0xg+1TBQCCRnjOaDGrx/KOSOM9KhN3DmVyodyvlRkg5
+  6cmnsN8gYqykjBx61N5W5lH LEccdTStGQQAhD9GJqrpyDroQfO0ez15/AUpOTt2HINSiLPAzu
+  we9PIIBADZI4/xofI1sNMhKYkB /g6/So1VPMU/MCw/vVcyWhIBDY4IqIgAqMHjP+RUwV2xvfc
+  RP9Y3QkYwaXG+ZW3Acf8A6qGUlAFw CD940Z287d+ey0cvYjldrpjH+/k/dJzSIcHd/CR8pqZQ
+  Cxdl3Hdzjpmoir8jrk4A9PWtFcE00MIA BLN8xP6VEdwZW4wPxqc4Uj5fl7Z7VEyjcSu7BPU9A
+  aUtgcrtXehCQxcE460wuRKqEdRgVOR84Bx0 /P3prYAUYDY6kVCk7lOGlyFolCbm5btUBBVs42
+  qvT6mpMNwwbryBUwAywyCSfyrR3jZkxauVAoK4 bOM8HNC4yybfmPUipNuUAYZOfzoCsZAOAev
+  /ANamo33L+FXW5WZFEhHX0BpxXzHcgDdx19BUzEbi WXBJPHeo0UtJvCsgHBU+lTL4dTOfe5Xd
+  B5pZuMHIUd6iYZbvgkVbkG1TznHf0qFkzI46D+92qeZ7 iSRWcZn2nIbODzTCpGSMHB61YZf3b
+  ZGAO+eTVd4yA2MnPvQk927DVlKxG6jBJwcnk+lQmMFTjJA7 9KlkBWLnO3pinEfIQpHT8qpNtI
+  NU79Cru2odvA6NSMjcBTkY61JtJhDNjlhkAdKeU+UgOFbPJP8A KrejuOL10RVK7IyGI64B9Kj
+  2Ah9wPTKk1O0bFgjnbu6d6btAdhtLc4P+NLRa9yb62bKm3EQDA4xk ketMaM43Y/i6Y5FW2UHG
+  Bmo34PAy9KU7i1asirIGKY7kjgVEQSp3HbjjPqKsSKQTj0BNMPzbsYLd 89Kq+qsVfuQk5YFun
+  QAjioyp2KQDyc1aZThkG3JHSo/4FTBOD8xH6UlG6egnLQolN2dvQDnNVGBC 4AUg9citd1YLjK
+  nJxgcVUkiUQMG4YccU4ya06Cg0tWZ3lLu+X7uM4BqrInzttcH6VpHcG/2T271W aMoF55Kk+9S
+  k3rsaK6bszPkiITczAFuQPQVUMSlPmOQvH1rSePMALZLH37VWkiXJ2HaOvNVzWRPN b1OQ4YLt
+  VTjrxU8cQMiylcDrnHenIvzljjcTgAd6nXIjYN0B5XuKxTd9URHR3S3ARE5wAARmpo1Q hiQ2R
+  j5T1BpQF25DfLwQfapFXDuFBwTz64rW11ZsfM7bCoMHOCTjn61OpUv8yjJ6EdqbyoI5JPPW pl
+  GG46EdamMW90Wo6PUkCAN/CBnJOKsKp2fKC7dGqNYgmCT1NXIwPIC9VPP4+lVTcWmupM5K2jJI
+  1O1QBwTnj6VZjj2jcWyccj3qJUwqYJXnvVlVUBSCBk9D2qV7quZubY5RkEDIAHGKlVeMbSpzzU
+  aq AQc4GOBVhAH4JwelP3+UpxaW+g+NldSDw+MEU5QWlBAx2xjrTEVftDY5I61Nyr5IJPt0pcj
+  TLj7z 0JkY45IBI6YqQr8gHUDpxUaIABtB5PP1q7tGPccYNS0oscFyvQYnzH5cZPTFTKORwRxw
+  PWkC5BOM g8DFSrncFPUcim1bUUnfW4g+VMhSc9c1IY8y7ucA9DQY9/GTz3HSplAEOQDknvT3W
+  gruyY1FyhLn AHIx61LtBjDf7XNNCtySMZ6gU5cnae/92okubqNJLYkCbVIGMY605OeSAPl60r
+  DYM9MYxzTwMvgH APX0ojZ7scZN6MlVCyKXGAv4VKFUSsSQBnK+4qJA7Bg2Qo6L6fWrqrGdxUb
+  l449KblyqzYWdvIjV RvwPnDcn8KmweODgccinEYlAwMdqUoTIoLdOabWt2Jt3syHbmTcOucED
+  uaVtoVQ3BPGTUxjIz6hs 5qTblG+Xjd+lU5K1xrTV7FYJljlzgHOe1TbeSVVs49e9O4JcsMKT0
+  FSKQrjB4789awblbRAoys2Q KSrD5Tk8gnpVhUAKkLuGCTShN69yw6Uqn5ioBU9+atJuzsN2+H
+  uC5VyzggehqVETaBtzz69RTkiM krPj5SvQ84qRlOQxI2jsKeknbqNWTsmO2AH3HamfMpXcBnG
+  Tx0qTkwED0zn0pu3OCRnjinFa6kNN qzDsc8DI5pwB35Jy3b3p3BTIBA6nNAQl+CM96hrW76By
+  WtYjA+YKpw3XB600LIsvIOO4P6VM0Yxu AO49TT8HA7GqUU3ce22hCMkDPDdzSYUjef8AgIqXy
+  y2Rnae9DR7EHoOopJR72BRs1Z7kecJxt56i onGEOB8zDtUyoAvBOKQ7BKvXJAzzTh1sCa2K4f
+  BVf4R0A/nTF5OC+M9qtMIyWO3B6A1CF3bcA8Lx xThNrQJLaxExHmE9RxgetM25cAErg8ZqfGE
+  IYYbFRH5SgK5yOPXNTzeYN3diEjAOBnLcYprIRIVY YGOtT7S67sYYjcaZ5TYJIOc4BpJWepLT
+  tbYYRmIKFI3dKhIw6jnuM9quKH/dgjgc5xUG3Mm/rk/d x0q0+bQtVJR0RFyGVSQcDgUMAXkJU
+  gk5OP5VPtDOcckHtUcyEoSAVJPA9Kq8X6kc3NIr7cyAMDgj jHtRkrICSAT7VMuPkJyG757Gkb
+  PJK5J6YpO70YSd20VHUvHu3AnPboajbCOFOArHBq2w27VAHTp6 UEApjAPf6VU2r2HotEUnU7m
+  Kjfnt6VGwcnbt2kDnjp71aIDMVOdxOQe2Ka6kZ+916VLp3KXLzLuZ +Nr84Y+9H7sx4XhzyRVn
+  y9z/ACglsY3f1qLYBDjGCT1o91oLK+4xwTGGjAbPUCoMZi+YgOOntUxy nVie4x2pzKu7jJDHG
+  aHZLREu97FSSNmdVLDdnAIFMbchCEAsBzVqRS0eSOfT+tRTZMTv6kA4pqVk KMddSmR8wDZwR8
+  xqPgP0zxx71ZCKpyQcBe571AB1yRuHFVKSauXBLUjI5BK4Lc4PVaj2neVcbV6H AqVVLMcfNxy
+  TTSDuBJ68GpgrPUma7kZCMDjIG7hqgWT5dp5OCOP51aZVdODx6VF5ahSxI3H5sY7V cWr+YrNL
+  QiK8DeOT0AqHY2/Zt4znJqwSx9MY4JFRYYHrhRyfrR7NpPQUm7FKdRvHXKjk+tVH+b7o IbsfQ
+  VpMv7sBgOhzkVAy/IW4AwO1EZpoqLcUrGbJBjb1YdiOlVJUGG2Ho2AOta7BQW6nB5qjKWZA Rh
+  cHJOOvvSjNteRK35n+Jx2zLkFgB1x3qwvlvCSDknuPT3pkKctv+ZmH5VbWFfKP8K+1S3Hlu0VT
+  UktBiKcxqMHaMfWpxuMhJGMcYNBVdyYyScZ9qlCjJOfl3Zya0m9UiHT1fMJ/GyhSnOSakRQck5
+  JH 8IPSnCIhiSmSGxmpYgysWABOemKlRvKyKUktiVUVlIySOuM81NHGpmj+96gg96EXeylDjHH
+  Tp9au Ip3cYP0p8zQRu9ESAHY2SBhh19KeFbaVHzKCOlNwjxkMD8w5we9Tqu3Z8hPfg011E2kt
+  h3lg4JyA Dz7VKuQcfLkHPPYUKMyZJ2jqM96kCq4BAZiTyajTVMvVR1YKpbBHIz27VaWMKvJye
+  3vUIiKybRke v+NWgCFBPJxzTlJP4SVGSSdxIwjOWyRnselWE+Y8fNkcUxAxVTtB+g6Va8sYIT
+  txnNRdKSTKbYCJ ieMrgjgVKsZYNjIG7IzzRGDu4BG08GpVXMiu+evABpzk2LXdkUauHOCMHqK
+  mUbZguCR0JPalYEKw PUdcCnxgNEzEYI9TWU00hWd7oQJ8mCc4HBqQIqKpzu29/Q0oBOFwATzU
+  xBCMduOeRUtONrlNydk7 EcQDIykEtnj29qmaPJXAK4680KOFbBJI7elPCbo1wduFJwfSq91dC
+  rPo7Eq/eUBflxxUwABOcgf1 pqACFN5UsecipkAMg3Hg88UoyVr2JVm7Dgm9t3UEZFP2hFBJxu
+  55pFB3gKrFgOlPKMV3N3PB7VTv a7GoJvYRow+5lYDP5mlXIZOp4pdjBFUtlRnGKkERBBIbnt3
+  FO91ua83LFJ7BtT5jwBnFO2jPsB19 KkCkgLtO3GfrSgEvgkAEdMcmkrcy0FGzW+gxQCoKgtzj
+  ilwROARySefapgm04UfNnnFKfvqSvXpU 3voTe70/EWNZd3P44qRwfOAAHPUYpEVmkYDpnjH6i
+  pwrB9nU4x9KmWjJu1Ig8vLAFTg9DninKCV2 gd+CalUk8A/MTmpFIbKt1rbm01RTjK9yAAyOfu
+  qRwB604ghAuMMcGpU6kDGD3I5FIqfMWJwVOMno aj3t0hTjeRCsZXJbGPrSYPmYP3SMZqcbiow
+  uQvf8aUhCVycEH7o61oovqGlyAwhFzye3JpPvNjnb jg1Ic/eLA59+lIMeaG2nG39ahxa3KbaV
+  2RqpPzbhjBycVEUxGoI5PB561YOzgdCOvvTijMSy8qDk AGs3U5CFzXuykw7DnHQe1NHCHjBzz
+  U+MlQwwCOPemMm98DGM9a1TuhtQZAdzEuudpOee1K8ZIjA4 GcZqVdzPtBG0j06CkMTAbVy2Dk
+  k0ot37F1IrS7IGDrnHQjFOKtt4BJH8qs+WPLKnOexzTFVlQKCc k9x0FJz0uZOloVlGZc5xx0P
+  WmlNrLkH1B9qteWeD0JGaULx1DN2HpVRWliZR5VdbFXauQAOvJwaJ NocgDdnpk/pVp4gTkgjn
+  gd6Ro2YLhQB6nnmnyor3U1YoFPn5ZeuAaYYzgAjLDg81om3KgMSOpxgV EFBfKc84PPSn7ttAU
+  le5RcEsdq/IMc1AEZpGypxnj3960XSQEkqcZwABTGDIuSuG7E96b006im2m upRMYDE49vrTcE
+  5bBzjvVzbwCwJpCpCBQMjHQ1jJNNXHvdGeRj5lznOPlqNVUMhUqX27SDVpk53Y YAVDJEzSDkK
+  DVJSW5KtaxTkwBgEE9+KjI4AwTkVZljjyfm+YDGPemmPKKB/31VruXzqBUGCp2ggA bagkTajD
+  kAt69/SrTnAcFW4P51WkHAbady9vWkpMKl3a5G2DHs7tzioZFbzNoAHPYfrUrhjhlO1Q e9MZR
+  5rLuJY9MdqqTWmolFpX6EGMZAYDuD60MCVBf0z9aTB3KpHzECjDAEMQCtJQ1LuyMhsZUcdO el
+  JsUplWAYDGPUVKcHpjgcj1NLjMK7gFbkkdOKpS+8ht21Kzrh/7xxx6YpOAuOhz0xUuR5YGRkcH
+  im7kGSfWhQbQlq7MpFSZNxOBjvUbkBdxGQTzV0puk44P9KqyREbSMYBPXvWnkJK7V9ikwwrDac
+  no KoyRjA7FupNarRsAxIJdT+BqnIoHJwxNYqd37o2r2OSVAH4GTjC+9SiIlP4hgYPPWiNd77O
+  hJzU6 AeYcnkeveiEWndijKXzGoCHGep5H0qdAAEfHBHBqRFH3mU4fJ4pUA2hdp5Hr0q/djqhR
+  ldXGkjyj jOSct7VYgwfmZl4OD6Gh1Uop2MrVaSNBGcDHPU9DRNqMdQ91LUBh5o3UjgnIq0oKH
+  LL8nG0+ntUK Bvk3LtYrk8dCKuqSQC/3OpBpJ6aIbTi7t7iCE+XkcEHOB6VNGgx0ZVbqSc0Ko8
+  xtpLcYODVlVxDw 2OOQR0qm77j1T1ZGisFYZQgcDAqzHt2lMYx/OnIMrx2qxGAJMbcEc896xem
+  w48sVdoYqc8DIIx15 pQgXDEcHg896kMbs8gzhQePpUmzKkcsMnJPrVQlpZDjo9BYlcxsqgZHT
+  PcetWUXy4+oJzSxx4hQn IYggCp0T5cBSXHOaiSbIkuXYYiK7cH5icnBqQja4KA4VtuMVKNq4b
+  GWyMYqRkPmAg9fmxVySSByf qVwuGJbI78+lPXaTtwMZ/KnbSzgYYnOfrTRw6sw+XoR3xWerRV
+  lF3e5MFKjOw4HJz1p+A8oySccq PX60IPlDBWwTzk9KaquFJXnBwPU1Lbej0Jv5jWB8racx5xg
+  +gqeMkZx82FI3evtTQvmJgttbpzTx Gylg2CMYAFOyvqbuCfUkiX92rZGO6+lW1TIwQduetQxD
+  5WVvbOfSreAm0cgYzyaOfo2TNxi9NRMv t447fWpduIvusefu55FQ5YMDj3z1Bq0qsTubPsBVq
+  KWz0Ks762EjjBwwPc5zUvJcAggAZ3HtQPvk 8BfSpQrllHXNS7bszlve43nb6+9TKp2EgBsDOA
+  OaRYz9OM4zV+9vZb65SaZY1YRqg8pNowPp396i bk9LaepajzPRmfg5BKnlue1TMmZcAHJ5APp
+  T+NoCdz370pG1x/Hx2pqLbuK1t9xgRkXeCCCecVN5 b+Q/UH1oQMEVWUk54o2s0yqrMuBg5PU1
+  pZ6CteWoKo3biMBTyaVTmMhyFOPSgxs0PzffHWpApxyM Y4FTy8q3KlFNakQiJYdQQeT/ACqRB
+  hQuQMg4BGakAyoyOB3po5OSmMjr7VTTb1Rnz31vcRQNmRyp 600xqJ+clgORnmpAMoB1Q8ijaD
+  8zHH+16099UNR1uV2QbuhHp/jQFXaC/BwenFWFUFJG5PHY1Hsd WBbgEdetZ7p3ZUrIiCEZC9y
+  MsfaoWOZCMhc9fSrbgEsGVjxke9QDbnLAL8vfvRG27VxKz2IlTOD0 471GUUkHIABq0QGTABPP
+  H+FIsW4LkHimhQ5lqyExlV29s5yKcFcENwDg9qlGPPK5G0E4HrQYyeit nPXNXSWqvsZ2VyFjn
+  eo4bIIzT1jTbvY4PYetTGIh8hRtH51IqEE5TaeM0pRXQ1bKeHIPy5xx0p6R F2Bx1HDdqvqik5
+  cbDg/Q0rRhIDg4GOtQ5JWJk/spbmf5Q3Hb3PGaaqDewPYY/Grvl7lDZAyMA4pp UGfnhh7VUUK
+  a7lVe7MM7fWqzrlchcAHJxWg0YGdoJWhYSVK4ySMnPtWqilqNNJ7FBl+fAzzVdoix GQSoHb1r
+  U8k5Axs5PXtUHlPg8fMvUe9C0d0yYyd7GcIct3z6VE8e5dwyW9PSr5+7u2kjdULJzuCk HJyPW
+  p13Zo7bGcVLSsM/MePpUEifeHBx1NX3Tjbzu/vYqCQARAEEsfQ1knF7MUU07FCRG3AhR24x z7
+  1BJGBvYZX6mtArlivO4HNUpPvsCOR3q1JPboHNLmKkoUx7sbiRyAagkGYgeSw4xVvZhRgZbHT2
+  qsy7mIH8XQ0Jx7g+V9SEgDkc+tRBSCHHHPGe9Tsq5ywO7HrUHP8AF8wWko3ZCiloiJgGdjkfSg
+  nI baARxjingMYCP4euMc0mEIB3gY+8K1lBRHzJ6kIUs2NuHz29aCrdcZI4/OnHGVfJPGBj+dO
+  KEqVA IyecnvTSW9ynOzTSGPGViAwCOnHWoXTbg5Hr9atlGVCHXPriq7cI2MZDDnqKE3bUUOaW
+  xHtJTBHI NV5CMgEgHkirjcy/eBJ64qPYm8qCG5y2am9tQta6KbqcbsZz1xWdKFXLMpJA4wa0Z
+  G/dfM2FJzmq L7TMSGAX0PUirjFv3rCglbU5gI4j4252nGBT448oqgdfzpVJVmABGehNTopfGC
+  MjP41Ki0op7E87 WiSBFILqc8HP41Oqh2OGAOMn61AgKguMlu/vVqMAptcYz07YFU6cbrW4NRX
+  QkWPFxgkMAD+NTeSS BlwOfTpTWXaVyCX3Yx7VaUOzZUcZwKlT00exMVZjfKZ12hup/MVaUMAd
+  zKADjBFLs4I6joAvUmpo 1fG35ST1z0xVJprc0cm9LhkqAFAzj045qZIzu5OSq80KAQC4LKRzg
+  4xU6D98Aepx1pN8q0H7vKHl k7XBwAatJy24gknoaiWMMw56enSrMarGuQ3bvzUWctLi0+YBVz
+  xn73Q9c1LHDlgTnGfyqeJN5DYA 559qkCncBjAPT3odrWW5MXK46OPERJIJAyfzqXy2EkpJxkZ
+  XHepY9oX58cHp6VJtVwMkjBznPWiD aRUpcysiDYcAYIPoamcr5XzIyYbrUwUljkg5GcntTfvb
+  gAGX3qGtSoK2+xERgccseSSOBTNi7Mry QclR71Y45DEc+1Q+VsACFsk561UU+4rx6gpIifeQA
+  TwKQ7vOKFW2Zxu9Klk+cfLjrxxSkseA3XkV KvLYPdWohUxlVGNucZqXbk5GB3570iYYDJyOuK
+  lUZJwQDnafapd47sFG7HwuGcHIIJqYrtUEjLHr UIj+f3x0FWAm2QJnIA7mhRb1iNQSJljUgFs
+  57c1Y2ttByB/eqCIh5VHXvVlQFOfU80Wa3KkmtEOw fLCLHjA9OvNSiP7rbjkjkUcHAwSMcVYV
+  Ay7gu0k8Amna7uhX8hnlqNp5zjBz0zT/AC+eF6DvUywn eRn5QevvTzFzuAI7EUdRwik73KqJw
+  OwBxzUm3EXylQcd6mCOFYcD5snPenhVVtxIJJ5HoablO+hT ty2GBGf72MZyGFBDbUyoGfQVaA
+  O3gAY60hVyCSFDdv8AGjfcmMYy1IgvGADnPfvUvlZbHY5PFAUF l3blyM9elLsbJJyOMGs5pqV
+  0LlTVrkBQNnnDdMZpWGCB9457DrUoQE4OOBTdjbeBuOeNv86pK8bi Sa0uR45XgAE8CkIBf7wH
+  J4x0q0wIAUqOnJxTAozyRhTx70lrrsDepDtG0IWGc9cU0g+bjBbH86nO 3eSRnB4pAp39MN/Oh
+  WauKz2ZAc4XbjJ5INQFQxOEJIHGKuH74yVB9cVGw67APbFXDUFHl1KoG+P7 rEg9qeiHYeMHPe
+  pwhRctyp7U8gKv3TkcDjrmhtDjdvQhaLMZKDcQc5pyIVZOOCMkGpEVs9CFxyB6 1KxJcFQMdia
+  SvYSp3umRffBKr3wMVIsMjElmGSMkY6elShQsauDkk8gdKlCKWGCSV6gd6Iu2liL8 qsVvLDqF
+  79/rR5DNK2WBAGDnpVsR8YwQcdaapYAZIPvjrT1GpaalIoVwB0757U7ZldxXqcVa2jyv xxz3p
+  AoVsO6sMZzVSiujLeq0KjRfMQAVPoaaAWHVSPbg1awAz91PWo9i7cdT1wKztzego766FYqd 2W
+  bPrxUZRSd24sOTnNWNowzFSOw5poT5cDA7E1qlrvYTSKDoVL7cbcA59feqzLuwWyfpxmr5DZIT
+  BUdPpUUiZB2kYbr7VMnfdjaa3RmvtbHynHtVSRFwDtJwOMelakiquFIKkjqaqSg+Ruxls4z2xU
+  cz a0KppddTKnD4QqOW6VVmQguA3zZwR71pN0wc5zwKqug2sfmOTkVV7eQNqKM6XIjBHBIxVdg
+  Rkg5I 4Aq267gcsCR0A71Ds3SMWXaCRn61T1WoorS7Km1uMjGBTTwhJXBPXjrUroVbuU3du9I+
+  Fl6qeMjN Du3ZA4EDDahYnAI6U0xlWOFGcDPvT8HY2c7u2akWMeXnlznrmqlLRGclGG/UrBAXY
+  N6jgdqD8vQE 89TUmAXYchup96UHjdkYA446U1d9DW15e9sNyfNAxkE/pUPAOBjGcgYqdchieK
+  YynfkjOWolG8bh F2TRXIJyAueM8VAAAzNnDn9assA4OzcSc57Ux1VoY/UDqO1EWuVXFdJGfKo
+  LfN2GMVVdQI/ubsdV xzV+VSCwAPzEduaqyZIZsFfqaqN09xt30RzGAJMLjG3gVLGEEMW/qD1F
+  RjcAHI/H1qYHLsevoPT1 p662MG4t2JT8+CFIUHjijZnag5GOfpUwLBlxjaVwvFCEHIzyp61nG
+  pNPRF35rpIlJbJPbjFWowRG Cx6dPU1WBLI2Msc1OoHkDJI9vSnyXVy46R2LCKwk4X5BjBqym4
+  Lk/Xiod6MwyG4461OAw5ByB2NK K0ZEo/zDtuUKg7geRg1ZjU+WeMgcD1piA+YdwGVHHFTRjbt
+  ZeMjBz70NN2Vxuy2JwihcNkEdcd81 OBGG+ZgMdSKjjyVxtYe5HWrJVMJ0PsOtTfQbtzWHqFWJ
+  eCDmrCK0sakcbT0oVB5TKcbhknNWYubf BOCcEKOopw1iDVtLD0QmIsANucY71Kik4yuec0kSF
+  pHboB2p20E919M1K6hyXYIvzcZYHoe30pyx gBU+73P0qZFORtIyD0ppVmlbAANKTb6g1LoyB+
+  5Tpu7imMjYJzyeRgdqtDhcFc4HT0ppHHHzZ6Yq nIlS0sQlSqk8YA/Ko/KbKMCPKUZNWCreWpz
+  kEcj3pVLbSqr94c8dKhKUXdMcFf0GgDfgsPy6VIqj YAx9/rS7dibQCQeckU5fvBQBnPU1HNdm
+  junoPCrvycBck4FTKrFchhgnqeabG2VZTjgYB9aspGdg A9OnaiLktBx3HJGFB44z1xViNCbgF
+  VO0DAz2poBOAAcdqtqTvUMM5AB7Uc0ktyLvcUJ83TcAOcVM qAzEnK46Aninhf3hO3p39akZN8
+  vPyj1p01Lc0i9fUaqkZ6lieBUyBgpyj+1SxodqrjBweT3qVIiQ OowepqrX1sZyiQ4byk2jnHc
+  U5YlLtvGT2IqYxsYiFOSDg0oRliA4PPPrTXky3tqRIMlh2xT3Rtqc YGOM09FDOF6Lg80/6AkA
+  49aOV7ia1uV9u9tv3mI5pAjE/N0I5qwvysTlVOeQe9GwBiOpxnFG2iJc tdNCHywGIJGDxkd6Z
+  tZQWC7WHBH1qyCAjAcjOeabyMbs5I5JrJxaditdSEqdoUDH071GinkjDDIz kdasBVY/KrA4OM
+  96Ty+VxnC9MGr5rKxMo2SZAIyMgDqeSe1OdSBwuQDwKslQfYAdD1pgjxyTwOAK FZopR01Kyod
+  58wbe3P8AOoWAVioBGF5Iq+yhYMN14yfemsmC3HOaIvleocz3K+C2FI4zmnYJjAIz /M1KEIVe
+  Rzxn0p6ALJubOBkCqnZvTUGVwu1WDKQM+vNIFO8hmG32FW3BHJwf6UhwULdeelLmsiYu T6EeB
+  nIDA+hFCBstg/NiplT5iMb365BqTO2MkDDg5YU4zsu4KWpCBzywGCM5qUL83IBUDjFOdV3D 5h
+  83r2qMKu9s8jtg0KSlqx8rlqgKl5QUX5TyM1HtGWPAOec1OMoMZIA6AdqaQoRjz9aLvoK1tyP5
+  JeGwvFQuqqgIP3jx7VPgHAPOB2ppTn5iMKck4qnZE31K7Rgjbn5aidh5RIyGLVaPKjjqQTgVA4
+  GT gYPai19Ane5WkwUO3GSvPvVUjEOHDZP3jVzcykEKHGeRUEjP8oIzlc5os27Ar7dDPlUBDyT
+  gd6qh Q4DE5GOlaLKpBBbnghu2KpOGbG3AwcYx1pabLc1im42RVZQMAfMQccVRdWBPB4/WtHcC
+  zYwMYxkV UcNhgSFPv1NRJyi1clU0tDPkj+QsoxjoRVKUtvywAbPKitBowoIfIBHFQSKu7JUlg
+  vBFVfTVaj52 ml0KZA8rHUkVWdNx4OCSO1XnRwm47QPYVHngYUgjgn6UczW24Nte8iu0P7/ZnO
+  By3bNI5bdtVtuD gD2qVl3KnUk54B5qEI7H5R8o4IPWq1t7zH5takYBUMAQ3PIApuTsG5SOMmp
+  2iCsSScDrTCcp9OmK 0g7aolct9iONgQoZSM8g4psgCjG8D0OamyA2DgAdD601gwTGwnjk1Upa
+  3JUnFpWKyjM2Mjj0HFQs NpUNkGrMqb4s459qrEMgALDnnkVKSfW7E3e8iGQ5Dbhxk45qkcM+5
+  RkYzzVxtxJBxVSRvLj27eB2 xzTUWjVL3fM5bdu5cnGOmasjBb5Qc/xH0qoqhQyuQ4H3CKsJIq
+  hVJwT61PNFrTc5X8PmTqHDFj8w xxjvUy/eUkblzVbcywkEgNnj3qdJGdQw2/THH1ocnbUtO9r
+  lsMoBKgc9DntU0aYLfOOeTxVdFVnC qdwPX2q2VUZ/hI6AnNSk0xNJK1ydAqbSRxyOKmjznAO5
+  umPSqy8sMg7Satp/ruy55zitG0tLjUep MnDHnBJwc1aViCxwuMDjFVwvPykEnnpVmI/MOMA9c
+  9jUTit3qhuS5kmizHubO4AAHGMVJ5W6bI4x 1zTVA8zkkDA6dc1PuYBduGDdRilG0dEaJuOqWp
+  biIZUyMnGAR3FWlCrKMc5HNQxJt5bk9QasY3Ho cHr60Kd2Qvi2FRMLnc3XkZqwi55JyAM9OlM
+  wwwCNzZxVpcKi5BII5NJspxaIwGCAhSvzCkO4NIcY GR19anZQ0eAxGeQKiAwzNznPSmttUSo6
+  7jDhkI54HNR5CDBU4PerI3BMHBweOKMA4LY9MGlJ8ysy tnsVuSS33jjj0pVA8oZBJ6ilB2DC4
+  INOB/eqTzgHJ7VlPRWG4ybsNwwXJztqVI1eQnngc+9NJY8h SwUZwKmjBUHaDu6Gm9tB8slG1h
+  8cYAVlIPHI9KsqpUsRjnqPSkAywBG0Hmp40Y4YDA60r31Y7skT HIPHNWSmTnBOaIugAUk44Pr
+  VgKCRnuOT2FF1zaISs2EasEAYc/xfWrKAZGcHmnImX5yVx2qcLjrg 8gCtZVL6Gb3uMjAMmATk
+  dasAMFORwMjNKoDBmA4AxkCngcKAwx1JxUX1vsauOl0AjcL1JJ9KFG0Y bIXvkVJltz5I+Xoe2
+  KeD8/zY2gdxQrtXHPoQhQWODz2o34l+bgjqcdak48wgKeRUY5yx6elVGCl8 RUrdxMKzNn74pp
+  B5ZSCdv+RUu1g7BsEY5I44p4iw5wGOzGMd6TcY7shuKGbRtweh6cUzZuBxk461 OVBUNyAOcUg
+  VA+TwGHOegqVKz0E3G2pA0Z8xSMgEYBpmwGIBQwYnAFWvLyowR14B707YWkDKBn17 VV0yeezv
+  cg8vJUhcr60YViQcepx2qTBE2F+YL05qdkUpv4B6ips2y29SiYmfaoOR700pubGCSPvE VcyNm
+  Rgtn8hQyhWyMHjPHen72w9ehRUMp4AGBzTtpJZccfSrZ2luAWyM8DrUQD4JOeveq3VxWSaZ Bz
+  zuXk80pUByGyAeKsnHA3AknnjimOiqAyEhQO/NRe+yFomRB9qrtBye9OC7lc8nJAFLwpC53ev1
+  qVscgpgZ7etVDcmWm5HgkHLKoPHIpiqozk5Iz0p2wZY88nIBpM7fw4OKculgcLIUlQvUMM8Uxs
+  bQ B0J6UhHXdxj7tHCt8x68jntUR0eg9JdAfaCSDjB/OmMOuDkdzUoG5GJI44qDJDY4xyTQr7d
+  Qcbaj PmKEH2PSmO373joD1p5kyDzk9uKiOdhGCxYZAHatNiZJW0KsknynYnUHr2qEhfKcsSTg
+  Cp8DhQck dRUDhxk4BBIzipUo27AovRFaR1wV2NtJ49qruy4wePWrxUkglehPJPBqiVLMpdG+b
+  7px6U5W0sSr NWuVSueR8ueSTVaVSJDjGR2PXFWn+8wY8fyqq4ypK5OTyc9qvlu9TXZ3KjKTzz
+  z0qu4ZigVSMAZP rVp0G9gAwBxwarMWG0cHA/GsrXbS/EpQbTdyuyHYp2tg9vaoVAOBwT3qSQM
+  yr1X09qjbakxIBAzx n9avl7mKg2vQYygTIRkgdcetN2/OCGUDrjH60/c+8k4BPI96coACse+d
+  wqm31HV5lYjZSWzncoFQ uA+8N8oB6nip+fLZsgI3AJpjnEm3cuTgn2qU+wlK1m27orMCFUBSx
+  x+VNbMkZDvhQw6cVZbAcAq3 3aikAyApHyjn1NUpN6JWDmTXvIrOjAMVO4KePeo5DuAyMjPQda
+  mLAqSoJBODz+tVmz5WBx6moa7h K60KrszHgcjrVd0weeHHUE9amcMMAAnjPFR7gG3OTuz3rdt
+  pJi5mk9NDjY1Ckclhk4qXc2NyqDt9 qrhpRMWG0fUVKoLBN5Kk4wKiCVtWh6W1ZIrSyFQw9uB6
+  1cVNiYPHTr61WCDBJfkn5cfrVtGVsDna RkUpaPRFqXRLQtRYCAMRz3FTRsr8569/Wq4XbsBwy
+  Afw9asqMOjDHoBRrvuQ5R5diYKckndhTxir kYJfBPbA9qpBf3ipuIx6981eiwG69u9DslqSk7
+  E8ZXcSf4atxIoB5OOvTvVVQQdv97HarUZ+RgCB kd6Tu9i7K9rFkDKqGJyeQfWrUa4b1I6jv9a
+  rK24qehA/KrW3d1ID4AIHem22yox0szSiI81iFBIG M468VYRfnXBHIyQfWqUHAByx46DrV5cG
+  3yMdce9Q6coshLWxajUAZHJx6Ui8rypIJp4+VVLNjIwf rSlHVSgOQeh9Kuj5lJ20FH3nIxnPH
+  HQU+OMAgbx170mweuOak2bHBYnJPWsp2u9SddiCQAyqOCQM getRyBW4UFcdfxq2RkhsDHqKjc
+  BztIyM8047JNGvw6opjG3aMEr0p467SAwJ6etTCNR04zR067Sf aiatr1BSSV+hCissnB6jlT1
+  xVuLcVCYBJ6eppoXBUgdanjC5zv29xU3VtiZrm1QqowYHGOO4zVmM MiNkYAIH1qOMLvwWOSep
+  q2MK23IDDgZp8y2aKtZEkZBwRkgdhU678BAvPeo1Q7hhGUnnHtWiqsij GDgUKTWwJxWlhY0Uq
+  ufl9asKijhQTzknPFRhTjnk+1Tx8NnaQQO1G+7EpNdAC4fKjqeRTzy7FlAz 0FSMoDhiflJ5FI
+  yoZFzk4HUVSSkwbjfmeg4YECqy+5NOIBU4GfWgKwiOG3YNOLED5lJ4OQDUcqWy CPLuiLYdvA2
+  +uaCoD9Rn0xUm7jHQ459qYUYliGUn2PJptoq4m1TgnJLdvSpNrA5UbgBg4pyYwO2R wTQEGeG3
+  AHHB70tGzPnSViHJdQudqmjywAOSeOD2qUtiYkqRxT02lVyeAMe5qrS3aNZaLyGKpEee G7ChE
+  lckMdo7YFTortIG424x0p4HBA7fr7VHMldEvV6WINiqAARuxz7+9KBxlVJI7VYSIPg9Oxpw T5
+  SF7HiiTRL1ZXEZZCSoUHpTNjM53AD+oq0uPKAz17UeUcdOn6ZpN2dmVJJPVFOOPapY7d2etMZN
+  x6g55NWyCpyB8gqJl3AsMD1HcVUVuwk9SuF8sZUA7h82e1MJAZQG3ADk4q75bmMg7QD047VWZd
+  pb ONhPFQnd2QWTYwEmMFgHOeMDt60jH5G2jvnHvTmXLjnGeDjvRsweOctiqtswirDQDu+cgHr
+  UDKPM IU85qUgrGAw7kdaXaSm4FQT7d6ak4vUhy1uRKocc5ODUe07sEEkH5cmpTGynIdeOuPWm
+  kqOW6ZOM VUXqW72uMDsuflBye3Smg5U9h796kC/IvB55qJicjAx6ZqHHrbUl6sj2YZm3A/3eK
+  h+UPnIyM5NT uGB7HsDjrUL8IitsPckU0iZOxXZ/vBRlgM8dSarNllBww4yee9Wn3NI23A4yOK
+  idiJFBHUdaFo9E XIqtln28mPqaqPvxkk+w7c1eGwyDaedvIzUMoIySc5I6DpTcrbg5JOyM9lG
+  7aMbcYyahZG3ZwVxV mYMQfmG44NVnL7MZ4GOPem17oc7lqyo4PlhmPJPTvUG0AvjnuAetWJFb
+  eCQWAOKrudr5b5cjj6UO zVjRp21e5AyDb5jbunK1FIC8KnGORnI6VZO10DFiD2FRE7l2nqR0q
+  rS00MG0upVIyhZM5AOc0pGY 9+04IyamG0M3XpyMd6Yy/uxgNucDPoKTTk7GvM7bkW0AxlsgDj
+  BNI4ILYVSfUjpVoRAHghiOlMyN r7sY5FVdOWphKzd2yg24yE5zkYxUbxnJIzx0NWnQhAcgnHG
+  B1FNO4xkk4XGF9aG23p0HzRVuUqMC FIGM9yRxWczvgkD25H51fdWWQ5yQx6elQOVKkAAkrkjH
+  elGV9C9tTPJJU/KzkH17VCwBRhkjPTNX MAnBBGRyAarSZ2hgQMcEYpxbb1By10RxAR2DHaw2n
+  vU4wEDclx0FRZPnbVHB65NSr/q/mwSPSnaa 3WhnGMpOxIkYcqSSM9BVpOAAgyqnGfWokRTJye
+  /SrUaFM9CSc1LlZ2RUn/Kx6D5k3E46H1q2QTMv zDnt6UyPY0jZHfr6U9UbILevH0rSTbI5dUi
+  wIxuDHd+BqyobrjPNQxbVcjdk+/NTICrBdrgE5JJr K8upspa7k6glsAkHHFXUXDIQM4B/Gq0b
+  KNvRmHJx9atBQNrBjgHOParcrWZLm5aNXLShCFYkg55A q6FGdzHn+9VWMANuySAMgetXI+Y8k
+  YO4Yz6U7q17ii2mWkAVVbgn1FX0j4Udx6iqaj7gHJ3VeiBc 5OSOq4qJau6HfXUsIw2gn5yemO
+  lWUzk4Xgd6gj4QYUdenpVgYJYsTszwB1py2JaSe4w/cGfv/Snq uSpY8gZ5HWpAAyBipCA85PW
+  m8Ky7eR79qhtWdhJdLDFUsxIZcdcYoCnBJUkAcU/bmQtwVHXbQwBD Ku7pwM1Tir6s0TuiLAJw
+  x6DnFRNwTwc9qsBMQvkEnIwaTaRJkjGBSja9nqJct9AHysw4J7HHFSIm HHTBHFNXAycZOOpNW
+  YwrsgByMZIrOTsrlNW+YRhUm5G8Hgn3qxg7iDgcYyajYbQchWXqNvepskjb jt8opxSdmPVsmj
+  JyAWB9eOlaKKTlgRgcEVSjGcHaScfSr6qCPQEZNXNx6E3k1ZE4BXBYZHQU7LC4 BYZBPUUiqRG
+  AgOc5INToEIGckg4UZ6VKskNNpa7j2GSBjjGQaYNocEhvb3pyZUYLAH3puO+B6del LZgiTIEn
+  Q7j2NJ87yMT0xmmgsOh4A5yOTTgrErjOP50k3uUoqIMGRiw+6Rkk01sja5xu64p0mTEQ 3AzTC
+  6tHySCOo9adkyYRfVCnJ6nnPrT14kBBAznioYwc7gc46A1KhJcswBXODijW+5vbSyQ/hijb Xb
+  Pp2qVVTzM+vWmqpUZ3LjPSpgqFxjj+9k03boZbxtIMLtAyQc+tSIAYzn5cdz3pCwLYHJ7Yp4AL
+  bW4XPPNZuPViau0mRgMsxKsGHoKmCEkYU8ZIHpT9pU7sYXPFNAdZyVILMc/hVKTa3LsmtBCpOF
+  AA 9OKWVBv2jPIyTmpI4280biAR2oCKfvE49aUY31bM07S1ICi8ZyQOvNQ7EycffPUE9KsnAfB
+  ySTz7 VGUVXbB3MT070WaepSVr3ZWdWCbGJwOgqJjgJ3HHFWnDOw5xyOMUwqMtjHDdT60NpbkS
+  baRX24wQ jYJORTXIwoIwR0+vensjEAjPShozgFCpwDmnyxHBJdSAoG+YZb0GajcELjcAMdKsY
+  /dsCME4Ix2p N2YBjacdeOarm122G073IQqrGzFWwegJpjBSwYKcE8CrBi/dAksuB0NDLk9cY6
+  ij3G7CUnzXuVDu EgBztHTimEDByxBPSrRGXwrDH8xVXYJGAPU84pytYaW5HJneMsCOPzqFhuY
+  p1OcD6VaaLGOMAdjT HCBgWIBApSfREN32Kflny8HOcYB71DJEzHjqBz9atOPnznGDnk9KgYP5
+  Xy/Mfapemty48zXmUplI A2qzNjGRVd1eNRvUirrABn6g8d6pS7i+SSf5E04663G7oqspI3EHn
+  mqzFVG4DGD3qydwbaPSoJSu SvGT2xVySJnLVXKxJLKvzZ5JNV2A8vjax28DFWJOm3BJPTFV8f
+  vOeBSslcE7FfgpknbjtSAF5c4y CPpxVna2SdoIz3FRHaGyM5zx70k09A50lfYiKBo/pwDTQCG
+  yvOGxx2qQ7NuQrZDcinMP3jHGMnkV TSSVyXKzSRE2M7h1PXHemeWrAF+GI4FSbQhAOPahm4x0
+  JPGe1OVraAo2d7laSNsIy8YHQiq0iHLs WAK4wParxU8gsT61CwBWQMM/Lx70SlqiXOy5Uigy7
+  pGLbj0JPaqjhWkbI2kdavHeocYx04NUyjA8 nODyfU04xS2ZTs7vqUnwp3AgfhVaQFXzjapGST
+  V+URhlGeRnI9OKpH51XJ4C8+1XGTetxKz1OGRH XcDx9asx7gCQBuxk8UkSs7Efe+lWYlZRtI3
+  Ang+tSut3sZ36WEVC0W98KCQRjirKFgQMlhu5zTNp Jz2z8q5596sRxEfJyxJyOcmlLk5WaWtH
+  XYcrMJNvUHjA7VaUoyqSTlSAfc1GigTjIx681ZQASKcZ BGcinFWjYVknZDgpzvZhjdgECrfBA
+  ywztzjHeokUgbsrgcnI71IpJVeV3d+KUWzRt3LUWBGDxuPT /CrKhmlIJGR6DqKgQgkbcZA54q
+  ypDMrEgHGc1lZpkJ66Muop2oCQCO/Y1cQfKpPfpz2qpGcBQCNn bPfNaMIUJn5S49appvcce7L
+  MKhSGHIJAq3GoTGc/n0qpHxKp6gnIFX41LMGOMHnFJvuOTV7lvomF GQCSakKkrljnIzxUXcbT
+  nd2FS4G1T/CB07inTTRCg1G6Q4DCZVlYDOOKcf3sYIHJ75oiXfvDEKM8 U4K2xQqkjtVcqva+o
+  S27jUTG49e4pxUKvuRUyjLnbkAg5yKaDlScZGCOnNZ2uaJ63IGTjklh/CV7 077rDb1I5BpzKT
+  EqnjIwKbtZVGeDuwM85qVDogatuAWNwDnHHSnLgElTtBPODTiCGXJUIO+KcQuM cHb7VUlbR7C
+  +1zE6BSGGak27skZHGefamAEFdoABGcVJEH5LE4PAzUpMaSaumWYlZpc89KuqSpxg A9PpVeKN
+  hGfmJz6VOi5JwNpB6k048vQNd2WflKhs8qe3enqh3lhwe5ojAEahirDHHvQFY4YHK45q k7PQN
+  3qSMVyCoJbvzQ5yFDEKew70oAIBIPB4pCSc5HIPU0nFNXQknsMD4O1OWxRhiAd4JHtSqB5i j2
+  60joAcp1+vWqtdGrS5rCgk5JwfrSkArzgE0iqQ5I5AGKcuHwOgrFtqW4SsnoMUjzAVOTnpUyqG
+  JwCPX61EmFbI5yOanVVZCyMc5zyf0qpRd7kys3cVIyRyGGeetTlcgEYz1I9qSPlQ3HTgCpQPl4
+  wW 6fhQpS26GbkubXoL1YN1xx0p2wALngE8jv8AWm/MHx3qwqq0ZKZLdDROTXU21vZAflwFcNg
+  88dKV hsdWxkbevvSbEaIspJYHOD3FO/e+YMKOnSiLu9EDbuG0GNmw27sD3poG3g5IzkAU8OPL
+  Kty9O2bc EDBxnk1V7XQa21GsmSrE4JPP0qDy/wB4SMjHUntU+zd1O0DjOaTYFLMx9MUrPl3Mp
+  S7MpucDLDq2 aaykJkcgmp9mVbODgcH2qEAhMA9+/an00NY2IAJGyCpOc5x2oZWBOVJ+Xip1yM
+  jIBPrTWLAgsCeM ZqVo7ESqW2RXwfLz91elRONuBjIq0yfNkg8DpTCAxUbWHGDRfUV0lcjHCjq
+  fQGmhOehJY1JJuWba vX0IzTdpI3Ecn+VDWgOOt9rkBB5JGDjBqLBRzgEsB1q2R8nIO4+1NbJb
+  aCuc8gindsV1LS5TzkkS McgVE8fI+Uk9B6GrLIxkZuFxycimFQYyRnccY5q7NLRjjZ7FNlLFt
+  q4GOaruDtUc5A4Aq0V4JAY5 zxUcnyxqXAXAqLaA+XoUXHOTgMB0qjJkSABgcDpjmtGQ5XcF5I
+  wapgNuycZHBJq1dxLc5LqUmH38 kBic1E5LNkgA1cypUsu0MQeTVNwBGScnPIqJxu1czTUpabl
+  BlIkKkcN055qHC72KqST2PNWySGJ6 ZHGRUJQEHBye+PSteW6syp9rkZHyg7wdvHHeowu5VB+X
+  6npUhIJxyF7+xpm3EuQS6Zx71PK72bJj OVmhNuEO5gR600xksfm3dKlUAsVwCucj3oCBo22sR
+  g0c043JipRd0MCoVBAbKnp61CoBlJ6kt0qx 5alzgkY5+tMkTanyDJ3ZOPXFOD08hyV3vqViWD
+  MMADtUAAMbnDcNzV4gBFU/ewMmq7HAYdM0SfMy HorWKTJukZ+QO/1qlInPJBbqeKuurByM4H8
+  6glRfMwW249aXO47Mr2fZmcY/nbcpJbuKptxPg4K4 xj3rSk3IWwQwHT2qhIrlCRg554HSrU0x
+  p6WbOTRcKu0jp2p4R3dQWGcZwBjFNRW81t3HHIFW/LO1 WBz+FVCavqzBSEKuBlyBsOOPepVGE
+  B3HjgGlBA2ZXI6kZ61MFOSI+M8gHtUxkn0L1vqCLgjcCy9R irMbbhnAwTUfV1Gff6VMgJjOSM
+  54IpuF1sXZrccBhsn0xU6hWCtnPHWmqNxIALHpx3qVFAAUgg9R T0tpuVa7J9gRMqu7ng1cjBf
+  kId+MYqBcjb0VcdxVpEODIWAHQYqOawrW1ZcjRvKAPQfdJFXIlKx9 MYPaq0R/dBScqOM/yq6u
+  4qQDjP3ie1SnKXkTF9WW4wjELnHynbmrUKu6Zx04OPWqgTJ3dyOFFWEY jOcnHUDvRGBV7rQux
+  qI5h1IFSnIQHI46+hqDkhSowD1zUysFbOM9unQ1ST1ZKvfclU7HyTtB7GpT kP8AKcHGc9qiLo
+  8Y5B569Kk+UF9z5AXFZ6PdGkeZvTQAoZSQ3OOMVKoHA+YZ96jXbs4buB0p+AFT HT1zV811a5k
+  m0mMdVDKc5YcAf1pz7gABjOeR60qjdIWOGbOOBUgHO0927dai7RbnZLuQqp8ojg5P GR0qRVzk
+  cYByPWgrmRuRweacOH9QAMkUpO6Ls2rdRyZaQEHoOKurlmxjKkn8KrxjlvlYgAbWHcVO AQ27J
+  UEZxUyV3oQ4q+hOmAo6lhxyasCNkbkbh0z6VXADMVGMjn61bRSF+6SDxgdacUoaopavUkVf lD
+  EEAHGKtqPkLbhtHU4qFVygKhgw65OalQ7WOcFcYx6Vo5NqyCK0EB+Qb+mc8Gnkcnn60KMLuJVu
+  OlPADkAg5xSaT6FNkZjxFuORnktTGyd+CBg8Va2g5zzjpzUAYBSpPKjAx3rNNvVgm5q1iMbg+5
+  iM GnjY0nJxx60vCg7uv8vakCZBCg9eM9vam2xqKd7jesgUY+tSqm0gZKkN/OmquJV5+cE1MQS
+  MBWIB 5x3o5ul7FbpxFO8QFRjcDgEDFTAd8980i8QscHr370oYttIwfUY6VUddzLWyViQEuwcL
+  x0x71MIg sg3NhvQVAMEDBBqYN+93MpB6VN0ti32RIVO9FXovBNOZk8rvjOajDHL4VmPfnpQAo
+  CyNknqc0Nu+ hDTtqA2vIxHy9+e9SM7PGGQY9vaoWc7vkA2njHpT2J4weh4IpN6mjSVhCwNtzk
+  c8imhwW5yaeXV0 wfvHgimAgwbOMnnPpSdiXqtRjfMSNw44ppXBIII4AP1p3zFCSm0n1poAdwV
+  JIHv1pxTfUUpRURjf MgGCec5HpTOOOScHpUw+U9Rnp9aiI+bB45qvIhNNJiEjzCOCc81XIJGS
+  cKDxVlgmCCGwTkmmEHYT jgnkGpSHpazI2PAZjls5pnU4XIyM89qlbaoye3603PzBR6Von0BbX
+  IzGVjB3fMcd6a6Ig3KCSelS KzZG5lJ9AKYzPvIUA49qmfNcabvZkRVmPrxVQgnGTsA447fWrW
+  87sdW9B6VC5UA9s9c1pG6bVimn flRXO7zc8kAdKjdQ/BwQRwakKbpAobnvzUZyCNvPH5Vb1ZF
+  7PzKpxxuBHWqMwMaHaR16H0q6yZbh sZHWqskZLbWHzMRg1DXW44pLR9ShKm0jZjOOAPTvUGxV
+  XGc8cZPNaJUeaQB8o79aqsuCx2nJOR/9 al7Rtb6jnJJ2RU2ZTpxVTb5bHGSxIAJq6cknquByP
+  eoTBlGG4jnijp7zMltuVCoZs45BxkHFMZSk m3ORjmrAjw4Qk8rwfemiP5sSAkY4x60pWS3NFN
+  dWRk7uCNvYkDpQFMbcuNwbn3pxXClgSQH55qRg JFXbg85xRaL3FvsiJRuGQcDviggAHoV60rB
+  vNwcbc9vamlDjCnIIyfarml1JnFt3RWLF5gwUehpr Iw+7gZ7kVO+PLHzDcBjAqEqWAUsQuKUo
+  p67B73QpNgxnI46E1TYARu4+bB6E81fZFIAzuJ549qqS EFCF7cHjpVJLboS+YzphnG4jBPQCq
+  sh4I5znn/CtB9rjGMcdfWqZCGFjyR156k0TjJx2L9pFnGxq fMyh3DoWzmr6HcQQQFAwR3Bquh
+  CgkJtbPSrCcHOzAPIFOfvPbQlwdlbQWPltpzkDPPerQ2uQO55x moFyowV+dhj6CrMZBTGVz6i
+  m77obTTv1HoFHyqMnv3qUR9DuBA6rimffjXt1JPSpVQqc57c81DXN G97DSVrtEyMQqEkKu3nj
+  vUyguQeD6moE6fPkZXFW40AT7/A7DvUyShHmsTzpeoLndllZgep9Kuxf fycBTxj1qJcCIY6Ed
+  KtoFKHbhmBHAosmjWUls0WQAYuAQc4q8v8Aqxz04J/CqcI2yNuGVbnirMfz L8wwrGny+RC3Vn
+  oWoyAkec/1FWdzcEDI6Zx0quNm8YVsgY61ZjdmBjYqFz6cmla3vA9XsWBtaPqd 3bmgEp83U1G
+  pAZeQewFKchGJKjFXzW6jhF7E4O0DcAR6YpxfdI+evrUIztyD9OetPjIYnOBjrxWc 5ajhuy4j
+  qVPTcKC/Izg8c4qsjEYHr1yKnj3CbgruPXNTFxTuE421uSGTbGxOcZwR0pQ7bgzfIoGe e9MRC
+  7fMAFJ5Bp7YRxhhwMYNXzK7FzReg7ftckc5OPrTxnhR/EC2KRM8Zwdwz0xUyBAoAB3j37VL 5V
+  uipTfzHxgkK2GxjHWrKLulYMCcjiohyAEBwD1qZQwAOwnI5GeRSbbegJ29SzHtwOhHtU652lhk
+  A8CoUVi+1Qx4GKsxAlCjL3wKm7QNO5KNyE4yccE1MBhF4OGODxzSLtzhfQk89TU6nCrlcccE0+
+  Zl uOl7CkDYAuOOB60zHzgsCMDGalx3GOCOaNoJ6d+lUpaWIWzGlQ2WRgcDr6VAIv3zn7pz909
+  asNhV AAw3tSEjILAsfSqvJBzS2uQgLyGbBznrSgENkfTmnhwWOFGW9qMZbcSOOwqeWW7NNle4
+  nzHqvfqK lBwSCc5NICVQkkFhxSkAkEDnpUu7Rj1JFEag4ySQD1oJONvyqTzigY243DGfTrSg5
+  5OA3ao6XLjo rpEgwgCPtIJzkdqewPOc7ycDPtURIJyMA+lAJ2A9fTmjVoTpteQ9tyq2Dg/zpU
+  IOM8nv6Co2bCqN wIHWmFsSkLycVbV1YqK5r3JgMHJ4BPp1pWkUbcMMDrxUCsW65GKU/KNhIPv
+  ik4rqDi21Zkm8M5bg c0ib/M3ZGMYxTVwEw2cdqeWOMEZHqO1K6UtBuTfxEZb5iSdvfB70hJ3c
+  MOOOO9KQpTK85PNLwW2j gHkE0732I0TuxXOFUNgjPaowuG9QelBY7SFBLHoKZLuZRs3Z6U1Cx
+  UJ3W+4b2LfMDjPHsKc2S3yq eOtKuSfmUjaMGmM4XLhjz0FK6bIabdyPq3HU8nNBC4BwST6dqX
+  n5W9RSbcgNjJIwMHGKvbUf2tQY plQDxVc56qeTxxU7ECPbtwRxn1qAqWIw23mnF9w212GFSkY
+  cDJ796iZg7AYI7kVLkrGCxJOcYNVn G2HGCSD97NKMXJtsnrfqRsjLKCpGMdahYAZ67/6VZcFz
+  klRxjmomAyOo9CD1q4yktFuaOStoVZFz GTg9MjHpVcjMmCSvy4BNWWO5sjdjoQDVeQMMEqxI4
+  Jq0/PYmWjViswKqRkMw64qiwyuOcZ4z3q8c FsqGI/izUEqKHXnk9ABWMnrsTblVmUjtV+Qy54
+  PNV2V/KbBHtVtwTKOhUHHAqux2uu4jGeKuyd+4 4SkVfmyoztz1zUhB8wc4UDNPZVKlgcYH5VA
+  MqMhs/XuKHZ2Ha6GFS0yqxAXGSR3NIwJlBQYOMmpZ FJxnpmkUjadoOQehqua2qKsnoiMKqRtu
+  3EgcEGmFxJz82QMHFTgATkHJ7gE9qCdqA4C4PTFDehjz cujK2Ar9Dnjj1qOUhRgnqRyKsSAZI
+  zyevtUDpiQK/OSM1EprqDty6FcqfNyD7/SqEjYkPOT0IFXZ AVZtp5J69uKrv5bFixPJ5x61p0
+  7jgktbGcyAuD0x0xVZowzlOq+1XziOTP3htwRjoaqSkHkcYGM1 HLK4ubojkPvFSdoBOSas7AE
+  G0hhnINVQyliuGzjqDxU68lAXA44AFaJPe47qysTocN84wvYmpgBt +XrVc5zgncegx61OmTwS
+  OmD9aSuVyJa3LKKWVWI9gRUirhMkr1PB54qJcLgAE+ozTxh2ySAc0byu LVq0noSInO7D8HFXc
+  qrKuDuyfxqvgg4JHJ4xUi/NIm48jk570NXd29hP3tyyhOzcAF6EAjpV2I5l VhwCpJB61VjIyM
+  9CfzFXEJyWGBk4A9KzS966QnGz9S4p3Jwd3Ye1PQlY2DfezkVXjOG5DAjjd2q2 CDyPmboT2NU
+  48m5TdtCZJMKWB3ZGPpUgXMI2MRjjr1NV4353KoAqRcsSobGTnPvUweumg7u9yzuV IVJznNPV
+  wR94bD0JFVSdu0EhlBwaeJPkZgv0HYVnpzXKUmuhYXJlYKSBjIzUqs3mKmVAI5qgJDuL Drjmn
+  7jhXJwCPTkVcXd2Bxv1NNJCi4Cgj37UAsxP971FUxk42tz2FWQcsDnaaizT0Iah0ZaB3oWd WJ
+  xnIPFSId4XYhZsc+xzVRSuOjYX361ZR/3gI4B9KqT8tRtcsdUWN37wg/fLZAP8qnwS2SSv4VWU
+  rHPl+hGAT0qwHYkuMYGOKrXroVzNapElvn5vfnPrVwN0KnnuPSq6BQ4Byccn2q0CPlLcA5/Cp5
+  rv QiW5OobOQTz29KtRYHBP3ujZqCLDtlQ2QOM1MgOz5x0PGKe+5SldpFsBTtwCOevapgmcr19
+  ahjIZ eFbC9h3qbpJ0OSPzqW+g1fqxBncV56/ypwIJUknOaQGTaQVBJ6cUuMR5wOOM4qXbqH2h
+  8h/djODg 4x3pmSX6hR6kcUobcSCp68e9DcnJ4wO9XDXQE9NXqMCFSem007arjKsowOlCnEXBy
+  e3eg7SQccjj IqZKT6h7smOHC4PBPOaRi20fIVGOtPx8qgkHFBVi2T09qmLSdw5etyJC4TcQcZ
+  qYAFjgZPUUDqVw fpSjIO3+8OvrRJ3Fa6GthGVQNxx1FNb50IB255Apejlt2frScoMDBOemKd0
+  hpW1AYCjcDzySaXHz LkjIprPztJwAOKRQTk8nPr3pNuw3orpbgN3mfMOvHBoBfcegUHAzRk7t
+  vUA8HFRKWyQScn1quYnV u5M0jgHBBPXpTEOF+Y9cjFMwBwTlh70pY5zlcAdMUou1mSmuxIvTq
+  SM9u1OWQZIYYOOCahVwEzkf 7VIXDBmAyQcGm3HZlpq6uWc5XaSBgdqrlmLDaQe5UCm4IkHzA8
+  c0xxhmBb5s8e1NJb7mkZa+RYZm DYztOO9J95sFlA+lRo+Y8MAcjJ9qRc7gwzjHc9KOVcphysn
+  C4TBIJ6cVH0bdznpjNGcNjB/wppKs oKsAwoW4SWgz5wzEnoKbzuwSAByD9aduycAn+lNwfIO5
+  TnGAattpotJ7MhcsPQ9jx0ph3NCM7Tg4 HvTmHOPmI9B2NM+QykANjHek3Ym12J8ipuY5YdR61
+  XOCQcgDv7VY6jrtB65qu+ORxzyKT9NQd9iB yGZhk5A4A9ar7vMxnltozU7DJ3Y4Ze3aoSAIsj
+  vxmqjazuVFt6FR2YSbVBIIzxUBVjggexBFWzgI eRnHBqrsJhUcjPOfWiTe6DmuyqyEKxbJOeB
+  3qFsHB2MMHknuasOSM5Ukg4TmoWGGIySOhyetOXMt yNempWPO5cYBppXC7QOVP5VI3DAAdev4
+  U1wGHOVLfeOajV69DRu6sR43HGfb6UwoVcZBwB1FThcM No3etRF3MhJVuTz9K0jonZkp6asGJ
+  6gD61Ccs5DKT6e1WAGw2VyQeKaWGSp6gVN0tLApLsVnBZkI IL4IpoX5NxYFyp21MQS3GMdc1A
+  WLnHAYfnSvpfYznC+xA5xGobBJGRxVR24G5So7/Wr5Q7SrMAcd COao/el28HgHPrTg9BK1io4
+  VmByCx5J7VUkVckHOPbvV9ioUjgLyBntVNvv4PHcVd3fmKsrHCs4A JzgZ/WrMeUAYENniqabV
+  y+dw6gVZQltwyFOKpT1aREoO1uxZGS2cFsnp6VaHXd2FV0w0KnOCDzip kxkgnPpUxipFddSwv
+  LbtrKNufxqwpRh3BPP1NV494Qcg/hUi4Dlic44wDTabauO/ctIMoRjkdR70 DktuBJ2kU2Mkjd
+  jaAck+9ShxtJ2nGaiKd9iabd9CaD5XxlSFOBmrkZUzAnIxyeaqJgK2whcc5Izi rS+WyI/8Q4I
+  FTK6Zc1zKz3L4KKp3MuC1OQpuPPHb1NVlEXKHnHfPalVUMm4E+mKrlb6kq0VroW1K hyACMjgV
+  JvZSMkZA9Kq4c5JcZB5x3qfefLBGCp7YqOZCV97DkcEAPkjrkU7IIJw3QnGagLjACgk9 8elER
+  z8vTHB5qancqK5ndE8TAncrY453U9STMy9eeKqqymTAbkA4GamRmEgUZ6c+1S79zVxu9S+j EA
+  MNp4yTUyliqsDwRVRGJj3YwmfwqxG6s+3BCf1pRm9yHpsifB3evParablTIxgjBz2qoGw+CDx3
+  NTxk4OMkHsa0c+rFzXLgctDtYAkdxU6nJJ45HPtVRFQg5OCe2atg7WPBA71CcFsOL5XoWULMdp
+  Gc 9cHrVtSTyV9s+lUo5GVCzHHt6VajYSBSSVHrn3rSLb2QSve7LaEqCBkHpmrqBnChuD1qivM
+  pI5bv zVlM7QxbDZwTUyfUvR77l0ElxnoBjjvSsZQpyQAvbFQopwDv5I4HpVgIOm73+tVFRQnK
+  2lwDOQu4 HI6gdxT+DyuWA5poOMNuDMBgAVIMNICflUjpWc22tQe1xSR8u0Y96XaQVx827nFRq
+  ylM5LY6c9KA SGJXp/DSSsKy3Q8d/lxzxgUhQEv/AHjjimCbkECpl4O853N29KPeiXyu2ogwSM
+  UpyJNrEEegphwT nawPQDNPUuGDHAOeuOtCVtSLu+40BSm3BGCSDSZO7g5OOfanNnftA3c9R0o
+  OMt8vQYzVPcL3XcEC 9W4PrjioyzHKtnAPBFPCj7rHr71ExypAPvRC8gTtLVXHMGCbmXcN/FRj
+  7/3sAngUMSyKCTtHPB61 GrfvcnIB9fWlumXyt6Cl8ZCgkg4HvQCGIDDoeTmmM2COmF60ze2d4
+  6UPVE8rS1JSwK8Yz3JoJ2jI PamEfPnIwByaVFCpkHdgnrTjZLUNtRCyliBkg9hT1wApXHI5qM
+  AGZmORTcAcjI9OetVdNBKVlZD2 bDdB1496UMG6kEDvQHyvPODzx2pnmDAIHOKSetlqTZtbD94
+  4BXHbPrTgxZsggKBgjFV925+AQONw PWpMp3DdOvrVyaTVg9nJLUkZcg5fIJ4+lIGb5sLxnGaY
+  7sQMD5T3xSKxZckMOefShXaHeyuLnEpU jk8k0g3k/eGMU0yKxwMjPIJqHe3lY/DP8qOVvoFlL
+  R6ExJD5TaOMHioWIDLgjOMU4EBipbf6ketR yKu4NtIbriohDUGmpWSGEkqVZgSOtQORuAU4PY
+  VK23ZuIYHBzUJx5anBGRyaq73CU2RFzu29s8kd 6rktjpgZqd3BO0YA3Yz61DKWCAYAI5px7Eq
+  pJ+RHKoVMnG4DkVUkOIQR261MzfvWOC2Tk88VH+7U 53cEcjvTk+hUYpLUiYq0obepxwBVZ2Bc
+  hlzj0qaTBwwBHQAmoHUMc9+MAGs7q7uJWIcrszg49M00 kH72eRz7VMyAOFHT161C3DgkgjIAq
+  opJ3KcvdtEQBOmcHd601lRZGwe2BmnkHeTzuBz9aQkSOR1G 0+1PmSepOuxGM5x3HvUL5DtgDI
+  +YHHWrGQkJbGD71Fu3tvAbrg47U4xdr20HKKWr0IZMiMltxBPH PIpgUKpZc8HP1FPk3FVCklS
+  agAMjKORj360ON1uRb3dxj/MCWIAJ4XviqzIFlPUMOOv6VYZguAyM AD96q5ZndiQpHUcc+9Uk
+  76E3sUpN2/bwRnioZVxl3bPGAF71ZfiWQH5cEYPYmqsvzYK9O496HC5b fVs84R2AYbcYOFwOt
+  XI2yyMM4Ixu9aqLtL71O4dMmrkbjcowvfpTSM38VlqWo/uBSWUE8GrUYVYz 13AcelVY8BWx85
+  x8oqePJwSu0AHH0qlrpcat1LYHyqADgHjmphjaQeR3xwahRlEOcHOelPicknO3 g4pxTWpa12R
+  cGQcDC80qsFnJwORxTIySoB6E8kdqmVdvyfKMEjLd6ykv5jO6UtSRPM2nbgKfUVMv yocHAzjJ
+  FQJ8seSx9zUyNubJ5XPSqjF9Byk2ix0ZmXG3PrVpWROSBheCfU1XQuWZSVUDse9SDIJY gHIII
+  Hb0rKXM3YrSyvuKwypKZVsjK+tSOSFyGyR1wOlKq/KRnnHBoEacqWJPpnpU86e41JOOpHuV UG
+  0Zz0yakRgRjODnJHemupOdowMcH3pEG6QgZB6YNNxTSuyNL7kvfK4BHUkVYiO5m3lcD8KhWPLg
+  kZ9hVlQHKlcHPUd6hJPRG0dOpImAdgJXsQasxjawAGMnkGq6lVnJxnnH0q3zkjPfGarpsRK6aT
+  ZN jhufoT0p6SNtwe3GcVCqknaCCAM4qYcKwzuz0AoXK99y5rSxbUq8jZbGDkVYT98nU7emapR
+  D5iww uF6N3q3CwEG0NnDU5abGMrpouZIk6ggdqtRsocgkbQetU+d+TgjHFW1I2ZI4OM02rW7F
+  u76FtHUZ AxgHHH86tR4xk8gjNUozk/KeM81YXk/Id3baPSlyrqLmaL4KhAnDDqMVIpz8wByD6
+  1TUsspzjHGB irHKwBjkY5PpSa6I1cLJXe5L0bOQAO38qcSdyjrtPJxUR8tlC5OCMHB704AZXL
+  EgHnnvT6ahovUc NoZiCMN93NOVy0Q2j5sc0HhBgZOO3egHK4zjNRZ9NQUtbsXy1IOVx2z2Bpx
+  YiM45IOKZvJbB4GOD mlj5AJbJx0Bq9be8TNO97kjcw5CkECpVKeWrMGJpMAZIIwRSbcBiTkbe
+  3SpWqNJO6sKANrMemaib 3O0HvmnAtnnOBxStngEgVPK76C5bakIyvzDP3T15pBhgMEBunNLkg
+  YKlU7saGIVc8Z6gVdnuydLX IwSHbcQRTWcA4bkAce9O6zcDJpSMYbIwexHUVOtx8sXKxGCDtI
+  AzjPPvTGxtH97HSrG1WTnqTyem KgUDcSwJYHr2qU3dg1Faobt/dkK2455poyJFye3SnbSJSRy
+  SM8dKMDhwwIwQRWkX3JlorDRsaQBm IGOcGmlSAQvOemKGCbG2LknjOaQBgpGeBjH+FCknqNKy
+  0Yi/LhS3Q8GpG7kYAHQ0w5CnC5oPmEjI CjuSOKaSbuym2noxQABnrntUaSFUwcjnBzSkgnCk4
+  xnPpSAkldwHQ9qclbSxMpRa11JztI+U9+/r TWwS3BHPTPeoySytIBkdsUwlSmWbIx196m7urF
+  RejfQA2JFO0/WnbhkgLgYz7ZpOkQbjpjJ70xiG CjPA5JrR8vVC01Y8bcBdrHb6Hk1GTtbC88c
+  k9qeCQTg9fX1qNmEfmF1znHA71mnYzbTZE+OVyTnt moWYlAQOg4FSN9/c+cnOMdqhyuOWyQO1
+  XZNjjdvQY3IC7MN14qFiRIBgZxzUhwW3Bvm9PWoiSykA c5wKlvUbkra7EGQf4TkDFQE4dhlcH
+  n8KmLDldrKCeCTVZnLYLHg8VTTew4yitRsg+UbTu9PYmo3A DKBj1OKexAcEHPXP0pGZnjGAAo
+  GCSOtDctmRyIiJXlSDuzzjtSPFkDq2R1HSl5ySwJHTI/lQ27dw VAz0PahSl00HGTjezIG/1QQ
+  NkmmbFVjyW7A1Lg7MdRnP0qPYCHCkqpbrnpTcrIUX2InG6Tg4cdc9 KEyqjcCpPB96kbAcgr0H
+  B9aYR+7BwxGM4pSldFtXepAWKv1xlc4qAtnayDDemanckS/dzjp9KiZQ qgMTg+ntVJkVHFWTd
+  iuQxQn5iOpx2qB8/MAwBY9D1/CpnPyl92Ez09aquTztb/cNJe90DlS1uR5U qM5J7+1Z5YbiGB
+  9jVuRm5jUZ+YZPr61TZAFDbScngD0pyavYSTtc87ixsQKeec1bGFkAABHXFVVE eGVD1PAHarE
+  IXzVdcjj5iTVuV7a3Q4zsrXL0ZGwFR0PHtVhRluCc5yQD2qqpyfkOBnknvVuJwpAB DNmjmdrk
+  pxT0JwvzblBOexqwuSuCAORg1GxYxZACkHrUiBccg8UuZ213CKb1J4wc7WPy+pHWpesi gnAx3
+  7mqyHMyhmyAMfWrAwYgwHI9KLNOzHLe5MpZiFA2/L0I6VMpfy92Ax74qFEK3GSTyKl2soAG QW
+  Hc0khtxvYsfwDOemCfepg42luhJxk1AjbSdxUknke9TKA2A3A5ODWeq0Y07bCgsfunJ9RUqFto
+  wQSSckimxhAxxuAx1oVgZAT8v8PNOydgt0SFCfMRlyoGSe1SAbWUg7gOtOU5+RjjJ/SpG3kHao
+  Ax 6VEm7ibb0sEe5pl9WP6VPG6rMAOQM9KbhgDgcjgZFS42MQMZzSdt0OmlLRk6KNnbGD1qfLG
+  PCkHA HBqBAzIvb1qwF4AXk45xTstFcTjrrqSKuCOeCcilCsJFJI46cdRSD7ucccZqQuCOCMk9
+  xT1T0Qcz Ww/7pJDAsTVoEBME8DgEVAGAO9zyFySasRhfL6gA9aTk1rYuMu5YTaxXBx3ye9Wt2
+  EUDOD1NVkOY 0Cge9WAm9VVux4NTz2SbBSu0pFuNj5pXv296mVtrj5s8cYqpGnIOcsTwAasoGO
+  1gvfJ47VpHlLdk X42/ixn6mp9w5YHPYiqiq52v0XH51KuTwpyAMfWhW2M5RVxYx84fIwRwDVl
+  eFAAzk5qNUBReMEDF OG7ewOQc5z2oqT1Vyp3k7IcMSDAzx+pp5RgrOoBbHI9cVEnXjIXNWTnp
+  0PbNEk4kt9GRkBsDjjqO 9TZ4Hy9+/eoVADswyTmrC/NtJBA7kdqzfmXJJWHgfJ0Aye/anAMmV
+  fBBHQd6a2FOSS3vS9cAKWAH WoSuHKnsxrcIOABngnvTAGLDPzZPb0qXAaPAwwz1xSqsm8sF2g
+  DtWnoKM+UY4zDuOcg4AqJgzDJA Crz05qwpyQGIHHpUZ3BieAOmCKIprcIbtkeDuBxgdeRTScg
+  579KmGSF/rTHUjAGCR6UpJXHFvqQy sVxgY4wajA3YBOPpUx5cAjnsKT58j5Rj6U0tBOViA/cA
+  2sB2+lLtJ3K65QnjHepmXbGV5bPSohu2 YY5XOFIq17y2Ji7bETDkAYVccEimlWEYCjJBqT5WB
+  G7GTwaQ/e8vuO9Zv3XsU5PsNziIE5zmo9+S 3JxnkUuG3AE5UnimswHyMMA9CKtJkpxTIyq/L8
+  56dzTkILfN8x6AU18bhyO/5Uwbig5ByOaJ2a3N LpbEzPhBheD61EwJwSvy5xigMxIUMoXqCaY
+  pVW+ZiRjjB604NWtYjl0JQ5CFcj5egIpuAYznAx2P Wm5J3E8YOM0EER5B+b0qWS7XGFxtLc4J
+  xj0puQckndmlCtyTnHVhTAp2sBjHqa0TQ1roGVMuVJK+ lQyJG+4rzxzg0YAPI4J4NNYDeckjn
+  J96lysEbt77ERDBVJ2kN7VAygMfmIbPNSSBmjyT3zxUZXA4 OeRyfemtdWJu6K8pG3uSeeDUWc
+  lQpUkL1x0qRvlySRuP3jUBKHAGAGPrUt23GrdCJmcPuK9BgDFO WQNER8qjOeaR/vZznj0/Wq+
+  D5oKk4xkVbUXZFOKepIW+YgnHtTCW3HjoKUDdzjnuKQLiQYbBXjBo uuUTmrWGniMdeTk+9MJ4
+  OMnNSjHkr8pHXgnkVEWO7GKaV9h0+wmNqKW6kdTTONjYJAx1PQU4McKv 3hg5FI20dTgHsam7u
+  ZXalZlUsSm3BbnOc9qZIpB2McjBqVyQ3TAH3ahYhw5LY+tDjLmukO22hA4A jC5DA8darZzCVU
+  g4qZ/kUMMEHggVBjO48DPFVLSxMdXcpyttQ8nPt+tVXBK5ByoH61ckC7diqSPX PaqTDGRk4z0
+  9qLrSxS+E873DDLjkHr61ZBAZTn0yBVNPMSLLkMw68VbQLnewbLeh9KttWeu5MlFL YtxZMf8A
+  cye9XE27lLEDA7VWAX95huBg/jVhcmXPDLu6+lZX1Ha6si+CGfIzsPr61KhYgchWxjFV k++Cc
+  jP6VYUETbu2Oc09X1M9k0TbNhwPvZ/Onpy5Cgpz0NMT95yxAAGOalj25JXcwzyaqTdrGu6e pY
+  yWPXHTBqQAsm7dkZOKQGP+LIAqQhfLYLu3LgVClZp2JtrqIiuYyM5I6mpSVZGL5OBxikBwxUL1
+  pGJUggZBGD35pNu+ptT31LDBBIGbcvy9/wCVOxmJeCfm5FNAKSGRnVs44IqcDLqVOBu5FHM1pc
+  mT UXYWJW8ggkZB+WpxH8oIz7/X0pvUlcEYPapVA3kFuOg96h3uKKbTuKu8ybenPBqyPmZecHG
+  fwFRK p8sgDBLcH1qwEIwTwONpppsG0x6lQOCORkj0qVeUBGTnsOtIEyoUDgdDUu0cc7ferc4/
+  ChSn1uOU MMhuB6HqKcqgHBJPNCr8ud2cjJPvUrR4iXJ5HXFTKdnbuNSkxVCiFSTu9vSpxgfNn
+  BBweKhjDNE4 4GSCPcVJgBSCQ+DzSTsF3HZlhJdhK5VgQSMCpkyQobrgc+9VyoI3cg8AAVYi++
+  RgMq9xSvFJ2RSU Wty4vEn38EDr71bUs6hQSQOpqmoBw4PzA4YZq0GGFVSPT/8AXTitBa6WLPI
+  UnPBqwDsKFSpK9cVX TOFB5wKlVl8s4GT0U+9PltoNp2SLOTuPoTjpRywPPfrUKu2BgEjOalU/
+  Jg/LzjFTblKcZfMmxggE fMOTin7v3hAy2T+VIuGVW3bh6ipo1IBLAZxwacprRii0tGhgzgjHO
+  4U8u+WG3cM/dWl24+Y04ZKc MBkVDs9UFpIcqqFBLKWPYnpinDIbbuyG9KaFyvBUHGfpT0IT5g
+  u4nsaNWOT6CEqVA6Y7CmsHLDaa njjDOcgHnkCmvHj5lO0981UJpj92/L37jX5iwAcetMVJATu
+  +nSnlmA5KrkdMdabglQRyP4setONl qOV4dhpyOMd/yphA5K8MDx78VO5UJnPzMckZqA8rnBAP
+  SktRNcqIlU4GcjnrT2+UsecZ4NLtHmIr HaOetOCsVyQdopylsTe0tSPBJAOGGDUDcr2AHarB7
+  YOc9hUfJcgEKO5I71PNbcSTTuQNjaNqkf7W KjOBOSzAqR+dSSKVLbRkgjimsOWPdTjGKZUOVO
+  7GMdx+XqOeahLDOD97vmpNoL8sOnzVD97cMDOe TVWSiHKlsN35KnaRtGMnpTc8sScZ6cVL90f
+  ezngccVFsHkkNnJPrUc0dWyelkIfkUMRz0znpUZ3Z P8QJ7dqe2ApVidh6+1R4USPubGcc1am7
+  rqSko6XBV+TLHgHtQeMlckgfMc0mVDE8njof0pSNifK2 T/EAaTlc0vZaiFiQo6Meuab8vz8+m
+  OafuUkZ4brVZztAJHQYFCvs0TFJ6j5JFEeGXnOD61DLJhQM Yz09hTmysW7GTjnio2BJBOMnnG
+  OlOLsEbbkLMyhj2A/WomJIU4PQcVLksXyNvOCCKrmTpubsCcUW bb6icbIhD/vgS2QTnHrUTcS
+  c4Ck8EipJGDSbeAP61AVyqqwPc7aqST0M5JrXYhYsVJYgYPXFKxOz jGGFMJCyDP3M8j09ajZg
+  pDLz754FG0i0uVXHKF3jduyDliDTiwMvUDPTNR5bJLDHYUAZTLYyD0FW pNi57eg4l/MHQL61E
+  5bIAHyjnipC22M54FBcCQggEgUlUaaVgTTVkMVnk5VMHPTHNMfJX7w3HrxT s/6QCFJ9SDS9mA
+  AIzxmolP3hSdtCsC7Lt28k5we1QSMPL5UlurAVJJncSAxHIAHeoDgDoTxVx01K dmiLg78gjJy
+  BVNiRJlgd3UDPSrbLsUEA8jpmqLuASwDHI70Xv0IptJtdCCRz5uw4UpyWHQ1TkGSC HBLA5C+l
+  XsgIzMADjvWax3YUIw56miM0nsXDV3jsefgsdyqA2CMmrYIJBQ9OoPrVE8bemDx8tWou GYEHn
+  APtVSXKm0ZO+7Lkb87cjsT71fUdSCAx5wRVJFXaB/FjrVuHzDArEZOMKfWlOF2pJmr6P8y/ CM
+  k5G4ntUw7gg5OKrRsGbK/fU5zVsllJOMZpRSvqZuVxdoB2qee2R1q1Fnapwc96gQ9CQeCfxqVS
+  ehO3PSrUtGW4uSLIO1/mUN6CpF3NMyg7ecmokGIyZDnI5PvU+R5KgZzt59aye+w3Lp3H4AgHyN
+  vI 496OhRcEHoc+tIUyuDkDqM9qfGr/ADcBiT37U6clcUb8trljaXkYsjEHgVJGCMEABc8imAk
+  8dV9q mCfLwGU+9EovUHK2iJV2gSEg5zzzUyqiDPUkcVCnO5SQRjJqUZDoPLPy8DIrNRaZpfrc
+  kxu43fLn irURJTDjPcCmooDcYbdzUyFVHGS2cE0m76WJVncevy52thsd6kT5W5xkjqaAuHI6g
+  9falLELgYLd qqEuZWQpaj8YQ/KRxgUuFCjG4kfeye9NXeXxnJ6gEdalDqwwQWOMDFDlYfNdWF
+  QcKSpBPGc0+NC6 ttZeeo9KaC2wK3GetKMK+A4I9Kh33Qoxdrkq7gy57DOfWrKoFAIJBPqaqDI
+  GMHaauhFIyT8w6iql JrdFyjH0J02qSeemTzVuL7o+6Sc4/wAKpKMsArAnuvtVwMoIO3kdqfK7
+  DUL6J2LYKiNQCUYdQak4 bIVl3dsVCq7hllKn1PvU8S+UVbaWAGMUaJeZLvF6EyAiLYzADvx3q
+  RQ5Vdy7sDkAVBltxYLu5B9a urnduHLEdBScrPUavFkijg49cY9KeciPackn3pi7mXGw89frUy
+  5ITIPHU0l7u4pNSWgg2hQvJ5pP 48EEc5Ap5X5/lIOeRUjACIc8HuaTbsKLaV7jVXqcc5wBU2H
+  BALIGbtiq4DBCSAQORzT18wgMWXP0 5FO19bml2KU2S7MnB64NOHQgAbS2eaaH/eZyC+O/ak3M
+  2FwPU4FJvUqbskrgAPNy2ScVLujSMdTn oO31qJQyynOCMc5605l6HJOeAPaok13M5STdhPmbI
+  KgDPWmncI8feHsKk3nagTHTkmo3yF3D8QKa auJybeoE7iWyDTSV8gZbOcZA9akDAgnYQ2PmNR
+  Md6gEr1p7ly9NBhUFyfmGcVWJAdN3G5Sx9varT kAnad1QO6nICgYwCTVQeu1xOV9LXRA25lDt
+  yQe1RcKflbLHn1qct+76dT2qry78HC4xnFO7e+xSl aOpICokwcEc9BUPl7W4PGM5zS5AJCtjt
+  zSFl3lmPTr2FKO9kzNq5Ex2oFTO71J4NRlgX5baQ2SKl b7vp+FRyDcAcgYHJIpy8h82uhG+Sv
+  Xv+dIMrIQenFOJPlhQM49RmmseORgk5B9KTTaDV3EO7Chuu MZHalAKklRnHQ0jOhHIYkYyaaA
+  AM5LZGeDxT3uNu0dR2CS2c5x26VAyjJGCRwMelTDduy+BG1RBR v45GeTnpSunsRGdncQ4VQoB
+  LBehNQMWdQVG3Pb0qRwDyxII6EVC5XYBuG4ngU0+ZBZXuyJziY9el VpCpi3A855qeRT5hySST
+  1qCQgDYwwM9cVUddAT8yFyoj3kc54yeoqq0iAfezj3qZshcHHI4qux3D sW6dKpIm1yLPRTkA5
+  xmlfDRDhT601gUTaTvXoAOpNRD/AFIYqwGfm56VN0nqU+e+iHdQGyMU9Xyh ABHPU1CcrMQeRn
+  IPajcxK7gADyMd6q/NuOUko7DiwAAI5I70mSI0zxnjB60qYxjGD15pA+ZMMVPH 5UOavawlG+o
+  8sBCdqncO/vTH3gglgvHUU1nGNwJb6Um/12kHqTWV12FJtLRaCZOAVB5PXqKrswGA e/A4qRid
+  pAHocCq8m4nkAHvmtORNh53IflDFdxyF71Ucose7nkcVO/31BBBJqCVVI2Kc+nvRdpak ucb7l
+  Vy5baBkd8VRlYHhvlIORirjMSwAypA6mqLsvmY43E8H0pWQk9Tz8KpjJDFgO3pVqHAtx8pL E5
+  BzUChIpujONw4FW12F8E4I4rZWWjRKqPlS3LaffXH3ic5q1HzGrfN16dhVKHkxkZy3I5rSjc4J
+  I4J5A7VHLJbMq6jqSqQANox6+1XomDIN3JAPPUVUTmRQoAJHQirCLhlGCAOtFr+opJPUlBUqrD
+  Ab r7VYXPDsASTnj2qCM/OwwAM8ZGashQ5BcgqAfu+tN8yfkaaLUdGHkUZxnGasqo2jLbiQcKO
+  tRKmR hRgYJ68inqSsiY+7twKE+bWxklfW5YjJ+VcEt/dNTKMIG3Luzk8dPaoVBV+Dn196lUDa
+  3t/D9KV0 nojWy2JMDbyQzHONtTooG4knHHNQJ83JUDPIOKtpvEI3Lyeg/pR0stxxajoJySxwT
+  zjIq1FxKuQe mMGoUwQepOMfSnqCZPXuSKmWq1Y3YljO6VVIKnGB9KtooE45xkY57VXUkyLkj7
+  tWgcle+BzUXtsT JvZDt+JTnJGe1TrzGVAJXvnqKrZ6dAOpzT45SBuyDn06VVna6C2mhOA20FT
+  vA9OopSxVidnBHGO9 RlnKrg4PAp+T0JyAODjrSk4p6iV7oAflUkdD3NTHbkA9AB0FRBXJUYYn
+  HFSP9xF3Ddijmje472ej JshpAoI2jgipRu3KVyQDzVSMb1O1stnJJqzGxKk5xxwaUk7jcGti0
+  rLn7uCOM1ZyXG48jPFUlYlF Lde4Aq2kgEcfqRyKIxafcIt3ukWs7Y8iTI3DrVtQfmzzz1qih4
+  AwMdR71dDkNwcelKo5dR2luiwM LwBxjgk1OnyKQoJPc5qIEFACBjP409VyMgj3oik9bDb93sX
+  EwARzxwOaUfK5xkIetRxklxjr+hqT d8w6An1ovyuxLbt5D9+F6cdD9KVgNw3nGRkc05mwoPyk
+  49Ka+PL+YZ44OKEwjN20QDiU+XkjPc9a d8y5bB3E0ijcvAKnGeOhoEjPnkL+FQm3ctvqG1DI2
+  44yOMUb1BAGSSOQO1DGMg8nIOevWmgHYflx 82QfarUrIIO6Ji29BjAwcc+lDEeQCOe4qBR+/w
+  C4X1p+cuMlR7VD3FyNvUXdhSPvetB3CPkYY8ke lIWZlzlR+HWmM2VGQSc4x7U1eW5Suh7PkAA
+  84wfeo88KBgtio2YuxXBPTBpWxwOVApyVlqLlVtRj MzEHG1c1G2OR8pB/SnM/zYbkED8KjYnb
+  kcjuaq7W+hU1MhLgkgnA7ZFRMyD937Zp8o7gYOM4JppC qSxxnGckcVNnYhxttqRA5k6gEdc0O
+  +EVtpIPX2prHKliQD14FIZCUyFHsDVKydxxetxh6sXIOeQB 2pn8POQemeooOGl3g4bFMBONzZ
+  HfHpmktdWKT5XYT5WRc5B9QakPEHPXvTHIkIKnnoP60gLNuwVJ zTTuKb2YnO3HGO9KcKByOBk
+  H1qPc3CjB5546UbS7ZzznI+lVJdxTaaJWc/LyvTn2qsTjncCM9hUj KB909ByM1GwG5iAC23JW
+  iDgtCIciegh5UAj+HOf8arSKoZT0zz9KezNtzjaCBkU1pQFJzyOoHaqb lH4TTkb0WxGzNhQAC
+  MZ5qkfkQ5+YZ4PrU5kZyw+ZT6mqrnaFUnJ5zU6MXLb1GM5zlVLehqEswTgd uuOKeS6ttGCeB0
+  qs7Yf7rZ579az0voC0VmhpYEEpyAc47ioeWYgA46nmnOxDKyjjZ27mmBSGyCCc c4q5WWw7voR
+  lHKgHAyN2acmQoO7JOce1NO5txPUnJA9qe7jyVClSx7DtTdSTtZD57jix8tS5AJOS MUpaPYxC
+  nkY96rjO5QQWJ/KkYsEyeB3I70pQ6tEQsP6SgjB5GRS5bzmGR6jiogf3bHIB/XFMZ2ST KsOec
+  EVad2kiUkk2JJuaYOHGc9qa7Ycg84OCKc+DEoCkAdvX3qq0owxwPcGh2Za1WiB2ONxB3AcE 9q
+  ol9wH8QBzuFTOTI20KykcnP8qqMCAQflwOhppxvZkxtfXcYSqtnJYEdfT0qhNuMrbQCoHX1qy7
+  rsIRh1/Sq0j7V27i2eeB0NCdpbWEna7OBjLrcgyqT34q1GvKNtYk8cGq0QO/5zyw5J9Par8ZKQ
+  4O OeFNaKKixSUlui1Ep+UYPX8h6VdiQjoG5PQ1SjOUwuR6k96vh2CrgjJ65FJyadkEd9CdOHH
+  zZPoO 1WFKYBBye9V1XEoKsGJ9quRgA7SoBx19aXNd6blOcbk65CBSQT16danwR8qg5POagVm2
+  qrLjaMA1 bQqqhiRzwKcrp6oIpLzQ7bv27Th8/NS/MzgNkbR9MilC7SCp5H86k2tkM4JyP1oTX
+  cjn7f8ABJUK mJwGABHyk09B8rBcnA596ZCRtA6sOOKl5Ac7eSeah26LUpSbRYiZSNjIV2jjNT
+  DhVPU44HpVYOS3 KHgdh14qbBaMGs0rajknFpskTJkPG0A9+9T4POM7SaroMRbG5HHNT7hyw3d
+  fWolZsaqST10JsgKN 3UcVKpCSYBPoc1WDYOeWBxUpbc20AMc9/Wrd4vTQcnZ2ROhyWx90HmhW
+  B42j1BHpTchF54Oe5pqn bHzwTVpXQ7LcslsJk5G09RSo75IBAye4qBWIX5sjihWxkEgqTkGs7
+  LZ7iastNS3ucyZJyMYGKAxW VlCsx3dahYgIdvXsKlUkrgHBbrSdkitbX2LEfJ+VgpI6Y61MgH
+  mEBlyBwPWqu4hl4yvX3qWJjjad pbGOByKLahHa5cQncp64HfvVxVBTIK4Pas9XPC5B9asoWUA
+  44oS0ugvZdjQUgyEggLwB7VaQlgwO Ce+KqIyBgRk9yD0NWFbdHlQQSMginH3mRz3diynKEnJJ
+  6j0qwvRMZyOoHeqiHG7nBzzmp0fadwPT pnvUSUraGlu7Lqv84HAOQcCpFTPLNli35VSUBRuOd
+  zcA5zVkNgYzk5GTWlraoU79CT+IqzAk+lOG DjPJHUCoULeYN3DE9COtSBwDsIAbqTRPunqTKo
+  3uPBZQT37Ugww+Vc8cgUxm+fgHavSkLYOTgYqI pmlpJXH7gCFw24npSbgVIJOOn1phb5g4PX7
+  xNIpBlZ/4c4ApuKWqTJfw3bJozxtY5WkYgHK5Oema YDjIU8Z545oYFkUYJwucipi7SuxqUn6D
+  95Em08EHnjv6Um853bScnr6U0H58nrjvSFvlBwVB7Vcm mKKtqOBbcCMNgc0yXnaPmzu9aQnK7
+  kYEHoaYzhXGWww6A0t3oHQa7EggjAA4Pf6UxORxuzt6mnkk RAZU46Co2ZSSQ4HajWzByfLYgl
+  B6McA9aYPvYGcEkYNSO4XGQSe1QNJlkHXvn1oTk42Y76CEcjJI I9aYx+ckEnjIx6U44bkHnJx
+  moJTtAABxkHNS7kryEcsWLAjoBjvSlMKScn3qMsN5zxk9D2pu5t5x 86YzxTk5dNAVO7JFPy9V
+  zt49qUYCYHPTkVAhJhztOfbtS5AMgXOd2atxSbQSbegrsAMLxzxmgFsj CnkZyD0PpTfTuBjJp
+  ruTFlfuk4oa6WFKAfMcsx9M8UwkdCc9uO9Mzt+UHqcZ9qiB2uTtNEvImEls h7FtoA5UdCB1qA
+  suWGC307VI0hOcjAYZzmq2TlyF6EfjSd+U1jGUU7sVmLP2UDnJFVnALYIJ460r 5KjqSfQVCzA
+  uCxGSOMdqmDa0Iv1GEnc2OhqBlHzbvl9z2pzOvGC27GDVc5GSx3Y4xVxWlx2k1dDM qBvHHPy8
+  00u2SMKG3dMdKRSGB9M5xUJIOCTknk+xqFHmTZTk0tR2SsuQMAr1NIULOjA/MwzxUTZV 9ucZ7
+  ntR5gV9xJwea0SaWhE6bvpuSMWWTHLEelM8xS6gZzjBz3o85TICSMAHFRNIPLD8ccAYqEm9 ZI
+  E7rRakm4lmXCnnrURxj5/vZqMFcsTkEnkZxikkC79yt823nPNN6MnlvuSNJk8YHHB9aqM20tuO
+  4Me3YCpN/wA7AgAYyc1XLsycYwy9SKuF9hW5XqhrFN+QTtHU5qvM3ICjJbgnOcUjEH5FPINRMQ
+  xA OVLcYB5qrK97jvHQgZPk7YI7dAaqsCsjgHB75q1ICq8ZfmqTjc53EqCKOfm0voEXdO7OOUj
+  zF+cE dh9KvoWZo2ypXb0xWdGSQPfjNXot4QKE4J3DNae0bCSdrMuwhS6hsEYyAK0Yvmj2kEkd
+  CKpxkM46 YI5AFXEUmIEMN4GM1EbvYybu9CULmJeAFBwR0NXN5BH8LDgk1XjVSSVyST8wzU0RG
+  4koTim02+Yt O/QskZB2LtVj1z1qyhOeQox61XRsDplQcfn3qyAQxkwS3AI/rSumrMWpOQxLbg
+  Cc4BoX7+WcD19q i39CPqQaeOHPQkgcVlGLvfsEJ6PsTL94lTjI6irEbkPh0bb3NU1CrErZIP8
+  AFz3q0h3x8sc7uRVS lfRAn1LC8KDnHf6UsbjyyRwM/eqKM8HJOOQOakT5QCOVzihrqUlH5lkN
+  lV6EYORilUkgbSD9KgDB 3AY4bGB71LnfGAg24GBUxTiU5cr0Jy6CNskAjoM0oBOSGHTg1CcEB
+  iMPtAyacSQgZSG5xTdltcLt 6LQduywyS+DnOaejfvgx5zke1V1ZuQBk+1OVgHJUcAHNNyfUuN
+  +m5cJJZRjnufpSYJCsB823oKgD 5YkkA4596AxKHJwAO1TTk73YlK3Uubl8vkbGyAMmpI+ZgDk
+  ADHJqmADLw+H9D3qRXy4HIyOppyin 1J3TLSkh/vcY71KrfviRnnrz1qupDfNnvU6fMVGPmB7C
+  lJdy+ZblxXQsDjCscD2q4gG1MsDxjGf0 rOU4IBx1/KrcQIj5OBUPR2XUlzvHVl5MmTDcY6GrU
+  U3zFTngZGKoxv8Au++OhA61ZR8OuVx7049g 1toaMUihQzKST61JGCy7eAR0zVIM2Bt+bnGM1Y
+  DAxnIII75oQ4rtoXg2FI9B19KkjI8xx3H61VQq eTnb9alXaXwThQM5HehWdkNJJWJvNcxgsrA
+  5wD6CnqGWQh+gXvUcZDKFB/E05WzknIIPQ1T0dloR a6FBUgDPvTyxzkABQOtQh1VjgcHOBSKw
+  8woT9PpQrvVjlAnRlCHHzHdTSPkLcjB4/CmsF8vjOAOv rQFQIM7sEHPNZ8yvuCjyq7GrIS2Oz
+  HJp5kCH5mHFRLsU4zyBwfamsCAG3AnFaJxbsXzJsl+8MFgx BHSnbsSAEEjHGahRv3OSQWzk4p
+  u4MSec9AM1m1d3uNkiyElRwo7DFMO4jAIZsZBo6qG4zSAZdWJH XnFXzaaEuKirsRuyngk5zUT
+  OhdCFIwMZ9akdzvPTj261AwO08HcOnHFKyW+j9SkrLcj5YAqRjFMw pXcGAYHAqQ8n5QNpHFQk
+  FkBQAE8nNCm0gspDWUFm5xnmomBO7d0B59qlwA5Qg9Ofr7VCTtRiSfoe 9SpXVkyXroMccEHHT
+  J4pmQY1XcFwMk0u0MysTheuKiPRiULHGMA1XLrqxqSTSaAyeXFxjrT92Y2X bgdSR2qDBO4MNo
+  B4pwZmwQQvrx1FVaSsyZWtckLZTtx6VE4PlkZwueBipN4VT0AHTPpVZiruMucd cE4pRm7jWm4
+  0nbCQxIPIFNZgB8xzwKQMecjg9CaiLDCknGOufSm5N9NAlKLsx+4spG4Edj6VE7bl U5LAc5X6
+  0jN8+ARsx1A601G29BgHORUpNq4p8rSbImIR2AYgHqPSoWJ3YAPrT3YEMRjrmoCQS+GI JpXuh
+  +VyNiS/ODt4+tRZwgxktnk1IwYsF3Dbjiq0nB2c4BBq4S3QOXQa/CnjC54yOajI/d5AP5VI ZC
+  FcfeUtkH6VBJJIXDBTt9BUpyetiOW+vRDB8wCk5HXIppAMTBSODhaQvmQj7vFQOcgqeBjPHHPp
+  VR10RXs5Rt9485wSBgg85/nR5gORj5VqKNS0LKTgHpzSNjIXJVfX6UNO+opqO7HeYfMACk57+t
+  IW QuScHA7U3eABxyehqsTlAAGxuzk+lOe3mRTS5idpBtDYZc9agbhz1Cg8Uudm4daiZgAoYdO
+  BikuZ 7lp+RDkl8bSoHrUL7V2u2ckZ4PepGV+X5yemKruchQykHr7YrX7VhcuuhHIwzlTgexql
+  Ix2Nhhz0 Bq2xBBGRuPI4qhKxDk4yB2p00kyVHXU5WIPgA/Kd3TFacbHYM9CeMCscvm4AVmZFP
+  PbNaceMgsTg t096cIppSe4oQdveZfhU+YeeM8CrUf3mYfdPvVeIncdw4Pp2qyqho9xOPl49qa
+  31B1d7F2LiIgkZ xjHerYOVAY4XntyKpL9xVzweCcd6tDccLwAG5JqJKzUuwKVtbEqn5gUxgcc
+  +lWI/u5LZ5yBnrVcB t+Bjk849KsIACUK4zycGkpNsi2t7DwckqMktzmnD5hnkc4564qLJLjgh
+  exFPBbaMnopyfeqcXpct Su/dHsSzsNwx64qxESyBcgKO4qqB8vUcDp3qdXAI4KkfeqbJ+Zb8y
+  yrNsYgfP7VOrYUBmJY/rVJW RQ5JIG4Y96lWQPGNnDdBnvUTve2we0didWywC7SM5b2NWFbMi/
+  3vSqQLo42kBe4I5NO4JZt25uow ad76kc3NKzLgIIO7JK/ewabuwMgg5GcHtVbAC5IIGRg5608
+  Hk4H+9mk7l1Hd9hxyuMnGTz9alU4P tnJNV0O1/mDHJyfapI2UrlclT696mV2hy12J94BYYLEn
+  I9qkJTyzhtxJ6f1qtyZSHODnqKdgAk5z 7UJx0voJSTdkWS6hyQcfhT4h+9y2eDwKpqGExYsCM
+  8CrCtgEEng9fU1F7PRluLtYthgpcjIOe9Tx bsh0OCfWqZYspPXBH4VYVzs+8oDD8jWqatohpO
+  yRfUlQTkAk4GatRnIznORgVnIExgszccc1Yhbk FidvQKDWTjzEWT2NKNmO4NxgdRVgHLrwTn0
+  qipWRv3bDGOc1aTy9u1m556U3ZO1hve5cUtuKqOCc VbVSAehPQ1TiK+UD2xVuMk9hgqKcm3r0
+  QStLoTJklSwzxjC1Lg7lAIVQOM1ArFMsMdOB7VIrgxqS ec8j0qk29hWcWTpkKMMB6e9SEneDk
+  HnBqEFdoK9hkCnZLLlVbJGcmm2+oJXWmhPG+ZmIC8c8iohg yjcBk9KcG2Rg8ZxyPSkDqcDgMe
+  pFTFNXaCKiODYO1jgLwR60KN8h+b5cZ+tMYswXaBz0NMLFc5Bc AYODilyaaGyjpZMmZflxwoH
+  eoxjaf4mB4pT+8AIOBtzg1AASCoO0g9SaairE+9Lcn2gcgH5l7dBT VZApbhiDjg0zls5bjouO
+  KamDn5WH9fepkronybJfMAk5+Yd81FuYEkHPPbpQW/esAMHbQMFkG5Sc Z4pOKaG1FbiYfYGYk
+  U08qPmKgDn2pWJVflHbpmoHLAAjPv71XvSe4K+iYhOGyOw6CkyMhiMEjqPW lXOct1DcZpjDL9
+  T1zUpp+odbXGM2wl1OXPvUBILIT09aectk4/D0prAbQOrY6elKLj1FfR3ISylT jJCjFRMGVXJ
+  OB1B9amcEJtUbsjJA9fSmHLR/Mp+lOUtdBR03GphHLHJZhjFNdnyNoAH0pGKonck/ 3jSO7Lyg
+  GAvI9qbb0E0ubUiZ8SHcSQTgYHFNJBBUsu7AIGKc3zbWUnGM/SqxY88jIPHHJzTSG7dx zNghi
+  eAOMDrUTsrSA/eHTA707dmM7uD0AqEKxXIXAB60PVXvYmLsrLccVUIpOc9jnioyYtuBk8fN z3
+  pxb5twO4jjHamEfeIGB/OhOyTuDhciZsqQoBNMJznO0euRTyPnycAZ60xuWAJGAfSnv0KurWKs
+  jFcYPA4zTGwTubn/ABqdii43Ju5/CoGBEXHXGcelSlfQr2t0QSMVGMAsB0qEO5UnIz6YqTlosD
+  rx zUMshUkDH9aqTSurERtuiOTb5YycMDjNV9xwTkccHFSuysfm7rkc4qH5TDwCCPyoVt2Cm3o
+  MGQD1 BPIJody7M2cLn86YzKYs8l88AGneYwjw6YHvROVlexXNqMZkYKqdcVG+WTb368GgqPu5
+  wB3qMD94 R3xkGtoqDs0wtZWuPATGMtk9CTTC43MAR+NGAB7fyqJt2PlGQeR71D1l7pDV72Gqj
+  LIdxyR0qJ2O MLgt/EfSnklfvZHrmoyDypXhl7VMoO+pm5JNMrsMxkrgtjvWZNkQspPzAf5NXi
+  eOAwYDnFUJs5Zc 5OevrW9JvpsXFOMrtHNwKAFBYMScjHetCF87Wbam0YOfSstFO7cSPp6VfVs
+  NgDdu5OPSs4qLd0Ja q5qxvldxwUzzVhY2Mqsp3DHOKrQqRlScjsPWrilhGQN3J/Orje/MiG0r
+  8rLqgbQeQccg9jUiFjuG CTuAxUMZwuHwSefepkJDll4c0ScloKCstSVMA8ghgeecUoblMZwR6
+  9aiAORgFjnluxp5faQGG054 PrSUXzaDdtEiZT8uPm5PQ9qkz8uN25h1+tRIMyckZzjJp7IpkL
+  Ek5ORipvFsttbk5kAx90NSugd9 24rzwPUU0FQG3dB1NM3dGB+mO9KnJ3skCT3uTO2U2EfKp6m
+  pgVUgJ1B4J71W3YOMFjn9KlKn76hv qe1Nyv5BBPUsB3Eg+RmKipN4+V8HHt2qDLBSQQSOpp4I
+  P8SjPNRFue5UoqLLDOcKu0AkdaaNzcEg rjFMUEDcpL8/L3NOyrEhmAA6g0pNJ3QLmXmKWY5+Y
+  eoxTg4C9Qfp61CVBG9enYCpDgKTtx9fypXY udOKDzB5I5781OHEjEoM88VWiKbyB+JNTK+0n5
+  MDoDVW622CKS0sS+ZsfdkYPQd6nV2JGcdPTqaq 7htUnle/t7ipVQkKwJ2rkY96W+5bk3HYvq3
+  yqdw3Z5WrMcnzdm4x0qjGNoBYjGeo71bDDIUfpURm m7WEloWlbDYxwO9SIwyrAH3qBSNp3ckH
+  oPWrMZ3rgYJBzVRnZbBbsi3HgkscYPAAq2iN8wAHHVjV FFZl5YDvirIBwu3K/Ng5NEn5iXxWu
+  aSsoVFBwvcCrKEAtnP0qggJjKnbkDOcdasoDsUg9PWnN3Wj HZbEjt/CDwecjtVlSBncPmA5NQ
+  BcFQVOegp4Y43ngHr7Uoy7FxkraEylcHHBzyDVne7TFVIA61VB woB4PBI9alz1ZelEo66slyb
+  RNht+5iMY4wKe+1o9xPscDqarA7WQYzxzz3pzEhwGUnjnFFpJlXF3 7DtByMjHrim7ShJHIJzz
+  3oY7WG7oB6UhfAIyNmeDTadrIcJauw7cDxtJUDk/0qPy24xnceoPamBg rHJy3UUquTIxJx7+t
+  JOUdkEnLuOG3zfmDeoxSfLuY/NjPODTfMCyHnIIwaY2GYkZLEYIBoctrkPV 6inAYsMkAcjPNI
+  rKr+uO9NHQEEbv4hmgFsDcoGGyaHJNWKkiRmQrnkccGmE/KAOVApCQCoYgZ7Zq PI3YXcDnj2p
+  uy3Jd2tGDZGC2cHrn1pgYgZPrn1pc8sXwwzjHpUXykswOc9qS5Wxy0Qrk7QFYMSOv qaiJUD+8
+  3c04hD1JJzxg9KRVz0IwTyPSiVSCTfYhy2ZDIu3ocE8ioy2EAY4APX3qRvl2AfMp61Vc HcB94
+  fw+1SrSdmXGLkxjjdIkhODjilIOCScHOPanHBAOctTWweeDx+taXb2JmrvcR8KjBcg9OarF WB
+  5wf73tUzMSncc9fWoGJJIUEnHBPem/dVib2dxkpbegUAn1HekYZbkbexx0p45kUlh6sMVHklWO
+  Cc96zUrrQtSXYa0ZTJUg4681EWcOA3TsfWnO+IgT1xyKaSdv3SCeMU+l5BJNIRmAYgjd6H1phK
+  rG ASMAdCacQPN5YEY4xUUgHBIJA6e9OEbbmfuN2sV3zv4OVJPJ7Uxcqwyy7duQcdanLNvZSpw
+  AOKrn DBsrsGOAaOddTXV+hXZgcYYFgckAdagchs7Rk9Qo61OxCyA8MT1qttOeCO+D60JrbuDV
+  newwg7SQ Ac8cjpUBkJypAU55OKldiqbXHU5qqQGlY5znGMd6laXRiovqIwKuwIwAfvAVCPMAI
+  fLMTkGldynG QADgmohvZevGOfrWkNVdm0bN3X/DjxzGcMAT3Peo844OSxHPtS7ioIABY8gYpA
+  Bt3Akdcj3ppva+ gOpaLQ0BgAOdw6/jSO+F2hTkcDmlLsY1XK/722ojlZgQMjj5vU1XNd3fQzu
+  t2DszSnI2gDkY61Dy Mj+NutWS+ZCRjOOpqgWBdwFJOeTQouXQatezRC5LHpgDg8VSc7Fz6nqa
+  tyA/Pk5x29aoykkHd8oL fLQuW2oSbscvEXB3N0HUHvWhEAATjHGV5rNgceUzltwPQetXomAUM
+  Qxz94U3F3aasT8PwmxGSU3b vmOMe9XEfaoHKjOBjnis+3G4ggjYq45/lV5CCwyvy579qFCysh
+  Xu7dS6Dld2R14NS5CEHIJJ4qoA d3UYHBFWVIbjac4x9fehwT3ZK0JFdgeOFzyalCKTnDH0qDG
+  Fznv0qSMFgRg8HjNVL+6Va71Jd7KR 8wJPQVKWAYAdCcE+hqujqJRwNygjPapAGweMemai10KS
+  8rEgQK2c8Hkg+tKPuEkY5qNVwCS3U5NS bCBgklQeRUu17FRaHn5lxzn+I+tSoSFIBwB6+tVVf
+  ORjBzhfcd6njUM5xuwf1pTWlnsOcblnduxu UghsfWkOBM67h97oBSKTGCf4u+ecUiBmf5uAe9
+  EYJq/RCT0vHYsLuIBJKrgjPYGmtIwTG0DI5OKX DDojAY6noTTWfcF44OaElo0aQemmogB24BO
+  Ac/SpWHDBWzznB71Dvw5wCASMj3p7EOcjIYcnHpV2 bJcFLqSEKZAo4HU49KcBtAcE4xzk0wMh
+  JxnJ64peUCYO5AORWEZu9gndLyLOAxwMFs8VLGWwvXB6 1SXesi844I5qaORiegwBjNU4y5bvY
+  bskncuq245XO0Hmrsajdy3zHkc9KooPlJ6BQB9TU8LZ5IJI bn3FTvpHYpu0dy6rkoqjBz6CrM
+  YbaT3PcVVTZ1Ugk9u9TI58xQcL/e9qpXtYWltGaEO5lJIG7PQd atKAY1bsRwKqL9xQA/Xr61Z
+  ickfwlQeKXJLdMSRbT5ARnag6GrAJLp/e9+9VUfeCcHnpxU5diBu5 7Ad6qFuZ33HFSUtiz5jb
+  23HhjwKeoVQwLfMBjGelVjzjJwOwqUMdw45NJJLbQNVt1LQZWIODtI5N P3oMYI56k9BVNZOgJ
+  z3x61MAShYY+hokrEyunqywHUD5myCeo705STjHQAgfWq2/quDjscUuS020 EjA5Oe9EdtirW2
+  Jzgq28YYjjPpTcbcDdxjkVG0mTg8sMA+1EcqLMSQxAPr1os+XQlybdkOZwJPmX K5GPpTGYLJx
+  1I9aN5KjcFVevNMbeu45UjORx+lCkirJhkiHaMZ9x1pCMMmWGTyCO1RF22MxTPWgP iE8AEf5x
+  R1KvfdKw7euCcMMDFMySmwsGJ6GoSSAOhXv7GgsxYlfl9eKTTuHLtaxMSWy5IJHA9qYC dzHID
+  DpxUO7Oed3c4oDgxkkgMBjFVJMlwWo9m3AABgAevqaZtYMTn5c8UEqDhSffmoncbM5AGMcV F7
+  6WFboPXBlHOcGkLnO3BxUGSGU5Bx0AphdnYnjj0qlRT2Y4au9ywx+U8/w9PxqNiDEW6cimLKS4
+  LbdvUkd6Vj5iuSAVJ7UJNOwnF3SYwcg/UEVGzH94QdpzgDFPHTYDt96TehfO5cdTQ3dkR0ukVi
+  Qs Pynvj3pN/wC5YL1zg56ipyEaL1btioXVgzbSvXoKlyj3EktmyAqythTzjmkYsiK2Rk4PSpM
+  KEOSd x/Wq5yHAAyB0qU5PU2u7DmZc5wCfWo+THubnBwMUH+7kDI4yKR2xGAOfWr5Laoydo2Eb
+  arBiSCeM VCzFmQHsMfWpc8c9e2KjfcTkOARV3TKtdDcgjdzkngVUk28lsgnoKmztnbecY+6Kj
+  b5n3EcEcmpb irNAlZ67FVmUM7gDBHeqzE+XnrjJwPrVqZx8uQSuB+VU2fdJgKetJy5TS7b22K
+  7kc43FTzzVd5dq Y4Ge+OtTSBQ4CnHt61C5VtpAwAeAeorRxW7J5o3vYPl3hB+vvULZIC7Tx1N
+  K2dmWyQDmkVkZujZ6 4rNcqRN1zXEEny8DvlcjtURkG4b/AJVPb0pzkYK5yWGQF7VCS0jbSR26
+  itb2d7D5Fa6HEkMSD26e ntTS+dwB2kcn2PpTG2iUjOPm7/zpp/iLE57+5qtRJXsmSFsBGP3jz
+  VRzk+hxyfWpBvaLocVE5UPG OhBxTp3TEmkRuwE2Wxg+lULggN1wMA81ckZQxU4K5+UiqExOeR
+  uQjrjrQtdNrgpdzlLcLt2nue/r V5CDcKT17g1TVmEYBKqSCcEdKnjyp6goRxn1pxmpRV9xcrR
+  sqSIwFwcHnFWY2YcBwQKzF/eR9Tw2 G9quptC5Vvm4xnuB1qFbW7ErPQ1g4OC3c4qZJcSbkPAH
+  f+VUIwSmVPfuasglUzgjjOe1WlGWjMuV bssmYmFRgcYzxzUivuIXlXHBqHLBjnAA6kipQqgoc
+  8k4J9aJuNti+aNuxOFUHO3cR90jvUse0yY2 sGAHWq4DKxDAlQ3B9KkQcr13Dk1k0mm2UpO2g5
+  QDPySd2fyoO7eu4nBFI3EhOcL0zT2zxyDjnFCY 7dmPGDjAO5epqQf3s8YxioEJ8tTzyOR3zUg
+  OUwzYHXP0qbu9rijpLQnX7xLHginKwMeXGCTUKA7Q Mg7jU552pj5geBim7LSxd3fcUM28bySN
+  pwBSfOCAD25GKjLOW4+THHI6ikjU/OfmLA8VUYpapgpv XUnBAj+YZYnj2pW2FxtIA24z60Fw2
+  Mqxz/FTCVYZA2gHPX9KNXrYyTe9iRGRdxYEgDjFODqUyAWV uuOxqH5ZGbAIBHTPenKxCJzg9R
+  7Vnyxi79S0kt1qyePGdrA5xjJqWNV285GTjmojk5crtxUqkG2Y k7z14FP2lxxeti4BmE4557V
+  ZR8EYZeOnpioIyFOBgAjBz3qUDg8AjHbtWSnG9jaLi4l8EBV6MT/d 71YABbI45qjCFb7pIGOR
+  6VawAB97d654q+ZNkpR2vY0oxmHk8dRnvU0WDJllwM96pRD5gCe3HPtV 5WXCBlOSOue1Jc1tD
+  Nx6LUn8shixb5cZODUytmIdMDoTVZDuBwdwJzipWKiLGCCCCaHZ9Q12LHmf N8oUEAcmpFLlmx
+  jAPp0quDuUkDL5FTLkPgZG73pylG4XdrJC5AHzcMD1/pUqOcDLDkflUDZMzIeA uDk96RDgtxw
+  OgzV8nPqXJpKzJiWLAnB9cVIZG3HLA9s1AN23Bz/hSY2p3Yk5Yil7t0Q5XsiZD++D MwPHPvSg
+  nBGB1yCahyHwRkDHQinA/MduSDyD6CqcmU273uSbsyKcbgTSOxy2eFx61Hu3IMHJA59q iJBY5
+  BIPIJrJJp3C33Em4mDryp549aZuA/2Wx0Paos4yM9emKXdn+JQQOBjvTkne4pX7A0uZXB5R ue
+  D0pA2EBDHA61Az5IIQ5Jwab0Hy/Pxzmh9UEGm9SYuBk5xjj61BG4JI7Z/E0zcMckEn17VCXKue
+  wzwR0rS9o2YOyLJkG4rjn69KYGCtlhnnj0quXbeSB8vGfembgWVhnJPc1HvdGOfTm1sWgyqAc5
+  5z SkqVDD5SeeKr72YLhcADoKRSzsRnr93j86Ol7hJR6FjLAAgDIyMAU3ewjQFSF7ketRlmwOm
+  WPIpy ksm0YUA5we9Ta24003ddBWcA5/p0NIrAKC4UkjsKQkLxtLHdwR6U6QgQBgCAOORVwu1a
+  xKvIYGHz Y5HsaiJcyZCkc80rn5xkgITkgdqjLeYCoODn8aU421Y5JSkrobI53YZCee1QgrwcN
+  05Ge9PYqsIU /M/cUw5ZAQRVr3V6kPYYxAm7n1wcUEgRMU4U+v8AOgsMKWIzjkVE6kng4Hfnis
+  5PYbswZioBOHx3 FR7gz4Gdx7D2okKiJuTnoTUAbEhAPAAJwOa2i9DSUdE0xzk7y2OAeMjp9aq
+  vuZAM9QMAVYEm5Sg6 EZqAgeVgj5T3704zsmmjL3272sRHgnLDaowc1VdiR8hHP3j3xUrqC2GY
+  sSc9euO1VmYZZh8ox0NZ JXC+mpAzjaFK98Bqru2A5XGCcZxxUhy0o+7jGM9qiYbot3Bwegq52
+  SL1lZCMvzjJ+UDmoCxzkrgA 8mlYtglgctyfbFJIVXf8w3HHFZp9EJaaDfNydwPU56U1RmZstt
+  PPXvTQSFHzDI6D1p24hgGGTtNW 9CXGw1SAdg5XPJpPlDFEJPuaa20LlGPH60Fj8zgj3x2oe+r
+  G72uMbgkk5QnjFR5DjAPQ9+tBYHcx Ofl4AqM+oPPc+tW5XVzJS11K8u3e/GFU9aoyktje6g5/
+  MetWJGYI2RuGc/Sq0pVTlFJ479jVOTlG yZautf8AI5SMtKRwR6A96uIMRkvztzgVQi3ZJzkMc
+  DHarS+aCfYDGRSg76tk2cn2NGDLg46Edv4q tIWBIUFRjlj/ACrOjkOGz94A4CjGKtJlgNxIXP
+  AzTs7astrlgaSEh1O4qDyCatpuEqh2Jfb09az0 KeV3yDgjPSraksDI5Jx6U4prXoRFrYuId0o
+  BJDHOM96srgJt5z3HrVIK7Mr5AYcirEeTnuTgDAqb LdBbXcsB2aZfmO2p1yIjtOXzwB1NVeQw
+  QnA5O4jgVMpwwYn5QOtHu9LBp3JlbABCtjHPFNLfJtJy yjkAc89KGZxvAPyjHNIoOZGLBvXFV
+  G6V7jSVtCdSuxcNtcgcmn/dIUAMevFVQ5WLOFHapFLBtzDg 8E9vrWbpu92aOF47FknCphfwBp
+  4bMYf5s98/yqJPvbicANjrSNIFyAOjc0lByZMVJqyROwVlO0nr gUAKrhQ2GJyMmo8hWYtnO7j
+  3pw+djgEknjFTy9wimtCQFi/JGAccjrSgkvkfdB6VF1YAnjvz0pFP +kDdwo6Z7Vak0i5OKehI
+  h/dEcbi3GO9Skny2+XjcMYqsXCttB6HginjcioSCV7+9Z1IpPzGnqtCy WDMx3deasBsY2jO0Y
+  PvVPzE3jIyuKmhYs+Typ9qhpJik4vVFoHJ4ywPbNXkPyYbIU/mazyMNuALD 2PWrYKkDkqfQ+l
+  Obi2mNSfQvRHPygMBmrCu+/DLuAbg/1qou/goRluoNWkIWXG8EDgiiKT95jcW0 y7ESQSPvdDV
+  xQUVQysR0+maoQPjb1GRmrMbnbnJGPXmh/F5Ecr6F4Hy4Tzk9x3pUJfGSMDqMVEGx uZj6dafv
+  XaQrAgcHHWk0gu7WJsjzRtJI9qN37veu4E9aqpIN2Oq59amG5WY7sqT0rT4dRqNupYST OflJx
+  xUhZVjU4JzwKqxHI3MduTkink/u2wQcdDU/MTUWyRmZioDdjg0FyBjBJI7VArDcCM7s4p4J bB
+  bIbg1EnYNVp0LGW2bgdxxzx3pAxL9QGPXiq4O0sOeT60iFlLbs4/h9abcXqg0ZMZSIsdTjBIHF
+  DkeXGD90Dj3quzjeQVYgjpS5XYDg5B6Z6Umr6hyajzIWITjIYYNM5MjAnoRzTC5eY7SMk/Lx+V
+  Re Zg8tznJq3toilFW0JJCGIAb5hy3tVdnKMGwfmPTPanMAZHYA5LDAFQOT5uCc4PGaFq7MqPY
+  eSDnI ZQOBk1A7nkxlQMdSP1p5ZjGSRk96hZ9q/Njbjn1xTjduxKuhWcsgBK9QRjvSbgH6Ajoc
+  DvUGcqCO gPSlyhcBj3zwalvoyZJvRonZgAAThgeSPWlVgp6E88c1XEuG+ccnue9CnccqRgdhT
+  vrqwTsixE37 3kEHOeTU/mZyEA39c1TEkaz7gWz2p6kFgUYBei+tDjZ3a0CUepbA+QkMCB3xUR
+  J3krx7Z4qNiyFl PcY49aUMhUZ4yPWnDmtcLisQVLEdeMmmvnawXHHem4DHhjjPAph8wgYyfXF
+  S9VqNOMhJCSEPAzxU OSHb+HnPPSpSNpyPTjPrUEj/ACsAOeBTbVhJdENdhtTZtb+8RUO4AlSe
+  e1K4ZITk44qDqSw+4OAe tVpYdl0ZKzA5yTioy2NwyMjofam9X5yQR096iZmUsTjavAoTjazHK
+  0WrClhuwOucZHpTHD7Gw459 ulIz/ug2BuIOAOtQblRck/Nt6ZqeRPYUY3I2l+ZdpUgDP4VXMg
+  MZAUnBJBpAzCViFyOhpu/94eR0 xjFXyRWlhcq16jH24Vty4B6Adc1UkkI3JhQAe4709w/PKbB
+  3xVZ93m/Ng88E0RjHVFQ31FILxgZA 44GKrF1D/Nz1GfU1K+4jeO3FRsBtAce+aatorkyu3zDQ
+  Dx37kU0LtZiSSccc08ZUqOQDn/8AVTXO 11BGPX/ClOWtgc3JaC7gykg59qiB4yWUKRnn0pec4
+  4A6moZWG0EAYB5I6CiGl0jPmauhQY1QYPP6 VGZG344A9xTSf3TBCAcdD2pj/KQcj0OPWnNt6W
+  uNxtqROWxhsbjxnHBqnL5iySE8j+H2qVjtUt82 BkcnpVZyzEnO0gZwTUrnirrcqk3FnMoFZSM
+  nIPPsam3MqZyc5G6qyFDtByB61KSwK7fulT1Nb02p PkbFCfOXBOD1YZ+nXFXbeUmND/F/Ks1N
+  vm4PzY4AFWomKjA4IGeaThFaW1JaSdjTjZSCFHG45zzj 61MjgySDJOOlZsMrgeUFwauI24ggB
+  eOR60rSStYIxcXroaCy5QY5bp+FWklGAOQV61nAbnyCQe5q VQiyHcwI4ORRypPbUtST3NMN8h
+  JU5wM5qRJS3yMPlAwDjrVNGBJ35H49qkRwQevqvtVciT0Kv5bF osQNucZ7U9WY4I645I7mq6k
+  EAntyc08PlvMAxyciqTSexE2nsSxmQjgKTnk4qT5sNuPfp61WL/IM kkjsKkTax3fMWHbNZOLS
+  ci2tidB90BiQRkg1YVhjoMZ9KqAgAqM5wATUwRRCGLcdeKzlNaLqTKLW o/zMR53oVye3NPDNs
+  4YAbutV2UeWQAVwRtzTztb5NxY5HT+VaqXLG44vlSaHnaYiQQW3cnPFCnbJ nIJ9xTPlRDkHIy
+  eaQujfN944zgVF27dhqzW1yQyq2xM5OetOUzSOSBhe31qDzNpBMZweoxzVjcfL BQrzyBUybto
+  S5vsSA4ZiSd2fwqyPmiYAhXBqiCS+Xz6nHaplY4CgEg1EU76Cv1ZfRxsIZieRg1bj dTM2RgDu
+  azI5CJAxPy9GJHQ1c3Hy02+mC2M5ob63K5tDQibDgEH5hn6VZjI6Lwcck1RR+FUN8xGc elWVY
+  7h3GODRF2K23Reib94MOMhcgYq6shBIY8HI+tZiY3jHLY5x2qwrbiRnqauotnuKW2rLgkYf KC
+  ckdDVhjj5Mc7dwqisgG2Rh16D+dTGTc6nhvQ09biU1cs+YDtBHG3kjvThKMb9rECqxZhHy6g/T
+  ofSnBm8plbkg8epNFkDkm7ItiRWdgSMgYwO9GflxkYYVAM7gDwSckgU7cAcFx0NZKLvfcXXQlO
+  0K Q3zD245pDNu2kcHOPoKrmRQwRiXGM8HrTy2JMAqAOuacoq1maKyWo9WZXBYgnHSpeDzkjnH
+  Xiq6u zA4BJHT3pWkURnggZ5FKdrabmUtWmTl03D+Jj+mKiZsPkKykng9qg3MjoY1Zwe4/lQST
+  FvOd3YZp xSTsy2rInQZJzjI6c1FvVAey+4/Wog5zvORk460oCnJORgc+/NUopJpkKbUrsVpAE
+  65weTUb8kk4 B64PWlDYBPBXd0qu7MA2GXI6Aj9KlRUmXFtrQC7MeCMY4pCcsSQ3A7UbiAASOn
+  YUxuFBJ4H605WS CU76XGNjgYO3tUeflyGUYPzE9qCQyEbu361BuInA5IAzz3qqabjdFNN2J8/
+  KOdx7VIoB+YEe1VlI LKd2MHjPepuTu4ycZPNQp3eo5/DclHI5OR1z/SnoQuGGNpORVeMHAJwC
+  vT2pzMwj3ZJx6Cq5r3I2 67lnfucjIzjOD3pPMbLJ8u/OR/hUO5XjQ888/WlDK7Es2DnPPYYo0
+  S1JSTeqJTy69jjioSSzHk4z g4pxfMTHjp8opm44APB6kd6Oa6uO3RBIQGGM4Ax1qBypJy4Az0
+  70rP8AJ1yQ3PtUZfJwAMepHein a9hra41i+0Asufeo9xMJXIUDBzimtJkAnp1J9aY7Mq4JB7c
+  d6bTfQGlLqIznLZ7ntwTUDOC3cknI 9qldm8oAKC3fFVVYb2JIyetSo21auIWORTKQWzkHmoWw
+  ASGzx1NTOyiM44B6MB0qoVAlJzv+Xrmq VrdhOXYQsHQ4wr+lQH5lY5A5HSib5ckZBGDTVfgsS
+  o6np1qpNdCYySdrETAFT83IPrVZidzNkHtj FTtIARhSQc81A58uMOgJJ4ORRdtFvfyItwYspB
+  OB2prL/o4LHljnGeKU4YnjBx9KgYqI+pLA560J pNJEtdEDsfl5AGaRtvmMfmPI6GmuS6rgZwc
+  emTSrw4O5cE/NmrltZEpaNtjQ5MZPJB7Y5qFlxGzI cHuD3pWYtKcDJPSq7FgwQsGIB6Ci2uhX
+  PZWHO+bfI4yO45FRO2QQx4OMmnsy8YOFPXNRMwwU424y OKm7a02Jb6WK7kqzBsHBwM96rvgxb
+  jnrxUhO6Rh94YBzmqUhbywp+bk4Naq0ZJX1Hfn0OaVmBw2O OelSCUNtKHcvIqrHiQ78nKnnnr
+  VxDhfkwPTIpKKb5uoc0bNrqTq+VYDO4kfjVrBJzzjg7qrKSrkM ue4x2qwjbshc4PJJ9aG1cSl
+  ZbFtWCyEg5weoqyGBjHXLHNUlZFBAYccEVZRiHxjgD07VD91Dbk1c vrgOBndyCMVZYgMB1GDt
+  OKpoTgBCCMfL/jVgblxlgSDyxHFCfVCk3uWkYr8p5JGcjoanJwPTjnmq qEgKQRycCnqxySxUj
+  2FUtWJa6l778RAYcenehThixIK5waqKQV3Ipz9aCxymDjHUUkpWZcWnp0L2 7AZGxjtx1oBHlk
+  LgHpzVXeTtZ+BgYAp4kB+bgc85ocJLYOVK6SLqkbwrNyVxxSkjYOcDIyKqiQ7g WxwMcDvS7+j
+  jle4qfZtvUtKz3LIYgkHLAHpUuWRC4AA3DHvVQElcHC89TR5hGd2WA5FW7WaQra/o WncswLDA
+  waiB+fPPHpQZAzEHAGR/+qotxwAMH09qhb6ExbtZqxM8hwzbScfrSJJ1G5Rxx7VXL/Ju H5e1K
+  N4fGzI7nFTy2+I2SsXQxfcSdw3DO2pEdhls/TFU1fYjKDwx9KsIxchPup9OtTNSvqZKbitC 5F
+  Io2jgluevFXRKTIEJwO2Ky4yAcKQVBJJx0qzC28lyDg5/Cl7jfMLmcmaQbCb8jhueeatLIzHrw
+  elZqksSCpVeM81ZSQKMD5gXz9KSSvoyoq2xphwp8wn5c4wOoqZWbPDDJ5OOlZccn77BG5Tzx7V
+  dV wMEcZGTU8/Ky57abl9GUjG7d7elPWTqvJJ6Gs9HbqBxg4zU0LuwUEEgLkt6GtL2V2yaitZp
+  F4N9z JJyccVMCobnkY79RVIvhVPTj73anKxKgnJ5GeetO8rXuKMVqjQV/lPzDJqMygwg7SWHB
+  qMSKof5c 5OMelJhd+7kDvRdaihZbkhZty52gZ9Ke0gyeRjFQAOJSeo4xn0ppYYAP0pWTVjRS1
+  0LBmIfCHHAJ JoeXEhLdevHvVbdjnHQflSblKN1YD35NDjGJPLbct7yqqPfJpTKM4PUHt3quGV
+  iOchvSmJgH7rHa MHmp5Y31E9XqtiXeS5JXqeMUrKzSAbdox92oXZnU+x4pu5mdxnGDketXEpw
+  2bH7nLjO3AFNdSpPB L9aYWGGJPWo5pG2BOcj86Uua+hV76iuRvBz0HamBizNwRt9+tBx8rbXA
+  2VGwKsPmOxuQauLurDbW 0RJCBIpz82OcUAEHhgVNMBO4MT14z6VG2clFDDkEZqeS79A5+ZrXY
+  mfgLjv+lSEEREr8pz371CCu SGBwB0qMj90x5GW4PahxStYlSu73LasScMw47Cl8zJTuuccGqw
+  bDh8hmyQRinq6iNhkKO+exqGnb QN3ZFkkLEMck9famkgEvkF81XD8rn1/KpGkVkJKkDuaTi1o
+  Db2JCB5YGTu6ioncHaeQT1/wpuT5K tzwcnJqMOzBtykKTnPvVJcruhRl+A5mC8DJz3pm9lG11
+  IZumaU4AJYhR1x3qJ2BbeMgD5sH071Sd 9LCnNRFYKVCg9Bgiq7MFlIc4HT6Uu9ch+vHTvUBYt
+  IzldyZArWF0rkpNK4M5KEg9DnH0qENmDpli Tx60skp35UYUcEe1RO4weOMYX1qJPsK1la2orE
+  BNmd2R3/hqvwAVB4xkihpBkDn0YUw4ZGyMccYq oRvuNq71GHexJHzY9aiJf5m4PTIpzMyOCAW
+  Ug/yqPK+WE2NnBwc0QulsU7Kz6EW0+SwLZ9R+NRs3 y4ZsnPBFOH3/AJQRxyDURwM78Ar2pv3m
+  J2bI3I3MAQA3vyKiLHJC8sODTz87EEHnmo1IBw3IzQ2k tR8sVqwHACBucc+1Rs23O0n3zTcru
+  Y5O4DkZpnmbc56+9K2l0Q5/IduZW+XHGSeKruQWDZySOR6V MMKBkj3NVzlpCSyZI+UAdKFbuV
+  HRa7jG27cLxnrk1CThWHJwOQKkcbtuMFfb3qu0qguFU5HynFXL
+  l5dTOd1qxgYfaS4U4KY4NUJA23byzdMDrVl2D2+5c9gT71Rk++cB85yMmiEXF2Jb5ndH/9k=
+UID:934731C6-1C95-4C40-BE1F-FA4215B2307B
+END:VCARD

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/AFBB77B8-0438-4825-A1DB-A75D76B6C3A8.vcf
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/AFBB77B8-0438-4825-A1DB-A75D76B6C3A8.vcf	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/AFBB77B8-0438-4825-A1DB-A75D76B6C3A8.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,25 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:Here;Custom;Fields;All;
-FN:All Custom Fields Here
-NICKNAME:custome
-ORG:Major League Co.;Macosx server group
-TITLE:QA Engineer
-EMAIL;type=INTERNET;type=WORK;type=pref:custom at example.com
-TEL;type=WORK;type=pref:777-777-7777
-TEL;type=CELL:8888888888
-item1.ADR;type=WORK;type=pref:;;1 Goroku St.;Mountain Top;CA;99999;USA
-item1.X-ABADR:us
-NOTE: Many customer fields are added
-item2.URL;type=pref:http://www.example.com/~magic
-item2.X-ABLabel:_$!<HomePage>!$_
-BDAY;value=date:1999-03-18
-X-AIM;type=WORK;type=pref:custom at example.com
-item3.X-ABDATE;type=pref:1995-05-21
-item3.X-ABLabel:_$!<Anniversary>!$_
-item4.X-ABRELATEDNAMES;type=pref:Aho Sak
-item4.X-ABLabel:_$!<Friend>!$_
-item5.X-ABRELATEDNAMES:Sanma
-item5.X-ABLabel:_$!<Assistant>!$_
-UID:AFBB77B8-0438-4825-A1DB-A75D76B6C3A8
-END:VCARD

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/AFBB77B8-0438-4825-A1DB-A75D76B6C3A8.vcf (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/AFBB77B8-0438-4825-A1DB-A75D76B6C3A8.vcf)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/AFBB77B8-0438-4825-A1DB-A75D76B6C3A8.vcf	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/AFBB77B8-0438-4825-A1DB-A75D76B6C3A8.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,25 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Here;Custom;Fields;All;
+FN:All Custom Fields Here
+NICKNAME:custome
+ORG:Major League Co.;Macosx server group
+TITLE:QA Engineer
+EMAIL;type=INTERNET;type=WORK;type=pref:custom at example.com
+TEL;type=WORK;type=pref:777-777-7777
+TEL;type=CELL:8888888888
+item1.ADR;type=WORK;type=pref:;;1 Goroku St.;Mountain Top;CA;99999;USA
+item1.X-ABADR:us
+NOTE: Many customer fields are added
+item2.URL;type=pref:http://www.example.com/~magic
+item2.X-ABLabel:_$!<HomePage>!$_
+BDAY;value=date:1999-03-18
+X-AIM;type=WORK;type=pref:custom at example.com
+item3.X-ABDATE;type=pref:1995-05-21
+item3.X-ABLabel:_$!<Anniversary>!$_
+item4.X-ABRELATEDNAMES;type=pref:Aho Sak
+item4.X-ABLabel:_$!<Friend>!$_
+item5.X-ABRELATEDNAMES:Sanma
+item5.X-ABLabel:_$!<Assistant>!$_
+UID:AFBB77B8-0438-4825-A1DB-A75D76B6C3A8
+END:VCARD

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1.vcf
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1.vcf	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,11 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:Thompson;Default;;;
-FN:Default Thompson
-EMAIL;type=INTERNET;type=WORK;type=pref:lthompson at example.com
-TEL;type=WORK;type=pref:1-555-555-5555
-TEL;type=CELL:1-444-444-4444
-item1.ADR;type=WORK;type=pref:;;1245 Test;Sesame Street;California;11111;USA
-item1.X-ABADR:us
-UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1
-END:VCARD

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1.vcf (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1.vcf)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1.vcf	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,11 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Thompson;Default;;;
+FN:Default Thompson
+EMAIL;type=INTERNET;type=WORK;type=pref:lthompson at example.com
+TEL;type=WORK;type=pref:1-555-555-5555
+TEL;type=CELL:1-444-444-4444
+item1.ADR;type=WORK;type=pref:;;1245 Test;Sesame Street;California;11111;USA
+item1.X-ABADR:us
+UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1
+END:VCARD

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E2.vcf
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E2.vcf	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E2.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,17 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:Contact;Mulberry;;;
-FN:Mulberry Contact
-NICKNAME:mulberry
-ORG:Apple Inc.;
-EMAIL;type=INTERNET;type=WORK;type=pref:mulberry at example.com
-TEL;type=HOME;type=pref:777-777-7777
-TEL;type=WORK:8888888888
-TEL;type=WORK;type=FAX:5555555555
-item1.ADR;type=WORK;type=pref:;;1234 Infinite Circle;Exampletino\, CA 99999;USA;;
-item1.X-ABADR:us
-NOTE:This is a contact created in Mulberry.
-item2.URL;type=pref:http://www.example.com/~magic
-item2.X-ABLabel:_$!<HomePage>!$_
-UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E2
-END:VCARD

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E2.vcf (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E2.vcf)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E2.vcf	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E2.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,17 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Contact;Mulberry;;;
+FN:Mulberry Contact
+NICKNAME:mulberry
+ORG:Apple Inc.;
+EMAIL;type=INTERNET;type=WORK;type=pref:mulberry at example.com
+TEL;type=HOME;type=pref:777-777-7777
+TEL;type=WORK:8888888888
+TEL;type=WORK;type=FAX:5555555555
+item1.ADR;type=WORK;type=pref:;;1234 Infinite Circle;Exampletino\, CA 99999;USA;;
+item1.X-ABADR:us
+NOTE:This is a contact created in Mulberry.
+item2.URL;type=pref:http://www.example.com/~magic
+item2.X-ABLabel:_$!<HomePage>!$_
+UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E2
+END:VCARD

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/F0A6918D-8E09-43FA-9684-226810B8A96F.vcf
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/F0A6918D-8E09-43FA-9684-226810B8A96F.vcf	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/F0A6918D-8E09-43FA-9684-226810B8A96F.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,2010 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:Inc.;Test;;;
-FN:Test Inc.
-ORG:Test Inc.;
-EMAIL;type=INTERNET;type=WORK;type=pref:testinc_sf at example.com
-TEL;type=WORK;type=pref:777-777-7777
-item1.ADR;type=WORK;type=pref:;;3 TV Street;San Francisco;California;99999;US
-item1.X-ABADR:us
-NOTE: Company with picture
-PHOTO;BASE64:
-  /9j/4AAQSkZJRgABAQAAAQABAAD/7QA8UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAB8cAVoAAx
-  sl RxwCAAACAAIcAhkAC1Bob3RvIEJvb3RoAP/iG6hJQ0NfUFJPRklMRQABAQAAG5hhcHBsAgA
-  AAG1u dHJSR0IgWFlaIAfaAAEAEwAJADEABGFjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-  AAAAAAD2 1gABAAAAANMtYXBwbFYcEOZVYuhIRg5LwLIi62wAAAAAAAAAAAAAAAAAAAAAAAAAA
-  AAAAAAAAAAA AAAAEXJYWVoAAAFQAAAAFGdYWVoAAAFkAAAAFGJYWVoAAAF4AAAAFHd0cHQAAA
-  GMAAAAFGNoYWQA AAGgAAAALHJUUkMAAAHMAAAIDGdUUkMAAAnYAAAIDGJUUkMAABHkAAAIDGF
-  hcmcAABnwAAAAIGFh Z2cAABoQAAAAIGFhYmcAABowAAAAIHZjZ3QAABpQAAAAMG5kaW4AABqA
-  AAAAOGRlc2MAABq4AAAA ZGRzY20AABscAAAALm1tb2QAABtMAAAAKGNwcnQAABt0AAAAJFhZW
-  iAAAAAAAAB7vQAAQXsAAAJL WFlaIAAAAAAAAFYqAACp0AAAFF9YWVogAAAAAAAAJO8AABS1AA
-  C8glhZWiAAAAAAAADz2AABAAAA ARYIc2YzMgAAAAAAAQu3AAAFlv//81cAAAcpAAD91///+7f
-  ///2mAAAD2gAAwPZjdXJ2AAAAAAAA BAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUA
-  SgBPAFQAWQBeAGMAaABtAHIAdwB8AIEA hgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0
-  ADVANoA4ADlAOoA8AD1APsBAQEHAQwBEgEY AR4BJQErATEBOAE+AUUBSwFSAVkBYAFmAW0BdQ
-  F8AYMBigGSAZkBoQGoAbABuAHAAcgB0AHYAeAB 6QHxAfoCAgILAhQCHAIlAi4CNwJAAkoCUwJ
-  cAmYCcAJ5AoMCjQKXAqECqwK1Ar8CygLUAt8C6gL0 Av8DCgMVAyADKwM3A0IDTQNZA2UDcAN8
-  A4gDlAOgA6wDuQPFA9ID3gPrA/gEBAQRBB4ELAQ5BEYE VARhBG8EfASKBJgEpgS0BMIE0QTfB
-  O4E/AULBRoFKAU3BUcFVgVlBXQFhAWTBaMFswXDBdMF4wXz BgMGFAYkBjUGRQZWBmcGeAaJBp
-  oGqwa9Bs4G4AbyBwMHFQcnBzkHTAdeB3AHgweWB6gHuwfOB+EH 9AgICBsILwhCCFYIagh+CJI
-  Ipgi6CM4I4wj3CQwJIQk2CUsJYAl1CYoJoAm1CcsJ4An2CgwKIgo5 Ck8KZQp8CpIKqQrACtcK
-  7gsFCx0LNAtLC2MLewuTC6sLwwvbC/MMDAwkDD0MVgxuDIcMoQy6DNMM 7Q0GDSANOg1UDW4Ni
-  A2iDbwN1w3xDgwOJw5CDl0OeA6TDq8Oyg7mDwIPHg86D1YPcg+OD6sPyA/k EAEQHhA7EFgQdh
-  CTELEQzhDsEQoRKBFGEWQRgxGhEcAR3xH+Eh0SPBJbEnoSmhK5EtkS+RMZEzkT WRN6E5oTuxP
-  bE/wUHRQ+FF8UgRSiFMQU5RUHFSkVSxVtFZAVshXVFfcWGhY9FmAWgxanFsoW7hcS FzUXWRd9
-  F6IXxhfqGA8YNBhZGH0YoxjIGO0ZExk4GV4ZhBmqGdAZ9hodGkMaahqQGrca3hsGGy0b VBt8G
-  6MbyxvzHBscQxxsHJQcvRzmHQ4dNx1gHYodsx3dHgYeMB5aHoQerh7YHwMfLR9YH4Mfrh/Z IA
-  QgMCBbIIcgsyDeIQohNyFjIY8hvCHpIhUiQiJwIp0iyiL4IyUjUyOBI68j3SQMJDokaSSXJMYk
-  9SUkJVQlgyWzJeImEiZCJnImoybTJwMnNCdlJ5Ynxyf4KCooWyiNKL4o8CkiKVUphym5KewqHy
-  pS KoUquCrrKx4rUiuGK7or7iwiLFYsiiy/LPQtKS1eLZMtyC39LjMuaS6eLtQvCy9BL3cvri/
-  kMBsw UjCJMMEw+DEwMWcxnzHXMg8ySDKAMrgy8TMqM2MznDPVNA80SDSCNLw09jUwNWo1pTXf
-  Nho2VTaQ Nss3BjdCN343uTf1ODE4bTiqOOY5IzlgOZ052joXOlQ6kjrPOw07SzuJO8c8BjxEP
-  IM8wj0BPUA9 fz2/Pf4+Pj5+Pr4+/j8/P38/wEAAQEFAgkDEQQVBR0GIQcpCDEJOQpFC00MWQ1
-  hDm0PeRCFEZUSo ROxFMEV0RbhF/EZARoVGykcOR1NHmUfeSCNIaUivSPVJO0mBScdKDkpVSpt
-  K4ksqS3FLuEwATEhM kEzYTSBNaE2xTfpOQk6MTtVPHk9nT7FP+1BFUI9Q2VEkUW5RuVIEUk9S
-  mlLlUzFTfFPIVBRUYFSt VPlVRlWSVd9WLFZ6VsdXFFdiV7BX/lhMWJpY6Vk4WYZZ1VokWnRaw
-  1sTW2NbslwDXFNco1z0XURd lV3mXjdeiV7aXyxffl/QYCJgdGDHYRlhbGG/YhJiZWK5YwxjYG
-  O0ZAhkXGSxZQVlWmWvZgRmWWav ZwRnWmewaAZoXGiyaQlpX2m2ag1qZGq8axNra2vDbBtsc2z
-  LbSNtfG3Vbi5uh27gbzpvk2/tcEdw oXD7cVZxsHILcmZywXMcc3hz03QvdIt053VDdaB1/HZZ
-  drZ3E3dwd854K3iJeOd5RXmjegJ6YHq/ ex57fXvcfDx8m3z7fVt9u34bfnx+3H89f55//4Bgg
-  MKBI4GFgeeCSYKrgw6DcIPThDaEmYT8hWCF w4YnhouG74dUh7iIHYiBiOaJTImxihaKfIrii0
-  iLrowUjHuM4o1Ija+OF45+juWPTY+1kB2QhZDu kVaRv5IokpGS+pNkk82UN5ShlQuVdZXglkq
-  WtZcgl4uX95himM6ZOpmmmhKafprrm1ebxJwxnJ+d DJ15neeeVZ7DnzGfoKAPoH2g7KFbocui
-  OqKqoxqjiqP6pGqk26VMpbymLqafpxCngqf0qGWo2KlK qbyqL6qiqxWriKv7rG+s461WrcuuP
-  66zryivnbARsIew/LFxseeyXbLTs0mzv7Q2tK21JLWbthK2 ibcBt3m38bhpuOG5WrnSuku6xL
-  s+u7e8MLyqvSS9nr4ZvpO/Dr+JwATAf8D6wXbB8cJtwunDZsPi xF/E3MVZxdbGU8bRx07HzMh
-  KyMnJR8nGykXKxMtDy8LMQszBzUHNwc5CzsLPQ8/D0ETQxtFH0cjS StLM007T0NRT1NbVWNXb
-  1l7W4tdl1+nYbdjx2XXZ+tp/2wPbiNwO3JPdGd2e3iTeqt8x37fgPuDF 4Uzh0+Ja4uLjauPy5
-  HrlAuWL5hPmnOcl56/oOOjC6Uzp1upg6urrdev/7IrtFu2h7izuuO9E79Dw XPDp8XXyAvKP8x
-  zzqvQ39MX1U/Xh9m/2/veM+Bv4qvk5+cn6Wfro+3j8CPyZ/Sn9uv5L/tz/bmN1 cnYAAAAAAAA
-  EAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0A cgB3AHwA
-  gQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2gDgAOUA6gDwAPUA+wEB AQcBD
-  AESARgBHgElASsBMQE4AT4BRQFLAVIBWQFgAWYBbQF1AXwBgwGKAZIBmQGhAagBsAG4AcAB yA
-  HQAdgB4AHpAfEB+gICAgsCFAIcAiUCLgI3AkACSgJTAlwCZgJwAnkCgwKNApcCoQKrArUCvwLK
-  AtQC3wLqAvQC/wMKAxUDIAMrAzcDQgNNA1kDZQNwA3wDiAOUA6ADrAO5A8UD0gPeA+sD+AQEBB
-  EE HgQsBDkERgRUBGEEbwR8BIoEmASmBLQEwgTRBN8E7gT8BQsFGgUoBTcFRwVWBWUFdAWEBZM
-  FowWz BcMF0wXjBfMGAwYUBiQGNQZFBlYGZwZ4BokGmgarBr0GzgbgBvIHAwcVBycHOQdMB14H
-  cAeDB5YH qAe7B84H4Qf0CAgIGwgvCEIIVghqCH4IkgimCLoIzgjjCPcJDAkhCTYJSwlgCXUJi
-  gmgCbUJywng CfYKDAoiCjkKTwplCnwKkgqpCsAK1wruCwULHQs0C0sLYwt7C5MLqwvDC9sL8w
-  wMDCQMPQxWDG4M hwyhDLoM0wztDQYNIA06DVQNbg2IDaINvA3XDfEODA4nDkIOXQ54DpMOrw7
-  KDuYPAg8eDzoPVg9y D44Pqw/ID+QQARAeEDsQWBB2EJMQsRDOEOwRChEoEUYRZBGDEaERwBHf
-  Ef4SHRI8ElsSehKaErkS 2RL5ExkTORNZE3oTmhO7E9sT/BQdFD4UXxSBFKIUxBTlFQcVKRVLF
-  W0VkBWyFdUV9xYaFj0WYBaD FqcWyhbuFxIXNRdZF30XohfGF+oYDxg0GFkYfRijGMgY7RkTGT
-  gZXhmEGaoZ0Bn2Gh0aQxpqGpAa txreGwYbLRtUG3wboxvLG/McGxxDHGwclBy9HOYdDh03HWA
-  dih2zHd0eBh4wHloehB6uHtgfAx8t H1gfgx+uH9kgBCAwIFsghyCzIN4hCiE3IWMhjyG8Ieki
-  FSJCInAinSLKIvgjJSNTI4EjryPdJAwk OiRpJJckxiT1JSQlVCWDJbMl4iYSJkImciajJtMnA
-  yc0J2UnlifHJ/goKihbKI0ovijwKSIpVSmH Kbkp7CofKlIqhSq4KusrHitSK4YruivuLCIsVi
-  yKLL8s9C0pLV4tky3ILf0uMy5pLp4u1C8LL0Ev dy+uL+QwGzBSMIkwwTD4MTAxZzGfMdcyDzJ
-  IMoAyuDLxMyozYzOcM9U0DzRINII0vDT2NTA1ajWl Nd82GjZVNpA2yzcGN0I3fje5N/U4MTht
-  OKo45jkjOWA5nTnaOhc6VDqSOs87DTtLO4k7xzwGPEQ8 gzzCPQE9QD1/Pb89/j4+Pn4+vj7+P
-  z8/fz/AQABAQUCCQMRBBUFHQYhBykIMQk5CkULTQxZDWEOb Q95EIURlRKhE7EUwRXRFuEX8Rk
-  BGhUbKRw5HU0eZR95II0hpSK9I9Uk7SYFJx0oOSlVKm0riSypL cUu4TABMSEyQTNhNIE1oTbF
-  N+k5CToxO1U8eT2dPsU/7UEVQj1DZUSRRblG5UgRST1KaUuVTMVN8 U8hUFFRgVK1U+VVGVZJV
-  31YsVnpWx1cUV2JXsFf+WExYmljpWThZhlnVWiRadFrDWxNbY1uyXANc U1yjXPRdRF2VXeZeN
-  16JXtpfLF9+X9BgImB0YMdhGWFsYb9iEmJlYrljDGNgY7RkCGRcZLFlBWVa Za9mBGZZZq9nBG
-  daZ7BoBmhcaLJpCWlfabZqDWpkarxrE2tra8NsG2xzbMttI218bdVuLm6HbuBv Om+Tb+1wR3C
-  hcPtxVnGwcgtyZnLBcxxzeHPTdC90i3TndUN1oHX8dll2tncTd3B3zngreIl453lF eaN6Anpg
-  er97Hnt9e9x8PHybfPt9W327fht+fH7cfz1/nn//gGCAwoEjgYWB54JJgquDDoNwg9OE NoSZh
-  PyFYIXDhieGi4bvh1SHuIgdiIGI5olMibGKFop8iuKLSIuujBSMe4zijUiNr44Xjn6O5Y9N j7
-  WQHZCFkO6RVpG/kiiSkZL6k2STzZQ3lKGVC5V1leCWSpa1lyCXi5f3mGKYzpk6maaaEpp+muub
-  V5vEnDGcn50MnXmd555VnsOfMZ+goA+gfaDsoVuhy6I6oqqjGqOKo/qkaqTbpUylvKYupp+nEK
-  eC p/SoZajYqUqpvKovqqKrFauIq/usb6zjrVaty64/rrOvKK+dsBGwh7D8sXGx57JdstOzSbO
-  /tDa0 rbUktZu2EraJtwG3ebfxuGm44blaudK6S7rEuz67t7wwvKq9JL2evhm+k78Ov4nABMB/
-  wPrBdsHx wm3C6cNmw+LEX8TcxVnF1sZTxtHHTsfMyErIyclHycbKRcrEy0PLwsxCzMHNQc3Bz
-  kLOws9Dz8PQ RNDG0UfRyNJK0szTTtPQ1FPU1tVY1dvWXtbi12XX6dht2PHZddn62n/bA9uI3A
-  7ck90Z3Z7eJN6q 3zHft+A+4MXhTOHT4lri4uNq4/LkeuUC5YvmE+ac5yXnr+g46MLpTOnW6mD
-  q6ut16//siu0W7aHu LO6470Tv0PBc8OnxdfIC8o/zHPOq9Df0xfVT9eH2b/b+94z4G/iq+Tn5
-  yfpZ+uj7ePwI/Jn9Kf26 /kv+3P9uY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AM
-  gA3ADsAQABFAEoATwBUAFkA XgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtw
-  C8AMEAxgDLANAA1QDaAOAA5QDq APAA9QD7AQEBBwEMARIBGAEeASUBKwExATgBPgFFAUsBUgF
-  ZAWABZgFtAXUBfAGDAYoBkgGZAaEB qAGwAbgBwAHIAdAB2AHgAekB8QH6AgICCwIUAhwCJQIu
-  AjcCQAJKAlMCXAJmAnACeQKDAo0ClwKh AqsCtQK/AsoC1ALfAuoC9AL/AwoDFQMgAysDNwNCA
-  00DWQNlA3ADfAOIA5QDoAOsA7kDxQPSA94D 6wP4BAQEEQQeBCwEOQRGBFQEYQRvBHwEigSYBK
-  YEtATCBNEE3wTuBPwFCwUaBSgFNwVHBVYFZQV0 BYQFkwWjBbMFwwXTBeMF8wYDBhQGJAY1BkU
-  GVgZnBngGiQaaBqsGvQbOBuAG8gcDBxUHJwc5B0wH XgdwB4MHlgeoB7sHzgfhB/QICAgbCC8I
-  QghWCGoIfgiSCKYIugjOCOMI9wkMCSEJNglLCWAJdQmK CaAJtQnLCeAJ9goMCiIKOQpPCmUKf
-  AqSCqkKwArXCu4LBQsdCzQLSwtjC3sLkwurC8ML2wvzDAwM JAw9DFYMbgyHDKEMugzTDO0NBg
-  0gDToNVA1uDYgNog28DdcN8Q4MDicOQg5dDngOkw6vDsoO5g8C Dx4POg9WD3IPjg+rD8gP5BA
-  BEB4QOxBYEHYQkxCxEM4Q7BEKESgRRhFkEYMRoRHAEd8R/hIdEjwS WxJ6EpoSuRLZEvkTGRM5
-  E1kTehOaE7sT2xP8FB0UPhRfFIEUohTEFOUVBxUpFUsVbRWQFbIV1RX3 FhoWPRZgFoMWpxbKF
-  u4XEhc1F1kXfReiF8YX6hgPGDQYWRh9GKMYyBjtGRMZOBleGYQZqhnQGfYa HRpDGmoakBq3Gt
-  4bBhstG1QbfBujG8sb8xwbHEMcbByUHL0c5h0OHTcdYB2KHbMd3R4GHjAeWh6E Hq4e2B8DHy0
-  fWB+DH64f2SAEIDAgWyCHILMg3iEKITchYyGPIbwh6SIVIkIicCKdIsoi+CMlI1Mj gSOvI90k
-  DCQ6JGkklyTGJPUlJCVUJYMlsyXiJhImQiZyJqMm0ycDJzQnZSeWJ8cn+CgqKFsojSi+ KPApI
-  ilVKYcpuSnsKh8qUiqFKrgq6yseK1Irhiu6K+4sIixWLIosvyz0LSktXi2TLcgt/S4zLmku ni
-  7ULwsvQS93L64v5DAbMFIwiTDBMPgxMDFnMZ8x1zIPMkgygDK4MvEzKjNjM5wz1TQPNEg0gjS8
-  NPY1MDVqNaU13zYaNlU2kDbLNwY3Qjd+N7k39TgxOG04qjjmOSM5YDmdOdo6FzpUOpI6zzsNO0
-  s7 iTvHPAY8RDyDPMI9AT1APX89vz3+Pj4+fj6+Pv4/Pz9/P8BAAEBBQIJAxEEFQUdBiEHKQgx
-  CTkKR QtNDFkNYQ5tD3kQhRGVEqETsRTBFdEW4RfxGQEaFRspHDkdTR5lH3kgjSGlIr0j1STtJ
-  gUnHSg5K VUqbSuJLKktxS7hMAExITJBM2E0gTWhNsU36TkJOjE7VTx5PZ0+xT/tQRVCPUNlRJ
-  FFuUblSBFJP UppS5VMxU3xTyFQUVGBUrVT5VUZVklXfVixWelbHVxRXYlewV/5YTFiaWOlZOF
-  mGWdVaJFp0WsNb E1tjW7JcA1xTXKNc9F1EXZVd5l43Xole2l8sX35f0GAiYHRgx2EZYWxhv2I
-  SYmViuWMMY2BjtGQI ZFxksWUFZVplr2YEZllmr2cEZ1pnsGgGaFxosmkJaV9ptmoNamRqvGsT
-  a2trw2wbbHNsy20jbXxt 1W4ubodu4G86b5Nv7XBHcKFw+3FWcbByC3JmcsFzHHN4c9N0L3SLd
-  Od1Q3Wgdfx2WXa2dxN3cHfO eCt4iXjneUV5o3oCemB6v3see3173Hw8fJt8+31bfbt+G358ft
-  x/PX+ef/+AYIDCgSOBhYHngkmC q4MOg3CD04Q2hJmE/IVghcOGJ4aLhu+HVIe4iB2IgYjmiUy
-  JsYoWinyK4otIi66MFIx7jOKNSI2v jheOfo7lj02PtZAdkIWQ7pFWkb+SKJKRkvqTZJPNlDeU
-  oZULlXWV4JZKlrWXIJeLl/eYYpjOmTqZ ppoSmn6a65tXm8ScMZyfnQydeZ3nnlWew58xn6CgD
-  6B9oOyhW6HLojqiqqMao4qj+qRqpNulTKW8 pi6mn6cQp4Kn9KhlqNipSqm8qi+qoqsVq4ir+6
-  xvrOOtVq3Lrj+us68or52wEbCHsPyxcbHnsl2y 07NJs7+0NrSttSS1m7YStom3Abd5t/G4abj
-  huVq50rpLusS7Pru3vDC8qr0kvZ6+Gb6Tvw6/icAE wH/A+sF2wfHCbcLpw2bD4sRfxNzFWcXW
-  xlPG0cdOx8zISsjJyUfJxspFysTLQ8vCzELMwc1BzcHO Qs7Cz0PPw9BE0MbRR9HI0krSzNNO0
-  9DUU9TW1VjV29Ze1uLXZdfp2G3Y8dl12fraf9sD24jcDtyT 3Rndnt4k3qrfMd+34D7gxeFM4d
-  PiWuLi42rj8uR65QLli+YT5pznJeev6DjowulM6dbqYOrq63Xr /+yK7Rbtoe4s7rjvRO/Q8Fz
-  w6fF18gLyj/Mc86r0N/TF9VP14fZv9v73jPgb+Kr5OfnJ+ln66Pt4 /Aj8mf0p/br+S/7c/25w
-  YXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAALA3BhcmEAAAAAAAMA AAACZmYAAPKnAAANW
-  QAAE9AAAAsDcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACwN2Y2d0 AAAAAAAAAAEAAQ
-  AAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAAAAAABAABuZGluAAAAAAAAADAA AKPAAABXwAA
-  ASsAAAJ5AAAAlQAAAEwAAAFBAAABUQAACMzMAAjMzAAIzM2Rlc2MAAAAAAAAACkNp bmVtYSBI
-  RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAA
-  AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAc AE
-  MAaQBuAGUAbQBhACAASABEAABtbW9kAAAAAAAABhAAAJIjAgAqqcBCT4AAAAAAAAAAAAAAAAAA
-  AAAAdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUsIEluYy4sIDIwMTAA/+EAQEV4aWYAAE1NACoAAA
-  AI AAGHaQAEAAAAAQAAABoAAAAAAAKgAgAEAAAAAQAAAoCgAwAEAAAAAQAAAeAAAAAA/9sAQwA
-  CAgIC AgECAgICAgICAwMGBAMDAwMHBQUEBggHCAgIBwgICQoNCwkJDAoICAsPCwwNDg4ODgkL
-  EBEPDhEN Dg4O/9sAQwECAgIDAwMGBAQGDgkICQ4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OD
-  g4ODg4ODg4O Dg4ODg4ODg4ODg4ODg4O/8AAEQgB4AKAAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQ
-  EBAAAAAAAAAAAB AgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhN
-  RYQcicRQygZGhCCNC scEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RV
-  VldYWVpjZGVmZ2hpanN0 dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4u
-  brCw8TFxsfIycrS09TV1tfY 2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQ
-  EAAAAAAAABAgMEBQYHCAkKC//E ALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXE
-  TIjKBCBRCkaGxwQkjM1LwFWJy0QoW JDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZX
-  WFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5u
-  sLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp 6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/Ie6uZ
-  LZoIYXSSFWZhjkgn1NZS7Y4I4yQS5woHUnP+Na MsLq7qIXfaMN22nrTWmbzIWeOMzBmckLxk+
-  gr8+hZLRH9Z18KqM3KhBK/wB339SvFbQrNGluD50T ESbj96QHjHHT29qeG3hT5bIQ/QnoQc5+
-  lLayrFJuBUqSWb1PsD606OJriMIiFwpLZA6nv9aqTd9T PDQlBuNlyteX5l3yTvExmWMFjGjbS
-  wORknionheOeFHDNHHGVyvBIPpke9SWrJJp7XJjdCj7QrHI DdTx79qhfe8yF43TswJ556CsVe
-  7TOujOMk5T1b2a0/4P4knkhYYpX+WM5wpPLDtiro+S2AEqMpcP tJ5OOPTjipZGtBYxwLcKzxK
-  FZjkhjnkj0A6VXnaFEa3KjeAfmLHll5OPwrJSctzahOM1zTXlr26f 0hk8iCYCVGcRqVBU4ySe
-  vTp2pYrkRWwhijf/AFo+Y/wDqc+vNVgPtE8QY5LMNuOy46/gakjAdfOa VDGSRu7buw/OrcY2s
-  zOc6DlyzfL2/r/gFuaWzkib93I85kZyScDnv+lRbBFYi6iuVE44ZCvKhuo+ tU3SYNC/lERwhV
-  nXbycnOKfI5iu1yI2Z3JAK5XCn0pKFtEzCbpxg47rzas/LYfbWtotvHbxyOpLk M3ufT8KhY2q
-  zpGqzOrEklTyxHA7dKgaaJpt5+RnLeWoHOewq8lqy6bFNNxuAxn+PP8Q9hVyvF+89 yeWMZKHM
-  9dkun43IzEtveq8b5IXdDIP4hjmlDKvlvETvRQoOPXmmTpDC6qsglOSAy5wABn9al8pX 2BiI/
-  l3Kw/rS0aTZ2wjGcWra9dOnn1J2kkmuVeY7nmYvImMY/uipmVv7QYbvNlOQcDA9DT2SBZys gE
-  gLsQ2/G4AduDVgNbLIk+/y1VVDRHJZuOSD+VYOVtkd9GEqauruJUt3QXscZieVHbaXQ42rj5jU
-  gtiqQBra4WJUZt2RwW/+tUhVTEv2dgiIjIzH+Jc/zzUKwSN8gcyHesZBORuOTxSb1vsTWu5c83
-  Ze fT0CK2NytuFOCAoYMOpJOP5VVuYLeLWY4nR/JbkgnlsjqPbNaEUUn9pBY5Nq43ynHCsoPFU
-  mE11J GDJHLM5CxqUx26dKqMnzb6HHUjJVZRcvdtuPsZrpLee7eMwCOQ7kdeST0I9qqJMG0Z1U
-  Au0gOQeB k/NT4nJmW3uGZU34I6cY6n2FVot88oQwi3UDa7MOhxnn61ooq7bOCNOFObdR6rrbd
-  FrdNDFJCu4h ZMwZHQdzUxluC5ijmiETHccjOCKbaW1ybR2mjwu7y3DDLKx6CoYU3/ZpJy0aJE
-  yOgX5icnBz071L 5Xc7FHC1YP2cb37atefYltoZbefa0sKJJnJwTkZ+lOhSe1v7a4BDRupywXj
-  nI2/U0yGTyFikJVZj 91X+br+FaG95VjXI/wBWcpj/AD9aU+a77M6amAnUklF+71v0+5Ic+nH7
-  RB5S/Zl+64kOTHxwD79a 6OGOKz0xGRxFLCqou/n5S2effr+dV0s2uAkCy+fEBucr958D7wPoK
-  fLJcqvmQ2zpmUK5lAYFuAhH tjPFeXVqOpaNzzZJSfspPZ+Vv839xZuLO2llZyfMZzJsVTggdS
-  D796ykkjjihZIZVlaMbGJ4bDcM B6ZrQeeSO2l+0OivDdFXkC4BYentg9Kz/wB297AY3zuG2Ln
-  gj2+nWlSUuXXYKUavspKb93p2fr0L Cwtc6oZWmj+3RAxt8vBPVjiqAkjltpc3cCJJIX2Eck5+
-  U5rcmtjLB5UkkeXk3l4/lOPT61j29hbq zxoj4VsBmbIUkH5frmnTnFq7exyuLk71Hr2026a/8
-  Ay/7PimJlW4WUcg7ONp7VlH7WI0AiIWJGXd jtnk/rWtdpcNNbm3QwTR4S6VunqPyNVru5JulJ
-  ZZHYnzggwGbjkDsK9KlOXr+hrTryvda22XbzMq 4tJmuEKkxwqWXLdx1p/2SNba0eeUwPKDIwY
-  ZJIJAIx2qaRNt8n2hxIkjE7o+MnNSfZX+feduyXY5 bqpPQfSt3UdlqOqubXn19PyK8kCKiyS3
-  MbTkEjjAb1xSwRSecs0Ubl0BGBztLcc1ry2dssrm7R2O wl1XA2noO3bvToVaDT51j8uSZ5Rhg
-  Oox1+lZe393+rDlUUYuPK5X6tW+/cyhCfICSyxxXG7ALZww xx09ahgjK2oiDrEHO9lYcjjH8h
-  V0Q3Hn7Agk3bXDAds4yKlubf8As+/iJQXAZHVW7Nxww9uf0q/a K9r6nXSjTU4xb5uy/rVGZHA
-  Yrf7xYMwKsBxjHI+tWHUNbKwR/KVgScEjd9alhVo7dI5M+Wq8ZH+e tRT53feI3HLIBgLVczcj
-  veHlBLmh+bFgsYLeKMl8ySSZCg8px1NSwzz2lzHInD71/h9P/r0yN3ku HVG3SEEhcdcelVgGG
-  wZYZOWbr+P0FJxcr8zuYuh7kqcndPtbT5WNGa7+03Jk2vnYRIw6Z6k1qxXl ta2kA2s/7pmyD9
-  0HsfcnpXNWl00drJtVJfMcktjtjFSi6aRSoYDAC4C84/8ArVnPD306Iy9gqqip ydlt/wAAvLe
-  2UlpHbLBLaOxG/wAxs/vAeD9KoXN5IU8yUhJ5Zw7nH3iARx+lN2ESxCSaPC8hthO7 3HGe2Kpm
-  G4nMD3JO4hmjAGMDkf0rSFKCdzjlhnKahZv1/r8CHYgiKMwUkbhk+nUVYxJcQqszIRt+ cKOuD
-  nj6YFPjhdrYZXcqMAOmcH39KU2zGVUE0RILK3BwR3IOOlbOSNZS5VZp66WV/wAfIqBQqBYZ Bh
-  cgMeg3dqgjU21itvHIAryF5UIyRxgc47DmtGG3fjy9jKcn7oIB/KoVhgMNtGyuk4Y5JP3ge9Vz
-  o4sRgnzRm4Wts1/wxLGyyBlk3Pt3AFeAw/hxUi3ziwt1kGXRtkQAxlfX8DVUKxjjEP7xdwDYHQ
-  DP tShVLlQ4TnKp/Fn/AA71DhF7lV6PtUnNv1/y2LNy141xG926uWRmygxnnBNRW8+9nTzRCjF
-  d4cZy vfFSSTb512QuVOflYA5AHHQVGro+2d1j2wZAAQAMzDAz6ikl7trDqKcafs6b/wDbX92o
-  15GMwC4E THAyONo6dqRY7aOSBo4pZCrBmAPQjmm7oxb2ykFZo1KsWOQ2TRE4K7MFFZwVJ64HX
-  86trQmUE4Wd /nv+RHOZGYhV3KuD7nnINJCwi/5dJ0yCSSQce9OdpQ2duOPm/OpCkbuzM7uEHB
-  U8PV30sdqT9ro3 fzt+bRRfyxlllUlgMYHfpUaOzop5aUZ3Nnj2GKsSqYn8wxOQBlRxxjHP51U
-  SR1kDKm4nOSBxn/Jr WOqPKrt+2tK6S7X1JXvGjgCyfvS45UDsTTPs6i7kiRAPLyrHOee/8qHT
-  McYuYsbV5IH3v88U64ig Z90TlCARjPfvmmrLYhqrUfNUs1HZPf7yqi+ZIFOYgSCM85wDVyNFL
-  EBxtHK5bt6VT8lpJ1VXwcjy lOeR9anWSObISKUuQRtUe9VPUww1aCk1PRrXV7r8iUw70kYXCg
-  LtzgdyOn1qtHGk1mJVnHmqzOR7 4HFNDq4fZG9uORhzktgf/rqHygVRh+6KtxnvTjF9zPFS9q0
-  4bLXrr95LGt9IV/eRKVBLHb0TuPr1 qw1zI4kXzV2bsKSOoqKNlAPy/KxYg+uOMVZtI2kMqYjG
-  Yy4LDjCg1M2lq0Vh7r3ud2e+rexBHKWU +XukPm7sg8DHb+daUkMbM2Uk4J8rLDG09KywrySwF
-  nS3TPI2/eXv071LFvGNisMhiwkOfWlKPZmt CX71Jpv8n8tSREkS2FvwIgwLE8jpx/M08WpQEx
-  sWIX5lU4NNijaWBsFiv8BA68frWgIklbyw5UMh ZnXtjms5TsddGjR9nJvRLs9eu1inLKGg/eb
-  ywA4H5imvPMTkElWAx8vbuakVf3JlVMZkAOQG6DIP Paoo3Kyp5hcbpRuKgfdOeOnftQrEzxk1
-  Fzd7eW5RnEk9wjZSELgNuHOMVLC72+/5FkweWHY4/wDr 1OYraR5GxK64BHPTsM/lVa6WMzliG
-  A6nB6mt4yTtFo5VGUE6yer8/wDgWR0NzDKtzEqGRwpwxwQP XB9+aHTY0KSJISI/lAx8oOTz61
-  El6r7Y2lDGVioYEgA+/HepfJDSKiv5jlQWYnjODwP89q4NVa57 6rQdTmVtfWy+8diFLfeqhxt
-  4PbJ6dqVHk8uOFoyjpG5XaMFgOpqv5DmGN5oXiMZ5wcZ9PypIJriJ ot77pIQyL8vr1BoautCa
-  1adRrkitNr7E7TPBB5UaFsKAXA+UKcEk/wAs1I6tPcbIgCXOTg8rjnB/ lVRblJIiSRgHaDnrU
-  sckksJkASEliNpGTgd6ORo3pQp83uy37L+vzNK9juJIBcT2wjhdyVUIARk8 /liqUELXNwsfll
-  XIZyS2dzf0yMUhlaS4WNlYnJ3dunNX4ZYvPE/ktHvJJZSAuPb2rF3hGxzV5+x0 STfSysvu/wC
-  CQ+ZNBIj20QjVkztdQSTjBwfQVloI5ImcYIU4JU4y3Y1cG1PKywnjdt5APLYP6CnG ONt6b4kQ
-  kyBVXb8x4A6dquNkVSpxcuZQWu7/AK1M+B7q2X7KXzFJMWm3c845Ge3FTsXi1AGNcsSf LDYJV
-  MdD7+9TvZPDLEZhmZVcMo6Agf8A16bYgjLNLF9oKBF3rwQepH04FW5Ra5kccYJNuO3boIUk vg
-  w8qFHV1KsqAYAXrVwPc/ZYkkClPLPlnbxyen1yMCoRtW6RpWAZNygKcZLcDPtV8xxxXgidyypG
-  RIQM4bnGOOnNYyltobYOnL23M1a22jbX5FORrpWe2WEcnJURgsoC884qSK2d4kkDAITsBJ/i7D
-  8a sl7gRIU2RKdqNLt5Ax606dY0+0I86zmObKmMYDLtwMD1zUc72R6MvbRqfu1pfXTX9EPSxii
-  nME4k bGWV93+qA+8G9TUc5R4cpaMkZbdvzznHH4e1SmeGWO3ktzMJlUocnOSRj9RmhIJjLbxB
-  dmEypccL z0ask3e8maU1Je/zX8u3ys/1JnNx9ntwyxw7oecxjghsntUgKyXKvPewIjOXGFwdw
-  6HgdKinmSRp VEbInneZuJ3bTjGD7e1Z7/Z4SHjDuq4G1m5G7t9RSjDmW1mbVKEpU/fVn3snp5
-  XW/wAydFE9/JK8 6Rxl9sjZwCSDg1lMpjjQEPxyDu5HpV2DdLbPabdpVvMXPXj1PeoI2228hIP
-  mAEdM7hnlvoK6IaNn LOkpTbe9vNW83p1IFKjzGZwjhsktzk/lW5pywSwj7QQ+3fFIqcHcT1/C
-  qyfYjGY8CSUuQX7NjnOK nfLmJ1gKOYZDKqjq5Pt+FZVpc6tax5uIpyxElGKs++zGuzCaexBMo
-  3bQUGOR3oWKI2DCPDO21pSf +WbZIx9O9VYYdluJhKHCuoZQTknB4q99me60yN4X8yRVyFQYJX
-  uT64pStHqei6c6XKtEu67+Y2K3 SV900tuAgYhiv3wDgMParM9my2SzC6tXULtXYuCecfzqtBD
-  G9ypuIplZZQqIMDcCM+noK6KOH7Pe Szq8XltIpEbrnC45H171jWquL0ZvUquDvGV/u1/yKMMN
-  1azxMtzFG03zcj7pBxt/HNasst4yCBQj G3baAF5YZBP49QKrTOJHjYSRbURgeOpIzkfSnhkaz
-  WWK5V5JkJi6/dHGT9O9cc25WbX4f10OOpyy kpVlr3tp82tSW6EE1v5e8O+M+XnlvmyxPuBUds
-  PL1k3gh3RIAsW0Arz/APXNR2k8rt5DRb5UnOJV XCuCOCPbrSztLZeW/mqwRHUccHBBB/Wps17
-  ncy9rzxdBR+L8fQS5upbbUSkzoyIQ2AuCxX0P1I/K oIpDqdvcTMjIyEoqx4G8sfvfnUpSwYXT
-  zzK1usoUEtk54IGf50lxcSWz+dCY3G2RWVEwMn+orRJa KK17luMI1oRowfP+H4GVqG+P7RF5i
-  J5LxhmP8TYBPP61nS8Xlw8ULOfMbew5HzDqPQA0s7b4YYQD vjTLHOS/vVgRTNHZKh+0bY9s3l
-  9ixyM/hXfFckVcqvGVGznBJ32X6/8ABK1rYx3tpGEbLNCzKpOS WBxke1MeEQrFGRLGshP2jzD
-  nJ42kelalvttryDzJY8GIlAo25HO7FVkjEbRyRMXAUlt3OHHQUe1k 5Pt/X9epxc85y5VK3a2m
-  vqI00bM0cwIDL5cbt/c759TnnNZCRrMojMpEqNjcCQCfUe2BXRefI1rF LNZ8gFHZkADMeePSs
-  xLfc6K1tIZBtDhBggnOCaqlOyf+ZrSUuTnlt6poIQLQh4tw3gsm9s47gfh/ Wm/apLlvNkgkmX
-  cF+X+DIwR+Oafd2c8W+JQxij27mPc4zkegqrHPcJeBomBmfd8qLxnHp0+lXFKS 5luUuRw56du
-  bv/W3yBpm8+EzJHt2FQMY3EAqPyphWNre1aMOx2ESknOSOc1OJw6mLCTwsrNlV+YB R1B7DOfy
-  qmsrSBBEqqWLKBjO4AcmtYp+h00qsZSUpOz+eo1EM0wliO11IfIHXB/lVpHS8nkkZ0Tc TuCr0
-  P5YxTJBHFEoCSxuQAVJ7cEGpfswM7bWUBHCsw4BJ5z9M0SaeprSgm+ZRs+uln+oxRmLyYzH Fu
-  kHUckjsPwqeSJ7edQI0CliXjIBZCOACa0bW1hlTzDFIH8wsqhumDwPzp32JZHmVRJGWcNIHfJB
-  6msHWXNqW051GmtF0M1YVmslQQyi6DYBByOegxVEFTkfPmMlFDHpnk1uJauLjz7aGZoSGaIk9N
-  3A ye+Kz1GYAtrt2jmZ25GeRx6Zq4VEOKjBpL/N/wDAI4EaZZUWGRwSASDwuPWldpRegSRxwsm
-  UbKjO WGM8DoK0vLZ77yYysUjvsUjox/x60kihYZI2ZfNaUm3BGS6fxNn8OM1HtE2YVKkZ1OS/
-  5XXmRyxM LY28c9lIkRysoj+9gc9u5rF8qdbjdMgZt2WCDGwZ5B44NakqolqwKywxcmFnPLEe/
-  pUDKqR2srF2 Mineu7lZBxg/zq6bsvU56kacIr3t9NLfjYqrLBDc4kXaG37EHHTpmnW5865hia
-  AEODkouCCRgc1M scTQOrgxyrMIzvGSCTyfpTolKSPFGrozNuScnC7VB56d6ttWfc5+Sm4Nyf3
-  30/ryC0+zlhBNG5Ql dpDfMAMhuf1qGe0iacFAUhZG8s5zkL/F9DVqRoRLbuCJ0jiKDbxtPO4H
-  jqM06O2As0kadCVUDC9W UAk49OtSp2fN3KhGEZqb+F6aa39Oxm29qGuIlwFG3fhurY6D8aI7J
-  pLnzImSBgzbUc5IHbPFXGtT PbJNbF5WwPlXkg4yf0qncvvKJCSY+gI6kdQa1UnJ6MJ041Obkf
-  y/4BXFv5bKHky8ZJAYE8f3SO5N SYkjjjWMKu6PIUg5FSwzCGaS5kiWYyHaoZchgeC34UnS+cS
-  MDHl48hcDbj7w9hVOTvqHtYU3JxVn bp/V/uZlssghVJ2EkpUkOnAx6fhVeWWTciIhcZ+bA6L3
-  q7HdvLAZEaEBSYz8mcj/AOvUjwB7IzGS N5A4UxgEELjmujm5X7yOOUeaFqcnZ9df+D97KE8v7
-  xkSVX3NtVj0bHpVULJAuwsMMTnIzmtjykct EHhyFLA7euBn9azpYj5ce4kblDDn3q6c1sY14O
-  Tb3a+RXkaeZoyVyBzlONoz/iKcYZ3BPCHO4np3 qd/JiLhldweFC1Ahjhk2K2/erKMnP860Um1
-  ojlqUlGTcndvfX7ug2VIphGGkMuwll2tjk9c+tW4Y vMhYBh8rZJBz26VF9mSLT7Zt8UiHPCDB
-  B9+KWCJxs8ncAPv5PXmlKScdGRg1FyUuT1SJDGHk2ylU VQNuxeTnmlW12tF98jblSPTPf8asG
-  Jhcuj7mKnBKjgelapvJpLe3VPs6rtZB+7+9g5z+PQVzzqyV rHdOmlUXu3bfUznjUlhOhV1lCK
-  i8E8ZOP0pZ7URyLHcDEinDkZGD17dulaNtaRbC9zOvLqSmfmQ5 7n+dTXEMPnrsdxIzl1aTlWQ
-  cbunTNYe3tKxq5e+1O935afO/+Rl7pgv7t4oI1m+8yjAY9R0qREba 77CpmkZlz2Vei/nQ00Vt
-  cFFT7SN3Ddsdc89aspELmWLadiJueUsPXgKPc05O2ttDGWHSrKpb3eun 5ozZo7iWaMzZQyP5g
-  TGOvf6VApVQxjjJ3Nkkjg4PUe1aSxzpOjeW6FZdnzgHB9KrbUQsSDGM/Ip5 IBJ4rSMtLG1ClD
-  mfs3p8tBDG+2TEbRHuOuDUE1tsQCSJsYLo2efx9avWscb2SyPMytliw9QOg/Go 3s5nijZSXVQ
-  Bx2B6/lTjNX3DmpV1zKO3Vr8hwsxa+Vb+X+82szHHUjn+Rp0Mkf7sCKWTcAF57k1X GJCsiyyP
-  s4Bzzk9/oKuRguD55VG88YKJtAU8Htg84pS2u2drxCov91H3enW3qKuILh4Rwwcx4zn5 h0P0N
-  QxnbCfOkCS+crDKkhgBgnilkSWOTZhWfqWxwcUwHfPE0iYc/KBjoewI9am10XK7ilzbbdEP Eb
-  GPcDCEX73y+/H86mDBbxVSSFWdiqq6574xVJFLkAKyEA8N3NXI4h9kb7s2clW9MUS03NFzTg4x
-  W6/rqh8cjtG9w4GwuwXjsOM/nU0RcwDJUoGAQkcKCOatgFLTyDENzMNy4yBn+Hp1NQPH5byBV8
-  r5 tzK3X0ArDmudOFjiPdVTp16/cCRqVaQSBpY1JxtwB+GKZEF+/JltykjAAq7bxKw2yRSO2AZ
-  Npxnn oKkEcflwq1tOjMhYjd0yeD9MVDnZtFRTjUd2/XS/5lCJNojdMMPLLEZJyc4x+NaElnY7
-  baMLKrYK ctyG6kfWrUdvBJNFMFEEEbEAuf8AWcHDD29qYGFsSdyNKiqN7cq2T6euM81hKq5PQ
-  83EU6lad4dO 2n5f8Eo2FgzXzbwBhfmLj7uc8mrcFrHHO8UiSuyx7Btb7xIJ3fnV9JSzXaxMqq
-  kvljIyWUnAOfal jkt5r3EkcskuDsZeA+DgYqJ1ptts7E6nvSinGy/pt6fmOtDbRrHHbwvPcOo
-  ZyxDBCvVSPXrReQKs LxxWbKJvmQ8bmAOBzWeUul1W3iWCSVcsrNEMc9zn2PH4VoPcXtldW7yR
-  73+ZYlP8Kkc5+hNZSi1J OLu35nL7KSq88Xd+r/zKB0+G3+zuZ/tEkUg3JESCdpyT9Of0qS4Fx
-  cWqzzI8aJuO9OA+48H6cUye bz7iLYzCRR5hC85Zf6Y6itOSLzdPee4BVS22NAcAh8H+daSk4u
-  LluelSw0qVSFSUU9db7/cY6yKt oDNBKT5jBwpALcDJ6fSniNGkSD7K6xjO1jjI6ZJ9eKrJbTT
-  3CRKQZmIyp/vdMfXirNxHMk1qof5j HLKMevdffgVrKydk9R4vmg1FSu797WMmRoortpEDBVOI
-  wW556Zx1pbaB5YHlkkjk8qUZSMYJGMkV YkkQwruiGXG5D/snGPxFaGnxOlmZBEZ0dyx2d/X+l
-  aTqcsLnHWnKa5pRtfTff8SvC/kyLIjQxM8L ja65xnv/ACqJpWlhkBjZrltgG09Ox/E1It2SYL
-  nckDueY2XJBAwOx4rQlhkklmR0E4wG8yEAfdAI 9KycuV3aNVUSp891213/ACV/vJVkijS4Rts
-  eydMggHqMUxYxa3H+onit5MpG5bgg9R+dUrBZL9Vj YeQxYtM7/wARwSD+VbxtLifTEjVPMR8y
-  Y7gcEL9a5qjVOVm/U8+M6cJW773/ADRAwu54t62xT5i3 QZQ4wAfc4qQXrLoO+6s5VYS8oxG7A
-  x8307U4JJHDClw/Mo3SFeNhB4U+5pt0Ymt7m4hhuEkBIdZH zsyRgfXqax0k0rdTohCNRwUYvf
-  0/G4ly9u9wXhjeZH3bERudoNZNoXN0yMjOoDMqqcFV6gfh39a0 rnU7FLOaILvZ5FYMnGD6fTi
-  qktyHnit3j3ZDI+zAPJBz9Pat6Sko2sd1KVRx9+DS23ennb/hgmvF GqfbIZ0MbfKoU8Zx0qe3
-  gi8pmuvNmRGCvl/uE8bT7nrWWI0lnWHymOWEhKnA+XI4+tSwec8zR78v PiWRD1Vl6fpWkoaWT
-  tb+v8yMRTlVk9bNL00JLmSG3ln8sLHtZYyj/N1HX61SuHAiSOJZkaNsYds4 9j645zTZZJZZ5G
-  nCrlt2x1+9kcEVIyxy2cM4LjHE565Yenpwa1jHlSudCp8yi5X8rf0iO3hCSs15 kxE8Opxux6H
-  0qe3ke10+OdyJY2I+WM4O7ORz9K2ATdQRgWrS2rRF1IwNgHG0++ax3hmMiCZY7WIE Id4OMseP
-  xrNVOdvmOJ0/aybqvRb69P8APuMuLiV5YTcSQGRZnkwkeCORgVblZ5ba6khXlZywKL6j PT86W
-  C2tlupYZ7232wvtEjKTuBBzViDy7ZYonu4XiaEMyDruGcc/SpnKK+FbeXzMXRo0rcsL211T e/
-  3GNMjzW65L2ylvMBckggYGPrzmrVvZpuVJXklaQMAyn7/Pyke1PuLW4khgRTstjbGQOwzu29cf
-  jUTXoSM3USZZcRkHoCw4I/WtOaTjaLIqxqxpr2Oj9dCdhZxRSW4eUMXVWd2yNxXg/QY6Vlrata
-  Sx BicSvlZB1QKCcH3NLJK0izxFMSkneCOm3p+OKrO0kiS+Y7NGzq+M9DjitadOSW5UcLNpcrs
-  3vcWd 43uifOjiHllAuMdV9h602PdbWFsgik2BS27HO4n1pscoLtsWN15Xdtz+PIqaKCN5UVhI
-  wPLKD0Pr 9K2doqzOicFTiqmjXp/X3jVndoyskamQ42uUyWXByRx0FXQ7xg7fuugVNycMT3Hqa
-  q2bBp4w8Duw RxheORyD9ParttNvKbpYoV4Rd4zgnms6mmyN4zVKm1ZW31T/ACLtttggZQDdN5
-  5QtGcYHGPxp9xD Ld3riNDahGJZnPQAdD75/nVRkQ5kil+RZCWjz8xx1/Si2uJWlLgtHbysXO8
-  5JA4PNc3K78y3HRjF XlGV/v8AwRfSW4tYFkKfIZFj24+4CCSakCRQvLJK8NwrcKsa7cjsaZNe
-  faLVXe3fyVdsHONw29fz xinWcMQS28yeOFBGpbzed3JJxWT+G70NVFSpubXrotV2Wl7kE8UbJ
-  bhJogxYs3tjk/jWbc4F0rvE YoJmYoSM4A6jNaE0LER3EAZvNHmtJwVB3YwKzpXnN1biVlABBG
-  5eAGPP61vR8mKlF04t0no/v/D/ AIJbmu3jVRHGkkboz/MARzxx6VmWYW1uobggSxpzIeoLNxj
-  nvin3EKeepEu7HIweOPb0J7VJHujt Y55SBM6syIF4PbOOnrWiilCy6nFiMDCUbKHxfL7+q9SO
-  Wa3MyKqM8bI24Dgk5+XJ9afBbO8byS3N vACQ4BzlgDxj27VJbi0EEZO5H+z7SDnJPI3Z9Paqp
-  aWRkhDBV+X5m7EDHp/nNUr7LQinQai7tqK7 q/5ofPIkjj5GQzHz3YdAewwB0pkJuJJGtzJGq4
-  BGV64BPHFX/IWXUCZImjhcuzRg4aIgYwT7dadH BFbtaTupEUkBIlBOOuMn6modSKjYxq1MOo8
-  kdX0/q1yhNPch42lUQu43rsXbjPGeO2KS1ma21pXV YbhWOxiEGD2B56cVchghclppGjBIUM2T
-  8g+8PqT0qNp7Z2eFYtkLHzowPvDH8JPfvT5k04pDqqMq UowpuzWr2+6+7KbkLem3FuyKXH2dm
-  wcIMk/XNMktLq5d5ZlW3t5SSHcYAHccVoMsFzcREsyokLBC OPlJ6/zqt9octDGq4VY2UFjkMS
-  fl4qoyl0WpwRoVXdKNlbqv6X5lX7DbWV1Bu8uRWi37kHynAOeK ijkY2ashtk3MA6NHkn1q2Fm
-  iKPcwbT9x+ANue5+nFUp9n2sx+YGXcQJVGAcDrW0W5PV3G8LHnfJK +nay/wAiG4jS0uh5DLNb
-  fOiPjPbIyfxqmsiGHe0bsVAR+RgN+XpV0pF9iRFjYmRAyHcBwCQfx460 x4UVy4CoAwkwec4re
-  LVrMKeGrqnZO6XyRXeGH96RMGBm2x4GT04H4/0qiI4hp7+aU84TqyHB+YYw fpg1dVF8yFzllQ
-  ZIHBPOalMa/ahmFmLI+fqe9aqbiclfB1JQbntHW/f16fkZkRCiIRE7Sh68jrkm pLZJJt0bzxx
-  sCWBI4Ix0+uasMR5sEMZSJCn7xmHK56j86cUnhvCjLG4VsEoNvaqlK5goR9ooRbT8 l/wdSdXl
-  +x7/ACnhm37SsmDle/Hr05q7bWjFyTE/l5Ii56joaqWMc00u1tsKLJ8zscgAjgfU461t W1xFH
-  YC3jVpy25vLJ+YZGOD7d64603HRHXepCCs25d30XfyEFxPbrFAPIjiKjLvHuJ/rUy3EYhlL we
-  cUxGj5wFwM7envmp5tPmexEm1vPQLCseMlivVvpioV024W4khCPKMBl29/b6/4Vyc1KSvc7I08
-  O6ammpd9bfcKytNZmRbeABJAOIxl1xlselI1tcNpweOHKSMXJUY2gfdB+lVIrm9hlPAYFhlNvc
-  5A q0t3cnfD5oCGZcE9MHjP0puM47WMJYerSkpU0rLXr+WpmzWrRXcQEgO+RSVHJJA61DIWm8r
-  DRhWT Ifb05/xq/cLAmqrcCYqYZwqjOQwYcEVmxb0CJcIxw20qDgqBnNdMJNq50Rr1IzlHldml
-  stf8iqlr FHbDe0jyIxKhScEHv+FXbVCjw3QYtFHG3G772Ov86r2sbyPCkTAOww5c8dTz06dK0
-  ZbWQsIVt5pG SIquw8A9wfU1pVnrZsxn7Hk5NEuqf+ZmrFiRY4AQuCXyMnHer0i5ulitz54ky4
-  CjJUYzg+pqOWZ0 fypRFHKVwy7cFjknjHTjFTo0wthdTR+fHIefKAU+gYH0HpUyk9zor15U2nH
-  7v+B/lYosS37wMVXh T6564qxPsnufM3BXaQnZ0wVGcj2qEmN5dkYMg35ZwcA46HFXkgWRSYla
-  6lYCTKDhSeCKJStZm8W5 JSk7K+t9iASpHeCbiXcCxwf4j0q3b/Z4woLuWYlXRV5z6gkYxUyQw
-  vMYGi8s7dysewHU1ONOhawt Z3k8xtzPiPgt789qwnUhszSdoVUotpvt/nqWRa+fdokaSGFYjt
-  bPLvjg5qt5ZXTp5HurdyZAsigZ bd+XFaC+ZFe2rElIS2+MZ67Rjd9PWqmTc3DbEAj3h5ZgPkL
-  Lnbx79K5oyd/I6ZVZqs/eVl2/zf6E cBuIzEBC5lAV3XuoU5z+VaNwGup3nWeJpGLNEEGPkBya
-  maZPtab2Te4cttX/AFfy8qfx6VWkDTab GwuIpHjiSIBE27cnv7mo5uaSdrDoRU5+05Xrpqrp/
-  gkMjgDOkiSQ4Me5sDoD2qBZp4oZETyywkCb SgY8DIrVYWK3lxHuMKCQLhj904x+XWksYrO3WQ
-  efHclGyNvYYPB9z2pOro21+BWKxk+b3o38mv8A gfqVI5pDf77qaKOLyysi7QCWYZA4HXOKhUb
-  bS3EJRpFQqx287geRn8aFjtpLfaI5nkfawTdkrg42 n3pLdZf7Ut4A8QdnLkEfcGeVPvWmiuwl
-  WjD95JWXbYm868ljg25LoqeWijBbrg+/vVeYyXFgZpLh ZJEm3LjPzgDqPYGtGa5kN3tAS3ihl
-  LAleYgBwGPfJ6VWia3lkaNgBdyzeai4yBx93HvUxl1t/X9f 1sc8KylO7gl/XdrYRbea8ZmXy3
-  dnDZVcZ9SPYirElpI9zPbDd8qlzluM8FcVXGousKskP2aRiFO4 cBTxVkCO1u7ppneVi4SMoSN
-  ydz+FJ86f5HpUZSbbS9F/W5Xulijt0Rfmnum83cp+6y9vx5xWWl4X hJBH+sznuOxH5VrXIdrp
-  BbxO8ZbIfr+I9KorOXhUpBHAoZ1eMqMtwMHOPXP5VrT+HVXJ9k5Plcb/ AC1CztlfUBEWKQ5Yu
-  SOVUcitezjlRdkcTxxSDc8h+7uHQj0HtVG2aOQB7iKSRiQp8ttuT2P09aZP PLatJahZfJLqW3
-  NnGPQ+45qailN8o8TRdWTj0SW9/wAFfX56Gnd21rCYhK0c7spYqnGQOSRUD2sR kSaKK4ZZUDC
-  MSc9CDz7danZ7K7WRo3y7ThQuecY6j0FRW0Zee1iZnclBllYjGScj8MVzxclHVs8h OolJp7fL
-  8CS3keA28cKpKoUHIHbsf51pyTyXEf7wtFG0hwqfL9Bx6077IZ5GiVT5bEspXgsp7j2F Qm1Js
-  4Wk3PCV2OQfXowz71zylCTv1Ob2dPmVRuz9LsqwRPE0Jud1urxMVaVsg7Tiq7yTTTIZZEb+ Jw
-  owCemPwrRFpKkCR3SSXHlSbZcHgDjP07VJcJFKyiGNvJBYNg8s7Hgj2q1VXNc6PauT1fz0sUpI
-  55A0VrBBKBIfnMYO3GMZPr1ouLeQx3O+DzFSRQ5jUAn3FWU0poneRJZYvKVo5kLnl+uar2yoE8
-  wX gZ1QxyR5J3l+jD2FOM1unt5GuHc4vmUrpdtPxK0lvLJAq2s8AVVwqkfMFA3Ek49aaIJbiyt
-  naWJb jDKSOM7uc/0p8HnWt5aoJFCMuZWcZCODyD9c1anJniMUqCNDIxhIABJxx+FaOTTSHLm+
-  sR5tt7+v y1+8zLSwWUW0ckUjyNESvzdgTk/hU8kUK3EkYAjfysBmOVyR6Y6mrP2NURRcTlZUT
-  CsrEDb/ABVk 3apJFHIgZVX5QSc7we9aRk5y3PXwik5Pm1vtuv1sWDcPAYltn+7DtcY4ORnI+l
-  NWbzdQsjdobiIo wQJxuJHDfnVY5t7oeW3mqA4YnkEAVJFHvWLfLGSsY2Y4IXOf0rRwja4sRha
-  c73VvO2v4ECRRrbJE 0qK4ABDDnOSTz9KtzLasqeTnzZZPMXLZEZA4U/UZNO+zRuiXcJQxrPsc
-  MMnpgn6c1QjJ+1IwSSSJ GYqQCASM4Ge/pRfm1T2PMrynOFqU9F6flpcspLNLexwREh/LZEjbn
-  aoOTn8Kbv0+2tmWVtrSTAWw Y5JGM/j9e1UFb/SbabftZlLMcnII6A0x1aa4gLI1xDFExDKMYP
-  OOSK1dJXtfQxxmHnN8t/d06fkN 2oXSRkcjAJAOCRnnJqKYASptGwIpXkfe96crPJDEpI2rEck
-  d25xUs7eYib0L74wcJ25/xrdaPU9K Eabp2m7P+vuIkSXzG2hQ23cPlGOnIx71YRg0EnnREfON
-  p9BjoapwFn8xmjliZSVYk9M9varMtzMU ghVMrIQM7fTvRJO5FoJxqJadO463kmiYTKECsD8+w
-  cHHAzSfafNtcCFWllbexAA2npxTB5scLjIK LJ6ZAB/rV5/tEVuDFFEsYLbiEHBGOPxrOVr3tq
-  czd6ilKKTv94uniJtTEbqYxjBU9TgZzmtWJpks 7dBp8kplXOQAAOTuFUreS8lkTbAJG8t1d1j
-  6hhwfwrW+zXIs83TMYfKby9nBU4wM1x15Lm1NK8m6 nv2T7f8ADMryNO8u0252LuCxgcsRgKfp
-  mqLzyS3G4oowAJAR1Oecela0XkLHZKI7g3MSYK7+SoPJ /DrU8ULTSIoSMwYZiwXnIGefr1FZq
-  rGO6NIYunST54fozPupC2kSrJEYsTD92ODnr+AHpVCKVDcX TmLzYyQc+4GanlYOiuFJCKeG5z
-  u/nVeSRvs7wFfLEeA7Yxg4zg/lW1OK5bHTD2UIJOOj316FdTHM lu9wdptlAQKMbwxOSfpVe4l
-  ZnUGUbI49qjHJGeoojbzwH6yMhby06jB5/TmmxTxSFYpo82zOozxu Az1z2HrXWo2bfY5Jyo0V
-  KUE35ak0MkeZGby92Rg7Rhh3A9OKc8quXkSEDzNpiCjHA4z/AJ71TeOb MqymPMbkbQMZIPX9a
-  lku3jRFhhA6bTjI2j72KXJd3RxpSlH2jTafT/h/+CSyXRQb5YpYpJZc89Gy MMfoKcbSeQJbxu
-  ziJBGnPDLn7w9qh27L6QIfOCEomRn6Ef55q2i3l9GSWX92WVSo2gk84NQ/d1Wh MKMoPm0Ue/b
-  5Fh4YVtnt1kEjeb5ipnJAHUZ/Ws6QK1zFDAylI0ZY36A7j+vpTUed7UxbWWRCAMDJ I60p+zyw
-  l1byWMi+XlumSTj9KcYuO7uEYypx7t7Pt52H2kUlsJUkBjSRWBLDow4xn8c1DOY5LKxi t4XZ1
-  ADuOpOcA59K0CZLQyCQNcoTuGOrMRyR7Cq0lvC0DCJiZkZUCdd64+99KUZXldhGc5zip6Jd tV
-  8yocbRJMs7gMyStv43nv8AhxxTbiS0MUdtFGTKmUZ853txjAxViaAWdvGVYOrSkgEcYA6H3Pr7
-  VVaO6BVjEwkLgYAAJYd/yrWDT1uc1OKac29Lvq7fdchMLiKQLbywFWKhJDk8nlen41XKFrtdrR
-  gv NhMjjZj+uKs36m4lS7WUu0U+0qODjHB/SqyRRC3hVgytt3Id3Pet4bXOaeGqV17OOke+uv3
-  lkJFA HABYNkgdwPSqIQP5aDckRXLORyuD3OKvgqLXauzcQPnY/mKpyJKbqWPOIweo6DvVQO+v
-  QlKiotNJ bWtcj/dHa3mLkqdpwPWljVVijaR2YFmO3dlgSO/HeqBNulvEqo0pYnc2cbD2zVm0W
-  JI3nfFwqnYN vTd1/lWso6XPKVeFSpF8vvL+t2vyL4hHzS+asfQOGH8eOFq7EBbiWRJbeVklVN
-  q53EdTjj8KoskE lmrBXjYjeGZ8hsHGcU44F0G3M4znA7DOT+Irnacla500ZTqQbk3u9NNf68j
-  X8uNrm3X7aUadZHjj YklPVT7miZpreFEX7REduSS2SrdMfX/Gkjeymvo/OkYbpDJE+cYHdavy
-  XFvLYi6f/SVdi8oQ4Ikz wPpjtXE5NSSauZ08RKNRRnG66K36r9SigvnhEks0LNJltnlgMdnHY
-  e9OvDNDfwybUysbKPl+7xgZ 9acLuSNoRAFGVPmbhnPzc49KbJEkt6R5NxHAJP3bl8/L0z78mm
-  rqV2tA53CV6isu3l6f5alEcm2R 4WaR4/nPoT0/HHSltZrWJth5ZiW8x+QrjOFP1ovnBZYY4mM
-  inAkLcEDio2mFuohlEZAY4UKNwKnl T7nsa3tzR9SMdVahZ3XlbX+vuIrOTa8dysTFEkCgD1OT
-  ileSG4VnzLFIzcgnqTx+n9arW81tLdLP skSLzGZ1EmQrngHoOgqKP9/CgK/Z1TO7J5fPQ+1bO
-  HvXegQU6tS8lq1pZrbz6GvFFE0cklyqtLIN 0WTycZyelJ9ilktoGIKLnCNuwqg9c/U9Kmjl+0
-  QPLJsklLYAjGAqkY6e3WplsPOYQxSbmbHlyk/I VHBPTPJrndSz1djtlXjOKU2k46/CvzKJtTb
-  XEiuMXCOscfHGW7EeuM0+FLWS/aRRKlsofG1iMEDG M/Wp4o5IL9YiDcoW2xrjlmAJU59qo+TM
-  kFukkBgm2sJMjAbrjA7VSfN1HQlKVXlet/67r9S1GzND HMCUeNAkasMkoc5PvV+2hU2tlFIk5
-  dly5D8dSQoB7kVnpHJJLBGIGeRY8bB/F74q9GYWvkdUaJwf vGQlcnoMY49qzqbaHozpTjsrSX
-  W9vvS1/M6GSa3ZYEdPs6eWzs7444+UD60RLCliZZQqhx80fcn/ AOuMmqFxcWElmu6XzH5ZlUH
-  tjFU2aP7P5zQXEbM52s8ny4A5HH1rz40W11Rw4ag5zV002/k/vZam J/syVxEAIpcwuy5BRgMA
-  +tTobUKGkCnJLOkfy+UQMBD6n0rLaVZpPMtnAkPDRMchmA+8B0wBUwu3 ijlNzBujdgVZV28Fc
-  YJ7n3rZ03ax2zg+XkW67Wu/vf5MkdZFtN0sahAVZWK8yEcbvoKczxPpbFxs Mh82EoNpKrwc46
-  81nm+jMIhmk8mEYVA2SSepUH16VOpguppNolKgiNFB5j4+6feqdNpXaMnCjTs5 PVav+r7jUuT
-  au/kRlmLqised28ZJH17VCt5NOiReULhVkCymMYZjzjBxxU1zJbx2Qs4cxRRzhiXO 53wMBgfQ
-  dxT7SQwSCQxh4mV2aVFwsjAEAj0Har05XLl1CU5Onfk19df69BzXIZZo1jZAXy7NzgqM jP1qB
-  Im8tp/9ar4kV0HcenHQZxVa0ZLiNVtw80+zDqB1cHOfoB1+tXfsssUzfvY9oYOQM8LnJ/wp 2U
-  XY3w8ox0ST+X+T/Mkjltb54zJMsMxZvMkIyvboParvliaWVYVF6SwkRVHKY6g8d/xpdOtIbbz5
-  ZXgD7225HAPUDFWItQSI2/CSSzQ7n8lMFuTkj0xXLOer5NbG6dveUW/L/g7/AIg63LT75k+xwy
-  Rl 2yvbODiqKafFbS/eS6tG3eW45ywwRzirE+2GysRHdLcElxIxJPDHr9Paop1+zRQxSSC5hOW
-  ZI+CC Bwc9hSg3bTr+hVOcqkE1Gzbta35dn53K0QzayS3dpLbSSTCTOMDaOoAHTNOlNzNbQyIy
-  PG43QIEB cgHvxzj60599wYlKSsVQbjnjI54+ucVatoWbTVmhdbhxIFaBOGUnrjsBWkpKOrMMR
-  VVCC9o7u+z1 X/AK8QK5lcRw3KSqjnb8uepbA6VrQ2aILqe3LEzsZEJPRB1x+dY8KzxzRTMVtk
-  jUoWlGQ/PLf0rc VVluPLWZZ1IwFjODj1Ht2+tc9dtbM893jUdRS0W9rteny9RcC2tIlfzSzQg
-  xtuxgZ4H54zSuYRE4 a5T7SsgQJk4PGTx9avGWC0y8LKYdshIk+YrnGOvY9qzphfNBb3cDW8gl
-  iZjGIvmVhwQT61zQbk+x eHqutNRS18+v3iR284h81JCzyjzPmOcBf4ceuajSNXggmlmCOFDOq
-  5G3JyeParP2KT7Ku6R3ZIvl CkjgY/nmrMkyqkkRCK+/93Ht+Ypx19ap1OxvKpUWy2/rzKSTxu
-  ZE/eujtlpFbhyTxj6in3NrIoI2 R28Q3I7sv3WYgKD9R0rWSSC2nkZ7JsKzonTGD/8AX4FVZp5
-  005V8n55CDscAlNg7/Q4rJVG5LlRn GpUdRcqt266nPGG2+2tbtdKDCGjZiSdxwTuHsO9GZoYL
-  FXkRkcI8cuOFAznP1qY2sBtt5mElxMFk lAODnODj6iqk9vsD+W/+iLMIclskZ53fQV6EZKWlz
-  2pRhJcs5aro1+Rblle5V1itnYvKF+U/dX+I fWmynT48JIjARM2Bu6jI5/Kp9rCSdzcRSQ+cpP
-  lcc9x7cVRP2qRxNtWGFV8phIuTkkkfj0qYJGbi pPlUvdXqtf68iu09ldmZYfkgDERjv07n271
-  Elq/2dZdwdfJ4IGBx1FaVvYQPq1pCwGDGQ+3gEjOT VieCW2t5Y2ddvBicD5dg6jHrWrrRTUYs
-  3hiIUpKlT95rX7+3mYlnPHBJCBGZIirRsoP3i3THv/hU l40IsIoIyDtx0OOB/U1cRIDI00iNJ
-  iNgI4yFOOzfgOaoMIfsX7u2mXDKvmO2Qxz249KtNSnexk8P TlX5nF/kr+jf5FNba2k05RG0xu
-  dwZFBz8oOCKlKFbu48wbRvwUHGCeg4qyzrCiDyg6OCTEgAeNc9 z+tUrqGRYxKQ8WJQAGH3gRk
-  NxW0ZXerFRcIcyau+m/53/T5kSCORLYQ5FwM4GcjaOp/DmqbMHkjV B8zKc8Z3YJ5FW2VwyyKB
-  kjAK4AUNkEGpjCsZjVA4kH7tDj7pJ+nvWqkkzKOHkpTnzrRdX/V/Qpu7 CYrEpJbqCOMcYP161
-  IFltpxLFNCzLvAyM5HQnB9c1OHhkihtMjcCxMv949KiQPIYklgk2qjN8pAP HWlzdzk9tKpU5Z
-  K3l/w7/wAiXzJTakzwmNFHlxqy8kkZ59TVyWK4mhgkkyFiUqwTAJcjg/j/AEqu giaWykWG4eK
-  SBiPnz83IzWhYi4iEG2WMIsbb/MXIbGcEficVhUlZXQ4zStZXaelv+A2MSG4WKN5x IGfBGw4D
-  Kv3jQ7xxXwkVLs2bSfIXc4P9DzWtAwEdrJdyxSvEhiUJwDuHP+FMkmE2nLZxxH92/lbC MsnOS
-  T+Arm9q3LVBh8TUlV5asb33euxT8m8EE7tguW4bpgnqv5Vntc3ioVVWR3cbmBwMjgCtSFd+ po
-  QXVjbsyBjxgevqfeqS3EUC/ZmI3MQwc8jI6D861g99LnfKNvdSWnlb7xN1xPcKkieWrg+awXjd
-  nH4AVmY2xlZFke6kbEW3ptHUmthrgs82UYTuMMOMAngjFQyW8M0zRRxyRSLOq4c8qP7v145rSE
-  +X dWMKuIdLr+GnzM5FJtIdqsswT5COAVLYz/n1ojhjOnzRxyQNmTJGPmUjoM+laRithfOlncR
-  kM25N xztxzj+dOmFnHKZ12t03qhxlT/F+FP2t3oeXObcly/l/n0MiK2JlxIWZv+WhU981sQW8
-  P2gSCSOF 9sikOM4UEc/TNU4GtVeQRbxznc7E7mydmK0bS3lFqs8zxowOWVhzycE/QdxUV5vq7
-  GOMrVeXlba8 rb/mTRxQT2StIV8/cdxXjJPRh6DA6VjrC80aLbxyywuAyFT0Az19T1Oa3IQwin
-  id4UMMwiA2+vQ/ lUkUQtL53hdXBXb5S9ieN30A5rnjVcb2ObDV504Slzarvf8Ay0MKS1X7L5s
-  iSQlFKoCceav94e1M t4hJ5DRvEspiIbcuQG/h/Tiumh+0rai3eKOchRl9uQ2OGIHYYrJs5Ekl
-  VAUWOIFUbbjKnOOfXNaR rycX5FrFVZU27Nta3vp9zRHayTmBbe7CyMs6NtAAZB3BqvcOm+a43
-  KjSox2Y5ByBj8OtWTAQkW+K V2f5iVOMDoQffNZsVrdjWIZnhaCJUYnzOR0PP8q0hy3cjOlUVF
-  udt/Sz/r0K8xMcbxorg798xfnD EYIHp61EFWOWErKTcZIB7HsCMirdhaXV5BAgG1Sh3O4yCSe
-  /4VpNp8SXF2qIT5NxGQp6njgA9vet 3WjH3X/XQ7VXpezcUtd7Xute9+nkcrBbiaaG33GBXbd8
-  /Odp5z+tXbpITqNxJ8oCy4iRBjC4/pXQ XFoilfNjadt26UwjbtJ6AemaomLakl3JbneGO1Wx0
-  BwQfehYnmdzmwlV+2UpL0WhhNG8l7Dl0jjY cs4yvHJNOu8C4HlkbJAWDHoR2NaTWbSSy7djbC
-  qsRxyTxj6jis6a0uA9xGbeYMk4TaRkpz90+9bx qRb3Omo2q0pup8tLFK3tlkhjnLQywxkiTYu
-  OcVGJhEYkiURKPmCvzub8qsMpS6kjdNpUlWXbj5um KesYQrJNE02wFVAAwMD5gffmt+bW71PP
-  +r+z95Pmb/ruRxXM/wBsjlgMTMqlMFMqAe2PWrtmZBIz Twqux/njdASRjBqg6qpDoQGDYDKMA
-  jtx61VkeO4uEKzDOeSWzlhSdNS6EVKLnJzmkm/vN+Ke3MjP NaSiBcquGxtOOn40sU32p3jZfs
-  3ntuDEfKpVTx+NY8UUwgdDcIq53iNsknHXt6UxvMW4jaKZDEWD lcenb61HsU27McY1FTk4r3v
-  np8n/AJGr5scqwzufvxElAcfN93P046U0eU1hFIrTLIpKMxYlQCM9 KpzRzSSlslNzl3UJjA74
-  9BioxLGttNHvXLykxtnqOAKPZ3WhtWjJxip6d3/X+Qj+btj3FZFcH5mJ xxznp+FNQN9n2idEw
-  /mAMcnd9aTyn+VA6yMUJXC4GM/1p25IzIGUPwMAKMj1GfrW/Qv4qvLPX1e3 3f5j4lX7PIjsFI
-  +YHsVHJH1z3ptuPJkjmmYSRfdcDtnlQfrVYqk88Kq+QB7/AHh0H4014pXVCySh nYn7uACDiny
-  30b3POxMruUYz+9/18jp3kWaQ/uQVlQunlrjgde3rWlayzskUslxAjMykJswSB6eg IqtLHHK9
-  vktE0RaMoAQV3cih0t0tmWfzEkldCDnG04PFeVPllGx6VdqtS5Ze75dfxJkETass0roY mV3XZ
-  kEgdKyrhrhdhIJBHO4Z5z2+uanlh8uKOMSNiFSu7P8AF1P+FQMJpLZJ4Y3eNADKSc4brW1N Ja
-  nqWi6XPUfvPRfIdsdpynmbHXKBCuSR3H1q9A1zBC2yIRr56nzZFyAx+6DkemaoiOfyY7mRQjOr
-  FVz8ynoM/XNWIA94nlSloZhIBMjnqQPvD09KKjutdjDFV6dSmrbLrq/vWxoTrDBDgx7xvZMgYK
-  rk bgff09qdJa2ksRgtGkdDKzJls5GB830ArLuiJSpy6w7Mx7j6kA5Pc1UlX/iYeTE2ZtxETBs
-  Ar+VZ wpNpPm1M40aipKftPhd/I27RYY7RRJeWse+YOx2+33fxFOknnmMETp9ms2jMmXTOecVi
-  JDGzhWmK oZBtAPL89R7dqvTSlNTkbdhHVwFbnZjjbSlSXNfcy9lBt8z5uv8Aw3n6oqIr5VmKM
-  ypuUFOw789a dHalfKMTu5MiuGTPK5wfxz3p4SP7AjXKSlAzKhVsZA4qRUCusdufs6Bm3PK2QC
-  P4a1c9NDrjiadS m7QSW1/6epYuZo2S980pNtIUYGCSTnIPYDGKyreIJeJCvmnLsGXd0P8A9f8
-  ApVhJlurdZLiLaytl BnGFB6H1Oe9OAtpNRaZo5WJjYqySEAnHXpSinFNWJWHrSpX5bX22X4bl
-  WNZliVJZ7dJI5mjGxMbg er8DnkY9a0Vim2F5C8sgmwdvRsr0/ACqkMP+grMkQniU4Y4ycn39j
-  WqlmWkRWDJIyu0gPQkHAYeg 5pVJpdTWhenFKUv1/KxtRW9td6OptldoU4J3ZJ29TUEbyS2Bhi
-  tDCrsCrsBlcD196itre7+zkNHJ FEiBNq8ZOcdvzPrU8kMcUbeRFchoWKySM+V3g+noc15+ibV
-  76nbQahNJT5ne68isZ5Xs4RHCIwRg hhn5egPTtzUjqs9vEk+54oodsUsZxnnjOeuenNW72QDS
-  kSRV4DIrhQOMjp9c1T3I1hDE1vMdn7p1 U4KkHdz9P61UZXiml1PRjiYSoxaWrbX9aXJ2s3WGd
-  mmEN4swxGTzgDmmxTyfZ5P9GkRJJUYEcc9j 9Kie4me/kliUsJJo3IbkqT1X8RUV0MEpLDO1vG
-  +yMqSBg9BnoTSUW9JHn4mPM7TSdtbu1/0uWzbM YLVrhiiuT5ise+7GParwjtbeK8tkSa4/eM5
-  eJsFsEYCnqOKy7V76MbPIllPyZZuQmeD/AJ9auvDL l7dbG68hA2FVhv4Hc1lNO9mzyXRl7ZRb
-  09bfk0XYY1kndyrWSzoWQXHzcD/OPxqxaTPPLLLG0TSM p3QquPLOMH/GqkTWsVis12ZI2mIZQ
-  7Z2jGDj271E8lsmnLcRCSRVYKGRsbgep9655Rcm18v6/wCH NIRlJtX301S/Pf8AE25ZrhHjLy
-  ReSkflEeXyCRgkn071UgLSXiFZ7e42RnYyJ26H8T2qH5o79ZIp cIVLBJMtkqeP0Jq1CWMjfab
-  SZUT5AUO3JJ4P0HesuVRiarDuCklZ6b6L8P8AJkl5cTWkFvtMe2OB hEWGdxyMk+vXFZsswXT3
-  BYyTp/AD8xQnJb6DvWxcQkaYzNDJhm3BmPygAjcPxqjPeCYrHHCsscpY 741ALAfxA+nalRaaV
-  kOjOm1GSXXfb+vvI4HRdTu2u1WO389Qvy4OcZUZ9Kx3u72K/QosbGYlinlg hevBrVMv76DzZE
-  jQJudnHAboD+VdT4i8Q3/jHxZFf65FpkDWkEVsiWFqtuAiLtUMF6uepbvWvtHC fw3TWvy2sut
-  /U6pXpzc3FO6/q3Q5ZYYpkg3zxC5dAzBeFceoFRm6d52QGI4beFC9SOp/CiSTN3bC GeBh5Xyq
-  F+bAyM59M1lXE9wCkV7GHSSMuTF8pY9Mj29q1hTcnqKnH2tS1r+vT00RYvPtKRxRTKQX OfNQb
-  Qy9Tj9Kou58yYxszTAmXy2+bb/eHPGO9RwSzRs7NBJOGkOHHRQvWrEV3K6TsQsgKbnVUAJY 8D
-  nHT1FdcYOPY9DD0eXmcEml1/q41ne4t7jyImn2sE3x8A7un4cVUihvVgkjXC+SwCRtyWz/ABD2
-  FRJNtj2tIYycq2DjeR0I9u1NEi3VmrfaPNmGAMKRsAzkHjk1uoNLyM6vNLRNfd/X6DSN0kj7wF
-  En lgs2cf5FV/LfyJICSqGUMDJnjAOF+prWjb7bvgMPkOGErsehIHyjpxmobYeZdxy3qhJGd2Z
-  TwMBf T2NV7Syd+hhXxajG01drorFQrAzRqqSR7o2KKxyeT096favJaR2+4qrYZmMq5Bx/Dj19
-  6cwEssrN Iql3jKEcAEjoPSrMk0T2MisFndZMsmOVPcZ/CiTurWuY1o3tTjC73+/8DOMwMTK6R
-  75QpUouGDZ6 UjtAjHG4uEIY5wc5ois0KxP52+Jst5YPz4ByRz3xVi2U/bk/1ckksLMAy5GTn+
-  VaOUVex20MQkpK Mdkt1/X5BbRPFYyyfIdj+WqkZ4I5I/OtGW38rT4EM8TQZDK654H8Q/HikUN
-  NeQ/aIZJ4kQKwh+X5 m4H5ir0KhLQ2UUbW0gJJW4+Yrg5rkqVHf+v6/A46mLrJRpu1k79NP1/A
-  pz20K2MhR3Yh94TdkqM9 D/OrFxaSqUEUcgdonkJz6c8+9Mis4LnJM26V1ZwVzjGM8ipYo5PtE
-  RacwMSI1aQkgKycnFZuduuw 1VlCEWp6pt9fyX+QqW8k9jbF5FWCaIOnHzAjgjOO9VntIAj7YJ
-  jJJJGQWIJGc8D8qswGaJbYSq0s PkeZGUGPlQnj8aVryZmjOwQQvDvLuOxPUVKlO+g3iK7Tell
-  20X3LVsUrFcakIyyRyRMqoD1MZHzH 6jjmnXJtZroQNbS27RyHZuf5mAXqfWoY3ni1aQCNLiJZ
-  FQyIv3jj5QD71cYvaaotzdYTcjK+R0cE dPzrN6NWfTQ4akFzys29LpJ316kUEUD2UefJWZURW
-  ULyCW6H3NVTbPDeX108JeIuUVcdeOMe1aSL Msk5a3Z9rEZUj5eOAffNZ8mmKloUYXMLljuWR8
-  5I5/rThNXd3uc9GvGDak7J6ar/AIYZDJCIgJrV R86bNqgEjPzfrWxPBFdWoCoVMgxkHqWOAw9
-  sDpWRAbgXkm6LzJMqWCjox4WtG2tLpZwv2e4gVNzT lzkK2CcD04qa2jvc5selTmnB3fS3+TGS
-  abc2czxwSpJlXZyR95h8u76YzTbe4RYLQ/ZpHMdpIEYH mRT/ABVPHLcLZRSeW7RKilNxyQAck
-  E9zin3+pNIs8lvp06ySI3kEKCAhwCQB2qFKTdpK/nsZQ5qr UatrPrdL7zNigjFtbsxuHC8RMs
-  hHmLtzke2f5VCkc6G3uSYVE0Bk+5gADjH+HpWjZyRWFnE7I00a ryueSR6eg56Ut3uvltjKVSF
-  yrIqDBeP+LFaKo1Jp7EwlKDkm/del97+SMCGR0vRFAx5ZWjEhJ/dj P6mrQjhmljt3uVHmxMYz
-  k/KobOD6k9M1oLPDDq4RZLUwsrC1cr98YyD9M1E1sIrEzPC0sjgeYU4w cY49BWjqXfYqTU6qi
-  pWb2/qyKCW0RvJoWuVt4ZYw+4k4hbsh9yaty2c62P7uRVLSbpQc5VwBx+Iq 2sYVSuxduSjhgN
-  28Abfz5IolmllK20REUTYkkLjJ3LgYz71DqybVjSpKTaUXtve3+VyKG1uPtVxk E+bOoOP72Ol
-  STW8htPL86JDtZWZkz83p+NSPqFxFDMUMcryOXLBeFY8AflSCzuHjSOdxK3zBgowX C87x7Vm5
-  SveVkcVab5lUmkn007eRTeWCNHcsk8oYIkcYwX5yD+GKzJ7K+utQW4mKwS3SvJhsjDDs evJxx
-  Vy4LzXtwi+Tb5dE8wrwWYcEelQz6XcSPKnnSSXUXMYVjhwp+Yiuqm1CzvZs6G1F25kpPurq 3z
-  0RhanA8X9nv5ixNJC7sHGfbH1rP87zYlXz43iUlSdvQngZrqbv7LfwurFYplAMG9v+WZ5YfXjO
-  awo9OMO1YQZxKPMBjUk7R3PFd9CquS0tx4NX0qaPXW23muhRnja38t/LDtuKsATwfy9KSCzU3q
-  RK 0WcsWJXvjIH1xSvL5IgguonVnmXMnQRqMHJFW7iJjdA28UwV5XZmAzkge3TAro5mlbv1MJ1
-  5TrOm 9+70/DZjBaxMiFpViATDE5Jk75X2xS21rbPKZJX2RYKgZ/iI4FXbWKGfT0kuHCTFcbW4
-  yp6EfhSC ezhv4yIGdFjbzCG4Jx8p/DpWLqSd0ric6klJQk5SW+iRHaWVwdQWUxlNwI2OM5OOR
-  +FULjS33Isc MrIEz+NaDwzyNCAjhERUc9dhbqTn9aIiI/tQWUyCNwkTA8eWec/Wmqkk+ZMuTk
-  m+eV21tbRfO5if vE+0bFaMNMp5PTGcD6VDsZ7uNFDlmfn25rTktRJM8M0iwsiliTnsQapSNBL
-  f4EjxIkvX269q6ozT 2KxKp001De26RIYdt5ttiJWCMQ4HDL3I+lQLDLuj4LKEIGO4PNSnzRLN
-  dW6uI5C4HooPUfrTreZx ClrIishkDBioyBjpReSRzVJzilJw5l1t/Vjoo2WFZRNDLPIpJZkOO
-  x6/n+lKl0o05UDI7FSU3ruK jo2ffuKWJZYZYxZzQ3SKGQsFz19c9T6VGVZd7CDJztI9Mfxf7o
-  7+tedaLev9f5HqNUue+7Xz/P8A yKH2OST7ivLtycqDg46896kTYSoEcqpySmeT7j8K1bKFbV5
-  TvYxk5jyc8Y+99O1QxNH5m8XEO7lm JQ/MMcAenvVus232O7629Woad7bfqjPe4VYY1w6AnCZP
-  3u/6VE5jlvYIbeKaWQuwMitx0yrU/Y82 9vK+8+MkfdOMkD3p6Ru/ARP3hVSduBnoBWqskP2F6
-  XxKPX/h9dRi21wumZEE6qhA+fPOTkkflQyc tIJI2ZgXUqvKhuMVrS6eVmERkJEX7uUjpuHIx9
-  adDHYpFlGIlSI7AxzvB5NZe3W61MqfIkuV3+Vv zbKAhaWz852RCZTuGOd2PlUemetNRFmkPnS
-  eSzjIdhwQBz071opa7cyAbWaQDY38Bxnn37/SorSI PMkcEYkVshsjdgnkip9qrPUKUlaT9orL
-  5fduZMgMssWJgwALAAHAz1qytuHcRI5MahpA56YyOTV4 2U6sFW1Ko7MyuBwoA5H41FBE8a7wj
-  hFAzuPO09vzq/aprRmsOSUHyavpbo+4WvmQC58qS2mgaQfv dgKg54HIyAfStBLRDqrH7JOCJN
-  rMCNoUjP8An61YOnXMt0IRAURiTKw4UPj5f0qUtFbW0c3mkSCN g6s2S2RgfpXHOtzP3d2cc5q
-  o/Zp+8+3+dyGOO1kvmtYLaZI2/eKQ/G0DJNPjt3EZuVlDSvEDAjdR HnBz60skUz2hiSRAY22L
-  tHKpjJU+pzTxCstrD5LFInjY8nJTkArn261m5ab/ANf8E6acvZpWdk9G nr+ZYjdbaOCNmkkR1
-  aRcN+hPtUd3fGaZY7VsNu3SHqrYHBotrNBqcoecRbJESOR+VAPUEepp89s0 GsRfKixO+zdjv2
-  /Lv9az9zn8zVKhGo03dpXSWiKpu4pLCWafMkjMCyLxliOCPQVG0s0dpiQGCdDg hhnb7H1LZ6+
-  lTysgvxE1v5hRC6hfp0I71nG5ma8C26b5ePkZd3AGST64reEU+nmelCFoNyVra2bW v+ROZLgX
-  MjxvEpEnOV4YnoR7CmXksL3scEXmLsbYCzZDZHB/nzVy2e4XEpiDo0ZwwUYXJyQff0qm BBMI5
-  VIgwmArDJOD14pxaUttjlnyufa+3LqWx9qh2Rf6xHKEt/eCnPH4VoSXCxXUoEc6QOzNlnyR 3H
-  Ppms4AgQRxP5mCrq/93HQH69fpV6G2mbUpI3zKjNwR/Gx4JHsPSueoo7s55UotynK2i9H+JLNa
-  pcS6fiWNoxExkBHEpxwV9ADWnDZW4s08vdFIIh5ivyAMYPHrWMj6p9sWWONYUkUvGjqDtUHbnp
-  07 1agsbydSJxPGwIThsBsd/wAa56iaSTnoJRcbRdXTfT+kTSQQ/YvJjkKW6jaJHOccZHP51It
-  y7Jh8 iSR02g9G3DHH0qF90sgtzNFCHbeA4zn2H5VdunumUvBHGjRnKhkBJPHSs30TO2jKo4KE
-  bX6Xdvns UpftaxwWqymQRwlmQ5JXB+YGsZjapcQyvDcRxyFWQq/3B3B+tbRe2iCefcDznYZwc
-  bs/0NVJoLFp mDzbreL5AFODnGR+Z6V0UpW0aOuE1GMoyjb0X5bDnezyrBXdVVmZN/K4OFz9Ot
-  VJnH2yIMJ5AsJM rI+N7HoPxHSp5bsKVMcaNM8ZkPHB4/lWU6B7kvLdxRK4UHk8Ajn8q0pQ6s5
-  KdKKg5u67Xd39yHyQ TxQWrW8MytJ/rGLD5WB4PsKkiu7d7j7Net5tugJEkfB3AfLg+h9Kg+e2
-  tt73a3MI+RyufmZjxj8K bPEILxEGyVYlAbaMZx3/ABrdJS0ZFKopR/ePbZrf7/8AMkSSBUR4h
-  Ise07gWyQT3NSiaTbAITBLN 5LD5ExvP/wCqiO7T+0vLlEUapDLtAQABiOM+tQRW3kadHcQybn
-  ZR8vfjHI/Ok0upM5xhpb06/wCQ k0MyMjq0EXG5mKZx/wDXOahkVSWhsYMSiTMRx95F9fU5zQR
-  fQSCCQ+YVBK/KD781FDZ33l+aI5F4 YhvYDkVqkrXbRqqa5b1JJN7Wf5rqbNhCqvLdX0yW4zsb
-  K4y38B47VlmW1ktlaRvtjq5wYiU5z93n 1q8siR6DA6p5zDHnBju+Y42j8R0qoklsbM5gWJ496
-  IwGA248Hp1FZQT5m3f+vxOWjGpXq3ld306J fduR3MsX2TDhI5pGDbMYKEev17UksU/lykmLNw
-  N5A6qV5btxioZUNvPChKOpQhWxncM849/etdl0 2f7NbJM6LIS5YsSenC/U1rJ8iVtjtrupQgu
-  TVd0k7HNSNE3lFElBYMwYNwoPH9K2IYX/ALOuUlgA Pmr+8AGY/UZ9D1xWhaWtlFp6+XPFG+4M
-  vmnJPoKjF9b272UkmXBiYTYPDMCeMetTOu5aRW3/AA55 31icpJxhd+e/4/8ABKcDPBOtz5c21
-  GA68NjIP5549K0Q7XVwqySLC0swXBHzFtuV5/n61Etw7okk M0LRoNgiK5O7OT+dRRy+bqMcty
-  6w7ZVZVxjnJx0qJJyu7am1bmqRlVWkkun5WLkENpcyRI/mwZfM yq2CWPQD0HtVojT1iW3Nyok
-  3CRy55BXp+GOKQ3FnJLJvI+0vJn5eNvzfrxmq8UUMetXW+VIVWb5f MG7dwSPwrmd3e91Y5XBy
-  fM1LTp1v/XkP1I28sLNB5iDEjDL8YYA/l/jVeBUazjEV5BGpj3kOu7y2 B4Qn3OaWK1tWhQzzG
-  QeWNwVsdG4/StV4Izdp5Nvtt0RhIMDOTz+lN1FGKj2O5csaai09Nf6v/wAA iLw3FjKZ5IiJSZ
-  AkY2lZOyfXjis1YruCWFJZo4z5DPJ567xGQeQffpWnHst7ASwQm8uVKxIV+64b knHr6HtUBkj
-  eKJ79SvkwmNU7shbkn1IpU5NXSWn9dDKivdajDT5X+4UTi4sXjSTzD5uAyt94dd34 d6zgt3Nc
-  h1n2xuoYGQk84p4FtHE7RhobJpdsTMeoPv8A561KtzYTT7lL7zJsgTfjKnqfwx+VWly3 5UcU5
-  uCbjt3texEYI59IneJnL5CmTccOc/LUstrLb2zol64mllJKsxJ4A/TtVuRryN2jIidAyliq YB
-  brkegqbzWuZ5VIQs0jYbb1XjJHoKzdSS9DzcRiK0ElGWi1/r/IQDybKaVCzsx2qM5CqRjp61mN
-  p1uWiX7Yw8iFlPzngjBA/Gt2K3DObUP5bZZstzuCjlh7VB58clgrHy8SHc5C92GP5VnTrSi7xZ
-  zx xtWPurV/13RTSVDv3xtgkGfn+NuRj0AHUVox28kkcSYUMbeXqPu7e/0PpWWl0rytawotxuc
-  bivVS B1+mBUYtGW9h86eSOCQFkBcguvRiD6VU4edhzhzTT+Hl1tvclhsYJ7a2aZWYKoZGU42B
-  hgA/zqGC 2uLTyh88ttvKyEnOWIOOvr2psFxC0zRafcCNgQEEmWAC5wD+taSu11bRpcN5CMQQR
-  xs7Kp9STVzn OOj27Fz54NX+5p3/AAI547f+ybOQ2t0ZGg37RJySvC/iKiu0uX0qNoF2zDBkBG
-  S+D1HoKmNy6acI GUCXcpYMOjE4yPRfatW4kWRIA6BmS3dJzHwNxIxWPtJRa0vqTCdWHI3G+vm
-  9PO/QxozJHcySXMO1 SWymANxGMEegFQzJLN+9SO5S4L7Qd/G36dsmpQWuPMjmkWRWxKu3g4x/
-  I4qyVuis0ovbZAW4Taej Dkf19q05uV36luElNyej/roVioe2AUrbXBlDCKUZMij+MY7AVGsar
-  MxDvEsyFkmckrg9h6Z/rWi2 nXCabJFHjyovlSRlyVJwApPqajiihMslpdB43J3MWPAK9VHpx2
-  qVUVtHc5rRgubmv5X/AKv6HOrD LHJGd0UNsnlj51yfmBHWqsFkvleXH50siy7XMb4A2tyPoRX
-  YyW1iZxGzGVZlDhA3Me052H3rDl0u 7N5G9gsjrL+/YZztC/wn3NdNPFKV9bf1/wAObTxUHzJe
-  7deiOXuYrd9akZFZrUBypJyW9D9M1XIj /wBHdTLcKIyJdrEbH/HsRWx5MCXMUTXUeAGEJVfvL
-  yT/AFFLbRRR3RWK6gLcuQUzgqO/rXo+2SR1 1J03CLT97qulvWxVtQG0iGWCWMx+YyTlueB9xR
-  6HBp94k8iaYosZWLQFGMQxnH8Rq4Z0h0qNE+zy 5bMaIuCFPUH1J5we1QRXFu8Rmj89XTPlKZN
-  2E7/lWalK/Nb+vwOLD08To46a9X/TQQWs8GnpdR3S 8qUdG/vZ5FZptoVuIlMjmRVDPg8eZn5R
-  +XatWJ9Rlt0DeT9mYhg4QYw3JX/ePrVOeCC1MMyMW3vv VS3JX1zVwk+ZpvXyOiKqTj7ObXM9r
-  fkyvI9xBqVx5iDzBMFbeuduO35dqpMVcvLtYj+FUAB29d3I qwytOymabLq6KBnllPLE/QdzU6
-  pYvcXBG7yon2RsW4K//XrdNRW2prVcabsrp9bLf+vIwS0gjVd6 hd7sx7EEDA/SrME86P8AIgV
-  iMfdB2fXIpzAb3aOARxsC2G56f/XqCU2yGMs7NyG2huWbNdN1JWsY xpclOdlpvZu977nV+ey/
-  vjCbeRWw644OeCMeuMU1LZpXUyXUaoke1m59eB9TULGaZTLJDIY2kfJH GOBkH9KsW2nwskZkn
-  8tZIi4BP3mB4/AV5ztGN9vxPYp07U+fl+e6foxxt44Y7m3hguUkeUMUkfJQ D7yn86pysn2ZY0
-  2sm3ggdw3StMhRCnmXQllizuYA4Oefx9KgaQKqzC1ISZc4OOcnGR6AH9amEn1/ r7yqClF+/dJ
-  bX/4IkbCOe5SaNoUaQMofqBnn9KdcRRhVS3vIZ0dtyRqp3DBqWG1Z7g26ROAhMcnm HJDt/hir
-  C2lmtr5UxaN1kwWz+QqJTipXKqOmqi017KzX9fMyY5JItzqsqSyTfNubgHnK49T2qdLC Z75o/
-  KcquUAAGV2jp+HetARRRlEuNsaBC0bHtzxn1I9aoXSXcCQkM6IhaOVgf9YzcnH6VUajb93Q Kc
-  p0pXste/6alo+QLCOOC6UOpG5mBwM/1NPtxE5lMit5MV0kYKNg57UyO032FqwiZ1TdgL1ODzk9
-  8fpTpd0V2LqFGW3Me5Q3Ic4xn8DWWjukxQhOrTkqctXfdobPdXIubl1LCUXB8tQM7lI+bA9OlN
-  gQ vBgAh1mX5Tz8uM5PtxSCCK50yCaORmuIyqRop5zz19STz9BVh/OsQXiCh5lBfK5OQcZHsc0
-  9EuVb m1Kh7vJ7ql6b+r7F+Nbi41WKQMxWWIzvsOArAYIP86ovGZLWFEdJCrRh37A9vzqSNY44
-  5LjModJF hChsde35VcNoq6vMbe0n2Rt5TEtkMSRj8RXPzKL/AK/rqcdVRUpS5tvS1/1KUpeyu
-  yLcGbe7Z74P /wBfNbUy202gBEXaXdXjQH5sAgH86yJYb2wV38vlZdh3DOxs4Cn3INXY72eG8u
-  FdoGaORYV+ToG/ z+dRUi5JSjrb8S3S5oxmkm12/UqTacvn3X2iYv8AvWYIpweB15plrF51t5K
-  M9u0jCZTM24v6sPYY 5q1LcGaSaORhJGjlXCDBBPyqCf1qhJPqfkJbJCryoTHKQnOTyNvoMdq1
-  i5yjZs6I1JWSlq/w/wAi pJBKwlVJBJhhIze3QCh42guy8wZZWUqxBxtbGT/hTZYHHm+ZIseJA
-  oUn+8Pl/LmtNU+xOIgyzMbZ pGLc5YHtmt5Tsl1O6eIaS5NfJ9f0sZ6xyywRP88Q2qPLz90dCx
-  /GpJY8vFbBg/kxhCyj7xJzxx3F IuoTDMgjX5Gx0zjcclT71bSaI3SGSJ5ZDKCY1O1gV6H6c0p
-  Oad2jnnOtGSlOndLVa9flYpKftF4E UNHC2CyA8kdCwOOgrZP2y0nKQSJPHEjCNgPvA/eaoolH
-  9qecAsK7hjI/hwcj86jkWGSBHlEySu2A Q/ypkYAP161jKXM0un3i5ozq6r3X87f18x7yyT6dJ
-  P8APGhQqi7uQuRmtWG6jjtXlR3ZhIDMNxON y8/TFZsyvYwxqtxGfs4MWCvXuDj9KjjSaWSONf
-  3jyxSSlV4C4HQ/SspQjKPkdMXGVNc2iTeu34WN CyDfbE8ueKdI7faqheQTnGc9TQ2o3NvJyVe
-  FU+UEfxH/AArIgSTfZyEOiOo3Nnjdnj/CpXmtE8xL mKcPJligbBjOc4P1qnRi5a6m8nQdVqKU
-  o2XTX8CXD3jW80sLzgR+WqxnbuOSQ49h0qC6n8prmJRv 81g+7HA9f/rVZN9eRNE9vD5cQVsbl
-  BwT1qv9pVFtpHmguyImXCJjGDwDnv8A4VUVK+qFOrONT3o8 3az/AKRTgvIxdsXBEewqrE/dUD
-  gH60eXNN5TwvHc4wr7V+6cdDS20PmyvEGgjRW34K9R1Y/QCpFu YY4XELBVBJVQOSc8HP0rd6P
-  3VqYShOVW1Na9nt+S/MSOdfsxhnaM7ZVdV2YLHPX8K0poyUkaYBv3 oRGXjI75/GqqzPvmmkjg
-  lRZUCzKoAX0B/Oo2e7acLHmSSFWDei/XNYyjd6aHLLDSjV9yKsvMfOYD BOwifzFbYwJ5XjnPv
-  UVn5n2CadEcohAiOeCpzkfnV20t02r5sggjnchRIc+YMYz+dKYfsf7h0e4D KC5jOApXp+FL2k
-  UuVGk8VFRcEua3m/8AhiB7G4uGt55LS7CheTu6nufoPSnyQTiITRyB/wB2+zaT gjcAPzodVkn
-  MdxfGNXDSSDJ+V+m3jpx2oQWbWlsod32QjIVyNuW6H370Xlp/kKMKianKPytp+JGI 0uJriJoJ
-  UeNkVgGwN3/1qrhHt4UTyGdJXDsx5Abv+FWJIrtpXhhglUxSBBzySfU9zT3tmguJUnlM NzGxG
-  1+ijAzke1UpdL/I2s2/ea9N7fdr+BC93JLFBJ5EbLFCyA7BkE0QiOSGPcnl8rIHHADDoPp7 Va
-  kM0wjQRo+JMII1xuU9G9wMc1Qe5khnYh4nzvIULkegFOOqskHKnDljDX5/1+BKJIJZDhZJpZ0M
-  gCHG0joPxqOFQlrEZZraIxtsCyLkgNyW/lSB4Y9OUKcpImFVRhg4PBz2HtV57KFrSBZ8xyMuAM
-  85 B5B/CiTS3Oeoocq5m/69V/kZlvagsY3u4Y5Fk+TKn5gvJNMVDPdIFni8uQfIzDgnnA/pWt/
-  Y9tIF WJLkKX3I2/kDPANE1rJBptzIwV44rkFNgxz7HtzT+sRb0e4lmE3VXK7y87aencdHCEtT
-  E0LtKG38 /eIX/CqcTyvdxzzRtsZQ5PYFsjn61Izz2YBk3G7hLQ5J4Ibkkj2BrRSAzpOks0f2b
-  7pVRg8DK8/h mseblTb6mkW2nKfXrbUpLsZo7Jka2BwJC55YL6Gp7lk8mFIZjEs4MsgZsnOMCr
-  o09pNl07G5GcAx 8csOn14qxHYSpdwiJ4bciMszzpu2kgjb9fSsXWhe9yY1YSd3K/L5/wDDlBY
-  Z5EMsz/Z4QAPMHCo/ YfWopJFYsH2tkEmU8qB0K4+vFb9pbpILVJp4ii2jq/oDnIz7+9ZDrbWt
-  v9r86J0kZXRPRQMAfXPN RGqpSsTUnRrVLNO/TRpf16/cZgR28xoGGwrmONlzgjgjHrUFsY/7N
-  kuJNqyLdRgR4wyZ6j8e1XpV sp51tjMyTPIrK4PGf7v49qfEl8k7JPBGQWbJ8sAZ7fjXVz+7qZ
-  1qXuNSirrdbO3r1BHaW4vGTckS TKrlj91ieAamFmWBhRnm2EqZIzjeq8kj2rOkR7cXEW9UIkB
-  mLDhmA4H1NadtfTJAgkKJbylWJK8s xB4B7D2rKpGSV4nJisNVjS54Ky83+Xcc9pmMsPPAbLJ8
-  5zt7nPpVtLCOK4ciOQxhWIQn7uB/jWDN qL+WI/MHmJMgGD/B/EKtz36Q3HnQrM6P5jBi+R24/
-  nUSpVdF3OCWHxEYqM+o3Z9jVZoE8xvLAfaP vs3BI9uaikSSDT9tk27a5WPzDuKqpA7+pJofU4
-  /tEJnRijQvt2nAG3kVWW7spktWZpOYnaQq2Aec n9a2jCejaOinh5qpFqN/lv5b9CNobiz1CNV
-  8mK7lTKoU546j61dg1NEMSbo5C0LhyE4V88Hn0p01 yktqZhBJ5o5GW6ggZx9KC9v5VswtARty
-  ygANuJ+UE05e8vfWpo6ejq1Y3vp9lbEskkUmlWyR3UT3 L7V3f7p+9+Nab291Lbunn273QmLsE
-  TGOO4+nNc59lmmSRmhdZy4VEHHGecfStbF9BNEjTxSRxrIu FHzEHGGzWNSCVuVmVWF4Rakm09
-  tPxtuiMM8QSQGKVUX5nVcLg5H5YrTtoLY2hQ3UZZXAZM84Xr+h qlC8Zhj80jAAXbjG4A4Y/QG
-  iKAPBcNBcxSqCUBC8t3Y1nU1XY5q9GlK17p9+j8tjbu/LNpJFbziJ GcMN+Tz/AAA+/FZs91cC
-  8t0uvIjmdW3Hy8Yz1/Gie12QIzXAOeAvcn1psTyGYABGZEKjeufcn9Kx pwio9zNYei6Gmthqx
-  piV2Yu7OigIeQDkVjX00sNsypKyyvIrlgxAGO49j6Vsz3Eql3sgiYmViWXI A25C/U1lSi5ur8
-  XEkW1JIWE8W0ZDEcY9MZrqoXveWxjTjUvepJKPbS/3GM6tJPdLCiSThw0WxfzI 9s9qdYi6m1B
-  xcRiJ3bcCUABBBBH41pW9w4s4EneDEEZjDogBfnKnPfNKLiKW3ISeBJHkWSMMOUDD kH6YrslU
-  dmrfM66s+ePJGHz3t9yMq6hiHlGJlA2oIVJ5jXP3W9W96Y6TQ3U8s9p5UXnbAdvABBz+ FX3m0
-  8RP50Es4QbY2jbAZM/epXjmuYJjbRud02/LjI+7/wDWqoza328y+WomubVeen4mbDOFtTEo aS
-  OOZDHGAQxABA/WqEhY3dvAdsPyoR5o3K2CTke1PFjPHpcUhWWJ3XchkP3gOv5npTyInu5XEcoU
-  YMbHoExyPc11pRV2tTR4ai6TdPr89fLZfgWzY2cjG6muI3UxsrpH8pDdmHtisqxjmitlkZ4VZD
-  99 l+V/7px+OPxq3cLHLcwJHMGhZiY0UEHGMDJqrKhjmInSVUQgZDEA4HH50oJ2s3uedChUkn7
-  XV9v+ BomRMn/E4jKTxiZgcRkE7F53A+9Ytu8ciQvHE7jzwgfqI25xnIrTiEswiAbzp9rLiNcE
-  c8A+5qqE tnvIFVGUq3HO0BvU8V207K6ZXs27yjNbbNar+vQ69EfzZYLp1QkhpCeAp5yMe4xVi
-  ya5tdMtQiCN VG4TTKGDDJHH51npzJN5jGSYjDKOCzHPTg9Bip1lkiSKOOTcN6J5bjJ39Mfj1x
-  Xl1INqx7+Nw0ZR Ttp2dkvlrf70X4tPeaGUzMke1xHwuO+cH396jha5SCWMrEVEm1Y9nIBHJHt
-  irV0oIZZ1mSASssrq 2Ar4ABqnpSRrrM0qrJP5J8vy92S+c/N9MVgpNwcmccZynCUpu6jsv+CR
-  LbRxX8TefldpDndyCDgZ PrWhDJG2oIrRmSMMYwndSeASe9JdPY2/2aZVdlH7tOcgqR9/3wahQ
-  tbWyRQ5kKnLS4+8V5yPqDTl JzVy515VlzRur6a2K5Rft4hc8xxYG8ZGz+L8ff2rVMFt5KpEzT
-  7QykhuCeAD+PaqZilvEku4k8mP 7sRPO5cevvVtZLRtJFrLOsCYZgp+8nQqCe5qakr2t8zsrVF
-  OUeWWmzSW36lM3VzDFJGzRl4pkUoF xuGeSPqcVaRAbO4cQSRS5KoHOQxzxgfnUbXVtDBGZDHL
-  NMpaQIOS/wDCR6D2qMzyRQXNuJ1GJV3b 1yV2j/E03FtaKxU6Kk06Ufwf6Fa1NoJVd4J4xjBw+
-  MZ+7+INWrXylupH3M4EmxtxyN204qrc+fKF lDxOFdRIij7wAzxWhYvZrqs2Z0jjdsszAkZZTj
-  FVU+FsiULU5Sjfz3YBGmsxFFGRKoy4bklh3/Kq lrhmPlvOTsBY7+CTnn8K0YI0tIZU+1RyylQ
-  5IJGQvJx9QarxSSSXAmcIttgKsaKASDkdfY4qFLR2 2No3hBqMdPuf/BFFxIsHlqrXYOG9c4HX
-  655zSwm5+02pWEP5sJldccsQfvfQUR+ZNcSolpMm3AVw funHQ8VbAgaye6j8yO4OWUbs4QcEf
-  iOaiTUdLbmNblppQS1l6P8A4Yql2aaOVraRYgmM5A8wHv8A X0NZ6ht8ckU32dZWEhMhJ2gkgZ
-  qxDZJFELh55JogNqKrY+Ugn9M0yRVNtI6sBHHLGiuBkFdvWtYt XsjalSja0Ov3fjdDoLJo3Ju
-  cs+4GIZxuVev9Kp/ZpzPsiLNJtKBGOSB1wfrmrsptiLUO0rJEjRFg /wB71Ye3OKkaWM26xsCY
-  9oLqp+ckcDn3pqc9+4QjiXUb5r/LT/L8iKa1aO4txBG880oO1E7KMbif 6fSnbNt6ELpEspacF
-  uSdowpB9D6VPE98LZpoyEk8xioIyVzxj6E0qRX0EOJo1doMxu5XhQecfmah yfVr+v6Rk+aMru
-  af9ea/IhguS9r5k1zC2844XiNccofc9qpxCB3iaRmuNvEcMZIJHPJ9/wDCtCIx PbbruB2DMPM
-  WIhdj7cAH3pbfy4rRHjtZCIEMZbgnceMf1p8yV7IrDyTbtdv5L/L9B8eoqsTuY1XK kuHAYhxw
-  p+mO1SBVlaO4BaOQx4HOCwK/MfwPNNksLh4YmBhdUQJt2ffIGfzNOlsmlljPlTRYjJkB fgEnh
-  R+FZN0+jsdsoUo2Stfv/Vv1Ik02OBY5ILpZYo/unJwSejfT0pLxmaWMyQ4LfIjEffPQn8Kl W1
-  thPKheSSKOVUCq5BGf8K0oEjkmEZUYRmMbE/d9vqTSlVcXzPU6lUnQleyb726fLr6mCtrMyqsQ
-  eU8MNp4BHX9KtpaRSWTGJlbegJA7Ed/xFbHmmSENGyW8jlclxnkA46etVZZCqzg3EH3FZgq4Mb
-  Lx il7ectNjSOIqVpXpzSt5P8d/zMtkkRI4/IZnijCFl43buao2sSTamsbQecPLO9F6lgD0rqk
-  W2mtA 0kolU4VVj4OV6knuBWBMr7A0A2mSTcSBhk7Ek+hrSlV5rrY4qVf2kpQuvx3/AD/L1Egh
-  zo0weRYw XXMZHzFiM7voKkja1SBPKLzuRhirdTmrtvb2cd5cySyM3ly7FGeNnf8AHnrUdxDap
-  GVs9ysMxg7s 8kZFT7ROVtTGEoqpy6272svw1IkPm3O7y28hXEUS55TOf1pz3rxXS+aUAGWOR9
-  5upH5VFbxyR2qP JMjE7QmB1ycZpJLCaO/YFhiIFCjDJJxwPrVe45WZvHkm3GaWv9biPKsN3I0
-  USSR5OI3AZjkZ3fQC po2m+TMSyW7EPHsXBZQPvA+grQ0+1EdxELi1fyXXMsh7seQo9Owqw1tG
-  JriQxyRuJgjjOAoK/dA7 VjOtFO1jCq4RnyqOvfT9HuVoLW7ju8bTPskUbh3Pb+dPniie9Jt5Y
-  3O10eRzuBHUfj1qS1g1VILw wzRySLPGxbZwxx1HtWc6Bb9JJLmORRG0aCMYABPGfc+tZq8pt3
-  +70MvZSlVclJJ22V7/AD6DLd2n v2mbKR4WIdssehHsMVWubX7E3mN5cx3FmOMhW6FTn6062Js
-  J4mgcMUXZKrDIVycg1PYRwPqEg1CK dwiFDhsDPr9ea6m+VuXT8zun7WLdSWqS7a/iVZl86UeV
-  EwjbcoYDAUgYqxbRytZ28iyLIDEVbIyQ xOB+NbEVrZ2sNvHCZFghDIzu+4OzHO76Crwi8nS4V
-  YxgSHzCVXAADYK/WuWeJVkkjzp43nSjb/P7 ys8LQso3llBEaheoJYYH1zTJGnk1G8hRUbdMpY
-  be685HtxViaS0MkqxOZo/MX5VbB3bsq2fSmXZE TXEiONwlIRh2HXJ9ec1zxb67/wDDHGkoSs3
-  q9romhMEs8clx5LSujOflGMMcAY9T2qL7MhWGAjaV gKMo4IZgc596lgaRdUW5uBHIkgDKqJjH
-  GPy5rQjTzLhUMkYDDCjHzEDOTmspTcXoJy9nJyh0676/ cUxMILRIYInQLtyXwQWA4P4c1TSdn
-  uZlvsw/MH3dAxAPT2reW9AXHkp5DBWUlR05GTWRc284ijkK faFjxG5jGPmB6fiDSpyV2mrXNa
-  Lgm+aOr/r+tTLgk8/U3CuIVnj3srf3iDwPapFht0RYmQzyZTcB 068ED0HeqlwCJhOrxxkxsEX
-  HKDODmtSE+QUJuIEcQsWZlz05/rXbU0Sa/qx7mKpS5VKOqatbX8dD NvYkF+QRGJWJkV1GAxXj
-  j0z2q5bWtzC0zTl/KaYNGp+9gDJ59s1dxc3tspXyc5CBwn8JGWA9+ODU +IntAsjOojhIOW+5u
-  HAPvWUqz5eU86opOHJHfr1+4zZk09beViVaMMI3JOS5bgOPpmufuIpEkFrb q89tAyJKQejD3r
-  pryWb+yUeIQyyFMyAJwxGOnpxXNrLfy226J02GRdwVeTzjmujC3te/3sinBql7 z083/wAAr3q
-  LNJA0YVNx3NIPUnCj9Kr3UTK6W6brkmRzII+MHjcPalNptsRERJ56SFZELZJJbqPQ YotYHi1f
-  E2YmCPh26Adya71ZLR7XM1ShUp817OOvX/h/wEaCGKFraOGZ388s6k7iowMYx2NU4rgQ X6FoR
-  sUsNu3p8v8ALmrhCSQtEiyxyFQDK0hOG6lTxRDp10IZ5FgZQrAAyDPXqPrirjKKi+ZmkaEY 0+
-  Wa19df8v1FsxbmCBmdxJIFI+bgbc7l+pqxIheyjiEgLIMiQdAo5Off0qC0tJFnxBPC7biEGM8H
-  gHp9abIJbYykMrEOEx6gL1+lQ0nPRm1PDSlP3anvdE7/AOQsZ/cxXKzu2Y933iCoJwc1ofaobP
-  TG kjkaR7h96MxyNq8HHsc1TMN6lmit5UhZy8qqmCAOgHoO9KhLwnzot6rGAAF4+Y/LgenHPrU
-  SSlq9 UZKjOrK+um+yv5FqbUvKMvm27FpLhREQQMKACTTrO+ZLy4le1kjJfDLkYGec/wAqz53k
-  dJFmgYkY AYcckZqeAieNPOlVQz49MBeGB9zxSlSgoaowxFKnTu59e2/4HUrMJLWUSeXI8kgMJ
-  UdVC4JHtWRd XHkRRRxlmJj25zzu6Dn8zWBc7AxigklZ41P2dt/ATGSD6k1fS2mGirctMAc7lR
-  uSuR3/ADrCOHjC zb3POU4UeV8y1e1v8i5hcRRAkSpGomdj8rYOCR6VkXEzwaxJJ9oBO5kEXOe
-  V4oK3f9ns81xHOIX2 yGJcbjj19OlVwjw2dtJPIszOm4qB83Odx/DiumnTSb1uY02nPnWt9LXu
-  EyW6WFgziaGRbfy5AzE4 cZPb61bszbyaX5kxEUrsj72+78vBwPyoSa3TS2McJuYVkTzi3zb27
-  EZ6D2qCKySa7bbLHKMsXSMY J56j2q27xak2v6/rc7aNKUqbjUbVu35f8PoX7+8SeKZIkU2yvh
-  3QDqcHA9KLGV5IZZ5C4tyQwI7F eMceo5q1cxzGxePfBsZg2FTB7Y/E4qaGT7FZ3LXSKsTT5ZA
-  uNu7jH4Cubmj7O0V/WhrUajh+SENP W/3eZi3TtLaLNENivbFo0bnCg4/rmqE1shgQXE6IgdeB
-  wSMYrduWG2BbOBpPJ3QM55Vh1Ax71gTw PNPapPN5anBG7sD/AIdK6qErrt+YkvaUbN2t56/dr
-  +YnmpDHIyPDlWZYjt+4meR9c1VJkltfnEig HcxxnlakuIooNyAhgh27gcjcecVSkhlSOWRUkC
-  LN5ZQnkMR3rrhGO5FfDUaLjOc4y9dikHmEbCNA 0gl3NlR3GT+tRiUDaTbuzseCGwE9AfXip1J
-  YyseGBAPbIHBH1qooMbqgyoeYAE89sYrsVjilNU0k r8t32t8kdUlsVuoTFIrsVMgwSSCp4z7V
-  rLJd7fNktlU+YJTlRyQfmI9MVNGIYZVkluLfzIFZBIq4 VgecY9TniqjLci3h8y5iTbuEAI+8u
-  fmz647140p871Or2sK1W84Kz6vS/wB3+RrjbdXL3AIOSef4 BuPcepHQ1mTR/ZEEkUiiV14I6A
-  c8mnGd2sWZZY0CzqsZUYyjHv8A0pzzXCNeQmBrmB5cK6DoD2H4 1jCLT8jehDVtPTte35kqzQX
-  GlqLgxyRYUKFXBHOP1pkd1DaxxIwM7S7nB7Haxz+B6VVd9Si0+YS2 pikZ/nwoAU/T8qkdYY5P
-  MmXIVGTav8DZBCn3NPkXXbyMuSHKnJ6Xen/DbEs89y/lSIvlJIG3KBxu x0Hpjj86gjtjbT2kV
-  yBI6RO0idw/UqffpVNbuGW5SZkkdBjzQrdJD938u9aE8SmCKaVi/l7gxHVn zgNn0yelaOLhaL
-  0Npy5XGHL6f1djkXT8xyurhpommyTxnH8gaqbrIyQId8L7P3nmtnJ681cgtylk rzj513QyA9m
-  J4x6Ais+aeaeaWHy0iRiWO5Bk9Mc/hRDWTs9vM2oSUnzRbSXX+ty3Pp7SqsxVzIso jmVCOWPO
-  R6ACoBZzRSLcW+4mKfayOufM54K+2KlijvWe6ltyZMlgWB43Y5wPX0psEdzdaLApdonY EgN1I
-  U9aalJLWSsYutPmSdVcr6FgzzedGtzayMLdtrquAy5Ock+gFWpbotcyLA0LpEJN4Vfv4+bc PQ
-  Cqcs7z2NwVkUtJMrbMfNntzWmjKkJk3RGV2Ln5OhPG0/XmsJxSSbRdWlTjFT3v0u1+g2W5uJ7M
-  +eq2cciBmlIAVm4wRjt2/GsqQSR3LIgkdWbEqqeYx6VekkkUvHLPAkQO2NWTqfUe2eKpWN3Mmb
-  kj lNsUgYZwxyOfenTi1FtImkmqbjHTy/4O5enjJZ45InMaodgQ42AkZU+pqaC2jjm2CN2gydk
-  TEEhT 0z+NZzieHUVXLeWu5CzfxIR1+ue9ajR3I05fLXdK7AiMctEq8EN6+tRO6SV9zplSbik9
-  O3b79RiI 091ZRmHASB1AI68/MTSzwwErLaRSxXEKlnWQ5BLDjj9auLcTW86yybIpnZkJdchi3
-  TA7ZrR+1JHY sWWMTMMsuAMkYCiueVWSaaRlKq1OL5fknb7+5k2EktqC0xTy3ljxuHscD+tRTX
-  d08hjSNsl0EvHD FuSfyrQkiZ70htsbZLbSPvFeQw9h0rHnE0kUEsQa2kYiYmQ/eG7g/QVUOWc
-  rtDTjOUpWV+/b9S1e 2rnT5vtUUkSrJ+67ZQYzn1PvVV3IsZBHG7xKwOFPOAQeT61YlZ/LnLah
-  FLILjLA52gDoMe5p6wRz 2Db5lilcgynsrD+H6mqjKyXN+peFa5V7V6X81+DLVvHFDdTXCOVDh
-  xtds8tjBH0pzXsLWht5JoVu o8KzEYDH+8PbFTzuscSQMgcxp1AwAvGQfU+9VGa3m1a6FsiCNp
-  N29hnA24Fc8fe1ZpTpSm+aSbt9 35CNawy6a5jcKZpRJI+eFI4K/U0lrFFDujTeu5SGLN/Gen6
-  UsM/kwKqWsv2lwHZnOUGD8xxVu7jR 1JVJJELFS0ZwNxI5/pVuT+F7Hou7ioN2+f6f8H5EFvCp
-  W2XzQsW0Nk99ucVaWN5pJDJCiGRlO8qM L8pyD6msiWXy2ZYZAkkZA2NyV7MPrVyOWZfPLMSIp
-  ECj0OO9KcJPUzqwrOL2+4pzz2tvIVKSIykK hDYByOf8aRgrDG4FdodGUcNtHH5mtNprI7S0Ik
-  kdPMjPXCg4OfU1H5cCXieQVEKIwjY8hkB4P5mq VTTZnEppL4NvPcrxNehIpZXt4WX92WaPhj1
-  z/SoGs70xx3KyxS4AyEX7rBsAH3NWJnuY7xZCnmoI 3RgBwG4yfwFSRqbgHdDLBChKMd+A/fIp
-  8zjroOFWUW2rfd+BTdCxuJLf5JxcFIg/TB4PHsc1OGuI IQ1yBNtc5KjmQgfKwPpTzaW7Lvkkd
-  pXBkYK2CGX0/PFNvINwaVp/KcltwOSFJHTAo5lJpHVGPtOW Mne/lr6dyT7QPsCXE1vPGZXRkZ
-  m+UBe+KmeSO43TAMZCxdQD9854bHpnis37ZdR2Sh4lmIdCrhfk K9CMe5qSVriWNo2spIY/NVV
-  wRkDOSKHSs/8AghUw8IRTqaa9/wBN/wATShvN9rcK6skr3AcDONoz jafcnpVRUabUlSeAr958
-  jgAZ+Zfr3HpUEccaXL/aIp4l3n5WfkAg4P4VU+yqpRFuDCxUMA75Jx94 frmiNOKvZi+r05J8r
-  aXn+mv5izI04k27VgKAmQD7zZ+U/j0odbopbSy3lujPCxddmDt3YYdOvvUr xRpZKFl8obtrK5
-  z8x+6PwrTginuojJdQlvIfYuBjjow+prR1FFX6HVGr+6TWy6dfxLtoQ8c8X2eT 7OkyeSx9O4P
-  qfeprmNpLxljjkjWM7cOchQT90+5I602SZ4QzbGti6kFW/hHcmrlu9r5EihyAWDBm OThTwf61
-  5km0+ZI82cb+9GNr+v8AwSsjW7xKrPGyhz5aIMMFByQfU+h7VBHpc8eru0dxHLZyOZEB GTtUe
-  vv/AErQC3GLmQJEYmkykioMHI5xUNtdS24hi8yJkRSACvKg+tSpySfKcSlVgpcuvf8A4HZ/ Iz
-  3sofNtpGlYxmDLqGOck4XHpWqQ8MUv2dhIS5IBGSoA6VmNcSPJKlvbmWEbTkAdc9KlN1eTSNLH
-  H5cu04GODu4PFaTjN2uzqrUas3FSlp6qxpwSvI4Wd4drRMyoqYPHU/TNF2sc9rCXmEbOvmSkHA
-  3q OMCoYpDECJ4jE8b+XHuPJTbV+Kc3S26SCPCxkAhcY9j7nFcsouL5lscqoTTvHZHNCKMooME
-  ql2LO XIO1gM49quNaQTWSTw/61lO5Sc85A/KpL+5jgjiT7LNcJMPMZozjcemR7Y4pbeGO2mmd
-  ILhTFMUj DyZGGGTn8a6nKXKpHe4SVPnWj/P8b/gEsSy21xAW8opdGPepwDwCuKx3EFpcPDNI6
-  CYhiznofT8q 1kHnRndIibdo6cZHc1HJN9uecS+SUaQFDtGFGOR9cinSk1p0NMLGFNuC1XXXVG
-  UjTzvPBaspjiKq X25Bb2qi9p5UYt0mCxKrHaoOTg7uv6VrhJoZWeFQ2VLsij72Bzj6ViPE8ln
-  5aiTMLADD8vH1Jrsp yu9NEOrDnqe7FL03+exERCZVu1czcFGjB5y3IJ+hqfylluXdgyxRYTzT
-  yGJ5J+lQ2lpH5zXMtzGk RdQuc/Nuzg/hSSSxQ3JktbpWicFgCchmXjj866Hq7RZHs4qbhGV2+
-  rv/AF+ZJILf7SjxSLKm1o3d eiEDof8Aa96iS4nuZbdSxiTYAE/vAn5vxz3q3BePFgxRRu543b
-  fllJOCwHpiohcyGVEW2zFuCJtA znnHNSr9UDpTjFxdr921+H/DlGCxVbi6E0rwx27vlsnnnGK
-  c88aSRTiHzI1j2qpGdxI7+pAqw0N0 IpYxbSZZjLIzHIBTsfrUbpujhuVjK+Y6FUx93J+Wtea7
-  u2b/AFeDSd/x0/r5kSNBLbRx/Z7rzEQq H8zO7v3FSxzTK9qIpYtz25Z0KZbIGdv5cita68spc
-  KIDGiSq0kx4USDgL7fSpY7ONIZLiUokxLsr Y+Xb04H6Vi68bar9Tjq4hNezcbLp1/H/ACOUMk
-  LF0McksKjEJDc7cZyT3piQGGO2mjk/cmPzJmxk K5zgfiK2IraBr6KQvHHaNAAueoPZT7ms9ra
-  K1tJo23AvMHkjLcgg/d/CuqNWL0RTdNz9lDVf1tcv wS21vZtLIY8TyLhyPuqO361QnfL2Yhcl
-  fIkJzyCVOB/Om3TRXcSBW3K8YCp6MTx/I1SVolZISxQC N1aUscHBzwO1KnS+11PIjl6hLmb6/
-  wBdmagF3KgiSMQxMS0e5c547/Ssk3l4t5AMQSBLchMx5BBH NaNtcJ9lZ3nWSE4MajIOAefzrO
-  iWWK4SR4XKgMoyc/N/hz0q6Ss2mkY4WlBVXF2t06a/PU1bCVfs QlaSJi0iK7BPlj/ugj1P9K1
-  ZYIbi4SNJovNicmIxjb5qLyT7jPrWJBNFFZkeZG7W7hCQuAQPUdzz 1rpDOv2bzYZYJFiKoSq8
-  juR+NcuITUrouvRlF7t32v8A52KsmosWeQwqULBlPGNp6j61UWSG5SdJ pUw5fqc8Yzj68VOLy
-  T7S7xpDGrqzr5iZDJ3I9MHg0wWc19bQrcyQRzCMsDGu3GDkqfU4xUxUYrXQ 6aapQa5vdfe//A
-  /UZAtumnyyW7MqvIsgBbOzj7p9zUEtrbzxu2HkllK7kDcqWPT24zUsL28jQlIJ STGfM+bhSTk
-  DHrxVi7zbTlkhIjfDD5uQFP8A9c1fM1PTccm1L3b3/MxbpbizkzDHHIj3BJUqDtbG Bn+dUpIJ
-  YLaWQyorMweTcM/MOnY8nrWkZJbWZZfNRhjzkjcZJAJH8jVR57O709AxaAq2JWz94kHa foK6o
-  OStpocEsP7KSm43T3dr/gc9crbgL8yKwQDk9fr7mqgjWBZlIyBNk4PtzjjiraqstpLK6bTH KA
-  QcEk9M9OlV1imS7BWFikZy4c/qa9WLsmrl4qUXeUUrLa17/wDAOhS3idrkROWiVxtYEkYx9PWr
-  X76ZImeVJV2NIVHDe/bip5kWSKFrGSKS3ZGxtTOecdxTzb21rpjSeaY7xNqKrHOVyNxxXmOpdL
-  v/ AEj2VOM6NN21u/Pv5XXqT/Z4r3S4HRXiR2yuT1wMAfnTIEjWRPtNpd206Sqkm+T5ckHAx65
-  rVilS a5dFjK2aTO7ODgZHQD0HtWJqCi5htsSMJJdshwenYA+/vXJTk5Plei/I8K85N05PS+//
-  AAb/AJml HLMk91ujIlR9knmjI3EZHHtVFoVluoVkP7lwfPfP3ZAMqPxqovlSPKDK9xlT5SKfm
-  LN6+uKvwyQW liqG1uHR49wkL4Dkdx+NaOHJtuegsBOLUqT956WVv1ZVaW28i38qLY+3bMM9WP
-  U/hxTGtpDFKEn2 Iku0yMcqVxk8fWpzfxNaR+TAsOSnzNzkscGnPLK32y3NnO7gtsVT/D0JP0q
-  1zJ7EUlUhO0rr5jJm uLZpJAj3KSyqUYH5Qdveqtuw3Ol+6KisAQPvMcEjB7dKfarC58ss8LjD
-  RSO+VwMgnHua0T5uIoo7 ZZJYsDO0cHHOfU9vxoclHTr9xq26TcW/efy/HYLWZrlZhBiLePMVs
-  cLkfMD6nikiGYo7gMDH5REc SnDEHjP5k1HFfvLeQSyRi0gVDHtK/wB8kfpTbuxmmkhCo7xJhE
-  MZxwO9ZctpWehjFxpNptL+u/8A wRIbG6MqxG1mhEaFXY/xMORV7SxdW0EqSRF98yy+WR8xJBy
-  QfQelJDPMFkR4pogTtDs+QST1/lVK ZRbXFtLcSSblRl++QGcHkfkaG5TvF/1+JT/2jSdr9P6u
-  aEnzTQ7UCyJC8RmZco2DuLY/SqSQKsfm WQaSVnJXccjGe47kc06K5dZhcX0TvG5DeWnGMcMPy
-  waksJY5dQwgEEQlLgscjOCFH09qVpRi/L7j aFOvCLVk4rd9PTq2W4kuPtL74SY3wVfHAIOAP8
-  afLcXsQe4VPNLviUovRs4A9qtQzvDb2gkIklEB 2qB1HJb8fenpqdrJFbspCRSr5nPYqcCuVyl
-  e/Lf+v+AU61Tm5uXTyJD54M6ytC3lybfucqQQSfwz RPLK80uQgWONozIVGCx5zj6Uyb7MZLlo
-  JDKJL1fM+bOHHQfjVq5vHgtC/wBncu7FipUcnpWPVWWv 3DpzfMmrO/TRW+8pvJE+nRvKHcfZ8
-  4DbWfoAQewqhNNcxDy4YTIF+UbhnIzyw9h3qaS6uy7pGIuQ BsMeTgc8ela0cSzzM5jc5YlwP7
-  uM8egz1rS6p6tXHUgqfxK9+n9aBaWVv5k7GLzlUlUcdJVB+Vx9 ecVcT7Mt0ITblRJHuweoxnm
-  pEgRYbe4wzDyP3m1sB+eCPQe1WDPFJamKKFt/mNnJyRnGPwrgnUcn 3PLnV5p3SuVv9FaCAvE5
-  +T52zkEnnH9Kom3RXXZbyKBGfMjBG5DnOD9KsraSnWopI5VEPll2BHCl e31q39pkkmW5ZFMTK
-  wIC9WPb8TTUuV+67nVGXsp2i2/M5mC2aW+mwWI3bkTPO3vWza27PNOyzKFM 65UjO4kdR7AVY8
-  6B7u0aTbDstnjePock8k/Sr08scWnOPNgMaDYsqDAYsBz+PQVVWvOVlbc66let Oy2v3X5abmN
-  NCdrPMiXAlPm5iXBCrwxPt3pqxzM8pBjWJ5FBbb98spwR+lIryqsizXturyEMkeOY x0Kmo4Hu
-  ZvLjjZRIqcKRnvyPqAK0s7FTjUS7tddkhs2ltBpA+0TIo8xVQnIPbP4UwRLE26FWuIw2 GZTxk
-  HgfjUbSPNeQFXaZvL3pk5UYORkGnia7hiWVpYHdgIwipw248vWiU7avUuMJxjac1d/L9P1L hJ
-  DpI0J80Psk5+UsevH0qA3EM4ZEtppoQwSNo3xjjv6mrsYSUtCt1DJIkiqzgcO2cAj8MiojLEru
-  LNDglh6hecY+uM1imr2tqYuUIVLPf56GRskMikSBlBRDgc4P3m+lW5IofPWNLa4uY5d8keHyCA
-  cL +dF2YUQhd8RiiKKCfugjjPqafGzC2i8wNskw0YU4yE9Pqa6HJtJ/1/XU76kuSKneze3T8v8
-  AMy4I HjkmsGhneUKTjd90jt/WiyEkK7r5njVxvJYnHcZ/lTb67vWuDdeQ8UUoYqcgHAAB5+tW
-  bcSJbtdS zQsPLKiNhk5BFdEnLku+v5ndOpJ0730fTe79dbfcLFfLIzSxhXjT5UDc/eHU+vNVj
-  cSmfa0lvMI1 2nan8RHBHHTtSKY7uSeGYpA7EkMi7VA69B6GrL2MCWMsjh0MjAvLu+VSeSMe+O
-  Km1OL1WpjH2EZJ TXvPyX/A/AzUWzaxjlh3mdm3bGbOzPAU8dfetlPMjs1DXCgRnbK2ThzwQR/
-  KjTbRYZWmdR5ckqSJ nogAPyn3FRy2NwLxXhmAKYJLDKvzzx9DSqVIyly3HXrqS9k3dLW7tf0v
-  5fMvvtvrq6kmnVVSTZGT 0Klen51Zt43kntRNGwLxlpQBjaQpB/AHH51lzSWa/wDLUSyqGEZQ4
-  G0EZB9W9DWnAtvA8k0XnhGy V3Pu9MD/ABrkqK0fyPOxMWqVrvXb19ehBsd47Yq0hRYQow2Bub
-  jNPQl7x4nXyGVRtZ+c461LcP5d vKDHJGuVeJ88bVOSPeny6fmae9SUSjcVDA8epI9qjnVtTOD
-  hHSW729fkTzf6FaFlCFuhIHTnJX64 70W4jw0pwskThGTPIJ6H8jSP5aWocXMUgB29M7icfNz2
-  p7wbtQQgNcbFIdYuCGHTPrxzWKempnCE akL7W666+WqJhMSssZ2OQ6lGPPANSPKRbuPMiHmfO
-  WC42lT938azYS0gQnbEDAWkdhw2T1FXH+w/ YZD5hKyN50eG+8FHy4+pqZQSZ1SioOLStf8Ar0
-  K017KJPO8geVEAhXH3R1xVhVluWX7RGwjdgz4O CpXufYcZrGaRRbiZriL5tplXHQt1P4VoQXs
-  sUyxxEeVENg387s9K1nSaj7qKrUajheO/4f5El3Dt VHBG9Q0bleFZ2xgj+VZPkJbm4nud+2OQ
-  RuqsRt68fU1dlmil3iSKaF3YSmTf8oAGNuPU+tVry9jF k0qrneA0isc4f0+taUudJR7jpzlC0
-  Hd839b3IDdwR2iraXC+YWG4P8xGRyPyqvEbeJ4zI4RPn2lu SVIwaagt7qEGK3kSSRW3ZP8Aqy
-  TkZ/n9KpRXzs8CPEt4FQjfEMAnJOefpXVGlo7fMyq4eN2438+9 vUW53w2UfmhZYQyD5FwVOOh
-  9+lVbtPPs9oEcLRO3mLjld3JrWVpZURoYtxjDFiVyuT2x6nt6U5Ve ZSssAgUx/vC4+9Ifu1pC
-  py2b6f1sFCm5csnDZ91+Wv4FO0lkP2VXgLb38zCjBYA4wPTHepLu2kij gMsn7ndIHK8YPUH8e
-  gqMTC1dI5UfzfNUO3/PItzj8qY0t3Hqn2lIpJYd4yjcg844p8rcrrQ2UHOq 27Ra1t39GyeOcm
-  2lHzI4uN7BznjHSrEt9bHTohKoDbQItoxxnk/h0qa6aKG4LDYYEYxbx2PUZ9fe sc3MDCRZGjd
-  5JF8jAwGx1I9s9qiMVPWw4uEoqXLZL8zQdI557p0JCGZQqs3bb/MUskz2LGUt50Yj 2FevIxx+
-  tRRPFdGVlina53kgxnClj0IHpxUM7XE0GZrWR5SNshU4G8cjj3AoUbuz2FKLqe7KVl2/ pjEu7
-  c3XmpbTJlsIHbKsDxkD2NYz2TmeYtdR/upk80nPLHIJ+ladzZRTzI0YkjGd+C33EH8P1PrV SS
-  BHtZ3Ln95IHIzjO3Oa66TivhZxR5HUcU3d6bf53IpbB1uYYUBlUgHzE4A2nj8+aoKlu08quJEh
-  MxdVJ5GOhz6Gr/2KYQLMPPMTAMpD9CORz6YrMuMpcyTtufcu4lRwpbtXTSfNpzGcaaqzbdS6Xb
-  Rk DLEsyqN0rvtKqnGWJ/kOla1zqEaSToskasrOrgjq2BjH+e1YQh3XrEllKOwVc4YbR8p/E1a
-  eKSaB ZWCsWctK5GAGx0rapCLauY1pxqVouT08/wCtSxZvBJd2ql0KgFWXH+szncTV1PNKyeQ2
-  2MREyoeS GHGfyrIitXe8hd5UiD5ZXxhffFXY2FrGro/zAb2JORJ82Dj2rOpFX0dzedOTk2nfT
-  b+tP1OgWT/i UZbaJFJjDkcRAkZQ+57U37JCHRI7o70jZGXeST3H6Zo+8t/JJGTbNciJE78/xf
-  nirEXltHKsIC3O 5TtbrgAg/n1rzrtbHBR0jyp63e2y9W0Urf7SQscEDKe4YZyOoNF7Yl5PlMx
-  hRVZZA/AHX9e1axVZ obHZPH81u0jEcEkfKD9MdqghQG4Ehv7cRFSAMZBwNuKSrO/MtDojimov
-  m/BfqYd3HFFdrcRuHiki YZf5s5xjHtUVppsrW0bQTWzlSSVCfe54P4VpzW9tcae9ujDeg3I2e
-  EC9Aapz+abBIVYBpR58hiO0 oRyV9s10xqPlST18zgxbVSmrXu9/T+vMyXu0uXmkcxQRhXQpsx
-  8x6E/iKyklZZnmEgEj4Vwy5Bz1 NaV6sKziRrZ1idcnkDg9jx1B71nypHJYRSLHIGUlQikbj7n
-  6V6NJRS20YKFKlBK10/JfodK8UElq 6wyOJlYsoUlRjAHSmmOK3voBJvS6nQvG8pBQZ4xjvnmp
-  FW2jluZEY3OHOxIzjC7evv1o+0tJZWbM Ix5UJGxly5HUHNcSb2W3/APUbcY+yp3t0vv8/wDgj
-  jBciM2rEq4bZtBwQBySfXHeljHmyC4Ks6j+ FTjfk8EegB7VKfKnh/1jtO5G1QeSp7/l1ojTTp
-  kSKJblZTGH3+ZwNp6EeprNy01M4RjKDTbv2tt5 7leO5jZoJriKOO5j+Rwq7QGJINXL+xiCQfu
-  p4lUlGLP8vr+HFNheT7agMlvGFVivmx5xu9fUj1q9 JmJGMVwkzW6FW3DIJx1qJzcZqxnKFWlU
-  XItfV/5f5mNcwSWlmiwtDPBvyzBejLyBTS+5JJgksDOn yFnPzBjy30BqxMsdxYqROFgMy/N65
-  HLfSmzSrbPFALZ4oWdkidzkBDjJ/A/zrWMrpLqdtFJRV1eV 9/8ALTVjEV5LgrZKtxNHIVXAyG
-  Xb1H41YRJ2iImtrlZpVBQA/fUHnHvUaJNCzSQQyOJmDxlDjIGf 5HrVxms4LaLzXlW5KsQ5ckL
-  xyuPfPFROTvpr+ZH72FW9PW/rf8HsVknji2IkLRQXLh4Wl5A4OB+d TNpkku1pPNG2LaUV+WOM
-  7h7DvTIHeS1SV7dzBkLGpxlM/dJPsev1qKWVxdXXnmSBvMEMkjMdqk9T jsP8aWvN7un4mNOb5
-  2ua3fS//BIY3ubuztrfyZHZoWmQr/EVPX6DHNSyxOGEs9tJciU+d8hwMjg4 9BTJT5AFta7yYV
-  MW4HkEkHH86da29691GtuGh+R4nMnIUsen171b0V9EjWtRhThzSklH539X1RXc i41S282KWNm
-  fIUtwTjnj04rahtrIW7SSwyxRJOGbEmMjHB+maptZXH2qO3hbNwsR/fNysijhmHpU TxXVtEoE
-  c1zBIygOG+VQDgZ/Opm1OyUrEyp05zT52vJP8f61NcLHBYxRQM0beUwfzTuKv1xn6Vbh UCyt4
-  /s3nTGAhGQAKQei49TT9gF0yNxcrIFkJHEjjqwHYAcVPPNGixi2t5S4Qyrls7AOgPvXnym3 ZI
-  1dRNxhCN7df8+5UNusskccLranIEofna2MDPv71PJbX9sSrJ9sXaQAg5C45bmkE/2lIPIZEO8j
-  btyQgOSSe5689q0rkiJLnEFzK81wJoiH6xgcge1RKclJImNZKdlq/P8ARsWxs/tItjHGViWHy3
-  kb uwPyjPvXQWunTRzKzRs+IWLIvWIgcq3qcHNWbQRCVLiCVIkGY0BGQQ38WPY55qaEiHEby+e
-  w+UFC RkdyfWvIrYmUmzzMbj5Oo4rbtZmb8jWcSRQMsbIrKzHO7HIx7VOkAmWSVmiEm8A7RjKk
-  8/4UkxtV sA2HTceDu4UHinXSmYmJZo3hDEsYhgnAGOai76aEwckk07fL+v0GSR2ttdTPIrJbq
-  pC5bqvr+vNV AlqYQouYWCgcgdxnJ/rUpWEW6y3SycKQkecce/8AOqRikayUzyQ7eMKi7TKAeW
-  B9K1grrVnXCPNr KTv3/wAt9fmVWgjlulmKtMoXbD5Zx5ikE7v05qpLdwtHG8bKWmgEkkY7t0y
-  PQD0rRt1s3uTvuDkb hEVYgHGaq3AspLm0El1axRtCdyqMEljkYPpkdK64SXNZp6HRCvFN8zbt
-  6/1+RmKYpWCHKMw2+Y/Q DNWJLSJLhHt5wylJPMKk8be31NQrLIbtX2KiKv8ApBYZCzHoPb6e9
-  ayXcxiJuFhWODdHIQgGGYdD W1SU4tWLq4mtTa5Ze6+l3/X4mNbllTdEolmli85IQPmAX39B3r
-  TTyzbNdSyQJCZBIGK99vAH41Ri vrWOGJmjaFzHtyT90McYNS3rF9IurePbI0UwChR0A5A/GnN
-  SlKzVh+0nWnGLjp3f/DWNKSSBHtnt kVSYnMuRnbJkEA+9c7LdzvqLRbNiDIdlGMs2MVPdS3U1
-  kB9imYyHO2PghiOW+g71KksNskSzTRNM snlv/wBNGYfeHpkdKdOCgr2uzeKjSjdLmf32K/8AZ
-  m7U0Ed0paNvLlDZbkHvTZmSOW7V5N/lyHy9 v8ORlR+dXLW5Es/kraTlMA4Vvm3DI5PepBOss0
-  YjeAyLCQYyuW57n3xzVOc+b3tbG9T2/teaetku 2n3f15nOzsGjh86YMnkgTqB9yQcge2atW5d
-  pJPNVZGbcz4XhG6Yx71VdbaNykkcjR7Fw4PDHPytV a6kuBEQJBIZZczsgxsJ5H0yK7VDmSS/r
-  +v8AI6qlLnSSW/loWIzNHqJ2wGOMxHzN3Pl+x9yeadvm VY4btWMUICMc8FuWH4ntS3n2iF5Xt
-  juLzEqMZyu0ZP4UtpPGIkjvJY95ZDAccMncn1PvQ7tcyX+Y qk5L94o3W3mrFkjcYE+2Rwqw3r
-  GwOSMZakvZE+wLIkrPsXaWV+BuIIH1xmrS3cRnjMUSFER9pwCT u7D8OazJZbCKyYW0oeR1IjD
-  cgLjv754zWNNNyV0zPD0n7SN4vXorfj1RPbJFNqiyFCsETPGiHqAw 4z6mty2sc2v2eAtNswy4
-  J5VRkj6msA3jtpaRRQP9pRhuUdcFeSfpVmKaeyty32pIs/KuQSX28hhj tg4NTWp1GtHYmthcR
-  J6aNuyTV/yNCJctcrIkquVLDzGyAD7VMZWOivbPcwxokiguQcOeuR7VSGo3 E1lFODEkyREOpX
-  +8ePy71NLeyyQwwBrc+c5ZW8vggCsJU5XV1/SM5UZtxbVrP8fmhyJPsYRlZZnQ sPl+UnOOBWm
-  rSxyTysrsqvh0XggheTWa0837mfckcaRNhQvLBiMVXlCxz3iolzJL5n7tRJ95QvJ/ M1Dg5bly
-  oycXG6Sfb/M2J5IDY2j7WMZhdWRTgglhg/TFZsdzG7/Z0Xc0LbAfUPzx9MVFDNdyafIk 15av8
-  6gFUxwetVJLuK2uCgdBKpKSP/tbTkfUVdOha63ZFPDxUOTVy+f9Mv3cy29rEWaCaRxtjVVx lS
-  Rk8+lQ3c5js5oyvy+ZmCQHG+IEEsPoaxnhiFnBPHeASBBhXJJx6j9aZDe3YuUjhQ3LDOwlcgIP
-  Ue9dMcNomtbfI0WEcEpJN27ppFm4u9QDgxbPlOCSuQSev5dajeW+NySINyZVJSRkEZxkVHNKUn
-  ka WGVYGLgNu4JIGPxzUFpBcRFC8u6dkYFM/c55B9z2rdQSjeyOmc3Gm5NJX7f5pluVVW9lSW9
-  S3jjk ZIgVOcDkZx19KjkK+UrmaKIgESEJwHOCBj6VTa7K3EMXlIUCfMsq7jke/wBOKszzpc2i
-  iXbbAOzy REfMxXoM+pFVySTVzmk5qUVKL+VvyaL9rLEhWZYpzFMTKxD8DA4B/DmonKzhV81ow
-  ULIxbhj2/Md KwBeh3jyWWIRsAo7Z9cVde33WzSrcoYUKqNvcgcfzpvD8ru3Zm8KPLJOctXt1/
-  ployKlt5nkTIZH BMjtlY8cBT6sfWozvkgaSAkSmQgJnOwD5Sp9z1zSERGSzHnfNtj3J1yDnKn
-  /AGj2NTbYrbVCZCwb DeWOnGO/qQTnNLb1Oec5xk1zNW/ru2KLq7j1CO3kUJbxKxl3LnJXpz69
-  Kr3ZkS7t5YIQ7EBmXbwp H8HtU0rl7WFVJDxoVaU8qWHr9etTKXWwgxLHGOfNaQZw/b86Sai07
-  A6iSulZy0tr+lyzZpm+keSG W2mlckZbAVQOePY1SVIoLiKeQzGMx71ctlW4NWR9rNgkp+aSWQ
-  TFwOEwPmX8ahlkQ2wQxyIrI24u 2QpzlR7VlG/M/PQ5YSnKTUldS00/4JRk2/YfMS6XmMKUYnO
-  abb28jwWrNPHejawW3hPzEfxdqc8g WGJnUGT742jhR2BHqRmpJlu/sYLIsXmHMRjXaVx2/Gum
-  7tY0rKrLljJJLpzW/TVfeijbxzPcJaZk gRUfaHyfcCqSR+feO9427LLuVBjIPf8ADFW1t1Qkp
-  cExfKZctzkjgA9uajuZJEt5YJAg2kCQFeck DC5roi9dOovYTm3GLS032t5ruZpk2agZIysqI5
-  8wj+LnsaS6jl+yvMsqxQs4XY5OX78fSpIYmkae IzRQqCMswIAI6DP51AiRlBGHMs/mFozngdu
-  hrp0T9DmxKUPdWr6v+tCS4kYmyWORXYKWCqMbue38 6sCRTpxcTRyTEkyYHA5xgenrVaRvLuFO
-  1WAUJuC8Zx0+tOjjWR1jlkS1cgMA3Yj1pOKshQpRp8s+ ezWun+a/yNpLactG9pL5yR7lcjoWx
-  xx6/wCFbKb5Iw8vyXQAPyjHTr+lchBJKJZwJFjZiX9MgdD/ AFrRg1OOGGAtKX2hg8hP3nPQj2
-  HpXFWoze2py42VZNe957a/MkDpPBFvv7dEKFIwoPILdP61cgtJ bdblYrqCRIpFiHy5+90NZNq
-  VnhdECl1faJAOCO5A9hWr5klhbpOgEqJ+7wf4snhj6nHSlVTXur7t DpqYia5Y3u+istya6S4h
-  uJIIjGY0QgELyWQDjPuaw5lultvlcCbzQsh28JuXhTWq2pG8SVLUqzRz FI8jqrcA/hg1hNNIy
-  l4b2CaKI4AUHLkHntRQhPqtTzpRlN++kpf18iCeRxbrHNbSkhRGxLdz0OPp WSscsUJaUvEQAO
-  mMcnj6966S7ufOhVZbZ1kSQkkHGQCOPqKwl2/bY/OLtCGLvHnk7T/9evQoSfLs JSbV+W1ul7/
-  dZnTNeNFbzKluqBZgWyvP+zz6ZzUzXl3EZHkaBi2cBYxxhgM9OlPuILq3PlWuyfzX V5AV3E7T
-  x/OrOWnlMV1ZOJtkjuVwNhB4Brz24WTsmvxO6nUpQs4QvHu7N/dYoSTiRproJlWlYAqc BvlwC
-  PQe1W7KSWOKNTPaW7RgQMkiZbkZzn3qNXtLWeASq0YaFlkLHKrJgkcf0pVFxENNkhCSzqg8 9C
-  ufMGeo+lTKzjawSq3hpv6f5k5trmCCI3SiS3SIq4UYYMTlVJ9apmK8DqL0eSGQxsQuOpzg/wC1
-  itIkuJiyyMokJJ3cSFRww9u2KYriW6HmyJmJVKKe27hgfU1EakrHbhq1SVJpfr+C7+ZS+y2jzz
-  /Z pGa383aELdFI4P50XKQpaRBVcDzfLAdsjkjj61ZkjhuLF2bFuMt5YPGUUjB/GpLSzmVXKXd
-  pHhw6 iRMjAHT61TqWV29iKtSUaampu/8AX9bGfHebrgxIDIomC8H/AGuMflV+5lFrqsTAQfZ9
-  hDiVd2/J +8PQZqjdtb3Ea4i2Y3LG6KAJAT19znimxRQPdRLdPJBbDCLFK3zg+59iPyqnGL1a+
-  RlUnT9m5TXy 6l26kIt5S6mTMhwsfy4KAY/Dn9Kz1xc2yKjCOUxESLLyGJIy34fnS3ZjEc6rIZ
-  WlYPIQeFJI/wAK fHbbyfsuN2HQhuSpyDg04JRhcKMKdPDqUtLvT/gq2w24triSC0bG4lmMmwY
-  MhHHFWLWKMX8qXCXE McUy/MZMbDgkbv5VVNtqNvbRtLudFfIC9cdx9TWtJcTXFlKgVI3aQCRS
-  vzO4GQ4/2QO1TOT5bJ3X f5hTs6Tho0+q6fn+Rbwz7rqBiwdhtQHDE4wCPRR3Hesclor17e6lY
-  pEpRsNgNkZU/hUTRPa2L7pD LEZsIQxAIPP61baGCS9SRrqG1x/BMCSejDP1NRGKj1ujehTVKi
-  6knfpp5en+RHAL2c2+JhPkFW2A 7sHhjn2rZjuXs794IrW4DJKGVnbIwOpPtjtSabBDLJLMZ0d
-  pJgz+WdoBHOAPT2rZM3kKZLsxxq6E oxXJA6nPrziuWvWTly2uc7xidRwUbp7b3v6LcoXzSyvu
-  tzEkqnZGqr/A2PzPfNbCQusUJuIZv3YZ XkLfKp4AOPSs2RJrmzhbg74S5KDBBBBI/lWpDIjrZ
-  ySCXzZo3Yqz5BI6ce1cdV+4l2v/AF+ZtWqR 9lBJdXtv8/8AhjchV7e0iRNqiMlWZhnacZwaUs
-  32i3DK5LwuGkXgZ7H6VB5T3Jji83ZuIwSevHU1 qOYIwY9rI4BIDH7hIHJ9h/WvLbs/M8rSMny
-  u79CnbQw3CwbW2ybD9/kA+mPWpt9qrojq4DIZDhsH J4FV4TCb4EMZMHcGXjtwKfI+6RGCjzNm
-  WyM4A7USu3qQ8M3O8l+NipaBJJYi+XdI2JBOeQDz9Kbc CCaCJF3uJ4TchlOAAABge2avwm2ba
-  pV03LyxPXNUL0R201vFFHJEOdjPyAgH8s1alep5ik4Kr1uZ MMNs7uQdkisNvPG053Gsm+2iJl
-  FjcSSkB7eRWGAg6j61o3UN1FDHPbzwgxPHHuZMg7vX6Zrnr2S5 knMRt7hzbuYo5I3wFHUqfUm
-  vVw8OaV0z1aVPmqJ328/+G/MezQeZcl5hHvl2xqxwWyAA34VKY4Ss gSSaeRkIWNZOZFAxn3Oe
-  c1VeaRlt5tsUMMhxh1yVBGAM+oq/9hhiiWKKC5M7hN0m8fIwPK/1P1rp k+VK7N6mJcY+9Udvl
-  /wH912YTxQp5dsjyRfu8yLI2SzAcEe3t71bt7jVPskKRRrMWPmSAL82BzV5 NPsY7tzFvlAZzE
-  5bOAex9cnpTo7M3F48ipM67P3hjbblm9PbtVyrQa1/E7KTjVpvW6Wuv9Ir3N5e nT55HcRbrg7
-  WxjAwOntUomhvrJ3MLN8xMu3jL8BcelTNbuLefbNCJBMPvrkNxyAPyq6ZIksWa4tZ Cjy4Pl4X
-  aeOPqOKxcopKyHQdKnytxW/R2/D/AIJSVL0pPH50UUyFTKoTlcct+XeiXYtpcNBPDeP9 oBzCu
-  0le34A1ckslkW8uFuCG83ZKcn5sjjHpVBfszaYvlH7ZuTa6wHaykEYpKSlqvyN6kaU7TSe+ 1v
-  zf/BMp7l2ZCQqqI5I5BjqScZHsDT7UyyaUImjMilt7FcAkL8tWWaKW/eNDDEFQhXddyk5BNaIk
-  Z55YkeJEO5lkC8bSMhfrXROVopWOuvg5WjHlt1/4bb82ZVnbWkNva25lmKMkjuWk+6SeM1cY2t
-  vJ bhZYXuVRvlIzjjj+tWo44IUiZ9sJWHGJOcfWnC4tLnTZVKpcZUHMQwxAOKwlNt31aOL6s9I
-  3fL/X l+phxahJmOQRoFVc4C/eOeSPapkurZp43lFs5ZWCgRj92PQ/U9KW9dxO0Nv5SBZEEa4z
-  letTXTXD q5MMIlEu8ARhcjv+VbtRdtLXOmWEp3Vla/oVbeKK3vspI12PIcuqNyNo4qHLJZW2Z
-  o5IjGu4Hkrk jI6dauXCEkTQARylW3EdtoHB+tWYy7i2nmmtWUl96rFgYI6/hQ6ltdxTxnsVzL
-  3umu+nbQozFRP5 CwSiMtu3bzztH3enc+9RLcyQPFdXGxp5l3sgGAOcDA7Ag4+tTCVmW9uIyAk
-  ZEa7udw/vCoDBMzQz KyS7omH1PqB6CrSj9o1UKUvebsn66mo95b3GnNFsks13lSJD9zJ4U+9U
-  Li2eOxMyieLy28pizZJG ck1Tfz3t4g0DhRuG89HJHWlW3mYuIZfN+UERHJyD+nFEKShsycLQk
-  knGdopu63X3/wCZZ85/s58p WKvIuQOoyeB+VV5rKb7YZXhkjZZywRuScEZzV1rfzLGdVtp7aS
-  OT+Ju4HyilslmUu80wxIoMu/kr Ic7R/wDWpKpZNomcpcjkpK35kN4Ynu3+zxqdoKy8fKWzkAD
-  sKqo0RDeZvtJScE5OBxnGBWtcRySF EaAzziEtOIgV3MtZEu0DYCIzNiY7xnHHNVSacbGkJNwU
-  NYrq9391/wA0WYXuHhiijMcjIoA3LkZJ ycjvVhLWV7QR+Yq3CFwXPTg96o/ZX3maDe8Xlneqn
-  5iD0IqOWOSG2th5joDAXkVmJJyfvfShxTfu s8+vh0q0ZU/h9F+P/BQyWKKDy4/OWSeYbSpwQT
-  jqOOlUXiuIxEzxtDuGQHGenWtT7Cjo0rFmiDKE cH7q5xj61WvYTFfqJGJXy3CIWySO9dFOor2
-  vc2dSU1yOrdLo/wBGU5FMke7yEy2Wyi4BPXjj0q2b HzLT7XGXSFkZgm77uOn41LBaXEcW1yLh
-  iFK+WMcdhVwQNLa2xt0ljlEJhCO2Qx3HPH0zUzrWtZnN KrGEocsklfW7v99zDmgkRIudkkij5
-  Ccscen4VLHHJjO8SERs8Z6/JnB/OrVxZRqrRs5meINgjPX/ APVTrG2tklijIfa0JIJbqcHd+G
-  KuVVclzrrynGl7WesfSxBCyy2DkoyoB+5Qnk5P6mtQWUV1b2TW rneEIcFsjcTwf51Xdke1DR7
-  PLVAFA6/L1Oakyy20zRo1u0rBuT0GPvD0ArCbb1WhhONSdOEovlV9 P+CiFI5YrxYyzyuoDqgY
-  /dU85+tNMspke8iZZirmJQBlSCOuParUVs0aoySiNVh2O7jOT1BB7Crm l2s728s1zA0ZNwGQb
-  cZC5zUTqxinJkYiqlK8mn36X/Az0s5fPgYSJJCIXjOOrEdDTjAJtJjledky N7ZY/K68Bf8AGr
-  Lia/ZER08txuEqDCqc/d+vGKz47e7lmkS4heIOCyjphicD9KFJvVuzRwztOfvS St+RkYJExI+
-  8CWAOPmHQ/Spr0rLpY8weY7Yw68BwMfN9B0q08KxQxpG6MxXLA88/wj8cGql9HOsc DiLYjuzs
-  uOIyB8qn9eK7FNSkjoxOIpzUPXt/wCO2kaC4fy/LZgjbWIyGz/Fisvyyk8RdigjHQjBb vitq3
-  eb7RGSkNvmNkMjr8vzdO3aqlzHi6toHcOIoz5jr0c47foK1hK0noYctJtpU7d3e7/y+5me2 Gd
-  S2A75YA+vYVMd0YlKxsZAWBJ5wMDI+oqJ4gm0eW8cQbcN/LD2zjnipXWUopiZtpGVXGSFzk545
-  rdu9ipSc2o29F3II7hpNNWRVUMoCEEc4Jxk1ahGx3DvCPKk2hSuc+/4VTZ7hRbCEoEU5YLH97B
-  z6 e9PRJGkcDLbe/qDzQ46M58PSqzvSl8tv8jQNw22NBH5MRjZ2XHJyMf8A16FuLeK1iAlaVlK
-  sNxO1 yO/sMcYrMaHyzCil2HIXqTgj+vNLBFLhEdssdwVyhC9Pu8jrUOlCxDp007S0t0v/AMM/
-  uRpxXUUc MhiURL9xR1Lbjy34VD+5O6CCPyZTIIyWOQxPcflVR40WLdMjxSGQbEJxlRye3rUQz
-  O0g2NGjOZWy cnIHBz6UKkt1/X+ZhUoJtSp38u33atl/UY2F3taC4G1Ww27jkDBNNhndrUySRR
-  25B2EPHk4POfxq oEu2AnLGVGiJEnOMHqPrmrMMUd0lsJJGjRQURievPQ+9DSUEn0OWrKmoJz+
-  9f8E6UxXE3l7bedoo Ytow2GLlsg/QVNCJtt4tzOvmtdRsXAwAuPm/Cp/PaZYVEMqp5Z3OrYG4
-  N7e1XJbaJrFgQxdSowDz IMckewrx5VLaNf1c2q16Sdp6Lytp+hmtBFc3F7AoMkTzMysOvAGBQ
-  v2iK1Vtiyl90nAwV2/0NF3b CJZJRcK1uJsEJkEKRj9etMtEktLW4lcPOgk8uJgeCh/qau946P
-  8Ar+rFqKqJO910TWj+b2JPtZgW 3lLqsc0bSlWXO8njK+gHpStcQtbyOQFdJApI4LKAAW+maGK
-  TRM4TyYgrIyyc43dh6VWNjcCKOYwT LE6AYJ+/2BH9aIqHXRnRTjh1G7XK3+I9s3F55iSI0RBw
-  gHQHj9DSQx3dtYBQ2wAgNuGTG2eAT7jm pWiVdNVYg29JgiAHkqTwPc5zzWlFKsOoSQzxO/mMz
-  uc/xDp+VTKpZaL+kEsReKainbo7GMtpIyTm R0PlyKvTGQOQR7VFciS4lYW0BSNW3NK/ONw4Br
-  d+zQX7xzoZCZox8itjBIwB+VVFO3S9szxrBEBG iDhmBOOT3Poaca93fqbOvGpO6d5Lps16W3+
-  ZV+yeZJEv2CdyYyqMrAAjPBPr606KL7NfSzStl4Hz IRwCcenv2rWtdPEVn/rzAys+0OxO0AYG
-  fpnmsxnKpJi6t7oIEEjKuQzE4FKNXnuk9PmTShHERlfV duv46Ed1IL21jMKzRSlfkQv91Sec+
-  uAKvxQwCNwjklgWiycliThWB9B3FV5UmRprdpIpFJLkIuGX aMbc++aUxI3kq04Bh3KQDjaxxg
-  H8KUrcqSehM6UYQjGKsr/1qPkVlsV88xvIG+RwvyFc4JA/l6Vn K0kdxLJHcW0zF8RnZn5AOv5
-  fyqNvtMbIRHI8Rk+6ecqOv6mtC7aJrSKWKMwSJLznkMuMHj9K0UeX Te50wpSppQjeSl9xHLbk
-  WqZmMhAOHh+UMBgk/jV6CeXUbeaO2uIQN4ctKmQSOoGc4Bx0qOwDzqkM 3yQkboF7gLk7Se5NJ
-  FaOz27xK8McsGWI6Bycjp9Kyk1qpbo1pzpRTjUa5lt/ka0dzcW+l3Ml2wLz TiTKrgRZxiP6mt
-  VbyZYonkEKeXmNFKcjJ4B+tYqW7pbK0sivMXHynoDnOCPUVqPb5uLpnmVZPMCz AjgucEMPQAV
-  w1YwbIlhFOC1vr2NNHZoFa5ilTZlTtON7Zzx+FTvcNJ5hjOzfIo3OM/Ke/wCFMAkT Jdh94EKe
-  oPTH1q1LHILci6XY7ZI2jHAIHFec2rnAk1Llf4f5Nk8sFjPaMWYjDARbGI3ds/nUcUip qEIR1
-  /1LLIWGdrZ6H8KUbftJhgjM0ZZCSO2OlRSyY1DzY0CiQFkz/wAtE6Eisopv3SIPSVOW3mST Qp
-  NIB5ylSMDbkHJ+6ao6pc2lvpUYnmywATGeQ+4YFMlu7qJbiDMWxv3ocJjaF4xXOajOGtZTc28z
-  FZVWPBweO/vg11YfDuU1d6BDCSUlzPT+vQdPcSyambWK4hDh2ZlK+nP6npWXqbCNEkAkjuJYsl
-  85 UKfvZH973plyrTtJFbRskrMm9mPPXrn071HsL3jQteW7qp8v5kJ3qf4h7V69Kmo2fY9CjRV
-  NuprZ bq2vrdfqadnHC1pbOZBcBg2xR3Cjj8upqKNorS682ZLqOB5QzSOxI3c4/A1lCO8SaOKF
-  gsRxJESP 4AeT9McGtC7R73KJBLNC77wUOMeg/Kh0/e1ejMYYHnquMp3Uvlp+RaE4lkjlALIpO
-  FXghugz9OtM mj8qAyMJhsmVXkSTCuCOmPfPFMjt5Q0TXFrPFFP2VsF2z1B7DpWhb2dsk0xlt7
-  gMAymKR+hH9fSo coQPXpLD0tnt26/NP9Bkd3FcXC/ZoHGwFULHIx7+p4PNVo3luY5gbG5a0mv
-  FcuDjbt64NXVhSyWW 4t4mcB1Aj79OT+RNOmeWOCOa3jeG1JLxs3IKkYH61Cav7q+/7zsjGLl7
-  iTvs3vf8wNvEJsySPty2 3BwHXru/A1nTW1ta2VvLHvjZ0LNh+M9h9TWxG9vskSW4jJU5KnqpC
-  5C/iahYWz2StOrRuQSu88Ed ScexpQnJNbipynGcd7X/AK8yOGFpIbQ23kRz+UUdXQEq56Z49K
-  rPZyQSSz3cbsiKqkRnG5/4fwqe SK6WxthCyuoIMkyDhH9D9at/vCtyslrPKfNPmANx04FPnce
-  v9XNqdWcNJWcX9/36Ff7d/aMqI6xx Ha4nDJnLHjj0HFNWzhs7a3fyZplERiIjfGSx6/hmpbZL
-  f7GrGNuSiZXgknIzVhp0s9UcypIY1RlT PIYAcmocrPlgtOxhKUVJxpJ+hlXFjaNZNEs2y4jkA
-  XLHI+v1pk1sJGH2i1u3kTduCuBuyOo9s1YX zJ0haaCUwsyGIjALjPJz6dKgiW4bVnZSY1eQzO
-  JDncBwAPTJNbRlJLfYHOUYtb8uu/4aFk6cIo/k LQsQQpc5BzjNZ0rRkqr4uWCEEQnbgnp+gpz
-  zyxXxDzeQ0S+WEk5yxOc/hVW6uSZZJfL2TedtMqj5 VOOBj3rSnCd9XcIKUXy1Hfqv+C9x0890
-  LIOFjhSVWcIUGSOBTIZQIWnSVZOARCv3s+o9sVOJbkWp a4jWCWP+KRMhezKR61ltcWjxOkI3l
-  2+RhxtQdsetbQjeNrfcOKiocj0T6rVP+vvNW0uGOXcZw+UX HDKf4h7VSniura/iMMqyuh2r5Q
-  655GRiq0RlvrjMeLeJAUXPYYxj61K5uI7a3jvE3iL/AFbr8u4A 8/0pqHLLp6GdKmqc7Rad+mn
-  6lqS5eCIqm9Z/OIfec5J5B/KofNEeoQXdxKHBRjtUYBJ4H4gc1CJR 9rldv9YV83cem4f05qae
-  9lURxrai5TecPtBCjjFPktolua4mCp+4o6Pf/h+xctLi485jHukVv9WB 1I6daoPGkljcmV1W4
-  dlZFIOVA/xqSGWyaISeY0MiuqMNx46+nvUM4uCqS7oJnRwsgROq/wD1+lKC tPsZ0ptVG7NL5K
-  /zehfhaWOAXqlXckiRVHHIwuB29asQWt6tslwjQzPFGsWGTPzMT+lQTLd3d0Y1 hMMsbkwxqMf
-  u9vcdyPWtQXUwt7dIEUJIhlcgc5BAX8u9c1SUkla2p59R1U+aMVq9U7PT/IhW2P2O WCS2mLx3
-  CK2DjJHJ/DNNkFzJDPdYt4WSRY0MkYPyH7xq/JBcurJ5ojmy2+T+FiMEn8R09KrKUl32 7N5kY
-  K4wedzdF+tYxm3qRGnOMG1bzVtv0Bbq5jKIYEmiThVjQBip5Xn1qvIkLWUN1tktVwNqueRz jd
-  +BPNaW4HV5tP8ALbfEjh8dcheCKzLiS7fQ1iUwlJY1kjhKfvCF4PPoDzRBaq2hn9Wipxjbl792
-  n96+9L1Mq5EVru8yZLptjJhDjuM/jzVKRo2ztjltyIyAWbPTA7CtWYJNLa+SVknjhbY2PlZj7d
-  yR mqK2zz3rIwChFIOD3xx+dejSmrXZ6mBr0uWUZy+Hpf8ANbFhPLngi+0yI7mItiJduARjB9y
-  cVHm0 t9Mtfs63DTq3lyo752ueRx6Y7U6GMtEv2sqilMxKowSAc/0qKXbPMbyaQQeajOIuc5PG
-  cAfjSS1t fQ5Hg4ydoS07a6/gX7v99by3ShirLkBTgY9R+VRxXBh8u6inJEh2APyEyfun3NZst
-  5NFDH5U6yDf ukbb8o4+7j3qAyXLmIACNkBYqVwFx1z7jrTjQbjZ7GijWlScJfj1Ld5DLNOjQw
-  zR4J3Kp/j9MD0H Wm7oRAkrPNFPGpHzvkE9j9M1JYSlQ1yrgySEsqHnPBGfw71EsKC6j8qaNZl
-  gK7XUkEEdfQ1Sdvdf Q56dSq4OLWi8nr5PfQqWgh8xEnma4d4z5jJwEY5wOR1prsoji8xAHKAY
-  6FCTwD71opFFZwRtJLEW GSQqcleq/wD66wiEvLyWSeQRsvzI3bHpj16Yrem+aTfQywmIxKlKS
-  b5f72qfyJyRb24QRPK8bkTf NkcjPSq2+MW0iKj+VIysjM2T8vUZ/GhomEy7ZlmcHJRM5bA69O
-  g71JCY2aS3kPEkm9SOMe341tZJ XM1FRnOa+etvwK89074aJkFukwBjYbmORyM055fMkSOVUIi
-  JBKttBU9v0qwqqmpxFoluJGjO9FAG DzyffHNRm1EUfnTwyiAnCKGwX4659BxmnzQ0Oe2G5k38
-  kna/4lKJRNI5iljK5wWJ4XP8PTrTBFho ZGE7gMcBWwpI7HjmtRYZora4jUW48pwrIke0u7dDU
-  OEtmiWVHklti0b7ThXB6kD15xVe17GUqtSS tKN/JP8AXT9SsYrhhHEyPnaNmFx8uc5+nvUQjZ
-  ZJHaKRDuyqsfu5NaE92ViEETboADs7sAeSCfao Y4ITbs84mCK642MAWHeqU3a7R0bU+aUfkv6
-  RQnVLvUINs3kRQlgTIxPHpx3rQEMDoLhJVMCtkr3y ein+dVldBcylFDJvLAMoOSO/0pI5YpXi
-  neKRlX/WbDtDHJ5pyUraHD7OpG9uutl/Wn3sluJIhZok Uu/BBTbwozyRj606NHmvpTHZy7PMC
-  yIpGUB7fWnWEjW2n3Ea+RLiUOPMjDYAppdUu47i78xi+XUx nYGJ7cdajVXS/r8jKNOpGjJJW+
-  e/l/wzOus7MJp0ixeZIxw2N2c7W5I+g6094SmomeKO5Z5cyQLv yNgGCMfjUtlfMdyOm0ySAEg
-  YwRk4q5JeSyzK3lqfMR3aNBgxkAjb7fhXiTnUU3dBPFTVZwcLrvff 8TMgVQkRW3uJo3UEgtkf
-  72D2FLDFcG6SVpo48IymNh95ugOOmMc1FC1wLHTGETRNFblgG5yc4H4Y qUGVbUywXEE+2WMBA
-  uTjNaSvqd8ZVG37y107/wDDF17aRNPYD5jHLHGXPRuOWqjZ4F6Uk86YEAjD /Ko54+uOaciP/w
-  AJOss8jtAyOxKkhVODwaWFbC1tLAQ+chlx5ckj5HOQT74zU7Raet/6/Q5atWUF yuV79uhKkd3
-  DY4DoEaPzPNZcjjgfzojSN5Lee6V43+6zbsAuQRinmS2geO3aVihVgYyclcj/AB5q m9kiWFqs
-  cdwU8wOCzk5H8X45NJa76XNIu6UZOz7liwSYR+T8wuQVBUdQQcEfXFab2rpGXkEca4yy uuSpz
-  gfzzVd5UmuoYoYpPtETFpCD1Yj730xmoJrqYwRea4QIyhdw6oTzn1PpWUlOUr7FShN1NF+r Jp
-  p3j84SsjvGGWRlGAC2B09+tZkkVrEGRZ42iwpi29SByM+vNaBhvjqaNGiz2sm4ZC5x2GfpUaW8
-  1u4t5/JjWKMIJ2ThiOeK0g4xWjO2lRp0k0nr6r8inOQs0ki3CCTC+aSONwPI/GrD31o09y80DO
-  BI AXj4AJGQD78Yqd7WO5lXzHQs0ZZ9gxtIOdp96fmHy41Elqm8MQGT7xxwf8KfNFpXX9f0jpl
-  UozUV JO/zX4lL7SbnSwY1VZjggY+6CckH3GM07yppEl/d+aZW8yNsfKB3OPSpbO4MUojiaDbI
-  A6ErnAHH 8+Knm1HyVuEmAkmjuFAEY24GOR+FD5lK0UQo1qErU43e+u5Xgto7j7T5k4VlZY9y8
-  cdTj69KsJdP taG2lWN3kEr71z5RXov4+1QEW7SuIHKTbTkseGwMjj3qSWayfSYEMiJclFM+OC
-  xJz+lTK8nrr+hb nKrK87y+W3quxNb+fPPubduddxQ9UI/qauJJILyN5FcxFOWz39D74qOGIqZ
-  5/MQr5pVUxyMjufQC rd1ZgWg3b9kUgSMqeCMZJNc85x5rEPGUvhlK99Lf5GiRJFEHO8RxsIyz
-  HPLEc/hT5biYWz+a+6Np C59QAfX0rBgRZFZVeUxqwBLOcepH196vXepNDYZihKo8wLhgCYicf
-  Kf51zOi+ZLc5IR1Vtdf61LI uWEe8kyRvESfLOCrA8DPvQ1zcvaxSJJHFLsZY2dcqysRkgemeK
-  r3NwEucMyy797L5Y2jAwMfnyKy p75lSBDGxZVXcB/snk+w9qqnR5rNI6KaVVXiti3dXl9BaTe
-  W8IAk2zl484YjhR6Vg3OqXQCRsUUR 7UbcuSSfm/pinRxFtWcPDdSRyKzyrv754qrezRwxsHgb
-  Nwu/LH7pz0r0aNGCaVrs74UKDajKF330 X3EjMY2vLmOZJy7bmRDyoPb8BVZd8k1zHGYSyzHyW
-  VeXXHHNPvmlNkPKeApLlnVV5LDAxn61Xtp5 I7+2id41jcHeuMEBff1rphH3L9f8hKpTnTc73c
-  f62tr+BMHYWsAuG3ThTDGqccnn9D1roEuZEt5g GR8yIr4XuOCR6CuVjn23IaaJg2QSM8hs8H8
-  jWw7izM0VtOl0FOAByQf4s5/Gs69O7SK9hUbUJNWe 2/X7zciYT3TW85aOBJcqSeSo6Ee2aVWt
-  767ZEaWUTK8uxW+Yds5/DNY0d3NJbiLz4IkMTOSV5+U8 Vr2N5i1imgt1ZlQwhlAGd3f8O9cVS
-  lKGqNlhPYvnvbsr9e+xJa3VqscEUayxlIvLZ5GyMnpn9aYt y0dqq3iCZVUoNgwGz90j6d6zry
-  3lS8cqymAMhyv8ZQYGPqTVqG+hEszzrtd3aSNW/hA6j8T0pulG 3NHU9OGHp814av1Kaox0mRn
-  iaB0b5pHOQCOin3NaOnqbiPZclYFQSZDDJOB29BSkrd2cdoqlWkTe M9VwclT6sexq7a2lrKsm
-  Le5Sdd3yGT+A8mlUqrld9wdSMYrm3T+75sq2e7YjGOS7gG1EihOC5x97 PtSzRCKSVkjui7Ocn
-  zPvYxVcLcWgVYklKgBh/vZzU8duLi7tnuZJYTKhlPzkdKUtG5X0DESnTi56 Wfa/5Ji2V3BPMI
-  Zyo3nzC6cKOwH48UOIJLZxIXgUPuxM2SATg/rTJI445MleH2EsvHQ/4moL82ro jSvJI6kRNEh
-  wST3pKMXK6urnH7OCkpRbjf8Ar+rlt4cBjch4LaIeWjbsD5iMkfTp+NZv2WRvOXz/ ACssuS2f
-  kAP3fqeKsPfLaXEttK4CKxYGQ7s4GSP5VHDBazQGdpn8zeCYtxyR3P4VcXKCuzGvOpQe qtf7v
-  +H730KitZSah5kqTTu7F9obG054X3PFVpjE07QpulM8hdwvTPYj2qW5igi1jz/NCwgnao6q D6
-  +vNZ7Yhu9rSiMb0eRWHzAjrz2rrgk9U3sdNS2s03ey8/yBp7pdyPE5hYNnfyckcc/WqSw7ba0d
-  WQlCBIoGCAT09yTWhPHKYJ3U+egnJUqOpPU/SqmJkZQmwNghht6HHGfc9q3g01oRS5J0vaXs/L
-  b5 ixTyQFY0yrSMRhgMBwOn5U15JXaLfDNIWwqEdMHqf0oFpN5ClsfvVEir1OORmpGuStpbRtE
-  2Y4yu fY1Wl7rVlTV7ONm32Vv1uS3VwpupYo4xGjlipI/h45z6cUttJI9kZ3eNwrrGCBwPUH3x
-  UMZZYoXh ULGCysZOS/HQelSxvCmnMu4LKrKGP8Jbk5xUOK5bJGVanOpRUUrR+/8AHUZLCU1MO
-  kTGMneExkbj 0rQF8ZtqzoE2D96AuPmBqratb7fnMpCsEDbuOeoq99h8lk8mRG2IRISMh/8Aa/
-  Cs6jW0txLbklHX +uupYslukl8zaSjLvZmPKkZyP1rQkgMttcJgTbXC7Ivlbpk49qpOk76SjzT
-  o1tlVAQYOWPr+ArQl jdLuY4csx+cqcAHHI+vSuGb9699TKVL3lNNL0/pMtfYJobBLhJ1DFirh
-  8nlsc/QiqzWrjUvK3Kxj VsKg5bA6/hTysUVpBteRnO6VAXJAjyAQfU56HtSCG/uppoXUpIJGU
-  soxhSMkfXgVzxbV22cULwTb ehVMV5aTwlXCMIWR55BnzM85/XFUJIrtQC0TBYSpAPUKOo/Dqf
-  WtcXCo8AkuEEJXEYfnIJ6/nUrg LctJI32gq58x1OFZivAA9/6VqqjT1RFWFnfkun/X9bnOIsc
-  tvJE48uVbhRFKpwoUjJbHoT0rQnlk jlgVogMRMLiRVADknt6YqSWXyNLjhuERhtJfYuCrZG3P
-  tVCETSaw0jW8qouYrhmOVVz0I9Oa2Xva vZXKo4eLhzVFbsuv4W/UzJIXFhiKGeMpIoRpG3bQP
-  vmoY/PjVwqLcxSAyoSmc+4z/CO4roGit/IX zEuA7OFdA+MsOCP8aqXPlKoVIpo4gQjvu4zt4U
-  enp9a6IV76WNKdWHa/9etzHlillZVkaGKNxmRg mBkjOPqccUSpcXNnKRKmPNC4C8gEev4Vdku
-  VuJYoUs5mEcWwLu5B9/cUW81tbARTho9y7gCfvAHj 8a255Jba/IVSLuuZO/bRmR9knc/ZiyyS
-  JOdskXyqNw+7+OOPxq3mYSgQtA1ycsqrH83pz7HrioZ5 Yo5YZYSWjdd2QTkEHjPvV2CVGigaQ
-  iHzLd3DDrkdOfQf1rSpKXKm0YYmPLG3R9H363Kd40kl0luB 5rIrAbR/rF4JH4VSWCVr+OK2KK
-  fKI+cZ9+aleORbRriWbaBKFGTyCw5/Co5TJDcsWzsiOzKnB3AZ 61rBWVkJq9JxhZeWv6/8Agk
-  tLqIK5xbrkKSy53H0zUohQxmGIlZJGeTy2OSMdFz7c1CgmMqmOQ3B CFQoBbGeSPrzTrbZEVkl
-  Ei8mSJMndx0z7Hn64rR3tuYqNorRc62t19VroSuVjsxM7h53OH2nAIYc EenSpnmigEEkEwbYC
-  HVxuCk9OPfmkuUMaedG8UsLhWKMOwPaq5uHfUd8USH5SChQEE54P4ZqEuZX I9i3T5pLRd3+A2
-  6+zo8ioZZxLhwVboF9c/jU8zW0ljcS27FZzeY8p/mYll/lSxp5qzJPPBGkaurD HzBvwHY4rPF
-  qJJYXWVERoy5kOcHtkfjVJJ7vY568Iyak29Oiu0/68iK42SSQQRskrSMDEE4YDGCD U8Zht7i4
-  dYpCY5Qq7myNuDuOP1p0Fi/2xZJIzOIQXPl8EMDwM/rUEjxXOJkV4mE4WQZ4cv3Hp0rW 6fu9D
-  n9qr8s/h8tH+hoW8yNZQIixAxzb5cr97j+XqKylkS2kRoVDJjnI3BOTwQR19Kmc2YnIBkiQ Ag
-  nOdxzgEVItudnkNJD5O8sHxznPTNTFRje/UyhGjScoq+u9+3luQQSzTzRTsUZI8/ukGGc9PSod
-  86XCB1TeBu+5yKsvCrahKWmhgbdljzznkkADtVXyUklt40kMjSDaoxyK1TidTlTo8yUtGtdHb/
-  I7 KZI547YWjkwqMSuD1Zj8vP6VqssEZkbf/pEM8aICezDBB96rGVjbt5NuU3uHRRjlFIJ/HOa
-  v3M8F xePKAoUPuIA+9/tfTH614NSUnZdP+G/4YyVGTgktUZDy3lvEyBoikbrsi25dlB55rUik
-  jCTT3Dww xGQqMLjBPOPqOKcl/G92y5g2RnahKjIVuv1qaeJCdiFCigRxjH3+cg/XrzWc530kr
-  ET1fK4cluv9 aL7jlLm5S7uYYhFNbzSFjIxfgfQf561pWdur2ygyK3l7vLQ9Rg5/+vVtklmgdU
-  SF/MPmsVj5DA4V fx9KuyRoLxpruJg4Zjsj+UISANp9zW1SuuVRWh11Z3UYr7r3f4laOeFGKFo
-  /PJSR3dcgk5zj2Aqv K6vEXjkB/csS+flBBw2BRbxo8Kuq/vQ6DLc9G6Vca1Z5JVCMJHVpI48d
-  FH3gazvGMgoctOreKt5M SGOCCB5oFmuX34wrcnjrVULMQoEDrGQrOz8jr0/GrouEWJhCY7cyg
-  bUc5JOflYe3WoXt1huZpJbp ZgCA0anbkjuPbmlGTTd9zspTVHmc939/+RLHte4QhbgpbP5ZVZ
-  MHJ+YD8qkd3muZmnkiWFrhDFkf e4zx9TxVa2nsYplZ5Tl0aSbLcb/uj9KfLfu11JHB5aiJ9ql
-  lztGOfxFS4S5tEZulJ81S11br/wAE ZPO0VmXWe2WSb94yleVx/CffmpUngkgkhupreLbIGzsw
-  QF6dOxFQu8UsqxMEMbByCR6Y2/map3Uq q15mMTM+C0gHy5A4wPQGrhTUtOp00cPTqxUZNprtb
-  82NvD9rmYwosaTFpom6AAYG3j35qaxsgbjy bpjJ8xbcDyMDkH1NVILtUjt51uIXlj6psyD13c
-  e/9Kn8u8igF7HIGjbaJABz+H1zW8lJR5b2NJTn y8rdl0et2/X/AIIs80iG1Ft5bM0Ls5xnDA/
-  4VDEWkjjnZUe6Y4UqoAC5yVI7nHOatXRaVGgkUK0b 4XYuNw7j8arXFvKliHmuYgQp8tQuCyn7
-  x/DilBqyT3MaTb5eeyu/X77FporWZlkM8kaTuHjw5G0e /v71Y811uZUguhNK0mDzkDHbB71QV
-  7a3sxAtzFlMpIWyfnOMMPRcdqLS2E2ni4hV5JM+XuRuGG77 w+gqXHS72N/rLUZKUrJ6K60/H/
-  M6hZokuZ5GBjbzAjg9M9z7cVkzTTG4bfE00bzqGCfwtjgH3Ip1 iuHZ5SfJeQsrOcjJyqt7ioD
-  BcQIJGuEH2dgrErkEjJJ+uDXNCEYyauYYeb55LnUn/W3/AA5o+RaR MbgmVEyFBd87M8BT7nrW
-  bOBb6nKxbdDHEYyzfxluSRWtJJbixiIuIn8yBiFxn8frXP8AmWsixRMZ ZJJXIR1fhlH17mqoX
-  d27mlGvDmcpN9n/AMC9i1a3cK3ELtdwmMpuYY5JGdoz7is+/cSyF7lHDK6t C2OMY5U+tS3Rs4
-  7SWRFEOZo2jBHVfT9KT7R5UjSXEBmiJdkQf8sznO1vXiuiEUpcyQoxXtPacvNf rez+RWtRFKy
-  DbJ++yevTaOR9TSSSZ1CzxbEMSXKHG4Dvz+tEaXDndbRkRtC24d1YZ49s1C08Spa2 13L5bm3K
-  tJtJ2nsDjn0re15aGtShGad3p+RJC1xNdD7MhdlyGOAck529R37UguDKVdnCSrDhjjGS D396l
-  ikf7T/elUMrRRjaQ2MZpUS0hJN8rJlVAUHG3jofc9Qad0m9DuwmJ5INJbeWvz20FgvYjEkU hS
-  N9gUOVz17VpSanvtTGhWAqVUKV/M/gapR3EEeoRLPaFoSCxAwGjYdMn24p0NvE8p3zwymZfMYI
-  MMp7jPbNZSUL3aO2lXjGV5wemqe5pRW0kgtgk3mykM5wTjAHJ+n9akspLeJgJ7WWQzIph5GfLz
-  zn 1571DCzxLFGiMo3GMHP+rycgH602YyQ3JuJmyrZxt4AxjIHpXO05XTM4znKMrt67Lr+hqwN
-  ZHUyq szNIXkLhuBt6fQZq2Gu4YYrqcrmTKoFGPkP3vxrLfybkrboCrAFlKnoO4P4c04vdy5Mi
-  P9nCnafQ AYx9SK55U0/+CH7ru0/Pf5O5dMd1O8ciypDGqeXECueD3P0x1oiZIJJTOTGXIKSOM
-  hF6EY96qRSx iHbIk8ULKJYSX7AY5+hpbxvJtt3nJcs0m/avB4ABH454qeVt8pz1qslU5H17b/
-  ft95JK0FvctdLI s9s4+RAeSBwKquwhQoDG8sC53EZ3Y5NV7ET/AG2KBIzHald8fm/NgLk5zU8
-  TyOQ0jxtMclDt4ZM/ NxW3Jyuz1/r+rluEVU/eavvf9CvLdQ3YcztDHayMGj3J8z47g+gI5qGF
-  trSMkiyF2ZnYDAVgPu49 6Y9xJdwLGYY0hd8CQKMIP4R7dPxouFke1eNXTz0ONsa4IBHIPqfet
-  1FJcux0xUJRUUku/axXnuVk ESKhMrruK4BPrSpCZ7NwGjSWOVVYyjlmJ4P0x2qaJg9xEqWssj
-  jJj56L/Hn1xUweOGRMGOFGVvsz PyCv94+p96qUuXRI86vWqQl7NW022f8AmV5oJFkaSSaPD58
-  xEJGJM8L0709IEYebHHI0k0pkMW/5 htPAqqxLQTfMzNDKkYPbB6k+p96jYXsWqF7csF8tgoIz
-  jPT86qzatcVSM6q3Sf3J/cWb5MRSbZMS +bhuf4c549BVSR7a51aJVyokzI5J4G0fdqeNp3soy
-  0ZaeBypXH3R2VvUnmqPkSAqpw87/vQiA5AH UdKunGys2PD0Zyp8t7W8/wCtPUlS4ZbpVaEMjp
-  yhAwM9D+FT3FrEqiFGEczOCzNyvTAH49qjsY4L a/cSrLHIM7GdshB3BHer32d5PJjUiVUdR5i
-  nqxBK0VJ8stNDpxVepGom042+4SzUEm3l8s+YwcAD mPYOAfU1ftIzdXjLBHKWUKuc8EfeIx6n
-  FNgWRLyJHjUGFCPNxw4P8X4Go7gSxW8zo5BadTGyErx0 I+tc0nzNruFJybdOT1e39I6BIlJub
-  tQCDL8kJ5wCMdOmRUtzMgmUM6nETngYOeBz+FZCSx/aLcNP 5bksdjE9M4zVzcxtmKOk6LMFDq
-  OoJ5FcLhZ3f9dDmp3Tbldtd9B0U88jLiNFcIyoWXIZepNMaG4Y ySxziNhGq7T/AA56598UrCK
-  e9LDfDJggLu6gHJxU8ySeT58Q8yNiHVR/CvRgfU0XszWUnG/Ilr36 /mZdvZOuoxfb9vlvE7Dj
-  AXb/AI8VoiH91lg7tsbeUOB5mMgflVSZ786nEsSh45EaRl25MfGAtNju Jfs0iwQT+e7jYpbqC
-  OW/LNXNTlZtnJX9p7Vc7V/69BkEjfabXeyBWtyGjcZJJycn6VWNsIz+6Z4A sTKpkbIcdd9WFi
-  e3817WGSdZHBU5zs2jhST65NUDai5kYsLi2JkJIZ84X0raNrt30/roazVOMuZS Vvl+RWllRZP
-  OkjuLkH5nMb4CNtxj696ogyxtCyyrMY1I8vB+b+6/5n9KdsiiDAiQqSXjJfjaOCp9 +nNNWVUn
-  82AEgoIkHXO/rz7Gu+KSR0XpuDcv+A/68rFzy7i6W33lfMRTE5jG3eW/i/DGKjaOOMGT 5WkaN
-  izMMgMo4WqlwsNo+ySdhKn7r5SfvDp+eagtUje1it0huXKE+YQ4O4nPIz09KFD3b30PPhQc bS
-  T930/zewNfK0tsrpDbyCArHlOCfTGOtNAmNrHvVtm5ZFZRgKBwQfr1qOaAbkIUIxUuC2DjA4H6
-  YqRbe9aw3q5YqygAfwg84Pvn9K6LQS0NsRyxaVl6/wBXGxXckKF2jMtqhyAQDuJOFP0qnPbM08
-  qN unkSYybl6Px6fWti4lmuIJYvLWRjJgbFABI5LD2GKxpwGkLhZPNYA/KegPXNOi7u9rM4IYe
-  lNup9 rtr/AMALW48m+juSpbKFnRRjk8U27lE01tIytEFQg543sT2pk8KJeNHFL+7VtqM2Tkev
-  SogigQ5Y HzBlVzynOOa3UY3Uh1qVJT5ndPvqa1kpTVP9JglEP3QT90D3/GqbzzPPIpeKBTMok
-  O3G1vwp8t3d W0vU8t8rEZUnufoav2yzyyS3EqwlPNAeMIMlwPlNYy918zOLEy9lJyk07rT+rW
-  uYk0YnC7i6OOcZ 5PYk0rW9w9rbkZELuSVXqDnGB6ZqeRnNjFIIJo5GygyB68dB1NTIZ5bm23I
-  YiJAr8cFsHpWrm0gx FWlGmnTd/wAH+enyJLCUPOsAhmGYpHUh+vv9OKrXLNAIEIiETkOp28se
-  uP50LiOWKVRJDtTZknIA yd6n3NQm633yTImzy1ICvyApG38+9Qoe9dLT9TgeFhKo5Rimrde/r
-  f8AzK8zN/aC7kxFtwF287Ty OfX3qL95b3Ufl7jGgwyvyTkfzq55LTJBGJEdURotwGd+Odw9qh
-  AhFo6sxxkGPI5IPfPtW8ZLY7Ka hiXZ9PXQquqGSMsrFFX5RvwSPfikdlR5iwG4t0A6e1NYmYR
-  naoDFV3dOe3SpQzBJ5JCFuCSWTHIP Q1tsbQnC/Lf5/wDDWPQtNDQlYLWKXylYB2kO4tk9R6Ad
-  x3rb33H294hYFkXJOFGcA4J+mKxgbZb2 FJXeJMPvKvjLdVxT4b2W9iNul7EkjOhdyCPn54+hx
-  0r5irBzblb8zzoqUqsny2XXfT5rcubYRcma KEJAq4hUgFtpHf1NZ++ZgqxywSLCrLhRzkdT+G
-  a1riNra1ZFUCVz5sYIyFC4JU/zqo88F156GLb5 7faCyHG3HBH49amnK6va6/r/AIJ6VGEpWqc
-  l0UJZILazjiO8LLGB9/DbgflxS2cErXU7TSnypDgu zEgtggH+lTy6YssMlymfs/nI6knOBnDC
-  l+yLBb4iEgj83awZskFWyPzBrb2kOWyerN6+LjCm1Cbu /wCvkKCLO0VjazRjMZUOwyoB6n15q
-  S7iM32gxXaRusx8pv8AZ7j8802WK9bVhNdwvJFGxSIKMBcn Jz69qe2pKjzR2yAsvzK7AEZ4rN
-  KV046s5uXmanC0pddV+pUWy1C6uLV0ubYqi7Rtj5UN/wDqpjWl u8CxPL5kxQtgNzIecYH4VDc
-  G8eXz5IZgsk2+NYjtIAGMce9aDSRC38+9gkhEcq74hw4kxwM+ntWz lNW1+6w1iakJxnBL0Vr3
-  69v0CygP9iWgQRxOsLKzSpu5Lc1bW2CIskUOUVdsink7jwvP86iHnGAF 3RcI/nLjmN+oBx3NU
-  bYXLQxtvMathgWzxt6KfU+9YNOV3cqLlUp80ZW1ZYuvOit7uFogjpMqxEgc 4A4/GoTA10s8Mc
-  sOxTmIbeWXtz35zzTxeTx/vXw5kbeARnZ25qKO9LTRyHyxb28PlNIoxlyev0rW Kmloj0KM5uE
-  Ukrp/1pZjzBJ5EFuq2wkWJfMJiB2ZOSD74qERySySwRyBY8jyvbI3EH344q1DOzNM YADdGaME
-  HngfepbYfZ7mZLd0mkE+5Vxksq5/xx+FLmaucs5TTajFX/J9zNmayiaCRorrMkL7C0nQ DkE/j
-  Tmkku4FgmAiIi2O56bsdvQdK0J4DNBZXGxGtxbuT8o4w2R+fSs+7lLXUd3FC4Z13bD/AA7h jn
-  1xWsJKVu+pNGfPCL5m2m+vUhtrCK3Yfa5I5WkbCL64U5P51qQzx/2WqxAKrIXmVTgq44X6A88V
-  m232OWbfcSMAjhFfdgBcYx9T61qmN/7OjgjMewhg42/NkH5eaVd3l724YhRVZObb+Vv8/wBCs6
-  Sr aq33wyAxBe69WP4ULeGd5EmxBHu8x2boTjgfjWcv22O+EKAxyLgx7+flHOKt3PmTBJg8cjr
-  KMIgx 17Y/M1TppOzOmeEhF2l/l9//AA5PeQt5ANy6QKyqAcYHOOn0pzzwwIYIoCZokdY5cArg
-  9eKpedNI k0V66FTmVTt4baeMexoSWeVJEysU81wJUV/4F/uml7N2V+n3Cq0nHlUlon8v+CRl4
-  Lixjtw6QgBU TzBkkA/e/OiK18rzkeQl/MVJPrg81B9kEUJuZgS8c6rJ6Nn09B0pJzLJffuxKt
-  wsmwc9d3St0t1F 6Fx55XUJWj30sSym3+yjyLqPzWUZUoQc56A4qnA4aIJfeUjiYSRlkyVC9Qe
-  O9aCwyrBcI5gLLIDK ioA4IOOtQzwILzDkukAxlemDzVRkmrXO2tCpiaVpzbt979NP67hmS4uJ
-  Ag8t5nMjjGCGHIGfpVq5 hurpbePy/nkVn3kcA44H1qta7JIp3kjlFj5u4SbueOBzVRoZnvJBC
-  0rqn3WBPODU8t5drHDTpt1P ity7f1c1Y5lijRZ0KlEVVZhnC5+YN6k+taFq9hE91LGytD5yhS
-  edqkcg1myxrMZWuI5IkL+YjE9F /iz684FJm3NkrQspkMgIXscA4zWMoqS9fuOudpRs01f7vvL
-  E1wV1F/IlWOAY2Mwzu4xmnCRbaG3g m3TuylMH+L/a57DvVaWeKWztCWWIhAhDDgZ6/liqkhMU
-  bbMkn7ztz5ZAOV+pqowTSWx0SlGq4x5e Xz/qxsxh2mhJuoZpY0kQtGMKfQ4/SlElwmnOZ3Bif
-  MhbJG2QDCj6e1Z6uY7KVWR5LffGx28MB3Gf rUlw9nM6WtqJsFt+CxI47fiah09fL+mRKnOE1z
-  q6XWy/P/gFiG4VGj89JI5Ik27mORjuMfka0yk1 ywNuoYzQl2kxxuzjgduK5q4tpLYw7pcyL0U
-  88dyc8d6Yst1FexRp5imNCEQHkoeT0qpUFL3os2lR U17alv8A10f+Zr3LzWiCORxvCMin0BA4
-  +ppbGNomVJd6rErbHc8EY5H49Kjt5XMSNbp+7WE7DMN+ PQH1PXmq0ySXt+Fg37mVfKAbA2dST
-  9DUKN04vQ4788XGbStu+33afmTz20i+Q8cy20Dw73LgkDIw F+tPsfmt4y6NJLbxnyiD99e+fX
-  iq0Ya5uLnzpFCPIpB7fL2FadonmzS+ZC6sgZTsOAxxzj9KVSXL Gz/r+tjKrVpxj7O7l+X6GXF
-  dtbFJYSPPRCE3Lu/dk8n6+9SlxLqb23mL50T+XE+Pl2kcnH+eabbx SJbbXspkneHCBjn7vapo
-  WZLuFvKEcrRfMxGQ5PQj8eKqXLq1v/X/AARfu+VuH+f3+RVhEMazr9si hMlwPlcE7doIzVu4S
-  WKyuHkYTvK6lTGcbRioRDIrmL7N9rZVIbAH3yOKmaJJYYQ9yiTouyVDn5nb GMegxQ37ydyqUX
-  CanLbraz0+SuvvIALdLJEkS4h2cFi/3t3J+tW7KIygxIphlEZ3O4ySRyPoMdqs XMFuJooIMTS
-  7GZxn0xgc96rRSlJSzK0MJYu5Y8pg8KazcueN0VUvODcE0/P/AC6ilY0uIYbgxyXM kTYwPv5H
-  9BSQSRyXSwqkkCkBgzHgqOAaXyJbh7meK0nBkcPHMSMDsQPaksILS2keVpQpBZJfMOcc cEego
-  fLyvuKpD922n926ZJcBQyKS6hx2PRV7Z9ScUk63tzbJFJiEGJn2FeQV5ozaMIEVJpEIBLb+ GG
-  ecfTvT4ikmpXSxXUJiklGwk5JYggY9AaSulfsdOGlKnG838Ouv/Duw2GLzkgnZQjSqzlj0PPb0
-  FbVhKLiOZIU4SVURfXJyT+GKyXVo7aSCSVY5Y/nXjpt/hqGzvIZXd4IZ1Vn4G/7g5JB9T71FSD
-  nB sdXnq0m5v0N4+fBfSm0MboQxAKZLDuR7daswXH2q1+cCCLpF/uHqDjqeM5rPuJUZ5tysu2N
-  mhKNg NHgZ/P1qrC15HcI0Vu7RNjcuQeTxx9BXN7LmjfqZypJ0+a2q79S+IWUyXErFmRkRdvAO
-  7v8ATpVG 5+1W9uzLG4uEUur4+UADBFXJdR8qcrHPbkKwieMpksW6H8KxLu4dLkW8CzNOA5Ys2
-  QMHpj6VpRhJ y1RhSd6n7yK+f9f5kVvcI2mvcKZDFhQED87wOufQHrVS6uk+3w3CSGSXb5rYYh
-  Wzxj2oN3HGFgO2 IKu5Dt4Hcg+pPaormUyfNF5CIkbIfl6Z5Cn3r0IU/eu1v+R0RhJv3oavzaV
-  umyIFluHmCTL5jfMw 2rjGeB+Ga0IZoY7QSEok6tzuGVwODgfXisqERxQC5lkMUZGI8knecgkU
-  24cyzTJG28FywAX7o6kH 8a3nTUnboLEUlVkoQXurdp/g+5LudmVmRWmADMXAPzA8/jzVkm3ht
-  9sTb5Em2ttODg84/ClimvZp raNbJmjJy+EwWY98+nSorSzmXUWh3KLjd5u9h8uB14+hqXbW+l
-  jJrn5rWXKujNJYtMnjucM87glN qtyMfdI9qzpLZbS9S1j8yVmJWRN3L8ZBHsKmit4JrkySLII
-  pHdwUbGVH3f1rOWVRfRpJcpBM3yq7 g+vHOKmmnrZszw1T2kJv2jtHv+WhZmQRyhHt52i4ICth
-  gSM4zWbds7XBJ2xkk5xxu9CPatAGVLto rpzKZyJW2HG3BxVUN9sugYouJ/3sYPITaSCPxxW9N
-  2d2RCrBTd1bu9l/XyM+OMz3TDcI1MmAWbIG egpGheOY4jkyDgHHtk1NPbBbsxllhUL1IJ5xnt
-  TEWKMDZIXVycY6jiupSvszeUZOqoJ6Punb7+pJ iOS2VmnRmlYs/GQp4qOB54xLItwjHzQWIzg
-  56mo0RQpViqvuUbj93vS20pkHlsm0s5bKjA+v0qXH Rnm16UYKSvr1029CT7XGZz5qkQBWSMd8
-  Z4b+tRzJAjKgL7h0O7/WN/eX2q1Z3Hm2Hl+RbTMWd8CE E9evTp2qCZ1ubeGW4jcqke0NHgc5y
-  Ov+eKS0la1jOlUmoqXLZdrp/hoVSgQBlYyMflAB6MTyPrUv 2S4juLeaKRUUbyxkGQ6j7uPqeK
-  gR4Ycy25MTCQkrL82/PHHHFajRwz71cTu0TbFUP98+306mrnKS 9DlqxqT+J2X3fLcmtYilmFE
-  0SXCAqVZehYZAPuTWVe2zxpG8jAttw2BhYyB9wj1NWLkmBZZTFIpk kVgWPDAjqP6VHDPHc3ck
-  jyxrub5S/Krnggj1x0NZwUk+dbGMaNWm3KPw7+b+4I1t28OrcJiN1+Xa ecnsfwNCiK4t41Y4l
-  Q7ZHHb3NV/NNtGIoplaPaUT5AQyk8t07VLaC1tS0aSAKJAGJGS5PvVyTSb+ 4wdOpBXb130f/A
-  O3SYS7kkMcjvKrKir83XB/SnXOnW0MwktXJLuWiYE4yOgPrnnFQJYPaRj7Mr3E xJbg52heo/E
-  VoWotpWLBzGFb9zG5ySjjgn8e9eHKXL70XodSw7ilOL0fl+auNjtLxftF1Mzpifyi jc7c9R+P
-  amy2cKSBFD2uI28wyN905xt/KtOewEOlpHHM8p2qJFLkkvkYNVkMWnT6isgZ4HuDjzDu JLL1y
-  e2axhWctUz0cPiZS1Tu/JW/AgtcW2/96zRsVAJ+7kHnimSTvJq4ZUZY4YjG2ejMT6etPWKO 7g
-  tFwZRCFiOw4yCcn8eOtWPswgaRgJFtpJCyhjksOm4H0zVOUVK73/r9CcRXvJ8+rfyGi982J2EU
-  qsZcgscjjqPqcU6W2jmeQNC7JM5lRo8DZgfcPvWlbWyAKEiaSZtzKvqBwf8AGsgwy2kUKO7TAq
-  37 xTgEg8YHvWMZRcvd0/r/AIB5PtXKWyVvPX8xEmuI4osFI0kw48xc9PT0qnDPOV3Xmy6dgSx
-  QYC/N 0Of4j61atf7QLgTRpPEJFV0VPm5zgD0pYhHDPIhUhmOTnu/PT29q3ulfRHZTcY3en9fi
-  XJZ7p2jl toMSOrtsKA7SDgFvXvWB5sxkt4TIslzKn7wpwMDPIHarcz3kH2RIoncmMLuB++M8s
-  PakNrN5zOWR cuSzY++o6lfQZwKqkowXQ1w0uTeS8rNX+fclhgmeN47iaGNdwEYZOSAPvfTpUV
-  tGkhfDRS7pFEgA +UkfeYD0rRguopCyi3kJchuSDtGMMKqSRxLbWazRSoiJhirbcgHDZ98Y5qV
-  N3aehcHUTcWt/QuGG 3tpnuhIhQOCBnqB3z+NRyR7buN5HRYyhDOo6Eds+9WltpJtQMVo0f2YA
-  iJXXcdnfPrgipXsJFsmc zxOElRRJt+ViTnOPTtWHtEnqw9ooz5ebXz/4bT8ShIphW3lkjcRxw
-  PG0Stg7mP8ATNZ627QrNErq JIpFgjD87lP3j+tauLhLy6NxIpE7eeCV4XZ979cUtncyXNi8iG
-  F2adJXOwcH0/CtVOUVf+v63G+e m3ZJ/l+RWNnZ2zRpIyPBGHCjHTHUn1rOWST7JEu9ApXcDjn
-  g5K/XpzW20UEVtc3UqSSsbgKGDfKF /u49e1VEht57ny1tJ4N5LqjPzHgcqfcmqhUurvUinOct
-  WtPkVLS1uJrSRVYCZZifmGSo67frirRX zdNhBtZY7cqPm4zyeDn9KmtYEigE0UrK77N0ZJJjY
-  kjafcip57rar2m9GiPIXHOV6HPpUzqNz0CL lOquSS06tbFeKI/ZrdIYQgjiZAZQGO3PP45rPu
-  bV7qS33W8vkAEPIuBhyOp9geMVcZnmado4ZCBK jKqtymBkg1o+bbta3UARyrSFzGG+bpkEH0H
-  enzyg7nb7GVFJ3u+/b8TjlW4ntxDdZzGcFQMc9GJ+ nFSk21tKSgaVgOG3d14P+NakLpe6fKGM
-  cSK6oJSPvlgefpxUU2mQi1DCTyXRWWUsfauv2yvaWnkd tOvFQ5Z7Pok7Ge/mm8WOOYC6Zd0gI
-  4zj5s/hTn0ib7FC63cd0ybo4xHn5xnvnrxT5YrdWeZZ1WRN qkkk/e4x+Wa0Y9Pia2dcywBJ/L
-  ALHK5IwT+FOVbkSa0+RlicQqNSMrWXmv8AgFFNMmbR5I3lSE7w QjA8flWlZ2FxHfPJDLE8aFE
-  zt/1h67h7VoBoI3eJ23xGXKt3kI4BB9M8VIXAWMrhZEDeaF6GTPHH pjtXFPEzkmu559XF1Jxd
-  J7P7kVX08yPi7ljERgYQsoxlAcs341TklhlQojwW+xgRleqgc/4VqQXH 2tbszJseWRWGT90EY
-  AHoMjpVC5itRbGRbaZJiMEFumeP07/WlCTvaRp7SpdQm9trWsUJo4ktg4lg Ikw5i2/MCOKha4
-  thdRNbRSSzONzKTkAZxtI9cZ5q8F32IhWAu8bCIMOwY5yfyqOZLmS+uVEaQt5g fbs5TjlT/nv
-  XTGS6m0KkXB3k387fgihFcHbJ5kkUayT8K4zuUcAj2qmziI23lxlpMlXkToME/wA6 vxwQtN8s
-  yrLje0TLyAvoen1pzyQzwxRIoTE6hnzwdwyf/rVvzJPYVScoNXu119P1KMwMskCz7wjQ 5MgOA
-  v1/L9adbPbRym483cwUoV7kHqf6VpS2yy3KpyvlMYxnkEt3/Ksi5V45YrZRG6hg6MigblHU 59
-  zVQmprlOjD1VVTipW7pdvuf5lmaBdkjxpMsDSL5ah+ijrTxcBIzNbxNGYN0asxyME8D69aikik
-  uru5itJSys+8nPG7GcD0zUkK3QEayshcy+b5YXpjnB+vak7curKquVve963S/TzJYpI0itJ2kU
-  Oh yy/7Hv7n1q/9uFq8cZSSeSZ/3LIcZTGT+Oe9U47yC4uJDHaySBpzsUEZQY5U+tSNZXKXkct
-  ycxOp AK8YU46elYTjFv39Dj5Kbi5S0t0vv5K2pm3QMmp2WJJlUw7mG45B7CtiGKDb5sRZmjm+
-  QM2SykYG Pxqo8MUGoJmOWaHbuOG7rnaM+9aWmT776WG4iWF5U+0ZPG0pwB7c060m6d10OrE03
-  OlzQTaS110+ etySygvgXNwNgikCYx3YfMT9Ksi4g814Tbqp3rIkhAy4UdPrRb+VPbFi8jM0uL
-  k7/wDloeOPSpXK pbyieJ5I1AijKnBO4evtXDKV5O6MVyTjzaLyWn66kDyWtxfJOkTMkqMylWw
-  VHYfU1BG9vBam7lid 3YBNjHIIzg/j0FAgS3WCOEthEdMHncTzx9T09KUwia1topEe1jYFlMh6
-  Jj5gfcHvV+78gclKacn7 r0a6kMt8qwYCuHQiN0B+65zio4EsjqDRXc6FmQDAyN4wckVKloN0Z
-  8xE+QI7MM/MTwT6kY/WpJzg zSLFHclB+9eNfuMP4Pqa1TjblidKqQUJUqd/vsx6CwMcsoBSKO
-  RU5boWrPCxxXG2RQ/lkEmPjaec GrJhsxp4W6tbizjkZZA5l4fBx0qzdRWdxqJWOUNN8xCIT8w
-  I+99BUxkk+tjNckLc3M777NffqZv2 cSadJcKWKOyqznnLg4H59aWO1Np50MbJuF4CwYcj0X86
-  vfYrZUlDF3Rm3fK5AJAwMU4IXs9rFY5h taRzyFZeuffFU6t1a+hrVqup7t7r+uhnTRNDqD3s8
-  oUqsgCEnrjhalVt9rb5hu5HaP5NkmMDHIPv 71baOS5SQuoQSEypkDjjgH61TFvLa+XeM/WDH0
-  znimp8y1eparua95pNfiVHCw6PG5t5wQw2sWzv To34iqlxK6ySFGY2m47STluRgAn1PWnvJe/
-  Z7VVDBPKwu4A4z1PSneRLN5qmN7gtKAsUWAzKBw49 hXTFKOsjLkpQXNUafdq70+eifzGQBhDI
-  JHt9+5hIXTJDgZX6DHanokU0dskZSVmgKTlTxvPINOlI W6khSN4bcljI7c7iR1FY8cclsDKZk
-  kYTCNdvZSOv1Aqox5tb2Zlypu0ZNPpZJ/kXDa7LuOKArLsT c0bLncc8MKjR/scbmCSF2LlW+U
-  ZjB55z1qjKVM8rQtKNhARg3UDqac9xIzPnZsDEABeSP7x45xXQ qcnvqb+wqOd07p73Wvz0L8s
-  WLRPJuT+7GNoY5ORlj9BVO3jurbTJJon3rkB2HVQTx+BpVtRFEJWk aTYwJ2HA4PT8afcuJGdo
-  pAUmbPljgqegBpK/wrVCoyV7Lb009P8AhyENc3DLATvVWIVVAGcntx0q nKEjuSLkhz5mFI757
-  j0q0izrceW37twu0joVz2PvVdEmuZI12KZNw25UFiSeK3jZPyNK0eWL5bKP 3W82ORi1tFJbEy
-  SqjIwz0Gev5ZpskczS/u0cqJdse3+EY4P41f8ALMF3PCkEsUjPwD6E88e1RXNt JbLA0Eh2SSk
-  ZIztUDnNTGor+pwqs4S5Oa76aXb+7oQbJZWmA3BiN4B5IA6D602GB54gAoXEvDEcK jfeB9we9
-  SAwi6liEu/L/ACEDHy49x+NSXEix2lulnJ54lVlTbwSFOS386bk9kTjsRFqOr5vnp/Xm jKIxO
-  Yyrud3AHU4p6t5yK7MyBVJfA689R7dqt2iwQXQkQTTMqsDznJYZ/wAaRzaw6cEjl8yVwAM9 Nv
-  X065rR1NbWJWJ5pck20n1X6joDHDcK8ToxbLeUB8xA/p7U2Uo0MZWCQg5yQ3B79Paq6wkwqJWE
-  LKArKwySSeufTFNXayNJFHLJHHMFByNrBep/GlZXuRKvClUU5J39N/yX4Mmfa1uqCEMyJy2OM7
-  uv 5VWRJwkpkmjBEu3KJ/CRwat3F+0stwiW+3c+SVwMen4UrXDvE6LAC6j5iQDyB7inHnS2KhG
-  rUd4p xT7P/gFaK7gjt4YtwEhO5POG4DngYx9agke4VVljhh8k5LmOIBeTg/lSn/WCRooZBGhQ
-  nYMDcMj8 fQ0ExbEgYvEsURVhnv1A+uavlSeiPMqYd05W5eu/UjWYRXcUs4jni37cIMH5eAOnG
-  anjluIdQBji VnVsyIY8/Mc4p8c0ZiaGUxqZ5lmZdv8Aq9vY/h6VEzCG5MqRzRu8oaIs2QAOoP
-  qaN7po51rzqS1f f+l+B2llMxska5nRWZlxH0fhjkZx6VfkurSG8imgmjCKrjDDIznAH6mqVpm
-  2vtsiDgsmGHVtpO4e wGKlitpZtKhWNobjYUMhVerDkD8a8OoouV3t+B3ynT9o+bVfcvysi9+8
-  mhlEaygs6uATypXt+Hes 2NZLieYNKDJIWYMQcL/skevFMf7VBPNcTHaIpPKVRxuD85rW2Tr5j
-  w+XuRykI29j97Pqan4Fo1r/ AF/kehFzi/dktdv8imlm/wDZ00bM8W6aJmA788kelaQtZElZtz
-  QmNXKeaxYHPXA/L86rSMRaxTWu RLt2lXO7cv3dw/DJrXtYRFfsTcLMY4WhhB5DL3P19/asKtV
-  2vcynWUkrS+XmVLe2uYzbKrtJhFV2 U42E87fqaTasGp+WY3gzEziSZtyLjtj15oW4aWztkMcu
-  0xlmCNhnx91gao287SSYkV0UDZK0h3Zb B/LtUqMndv8Ar+vQ8xRk5ObXy6/16otG6uTZAPsWR
-  gHyF7rwahW0lnlwd6MCUyfzP+NTPbXLWP2d mWRSo3FRyR3x+HNSxypAojSZQJv30LvyGC8H86
-  fNZe7uPmUIpwfvGch8m7JEU07qAD83BBUkEe1R /aHazhmmikP7t2jIONy9GI9qutcx6jBdNar
-  5cjSxu3sp4K/UU0soysZSaIkiIDn5QcHFaJ91qdSo QlNSqL3u1/1EhW2/szMcheQsNuDyF9a0
-  yktxAqPD8uMFvXJ5P8qW1Jd3tkSLaWywwNxPqPRQOoqZ poUtItsy7fKcKxPUMeP8RXLObcjL2
-  jUlFLW/rYhit0/tFCrFjHHJFhSRjdzk/kaGtvtVsRFMPKEi gqDyw7MPbNUo2voTsFtNcyhfma
-  PgH+9+lXtPaOSWWO1Y2t0doiMx3L5XOePz5pzUormvsdk4VEnP m27W09ev4GZeRyNqgUyGXJw
-  Qh4BI5/AjtStBO4jWBH+zCM/OnHLdKu3wzZxxuQiOpcy+oyMVVj06 5uDJLHOYDgZkfO1Mfw49
-  e9axn7qbdjSlV09pOf36r8BdLtg0iRzOwY7S6s3TGc/jU5tyuqxXUayS wupZWU9z3+nAqZ2WI
-  Nl1Z2cFdowVXHIPvjmq1tatbqDbSM8GCIAWJ4/r3qHNtuV9zKVS6lJytfQb FHkxvMrgSFXBHA
-  JGefz4olt/tN1biWSNopEZpIkGHU9Ov4CrTwxfYZCbpFMkqzhsnCBSPl/GnSSw RXjebbytE0h
-  wUIGTwQfoCeRSU3e6ClGVlNKz6dPzH3HlWlkA43NKnmNsGDkMFz9MVmvbW7I8tpIW aN9i/MT5
-  g3Y3D2HSrSpbSXZkkSWQFGM534GfYdh04pGjUERrYXCFXKffH3CMsfwODTg+U6NIpaO/ olf/A
-  DKEr20MVxFKu1TKuwLxgdh9ahkt5vMuoo8gKdspfnL7f6Zq4+mKkhKsbna2WP8AexySPr2r Su
-  CkVmpjgknadzMVUjcAMdfw5rR1krcutx1cV7N/u1dv8PvOQitVDQxRwzTDaFnYNwzE4BH0rq4o
-  7qOzkjitpGJDEM2Du2HrWbCmL0T2YMX8IWT5twznd9B1rSjjvLvUjsLEhyFK8BxjqPaniKjlu9
-  F3 FjpzqNLmvFau9/8Ahh0Ane5mknWOKBnVk3LypwT/ADqK8RhZWiSxMshJAYcYI9ffmpxAIrc
-  tdSEg Iqtg8ZOQP6VflMk/lwSwPAqRu0hfHLgAcelcbnaSa/rQ82rGTnGS2+77u5gw290JIti4
-  J/iI9ODj 8elRYmiMYlhlMYQqxb+HBxgn1NXltilmwS6BAwXOT8m05/8Ar0gu0lhuXlvLaYm5G
-  7YuByOP0rbn bba1GnUTbi7p76NW+ZFj7dI6wzRxgEeYoHIfOFH5CrjRTg3SECSZpt6uAMHPH5
-  CorkQwz3TpGSxl VZthwGOARj0xUUEp+0XT28zFzJtQuchRg5H1zUvVXW3/AAxpXhBpOCv69zn
-  r6KSPU5PL2xXIJXkc upXkj2qs8e2VjKGESPsUA43YH/6q17oXZEMsUL+aqiMhhuOSOP061SmU
-  RWSApJJdRBUdc9zyDivT p1HZI9GnXqStZJ306XXz6IpPs88AecJyN8ke/lWFDW8lvvljI3tMr
-  R7+T/u/rUTNJNtiCfMsLJLJ jktnI9/arEMkzyyJ5yRZUuodc7eOe3auhqSRs6U5Sdvne70+Qk
-  0kkL3CMPIM0sZ29GVe/Iq5LNGj 71uYpUVHWJFB3HJwDn8abZQGc4klVkEPBIyX5xkH6VNLLFH
-  ZxCGITREEblAymD0J9qwk05JExmva KD/Db/MzbhI83CKrAxEDMZxlsYJrRFx58SPDL5CiUcTf
-  NtPQA/WlaCGJZLYyjYzeZI7dWA6kH0NC GxaXzSJCgIRAp+6G4wfVs96JTUlsVXxMeXl5Wvy/E
-  2r20NxE0DuCylgTGMZxg1BbzW2VkMbvKq7d in5sMfvZ9AKhaZZI7iNJDJNFdxqI14YhRgjP+e
-  lSwXJ3T+TbMsjuphDgHMecGuFRko2f+R50lKKa k9Pu/wCGH3gSW0IidQqEI23jzGJ4cewqmlv
-  DJqMZkM4iVGH3zhCPX3PanG3eC/u13eXEsgEYY5xt HQ+5zWsjzCIAQCR41KthRwDzg+pI6Gm5
-  8itFmksQ6KUISvft/mytJPFJppUPGRuyQv3lBAzz9RxT 4b3zIzFAMRuR5bv8wxnDD9M1Uku5D
-  AqxeRBHJC8gDplowP4T6n3qlNNG9jbnzEgjlXfuHG09hx68 0KjdWaLVOpGEbrr6/pqad9DcXU
-  yW8GxsRM3mAYEhyMEVnb9Ta5ngRYy5U5AXGTjrUrXlyLx5HzEs cwjLEYAJ6UnmK19CFuVEkQX
-  J67ufmP4VpBSirNI0hKdOD0TtqvX+uhVWGCSC3+0Q3abmQqHl4UDI 2/UmtZdRsbK/INvI7YOV
-  UjKY42k+vNUbrL3f2hWE8MTeW5j6B2Py/lSLEftl24mha5QnfxkMRySB VNRmve2+ZdKFOpFqT
-  vfZXdr/AKEkTxXV/NECYRDIApdsgqByappcmaQKsokTaG+TjqeQfUnpSCeS SWWeaL947oSUwo
-  +bgjFUv7MuIZ99vIiIFZH3clGwflPvWsacFe7sXKGHjNqTs7adfuLSX88mqbxG YGLbiWORGAc
-  YIovpHMzwbmLRLhXB4fHPA96itwohjC7pCoViOrMxHHPpntVq4V5I90jxwztb75lY fxeo9ABV
-  +6prQ6aNSLrptWT07/8ABKzvI9raFkdZHVmUnoVPGfpUTzPbSTNbbnmLNGxH/LJemD9a Y8jwX
-  NpK8q3MKpx5foB7+uaq3DSCFSm6Aw/IMjls8kn1+prWELtdjmjSndqOsW35X8thY1cXqecs vk
-  yL8zk9fRh7VXcSRXJZ4+REwYkcEnoRUiTXb3MKwSRHCO7Lt7d1plyxjsEL5BGIwG/iOM4+tbpP
-  msy5VZqraVlfTf8AIqGCSVbeKFHlmwQ6ge/FWo5HAlt5Io1Eis6uVwVHp+YpYGmbe0OItkgXOO
-  Tn nNNFvDILePbI52Oxw3KlTnn61cpdH/XUyq15QldfLun+ViwJbn+ylQIJMDG8LwT3HvVSxjm
-  uZopi 0YhjYCR8dPr71JbzTw2xuBbyO88jAgdFz0OKnt7gjTJlVQhZzn5eGx1NQ7pNJGdKDqLk
-  TV5X8vzu RXweS5jKlIlDHeSMkjsayZJZGnQqjnOckfwntWlPHELCAo7lpOChYkjHf8qjy8cu6
-  Hy4x1CuueM9 +OtbUnaJ00YzVJ8t9Hb7vkLEIyWSdZ43ZS3mGTPOOTUbK8mn28yszRBQshxkKe
-  w9s0wvJHMjocbQ VAbkc05i0NzJGfly43IegK9M0Wd9BVqMo1PcWi1syFTJvWdiFKMVbK9Djp+
-  NV4IxIAzYj8s4BJ6e 3HrV24jaWzhnWGRRhlkOcjORj8ag3MkBiZAJiWMuR159O2MVpGV1ocUJ
-  e0nzWu+t7FhDD5kZIbck Rf5TjkZP49qekME1qtw0iwsVdSrDp6/zqKAv5EskEWGEyx4b5icg8
-  fWo/LdIFikBRhGwIYn5uefy rNq70ZVaUqtoUrLvtf5+Qy2e1iy5jlkhUNH97JJz6/jSS2bRws
-  8BdEjk2ybz9854x+FCBUsQ0S8g 4k+XIGen4moAsko3jayxnbNhccnpWttb3OaVKCirv5f09Pu
-  Hs0RikCh423ERqTy2DwatSQ3FxcW4 hjwrgKTnjpk5rNjiENpI87Kk8c4AXHOTz/Srq+UksCW5
-  lmnCNvCE8EDNEtNjF1alkue1+r6evl5l MxsbyzXcsm7JcIMYHfPvgVanmtnnDph1bIUA4KjHG
-  Tjk1FH5jzwLHJGzuhwqjnGOn1okiS3ZNp83 kF4/4l+Xk/mabtzHHNxjUum5SXTa/wDXctQShb
-  HyktgWcqS5ALMp4bB9OBUoSK1ncEnEPzQyPyrg df51m2sP2G2SdnMi5C/7xJ6j2FXEdJtRBu9
-  +1W/ebc4z34/Lis5x1dtjjjzTlJ04XW/d36qx0mJI YoGaeMSIrZkbnDZ5/TFNit5BNnzcKcbl
-  jcghgcqD+HP0qOyjMEK26AZWNmmZ/mG/cMD8q15khfV7 ieQSTAsQqwttyAACfwrzZz5W0fQU8
-  Q6dGUZW18l/X4jF2m8kmAdojkvuORkDIpDL9ujhMEc0oWIE Kr4MmeMj6HrTpJ4ltQsDpHsmSJ
-  S/IJPr60sVisNxFFv86VS77YTg4B6j256e1Y3ja736GUa9JpTc dfnp93+ZTtIEl01oZZGt5I5
-  VJZ2PzAnqPY9MV1SvNb37TxlPJjJjkyucO/QfhXIrczi5UPNBHHFG FLMmc+g+prZa7uotQKKU
-  MLSYPy/eJ5P49qjE05SZpjaEX7tlZ9/00NGS2mLvsUiQcEjgAL149xUU peKWGCG7tFMgdolaP
-  5iB3J71I01vkZS5QvhnPmfdPv8A1qbT5Z45JIJLUXA3j5gozjknB7A+lcd5 JXfQ4Zzkknbbul
-  /wbk1s9zBbQyzQO6xtGkjADGOf8ap6hdR3MDwQLEUjU7NqgEBSDTbm2vXKokhg GFJDfxc4/wA
-  KiL2kF/JIx+0SwnYY4uCd3b60RhHm5t35Bh8Iub2srN72X+b2EVoy93JeWlwqSTll WIhCwwMk
-  Y7Cqypbx2gjimFsInC4lOTwcn861LkC6WdJswtET8/Reg4/HinpKwtI2je0VppRK5eIH Cgcj8
-  6r2mn9W/UiUpRkua+r26fqZ1pZzzzCeItLNIoIKHAXJwRWvHCY3kiNxbNF5mCSnfsR7e1Zo eW
-  aUEK1uxfEQU4yv8XTvnvV1pIBb5lvIWtw/mMVGCe2c+lKq5SZ1TxMpSUNL+Sv/AF+A27zD9pkc
-  Sk7gpCNjJPYe5HIqGNrGIRbFltTs3J5j5IHVQT+dTXd/E5ZVhkdGmCtIDwW45/HoPeojfSS6i0
-  bw oI43KOpXlc9j9AKIKXJqvxOxVJey5eVu2rs/01Qtx5H2GCSIPdAx5ljVudwOQR6AelWbG7Y
-  RTBri GMySrIXZflyB0x7iq12zI0k/lEIW3bBgFhjGR6AUs8ccKRoJog23OTzuyRzSsnFJ9TJw
-  j7O8ou3f 9LDbi1nlGzzFMoZWdFGCgU5Ofwq28Vo8M4M+N7CcMHICr0P4YqTzJ1WScqLhwHRTG
-  MZ3YFZNpbTR 6qEeVUQBFk3gnaQOh9jzSi+aOrtYmlUc6LlN25dv6szYntYI3gWNHnt1gcsqNy
-  W/h/DHNUYmQ2lt JHDMp8rJ3tuDHPJH1FajTwRASuQ0ZQ/KOoPTH5VHBb2qTrBBLulSNiIy2dg
-  A4B9+9ZRm1HW5WGT9 nZxbXfW3z7fcUbqZSGGxiVyqRqcErjPPqalWSS5szugnSOQI4Jbrg5b8
-  DV+OG2hsoGkIuBIAQVOC +eMj2qNrMCKWBVm+R1ULu5UYyc/zp+0haxvGtSlBJ7973KzRl9ZaE
-  EtGwfeFODG2MgH8KznkWKS3 mnt7pSVww38bm7flVxLEFFnbz5N2HiZXxuHOfrntRLcQtZwyRT
-  RQtNwiT/MUJb5Qffg1rFq6S1Gn T5+Vaxfrv8v8hph+x3TKkMvnuxdSzZVQq5xj3q3a6jK9lDc
-  +TteWMtIqqBh2GOPQY7VWYmdh5kou 5gvzeUcc5pFWCNJ3iLRSk4G85X2IH51MoqStLcirTp1H
-  yPfv/WpNFJILF0wIgkqoWlG7cU5/TvVv CXdzdebeI7ySsSyEgEEdvTpiqsBkSNFZfPUHcSPXt
-  mnRXCrNI0mn3FiPOBeSQggFeQPy/nWbi7tr f5f8OeevaRcrLXuv+DqUTDGdoil2wkAFCST055
-  p7fZjYtE6CJ1kCJ8uCwbGT+HrV3c91fyXG2ImU NMiIuMheCR7UyVtLk0+RlcpsdFikZ8iQP24
-  75q+dtq9yo1Jykk38+3yM+6nl+1xW8LpIgjbLAenQ n3ogeSW1hiht2nkj4LR4G75t276VA8qQ
-  ube3ZEniOHdvmBwDnikt7SRrqO4dnjcxERhGICrg5B9T 71vypR1DEQi6bctLbX6v5WMe6kv7b
-  UWulWWK1Mv71pOQx6jHpUMaNc3MckrEbrZnXDYIKk4B9TUk 8M/2K0CzLPHcASbSCcEHA6+9Ub
-  m3kju4wXYXCMXlT+8wIyB6DHavSp2asnqdtGrCcLxfvbdfyZLI bIWoYmRZnVMpv+7jgj8+agc
-  R+fcxKkkhD7Bg8qR/jS+UJr2Qh1hhdycuc/KD1q0dPu7NIZNpkGHy VH38dG/WtOaMdL6s9GnU
-  jBqCqczl3enpctIxSO0uACoERzg8HdxkewNVY5723sMFAVhbycFOpJya tjbPbZ3iKRYyqs33S
-  oAyMfWs1pgiXWYJA00wcAvwFxg/jWUI811b+v6uVQp80mlDm7+X4luW8vhN bS+XGrCBsZQEbT
-  1J+varcNxZLpyGJtsyKqENznLZz+FZ8TQ2jPm1m81W/d+ZJwVxxnikzeyabZGY 28ysrZZIgu3
-  nIBpzpp20sv6fmXWoLminDlT7WX6M07qWEIsYKNsBLSR8ZyeCT3JFVTf3iyW0cGwk rnbt5AXk
-  /pSBUgsbeVLyFZJfmfcpbkHjseOoqNrW9vLgxrEWQzDa6gDaD94VEYQS128zhdOmoOUt I/3v0
-  0X4M0lvLoC3lleKWFk4VV5yTwSe9W11SFY5JZbuG4KKVPloV/n1J7elcxIJFvAVimhkUgkO ch
-  QeDx7VPMkLRK+1ZkDsIfLG3egHBPrnsfaplhoNq/4GU8JHmSavfayS/H/gpmrJqFg93HEEYxcc
-  nsAemf51RubssLNjbhjP++Cj/lmd2AuMY7Z+hpLVHisprgRqqEkB5ACAeMD8aDqFwyuCkUUp2n
-  DR j5SowR/WtacYQulG/q3o++htLDQi709fV7fcJefa5LqNxMirFceTJleDu5yfpWjBiGZDJAx
-  fa4Zi OAOmPqTUCR2H2eKNoLy7ZNrkxy4z1IP40xHQf6Q9rdLCylipk5JHf6CsZaq1v6+85Kan
-  zcq0Xpa/ 43+8049OS18kwM7jbiWLdkh/U1jLdTwyiXaI5HObgMMliTzj0xxTp5LloI5ITJbxy
-  WxaZ3OQW6Ae 2f61nQzgWke2VRN5ibo35J54H+NXTpSablqdcqUoxu9blppoZLeaS33yFSqZXo
-  CD/PFWEAjvwrPK SY2bhvvAkY/E9KWWGVbmfzWigRpG34XAVl5B/HOKq/ZUEkbXF4kb+WVZDnO
-  7GcVScWtyZVoVIct9 ej1+75E3leY0k8EcsbIdpg3fNGT0U+p71YkW+RkN1F5khhcbcDPUbs/h
-  xWcst4IFdUJdUDTcdW6c ++OafZpK1/se+QSpkRFskMvf9KJRaV3bQVRVFC7Sdvm/vW33Er/Zz
-  pXnW0DxxRNgCU7gw6j9aGKT rELn95ggt5fy4b0NRyTSS23lKCLO5w8TY+6B/CT68VVMrrM5Y4
-  YOgZfU+v41UYO3mP2EfY3bSktd 29yyLdDcR27q8IWErJJnqd2f/rVTt/7PmmRJFljdpCWkd8o
-  GB4bHp2qWS6nn1JLeN49rI+Pl5OOp qqyQ8Qput/kG6RznnqoH1rSMXbV/cYVI88rzbvbp089d
-  /wARC9xbPMDGGiMh8zHHPYZ7U+3e6eXa 0RVW5PGOp6/Sq5t7qdGRElJR13J1Jc//AFqha/ZXJ
-  jY5V/lP93HUH1rfk5lZWubzpp0nHRy9UW3l ZJiY3WZQpB2jjHTNQx2iuin7TGuwFyCTwMfSq2
-  WmkaV1G8tuOOMjPI4p896jo6wwtsJCIVP+rHXk 96vkktEdPNZJ2t935Dw+5U3OoTYwXI6dqml
-  Ahht3ZPNi5A2Hkntk47URCc20E0LwtKWWNY9mTjqT zVOWRXupd8wH7wmPB4Zs54/lSWsrI46u
-  NVSTjTaS6/8ADdCeGa1ICybS0bsOv39vIP41LFsuJdvl MjyZbnk5J6VQ3SpMSIQBv3FSBkZ7U
-  z/VuFG/zFYjBP5VfswhGpBOUrrs+hYkeJd8Rm8gFgAjdSQO vFSAI+9ndGM6E8DlW3CqBVVkia
-  RopOucKTwO9StIZAI/MjjCHKMBgNj/ABzTcexyzrVU2lJvza/4 BbaVob9oYATKZc9M846Y9aq
-  AfJPJJJvZCEAI6ls5qwsTlP38gWRm3JHn5yR05qRLqZmkiEcaNLvI VkGRkfz9PSoTtsZUK7pu
-  1k+7/wAylGpEsSNA3mJEwBBxu5yMjv7ULDJMziCIorANOc8f7P65q2YI 18mZdSi85YwCNhOB3
-  zxyapyzvDelrcq28MuMdBnIzVpuT939TJwTm3Tjb1T3+6wWot7mGETHyiqM rk/xMSdpqCJFVI
-  w6SRtn52Z+p6enAqKC6la5QxxbHXJORkNjkGopZQIozE2fm+bqehz6VsoO7MqL hGc5Nt2Wiff
-  0t+ZIXcruaN4m8xdgHGFH3qr+arTqQ29GkzuJ4C/wk+3rT0EbDDSn5Ry27gHtmqwR zDHuPlfI
-  VII+9zWqSFifaTqXg/Xb/hjaEsks0UciF0CucoMKfVh7VmebF9njdJ0bCMMEcsM/zo8y eW0jj
-  dGLxJsiKHGVPUn+VVYYTJuU7EZpQFVhjrnjpUwpqN7nnSlOF3K0Uv6uejyfZJJIIpmYo6MI 9p
-  xj2PqxPT6Vct2NrBI13wVcqzHjLY7e2Kz3vLR0hlMRmdmyfLOPmzgY9OKuvHLcRXQMUodrrPmM
-  cpgYycV4Ek7JPRHqRvzLndovpdf0vuIWLtfqY/LC9GDAHDgAj8cZpbGS5urzzvvTmUbWUYCxHO
-  f0 5qNbe3ublVknOxVkZo1YhiR0OalhnU6arAqqnl5FOArEcL+lOVuWyWo685JNxuv6+9mpeWh
-  eVWgj VAU5JUENjG2mrJHJMWuJI2Zn80qoxsI4I/EViNeTyXJVplCyDzMAYGewH1xUkdwlwjef
-  PFGzAvKQ uNjY5U/Ws/YTUUpDnQm0lUlv1SuzpZfJuZZGRhErO3LHhRgZP4YpAZZZNyxSxpFk+
-  YDw2ev5Vn2U tsyQSwndMIBEATkbWPJx6irEAuAY4mcnzM4IPBABFcrhy6du5moxpt8zbXS/T7
-  v1Lkkm284aQJuG 5mbhHHRfxpGjiN0UYpkShy6jGVHX8amSz/0LyDIr+UViyf4wxzu+vvReS2i
-  zsJJE2cRIVOMqTz+P vWXMm7I2nONRNpP5Fie5iivBIkR8vyZNxcZCE/dB9T3rCRXtUjkQNPtI
-  jkPbI+Y9auhp7e4JjQsg uVDbxnB6DNTT3jXH2mMrHHH5nyybflzgDH1p0046LYqhTjLRbdWVG
-  d3gd0tZo2mcyFyeEzj8uOfx qzbXMLRRySxKVVWjQYHzB+Fb6Usst0kSxBoCVBibCdAT83446e
-  lUIZY4bySIgyWUWBAw6vj7pz6V XLzRehHs+aGnutee5oT2aiO2i2v50RLMFPDOnH5Hpj1piR/
-  6MwkkWQlgwVRhiCO57kU1r61aWVjI UdF27y2AQwyRj1J71nvcXUjpECkm6RG2IMPtAznPt3pw
-  pza1O2nhpxhzS6fL9bGsZDJA2AGjlILs P+Wew/dP1pl1bImoteSyKY4o3RohwcnHP4UyP7XJq
-  WWQeW7MyqgHy49fXNP+z3kzT2qrucsCHIyD x8xqV7r3sCUef36mnXW2n3Dx9o/eNIwhtkQ5J/
-  iOBluvTpUsECDSRtulupTIrsqfeJ9c+maxWiug yqzMVDAGM85Rj839Oa6ATIkMqJE4hwS7LgE
-  MD8vPp7VNVWSsa1qMHFKK/L/hx7SQz6bKDEYi7M7u 33S38IHoOMYq1bQyujSSSwb/ACyCiphu
-  Rk80NYh4ZzAHebz1CEn5SMA4x+dWI2uFkczTW7qzZASP ByOn5/0rklNcvus5nVdOl7jt5df1t
-  95DD5pie2ZVYeYhYKPunBIwew46VG0VuodpLoxebKjZYn5g RyadKzreTbSFeSQNHkdPlxg++a
-  p3dxM9kC8kMEhIVldc7d3X8qcItvtc0pX57LRPcjnMAEkSzPLb hiUWNsNgjIAP1qO1vLZyslx
-  beTuQuY2xu3Abcj+dEkMu1TbFXlWEnAH+sA44/CqcM13EIyEiEZcq xdAcfL8tdKinHc0lGKpu
-  z/HX/gfcXfOki2Ss0T26NtaONMOx7HPoD1p6X8TuivGiqEGxyBhic5xV ARsJomu33yxwYkiQY
-  PT5j+HBpkTTC4LxXVo4hXy0zFkHd3/HtTdKLRz1IRcHbfvdr8ja+0/ar25g QCQF1wiDDYC/zp
-  ILazR0ncziQpuxJJlW54JH0rNF3II332kiSmRfLZQBgfdJP0PWnOziZ4JJFkRW dJAByz4DAj0
-  A9Kz9m1onZGcnLrK0Xvr/AEie7+1LYvMRzuwxQbQrA5C/T1Hesze0cskjqsTmfId1 +QfL0xRH
-  crJefv5SYXAWQZ4EhBwfxNWnuEhuIES/sFWMMjRyJubdjOD75rZRcfdsFWPKuSKTa1vZ 7fcyB
-  N8bxreSQTQuE2+WmGcnoc+gPX1qlc3kS3Hlos8FyIyCzt8uCeTikuJkuYdOdEf7YlvuZQeu Dx
-  xULDzhNcmIq0xBZDydwHOPQD0rohBXvI3jB815Oza22/DsZFpd3yW8EsBSUq33GXJzu9PQjNNl
-  2SanMJ2dS83mIQ3Rf7v1PWtKVnjtIooQkryQliETkn+8PbGarQQOiG72NbrHlA0w3AA4wenvXc
-  pL WVrXPQoUNHVStJ6aeXe3T5CQ3dtHa22YJSEXEjE/x5JA/KrjI0UJnn87fOm+Nd2Ain74x69
-  KnEyr oqoIlnJk4KqPmGcZ/CoIoLiW9uYoyymLgCQ7jz1rK6d3sXhaPNBt2i+uv9WGTGAWjrBO
-  qKzhmDZJ Vm7Z9B3qF7WeK7/fxuiKjIHPQnHFTBElgMinziHVJEQYyRzSvb28dvBvmkkldwSik
-  AqCcgdOpqoy UdLnZTqUqV4Qk7el/wBVb1ZVUMJYZTIjJEgZo3GS3GPyzTnEcYkllRlGAihWx1
-  H+FRgC1uRI1vMG 7BjkDrgH8ancSmFoDBK7yuG3Y4OBjj9a06m9Kynq7J9bojR1IiWJEMSSCEL
-  IudueQD79asFb+NXj gDxwvNuHru7c1atrhkKR3scccKjcvygFmHfPrV1J7VbdJPOVYiu4gnOx
-  uoU+5rnqVGn8N/xOGs3z 6U1JfejGkl1CDzDdIsuJv3pMYHzN/D/9aiVZ4B5FzEoiR8DauMkHo
-  MfhVy93/ZEklkRJWbZGhXqP 4mPrgd6rTRmTThCkcrB5so7vkMBjafxqoSTs7IwjUp80JOCSbt
-  1t/n9wk96r2cYEZSI5eM9Q3/6j Tra+ubhts9ks6glm8tQp3Hrz/SpHkuEsLj7Q0Fs4dk2vHnG
-  cE44OBVIQSjzZ7hwsAuCWdDjJIx2o UYOL0F7KjKN0km27av8AD/hxZJvOiUbHhTap354BHf6e
-  1SOZ3MsVuDdKhWLCjqxGc/jjpTJbqKGV TMDHIynygRxt245H1qCGFVtgrTtFPsBZuSAQDkYH8
-  XatEtL2NqNWT+z6aX1/P8SaYhLQSMsyyEDY rNkMDwTj0FVZLUz3AhjngkIUvHtXBbaPpV6M/Z
-  NLDAw3O9AyLIu7aAcAc+5pqWVzcC2ZbWXKxYwg A4YkE/rRGfLrcFJOF5JaPdr9P+CVUihnNxJ
-  NKyszKck9C3Y+tXIoB+4M13DNFhi0ajDnBx1NOazM EIjkKQSo6LGX/i56n6Vbit3k1N5LmIqS
-  cB14XeOQMe47VFSqrXTIxUlyOXNb+vT8jPjna1ljGxrd cBQ0vzAqTzn3qcajbokiwRo8oz5Tj
-  HT+79TVi4hsZpLRrmRk35V/mwFc5OfYCqJBjiiaG3J8tWDY 58wEffHoBUrknq1qcMHSqtcid/
-  w+8j81JmkeZWtkVCqA9z2xTNQCsVaO6hcunmEKvJAAx/WrErwT 6Zbopw4X5M/xAkAmsqVTHqg
-  j80SqqvGu0fwj/wCucVvSSbvtboddKpCO6tJdOhDM0nmxu8LnzBhN q/dB45q4xS1gYO8Z8wAb
-  tudu04IP50x0eDTkSJHaRic7jkocfMDTG82cMiSeZlecJnfjnI49ua33 S7FU/rFWjfmio6/P5
-  sgn+3pO8UZcsjkEhCN2cD86rvE1tHKjJyjgMGj+4wPANWhc3KXhmyWcxEBi vr1P1psb3N3HHb
-  yyROpBKOQBkepOOee9aJyS1tYxqUqlKVpRjyv1uvO1jOEk6kyeWcs+FG3r6ipT GjJcNvFuVO1
-  FZfmIGDn8qkMM8Cxx3Mi7hJvV1U4wOuPeniWVYzI1utwZCx2bc8E8GrlLseXVxddx Sadulv8A
-  MzoXdQBAX3MzNweQP4R9etKSq24Blhdh8oOPf+dX3tJtjIqx28LPuRto5x3GO1Z32Znj leWaB
-  nEuGKAgA5z6VpGcWysPWgpOKSbt3bHLc7lMaKJY93oNwI7E4zTkSKe9DeaLcRkMu9uWwelL Fa
-  qkErySpLI0xKiPgYPQ9O/NMaMecEMErMCACvc9qfu62NYxc6EmtL99P0ZYQmS8kbIU/MqLt/TF
-  RMhEm7EixgfddefpnHWmGF0uoVWQu046AYPLdfzqyWuHtpEOGCykDj7wPBb6cUr2ehtCpV51Ra
-  vb tfT5oa1wUu4JW2rNj5MJ3qz5swkWZvLWZZN2Cv3OxUiqXkNOwfZJjGFbrViK2H2+JXuEhyp
-  ZzICQ p9xUTUbGePgqsZTdml836P8A4YrynMxKxkAADA/hBPf6VE63O2N2gbBVuR147/StKaSG
-  SwV4ZUl7 ZVcHOcc1lF3N2+9cBWwwI61dNtoxo1Jzpqzsuy/pNEkc0sEUiKUULIAm5eSp/iz6D
-  +tVpJY47h9x S4TfxtHbp3FTQqbi/tzIFmTkSRIMMwA4GfWmQBPMMUdvJkgklz9zGc5q0kmzj5
-  KMpyXNZd3/AJLX 7ypgeXIY1cLuYEkVJ5RSFBt3ZUsDn17U8m1eCJ5QUkYf6scZwfXHtUCwtLI
-  zGTIV87cfeHXFarUh Jyn7sb2+V/k3+Y+a2kKKYX3KuN+0HpkcVUkjeS4llfchMvmDb2rYciWG
-  WW2Cshk2hUHKk84PrSyJ EYTEbaRZliIdw/3mz1xjgVMarXQmcY15OSp38lrb+vI6d7SHyo7TD
-  QqVaSNyfvYPanXl1bGysBIl 0rlSxRZMYy3zZ9cAVopduW2vash3ncWwfn7Y9FA5I70RWwv3TM
-  0MrxwtyF7d68L2lrOfTzE1FWdR WUddHcjtkt9zeS26N3bAzyRnHX6VWY28jSWcbbYxs8pgfvo
-  OrfhVmHzYjDHFBiKMYDEZ+g+tZslz AZLi4gUJOspiQMPuqR0/PNEE3JmeHrTvJNN9nfb1NdGg
-  +0XEolgl2zbIzjhoyByPpT4rNbS4uT5k RhEnIZeR3APuaxwn2e2kmmjdmFwoVFOC0Y+8RW3DL
-  bSa0pfdNESwi+bgqRkZ9TkcGs6kXFaO6LjK avOL5k/QtLNHLFE1pHGxRdgRQMrnk5+lR2y6gi
-  Ncy42wMEK7e7cZqaxh8+SaKONoWldZd2e2Ocex xirssZiuo2ihuFhaPcdzZCk8BD6t3zXJKai
-  3E6sPZXi0n1d7DnEcdmCgfYsTbBnkg9CT3PWs37Je SSW8fk7EZA+9xnIHBxWxN5l1axWyBo5t
-  jqxIyGwB849FGOlQyJLHa25WUPujyoH8Kk5P+NZU6jS8 y6fM6ajDdt79CF5LhbKVUMagziTLD
-  O3HrTEuT9uBQKfl3jK5DA9xVRzdF3McqyqZhIgUcSKBjcPa taIuJDLKq2bI+N0q/LgdBx/nmr
-  klFG8YU4wtJJt+n/Dlbzrh5SEmgV3lU7imQcDrRdyyBF226TbI 9kbIAA0fBLfnxUjG8luXeGS
-  3kVZVBjWPBTuwPvirYSaO6iuI3iuI1R1RFXkD057nPFRzJNPQy5Ve z+S1/PoZ9wy+TdGPy2Pm
-  lom28AYHBHc9cVRSe5Nx9sS0O853HAxgjnj6dKddW3nwxlnMEsiK75PA Zc0kRwIo4nN5NgyMs
-  fGG7Kf89q6YqKj3PWiqXs1bV9d0RxBjGqrM0EZYFVkyWAB9fep7+SWO8naO 43RrcRuETIbkdM
-  +3f1qO3ZppVkmjeIhB8x6M2SRgelXrmQhbi7URyvK6gbE4TgcH3obtPVf1oaqN p2klrte1vvE
-  txOtzG026XClJSO8h6Y9OO1X7OO43zJ5f2iNAE2qOR8p5PrVK2iaZWil3gSSB4W6f KvJ/H3rS
-  WZIQJwzrK0W488NzjP4A1zVm22kcs6kpScUlf7whup4ESJIpZcRjZtPMvHLD6VYiurh7 ou0kK
-  Z3YLJw3HUfyrPE48kq2YtihWJ6ls/Jg9gfSpAgnnneeVYTJJ5hHQRYGNmPWspQWraJVJJNy SX
-  9eo6dg8MMkrfvYkZJVXghm5/QVDDO7hI4Wh+V1L713EHsPxq/bXNpsaCORGaSMyOG5YN1UZ/Cq
-  DS77dLown7VIELqvAAPXj19PSmuzRM4pq0ovy0/rQtSC9innaW5tZDHcCIrHHgjcM4rNuLq4Mi
-  QR RDlWwSucAHk/X3q3vgneQhJIiZlU7myWPY/gKyLuC98yVFdFjw259v3QDkj8qujFN2f9fcc
-  lOEHP ldr/AHfkZ83kyS284mk8t4H80lzwM8fjV03P2W0E7IArH5iR17ZH0FVXgeWGHLI0Usys
-  MLjKDqR7 dqnuDK13PIAttDubJmXcoZugx/nrXa0nZMIwhPeV7f1p1BbxFO/7QssaZT5f+Wn+2
-  PYfzpEnSVD9 pmQ4kR1C8MFxzk989Kql7h2uFhgUOR8yhRw/YD0759arGS5+zRo9sdyxKJDgA5
-  BJ/SrVFM66WGi1 yvWT81dG5MqRXF00RyGlVkXHRgOB+IrLB3zubsJamaQ4Mg+6wGMH371VbVS
-  u1FjL75hJKxHH1HtT bq7u5lZCglgMzksiemMNn0qqdCa0ZcI4ty5ZRS83v/kTxQzLE8oxLJlS
-  rJ3H8RHtWi87NaSGOWFX UhQdvAz0P41nrMv2WNJw0blHLyA4UsCOAOwPHFSfZvNt7mUSAxyzI
-  Qo4IbGMfn2pSV3eRo5VKslU qO3S7XYcun3P2ppPOjJiby2Kg8secj2xTjp5JnzcKkDIXwe+0c
-  f41FcpPZ26qUuHXd+8YtwGGOtX p4FZzbHcjSTtLhj02gHFDnJWfNv+h6ClXp8slPR6aJFWyhS
-  VTunV5y6yjaCFCD73Hv1okjf+0DLH e25jD4UKCCw6g+9MgvLgXkjwiCKSXlFMY6dx9Kcy3G2K
-  eV4gpXcE24LHHOP51UoyUtX/AF9xpUw7 jUak7X9L/kW7ZFF+u5M+ejSOq8c9AR7d6ou0tjaQr
-  9nlVhhQ7gNjnPNS20aNPbubgAG13uRnjnit BkV7me3Eocq29QfUjpUN8stdTWdBxnd2aS6r+k
-  Z0qbVmBkimnnl3bsfLhe4HpUqs0FnFJFiW4jY+ Vx1TrnHvzVoQRNbwyXPzSJExJU478n6Ypsc
-  0csEiCaIlySkm04CH735Yqea62MlSlV5U1pfXtb03 M2RElTfMHDMf9Hx3TGc/0ppeNLW1RYjb
-  mVC8zy/MpOcAgdsCn+Xd/unaI3VurAKsXoBwc+lV7iDI Vmy+CJCg67F7/SuhWbs2bOz91v4dr
-  flb/NE9xbNEI5rrfLAqMigNjpjHPvVOK0WVVE100crksgLH CAdc1Ok4urtsxTyxGTzUi3fe68
-  /SqQMshlgwI3I3lWGScDt+FXBTtZuzMFGrUnaUrNden3bFqA87 1PnKSN+85ByCB170yUKWidW
-  WcxwiAoP+WjHkMP8APakniWHTrCSK4jEgiI293JORU9nEJraBhhZZ jvZz93cCen4DH40m0lzH
-  FOUYx55yur2/r/gEQQW908+Y51yy/OMkn1GegqOK3jfzhcNLFNGpDHP3 8n5WH4GtWWS3lngSB
-  02yRtKQRnYc4Gfp3qvFbPbLJvjeV9g2yBuGAyTUqr7uujNac3zc2ql9xYEU cUEsVvKkciuBKs
-  vzcjnirqXDSbHS3n8wNmNlOFVemCO55rMhmRmU8FWIKKPvKP8AaPc571ektWUz SrLtnWRfMPR
-  cA88Vzzir+8TUoc8rS/Hq/kZ9w8wjQ7HVo4yCZOcjP9DVy1uZri+dpLSaOUk/Ox+Q DHPHr6H3
-  qyrh7gwzzQMGYuWC+/8AKq1xLN9te6kjZkMZA2fKpB4/Q0X5ly21Eo+3vSsk1/XkZKzx rcx+a
-  CRIQVJbiMkEAn6d/Wr0L3L6itvbR+YsTbJ5Qvyl8cAegPTFWIms5dFUtA/nQMICM8kn+tZs tl
-  Khe3t/OEzSDZ8331HJP9M1reMrpq3qclSEailzaPbXXb5oi+0+TfszW7RLtbcrYO3jCgVbZfPh
-  iVkEzn93P5YwUOAP/wBdVZEtCZJCXWTzdpSRs4BGcH3ppmjmvnyJbYNzIhPIfHB47DFauKeqRN
-  aE J01Kle662/r8yMmC3leIxuJ4wUbe2RJn+ID6VVSFzeRRorSxyQlgyenc81YjgMtteebNEhW
-  aIq56 learyLY29w2VnkiUOqsr8fMOnTtmt4vdLc6FOdOLjF697f5/oTx/ub2ONo9qqDlnAyyn
-  qQfaq32p RdAxWxlzGEAU9Ewcj6571CkFxFbo00UuyMlWOcD/ACeKvwpbSWpkKSCJ0OQDypXqM
-  02orV6nLyp+ 85N303/4O5WMM1vEbgKscRjZAJl3enHSoXnuXcweV5sMbFMImCARnGce1aEUEF
-  zdopnJjERY5PCq BnJqhNBcIlvcvFKF2byduATng59OnFVCScrPc0aVWTUtZR20t92t/wAwtIF
-  lZIvNcrjKtu4UkUGF fteLhTKYh+7CDbvGPmPvg1Iu1pPMLfZpwW3uT8jEjjA7Clhed3sY5XUR
-  SMCxZeWK5yoP5UNvV3PL rx5FKUtu3Vej6/eRFriC3EoWN1kQMxVeAM9qYIo7maJpX8hUT98c9
-  WPTHp2q1ckwtFIssXnoDCyb crzyePYGhrUPZRyJFLL5kRyUYcso4/nQpq19r9TSlWgqS520pa
-  XMv7NcxiNpYmTjHJ5OSeR7VItv LA6wNNHKsrMEAXczlecg4zj2pryO/l7kWInr8vOPX6U62ga
-  e0ZmUiQSkDH3l2jJP8hW8m0rtnTXi qU1epf5NX+5ldIo45l88svTcQMHnn0qz9oimjieSCSaR
-  VfZGBgqBwNx71F88l1byMARMNxyOG5wM VYW0NybgF7cRQO2XRApfAxwfTPalNreTOPHKlKa12
-  6X0/C5meT5LbAGIVG6fxd8/1/Co5pxHcK5M W9n43LkOcD+ea0o5LZDI00ckiEDABwckc8+nbF
-  VSscrAgKqEqEU8sB659q1U9dUViW1C1rfiQxPI kgSC1kkuTI6h1bhOOmMdcVVdQiWYMxilkyZ
-  Cc4Htx61Zni8iVUeJ0Bz8z9x6023k813liSPdG4ZR ImduOo5H8qtbXRwywzmrKV29kv1fYI7V
-  IUKxxzuWJwCclW7Dp25oeR0kVUaFlEyIzbcjHr06Vaju HkeNZ0JN0jyKy8BcAjn8qht7tksYE
-  PkyKExuVB8vPfI5PvSvJ7oVKc6kHTi7fp+f4Iu3NusF28iQ uxjuTsWI7Qigc7vWiEIL1wkQJz
-  x5w3eYOuRntViFx9kObK7kvuszE/LgHOMfStG0vtOvpnikKwRS MW9CvbAP4VxzqSUdr2PPrS5
-  IStd269fuTJ20/wA+KeSMTxgToIwz5x/ez6nvVjyEiuS1is0oQneF f7x7Eegpbszx6a8TSLl5
-  MqyDG0jBP6YqvatcHUg7zxso+VgoxlWPP41x3k43b0Pbmp1KKm5K3bo/ n1LF2LuWFGYMgVWEs
-  YGDvP3RWAkVxJdslwoiRgN4xg7sYX9a2ob6KHU5o2indMjcS2clR8h/Kqtz qNzJayGPyTHs25
-  MfJJ6mro88fdSKoOvCXso2Sev3/eTyxKmmOyrLKN6RFlbo38Q/E1pWV1KqxrFH CrR7UcMuSpJ
-  4NVpJAmlnzEJjWVUYDgqxAxn1NWW8kW8CHcZEUiQo2N+T/hWE3zRs11JiqkqSjP3r N7frc1mu
-  DatI0sLFA21mQ7RyvBHtzSSWxa3ha2nfMcJCB2LYIIwD6k9qzxJpiy3UX2iQAMBGsshO 9O/41
-  pRpZyBZ7aR5FmYlsPwmDjafc9q45Lks7P7i4KOHs1e/mrp+VtSC2trh7xGuRJbupwct2I+b 9c
-  Va81WmjUQTTytEVKo2MkenpxT2uf3UipaXEqyzeai7ucLjP4U2W7hMSyR7djjfIy9ju4APbIrN
-  uUndo6qdec58yX9fmStBsRirJbRmRfKEi5/dnjj8arCZ01Z4J5AYY45Izle55GfpV+WQTrLPIP
-  LP 2gPEn9xc8qfXPUUySdFnmuPKA3K23f3OcbvoOlRGTe6IpVXKUkkn29fxZBbRrDaefI+CWCy
-  N2zjl vwqq0l9bm0W3YyKvAkA4ZTyf06VoKIHtImZxLtUCQKcAMAePxNRyT3H2EC3lhEhG/wCZ
-  M+WccqRV Rk29vvFTlUk0uX79v8xJC7adIyTRNG1xvUleSB3B9B/SqbanapKiBo3kZQymIbd3P
-  P5mponme0Y3 AUxxNsUouAAwxt+vepDbW9vbwwuI47oKCrOuf3ajDfzqlyrSWvoOnXcFyyXXpt
-  8+pBI0bA3KrJvZ wxGeDngkewp8MtxgRPbuYSjMCV9DhR9apmWFbuI/62NcIqqcbtx6/lVp7+P
-  dMlmrsvnjgtnJHce3 bFXKLta1zonUk0oxV/PoMLXSywuY2TeuenAwcfgKngjuGinN9BIio+2N
-  AfuLnlT7niq13dXjXrtI 0UNurHcCnVgM4HpVjcGW3lmvI4oJ4iy7s/N83B/MUmmorbXsNwcIr
-  mas+qv+HmTBJTEVQAhpFYBu u3JLH8KssYPmMUm6AYIyclgenNYJUhGmaZ3y2x0UkY+npVmG6g
-  VwFxIuCSA3TBwv50pU29imnKK5 btfcarG1P2mQwyF5HDbUOChx0pjWcq2R+1SqpAzlRjcR1I9
-  uaha5LzRAhQ7IUkwPvNnJx6cVfuby ONViWGV4JJyXLNnacDCfU1zvnTSRy1qzjaMdb767GRbx
-  Q/apgJt7u+8c/eGPvD09KazfbZlTeYl8 plCk5LHr+dXfsokmmkVTbyqdqo3XCnP9arXVyrzyI
-  1nIyySeYRFhWBPHB+tbqXNLQ7It1GvZ6+b6 f16lcwgWmWtLnfHLkAPjI9BSPpzyXdribZCS7O
-  kmSQR0zUUwmgWKSRZYyrKz7zwSM5P0Gal23J0u RzFOGFwoikJ4HcA+ua1vJK6ZzVoWio3Su9/
-  6uir58pZWR4y+zMhC9Sc4I/AGo4p5g0QHlvHMu9iV BMYA6H3q41tbTN5k0m2RH5CkjJzx+B5G
-  KpfYIbczCOK4TZK6sXkznI6fritE6bViJqjFcqWvf+rD obeGOS28wxGQRHYCox17+vNVGsrae
-  wEkry28u05+bjjq2PSlkKNPaW7tgFi0ZU4MaJ2Y9yTUn2uy 3RII5C85M0gZujA/dH4dRWq507
-  q9/wDhzOnKaqLlb/r1GRRQK0kC3UTIVwHbkMSOMfU1ckV10YQS SxyCPB2qMMSMFufaqjTBY4p
-  ljRAsLZ44LMeo9hxWjA159iX5I2lDqwJXIfAwWHtipqN6Nnqc81yu VrX0vpr62K9xcw3ssCsc
-  Kys2A3RCe/qRjrVQEW+o/LJJPIjkZJJHsamXEksUVttMqxuoO3ONxzTE ZooTaPEJLoRlVOBk9
-  8/lWkUkrL7v1PSwtFtS5tF5vRee2w2V7YeW8cEgmBKyuD8qZ9vpSxNbtqEY 3v5aj52ZuN3t6C
-  nW4lcxSgIZtwwNowQOScfSr9y0BaCVoC8fzNGUwMKByp9T70pSSfLv8x1HTpz9 lBuV+qav+N/
-  zBNQiexfEItnk+b5wMcdMe3tV0XRigt3keCKWORY3kZeGBGc/hWdMI3t13jzYyF8k LxkD+H6m
-  nXMSy6WgKEzISzx5+ZeR/KsHTg7K24pUKdVQppWTe99vX+rDrpJplGyaOUFvnSNcEZ42 fUjms
-  hkMaqsSM4zt3A8Dnp+tW5wy+Z54YwiTflDgseOR7UyNZRfNLGVcIpZhjAYnoR7V00/diejF ul
-  Tave3b/P8A4BYlldknR1aErMFUrwFQevv71nRXNs+2KUmMIpVZCffgH61HFPLcRFpSoKnYWHR8
-  HP8A9anRR2huna5lAD5dgvBVjwBVqCimn+BwVOV+7q+unQjheOS9cM4ijLEvjjHsKgkEKNEY98
-  i4 JQ7sHHTrVtbp44CIYoisbKFdkHfg59SaaGLCeG3VGjLHy3ZeNo+91HarTad7aHPGo/ae+rR
-  Xn/wN y7PPZtYRKE2RFsBm5wx7f1pPsot0jlKSi3gBjdC2CHPfNZawBLRJBlkYI5IPC84596uX
-  OotMfJiR zGjYVs9s/eY96z9m1ZRenUiOFlFpQlo3rpsvJ9yylkY7aKR3E2+MqNgxuGcZHtU3n
-  pD5FqkckZfc FeVtwVD6/wAqoPOHW6PmsrGQIJM/KFPJIHbOK04UErTSxIQ8bmJd43bdw4z9Ky
-  mnvIxqQl9uV332 X9fIdN8gaVFSMwusakjgA8Ekd8VNZ2TpMZDexM8YKcqSoAPRh3JzTYWsprF
-  rf5p5mYeZsfHzAe9V x5hurmNw6AuquF4wxNZauLV7HZRalSdp2a30Wq+ZbmZWJaSF4XWRYpG7
-  euP8+tVZ3sriGeTz2kTz QibDjaD2PqeKs3Jiud0ckv2cRNtLseGYnr+H9agnGLSTyZLeXzyp2
-  Rrj5s4/PFFPS3QmnJRa55Ne m33hKtpHZXDW0qguWkTJJ3Dpmq8Nve/YUWM75HK7GxnpycfhVp
-  ZJhmCX7OwhfayGPBA6Af1rOLzL CD5oL+WV3A4XceBj6irinZo5KkajpuCVne+qvdf16i3VosS
-  tcorRF2O3zGyCuRzU4uIobwOLOS6W eRpMpjlV44qCG1dpopi5ePyismTxyMZHpUgh0+wsVi8q
-  6uFDEFll5QYyT9DVSatyvV/15nnYh6Kn K7b9V+v6lDZDPKfJPkyGMsfMORkN1+mKrTLCDapeI
-  8gt0JOzjfk8H3xUksTS+SLWTyT28w8kHrz6 CqUsc4d2kJkWBvJLjo2eRXXBJvf/ADOmDjWSg3
-  a33r5/8OaD2zGOSSecLbhhtbJwc/1PWnGOFtPV IGEMbFgN7Z3E44/HFVAssis94ssUEkg3OCB
-  8w46VNeQEKypGxRgfNXuHUcfSptqk3/kQqicopVE2 nppp/wAOQxW6+ckUj7ZGQExr97jqPwFI
-  sFzOVti8nl28ZAIb7wOfm+g4pZEjZU8y4ETOpd5Sp+Zi PlIxyAa0obbyoGhKyXC5O90ONvy52
-  /U1U6lle4sRibtSk9Vt0t5roZptI0trEvLmJod7PnIJU9Px 6VDHJpqPIxt7pdzEqjScrkcVPH
-  qTq9mPISTJUKm3O0E9D6k1LMbf+2Z5r0qY4nMaxxjBORyfw4p3 ne0r/JnC5TlL95e/ZP8AQyU
-  KTwJFJgzhVjjPqeevvRBbpcrAju8PykrubhT3yPoM1cWOedA6w/ec EsP4V6Z+uf51VYFIgY1O
-  RJuifPCqOx9Tmt+a90jSpJykowWvS61v+IxoHLPtljkJnTy2A6oQaka0 uo9NmkmkSWdZlVtg4
-  2sOB9asRpLLaSTDEfmOWjGMZUEcj2qpLBsvJIGuGiXcGdmBIJHOcUKbbtfY pTqS9+Mr8u+5ei
-  aOK1jXymd1DpGncDOR/jVaRrdUidQ9wTGfM8tyASep6fh9a1khOx7hpoYopZPM Vip6D0rJ4tg
-  xkuIZFOGARcZGc+lY02m20edRjOabir791fy/pox3tDFYRMjOA5PDnJHqfpTgYvLl NsWlIlGG
-  A6Keg6dfWrtoxt4rm3WFw8rEuZedozk052aAXci2f2aPIHIHGR/n867HUd7Gnve7Buz/ AA9DF
-  IfGzeHYEgMRwQPT9at28ai1t/OubeBZFyDs5AyRzjqanhMFvcpFIiyMFOeenrxioGZHuS3l +V
-  FvK+W3JUVbk3oVWpyu43aa1utfu1f4kZuIJ9UtApKQRK0bNz8p5NXYRb3c9k0UkNyI90bQwxlP
-  MYgnIGO1NWJonUqkQYHKRPGDuUckn1NXw2kO7y5KSGUBvKGxcHqwGOlZTmraJ/1/Xc8tvm6t/e
-  9f zX3lqxMSXFuSGtnW0KM0rZEhwcN/SnW1ktzoUMUM1usYGclPmPrz7VZSOyWSTdcpAJGKIXO
-  d+e6+ wFNjkBeKOWNsRv5YCHGM8lfc9K4XNt3X9feYymlUVSnuv66mtFEP7NdlImj8xPqBu659
-  +n4Vm39t eSSEJGJACSEjGGGTyCafEGTQBEsjHzJVZZB0XB4H51PcKyyN5sc5lkyzhHxt2nkfU
-  iueN4zuenT5 FG8tf0/JL5DYI1huhb+WSHYlZTyMDJAPfmqqRI6CWaKQ/LtkC4ADNkgVHPbm2u
-  Z1ijuCA4VAWyT6 H8M1AJY7h5LRWeBWJkG5snco4z7DBreMW9Uzr9i3PmjL+vk7k8MN1E+5raa
-  QFgGjByZGXnePatSz uY7uVhLEYysnylu67Tmo7QSg4huo3llkVjkZ2gj5j9KZme0vYt0LOQpV
-  FUD68+uKyqPnbXUmVR1p uKav0eq/MtTMnl2xtI43X7MWQsuT14Ge/erfmtHAySMiuyiRlUY4X
-  uP60sc7+cTIq7mGI/lwpB6s PQU+SS2lEiSssksUioqrw3TOPzrlb6NHdFctoy1a3t+pXnXy7d
-  ZYZZDJIhZzvJA56D05q5BbI1zc yvBMTk5Ct8uR1OPYVJFLJCt280tsQs6CVdnfGRj0Ge1W1uZ
-  Jb4s7xDefMZFXGeOR+P8ASsp1JJWR NfGTpwdr8vfuQMi7j9n3tFMyyYB544yPY0k1pIb6eRm8
-  qMy+ZEr84UDG0/jVea5k3oxeNV3CNFC4 JUjJx9e3pVeTU3kDxxwTBWyYtzZwgIHP40owqPY5v
-  bOony9tf6/4Bf8As7BlAilZF5kCtjaw5AP8 6RlRJDO0MyQMgLOW4YscAj2FZllcLI8qxJcsRO
-  cAyZJHp+eav+YRFbpOSIiCzZP3eeAaJQlF2Zk5 Si/eV/K5Dexf6KEVZGdZU37WxuK8n9KgnEi
-  yXZF7AirMwjdxnCsNxXNX7m4Riw8+J2dGdNq4/wA5 7VmTeW2kh3+duQFB54xyfp0NaUr2VzWj
-  OUeW63f9biqYmhmWJC8wKsIgeVU8n8utXBLaN9q8xGdW uFVWi4zkZH51jLOwvDIhUF4+FHVxj
-  HFXvtVstqEit5TKkmWG7+7jH861qQd9jpxNSTmko3Xr+ZLc aj5spgSzmkYksy5B2k+tMedo1i
-  geEhdg8hXGflHf6ZqQPpxvXOJSwASRlbG0k5Gfesl55odTEk2W i6ZI+8RnAX05xxRTgmrJWNI
-  4mM4unGNrd3+Wp0Fiv/LScxqRGcIf4euc+561nPArmNtwaOBEibZw ck5IPue1MkdjF/xMNyKy
-  AyFDtKP3B/SoN1gyXCxXW1XuVl5Y8gUQhJNv8loRh6tVNrX5amwypp8i ThXZfmBRjktzgMD+N
-  ObUo7C3ijSB3ZGbZv5ySMgnPXFWDIJtUuwAGi83ace68Eeg71Nb2CyRKuEm WKMRqCMk5GS3Pp
-  XJzQ3qFUVRc/36bt+KKEeqXJsre5up0YL8pUJg4J+YH3IqWI2ss00q3MSpx5eT zuB+VfqalWw
-  tG+zrIS4dQyYPHTmpZZbVIJUhiVptyeVtwAV6v+PvTcoXtFHVGpS5uSMdX91uhXFw El/0oK4M
-  RMiY5BPBP0Hemxq9vp3lR3KTRcSEHJJYdSD9KsyXCPfzeWqMjLI6naOoxj8O1ZxglujI OI5tu
-  fK6EY6n6dqcVffQqph41FdaFYPM175gMcls08ZVlXqOauNEsl0yAPJEZW3MpPyDqFb1YnvT BJ
-  bCSRUuYflJZVA7AcEVkOb6K4MqeaFypUn7uMcg+/PWt4wc3poP6pUqScnaL/P5D5LKOXUmhhkE
-  Nw0e5/M52Duv1NPMv2ey88rFPAZVYqqjcMcdfQmtHNw/mPbIiMqMAzjJxjr+HNZHl3Bs9skkdw
-  fl 3+WuNoPQfX/CtIy5/iZz1E6sl7X4eu3520+8ry3P2l5GlUhBnMSjBBP9KtrIqJaNb3IjwCw
-  3nOV4 yv1p52R3bCe1ChG8tJccMpB5PrzSTWMccixGZXk8psKowRgZ5rTmg7LY7F9VkuSTcbbb
-  Nfht8yRd qX9zcrnyFzhwehPO0+9RNdxvBJMtu0U42tuf64qujy3Uc7rcwNvwWjCkE8ckfQVfi
-  ljs4YpYl/d5 KAuN4AznB96TVt1dm7lF2Vm326MrXAnlkeaOMZXcJ0Xgp6D8qglWSVLaNZBhY2
-  3nJ5yM8fhUzwwr M0yNLLFcO2Nr8AHGAfU1TiufsrlbYbnUmMhuev3h9T0FaQu1obQxcpxUVun
-  8/Q05lgXTwWWQHyyY WzkEcc/jTIr+CyuXuEPm5UKQ/O7I6j8arm4laSziWIYjhZTG/OFzzn1x
-  1qGCJFspo5IWaNJE78vj OSD6dKSguW0v61D21qLhNd9L7/16jzPKb1ASPO8hlbPQHnIx9KbFJ
-  Hc3QkkZhEYdpCnHIXgfiaqO rQ6hHNKd0bkPkHG49OPxNRRlrd5zEDGsUiqyvzlhmt+RNaDliK
-  krwpu2nf8AUfLHJHbwowaJEALM e7dcVYN1HHHDJbRL5w8xZFkXOAemf1qBWeRvOdWl2xjcM9e
-  aqossT9dyiUZcjjHb88/pV8l9zlq0 Vo6i08tn67kqvcMkk7cmOSPbtX5cDPBHrV2N3RXkI/co
-  5jRRwSXOc0C5EcojZQgRiJkK8sazraQS 2rT3mIyS2yLOC2P/ANdTbmTujKTppPmVr7bu/kX3d
-  50SN7aUhJQFKHAPv9KYDJYXjlkATftcMOrD nH41H5qoYnimJ2ybio/iO3j8B3p0SyXhWSd+do
-  BA6+5oSstdjKlC1+ePuv1/zGRvs0+feNs7SAMj fw47/rWhDewwh5JEkNw7Kw2tgHjb09ealDW
-  cLw7rmDAUq4aMkliMAmqBjS6vYVKmGQJjeDxxxkis 7qd7rQ6aNSNSnJSg+VdX289vwNK0t7dc
-  TwS/vYZChJOQoGQSfU81YbUbq2kh2wLIuQGbb99v/rUk hjjsWihhfIYq7g8Mxxk0kNw7xeVPt
-  RmJbzCML8pwcfhXM/e1auZ0o05q8ld/p0sTeUhuGcoFjKEs pOTnr+dVmCMYQ0qJC2HZFyD7kH
-  tg1PE3laxczFgI1Yj5uQuR0I96alz81rmDcEjO7HYvxj8KWp01 IuS5Vt3Wn5kk+oRQ3IItjIj
-  4dmGMt2Bz7U2OG1ighFy6hZk3Akkb8N2qEQfZvs8T289wAGXKng84 P86tF4L23isjZ3MXlkx7
-  nYE5Az/SpfKkrbdWcFSrSi1ON0utmR3L+XbpNDl7eQCVwvXcpwAD2B4o cmbTkYbWYxu0qY53b
-  h/L0qhPJcWI2grycmNhk5bByPbtWebkkho5gJG3BlAI2ZOOfwzW0KDaTX3k zwqlZv79QZ8osi
-  RyBpCDEM9s81auppUgYxRYRZf3pdcjfVqeSzW4iiimjZEcbWB6gcgj8KzZ7mIt GQHSKeB5CXO
-  QWz8v8q1j7zXumFPkqVUqkNPO4Ti7lKO21YmRn2sOqnrj8amsbwR20Fv5TSyqNif7 QOfm/A1F
-  DJa29pDvZpLlvlJLZCBhzkVJO6GKJbcxstsuNyjBbn19x/KqkrrltoTVXtkqcaeib6NW /wA/v
-  LEEVlsnQt9qKg+YU6A4+XHoBUCyz20dvcWkgLtBmVWGd56BvoO9NLz+VKwCW5UfL8oyytzu /D
-  +tN2Ty6MS0L+bGxRCOAA3LA+tTy93oZum4uKqStF6NN/oE0rCaK4mkhOSGQImAyqOv4npTLgCe
-  yile5gVZmLFtuMMM4/Oo4rO5PlxFPMETbAmMkgckj2GasLbWEsmFkwypnlsq4PO4e1W3GLVnt2
-  MH JKakparsk9CqqqVhRfMk2xlHkjbAZ2OePYdKt2/2lbG5S7twUkuIxKdg/dE8fh24qVI7fa5
-  QgtuU RgHG9eu8ewrOEsyWsmZBmdt2WzjeDz+lK/Pp/XcxqVvaOyaXrv8AInS8SC9uFcgxQ5hZ
-  Qv3u2R6c 1Sku1ujH9oXbtXACjBPH9akltbZ7V5beR2LSMwQnJYAjLfQc5q/PPbwaXNPC1vPKz
-  EgBfugkYH5Z NXeKaaWr0CdSnzx5U3J6dV+X5mUlxPLLJC6OsciHykPO09BWfJt+1qJIZNsJCH
-  J6EdjWje3UjmRB GkAJOH24Z+nzA+gH86zfKcxOqiRzJJ9oXJyQRwQfWuqnte1jatKVrRjZev6
-  6E1zPFJLKodnmLk7l PHQZGPoMVG8TSwW1wkihPLYgE54B4J+lQuGZFkmVVMkZIAXBJ6A0WUcs
-  V9bTsDFD5bsA4yGHTp71 ajaOj2OWpdQXJq107+X9IuxJNcaTl2ijkO5i5TllB4YH0xWbM8TR2
-  qqNrhHyeMsO2ferZmJt43Id Sp/dgHA2n7yn1qi0QjhEKrnOGB7r360U1rqcmGoVXa8LO/f/AC
-  /Uv2awCVVd3jgCtvZm7kcfhnHF XEjtn+z+VtOUK3Hy8I56D8ax7ZjHOrPIi7RjDISMHnmnzTM
-  1wHjDRMwO9ccEf4980TpuUtGddaDn UbgmrLorK/mdPcxRRwx/aoXJiUoCDjA43fiOOadKtt5M
-  rBJd7tkYk7ADmksr6O5tEieeKQRRFSGG S5PJbntxVmLUIrS0vH/dyTb0c5UEcDoPrmvMfOna2
-  v8AwTx41qqlyRT5+urtb7i7ZRBoTBHJH5DH JJ5JIyVI9OaqzXM8Ytp2/eTFFYvj5Wf0/KpZYo
-  2DkrKBHKRuR9oHy5FQ3E1obaPaxSTH7lGbJCsO p+hrGGsr73PTw9V2va8PMoz3krS2txcP5i7
-  d4CDBIU4B/XP4VCbi5M8SW8SlpJciXaMD2/GmTwSS zW6Rt5swty0hTowB4IHYVEzs0aedbywj
-  a/mnOAGP3f0x+dd0YRstP69DrnQpcqlbX06ely8zSxpN HvSFtwk9Dz2/PFPmWRoEnd3V0VhKC
-  f48gAD061HbXGm3NpFLPHKobAIL9wMY/SrP2GUWgkhJDuQz Rtyc5/p1NZuSi0nodeCr0YOKWi
-  v1W50Nus1vbODA11MisSq87Rgcc+9QwlNyugCXMh6MM7Tjv71U Nw9oywz3CSCSNpHdSeo+7+B
-  pYHk/s4eXcwkD5ZAyZZXboufXFcDpuzfcxSUbycd3uXdQMk1l5bTQ KLn98zBfvbR1Ht2rOhju
-  0iuD5ckvluoGDgrkdD+dThmCeUVwyp5aI3PH94ew709lkguYYTKoGxvL bJwyqO/qT604Nxjyl
-  08RKlT5W+byaLVjcLbzSSXTRSKVGeOrEEDHpUXl2Uott0U4ZIwku2TGw5OQ femRW8XlBp2zGw
-  LKAcFSPu5/Gqf2bfq7QC+jhUBRITnlz0/PrUqMXJtOxPNGo5VFLla9TV27Z1+z BYAswXzDznj
-  Az+NQzQ3rTJJIoe3izE8YGGDnkZNVbotBLJgmZNjeYUJ4fjj2PerdhPDPFdNNcFC8 qyKpPTav
-  Q+9S4uMedanPWo1Ir2kHzX8l/SMi1t5Li+DyLLbyL0VjwVHXH41uzWhN/CyRPcRFZJ5V jOD8o
-  wBTZILe9szNb3KxyOyquSf4u341Pb2VzFZyW7u4aGb7OTz8yscmlVrX1vbyMcZjYS5W5a9t Uz
-  F+0FDE4WMkR7sFB064/HrVdobZ7mI7pZ5XV5MRPgEAdfp/hWpcGOKeWNF3M43lcdQBjj2FZuLh
-  oYdpiESIYy4XlApyQT710QldXWhvGrSUk3dP1HxG6hhRp7WRoTGA7AAfMRgVnSDybmeKeQpsmS
-  Mu /IC4yfx96lee4k+0JCWfcN+M8YBB3fTFPghSXzXWCVw0scoLNnCdwfUit0uW7Z0z5qadS92
-  +3/BG pDmwkEjSkDI5fJyM5H16Vo2dhb/Y4Y1w0uV3g8k4PI/rVaWd7Z32Wsgh+bypG5DqeM/n
-  SW4vJJjL cKyJFJg7fl6L/U4rOfO43vYiNOs6PNL5K+/3G/dxNv2BXSGN9pdTjdznr9Knhv7Y3
-  ds1sszYR9yh s9fX6VjW85HkQsxtmmPztM24MR1I9B2qxaEfbZUMfmKswMZj4MYUHIb17Vxype
-  60+h2U4XptSVmv UvyO6x24jjfYFU7s5zt649OtOnkd4dtmI2lLMSNuSg6AH8M00XLl5ljCvk+
-  Zux8qEL938etTw3Jt rSBvI/1sS4bAwM9B9cms2mrO2p3fVpwjGX9fiPjjKw4SSKQiRQ6qPmOO
-  hHoPX1prQqNQmWRiQjFW wTl2Azke3tSsbpkeKRo41jOHbZjcVHGPqTTRJcLA53xRzrMmSyZ2M
-  F6H61HvdyalOo4tp7/12KVy Y/It7lYGjMcfzPxtUnnBH0pFW8aaWVGj/e7QkTx5wRUF/DP9g3
-  PFI0CyjcFONoAztPqeetTXFoJk S4S88mMxOQCTwcDFdC5VFa7/AD8ypezhRj3lp3T8inLczoS
-  Xy7OGbbHx8o+Xj+dQLGsttFBPcoeM fJ8pJzkE+2KIC8Ee62kSeLaMoRlgSM4z+pqjDLGl1bTP
-  l41/czFegZs4b6V1Rho7f1/kS6cVCXdf P81oLdFo98Ak3bcgHPXBB/OrgmhuJmW4SUOZWdSGx
-  yB0qwkMSynZLG8aHyWB5Oeuc+prDuEhWJwj mYqxbYMkgY5qoWnoZU3DESjTbtbW+paiZreTyx
-  NDArK6KrjLEsM4qKWa5jtYw4XYgQoGQENx15rL WUhxKsifu5AFB53ZGMitOK5vIxMTGWljyrn
-  aGVScYGDxmt5U3F30O2M6lKfI1Fp/L+vuZHIlxHcR hI2KtExRh0IHUioZpQsqExsVVAuBgdR1
-  zjrTXuFGnwkCQSOcyEtxjPCj0zzVqXc4kLRbEjZs5H3W IGAcVabT1R2UMZKcveVr6X/ytr+Qv
-  n2xsgYmKygqMk9hwAf1qQRCOwhmklJaKMhUyeRn/wCvUEdr KY4o0VCZAJWGMlWUdKRz5qONks
-  Yd1yWOcORwKhpXsmcHPSc+Xm0W76/jqWYJjLHFK0BMUb71J5AP Py/U1Uu45VltXT5nZP3qehP
-  c/hUiRTiyaFj8kL4nPq+Dge2OhqB0dfJ8+YSgfM0aEhvzxRFJSujl p0UqjcVa/wCP6fiiwFVL
-  YxRxy5kLBeeWAHQVBGbSWxzJMd0qAgAk7McYPvTIm8qSKRSTsOWU87jn HH509ImjupgqIfL+U
-  7kyoq+Vrr/X9WOmGFxCfLKVktVrb8NSoGJWXzJkaQtuYhetWoWEljLCQrYu IykgHA4xj6Vcnj
-  ki0yA+XBL5n3HRABg8HNN8m2huHQLIhjkMe4njHbPvSdVSj/XQqU/b0kkrtP1M uS1ZVlXEhli
-  nCDHQAg8H3zUsQnUpsDCKC42tnrz1ye+KvzyXeUjJjXOOduN3v9aW2ZVeYQRuXMgY h+e/X86b
-  qScdQnQbp2aTt/X9aEb2Rd7jkMBIN6jqrdqV4DLIdriWRWCtsGMk9x7U6BGgJjYtI0r+ YVB5K
-  pkn9asbA5edQxEqgqqcEZ7/AIHis+dp7nXQq1Ixeune36Ec7XEQBlw5DYyo4JPIFaTWsAgM Zm
-  VbqM7NhPJ3DLfnUsziw8gGHz2l5U9QmOMtnrzU9tZ3Mm9J4wud0nmbeQ46ZNck6uiexyzrQnOL
-  ulbrt+n6mQk0sMokiZVwArRSDcSADg/hWskk8mlQIhglEqpIzKnRh0/D2qF7RxpxWcq028AMox
-  we tTsst5A0EEiQlTuChMEAf0pVJRlZm1b2dSmmrNp6t9hsc9zcJcpHG0VxLIZg7j5QF6gemao
-  TzTbk dHQqUICAYZQ3TJ7nrzT2jleAmebKOSyyJkBVLYIqN2CagySMq+TmJAOwcZyfXFOMUnoj
-  jknLWCSS +f4/oZ8sCzBI4bgONrGPk5wOAT+tE6LFpM0C/ZxiY5fbyTxjn3qIK0M5kZTNFEApM
-  Zxu545qxIft dzcNJG0UDNuZ+yt2Fdeqa10RpiaUozTTuo6303IY4YhcCIqXVSGDA/cPYH15p0
-  oiVDayQFpI/lIX ggk5yPYGojIz237wEuU3yBePnzwP61CxhliLrP5cvmiNg5O47uapRbd2ee8
-  N7/tJpq+ztpf1LbGB pZXtmiaU4GSPlbcOw/OqN0JY4m8sAGErGGA4YEdfc1bispk1EpEyqY3G
-  4Hkgj/6xNW5raGSVFjDA tvkV2bI2g4GfpS9pGMlrcdavGlU5ea/9f13IY5kMc8e8IyS4DtyBH
-  jkfhTbeGK2u5J5DJLGG2RkE AAY7+p5qKFZVlGCnyk4BTO5e5P0qzJdTRG3gkltvsnmEZ2cgD5
-  tpPqexqZJp2XUwxkZUpcri0nvq 9V9w0MtsZZDHL5ynDNu+VvcD6cU+a3Atrie1QyASBFA6gEA
-  Y/OqcV3cG/ZgY2EiM7AjPQYJ+lV7p ZFslkklI3IBEF43L3B9SPWmqcuZXOapRnCqoOyf33X9e
-  ZetpmZreSCSJpLfKTfLw574/lVAGS81K NEkigLtnLLwuQcr9apCO5tUSNZY8PG/Qcrzk596fH
-  O8srJcRmXch2tEdpBxgGt1Stdo54YdTUpJa 9+33ktyluJvs9rDceaR8vz/6vjODUcM0DReakq
-  ZdG8zcMjJOBgfhU0V5J5CM0Qh2KB5hTODjGD9R StEdsUUJguABtxGmDnr+lUnZWZU4y05nZd7
-  /AK7fIrQ37TWbys8S7XAQOmcAdPzqQXsf2gPMjElN qhRjHOTT0tjDpyy+Syt5Q37gMZLHBxUw
-  WVkiWWS1kYjcieWOGJ4B4+tKThrZE1I04Qumtd3s/wAm ZMitcz+bK+yN32owGFB6gVfXT34mb
-  f5DgKxz39vQCqIguXuJoIY5M+fu2f3MZqxcs5smQrITGoG7 OF59q0k27KLF7Kc1pP7t16bGZc
-  281oIVZ1Eb5PzdSAeo9Kz5vP8APiCzDYxz908itWSWJkJjjYbc qpc7hg9OKryPbkp8mOBjcet
-  ddOTtqjVUZypPmla3qm/u0Ic/daaWMfLg4+Xn8qsecUubeRURI49y OzDPJ4wT61Uz8yywlJDv
-  3AFM7fz4p2x5JGW2UyLyxBG7k03FdTln78bP4e7b/LRFyygViiksksW5 ZADjIPf6VrWkcUdsv
-  2dXnDyLzuz8uDk1hRrlkEciuTEc7euAauG9JtraBQUMULKhHG7JyDXPWhKT 0Zy18NVTUYz372
-  aS9f0Okvb8ShZYwwt3jdSgONpJAGT+FZqSXFvpUYyhdZCnlFMuvfrW2tvBYxXJ tHiuplIG3G7
-  Izzwf0+lZ17Z6ozFYIWigEnzlwCdgHAz65zz3yK4aUoaRWi8z0VUUFBW0T30/9JbT X6g89wuP
-  N8os7mPcgxlAM7h7ZxVUS3dwpWWaEM7jgrgMvdxx0GKuMto2lI9zMFeSVEgXPOGGD+oq hIjW9
-  0UM8c/2VigZFxu7H8O1a07PZam+GqXbVN3f5GjbwQ+TJCrLKi3AKhRzjqD9KszmG2niks7w M8
-  sLt5ZYnbz/APrrMi2NdNG+6ORX2pg4Geuw+56VcnuFuDbR21vuuWDArs5iGeB+hzWcovnXY7Kt
-  KFOpfmunvsvvNCLZPcSyOvneXMAhX+IEcfgTmlubaGSLq/zuWkVf4cevvjNUivlRvcNdRK6N+7
-  AB AKk8Ej37VIZbq1DzR3Nu00b4ZGTqOvT8aw5XzJxZzyo1PaqdKXpuv0tbzLcE8EEPmxhwJji
-  ISHJ2 g4BHtzzTL1Un1m2tzcCEWiMskhPDnqCPY9Kkljm2LKkW+6dS8S8YjUEZXHqc0/zCby5k
-  AjaWMhXU r1BX730xWStfmX9dBPlk25tv87lszl4LhIFBkllVgP8AnkOmD/Oo7uSEpKkmyNXBL
-  SgdCuMD1ye1 UzvTyt1tMlqUKRgH5gGH3ie/NUY7Bmw0kwaKBfL9iSpP86UKUU7tmlKlCKvKVu
-  3/AA//AADW85vs 8z+bGYpSJRhfu4OOar3d08ojMBjhaUkPlOFJ4x9e9Ogjhh06CCRZVmFoVkD
-  NnDZBNOWMtesw2g4y UYZ2E+v4c0LlUrmMqkVPmta3f/gEVtGE06NUc/u2Csp6gjP8qum9SaOS
-  C5uhE0k24tkjhOv59qyZ UjsGWWBjcIxyCG/1ijgEfUmpNqvKJIruC2nj3mVZoycgdcVcqak+Y
-  HRdT3ld+aW35/eWrlJpXijL iPzVYrn7ygclCfXHNJFbQQu3mSsodWK7m4LHgVfhmknuojFGJM
-  li6gcxkjhT796o3W9o2Vp0hWMh k3DlwB1X2BrKMpP3djkoOpKbgtGv62K0YCtEl4PIieMhpOg
-  yBjFK0VmNkTLcNGcIHSTAJPAHNILZ rmSCOdxJvy8pBxtccZ+mO1RvBPbX8sjgLFH94kZCuFwP
-  0Nbqze+p1UKbvLln7/ZaL/hyxL5ccYtX WWIJGTukbIJGCcfyp9rPO939olkimjILEovyjPXj2
-  plrEshJguorm7IyAVJGPTHvVwZS3EjQG1yX K7+ijgbTjuetZyaSsdUq1OLtvff+tySC3tFjCM
-  j3LybfKZW6gnoPerQtHmlkgkjdZoW8tFRsF16u frWQikPNAqvE6vj5jnGBnj8OafczTrPb3cj
-  O7NvwEYgnoP5Vm4Sb0ZvBSfvRevTV/wCZs29l5MpP zLAgKqrHkhucn6CkmilN1bQ2ys0UduVi
-  Oc5H3ifwNU7DUJSXV1Mwb5jjHY8L9a2A0ovY2SBgEVlJ z98YySPQZrnn7SEveOx1a1J3mtfl/
-  mNuVNxYeZbJJulO7G7O4NgEj6Yqo8Ust3H9qguI7cRNI8e/ DOBwDmlS+uYdLEwaKN2dXTcmcq
-  ODj6VbW5AneUHzWU5dycqvbb+INSlOGyFGUlD4bp7WetzMN3FK sEcUm1JVOfMJPGOPxNJHNHc
-  yxqXUxrCElAOMEngfWopVWV0W4iMboR5Kr8pZAPvcVYktolt7yWOR I4TIGRz3xyP61u+VKw5V
-  ZWtG93t5P/MhRre0nQjDsy/6tf4SPlAPuRUKRpDFcpAqRtFIqfvRu3EZ OfwHWh9NWW1uZrecP
-  5kgcnJ4HWssSQNdtBK0qROCyMW+97/jWsIKV2n6nHGFKo5VFK7XxafpsUUv pGs5JGcC5kcYZe
-  AVPXj14rUitdqM/mRxJLnmQZLkHhh7Y7Uu6C31GZTbiZRc4PyjCfJkVTleS6nh VMwRbBwx+6D
-  wR9TXS3zbaIbrOV+TRLdsjSzaSaSeW3biQMGXAQjvx/KrE87S6dEfs8sMTFpJSSM7 iwGPypFl
-  maSK1jdYcKyv5vIT0B96WELKsHmXMUrOmDGoII3HFOTd7y6ETi3UVSotvX7+xUdpZL2F IEUxl
-  cxIV5I3fz61OL2VtXcw2T3cTlkwBkEDjceO3rUMsEaahJGjOiRnYCT8yn0z+tMd5I42cNtw 4D
-  ovBYkcEe3qK15YyWx6FWDs+RaND4vtJuQiCQIMMrHuq54/Gp5orqG3juoJUAcZdCuTkHkfWodz
-  JPcfvlgZJFjw3O44Iz9Kv2yOtlDCY2mWWPdJIDwCOorOpKzTOTERcZXsrPfT/MymuViuZVkYyI
-  z8 Ecb8HipWR5Bb7Co25jlyOV9zVyCCW6aZSmGBMiqFGSNuOP51BGlytr5SqMBgzHb2HU/QVXO
-  ntudq qqok4u0l+C/ryAx7LMQrAdpypLY3bieBmoY2YWkqzEhWkAYd9wBz+XGauh45J2ltpDkl
-  2R2OVx0H Xv15qSG12WNzHMVhjdlcO4zg45pc9lqddBT7K34/qVEV8W8brIVBJky3G329Oasww
-  2812HQS3GDn APXA60sz25gikihnQsuBKzZVselWYIGlikiWMo0S9hg/T86icvdvsaVKS5HKL3
-  03/wAhslsyRmUR m5BT5lQ4OQM7h7DvVIIhh3NbTtuOZJEbhj3IyOBjmtFmaEETRTsGbfuVsAt
-  3H09qfGfPs3RsIC67 UA5Xjqfas1OUVdmK9rCKlLXzTf6fqZkUFvI7gz7o43PlFeGcMOfw4q3Z
-  oWnt4XUxmKM+axPHXJ+n FPMa3FiVSFllSZV2rwWXHzEfhUhZEhuBDBOoklDKzHOAByKJTbViY
-  zi7qKavtr177/oTvObi+VEl RLcqGy65OCRgZpv2vyZpEa5E/mb3UpkAc9KLiPmCdXSFnIXbtx
-  kfwgU42luJXuJoJYn+YtGWGVyM fkOtYr2elxxhh3JPl07abjVYzyxfaJEETKXJ5HzdAtLcHbe
-  wQhmQxHbchTguSMbh6AdxVmyjlJgW 4h8hYY1QxOBuBz1P6fnVRpn826LwmJxMqNMw+VMclT78
-  Clf3rLoVU5Ze4nttbb7u4q2NlLGlvDfK h6eYWJUY6DHvzUN1bWSokkxlkUEttV8Eeise571Pc
-  rHBcvcRW0hlY78Z4XHt7E81WhuZbu6tY5EW NTC20MnXPGT+NOLn8SlocVVT91yqPkW+quvuK0
-  UUCTypGssNoVBkeVt2GB/+vTyZp3jtYwjxPC33 V5HOMH3pkEsFjqEQ8uSXEZ81G5AwOevvzU1
-  0JglognjzKdoVBhpCOTj0raV+YjGWhJO9n0b/AKuZ 8xdYYrcW4WURmQM4zkKORVBIzMUEiLCu
-  C4YjAz1BOO3pWg9vLLIPNV0hlO9pv4VYZGPYH0qBGW2v LVJ0aR5IsKgONuD3rphKy03MvbRjS
-  vDV+WuvqwB/cRIJDJKG271ON2eefU5oljaV1Y3KhiMbEz8m e39amLSS6pIYo1ZncSAIvAIGMj
-  0FRnfJcLJco0ZAALAYx7/n+lJXuFTC1oys997X/T/IWdbaPz1+ 0JI4l2qUGNyNgGoYXtIMiWC
-  YiDzFILctngP9K0YkVoYPMntZHRWErCP7xJyo/OlTV1ghJNuhnLDc rqDksKjnk1ypN/OxwV1V
-  qacrfzsjJQ3LXVokCKxjQtgLzIAOQKgvW+06dZtEksYVirFmyE3dAfpj NakkjvcwLKVDquNqD
-  aQSf61TffFKiRSxy/eZTjgY45Hrk1rCXvJ21/4c4K6caqaVmvN/1+BDaWTS WxWY+bcSSfumj4
-  GwZ6+5psZ+zNbmZ40Z49yx4+bgkAZojkuZ4ijzJBMWHloVwQoyG6VWa3lazjn8 xZltXEG9Rwy
-  sTz+taattSZhUqzc+Wc21/Xf9BywRKSJ7gOi4xtyeD1H15qSeSYOBFIkkcb7Q6Jgj Pc8d6Rba
-  eC+jVrWWQRoUlUrnLHOMehqKCQxXNtFImxRGY2OMZOc5Nab67nouVNrmT5rdNPyV2W7i ytGtg
-  ftMqvHPtCsxOF4yCKmF+2y4RYVdTOroQMEKO1UpriRrqZjGrGRwTxwB3pLaYNbSjHlnzv3c WP
-  mZe/NR7NuPvaieHpODcru/fb+vVjb5ZbnU2cs0R3MdwHVsdOKhVjPGipbmUScKI8ZXnkH3qW4a
-  G5uVaAOoJwFLZPTn8qqzwvGINknlhv3jZ/jA7j0raGyWwVHVpRcYaXWyX/BKsoKS+XuULvG4YP
-  AP +FOAE8YBxcgPtOxSBzyB068VJMrOHmkXyGWQY3dAOwPHWq7gM0qYUEys7benTgY9ufzrdO6
-  Odyqu XIne+9/6/UPs4s5BF5ckYYFhvJz79qQW+IzJ83UEDJ47c8VVmtZ4ju84DrkMOxqKS6m8
-  mOMqclvL Pzcgk5B+gPFaqLezIdRUItVo25dkl/w7/EvqyK7heCyHAA56dar4e41C1/eoFHUnj
-  juKaYlmBcRS xmI4f5uhz0/StBPOuRMkcaRqz7x8oyOMY/Gpk+XUyxLU1dpcvc6kzxrcWz28qG
-  WJZEkfqGJHynH4 /pWpG3mQQmW6EkcahNqkjecjJ/PiuY2W4uGihbfIW2qT0bvuFT2nnz+Qt4r
-  CSQnyyoADoT1x6A/z ryKlBWTv/maYjDw5UnLlXV2V/wCvQtX0ofVJsGNIWuNy5TOwKBwPxpIC
-  ks0kk08JBIDDbyS3A/Gp r0RItvard2rBo3D5HKsPu546mn2N1HC9tbmENcrEfOUoPlK85+uKV
-  7U7pf1/SLUlCgqkL3Xy077C L+5nYSmJDFIowV5XPBz6n3q9b6hdNPvhhhwFZCgiG4N0GT/nrW
-  ebiOeG8OzALh4mYZ3KOT9ajjjm nlEgWZ0lQsrJwCAaiVNNXkdE6VGS9pLd97W/QsvA6zSNemN
-  FBAcFfusF4Wli1GOE5V4cnDMXjz8x /pTY1trK9bzZzL5kgePechsjgn15p1u/2zZC9j5mMNcB
-  QFYvgjAPbpQ0mveV19wOlTUX7SDkvu/B /wCZcN/LdWpllChlZj5qDaoY8Y/Gqs63U7Ov2qKXy
-  yqOI1wZCVOMfyqoEvnWPMTwJKPkUrwOv54F OtnYxRhI3JEZeOQHgqp5z6ketCpqCvG39f10N6
-  UY0oJwS/P/AIP3FnLpZKAJYW2qxaUkgMODx6DP SpltktxKnm+ZEHMiyAnB2jkn9aSPUHlumEf
-  leVJtEe9c4DHkn8RUNzFeDTbuJmQwGThtv3s9MH0P TFRZ3s9CasnKqoysk/P8rotR7Lqzd47h
-  fKMgbJzlsc4FURdXdxJE88iZnfd8q4JwfmH4DFEV9Hbx sksDJFISzBRjYRxs+uK1dOv4nRYka
-  2ljhZ0jfYPlj6n8T60pqUE3y3OLEOrBqMY389zKZInupJYy VMPESkkgj1+nNallZLdLIPMh/d
-  p5bqF+c992fyqnLZ6emnM0UzbkXbneSORkZ/lTbCRlihk8wTxl R5qx8NjJBGfX/CnNuULxex6
-  1So/YKdK6e2qSZoqJba5w8ciuxDGXOFzjG3681Qe7WS4SKWaKOJVK NuXkNnp+lPu7dEglWP7R
-  vJPll3z1I/pTIo7e5nlWGEzskhKqG5IwRj6ipgo25mYwownLmW738vm2 aMtwlp5dzgOTHIrr/
-  tY4Htwc1Qs3uprMBFEssMibwwyGz6+pq4bT5o8SBJRbsWR8nb8vU1ammnfT YJY7yxhcKGm2xd
-  8ZA+pHSsVKKVluzCVKlCKT3b31Ms6beJNHIJFbehACLtKjP3T781Q8ue3lQPHN GIj5e2Rid5L
-  dB71ckJuILSRROxMY2RqxBPzcH8O9Thpv7VLjExkLOEIyRt+tdCqSS11/A7KVVRjq 1Jeegrah
-  N50kKQq0pbc6EfN6EfXHFRx3DW4L+TIHiPlqJDkAE5APvRNGkNvFeOkiIQZAucMB0AJ/ HNTmz
-  tDYsHn865Rw7Krnop/ng1F6aW2hs8RF2apvle9no/XU1ofJuMXJkjlmB2qkI28Nycj2NN8m RJ
-  WSK5MMucCRzlZPl5I9BzVW3kl/tOTZGV86f5owozyuMD0zVS5Bkt4AEmSSJQqqzffUHlvpXNGD
-  5rX0M6FV+35ItJPvqaVw8U+mSKsyRy2x8sow6hwMfljmoI2nijmb7VbCF5VkPyH5x0Zh7CpI1u
-  Jw 8pjSQSZlwigEsBgc/WmzRXEMZtoVzeTkO6kZEQx84I/XiiNl7t/66h7ifI3Zd9H+mn3FZ5n
-  GpNC/ +kIFPlugx5g6DHtiqK31vJbrEokMe0ADdnBzjB/CrSytYqktxGZwFAjdejL04/MVntFb
-  QxGU200Z gmREy/Xkkg+p5rqhGL6F1ZRnPSGnR3/4KJ4rk+cyRMzbnBKDuR0I/wBnHaqVxeYvJ
-  HBiBEWxMp1B HQVduordWtNgaVXDiF4zjCDnJ9frSTiOWZllkgtodmI2dckflVwcL3saUKlO7l
-  KNvVf5bjjLJb6T KH2lFdvkK/NIMAZz7ZqlHFFdyRpAkoQfu1lJyHHXPTtipoTdHSrcqYrsvgK
-  iryAD0/H+lU2FtdSQ +WJIZoC3lENhQT1B96qEbX/r8Dmw0qii40klq7vXRen/AACYrE5Bjt5R
-  MHJiO774IyAfU9a2LZok jiR4o4lki3s20AoRnCk+tYAsnRbeFJGd3XzFKsf3Z6EGrIW9e+4tp
-  1Cy+UUPVdwxz/OirBSVuYur Dmi1KasvW/4kFmYra+zG/knG5GuPmD9Se34VYBSXWFmkXCMuXI
-  6AgcjHt0+tWf7PlWGC2lnhIC7Q 23liT8pB9KtRW26/S2urZxIwKySKSFLA9MY4z9aU60NWbwr
-  05U5N7Ja2aTt313/EzpoxPZwmFN7F clRy2eufwFQW0a3EEUbu8XHOW4CA8j6mrMkkdrqfnxQS
-  iFEaNI93UnufpUaRJcqJJpoo23gOo4LZ GCw9qpSfL5BOo5U7JtR6SV2/nYdeWhglaSBmSJ5So
-  Jb7ikc5pli91sESQSyoyjaMdh0/OnvIsUC2 tvMLhUQlJApwB1wcjk1es4C9tBK0U+1kBba2Aw
-  znI9PSlKbjT946IRnSw37zW+2lv8vzIGt7VIJ4 445IZkfZ5bPzt6//AK6beO0SrAhBUph1IyR
-  jFXLyKdlE9soG87XLDJJbrj0xTreBrfUsT27XDoCo C/x8c1nGorcz18jqoVYOldO7XS/6sSEW
-  66XcLLG7AXCiJd2cLkZpgW5aSYxRuZHlaNsfxtnOR6AV phbaW2Xd8iyxCYKTyhB6Gs12vVjla
-  4haRWYAGL5c55JH6VlCV2/1LpxcXeP3X/4a/wB5K8cy6ewR WeVTwx5AB69fypGkvI7RJY/KxE
-  +zOwfKP4c+pNVpp/LaRSJDsx5YB+8uOTTbd4pmjtNs9tFO29Wd s4x/F9K05Ha7RpWpuMbzSSW
-  r6/gacswiR2tLiFpzPtVduc9Mj9TSRtbpZyrOWO2cEbTg4HGPrzn6 UxjErqIpY5pgU8xlXgnP
-  GPTNWVuJWvZGNk5iYliuBken5HrXO9F/SZwVJw5ubdLXsytfXcUjCGCN ss6AMeig8VI8JIm+0
-  3kaNHIURtpw+eCfcA0yKMREXUg2jz0JJ6MO9aM/myRTRLHFIs8m62YgfdHc /XpQ5KNktjr9pF
-  SjFO0O779ejMuG5eR5Wn3TgFclTjGOSK1nure4QrsEZKtkNz1G7J+vY1lOGECR CBm3JkheCXb
-  jFNurNEvI4FuQsm0KAepULyfwpyhCT7GeIVGfvN2a7fn/AEiSLy7rSjJBNnzFXezH IDZ6fl1q
-  nbuzzvPdSrnft3JwBk9Me+K2UMVvpj+W0LQtKMkLjJOMY+lZshimu7mGOPyysvyMfukA ZJx60
-  Qne6tocEcXUmnBrQqBW/tLmPgoWLYGQOScn0z1qrb3E7PbCS2kuH8sSYUcggnBHpV2FWMWL Nt
-  8Ux8+QuM7e5T8ccVqwRv5nmeXi3YhlKgAqoH3c+3etZ1VFaoWJrR5fehr2ujLiuYnla4WRVYMS
-  0JP3yehA6ACssRBruNY7iKVwmd5XOOPm/wAK3J7R2vGEaLl2DiQLwBjB/wAaoXCzC8eNTCzsPv
-  xx 44z/ACq6U430MsNKLctenW2n4f8ABKLSCOUlLhQxQMQo5BHAWlso8kJMXJdd5ZmJDnd94ew
-  9KvQ2 6BZTPCJJY32DGPmwMhvpVUz/AL6znELxIiPGpY8AHqT7Vrz8yaRGJrQqRaite5OLOJbh
-  zbs2USRM k5Vm6j9M1kok93I22PftdWYAc7sHHPpxV1IIoLkJcXiSW4DKux8EnHB6VmxSSiQC3
-  lXPy+YwPBIz z7CtKadnrfzM6cHyySfNpvrb5vf7jRmv2YPlUlZpFl+Ucj5eF/rVBEE6wTy285
-  aRNqIhxuGeWqK7 uX862VWSRXjLL5S4LEHr07U/7SkmntIWId3Mke04wB6e1WqbjFWW559WUoR
-  5YKzejs/+GZlS7H8p YQ21W27mOSzE9fpWj5scek3UMzssq3SlVTjtyfwqoCzR3EoVQfOR41AA
-  9Tn6Uryqtys8jQ3DHcJE C9T2b6V0yV7L+u4V1pHmWnTvf7ixdXcguwiSswD/AHgfvnjBqGO5a
-  DUFlaEN5UhRm25CseckVTa3 gm1GNTMqgLkSHIXjrT98ZeUkLH+82hWHJHb8apU4KNjeEI2dGL
-  5U9+t15vYdJdGRycbd4xICOjdB 9Kngc2kz5AmkjPllfXPcfrVXa20eXypdS4xzkcAe1IrwLAk
-  bI0bFiWZmyWPRe1NxTVkVNtrlXp8i NRJyQuF3Hn2xSRSMzxzRoU8sFf3gyBnt+IqeMSrMVbyy
-  2MFduc+oqNTtZ9kZIwCPbirua+xvaD26 33/DUgkj/doXGWJ4XnKj3OMGo5plggjii2Om5juxk
-  g45yT61JKJiyF2Csqc7uj/SqSzGO3XzmR5n GFwuQo7g8da0jG/meRjVGLTaej0ul+mxDGxZAw
-  lZmxgBzkVOGK3EQgj3s5wvGevHf+dPdovNVAUI ckBkGAB+VJakf2Y0pYk+aVUKcEHHB+laOWl
-  7HC66cbLd6eRatYpRp8scUgOZAxQ/eycjOcVNazT2 rIYkDOYmBQjJGDmlMTSXcUbSJFN5Z3A8
-  Hf3Bx+dILJ1+zmaYW3y9G549eK5nKLvzdQbhGnyyV0+i X/A/I1ILjzTLcTKrIWAYxAL14IHpx
-  WzBJZpvlYmBCPLj8x8kDPb+dYETm2W4gbbIHlRmAGM7c9Pw NWJYIbm8kSOXbCrEQF24w3IU+p
-  J6VyVaabtsv+GPXnQkr2bXez0+W5p2bW6XOwlLto42ZnA+++eM Z9KAlukiXE0MsaPJlmL4Ib3
-  Ppk9KswC4trYJdRRvMSVMcahTyPm/SsC5Xy4rOC0aT7ORukV23HPr ntWEFzydmc0IyqVPcWnV
-  7misksOoTeUgnXG0pt4PBGR7CrMAW0tw8Ql2qgHmM3yjJwePxrKQ3HmK U3PtjKlh2B9at20pW
-  5jgumDBYjgg4AO8YyKupB2PTrU3FNvWy6XEV7Ga8InlGxGEcZ3fdPofpWva TW1vqRcafduGcl
-  sTHOegHTHfPWsW5soxIQq8OS8be6nGD6k5xU0aXBE8TwziFpSR83KFuxPrnmoq RjOO+nqRKdO
-  vB22atu1b5Jq5rXXnXMYtLWKSIxoEBdsn73JqhdDZdLvtZ/lUqGjbCkE8jH0q3bKm 5lluf3kY
-  xO4JHPU/oMVnm5sprsywx3LEyAwoZM4Q9c+prKmmnZLRfqRGtaXLFO0dev53JrtIbXUH uWzEn
-  zKsQ67QAOPcE1nwb2gzH59xErYlbcSpxzx6etblywnaSEoGQSdSv8IAU/nmsOS3NjqTFJ0j SP
-  dsU5O7AxyPfNa0Jc0bPcdCq6vMqkdX6/oXRL9rhPmwNE73CBWONoQgk598d6f5dvHDMiLkM6FW
-  Q4ynQn/GpFtobiwsgEk2om2UB+euAfwqEC0jiUBzcGNirBGxuGc5HtUJrZfcKjO14rm9P+CW0i
-  lR 2lhjx5ZYx7+Qy9Rx3qFJhL9nlnTbGUIRIxtyvPX6njNWZftFxGWhAj85twJ6Y4GB/OqccUa
-  MkM6s 3kB4wynAweVH1J6VMHda7/idtCrzK6WvVrf+vQsLd7olHWWNlTYw5Q98+uKmhv7g3O57
-  dJCilGMK hSxY4DfSqdpFZtYrDPDO1zHkqivg4/iB9T3pF1GzhmzHbTfNtYHfnPBwfpmiVNO6U
-  blKjFxlFw97 5foy5vnXU4pLu5jWO3BikOMByOf14FaFwM6fMyvHctJIDIsa42nI4/Cqdoz+Ra
-  BHiMphdWEi7hIx P3vp2qFp7uCFXlaFsuR5YXDMw4zwP8msHBykrdDkadWrGUZJNaWv2+X6ot2
-  9y0Sz+ZJCgZiVm2fK hHBGPftVZJ4zEhS9t43iiwqkclh16etaXlwvpcESERkt5ZRvmJ9W/A9a
-  r3FrDKlnbugjIt3ZHAxu z/8AqqYyg3qrEwq0XLWNnfW39aleKR5YVS4kTyooWjMjD5SG5FXIV
-  228KI6XMsSSBVTqExyG9W75 rJspoIbTyEXzBNIr7nORH/sn3yKtoGlkRmguJERShhiba6An7p
-  Pc55z6VdWGr6FSjTlqk1b7v0/M mNgzTwLMk8kfl5DRvtJIHX8jVUPdRNFOkscoCZ8sqSSAe38
-  6tSp5ltbhfNilVmWPc2QU/iOPamS3 9tLAn76FAE2sAOu48D8uaUHJ9LjoYhyTly3js1YZNPLO
-  6mSdENwrSJ5eVGc8KPTmo1vdRt71pDdQ CcJh9yZ+o+tUrgRTw4+0RxRW9wYY5MHBU4yfwP8AO
-  p3uJIblg6JcIWKzKBzvzwM84xxWyguW1jvV b2kOTlV+3/BenyC4W+l01ZHZZjHhDtXGTkdPpx
-  Vq7iuRNJB5sUku5yVC8lhjn6YqjLI8sk4mWS3l mYsMnCrjhhj1PalTzknt4re5S7ZlJKoPnz6
-  Z/SnZ6PTQ5HOEUm2rp9tP1/QXyb14n3KZw6bj5ePk wRwPTNLJLNfRKmIond+Qy5Kn0/SmXwRY
-  YpA8tuGGzBcnOCBnjtmr6tNGm1XhnMZcSSKvDt0Dj2Bq XLRS/r/IKtfnUZJ3d9LKyX6FFIZbM
-  QTW8yzEKQ6qp78Aj070+zigjmNvI6WrjMjPKudxA4/ADr61 VMs39nzKWDneoZ04CEdAfrVyJ4
-  rrUZXLJmUNhT1U4wq/UmtJp8rv/X9andKlTdHmqX9V+qelvkSR W1w8UDPIkuFKh0G0EN1NVGJ
-  s7qMzmVwIyGAbB3D7uf51eWae20hYZ03yJgTBePLb+6fc9qz3kjjl mnJ3MXEZicZKkjv9Kinz
-  Nu+xGEhupaJ7ef8AkOt9QuttvKWRyLdspt5GM81MLuZ5EV7oWzOglZ3B OCO341BPOsqiFlj/A
-  HZCxmMbdy9z9KijuHilD26R+azEssqhtoUe/bFa+zTV+Wz/AK/rY7XhIqD5 o+8/T/J/kTW6vd
-  TuYY3ljcrs55OM4GfXjmr95E1rpAleJoiD5QLY+UNyc/54qW0gkMMN0sTOHjY+ XEduMHIHHc1
-  SSyYMs8t6hjLYaNiTtcg8H3rBzTlvojgqV5Tqp8ytHbTd9rX/AEH2lqlxdpmL5IlK gD+Pb61c
-  kuGO5VgmV1G8KrYEY7KQPp+tYSQxwPDbrclopF3Pz0bPI/KiW6eS5ke0LQws4Zg53FwO nOK1d
-  Fzle56sKEaj953fbZGz9pkkMb4E7SOJXSPjac/Mv6UlzHJcT3txLFcRA3QdDu7HsKpQtHai Ga
-  VvNSWL7iNhlYnp+VWbNkt7+RmZYwkZCh+fYqR3PpWbjy3aRpSp06bk1Hb1s/Ly9bGhLLA42I4J
-  b52QHoAvzCqLuLTWIJHt7hICCVSST72FwD9OaZDDBEY0luUmWJGwqEhgCOpPfrTNzHy4ZLiNFR
-  N6 NLzjHQfjUwilpuiKDTTunbqtbfkatrZ2ly8Uqv5RijVCrnPX1qpLMpYj7M8UeTG0mRgE8gf
-  kKUS3 S/Pgojq6ncBgHHfiqj3Ey6eiSwNlduG7Ke2fXipjTlzXvf5lfV3Gq5wmn6Pb5lq1CXF6
-  sUJJSM7E GPmZD1b3x61O1hb2trdJ507SM2YoxIQ2P61SVdU+1w3Vqse2MAqoQfMucYqvPd7J3
-  AtbkzNKMsX4 wB2/CnyScvdehx1K8o1G9LeqevntY1keFCZkZlE0TYWQ5A9/w6fjUsN7I1laRy
-  xGacEBFiOCRnOf pWS75RZVkQRqwVYerIOmCf1NXwYotRgu4xJvSBxvY/KTjpis5wVtTLE14VK
-  d56vp/l3JHjmhinIu ol8yXfFleSAeo9smnwi6k1GC5cJORHk4XkEHBH1zVY3TJEkkhjKYUnK/
-  c7bfyNSJHEjZtJX3JIFj BYncvr+Z5qWny6kVJJUfZyitfx8r6Fa7tEmSbbeQh/NDFATg8csB2
-  Aq5bXAnACouxyG3EYJwDzn0 4xUV4tusM7SxPvEmAVbHJGB+XekYQIbSRC63C24V0DYALf8A1q
-  pvmgkzSTjPDK9/LZ2+4jur9pYE jYRR74lZ9i7djZ9u3FTRzq8RBLiSaeN/KzyM8Efj1qN4He6
-  SzSEQwratl3AJOOQc1EM3Ailms57c ufMjOcbuMcfl+tPlhy6f1/VicXOn7NKCs/l/wPzLGoMI
-  JdsbPCYm2F3bhm6hh7YyMVRgkto90pu1 dwpAbaeRyP606a1lkx5MUxEhOZZDlVOOn1zUUkOYR
-  HLFHmRhueNAoHHK/oPzq6ajypNnLT9iopc1 79rL/P8AMjfUYzpZU/vCWVgF4bA4YUfaPN1mRo
-  mSb905CKvB45I9v8KintFtZLfyNmdrE5GdpHXN Z6SJs8x5o0RbgINq7Sc9G/3euRXTCnBxvEl
-  zpQi7LR/12JLlGNvDLHbTJtXIdiCNq9fxz3qnE10J 3xGJHbLsqrg7T1/CtW5Vbi5ubVJS4ViU
-  xnHHUfjUVpJL9rnhiWOSc/cIXOUI+Y/pWsZ2hqjOo+Wh LnjqvNozXSQpG6FdrKyxbUzhW7fnm
-  s+b7VLd21uiBQgIKgY4IFXkmminhZWRYzIpZCO4yFHtkVGk 8kOqztAP424YbiPb8K6I3XQ4ZO
-  U4WsrrZ3aIGa9ZI4js+QMANg5XvT40aOJ1fazSLvUqOUHUj+VQ IJd0YZZQjKd24c568ZoSHfc
-  pHuaMlTww5+7nP0rVpJG7nSoWqRTsuutvw/4BGsgZvMV4wcgDCHkH r+VPZHM9zuKkiRixxwee
-  MVHYSxQCIXhEkIJ4ThjmrRULEfvbCzN5Tk7h7k4/rTk7SIjKdSak07/h +H6jE8poN+5E3DIHU
-  tg8/wBabsRZWMYRlR8x7gCxH5U7f5IUrbqMgFtx4wRg444zUkzvHBtjG0kd W6daFe520IuqpS
-  qr4fIjaRPJJmkBkZ+Tjj2PSoQWIcqrJ1JLdtvUfWophlH+YFchskdgOlSgyZMg TaNp2hvSr5b
-  IyvUcrJ6emtiBimAZCyqzAwlj0Hp05qDEBL4VyEkCq4bjPXninmaT7OZBGTHH8qgq DjcMZqJp
-  CD5UZAIbawx0I/ritIpnjJpycHa3q7siSU8eWyM7MzN8vT2/KrUbKY5W2rjcMEDAB7A8 deKZ5
-  EaXivEhkKksFAzhff1471IDEFdA4GZP3RP90evvTk10HScqUuSS0XzLlulxPdvC20XM2WUn 26
-  qfc02YFYUSRJPLhYEZblVI5Q++e9BkaJmkJEkqsANvHGOefrQtxgzI+JYM9ckEH0JxXPaTd0ZT
-  9tKstPdW19Hf10LFjD5ksQeVAskLMQfvDB4H41fEq/Y2WNUDyhWZSvQ5xj8qyYXH2BlQ7FTDbm
-  HI wfu5981rWLvLNLdq8cZDbIo3X7wPAP4VlWVrtnoxcaN5Tlr07fl+hZ+0XAmfdJtkgm2ByMj
-  kY596 seVk2/lzwl4YShyOozy34Zq22be2WScpIFWTcoXBLDHP4UttfJBcpF5AmEeVmwBkk/MT
-  9K4HNtXi v6/r8zOGI9xzhC7/AD+9FOZb6LbJDFiOPKs4UYbpz9KozpHJO7SB/M4wynA5GQfoK
-  6Rrpv3xiwhe RXIcZxuGMVgO8waWO2QOFKljt3Zxxjn0NXQnJ9LHThazt71NX73t9+hMXmSwV4
-  kM4bMfmDkMW7j9 alt4Wi1h0ll+VIGBPZiBwR+dRbfKiV7iCeOZnC7AcDr8xA9hVi2aSa2lC3d
-  uSg2jenOc8fmKUn7r sZ/WWk409U93tb87lNRZSxbYJJATGvzluE55Dep60t0kEVyTEd8cO4Yj
-  GM+n4VO+nziZt09u8ImH miNcEEj6U+VbecRS20se9FZGGPfHPqaaqK6s7o2eJg3abbflt+KuJ
-  IQ8skTiSFs7lUn72FBJ+lTS SxbYDbRG4nAK7D83B5BoX7RMJ4whRTOuHbnjGDj6ikSUR36LAh
-  SRY2SEkAgrjv6nrzWf6GanC9ub Va2vp8xlwUbT32ziGaCREVdxGc8mo1kPnuFh82CdS8ip94M
-  PQ9gB2ptxfSDS4wEgKyc+Zs64P8zT JJJxdTXLELuZtqquMgrzitIxdtTpw8mqWi1d+v5bWLs9
-  z51nAI5o/KPzMw4xtAA/CmxfacmFpYJX 83dOQvOf4R+Ap1vaW5sEmiG7KYWHPLjozD2FSRKrS
-  MsjBJopEUEcZX1Pqcd6ycopNLockZxhzOCv b8GXI0txEFZXnm+ZlaM4wmcf/WqBo7Z7VLmC0d
-  JNu1Ucg7gGwCPahMPfPFBeRbZG8zO0/KEHT6Zp GihlngcXIPnJ5ihSQAB2/PmsldPf8zVJqSk
-  m9NWnf+rE0EdsHnRre5gnBBVHk5Ht+NMF4Y55DOFj m+0bgjjOz1U+9VUFzc2UsrXCgPKjEY+Z
-  +xYH0FWpPLSzlFrieXzVMRPzZTnnnqc55puKvZ6m8/Z8 /Lvf+tW/8i1GkZCJc3kW4xMV2ccDO
-  aoSzwx2qGPzWSSRSjl87VHT8O59akt7x2nhhVUaRoWZztB2 kHJFNmu5PLeIpDEXdQW2DGWHAH
-  pxUxhJSsznp0pqoo307X0+5LUnnK26NALX7QzuGRo+BtXqf1ow jXUrXUxEJYCURnaVI+6f8aj
-  Zrh7Zjb3UDMXVI1wcopOOfrVq4LyrID5bYYh0UYPy+/rxU7af10Om M40/3fPZvte/4ozw0siO
-  jTpwjqrY7sf/AK1Q28V3AJoZVilRdxEoQY5H+FWbx7h9OVtibXj3gquN xzkmoJA4t1ntpQJZV
-  Y4c5DKOcj+Vbx1Vu5tKMXTSvu9P+HWxBay+YwkaMRwJgMWGQSTwarz3dxdt cllEXnEyAlcDch
-  5Gfwq2k15HYTqkK+UzD92U+YMcbapXAAntY5VZbkbyX/gJB4GPetoJc17f1ucv PGFRt2u9O9v
-  PyHjy5kmuZLjeguMB1PChjnB96kuNh1KeNJo4NzqzScjp1PHpVe3uYhFaxXCbGVGD rjG1s8Fv
-  XFPjhVLwOG5VTGHcZV+OcfXtTas3cyp1/Zxm3o+nb8V/n6FQCW5yrrLJIT5kZB4BPGPx xWlFG
-  0LzTy+Y4hYoyI2CSRwfp/hVS4WOYW7W8oUrErhFz8oB5BPcjrW9DcIJrsBont5JfnPUk4+U j2
-  oqzajojv8AbzjD4bJ9Nn6/8MZsNxGPPCFVdpMDfyu3HLY/l6VZuTDCkc0KFlkBjCpwUX39ST3p
-  rWbw24JELs7qVUDDZHTHtSSXVzZ3LLMYjMuRjZ0J71npKXu6m1Kftbezlfvr/wAC5Zmth9kRYr
-  W7 G9SDIzg57/n71NbJCssn2x4ordjuIcZbJ9/bpVBtSvTZrDlX2Abzt5B9KrhkmTz7gtuK4VV
-  ONw/v fQGo9lNxtI6KeGrKHLUdr7W1a+8sSafbw2SyTbmMM6wyBW5GfX86fcfYY5CEjeONg4iJ
-  Iy3Ytn0q vDdG1htw7xzZlBkVhnzDnjH4VuXFsizSGSB50kfdGo6gL/B9T7UTnKMlzO5zqcqdR
-  Nu/bVK//BMm zliS4W1SWUr5ZUNu4Bxk/rVoC4S0QXOxbcRbXBAyr5xz75rOjlRL9XuIWjRjvd
-  BwQRkgCn3EcbwB mndR5oyrEkoCMkH1NVOPvevzHiWlU93Vel7Py8wtbdUFz58hZYpRFlcZIOf
-  UUkkdvHCTAXZygPzD 7gHGDxgmq+5vs8gglVYUkAAfktuOd34VZiLpLcmUpLtkEcgAwCTypHt6
-  1o73u2dNCvLl/eyd+i6D 2hWR7cJG8sUaESOp4DAcD8aginBJCNvGBtJ5wR2PqcmrMoJ0xoow2
-  4SBtwP3yvUj2qcTndJKIInj c71WNQCCetZqTsFLFOMHKyfkMtrlJbxJQI0kZBu3pkcZBGP1qC
-  UGW6MkTJJ5ThFwvBB6VE1s8iZS WPaMqrD+LnJx9elFtcXK292GKRsJApiZMNycjn2xVKK+KI3
-  U5ptqSldf1/WhZupHjkWO5jlJ2uAU faOvWqyzQm8iWMmE7SMzHcAfU0rwsq+ZcszFiERQfmI7
-  nmq8MipOgYRQptdCzqCfQ/4VUYx5dA9t S9lLkl739bLUs3d4HQNCzo8cvloFb+Hj5TjqT2qnN
-  qUt5JvSP7PtmbzVIySemB6cUyW4iW2RLWJl VGZn3/MeeMH3qpbovmK0Nu8jtIcI2DtIAG4+x6
-  YrSnSio3aPLcYqMZ1F72t15dNVp+BbVY3uJt4c AMzRgHBwBxn61qaWIIZoGlYxpNgh5D8vQhl
-  +tUTazknzjHGU3KQBjdnqfoKlEMMcsMy3EchjP7sD 7uQOWx6VFRqUbXNqtanOm4pu78m/xSt+
-  Ben05AytG5khwvybuWYf0piCZr0JPKLYBHDSlTtPcY9M 1FKzXjWKLeRbowwZFBBfHORWnbqiP
-  Gcbo0t2CmT5gcc/pmudylGPvasqhiWo+/rLbs/x/wAiulsr RWaq0su+IsfmyWbOQw9hViB/sP
-  2lpraSSScecrMegHUdPeqv9omSCFoY1V0iESDaOecnH86fa3CG 4Xyo3UlcoZm3fKQRj+ZpSjO
-  z5lodjUqcJOS5k+l3+n+Qksm6II19ChKjZnOUXrg+pNSz3CvbxTWm ZRGwQAH/AFeTnaffrQ0E
-  V7MYFAHzqGcD74A5YewFR+baw2Qmt7qKOSVpNgcEjZjGcAdfQ1GjtZan l1a8bxhFu99rfnZBc
-  yywSARN5cBT5CxLbxn7w+mefWoLhg9lFcx7p42cNJsbgFSAP8arRQW02k27 W6TzSqG3IXzuPt
-  7e1Pgtr1Lq3uYgnnsm94yo2jJ6EfrWyjFddV+P9dyKtWnUg5J2a6d/XqvX8B66 hIb65ad4o5f
-  m+Vkz1HPHpVK7tWXT7YJAzl4CJGH3Q+eB9QP51Tv2mkuoCI9kUhLKpGTtBwcn9ald PIEodZ1e
-  ab92+/5W9xW8aajZowlJRcWn8v6t+QyK3n/dxtuAAJMnTDHoCfWpZLtkWJbiCQXCxtEW Q7T8x
-  6cDrUM81zb3EyRk7FLJhgG9OaheS8jeK4mt5eSGiJHUDgn34rXlctXYdec+TWzXTVrX1IGk t2
-  l8pt8YIGd3O0r26UlzNEI0eMofNyYyvYDgg+p96givWnvBPsiL+ZtUEZyM49KhmSRrolYVQlm4
-  K8j2+tdMafvK4vbTnOLT9O/53JbadI2YzRO2MjBPHI61WIWS7iKySIUYEKxJL+1SMItjeYjh8E
-  gA 9B+X41FEF+yEjzJI0bBOCeT0FapJamFSmuf33o+70+64scFqJV3sEycqSTyT/wDXqzJIMRy
-  BhNgF ZAqkbccAn15qgJURvmid95x2+XtThKy3SxmEkFtp9vr9abi27l+1jF8ylZLol/wNSx9o
-  R4U+YM4H 7ojoQDzxSODNbyyrIJVSYBSp6++MdKpJMHVTtRWVxjA7/wCeo70Ga5jKhI0Ul8MNv
-  Ue1P2epz+2W 769lf8Cz5jQ3ckWCQcgFhkAdc9O9VJ3kYxeTIWKZEiMD0GORx0qWNXnlIMckbg
-  c89ewxSJbTxlpk VtqPhi65ww4IP9RVKyfmcuKrVKkLRk/S6X6XKqRiWXJ8x9nKANgfjVeOJt8
-  AiKA5PmEnnPXP0rR8 uaNPljYnG0ADnrx/OqkUN3MQ/lnYpJPyHnHJraM9HqcuJpRpOLlfn7aK
-  /lrsTNdll2Sja5wq8djy aHx533ldEYBiF4NKsLKqlQZAVynHb1zUaoWARJUK7gZBg5PoOnXFT
-  7vQ6pzqO0pu9/T8+v3lnzld ZXkRn3NncBjdxz26U23knW5R7Et8zhcMoOARwTkY4phgAI2jIV
-  Sck579KSR1gjtWjcywSStgISCu MEZNSkun/AOHGQtT5Zu172X6dvxL0QdY4nRSltO3VjnIB5P
-  4VuwK0SWXlobqaRJCuzptJ5H1FVLe 2jlWKLyJYEVsFXblic4I9B6+tKjzRX0UbMI5S6DJ/hJb
-  t6VwVHz6HoRm6ivdNx1fb8DqZLiBNOgD W0/3N4QtlmHGT+dULgSXeryKlrKoaQ72BHHy5q3PM
-  zJevHNBJKLkALs524AOPQVcijiBZT5gjtmM Bkz97eMj8e2a8yM+RXtqXRrOhBzjo/V6fIzYre
-  SKK5K7pJFkjJIPDDHb8OazxJENWQRRysCDhlbg A9z9a0TA1pMsltchZRbner8gkDg/lxWXEqy
-  WisWDfKuHTgR84w3qc10wd7s9Jy505R2a31/Ine2m jZJJGaNGO9WkYtuC8n9P51oWSWc10YJL
-  iNJpnypwQF44U+p7UyZTBpgtpnZ4TJ8zn+HAwcE9iaqN uDqUSFJX8xsheVwOV+vcfWod5x3OF
-  /7XFq+uy5bW+7qW7q6uLOS8gVRGJZ0cOy5AwASKZb6legSG OO2ZPOY5EQ+ZWFSJNNLbRXEtlJ
-  GVjxC7kEbMfNkdz71Wmmne1txB5Z3orLtXHy1MYpqzirkKFOpZ cqvt9332LSXsMcNrHcSKksk
-  uQBwemPyPaqKTKXYSI4ztHXBQ54H88+tSW9xLc3hM0cYjkYSKSgyF wQSD6DirSzQTyC3t7ORQ
-  JFYlmBbAGQM/WnyqDen4k0aCpSlGMb97NafkQRXNm1uiuVOHKlffPDfQ UyRAwuAZFdoblGLDO
-  0tj5uP7vtWtbwQ3FkbmMRCSZ94wByc4wB7/AM6jXSjPE0LZjdxvI7oQDtDe tZqtBN9CcPXpKX
-  vJr1s/wsUoo2WcSeTN5fzKpRuF55qHybmeRBb286OU2sHbluoz+FW7eO5srP7Q xOZlMgVhnfx
-  gsPYGmv5loPtNzdJu8oqO25uMEe1aKb5nb9T06GLvUlyyS00639UWLXy/IMbyxyJb qIkZOCVc
-  YOT35omDw3KQrJE2bZjkL1KnHHoPak8qO3jj+1uqxKWWZV4LNwQPw4q3FZLc6xKFSWRF CsoDY
-  OQMkfjWMpJNyvp/X/DlyqR5ZtbW62t8iC2gWztZvLlXDSDG7kIM/dPuc1IkD2m37UrRKuUX HH
-  llzwp9TzmrLyTSI8kVsLcv87JKAeW/wAqrdPJLFbMpKxiMhQ/PQg5J7moUpSevU56L9rZuS+/X
-  8Cf7Ozz7YLWTzI28oyqfl+7yD7mqkRuo4438yCRVfy1Qx8jP3c+46Vqgzi3muTIj+ZcRCEJkD5
-  vv GqMscxcwW0ihg7mUMOcr0b6YqYSvo/67jptynaMk4+jf37laeLyQyI4WdnVdwOAo6c/rUA0
-  y4i85 WaQbztVi2dw6k/iKvQE3ulNmCSVVKMrqcE8/MaiS7mGozrOTNDIjSEIMEkdMegx2rZTm
-  rpbo7ozq Rva116O/oUPs4SwJa7+Zf9WpY/dbGPy71bK7J4Ty6hWLMvTrzgemOahnWcCye3tnf
-  NswDkZUqOS1 U542ihMjrO6OC0bK3BXHJ+nNbL37XZMqilDl5rX+/wDr5sjks5pXZopPtKMzOr
-  gnDYHXH8qdHI9x BE9xDIwYKY0HDFQCvX6jNakcEuz5EYuAxZU4w6DqPbB6VizvNPALiRkK5+V
-  QMfe44HpWkJ8+hzrF KpL2bkkl1t+hLdrE0KTCQSo8m3CDB3jgjNV0g3Swkz/ZoIn+TzTn3I46
-  1O1iPs0UUbG4Kk/u4j1Y d+fqaLi0uHtT5YMaxseDzn2+vWqjNWtcwniIygqTavfe35X/AMiuL
-  hXuAtsY2LuVBA/vf4U2C6lI j8sgAsIxIB8qgDGCO5680ItrHC8QBtwASsjHOM4Kr9evNWrGyj
-  lbcZTtD8p6MDwfpVycFF3NfaNQ 5ai28v1X5DgJFjztnkYErFznCdDn396tpLJBA8UMLvMW3gz
-  DcQoHQ5qK7uHjupzg5QADacAZxkfU 1YH2x3zEgUSKWBZQSRngg+lYPVJtHp048y/eR9P+CTW0
-  EM16I5CVjZMh84z6H86sTWtpbtFIJBvc Mixn19RU9pmCzcyJ5qtKpDKMDnpj2zU9pbia5ka4j
-  eSdZWjQrwCG7j8a451WpN30RksdPn3tFeZk zRpMyhgrMgCqFGCSe31NXZL6S28mMK0jKmGbGf
-  nJwAPxrRm02Y7txjd02tIVXGHXv9AKqm2hudWM UW5pnTzPMB+VgP4gPQVKqwktdUjrlWpVI81
-  rpev47GHJHLFdRRGJjPuQOvXJB5xVk2c02p3ASFt7 KxQnG1VHAB/2vepp7aC0lWaSVrgbGUFW
-  Odx561RS4aTTokjMkchAA+bnqSB9Sa6VJyV4jdWd1Ui/ d762+epbRUs57VrieDdsTdEEz8vfP
-  GCcmnTQi41ZxERIFDLtTghgPlJqtOjTSkwxMZD80pc5wcdB 6Ac09LmS0YbZo92xhG2zIKEcE+
-  p9DU8r3T1MKlNuo3Tl7z7pfp/w5UY3K6mGwnnN8gAHD5HJA+lM jliil2eVKu1AG3Nna3UH6Yq
-  x51vdTxp5UodTuUbuSMZx+GKkmhs3tMxuRcdSO20jn8a15ukkOU5y k1Ui1fTRbeen+RDc3iJZ
-  GKGJ+CAHJ4Y5BBH61XV/tF+ZpnEbSTq5XpuIHb25rQZbmeyt7cW+1oNm G2g7jnr9AKkkt2zcy
-  xR+WwugVLDIIyDkD0qVOMVbqcjrRgnSirX6tpsx21CeW5DSf6yJiqggYB71 dSe2/dyyyxqyw7
-  XQpkk5zmqxgAvJzc8tvdnRMA885+grNG+S5hXckbBfmLDIJA4rf2cJLTQ6bUql J+7ZrdpL+vw
-  L8TrPG0Drl2OVA4JA5Jo2xRi2nZ8jawk2HGGbpQbq9itIJnktg5AaMiP7w6Ht26U0 XX7udftF
-  uIjKMKU5Y9iOOgotLpt/Xkct51ZabLzf+RUhkZ7MEB5WyUGD09Sa1I7MJZlrtm2jIV0O AVHp9
-  ayVuGxIpZWywyUUAY7/AJ1YUf6JiIuxchvLJyVA9a0qRl3sdjhUkoqU7Ly/z/zNK3hdM3lv NC
-  ZMHam3JB9PxFTW5mgjt2ifM7DzdrcjaB6fic0yIwQwyzSMZY1cIAhwSSOopJopblLVkhkjkfIV
-  G/hHQ5/KuSTu7PY5/rMNFVel7cz6+T7/AHISRJG1aNrcLOUh/gTAI9f6VZtPPMcwA8mMPnEi5K
-  sT 8o+lRx2csEqtuI2KY5FHUknIqUlRqIkWZdskbloyeUkI+UGlOSasjqrYihO/IunUn8yS2Fs
-  yAp5p ZjuGdozyv5c1WLESsIreGWJUzCSgO6MdxUMBEdujt5kxdWaQ7uBnsPTPQVnyTQTsdknl
-  RHIRSclT 12mnCldnDh6bi25W16/5dTQjnjS4FzBhY5QPLtx944OAfp61HPLPa6vKZWZlBOEU4
-  yFB5HsDUEf7 /TlkEDkruNuV4BXPzH8Kvubf7T81ldSQ5Oz58kjGetNpKW1ylzNuqo8yenToZk
-  UsTWcc9xA7KVGw bsZQkhsH61dk8w3RNqgM2/bGW+ZSmPmIz0xUxgmeximghA3qC6FchAT0Hpn
-  FUp3jmjurgJJaywS7 FRm6Z6jiqupPQJSjNJX1/BeqILgo1iXk/eStKu0A+oxn8ayt8q3MeJAk
-  gUlQy5zjtirZgjjVNkoX zAGG9uFAOMdPWmG1zPJErRuUb75PTHUE/jXVT5YrUUYqnCUZNL5Mz
-  1MIYdWjcMfLXqp7Akj1pzl4 ZA/kOwlLID2wBy35mmvCFViZELpLtG3ocDn8jTVd0aFVheT5jG
-  zZ+VN/c/rXRvqjhqVJpKcZOy/L yJUQ/Yo8FW3qSCRnft7j2qq8saxwqoUOWGWLZBHcYx1z3q9
-  NZ7JlC/NalSY3B68/41SCPLKCBGSG wTjH3qcHF63NbOajbWz0av8A0x6/O0qugc4ypjGMD3+l
-  DxvGIjMhQtH8rFcbu+fyqZVtzZxjLJNu IJJ9OQPxp6Ry3d38zGQHhlA55HUdhjApc3XoTJTfv
-  2vr13/P8Rm+CaUptjcMDtIOADQLFwltIYpj bv8AOzL/ABKBjC5HXNacOnI2jwSlUS4MZCgLgv
-  zjP51cnsljs7iGOQmXzAJEz3HXA7D2rnliYp2R nXxftmlJ2/B/hb9TFuFs57dGjhmh/egRl2z
-  lO7H1HHFOhsd90ZXSVLZZNwJbjHXn1rQa5RHiLGJ0 KFgu3O0d1+tI8dv9reQXqfO5KoScBSKX
-  tJJW/wCCebWhKEeVrfrvf08zDW5EN48kCrKgOYxt9uvT pVJGuJGUpbyM5UgFF+9z1+ldBLZkP
-  Ir4uZGbgQqFAwuRj+tZkQkWBJchZVRQcd92cY/KumE4tNoq MqfMuV2b7oozrKh8uNjt6MMdPp
-  6VDGlyp/1eSTlsIBgVceS6nkWOIM+xdhxHyO/Jx1zTSLhYla4i kjITauR2Oc5Hc1upWVnYqUq
-  LqK7s+lnp8hjpiIGbzfMB4Yfdx9MVnRlkTaxWQGTPyjG0Y5H16VMV
-  ZpLZVl3hEJOfXng+tTh59q/6tgyA/d6ZrRaIz5FUlfVee5//2Q==
-X-ABShowAs:COMPANY
-UID:F0A6918D-8E09-43FA-9684-226810B8A96F
-END:VCARD

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/F0A6918D-8E09-43FA-9684-226810B8A96F.vcf (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/F0A6918D-8E09-43FA-9684-226810B8A96F.vcf)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/F0A6918D-8E09-43FA-9684-226810B8A96F.vcf	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/F0A6918D-8E09-43FA-9684-226810B8A96F.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,2010 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Inc.;Test;;;
+FN:Test Inc.
+ORG:Test Inc.;
+EMAIL;type=INTERNET;type=WORK;type=pref:testinc_sf at example.com
+TEL;type=WORK;type=pref:777-777-7777
+item1.ADR;type=WORK;type=pref:;;3 TV Street;San Francisco;California;99999;US
+item1.X-ABADR:us
+NOTE: Company with picture
+PHOTO;BASE64:
+  /9j/4AAQSkZJRgABAQAAAQABAAD/7QA8UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAB8cAVoAAx
+  sl RxwCAAACAAIcAhkAC1Bob3RvIEJvb3RoAP/iG6hJQ0NfUFJPRklMRQABAQAAG5hhcHBsAgA
+  AAG1u dHJSR0IgWFlaIAfaAAEAEwAJADEABGFjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+  AAAAAAD2 1gABAAAAANMtYXBwbFYcEOZVYuhIRg5LwLIi62wAAAAAAAAAAAAAAAAAAAAAAAAAA
+  AAAAAAAAAAA AAAAEXJYWVoAAAFQAAAAFGdYWVoAAAFkAAAAFGJYWVoAAAF4AAAAFHd0cHQAAA
+  GMAAAAFGNoYWQA AAGgAAAALHJUUkMAAAHMAAAIDGdUUkMAAAnYAAAIDGJUUkMAABHkAAAIDGF
+  hcmcAABnwAAAAIGFh Z2cAABoQAAAAIGFhYmcAABowAAAAIHZjZ3QAABpQAAAAMG5kaW4AABqA
+  AAAAOGRlc2MAABq4AAAA ZGRzY20AABscAAAALm1tb2QAABtMAAAAKGNwcnQAABt0AAAAJFhZW
+  iAAAAAAAAB7vQAAQXsAAAJL WFlaIAAAAAAAAFYqAACp0AAAFF9YWVogAAAAAAAAJO8AABS1AA
+  C8glhZWiAAAAAAAADz2AABAAAA ARYIc2YzMgAAAAAAAQu3AAAFlv//81cAAAcpAAD91///+7f
+  ///2mAAAD2gAAwPZjdXJ2AAAAAAAA BAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUA
+  SgBPAFQAWQBeAGMAaABtAHIAdwB8AIEA hgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0
+  ADVANoA4ADlAOoA8AD1APsBAQEHAQwBEgEY AR4BJQErATEBOAE+AUUBSwFSAVkBYAFmAW0BdQ
+  F8AYMBigGSAZkBoQGoAbABuAHAAcgB0AHYAeAB 6QHxAfoCAgILAhQCHAIlAi4CNwJAAkoCUwJ
+  cAmYCcAJ5AoMCjQKXAqECqwK1Ar8CygLUAt8C6gL0 Av8DCgMVAyADKwM3A0IDTQNZA2UDcAN8
+  A4gDlAOgA6wDuQPFA9ID3gPrA/gEBAQRBB4ELAQ5BEYE VARhBG8EfASKBJgEpgS0BMIE0QTfB
+  O4E/AULBRoFKAU3BUcFVgVlBXQFhAWTBaMFswXDBdMF4wXz BgMGFAYkBjUGRQZWBmcGeAaJBp
+  oGqwa9Bs4G4AbyBwMHFQcnBzkHTAdeB3AHgweWB6gHuwfOB+EH 9AgICBsILwhCCFYIagh+CJI
+  Ipgi6CM4I4wj3CQwJIQk2CUsJYAl1CYoJoAm1CcsJ4An2CgwKIgo5 Ck8KZQp8CpIKqQrACtcK
+  7gsFCx0LNAtLC2MLewuTC6sLwwvbC/MMDAwkDD0MVgxuDIcMoQy6DNMM 7Q0GDSANOg1UDW4Ni
+  A2iDbwN1w3xDgwOJw5CDl0OeA6TDq8Oyg7mDwIPHg86D1YPcg+OD6sPyA/k EAEQHhA7EFgQdh
+  CTELEQzhDsEQoRKBFGEWQRgxGhEcAR3xH+Eh0SPBJbEnoSmhK5EtkS+RMZEzkT WRN6E5oTuxP
+  bE/wUHRQ+FF8UgRSiFMQU5RUHFSkVSxVtFZAVshXVFfcWGhY9FmAWgxanFsoW7hcS FzUXWRd9
+  F6IXxhfqGA8YNBhZGH0YoxjIGO0ZExk4GV4ZhBmqGdAZ9hodGkMaahqQGrca3hsGGy0b VBt8G
+  6MbyxvzHBscQxxsHJQcvRzmHQ4dNx1gHYodsx3dHgYeMB5aHoQerh7YHwMfLR9YH4Mfrh/Z IA
+  QgMCBbIIcgsyDeIQohNyFjIY8hvCHpIhUiQiJwIp0iyiL4IyUjUyOBI68j3SQMJDokaSSXJMYk
+  9SUkJVQlgyWzJeImEiZCJnImoybTJwMnNCdlJ5Ynxyf4KCooWyiNKL4o8CkiKVUphym5KewqHy
+  pS KoUquCrrKx4rUiuGK7or7iwiLFYsiiy/LPQtKS1eLZMtyC39LjMuaS6eLtQvCy9BL3cvri/
+  kMBsw UjCJMMEw+DEwMWcxnzHXMg8ySDKAMrgy8TMqM2MznDPVNA80SDSCNLw09jUwNWo1pTXf
+  Nho2VTaQ Nss3BjdCN343uTf1ODE4bTiqOOY5IzlgOZ052joXOlQ6kjrPOw07SzuJO8c8BjxEP
+  IM8wj0BPUA9 fz2/Pf4+Pj5+Pr4+/j8/P38/wEAAQEFAgkDEQQVBR0GIQcpCDEJOQpFC00MWQ1
+  hDm0PeRCFEZUSo ROxFMEV0RbhF/EZARoVGykcOR1NHmUfeSCNIaUivSPVJO0mBScdKDkpVSpt
+  K4ksqS3FLuEwATEhM kEzYTSBNaE2xTfpOQk6MTtVPHk9nT7FP+1BFUI9Q2VEkUW5RuVIEUk9S
+  mlLlUzFTfFPIVBRUYFSt VPlVRlWSVd9WLFZ6VsdXFFdiV7BX/lhMWJpY6Vk4WYZZ1VokWnRaw
+  1sTW2NbslwDXFNco1z0XURd lV3mXjdeiV7aXyxffl/QYCJgdGDHYRlhbGG/YhJiZWK5YwxjYG
+  O0ZAhkXGSxZQVlWmWvZgRmWWav ZwRnWmewaAZoXGiyaQlpX2m2ag1qZGq8axNra2vDbBtsc2z
+  LbSNtfG3Vbi5uh27gbzpvk2/tcEdw oXD7cVZxsHILcmZywXMcc3hz03QvdIt053VDdaB1/HZZ
+  drZ3E3dwd854K3iJeOd5RXmjegJ6YHq/ ex57fXvcfDx8m3z7fVt9u34bfnx+3H89f55//4Bgg
+  MKBI4GFgeeCSYKrgw6DcIPThDaEmYT8hWCF w4YnhouG74dUh7iIHYiBiOaJTImxihaKfIrii0
+  iLrowUjHuM4o1Ija+OF45+juWPTY+1kB2QhZDu kVaRv5IokpGS+pNkk82UN5ShlQuVdZXglkq
+  WtZcgl4uX95himM6ZOpmmmhKafprrm1ebxJwxnJ+d DJ15neeeVZ7DnzGfoKAPoH2g7KFbocui
+  OqKqoxqjiqP6pGqk26VMpbymLqafpxCngqf0qGWo2KlK qbyqL6qiqxWriKv7rG+s461WrcuuP
+  66zryivnbARsIew/LFxseeyXbLTs0mzv7Q2tK21JLWbthK2 ibcBt3m38bhpuOG5WrnSuku6xL
+  s+u7e8MLyqvSS9nr4ZvpO/Dr+JwATAf8D6wXbB8cJtwunDZsPi xF/E3MVZxdbGU8bRx07HzMh
+  KyMnJR8nGykXKxMtDy8LMQszBzUHNwc5CzsLPQ8/D0ETQxtFH0cjS StLM007T0NRT1NbVWNXb
+  1l7W4tdl1+nYbdjx2XXZ+tp/2wPbiNwO3JPdGd2e3iTeqt8x37fgPuDF 4Uzh0+Ja4uLjauPy5
+  HrlAuWL5hPmnOcl56/oOOjC6Uzp1upg6urrdev/7IrtFu2h7izuuO9E79Dw XPDp8XXyAvKP8x
+  zzqvQ39MX1U/Xh9m/2/veM+Bv4qvk5+cn6Wfro+3j8CPyZ/Sn9uv5L/tz/bmN1 cnYAAAAAAAA
+  EAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0A cgB3AHwA
+  gQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2gDgAOUA6gDwAPUA+wEB AQcBD
+  AESARgBHgElASsBMQE4AT4BRQFLAVIBWQFgAWYBbQF1AXwBgwGKAZIBmQGhAagBsAG4AcAB yA
+  HQAdgB4AHpAfEB+gICAgsCFAIcAiUCLgI3AkACSgJTAlwCZgJwAnkCgwKNApcCoQKrArUCvwLK
+  AtQC3wLqAvQC/wMKAxUDIAMrAzcDQgNNA1kDZQNwA3wDiAOUA6ADrAO5A8UD0gPeA+sD+AQEBB
+  EE HgQsBDkERgRUBGEEbwR8BIoEmASmBLQEwgTRBN8E7gT8BQsFGgUoBTcFRwVWBWUFdAWEBZM
+  FowWz BcMF0wXjBfMGAwYUBiQGNQZFBlYGZwZ4BokGmgarBr0GzgbgBvIHAwcVBycHOQdMB14H
+  cAeDB5YH qAe7B84H4Qf0CAgIGwgvCEIIVghqCH4IkgimCLoIzgjjCPcJDAkhCTYJSwlgCXUJi
+  gmgCbUJywng CfYKDAoiCjkKTwplCnwKkgqpCsAK1wruCwULHQs0C0sLYwt7C5MLqwvDC9sL8w
+  wMDCQMPQxWDG4M hwyhDLoM0wztDQYNIA06DVQNbg2IDaINvA3XDfEODA4nDkIOXQ54DpMOrw7
+  KDuYPAg8eDzoPVg9y D44Pqw/ID+QQARAeEDsQWBB2EJMQsRDOEOwRChEoEUYRZBGDEaERwBHf
+  Ef4SHRI8ElsSehKaErkS 2RL5ExkTORNZE3oTmhO7E9sT/BQdFD4UXxSBFKIUxBTlFQcVKRVLF
+  W0VkBWyFdUV9xYaFj0WYBaD FqcWyhbuFxIXNRdZF30XohfGF+oYDxg0GFkYfRijGMgY7RkTGT
+  gZXhmEGaoZ0Bn2Gh0aQxpqGpAa txreGwYbLRtUG3wboxvLG/McGxxDHGwclBy9HOYdDh03HWA
+  dih2zHd0eBh4wHloehB6uHtgfAx8t H1gfgx+uH9kgBCAwIFsghyCzIN4hCiE3IWMhjyG8Ieki
+  FSJCInAinSLKIvgjJSNTI4EjryPdJAwk OiRpJJckxiT1JSQlVCWDJbMl4iYSJkImciajJtMnA
+  yc0J2UnlifHJ/goKihbKI0ovijwKSIpVSmH Kbkp7CofKlIqhSq4KusrHitSK4YruivuLCIsVi
+  yKLL8s9C0pLV4tky3ILf0uMy5pLp4u1C8LL0Ev dy+uL+QwGzBSMIkwwTD4MTAxZzGfMdcyDzJ
+  IMoAyuDLxMyozYzOcM9U0DzRINII0vDT2NTA1ajWl Nd82GjZVNpA2yzcGN0I3fje5N/U4MTht
+  OKo45jkjOWA5nTnaOhc6VDqSOs87DTtLO4k7xzwGPEQ8 gzzCPQE9QD1/Pb89/j4+Pn4+vj7+P
+  z8/fz/AQABAQUCCQMRBBUFHQYhBykIMQk5CkULTQxZDWEOb Q95EIURlRKhE7EUwRXRFuEX8Rk
+  BGhUbKRw5HU0eZR95II0hpSK9I9Uk7SYFJx0oOSlVKm0riSypL cUu4TABMSEyQTNhNIE1oTbF
+  N+k5CToxO1U8eT2dPsU/7UEVQj1DZUSRRblG5UgRST1KaUuVTMVN8 U8hUFFRgVK1U+VVGVZJV
+  31YsVnpWx1cUV2JXsFf+WExYmljpWThZhlnVWiRadFrDWxNbY1uyXANc U1yjXPRdRF2VXeZeN
+  16JXtpfLF9+X9BgImB0YMdhGWFsYb9iEmJlYrljDGNgY7RkCGRcZLFlBWVa Za9mBGZZZq9nBG
+  daZ7BoBmhcaLJpCWlfabZqDWpkarxrE2tra8NsG2xzbMttI218bdVuLm6HbuBv Om+Tb+1wR3C
+  hcPtxVnGwcgtyZnLBcxxzeHPTdC90i3TndUN1oHX8dll2tncTd3B3zngreIl453lF eaN6Anpg
+  er97Hnt9e9x8PHybfPt9W327fht+fH7cfz1/nn//gGCAwoEjgYWB54JJgquDDoNwg9OE NoSZh
+  PyFYIXDhieGi4bvh1SHuIgdiIGI5olMibGKFop8iuKLSIuujBSMe4zijUiNr44Xjn6O5Y9N j7
+  WQHZCFkO6RVpG/kiiSkZL6k2STzZQ3lKGVC5V1leCWSpa1lyCXi5f3mGKYzpk6maaaEpp+muub
+  V5vEnDGcn50MnXmd555VnsOfMZ+goA+gfaDsoVuhy6I6oqqjGqOKo/qkaqTbpUylvKYupp+nEK
+  eC p/SoZajYqUqpvKovqqKrFauIq/usb6zjrVaty64/rrOvKK+dsBGwh7D8sXGx57JdstOzSbO
+  /tDa0 rbUktZu2EraJtwG3ebfxuGm44blaudK6S7rEuz67t7wwvKq9JL2evhm+k78Ov4nABMB/
+  wPrBdsHx wm3C6cNmw+LEX8TcxVnF1sZTxtHHTsfMyErIyclHycbKRcrEy0PLwsxCzMHNQc3Bz
+  kLOws9Dz8PQ RNDG0UfRyNJK0szTTtPQ1FPU1tVY1dvWXtbi12XX6dht2PHZddn62n/bA9uI3A
+  7ck90Z3Z7eJN6q 3zHft+A+4MXhTOHT4lri4uNq4/LkeuUC5YvmE+ac5yXnr+g46MLpTOnW6mD
+  q6ut16//siu0W7aHu LO6470Tv0PBc8OnxdfIC8o/zHPOq9Df0xfVT9eH2b/b+94z4G/iq+Tn5
+  yfpZ+uj7ePwI/Jn9Kf26 /kv+3P9uY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AM
+  gA3ADsAQABFAEoATwBUAFkA XgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtw
+  C8AMEAxgDLANAA1QDaAOAA5QDq APAA9QD7AQEBBwEMARIBGAEeASUBKwExATgBPgFFAUsBUgF
+  ZAWABZgFtAXUBfAGDAYoBkgGZAaEB qAGwAbgBwAHIAdAB2AHgAekB8QH6AgICCwIUAhwCJQIu
+  AjcCQAJKAlMCXAJmAnACeQKDAo0ClwKh AqsCtQK/AsoC1ALfAuoC9AL/AwoDFQMgAysDNwNCA
+  00DWQNlA3ADfAOIA5QDoAOsA7kDxQPSA94D 6wP4BAQEEQQeBCwEOQRGBFQEYQRvBHwEigSYBK
+  YEtATCBNEE3wTuBPwFCwUaBSgFNwVHBVYFZQV0 BYQFkwWjBbMFwwXTBeMF8wYDBhQGJAY1BkU
+  GVgZnBngGiQaaBqsGvQbOBuAG8gcDBxUHJwc5B0wH XgdwB4MHlgeoB7sHzgfhB/QICAgbCC8I
+  QghWCGoIfgiSCKYIugjOCOMI9wkMCSEJNglLCWAJdQmK CaAJtQnLCeAJ9goMCiIKOQpPCmUKf
+  AqSCqkKwArXCu4LBQsdCzQLSwtjC3sLkwurC8ML2wvzDAwM JAw9DFYMbgyHDKEMugzTDO0NBg
+  0gDToNVA1uDYgNog28DdcN8Q4MDicOQg5dDngOkw6vDsoO5g8C Dx4POg9WD3IPjg+rD8gP5BA
+  BEB4QOxBYEHYQkxCxEM4Q7BEKESgRRhFkEYMRoRHAEd8R/hIdEjwS WxJ6EpoSuRLZEvkTGRM5
+  E1kTehOaE7sT2xP8FB0UPhRfFIEUohTEFOUVBxUpFUsVbRWQFbIV1RX3 FhoWPRZgFoMWpxbKF
+  u4XEhc1F1kXfReiF8YX6hgPGDQYWRh9GKMYyBjtGRMZOBleGYQZqhnQGfYa HRpDGmoakBq3Gt
+  4bBhstG1QbfBujG8sb8xwbHEMcbByUHL0c5h0OHTcdYB2KHbMd3R4GHjAeWh6E Hq4e2B8DHy0
+  fWB+DH64f2SAEIDAgWyCHILMg3iEKITchYyGPIbwh6SIVIkIicCKdIsoi+CMlI1Mj gSOvI90k
+  DCQ6JGkklyTGJPUlJCVUJYMlsyXiJhImQiZyJqMm0ycDJzQnZSeWJ8cn+CgqKFsojSi+ KPApI
+  ilVKYcpuSnsKh8qUiqFKrgq6yseK1Irhiu6K+4sIixWLIosvyz0LSktXi2TLcgt/S4zLmku ni
+  7ULwsvQS93L64v5DAbMFIwiTDBMPgxMDFnMZ8x1zIPMkgygDK4MvEzKjNjM5wz1TQPNEg0gjS8
+  NPY1MDVqNaU13zYaNlU2kDbLNwY3Qjd+N7k39TgxOG04qjjmOSM5YDmdOdo6FzpUOpI6zzsNO0
+  s7 iTvHPAY8RDyDPMI9AT1APX89vz3+Pj4+fj6+Pv4/Pz9/P8BAAEBBQIJAxEEFQUdBiEHKQgx
+  CTkKR QtNDFkNYQ5tD3kQhRGVEqETsRTBFdEW4RfxGQEaFRspHDkdTR5lH3kgjSGlIr0j1STtJ
+  gUnHSg5K VUqbSuJLKktxS7hMAExITJBM2E0gTWhNsU36TkJOjE7VTx5PZ0+xT/tQRVCPUNlRJ
+  FFuUblSBFJP UppS5VMxU3xTyFQUVGBUrVT5VUZVklXfVixWelbHVxRXYlewV/5YTFiaWOlZOF
+  mGWdVaJFp0WsNb E1tjW7JcA1xTXKNc9F1EXZVd5l43Xole2l8sX35f0GAiYHRgx2EZYWxhv2I
+  SYmViuWMMY2BjtGQI ZFxksWUFZVplr2YEZllmr2cEZ1pnsGgGaFxosmkJaV9ptmoNamRqvGsT
+  a2trw2wbbHNsy20jbXxt 1W4ubodu4G86b5Nv7XBHcKFw+3FWcbByC3JmcsFzHHN4c9N0L3SLd
+  Od1Q3Wgdfx2WXa2dxN3cHfO eCt4iXjneUV5o3oCemB6v3see3173Hw8fJt8+31bfbt+G358ft
+  x/PX+ef/+AYIDCgSOBhYHngkmC q4MOg3CD04Q2hJmE/IVghcOGJ4aLhu+HVIe4iB2IgYjmiUy
+  JsYoWinyK4otIi66MFIx7jOKNSI2v jheOfo7lj02PtZAdkIWQ7pFWkb+SKJKRkvqTZJPNlDeU
+  oZULlXWV4JZKlrWXIJeLl/eYYpjOmTqZ ppoSmn6a65tXm8ScMZyfnQydeZ3nnlWew58xn6CgD
+  6B9oOyhW6HLojqiqqMao4qj+qRqpNulTKW8 pi6mn6cQp4Kn9KhlqNipSqm8qi+qoqsVq4ir+6
+  xvrOOtVq3Lrj+us68or52wEbCHsPyxcbHnsl2y 07NJs7+0NrSttSS1m7YStom3Abd5t/G4abj
+  huVq50rpLusS7Pru3vDC8qr0kvZ6+Gb6Tvw6/icAE wH/A+sF2wfHCbcLpw2bD4sRfxNzFWcXW
+  xlPG0cdOx8zISsjJyUfJxspFysTLQ8vCzELMwc1BzcHO Qs7Cz0PPw9BE0MbRR9HI0krSzNNO0
+  9DUU9TW1VjV29Ze1uLXZdfp2G3Y8dl12fraf9sD24jcDtyT 3Rndnt4k3qrfMd+34D7gxeFM4d
+  PiWuLi42rj8uR65QLli+YT5pznJeev6DjowulM6dbqYOrq63Xr /+yK7Rbtoe4s7rjvRO/Q8Fz
+  w6fF18gLyj/Mc86r0N/TF9VP14fZv9v73jPgb+Kr5OfnJ+ln66Pt4 /Aj8mf0p/br+S/7c/25w
+  YXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAALA3BhcmEAAAAAAAMA AAACZmYAAPKnAAANW
+  QAAE9AAAAsDcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACwN2Y2d0 AAAAAAAAAAEAAQ
+  AAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAAAAAABAABuZGluAAAAAAAAADAA AKPAAABXwAA
+  ASsAAAJ5AAAAlQAAAEwAAAFBAAABUQAACMzMAAjMzAAIzM2Rlc2MAAAAAAAAACkNp bmVtYSBI
+  RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAA
+  AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAc AE
+  MAaQBuAGUAbQBhACAASABEAABtbW9kAAAAAAAABhAAAJIjAgAqqcBCT4AAAAAAAAAAAAAAAAAA
+  AAAAdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUsIEluYy4sIDIwMTAA/+EAQEV4aWYAAE1NACoAAA
+  AI AAGHaQAEAAAAAQAAABoAAAAAAAKgAgAEAAAAAQAAAoCgAwAEAAAAAQAAAeAAAAAA/9sAQwA
+  CAgIC AgECAgICAgICAwMGBAMDAwMHBQUEBggHCAgIBwgICQoNCwkJDAoICAsPCwwNDg4ODgkL
+  EBEPDhEN Dg4O/9sAQwECAgIDAwMGBAQGDgkICQ4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OD
+  g4ODg4ODg4O Dg4ODg4ODg4ODg4ODg4O/8AAEQgB4AKAAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQ
+  EBAAAAAAAAAAAB AgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhN
+  RYQcicRQygZGhCCNC scEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RV
+  VldYWVpjZGVmZ2hpanN0 dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4u
+  brCw8TFxsfIycrS09TV1tfY 2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQ
+  EAAAAAAAABAgMEBQYHCAkKC//E ALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXE
+  TIjKBCBRCkaGxwQkjM1LwFWJy0QoW JDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZX
+  WFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5u
+  sLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp 6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/Ie6uZ
+  LZoIYXSSFWZhjkgn1NZS7Y4I4yQS5woHUnP+Na MsLq7qIXfaMN22nrTWmbzIWeOMzBmckLxk+
+  gr8+hZLRH9Z18KqM3KhBK/wB339SvFbQrNGluD50T ESbj96QHjHHT29qeG3hT5bIQ/QnoQc5+
+  lLayrFJuBUqSWb1PsD606OJriMIiFwpLZA6nv9aqTd9T PDQlBuNlyteX5l3yTvExmWMFjGjbS
+  wORknionheOeFHDNHHGVyvBIPpke9SWrJJp7XJjdCj7QrHI DdTx79qhfe8yF43TswJ556CsVe
+  7TOujOMk5T1b2a0/4P4knkhYYpX+WM5wpPLDtiro+S2AEqMpcP tJ5OOPTjipZGtBYxwLcKzxK
+  FZjkhjnkj0A6VXnaFEa3KjeAfmLHll5OPwrJSctzahOM1zTXlr26f 0hk8iCYCVGcRqVBU4ySe
+  vTp2pYrkRWwhijf/AFo+Y/wDqc+vNVgPtE8QY5LMNuOy46/gakjAdfOa VDGSRu7buw/OrcY2s
+  zOc6DlyzfL2/r/gFuaWzkib93I85kZyScDnv+lRbBFYi6iuVE44ZCvKhuo+ tU3SYNC/lERwhV
+  nXbycnOKfI5iu1yI2Z3JAK5XCn0pKFtEzCbpxg47rzas/LYfbWtotvHbxyOpLk M3ufT8KhY2q
+  zpGqzOrEklTyxHA7dKgaaJpt5+RnLeWoHOewq8lqy6bFNNxuAxn+PP8Q9hVyvF+89 yeWMZKHM
+  9dkun43IzEtveq8b5IXdDIP4hjmlDKvlvETvRQoOPXmmTpDC6qsglOSAy5wABn9al8pX 2BiI/
+  l3Kw/rS0aTZ2wjGcWra9dOnn1J2kkmuVeY7nmYvImMY/uipmVv7QYbvNlOQcDA9DT2SBZys gE
+  gLsQ2/G4AduDVgNbLIk+/y1VVDRHJZuOSD+VYOVtkd9GEqauruJUt3QXscZieVHbaXQ42rj5jU
+  gtiqQBra4WJUZt2RwW/+tUhVTEv2dgiIjIzH+Jc/zzUKwSN8gcyHesZBORuOTxSb1vsTWu5c83
+  Ze fT0CK2NytuFOCAoYMOpJOP5VVuYLeLWY4nR/JbkgnlsjqPbNaEUUn9pBY5Nq43ynHCsoPFU
+  mE11J GDJHLM5CxqUx26dKqMnzb6HHUjJVZRcvdtuPsZrpLee7eMwCOQ7kdeST0I9qqJMG0Z1U
+  Au0gOQeB k/NT4nJmW3uGZU34I6cY6n2FVot88oQwi3UDa7MOhxnn61ooq7bOCNOFObdR6rrbd
+  FrdNDFJCu4h ZMwZHQdzUxluC5ijmiETHccjOCKbaW1ybR2mjwu7y3DDLKx6CoYU3/ZpJy0aJE
+  yOgX5icnBz071L 5Xc7FHC1YP2cb37atefYltoZbefa0sKJJnJwTkZ+lOhSe1v7a4BDRupywXj
+  nI2/U0yGTyFikJVZj 91X+br+FaG95VjXI/wBWcpj/AD9aU+a77M6amAnUklF+71v0+5Ic+nH7
+  RB5S/Zl+64kOTHxwD79a 6OGOKz0xGRxFLCqou/n5S2effr+dV0s2uAkCy+fEBucr958D7wPoK
+  fLJcqvmQ2zpmUK5lAYFuAhH tjPFeXVqOpaNzzZJSfspPZ+Vv839xZuLO2llZyfMZzJsVTggdS
+  D796ykkjjihZIZVlaMbGJ4bDcM B6ZrQeeSO2l+0OivDdFXkC4BYentg9Kz/wB297AY3zuG2Ln
+  gj2+nWlSUuXXYKUavspKb93p2fr0L Cwtc6oZWmj+3RAxt8vBPVjiqAkjltpc3cCJJIX2Eck5+
+  U5rcmtjLB5UkkeXk3l4/lOPT61j29hbq zxoj4VsBmbIUkH5frmnTnFq7exyuLk71Hr2026a/8
+  Ay/7PimJlW4WUcg7ONp7VlH7WI0AiIWJGXd jtnk/rWtdpcNNbm3QwTR4S6VunqPyNVru5JulJ
+  ZZHYnzggwGbjkDsK9KlOXr+hrTryvda22XbzMq 4tJmuEKkxwqWXLdx1p/2SNba0eeUwPKDIwY
+  ZJIJAIx2qaRNt8n2hxIkjE7o+MnNSfZX+feduyXY5 bqpPQfSt3UdlqOqubXn19PyK8kCKiyS3
+  MbTkEjjAb1xSwRSecs0Ubl0BGBztLcc1ry2dssrm7R2O wl1XA2noO3bvToVaDT51j8uSZ5Rhg
+  Oox1+lZe393+rDlUUYuPK5X6tW+/cyhCfICSyxxXG7ALZww xx09ahgjK2oiDrEHO9lYcjjH8h
+  V0Q3Hn7Agk3bXDAds4yKlubf8As+/iJQXAZHVW7Nxww9uf0q/a K9r6nXSjTU4xb5uy/rVGZHA
+  Yrf7xYMwKsBxjHI+tWHUNbKwR/KVgScEjd9alhVo7dI5M+Wq8ZH+e tRT53feI3HLIBgLVczcj
+  veHlBLmh+bFgsYLeKMl8ySSZCg8px1NSwzz2lzHInD71/h9P/r0yN3ku HVG3SEEhcdcelVgGG
+  wZYZOWbr+P0FJxcr8zuYuh7kqcndPtbT5WNGa7+03Jk2vnYRIw6Z6k1qxXl ta2kA2s/7pmyD9
+  0HsfcnpXNWl00drJtVJfMcktjtjFSi6aRSoYDAC4C84/8ArVnPD306Iy9gqqip ydlt/wAAvLe
+  2UlpHbLBLaOxG/wAxs/vAeD9KoXN5IU8yUhJ5Zw7nH3iARx+lN2ESxCSaPC8hthO7 3HGe2Kpm
+  G4nMD3JO4hmjAGMDkf0rSFKCdzjlhnKahZv1/r8CHYgiKMwUkbhk+nUVYxJcQqszIRt+ cKOuD
+  nj6YFPjhdrYZXcqMAOmcH39KU2zGVUE0RILK3BwR3IOOlbOSNZS5VZp66WV/wAfIqBQqBYZ Bh
+  cgMeg3dqgjU21itvHIAryF5UIyRxgc47DmtGG3fjy9jKcn7oIB/KoVhgMNtGyuk4Y5JP3ge9Vz
+  o4sRgnzRm4Wts1/wxLGyyBlk3Pt3AFeAw/hxUi3ziwt1kGXRtkQAxlfX8DVUKxjjEP7xdwDYHQ
+  DP tShVLlQ4TnKp/Fn/AA71DhF7lV6PtUnNv1/y2LNy141xG926uWRmygxnnBNRW8+9nTzRCjF
+  d4cZy vfFSSTb512QuVOflYA5AHHQVGro+2d1j2wZAAQAMzDAz6ikl7trDqKcafs6b/wDbX92o
+  15GMwC4E THAyONo6dqRY7aOSBo4pZCrBmAPQjmm7oxb2ykFZo1KsWOQ2TRE4K7MFFZwVJ64HX
+  86trQmUE4Wd /nv+RHOZGYhV3KuD7nnINJCwi/5dJ0yCSSQce9OdpQ2duOPm/OpCkbuzM7uEHB
+  U8PV30sdqT9ro3 fzt+bRRfyxlllUlgMYHfpUaOzop5aUZ3Nnj2GKsSqYn8wxOQBlRxxjHP51U
+  SR1kDKm4nOSBxn/Jr WOqPKrt+2tK6S7X1JXvGjgCyfvS45UDsTTPs6i7kiRAPLyrHOee/8qHT
+  McYuYsbV5IH3v88U64ig Z90TlCARjPfvmmrLYhqrUfNUs1HZPf7yqi+ZIFOYgSCM85wDVyNFL
+  EBxtHK5bt6VT8lpJ1VXwcjy lOeR9anWSObISKUuQRtUe9VPUww1aCk1PRrXV7r8iUw70kYXCg
+  LtzgdyOn1qtHGk1mJVnHmqzOR7 4HFNDq4fZG9uORhzktgf/rqHygVRh+6KtxnvTjF9zPFS9q0
+  4bLXrr95LGt9IV/eRKVBLHb0TuPr1 qw1zI4kXzV2bsKSOoqKNlAPy/KxYg+uOMVZtI2kMqYjG
+  Yy4LDjCg1M2lq0Vh7r3ud2e+rexBHKWU +XukPm7sg8DHb+daUkMbM2Uk4J8rLDG09KywrySwF
+  nS3TPI2/eXv071LFvGNisMhiwkOfWlKPZmt CX71Jpv8n8tSREkS2FvwIgwLE8jpx/M08WpQEx
+  sWIX5lU4NNijaWBsFiv8BA68frWgIklbyw5UMh ZnXtjms5TsddGjR9nJvRLs9eu1inLKGg/eb
+  ywA4H5imvPMTkElWAx8vbuakVf3JlVMZkAOQG6DIP Paoo3Kyp5hcbpRuKgfdOeOnftQrEzxk1
+  Fzd7eW5RnEk9wjZSELgNuHOMVLC72+/5FkweWHY4/wDr 1OYraR5GxK64BHPTsM/lVa6WMzliG
+  A6nB6mt4yTtFo5VGUE6yer8/wDgWR0NzDKtzEqGRwpwxwQP XB9+aHTY0KSJISI/lAx8oOTz61
+  El6r7Y2lDGVioYEgA+/HepfJDSKiv5jlQWYnjODwP89q4NVa57 6rQdTmVtfWy+8diFLfeqhxt
+  4PbJ6dqVHk8uOFoyjpG5XaMFgOpqv5DmGN5oXiMZ5wcZ9PypIJriJ ot77pIQyL8vr1BoautCa
+  1adRrkitNr7E7TPBB5UaFsKAXA+UKcEk/wAs1I6tPcbIgCXOTg8rjnB/ lVRblJIiSRgHaDnrU
+  sckksJkASEliNpGTgd6ORo3pQp83uy37L+vzNK9juJIBcT2wjhdyVUIARk8 /liqUELXNwsfll
+  XIZyS2dzf0yMUhlaS4WNlYnJ3dunNX4ZYvPE/ktHvJJZSAuPb2rF3hGxzV5+x0 STfSysvu/wC
+  CQ+ZNBIj20QjVkztdQSTjBwfQVloI5ImcYIU4JU4y3Y1cG1PKywnjdt5APLYP6CnG ONt6b4kQ
+  kyBVXb8x4A6dquNkVSpxcuZQWu7/AK1M+B7q2X7KXzFJMWm3c845Ge3FTsXi1AGNcsSf LDYJV
+  MdD7+9TvZPDLEZhmZVcMo6Agf8A16bYgjLNLF9oKBF3rwQepH04FW5Ra5kccYJNuO3boIUk vg
+  w8qFHV1KsqAYAXrVwPc/ZYkkClPLPlnbxyen1yMCoRtW6RpWAZNygKcZLcDPtV8xxxXgidyypG
+  RIQM4bnGOOnNYyltobYOnL23M1a22jbX5FORrpWe2WEcnJURgsoC884qSK2d4kkDAITsBJ/i7D
+  8a sl7gRIU2RKdqNLt5Ax606dY0+0I86zmObKmMYDLtwMD1zUc72R6MvbRqfu1pfXTX9EPSxii
+  nME4k bGWV93+qA+8G9TUc5R4cpaMkZbdvzznHH4e1SmeGWO3ktzMJlUocnOSRj9RmhIJjLbxB
+  dmEypccL z0ask3e8maU1Je/zX8u3ys/1JnNx9ntwyxw7oecxjghsntUgKyXKvPewIjOXGFwdw
+  6HgdKinmSRp VEbInneZuJ3bTjGD7e1Z7/Z4SHjDuq4G1m5G7t9RSjDmW1mbVKEpU/fVn3snp5
+  XW/wAydFE9/JK8 6Rxl9sjZwCSDg1lMpjjQEPxyDu5HpV2DdLbPabdpVvMXPXj1PeoI2228hIP
+  mAEdM7hnlvoK6IaNn LOkpTbe9vNW83p1IFKjzGZwjhsktzk/lW5pywSwj7QQ+3fFIqcHcT1/C
+  qyfYjGY8CSUuQX7NjnOK nfLmJ1gKOYZDKqjq5Pt+FZVpc6tax5uIpyxElGKs++zGuzCaexBMo
+  3bQUGOR3oWKI2DCPDO21pSf +WbZIx9O9VYYdluJhKHCuoZQTknB4q99me60yN4X8yRVyFQYJX
+  uT64pStHqei6c6XKtEu67+Y2K3 SV900tuAgYhiv3wDgMParM9my2SzC6tXULtXYuCecfzqtBD
+  G9ypuIplZZQqIMDcCM+noK6KOH7Pe Szq8XltIpEbrnC45H171jWquL0ZvUquDvGV/u1/yKMMN
+  1azxMtzFG03zcj7pBxt/HNasst4yCBQj G3baAF5YZBP49QKrTOJHjYSRbURgeOpIzkfSnhkaz
+  WWK5V5JkJi6/dHGT9O9cc25WbX4f10OOpyy kpVlr3tp82tSW6EE1v5e8O+M+XnlvmyxPuBUds
+  PL1k3gh3RIAsW0Arz/APXNR2k8rt5DRb5UnOJV XCuCOCPbrSztLZeW/mqwRHUccHBBB/Wps17
+  ncy9rzxdBR+L8fQS5upbbUSkzoyIQ2AuCxX0P1I/K oIpDqdvcTMjIyEoqx4G8sfvfnUpSwYXT
+  zzK1usoUEtk54IGf50lxcSWz+dCY3G2RWVEwMn+orRJa KK17luMI1oRowfP+H4GVqG+P7RF5i
+  J5LxhmP8TYBPP61nS8Xlw8ULOfMbew5HzDqPQA0s7b4YYQD vjTLHOS/vVgRTNHZKh+0bY9s3l
+  9ixyM/hXfFckVcqvGVGznBJ32X6/8ABK1rYx3tpGEbLNCzKpOS WBxke1MeEQrFGRLGshP2jzD
+  nJ42kelalvttryDzJY8GIlAo25HO7FVkjEbRyRMXAUlt3OHHQUe1k 5Pt/X9epxc85y5VK3a2m
+  vqI00bM0cwIDL5cbt/c759TnnNZCRrMojMpEqNjcCQCfUe2BXRefI1rF LNZ8gFHZkADMeePSs
+  xLfc6K1tIZBtDhBggnOCaqlOyf+ZrSUuTnlt6poIQLQh4tw3gsm9s47gfh/ Wm/apLlvNkgkmX
+  cF+X+DIwR+Oafd2c8W+JQxij27mPc4zkegqrHPcJeBomBmfd8qLxnHp0+lXFKS 5luUuRw56du
+  bv/W3yBpm8+EzJHt2FQMY3EAqPyphWNre1aMOx2ESknOSOc1OJw6mLCTwsrNlV+YB R1B7DOfy
+  qmsrSBBEqqWLKBjO4AcmtYp+h00qsZSUpOz+eo1EM0wliO11IfIHXB/lVpHS8nkkZ0Tc TuCr0
+  P5YxTJBHFEoCSxuQAVJ7cEGpfswM7bWUBHCsw4BJ5z9M0SaeprSgm+ZRs+uln+oxRmLyYzH Fu
+  kHUckjsPwqeSJ7edQI0CliXjIBZCOACa0bW1hlTzDFIH8wsqhumDwPzp32JZHmVRJGWcNIHfJB
+  6msHWXNqW051GmtF0M1YVmslQQyi6DYBByOegxVEFTkfPmMlFDHpnk1uJauLjz7aGZoSGaIk9N
+  3A ye+Kz1GYAtrt2jmZ25GeRx6Zq4VEOKjBpL/N/wDAI4EaZZUWGRwSASDwuPWldpRegSRxwsm
+  UbKjO WGM8DoK0vLZ77yYysUjvsUjox/x60kihYZI2ZfNaUm3BGS6fxNn8OM1HtE2YVKkZ1OS/
+  5XXmRyxM LY28c9lIkRysoj+9gc9u5rF8qdbjdMgZt2WCDGwZ5B44NakqolqwKywxcmFnPLEe/
+  pUDKqR2srF2 Mineu7lZBxg/zq6bsvU56kacIr3t9NLfjYqrLBDc4kXaG37EHHTpmnW5865hia
+  AEODkouCCRgc1M scTQOrgxyrMIzvGSCTyfpTolKSPFGrozNuScnC7VB56d6ttWfc5+Sm4Nyf3
+  30/ryC0+zlhBNG5Ql dpDfMAMhuf1qGe0iacFAUhZG8s5zkL/F9DVqRoRLbuCJ0jiKDbxtPO4H
+  jqM06O2As0kadCVUDC9W UAk49OtSp2fN3KhGEZqb+F6aa39Oxm29qGuIlwFG3fhurY6D8aI7J
+  pLnzImSBgzbUc5IHbPFXGtT PbJNbF5WwPlXkg4yf0qncvvKJCSY+gI6kdQa1UnJ6MJ041Obkf
+  y/4BXFv5bKHky8ZJAYE8f3SO5N SYkjjjWMKu6PIUg5FSwzCGaS5kiWYyHaoZchgeC34UnS+cS
+  MDHl48hcDbj7w9hVOTvqHtYU3JxVn bp/V/uZlssghVJ2EkpUkOnAx6fhVeWWTciIhcZ+bA6L3
+  q7HdvLAZEaEBSYz8mcj/AOvUjwB7IzGS N5A4UxgEELjmujm5X7yOOUeaFqcnZ9df+D97KE8v7
+  xkSVX3NtVj0bHpVULJAuwsMMTnIzmtjykct EHhyFLA7euBn9azpYj5ce4kblDDn3q6c1sY14O
+  Tb3a+RXkaeZoyVyBzlONoz/iKcYZ3BPCHO4np3 qd/JiLhldweFC1Ahjhk2K2/erKMnP860Um1
+  ojlqUlGTcndvfX7ug2VIphGGkMuwll2tjk9c+tW4Y vMhYBh8rZJBz26VF9mSLT7Zt8UiHPCDB
+  B9+KWCJxs8ncAPv5PXmlKScdGRg1FyUuT1SJDGHk2ylU VQNuxeTnmlW12tF98jblSPTPf8asG
+  Jhcuj7mKnBKjgelapvJpLe3VPs6rtZB+7+9g5z+PQVzzqyV rHdOmlUXu3bfUznjUlhOhV1lCK
+  i8E8ZOP0pZ7URyLHcDEinDkZGD17dulaNtaRbC9zOvLqSmfmQ5 7n+dTXEMPnrsdxIzl1aTlWQ
+  cbunTNYe3tKxq5e+1O935afO/+Rl7pgv7t4oI1m+8yjAY9R0qREba 77CpmkZlz2Vei/nQ00Vt
+  cFFT7SN3Ddsdc89aspELmWLadiJueUsPXgKPc05O2ttDGWHSrKpb3eun 5ozZo7iWaMzZQyP5g
+  TGOvf6VApVQxjjJ3Nkkjg4PUe1aSxzpOjeW6FZdnzgHB9KrbUQsSDGM/Ip5 IBJ4rSMtLG1ClD
+  mfs3p8tBDG+2TEbRHuOuDUE1tsQCSJsYLo2efx9avWscb2SyPMytliw9QOg/Go 3s5nijZSXVQ
+  Bx2B6/lTjNX3DmpV1zKO3Vr8hwsxa+Vb+X+82szHHUjn+Rp0Mkf7sCKWTcAF57k1X GJCsiyyP
+  s4Bzzk9/oKuRguD55VG88YKJtAU8Htg84pS2u2drxCov91H3enW3qKuILh4Rwwcx4zn5 h0P0N
+  QxnbCfOkCS+crDKkhgBgnilkSWOTZhWfqWxwcUwHfPE0iYc/KBjoewI9am10XK7ilzbbdEP Eb
+  GPcDCEX73y+/H86mDBbxVSSFWdiqq6574xVJFLkAKyEA8N3NXI4h9kb7s2clW9MUS03NFzTg4x
+  W6/rqh8cjtG9w4GwuwXjsOM/nU0RcwDJUoGAQkcKCOatgFLTyDENzMNy4yBn+Hp1NQPH5byBV8
+  r5 tzK3X0ArDmudOFjiPdVTp16/cCRqVaQSBpY1JxtwB+GKZEF+/JltykjAAq7bxKw2yRSO2AZ
+  Npxnn oKkEcflwq1tOjMhYjd0yeD9MVDnZtFRTjUd2/XS/5lCJNojdMMPLLEZJyc4x+NaElnY7
+  baMLKrYK ctyG6kfWrUdvBJNFMFEEEbEAuf8AWcHDD29qYGFsSdyNKiqN7cq2T6euM81hKq5PQ
+  83EU6lad4dO 2n5f8Eo2FgzXzbwBhfmLj7uc8mrcFrHHO8UiSuyx7Btb7xIJ3fnV9JSzXaxMqq
+  kvljIyWUnAOfal jkt5r3EkcskuDsZeA+DgYqJ1ptts7E6nvSinGy/pt6fmOtDbRrHHbwvPcOo
+  ZyxDBCvVSPXrReQKs LxxWbKJvmQ8bmAOBzWeUul1W3iWCSVcsrNEMc9zn2PH4VoPcXtldW7yR
+  73+ZYlP8Kkc5+hNZSi1J OLu35nL7KSq88Xd+r/zKB0+G3+zuZ/tEkUg3JESCdpyT9Of0qS4Fx
+  cWqzzI8aJuO9OA+48H6cUye bz7iLYzCRR5hC85Zf6Y6itOSLzdPee4BVS22NAcAh8H+daSk4u
+  LluelSw0qVSFSUU9db7/cY6yKt oDNBKT5jBwpALcDJ6fSniNGkSD7K6xjO1jjI6ZJ9eKrJbTT
+  3CRKQZmIyp/vdMfXirNxHMk1qof5j HLKMevdffgVrKydk9R4vmg1FSu797WMmRoortpEDBVOI
+  wW556Zx1pbaB5YHlkkjk8qUZSMYJGMkV YkkQwruiGXG5D/snGPxFaGnxOlmZBEZ0dyx2d/X+l
+  aTqcsLnHWnKa5pRtfTff8SvC/kyLIjQxM8L ja65xnv/ACqJpWlhkBjZrltgG09Ox/E1It2SYL
+  nckDueY2XJBAwOx4rQlhkklmR0E4wG8yEAfdAI 9KycuV3aNVUSp891213/ACV/vJVkijS4Rts
+  eydMggHqMUxYxa3H+onit5MpG5bgg9R+dUrBZL9Vj YeQxYtM7/wARwSD+VbxtLifTEjVPMR8y
+  Y7gcEL9a5qjVOVm/U8+M6cJW773/ADRAwu54t62xT5i3 QZQ4wAfc4qQXrLoO+6s5VYS8oxG7A
+  x8307U4JJHDClw/Mo3SFeNhB4U+5pt0Ymt7m4hhuEkBIdZH zsyRgfXqax0k0rdTohCNRwUYvf
+  0/G4ly9u9wXhjeZH3bERudoNZNoXN0yMjOoDMqqcFV6gfh39a0 rnU7FLOaILvZ5FYMnGD6fTi
+  qktyHnit3j3ZDI+zAPJBz9Pat6Sko2sd1KVRx9+DS23ennb/hgmvF GqfbIZ0MbfKoU8Zx0qe3
+  gi8pmuvNmRGCvl/uE8bT7nrWWI0lnWHymOWEhKnA+XI4+tSwec8zR78v PiWRD1Vl6fpWkoaWT
+  tb+v8yMRTlVk9bNL00JLmSG3ln8sLHtZYyj/N1HX61SuHAiSOJZkaNsYds4 9j645zTZZJZZ5G
+  nCrlt2x1+9kcEVIyxy2cM4LjHE565Yenpwa1jHlSudCp8yi5X8rf0iO3hCSs15 kxE8Opxux6H
+  0qe3ke10+OdyJY2I+WM4O7ORz9K2ATdQRgWrS2rRF1IwNgHG0++ax3hmMiCZY7WIE Id4OMseP
+  xrNVOdvmOJ0/aybqvRb69P8APuMuLiV5YTcSQGRZnkwkeCORgVblZ5ba6khXlZywKL6j PT86W
+  C2tlupYZ7232wvtEjKTuBBzViDy7ZYonu4XiaEMyDruGcc/SpnKK+FbeXzMXRo0rcsL211T e/
+  3GNMjzW65L2ylvMBckggYGPrzmrVvZpuVJXklaQMAyn7/Pyke1PuLW4khgRTstjbGQOwzu29cf
+  jUTXoSM3USZZcRkHoCw4I/WtOaTjaLIqxqxpr2Oj9dCdhZxRSW4eUMXVWd2yNxXg/QY6Vlrata
+  Sx BicSvlZB1QKCcH3NLJK0izxFMSkneCOm3p+OKrO0kiS+Y7NGzq+M9DjitadOSW5UcLNpcrs
+  3vcWd 43uifOjiHllAuMdV9h602PdbWFsgik2BS27HO4n1pscoLtsWN15Xdtz+PIqaKCN5UVhI
+  wPLKD0Pr 9K2doqzOicFTiqmjXp/X3jVndoyskamQ42uUyWXByRx0FXQ7xg7fuugVNycMT3Hqa
+  q2bBp4w8Duw RxheORyD9ParttNvKbpYoV4Rd4zgnms6mmyN4zVKm1ZW31T/ACLtttggZQDdN5
+  5QtGcYHGPxp9xD Ld3riNDahGJZnPQAdD75/nVRkQ5kil+RZCWjz8xx1/Si2uJWlLgtHbysXO8
+  5JA4PNc3K78y3HRjF XlGV/v8AwRfSW4tYFkKfIZFj24+4CCSakCRQvLJK8NwrcKsa7cjsaZNe
+  faLVXe3fyVdsHONw29fz xinWcMQS28yeOFBGpbzed3JJxWT+G70NVFSpubXrotV2Wl7kE8UbJ
+  bhJogxYs3tjk/jWbc4F0rvE YoJmYoSM4A6jNaE0LER3EAZvNHmtJwVB3YwKzpXnN1biVlABBG
+  5eAGPP61vR8mKlF04t0no/v/D/ AIJbmu3jVRHGkkboz/MARzxx6VmWYW1uobggSxpzIeoLNxj
+  nvin3EKeepEu7HIweOPb0J7VJHujt Y55SBM6syIF4PbOOnrWiilCy6nFiMDCUbKHxfL7+q9SO
+  Wa3MyKqM8bI24Dgk5+XJ9afBbO8byS3N vACQ4BzlgDxj27VJbi0EEZO5H+z7SDnJPI3Z9Paqp
+  aWRkhDBV+X5m7EDHp/nNUr7LQinQai7tqK7 q/5ofPIkjj5GQzHz3YdAewwB0pkJuJJGtzJGq4
+  BGV64BPHFX/IWXUCZImjhcuzRg4aIgYwT7dadH BFbtaTupEUkBIlBOOuMn6modSKjYxq1MOo8
+  kdX0/q1yhNPch42lUQu43rsXbjPGeO2KS1ma21pXV YbhWOxiEGD2B56cVchghclppGjBIUM2T
+  8g+8PqT0qNp7Z2eFYtkLHzowPvDH8JPfvT5k04pDqqMq UowpuzWr2+6+7KbkLem3FuyKXH2dm
+  wcIMk/XNMktLq5d5ZlW3t5SSHcYAHccVoMsFzcREsyokLBC OPlJ6/zqt9octDGq4VY2UFjkMS
+  fl4qoyl0WpwRoVXdKNlbqv6X5lX7DbWV1Bu8uRWi37kHynAOeK ijkY2ashtk3MA6NHkn1q2Fm
+  iKPcwbT9x+ANue5+nFUp9n2sx+YGXcQJVGAcDrW0W5PV3G8LHnfJK +nay/wAiG4jS0uh5DLNb
+  fOiPjPbIyfxqmsiGHe0bsVAR+RgN+XpV0pF9iRFjYmRAyHcBwCQfx460 x4UVy4CoAwkwec4re
+  LVrMKeGrqnZO6XyRXeGH96RMGBm2x4GT04H4/0qiI4hp7+aU84TqyHB+YYw fpg1dVF8yFzllQ
+  ZIHBPOalMa/ahmFmLI+fqe9aqbiclfB1JQbntHW/f16fkZkRCiIRE7Sh68jrkm pLZJJt0bzxx
+  sCWBI4Ix0+uasMR5sEMZSJCn7xmHK56j86cUnhvCjLG4VsEoNvaqlK5goR9ooRbT8 l/wdSdXl
+  +x7/ACnhm37SsmDle/Hr05q7bWjFyTE/l5Ii56joaqWMc00u1tsKLJ8zscgAjgfU461t W1xFH
+  YC3jVpy25vLJ+YZGOD7d64603HRHXepCCs25d30XfyEFxPbrFAPIjiKjLvHuJ/rUy3EYhlL we
+  cUxGj5wFwM7envmp5tPmexEm1vPQLCseMlivVvpioV024W4khCPKMBl29/b6/4Vyc1KSvc7I08
+  O6ammpd9bfcKytNZmRbeABJAOIxl1xlselI1tcNpweOHKSMXJUY2gfdB+lVIrm9hlPAYFhlNvc
+  5A q0t3cnfD5oCGZcE9MHjP0puM47WMJYerSkpU0rLXr+WpmzWrRXcQEgO+RSVHJJA61DIWm8r
+  DRhWT Ifb05/xq/cLAmqrcCYqYZwqjOQwYcEVmxb0CJcIxw20qDgqBnNdMJNq50Rr1IzlHldml
+  stf8iqlr FHbDe0jyIxKhScEHv+FXbVCjw3QYtFHG3G772Ov86r2sbyPCkTAOww5c8dTz06dK0
+  ZbWQsIVt5pG SIquw8A9wfU1pVnrZsxn7Hk5NEuqf+ZmrFiRY4AQuCXyMnHer0i5ulitz54ky4
+  CjJUYzg+pqOWZ0 fypRFHKVwy7cFjknjHTjFTo0wthdTR+fHIefKAU+gYH0HpUyk9zor15U2nH
+  7v+B/lYosS37wMVXh T6564qxPsnufM3BXaQnZ0wVGcj2qEmN5dkYMg35ZwcA46HFXkgWRSYla
+  6lYCTKDhSeCKJStZm8W5 JSk7K+t9iASpHeCbiXcCxwf4j0q3b/Z4woLuWYlXRV5z6gkYxUyQw
+  vMYGi8s7dysewHU1ONOhawt Z3k8xtzPiPgt789qwnUhszSdoVUotpvt/nqWRa+fdokaSGFYjt
+  bPLvjg5qt5ZXTp5HurdyZAsigZ bd+XFaC+ZFe2rElIS2+MZ67Rjd9PWqmTc3DbEAj3h5ZgPkL
+  Lnbx79K5oyd/I6ZVZqs/eVl2/zf6E cBuIzEBC5lAV3XuoU5z+VaNwGup3nWeJpGLNEEGPkBya
+  maZPtab2Te4cttX/AFfy8qfx6VWkDTab GwuIpHjiSIBE27cnv7mo5uaSdrDoRU5+05Xrpqrp/
+  gkMjgDOkiSQ4Me5sDoD2qBZp4oZETyywkCb SgY8DIrVYWK3lxHuMKCQLhj904x+XWksYrO3WQ
+  efHclGyNvYYPB9z2pOro21+BWKxk+b3o38mv8A gfqVI5pDf77qaKOLyysi7QCWYZA4HXOKhUb
+  bS3EJRpFQqx287geRn8aFjtpLfaI5nkfawTdkrg42 n3pLdZf7Ut4A8QdnLkEfcGeVPvWmiuwl
+  WjD95JWXbYm868ljg25LoqeWijBbrg+/vVeYyXFgZpLh ZJEm3LjPzgDqPYGtGa5kN3tAS3ihl
+  LAleYgBwGPfJ6VWia3lkaNgBdyzeai4yBx93HvUxl1t/X9f 1sc8KylO7gl/XdrYRbea8ZmXy3
+  dnDZVcZ9SPYirElpI9zPbDd8qlzluM8FcVXGousKskP2aRiFO4 cBTxVkCO1u7ppneVi4SMoSN
+  ydz+FJ86f5HpUZSbbS9F/W5Xulijt0Rfmnum83cp+6y9vx5xWWl4X hJBH+sznuOxH5VrXIdrp
+  BbxO8ZbIfr+I9KorOXhUpBHAoZ1eMqMtwMHOPXP5VrT+HVXJ9k5Plcb/ AC1CztlfUBEWKQ5Yu
+  SOVUcitezjlRdkcTxxSDc8h+7uHQj0HtVG2aOQB7iKSRiQp8ttuT2P09aZP PLatJahZfJLqW3
+  NnGPQ+45qailN8o8TRdWTj0SW9/wAFfX56Gnd21rCYhK0c7spYqnGQOSRUD2sR kSaKK4ZZUDC
+  MSc9CDz7danZ7K7WRo3y7ThQuecY6j0FRW0Zee1iZnclBllYjGScj8MVzxclHVs8h OolJp7fL
+  8CS3keA28cKpKoUHIHbsf51pyTyXEf7wtFG0hwqfL9Bx6077IZ5GiVT5bEspXgsp7j2F Qm1Js
+  4Wk3PCV2OQfXowz71zylCTv1Ob2dPmVRuz9LsqwRPE0Jud1urxMVaVsg7Tiq7yTTTIZZEb+ Jw
+  owCemPwrRFpKkCR3SSXHlSbZcHgDjP07VJcJFKyiGNvJBYNg8s7Hgj2q1VXNc6PauT1fz0sUpI
+  55A0VrBBKBIfnMYO3GMZPr1ouLeQx3O+DzFSRQ5jUAn3FWU0poneRJZYvKVo5kLnl+uar2yoE8
+  wX gZ1QxyR5J3l+jD2FOM1unt5GuHc4vmUrpdtPxK0lvLJAq2s8AVVwqkfMFA3Ek49aaIJbiyt
+  naWJb jDKSOM7uc/0p8HnWt5aoJFCMuZWcZCODyD9c1anJniMUqCNDIxhIABJxx+FaOTTSHLm+
+  sR5tt7+v y1+8zLSwWUW0ckUjyNESvzdgTk/hU8kUK3EkYAjfysBmOVyR6Y6mrP2NURRcTlZUT
+  CsrEDb/ABVk 3apJFHIgZVX5QSc7we9aRk5y3PXwik5Pm1vtuv1sWDcPAYltn+7DtcY4ORnI+l
+  NWbzdQsjdobiIo wQJxuJHDfnVY5t7oeW3mqA4YnkEAVJFHvWLfLGSsY2Y4IXOf0rRwja4sRha
+  c73VvO2v4ECRRrbJE 0qK4ABDDnOSTz9KtzLasqeTnzZZPMXLZEZA4U/UZNO+zRuiXcJQxrPsc
+  MMnpgn6c1QjJ+1IwSSSJ GYqQCASM4Ge/pRfm1T2PMrynOFqU9F6flpcspLNLexwREh/LZEjbn
+  aoOTn8Kbv0+2tmWVtrSTAWw Y5JGM/j9e1UFb/SbabftZlLMcnII6A0x1aa4gLI1xDFExDKMYP
+  OOSK1dJXtfQxxmHnN8t/d06fkN 2oXSRkcjAJAOCRnnJqKYASptGwIpXkfe96crPJDEpI2rEck
+  d25xUs7eYib0L74wcJ25/xrdaPU9K Eabp2m7P+vuIkSXzG2hQ23cPlGOnIx71YRg0EnnREfON
+  p9BjoapwFn8xmjliZSVYk9M9varMtzMU ghVMrIQM7fTvRJO5FoJxqJadO463kmiYTKECsD8+w
+  cHHAzSfafNtcCFWllbexAA2npxTB5scLjIK LJ6ZAB/rV5/tEVuDFFEsYLbiEHBGOPxrOVr3tq
+  czd6ilKKTv94uniJtTEbqYxjBU9TgZzmtWJpks 7dBp8kplXOQAAOTuFUreS8lkTbAJG8t1d1j
+  6hhwfwrW+zXIs83TMYfKby9nBU4wM1x15Lm1NK8m6 nv2T7f8ADMryNO8u0252LuCxgcsRgKfp
+  mqLzyS3G4oowAJAR1Oecela0XkLHZKI7g3MSYK7+SoPJ /DrU8ULTSIoSMwYZiwXnIGefr1FZq
+  rGO6NIYunST54fozPupC2kSrJEYsTD92ODnr+AHpVCKVDcX TmLzYyQc+4GanlYOiuFJCKeG5z
+  u/nVeSRvs7wFfLEeA7Yxg4zg/lW1OK5bHTD2UIJOOj316FdTHM lu9wdptlAQKMbwxOSfpVe4l
+  ZnUGUbI49qjHJGeoojbzwH6yMhby06jB5/TmmxTxSFYpo82zOozxu Az1z2HrXWo2bfY5Jyo0V
+  KUE35ak0MkeZGby92Rg7Rhh3A9OKc8quXkSEDzNpiCjHA4z/AJ71TeOb MqymPMbkbQMZIPX9a
+  lku3jRFhhA6bTjI2j72KXJd3RxpSlH2jTafT/h/+CSyXRQb5YpYpJZc89Gy MMfoKcbSeQJbxu
+  ziJBGnPDLn7w9qh27L6QIfOCEomRn6Ef55q2i3l9GSWX92WVSo2gk84NQ/d1Wh MKMoPm0Ue/b
+  5Fh4YVtnt1kEjeb5ipnJAHUZ/Ws6QK1zFDAylI0ZY36A7j+vpTUed7UxbWWRCAMDJ I60p+zyw
+  l1byWMi+XlumSTj9KcYuO7uEYypx7t7Pt52H2kUlsJUkBjSRWBLDow4xn8c1DOY5LKxi t4XZ1
+  ADuOpOcA59K0CZLQyCQNcoTuGOrMRyR7Cq0lvC0DCJiZkZUCdd64+99KUZXldhGc5zip6Jd tV
+  8yocbRJMs7gMyStv43nv8AhxxTbiS0MUdtFGTKmUZ853txjAxViaAWdvGVYOrSkgEcYA6H3Pr7
+  VVaO6BVjEwkLgYAAJYd/yrWDT1uc1OKac29Lvq7fdchMLiKQLbywFWKhJDk8nlen41XKFrtdrR
+  gv NhMjjZj+uKs36m4lS7WUu0U+0qODjHB/SqyRRC3hVgytt3Id3Pet4bXOaeGqV17OOke+uv3
+  lkJFA HABYNkgdwPSqIQP5aDckRXLORyuD3OKvgqLXauzcQPnY/mKpyJKbqWPOIweo6DvVQO+v
+  QlKiotNJ bWtcj/dHa3mLkqdpwPWljVVijaR2YFmO3dlgSO/HeqBNulvEqo0pYnc2cbD2zVm0W
+  JI3nfFwqnYN vTd1/lWso6XPKVeFSpF8vvL+t2vyL4hHzS+asfQOGH8eOFq7EBbiWRJbeVklVN
+  q53EdTjj8KoskE lmrBXjYjeGZ8hsHGcU44F0G3M4znA7DOT+Irnacla500ZTqQbk3u9NNf68j
+  X8uNrm3X7aUadZHjj YklPVT7miZpreFEX7REduSS2SrdMfX/Gkjeymvo/OkYbpDJE+cYHdavy
+  XFvLYi6f/SVdi8oQ4Ikz wPpjtXE5NSSauZ08RKNRRnG66K36r9SigvnhEks0LNJltnlgMdnHY
+  e9OvDNDfwybUysbKPl+7xgZ 9acLuSNoRAFGVPmbhnPzc49KbJEkt6R5NxHAJP3bl8/L0z78mm
+  rqV2tA53CV6isu3l6f5alEcm2R 4WaR4/nPoT0/HHSltZrWJth5ZiW8x+QrjOFP1ovnBZYY4mM
+  inAkLcEDio2mFuohlEZAY4UKNwKnl T7nsa3tzR9SMdVahZ3XlbX+vuIrOTa8dysTFEkCgD1OT
+  ileSG4VnzLFIzcgnqTx+n9arW81tLdLP skSLzGZ1EmQrngHoOgqKP9/CgK/Z1TO7J5fPQ+1bO
+  HvXegQU6tS8lq1pZrbz6GvFFE0cklyqtLIN 0WTycZyelJ9ilktoGIKLnCNuwqg9c/U9Kmjl+0
+  QPLJsklLYAjGAqkY6e3WplsPOYQxSbmbHlyk/I VHBPTPJrndSz1djtlXjOKU2k46/CvzKJtTb
+  XEiuMXCOscfHGW7EeuM0+FLWS/aRRKlsofG1iMEDG M/Wp4o5IL9YiDcoW2xrjlmAJU59qo+TM
+  kFukkBgm2sJMjAbrjA7VSfN1HQlKVXlet/67r9S1GzND HMCUeNAkasMkoc5PvV+2hU2tlFIk5
+  dly5D8dSQoB7kVnpHJJLBGIGeRY8bB/F74q9GYWvkdUaJwf vGQlcnoMY49qzqbaHozpTjsrSX
+  W9vvS1/M6GSa3ZYEdPs6eWzs7444+UD60RLCliZZQqhx80fcn/ AOuMmqFxcWElmu6XzH5ZlUH
+  tjFU2aP7P5zQXEbM52s8ny4A5HH1rz40W11Rw4ag5zV002/k/vZam J/syVxEAIpcwuy5BRgMA
+  +tTobUKGkCnJLOkfy+UQMBD6n0rLaVZpPMtnAkPDRMchmA+8B0wBUwu3 ijlNzBujdgVZV28Fc
+  YJ7n3rZ03ax2zg+XkW67Wu/vf5MkdZFtN0sahAVZWK8yEcbvoKczxPpbFxs Mh82EoNpKrwc46
+  81nm+jMIhmk8mEYVA2SSepUH16VOpguppNolKgiNFB5j4+6feqdNpXaMnCjTs5 PVav+r7jUuT
+  au/kRlmLqised28ZJH17VCt5NOiReULhVkCymMYZjzjBxxU1zJbx2Qs4cxRRzhiXO 53wMBgfQ
+  dxT7SQwSCQxh4mV2aVFwsjAEAj0Har05XLl1CU5Onfk19df69BzXIZZo1jZAXy7NzgqM jP1qB
+  Im8tp/9ar4kV0HcenHQZxVa0ZLiNVtw80+zDqB1cHOfoB1+tXfsssUzfvY9oYOQM8LnJ/wp 2U
+  XY3w8ox0ST+X+T/Mkjltb54zJMsMxZvMkIyvboParvliaWVYVF6SwkRVHKY6g8d/xpdOtIbbz5
+  ZXgD7225HAPUDFWItQSI2/CSSzQ7n8lMFuTkj0xXLOer5NbG6dveUW/L/g7/AIg63LT75k+xwy
+  Rl 2yvbODiqKafFbS/eS6tG3eW45ywwRzirE+2GysRHdLcElxIxJPDHr9Paop1+zRQxSSC5hOW
+  ZI+CC Bwc9hSg3bTr+hVOcqkE1Gzbta35dn53K0QzayS3dpLbSSTCTOMDaOoAHTNOlNzNbQyIy
+  PG43QIEB cgHvxzj60599wYlKSsVQbjnjI54+ucVatoWbTVmhdbhxIFaBOGUnrjsBWkpKOrMMR
+  VVCC9o7u+z1 X/AK8QK5lcRw3KSqjnb8uepbA6VrQ2aILqe3LEzsZEJPRB1x+dY8KzxzRTMVtk
+  jUoWlGQ/PLf0rc VVluPLWZZ1IwFjODj1Ht2+tc9dtbM893jUdRS0W9rteny9RcC2tIlfzSzQg
+  xtuxgZ4H54zSuYRE4 a5T7SsgQJk4PGTx9avGWC0y8LKYdshIk+YrnGOvY9qzphfNBb3cDW8gl
+  iZjGIvmVhwQT61zQbk+x eHqutNRS18+v3iR284h81JCzyjzPmOcBf4ceuajSNXggmlmCOFDOq
+  5G3JyeParP2KT7Ku6R3ZIvl CkjgY/nmrMkyqkkRCK+/93Ht+Ypx19ap1OxvKpUWy2/rzKSTxu
+  ZE/eujtlpFbhyTxj6in3NrIoI2 R28Q3I7sv3WYgKD9R0rWSSC2nkZ7JsKzonTGD/8AX4FVZp5
+  005V8n55CDscAlNg7/Q4rJVG5LlRn GpUdRcqt266nPGG2+2tbtdKDCGjZiSdxwTuHsO9GZoYL
+  FXkRkcI8cuOFAznP1qY2sBtt5mElxMFk lAODnODj6iqk9vsD+W/+iLMIclskZ53fQV6EZKWlz
+  2pRhJcs5aro1+Rblle5V1itnYvKF+U/dX+I fWmynT48JIjARM2Bu6jI5/Kp9rCSdzcRSQ+cpP
+  lcc9x7cVRP2qRxNtWGFV8phIuTkkkfj0qYJGbi pPlUvdXqtf68iu09ldmZYfkgDERjv07n271
+  Elq/2dZdwdfJ4IGBx1FaVvYQPq1pCwGDGQ+3gEjOT VieCW2t5Y2ddvBicD5dg6jHrWrrRTUYs
+  3hiIUpKlT95rX7+3mYlnPHBJCBGZIirRsoP3i3THv/hU l40IsIoIyDtx0OOB/U1cRIDI00iNJ
+  iNgI4yFOOzfgOaoMIfsX7u2mXDKvmO2Qxz249KtNSnexk8P TlX5nF/kr+jf5FNba2k05RG0xu
+  dwZFBz8oOCKlKFbu48wbRvwUHGCeg4qyzrCiDyg6OCTEgAeNc9 z+tUrqGRYxKQ8WJQAGH3gRk
+  NxW0ZXerFRcIcyau+m/53/T5kSCORLYQ5FwM4GcjaOp/DmqbMHkjV B8zKc8Z3YJ5FW2VwyyKB
+  kjAK4AUNkEGpjCsZjVA4kH7tDj7pJ+nvWqkkzKOHkpTnzrRdX/V/Qpu7 CYrEpJbqCOMcYP161
+  IFltpxLFNCzLvAyM5HQnB9c1OHhkihtMjcCxMv949KiQPIYklgk2qjN8pAP HWlzdzk9tKpU5Z
+  K3l/w7/wAiXzJTakzwmNFHlxqy8kkZ59TVyWK4mhgkkyFiUqwTAJcjg/j/AEqu giaWykWG4eK
+  SBiPnz83IzWhYi4iEG2WMIsbb/MXIbGcEficVhUlZXQ4zStZXaelv+A2MSG4WKN5x IGfBGw4D
+  Kv3jQ7xxXwkVLs2bSfIXc4P9DzWtAwEdrJdyxSvEhiUJwDuHP+FMkmE2nLZxxH92/lbC MsnOS
+  T+Arm9q3LVBh8TUlV5asb33euxT8m8EE7tguW4bpgnqv5Vntc3ioVVWR3cbmBwMjgCtSFd+ po
+  QXVjbsyBjxgevqfeqS3EUC/ZmI3MQwc8jI6D861g99LnfKNvdSWnlb7xN1xPcKkieWrg+awXjd
+  nH4AVmY2xlZFke6kbEW3ptHUmthrgs82UYTuMMOMAngjFQyW8M0zRRxyRSLOq4c8qP7v145rSE
+  +X dWMKuIdLr+GnzM5FJtIdqsswT5COAVLYz/n1ojhjOnzRxyQNmTJGPmUjoM+laRithfOlncR
+  kM25N xztxzj+dOmFnHKZ12t03qhxlT/F+FP2t3oeXObcly/l/n0MiK2JlxIWZv+WhU981sQW8
+  P2gSCSOF 9sikOM4UEc/TNU4GtVeQRbxznc7E7mydmK0bS3lFqs8zxowOWVhzycE/QdxUV5vq7
+  GOMrVeXlba8 rb/mTRxQT2StIV8/cdxXjJPRh6DA6VjrC80aLbxyywuAyFT0Az19T1Oa3IQwin
+  id4UMMwiA2+vQ/ lUkUQtL53hdXBXb5S9ieN30A5rnjVcb2ObDV504Slzarvf8Ay0MKS1X7L5s
+  iSQlFKoCceav94e1M t4hJ5DRvEspiIbcuQG/h/Tiumh+0rai3eKOchRl9uQ2OGIHYYrJs5Ekl
+  VAUWOIFUbbjKnOOfXNaR rycX5FrFVZU27Nta3vp9zRHayTmBbe7CyMs6NtAAZB3BqvcOm+a43
+  KjSox2Y5ByBj8OtWTAQkW+K V2f5iVOMDoQffNZsVrdjWIZnhaCJUYnzOR0PP8q0hy3cjOlUVF
+  udt/Sz/r0K8xMcbxorg798xfnD EYIHp61EFWOWErKTcZIB7HsCMirdhaXV5BAgG1Sh3O4yCSe
+  /4VpNp8SXF2qIT5NxGQp6njgA9vet 3WjH3X/XQ7VXpezcUtd7Xute9+nkcrBbiaaG33GBXbd8
+  /Odp5z+tXbpITqNxJ8oCy4iRBjC4/pXQ XFoilfNjadt26UwjbtJ6AemaomLakl3JbneGO1Wx0
+  BwQfehYnmdzmwlV+2UpL0WhhNG8l7Dl0jjY cs4yvHJNOu8C4HlkbJAWDHoR2NaTWbSSy7djbC
+  qsRxyTxj6jis6a0uA9xGbeYMk4TaRkpz90+9bx qRb3Omo2q0pup8tLFK3tlkhjnLQywxkiTYu
+  OcVGJhEYkiURKPmCvzub8qsMpS6kjdNpUlWXbj5um KesYQrJNE02wFVAAwMD5gffmt+bW71PP
+  +r+z95Pmb/ruRxXM/wBsjlgMTMqlMFMqAe2PWrtmZBIz Twqux/njdASRjBqg6qpDoQGDYDKMA
+  jtx61VkeO4uEKzDOeSWzlhSdNS6EVKLnJzmkm/vN+Ke3MjP NaSiBcquGxtOOn40sU32p3jZfs
+  3ntuDEfKpVTx+NY8UUwgdDcIq53iNsknHXt6UxvMW4jaKZDEWD lcenb61HsU27McY1FTk4r3v
+  np8n/AJGr5scqwzufvxElAcfN93P046U0eU1hFIrTLIpKMxYlQCM9 KpzRzSSlslNzl3UJjA74
+  9BioxLGttNHvXLykxtnqOAKPZ3WhtWjJxip6d3/X+Qj+btj3FZFcH5mJ xxznp+FNQN9n2idEw
+  /mAMcnd9aTyn+VA6yMUJXC4GM/1p25IzIGUPwMAKMj1GfrW/Qv4qvLPX1e3 3f5j4lX7PIjsFI
+  +YHsVHJH1z3ptuPJkjmmYSRfdcDtnlQfrVYqk88Kq+QB7/AHh0H4014pXVCySh nYn7uACDiny
+  30b3POxMruUYz+9/18jp3kWaQ/uQVlQunlrjgde3rWlayzskUslxAjMykJswSB6eg IqtLHHK9
+  vktE0RaMoAQV3cih0t0tmWfzEkldCDnG04PFeVPllGx6VdqtS5Ze75dfxJkETass0roY mV3XZ
+  kEgdKyrhrhdhIJBHO4Z5z2+uanlh8uKOMSNiFSu7P8AF1P+FQMJpLZJ4Y3eNADKSc4brW1N Ja
+  nqWi6XPUfvPRfIdsdpynmbHXKBCuSR3H1q9A1zBC2yIRr56nzZFyAx+6DkemaoiOfyY7mRQjOr
+  FVz8ynoM/XNWIA94nlSloZhIBMjnqQPvD09KKjutdjDFV6dSmrbLrq/vWxoTrDBDgx7xvZMgYK
+  rk bgff09qdJa2ksRgtGkdDKzJls5GB830ArLuiJSpy6w7Mx7j6kA5Pc1UlX/iYeTE2ZtxETBs
+  Ar+VZ wpNpPm1M40aipKftPhd/I27RYY7RRJeWse+YOx2+33fxFOknnmMETp9ms2jMmXTOecVi
+  JDGzhWmK oZBtAPL89R7dqvTSlNTkbdhHVwFbnZjjbSlSXNfcy9lBt8z5uv8Aw3n6oqIr5VmKM
+  ypuUFOw789a dHalfKMTu5MiuGTPK5wfxz3p4SP7AjXKSlAzKhVsZA4qRUCusdufs6Bm3PK2QC
+  P4a1c9NDrjiadS m7QSW1/6epYuZo2S980pNtIUYGCSTnIPYDGKyreIJeJCvmnLsGXd0P8A9f8
+  ApVhJlurdZLiLaytl BnGFB6H1Oe9OAtpNRaZo5WJjYqySEAnHXpSinFNWJWHrSpX5bX22X4bl
+  WNZliVJZ7dJI5mjGxMbg er8DnkY9a0Vim2F5C8sgmwdvRsr0/ACqkMP+grMkQniU4Y4ycn39j
+  WqlmWkRWDJIyu0gPQkHAYeg 5pVJpdTWhenFKUv1/KxtRW9td6OptldoU4J3ZJ29TUEbyS2Bhi
+  tDCrsCrsBlcD196itre7+zkNHJ FEiBNq8ZOcdvzPrU8kMcUbeRFchoWKySM+V3g+noc15+ibV
+  76nbQahNJT5ne68isZ5Xs4RHCIwRg hhn5egPTtzUjqs9vEk+54oodsUsZxnnjOeuenNW72QDS
+  kSRV4DIrhQOMjp9c1T3I1hDE1vMdn7p1 U4KkHdz9P61UZXiml1PRjiYSoxaWrbX9aXJ2s3WGd
+  mmEN4swxGTzgDmmxTyfZ5P9GkRJJUYEcc9j 9Kie4me/kliUsJJo3IbkqT1X8RUV0MEpLDO1vG
+  +yMqSBg9BnoTSUW9JHn4mPM7TSdtbu1/0uWzbM YLVrhiiuT5ise+7GParwjtbeK8tkSa4/eM5
+  eJsFsEYCnqOKy7V76MbPIllPyZZuQmeD/AJ9auvDL l7dbG68hA2FVhv4Hc1lNO9mzyXRl7ZRb
+  09bfk0XYY1kndyrWSzoWQXHzcD/OPxqxaTPPLLLG0TSM p3QquPLOMH/GqkTWsVis12ZI2mIZQ
+  7Z2jGDj271E8lsmnLcRCSRVYKGRsbgep9655Rcm18v6/wCH NIRlJtX301S/Pf8AE25ZrhHjLy
+  ReSkflEeXyCRgkn071UgLSXiFZ7e42RnYyJ26H8T2qH5o79ZIp cIVLBJMtkqeP0Jq1CWMjfab
+  SZUT5AUO3JJ4P0HesuVRiarDuCklZ6b6L8P8AJkl5cTWkFvtMe2OB hEWGdxyMk+vXFZsswXT3
+  BYyTp/AD8xQnJb6DvWxcQkaYzNDJhm3BmPygAjcPxqjPeCYrHHCsscpY 741ALAfxA+nalRaaV
+  kOjOm1GSXXfb+vvI4HRdTu2u1WO389Qvy4OcZUZ9Kx3u72K/QosbGYlinlg hevBrVMv76DzZE
+  jQJudnHAboD+VdT4i8Q3/jHxZFf65FpkDWkEVsiWFqtuAiLtUMF6uepbvWvtHC fw3TWvy2sut
+  /U6pXpzc3FO6/q3Q5ZYYpkg3zxC5dAzBeFceoFRm6d52QGI4beFC9SOp/CiSTN3bC GeBh5Xyq
+  F+bAyM59M1lXE9wCkV7GHSSMuTF8pY9Mj29q1hTcnqKnH2tS1r+vT00RYvPtKRxRTKQX OfNQb
+  Qy9Tj9Kou58yYxszTAmXy2+bb/eHPGO9RwSzRs7NBJOGkOHHRQvWrEV3K6TsQsgKbnVUAJY 8D
+  nHT1FdcYOPY9DD0eXmcEml1/q41ne4t7jyImn2sE3x8A7un4cVUihvVgkjXC+SwCRtyWz/ABD2
+  FRJNtj2tIYycq2DjeR0I9u1NEi3VmrfaPNmGAMKRsAzkHjk1uoNLyM6vNLRNfd/X6DSN0kj7wF
+  En lgs2cf5FV/LfyJICSqGUMDJnjAOF+prWjb7bvgMPkOGErsehIHyjpxmobYeZdxy3qhJGd2Z
+  TwMBf T2NV7Syd+hhXxajG01drorFQrAzRqqSR7o2KKxyeT096favJaR2+4qrYZmMq5Bx/Dj19
+  6cwEssrN Iql3jKEcAEjoPSrMk0T2MisFndZMsmOVPcZ/CiTurWuY1o3tTjC73+/8DOMwMTK6R
+  75QpUouGDZ6 UjtAjHG4uEIY5wc5ois0KxP52+Jst5YPz4ByRz3xVi2U/bk/1ckksLMAy5GTn+
+  VaOUVex20MQkpK Mdkt1/X5BbRPFYyyfIdj+WqkZ4I5I/OtGW38rT4EM8TQZDK654H8Q/HikUN
+  NeQ/aIZJ4kQKwh+X5 m4H5ir0KhLQ2UUbW0gJJW4+Yrg5rkqVHf+v6/A46mLrJRpu1k79NP1/A
+  pz20K2MhR3Yh94TdkqM9 D/OrFxaSqUEUcgdonkJz6c8+9Mis4LnJM26V1ZwVzjGM8ipYo5PtE
+  RacwMSI1aQkgKycnFZuduuw 1VlCEWp6pt9fyX+QqW8k9jbF5FWCaIOnHzAjgjOO9VntIAj7YJ
+  jJJJGQWIJGc8D8qswGaJbYSq0s PkeZGUGPlQnj8aVryZmjOwQQvDvLuOxPUVKlO+g3iK7Tell
+  20X3LVsUrFcakIyyRyRMqoD1MZHzH 6jjmnXJtZroQNbS27RyHZuf5mAXqfWoY3ni1aQCNLiJZ
+  FQyIv3jj5QD71cYvaaotzdYTcjK+R0cE dPzrN6NWfTQ4akFzys29LpJ316kUEUD2UefJWZURW
+  ULyCW6H3NVTbPDeX108JeIuUVcdeOMe1aSL Msk5a3Z9rEZUj5eOAffNZ8mmKloUYXMLljuWR8
+  5I5/rThNXd3uc9GvGDak7J6ar/AIYZDJCIgJrV R86bNqgEjPzfrWxPBFdWoCoVMgxkHqWOAw9
+  sDpWRAbgXkm6LzJMqWCjox4WtG2tLpZwv2e4gVNzT lzkK2CcD04qa2jvc5selTmnB3fS3+TGS
+  abc2czxwSpJlXZyR95h8u76YzTbe4RYLQ/ZpHMdpIEYH mRT/ABVPHLcLZRSeW7RKilNxyQAck
+  E9zin3+pNIs8lvp06ySI3kEKCAhwCQB2qFKTdpK/nsZQ5qr UatrPrdL7zNigjFtbsxuHC8RMs
+  hHmLtzke2f5VCkc6G3uSYVE0Bk+5gADjH+HpWjZyRWFnE7I00a ryueSR6eg56Ut3uvltjKVSF
+  yrIqDBeP+LFaKo1Jp7EwlKDkm/del97+SMCGR0vRFAx5ZWjEhJ/dj P6mrQjhmljt3uVHmxMYz
+  k/KobOD6k9M1oLPDDq4RZLUwsrC1cr98YyD9M1E1sIrEzPC0sjgeYU4w cY49BWjqXfYqTU6qi
+  pWb2/qyKCW0RvJoWuVt4ZYw+4k4hbsh9yaty2c62P7uRVLSbpQc5VwBx+Iq 2sYVSuxduSjhgN
+  28Abfz5IolmllK20REUTYkkLjJ3LgYz71DqybVjSpKTaUXtve3+VyKG1uPtVxk E+bOoOP72Ol
+  STW8htPL86JDtZWZkz83p+NSPqFxFDMUMcryOXLBeFY8AflSCzuHjSOdxK3zBgowX C87x7Vm5
+  SveVkcVab5lUmkn007eRTeWCNHcsk8oYIkcYwX5yD+GKzJ7K+utQW4mKwS3SvJhsjDDs evJxx
+  Vy4LzXtwi+Tb5dE8wrwWYcEelQz6XcSPKnnSSXUXMYVjhwp+Yiuqm1CzvZs6G1F25kpPurq 3z
+  0RhanA8X9nv5ixNJC7sHGfbH1rP87zYlXz43iUlSdvQngZrqbv7LfwurFYplAMG9v+WZ5YfXjO
+  awo9OMO1YQZxKPMBjUk7R3PFd9CquS0tx4NX0qaPXW23muhRnja38t/LDtuKsATwfy9KSCzU3q
+  RK 0WcsWJXvjIH1xSvL5IgguonVnmXMnQRqMHJFW7iJjdA28UwV5XZmAzkge3TAro5mlbv1MJ1
+  5TrOm 9+70/DZjBaxMiFpViATDE5Jk75X2xS21rbPKZJX2RYKgZ/iI4FXbWKGfT0kuHCTFcbW4
+  yp6EfhSC ezhv4yIGdFjbzCG4Jx8p/DpWLqSd0ric6klJQk5SW+iRHaWVwdQWUxlNwI2OM5OOR
+  +FULjS33Isc MrIEz+NaDwzyNCAjhERUc9dhbqTn9aIiI/tQWUyCNwkTA8eWec/Wmqkk+ZMuTk
+  m+eV21tbRfO5if vE+0bFaMNMp5PTGcD6VDsZ7uNFDlmfn25rTktRJM8M0iwsiliTnsQapSNBL
+  f4EjxIkvX269q6ozT 2KxKp001De26RIYdt5ttiJWCMQ4HDL3I+lQLDLuj4LKEIGO4PNSnzRLN
+  dW6uI5C4HooPUfrTreZx ClrIishkDBioyBjpReSRzVJzilJw5l1t/Vjoo2WFZRNDLPIpJZkOO
+  x6/n+lKl0o05UDI7FSU3ruK jo2ffuKWJZYZYxZzQ3SKGQsFz19c9T6VGVZd7CDJztI9Mfxf7o
+  7+tedaLev9f5HqNUue+7Xz/P8A yKH2OST7ivLtycqDg46896kTYSoEcqpySmeT7j8K1bKFbV5
+  TvYxk5jyc8Y+99O1QxNH5m8XEO7lm JQ/MMcAenvVus232O7629Woad7bfqjPe4VYY1w6AnCZP
+  3u/6VE5jlvYIbeKaWQuwMitx0yrU/Y82 9vK+8+MkfdOMkD3p6Ru/ARP3hVSduBnoBWqskP2F6
+  XxKPX/h9dRi21wumZEE6qhA+fPOTkkflQyc tIJI2ZgXUqvKhuMVrS6eVmERkJEX7uUjpuHIx9
+  adDHYpFlGIlSI7AxzvB5NZe3W61MqfIkuV3+Vv zbKAhaWz852RCZTuGOd2PlUemetNRFmkPnS
+  eSzjIdhwQBz071opa7cyAbWaQDY38Bxnn37/SorSI PMkcEYkVshsjdgnkip9qrPUKUlaT9orL
+  5fduZMgMssWJgwALAAHAz1qytuHcRI5MahpA56YyOTV4 2U6sFW1Ko7MyuBwoA5H41FBE8a7wj
+  hFAzuPO09vzq/aprRmsOSUHyavpbo+4WvmQC58qS2mgaQfv dgKg54HIyAfStBLRDqrH7JOCJN
+  rMCNoUjP8An61YOnXMt0IRAURiTKw4UPj5f0qUtFbW0c3mkSCN g6s2S2RgfpXHOtzP3d2cc5q
+  o/Zp+8+3+dyGOO1kvmtYLaZI2/eKQ/G0DJNPjt3EZuVlDSvEDAjdR HnBz60skUz2hiSRAY22L
+  tHKpjJU+pzTxCstrD5LFInjY8nJTkArn261m5ab/ANf8E6acvZpWdk9G nr+ZYjdbaOCNmkkR1
+  aRcN+hPtUd3fGaZY7VsNu3SHqrYHBotrNBqcoecRbJESOR+VAPUEepp89s0 GsRfKixO+zdjv2
+  /Lv9az9zn8zVKhGo03dpXSWiKpu4pLCWafMkjMCyLxliOCPQVG0s0dpiQGCdDg hhnb7H1LZ6+
+  lTysgvxE1v5hRC6hfp0I71nG5ma8C26b5ePkZd3AGST64reEU+nmelCFoNyVra2bW v+ROZLgX
+  MjxvEpEnOV4YnoR7CmXksL3scEXmLsbYCzZDZHB/nzVy2e4XEpiDo0ZwwUYXJyQff0qm BBMI5
+  VIgwmArDJOD14pxaUttjlnyufa+3LqWx9qh2Rf6xHKEt/eCnPH4VoSXCxXUoEc6QOzNlnyR 3H
+  Ppms4AgQRxP5mCrq/93HQH69fpV6G2mbUpI3zKjNwR/Gx4JHsPSueoo7s55UotynK2i9H+JLNa
+  pcS6fiWNoxExkBHEpxwV9ADWnDZW4s08vdFIIh5ivyAMYPHrWMj6p9sWWONYUkUvGjqDtUHbnp
+  07 1agsbydSJxPGwIThsBsd/wAa56iaSTnoJRcbRdXTfT+kTSQQ/YvJjkKW6jaJHOccZHP51It
+  y7Jh8 iSR02g9G3DHH0qF90sgtzNFCHbeA4zn2H5VdunumUvBHGjRnKhkBJPHSs30TO2jKo4KE
+  bX6Xdvns UpftaxwWqymQRwlmQ5JXB+YGsZjapcQyvDcRxyFWQq/3B3B+tbRe2iCefcDznYZwc
+  bs/0NVJoLFp mDzbreL5AFODnGR+Z6V0UpW0aOuE1GMoyjb0X5bDnezyrBXdVVmZN/K4OFz9Ot
+  VJnH2yIMJ5AsJM rI+N7HoPxHSp5bsKVMcaNM8ZkPHB4/lWU6B7kvLdxRK4UHk8Ajn8q0pQ6s5
+  KdKKg5u67Xd39yHyQ TxQWrW8MytJ/rGLD5WB4PsKkiu7d7j7Net5tugJEkfB3AfLg+h9Kg+e2
+  tt73a3MI+RyufmZjxj8K bPEILxEGyVYlAbaMZx3/ABrdJS0ZFKopR/ePbZrf7/8AMkSSBUR4h
+  Ise07gWyQT3NSiaTbAITBLN 5LD5ExvP/wCqiO7T+0vLlEUapDLtAQABiOM+tQRW3kadHcQybn
+  ZR8vfjHI/Ok0upM5xhpb06/wCQ k0MyMjq0EXG5mKZx/wDXOahkVSWhsYMSiTMRx95F9fU5zQR
+  fQSCCQ+YVBK/KD781FDZ33l+aI5F4 YhvYDkVqkrXbRqqa5b1JJN7Wf5rqbNhCqvLdX0yW4zsb
+  K4y38B47VlmW1ktlaRvtjq5wYiU5z93n 1q8siR6DA6p5zDHnBju+Y42j8R0qoklsbM5gWJ496
+  IwGA248Hp1FZQT5m3f+vxOWjGpXq3ld306J fduR3MsX2TDhI5pGDbMYKEev17UksU/lykmLNw
+  N5A6qV5btxioZUNvPChKOpQhWxncM849/etdl0 2f7NbJM6LIS5YsSenC/U1rJ8iVtjtrupQgu
+  TVd0k7HNSNE3lFElBYMwYNwoPH9K2IYX/ALOuUlgA Pmr+8AGY/UZ9D1xWhaWtlFp6+XPFG+4M
+  vmnJPoKjF9b272UkmXBiYTYPDMCeMetTOu5aRW3/AA55 31icpJxhd+e/4/8ABKcDPBOtz5c21
+  GA68NjIP5549K0Q7XVwqySLC0swXBHzFtuV5/n61Etw7okk M0LRoNgiK5O7OT+dRRy+bqMcty
+  6w7ZVZVxjnJx0qJJyu7am1bmqRlVWkkun5WLkENpcyRI/mwZfM yq2CWPQD0HtVojT1iW3Nyok
+  3CRy55BXp+GOKQ3FnJLJvI+0vJn5eNvzfrxmq8UUMetXW+VIVWb5f MG7dwSPwrmd3e91Y5XBy
+  fM1LTp1v/XkP1I28sLNB5iDEjDL8YYA/l/jVeBUazjEV5BGpj3kOu7y2 B4Qn3OaWK1tWhQzzG
+  QeWNwVsdG4/StV4Izdp5Nvtt0RhIMDOTz+lN1FGKj2O5csaai09Nf6v/wAA iLw3FjKZ5IiJSZ
+  AkY2lZOyfXjis1YruCWFJZo4z5DPJ567xGQeQffpWnHst7ASwQm8uVKxIV+64b knHr6HtUBkj
+  eKJ79SvkwmNU7shbkn1IpU5NXSWn9dDKivdajDT5X+4UTi4sXjSTzD5uAyt94dd34 d6zgt3Nc
+  h1n2xuoYGQk84p4FtHE7RhobJpdsTMeoPv8A561KtzYTT7lL7zJsgTfjKnqfwx+VWly3 5UcU5
+  uCbjt3texEYI59IneJnL5CmTccOc/LUstrLb2zol64mllJKsxJ4A/TtVuRryN2jIidAyliq YB
+  brkegqbzWuZ5VIQs0jYbb1XjJHoKzdSS9DzcRiK0ElGWi1/r/IQDybKaVCzsx2qM5CqRjp61mN
+  p1uWiX7Yw8iFlPzngjBA/Gt2K3DObUP5bZZstzuCjlh7VB58clgrHy8SHc5C92GP5VnTrSi7xZ
+  zx xtWPurV/13RTSVDv3xtgkGfn+NuRj0AHUVox28kkcSYUMbeXqPu7e/0PpWWl0rytawotxuc
+  bivVS B1+mBUYtGW9h86eSOCQFkBcguvRiD6VU4edhzhzTT+Hl1tvclhsYJ7a2aZWYKoZGU42B
+  hgA/zqGC 2uLTyh88ttvKyEnOWIOOvr2psFxC0zRafcCNgQEEmWAC5wD+taSu11bRpcN5CMQQR
+  xs7Kp9STVzn OOj27Fz54NX+5p3/AAI547f+ybOQ2t0ZGg37RJySvC/iKiu0uX0qNoF2zDBkBG
+  S+D1HoKmNy6acI GUCXcpYMOjE4yPRfatW4kWRIA6BmS3dJzHwNxIxWPtJRa0vqTCdWHI3G+vm
+  9PO/QxozJHcySXMO1 SWymANxGMEegFQzJLN+9SO5S4L7Qd/G36dsmpQWuPMjmkWRWxKu3g4x/
+  I4qyVuis0ovbZAW4Taej Dkf19q05uV36luElNyej/roVioe2AUrbXBlDCKUZMij+MY7AVGsar
+  MxDvEsyFkmckrg9h6Z/rWi2 nXCabJFHjyovlSRlyVJwApPqajiihMslpdB43J3MWPAK9VHpx2
+  qVUVtHc5rRgubmv5X/AKv6HOrD LHJGd0UNsnlj51yfmBHWqsFkvleXH50siy7XMb4A2tyPoRX
+  YyW1iZxGzGVZlDhA3Me052H3rDl0u 7N5G9gsjrL+/YZztC/wn3NdNPFKV9bf1/wAObTxUHzJe
+  7deiOXuYrd9akZFZrUBypJyW9D9M1XIj /wBHdTLcKIyJdrEbH/HsRWx5MCXMUTXUeAGEJVfvL
+  yT/AFFLbRRR3RWK6gLcuQUzgqO/rXo+2SR1 1J03CLT97qulvWxVtQG0iGWCWMx+YyTlueB9xR
+  6HBp94k8iaYosZWLQFGMQxnH8Rq4Z0h0qNE+zy 5bMaIuCFPUH1J5we1QRXFu8Rmj89XTPlKZN
+  2E7/lWalK/Nb+vwOLD08To46a9X/TQQWs8GnpdR3S 8qUdG/vZ5FZptoVuIlMjmRVDPg8eZn5R
+  +XatWJ9Rlt0DeT9mYhg4QYw3JX/ePrVOeCC1MMyMW3vv VS3JX1zVwk+ZpvXyOiKqTj7ObXM9r
+  fkyvI9xBqVx5iDzBMFbeuduO35dqpMVcvLtYj+FUAB29d3I qwytOymabLq6KBnllPLE/QdzU6
+  pYvcXBG7yon2RsW4K//XrdNRW2prVcabsrp9bLf+vIwS0gjVd6 hd7sx7EEDA/SrME86P8AIgV
+  iMfdB2fXIpzAb3aOARxsC2G56f/XqCU2yGMs7NyG2huWbNdN1JWsY xpclOdlpvZu977nV+ey/
+  vjCbeRWw644OeCMeuMU1LZpXUyXUaoke1m59eB9TULGaZTLJDIY2kfJH GOBkH9KsW2nwskZkn
+  8tZIi4BP3mB4/AV5ztGN9vxPYp07U+fl+e6foxxt44Y7m3hguUkeUMUkfJQ D7yn86pysn2ZY0
+  2sm3ggdw3StMhRCnmXQllizuYA4Oefx9KgaQKqzC1ISZc4OOcnGR6AH9amEn1/ r7yqClF+/dJ
+  bX/4IkbCOe5SaNoUaQMofqBnn9KdcRRhVS3vIZ0dtyRqp3DBqWG1Z7g26ROAhMcnm HJDt/hir
+  C2lmtr5UxaN1kwWz+QqJTipXKqOmqi017KzX9fMyY5JItzqsqSyTfNubgHnK49T2qdLC Z75o/
+  KcquUAAGV2jp+HetARRRlEuNsaBC0bHtzxn1I9aoXSXcCQkM6IhaOVgf9YzcnH6VUajb93Q Kc
+  p0pXste/6alo+QLCOOC6UOpG5mBwM/1NPtxE5lMit5MV0kYKNg57UyO032FqwiZ1TdgL1ODzk9
+  8fpTpd0V2LqFGW3Me5Q3Ic4xn8DWWjukxQhOrTkqctXfdobPdXIubl1LCUXB8tQM7lI+bA9OlN
+  gQ vBgAh1mX5Tz8uM5PtxSCCK50yCaORmuIyqRop5zz19STz9BVh/OsQXiCh5lBfK5OQcZHsc0
+  9EuVb m1Kh7vJ7ql6b+r7F+Nbi41WKQMxWWIzvsOArAYIP86ovGZLWFEdJCrRh37A9vzqSNY44
+  5LjModJF hChsde35VcNoq6vMbe0n2Rt5TEtkMSRj8RXPzKL/AK/rqcdVRUpS5tvS1/1KUpeyu
+  yLcGbe7Z74P /wBfNbUy202gBEXaXdXjQH5sAgH86yJYb2wV38vlZdh3DOxs4Cn3INXY72eG8u
+  FdoGaORYV+ToG/ z+dRUi5JSjrb8S3S5oxmkm12/UqTacvn3X2iYv8AvWYIpweB15plrF51t5K
+  M9u0jCZTM24v6sPYY 5q1LcGaSaORhJGjlXCDBBPyqCf1qhJPqfkJbJCryoTHKQnOTyNvoMdq1
+  i5yjZs6I1JWSlq/w/wAi pJBKwlVJBJhhIze3QCh42guy8wZZWUqxBxtbGT/hTZYHHm+ZIseJA
+  oUn+8Pl/LmtNU+xOIgyzMbZ pGLc5YHtmt5Tsl1O6eIaS5NfJ9f0sZ6xyywRP88Q2qPLz90dCx
+  /GpJY8vFbBg/kxhCyj7xJzxx3F IuoTDMgjX5Gx0zjcclT71bSaI3SGSJ5ZDKCY1O1gV6H6c0p
+  Oad2jnnOtGSlOndLVa9flYpKftF4E UNHC2CyA8kdCwOOgrZP2y0nKQSJPHEjCNgPvA/eaoolH
+  9qecAsK7hjI/hwcj86jkWGSBHlEySu2A Q/ypkYAP161jKXM0un3i5ozq6r3X87f18x7yyT6dJ
+  P8APGhQqi7uQuRmtWG6jjtXlR3ZhIDMNxON y8/TFZsyvYwxqtxGfs4MWCvXuDj9KjjSaWSONf
+  3jyxSSlV4C4HQ/SspQjKPkdMXGVNc2iTeu34WN CyDfbE8ueKdI7faqheQTnGc9TQ2o3NvJyVe
+  FU+UEfxH/AArIgSTfZyEOiOo3Nnjdnj/CpXmtE8xL mKcPJligbBjOc4P1qnRi5a6m8nQdVqKU
+  o2XTX8CXD3jW80sLzgR+WqxnbuOSQ49h0qC6n8prmJRv 81g+7HA9f/rVZN9eRNE9vD5cQVsbl
+  BwT1qv9pVFtpHmguyImXCJjGDwDnv8A4VUVK+qFOrONT3o8 3az/AKRTgvIxdsXBEewqrE/dUD
+  gH60eXNN5TwvHc4wr7V+6cdDS20PmyvEGgjRW34K9R1Y/QCpFu YY4XELBVBJVQOSc8HP0rd6P
+  3VqYShOVW1Na9nt+S/MSOdfsxhnaM7ZVdV2YLHPX8K0poyUkaYBv3 oRGXjI75/GqqzPvmmkjg
+  lRZUCzKoAX0B/Oo2e7acLHmSSFWDei/XNYyjd6aHLLDSjV9yKsvMfOYD BOwifzFbYwJ5XjnPv
+  UVn5n2CadEcohAiOeCpzkfnV20t02r5sggjnchRIc+YMYz+dKYfsf7h0e4D KC5jOApXp+FL2k
+  UuVGk8VFRcEua3m/8AhiB7G4uGt55LS7CheTu6nufoPSnyQTiITRyB/wB2+zaT gjcAPzodVkn
+  MdxfGNXDSSDJ+V+m3jpx2oQWbWlsod32QjIVyNuW6H370Xlp/kKMKianKPytp+JGI 0uJriJoJ
+  UeNkVgGwN3/1qrhHt4UTyGdJXDsx5Abv+FWJIrtpXhhglUxSBBzySfU9zT3tmguJUnlM NzGxG
+  1+ijAzke1UpdL/I2s2/ea9N7fdr+BC93JLFBJ5EbLFCyA7BkE0QiOSGPcnl8rIHHADDoPp7 Va
+  kM0wjQRo+JMII1xuU9G9wMc1Qe5khnYh4nzvIULkegFOOqskHKnDljDX5/1+BKJIJZDhZJpZ0M
+  gCHG0joPxqOFQlrEZZraIxtsCyLkgNyW/lSB4Y9OUKcpImFVRhg4PBz2HtV57KFrSBZ8xyMuAM
+  85 B5B/CiTS3Oeoocq5m/69V/kZlvagsY3u4Y5Fk+TKn5gvJNMVDPdIFni8uQfIzDgnnA/pWt/
+  Y9tIF WJLkKX3I2/kDPANE1rJBptzIwV44rkFNgxz7HtzT+sRb0e4lmE3VXK7y87aencdHCEtT
+  E0LtKG38 /eIX/CqcTyvdxzzRtsZQ5PYFsjn61Izz2YBk3G7hLQ5J4Ibkkj2BrRSAzpOks0f2b
+  7pVRg8DK8/h mseblTb6mkW2nKfXrbUpLsZo7Jka2BwJC55YL6Gp7lk8mFIZjEs4MsgZsnOMCr
+  o09pNl07G5GcAx 8csOn14qxHYSpdwiJ4bciMszzpu2kgjb9fSsXWhe9yY1YSd3K/L5/wDDlBY
+  Z5EMsz/Z4QAPMHCo/ YfWopJFYsH2tkEmU8qB0K4+vFb9pbpILVJp4ii2jq/oDnIz7+9ZDrbWt
+  v9r86J0kZXRPRQMAfXPN RGqpSsTUnRrVLNO/TRpf16/cZgR28xoGGwrmONlzgjgjHrUFsY/7N
+  kuJNqyLdRgR4wyZ6j8e1XpV sp51tjMyTPIrK4PGf7v49qfEl8k7JPBGQWbJ8sAZ7fjXVz+7qZ
+  1qXuNSirrdbO3r1BHaW4vGTckS TKrlj91ieAamFmWBhRnm2EqZIzjeq8kj2rOkR7cXEW9UIkB
+  mLDhmA4H1NadtfTJAgkKJbylWJK8s xB4B7D2rKpGSV4nJisNVjS54Ky83+Xcc9pmMsPPAbLJ8
+  5zt7nPpVtLCOK4ciOQxhWIQn7uB/jWDN qL+WI/MHmJMgGD/B/EKtz36Q3HnQrM6P5jBi+R24/
+  nUSpVdF3OCWHxEYqM+o3Z9jVZoE8xvLAfaP vs3BI9uaikSSDT9tk27a5WPzDuKqpA7+pJofU4
+  /tEJnRijQvt2nAG3kVWW7spktWZpOYnaQq2Aec n9a2jCejaOinh5qpFqN/lv5b9CNobiz1CNV
+  8mK7lTKoU546j61dg1NEMSbo5C0LhyE4V88Hn0p01 yktqZhBJ5o5GW6ggZx9KC9v5VswtARty
+  ygANuJ+UE05e8vfWpo6ejq1Y3vp9lbEskkUmlWyR3UT3 L7V3f7p+9+Nab291Lbunn273QmLsE
+  TGOO4+nNc59lmmSRmhdZy4VEHHGecfStbF9BNEjTxSRxrIu FHzEHGGzWNSCVuVmVWF4Rakm09
+  tPxtuiMM8QSQGKVUX5nVcLg5H5YrTtoLY2hQ3UZZXAZM84Xr+h qlC8Zhj80jAAXbjG4A4Y/QG
+  iKAPBcNBcxSqCUBC8t3Y1nU1XY5q9GlK17p9+j8tjbu/LNpJFbziJ GcMN+Tz/AAA+/FZs91cC
+  8t0uvIjmdW3Hy8Yz1/Gie12QIzXAOeAvcn1psTyGYABGZEKjeufcn9Kx pwio9zNYei6Gmthqx
+  piV2Yu7OigIeQDkVjX00sNsypKyyvIrlgxAGO49j6Vsz3Eql3sgiYmViWXI A25C/U1lSi5ur8
+  XEkW1JIWE8W0ZDEcY9MZrqoXveWxjTjUvepJKPbS/3GM6tJPdLCiSThw0WxfzI 9s9qdYi6m1B
+  xcRiJ3bcCUABBBBH41pW9w4s4EneDEEZjDogBfnKnPfNKLiKW3ISeBJHkWSMMOUDD kH6YrslU
+  dmrfM66s+ePJGHz3t9yMq6hiHlGJlA2oIVJ5jXP3W9W96Y6TQ3U8s9p5UXnbAdvABBz+ FX3m0
+  8RP50Es4QbY2jbAZM/epXjmuYJjbRud02/LjI+7/wDWqoza328y+WomubVeen4mbDOFtTEo aS
+  OOZDHGAQxABA/WqEhY3dvAdsPyoR5o3K2CTke1PFjPHpcUhWWJ3XchkP3gOv5npTyInu5XEcoU
+  YMbHoExyPc11pRV2tTR4ai6TdPr89fLZfgWzY2cjG6muI3UxsrpH8pDdmHtisqxjmitlkZ4VZD
+  99 l+V/7px+OPxq3cLHLcwJHMGhZiY0UEHGMDJqrKhjmInSVUQgZDEA4HH50oJ2s3uedChUkn7
+  XV9v+ BomRMn/E4jKTxiZgcRkE7F53A+9Ytu8ciQvHE7jzwgfqI25xnIrTiEswiAbzp9rLiNcE
+  c8A+5qqE tnvIFVGUq3HO0BvU8V207K6ZXs27yjNbbNar+vQ69EfzZYLp1QkhpCeAp5yMe4xVi
+  ya5tdMtQiCN VG4TTKGDDJHH51npzJN5jGSYjDKOCzHPTg9Bip1lkiSKOOTcN6J5bjJ39Mfj1x
+  Xl1INqx7+Nw0ZR Ttp2dkvlrf70X4tPeaGUzMke1xHwuO+cH396jha5SCWMrEVEm1Y9nIBHJHt
+  irV0oIZZ1mSASssrq 2Ar4ABqnpSRrrM0qrJP5J8vy92S+c/N9MVgpNwcmccZynCUpu6jsv+CR
+  LbRxX8TefldpDndyCDgZ PrWhDJG2oIrRmSMMYwndSeASe9JdPY2/2aZVdlH7tOcgqR9/3wahQ
+  tbWyRQ5kKnLS4+8V5yPqDTl JzVy515VlzRur6a2K5Rft4hc8xxYG8ZGz+L8ff2rVMFt5KpEzT
+  7QykhuCeAD+PaqZilvEku4k8mP 7sRPO5cevvVtZLRtJFrLOsCYZgp+8nQqCe5qakr2t8zsrVF
+  OUeWWmzSW36lM3VzDFJGzRl4pkUoF xuGeSPqcVaRAbO4cQSRS5KoHOQxzxgfnUbXVtDBGZDHL
+  NMpaQIOS/wDCR6D2qMzyRQXNuJ1GJV3b 1yV2j/E03FtaKxU6Kk06Ufwf6Fa1NoJVd4J4xjBw+
+  MZ+7+INWrXylupH3M4EmxtxyN204qrc+fKF lDxOFdRIij7wAzxWhYvZrqs2Z0jjdsszAkZZTj
+  FVU+FsiULU5Sjfz3YBGmsxFFGRKoy4bklh3/Kq lrhmPlvOTsBY7+CTnn8K0YI0tIZU+1RyylQ
+  5IJGQvJx9QarxSSSXAmcIttgKsaKASDkdfY4qFLR2 2No3hBqMdPuf/BFFxIsHlqrXYOG9c4HX
+  655zSwm5+02pWEP5sJldccsQfvfQUR+ZNcSolpMm3AVw funHQ8VbAgaye6j8yO4OWUbs4QcEf
+  iOaiTUdLbmNblppQS1l6P8A4Yql2aaOVraRYgmM5A8wHv8A X0NZ6ht8ckU32dZWEhMhJ2gkgZ
+  qxDZJFELh55JogNqKrY+Ugn9M0yRVNtI6sBHHLGiuBkFdvWtYt XsjalSja0Ov3fjdDoLJo3Ju
+  cs+4GIZxuVev9Kp/ZpzPsiLNJtKBGOSB1wfrmrsptiLUO0rJEjRFg /wB71Ye3OKkaWM26xsCY
+  9oLqp+ckcDn3pqc9+4QjiXUb5r/LT/L8iKa1aO4txBG880oO1E7KMbif 6fSnbNt6ELpEspacF
+  uSdowpB9D6VPE98LZpoyEk8xioIyVzxj6E0qRX0EOJo1doMxu5XhQecfmah yfVr+v6Rk+aMru
+  af9ea/IhguS9r5k1zC2844XiNccofc9qpxCB3iaRmuNvEcMZIJHPJ9/wDCtCIx PbbruB2DMPM
+  WIhdj7cAH3pbfy4rRHjtZCIEMZbgnceMf1p8yV7IrDyTbtdv5L/L9B8eoqsTuY1XK kuHAYhxw
+  p+mO1SBVlaO4BaOQx4HOCwK/MfwPNNksLh4YmBhdUQJt2ffIGfzNOlsmlljPlTRYjJkB fgEnh
+  R+FZN0+jsdsoUo2Stfv/Vv1Ik02OBY5ILpZYo/unJwSejfT0pLxmaWMyQ4LfIjEffPQn8Kl W1
+  thPKheSSKOVUCq5BGf8K0oEjkmEZUYRmMbE/d9vqTSlVcXzPU6lUnQleyb726fLr6mCtrMyqsQ
+  eU8MNp4BHX9KtpaRSWTGJlbegJA7Ed/xFbHmmSENGyW8jlclxnkA46etVZZCqzg3EH3FZgq4Mb
+  Lx il7ectNjSOIqVpXpzSt5P8d/zMtkkRI4/IZnijCFl43buao2sSTamsbQecPLO9F6lgD0rqk
+  W2mtA 0kolU4VVj4OV6knuBWBMr7A0A2mSTcSBhk7Ek+hrSlV5rrY4qVf2kpQuvx3/AD/L1Egh
+  zo0weRYw XXMZHzFiM7voKkja1SBPKLzuRhirdTmrtvb2cd5cySyM3ly7FGeNnf8AHnrUdxDap
+  GVs9ysMxg7s 8kZFT7ROVtTGEoqpy6272svw1IkPm3O7y28hXEUS55TOf1pz3rxXS+aUAGWOR9
+  5upH5VFbxyR2qP JMjE7QmB1ycZpJLCaO/YFhiIFCjDJJxwPrVe45WZvHkm3GaWv9biPKsN3I0
+  USSR5OI3AZjkZ3fQC po2m+TMSyW7EPHsXBZQPvA+grQ0+1EdxELi1fyXXMsh7seQo9Owqw1tG
+  JriQxyRuJgjjOAoK/dA7 VjOtFO1jCq4RnyqOvfT9HuVoLW7ju8bTPskUbh3Pb+dPniie9Jt5Y
+  3O10eRzuBHUfj1qS1g1VILw wzRySLPGxbZwxx1HtWc6Bb9JJLmORRG0aCMYABPGfc+tZq8pt3
+  +70MvZSlVclJJ22V7/AD6DLd2n v2mbKR4WIdssehHsMVWubX7E3mN5cx3FmOMhW6FTn6062Js
+  J4mgcMUXZKrDIVycg1PYRwPqEg1CK dwiFDhsDPr9ea6m+VuXT8zun7WLdSWqS7a/iVZl86UeV
+  EwjbcoYDAUgYqxbRytZ28iyLIDEVbIyQ xOB+NbEVrZ2sNvHCZFghDIzu+4OzHO76Crwi8nS4V
+  YxgSHzCVXAADYK/WuWeJVkkjzp43nSjb/P7 ys8LQso3llBEaheoJYYH1zTJGnk1G8hRUbdMpY
+  be685HtxViaS0MkqxOZo/MX5VbB3bsq2fSmXZE TXEiONwlIRh2HXJ9ec1zxb67/wDDHGkoSs3
+  q9romhMEs8clx5LSujOflGMMcAY9T2qL7MhWGAjaV gKMo4IZgc596lgaRdUW5uBHIkgDKqJjH
+  GPy5rQjTzLhUMkYDDCjHzEDOTmspTcXoJy9nJyh0676/ cUxMILRIYInQLtyXwQWA4P4c1TSdn
+  uZlvsw/MH3dAxAPT2reW9AXHkp5DBWUlR05GTWRc284ijkK faFjxG5jGPmB6fiDSpyV2mrXNa
+  Lgm+aOr/r+tTLgk8/U3CuIVnj3srf3iDwPapFht0RYmQzyZTcB 068ED0HeqlwCJhOrxxkxsEX
+  HKDODmtSE+QUJuIEcQsWZlz05/rXbU0Sa/qx7mKpS5VKOqatbX8dD NvYkF+QRGJWJkV1GAxXj
+  j0z2q5bWtzC0zTl/KaYNGp+9gDJ59s1dxc3tspXyc5CBwn8JGWA9+ODU +IntAsjOojhIOW+5u
+  HAPvWUqz5eU86opOHJHfr1+4zZk09beViVaMMI3JOS5bgOPpmufuIpEkFrb q89tAyJKQejD3r
+  pryWb+yUeIQyyFMyAJwxGOnpxXNrLfy226J02GRdwVeTzjmujC3te/3sinBql7 z083/wAAr3q
+  LNJA0YVNx3NIPUnCj9Kr3UTK6W6brkmRzII+MHjcPalNptsRERJ56SFZELZJJbqPQ YotYHi1f
+  E2YmCPh26Adya71ZLR7XM1ShUp817OOvX/h/wEaCGKFraOGZ388s6k7iowMYx2NU4rgQ X6FoR
+  sUsNu3p8v8ALmrhCSQtEiyxyFQDK0hOG6lTxRDp10IZ5FgZQrAAyDPXqPrirjKKi+ZmkaEY 0+
+  Wa19df8v1FsxbmCBmdxJIFI+bgbc7l+pqxIheyjiEgLIMiQdAo5Off0qC0tJFnxBPC7biEGM8H
+  gHp9abIJbYykMrEOEx6gL1+lQ0nPRm1PDSlP3anvdE7/AOQsZ/cxXKzu2Y933iCoJwc1ofaobP
+  TG kjkaR7h96MxyNq8HHsc1TMN6lmit5UhZy8qqmCAOgHoO9KhLwnzot6rGAAF4+Y/LgenHPrU
+  SSlq9 UZKjOrK+um+yv5FqbUvKMvm27FpLhREQQMKACTTrO+ZLy4le1kjJfDLkYGec/wAqz53k
+  dJFmgYkY AYcckZqeAieNPOlVQz49MBeGB9zxSlSgoaowxFKnTu59e2/4HUrMJLWUSeXI8kgMJ
+  UdVC4JHtWRd XHkRRRxlmJj25zzu6Dn8zWBc7AxigklZ41P2dt/ATGSD6k1fS2mGirctMAc7lR
+  uSuR3/ADrCOHjC zb3POU4UeV8y1e1v8i5hcRRAkSpGomdj8rYOCR6VkXEzwaxJJ9oBO5kEXOe
+  V4oK3f9ns81xHOIX2 yGJcbjj19OlVwjw2dtJPIszOm4qB83Odx/DiumnTSb1uY02nPnWt9LXu
+  EyW6WFgziaGRbfy5AzE4 cZPb61bszbyaX5kxEUrsj72+78vBwPyoSa3TS2McJuYVkTzi3zb27
+  EZ6D2qCKySa7bbLHKMsXSMY J56j2q27xak2v6/rc7aNKUqbjUbVu35f8PoX7+8SeKZIkU2yvh
+  3QDqcHA9KLGV5IZZ5C4tyQwI7F eMceo5q1cxzGxePfBsZg2FTB7Y/E4qaGT7FZ3LXSKsTT5ZA
+  uNu7jH4Cubmj7O0V/WhrUajh+SENP W/3eZi3TtLaLNENivbFo0bnCg4/rmqE1shgQXE6IgdeB
+  wSMYrduWG2BbOBpPJ3QM55Vh1Ax71gTw PNPapPN5anBG7sD/AIdK6qErrt+YkvaUbN2t56/dr
+  +YnmpDHIyPDlWZYjt+4meR9c1VJkltfnEig HcxxnlakuIooNyAhgh27gcjcecVSkhlSOWRUkC
+  LN5ZQnkMR3rrhGO5FfDUaLjOc4y9dikHmEbCNA 0gl3NlR3GT+tRiUDaTbuzseCGwE9AfXip1J
+  YyseGBAPbIHBH1qooMbqgyoeYAE89sYrsVjilNU0k r8t32t8kdUlsVuoTFIrsVMgwSSCp4z7V
+  rLJd7fNktlU+YJTlRyQfmI9MVNGIYZVkluLfzIFZBIq4 VgecY9TniqjLci3h8y5iTbuEAI+8u
+  fmz647140p871Or2sK1W84Kz6vS/wB3+RrjbdXL3AIOSef4 BuPcepHQ1mTR/ZEEkUiiV14I6A
+  c8mnGd2sWZZY0CzqsZUYyjHv8A0pzzXCNeQmBrmB5cK6DoD2H4 1jCLT8jehDVtPTte35kqzQX
+  GlqLgxyRYUKFXBHOP1pkd1DaxxIwM7S7nB7Haxz+B6VVd9Si0+YS2 pikZ/nwoAU/T8qkdYY5P
+  MmXIVGTav8DZBCn3NPkXXbyMuSHKnJ6Xen/DbEs89y/lSIvlJIG3KBxu x0Hpjj86gjtjbT2kV
+  yBI6RO0idw/UqffpVNbuGW5SZkkdBjzQrdJD938u9aE8SmCKaVi/l7gxHVn zgNn0yelaOLhaL
+  0Npy5XGHL6f1djkXT8xyurhpommyTxnH8gaqbrIyQId8L7P3nmtnJ681cgtylk rzj513QyA9m
+  J4x6Ais+aeaeaWHy0iRiWO5Bk9Mc/hRDWTs9vM2oSUnzRbSXX+ty3Pp7SqsxVzIso jmVCOWPO
+  R6ACoBZzRSLcW+4mKfayOufM54K+2KlijvWe6ltyZMlgWB43Y5wPX0psEdzdaLApdonY EgN1I
+  U9aalJLWSsYutPmSdVcr6FgzzedGtzayMLdtrquAy5Ock+gFWpbotcyLA0LpEJN4Vfv4+bc PQ
+  Cqcs7z2NwVkUtJMrbMfNntzWmjKkJk3RGV2Ln5OhPG0/XmsJxSSbRdWlTjFT3v0u1+g2W5uJ7M
+  +eq2cciBmlIAVm4wRjt2/GsqQSR3LIgkdWbEqqeYx6VekkkUvHLPAkQO2NWTqfUe2eKpWN3Mmb
+  kj lNsUgYZwxyOfenTi1FtImkmqbjHTy/4O5enjJZ45InMaodgQ42AkZU+pqaC2jjm2CN2gydk
+  TEEhT 0z+NZzieHUVXLeWu5CzfxIR1+ue9ajR3I05fLXdK7AiMctEq8EN6+tRO6SV9zplSbik9
+  O3b79RiI 091ZRmHASB1AI68/MTSzwwErLaRSxXEKlnWQ5BLDjj9auLcTW86yybIpnZkJdchi3
+  TA7ZrR+1JHY sWWMTMMsuAMkYCiueVWSaaRlKq1OL5fknb7+5k2EktqC0xTy3ljxuHscD+tRTX
+  d08hjSNsl0EvHD FuSfyrQkiZ70htsbZLbSPvFeQw9h0rHnE0kUEsQa2kYiYmQ/eG7g/QVUOWc
+  rtDTjOUpWV+/b9S1e 2rnT5vtUUkSrJ+67ZQYzn1PvVV3IsZBHG7xKwOFPOAQeT61YlZ/LnLah
+  FLILjLA52gDoMe5p6wRz 2Db5lilcgynsrD+H6mqjKyXN+peFa5V7V6X81+DLVvHFDdTXCOVDh
+  xtds8tjBH0pzXsLWht5JoVu o8KzEYDH+8PbFTzuscSQMgcxp1AwAvGQfU+9VGa3m1a6FsiCNp
+  N29hnA24Fc8fe1ZpTpSm+aSbt9 35CNawy6a5jcKZpRJI+eFI4K/U0lrFFDujTeu5SGLN/Gen6
+  UsM/kwKqWsv2lwHZnOUGD8xxVu7jR 1JVJJELFS0ZwNxI5/pVuT+F7Hou7ioN2+f6f8H5EFvCp
+  W2XzQsW0Nk99ucVaWN5pJDJCiGRlO8qM L8pyD6msiWXy2ZYZAkkZA2NyV7MPrVyOWZfPLMSIp
+  ECj0OO9KcJPUzqwrOL2+4pzz2tvIVKSIykK hDYByOf8aRgrDG4FdodGUcNtHH5mtNprI7S0Ik
+  kdPMjPXCg4OfU1H5cCXieQVEKIwjY8hkB4P5mq VTTZnEppL4NvPcrxNehIpZXt4WX92WaPhj1
+  z/SoGs70xx3KyxS4AyEX7rBsAH3NWJnuY7xZCnmoI 3RgBwG4yfwFSRqbgHdDLBChKMd+A/fIp
+  8zjroOFWUW2rfd+BTdCxuJLf5JxcFIg/TB4PHsc1OGuI IQ1yBNtc5KjmQgfKwPpTzaW7Lvkkd
+  pXBkYK2CGX0/PFNvINwaVp/KcltwOSFJHTAo5lJpHVGPtOW Mne/lr6dyT7QPsCXE1vPGZXRkZ
+  m+UBe+KmeSO43TAMZCxdQD9854bHpnis37ZdR2Sh4lmIdCrhfk K9CMe5qSVriWNo2spIY/NVV
+  wRkDOSKHSs/8AghUw8IRTqaa9/wBN/wATShvN9rcK6skr3AcDONoz jafcnpVRUabUlSeAr958
+  jgAZ+Zfr3HpUEccaXL/aIp4l3n5WfkAg4P4VU+yqpRFuDCxUMA75Jx94 frmiNOKvZi+r05J8r
+  aXn+mv5izI04k27VgKAmQD7zZ+U/j0odbopbSy3lujPCxddmDt3YYdOvvUr xRpZKFl8obtrK5
+  z8x+6PwrTginuojJdQlvIfYuBjjow+prR1FFX6HVGr+6TWy6dfxLtoQ8c8X2eT 7OkyeSx9O4P
+  qfeprmNpLxljjkjWM7cOchQT90+5I602SZ4QzbGti6kFW/hHcmrlu9r5EihyAWDBm OThTwf61
+  5km0+ZI82cb+9GNr+v8AwSsjW7xKrPGyhz5aIMMFByQfU+h7VBHpc8eru0dxHLZyOZEB GTtUe
+  vv/AErQC3GLmQJEYmkykioMHI5xUNtdS24hi8yJkRSACvKg+tSpySfKcSlVgpcuvf8A4HZ/ Iz
+  3sofNtpGlYxmDLqGOck4XHpWqQ8MUv2dhIS5IBGSoA6VmNcSPJKlvbmWEbTkAdc9KlN1eTSNLH
+  H5cu04GODu4PFaTjN2uzqrUas3FSlp6qxpwSvI4Wd4drRMyoqYPHU/TNF2sc9rCXmEbOvmSkHA
+  3q OMCoYpDECJ4jE8b+XHuPJTbV+Kc3S26SCPCxkAhcY9j7nFcsouL5lscqoTTvHZHNCKMooME
+  ql2LO XIO1gM49quNaQTWSTw/61lO5Sc85A/KpL+5jgjiT7LNcJMPMZozjcemR7Y4pbeGO2mmd
+  ILhTFMUj DyZGGGTn8a6nKXKpHe4SVPnWj/P8b/gEsSy21xAW8opdGPepwDwCuKx3EFpcPDNI6
+  CYhiznofT8q 1kHnRndIibdo6cZHc1HJN9uecS+SUaQFDtGFGOR9cinSk1p0NMLGFNuC1XXXVG
+  UjTzvPBaspjiKq X25Bb2qi9p5UYt0mCxKrHaoOTg7uv6VrhJoZWeFQ2VLsij72Bzj6ViPE8ln
+  5aiTMLADD8vH1Jrsp yu9NEOrDnqe7FL03+exERCZVu1czcFGjB5y3IJ+hqfylluXdgyxRYTzT
+  yGJ5J+lQ2lpH5zXMtzGk RdQuc/Nuzg/hSSSxQ3JktbpWicFgCchmXjj866Hq7RZHs4qbhGV2+
+  rv/AF+ZJILf7SjxSLKm1o3d eiEDof8Aa96iS4nuZbdSxiTYAE/vAn5vxz3q3BePFgxRRu543b
+  fllJOCwHpiohcyGVEW2zFuCJtA znnHNSr9UDpTjFxdr921+H/DlGCxVbi6E0rwx27vlsnnnGK
+  c88aSRTiHzI1j2qpGdxI7+pAqw0N0 IpYxbSZZjLIzHIBTsfrUbpujhuVjK+Y6FUx93J+Wtea7
+  u2b/AFeDSd/x0/r5kSNBLbRx/Z7rzEQq H8zO7v3FSxzTK9qIpYtz25Z0KZbIGdv5cita68spc
+  KIDGiSq0kx4USDgL7fSpY7ONIZLiUokxLsr Y+Xb04H6Vi68bar9Tjq4hNezcbLp1/H/ACOUMk
+  LF0McksKjEJDc7cZyT3piQGGO2mjk/cmPzJmxk K5zgfiK2IraBr6KQvHHaNAAueoPZT7ms9ra
+  K1tJo23AvMHkjLcgg/d/CuqNWL0RTdNz9lDVf1tcv wS21vZtLIY8TyLhyPuqO361QnfL2Yhcl
+  fIkJzyCVOB/Om3TRXcSBW3K8YCp6MTx/I1SVolZISxQC N1aUscHBzwO1KnS+11PIjl6hLmb6/
+  wBdmagF3KgiSMQxMS0e5c547/Ssk3l4t5AMQSBLchMx5BBH NaNtcJ9lZ3nWSE4MajIOAefzrO
+  iWWK4SR4XKgMoyc/N/hz0q6Ss2mkY4WlBVXF2t06a/PU1bCVfs QlaSJi0iK7BPlj/ugj1P9K1
+  ZYIbi4SNJovNicmIxjb5qLyT7jPrWJBNFFZkeZG7W7hCQuAQPUdzz 1rpDOv2bzYZYJFiKoSq8
+  juR+NcuITUrouvRlF7t32v8A52KsmosWeQwqULBlPGNp6j61UWSG5SdJ pUw5fqc8Yzj68VOLy
+  T7S7xpDGrqzr5iZDJ3I9MHg0wWc19bQrcyQRzCMsDGu3GDkqfU4xUxUYrXQ 6aapQa5vdfe//A
+  /UZAtumnyyW7MqvIsgBbOzj7p9zUEtrbzxu2HkllK7kDcqWPT24zUsL28jQlIJ STGfM+bhSTk
+  DHrxVi7zbTlkhIjfDD5uQFP8A9c1fM1PTccm1L3b3/MxbpbizkzDHHIj3BJUqDtbG Bn+dUpIJ
+  YLaWQyorMweTcM/MOnY8nrWkZJbWZZfNRhjzkjcZJAJH8jVR57O709AxaAq2JWz94kHa foK6o
+  OStpocEsP7KSm43T3dr/gc9crbgL8yKwQDk9fr7mqgjWBZlIyBNk4PtzjjiraqstpLK6bTH KA
+  QcEk9M9OlV1imS7BWFikZy4c/qa9WLsmrl4qUXeUUrLa17/wDAOhS3idrkROWiVxtYEkYx9PWr
+  X76ZImeVJV2NIVHDe/bip5kWSKFrGSKS3ZGxtTOecdxTzb21rpjSeaY7xNqKrHOVyNxxXmOpdL
+  v/ AEj2VOM6NN21u/Pv5XXqT/Z4r3S4HRXiR2yuT1wMAfnTIEjWRPtNpd206Sqkm+T5ckHAx65
+  rVilS a5dFjK2aTO7ODgZHQD0HtWJqCi5htsSMJJdshwenYA+/vXJTk5Plei/I8K85N05PS+//
+  AAb/AJml HLMk91ujIlR9knmjI3EZHHtVFoVluoVkP7lwfPfP3ZAMqPxqovlSPKDK9xlT5SKfm
+  LN6+uKvwyQW liqG1uHR49wkL4Dkdx+NaOHJtuegsBOLUqT956WVv1ZVaW28i38qLY+3bMM9WP
+  U/hxTGtpDFKEn2 Iku0yMcqVxk8fWpzfxNaR+TAsOSnzNzkscGnPLK32y3NnO7gtsVT/D0JP0q
+  1zJ7EUlUhO0rr5jJm uLZpJAj3KSyqUYH5Qdveqtuw3Ol+6KisAQPvMcEjB7dKfarC58ss8LjD
+  RSO+VwMgnHua0T5uIoo7 ZZJYsDO0cHHOfU9vxoclHTr9xq26TcW/efy/HYLWZrlZhBiLePMVs
+  cLkfMD6nikiGYo7gMDH5REc SnDEHjP5k1HFfvLeQSyRi0gVDHtK/wB8kfpTbuxmmkhCo7xJhE
+  MZxwO9ZctpWehjFxpNptL+u/8A wRIbG6MqxG1mhEaFXY/xMORV7SxdW0EqSRF98yy+WR8xJBy
+  QfQelJDPMFkR4pogTtDs+QST1/lVK ZRbXFtLcSSblRl++QGcHkfkaG5TvF/1+JT/2jSdr9P6u
+  aEnzTQ7UCyJC8RmZco2DuLY/SqSQKsfm WQaSVnJXccjGe47kc06K5dZhcX0TvG5DeWnGMcMPy
+  waksJY5dQwgEEQlLgscjOCFH09qVpRi/L7j aFOvCLVk4rd9PTq2W4kuPtL74SY3wVfHAIOAP8
+  afLcXsQe4VPNLviUovRs4A9qtQzvDb2gkIklEB 2qB1HJb8fenpqdrJFbspCRSr5nPYqcCuVyl
+  e/Lf+v+AU61Tm5uXTyJD54M6ytC3lybfucqQQSfwz RPLK80uQgWONozIVGCx5zj6Uyb7MZLlo
+  JDKJL1fM+bOHHQfjVq5vHgtC/wBncu7FipUcnpWPVWWv 3DpzfMmrO/TRW+8pvJE+nRvKHcfZ8
+  4DbWfoAQewqhNNcxDy4YTIF+UbhnIzyw9h3qaS6uy7pGIuQ BsMeTgc8ela0cSzzM5jc5YlwP7
+  uM8egz1rS6p6tXHUgqfxK9+n9aBaWVv5k7GLzlUlUcdJVB+Vx9 ecVcT7Mt0ITblRJHuweoxnm
+  pEgRYbe4wzDyP3m1sB+eCPQe1WDPFJamKKFt/mNnJyRnGPwrgnUcn 3PLnV5p3SuVv9FaCAvE5
+  +T52zkEnnH9Kom3RXXZbyKBGfMjBG5DnOD9KsraSnWopI5VEPll2BHCl e31q39pkkmW5ZFMTK
+  wIC9WPb8TTUuV+67nVGXsp2i2/M5mC2aW+mwWI3bkTPO3vWza27PNOyzKFM 65UjO4kdR7AVY8
+  6B7u0aTbDstnjePock8k/Sr08scWnOPNgMaDYsqDAYsBz+PQVVWvOVlbc66let Oy2v3X5abmN
+  NCdrPMiXAlPm5iXBCrwxPt3pqxzM8pBjWJ5FBbb98spwR+lIryqsizXturyEMkeOY x0Kmo4Hu
+  ZvLjjZRIqcKRnvyPqAK0s7FTjUS7tddkhs2ltBpA+0TIo8xVQnIPbP4UwRLE26FWuIw2 GZTxk
+  HgfjUbSPNeQFXaZvL3pk5UYORkGnia7hiWVpYHdgIwipw248vWiU7avUuMJxjac1d/L9P1L hJ
+  DpI0J80Psk5+UsevH0qA3EM4ZEtppoQwSNo3xjjv6mrsYSUtCt1DJIkiqzgcO2cAj8MiojLEru
+  LNDglh6hecY+uM1imr2tqYuUIVLPf56GRskMikSBlBRDgc4P3m+lW5IofPWNLa4uY5d8keHyCA
+  cL +dF2YUQhd8RiiKKCfugjjPqafGzC2i8wNskw0YU4yE9Pqa6HJtJ/1/XU76kuSKneze3T8v8
+  AMy4I HjkmsGhneUKTjd90jt/WiyEkK7r5njVxvJYnHcZ/lTb67vWuDdeQ8UUoYqcgHAAB5+tW
+  bcSJbtdS zQsPLKiNhk5BFdEnLku+v5ndOpJ0730fTe79dbfcLFfLIzSxhXjT5UDc/eHU+vNVj
+  cSmfa0lvMI1 2nan8RHBHHTtSKY7uSeGYpA7EkMi7VA69B6GrL2MCWMsjh0MjAvLu+VSeSMe+O
+  Km1OL1WpjH2EZJ TXvPyX/A/AzUWzaxjlh3mdm3bGbOzPAU8dfetlPMjs1DXCgRnbK2ThzwQR/
+  KjTbRYZWmdR5ckqSJ nogAPyn3FRy2NwLxXhmAKYJLDKvzzx9DSqVIyly3HXrqS9k3dLW7tf0v
+  5fMvvtvrq6kmnVVSTZGT 0Klen51Zt43kntRNGwLxlpQBjaQpB/AHH51lzSWa/wDLUSyqGEZQ4
+  G0EZB9W9DWnAtvA8k0XnhGy V3Pu9MD/ABrkqK0fyPOxMWqVrvXb19ehBsd47Yq0hRYQow2Bub
+  jNPQl7x4nXyGVRtZ+c461LcP5d vKDHJGuVeJ88bVOSPeny6fmae9SUSjcVDA8epI9qjnVtTOD
+  hHSW729fkTzf6FaFlCFuhIHTnJX64 70W4jw0pwskThGTPIJ6H8jSP5aWocXMUgB29M7icfNz2
+  p7wbtQQgNcbFIdYuCGHTPrxzWKempnCE akL7W666+WqJhMSssZ2OQ6lGPPANSPKRbuPMiHmfO
+  WC42lT938azYS0gQnbEDAWkdhw2T1FXH+w/ YZD5hKyN50eG+8FHy4+pqZQSZ1SioOLStf8Ar0
+  K017KJPO8geVEAhXH3R1xVhVluWX7RGwjdgz4O CpXufYcZrGaRRbiZriL5tplXHQt1P4VoQXs
+  sUyxxEeVENg387s9K1nSaj7qKrUajheO/4f5El3Dt VHBG9Q0bleFZ2xgj+VZPkJbm4nud+2OQ
+  RuqsRt68fU1dlmil3iSKaF3YSmTf8oAGNuPU+tVry9jF k0qrneA0isc4f0+taUudJR7jpzlC0
+  Hd839b3IDdwR2iraXC+YWG4P8xGRyPyqvEbeJ4zI4RPn2lu SVIwaagt7qEGK3kSSRW3ZP8Aqy
+  TkZ/n9KpRXzs8CPEt4FQjfEMAnJOefpXVGlo7fMyq4eN2438+9 vUW53w2UfmhZYQyD5FwVOOh
+  9+lVbtPPs9oEcLRO3mLjld3JrWVpZURoYtxjDFiVyuT2x6nt6U5Ve ZSssAgUx/vC4+9Ifu1pC
+  py2b6f1sFCm5csnDZ91+Wv4FO0lkP2VXgLb38zCjBYA4wPTHepLu2kij gMsn7ndIHK8YPUH8e
+  gqMTC1dI5UfzfNUO3/PItzj8qY0t3Hqn2lIpJYd4yjcg844p8rcrrQ2UHOq 27Ra1t39GyeOcm
+  2lHzI4uN7BznjHSrEt9bHTohKoDbQItoxxnk/h0qa6aKG4LDYYEYxbx2PUZ9fe sc3MDCRZGjd
+  5JF8jAwGx1I9s9qiMVPWw4uEoqXLZL8zQdI557p0JCGZQqs3bb/MUskz2LGUt50Yj 2FevIxx+
+  tRRPFdGVlina53kgxnClj0IHpxUM7XE0GZrWR5SNshU4G8cjj3AoUbuz2FKLqe7KVl2/ pjEu7
+  c3XmpbTJlsIHbKsDxkD2NYz2TmeYtdR/upk80nPLHIJ+ladzZRTzI0YkjGd+C33EH8P1PrV SS
+  BHtZ3Ln95IHIzjO3Oa66TivhZxR5HUcU3d6bf53IpbB1uYYUBlUgHzE4A2nj8+aoKlu08quJEh
+  MxdVJ5GOhz6Gr/2KYQLMPPMTAMpD9CORz6YrMuMpcyTtufcu4lRwpbtXTSfNpzGcaaqzbdS6Xb
+  Rk DLEsyqN0rvtKqnGWJ/kOla1zqEaSToskasrOrgjq2BjH+e1YQh3XrEllKOwVc4YbR8p/E1a
+  eKSaB ZWCsWctK5GAGx0rapCLauY1pxqVouT08/wCtSxZvBJd2ql0KgFWXH+szncTV1PNKyeQ2
+  2MREyoeS GHGfyrIitXe8hd5UiD5ZXxhffFXY2FrGro/zAb2JORJ82Dj2rOpFX0dzedOTk2nfT
+  b+tP1OgWT/i UZbaJFJjDkcRAkZQ+57U37JCHRI7o70jZGXeST3H6Zo+8t/JJGTbNciJE78/xf
+  nirEXltHKsIC3O 5TtbrgAg/n1rzrtbHBR0jyp63e2y9W0Urf7SQscEDKe4YZyOoNF7Yl5PlMx
+  hRVZZA/AHX9e1axVZ obHZPH81u0jEcEkfKD9MdqghQG4Ehv7cRFSAMZBwNuKSrO/MtDojimov
+  m/BfqYd3HFFdrcRuHiki YZf5s5xjHtUVppsrW0bQTWzlSSVCfe54P4VpzW9tcae9ujDeg3I2e
+  EC9Aapz+abBIVYBpR58hiO0 oRyV9s10xqPlST18zgxbVSmrXu9/T+vMyXu0uXmkcxQRhXQpsx
+  8x6E/iKyklZZnmEgEj4Vwy5Bz1 NaV6sKziRrZ1idcnkDg9jx1B71nypHJYRSLHIGUlQikbj7n
+  6V6NJRS20YKFKlBK10/JfodK8UElq 6wyOJlYsoUlRjAHSmmOK3voBJvS6nQvG8pBQZ4xjvnmp
+  FW2jluZEY3OHOxIzjC7evv1o+0tJZWbM Ix5UJGxly5HUHNcSb2W3/APUbcY+yp3t0vv8/wDgj
+  jBciM2rEq4bZtBwQBySfXHeljHmyC4Ks6j+ FTjfk8EegB7VKfKnh/1jtO5G1QeSp7/l1ojTTp
+  kSKJblZTGH3+ZwNp6EeprNy01M4RjKDTbv2tt5 7leO5jZoJriKOO5j+Rwq7QGJINXL+xiCQfu
+  p4lUlGLP8vr+HFNheT7agMlvGFVivmx5xu9fUj1q9 JmJGMVwkzW6FW3DIJx1qJzcZqxnKFWlU
+  XItfV/5f5mNcwSWlmiwtDPBvyzBejLyBTS+5JJgksDOn yFnPzBjy30BqxMsdxYqROFgMy/N65
+  HLfSmzSrbPFALZ4oWdkidzkBDjJ/A/zrWMrpLqdtFJRV1eV 9/8ALTVjEV5LgrZKtxNHIVXAyG
+  Xb1H41YRJ2iImtrlZpVBQA/fUHnHvUaJNCzSQQyOJmDxlDjIGf 5HrVxms4LaLzXlW5KsQ5ckL
+  xyuPfPFROTvpr+ZH72FW9PW/rf8HsVknji2IkLRQXLh4Wl5A4OB+d TNpkku1pPNG2LaUV+WOM
+  7h7DvTIHeS1SV7dzBkLGpxlM/dJPsev1qKWVxdXXnmSBvMEMkjMdqk9T jsP8aWvN7un4mNOb5
+  2ua3fS//BIY3ubuztrfyZHZoWmQr/EVPX6DHNSyxOGEs9tJciU+d8hwMjg4 9BTJT5AFta7yYV
+  MW4HkEkHH86da29691GtuGh+R4nMnIUsen171b0V9EjWtRhThzSklH539X1RXc i41S282KWNm
+  fIUtwTjnj04rahtrIW7SSwyxRJOGbEmMjHB+maptZXH2qO3hbNwsR/fNysijhmHpU TxXVtEoE
+  c1zBIygOG+VQDgZ/Opm1OyUrEyp05zT52vJP8f61NcLHBYxRQM0beUwfzTuKv1xn6Vbh UCyt4
+  /s3nTGAhGQAKQei49TT9gF0yNxcrIFkJHEjjqwHYAcVPPNGixi2t5S4Qyrls7AOgPvXnym3 ZI
+  1dRNxhCN7df8+5UNusskccLranIEofna2MDPv71PJbX9sSrJ9sXaQAg5C45bmkE/2lIPIZEO8j
+  btyQgOSSe5689q0rkiJLnEFzK81wJoiH6xgcge1RKclJImNZKdlq/P8ARsWxs/tItjHGViWHy3
+  kb uwPyjPvXQWunTRzKzRs+IWLIvWIgcq3qcHNWbQRCVLiCVIkGY0BGQQ38WPY55qaEiHEby+e
+  w+UFC RkdyfWvIrYmUmzzMbj5Oo4rbtZmb8jWcSRQMsbIrKzHO7HIx7VOkAmWSVmiEm8A7RjKk
+  8/4UkxtV sA2HTceDu4UHinXSmYmJZo3hDEsYhgnAGOai76aEwckk07fL+v0GSR2ttdTPIrJbq
+  pC5bqvr+vNV AlqYQouYWCgcgdxnJ/rUpWEW6y3SycKQkecce/8AOqRikayUzyQ7eMKi7TKAeW
+  B9K1grrVnXCPNr KTv3/wAt9fmVWgjlulmKtMoXbD5Zx5ikE7v05qpLdwtHG8bKWmgEkkY7t0y
+  PQD0rRt1s3uTvuDkb hEVYgHGaq3AspLm0El1axRtCdyqMEljkYPpkdK64SXNZp6HRCvFN8zbt
+  6/1+RmKYpWCHKMw2+Y/Q DNWJLSJLhHt5wylJPMKk8be31NQrLIbtX2KiKv8ApBYZCzHoPb6e9
+  ayXcxiJuFhWODdHIQgGGYdD W1SU4tWLq4mtTa5Ze6+l3/X4mNbllTdEolmli85IQPmAX39B3r
+  TTyzbNdSyQJCZBIGK99vAH41Ri vrWOGJmjaFzHtyT90McYNS3rF9IurePbI0UwChR0A5A/GnN
+  SlKzVh+0nWnGLjp3f/DWNKSSBHtnt kVSYnMuRnbJkEA+9c7LdzvqLRbNiDIdlGMs2MVPdS3U1
+  kB9imYyHO2PghiOW+g71KksNskSzTRNM snlv/wBNGYfeHpkdKdOCgr2uzeKjSjdLmf32K/8AZ
+  m7U0Ed0paNvLlDZbkHvTZmSOW7V5N/lyHy9 v8ORlR+dXLW5Es/kraTlMA4Vvm3DI5PepBOss0
+  YjeAyLCQYyuW57n3xzVOc+b3tbG9T2/teaetku 2n3f15nOzsGjh86YMnkgTqB9yQcge2atW5d
+  pJPNVZGbcz4XhG6Yx71VdbaNykkcjR7Fw4PDHPytV a6kuBEQJBIZZczsgxsJ5H0yK7VDmSS/r
+  +v8AI6qlLnSSW/loWIzNHqJ2wGOMxHzN3Pl+x9yeadvm VY4btWMUICMc8FuWH4ntS3n2iF5Xt
+  juLzEqMZyu0ZP4UtpPGIkjvJY95ZDAccMncn1PvQ7tcyX+Y qk5L94o3W3mrFkjcYE+2Rwqw3r
+  GwOSMZakvZE+wLIkrPsXaWV+BuIIH1xmrS3cRnjMUSFER9pwCT u7D8OazJZbCKyYW0oeR1IjD
+  cgLjv754zWNNNyV0zPD0n7SN4vXorfj1RPbJFNqiyFCsETPGiHqAw 4z6mty2sc2v2eAtNswy4
+  J5VRkj6msA3jtpaRRQP9pRhuUdcFeSfpVmKaeyty32pIs/KuQSX28hhj tg4NTWp1GtHYmthcR
+  J6aNuyTV/yNCJctcrIkquVLDzGyAD7VMZWOivbPcwxokiguQcOeuR7VSGo3 E1lFODEkyREOpX
+  +8ePy71NLeyyQwwBrc+c5ZW8vggCsJU5XV1/SM5UZtxbVrP8fmhyJPsYRlZZnQ sPl+UnOOBWm
+  rSxyTysrsqvh0XggheTWa0837mfckcaRNhQvLBiMVXlCxz3iolzJL5n7tRJ95QvJ/ M1Dg5bly
+  oycXG6Sfb/M2J5IDY2j7WMZhdWRTgglhg/TFZsdzG7/Z0Xc0LbAfUPzx9MVFDNdyafIk 15av8
+  6gFUxwetVJLuK2uCgdBKpKSP/tbTkfUVdOha63ZFPDxUOTVy+f9Mv3cy29rEWaCaRxtjVVx lS
+  Rk8+lQ3c5js5oyvy+ZmCQHG+IEEsPoaxnhiFnBPHeASBBhXJJx6j9aZDe3YuUjhQ3LDOwlcgIP
+  Ue9dMcNomtbfI0WEcEpJN27ppFm4u9QDgxbPlOCSuQSev5dajeW+NySINyZVJSRkEZxkVHNKUn
+  ka WGVYGLgNu4JIGPxzUFpBcRFC8u6dkYFM/c55B9z2rdQSjeyOmc3Gm5NJX7f5pluVVW9lSW9
+  S3jjk ZIgVOcDkZx19KjkK+UrmaKIgESEJwHOCBj6VTa7K3EMXlIUCfMsq7jke/wBOKszzpc2i
+  iXbbAOzy REfMxXoM+pFVySTVzmk5qUVKL+VvyaL9rLEhWZYpzFMTKxD8DA4B/DmonKzhV81ow
+  ULIxbhj2/Md KwBeh3jyWWIRsAo7Z9cVde33WzSrcoYUKqNvcgcfzpvD8ru3Zm8KPLJOctXt1/
+  ployKlt5nkTIZH BMjtlY8cBT6sfWozvkgaSAkSmQgJnOwD5Sp9z1zSERGSzHnfNtj3J1yDnKn
+  /AGj2NTbYrbVCZCwb DeWOnGO/qQTnNLb1Oec5xk1zNW/ru2KLq7j1CO3kUJbxKxl3LnJXpz69
+  Kr3ZkS7t5YIQ7EBmXbwp H8HtU0rl7WFVJDxoVaU8qWHr9etTKXWwgxLHGOfNaQZw/b86Sai07
+  A6iSulZy0tr+lyzZpm+keSG W2mlckZbAVQOePY1SVIoLiKeQzGMx71ctlW4NWR9rNgkp+aSWQ
+  TFwOEwPmX8ahlkQ2wQxyIrI24u 2QpzlR7VlG/M/PQ5YSnKTUldS00/4JRk2/YfMS6XmMKUYnO
+  abb28jwWrNPHejawW3hPzEfxdqc8g WGJnUGT742jhR2BHqRmpJlu/sYLIsXmHMRjXaVx2/Gum
+  7tY0rKrLljJJLpzW/TVfeijbxzPcJaZk gRUfaHyfcCqSR+feO9427LLuVBjIPf8ADFW1t1Qkp
+  cExfKZctzkjgA9uajuZJEt5YJAg2kCQFeck DC5roi9dOovYTm3GLS032t5ruZpk2agZIysqI5
+  8wj+LnsaS6jl+yvMsqxQs4XY5OX78fSpIYmkae IzRQqCMswIAI6DP51AiRlBGHMs/mFozngdu
+  hrp0T9DmxKUPdWr6v+tCS4kYmyWORXYKWCqMbue38 6sCRTpxcTRyTEkyYHA5xgenrVaRvLuFO
+  1WAUJuC8Zx0+tOjjWR1jlkS1cgMA3Yj1pOKshQpRp8s+ ezWun+a/yNpLactG9pL5yR7lcjoWx
+  xx6/wCFbKb5Iw8vyXQAPyjHTr+lchBJKJZwJFjZiX9MgdD/ AFrRg1OOGGAtKX2hg8hP3nPQj2
+  HpXFWoze2py42VZNe957a/MkDpPBFvv7dEKFIwoPILdP61cgtJ bdblYrqCRIpFiHy5+90NZNq
+  VnhdECl1faJAOCO5A9hWr5klhbpOgEqJ+7wf4snhj6nHSlVTXur7t DpqYia5Y3u+istya6S4h
+  uJIIjGY0QgELyWQDjPuaw5lultvlcCbzQsh28JuXhTWq2pG8SVLUqzRz FI8jqrcA/hg1hNNIy
+  l4b2CaKI4AUHLkHntRQhPqtTzpRlN++kpf18iCeRxbrHNbSkhRGxLdz0OPp WSscsUJaUvEQAO
+  mMcnj6966S7ufOhVZbZ1kSQkkHGQCOPqKwl2/bY/OLtCGLvHnk7T/9evQoSfLs JSbV+W1ul7/
+  dZnTNeNFbzKluqBZgWyvP+zz6ZzUzXl3EZHkaBi2cBYxxhgM9OlPuILq3PlWuyfzX V5AV3E7T
+  x/OrOWnlMV1ZOJtkjuVwNhB4Brz24WTsmvxO6nUpQs4QvHu7N/dYoSTiRproJlWlYAqc BvlwC
+  PQe1W7KSWOKNTPaW7RgQMkiZbkZzn3qNXtLWeASq0YaFlkLHKrJgkcf0pVFxENNkhCSzqg8 9C
+  ufMGeo+lTKzjawSq3hpv6f5k5trmCCI3SiS3SIq4UYYMTlVJ9apmK8DqL0eSGQxsQuOpzg/wC1
+  itIkuJiyyMokJJ3cSFRww9u2KYriW6HmyJmJVKKe27hgfU1EakrHbhq1SVJpfr+C7+ZS+y2jzz
+  /Z pGa383aELdFI4P50XKQpaRBVcDzfLAdsjkjj61ZkjhuLF2bFuMt5YPGUUjB/GpLSzmVXKXd
+  pHhw6 iRMjAHT61TqWV29iKtSUaampu/8AX9bGfHebrgxIDIomC8H/AGuMflV+5lFrqsTAQfZ9
+  hDiVd2/J +8PQZqjdtb3Ea4i2Y3LG6KAJAT19znimxRQPdRLdPJBbDCLFK3zg+59iPyqnGL1a+
+  RlUnT9m5TXy 6l26kIt5S6mTMhwsfy4KAY/Dn9Kz1xc2yKjCOUxESLLyGJIy34fnS3ZjEc6rIZ
+  WlYPIQeFJI/wAK fHbbyfsuN2HQhuSpyDg04JRhcKMKdPDqUtLvT/gq2w24triSC0bG4lmMmwY
+  MhHHFWLWKMX8qXCXE McUy/MZMbDgkbv5VVNtqNvbRtLudFfIC9cdx9TWtJcTXFlKgVI3aQCRS
+  vzO4GQ4/2QO1TOT5bJ3X f5hTs6Tho0+q6fn+Rbwz7rqBiwdhtQHDE4wCPRR3Hesclor17e6lY
+  pEpRsNgNkZU/hUTRPa2L7pD LEZsIQxAIPP61baGCS9SRrqG1x/BMCSejDP1NRGKj1ujehTVKi
+  6knfpp5en+RHAL2c2+JhPkFW2A 7sHhjn2rZjuXs794IrW4DJKGVnbIwOpPtjtSabBDLJLMZ0d
+  pJgz+WdoBHOAPT2rZM3kKZLsxxq6E oxXJA6nPrziuWvWTly2uc7xidRwUbp7b3v6LcoXzSyvu
+  tzEkqnZGqr/A2PzPfNbCQusUJuIZv3YZ XkLfKp4AOPSs2RJrmzhbg74S5KDBBBBI/lWpDIjrZ
+  ySCXzZo3Yqz5BI6ce1cdV+4l2v/AF+ZtWqR 9lBJdXtv8/8AhjchV7e0iRNqiMlWZhnacZwaUs
+  32i3DK5LwuGkXgZ7H6VB5T3Jji83ZuIwSevHU1 qOYIwY9rI4BIDH7hIHJ9h/WvLbs/M8rSMny
+  u79CnbQw3CwbW2ybD9/kA+mPWpt9qrojq4DIZDhsH J4FV4TCb4EMZMHcGXjtwKfI+6RGCjzNm
+  WyM4A7USu3qQ8M3O8l+NipaBJJYi+XdI2JBOeQDz9Kbc CCaCJF3uJ4TchlOAAABge2avwm2ba
+  pV03LyxPXNUL0R201vFFHJEOdjPyAgH8s1alep5ik4Kr1uZ MMNs7uQdkisNvPG053Gsm+2iJl
+  FjcSSkB7eRWGAg6j61o3UN1FDHPbzwgxPHHuZMg7vX6Zrnr2S5 knMRt7hzbuYo5I3wFHUqfUm
+  vVw8OaV0z1aVPmqJ328/+G/MezQeZcl5hHvl2xqxwWyAA34VKY4Ss gSSaeRkIWNZOZFAxn3Oe
+  c1VeaRlt5tsUMMhxh1yVBGAM+oq/9hhiiWKKC5M7hN0m8fIwPK/1P1rp k+VK7N6mJcY+9Udvl
+  /wH912YTxQp5dsjyRfu8yLI2SzAcEe3t71bt7jVPskKRRrMWPmSAL82BzV5 NPsY7tzFvlAZzE
+  5bOAex9cnpTo7M3F48ipM67P3hjbblm9PbtVyrQa1/E7KTjVpvW6Wuv9Ir3N5e nT55HcRbrg7
+  WxjAwOntUomhvrJ3MLN8xMu3jL8BcelTNbuLefbNCJBMPvrkNxyAPyq6ZIksWa4tZ Cjy4Pl4X
+  aeOPqOKxcopKyHQdKnytxW/R2/D/AIJSVL0pPH50UUyFTKoTlcct+XeiXYtpcNBPDeP9 oBzCu
+  0le34A1ckslkW8uFuCG83ZKcn5sjjHpVBfszaYvlH7ZuTa6wHaykEYpKSlqvyN6kaU7TSe+ 1v
+  zf/BMp7l2ZCQqqI5I5BjqScZHsDT7UyyaUImjMilt7FcAkL8tWWaKW/eNDDEFQhXddyk5BNaIk
+  Z55YkeJEO5lkC8bSMhfrXROVopWOuvg5WjHlt1/4bb82ZVnbWkNva25lmKMkjuWk+6SeM1cY2t
+  vJ bhZYXuVRvlIzjjj+tWo44IUiZ9sJWHGJOcfWnC4tLnTZVKpcZUHMQwxAOKwlNt31aOL6s9I
+  3fL/X l+phxahJmOQRoFVc4C/eOeSPapkurZp43lFs5ZWCgRj92PQ/U9KW9dxO0Nv5SBZEEa4z
+  letTXTXD q5MMIlEu8ARhcjv+VbtRdtLXOmWEp3Vla/oVbeKK3vspI12PIcuqNyNo4qHLJZW2Z
+  o5IjGu4Hkrk jI6dauXCEkTQARylW3EdtoHB+tWYy7i2nmmtWUl96rFgYI6/hQ6ltdxTxnsVzL
+  3umu+nbQozFRP5 CwSiMtu3bzztH3enc+9RLcyQPFdXGxp5l3sgGAOcDA7Ag4+tTCVmW9uIyAk
+  ZEa7udw/vCoDBMzQz KyS7omH1PqB6CrSj9o1UKUvebsn66mo95b3GnNFsks13lSJD9zJ4U+9U
+  Li2eOxMyieLy28pizZJG ck1Tfz3t4g0DhRuG89HJHWlW3mYuIZfN+UERHJyD+nFEKShsycLQk
+  knGdopu63X3/wCZZ85/s58p WKvIuQOoyeB+VV5rKb7YZXhkjZZywRuScEZzV1rfzLGdVtp7aS
+  OT+Ju4HyilslmUu80wxIoMu/kr Ic7R/wDWpKpZNomcpcjkpK35kN4Ynu3+zxqdoKy8fKWzkAD
+  sKqo0RDeZvtJScE5OBxnGBWtcRySF EaAzziEtOIgV3MtZEu0DYCIzNiY7xnHHNVSacbGkJNwU
+  NYrq9391/wA0WYXuHhiijMcjIoA3LkZJ ycjvVhLWV7QR+Yq3CFwXPTg96o/ZX3maDe8Xlneqn
+  5iD0IqOWOSG2th5joDAXkVmJJyfvfShxTfu s8+vh0q0ZU/h9F+P/BQyWKKDy4/OWSeYbSpwQT
+  jqOOlUXiuIxEzxtDuGQHGenWtT7Cjo0rFmiDKE cH7q5xj61WvYTFfqJGJXy3CIWySO9dFOor2
+  vc2dSU1yOrdLo/wBGU5FMke7yEy2Wyi4BPXjj0q2b HzLT7XGXSFkZgm77uOn41LBaXEcW1yLh
+  iFK+WMcdhVwQNLa2xt0ljlEJhCO2Qx3HPH0zUzrWtZnN KrGEocsklfW7v99zDmgkRIudkkij5
+  Ccscen4VLHHJjO8SERs8Z6/JnB/OrVxZRqrRs5meINgjPX/ APVTrG2tklijIfa0JIJbqcHd+G
+  KuVVclzrrynGl7WesfSxBCyy2DkoyoB+5Qnk5P6mtQWUV1b2TW rneEIcFsjcTwf51Xdke1DR7
+  PLVAFA6/L1Oakyy20zRo1u0rBuT0GPvD0ArCbb1WhhONSdOEovlV9 P+CiFI5YrxYyzyuoDqgY
+  /dU85+tNMspke8iZZirmJQBlSCOuParUVs0aoySiNVh2O7jOT1BB7Crm l2s728s1zA0ZNwGQb
+  cZC5zUTqxinJkYiqlK8mn36X/Az0s5fPgYSJJCIXjOOrEdDTjAJtJjledky N7ZY/K68Bf8AGr
+  Lia/ZER08txuEqDCqc/d+vGKz47e7lmkS4heIOCyjphicD9KFJvVuzRwztOfvS St+RkYJExI+
+  8CWAOPmHQ/Spr0rLpY8weY7Yw68BwMfN9B0q08KxQxpG6MxXLA88/wj8cGql9HOsc DiLYjuzs
+  uOIyB8qn9eK7FNSkjoxOIpzUPXt/wCO2kaC4fy/LZgjbWIyGz/Fisvyyk8RdigjHQjBb vitq3
+  eb7RGSkNvmNkMjr8vzdO3aqlzHi6toHcOIoz5jr0c47foK1hK0noYctJtpU7d3e7/y+5me2 Gd
+  S2A75YA+vYVMd0YlKxsZAWBJ5wMDI+oqJ4gm0eW8cQbcN/LD2zjnipXWUopiZtpGVXGSFzk545
+  rdu9ipSc2o29F3II7hpNNWRVUMoCEEc4Jxk1ahGx3DvCPKk2hSuc+/4VTZ7hRbCEoEU5YLH97B
+  z6 e9PRJGkcDLbe/qDzQ46M58PSqzvSl8tv8jQNw22NBH5MRjZ2XHJyMf8A16FuLeK1iAlaVlK
+  sNxO1 yO/sMcYrMaHyzCil2HIXqTgj+vNLBFLhEdssdwVyhC9Pu8jrUOlCxDp007S0t0v/AMM/
+  uRpxXUUc MhiURL9xR1Lbjy34VD+5O6CCPyZTIIyWOQxPcflVR40WLdMjxSGQbEJxlRye3rUQz
+  O0g2NGjOZWy cnIHBz6UKkt1/X+ZhUoJtSp38u33atl/UY2F3taC4G1Ww27jkDBNNhndrUySRR
+  25B2EPHk4POfxq oEu2AnLGVGiJEnOMHqPrmrMMUd0lsJJGjRQURievPQ+9DSUEn0OWrKmoJz+
+  9f8E6UxXE3l7bedoo Ytow2GLlsg/QVNCJtt4tzOvmtdRsXAwAuPm/Cp/PaZYVEMqp5Z3OrYG4
+  N7e1XJbaJrFgQxdSowDz IMckewrx5VLaNf1c2q16Sdp6Lytp+hmtBFc3F7AoMkTzMysOvAGBQ
+  v2iK1Vtiyl90nAwV2/0NF3b CJZJRcK1uJsEJkEKRj9etMtEktLW4lcPOgk8uJgeCh/qau946P
+  8Ar+rFqKqJO910TWj+b2JPtZgW 3lLqsc0bSlWXO8njK+gHpStcQtbyOQFdJApI4LKAAW+maGK
+  TRM4TyYgrIyyc43dh6VWNjcCKOYwT LE6AYJ+/2BH9aIqHXRnRTjh1G7XK3+I9s3F55iSI0RBw
+  gHQHj9DSQx3dtYBQ2wAgNuGTG2eAT7jm pWiVdNVYg29JgiAHkqTwPc5zzWlFKsOoSQzxO/mMz
+  uc/xDp+VTKpZaL+kEsReKainbo7GMtpIyTm R0PlyKvTGQOQR7VFciS4lYW0BSNW3NK/ONw4Br
+  d+zQX7xzoZCZox8itjBIwB+VVFO3S9szxrBEBG iDhmBOOT3Poaca93fqbOvGpO6d5Lps16W3+
+  ZV+yeZJEv2CdyYyqMrAAjPBPr606KL7NfSzStl4Hz IRwCcenv2rWtdPEVn/rzAys+0OxO0AYG
+  fpnmsxnKpJi6t7oIEEjKuQzE4FKNXnuk9PmTShHERlfV duv46Ed1IL21jMKzRSlfkQv91Sec+
+  uAKvxQwCNwjklgWiycliThWB9B3FV5UmRprdpIpFJLkIuGX aMbc++aUxI3kq04Bh3KQDjaxxg
+  H8KUrcqSehM6UYQjGKsr/1qPkVlsV88xvIG+RwvyFc4JA/l6Vn K0kdxLJHcW0zF8RnZn5AOv5
+  fyqNvtMbIRHI8Rk+6ecqOv6mtC7aJrSKWKMwSJLznkMuMHj9K0UeX Te50wpSppQjeSl9xHLbk
+  WqZmMhAOHh+UMBgk/jV6CeXUbeaO2uIQN4ctKmQSOoGc4Bx0qOwDzqkM 3yQkboF7gLk7Se5NJ
+  FaOz27xK8McsGWI6Bycjp9Kyk1qpbo1pzpRTjUa5lt/ka0dzcW+l3Ml2wLz TiTKrgRZxiP6mt
+  VbyZYonkEKeXmNFKcjJ4B+tYqW7pbK0sivMXHynoDnOCPUVqPb5uLpnmVZPMCz AjgucEMPQAV
+  w1YwbIlhFOC1vr2NNHZoFa5ilTZlTtON7Zzx+FTvcNJ5hjOzfIo3OM/Ke/wCFMAkT Jdh94EKe
+  oPTH1q1LHILci6XY7ZI2jHAIHFec2rnAk1Llf4f5Nk8sFjPaMWYjDARbGI3ds/nUcUip qEIR1
+  /1LLIWGdrZ6H8KUbftJhgjM0ZZCSO2OlRSyY1DzY0CiQFkz/wAtE6Eisopv3SIPSVOW3mST Qp
+  NIB5ylSMDbkHJ+6ao6pc2lvpUYnmywATGeQ+4YFMlu7qJbiDMWxv3ocJjaF4xXOajOGtZTc28z
+  FZVWPBweO/vg11YfDuU1d6BDCSUlzPT+vQdPcSyambWK4hDh2ZlK+nP6npWXqbCNEkAkjuJYsl
+  85 UKfvZH973plyrTtJFbRskrMm9mPPXrn071HsL3jQteW7qp8v5kJ3qf4h7V69Kmo2fY9CjRV
+  NuprZ bq2vrdfqadnHC1pbOZBcBg2xR3Cjj8upqKNorS682ZLqOB5QzSOxI3c4/A1lCO8SaOKF
+  gsRxJESP 4AeT9McGtC7R73KJBLNC77wUOMeg/Kh0/e1ejMYYHnquMp3Uvlp+RaE4lkjlALIpO
+  FXghugz9OtM mj8qAyMJhsmVXkSTCuCOmPfPFMjt5Q0TXFrPFFP2VsF2z1B7DpWhb2dsk0xlt7
+  gMAymKR+hH9fSo coQPXpLD0tnt26/NP9Bkd3FcXC/ZoHGwFULHIx7+p4PNVo3luY5gbG5a0mv
+  FcuDjbt64NXVhSyWW 4t4mcB1Aj79OT+RNOmeWOCOa3jeG1JLxs3IKkYH61Cav7q+/7zsjGLl7
+  iTvs3vf8wNvEJsySPty2 3BwHXru/A1nTW1ta2VvLHvjZ0LNh+M9h9TWxG9vskSW4jJU5KnqpC
+  5C/iahYWz2StOrRuQSu88Ed ScexpQnJNbipynGcd7X/AK8yOGFpIbQ23kRz+UUdXQEq56Z49K
+  rPZyQSSz3cbsiKqkRnG5/4fwqe SK6WxthCyuoIMkyDhH9D9at/vCtyslrPKfNPmANx04FPnce
+  v9XNqdWcNJWcX9/36Ff7d/aMqI6xx Ha4nDJnLHjj0HFNWzhs7a3fyZplERiIjfGSx6/hmpbZL
+  f7GrGNuSiZXgknIzVhp0s9UcypIY1RlT PIYAcmocrPlgtOxhKUVJxpJ+hlXFjaNZNEs2y4jkA
+  XLHI+v1pk1sJGH2i1u3kTduCuBuyOo9s1YX zJ0haaCUwsyGIjALjPJz6dKgiW4bVnZSY1eQzO
+  JDncBwAPTJNbRlJLfYHOUYtb8uu/4aFk6cIo/k LQsQQpc5BzjNZ0rRkqr4uWCEEQnbgnp+gpz
+  zyxXxDzeQ0S+WEk5yxOc/hVW6uSZZJfL2TedtMqj5 VOOBj3rSnCd9XcIKUXy1Hfqv+C9x0890
+  LIOFjhSVWcIUGSOBTIZQIWnSVZOARCv3s+o9sVOJbkWp a4jWCWP+KRMhezKR61ltcWjxOkI3l
+  2+RhxtQdsetbQjeNrfcOKiocj0T6rVP+vvNW0uGOXcZw+UX HDKf4h7VSniura/iMMqyuh2r5Q
+  655GRiq0RlvrjMeLeJAUXPYYxj61K5uI7a3jvE3iL/AFbr8u4A 8/0pqHLLp6GdKmqc7Rad+mn
+  6lqS5eCIqm9Z/OIfec5J5B/KofNEeoQXdxKHBRjtUYBJ4H4gc1CJR 9rldv9YV83cem4f05qae
+  9lURxrai5TecPtBCjjFPktolua4mCp+4o6Pf/h+xctLi485jHukVv9WB 1I6daoPGkljcmV1W4
+  dlZFIOVA/xqSGWyaISeY0MiuqMNx46+nvUM4uCqS7oJnRwsgROq/wD1+lKC tPsZ0ptVG7NL5K
+  /zehfhaWOAXqlXckiRVHHIwuB29asQWt6tslwjQzPFGsWGTPzMT+lQTLd3d0Y1 hMMsbkwxqMf
+  u9vcdyPWtQXUwt7dIEUJIhlcgc5BAX8u9c1SUkla2p59R1U+aMVq9U7PT/IhW2P2O WCS2mLx3
+  CK2DjJHJ/DNNkFzJDPdYt4WSRY0MkYPyH7xq/JBcurJ5ojmy2+T+FiMEn8R09KrKUl32 7N5kY
+  K4wedzdF+tYxm3qRGnOMG1bzVtv0Bbq5jKIYEmiThVjQBip5Xn1qvIkLWUN1tktVwNqueRz jd
+  +BPNaW4HV5tP8ALbfEjh8dcheCKzLiS7fQ1iUwlJY1kjhKfvCF4PPoDzRBaq2hn9Wipxjbl792
+  n96+9L1Mq5EVru8yZLptjJhDjuM/jzVKRo2ztjltyIyAWbPTA7CtWYJNLa+SVknjhbY2PlZj7d
+  yR mqK2zz3rIwChFIOD3xx+dejSmrXZ6mBr0uWUZy+Hpf8ANbFhPLngi+0yI7mItiJduARjB9y
+  cVHm0 t9Mtfs63DTq3lyo752ueRx6Y7U6GMtEv2sqilMxKowSAc/0qKXbPMbyaQQeajOIuc5PG
+  cAfjSS1t fQ5Hg4ydoS07a6/gX7v99by3ShirLkBTgY9R+VRxXBh8u6inJEh2APyEyfun3NZst
+  5NFDH5U6yDf ukbb8o4+7j3qAyXLmIACNkBYqVwFx1z7jrTjQbjZ7GijWlScJfj1Ld5DLNOjQw
+  zR4J3Kp/j9MD0H Wm7oRAkrPNFPGpHzvkE9j9M1JYSlQ1yrgySEsqHnPBGfw71EsKC6j8qaNZl
+  gK7XUkEEdfQ1Sdvdf Q56dSq4OLWi8nr5PfQqWgh8xEnma4d4z5jJwEY5wOR1prsoji8xAHKAY
+  6FCTwD71opFFZwRtJLEW GSQqcleq/wD66wiEvLyWSeQRsvzI3bHpj16Yrem+aTfQywmIxKlKS
+  b5f72qfyJyRb24QRPK8bkTf NkcjPSq2+MW0iKj+VIysjM2T8vUZ/GhomEy7ZlmcHJRM5bA69O
+  g71JCY2aS3kPEkm9SOMe341tZJ XM1FRnOa+etvwK89074aJkFukwBjYbmORyM055fMkSOVUIi
+  JBKttBU9v0qwqqmpxFoluJGjO9FAG DzyffHNRm1EUfnTwyiAnCKGwX4659BxmnzQ0Oe2G5k38
+  kna/4lKJRNI5iljK5wWJ4XP8PTrTBFho ZGE7gMcBWwpI7HjmtRYZora4jUW48pwrIke0u7dDU
+  OEtmiWVHklti0b7ThXB6kD15xVe17GUqtSS tKN/JP8AXT9SsYrhhHEyPnaNmFx8uc5+nvUQjZ
+  ZJHaKRDuyqsfu5NaE92ViEETboADs7sAeSCfao Y4ITbs84mCK642MAWHeqU3a7R0bU+aUfkv6
+  RQnVLvUINs3kRQlgTIxPHpx3rQEMDoLhJVMCtkr3y ein+dVldBcylFDJvLAMoOSO/0pI5YpXi
+  neKRlX/WbDtDHJ5pyUraHD7OpG9uutl/Wn3sluJIhZok Uu/BBTbwozyRj606NHmvpTHZy7PMC
+  yIpGUB7fWnWEjW2n3Ea+RLiUOPMjDYAppdUu47i78xi+XUx nYGJ7cdajVXS/r8jKNOpGjJJW+
+  e/l/wzOus7MJp0ixeZIxw2N2c7W5I+g6094SmomeKO5Z5cyQLv yNgGCMfjUtlfMdyOm0ySAEg
+  YwRk4q5JeSyzK3lqfMR3aNBgxkAjb7fhXiTnUU3dBPFTVZwcLrvff 8TMgVQkRW3uJo3UEgtkf
+  72D2FLDFcG6SVpo48IymNh95ugOOmMc1FC1wLHTGETRNFblgG5yc4H4Y qUGVbUywXEE+2WMBA
+  uTjNaSvqd8ZVG37y107/wDDF17aRNPYD5jHLHGXPRuOWqjZ4F6Uk86YEAjD /Ko54+uOaciP/w
+  AJOss8jtAyOxKkhVODwaWFbC1tLAQ+chlx5ckj5HOQT74zU7Raet/6/Q5atWUF yuV79uhKkd3
+  DY4DoEaPzPNZcjjgfzojSN5Lee6V43+6zbsAuQRinmS2geO3aVihVgYyclcj/AB5q m9kiWFqs
+  cdwU8wOCzk5H8X45NJa76XNIu6UZOz7liwSYR+T8wuQVBUdQQcEfXFab2rpGXkEca4yy uuSpz
+  gfzzVd5UmuoYoYpPtETFpCD1Yj730xmoJrqYwRea4QIyhdw6oTzn1PpWUlOUr7FShN1NF+r Jp
+  p3j84SsjvGGWRlGAC2B09+tZkkVrEGRZ42iwpi29SByM+vNaBhvjqaNGiz2sm4ZC5x2GfpUaW8
+  1u4t5/JjWKMIJ2ThiOeK0g4xWjO2lRp0k0nr6r8inOQs0ki3CCTC+aSONwPI/GrD31o09y80DO
+  BI AXj4AJGQD78Yqd7WO5lXzHQs0ZZ9gxtIOdp96fmHy41Elqm8MQGT7xxwf8KfNFpXX9f0jpl
+  UozUV JO/zX4lL7SbnSwY1VZjggY+6CckH3GM07yppEl/d+aZW8yNsfKB3OPSpbO4MUojiaDbI
+  A6ErnAHH 8+Knm1HyVuEmAkmjuFAEY24GOR+FD5lK0UQo1qErU43e+u5Xgto7j7T5k4VlZY9y8
+  cdTj69KsJdP taG2lWN3kEr71z5RXov4+1QEW7SuIHKTbTkseGwMjj3qSWayfSYEMiJclFM+OC
+  xJz+lTK8nrr+hb nKrK87y+W3quxNb+fPPubduddxQ9UI/qauJJILyN5FcxFOWz39D74qOGIqZ
+  5/MQr5pVUxyMjufQC rd1ZgWg3b9kUgSMqeCMZJNc85x5rEPGUvhlK99Lf5GiRJFEHO8RxsIyz
+  HPLEc/hT5biYWz+a+6Np C59QAfX0rBgRZFZVeUxqwBLOcepH196vXepNDYZihKo8wLhgCYicf
+  Kf51zOi+ZLc5IR1Vtdf61LI uWEe8kyRvESfLOCrA8DPvQ1zcvaxSJJHFLsZY2dcqysRkgemeK
+  r3NwEucMyy797L5Y2jAwMfnyKy p75lSBDGxZVXcB/snk+w9qqnR5rNI6KaVVXiti3dXl9BaTe
+  W8IAk2zl484YjhR6Vg3OqXQCRsUUR 7UbcuSSfm/pinRxFtWcPDdSRyKzyrv754qrezRwxsHgb
+  Nwu/LH7pz0r0aNGCaVrs74UKDajKF330 X3EjMY2vLmOZJy7bmRDyoPb8BVZd8k1zHGYSyzHyW
+  VeXXHHNPvmlNkPKeApLlnVV5LDAxn61Xtp5 I7+2id41jcHeuMEBff1rphH3L9f8hKpTnTc73c
+  f62tr+BMHYWsAuG3ThTDGqccnn9D1roEuZEt5g GR8yIr4XuOCR6CuVjn23IaaJg2QSM8hs8H8
+  jWw7izM0VtOl0FOAByQf4s5/Gs69O7SK9hUbUJNWe 2/X7zciYT3TW85aOBJcqSeSo6Ee2aVWt
+  767ZEaWUTK8uxW+Yds5/DNY0d3NJbiLz4IkMTOSV5+U8 Vr2N5i1imgt1ZlQwhlAGd3f8O9cVS
+  lKGqNlhPYvnvbsr9e+xJa3VqscEUayxlIvLZ5GyMnpn9aYt y0dqq3iCZVUoNgwGz90j6d6zry
+  3lS8cqymAMhyv8ZQYGPqTVqG+hEszzrtd3aSNW/hA6j8T0pulG 3NHU9OGHp814av1Kaox0mRn
+  iaB0b5pHOQCOin3NaOnqbiPZclYFQSZDDJOB29BSkrd2cdoqlWkTe M9VwclT6sexq7a2lrKsm
+  Le5Sdd3yGT+A8mlUqrld9wdSMYrm3T+75sq2e7YjGOS7gG1EihOC5x97 PtSzRCKSVkjui7Ocn
+  zPvYxVcLcWgVYklKgBh/vZzU8duLi7tnuZJYTKhlPzkdKUtG5X0DESnTi56 Wfa/5Ji2V3BPMI
+  Zyo3nzC6cKOwH48UOIJLZxIXgUPuxM2SATg/rTJI445MleH2EsvHQ/4moL82ro jSvJI6kRNEh
+  wST3pKMXK6urnH7OCkpRbjf8Ar+rlt4cBjch4LaIeWjbsD5iMkfTp+NZv2WRvOXz/ ACssuS2f
+  kAP3fqeKsPfLaXEttK4CKxYGQ7s4GSP5VHDBazQGdpn8zeCYtxyR3P4VcXKCuzGvOpQe qtf7v
+  +H730KitZSah5kqTTu7F9obG054X3PFVpjE07QpulM8hdwvTPYj2qW5igi1jz/NCwgnao6q D6
+  +vNZ7Yhu9rSiMb0eRWHzAjrz2rrgk9U3sdNS2s03ey8/yBp7pdyPE5hYNnfyckcc/WqSw7ba0d
+  WQlCBIoGCAT09yTWhPHKYJ3U+egnJUqOpPU/SqmJkZQmwNghht6HHGfc9q3g01oRS5J0vaXs/L
+  b5 ixTyQFY0yrSMRhgMBwOn5U15JXaLfDNIWwqEdMHqf0oFpN5ClsfvVEir1OORmpGuStpbRtE
+  2Y4yu fY1Wl7rVlTV7ONm32Vv1uS3VwpupYo4xGjlipI/h45z6cUttJI9kZ3eNwrrGCBwPUH3x
+  UMZZYoXh ULGCysZOS/HQelSxvCmnMu4LKrKGP8Jbk5xUOK5bJGVanOpRUUrR+/8AHUZLCU1MO
+  kTGMneExkbj 0rQF8ZtqzoE2D96AuPmBqratb7fnMpCsEDbuOeoq99h8lk8mRG2IRISMh/8Aa/
+  Cs6jW0txLbklHX +uupYslukl8zaSjLvZmPKkZyP1rQkgMttcJgTbXC7Ivlbpk49qpOk76SjzT
+  o1tlVAQYOWPr+ArQl jdLuY4csx+cqcAHHI+vSuGb9699TKVL3lNNL0/pMtfYJobBLhJ1DFirh
+  8nlsc/QiqzWrjUvK3Kxj VsKg5bA6/hTysUVpBteRnO6VAXJAjyAQfU56HtSCG/uppoXUpIJGU
+  soxhSMkfXgVzxbV22cULwTb ehVMV5aTwlXCMIWR55BnzM85/XFUJIrtQC0TBYSpAPUKOo/Dqf
+  WtcXCo8AkuEEJXEYfnIJ6/nUrg LctJI32gq58x1OFZivAA9/6VqqjT1RFWFnfkun/X9bnOIsc
+  tvJE48uVbhRFKpwoUjJbHoT0rQnlk jlgVogMRMLiRVADknt6YqSWXyNLjhuERhtJfYuCrZG3P
+  tVCETSaw0jW8qouYrhmOVVz0I9Oa2Xva vZXKo4eLhzVFbsuv4W/UzJIXFhiKGeMpIoRpG3bQP
+  vmoY/PjVwqLcxSAyoSmc+4z/CO4roGit/IX zEuA7OFdA+MsOCP8aqXPlKoVIpo4gQjvu4zt4U
+  enp9a6IV76WNKdWHa/9etzHlillZVkaGKNxmRg mBkjOPqccUSpcXNnKRKmPNC4C8gEev4Vdku
+  VuJYoUs5mEcWwLu5B9/cUW81tbARTho9y7gCfvAHj 8a255Jba/IVSLuuZO/bRmR9knc/ZiyyS
+  JOdskXyqNw+7+OOPxq3mYSgQtA1ycsqrH83pz7HrioZ5 Yo5YZYSWjdd2QTkEHjPvV2CVGigaQ
+  iHzLd3DDrkdOfQf1rSpKXKm0YYmPLG3R9H363Kd40kl0luB 5rIrAbR/rF4JH4VSWCVr+OK2KK
+  fKI+cZ9+aleORbRriWbaBKFGTyCw5/Co5TJDcsWzsiOzKnB3AZ 61rBWVkJq9JxhZeWv6/8Agk
+  tLqIK5xbrkKSy53H0zUohQxmGIlZJGeTy2OSMdFz7c1CgmMqmOQ3B CFQoBbGeSPrzTrbZEVkl
+  Ei8mSJMndx0z7Hn64rR3tuYqNorRc62t19VroSuVjsxM7h53OH2nAIYc EenSpnmigEEkEwbYC
+  HVxuCk9OPfmkuUMaedG8UsLhWKMOwPaq5uHfUd8USH5SChQEE54P4ZqEuZX I9i3T5pLRd3+A2
+  6+zo8ioZZxLhwVboF9c/jU8zW0ljcS27FZzeY8p/mYll/lSxp5qzJPPBGkaurD HzBvwHY4rPF
+  qJJYXWVERoy5kOcHtkfjVJJ7vY568Iyak29Oiu0/68iK42SSQQRskrSMDEE4YDGCD U8Zht7i4
+  dYpCY5Qq7myNuDuOP1p0Fi/2xZJIzOIQXPl8EMDwM/rUEjxXOJkV4mE4WQZ4cv3Hp0rW 6fu9D
+  n9qr8s/h8tH+hoW8yNZQIixAxzb5cr97j+XqKylkS2kRoVDJjnI3BOTwQR19Kmc2YnIBkiQ Ag
+  nOdxzgEVItudnkNJD5O8sHxznPTNTFRje/UyhGjScoq+u9+3luQQSzTzRTsUZI8/ukGGc9PSod
+  86XCB1TeBu+5yKsvCrahKWmhgbdljzznkkADtVXyUklt40kMjSDaoxyK1TidTlTo8yUtGtdHb/
+  I7 KZI547YWjkwqMSuD1Zj8vP6VqssEZkbf/pEM8aICezDBB96rGVjbt5NuU3uHRRjlFIJ/HOa
+  v3M8F xePKAoUPuIA+9/tfTH614NSUnZdP+G/4YyVGTgktUZDy3lvEyBoikbrsi25dlB55rUik
+  jCTT3Dww xGQqMLjBPOPqOKcl/G92y5g2RnahKjIVuv1qaeJCdiFCigRxjH3+cg/XrzWc530kr
+  ET1fK4cluv9 aL7jlLm5S7uYYhFNbzSFjIxfgfQf561pWdur2ygyK3l7vLQ9Rg5/+vVtklmgdU
+  SF/MPmsVj5DA4V fx9KuyRoLxpruJg4Zjsj+UISANp9zW1SuuVRWh11Z3UYr7r3f4laOeFGKFo
+  /PJSR3dcgk5zj2Aqv K6vEXjkB/csS+flBBw2BRbxo8Kuq/vQ6DLc9G6Vca1Z5JVCMJHVpI48d
+  FH3gazvGMgoctOreKt5M SGOCCB5oFmuX34wrcnjrVULMQoEDrGQrOz8jr0/GrouEWJhCY7cyg
+  bUc5JOflYe3WoXt1huZpJbp ZgCA0anbkjuPbmlGTTd9zspTVHmc939/+RLHte4QhbgpbP5ZVZ
+  MHJ+YD8qkd3muZmnkiWFrhDFkf e4zx9TxVa2nsYplZ5Tl0aSbLcb/uj9KfLfu11JHB5aiJ9ql
+  lztGOfxFS4S5tEZulJ81S11br/wAE ZPO0VmXWe2WSb94yleVx/CffmpUngkgkhupreLbIGzsw
+  QF6dOxFQu8UsqxMEMbByCR6Y2/map3Uq q15mMTM+C0gHy5A4wPQGrhTUtOp00cPTqxUZNprtb
+  82NvD9rmYwosaTFpom6AAYG3j35qaxsgbjy bpjJ8xbcDyMDkH1NVILtUjt51uIXlj6psyD13c
+  e/9Kn8u8igF7HIGjbaJABz+H1zW8lJR5b2NJTn y8rdl0et2/X/AIIs80iG1Ft5bM0Ls5xnDA/
+  4VDEWkjjnZUe6Y4UqoAC5yVI7nHOatXRaVGgkUK0b 4XYuNw7j8arXFvKliHmuYgQp8tQuCyn7
+  x/DilBqyT3MaTb5eeyu/X77FporWZlkM8kaTuHjw5G0e /v71Y811uZUguhNK0mDzkDHbB71QV
+  7a3sxAtzFlMpIWyfnOMMPRcdqLS2E2ni4hV5JM+XuRuGG77 w+gqXHS72N/rLUZKUrJ6K60/H/
+  M6hZokuZ5GBjbzAjg9M9z7cVkzTTG4bfE00bzqGCfwtjgH3Ip1 iuHZ5SfJeQsrOcjJyqt7ioD
+  BcQIJGuEH2dgrErkEjJJ+uDXNCEYyauYYeb55LnUn/W3/AA5o+RaR MbgmVEyFBd87M8BT7nrW
+  bOBb6nKxbdDHEYyzfxluSRWtJJbixiIuIn8yBiFxn8frXP8AmWsixRMZ ZJJXIR1fhlH17mqoX
+  d27mlGvDmcpN9n/AMC9i1a3cK3ELtdwmMpuYY5JGdoz7is+/cSyF7lHDK6t C2OMY5U+tS3Rs4
+  7SWRFEOZo2jBHVfT9KT7R5UjSXEBmiJdkQf8sznO1vXiuiEUpcyQoxXtPacvNf rez+RWtRFKy
+  DbJ++yevTaOR9TSSSZ1CzxbEMSXKHG4Dvz+tEaXDndbRkRtC24d1YZ49s1C08Spa2 13L5bm3K
+  tJtJ2nsDjn0re15aGtShGad3p+RJC1xNdD7MhdlyGOAck529R37UguDKVdnCSrDhjjGS D396l
+  ikf7T/elUMrRRjaQ2MZpUS0hJN8rJlVAUHG3jofc9Qad0m9DuwmJ5INJbeWvz20FgvYjEkU hS
+  N9gUOVz17VpSanvtTGhWAqVUKV/M/gapR3EEeoRLPaFoSCxAwGjYdMn24p0NvE8p3zwymZfMYI
+  MMp7jPbNZSUL3aO2lXjGV5wemqe5pRW0kgtgk3mykM5wTjAHJ+n9akspLeJgJ7WWQzIph5GfLz
+  zn 1571DCzxLFGiMo3GMHP+rycgH602YyQ3JuJmyrZxt4AxjIHpXO05XTM4znKMrt67Lr+hqwN
+  ZHUyq szNIXkLhuBt6fQZq2Gu4YYrqcrmTKoFGPkP3vxrLfybkrboCrAFlKnoO4P4c04vdy5Mi
+  P9nCnafQ AYx9SK55U0/+CH7ru0/Pf5O5dMd1O8ciypDGqeXECueD3P0x1oiZIJJTOTGXIKSOM
+  hF6EY96qRSx iHbIk8ULKJYSX7AY5+hpbxvJtt3nJcs0m/avB4ABH454qeVt8pz1qslU5H17b/
+  ft95JK0FvctdLI s9s4+RAeSBwKquwhQoDG8sC53EZ3Y5NV7ET/AG2KBIzHald8fm/NgLk5zU8
+  TyOQ0jxtMclDt4ZM/ NxW3Jyuz1/r+rluEVU/eavvf9CvLdQ3YcztDHayMGj3J8z47g+gI5qGF
+  trSMkiyF2ZnYDAVgPu49 6Y9xJdwLGYY0hd8CQKMIP4R7dPxouFke1eNXTz0ONsa4IBHIPqfet
+  1FJcux0xUJRUUku/axXnuVk ESKhMrruK4BPrSpCZ7NwGjSWOVVYyjlmJ4P0x2qaJg9xEqWssj
+  jJj56L/Hn1xUweOGRMGOFGVvsz PyCv94+p96qUuXRI86vWqQl7NW022f8AmV5oJFkaSSaPD58
+  xEJGJM8L0709IEYebHHI0k0pkMW/5 htPAqqxLQTfMzNDKkYPbB6k+p96jYXsWqF7csF8tgoIz
+  jPT86qzatcVSM6q3Sf3J/cWb5MRSbZMS +bhuf4c549BVSR7a51aJVyokzI5J4G0fdqeNp3soy
+  0ZaeBypXH3R2VvUnmqPkSAqpw87/vQiA5AH UdKunGys2PD0Zyp8t7W8/wCtPUlS4ZbpVaEMjp
+  yhAwM9D+FT3FrEqiFGEczOCzNyvTAH49qjsY4L a/cSrLHIM7GdshB3BHer32d5PJjUiVUdR5i
+  nqxBK0VJ8stNDpxVepGom042+4SzUEm3l8s+YwcAD mPYOAfU1ftIzdXjLBHKWUKuc8EfeIx6n
+  FNgWRLyJHjUGFCPNxw4P8X4Go7gSxW8zo5BadTGyErx0 I+tc0nzNruFJybdOT1e39I6BIlJub
+  tQCDL8kJ5wCMdOmRUtzMgmUM6nETngYOeBz+FZCSx/aLcNP 5bksdjE9M4zVzcxtmKOk6LMFDq
+  OoJ5FcLhZ3f9dDmp3Tbldtd9B0U88jLiNFcIyoWXIZepNMaG4Y ySxziNhGq7T/AA56598UrCK
+  e9LDfDJggLu6gHJxU8ySeT58Q8yNiHVR/CvRgfU0XszWUnG/Ilr36 /mZdvZOuoxfb9vlvE7Dj
+  AXb/AI8VoiH91lg7tsbeUOB5mMgflVSZ786nEsSh45EaRl25MfGAtNju Jfs0iwQT+e7jYpbqC
+  OW/LNXNTlZtnJX9p7Vc7V/69BkEjfabXeyBWtyGjcZJJycn6VWNsIz+6Z4A sTKpkbIcdd9WFi
+  e3817WGSdZHBU5zs2jhST65NUDai5kYsLi2JkJIZ84X0raNrt30/roazVOMuZS Vvl+RWllRZP
+  OkjuLkH5nMb4CNtxj696ogyxtCyyrMY1I8vB+b+6/5n9KdsiiDAiQqSXjJfjaOCp9 +nNNWVUn
+  82AEgoIkHXO/rz7Gu+KSR0XpuDcv+A/68rFzy7i6W33lfMRTE5jG3eW/i/DGKjaOOMGT 5WkaN
+  izMMgMo4WqlwsNo+ySdhKn7r5SfvDp+eagtUje1it0huXKE+YQ4O4nPIz09KFD3b30PPhQc bS
+  T930/zewNfK0tsrpDbyCArHlOCfTGOtNAmNrHvVtm5ZFZRgKBwQfr1qOaAbkIUIxUuC2DjA4H6
+  YqRbe9aw3q5YqygAfwg84Pvn9K6LQS0NsRyxaVl6/wBXGxXckKF2jMtqhyAQDuJOFP0qnPbM08
+  qN unkSYybl6Px6fWti4lmuIJYvLWRjJgbFABI5LD2GKxpwGkLhZPNYA/KegPXNOi7u9rM4IYe
+  lNup9 rtr/AMALW48m+juSpbKFnRRjk8U27lE01tIytEFQg543sT2pk8KJeNHFL+7VtqM2Tkev
+  SogigQ5Y HzBlVzynOOa3UY3Uh1qVJT5ndPvqa1kpTVP9JglEP3QT90D3/GqbzzPPIpeKBTMok
+  O3G1vwp8t3d W0vU8t8rEZUnufoav2yzyyS3EqwlPNAeMIMlwPlNYy918zOLEy9lJyk07rT+rW
+  uYk0YnC7i6OOcZ 5PYk0rW9w9rbkZELuSVXqDnGB6ZqeRnNjFIIJo5GygyB68dB1NTIZ5bm23I
+  YiJAr8cFsHpWrm0gx FWlGmnTd/wAH+enyJLCUPOsAhmGYpHUh+vv9OKrXLNAIEIiETkOp28se
+  uP50LiOWKVRJDtTZknIA yd6n3NQm633yTImzy1ICvyApG38+9Qoe9dLT9TgeFhKo5Rimrde/r
+  f8AzK8zN/aC7kxFtwF287Ty OfX3qL95b3Ufl7jGgwyvyTkfzq55LTJBGJEdURotwGd+Odw9qh
+  AhFo6sxxkGPI5IPfPtW8ZLY7Ka hiXZ9PXQquqGSMsrFFX5RvwSPfikdlR5iwG4t0A6e1NYmYR
+  naoDFV3dOe3SpQzBJ5JCFuCSWTHIP Q1tsbQnC/Lf5/wDDWPQtNDQlYLWKXylYB2kO4tk9R6Ad
+  x3rb33H294hYFkXJOFGcA4J+mKxgbZb2 FJXeJMPvKvjLdVxT4b2W9iNul7EkjOhdyCPn54+hx
+  0r5irBzblb8zzoqUqsny2XXfT5rcubYRcma KEJAq4hUgFtpHf1NZ++ZgqxywSLCrLhRzkdT+G
+  a1riNra1ZFUCVz5sYIyFC4JU/zqo88F156GLb5 7faCyHG3HBH49amnK6va6/r/AIJ6VGEpWqc
+  l0UJZILazjiO8LLGB9/DbgflxS2cErXU7TSnypDgu zEgtggH+lTy6YssMlymfs/nI6knOBnDC
+  l+yLBb4iEgj83awZskFWyPzBrb2kOWyerN6+LjCm1Cbu /wCvkKCLO0VjazRjMZUOwyoB6n15q
+  S7iM32gxXaRusx8pv8AZ7j8802WK9bVhNdwvJFGxSIKMBcn Jz69qe2pKjzR2yAsvzK7AEZ4rN
+  KV046s5uXmanC0pddV+pUWy1C6uLV0ubYqi7Rtj5UN/wDqpjWl u8CxPL5kxQtgNzIecYH4VDc
+  G8eXz5IZgsk2+NYjtIAGMce9aDSRC38+9gkhEcq74hw4kxwM+ntWz lNW1+6w1iakJxnBL0Vr3
+  69v0CygP9iWgQRxOsLKzSpu5Lc1bW2CIskUOUVdsink7jwvP86iHnGAF 3RcI/nLjmN+oBx3NU
+  bYXLQxtvMathgWzxt6KfU+9YNOV3cqLlUp80ZW1ZYuvOit7uFogjpMqxEgc 4A4/GoTA10s8Mc
+  sOxTmIbeWXtz35zzTxeTx/vXw5kbeARnZ25qKO9LTRyHyxb28PlNIoxlyev0rW Kmloj0KM5uE
+  Ukrp/1pZjzBJ5EFuq2wkWJfMJiB2ZOSD74qERySySwRyBY8jyvbI3EH344q1DOzNM YADdGaME
+  HngfepbYfZ7mZLd0mkE+5Vxksq5/xx+FLmaucs5TTajFX/J9zNmayiaCRorrMkL7C0nQ DkE/j
+  Tmkku4FgmAiIi2O56bsdvQdK0J4DNBZXGxGtxbuT8o4w2R+fSs+7lLXUd3FC4Z13bD/AA7h jn
+  1xWsJKVu+pNGfPCL5m2m+vUhtrCK3Yfa5I5WkbCL64U5P51qQzx/2WqxAKrIXmVTgq44X6A88V
+  m232OWbfcSMAjhFfdgBcYx9T61qmN/7OjgjMewhg42/NkH5eaVd3l724YhRVZObb+Vv8/wBCs6
+  Sr aq33wyAxBe69WP4ULeGd5EmxBHu8x2boTjgfjWcv22O+EKAxyLgx7+flHOKt3PmTBJg8cjr
+  KMIgx 17Y/M1TppOzOmeEhF2l/l9//AA5PeQt5ANy6QKyqAcYHOOn0pzzwwIYIoCZokdY5cArg
+  9eKpedNI k0V66FTmVTt4baeMexoSWeVJEysU81wJUV/4F/uml7N2V+n3Cq0nHlUlon8v+CRl4
+  Lixjtw6QgBU TzBkkA/e/OiK18rzkeQl/MVJPrg81B9kEUJuZgS8c6rJ6Nn09B0pJzLJffuxKt
+  wsmwc9d3St0t1F 6Fx55XUJWj30sSym3+yjyLqPzWUZUoQc56A4qnA4aIJfeUjiYSRlkyVC9Qe
+  O9aCwyrBcI5gLLIDK ioA4IOOtQzwILzDkukAxlemDzVRkmrXO2tCpiaVpzbt979NP67hmS4uJ
+  Ag8t5nMjjGCGHIGfpVq5 hurpbePy/nkVn3kcA44H1qta7JIp3kjlFj5u4SbueOBzVRoZnvJBC
+  0rqn3WBPODU8t5drHDTpt1P ity7f1c1Y5lijRZ0KlEVVZhnC5+YN6k+taFq9hE91LGytD5yhS
+  edqkcg1myxrMZWuI5IkL+YjE9F /iz684FJm3NkrQspkMgIXscA4zWMoqS9fuOudpRs01f7vvL
+  E1wV1F/IlWOAY2Mwzu4xmnCRbaG3g m3TuylMH+L/a57DvVaWeKWztCWWIhAhDDgZ6/liqkhMU
+  bbMkn7ztz5ZAOV+pqowTSWx0SlGq4x5e Xz/qxsxh2mhJuoZpY0kQtGMKfQ4/SlElwmnOZ3Bif
+  MhbJG2QDCj6e1Z6uY7KVWR5LffGx28MB3Gf rUlw9nM6WtqJsFt+CxI47fiah09fL+mRKnOE1z
+  q6XWy/P/gFiG4VGj89JI5Ik27mORjuMfka0yk1 ywNuoYzQl2kxxuzjgduK5q4tpLYw7pcyL0U
+  88dyc8d6Yst1FexRp5imNCEQHkoeT0qpUFL3os2lR U17alv8A10f+Zr3LzWiCORxvCMin0BA4
+  +ppbGNomVJd6rErbHc8EY5H49Kjt5XMSNbp+7WE7DMN+ PQH1PXmq0ySXt+Fg37mVfKAbA2dST
+  9DUKN04vQ4788XGbStu+33afmTz20i+Q8cy20Dw73LgkDIw F+tPsfmt4y6NJLbxnyiD99e+fX
+  iq0Ya5uLnzpFCPIpB7fL2FadonmzS+ZC6sgZTsOAxxzj9KVSXL Gz/r+tjKrVpxj7O7l+X6GXF
+  dtbFJYSPPRCE3Lu/dk8n6+9SlxLqb23mL50T+XE+Pl2kcnH+eabbx SJbbXspkneHCBjn7vapo
+  WZLuFvKEcrRfMxGQ5PQj8eKqXLq1v/X/AARfu+VuH+f3+RVhEMazr9si hMlwPlcE7doIzVu4S
+  WKyuHkYTvK6lTGcbRioRDIrmL7N9rZVIbAH3yOKmaJJYYQ9yiTouyVDn5nb GMegxQ37ydyqUX
+  CanLbraz0+SuvvIALdLJEkS4h2cFi/3t3J+tW7KIygxIphlEZ3O4ySRyPoMdqs XMFuJooIMTS
+  7GZxn0xgc96rRSlJSzK0MJYu5Y8pg8KazcueN0VUvODcE0/P/AC6ilY0uIYbgxyXM kTYwPv5H
+  9BSQSRyXSwqkkCkBgzHgqOAaXyJbh7meK0nBkcPHMSMDsQPaksILS2keVpQpBZJfMOcc cEego
+  fLyvuKpD922n926ZJcBQyKS6hx2PRV7Z9ScUk63tzbJFJiEGJn2FeQV5ozaMIEVJpEIBLb+ GG
+  ecfTvT4ikmpXSxXUJiklGwk5JYggY9AaSulfsdOGlKnG838Ouv/Duw2GLzkgnZQjSqzlj0PPb0
+  FbVhKLiOZIU4SVURfXJyT+GKyXVo7aSCSVY5Y/nXjpt/hqGzvIZXd4IZ1Vn4G/7g5JB9T71FSD
+  nB sdXnq0m5v0N4+fBfSm0MboQxAKZLDuR7daswXH2q1+cCCLpF/uHqDjqeM5rPuJUZ5tysu2N
+  mhKNg NHgZ/P1qrC15HcI0Vu7RNjcuQeTxx9BXN7LmjfqZypJ0+a2q79S+IWUyXErFmRkRdvAO
+  7v8ATpVG 5+1W9uzLG4uEUur4+UADBFXJdR8qcrHPbkKwieMpksW6H8KxLu4dLkW8CzNOA5Ys2
+  QMHpj6VpRhJ y1RhSd6n7yK+f9f5kVvcI2mvcKZDFhQED87wOufQHrVS6uk+3w3CSGSXb5rYYh
+  Wzxj2oN3HGFgO2 IKu5Dt4Hcg+pPaormUyfNF5CIkbIfl6Z5Cn3r0IU/eu1v+R0RhJv3oavzaV
+  umyIFluHmCTL5jfMw 2rjGeB+Ga0IZoY7QSEok6tzuGVwODgfXisqERxQC5lkMUZGI8knecgkU
+  24cyzTJG28FywAX7o6kH 8a3nTUnboLEUlVkoQXurdp/g+5LudmVmRWmADMXAPzA8/jzVkm3ht
+  9sTb5Em2ttODg84/ClimvZp raNbJmjJy+EwWY98+nSorSzmXUWh3KLjd5u9h8uB14+hqXbW+l
+  jJrn5rWXKujNJYtMnjucM87glN qtyMfdI9qzpLZbS9S1j8yVmJWRN3L8ZBHsKmit4JrkySLII
+  pHdwUbGVH3f1rOWVRfRpJcpBM3yq7 g+vHOKmmnrZszw1T2kJv2jtHv+WhZmQRyhHt52i4ICth
+  gSM4zWbds7XBJ2xkk5xxu9CPatAGVLto rpzKZyJW2HG3BxVUN9sugYouJ/3sYPITaSCPxxW9N
+  2d2RCrBTd1bu9l/XyM+OMz3TDcI1MmAWbIG egpGheOY4jkyDgHHtk1NPbBbsxllhUL1IJ5xnt
+  TEWKMDZIXVycY6jiupSvszeUZOqoJ6Punb7+pJ iOS2VmnRmlYs/GQp4qOB54xLItwjHzQWIzg
+  56mo0RQpViqvuUbj93vS20pkHlsm0s5bKjA+v0qXH Rnm16UYKSvr1029CT7XGZz5qkQBWSMd8
+  Z4b+tRzJAjKgL7h0O7/WN/eX2q1Z3Hm2Hl+RbTMWd8CE E9evTp2qCZ1ubeGW4jcqke0NHgc5y
+  Ov+eKS0la1jOlUmoqXLZdrp/hoVSgQBlYyMflAB6MTyPrUv 2S4juLeaKRUUbyxkGQ6j7uPqeK
+  gR4Ycy25MTCQkrL82/PHHHFajRwz71cTu0TbFUP98+306mrnKS 9DlqxqT+J2X3fLcmtYilmFE
+  0SXCAqVZehYZAPuTWVe2zxpG8jAttw2BhYyB9wj1NWLkmBZZTFIpk kVgWPDAjqP6VHDPHc3ck
+  jyxrub5S/Krnggj1x0NZwUk+dbGMaNWm3KPw7+b+4I1t28OrcJiN1+Xa ecnsfwNCiK4t41Y4l
+  Q7ZHHb3NV/NNtGIoplaPaUT5AQyk8t07VLaC1tS0aSAKJAGJGS5PvVyTSb+ 4wdOpBXb130f/A
+  O3SYS7kkMcjvKrKir83XB/SnXOnW0MwktXJLuWiYE4yOgPrnnFQJYPaRj7Mr3E xJbg52heo/E
+  VoWotpWLBzGFb9zG5ySjjgn8e9eHKXL70XodSw7ilOL0fl+auNjtLxftF1Mzpifyi jc7c9R+P
+  amy2cKSBFD2uI28wyN905xt/KtOewEOlpHHM8p2qJFLkkvkYNVkMWnT6isgZ4HuDjzDu JLL1y
+  e2axhWctUz0cPiZS1Tu/JW/AgtcW2/96zRsVAJ+7kHnimSTvJq4ZUZY4YjG2ejMT6etPWKO 7g
+  tFwZRCFiOw4yCcn8eOtWPswgaRgJFtpJCyhjksOm4H0zVOUVK73/r9CcRXvJ8+rfyGi982J2EU
+  qsZcgscjjqPqcU6W2jmeQNC7JM5lRo8DZgfcPvWlbWyAKEiaSZtzKvqBwf8AGsgwy2kUKO7TAq
+  37 xTgEg8YHvWMZRcvd0/r/AIB5PtXKWyVvPX8xEmuI4osFI0kw48xc9PT0qnDPOV3Xmy6dgSx
+  QYC/N 0Of4j61atf7QLgTRpPEJFV0VPm5zgD0pYhHDPIhUhmOTnu/PT29q3ulfRHZTcY3en9fi
+  XJZ7p2jl toMSOrtsKA7SDgFvXvWB5sxkt4TIslzKn7wpwMDPIHarcz3kH2RIoncmMLuB++M8s
+  PakNrN5zOWR cuSzY++o6lfQZwKqkowXQ1w0uTeS8rNX+fclhgmeN47iaGNdwEYZOSAPvfTpUV
+  tGkhfDRS7pFEgA +UkfeYD0rRguopCyi3kJchuSDtGMMKqSRxLbWazRSoiJhirbcgHDZ98Y5qV
+  N3aehcHUTcWt/QuGG 3tpnuhIhQOCBnqB3z+NRyR7buN5HRYyhDOo6Eds+9WltpJtQMVo0f2YA
+  iJXXcdnfPrgipXsJFsmc zxOElRRJt+ViTnOPTtWHtEnqw9ooz5ebXz/4bT8ShIphW3lkjcRxw
+  PG0Stg7mP8ATNZ627QrNErq JIpFgjD87lP3j+tauLhLy6NxIpE7eeCV4XZ979cUtncyXNi8iG
+  F2adJXOwcH0/CtVOUVf+v63G+e m3ZJ/l+RWNnZ2zRpIyPBGHCjHTHUn1rOWST7JEu9ApXcDjn
+  g5K/XpzW20UEVtc3UqSSsbgKGDfKF /u49e1VEht57ny1tJ4N5LqjPzHgcqfcmqhUurvUinOct
+  WtPkVLS1uJrSRVYCZZifmGSo67frirRX zdNhBtZY7cqPm4zyeDn9KmtYEigE0UrK77N0ZJJjY
+  kjafcip57rar2m9GiPIXHOV6HPpUzqNz0CL lOquSS06tbFeKI/ZrdIYQgjiZAZQGO3PP45rPu
+  bV7qS33W8vkAEPIuBhyOp9geMVcZnmado4ZCBK jKqtymBkg1o+bbta3UARyrSFzGG+bpkEH0H
+  enzyg7nb7GVFJ3u+/b8TjlW4ntxDdZzGcFQMc9GJ+ nFSk21tKSgaVgOG3d14P+NakLpe6fKGM
+  cSK6oJSPvlgefpxUU2mQi1DCTyXRWWUsfauv2yvaWnkd tOvFQ5Z7Pok7Ge/mm8WOOYC6Zd0gI
+  4zj5s/hTn0ib7FC63cd0ybo4xHn5xnvnrxT5YrdWeZZ1WRN qkkk/e4x+Wa0Y9Pia2dcywBJ/L
+  ALHK5IwT+FOVbkSa0+RlicQqNSMrWXmv8AgFFNMmbR5I3lSE7w QjA8flWlZ2FxHfPJDLE8aFE
+  zt/1h67h7VoBoI3eJ23xGXKt3kI4BB9M8VIXAWMrhZEDeaF6GTPHH pjtXFPEzkmu559XF1Jxd
+  J7P7kVX08yPi7ljERgYQsoxlAcs341TklhlQojwW+xgRleqgc/4VqQXH 2tbszJseWRWGT90EY
+  AHoMjpVC5itRbGRbaZJiMEFumeP07/WlCTvaRp7SpdQm9trWsUJo4ktg4lg Ikw5i2/MCOKha4
+  thdRNbRSSzONzKTkAZxtI9cZ5q8F32IhWAu8bCIMOwY5yfyqOZLmS+uVEaQt5g fbs5TjlT/nv
+  XTGS6m0KkXB3k387fgihFcHbJ5kkUayT8K4zuUcAj2qmziI23lxlpMlXkToME/wA6 vxwQtN8s
+  yrLje0TLyAvoen1pzyQzwxRIoTE6hnzwdwyf/rVvzJPYVScoNXu119P1KMwMskCz7wjQ 5MgOA
+  v1/L9adbPbRym483cwUoV7kHqf6VpS2yy3KpyvlMYxnkEt3/Ksi5V45YrZRG6hg6MigblHU 59
+  zVQmprlOjD1VVTipW7pdvuf5lmaBdkjxpMsDSL5ah+ijrTxcBIzNbxNGYN0asxyME8D69aikik
+  uru5itJSys+8nPG7GcD0zUkK3QEayshcy+b5YXpjnB+vak7curKquVve963S/TzJYpI0itJ2kU
+  Oh yy/7Hv7n1q/9uFq8cZSSeSZ/3LIcZTGT+Oe9U47yC4uJDHaySBpzsUEZQY5U+tSNZXKXkct
+  ycxOp AK8YU46elYTjFv39Dj5Kbi5S0t0vv5K2pm3QMmp2WJJlUw7mG45B7CtiGKDb5sRZmjm+
+  QM2SykYG Pxqo8MUGoJmOWaHbuOG7rnaM+9aWmT776WG4iWF5U+0ZPG0pwB7c060m6d10OrE03
+  OlzQTaS110+ etySygvgXNwNgikCYx3YfMT9Ksi4g814Tbqp3rIkhAy4UdPrRb+VPbFi8jM0uL
+  k7/wDloeOPSpXK pbyieJ5I1AijKnBO4evtXDKV5O6MVyTjzaLyWn66kDyWtxfJOkTMkqMylWw
+  VHYfU1BG9vBam7lid 3YBNjHIIzg/j0FAgS3WCOEthEdMHncTzx9T09KUwia1topEe1jYFlMh6
+  Jj5gfcHvV+78gclKacn7 r0a6kMt8qwYCuHQiN0B+65zio4EsjqDRXc6FmQDAyN4wckVKloN0Z
+  8xE+QI7MM/MTwT6kY/WpJzg zSLFHclB+9eNfuMP4Pqa1TjblidKqQUJUqd/vsx6CwMcsoBSKO
+  RU5boWrPCxxXG2RQ/lkEmPjaec GrJhsxp4W6tbizjkZZA5l4fBx0qzdRWdxqJWOUNN8xCIT8w
+  I+99BUxkk+tjNckLc3M777NffqZv2 cSadJcKWKOyqznnLg4H59aWO1Np50MbJuF4CwYcj0X86
+  vfYrZUlDF3Rm3fK5AJAwMU4IXs9rFY5h taRzyFZeuffFU6t1a+hrVqup7t7r+uhnTRNDqD3s8
+  oUqsgCEnrjhalVt9rb5hu5HaP5NkmMDHIPv 71baOS5SQuoQSEypkDjjgH61TFvLa+XeM/WDH0
+  znimp8y1eparua95pNfiVHCw6PG5t5wQw2sWzv To34iqlxK6ySFGY2m47STluRgAn1PWnvJe/
+  Z7VVDBPKwu4A4z1PSneRLN5qmN7gtKAsUWAzKBw49 hXTFKOsjLkpQXNUafdq70+eifzGQBhDI
+  JHt9+5hIXTJDgZX6DHanokU0dskZSVmgKTlTxvPINOlI W6khSN4bcljI7c7iR1FY8cclsDKZk
+  kYTCNdvZSOv1Aqox5tb2Zlypu0ZNPpZJ/kXDa7LuOKArLsT c0bLncc8MKjR/scbmCSF2LlW+U
+  ZjB55z1qjKVM8rQtKNhARg3UDqac9xIzPnZsDEABeSP7x45xXQ qcnvqb+wqOd07p73Wvz0L8s
+  WLRPJuT+7GNoY5ORlj9BVO3jurbTJJon3rkB2HVQTx+BpVtRFEJWk aTYwJ2HA4PT8afcuJGdo
+  pAUmbPljgqegBpK/wrVCoyV7Lb009P8AhyENc3DLATvVWIVVAGcntx0q nKEjuSLkhz5mFI757
+  j0q0izrceW37twu0joVz2PvVdEmuZI12KZNw25UFiSeK3jZPyNK0eWL5bKP 3W82ORi1tFJbEy
+  SqjIwz0Gev5ZpskczS/u0cqJdse3+EY4P41f8ALMF3PCkEsUjPwD6E88e1RXNt JbLA0Eh2SSk
+  ZIztUDnNTGor+pwqs4S5Oa76aXb+7oQbJZWmA3BiN4B5IA6D602GB54gAoXEvDEcK jfeB9we9
+  SAwi6liEu/L/ACEDHy49x+NSXEix2lulnJ54lVlTbwSFOS386bk9kTjsRFqOr5vnp/Xm jKIxO
+  Yyrud3AHU4p6t5yK7MyBVJfA689R7dqt2iwQXQkQTTMqsDznJYZ/wAaRzaw6cEjl8yVwAM9 Nv
+  X065rR1NbWJWJ5pck20n1X6joDHDcK8ToxbLeUB8xA/p7U2Uo0MZWCQg5yQ3B79Paq6wkwqJWE
+  LKArKwySSeufTFNXayNJFHLJHHMFByNrBep/GlZXuRKvClUU5J39N/yX4Mmfa1uqCEMyJy2OM7
+  uv 5VWRJwkpkmjBEu3KJ/CRwat3F+0stwiW+3c+SVwMen4UrXDvE6LAC6j5iQDyB7inHnS2KhG
+  rUd4p xT7P/gFaK7gjt4YtwEhO5POG4DngYx9agke4VVljhh8k5LmOIBeTg/lSn/WCRooZBGhQ
+  nYMDcMj8 fQ0ExbEgYvEsURVhnv1A+uavlSeiPMqYd05W5eu/UjWYRXcUs4jni37cIMH5eAOnG
+  anjluIdQBji VnVsyIY8/Mc4p8c0ZiaGUxqZ5lmZdv8Aq9vY/h6VEzCG5MqRzRu8oaIs2QAOoP
+  qaN7po51rzqS1f f+l+B2llMxska5nRWZlxH0fhjkZx6VfkurSG8imgmjCKrjDDIznAH6mqVpm
+  2vtsiDgsmGHVtpO4e wGKlitpZtKhWNobjYUMhVerDkD8a8OoouV3t+B3ynT9o+bVfcvysi9+8
+  mhlEaygs6uATypXt+Hes 2NZLieYNKDJIWYMQcL/skevFMf7VBPNcTHaIpPKVRxuD85rW2Tr5j
+  w+XuRykI29j97Pqan4Fo1r/ AF/kehFzi/dktdv8imlm/wDZ00bM8W6aJmA788kelaQtZElZtz
+  QmNXKeaxYHPXA/L86rSMRaxTWu RLt2lXO7cv3dw/DJrXtYRFfsTcLMY4WhhB5DL3P19/asKtV
+  2vcynWUkrS+XmVLe2uYzbKrtJhFV2 U42E87fqaTasGp+WY3gzEziSZtyLjtj15oW4aWztkMcu
+  0xlmCNhnx91gao287SSYkV0UDZK0h3Zb B/LtUqMndv8Ar+vQ8xRk5ObXy6/16otG6uTZAPsWR
+  gHyF7rwahW0lnlwd6MCUyfzP+NTPbXLWP2d mWRSo3FRyR3x+HNSxypAojSZQJv30LvyGC8H86
+  fNZe7uPmUIpwfvGch8m7JEU07qAD83BBUkEe1R /aHazhmmikP7t2jIONy9GI9qutcx6jBdNar
+  5cjSxu3sp4K/UU0soysZSaIkiIDn5QcHFaJ91qdSo QlNSqL3u1/1EhW2/szMcheQsNuDyF9a0
+  yktxAqPD8uMFvXJ5P8qW1Jd3tkSLaWywwNxPqPRQOoqZ poUtItsy7fKcKxPUMeP8RXLObcjL2
+  jUlFLW/rYhit0/tFCrFjHHJFhSRjdzk/kaGtvtVsRFMPKEi gqDyw7MPbNUo2voTsFtNcyhfma
+  PgH+9+lXtPaOSWWO1Y2t0doiMx3L5XOePz5pzUormvsdk4VEnP m27W09ev4GZeRyNqgUyGXJw
+  Qh4BI5/AjtStBO4jWBH+zCM/OnHLdKu3wzZxxuQiOpcy+oyMVVj06 5uDJLHOYDgZkfO1Mfw49
+  e9axn7qbdjSlV09pOf36r8BdLtg0iRzOwY7S6s3TGc/jU5tyuqxXUayS wupZWU9z3+nAqZ2WI
+  Nl1Z2cFdowVXHIPvjmq1tatbqDbSM8GCIAWJ4/r3qHNtuV9zKVS6lJytfQb FHkxvMrgSFXBHA
+  JGefz4olt/tN1biWSNopEZpIkGHU9Ov4CrTwxfYZCbpFMkqzhsnCBSPl/GnSSw RXjebbytE0h
+  wUIGTwQfoCeRSU3e6ClGVlNKz6dPzH3HlWlkA43NKnmNsGDkMFz9MVmvbW7I8tpIW aN9i/MT5
+  g3Y3D2HSrSpbSXZkkSWQFGM534GfYdh04pGjUERrYXCFXKffH3CMsfwODTg+U6NIpaO/ olf/A
+  DKEr20MVxFKu1TKuwLxgdh9ahkt5vMuoo8gKdspfnL7f6Zq4+mKkhKsbna2WP8AexySPr2r Su
+  CkVmpjgknadzMVUjcAMdfw5rR1krcutx1cV7N/u1dv8PvOQitVDQxRwzTDaFnYNwzE4BH0rq4o
+  7qOzkjitpGJDEM2Du2HrWbCmL0T2YMX8IWT5twznd9B1rSjjvLvUjsLEhyFK8BxjqPaniKjlu9
+  F3 FjpzqNLmvFau9/8Ahh0Ane5mknWOKBnVk3LypwT/ADqK8RhZWiSxMshJAYcYI9ffmpxAIrc
+  tdSEg Iqtg8ZOQP6VflMk/lwSwPAqRu0hfHLgAcelcbnaSa/rQ82rGTnGS2+77u5gw290JIti4
+  J/iI9ODj 8elRYmiMYlhlMYQqxb+HBxgn1NXltilmwS6BAwXOT8m05/8Ar0gu0lhuXlvLaYm5G
+  7YuByOP0rbn bba1GnUTbi7p76NW+ZFj7dI6wzRxgEeYoHIfOFH5CrjRTg3SECSZpt6uAMHPH5
+  CorkQwz3TpGSxl VZthwGOARj0xUUEp+0XT28zFzJtQuchRg5H1zUvVXW3/AAxpXhBpOCv69zn
+  r6KSPU5PL2xXIJXkc upXkj2qs8e2VjKGESPsUA43YH/6q17oXZEMsUL+aqiMhhuOSOP061SmU
+  RWSApJJdRBUdc9zyDivT p1HZI9GnXqStZJ306XXz6IpPs88AecJyN8ke/lWFDW8lvvljI3tMr
+  R7+T/u/rUTNJNtiCfMsLJLJ jktnI9/arEMkzyyJ5yRZUuodc7eOe3auhqSRs6U5Sdvne70+Qk
+  0kkL3CMPIM0sZ29GVe/Iq5LNGj 71uYpUVHWJFB3HJwDn8abZQGc4klVkEPBIyX5xkH6VNLLFH
+  ZxCGITREEblAymD0J9qwk05JExmva KD/Db/MzbhI83CKrAxEDMZxlsYJrRFx58SPDL5CiUcTf
+  NtPQA/WlaCGJZLYyjYzeZI7dWA6kH0NC GxaXzSJCgIRAp+6G4wfVs96JTUlsVXxMeXl5Wvy/E
+  2r20NxE0DuCylgTGMZxg1BbzW2VkMbvKq7d in5sMfvZ9AKhaZZI7iNJDJNFdxqI14YhRgjP+e
+  lSwXJ3T+TbMsjuphDgHMecGuFRko2f+R50lKKa k9Pu/wCGH3gSW0IidQqEI23jzGJ4cewqmlv
+  DJqMZkM4iVGH3zhCPX3PanG3eC/u13eXEsgEYY5xt HQ+5zWsjzCIAQCR41KthRwDzg+pI6Gm5
+  8itFmksQ6KUISvft/mytJPFJppUPGRuyQv3lBAzz9RxT 4b3zIzFAMRuR5bv8wxnDD9M1Uku5D
+  AqxeRBHJC8gDplowP4T6n3qlNNG9jbnzEgjlXfuHG09hx68 0KjdWaLVOpGEbrr6/pqad9DcXU
+  yW8GxsRM3mAYEhyMEVnb9Ta5ngRYy5U5AXGTjrUrXlyLx5HzEs cwjLEYAJ6UnmK19CFuVEkQX
+  J67ufmP4VpBSirNI0hKdOD0TtqvX+uhVWGCSC3+0Q3abmQqHl4UDI 2/UmtZdRsbK/INvI7YOV
+  UjKY42k+vNUbrL3f2hWE8MTeW5j6B2Py/lSLEftl24mha5QnfxkMRySB VNRmve2+ZdKFOpFqT
+  vfZXdr/AKEkTxXV/NECYRDIApdsgqByappcmaQKsokTaG+TjqeQfUnpSCeS SWWeaL947oSUwo
+  +bgjFUv7MuIZ99vIiIFZH3clGwflPvWsacFe7sXKGHjNqTs7adfuLSX88mqbxG YGLbiWORGAc
+  YIovpHMzwbmLRLhXB4fHPA96itwohjC7pCoViOrMxHHPpntVq4V5I90jxwztb75lY fxeo9ABV
+  +6prQ6aNSLrptWT07/8ABKzvI9raFkdZHVmUnoVPGfpUTzPbSTNbbnmLNGxH/LJemD9a Y8jwX
+  NpK8q3MKpx5foB7+uaq3DSCFSm6Aw/IMjls8kn1+prWELtdjmjSndqOsW35X8thY1cXqecs vk
+  yL8zk9fRh7VXcSRXJZ4+REwYkcEnoRUiTXb3MKwSRHCO7Lt7d1plyxjsEL5BGIwG/iOM4+tbpP
+  msy5VZqraVlfTf8AIqGCSVbeKFHlmwQ6ge/FWo5HAlt5Io1Eis6uVwVHp+YpYGmbe0OItkgXOO
+  Tn nNNFvDILePbI52Oxw3KlTnn61cpdH/XUyq15QldfLun+ViwJbn+ylQIJMDG8LwT3HvVSxjm
+  uZopi 0YhjYCR8dPr71JbzTw2xuBbyO88jAgdFz0OKnt7gjTJlVQhZzn5eGx1NQ7pNJGdKDqLk
+  TV5X8vzu RXweS5jKlIlDHeSMkjsayZJZGnQqjnOckfwntWlPHELCAo7lpOChYkjHf8qjy8cu6
+  Hy4x1CuueM9 +OtbUnaJ00YzVJ8t9Hb7vkLEIyWSdZ43ZS3mGTPOOTUbK8mn28yszRBQshxkKe
+  w9s0wvJHMjocbQ VAbkc05i0NzJGfly43IegK9M0Wd9BVqMo1PcWi1syFTJvWdiFKMVbK9Djp+
+  NV4IxIAzYj8s4BJ6e 3HrV24jaWzhnWGRRhlkOcjORj8ag3MkBiZAJiWMuR159O2MVpGV1ocUJ
+  e0nzWu+t7FhDD5kZIbck Rf5TjkZP49qekME1qtw0iwsVdSrDp6/zqKAv5EskEWGEyx4b5icg8
+  fWo/LdIFikBRhGwIYn5uefy rNq70ZVaUqtoUrLvtf5+Qy2e1iy5jlkhUNH97JJz6/jSS2bRws
+  8BdEjk2ybz9854x+FCBUsQ0S8g 4k+XIGen4moAsko3jayxnbNhccnpWttb3OaVKCirv5f09Pu
+  Hs0RikCh423ERqTy2DwatSQ3FxcW4 hjwrgKTnjpk5rNjiENpI87Kk8c4AXHOTz/Srq+UksCW5
+  lmnCNvCE8EDNEtNjF1alkue1+r6evl5l MxsbyzXcsm7JcIMYHfPvgVanmtnnDph1bIUA4KjHG
+  Tjk1FH5jzwLHJGzuhwqjnGOn1okiS3ZNp83 kF4/4l+Xk/mabtzHHNxjUum5SXTa/wDXctQShb
+  HyktgWcqS5ALMp4bB9OBUoSK1ncEnEPzQyPyrg df51m2sP2G2SdnMi5C/7xJ6j2FXEdJtRBu9
+  +1W/ebc4z34/Lis5x1dtjjjzTlJ04XW/d36qx0mJI YoGaeMSIrZkbnDZ5/TFNit5BNnzcKcbl
+  jcghgcqD+HP0qOyjMEK26AZWNmmZ/mG/cMD8q15khfV7 ieQSTAsQqwttyAACfwrzZz5W0fQU8
+  Q6dGUZW18l/X4jF2m8kmAdojkvuORkDIpDL9ujhMEc0oWIE Kr4MmeMj6HrTpJ4ltQsDpHsmSJ
+  S/IJPr60sVisNxFFv86VS77YTg4B6j256e1Y3ja736GUa9JpTc dfnp93+ZTtIEl01oZZGt5I5
+  VJZ2PzAnqPY9MV1SvNb37TxlPJjJjkyucO/QfhXIrczi5UPNBHHFG FLMmc+g+prZa7uotQKKU
+  MLSYPy/eJ5P49qjE05SZpjaEX7tlZ9/00NGS2mLvsUiQcEjgAL149xUU peKWGCG7tFMgdolaP
+  5iB3J71I01vkZS5QvhnPmfdPv8A1qbT5Z45JIJLUXA3j5gozjknB7A+lcd5 JXfQ4Zzkknbbul
+  /wbk1s9zBbQyzQO6xtGkjADGOf8ap6hdR3MDwQLEUjU7NqgEBSDTbm2vXKokhg GFJDfxc4/wA
+  KiL2kF/JIx+0SwnYY4uCd3b60RhHm5t35Bh8Iub2srN72X+b2EVoy93JeWlwqSTll WIhCwwMk
+  Y7Cqypbx2gjimFsInC4lOTwcn861LkC6WdJswtET8/Reg4/HinpKwtI2je0VppRK5eIH Cgcj8
+  6r2mn9W/UiUpRkua+r26fqZ1pZzzzCeItLNIoIKHAXJwRWvHCY3kiNxbNF5mCSnfsR7e1Zo eW
+  aUEK1uxfEQU4yv8XTvnvV1pIBb5lvIWtw/mMVGCe2c+lKq5SZ1TxMpSUNL+Sv/AF+A27zD9pkc
+  Sk7gpCNjJPYe5HIqGNrGIRbFltTs3J5j5IHVQT+dTXd/E5ZVhkdGmCtIDwW45/HoPeojfSS6i0
+  bw oI43KOpXlc9j9AKIKXJqvxOxVJey5eVu2rs/01Qtx5H2GCSIPdAx5ljVudwOQR6AelWbG7Y
+  RTBri GMySrIXZflyB0x7iq12zI0k/lEIW3bBgFhjGR6AUs8ccKRoJog23OTzuyRzSsnFJ9TJw
+  j7O8ou3f 9LDbi1nlGzzFMoZWdFGCgU5Ofwq28Vo8M4M+N7CcMHICr0P4YqTzJ1WScqLhwHRTG
+  MZ3YFZNpbTR 6qEeVUQBFk3gnaQOh9jzSi+aOrtYmlUc6LlN25dv6szYntYI3gWNHnt1gcsqNy
+  W/h/DHNUYmQ2lt JHDMp8rJ3tuDHPJH1FajTwRASuQ0ZQ/KOoPTH5VHBb2qTrBBLulSNiIy2dg
+  A4B9+9ZRm1HW5WGT9 nZxbXfW3z7fcUbqZSGGxiVyqRqcErjPPqalWSS5szugnSOQI4Jbrg5b8
+  DV+OG2hsoGkIuBIAQVOC +eMj2qNrMCKWBVm+R1ULu5UYyc/zp+0haxvGtSlBJ7973KzRl9ZaE
+  EtGwfeFODG2MgH8KznkWKS3 mnt7pSVww38bm7flVxLEFFnbz5N2HiZXxuHOfrntRLcQtZwyRT
+  RQtNwiT/MUJb5Qffg1rFq6S1Gn T5+Vaxfrv8v8hph+x3TKkMvnuxdSzZVQq5xj3q3a6jK9lDc
+  +TteWMtIqqBh2GOPQY7VWYmdh5kou 5gvzeUcc5pFWCNJ3iLRSk4G85X2IH51MoqStLcirTp1H
+  yPfv/WpNFJILF0wIgkqoWlG7cU5/TvVv CXdzdebeI7ySsSyEgEEdvTpiqsBkSNFZfPUHcSPXt
+  mnRXCrNI0mn3FiPOBeSQggFeQPy/nWbi7tr f5f8OeevaRcrLXuv+DqUTDGdoil2wkAFCST055
+  p7fZjYtE6CJ1kCJ8uCwbGT+HrV3c91fyXG2ImU NMiIuMheCR7UyVtLk0+RlcpsdFikZ8iQP24
+  75q+dtq9yo1Jykk38+3yM+6nl+1xW8LpIgjbLAenQ n3ogeSW1hiht2nkj4LR4G75t276VA8qQ
+  ube3ZEniOHdvmBwDnikt7SRrqO4dnjcxERhGICrg5B9T 71vypR1DEQi6bctLbX6v5WMe6kv7b
+  UWulWWK1Mv71pOQx6jHpUMaNc3MckrEbrZnXDYIKk4B9TUk 8M/2K0CzLPHcASbSCcEHA6+9Ub
+  m3kju4wXYXCMXlT+8wIyB6DHavSp2asnqdtGrCcLxfvbdfyZLI bIWoYmRZnVMpv+7jgj8+agc
+  R+fcxKkkhD7Bg8qR/jS+UJr2Qh1hhdycuc/KD1q0dPu7NIZNpkGHy VH38dG/WtOaMdL6s9GnU
+  jBqCqczl3enpctIxSO0uACoERzg8HdxkewNVY5723sMFAVhbycFOpJya tjbPbZ3iKRYyqs33S
+  oAyMfWs1pgiXWYJA00wcAvwFxg/jWUI811b+v6uVQp80mlDm7+X4luW8vhN bS+XGrCBsZQEbT
+  1J+varcNxZLpyGJtsyKqENznLZz+FZ8TQ2jPm1m81W/d+ZJwVxxnikzeyabZGY 28ysrZZIgu3
+  nIBpzpp20sv6fmXWoLminDlT7WX6M07qWEIsYKNsBLSR8ZyeCT3JFVTf3iyW0cGwk rnbt5AXk
+  /pSBUgsbeVLyFZJfmfcpbkHjseOoqNrW9vLgxrEWQzDa6gDaD94VEYQS128zhdOmoOUt I/3v0
+  0X4M0lvLoC3lleKWFk4VV5yTwSe9W11SFY5JZbuG4KKVPloV/n1J7elcxIJFvAVimhkUgkO ch
+  QeDx7VPMkLRK+1ZkDsIfLG3egHBPrnsfaplhoNq/4GU8JHmSavfayS/H/gpmrJqFg93HEEYxcc
+  nsAemf51RubssLNjbhjP++Cj/lmd2AuMY7Z+hpLVHisprgRqqEkB5ACAeMD8aDqFwyuCkUUp2n
+  DR j5SowR/WtacYQulG/q3o++htLDQi709fV7fcJefa5LqNxMirFceTJleDu5yfpWjBiGZDJAx
+  fa4Zi OAOmPqTUCR2H2eKNoLy7ZNrkxy4z1IP40xHQf6Q9rdLCylipk5JHf6CsZaq1v6+85Kan
+  zcq0Xpa/ 43+8049OS18kwM7jbiWLdkh/U1jLdTwyiXaI5HObgMMliTzj0xxTp5LloI5ITJbxy
+  WxaZ3OQW6Ae 2f61nQzgWke2VRN5ibo35J54H+NXTpSablqdcqUoxu9blppoZLeaS33yFSqZXo
+  CD/PFWEAjvwrPK SY2bhvvAkY/E9KWWGVbmfzWigRpG34XAVl5B/HOKq/ZUEkbXF4kb+WVZDnO
+  7GcVScWtyZVoVIct9 ej1+75E3leY0k8EcsbIdpg3fNGT0U+p71YkW+RkN1F5khhcbcDPUbs/h
+  xWcst4IFdUJdUDTcdW6c ++OafZpK1/se+QSpkRFskMvf9KJRaV3bQVRVFC7Sdvm/vW33Er/Zz
+  pXnW0DxxRNgCU7gw6j9aGKT rELn95ggt5fy4b0NRyTSS23lKCLO5w8TY+6B/CT68VVMrrM5Y4
+  YOgZfU+v41UYO3mP2EfY3bSktd 29yyLdDcR27q8IWErJJnqd2f/rVTt/7PmmRJFljdpCWkd8o
+  GB4bHp2qWS6nn1JLeN49rI+Pl5OOp qqyQ8Qput/kG6RznnqoH1rSMXbV/cYVI88rzbvbp089d
+  /wARC9xbPMDGGiMh8zHHPYZ7U+3e6eXa 0RVW5PGOp6/Sq5t7qdGRElJR13J1Jc//AFqha/ZXJ
+  jY5V/lP93HUH1rfk5lZWubzpp0nHRy9UW3l ZJiY3WZQpB2jjHTNQx2iuin7TGuwFyCTwMfSq2
+  WmkaV1G8tuOOMjPI4p896jo6wwtsJCIVP+rHXk 96vkktEdPNZJ2t935Dw+5U3OoTYwXI6dqml
+  Ahht3ZPNi5A2Hkntk47URCc20E0LwtKWWNY9mTjqT zVOWRXupd8wH7wmPB4Zs54/lSWsrI46u
+  NVSTjTaS6/8ADdCeGa1ICybS0bsOv39vIP41LFsuJdvl MjyZbnk5J6VQ3SpMSIQBv3FSBkZ7U
+  z/VuFG/zFYjBP5VfswhGpBOUrrs+hYkeJd8Rm8gFgAjdSQO vFSAI+9ndGM6E8DlW3CqBVVkia
+  RopOucKTwO9StIZAI/MjjCHKMBgNj/ABzTcexyzrVU2lJvza/4 BbaVob9oYATKZc9M846Y9aq
+  AfJPJJJvZCEAI6ls5qwsTlP38gWRm3JHn5yR05qRLqZmkiEcaNLvI VkGRkfz9PSoTtsZUK7pu
+  1k+7/wAylGpEsSNA3mJEwBBxu5yMjv7ULDJMziCIorANOc8f7P65q2YI 18mZdSi85YwCNhOB3
+  zxyapyzvDelrcq28MuMdBnIzVpuT939TJwTm3Tjb1T3+6wWot7mGETHyiqM rk/xMSdpqCJFVI
+  w6SRtn52Z+p6enAqKC6la5QxxbHXJORkNjkGopZQIozE2fm+bqehz6VsoO7MqL hGc5Nt2Wiff
+  0t+ZIXcruaN4m8xdgHGFH3qr+arTqQ29GkzuJ4C/wk+3rT0EbDDSn5Ry27gHtmqwR zDHuPlfI
+  VII+9zWqSFifaTqXg/Xb/hjaEsks0UciF0CucoMKfVh7VmebF9njdJ0bCMMEcsM/zo8y eW0jj
+  dGLxJsiKHGVPUn+VVYYTJuU7EZpQFVhjrnjpUwpqN7nnSlOF3K0Uv6uejyfZJJIIpmYo6MI 9p
+  xj2PqxPT6Vct2NrBI13wVcqzHjLY7e2Kz3vLR0hlMRmdmyfLOPmzgY9OKuvHLcRXQMUodrrPmM
+  cpgYycV4Ek7JPRHqRvzLndovpdf0vuIWLtfqY/LC9GDAHDgAj8cZpbGS5urzzvvTmUbWUYCxHO
+  f0 5qNbe3ublVknOxVkZo1YhiR0OalhnU6arAqqnl5FOArEcL+lOVuWyWo685JNxuv6+9mpeWh
+  eVWgj VAU5JUENjG2mrJHJMWuJI2Zn80qoxsI4I/EViNeTyXJVplCyDzMAYGewH1xUkdwlwjef
+  PFGzAvKQ uNjY5U/Ws/YTUUpDnQm0lUlv1SuzpZfJuZZGRhErO3LHhRgZP4YpAZZZNyxSxpFk+
+  YDw2ev5Vn2U tsyQSwndMIBEATkbWPJx6irEAuAY4mcnzM4IPBABFcrhy6du5moxpt8zbXS/T7
+  v1Lkkm284aQJuG 5mbhHHRfxpGjiN0UYpkShy6jGVHX8amSz/0LyDIr+UViyf4wxzu+vvReS2i
+  zsJJE2cRIVOMqTz+P vWXMm7I2nONRNpP5Fie5iivBIkR8vyZNxcZCE/dB9T3rCRXtUjkQNPtI
+  jkPbI+Y9auhp7e4JjQsg uVDbxnB6DNTT3jXH2mMrHHH5nyybflzgDH1p0046LYqhTjLRbdWVG
+  d3gd0tZo2mcyFyeEzj8uOfx qzbXMLRRySxKVVWjQYHzB+Fb6Usst0kSxBoCVBibCdAT83446e
+  lUIZY4bySIgyWUWBAw6vj7pz6V XLzRehHs+aGnutee5oT2aiO2i2v50RLMFPDOnH5Hpj1piR/
+  6MwkkWQlgwVRhiCO57kU1r61aWVjI UdF27y2AQwyRj1J71nvcXUjpECkm6RG2IMPtAznPt3pw
+  pza1O2nhpxhzS6fL9bGsZDJA2AGjlILs P+Wew/dP1pl1bImoteSyKY4o3RohwcnHP4UyP7XJq
+  WWQeW7MyqgHy49fXNP+z3kzT2qrucsCHIyD x8xqV7r3sCUef36mnXW2n3Dx9o/eNIwhtkQ5J/
+  iOBluvTpUsECDSRtulupTIrsqfeJ9c+maxWiug yqzMVDAGM85Rj839Oa6ATIkMqJE4hwS7LgE
+  MD8vPp7VNVWSsa1qMHFKK/L/hx7SQz6bKDEYi7M7u 33S38IHoOMYq1bQyujSSSwb/ACyCiphu
+  Rk80NYh4ZzAHebz1CEn5SMA4x+dWI2uFkczTW7qzZASP ByOn5/0rklNcvus5nVdOl7jt5df1t
+  95DD5pie2ZVYeYhYKPunBIwew46VG0VuodpLoxebKjZYn5g RyadKzreTbSFeSQNHkdPlxg++a
+  p3dxM9kC8kMEhIVldc7d3X8qcItvtc0pX57LRPcjnMAEkSzPLb hiUWNsNgjIAP1qO1vLZyslx
+  beTuQuY2xu3Abcj+dEkMu1TbFXlWEnAH+sA44/CqcM13EIyEiEZcq xdAcfL8tdKinHc0lGKpu
+  z/HX/gfcXfOki2Ss0T26NtaONMOx7HPoD1p6X8TuivGiqEGxyBhic5xV ARsJomu33yxwYkiQY
+  PT5j+HBpkTTC4LxXVo4hXy0zFkHd3/HtTdKLRz1IRcHbfvdr8ja+0/ar25g QCQF1wiDDYC/zp
+  ILazR0ncziQpuxJJlW54JH0rNF3II332kiSmRfLZQBgfdJP0PWnOziZ4JJFkRW dJAByz4DAj0
+  A9Kz9m1onZGcnLrK0Xvr/AEie7+1LYvMRzuwxQbQrA5C/T1Hesze0cskjqsTmfId1 +QfL0xRH
+  crJefv5SYXAWQZ4EhBwfxNWnuEhuIES/sFWMMjRyJubdjOD75rZRcfdsFWPKuSKTa1vZ 7fcyB
+  N8bxreSQTQuE2+WmGcnoc+gPX1qlc3kS3Hlos8FyIyCzt8uCeTikuJkuYdOdEf7YlvuZQeu Dx
+  xULDzhNcmIq0xBZDydwHOPQD0rohBXvI3jB815Oza22/DsZFpd3yW8EsBSUq33GXJzu9PQjNNl
+  2SanMJ2dS83mIQ3Rf7v1PWtKVnjtIooQkryQliETkn+8PbGarQQOiG72NbrHlA0w3AA4wenvXc
+  pL WVrXPQoUNHVStJ6aeXe3T5CQ3dtHa22YJSEXEjE/x5JA/KrjI0UJnn87fOm+Nd2Ain74x69
+  KnEyr oqoIlnJk4KqPmGcZ/CoIoLiW9uYoyymLgCQ7jz1rK6d3sXhaPNBt2i+uv9WGTGAWjrBO
+  qKzhmDZJ Vm7Z9B3qF7WeK7/fxuiKjIHPQnHFTBElgMinziHVJEQYyRzSvb28dvBvmkkldwSik
+  AqCcgdOpqoy UdLnZTqUqV4Qk7el/wBVb1ZVUMJYZTIjJEgZo3GS3GPyzTnEcYkllRlGAihWx1
+  H+FRgC1uRI1vMG 7BjkDrgH8ancSmFoDBK7yuG3Y4OBjj9a06m9Kynq7J9bojR1IiWJEMSSCEL
+  IudueQD79asFb+NXj gDxwvNuHru7c1atrhkKR3scccKjcvygFmHfPrV1J7VbdJPOVYiu4gnOx
+  uoU+5rnqVGn8N/xOGs3z 6U1JfejGkl1CDzDdIsuJv3pMYHzN/D/9aiVZ4B5FzEoiR8DauMkHo
+  MfhVy93/ZEklkRJWbZGhXqP 4mPrgd6rTRmTThCkcrB5so7vkMBjafxqoSTs7IwjUp80JOCSbt
+  1t/n9wk96r2cYEZSI5eM9Q3/6j Tra+ubhts9ks6glm8tQp3Hrz/SpHkuEsLj7Q0Fs4dk2vHnG
+  cE44OBVIQSjzZ7hwsAuCWdDjJIx2o UYOL0F7KjKN0km27av8AD/hxZJvOiUbHhTap354BHf6e
+  1SOZ3MsVuDdKhWLCjqxGc/jjpTJbqKGV TMDHIynygRxt245H1qCGFVtgrTtFPsBZuSAQDkYH8
+  XatEtL2NqNWT+z6aX1/P8SaYhLQSMsyyEDY rNkMDwTj0FVZLUz3AhjngkIUvHtXBbaPpV6M/Z
+  NLDAw3O9AyLIu7aAcAc+5pqWVzcC2ZbWXKxYwg A4YkE/rRGfLrcFJOF5JaPdr9P+CVUihnNxJ
+  NKyszKck9C3Y+tXIoB+4M13DNFhi0ajDnBx1NOazM EIjkKQSo6LGX/i56n6Vbit3k1N5LmIqS
+  cB14XeOQMe47VFSqrXTIxUlyOXNb+vT8jPjna1ljGxrd cBQ0vzAqTzn3qcajbokiwRo8oz5Tj
+  HT+79TVi4hsZpLRrmRk35V/mwFc5OfYCqJBjiiaG3J8tWDY 58wEffHoBUrknq1qcMHSqtcid/
+  w+8j81JmkeZWtkVCqA9z2xTNQCsVaO6hcunmEKvJAAx/WrErwT 6Zbopw4X5M/xAkAmsqVTHqg
+  j80SqqvGu0fwj/wCucVvSSbvtboddKpCO6tJdOhDM0nmxu8LnzBhN q/dB45q4xS1gYO8Z8wAb
+  tudu04IP50x0eDTkSJHaRic7jkocfMDTG82cMiSeZlecJnfjnI49ua33 S7FU/rFWjfmio6/P5
+  sgn+3pO8UZcsjkEhCN2cD86rvE1tHKjJyjgMGj+4wPANWhc3KXhmyWcxEBi vr1P1psb3N3HHb
+  yyROpBKOQBkepOOee9aJyS1tYxqUqlKVpRjyv1uvO1jOEk6kyeWcs+FG3r6ipT GjJcNvFuVO1
+  FZfmIGDn8qkMM8Cxx3Mi7hJvV1U4wOuPeniWVYzI1utwZCx2bc8E8GrlLseXVxddx Sadulv8A
+  MzoXdQBAX3MzNweQP4R9etKSq24Blhdh8oOPf+dX3tJtjIqx28LPuRto5x3GO1Z32Znj leWaB
+  nEuGKAgA5z6VpGcWysPWgpOKSbt3bHLc7lMaKJY93oNwI7E4zTkSKe9DeaLcRkMu9uWwelL Fa
+  qkErySpLI0xKiPgYPQ9O/NMaMecEMErMCACvc9qfu62NYxc6EmtL99P0ZYQmS8kbIU/MqLt/TF
+  RMhEm7EixgfddefpnHWmGF0uoVWQu046AYPLdfzqyWuHtpEOGCykDj7wPBb6cUr2ehtCpV51Ra
+  vb tfT5oa1wUu4JW2rNj5MJ3qz5swkWZvLWZZN2Cv3OxUiqXkNOwfZJjGFbrViK2H2+JXuEhyp
+  ZzICQ p9xUTUbGePgqsZTdml836P8A4YrynMxKxkAADA/hBPf6VE63O2N2gbBVuR147/StKaSG
+  SwV4ZUl7 ZVcHOcc1lF3N2+9cBWwwI61dNtoxo1Jzpqzsuy/pNEkc0sEUiKUULIAm5eSp/iz6D
+  +tVpJY47h9x S4TfxtHbp3FTQqbi/tzIFmTkSRIMMwA4GfWmQBPMMUdvJkgklz9zGc5q0kmzj5
+  KMpyXNZd3/AJLX 7ypgeXIY1cLuYEkVJ5RSFBt3ZUsDn17U8m1eCJ5QUkYf6scZwfXHtUCwtLI
+  zGTIV87cfeHXFarUh Jyn7sb2+V/k3+Y+a2kKKYX3KuN+0HpkcVUkjeS4llfchMvmDb2rYciWG
+  WW2Cshk2hUHKk84PrSyJ EYTEbaRZliIdw/3mz1xjgVMarXQmcY15OSp38lrb+vI6d7SHyo7TD
+  QqVaSNyfvYPanXl1bGysBIl 0rlSxRZMYy3zZ9cAVopduW2vash3ncWwfn7Y9FA5I70RWwv3TM
+  0MrxwtyF7d68L2lrOfTzE1FWdR WUddHcjtkt9zeS26N3bAzyRnHX6VWY28jSWcbbYxs8pgfvo
+  OrfhVmHzYjDHFBiKMYDEZ+g+tZslz AZLi4gUJOspiQMPuqR0/PNEE3JmeHrTvJNN9nfb1NdGg
+  +0XEolgl2zbIzjhoyByPpT4rNbS4uT5k RhEnIZeR3APuaxwn2e2kmmjdmFwoVFOC0Y+8RW3DL
+  bSa0pfdNESwi+bgqRkZ9TkcGs6kXFaO6LjK avOL5k/QtLNHLFE1pHGxRdgRQMrnk5+lR2y6gi
+  Ncy42wMEK7e7cZqaxh8+SaKONoWldZd2e2Ocex xirssZiuo2ihuFhaPcdzZCk8BD6t3zXJKai
+  3E6sPZXi0n1d7DnEcdmCgfYsTbBnkg9CT3PWs37Je SSW8fk7EZA+9xnIHBxWxN5l1axWyBo5t
+  jqxIyGwB849FGOlQyJLHa25WUPujyoH8Kk5P+NZU6jS8 y6fM6ajDdt79CF5LhbKVUMagziTLD
+  O3HrTEuT9uBQKfl3jK5DA9xVRzdF3McqyqZhIgUcSKBjcPa taIuJDLKq2bI+N0q/LgdBx/nmr
+  klFG8YU4wtJJt+n/Dlbzrh5SEmgV3lU7imQcDrRdyyBF226TbI 9kbIAA0fBLfnxUjG8luXeGS
+  3kVZVBjWPBTuwPvirYSaO6iuI3iuI1R1RFXkD057nPFRzJNPQy5Ve z+S1/PoZ9wy+TdGPy2Pm
+  lom28AYHBHc9cVRSe5Nx9sS0O853HAxgjnj6dKddW3nwxlnMEsiK75PA Zc0kRwIo4nN5NgyMs
+  fGG7Kf89q6YqKj3PWiqXs1bV9d0RxBjGqrM0EZYFVkyWAB9fep7+SWO8naO 43RrcRuETIbkdM
+  +3f1qO3ZppVkmjeIhB8x6M2SRgelXrmQhbi7URyvK6gbE4TgcH3obtPVf1oaqN p2klrte1vvE
+  txOtzG026XClJSO8h6Y9OO1X7OO43zJ5f2iNAE2qOR8p5PrVK2iaZWil3gSSB4W6f KvJ/H3rS
+  WZIQJwzrK0W488NzjP4A1zVm22kcs6kpScUlf7whup4ESJIpZcRjZtPMvHLD6VYiurh7 ou0kK
+  Z3YLJw3HUfyrPE48kq2YtihWJ6ls/Jg9gfSpAgnnneeVYTJJ5hHQRYGNmPWspQWraJVJJNy SX
+  9eo6dg8MMkrfvYkZJVXghm5/QVDDO7hI4Wh+V1L713EHsPxq/bXNpsaCORGaSMyOG5YN1UZ/Cq
+  DS77dLown7VIELqvAAPXj19PSmuzRM4pq0ovy0/rQtSC9innaW5tZDHcCIrHHgjcM4rNuLq4Mi
+  QR RDlWwSucAHk/X3q3vgneQhJIiZlU7myWPY/gKyLuC98yVFdFjw259v3QDkj8qujFN2f9fcc
+  lOEHP ldr/AHfkZ83kyS284mk8t4H80lzwM8fjV03P2W0E7IArH5iR17ZH0FVXgeWGHLI0Usys
+  MLjKDqR7 dqnuDK13PIAttDubJmXcoZugx/nrXa0nZMIwhPeV7f1p1BbxFO/7QssaZT5f+Wn+2
+  PYfzpEnSVD9 pmQ4kR1C8MFxzk989Kql7h2uFhgUOR8yhRw/YD0759arGS5+zRo9sdyxKJDgA5
+  BJ/SrVFM66WGi1 yvWT81dG5MqRXF00RyGlVkXHRgOB+IrLB3zubsJamaQ4Mg+6wGMH371VbVS
+  u1FjL75hJKxHH1HtT bq7u5lZCglgMzksiemMNn0qqdCa0ZcI4ty5ZRS83v/kTxQzLE8oxLJlS
+  rJ3H8RHtWi87NaSGOWFX UhQdvAz0P41nrMv2WNJw0blHLyA4UsCOAOwPHFSfZvNt7mUSAxyzI
+  Qo4IbGMfn2pSV3eRo5VKslU qO3S7XYcun3P2ppPOjJiby2Kg8secj2xTjp5JnzcKkDIXwe+0c
+  f41FcpPZ26qUuHXd+8YtwGGOtX p4FZzbHcjSTtLhj02gHFDnJWfNv+h6ClXp8slPR6aJFWyhS
+  VTunV5y6yjaCFCD73Hv1okjf+0DLH e25jD4UKCCw6g+9MgvLgXkjwiCKSXlFMY6dx9Kcy3G2K
+  eV4gpXcE24LHHOP51UoyUtX/AF9xpUw7 jUak7X9L/kW7ZFF+u5M+ejSOq8c9AR7d6ou0tjaQr
+  9nlVhhQ7gNjnPNS20aNPbubgAG13uRnjnit BkV7me3Eocq29QfUjpUN8stdTWdBxnd2aS6r+k
+  Z0qbVmBkimnnl3bsfLhe4HpUqs0FnFJFiW4jY+ Vx1TrnHvzVoQRNbwyXPzSJExJU478n6Ypsc
+  0csEiCaIlySkm04CH735Yqea62MlSlV5U1pfXtb03 M2RElTfMHDMf9Hx3TGc/0ppeNLW1RYjb
+  mVC8zy/MpOcAgdsCn+Xd/unaI3VurAKsXoBwc+lV7iDI Vmy+CJCg67F7/SuhWbs2bOz91v4dr
+  flb/NE9xbNEI5rrfLAqMigNjpjHPvVOK0WVVE100crksgLH CAdc1Ok4urtsxTyxGTzUi3fe68
+  /SqQMshlgwI3I3lWGScDt+FXBTtZuzMFGrUnaUrNden3bFqA87 1PnKSN+85ByCB170yUKWidW
+  WcxwiAoP+WjHkMP8APakniWHTrCSK4jEgiI293JORU9nEJraBhhZZ jvZz93cCen4DH40m0lzH
+  FOUYx55yur2/r/gEQQW908+Y51yy/OMkn1GegqOK3jfzhcNLFNGpDHP3 8n5WH4GtWWS3lngSB
+  02yRtKQRnYc4Gfp3qvFbPbLJvjeV9g2yBuGAyTUqr7uujNac3zc2ql9xYEU cUEsVvKkciuBKs
+  vzcjnirqXDSbHS3n8wNmNlOFVemCO55rMhmRmU8FWIKKPvKP8AaPc571ektWUz SrLtnWRfMPR
+  cA88Vzzir+8TUoc8rS/Hq/kZ9w8wjQ7HVo4yCZOcjP9DVy1uZri+dpLSaOUk/Ox+Q DHPHr6H3
+  qyrh7gwzzQMGYuWC+/8AKq1xLN9te6kjZkMZA2fKpB4/Q0X5ly21Eo+3vSsk1/XkZKzx rcx+a
+  CRIQVJbiMkEAn6d/Wr0L3L6itvbR+YsTbJ5Qvyl8cAegPTFWIms5dFUtA/nQMICM8kn+tZs tl
+  Khe3t/OEzSDZ8331HJP9M1reMrpq3qclSEailzaPbXXb5oi+0+TfszW7RLtbcrYO3jCgVbZfPh
+  iVkEzn93P5YwUOAP/wBdVZEtCZJCXWTzdpSRs4BGcH3ppmjmvnyJbYNzIhPIfHB47DFauKeqRN
+  aE J01Kle662/r8yMmC3leIxuJ4wUbe2RJn+ID6VVSFzeRRorSxyQlgyenc81YjgMtteebNEhW
+  aIq56 learyLY29w2VnkiUOqsr8fMOnTtmt4vdLc6FOdOLjF697f5/oTx/ub2ONo9qqDlnAyyn
+  qQfaq32p RdAxWxlzGEAU9Ewcj6571CkFxFbo00UuyMlWOcD/ACeKvwpbSWpkKSCJ0OQDypXqM
+  02orV6nLyp+ 85N303/4O5WMM1vEbgKscRjZAJl3enHSoXnuXcweV5sMbFMImCARnGce1aEUEF
+  zdopnJjERY5PCq BnJqhNBcIlvcvFKF2byduATng59OnFVCScrPc0aVWTUtZR20t92t/wAwtIF
+  lZIvNcrjKtu4UkUGF fteLhTKYh+7CDbvGPmPvg1Iu1pPMLfZpwW3uT8jEjjA7Clhed3sY5XUR
+  SMCxZeWK5yoP5UNvV3PL rx5FKUtu3Vej6/eRFriC3EoWN1kQMxVeAM9qYIo7maJpX8hUT98c9
+  WPTHp2q1ckwtFIssXnoDCyb crzyePYGhrUPZRyJFLL5kRyUYcso4/nQpq19r9TSlWgqS520pa
+  XMv7NcxiNpYmTjHJ5OSeR7VItv LA6wNNHKsrMEAXczlecg4zj2pryO/l7kWInr8vOPX6U62ga
+  e0ZmUiQSkDH3l2jJP8hW8m0rtnTXi qU1epf5NX+5ldIo45l88svTcQMHnn0qz9oimjieSCSaR
+  VfZGBgqBwNx71F88l1byMARMNxyOG5wM VYW0NybgF7cRQO2XRApfAxwfTPalNreTOPHKlKa12
+  6X0/C5meT5LbAGIVG6fxd8/1/Co5pxHcK5M W9n43LkOcD+ea0o5LZDI00ckiEDABwckc8+nbF
+  VSscrAgKqEqEU8sB659q1U9dUViW1C1rfiQxPI kgSC1kkuTI6h1bhOOmMdcVVdQiWYMxilkyZ
+  Cc4Htx61Zni8iVUeJ0Bz8z9x6023k813liSPdG4ZR ImduOo5H8qtbXRwywzmrKV29kv1fYI7V
+  IUKxxzuWJwCclW7Dp25oeR0kVUaFlEyIzbcjHr06Vaju HkeNZ0JN0jyKy8BcAjn8qht7tksYE
+  PkyKExuVB8vPfI5PvSvJ7oVKc6kHTi7fp+f4Iu3NusF28iQ uxjuTsWI7Qigc7vWiEIL1wkQJz
+  x5w3eYOuRntViFx9kObK7kvuszE/LgHOMfStG0vtOvpnikKwRS MW9CvbAP4VxzqSUdr2PPrS5
+  IStd269fuTJ20/wA+KeSMTxgToIwz5x/ez6nvVjyEiuS1is0oQneF f7x7Eegpbszx6a8TSLl5
+  MqyDG0jBP6YqvatcHUg7zxso+VgoxlWPP41x3k43b0Pbmp1KKm5K3bo/ n1LF2LuWFGYMgVWEs
+  YGDvP3RWAkVxJdslwoiRgN4xg7sYX9a2ob6KHU5o2indMjcS2clR8h/Kqtz qNzJayGPyTHs25
+  MfJJ6mro88fdSKoOvCXso2Sev3/eTyxKmmOyrLKN6RFlbo38Q/E1pWV1KqxrFH CrR7UcMuSpJ
+  4NVpJAmlnzEJjWVUYDgqxAxn1NWW8kW8CHcZEUiQo2N+T/hWE3zRs11JiqkqSjP3r N7frc1mu
+  DatI0sLFA21mQ7RyvBHtzSSWxa3ha2nfMcJCB2LYIIwD6k9qzxJpiy3UX2iQAMBGsshO 9O/41
+  pRpZyBZ7aR5FmYlsPwmDjafc9q45Lks7P7i4KOHs1e/mrp+VtSC2trh7xGuRJbupwct2I+b 9c
+  Va81WmjUQTTytEVKo2MkenpxT2uf3UipaXEqyzeai7ucLjP4U2W7hMSyR7djjfIy9ju4APbIrN
+  uUndo6qdec58yX9fmStBsRirJbRmRfKEi5/dnjj8arCZ01Z4J5AYY45Izle55GfpV+WQTrLPIP
+  LP 2gPEn9xc8qfXPUUySdFnmuPKA3K23f3OcbvoOlRGTe6IpVXKUkkn29fxZBbRrDaefI+CWCy
+  N2zjl vwqq0l9bm0W3YyKvAkA4ZTyf06VoKIHtImZxLtUCQKcAMAePxNRyT3H2EC3lhEhG/wCZ
+  M+WccqRV Rk29vvFTlUk0uX79v8xJC7adIyTRNG1xvUleSB3B9B/SqbanapKiBo3kZQymIbd3P
+  P5mponme0Y3 AUxxNsUouAAwxt+vepDbW9vbwwuI47oKCrOuf3ajDfzqlyrSWvoOnXcFyyXXpt
+  8+pBI0bA3KrJvZ wxGeDngkewp8MtxgRPbuYSjMCV9DhR9apmWFbuI/62NcIqqcbtx6/lVp7+P
+  dMlmrsvnjgtnJHce3 bFXKLta1zonUk0oxV/PoMLXSywuY2TeuenAwcfgKngjuGinN9BIio+2N
+  AfuLnlT7niq13dXjXrtI 0UNurHcCnVgM4HpVjcGW3lmvI4oJ4iy7s/N83B/MUmmorbXsNwcIr
+  mas+qv+HmTBJTEVQAhpFYBu u3JLH8KssYPmMUm6AYIyclgenNYJUhGmaZ3y2x0UkY+npVmG6g
+  VwFxIuCSA3TBwv50pU29imnKK5 btfcarG1P2mQwyF5HDbUOChx0pjWcq2R+1SqpAzlRjcR1I9
+  uaha5LzRAhQ7IUkwPvNnJx6cVfuby ONViWGV4JJyXLNnacDCfU1zvnTSRy1qzjaMdb767GRbx
+  Q/apgJt7u+8c/eGPvD09KazfbZlTeYl8 plCk5LHr+dXfsokmmkVTbyqdqo3XCnP9arXVyrzyI
+  1nIyySeYRFhWBPHB+tbqXNLQ7It1GvZ6+b6 f16lcwgWmWtLnfHLkAPjI9BSPpzyXdribZCS7O
+  kmSQR0zUUwmgWKSRZYyrKz7zwSM5P0Gal23J0u RzFOGFwoikJ4HcA+ua1vJK6ZzVoWio3Su9/
+  6uir58pZWR4y+zMhC9Sc4I/AGo4p5g0QHlvHMu9iV BMYA6H3q41tbTN5k0m2RH5CkjJzx+B5G
+  KpfYIbczCOK4TZK6sXkznI6fritE6bViJqjFcqWvf+rD obeGOS28wxGQRHYCox17+vNVGsrae
+  wEkry28u05+bjjq2PSlkKNPaW7tgFi0ZU4MaJ2Y9yTUn2uy 3RII5C85M0gZujA/dH4dRWq507
+  q9/wDhzOnKaqLlb/r1GRRQK0kC3UTIVwHbkMSOMfU1ckV10YQS SxyCPB2qMMSMFufaqjTBY4p
+  ljRAsLZ44LMeo9hxWjA159iX5I2lDqwJXIfAwWHtipqN6Nnqc81yu VrX0vpr62K9xcw3ssCsc
+  Kys2A3RCe/qRjrVQEW+o/LJJPIjkZJJHsamXEksUVttMqxuoO3ONxzTE ZooTaPEJLoRlVOBk9
+  8/lWkUkrL7v1PSwtFtS5tF5vRee2w2V7YeW8cEgmBKyuD8qZ9vpSxNbtqEY 3v5aj52ZuN3t6C
+  nW4lcxSgIZtwwNowQOScfSr9y0BaCVoC8fzNGUwMKByp9T70pSSfLv8x1HTpz9 lBuV+qav+N/
+  zBNQiexfEItnk+b5wMcdMe3tV0XRigt3keCKWORY3kZeGBGc/hWdMI3t13jzYyF8k LxkD+H6m
+  nXMSy6WgKEzISzx5+ZeR/KsHTg7K24pUKdVQppWTe99vX+rDrpJplGyaOUFvnSNcEZ42 fUjms
+  hkMaqsSM4zt3A8Dnp+tW5wy+Z54YwiTflDgseOR7UyNZRfNLGVcIpZhjAYnoR7V00/diejF ul
+  Tave3b/P8A4BYlldknR1aErMFUrwFQevv71nRXNs+2KUmMIpVZCffgH61HFPLcRFpSoKnYWHR8
+  HP8A9anRR2huna5lAD5dgvBVjwBVqCimn+BwVOV+7q+unQjheOS9cM4ijLEvjjHsKgkEKNEY98
+  i4 JQ7sHHTrVtbp44CIYoisbKFdkHfg59SaaGLCeG3VGjLHy3ZeNo+91HarTad7aHPGo/ae+rR
+  Xn/wN y7PPZtYRKE2RFsBm5wx7f1pPsot0jlKSi3gBjdC2CHPfNZawBLRJBlkYI5IPC84596uX
+  OotMfJiR zGjYVs9s/eY96z9m1ZRenUiOFlFpQlo3rpsvJ9yylkY7aKR3E2+MqNgxuGcZHtU3n
+  pD5FqkckZfc FeVtwVD6/wAqoPOHW6PmsrGQIJM/KFPJIHbOK04UErTSxIQ8bmJd43bdw4z9Ky
+  mnvIxqQl9uV332 X9fIdN8gaVFSMwusakjgA8Ekd8VNZ2TpMZDexM8YKcqSoAPRh3JzTYWsprF
+  rf5p5mYeZsfHzAe9V x5hurmNw6AuquF4wxNZauLV7HZRalSdp2a30Wq+ZbmZWJaSF4XWRYpG7
+  euP8+tVZ3sriGeTz2kTz QibDjaD2PqeKs3Jiud0ckv2cRNtLseGYnr+H9agnGLSTyZLeXzyp2
+  Rrj5s4/PFFPS3QmnJRa55Ne m33hKtpHZXDW0qguWkTJJ3Dpmq8Nve/YUWM75HK7GxnpycfhVp
+  ZJhmCX7OwhfayGPBA6Af1rOLzL CD5oL+WV3A4XceBj6irinZo5KkajpuCVne+qvdf16i3VosS
+  tcorRF2O3zGyCuRzU4uIobwOLOS6W eRpMpjlV44qCG1dpopi5ePyismTxyMZHpUgh0+wsVi8q
+  6uFDEFll5QYyT9DVSatyvV/15nnYh6Kn K7b9V+v6lDZDPKfJPkyGMsfMORkN1+mKrTLCDapeI
+  8gt0JOzjfk8H3xUksTS+SLWTyT28w8kHrz6 CqUsc4d2kJkWBvJLjo2eRXXBJvf/ADOmDjWSg3
+  a33r5/8OaD2zGOSSecLbhhtbJwc/1PWnGOFtPV IGEMbFgN7Z3E44/HFVAssis94ssUEkg3OCB
+  8w46VNeQEKypGxRgfNXuHUcfSptqk3/kQqicopVE2 nppp/wAOQxW6+ckUj7ZGQExr97jqPwFI
+  sFzOVti8nl28ZAIb7wOfm+g4pZEjZU8y4ETOpd5Sp+Zi PlIxyAa0obbyoGhKyXC5O90ONvy52
+  /U1U6lle4sRibtSk9Vt0t5roZptI0trEvLmJod7PnIJU9Px 6VDHJpqPIxt7pdzEqjScrkcVPH
+  qTq9mPISTJUKm3O0E9D6k1LMbf+2Z5r0qY4nMaxxjBORyfw4p3 ne0r/JnC5TlL95e/ZP8AQyU
+  KTwJFJgzhVjjPqeevvRBbpcrAju8PykrubhT3yPoM1cWOedA6w/ec EsP4V6Z+uf51VYFIgY1O
+  RJuifPCqOx9Tmt+a90jSpJykowWvS61v+IxoHLPtljkJnTy2A6oQaka0 uo9NmkmkSWdZlVtg4
+  2sOB9asRpLLaSTDEfmOWjGMZUEcj2qpLBsvJIGuGiXcGdmBIJHOcUKbbtfY pTqS9+Mr8u+5ei
+  aOK1jXymd1DpGncDOR/jVaRrdUidQ9wTGfM8tyASep6fh9a1khOx7hpoYopZPM Vip6D0rJ4tg
+  xkuIZFOGARcZGc+lY02m20edRjOabir791fy/pox3tDFYRMjOA5PDnJHqfpTgYvLl NsWlIlGG
+  A6Keg6dfWrtoxt4rm3WFw8rEuZedozk052aAXci2f2aPIHIHGR/n867HUd7Gnve7Buz/ AA9DF
+  IfGzeHYEgMRwQPT9at28ai1t/OubeBZFyDs5AyRzjqanhMFvcpFIiyMFOeenrxioGZHuS3l +V
+  FvK+W3JUVbk3oVWpyu43aa1utfu1f4kZuIJ9UtApKQRK0bNz8p5NXYRb3c9k0UkNyI90bQwxlP
+  MYgnIGO1NWJonUqkQYHKRPGDuUckn1NXw2kO7y5KSGUBvKGxcHqwGOlZTmraJ/1/Xc8tvm6t/e
+  9f zX3lqxMSXFuSGtnW0KM0rZEhwcN/SnW1ktzoUMUM1usYGclPmPrz7VZSOyWSTdcpAJGKIXO
+  d+e6+ wFNjkBeKOWNsRv5YCHGM8lfc9K4XNt3X9feYymlUVSnuv66mtFEP7NdlImj8xPqBu659
+  +n4Vm39t eSSEJGJACSEjGGGTyCafEGTQBEsjHzJVZZB0XB4H51PcKyyN5sc5lkyzhHxt2nkfU
+  iueN4zuenT5 FG8tf0/JL5DYI1huhb+WSHYlZTyMDJAPfmqqRI6CWaKQ/LtkC4ADNkgVHPbm2u
+  Z1ijuCA4VAWyT6 H8M1AJY7h5LRWeBWJkG5snco4z7DBreMW9Uzr9i3PmjL+vk7k8MN1E+5raa
+  QFgGjByZGXnePatSz uY7uVhLEYysnylu67Tmo7QSg4huo3llkVjkZ2gj5j9KZme0vYt0LOQpV
+  FUD68+uKyqPnbXUmVR1p uKav0eq/MtTMnl2xtI43X7MWQsuT14Ge/erfmtHAySMiuyiRlUY4X
+  uP60sc7+cTIq7mGI/lwpB6s PQU+SS2lEiSssksUioqrw3TOPzrlb6NHdFctoy1a3t+pXnXy7d
+  ZYZZDJIhZzvJA56D05q5BbI1zc yvBMTk5Ct8uR1OPYVJFLJCt280tsQs6CVdnfGRj0Ge1W1uZ
+  Jb4s7xDefMZFXGeOR+P8ASsp1JJWR NfGTpwdr8vfuQMi7j9n3tFMyyYB544yPY0k1pIb6eRm8
+  qMy+ZEr84UDG0/jVea5k3oxeNV3CNFC4 JUjJx9e3pVeTU3kDxxwTBWyYtzZwgIHP40owqPY5v
+  bOony9tf6/4Bf8As7BlAilZF5kCtjaw5AP8 6RlRJDO0MyQMgLOW4YscAj2FZllcLI8qxJcsRO
+  cAyZJHp+eav+YRFbpOSIiCzZP3eeAaJQlF2Zk5 Si/eV/K5Dexf6KEVZGdZU37WxuK8n9KgnEi
+  yXZF7AirMwjdxnCsNxXNX7m4Riw8+J2dGdNq4/wA5 7VmTeW2kh3+duQFB54xyfp0NaUr2VzWj
+  OUeW63f9biqYmhmWJC8wKsIgeVU8n8utXBLaN9q8xGdW uFVWi4zkZH51jLOwvDIhUF4+FHVxj
+  HFXvtVstqEit5TKkmWG7+7jH861qQd9jpxNSTmko3Xr+ZLc aj5spgSzmkYksy5B2k+tMedo1i
+  geEhdg8hXGflHf6ZqQPpxvXOJSwASRlbG0k5Gfesl55odTEk2W i6ZI+8RnAX05xxRTgmrJWNI
+  4mM4unGNrd3+Wp0Fiv/LScxqRGcIf4euc+561nPArmNtwaOBEibZw ck5IPue1MkdjF/xMNyKy
+  AyFDtKP3B/SoN1gyXCxXW1XuVl5Y8gUQhJNv8loRh6tVNrX5amwypp8i ThXZfmBRjktzgMD+N
+  ObUo7C3ijSB3ZGbZv5ySMgnPXFWDIJtUuwAGi83ace68Eeg71Nb2CyRKuEm WKMRqCMk5GS3Pp
+  XJzQ3qFUVRc/36bt+KKEeqXJsre5up0YL8pUJg4J+YH3IqWI2ss00q3MSpx5eT zuB+VfqalWw
+  tG+zrIS4dQyYPHTmpZZbVIJUhiVptyeVtwAV6v+PvTcoXtFHVGpS5uSMdX91uhXFw El/0oK4M
+  RMiY5BPBP0Hemxq9vp3lR3KTRcSEHJJYdSD9KsyXCPfzeWqMjLI6naOoxj8O1ZxglujI OI5tu
+  fK6EY6n6dqcVffQqph41FdaFYPM175gMcls08ZVlXqOauNEsl0yAPJEZW3MpPyDqFb1YnvT BJ
+  bCSRUuYflJZVA7AcEVkOb6K4MqeaFypUn7uMcg+/PWt4wc3poP6pUqScnaL/P5D5LKOXUmhhkE
+  Nw0e5/M52Duv1NPMv2ey88rFPAZVYqqjcMcdfQmtHNw/mPbIiMqMAzjJxjr+HNZHl3Bs9skkdw
+  fl 3+WuNoPQfX/CtIy5/iZz1E6sl7X4eu3520+8ry3P2l5GlUhBnMSjBBP9KtrIqJaNb3IjwCw
+  3nOV4 yv1p52R3bCe1ChG8tJccMpB5PrzSTWMccixGZXk8psKowRgZ5rTmg7LY7F9VkuSTcbbb
+  Nfht8yRd qX9zcrnyFzhwehPO0+9RNdxvBJMtu0U42tuf64qujy3Uc7rcwNvwWjCkE8ckfQVfi
+  ljs4YpYl/d5 KAuN4AznB96TVt1dm7lF2Vm326MrXAnlkeaOMZXcJ0Xgp6D8qglWSVLaNZBhY2
+  3nJ5yM8fhUzwwr M0yNLLFcO2Nr8AHGAfU1TiufsrlbYbnUmMhuev3h9T0FaQu1obQxcpxUVun
+  8/Q05lgXTwWWQHyyY WzkEcc/jTIr+CyuXuEPm5UKQ/O7I6j8arm4laSziWIYjhZTG/OFzzn1x
+  1qGCJFspo5IWaNJE78vj OSD6dKSguW0v61D21qLhNd9L7/16jzPKb1ASPO8hlbPQHnIx9KbFJ
+  Hc3QkkZhEYdpCnHIXgfiaqO rQ6hHNKd0bkPkHG49OPxNRRlrd5zEDGsUiqyvzlhmt+RNaDliK
+  krwpu2nf8AUfLHJHbwowaJEALM e7dcVYN1HHHDJbRL5w8xZFkXOAemf1qBWeRvOdWl2xjcM9e
+  aqossT9dyiUZcjjHb88/pV8l9zlq0 Vo6i08tn67kqvcMkk7cmOSPbtX5cDPBHrV2N3RXkI/co
+  5jRRwSXOc0C5EcojZQgRiJkK8sazraQS 2rT3mIyS2yLOC2P/ANdTbmTujKTppPmVr7bu/kX3d
+  50SN7aUhJQFKHAPv9KYDJYXjlkATftcMOrD nH41H5qoYnimJ2ybio/iO3j8B3p0SyXhWSd+do
+  BA6+5oSstdjKlC1+ePuv1/zGRvs0+feNs7SAMj fw47/rWhDewwh5JEkNw7Kw2tgHjb09ealDW
+  cLw7rmDAUq4aMkliMAmqBjS6vYVKmGQJjeDxxxkis 7qd7rQ6aNSNSnJSg+VdX289vwNK0t7dc
+  TwS/vYZChJOQoGQSfU81YbUbq2kh2wLIuQGbb99v/rUk hjjsWihhfIYq7g8Mxxk0kNw7xeVPt
+  RmJbzCML8pwcfhXM/e1auZ0o05q8ld/p0sTeUhuGcoFjKEs pOTnr+dVmCMYQ0qJC2HZFyD7kH
+  tg1PE3laxczFgI1Yj5uQuR0I96alz81rmDcEjO7HYvxj8KWp01 IuS5Vt3Wn5kk+oRQ3IItjIj
+  4dmGMt2Bz7U2OG1ighFy6hZk3Akkb8N2qEQfZvs8T289wAGXKng84 P86tF4L23isjZ3MXlkx7
+  nYE5Az/SpfKkrbdWcFSrSi1ON0utmR3L+XbpNDl7eQCVwvXcpwAD2B4o cmbTkYbWYxu0qY53b
+  h/L0qhPJcWI2grycmNhk5bByPbtWebkkho5gJG3BlAI2ZOOfwzW0KDaTX3k zwqlZv79QZ8osi
+  RyBpCDEM9s81auppUgYxRYRZf3pdcjfVqeSzW4iiimjZEcbWB6gcgj8KzZ7mIt GQHSKeB5CXO
+  QWz8v8q1j7zXumFPkqVUqkNPO4Ti7lKO21YmRn2sOqnrj8amsbwR20Fv5TSyqNif7 QOfm/A1F
+  DJa29pDvZpLlvlJLZCBhzkVJO6GKJbcxstsuNyjBbn19x/KqkrrltoTVXtkqcaeib6NW /wA/v
+  LEEVlsnQt9qKg+YU6A4+XHoBUCyz20dvcWkgLtBmVWGd56BvoO9NLz+VKwCW5UfL8oyytzu /D
+  +tN2Ty6MS0L+bGxRCOAA3LA+tTy93oZum4uKqStF6NN/oE0rCaK4mkhOSGQImAyqOv4npTLgCe
+  yile5gVZmLFtuMMM4/Oo4rO5PlxFPMETbAmMkgckj2GasLbWEsmFkwypnlsq4PO4e1W3GLVnt2
+  MH JKakparsk9CqqqVhRfMk2xlHkjbAZ2OePYdKt2/2lbG5S7twUkuIxKdg/dE8fh24qVI7fa5
+  QgtuU RgHG9eu8ewrOEsyWsmZBmdt2WzjeDz+lK/Pp/XcxqVvaOyaXrv8AInS8SC9uFcgxQ5hZ
+  Qv3u2R6c 1Sku1ujH9oXbtXACjBPH9akltbZ7V5beR2LSMwQnJYAjLfQc5q/PPbwaXNPC1vPKz
+  EgBfugkYH5Z NXeKaaWr0CdSnzx5U3J6dV+X5mUlxPLLJC6OsciHykPO09BWfJt+1qJIZNsJCH
+  J6EdjWje3UjmRB GkAJOH24Z+nzA+gH86zfKcxOqiRzJJ9oXJyQRwQfWuqnte1jatKVrRjZev6
+  6E1zPFJLKodnmLk7l PHQZGPoMVG8TSwW1wkihPLYgE54B4J+lQuGZFkmVVMkZIAXBJ6A0WUcs
+  V9bTsDFD5bsA4yGHTp71 ajaOj2OWpdQXJq107+X9IuxJNcaTl2ijkO5i5TllB4YH0xWbM8TR2
+  qqNrhHyeMsO2ferZmJt43Id Sp/dgHA2n7yn1qi0QjhEKrnOGB7r360U1rqcmGoVXa8LO/f/AC
+  /Uv2awCVVd3jgCtvZm7kcfhnHF XEjtn+z+VtOUK3Hy8I56D8ax7ZjHOrPIi7RjDISMHnmnzTM
+  1wHjDRMwO9ccEf4980TpuUtGddaDn UbgmrLorK/mdPcxRRwx/aoXJiUoCDjA43fiOOadKtt5M
+  rBJd7tkYk7ADmksr6O5tEieeKQRRFSGG S5PJbntxVmLUIrS0vH/dyTb0c5UEcDoPrmvMfOna2
+  v8AwTx41qqlyRT5+urtb7i7ZRBoTBHJH5DH JJ5JIyVI9OaqzXM8Ytp2/eTFFYvj5Wf0/KpZYo
+  2DkrKBHKRuR9oHy5FQ3E1obaPaxSTH7lGbJCsO p+hrGGsr73PTw9V2va8PMoz3krS2txcP5i7
+  d4CDBIU4B/XP4VCbi5M8SW8SlpJciXaMD2/GmTwSS zW6Rt5swty0hTowB4IHYVEzs0aedbywj
+  a/mnOAGP3f0x+dd0YRstP69DrnQpcqlbX06ely8zSxpN HvSFtwk9Dz2/PFPmWRoEnd3V0VhKC
+  f48gAD061HbXGm3NpFLPHKobAIL9wMY/SrP2GUWgkhJDuQz Rtyc5/p1NZuSi0nodeCr0YOKWi
+  v1W50Nus1vbODA11MisSq87Rgcc+9QwlNyugCXMh6MM7Tjv71U Nw9oywz3CSCSNpHdSeo+7+B
+  pYHk/s4eXcwkD5ZAyZZXboufXFcDpuzfcxSUbycd3uXdQMk1l5bTQ KLn98zBfvbR1Ht2rOhju
+  0iuD5ckvluoGDgrkdD+dThmCeUVwyp5aI3PH94ew709lkguYYTKoGxvL bJwyqO/qT604Nxjyl
+  08RKlT5W+byaLVjcLbzSSXTRSKVGeOrEEDHpUXl2Uott0U4ZIwku2TGw5OQ femRW8XlBp2zGw
+  LKAcFSPu5/Gqf2bfq7QC+jhUBRITnlz0/PrUqMXJtOxPNGo5VFLla9TV27Z1+z BYAswXzDznj
+  Az+NQzQ3rTJJIoe3izE8YGGDnkZNVbotBLJgmZNjeYUJ4fjj2PerdhPDPFdNNcFC8 qyKpPTav
+  Q+9S4uMedanPWo1Ir2kHzX8l/SMi1t5Li+DyLLbyL0VjwVHXH41uzWhN/CyRPcRFZJ5V jOD8o
+  wBTZILe9szNb3KxyOyquSf4u341Pb2VzFZyW7u4aGb7OTz8yscmlVrX1vbyMcZjYS5W5a9t Uz
+  F+0FDE4WMkR7sFB064/HrVdobZ7mI7pZ5XV5MRPgEAdfp/hWpcGOKeWNF3M43lcdQBjj2FZuLh
+  oYdpiESIYy4XlApyQT710QldXWhvGrSUk3dP1HxG6hhRp7WRoTGA7AAfMRgVnSDybmeKeQpsmS
+  Mu /IC4yfx96lee4k+0JCWfcN+M8YBB3fTFPghSXzXWCVw0scoLNnCdwfUit0uW7Z0z5qadS92
+  +3/BG pDmwkEjSkDI5fJyM5H16Vo2dhb/Y4Y1w0uV3g8k4PI/rVaWd7Z32Wsgh+bypG5DqeM/n
+  SW4vJJjL cKyJFJg7fl6L/U4rOfO43vYiNOs6PNL5K+/3G/dxNv2BXSGN9pdTjdznr9Knhv7Y3
+  ds1sszYR9yh s9fX6VjW85HkQsxtmmPztM24MR1I9B2qxaEfbZUMfmKswMZj4MYUHIb17Vxype
+  60+h2U4XptSVmv UvyO6x24jjfYFU7s5zt649OtOnkd4dtmI2lLMSNuSg6AH8M00XLl5ljCvk+
+  Zux8qEL938etTw3Jt rSBvI/1sS4bAwM9B9cms2mrO2p3fVpwjGX9fiPjjKw4SSKQiRQ6qPmOO
+  hHoPX1prQqNQmWRiQjFW wTl2Azke3tSsbpkeKRo41jOHbZjcVHGPqTTRJcLA53xRzrMmSyZ2M
+  F6H61HvdyalOo4tp7/12KVy Y/It7lYGjMcfzPxtUnnBH0pFW8aaWVGj/e7QkTx5wRUF/DP9g3
+  PFI0CyjcFONoAztPqeetTXFoJk S4S88mMxOQCTwcDFdC5VFa7/AD8ypezhRj3lp3T8inLczoS
+  Xy7OGbbHx8o+Xj+dQLGsttFBPcoeM fJ8pJzkE+2KIC8Ee62kSeLaMoRlgSM4z+pqjDLGl1bTP
+  l41/czFegZs4b6V1Rho7f1/kS6cVCXdf P81oLdFo98Ak3bcgHPXBB/OrgmhuJmW4SUOZWdSGx
+  yB0qwkMSynZLG8aHyWB5Oeuc+prDuEhWJwj mYqxbYMkgY5qoWnoZU3DESjTbtbW+paiZreTyx
+  NDArK6KrjLEsM4qKWa5jtYw4XYgQoGQENx15rL WUhxKsifu5AFB53ZGMitOK5vIxMTGWljyrn
+  aGVScYGDxmt5U3F30O2M6lKfI1Fp/L+vuZHIlxHcR hI2KtExRh0IHUioZpQsqExsVVAuBgdR1
+  zjrTXuFGnwkCQSOcyEtxjPCj0zzVqXc4kLRbEjZs5H3W IGAcVabT1R2UMZKcveVr6X/ytr+Qv
+  n2xsgYmKygqMk9hwAf1qQRCOwhmklJaKMhUyeRn/wCvUEdr KY4o0VCZAJWGMlWUdKRz5qONks
+  Yd1yWOcORwKhpXsmcHPSc+Xm0W76/jqWYJjLHFK0BMUb71J5AP Py/U1Uu45VltXT5nZP3qehP
+  c/hUiRTiyaFj8kL4nPq+Dge2OhqB0dfJ8+YSgfM0aEhvzxRFJSujl p0UqjcVa/wCP6fiiwFVL
+  YxRxy5kLBeeWAHQVBGbSWxzJMd0qAgAk7McYPvTIm8qSKRSTsOWU87jn HH509ImjupgqIfL+U
+  7kyoq+Vrr/X9WOmGFxCfLKVktVrb8NSoGJWXzJkaQtuYhetWoWEljLCQrYu IykgHA4xj6Vcnj
+  ki0yA+XBL5n3HRABg8HNN8m2huHQLIhjkMe4njHbPvSdVSj/XQqU/b0kkrtP1M uS1ZVlXEhli
+  nCDHQAg8H3zUsQnUpsDCKC42tnrz1ye+KvzyXeUjJjXOOduN3v9aW2ZVeYQRuXMgY h+e/X86b
+  qScdQnQbp2aTt/X9aEb2Rd7jkMBIN6jqrdqV4DLIdriWRWCtsGMk9x7U6BGgJjYtI0r+ YVB5K
+  pkn9asbA5edQxEqgqqcEZ7/AIHis+dp7nXQq1Ixeune36Ec7XEQBlw5DYyo4JPIFaTWsAgM Zm
+  VbqM7NhPJ3DLfnUsziw8gGHz2l5U9QmOMtnrzU9tZ3Mm9J4wud0nmbeQ46ZNck6uiexyzrQnOL
+  ulbrt+n6mQk0sMokiZVwArRSDcSADg/hWskk8mlQIhglEqpIzKnRh0/D2qF7RxpxWcq028AMox
+  we tTsst5A0EEiQlTuChMEAf0pVJRlZm1b2dSmmrNp6t9hsc9zcJcpHG0VxLIZg7j5QF6gemao
+  TzTbk dHQqUICAYZQ3TJ7nrzT2jleAmebKOSyyJkBVLYIqN2CagySMq+TmJAOwcZyfXFOMUnoj
+  jknLWCSS +f4/oZ8sCzBI4bgONrGPk5wOAT+tE6LFpM0C/ZxiY5fbyTxjn3qIK0M5kZTNFEApM
+  Zxu545qxIft dzcNJG0UDNuZ+yt2Fdeqa10RpiaUozTTuo6303IY4YhcCIqXVSGDA/cPYH15p0
+  oiVDayQFpI/lIX ggk5yPYGojIz237wEuU3yBePnzwP61CxhliLrP5cvmiNg5O47uapRbd2ee8
+  N7/tJpq+ztpf1LbGB pZXtmiaU4GSPlbcOw/OqN0JY4m8sAGErGGA4YEdfc1bispk1EpEyqY3G
+  4Hkgj/6xNW5raGSVFjDA tvkV2bI2g4GfpS9pGMlrcdavGlU5ea/9f13IY5kMc8e8IyS4DtyBH
+  jkfhTbeGK2u5J5DJLGG2RkE AAY7+p5qKFZVlGCnyk4BTO5e5P0qzJdTRG3gkltvsnmEZ2cgD5
+  tpPqexqZJp2XUwxkZUpcri0nvq 9V9w0MtsZZDHL5ynDNu+VvcD6cU+a3Atrie1QyASBFA6gEA
+  Y/OqcV3cG/ZgY2EiM7AjPQYJ+lV7p ZFslkklI3IBEF43L3B9SPWmqcuZXOapRnCqoOyf33X9e
+  ZetpmZreSCSJpLfKTfLw574/lVAGS81K NEkigLtnLLwuQcr9apCO5tUSNZY8PG/Qcrzk596fH
+  O8srJcRmXch2tEdpBxgGt1Stdo54YdTUpJa 9+33ktyluJvs9rDceaR8vz/6vjODUcM0DReakq
+  ZdG8zcMjJOBgfhU0V5J5CM0Qh2KB5hTODjGD9R StEdsUUJguABtxGmDnr+lUnZWZU4y05nZd7
+  /AK7fIrQ37TWbys8S7XAQOmcAdPzqQXsf2gPMjElN qhRjHOTT0tjDpyy+Syt5Q37gMZLHBxUw
+  WVkiWWS1kYjcieWOGJ4B4+tKThrZE1I04Qumtd3s/wAm ZMitcz+bK+yN32owGFB6gVfXT34mb
+  f5DgKxz39vQCqIguXuJoIY5M+fu2f3MZqxcs5smQrITGoG7 OF59q0k27KLF7Kc1pP7t16bGZc
+  281oIVZ1Eb5PzdSAeo9Kz5vP8APiCzDYxz908itWSWJkJjjYbc qpc7hg9OKryPbkp8mOBjcet
+  ddOTtqjVUZypPmla3qm/u0Ic/daaWMfLg4+Xn8qsecUubeRURI49y OzDPJ4wT61Uz8yywlJDv
+  3AFM7fz4p2x5JGW2UyLyxBG7k03FdTln78bP4e7b/LRFyygViiksksW5 ZADjIPf6VrWkcUdsv
+  2dXnDyLzuz8uDk1hRrlkEciuTEc7euAauG9JtraBQUMULKhHG7JyDXPWhKT 0Zy18NVTUYz372
+  aS9f0Okvb8ShZYwwt3jdSgONpJAGT+FZqSXFvpUYyhdZCnlFMuvfrW2tvBYxXJ tHiuplIG3G7
+  Izzwf0+lZ17Z6ozFYIWigEnzlwCdgHAz65zz3yK4aUoaRWi8z0VUUFBW0T30/9JbT X6g89wuP
+  N8os7mPcgxlAM7h7ZxVUS3dwpWWaEM7jgrgMvdxx0GKuMto2lI9zMFeSVEgXPOGGD+oq hIjW9
+  0UM8c/2VigZFxu7H8O1a07PZam+GqXbVN3f5GjbwQ+TJCrLKi3AKhRzjqD9KszmG2niks7w M8
+  sLt5ZYnbz/APrrMi2NdNG+6ORX2pg4Geuw+56VcnuFuDbR21vuuWDArs5iGeB+hzWcovnXY7Kt
+  KFOpfmunvsvvNCLZPcSyOvneXMAhX+IEcfgTmlubaGSLq/zuWkVf4cevvjNUivlRvcNdRK6N+7
+  AB AKk8Ej37VIZbq1DzR3Nu00b4ZGTqOvT8aw5XzJxZzyo1PaqdKXpuv0tbzLcE8EEPmxhwJji
+  ISHJ2 g4BHtzzTL1Un1m2tzcCEWiMskhPDnqCPY9Kkljm2LKkW+6dS8S8YjUEZXHqc0/zCby5k
+  AjaWMhXU r1BX730xWStfmX9dBPlk25tv87lszl4LhIFBkllVgP8AnkOmD/Oo7uSEpKkmyNXBL
+  SgdCuMD1ye1 UzvTyt1tMlqUKRgH5gGH3ie/NUY7Bmw0kwaKBfL9iSpP86UKUU7tmlKlCKvKVu
+  3/AA//AADW85vs 8z+bGYpSJRhfu4OOar3d08ojMBjhaUkPlOFJ4x9e9Ogjhh06CCRZVmFoVkD
+  NnDZBNOWMtesw2g4y UYZ2E+v4c0LlUrmMqkVPmta3f/gEVtGE06NUc/u2Csp6gjP8qum9SaOS
+  C5uhE0k24tkjhOv59qyZ UjsGWWBjcIxyCG/1ijgEfUmpNqvKJIruC2nj3mVZoycgdcVcqak+Y
+  HRdT3ld+aW35/eWrlJpXijL iPzVYrn7ygclCfXHNJFbQQu3mSsodWK7m4LHgVfhmknuojFGJM
+  li6gcxkjhT796o3W9o2Vp0hWMh k3DlwB1X2BrKMpP3djkoOpKbgtGv62K0YCtEl4PIieMhpOg
+  yBjFK0VmNkTLcNGcIHSTAJPAHNILZ rmSCOdxJvy8pBxtccZ+mO1RvBPbX8sjgLFH94kZCuFwP
+  0Nbqze+p1UKbvLln7/ZaL/hyxL5ccYtX WWIJGTukbIJGCcfyp9rPO939olkimjILEovyjPXj2
+  plrEshJguorm7IyAVJGPTHvVwZS3EjQG1yX K7+ijgbTjuetZyaSsdUq1OLtvff+tySC3tFjCM
+  j3LybfKZW6gnoPerQtHmlkgkjdZoW8tFRsF16u frWQikPNAqvE6vj5jnGBnj8OafczTrPb3cj
+  O7NvwEYgnoP5Vm4Sb0ZvBSfvRevTV/wCZs29l5MpP zLAgKqrHkhucn6CkmilN1bQ2ys0UduVi
+  Oc5H3ifwNU7DUJSXV1Mwb5jjHY8L9a2A0ovY2SBgEVlJ z98YySPQZrnn7SEveOx1a1J3mtfl/
+  mNuVNxYeZbJJulO7G7O4NgEj6Yqo8Ust3H9qguI7cRNI8e/ DOBwDmlS+uYdLEwaKN2dXTcmcq
+  ODj6VbW5AneUHzWU5dycqvbb+INSlOGyFGUlD4bp7WetzMN3FK sEcUm1JVOfMJPGOPxNJHNHc
+  yxqXUxrCElAOMEngfWopVWV0W4iMboR5Kr8pZAPvcVYktolt7yWOR I4TIGRz3xyP61u+VKw5V
+  ZWtG93t5P/MhRre0nQjDsy/6tf4SPlAPuRUKRpDFcpAqRtFIqfvRu3EZ OfwHWh9NWW1uZrecP
+  5kgcnJ4HWssSQNdtBK0qROCyMW+97/jWsIKV2n6nHGFKo5VFK7XxafpsUUv pGs5JGcC5kcYZe
+  AVPXj14rUitdqM/mRxJLnmQZLkHhh7Y7Uu6C31GZTbiZRc4PyjCfJkVTleS6nh VMwRbBwx+6D
+  wR9TXS3zbaIbrOV+TRLdsjSzaSaSeW3biQMGXAQjvx/KrE87S6dEfs8sMTFpJSSM7 iwGPypFl
+  maSK1jdYcKyv5vIT0B96WELKsHmXMUrOmDGoII3HFOTd7y6ETi3UVSotvX7+xUdpZL2F IEUxl
+  cxIV5I3fz61OL2VtXcw2T3cTlkwBkEDjceO3rUMsEaahJGjOiRnYCT8yn0z+tMd5I42cNtw 4D
+  ovBYkcEe3qK15YyWx6FWDs+RaND4vtJuQiCQIMMrHuq54/Gp5orqG3juoJUAcZdCuTkHkfWodz
+  JPcfvlgZJFjw3O44Iz9Kv2yOtlDCY2mWWPdJIDwCOorOpKzTOTERcZXsrPfT/MymuViuZVkYyI
+  z8 Ecb8HipWR5Bb7Co25jlyOV9zVyCCW6aZSmGBMiqFGSNuOP51BGlytr5SqMBgzHb2HU/QVXO
+  ntudq qqok4u0l+C/ryAx7LMQrAdpypLY3bieBmoY2YWkqzEhWkAYd9wBz+XGauh45J2ltpDkl
+  2R2OVx0H Xv15qSG12WNzHMVhjdlcO4zg45pc9lqddBT7K34/qVEV8W8brIVBJky3G329Oasww
+  2812HQS3GDn APXA60sz25gikihnQsuBKzZVselWYIGlikiWMo0S9hg/T86icvdvsaVKS5HKL3
+  03/wAhslsyRmUR m5BT5lQ4OQM7h7DvVIIhh3NbTtuOZJEbhj3IyOBjmtFmaEETRTsGbfuVsAt
+  3H09qfGfPs3RsIC67 UA5Xjqfas1OUVdmK9rCKlLXzTf6fqZkUFvI7gz7o43PlFeGcMOfw4q3Z
+  oWnt4XUxmKM+axPHXJ+n FPMa3FiVSFllSZV2rwWXHzEfhUhZEhuBDBOoklDKzHOAByKJTbViY
+  zi7qKavtr177/oTvObi+VEl RLcqGy65OCRgZpv2vyZpEa5E/mb3UpkAc9KLiPmCdXSFnIXbtx
+  kfwgU42luJXuJoJYn+YtGWGVyM fkOtYr2elxxhh3JPl07abjVYzyxfaJEETKXJ5HzdAtLcHbe
+  wQhmQxHbchTguSMbh6AdxVmyjlJgW 4h8hYY1QxOBuBz1P6fnVRpn826LwmJxMqNMw+VMclT78
+  Clf3rLoVU5Ze4nttbb7u4q2NlLGlvDfK h6eYWJUY6DHvzUN1bWSokkxlkUEttV8Eeise571Pc
+  rHBcvcRW0hlY78Z4XHt7E81WhuZbu6tY5EW NTC20MnXPGT+NOLn8SlocVVT91yqPkW+quvuK0
+  UUCTypGssNoVBkeVt2GB/+vTyZp3jtYwjxPC33 V5HOMH3pkEsFjqEQ8uSXEZ81G5AwOevvzU1
+  0JglognjzKdoVBhpCOTj0raV+YjGWhJO9n0b/AKuZ 8xdYYrcW4WURmQM4zkKORVBIzMUEiLCu
+  C4YjAz1BOO3pWg9vLLIPNV0hlO9pv4VYZGPYH0qBGW2v LVJ0aR5IsKgONuD3rphKy03MvbRjS
+  vDV+WuvqwB/cRIJDJKG271ON2eefU5oljaV1Y3KhiMbEz8m e39amLSS6pIYo1ZncSAIvAIGMj
+  0FRnfJcLJco0ZAALAYx7/n+lJXuFTC1oys997X/T/IWdbaPz1+ 0JI4l2qUGNyNgGoYXtIMiWC
+  YiDzFILctngP9K0YkVoYPMntZHRWErCP7xJyo/OlTV1ghJNuhnLDc rqDksKjnk1ypN/OxwV1V
+  qacrfzsjJQ3LXVokCKxjQtgLzIAOQKgvW+06dZtEksYVirFmyE3dAfpj NakkjvcwLKVDquNqD
+  aQSf61TffFKiRSxy/eZTjgY45Hrk1rCXvJ21/4c4K6caqaVmvN/1+BDaWTS WxWY+bcSSfumj4
+  GwZ6+5psZ+zNbmZ40Z49yx4+bgkAZojkuZ4ijzJBMWHloVwQoyG6VWa3lazjn8 xZltXEG9Rwy
+  sTz+taattSZhUqzc+Wc21/Xf9BywRKSJ7gOi4xtyeD1H15qSeSYOBFIkkcb7Q6Jgj Pc8d6Rba
+  eC+jVrWWQRoUlUrnLHOMehqKCQxXNtFImxRGY2OMZOc5Nab67nouVNrmT5rdNPyV2W7i ytGtg
+  ftMqvHPtCsxOF4yCKmF+2y4RYVdTOroQMEKO1UpriRrqZjGrGRwTxwB3pLaYNbSjHlnzv3c WP
+  mZe/NR7NuPvaieHpODcru/fb+vVjb5ZbnU2cs0R3MdwHVsdOKhVjPGipbmUScKI8ZXnkH3qW4a
+  G5uVaAOoJwFLZPTn8qqzwvGINknlhv3jZ/jA7j0raGyWwVHVpRcYaXWyX/BKsoKS+XuULvG4YP
+  AP +FOAE8YBxcgPtOxSBzyB068VJMrOHmkXyGWQY3dAOwPHWq7gM0qYUEys7benTgY9ufzrdO6
+  Odyqu XIne+9/6/UPs4s5BF5ckYYFhvJz79qQW+IzJ83UEDJ47c8VVmtZ4ju84DrkMOxqKS6m8
+  mOMqclvL Pzcgk5B+gPFaqLezIdRUItVo25dkl/w7/EvqyK7heCyHAA56dar4e41C1/eoFHUnj
+  juKaYlmBcRS xmI4f5uhz0/StBPOuRMkcaRqz7x8oyOMY/Gpk+XUyxLU1dpcvc6kzxrcWz28qG
+  WJZEkfqGJHynH4 /pWpG3mQQmW6EkcahNqkjecjJ/PiuY2W4uGihbfIW2qT0bvuFT2nnz+Qt4r
+  CSQnyyoADoT1x6A/z ryKlBWTv/maYjDw5UnLlXV2V/wCvQtX0ofVJsGNIWuNy5TOwKBwPxpIC
+  ks0kk08JBIDDbyS3A/Gp r0RItvard2rBo3D5HKsPu546mn2N1HC9tbmENcrEfOUoPlK85+uKV
+  7U7pf1/SLUlCgqkL3Xy077C L+5nYSmJDFIowV5XPBz6n3q9b6hdNPvhhhwFZCgiG4N0GT/nrW
+  ebiOeG8OzALh4mYZ3KOT9ajjjm nlEgWZ0lQsrJwCAaiVNNXkdE6VGS9pLd97W/QsvA6zSNemN
+  FBAcFfusF4Wli1GOE5V4cnDMXjz8x /pTY1trK9bzZzL5kgePechsjgn15p1u/2zZC9j5mMNcB
+  QFYvgjAPbpQ0mveV19wOlTUX7SDkvu/B /wCZcN/LdWpllChlZj5qDaoY8Y/Gqs63U7Ov2qKXy
+  yqOI1wZCVOMfyqoEvnWPMTwJKPkUrwOv54F OtnYxRhI3JEZeOQHgqp5z6ketCpqCvG39f10N6
+  UY0oJwS/P/AIP3FnLpZKAJYW2qxaUkgMODx6DP SpltktxKnm+ZEHMiyAnB2jkn9aSPUHlumEf
+  leVJtEe9c4DHkn8RUNzFeDTbuJmQwGThtv3s9MH0P TFRZ3s9CasnKqoysk/P8rotR7Lqzd47h
+  fKMgbJzlsc4FURdXdxJE88iZnfd8q4JwfmH4DFEV9Hbx sksDJFISzBRjYRxs+uK1dOv4nRYka
+  2ljhZ0jfYPlj6n8T60pqUE3y3OLEOrBqMY389zKZInupJYy VMPESkkgj1+nNallZLdLIPMh/d
+  p5bqF+c992fyqnLZ6emnM0UzbkXbneSORkZ/lTbCRlihk8wTxl R5qx8NjJBGfX/CnNuULxex6
+  1So/YKdK6e2qSZoqJba5w8ciuxDGXOFzjG3681Qe7WS4SKWaKOJVK NuXkNnp+lPu7dEglWP7R
+  vJPll3z1I/pTIo7e5nlWGEzskhKqG5IwRj6ipgo25mYwownLmW738vm2 aMtwlp5dzgOTHIrr/
+  tY4Htwc1Qs3uprMBFEssMibwwyGz6+pq4bT5o8SBJRbsWR8nb8vU1ammnfT YJY7yxhcKGm2xd
+  8ZA+pHSsVKKVluzCVKlCKT3b31Ms6beJNHIJFbehACLtKjP3T781Q8ue3lQPHN GIj5e2Rid5L
+  dB71ckJuILSRROxMY2RqxBPzcH8O9Thpv7VLjExkLOEIyRt+tdCqSS11/A7KVVRjq 1Jeegrah
+  N50kKQq0pbc6EfN6EfXHFRx3DW4L+TIHiPlqJDkAE5APvRNGkNvFeOkiIQZAucMB0AJ/ HNTmz
+  tDYsHn865Rw7Krnop/ng1F6aW2hs8RF2apvle9no/XU1ofJuMXJkjlmB2qkI28Nycj2NN8m RJ
+  WSK5MMucCRzlZPl5I9BzVW3kl/tOTZGV86f5owozyuMD0zVS5Bkt4AEmSSJQqqzffUHlvpXNGD
+  5rX0M6FV+35ItJPvqaVw8U+mSKsyRy2x8sow6hwMfljmoI2nijmb7VbCF5VkPyH5x0Zh7CpI1u
+  Jw 8pjSQSZlwigEsBgc/WmzRXEMZtoVzeTkO6kZEQx84I/XiiNl7t/66h7ifI3Zd9H+mn3FZ5n
+  GpNC/ +kIFPlugx5g6DHtiqK31vJbrEokMe0ADdnBzjB/CrSytYqktxGZwFAjdejL04/MVntFb
+  QxGU200Z gmREy/Xkkg+p5rqhGL6F1ZRnPSGnR3/4KJ4rk+cyRMzbnBKDuR0I/wBnHaqVxeYvJ
+  HBiBEWxMp1B HQVduordWtNgaVXDiF4zjCDnJ9frSTiOWZllkgtodmI2dckflVwcL3saUKlO7l
+  KNvVf5bjjLJb6T KH2lFdvkK/NIMAZz7ZqlHFFdyRpAkoQfu1lJyHHXPTtipoTdHSrcqYrsvgK
+  iryAD0/H+lU2FtdSQ +WJIZoC3lENhQT1B96qEbX/r8Dmw0qii40klq7vXRen/AACYrE5Bjt5R
+  MHJiO774IyAfU9a2LZok jiR4o4lki3s20AoRnCk+tYAsnRbeFJGd3XzFKsf3Z6EGrIW9e+4tp
+  1Cy+UUPVdwxz/OirBSVuYur Dmi1KasvW/4kFmYra+zG/knG5GuPmD9Se34VYBSXWFmkXCMuXI
+  6AgcjHt0+tWf7PlWGC2lnhIC7Q 23liT8pB9KtRW26/S2urZxIwKySKSFLA9MY4z9aU60NWbwr
+  05U5N7Ja2aTt313/EzpoxPZwmFN7F clRy2eufwFQW0a3EEUbu8XHOW4CA8j6mrMkkdrqfnxQS
+  iFEaNI93UnufpUaRJcqJJpoo23gOo4LZ GCw9qpSfL5BOo5U7JtR6SV2/nYdeWhglaSBmSJ5So
+  Jb7ikc5pli91sESQSyoyjaMdh0/OnvIsUC2 tvMLhUQlJApwB1wcjk1es4C9tBK0U+1kBba2Aw
+  znI9PSlKbjT946IRnSw37zW+2lv8vzIGt7VIJ4 445IZkfZ5bPzt6//AK6beO0SrAhBUph1IyR
+  jFXLyKdlE9soG87XLDJJbrj0xTreBrfUsT27XDoCo C/x8c1nGorcz18jqoVYOldO7XS/6sSEW
+  66XcLLG7AXCiJd2cLkZpgW5aSYxRuZHlaNsfxtnOR6AV phbaW2Xd8iyxCYKTyhB6Gs12vVjla
+  4haRWYAGL5c55JH6VlCV2/1LpxcXeP3X/4a/wB5K8cy6ewR WeVTwx5AB69fypGkvI7RJY/KxE
+  +zOwfKP4c+pNVpp/LaRSJDsx5YB+8uOTTbd4pmjtNs9tFO29Wd s4x/F9K05Ha7RpWpuMbzSSW
+  r6/gacswiR2tLiFpzPtVduc9Mj9TSRtbpZyrOWO2cEbTg4HGPrzn6 UxjErqIpY5pgU8xlXgnP
+  GPTNWVuJWvZGNk5iYliuBken5HrXO9F/SZwVJw5ubdLXsytfXcUjCGCN ss6AMeig8VI8JIm+0
+  3kaNHIURtpw+eCfcA0yKMREXUg2jz0JJ6MO9aM/myRTRLHFIs8m62YgfdHc /XpQ5KNktjr9pF
+  SjFO0O779ejMuG5eR5Wn3TgFclTjGOSK1nure4QrsEZKtkNz1G7J+vY1lOGECR CBm3JkheCXb
+  jFNurNEvI4FuQsm0KAepULyfwpyhCT7GeIVGfvN2a7fn/AEiSLy7rSjJBNnzFXezH IDZ6fl1q
+  nbuzzvPdSrnft3JwBk9Me+K2UMVvpj+W0LQtKMkLjJOMY+lZshimu7mGOPyysvyMfukA ZJx60
+  Qne6tocEcXUmnBrQqBW/tLmPgoWLYGQOScn0z1qrb3E7PbCS2kuH8sSYUcggnBHpV2FWMWL Nt
+  8Ux8+QuM7e5T8ccVqwRv5nmeXi3YhlKgAqoH3c+3etZ1VFaoWJrR5fehr2ujLiuYnla4WRVYMS
+  0JP3yehA6ACssRBruNY7iKVwmd5XOOPm/wAK3J7R2vGEaLl2DiQLwBjB/wAaoXCzC8eNTCzsPv
+  xx 44z/ACq6U430MsNKLctenW2n4f8ABKLSCOUlLhQxQMQo5BHAWlso8kJMXJdd5ZmJDnd94ew
+  9KvQ2 6BZTPCJJY32DGPmwMhvpVUz/AL6znELxIiPGpY8AHqT7Vrz8yaRGJrQqRaite5OLOJbh
+  zbs2USRM k5Vm6j9M1kok93I22PftdWYAc7sHHPpxV1IIoLkJcXiSW4DKux8EnHB6VmxSSiQC3
+  lXPy+YwPBIz z7CtKadnrfzM6cHyySfNpvrb5vf7jRmv2YPlUlZpFl+Ucj5eF/rVBEE6wTy285
+  aRNqIhxuGeWqK7 uX862VWSRXjLL5S4LEHr07U/7SkmntIWId3Mke04wB6e1WqbjFWW559WUoR
+  5YKzejs/+GZlS7H8p YQ21W27mOSzE9fpWj5scek3UMzssq3SlVTjtyfwqoCzR3EoVQfOR41AA
+  9Tn6Uryqtys8jQ3DHcJE C9T2b6V0yV7L+u4V1pHmWnTvf7ixdXcguwiSswD/AHgfvnjBqGO5a
+  DUFlaEN5UhRm25CseckVTa3 gm1GNTMqgLkSHIXjrT98ZeUkLH+82hWHJHb8apU4KNjeEI2dGL
+  5U9+t15vYdJdGRycbd4xICOjdB 9Kngc2kz5AmkjPllfXPcfrVXa20eXypdS4xzkcAe1IrwLAk
+  bI0bFiWZmyWPRe1NxTVkVNtrlXp8i NRJyQuF3Hn2xSRSMzxzRoU8sFf3gyBnt+IqeMSrMVbyy
+  2MFduc+oqNTtZ9kZIwCPbirua+xvaD26 33/DUgkj/doXGWJ4XnKj3OMGo5plggjii2Om5juxk
+  g45yT61JKJiyF2Csqc7uj/SqSzGO3XzmR5n GFwuQo7g8da0jG/meRjVGLTaej0ul+mxDGxZAw
+  lZmxgBzkVOGK3EQgj3s5wvGevHf+dPdovNVAUI ckBkGAB+VJakf2Y0pYk+aVUKcEHHB+laOWl
+  7HC66cbLd6eRatYpRp8scUgOZAxQ/eycjOcVNazT2 rIYkDOYmBQjJGDmlMTSXcUbSJFN5Z3A8
+  Hf3Bx+dILJ1+zmaYW3y9G549eK5nKLvzdQbhGnyyV0+i X/A/I1ILjzTLcTKrIWAYxAL14IHpx
+  WzBJZpvlYmBCPLj8x8kDPb+dYETm2W4gbbIHlRmAGM7c9Pw NWJYIbm8kSOXbCrEQF24w3IU+p
+  J6VyVaabtsv+GPXnQkr2bXez0+W5p2bW6XOwlLto42ZnA+++eM Z9KAlukiXE0MsaPJlmL4Ib3
+  Ppk9KswC4trYJdRRvMSVMcahTyPm/SsC5Xy4rOC0aT7ORukV23HPr ntWEFzydmc0IyqVPcWnV
+  7misksOoTeUgnXG0pt4PBGR7CrMAW0tw8Ql2qgHmM3yjJwePxrKQ3HmK U3PtjKlh2B9at20pW
+  5jgumDBYjgg4AO8YyKupB2PTrU3FNvWy6XEV7Ga8InlGxGEcZ3fdPofpWva TW1vqRcafduGcl
+  sTHOegHTHfPWsW5soxIQq8OS8be6nGD6k5xU0aXBE8TwziFpSR83KFuxPrnmoq RjOO+nqRKdO
+  vB22atu1b5Jq5rXXnXMYtLWKSIxoEBdsn73JqhdDZdLvtZ/lUqGjbCkE8jH0q3bKm 5lluf3kY
+  xO4JHPU/oMVnm5sprsywx3LEyAwoZM4Q9c+prKmmnZLRfqRGtaXLFO0dev53JrtIbXUH uWzEn
+  zKsQ67QAOPcE1nwb2gzH59xErYlbcSpxzx6etblywnaSEoGQSdSv8IAU/nmsOS3NjqTFJ0j SP
+  dsU5O7AxyPfNa0Jc0bPcdCq6vMqkdX6/oXRL9rhPmwNE73CBWONoQgk598d6f5dvHDMiLkM6FW
+  Q4ynQn/GpFtobiwsgEk2om2UB+euAfwqEC0jiUBzcGNirBGxuGc5HtUJrZfcKjO14rm9P+CW0i
+  lR 2lhjx5ZYx7+Qy9Rx3qFJhL9nlnTbGUIRIxtyvPX6njNWZftFxGWhAj85twJ6Y4GB/OqccUa
+  MkM6s 3kB4wynAweVH1J6VMHda7/idtCrzK6WvVrf+vQsLd7olHWWNlTYw5Q98+uKmhv7g3O57
+  dJCilGMK hSxY4DfSqdpFZtYrDPDO1zHkqivg4/iB9T3pF1GzhmzHbTfNtYHfnPBwfpmiVNO6U
+  blKjFxlFw97 5foy5vnXU4pLu5jWO3BikOMByOf14FaFwM6fMyvHctJIDIsa42nI4/Cqdoz+Ra
+  BHiMphdWEi7hIx P3vp2qFp7uCFXlaFsuR5YXDMw4zwP8msHBykrdDkadWrGUZJNaWv2+X6ot2
+  9y0Sz+ZJCgZiVm2fK hHBGPftVZJ4zEhS9t43iiwqkclh16etaXlwvpcESERkt5ZRvmJ9W/A9a
+  r3FrDKlnbugjIt3ZHAxu z/8AqqYyg3qrEwq0XLWNnfW39aleKR5YVS4kTyooWjMjD5SG5FXIV
+  228KI6XMsSSBVTqExyG9W75 rJspoIbTyEXzBNIr7nORH/sn3yKtoGlkRmguJERShhiba6An7p
+  Pc55z6VdWGr6FSjTlqk1b7v0/M mNgzTwLMk8kfl5DRvtJIHX8jVUPdRNFOkscoCZ8sqSSAe38
+  6tSp5ltbhfNilVmWPc2QU/iOPamS3 9tLAn76FAE2sAOu48D8uaUHJ9LjoYhyTly3js1YZNPLO
+  6mSdENwrSJ5eVGc8KPTmo1vdRt71pDdQ CcJh9yZ+o+tUrgRTw4+0RxRW9wYY5MHBU4yfwP8AO
+  p3uJIblg6JcIWKzKBzvzwM84xxWyguW1jvV b2kOTlV+3/BenyC4W+l01ZHZZjHhDtXGTkdPpx
+  Vq7iuRNJB5sUku5yVC8lhjn6YqjLI8sk4mWS3l mYsMnCrjhhj1PalTzknt4re5S7ZlJKoPnz6
+  Z/SnZ6PTQ5HOEUm2rp9tP1/QXyb14n3KZw6bj5ePk wRwPTNLJLNfRKmIond+Qy5Kn0/SmXwRY
+  YpA8tuGGzBcnOCBnjtmr6tNGm1XhnMZcSSKvDt0Dj2Bq XLRS/r/IKtfnUZJ3d9LKyX6FFIZbM
+  QTW8yzEKQ6qp78Aj070+zigjmNvI6WrjMjPKudxA4/ADr61 VMs39nzKWDneoZ04CEdAfrVyJ4
+  rrUZXLJmUNhT1U4wq/UmtJp8rv/X9andKlTdHmqX9V+qelvkSR W1w8UDPIkuFKh0G0EN1NVGJ
+  s7qMzmVwIyGAbB3D7uf51eWae20hYZ03yJgTBePLb+6fc9qz3kjjl mnJ3MXEZicZKkjv9Kinz
+  Nu+xGEhupaJ7ef8AkOt9QuttvKWRyLdspt5GM81MLuZ5EV7oWzOglZ3B OCO341BPOsqiFlj/A
+  HZCxmMbdy9z9KijuHilD26R+azEssqhtoUe/bFa+zTV+Wz/AK/rY7XhIqD5 o+8/T/J/kTW6vd
+  TuYY3ljcrs55OM4GfXjmr95E1rpAleJoiD5QLY+UNyc/54qW0gkMMN0sTOHjY+ XEduMHIHHc1
+  SSyYMs8t6hjLYaNiTtcg8H3rBzTlvojgqV5Tqp8ytHbTd9rX/AEH2lqlxdpmL5IlK gD+Pb61c
+  kuGO5VgmV1G8KrYEY7KQPp+tYSQxwPDbrclopF3Pz0bPI/KiW6eS5ke0LQws4Zg53FwO nOK1d
+  Fzle56sKEaj953fbZGz9pkkMb4E7SOJXSPjac/Mv6UlzHJcT3txLFcRA3QdDu7HsKpQtHai Ga
+  VvNSWL7iNhlYnp+VWbNkt7+RmZYwkZCh+fYqR3PpWbjy3aRpSp06bk1Hb1s/Ly9bGhLLA42I4J
+  b52QHoAvzCqLuLTWIJHt7hICCVSST72FwD9OaZDDBEY0luUmWJGwqEhgCOpPfrTNzHy4ZLiNFR
+  N6 NLzjHQfjUwilpuiKDTTunbqtbfkatrZ2ly8Uqv5RijVCrnPX1qpLMpYj7M8UeTG0mRgE8gf
+  kKUS3 S/Pgojq6ncBgHHfiqj3Ey6eiSwNlduG7Ke2fXipjTlzXvf5lfV3Gq5wmn6Pb5lq1CXF6
+  sUJJSM7E GPmZD1b3x61O1hb2trdJ507SM2YoxIQ2P61SVdU+1w3Vqse2MAqoQfMucYqvPd7J3
+  AtbkzNKMsX4 wB2/CnyScvdehx1K8o1G9LeqevntY1keFCZkZlE0TYWQ5A9/w6fjUsN7I1laRy
+  xGacEBFiOCRnOf pWS75RZVkQRqwVYerIOmCf1NXwYotRgu4xJvSBxvY/KTjpis5wVtTLE14VK
+  d56vp/l3JHjmhinIu ol8yXfFleSAeo9smnwi6k1GC5cJORHk4XkEHBH1zVY3TJEkkhjKYUnK/
+  c7bfyNSJHEjZtJX3JIFj BYncvr+Z5qWny6kVJJUfZyitfx8r6Fa7tEmSbbeQh/NDFATg8csB2
+  Aq5bXAnACouxyG3EYJwDzn0 4xUV4tusM7SxPvEmAVbHJGB+XekYQIbSRC63C24V0DYALf8A1q
+  pvmgkzSTjPDK9/LZ2+4jur9pYE jYRR74lZ9i7djZ9u3FTRzq8RBLiSaeN/KzyM8Efj1qN4He6
+  SzSEQwratl3AJOOQc1EM3Ailms57c ufMjOcbuMcfl+tPlhy6f1/VicXOn7NKCs/l/wPzLGoMI
+  JdsbPCYm2F3bhm6hh7YyMVRgkto90pu1 dwpAbaeRyP606a1lkx5MUxEhOZZDlVOOn1zUUkOYR
+  HLFHmRhueNAoHHK/oPzq6ajypNnLT9iopc1 79rL/P8AMjfUYzpZU/vCWVgF4bA4YUfaPN1mRo
+  mSb905CKvB45I9v8KintFtZLfyNmdrE5GdpHXN Z6SJs8x5o0RbgINq7Sc9G/3euRXTCnBxvEl
+  zpQi7LR/12JLlGNvDLHbTJtXIdiCNq9fxz3qnE10J 3xGJHbLsqrg7T1/CtW5Vbi5ubVJS4ViU
+  xnHHUfjUVpJL9rnhiWOSc/cIXOUI+Y/pWsZ2hqjOo+Wh LnjqvNozXSQpG6FdrKyxbUzhW7fnm
+  s+b7VLd21uiBQgIKgY4IFXkmminhZWRYzIpZCO4yFHtkVGk 8kOqztAP424YbiPb8K6I3XQ4ZO
+  U4WsrrZ3aIGa9ZI4js+QMANg5XvT40aOJ1fazSLvUqOUHUj+VQ IJd0YZZQjKd24c568ZoSHfc
+  pHuaMlTww5+7nP0rVpJG7nSoWqRTsuutvw/4BGsgZvMV4wcgDCHkH r+VPZHM9zuKkiRixxwee
+  MVHYSxQCIXhEkIJ4ThjmrRULEfvbCzN5Tk7h7k4/rTk7SIjKdSak07/h +H6jE8poN+5E3DIHU
+  tg8/wBabsRZWMYRlR8x7gCxH5U7f5IUrbqMgFtx4wRg444zUkzvHBtjG0kd W6daFe520IuqpS
+  qr4fIjaRPJJmkBkZ+Tjj2PSoQWIcqrJ1JLdtvUfWophlH+YFchskdgOlSgyZMg TaNp2hvSr5b
+  IyvUcrJ6emtiBimAZCyqzAwlj0Hp05qDEBL4VyEkCq4bjPXninmaT7OZBGTHH8qgq DjcMZqJp
+  CD5UZAIbawx0I/ritIpnjJpycHa3q7siSU8eWyM7MzN8vT2/KrUbKY5W2rjcMEDAB7A8 deKZ5
+  EaXivEhkKksFAzhff1471IDEFdA4GZP3RP90evvTk10HScqUuSS0XzLlulxPdvC20XM2WUn 26
+  qfc02YFYUSRJPLhYEZblVI5Q++e9BkaJmkJEkqsANvHGOefrQtxgzI+JYM9ckEH0JxXPaTd0ZT
+  9tKstPdW19Hf10LFjD5ksQeVAskLMQfvDB4H41fEq/Y2WNUDyhWZSvQ5xj8qyYXH2BlQ7FTDbm
+  HI wfu5981rWLvLNLdq8cZDbIo3X7wPAP4VlWVrtnoxcaN5Tlr07fl+hZ+0XAmfdJtkgm2ByMj
+  kY596 seVk2/lzwl4YShyOozy34Zq22be2WScpIFWTcoXBLDHP4UttfJBcpF5AmEeVmwBkk/MT
+  9K4HNtXi v6/r8zOGI9xzhC7/AD+9FOZb6LbJDFiOPKs4UYbpz9KozpHJO7SB/M4wynA5GQfoK
+  6Rrpv3xiwhe RXIcZxuGMVgO8waWO2QOFKljt3Zxxjn0NXQnJ9LHThazt71NX73t9+hMXmSwV4
+  kM4bMfmDkMW7j9 alt4Wi1h0ll+VIGBPZiBwR+dRbfKiV7iCeOZnC7AcDr8xA9hVi2aSa2lC3d
+  uSg2jenOc8fmKUn7r sZ/WWk409U93tb87lNRZSxbYJJATGvzluE55Dep60t0kEVyTEd8cO4Yj
+  GM+n4VO+nziZt09u8ImH miNcEEj6U+VbecRS20se9FZGGPfHPqaaqK6s7o2eJg3abbflt+KuJ
+  IQ8skTiSFs7lUn72FBJ+lTS SxbYDbRG4nAK7D83B5BoX7RMJ4whRTOuHbnjGDj6ikSUR36LAh
+  SRY2SEkAgrjv6nrzWf6GanC9ub Va2vp8xlwUbT32ziGaCREVdxGc8mo1kPnuFh82CdS8ip94M
+  PQ9gB2ptxfSDS4wEgKyc+Zs64P8zT JJJxdTXLELuZtqquMgrzitIxdtTpw8mqWi1d+v5bWLs9
+  z51nAI5o/KPzMw4xtAA/CmxfacmFpYJX 83dOQvOf4R+Ap1vaW5sEmiG7KYWHPLjozD2FSRKrS
+  MsjBJopEUEcZX1Pqcd6ycopNLockZxhzOCv b8GXI0txEFZXnm+ZlaM4wmcf/WqBo7Z7VLmC0d
+  JNu1Ucg7gGwCPahMPfPFBeRbZG8zO0/KEHT6Zp GihlngcXIPnJ5ihSQAB2/PmsldPf8zVJqSk
+  m9NWnf+rE0EdsHnRre5gnBBVHk5Ht+NMF4Y55DOFj m+0bgjjOz1U+9VUFzc2UsrXCgPKjEY+Z
+  +xYH0FWpPLSzlFrieXzVMRPzZTnnnqc55puKvZ6m8/Z8 /Lvf+tW/8i1GkZCJc3kW4xMV2ccDO
+  aoSzwx2qGPzWSSRSjl87VHT8O59akt7x2nhhVUaRoWZztB2 kHJFNmu5PLeIpDEXdQW2DGWHAH
+  pxUxhJSsznp0pqoo307X0+5LUnnK26NALX7QzuGRo+BtXqf1ow jXUrXUxEJYCURnaVI+6f8aj
+  Zrh7Zjb3UDMXVI1wcopOOfrVq4LyrID5bYYh0UYPy+/rxU7af10Om M40/3fPZvte/4ozw0siO
+  jTpwjqrY7sf/AK1Q28V3AJoZVilRdxEoQY5H+FWbx7h9OVtibXj3gquN xzkmoJA4t1ntpQJZV
+  Y4c5DKOcj+Vbx1Vu5tKMXTSvu9P+HWxBay+YwkaMRwJgMWGQSTwarz3dxdt cllEXnEyAlcDch
+  5Gfwq2k15HYTqkK+UzD92U+YMcbapXAAntY5VZbkbyX/gJB4GPetoJc17f1ucv PGFRt2u9O9v
+  PyHjy5kmuZLjeguMB1PChjnB96kuNh1KeNJo4NzqzScjp1PHpVe3uYhFaxXCbGVGD rjG1s8Fv
+  XFPjhVLwOG5VTGHcZV+OcfXtTas3cyp1/Zxm3o+nb8V/n6FQCW5yrrLJIT5kZB4BPGPx xWlFG
+  0LzTy+Y4hYoyI2CSRwfp/hVS4WOYW7W8oUrErhFz8oB5BPcjrW9DcIJrsBont5JfnPUk4+U j2
+  oqzajojv8AbzjD4bJ9Nn6/8MZsNxGPPCFVdpMDfyu3HLY/l6VZuTDCkc0KFlkBjCpwUX39ST3p
+  rWbw24JELs7qVUDDZHTHtSSXVzZ3LLMYjMuRjZ0J71npKXu6m1Kftbezlfvr/wAC5Zmth9kRYr
+  W7 G9SDIzg57/n71NbJCssn2x4ordjuIcZbJ9/bpVBtSvTZrDlX2Abzt5B9KrhkmTz7gtuK4VV
+  ONw/v fQGo9lNxtI6KeGrKHLUdr7W1a+8sSafbw2SyTbmMM6wyBW5GfX86fcfYY5CEjeONg4iJ
+  Iy3Ytn0q vDdG1htw7xzZlBkVhnzDnjH4VuXFsizSGSB50kfdGo6gL/B9T7UTnKMlzO5zqcqdR
+  Nu/bVK//BMm zliS4W1SWUr5ZUNu4Bxk/rVoC4S0QXOxbcRbXBAyr5xz75rOjlRL9XuIWjRjvd
+  BwQRkgCn3EcbwB mndR5oyrEkoCMkH1NVOPvevzHiWlU93Vel7Py8wtbdUFz58hZYpRFlcZIOf
+  UUkkdvHCTAXZygPzD 7gHGDxgmq+5vs8gglVYUkAAfktuOd34VZiLpLcmUpLtkEcgAwCTypHt6
+  1o73u2dNCvLl/eyd+i6D 2hWR7cJG8sUaESOp4DAcD8aginBJCNvGBtJ5wR2PqcmrMoJ0xoow2
+  4SBtwP3yvUj2qcTndJKIInj c71WNQCCetZqTsFLFOMHKyfkMtrlJbxJQI0kZBu3pkcZBGP1qC
+  UGW6MkTJJ5ThFwvBB6VE1s8iZS WPaMqrD+LnJx9elFtcXK292GKRsJApiZMNycjn2xVKK+KI3
+  U5ptqSldf1/WhZupHjkWO5jlJ2uAU faOvWqyzQm8iWMmE7SMzHcAfU0rwsq+ZcszFiERQfmI7
+  nmq8MipOgYRQptdCzqCfQ/4VUYx5dA9t S9lLkl739bLUs3d4HQNCzo8cvloFb+Hj5TjqT2qnN
+  qUt5JvSP7PtmbzVIySemB6cUyW4iW2RLWJl VGZn3/MeeMH3qpbovmK0Nu8jtIcI2DtIAG4+x6
+  YrSnSio3aPLcYqMZ1F72t15dNVp+BbVY3uJt4c AMzRgHBwBxn61qaWIIZoGlYxpNgh5D8vQhl
+  +tUTazknzjHGU3KQBjdnqfoKlEMMcsMy3EchjP7sD 7uQOWx6VFRqUbXNqtanOm4pu78m/xSt+
+  Ben05AytG5khwvybuWYf0piCZr0JPKLYBHDSlTtPcY9M 1FKzXjWKLeRbowwZFBBfHORWnbqiP
+  Gcbo0t2CmT5gcc/pmudylGPvasqhiWo+/rLbs/x/wAiulsr RWaq0su+IsfmyWbOQw9hViB/sP
+  2lpraSSScecrMegHUdPeqv9omSCFoY1V0iESDaOecnH86fa3CG 4Xyo3UlcoZm3fKQRj+ZpSjO
+  z5lodjUqcJOS5k+l3+n+Qksm6II19ChKjZnOUXrg+pNSz3CvbxTWm ZRGwQAH/AFeTnaffrQ0E
+  V7MYFAHzqGcD74A5YewFR+baw2Qmt7qKOSVpNgcEjZjGcAdfQ1GjtZan l1a8bxhFu99rfnZBc
+  yywSARN5cBT5CxLbxn7w+mefWoLhg9lFcx7p42cNJsbgFSAP8arRQW02k27 W6TzSqG3IXzuPt
+  7e1Pgtr1Lq3uYgnnsm94yo2jJ6EfrWyjFddV+P9dyKtWnUg5J2a6d/XqvX8B66 hIb65ad4o5f
+  m+Vkz1HPHpVK7tWXT7YJAzl4CJGH3Q+eB9QP51Tv2mkuoCI9kUhLKpGTtBwcn9ald PIEodZ1e
+  ab92+/5W9xW8aajZowlJRcWn8v6t+QyK3n/dxtuAAJMnTDHoCfWpZLtkWJbiCQXCxtEW Q7T8x
+  6cDrUM81zb3EyRk7FLJhgG9OaheS8jeK4mt5eSGiJHUDgn34rXlctXYdec+TWzXTVrX1IGk t2
+  l8pt8YIGd3O0r26UlzNEI0eMofNyYyvYDgg+p96givWnvBPsiL+ZtUEZyM49KhmSRrolYVQlm4
+  K8j2+tdMafvK4vbTnOLT9O/53JbadI2YzRO2MjBPHI61WIWS7iKySIUYEKxJL+1SMItjeYjh8E
+  gA 9B+X41FEF+yEjzJI0bBOCeT0FapJamFSmuf33o+70+64scFqJV3sEycqSTyT/wDXqzJIMRy
+  BhNgF ZAqkbccAn15qgJURvmid95x2+XtThKy3SxmEkFtp9vr9abi27l+1jF8ylZLol/wNSx9o
+  R4U+YM4H 7ojoQDzxSODNbyyrIJVSYBSp6++MdKpJMHVTtRWVxjA7/wCeo70Ga5jKhI0Ul8MNv
+  Ue1P2epz+2W 769lf8Cz5jQ3ckWCQcgFhkAdc9O9VJ3kYxeTIWKZEiMD0GORx0qWNXnlIMckbg
+  c89ewxSJbTxlpk VtqPhi65ww4IP9RVKyfmcuKrVKkLRk/S6X6XKqRiWXJ8x9nKANgfjVeOJt8
+  AiKA5PmEnnPXP0rR8 uaNPljYnG0ADnrx/OqkUN3MQ/lnYpJPyHnHJraM9HqcuJpRpOLlfn7aK
+  /lrsTNdll2Sja5wq8djy aHx533ldEYBiF4NKsLKqlQZAVynHb1zUaoWARJUK7gZBg5PoOnXFT
+  7vQ6pzqO0pu9/T8+v3lnzld ZXkRn3NncBjdxz26U23knW5R7Et8zhcMoOARwTkY4phgAI2jIV
+  Sck579KSR1gjtWjcywSStgISCu MEZNSkun/AOHGQtT5Zu172X6dvxL0QdY4nRSltO3VjnIB5P
+  4VuwK0SWXlobqaRJCuzptJ5H1FVLe 2jlWKLyJYEVsFXblic4I9B6+tKjzRX0UbMI5S6DJ/hJb
+  t6VwVHz6HoRm6ivdNx1fb8DqZLiBNOgD W0/3N4QtlmHGT+dULgSXeryKlrKoaQ72BHHy5q3PM
+  zJevHNBJKLkALs524AOPQVcijiBZT5gjtmM Bkz97eMj8e2a8yM+RXtqXRrOhBzjo/V6fIzYre
+  SKK5K7pJFkjJIPDDHb8OazxJENWQRRysCDhlbg A9z9a0TA1pMsltchZRbner8gkDg/lxWXEqy
+  WisWDfKuHTgR84w3qc10wd7s9Jy505R2a31/Ine2m jZJJGaNGO9WkYtuC8n9P51oWSWc10YJL
+  iNJpnypwQF44U+p7UyZTBpgtpnZ4TJ8zn+HAwcE9iaqN uDqUSFJX8xsheVwOV+vcfWod5x3OF
+  /7XFq+uy5bW+7qW7q6uLOS8gVRGJZ0cOy5AwASKZb6legSG OO2ZPOY5EQ+ZWFSJNNLbRXEtlJ
+  GVjxC7kEbMfNkdz71Wmmne1txB5Z3orLtXHy1MYpqzirkKFOpZ cqvt9332LSXsMcNrHcSKksk
+  uQBwemPyPaqKTKXYSI4ztHXBQ54H88+tSW9xLc3hM0cYjkYSKSgyF wQSD6DirSzQTyC3t7ORQ
+  JFYlmBbAGQM/WnyqDen4k0aCpSlGMb97NafkQRXNm1uiuVOHKlffPDfQ UyRAwuAZFdoblGLDO
+  0tj5uP7vtWtbwQ3FkbmMRCSZ94wByc4wB7/AM6jXSjPE0LZjdxvI7oQDtDe tZqtBN9CcPXpKX
+  vJr1s/wsUoo2WcSeTN5fzKpRuF55qHybmeRBb286OU2sHbluoz+FW7eO5srP7Q xOZlMgVhnfx
+  gsPYGmv5loPtNzdJu8oqO25uMEe1aKb5nb9T06GLvUlyyS00639UWLXy/IMbyxyJb qIkZOCVc
+  YOT35omDw3KQrJE2bZjkL1KnHHoPak8qO3jj+1uqxKWWZV4LNwQPw4q3FZLc6xKFSWRF CsoDY
+  OQMkfjWMpJNyvp/X/DlyqR5ZtbW62t8iC2gWztZvLlXDSDG7kIM/dPuc1IkD2m37UrRKuUX HH
+  llzwp9TzmrLyTSI8kVsLcv87JKAeW/wAqrdPJLFbMpKxiMhQ/PQg5J7moUpSevU56L9rZuS+/X
+  8Cf7Ozz7YLWTzI28oyqfl+7yD7mqkRuo4438yCRVfy1Qx8jP3c+46Vqgzi3muTIj+ZcRCEJkD5
+  vv GqMscxcwW0ihg7mUMOcr0b6YqYSvo/67jptynaMk4+jf37laeLyQyI4WdnVdwOAo6c/rUA0
+  y4i85 WaQbztVi2dw6k/iKvQE3ulNmCSVVKMrqcE8/MaiS7mGozrOTNDIjSEIMEkdMegx2rZTm
+  rpbo7ozq Rva116O/oUPs4SwJa7+Zf9WpY/dbGPy71bK7J4Ty6hWLMvTrzgemOahnWcCye3tnf
+  NswDkZUqOS1 U542ihMjrO6OC0bK3BXHJ+nNbL37XZMqilDl5rX+/wDr5sjks5pXZopPtKMzOr
+  gnDYHXH8qdHI9x BE9xDIwYKY0HDFQCvX6jNakcEuz5EYuAxZU4w6DqPbB6VizvNPALiRkK5+V
+  QMfe44HpWkJ8+hzrF KpL2bkkl1t+hLdrE0KTCQSo8m3CDB3jgjNV0g3Swkz/ZoIn+TzTn3I46
+  1O1iPs0UUbG4Kk/u4j1Y d+fqaLi0uHtT5YMaxseDzn2+vWqjNWtcwniIygqTavfe35X/AMiuL
+  hXuAtsY2LuVBA/vf4U2C6lI j8sgAsIxIB8qgDGCO5680ItrHC8QBtwASsjHOM4Kr9evNWrGyj
+  lbcZTtD8p6MDwfpVycFF3NfaNQ 5ai28v1X5DgJFjztnkYErFznCdDn396tpLJBA8UMLvMW3gz
+  DcQoHQ5qK7uHjupzg5QADacAZxkfU 1YH2x3zEgUSKWBZQSRngg+lYPVJtHp048y/eR9P+CTW0
+  EM16I5CVjZMh84z6H86sTWtpbtFIJBvc Mixn19RU9pmCzcyJ5qtKpDKMDnpj2zU9pbia5ka4j
+  eSdZWjQrwCG7j8a451WpN30RksdPn3tFeZk zRpMyhgrMgCqFGCSe31NXZL6S28mMK0jKmGbGf
+  nJwAPxrRm02Y7txjd02tIVXGHXv9AKqm2hudWM UW5pnTzPMB+VgP4gPQVKqwktdUjrlWpVI81
+  rpev47GHJHLFdRRGJjPuQOvXJB5xVk2c02p3ASFt7 KxQnG1VHAB/2vepp7aC0lWaSVrgbGUFW
+  Odx561RS4aTTokjMkchAA+bnqSB9Sa6VJyV4jdWd1Ui/ d762+epbRUs57VrieDdsTdEEz8vfP
+  GCcmnTQi41ZxERIFDLtTghgPlJqtOjTSkwxMZD80pc5wcdB 6Ac09LmS0YbZo92xhG2zIKEcE+
+  p9DU8r3T1MKlNuo3Tl7z7pfp/w5UY3K6mGwnnN8gAHD5HJA+lM jliil2eVKu1AG3Nna3UH6Yq
+  x51vdTxp5UodTuUbuSMZx+GKkmhs3tMxuRcdSO20jn8a15ukkOU5y k1Ui1fTRbeen+RDc3iJZ
+  GKGJ+CAHJ4Y5BBH61XV/tF+ZpnEbSTq5XpuIHb25rQZbmeyt7cW+1oNm G2g7jnr9AKkkt2zcy
+  xR+WwugVLDIIyDkD0qVOMVbqcjrRgnSirX6tpsx21CeW5DSf6yJiqggYB71 dSe2/dyyyxqyw7
+  XQpkk5zmqxgAvJzc8tvdnRMA885+grNG+S5hXckbBfmLDIJA4rf2cJLTQ6bUql J+7ZrdpL+vw
+  L8TrPG0Drl2OVA4JA5Jo2xRi2nZ8jawk2HGGbpQbq9itIJnktg5AaMiP7w6Ht26U0 XX7udftF
+  uIjKMKU5Y9iOOgotLpt/Xkct51ZabLzf+RUhkZ7MEB5WyUGD09Sa1I7MJZlrtm2jIV0O AVHp9
+  ayVuGxIpZWywyUUAY7/AJ1YUf6JiIuxchvLJyVA9a0qRl3sdjhUkoqU7Ly/z/zNK3hdM3lv NC
+  ZMHam3JB9PxFTW5mgjt2ifM7DzdrcjaB6fic0yIwQwyzSMZY1cIAhwSSOopJopblLVkhkjkfIV
+  G/hHQ5/KuSTu7PY5/rMNFVel7cz6+T7/AHISRJG1aNrcLOUh/gTAI9f6VZtPPMcwA8mMPnEi5K
+  sT 8o+lRx2csEqtuI2KY5FHUknIqUlRqIkWZdskbloyeUkI+UGlOSasjqrYihO/IunUn8yS2Fs
+  yAp5p ZjuGdozyv5c1WLESsIreGWJUzCSgO6MdxUMBEdujt5kxdWaQ7uBnsPTPQVnyTQTsdknl
+  RHIRSclT 12mnCldnDh6bi25W16/5dTQjnjS4FzBhY5QPLtx944OAfp61HPLPa6vKZWZlBOEU4
+  yFB5HsDUEf7 /TlkEDkruNuV4BXPzH8Kvubf7T81ldSQ5Oz58kjGetNpKW1ylzNuqo8yenToZk
+  UsTWcc9xA7KVGw bsZQkhsH61dk8w3RNqgM2/bGW+ZSmPmIz0xUxgmeximghA3qC6FchAT0Hpn
+  FUp3jmjurgJJaywS7 FRm6Z6jiqupPQJSjNJX1/BeqILgo1iXk/eStKu0A+oxn8ayt8q3MeJAk
+  gUlQy5zjtirZgjjVNkoX zAGG9uFAOMdPWmG1zPJErRuUb75PTHUE/jXVT5YrUUYqnCUZNL5Mz
+  1MIYdWjcMfLXqp7Akj1pzl4 ZA/kOwlLID2wBy35mmvCFViZELpLtG3ocDn8jTVd0aFVheT5jG
+  zZ+VN/c/rXRvqjhqVJpKcZOy/L yJUQ/Yo8FW3qSCRnft7j2qq8saxwqoUOWGWLZBHcYx1z3q9
+  NZ7JlC/NalSY3B68/41SCPLKCBGSG wTjH3qcHF63NbOajbWz0av8A0x6/O0qugc4ypjGMD3+l
+  DxvGIjMhQtH8rFcbu+fyqZVtzZxjLJNu IJJ9OQPxp6Ry3d38zGQHhlA55HUdhjApc3XoTJTfv
+  2vr13/P8Rm+CaUptjcMDtIOADQLFwltIYpj bv8AOzL/ABKBjC5HXNacOnI2jwSlUS4MZCgLgv
+  zjP51cnsljs7iGOQmXzAJEz3HXA7D2rnliYp2R nXxftmlJ2/B/hb9TFuFs57dGjhmh/egRl2z
+  lO7H1HHFOhsd90ZXSVLZZNwJbjHXn1rQa5RHiLGJ0 KFgu3O0d1+tI8dv9reQXqfO5KoScBSKX
+  tJJW/wCCebWhKEeVrfrvf08zDW5EN48kCrKgOYxt9uvT pVJGuJGUpbyM5UgFF+9z1+ldBLZkP
+  Ir4uZGbgQqFAwuRj+tZkQkWBJchZVRQcd92cY/KumE4tNoq MqfMuV2b7oozrKh8uNjt6MMdPp
+  6VDGlyp/1eSTlsIBgVceS6nkWOIM+xdhxHyO/Jx1zTSLhYla4i kjITauR2Oc5Hc1upWVnYqUq
+  LqK7s+lnp8hjpiIGbzfMB4Yfdx9MVnRlkTaxWQGTPyjG0Y5H16VMV
+  ZpLZVl3hEJOfXng+tTh59q/6tgyA/d6ZrRaIz5FUlfVee5//2Q==
+X-ABShowAs:COMPANY
+UID:F0A6918D-8E09-43FA-9684-226810B8A96F
+END:VCARD

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/FCBA0FA3-00B2-4C95-B4EC-4CCC4843F8B1.vcf
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/FCBA0FA3-00B2-4C95-B4EC-4CCC4843F8B1.vcf	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/FCBA0FA3-00B2-4C95-B4EC-4CCC4843F8B1.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,12 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:Kawado;Saeko;;;
-FN:Snow Leopard
-ORG:Snow Leopard;
-EMAIL;type=INTERNET;type=WORK;type=pref:snowleopard at example.com
-TEL;type=WORK;type=pref:777-777-7777
-item1.ADR;type=WORK;type=pref:;;1 Fidel Ave. Suite 100;Mountain Top;CA;99999;USA
-item1.X-ABADR:us
-X-ABShowAs:COMPANY
-UID:FCBA0FA3-00B2-4C95-B4EC-4CCC4843F8B1
-END:VCARD

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/FCBA0FA3-00B2-4C95-B4EC-4CCC4843F8B1.vcf (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/FCBA0FA3-00B2-4C95-B4EC-4CCC4843F8B1.vcf)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/FCBA0FA3-00B2-4C95-B4EC-4CCC4843F8B1.vcf	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/addressbook_store/ho/me/home1/addressbook_2/FCBA0FA3-00B2-4C95-B4EC-4CCC4843F8B1.vcf	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,12 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Kawado;Saeko;;;
+FN:Snow Leopard
+ORG:Snow Leopard;
+EMAIL;type=INTERNET;type=WORK;type=pref:snowleopard at example.com
+TEL;type=WORK;type=pref:777-777-7777
+item1.ADR;type=WORK;type=pref:;;1 Fidel Ave. Suite 100;Mountain Top;CA;99999;USA
+item1.X-ABADR:us
+X-ABShowAs:COMPANY
+UID:FCBA0FA3-00B2-4C95-B4EC-4CCC4843F8B1
+END:VCARD

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/common.py
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/common.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/common.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,782 +0,0 @@
-# -*- test-case-name: txcarddav.addressbookstore -*-
-##
-# Copyright (c) 2010 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-"""
-Tests for common addressbook store API functions.
-"""
-
-from zope.interface.verify import verifyObject
-from zope.interface.exceptions import (
-    BrokenMethodImplementation, DoesNotImplement
-)
-
-from txdav.idav import IPropertyStore, IDataStore
-from txdav.propertystore.base import PropertyName
-
-from txdav.common.icommondatastore import (
-    HomeChildNameAlreadyExistsError, ICommonTransaction
-)
-from txdav.common.icommondatastore import InvalidObjectResourceError
-from txdav.common.icommondatastore import NoSuchHomeChildError
-from txdav.common.icommondatastore import NoSuchObjectResourceError
-from txdav.common.icommondatastore import ObjectResourceNameAlreadyExistsError
-
-from txcarddav.iaddressbookstore import (
-    IAddressBookObject, IAddressBookHome,
-    IAddressBook, IAddressBookTransaction
-)
-from twistedcaldav.vcard import Component as VComponent
-
-from twext.python.filepath import CachingFilePath as FilePath
-from twext.web2.dav import davxml
-from twext.web2.dav.element.base import WebDAVUnknownElement
-
-
-storePath = FilePath(__file__).parent().child("addressbook_store")
-
-homeRoot = storePath.child("ho").child("me").child("home1")
-
-adbk1Root = homeRoot.child("addressbook_1")
-
-addressbook1_objectNames = [
-    "1.vcf",
-    "2.vcf",
-    "3.vcf",
-]
-
-
-home1_addressbookNames = [
-    "addressbook_1",
-    "addressbook_2",
-    "addressbook_empty",
-]
-
-
-vcard4_text = (
-    """BEGIN:VCARD
-VERSION:3.0
-N:Thompson;Default;;;
-FN:Default Thompson
-EMAIL;type=INTERNET;type=WORK;type=pref:lthompson at example.com
-TEL;type=WORK;type=pref:1-555-555-5555
-TEL;type=CELL:1-444-444-4444
-item1.ADR;type=WORK;type=pref:;;1245 Test;Sesame Street;California;11111;USA
-item1.X-ABADR:us
-UID:uid4
-END:VCARD
-""".replace("\n", "\r\n")
-)
-
-
-
-vcard4notCardDAV_text = ( # Missing UID, N and FN
-"""BEGIN:VCARD
-VERSION:3.0
-EMAIL;type=INTERNET;type=WORK;type=pref:lthompson at example.com
-TEL;type=WORK;type=pref:1-555-555-5555
-TEL;type=CELL:1-444-444-4444
-item1.ADR;type=WORK;type=pref:;;1245 Test;Sesame Street;California;11111;USA
-item1.X-ABADR:us
-END:VCARD
-""".replace("\n", "\r\n")
-)
-
-
-
-vcard1modified_text = vcard4_text.replace(
-    "\r\nUID:uid4\r\n",
-    "\r\nUID:uid1\r\n"
-)
-
-
-
-class CommonTests(object):
-    """
-    Tests for common functionality of interfaces defined in
-    L{txcarddav.iaddressbookstore}.
-    """
-
-    requirements = {
-        "home1": {
-            "addressbook_1": {
-                "1.vcf": adbk1Root.child("1.vcf").getContent(),
-                "2.vcf": adbk1Root.child("2.vcf").getContent(),
-                "3.vcf": adbk1Root.child("3.vcf").getContent()
-            },
-            "addressbook_empty": {},
-            "not_a_addressbook": None
-        },
-        "not_a_home": None
-    }
-
-    def storeUnderTest(self):
-        """
-        Subclasses must override this to return an L{IAddressBookStore}
-        provider which adheres to the structure detailed by
-        L{CommonTests.requirements}. This attribute is a dict of dict of dicts;
-        the outermost layer representing UIDs mapping to addressbook homes,
-        then addressbook names mapping to addressbook collections, and finally
-        addressbook object names mapping to addressbook object text.
-        """
-        raise NotImplementedError()
-
-
-    lastTransaction = None
-    savedStore = None
-
-    def transactionUnderTest(self):
-        """
-        Create a transaction from C{storeUnderTest} and save it as
-        C[lastTransaction}.  Also makes sure to use the same store, saving the
-        value from C{storeUnderTest}.
-        """
-        if self.lastTransaction is not None:
-            return self.lastTransaction
-        if self.savedStore is None:
-            self.savedStore = self.storeUnderTest()
-        txn = self.lastTransaction = self.savedStore.newTransaction()
-        return txn
-
-
-    def commit(self):
-        """
-        Commit the last transaction created from C{transactionUnderTest}, and
-        clear it.
-        """
-        self.lastTransaction.commit()
-        self.lastTransaction = None
-
-
-    def abort(self):
-        """
-        Abort the last transaction created from C[transactionUnderTest}, and
-        clear it.
-        """
-        self.lastTransaction.abort()
-        self.lastTransaction = None
-
-
-    def homeUnderTest(self):
-        """
-        Get the addressbook home detailed by C{requirements['home1']}.
-        """
-        return self.transactionUnderTest().addressbookHomeWithUID("home1")
-
-
-    def addressbookUnderTest(self):
-        """
-        Get the addressbook detailed by C{requirements['home1']['addressbook_1']}.
-        """
-        return self.homeUnderTest().addressbookWithName("addressbook_1")
-
-
-    def addressbookObjectUnderTest(self):
-        """
-        Get the addressbook detailed by
-        C{requirements['home1']['addressbook_1']['1.vcf']}.
-        """
-        return self.addressbookUnderTest().addressbookObjectWithName("1.vcf")
-
-
-    def assertProvides(self, interface, provider):
-        """
-        Verify that C{provider} properly provides C{interface}
-
-        @type interface: L{zope.interface.Interface}
-        @type provider: C{provider}
-        """
-        try:
-            verifyObject(interface, provider)
-        except BrokenMethodImplementation, e:
-            self.fail(e)
-        except DoesNotImplement, e:
-            self.fail("%r does not provide %s.%s" %
-                (provider, interface.__module__, interface.getName()))
-
-
-    def test_addressbookStoreProvides(self):
-        """
-        The addressbook store provides L{IAddressBookStore} and its required
-        attributes.
-        """
-        addressbookStore = self.storeUnderTest()
-        self.assertProvides(IDataStore, addressbookStore)
-
-
-    def test_transactionProvides(self):
-        """
-        The transactions generated by the addressbook store provide
-        L{IAddressBookStoreTransaction} and its required attributes.
-        """
-        txn = self.storeUnderTest().newTransaction()
-        self.assertProvides(ICommonTransaction, txn)
-        self.assertProvides(IAddressBookTransaction, txn)
-
-
-    def test_homeProvides(self):
-        """
-        The addressbook homes generated by the addressbook store provide
-        L{IAddressBookHome} and its required attributes.
-        """
-        self.assertProvides(IAddressBookHome, self.homeUnderTest())
-
-
-    def test_addressbookProvides(self):
-        """
-        The addressbooks generated by the addressbook store provide L{IAddressBook} and
-        its required attributes.
-        """
-        self.assertProvides(IAddressBook, self.addressbookUnderTest())
-
-
-    def test_addressbookObjectProvides(self):
-        """
-        The addressbook objects generated by the addressbook store provide
-        L{IAddressBookObject} and its required attributes.
-        """
-        self.assertProvides(IAddressBookObject, self.addressbookObjectUnderTest())
-
-
-    def test_addressbookHomeWithUID_exists(self):
-        """
-        Finding an existing addressbook home by UID results in an object that
-        provides L{IAddressBookHome} and has a C{uid()} method that returns the
-        same value that was passed in.
-        """
-        addressbookHome = (self.storeUnderTest().newTransaction()
-                        .addressbookHomeWithUID("home1"))
-
-        self.assertEquals(addressbookHome.uid(), "home1")
-        self.assertProvides(IAddressBookHome, addressbookHome)
-
-
-    def test_addressbookHomeWithUID_absent(self):
-        """
-        L{IAddressBookStoreTransaction.addressbookHomeWithUID} should return C{None}
-        when asked for a non-existent addressbook home.
-        """
-        self.assertEquals(
-            self.storeUnderTest().newTransaction()
-            .addressbookHomeWithUID("xyzzy"),
-            None
-        )
-
-
-    def test_addressbookWithName_exists(self):
-        """
-        L{IAddressBookHome.addressbookWithName} returns an L{IAddressBook} provider,
-        whose name matches the one passed in.
-        """
-        home = self.homeUnderTest()
-        for name in home1_addressbookNames:
-            addressbook = home.addressbookWithName(name)
-            self.assertProvides(IAddressBook, addressbook)
-            self.assertEquals(addressbook.name(), name)
-
-
-    def test_addressbookRename(self):
-        """
-        L{IAddressBook.rename} changes the name of the L{IAddressBook}.
-        """
-        home = self.homeUnderTest()
-        addressbook = home.addressbookWithName("addressbook_1")
-        addressbook.rename("some_other_name")
-        def positiveAssertions():
-            self.assertEquals(addressbook.name(), "some_other_name")
-            self.assertEquals(addressbook, home.addressbookWithName("some_other_name"))
-            self.assertEquals(None, home.addressbookWithName("addressbook_1"))
-        positiveAssertions()
-        self.commit()
-        home = self.homeUnderTest()
-        addressbook = home.addressbookWithName("some_other_name")
-        positiveAssertions()
-        # FIXME: revert
-        # FIXME: test for multiple renames
-        # FIXME: test for conflicting renames (a->b, c->a in the same txn)
-
-
-    def test_addressbookWithName_absent(self):
-        """
-        L{IAddressBookHome.addressbookWithName} returns C{None} for addressbooks which
-        do not exist.
-        """
-        self.assertEquals(self.homeUnderTest().addressbookWithName("xyzzy"),
-                          None)
-
-
-    def test_createAddressBookWithName_absent(self):
-        """
-        L{IAddressBookHome.createAddressBookWithName} creates a new L{IAddressBook} that
-        can be retrieved with L{IAddressBookHome.addressbookWithName}.
-        """
-        home = self.homeUnderTest()
-        name = "new"
-        self.assertIdentical(home.addressbookWithName(name), None)
-        home.createAddressBookWithName(name)
-        self.assertNotIdentical(home.addressbookWithName(name), None)
-        def checkProperties():
-            addressbookProperties = home.addressbookWithName(name).properties()
-            self.assertEquals(
-                addressbookProperties[
-                    PropertyName.fromString(davxml.ResourceType.sname())
-                ],
-                davxml.ResourceType.addressbook) #@UndefinedVariable
-        checkProperties()
-        self.commit()
-
-        # Make sure it's available in a new transaction; i.e. test the commit.
-        home = self.homeUnderTest()
-        self.assertNotIdentical(home.addressbookWithName(name), None)
-        home = self.addressbookStore.newTransaction().addressbookHomeWithUID(
-            "home1")
-        # Sanity check: are the properties actually persisted?
-        # FIXME: no independent testing of this right now
-        checkProperties()
-
-
-    def test_createAddressBookWithName_exists(self):
-        """
-        L{IAddressBookHome.createAddressBookWithName} raises
-        L{AddressBookAlreadyExistsError} when the name conflicts with an already-
-        existing address book.
-        """
-        for name in home1_addressbookNames:
-            self.assertRaises(
-                HomeChildNameAlreadyExistsError,
-                self.homeUnderTest().createAddressBookWithName, name
-            )
-
-
-    def test_removeAddressBookWithName_exists(self):
-        """
-        L{IAddressBookHome.removeAddressBookWithName} removes a addressbook that already
-        exists.
-        """
-        home = self.homeUnderTest()
-        # FIXME: test transactions
-        for name in home1_addressbookNames:
-            self.assertNotIdentical(home.addressbookWithName(name), None)
-            home.removeAddressBookWithName(name)
-            self.assertEquals(home.addressbookWithName(name), None)
-
-
-    def test_removeAddressBookWithName_absent(self):
-        """
-        Attempt to remove an non-existing addressbook should raise.
-        """
-        home = self.homeUnderTest()
-        self.assertRaises(NoSuchHomeChildError,
-                          home.removeAddressBookWithName, "xyzzy")
-
-
-    def test_addressbookObjects(self):
-        """
-        L{IAddressBook.addressbookObjects} will enumerate the addressbook objects present
-        in the filesystem, in name order, but skip those with hidden names.
-        """
-        addressbook1 = self.addressbookUnderTest()
-        addressbookObjects = list(addressbook1.addressbookObjects())
-
-        for addressbookObject in addressbookObjects:
-            self.assertProvides(IAddressBookObject, addressbookObject)
-            self.assertEquals(
-                addressbook1.addressbookObjectWithName(addressbookObject.name()),
-                addressbookObject
-            )
-
-        self.assertEquals(
-            list(o.name() for o in addressbookObjects),
-            addressbook1_objectNames
-        )
-
-
-    def test_addressbookObjectsWithRemovedObject(self):
-        """
-        L{IAddressBook.addressbookObjects} skips those objects which have been
-        removed by L{AddressBook.removeAddressBookObjectWithName} in the same
-        transaction, even if it has not yet been committed.
-        """
-        addressbook1 = self.addressbookUnderTest()
-        addressbook1.removeAddressBookObjectWithName("2.vcf")
-        addressbookObjects = list(addressbook1.addressbookObjects())
-        self.assertEquals(set(o.name() for o in addressbookObjects),
-                          set(addressbook1_objectNames) - set(["2.vcf"]))
-
-
-    def test_ownerAddressBookHome(self):
-        """
-        L{IAddressBook.ownerAddressBookHome} should match the home UID.
-        """
-        self.assertEquals(
-            self.addressbookUnderTest().ownerAddressBookHome().uid(),
-            self.homeUnderTest().uid()
-        )
-
-
-    def test_addressbookObjectWithName_exists(self):
-        """
-        L{IAddressBook.addressbookObjectWithName} returns an L{IAddressBookObject}
-        provider for addressbooks which already exist.
-        """
-        addressbook1 = self.addressbookUnderTest()
-        for name in addressbook1_objectNames:
-            addressbookObject = addressbook1.addressbookObjectWithName(name)
-            self.assertProvides(IAddressBookObject, addressbookObject)
-            self.assertEquals(addressbookObject.name(), name)
-            # FIXME: add more tests based on CommonTests.requirements
-
-
-    def test_addressbookObjectWithName_absent(self):
-        """
-        L{IAddressBook.addressbookObjectWithName} returns C{None} for addressbooks which
-        don't exist.
-        """
-        addressbook1 = self.addressbookUnderTest()
-        self.assertEquals(addressbook1.addressbookObjectWithName("xyzzy"), None)
-
-
-    def test_removeAddressBookObjectWithUID_exists(self):
-        """
-        Remove an existing addressbook object.
-        """
-        addressbook = self.addressbookUnderTest()
-        for name in addressbook1_objectNames:
-            uid = (u'uid' + name.rstrip(".vcf"))
-            self.assertNotIdentical(addressbook.addressbookObjectWithUID(uid),
-                                    None)
-            addressbook.removeAddressBookObjectWithUID(uid)
-            self.assertEquals(
-                addressbook.addressbookObjectWithUID(uid),
-                None
-            )
-            self.assertEquals(
-                addressbook.addressbookObjectWithName(name),
-                None
-            )
-
-
-    def test_removeAddressBookObjectWithName_exists(self):
-        """
-        Remove an existing addressbook object.
-        """
-        addressbook = self.addressbookUnderTest()
-        for name in addressbook1_objectNames:
-            self.assertNotIdentical(
-                addressbook.addressbookObjectWithName(name), None
-            )
-            addressbook.removeAddressBookObjectWithName(name)
-            self.assertIdentical(
-                addressbook.addressbookObjectWithName(name), None
-            )
-
-
-    def test_removeAddressBookObjectWithName_absent(self):
-        """
-        Attempt to remove an non-existing addressbook object should raise.
-        """
-        addressbook = self.addressbookUnderTest()
-        self.assertRaises(
-            NoSuchObjectResourceError,
-            addressbook.removeAddressBookObjectWithName, "xyzzy"
-        )
-
-
-    def test_addressbookName(self):
-        """
-        L{AddressBook.name} reflects the name of the addressbook.
-        """
-        self.assertEquals(self.addressbookUnderTest().name(), "addressbook_1")
-
-
-    def test_addressbookObjectName(self):
-        """
-        L{IAddressBookObject.name} reflects the name of the addressbook object.
-        """
-        self.assertEquals(self.addressbookObjectUnderTest().name(), "1.vcf")
-
-
-    def test_component(self):
-        """
-        L{IAddressBookObject.component} returns a L{VComponent} describing the
-        addressbook data underlying that addressbook object.
-        """
-        component = self.addressbookObjectUnderTest().component()
-
-        self.failUnless(
-            isinstance(component, VComponent),
-            component
-        )
-
-        self.assertEquals(component.name(), "VCARD")
-        self.assertEquals(component.resourceUID(), "uid1")
-
-
-    def test_iAddressBookText(self):
-        """
-        L{IAddressBookObject.iAddressBookText} returns a C{str} describing the same
-        data provided by L{IAddressBookObject.component}.
-        """
-        text = self.addressbookObjectUnderTest().vCardText()
-        self.assertIsInstance(text, str)
-        self.failUnless(text.startswith("BEGIN:VCARD\r\n"))
-        self.assertIn("\r\nUID:uid1\r\n", text)
-        self.failUnless(text.endswith("\r\nEND:VCARD\r\n"))
-
-
-    def test_addressbookObjectUID(self):
-        """
-        L{IAddressBookObject.uid} returns a C{str} describing the C{UID} property
-        of the addressbook object's component.
-        """
-        self.assertEquals(self.addressbookObjectUnderTest().uid(), "uid1")
-
-
-    def test_addressbookObjectWithUID_absent(self):
-        """
-        L{IAddressBook.addressbookObjectWithUID} returns C{None} for addressbooks which
-        don't exist.
-        """
-        addressbook1 = self.addressbookUnderTest()
-        self.assertEquals(addressbook1.addressbookObjectWithUID("xyzzy"), None)
-
-
-    def test_addressbooks(self):
-        """
-        L{IAddressBookHome.addressbooks} returns an iterable of L{IAddressBook}
-        providers, which are consistent with the results from
-        L{IAddressBook.addressbookWithName}.
-        """
-        # Add a dot directory to make sure we don't find it
-        # self.home1._path.child(".foo").createDirectory()
-        home = self.homeUnderTest()
-        addressbooks = list(home.addressbooks())
-
-        for addressbook in addressbooks:
-            self.assertProvides(IAddressBook, addressbook)
-            self.assertEquals(addressbook,
-                              home.addressbookWithName(addressbook.name()))
-
-        self.assertEquals(
-            list(c.name() for c in addressbooks),
-            home1_addressbookNames
-        )
-
-
-    def test_addressbooksAfterAddAddressBook(self):
-        """
-        L{IAddressBookHome.addressbooks} includes addressbooks recently added with
-        L{IAddressBookHome.createAddressBookWithName}.
-        """
-        home = self.homeUnderTest()
-        before = set(x.name() for x in home.addressbooks())
-        home.createAddressBookWithName("new-name")
-        after = set(x.name() for x in home.addressbooks())
-        self.assertEquals(before | set(['new-name']), after)
-
-
-    def test_createAddressBookObjectWithName_absent(self):
-        """
-        L{IAddressBook.createAddressBookObjectWithName} creates a new
-        L{IAddressBookObject}.
-        """
-        addressbook1 = self.addressbookUnderTest()
-        name = "4.vcf"
-        self.assertIdentical(addressbook1.addressbookObjectWithName(name), None)
-        component = VComponent.fromString(vcard4_text)
-        addressbook1.createAddressBookObjectWithName(name, component)
-
-        addressbookObject = addressbook1.addressbookObjectWithName(name)
-        self.assertEquals(addressbookObject.component(), component)
-
-
-    def test_createAddressBookObjectWithName_exists(self):
-        """
-        L{IAddressBook.createAddressBookObjectWithName} raises
-        L{AddressBookObjectNameAlreadyExistsError} if a addressbook object with the
-        given name already exists in that addressbook.
-        """
-        self.assertRaises(
-            ObjectResourceNameAlreadyExistsError,
-            self.addressbookUnderTest().createAddressBookObjectWithName,
-            "1.vcf", VComponent.fromString(vcard4_text)
-        )
-
-
-    def test_createAddressBookObjectWithName_invalid(self):
-        """
-        L{IAddressBook.createAddressBookObjectWithName} raises
-        L{InvalidAddressBookComponentError} if presented with invalid iAddressBook
-        text.
-        """
-        self.assertRaises(
-            InvalidObjectResourceError,
-            self.addressbookUnderTest().createAddressBookObjectWithName,
-            "new", VComponent.fromString(vcard4notCardDAV_text)
-        )
-
-
-    def test_setComponent_invalid(self):
-        """
-        L{IAddressBookObject.setComponent} raises L{InvalidIAddressBookDataError} if
-        presented with invalid iAddressBook text.
-        """
-        addressbookObject = self.addressbookObjectUnderTest()
-        self.assertRaises(
-            InvalidObjectResourceError,
-            addressbookObject.setComponent,
-            VComponent.fromString(vcard4notCardDAV_text)
-        )
-
-
-    def test_setComponent_uidchanged(self):
-        """
-        L{IAddressBookObject.setComponent} raises L{InvalidAddressBookComponentError}
-        when given a L{VComponent} whose UID does not match its existing UID.
-        """
-        addressbook1 = self.addressbookUnderTest()
-        component = VComponent.fromString(vcard4_text)
-        addressbookObject = addressbook1.addressbookObjectWithName("1.vcf")
-        self.assertRaises(
-            InvalidObjectResourceError,
-            addressbookObject.setComponent, component
-        )
-
-
-    def test_addressbookHomeWithUID_create(self):
-        """
-        L{IAddressBookStoreTransaction.addressbookHomeWithUID} with C{create=True}
-        will create a addressbook home that doesn't exist yet.
-        """
-        txn = self.transactionUnderTest()
-        noHomeUID = "xyzzy"
-        addressbookHome = txn.addressbookHomeWithUID(
-            noHomeUID,
-            create=True
-        )
-        def readOtherTxn():
-            return self.savedStore.newTransaction().addressbookHomeWithUID(
-                noHomeUID)
-        self.assertProvides(IAddressBookHome, addressbookHome)
-        # A concurrent transaction shouldn't be able to read it yet:
-        self.assertIdentical(readOtherTxn(), None)
-        txn.commit()
-        # But once it's committed, other transactions should see it.
-        self.assertProvides(IAddressBookHome, readOtherTxn())
-
-
-    def test_setComponent(self):
-        """
-        L{AddressBookObject.setComponent} changes the result of
-        L{AddressBookObject.component} within the same transaction.
-        """
-        component = VComponent.fromString(vcard1modified_text)
-
-        addressbook1 = self.addressbookUnderTest()
-        addressbookObject = addressbook1.addressbookObjectWithName("1.vcf")
-        oldComponent = addressbookObject.component()
-        self.assertNotEqual(component, oldComponent)
-        addressbookObject.setComponent(component)
-        self.assertEquals(addressbookObject.component(), component)
-
-        # Also check a new instance
-        addressbookObject = addressbook1.addressbookObjectWithName("1.vcf")
-        self.assertEquals(addressbookObject.component(), component)
-
-
-    def checkPropertiesMethod(self, thunk):
-        """
-        Verify that the given object has a properties method that returns an
-        L{IPropertyStore}.
-        """
-        properties = thunk.properties()
-        self.assertProvides(IPropertyStore, properties)
-
-
-    def test_homeProperties(self):
-        """
-        L{IAddressBookHome.properties} returns a property store.
-        """
-        self.checkPropertiesMethod(self.homeUnderTest())
-
-
-    def test_addressbookProperties(self):
-        """
-        L{IAddressBook.properties} returns a property store.
-        """
-        self.checkPropertiesMethod(self.addressbookUnderTest())
-
-
-    def test_addressbookObjectProperties(self):
-        """
-        L{IAddressBookObject.properties} returns a property store.
-        """
-        self.checkPropertiesMethod(self.addressbookObjectUnderTest())
-
-
-    def test_newAddressBookObjectProperties(self):
-        """
-        L{IAddressBookObject.properties} returns an empty property store for a
-        addressbook object which has been created but not committed.
-        """
-        addressbook = self.addressbookUnderTest()
-        addressbook.createAddressBookObjectWithName(
-            "4.vcf", VComponent.fromString(vcard4_text)
-        )
-        newEvent = addressbook.addressbookObjectWithName("4.vcf")
-        self.assertEquals(newEvent.properties().items(), [])
-
-
-    def test_setComponentPreservesProperties(self):
-        """
-        L{IAddressBookObject.setComponent} preserves properties.
-
-        (Some implementations must go to extra trouble to provide this
-        behavior; for example, file storage must copy extended attributes from
-        the existing file to the temporary file replacing it.)
-        """
-        propertyName = PropertyName("http://example.com/ns", "example")
-        propertyContent = WebDAVUnknownElement("sample content")
-        propertyContent.name = propertyName.name
-        propertyContent.namespace = propertyName.namespace
-
-        self.addressbookObjectUnderTest().properties()[
-            propertyName] = propertyContent
-        self.commit()
-        # Sanity check; are properties even readable in a separate transaction?
-        # Should probably be a separate test.
-        self.assertEquals(
-            self.addressbookObjectUnderTest().properties()[propertyName],
-            propertyContent)
-        obj = self.addressbookObjectUnderTest()
-        vcard1_text = obj.vCardText()
-        vcard1_text_withDifferentNote = vcard1_text.replace(
-            "NOTE:CardDAV protocol updates",
-            "NOTE:Changed"
-        )
-        # Sanity check; make sure the test has the right idea of the subject.
-        self.assertNotEquals(vcard1_text, vcard1_text_withDifferentNote)
-        newComponent = VComponent.fromString(vcard1_text_withDifferentNote)
-        obj.setComponent(newComponent)
-
-        # Putting everything into a separate transaction to account for any
-        # caching that may take place.
-        self.commit()
-        self.assertEquals(
-            self.addressbookObjectUnderTest().properties()[propertyName],
-            propertyContent
-        )
-
-

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/common.py (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/common.py)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/common.py	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/common.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,782 @@
+# -*- test-case-name: txcarddav.addressbookstore -*-
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+"""
+Tests for common addressbook store API functions.
+"""
+
+from zope.interface.verify import verifyObject
+from zope.interface.exceptions import (
+    BrokenMethodImplementation, DoesNotImplement
+)
+
+from txdav.idav import IPropertyStore, IDataStore
+from txdav.propertystore.base import PropertyName
+
+from txdav.common.icommondatastore import (
+    HomeChildNameAlreadyExistsError, ICommonTransaction
+)
+from txdav.common.icommondatastore import InvalidObjectResourceError
+from txdav.common.icommondatastore import NoSuchHomeChildError
+from txdav.common.icommondatastore import NoSuchObjectResourceError
+from txdav.common.icommondatastore import ObjectResourceNameAlreadyExistsError
+
+from txcarddav.iaddressbookstore import (
+    IAddressBookObject, IAddressBookHome,
+    IAddressBook, IAddressBookTransaction
+)
+from twistedcaldav.vcard import Component as VComponent
+
+from twext.python.filepath import CachingFilePath as FilePath
+from twext.web2.dav import davxml
+from twext.web2.dav.element.base import WebDAVUnknownElement
+
+
+storePath = FilePath(__file__).parent().child("addressbook_store")
+
+homeRoot = storePath.child("ho").child("me").child("home1")
+
+adbk1Root = homeRoot.child("addressbook_1")
+
+addressbook1_objectNames = [
+    "1.vcf",
+    "2.vcf",
+    "3.vcf",
+]
+
+
+home1_addressbookNames = [
+    "addressbook_1",
+    "addressbook_2",
+    "addressbook_empty",
+]
+
+
+vcard4_text = (
+    """BEGIN:VCARD
+VERSION:3.0
+N:Thompson;Default;;;
+FN:Default Thompson
+EMAIL;type=INTERNET;type=WORK;type=pref:lthompson at example.com
+TEL;type=WORK;type=pref:1-555-555-5555
+TEL;type=CELL:1-444-444-4444
+item1.ADR;type=WORK;type=pref:;;1245 Test;Sesame Street;California;11111;USA
+item1.X-ABADR:us
+UID:uid4
+END:VCARD
+""".replace("\n", "\r\n")
+)
+
+
+
+vcard4notCardDAV_text = ( # Missing UID, N and FN
+"""BEGIN:VCARD
+VERSION:3.0
+EMAIL;type=INTERNET;type=WORK;type=pref:lthompson at example.com
+TEL;type=WORK;type=pref:1-555-555-5555
+TEL;type=CELL:1-444-444-4444
+item1.ADR;type=WORK;type=pref:;;1245 Test;Sesame Street;California;11111;USA
+item1.X-ABADR:us
+END:VCARD
+""".replace("\n", "\r\n")
+)
+
+
+
+vcard1modified_text = vcard4_text.replace(
+    "\r\nUID:uid4\r\n",
+    "\r\nUID:uid1\r\n"
+)
+
+
+
+class CommonTests(object):
+    """
+    Tests for common functionality of interfaces defined in
+    L{txcarddav.iaddressbookstore}.
+    """
+
+    requirements = {
+        "home1": {
+            "addressbook_1": {
+                "1.vcf": adbk1Root.child("1.vcf").getContent(),
+                "2.vcf": adbk1Root.child("2.vcf").getContent(),
+                "3.vcf": adbk1Root.child("3.vcf").getContent()
+            },
+            "addressbook_empty": {},
+            "not_a_addressbook": None
+        },
+        "not_a_home": None
+    }
+
+    def storeUnderTest(self):
+        """
+        Subclasses must override this to return an L{IAddressBookStore}
+        provider which adheres to the structure detailed by
+        L{CommonTests.requirements}. This attribute is a dict of dict of dicts;
+        the outermost layer representing UIDs mapping to addressbook homes,
+        then addressbook names mapping to addressbook collections, and finally
+        addressbook object names mapping to addressbook object text.
+        """
+        raise NotImplementedError()
+
+
+    lastTransaction = None
+    savedStore = None
+
+    def transactionUnderTest(self):
+        """
+        Create a transaction from C{storeUnderTest} and save it as
+        C[lastTransaction}.  Also makes sure to use the same store, saving the
+        value from C{storeUnderTest}.
+        """
+        if self.lastTransaction is not None:
+            return self.lastTransaction
+        if self.savedStore is None:
+            self.savedStore = self.storeUnderTest()
+        txn = self.lastTransaction = self.savedStore.newTransaction()
+        return txn
+
+
+    def commit(self):
+        """
+        Commit the last transaction created from C{transactionUnderTest}, and
+        clear it.
+        """
+        self.lastTransaction.commit()
+        self.lastTransaction = None
+
+
+    def abort(self):
+        """
+        Abort the last transaction created from C[transactionUnderTest}, and
+        clear it.
+        """
+        self.lastTransaction.abort()
+        self.lastTransaction = None
+
+
+    def homeUnderTest(self):
+        """
+        Get the addressbook home detailed by C{requirements['home1']}.
+        """
+        return self.transactionUnderTest().addressbookHomeWithUID("home1")
+
+
+    def addressbookUnderTest(self):
+        """
+        Get the addressbook detailed by C{requirements['home1']['addressbook_1']}.
+        """
+        return self.homeUnderTest().addressbookWithName("addressbook_1")
+
+
+    def addressbookObjectUnderTest(self):
+        """
+        Get the addressbook detailed by
+        C{requirements['home1']['addressbook_1']['1.vcf']}.
+        """
+        return self.addressbookUnderTest().addressbookObjectWithName("1.vcf")
+
+
+    def assertProvides(self, interface, provider):
+        """
+        Verify that C{provider} properly provides C{interface}
+
+        @type interface: L{zope.interface.Interface}
+        @type provider: C{provider}
+        """
+        try:
+            verifyObject(interface, provider)
+        except BrokenMethodImplementation, e:
+            self.fail(e)
+        except DoesNotImplement, e:
+            self.fail("%r does not provide %s.%s" %
+                (provider, interface.__module__, interface.getName()))
+
+
+    def test_addressbookStoreProvides(self):
+        """
+        The addressbook store provides L{IAddressBookStore} and its required
+        attributes.
+        """
+        addressbookStore = self.storeUnderTest()
+        self.assertProvides(IDataStore, addressbookStore)
+
+
+    def test_transactionProvides(self):
+        """
+        The transactions generated by the addressbook store provide
+        L{IAddressBookStoreTransaction} and its required attributes.
+        """
+        txn = self.storeUnderTest().newTransaction()
+        self.assertProvides(ICommonTransaction, txn)
+        self.assertProvides(IAddressBookTransaction, txn)
+
+
+    def test_homeProvides(self):
+        """
+        The addressbook homes generated by the addressbook store provide
+        L{IAddressBookHome} and its required attributes.
+        """
+        self.assertProvides(IAddressBookHome, self.homeUnderTest())
+
+
+    def test_addressbookProvides(self):
+        """
+        The addressbooks generated by the addressbook store provide L{IAddressBook} and
+        its required attributes.
+        """
+        self.assertProvides(IAddressBook, self.addressbookUnderTest())
+
+
+    def test_addressbookObjectProvides(self):
+        """
+        The addressbook objects generated by the addressbook store provide
+        L{IAddressBookObject} and its required attributes.
+        """
+        self.assertProvides(IAddressBookObject, self.addressbookObjectUnderTest())
+
+
+    def test_addressbookHomeWithUID_exists(self):
+        """
+        Finding an existing addressbook home by UID results in an object that
+        provides L{IAddressBookHome} and has a C{uid()} method that returns the
+        same value that was passed in.
+        """
+        addressbookHome = (self.storeUnderTest().newTransaction()
+                        .addressbookHomeWithUID("home1"))
+
+        self.assertEquals(addressbookHome.uid(), "home1")
+        self.assertProvides(IAddressBookHome, addressbookHome)
+
+
+    def test_addressbookHomeWithUID_absent(self):
+        """
+        L{IAddressBookStoreTransaction.addressbookHomeWithUID} should return C{None}
+        when asked for a non-existent addressbook home.
+        """
+        self.assertEquals(
+            self.storeUnderTest().newTransaction()
+            .addressbookHomeWithUID("xyzzy"),
+            None
+        )
+
+
+    def test_addressbookWithName_exists(self):
+        """
+        L{IAddressBookHome.addressbookWithName} returns an L{IAddressBook} provider,
+        whose name matches the one passed in.
+        """
+        home = self.homeUnderTest()
+        for name in home1_addressbookNames:
+            addressbook = home.addressbookWithName(name)
+            self.assertProvides(IAddressBook, addressbook)
+            self.assertEquals(addressbook.name(), name)
+
+
+    def test_addressbookRename(self):
+        """
+        L{IAddressBook.rename} changes the name of the L{IAddressBook}.
+        """
+        home = self.homeUnderTest()
+        addressbook = home.addressbookWithName("addressbook_1")
+        addressbook.rename("some_other_name")
+        def positiveAssertions():
+            self.assertEquals(addressbook.name(), "some_other_name")
+            self.assertEquals(addressbook, home.addressbookWithName("some_other_name"))
+            self.assertEquals(None, home.addressbookWithName("addressbook_1"))
+        positiveAssertions()
+        self.commit()
+        home = self.homeUnderTest()
+        addressbook = home.addressbookWithName("some_other_name")
+        positiveAssertions()
+        # FIXME: revert
+        # FIXME: test for multiple renames
+        # FIXME: test for conflicting renames (a->b, c->a in the same txn)
+
+
+    def test_addressbookWithName_absent(self):
+        """
+        L{IAddressBookHome.addressbookWithName} returns C{None} for addressbooks which
+        do not exist.
+        """
+        self.assertEquals(self.homeUnderTest().addressbookWithName("xyzzy"),
+                          None)
+
+
+    def test_createAddressBookWithName_absent(self):
+        """
+        L{IAddressBookHome.createAddressBookWithName} creates a new L{IAddressBook} that
+        can be retrieved with L{IAddressBookHome.addressbookWithName}.
+        """
+        home = self.homeUnderTest()
+        name = "new"
+        self.assertIdentical(home.addressbookWithName(name), None)
+        home.createAddressBookWithName(name)
+        self.assertNotIdentical(home.addressbookWithName(name), None)
+        def checkProperties():
+            addressbookProperties = home.addressbookWithName(name).properties()
+            self.assertEquals(
+                addressbookProperties[
+                    PropertyName.fromString(davxml.ResourceType.sname())
+                ],
+                davxml.ResourceType.addressbook) #@UndefinedVariable
+        checkProperties()
+        self.commit()
+
+        # Make sure it's available in a new transaction; i.e. test the commit.
+        home = self.homeUnderTest()
+        self.assertNotIdentical(home.addressbookWithName(name), None)
+        home = self.addressbookStore.newTransaction().addressbookHomeWithUID(
+            "home1")
+        # Sanity check: are the properties actually persisted?
+        # FIXME: no independent testing of this right now
+        checkProperties()
+
+
+    def test_createAddressBookWithName_exists(self):
+        """
+        L{IAddressBookHome.createAddressBookWithName} raises
+        L{AddressBookAlreadyExistsError} when the name conflicts with an already-
+        existing address book.
+        """
+        for name in home1_addressbookNames:
+            self.assertRaises(
+                HomeChildNameAlreadyExistsError,
+                self.homeUnderTest().createAddressBookWithName, name
+            )
+
+
+    def test_removeAddressBookWithName_exists(self):
+        """
+        L{IAddressBookHome.removeAddressBookWithName} removes a addressbook that already
+        exists.
+        """
+        home = self.homeUnderTest()
+        # FIXME: test transactions
+        for name in home1_addressbookNames:
+            self.assertNotIdentical(home.addressbookWithName(name), None)
+            home.removeAddressBookWithName(name)
+            self.assertEquals(home.addressbookWithName(name), None)
+
+
+    def test_removeAddressBookWithName_absent(self):
+        """
+        Attempt to remove an non-existing addressbook should raise.
+        """
+        home = self.homeUnderTest()
+        self.assertRaises(NoSuchHomeChildError,
+                          home.removeAddressBookWithName, "xyzzy")
+
+
+    def test_addressbookObjects(self):
+        """
+        L{IAddressBook.addressbookObjects} will enumerate the addressbook objects present
+        in the filesystem, in name order, but skip those with hidden names.
+        """
+        addressbook1 = self.addressbookUnderTest()
+        addressbookObjects = list(addressbook1.addressbookObjects())
+
+        for addressbookObject in addressbookObjects:
+            self.assertProvides(IAddressBookObject, addressbookObject)
+            self.assertEquals(
+                addressbook1.addressbookObjectWithName(addressbookObject.name()),
+                addressbookObject
+            )
+
+        self.assertEquals(
+            list(o.name() for o in addressbookObjects),
+            addressbook1_objectNames
+        )
+
+
+    def test_addressbookObjectsWithRemovedObject(self):
+        """
+        L{IAddressBook.addressbookObjects} skips those objects which have been
+        removed by L{AddressBook.removeAddressBookObjectWithName} in the same
+        transaction, even if it has not yet been committed.
+        """
+        addressbook1 = self.addressbookUnderTest()
+        addressbook1.removeAddressBookObjectWithName("2.vcf")
+        addressbookObjects = list(addressbook1.addressbookObjects())
+        self.assertEquals(set(o.name() for o in addressbookObjects),
+                          set(addressbook1_objectNames) - set(["2.vcf"]))
+
+
+    def test_ownerAddressBookHome(self):
+        """
+        L{IAddressBook.ownerAddressBookHome} should match the home UID.
+        """
+        self.assertEquals(
+            self.addressbookUnderTest().ownerAddressBookHome().uid(),
+            self.homeUnderTest().uid()
+        )
+
+
+    def test_addressbookObjectWithName_exists(self):
+        """
+        L{IAddressBook.addressbookObjectWithName} returns an L{IAddressBookObject}
+        provider for addressbooks which already exist.
+        """
+        addressbook1 = self.addressbookUnderTest()
+        for name in addressbook1_objectNames:
+            addressbookObject = addressbook1.addressbookObjectWithName(name)
+            self.assertProvides(IAddressBookObject, addressbookObject)
+            self.assertEquals(addressbookObject.name(), name)
+            # FIXME: add more tests based on CommonTests.requirements
+
+
+    def test_addressbookObjectWithName_absent(self):
+        """
+        L{IAddressBook.addressbookObjectWithName} returns C{None} for addressbooks which
+        don't exist.
+        """
+        addressbook1 = self.addressbookUnderTest()
+        self.assertEquals(addressbook1.addressbookObjectWithName("xyzzy"), None)
+
+
+    def test_removeAddressBookObjectWithUID_exists(self):
+        """
+        Remove an existing addressbook object.
+        """
+        addressbook = self.addressbookUnderTest()
+        for name in addressbook1_objectNames:
+            uid = (u'uid' + name.rstrip(".vcf"))
+            self.assertNotIdentical(addressbook.addressbookObjectWithUID(uid),
+                                    None)
+            addressbook.removeAddressBookObjectWithUID(uid)
+            self.assertEquals(
+                addressbook.addressbookObjectWithUID(uid),
+                None
+            )
+            self.assertEquals(
+                addressbook.addressbookObjectWithName(name),
+                None
+            )
+
+
+    def test_removeAddressBookObjectWithName_exists(self):
+        """
+        Remove an existing addressbook object.
+        """
+        addressbook = self.addressbookUnderTest()
+        for name in addressbook1_objectNames:
+            self.assertNotIdentical(
+                addressbook.addressbookObjectWithName(name), None
+            )
+            addressbook.removeAddressBookObjectWithName(name)
+            self.assertIdentical(
+                addressbook.addressbookObjectWithName(name), None
+            )
+
+
+    def test_removeAddressBookObjectWithName_absent(self):
+        """
+        Attempt to remove an non-existing addressbook object should raise.
+        """
+        addressbook = self.addressbookUnderTest()
+        self.assertRaises(
+            NoSuchObjectResourceError,
+            addressbook.removeAddressBookObjectWithName, "xyzzy"
+        )
+
+
+    def test_addressbookName(self):
+        """
+        L{AddressBook.name} reflects the name of the addressbook.
+        """
+        self.assertEquals(self.addressbookUnderTest().name(), "addressbook_1")
+
+
+    def test_addressbookObjectName(self):
+        """
+        L{IAddressBookObject.name} reflects the name of the addressbook object.
+        """
+        self.assertEquals(self.addressbookObjectUnderTest().name(), "1.vcf")
+
+
+    def test_component(self):
+        """
+        L{IAddressBookObject.component} returns a L{VComponent} describing the
+        addressbook data underlying that addressbook object.
+        """
+        component = self.addressbookObjectUnderTest().component()
+
+        self.failUnless(
+            isinstance(component, VComponent),
+            component
+        )
+
+        self.assertEquals(component.name(), "VCARD")
+        self.assertEquals(component.resourceUID(), "uid1")
+
+
+    def test_iAddressBookText(self):
+        """
+        L{IAddressBookObject.iAddressBookText} returns a C{str} describing the same
+        data provided by L{IAddressBookObject.component}.
+        """
+        text = self.addressbookObjectUnderTest().vCardText()
+        self.assertIsInstance(text, str)
+        self.failUnless(text.startswith("BEGIN:VCARD\r\n"))
+        self.assertIn("\r\nUID:uid1\r\n", text)
+        self.failUnless(text.endswith("\r\nEND:VCARD\r\n"))
+
+
+    def test_addressbookObjectUID(self):
+        """
+        L{IAddressBookObject.uid} returns a C{str} describing the C{UID} property
+        of the addressbook object's component.
+        """
+        self.assertEquals(self.addressbookObjectUnderTest().uid(), "uid1")
+
+
+    def test_addressbookObjectWithUID_absent(self):
+        """
+        L{IAddressBook.addressbookObjectWithUID} returns C{None} for addressbooks which
+        don't exist.
+        """
+        addressbook1 = self.addressbookUnderTest()
+        self.assertEquals(addressbook1.addressbookObjectWithUID("xyzzy"), None)
+
+
+    def test_addressbooks(self):
+        """
+        L{IAddressBookHome.addressbooks} returns an iterable of L{IAddressBook}
+        providers, which are consistent with the results from
+        L{IAddressBook.addressbookWithName}.
+        """
+        # Add a dot directory to make sure we don't find it
+        # self.home1._path.child(".foo").createDirectory()
+        home = self.homeUnderTest()
+        addressbooks = list(home.addressbooks())
+
+        for addressbook in addressbooks:
+            self.assertProvides(IAddressBook, addressbook)
+            self.assertEquals(addressbook,
+                              home.addressbookWithName(addressbook.name()))
+
+        self.assertEquals(
+            list(c.name() for c in addressbooks),
+            home1_addressbookNames
+        )
+
+
+    def test_addressbooksAfterAddAddressBook(self):
+        """
+        L{IAddressBookHome.addressbooks} includes addressbooks recently added with
+        L{IAddressBookHome.createAddressBookWithName}.
+        """
+        home = self.homeUnderTest()
+        before = set(x.name() for x in home.addressbooks())
+        home.createAddressBookWithName("new-name")
+        after = set(x.name() for x in home.addressbooks())
+        self.assertEquals(before | set(['new-name']), after)
+
+
+    def test_createAddressBookObjectWithName_absent(self):
+        """
+        L{IAddressBook.createAddressBookObjectWithName} creates a new
+        L{IAddressBookObject}.
+        """
+        addressbook1 = self.addressbookUnderTest()
+        name = "4.vcf"
+        self.assertIdentical(addressbook1.addressbookObjectWithName(name), None)
+        component = VComponent.fromString(vcard4_text)
+        addressbook1.createAddressBookObjectWithName(name, component)
+
+        addressbookObject = addressbook1.addressbookObjectWithName(name)
+        self.assertEquals(addressbookObject.component(), component)
+
+
+    def test_createAddressBookObjectWithName_exists(self):
+        """
+        L{IAddressBook.createAddressBookObjectWithName} raises
+        L{AddressBookObjectNameAlreadyExistsError} if a addressbook object with the
+        given name already exists in that addressbook.
+        """
+        self.assertRaises(
+            ObjectResourceNameAlreadyExistsError,
+            self.addressbookUnderTest().createAddressBookObjectWithName,
+            "1.vcf", VComponent.fromString(vcard4_text)
+        )
+
+
+    def test_createAddressBookObjectWithName_invalid(self):
+        """
+        L{IAddressBook.createAddressBookObjectWithName} raises
+        L{InvalidAddressBookComponentError} if presented with invalid iAddressBook
+        text.
+        """
+        self.assertRaises(
+            InvalidObjectResourceError,
+            self.addressbookUnderTest().createAddressBookObjectWithName,
+            "new", VComponent.fromString(vcard4notCardDAV_text)
+        )
+
+
+    def test_setComponent_invalid(self):
+        """
+        L{IAddressBookObject.setComponent} raises L{InvalidIAddressBookDataError} if
+        presented with invalid iAddressBook text.
+        """
+        addressbookObject = self.addressbookObjectUnderTest()
+        self.assertRaises(
+            InvalidObjectResourceError,
+            addressbookObject.setComponent,
+            VComponent.fromString(vcard4notCardDAV_text)
+        )
+
+
+    def test_setComponent_uidchanged(self):
+        """
+        L{IAddressBookObject.setComponent} raises L{InvalidAddressBookComponentError}
+        when given a L{VComponent} whose UID does not match its existing UID.
+        """
+        addressbook1 = self.addressbookUnderTest()
+        component = VComponent.fromString(vcard4_text)
+        addressbookObject = addressbook1.addressbookObjectWithName("1.vcf")
+        self.assertRaises(
+            InvalidObjectResourceError,
+            addressbookObject.setComponent, component
+        )
+
+
+    def test_addressbookHomeWithUID_create(self):
+        """
+        L{IAddressBookStoreTransaction.addressbookHomeWithUID} with C{create=True}
+        will create a addressbook home that doesn't exist yet.
+        """
+        txn = self.transactionUnderTest()
+        noHomeUID = "xyzzy"
+        addressbookHome = txn.addressbookHomeWithUID(
+            noHomeUID,
+            create=True
+        )
+        def readOtherTxn():
+            return self.savedStore.newTransaction().addressbookHomeWithUID(
+                noHomeUID)
+        self.assertProvides(IAddressBookHome, addressbookHome)
+        # A concurrent transaction shouldn't be able to read it yet:
+        self.assertIdentical(readOtherTxn(), None)
+        txn.commit()
+        # But once it's committed, other transactions should see it.
+        self.assertProvides(IAddressBookHome, readOtherTxn())
+
+
+    def test_setComponent(self):
+        """
+        L{AddressBookObject.setComponent} changes the result of
+        L{AddressBookObject.component} within the same transaction.
+        """
+        component = VComponent.fromString(vcard1modified_text)
+
+        addressbook1 = self.addressbookUnderTest()
+        addressbookObject = addressbook1.addressbookObjectWithName("1.vcf")
+        oldComponent = addressbookObject.component()
+        self.assertNotEqual(component, oldComponent)
+        addressbookObject.setComponent(component)
+        self.assertEquals(addressbookObject.component(), component)
+
+        # Also check a new instance
+        addressbookObject = addressbook1.addressbookObjectWithName("1.vcf")
+        self.assertEquals(addressbookObject.component(), component)
+
+
+    def checkPropertiesMethod(self, thunk):
+        """
+        Verify that the given object has a properties method that returns an
+        L{IPropertyStore}.
+        """
+        properties = thunk.properties()
+        self.assertProvides(IPropertyStore, properties)
+
+
+    def test_homeProperties(self):
+        """
+        L{IAddressBookHome.properties} returns a property store.
+        """
+        self.checkPropertiesMethod(self.homeUnderTest())
+
+
+    def test_addressbookProperties(self):
+        """
+        L{IAddressBook.properties} returns a property store.
+        """
+        self.checkPropertiesMethod(self.addressbookUnderTest())
+
+
+    def test_addressbookObjectProperties(self):
+        """
+        L{IAddressBookObject.properties} returns a property store.
+        """
+        self.checkPropertiesMethod(self.addressbookObjectUnderTest())
+
+
+    def test_newAddressBookObjectProperties(self):
+        """
+        L{IAddressBookObject.properties} returns an empty property store for a
+        addressbook object which has been created but not committed.
+        """
+        addressbook = self.addressbookUnderTest()
+        addressbook.createAddressBookObjectWithName(
+            "4.vcf", VComponent.fromString(vcard4_text)
+        )
+        newEvent = addressbook.addressbookObjectWithName("4.vcf")
+        self.assertEquals(newEvent.properties().items(), [])
+
+
+    def test_setComponentPreservesProperties(self):
+        """
+        L{IAddressBookObject.setComponent} preserves properties.
+
+        (Some implementations must go to extra trouble to provide this
+        behavior; for example, file storage must copy extended attributes from
+        the existing file to the temporary file replacing it.)
+        """
+        propertyName = PropertyName("http://example.com/ns", "example")
+        propertyContent = WebDAVUnknownElement("sample content")
+        propertyContent.name = propertyName.name
+        propertyContent.namespace = propertyName.namespace
+
+        self.addressbookObjectUnderTest().properties()[
+            propertyName] = propertyContent
+        self.commit()
+        # Sanity check; are properties even readable in a separate transaction?
+        # Should probably be a separate test.
+        self.assertEquals(
+            self.addressbookObjectUnderTest().properties()[propertyName],
+            propertyContent)
+        obj = self.addressbookObjectUnderTest()
+        vcard1_text = obj.vCardText()
+        vcard1_text_withDifferentNote = vcard1_text.replace(
+            "NOTE:CardDAV protocol updates",
+            "NOTE:Changed"
+        )
+        # Sanity check; make sure the test has the right idea of the subject.
+        self.assertNotEquals(vcard1_text, vcard1_text_withDifferentNote)
+        newComponent = VComponent.fromString(vcard1_text_withDifferentNote)
+        obj.setComponent(newComponent)
+
+        # Putting everything into a separate transaction to account for any
+        # caching that may take place.
+        self.commit()
+        self.assertEquals(
+            self.addressbookObjectUnderTest().properties()[propertyName],
+            propertyContent
+        )
+
+

Deleted: CalendarServer/trunk/txcarddav/addressbookstore/test/test_file.py
===================================================================
--- CalendarServer/branches/new-store/txcarddav/addressbookstore/test/test_file.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/test_file.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,450 +0,0 @@
-##
-# Copyright (c) 2010 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-"""
-File addressbook store tests.
-"""
-
-from twext.python.filepath import CachingFilePath as FilePath
-from twisted.trial import unittest
-
-from twistedcaldav.vcard import Component as VComponent
-
-from txdav.common.icommondatastore import HomeChildNameNotAllowedError
-from txdav.common.icommondatastore import ObjectResourceNameNotAllowedError
-from txdav.common.icommondatastore import ObjectResourceUIDAlreadyExistsError
-from txdav.common.icommondatastore import NoSuchHomeChildError
-from txdav.common.icommondatastore import NoSuchObjectResourceError
-
-from txcarddav.addressbookstore.file import AddressBookStore, AddressBookHome
-from txcarddav.addressbookstore.file import AddressBook, AddressBookObject
-
-from txcarddav.addressbookstore.test.common import (
-    CommonTests, vcard4_text, vcard1modified_text)
-
-storePath = FilePath(__file__).parent().child("addressbook_store")
-
-def _todo(f, why):
-    f.todo = why
-    return f
-
-
-
-featureUnimplemented = lambda f: _todo(f, "Feature unimplemented")
-testUnimplemented = lambda f: _todo(f, "Test unimplemented")
-todo = lambda why: lambda f: _todo(f, why)
-
-
-def setUpAddressBookStore(test):
-    test.root = FilePath(test.mktemp())
-    test.root.createDirectory()
-
-    storeRootPath = test.storeRootPath = test.root.child("store")
-    addressbookPath = storeRootPath.child("addressbooks").child("__uids__")
-    addressbookPath.parent().makedirs()
-    storePath.copyTo(addressbookPath)
-
-    test.addressbookStore = AddressBookStore(storeRootPath)
-    test.txn = test.addressbookStore.newTransaction()
-    assert test.addressbookStore is not None, "No addressbook store?"
-
-
-
-def setUpHome1(test):
-    setUpAddressBookStore(test)
-    test.home1 = test.txn.addressbookHomeWithUID("home1")
-    assert test.home1 is not None, "No addressbook home?"
-
-
-
-def setUpAddressBook1(test):
-    setUpHome1(test)
-    test.addressbook1 = test.home1.addressbookWithName("addressbook_1")
-    assert test.addressbook1 is not None, "No addressbook?"
-
-
-
-class AddressBookStoreTest(unittest.TestCase):
-    """
-    Test cases for L{AddressBookStore}.
-    """
-
-    def setUp(self):
-        setUpAddressBookStore(self)
-
-
-    def test_addressbookHomeWithUID_dot(self):
-        """
-        Filenames starting with "." are reserved by this
-        implementation, so no UIDs may start with ".".
-        """
-        self.assertEquals(
-            self.addressbookStore.newTransaction().addressbookHomeWithUID("xyzzy"),
-            None
-        )
-
-
-
-class AddressBookHomeTest(unittest.TestCase):
-
-    def setUp(self):
-        setUpHome1(self)
-
-
-    def test_init(self):
-        """
-        L{AddressBookHome} has C{_path} and L{_addressbookStore} attributes,
-        indicating its location on disk and parent store, respectively.
-        """
-        self.failUnless(
-            isinstance(self.home1._path, FilePath),
-            self.home1._path
-        )
-        self.assertEquals(
-            self.home1._addressbookStore,
-            self.addressbookStore
-        )
-
-
-    def test_addressbookWithName_dot(self):
-        """
-        Filenames starting with "." are reserved by this
-        implementation, so no addressbook names may start with ".".
-        """
-        name = ".foo"
-        self.home1._path.child(name).createDirectory()
-        self.assertEquals(self.home1.addressbookWithName(name), None)
-
-
-    def test_createAddressBookWithName_dot(self):
-        """
-        Filenames starting with "." are reserved by this
-        implementation, so no addressbook names may start with ".".
-        """
-        self.assertRaises(
-            HomeChildNameNotAllowedError,
-            self.home1.createAddressBookWithName, ".foo"
-        )
-
-
-    def test_removeAddressBookWithName_dot(self):
-        """
-        Filenames starting with "." are reserved by this
-        implementation, so no addressbook names may start with ".".
-        """
-        name = ".foo"
-        self.home1._path.child(name).createDirectory()
-        self.assertRaises(
-            NoSuchHomeChildError,
-            self.home1.removeAddressBookWithName, name
-        )
-
-
-
-class AddressBookTest(unittest.TestCase):
-
-    def setUp(self):
-        setUpAddressBook1(self)
-
-
-    def test_init(self):
-        """
-        L{AddressBook.__init__} sets private attributes to reflect its constructor
-        arguments.
-        """
-        self.failUnless(
-            isinstance(self.addressbook1._path, FilePath),
-            self.addressbook1
-        )
-        self.failUnless(
-            isinstance(self.addressbook1._addressbookHome, AddressBookHome),
-            self.addressbook1._addressbookHome
-        )
-
-
-    def test_useIndexImmediately(self):
-        """
-        L{AddressBook._index} is usable in the same transaction it is created, with
-        a temporary filename.
-        """
-        self.home1.createAddressBookWithName("addressbook2")
-        addressbook = self.home1.addressbookWithName("addressbook2")
-        index = addressbook._index
-        self.assertEquals(set(index.addressbookObjects()),
-                          set(addressbook.addressbookObjects()))
-        self.txn.commit()
-        self.txn = self.addressbookStore.newTransaction()
-        self.home1 = self.txn.addressbookHomeWithUID("home1")
-        addressbook = self.home1.addressbookWithName("addressbook2")
-        # FIXME: we should be curating our own index here, but in order to fix
-        # that the code in the old implicit scheduler needs to change.  This
-        # test would be more effective if there were actually some objects in
-        # this list.
-        index = addressbook._index
-        self.assertEquals(set(index.addressbookObjects()),
-                          set(addressbook.addressbookObjects()))
-
-
-    def test_addressbookObjectWithName_dot(self):
-        """
-        Filenames starting with "." are reserved by this
-        implementation, so no addressbook object names may start with
-        ".".
-        """
-        name = ".foo.vcf"
-        self.home1._path.child(name).touch()
-        self.assertEquals(self.addressbook1.addressbookObjectWithName(name), None)
-
-
-    @featureUnimplemented
-    def test_addressbookObjectWithUID_exists(self):
-        """
-        Find existing addressbook object by name.
-        """
-        addressbookObject = self.addressbook1.addressbookObjectWithUID("1")
-        self.failUnless(
-            isinstance(addressbookObject, AddressBookObject),
-            addressbookObject
-        )
-        self.assertEquals(
-            addressbookObject.component(),
-            self.addressbook1.addressbookObjectWithName("1.vcf").component()
-        )
-
-
-    def test_createAddressBookObjectWithName_dot(self):
-        """
-        Filenames starting with "." are reserved by this
-        implementation, so no addressbook object names may start with
-        ".".
-        """
-        self.assertRaises(
-            ObjectResourceNameNotAllowedError,
-            self.addressbook1.createAddressBookObjectWithName,
-            ".foo", VComponent.fromString(vcard4_text)
-        )
-
-
-    @featureUnimplemented
-    def test_createAddressBookObjectWithName_uidconflict(self):
-        """
-        Attempt to create a addressbook object with a conflicting UID
-        should raise.
-        """
-        name = "foo.vcf"
-        assert self.addressbook1.addressbookObjectWithName(name) is None
-        component = VComponent.fromString(vcard1modified_text)
-        self.assertRaises(
-            ObjectResourceUIDAlreadyExistsError,
-            self.addressbook1.createAddressBookObjectWithName,
-            name, component
-        )
-
-
-    def test_removeAddressBookObject_delayedEffect(self):
-        """
-        Removing a addressbook object should not immediately remove the underlying
-        file; it should only be removed upon commit() of the transaction.
-        """
-        self.addressbook1.removeAddressBookObjectWithName("2.vcf")
-        self.failUnless(self.addressbook1._path.child("2.vcf").exists())
-        self.txn.commit()
-        self.failIf(self.addressbook1._path.child("2.vcf").exists())
-
-
-    def test_removeAddressBookObjectWithName_dot(self):
-        """
-        Filenames starting with "." are reserved by this
-        implementation, so no addressbook object names may start with
-        ".".
-        """
-        name = ".foo"
-        self.addressbook1._path.child(name).touch()
-        self.assertRaises(
-            NoSuchObjectResourceError,
-            self.addressbook1.removeAddressBookObjectWithName, name
-        )
-
-
-    def _refresh(self):
-        """
-        Re-read the (committed) home1 and addressbook1 objects in a new
-        transaction.
-        """
-        self.txn = self.addressbookStore.newTransaction()
-        self.home1 = self.txn.addressbookHomeWithUID("home1")
-        self.addressbook1 = self.home1.addressbookWithName("addressbook_1")
-
-
-    def test_undoCreateAddressBookObject(self):
-        """
-        If a addressbook object is created as part of a transaction, it will be
-        removed if that transaction has to be aborted.
-        """
-        # Make sure that the addressbook home is actually committed; rolling back
-        # addressbook home creation will remove the whole directory.
-        self.txn.commit()
-        self._refresh()
-        self.addressbook1.createAddressBookObjectWithName(
-            "sample.vcf",
-            VComponent.fromString(vcard4_text)
-        )
-        self._refresh()
-        self.assertIdentical(
-            self.addressbook1.addressbookObjectWithName("sample.vcf"),
-            None
-        )
-
-
-    def doThenUndo(self):
-        """
-        Commit the current transaction, but add an operation that will cause it
-        to fail at the end.  Finally, refresh all attributes with a new
-        transaction so that further oparations can be performed in a valid
-        context.
-        """
-        def fail():
-            raise RuntimeError("oops")
-        self.txn.addOperation(fail, "dummy failing operation")
-        self.assertRaises(RuntimeError, self.txn.commit)
-        self._refresh()
-
-
-    def test_undoModifyAddressBookObject(self):
-        """
-        If an existing addressbook object is modified as part of a transaction, it
-        should be restored to its previous status if the transaction aborts.
-        """
-        originalComponent = self.addressbook1.addressbookObjectWithName(
-            "1.vcf").component()
-        self.addressbook1.addressbookObjectWithName("1.vcf").setComponent(
-            VComponent.fromString(vcard1modified_text)
-        )
-        # Sanity check.
-        self.assertEquals(
-            self.addressbook1.addressbookObjectWithName("1.vcf").component(),
-            VComponent.fromString(vcard1modified_text)
-        )
-        self.doThenUndo()
-        self.assertEquals(
-            self.addressbook1.addressbookObjectWithName("1.vcf").component(),
-            originalComponent
-        )
-
-
-    def test_modifyAddressBookObjectCaches(self):
-        """
-        Modifying a addressbook object should cache the modified component in
-        memory, to avoid unnecessary parsing round-trips.
-        """
-        modifiedComponent = VComponent.fromString(vcard1modified_text)
-        self.addressbook1.addressbookObjectWithName("1.vcf").setComponent(
-            modifiedComponent
-        )
-        self.assertIdentical(
-            modifiedComponent,
-            self.addressbook1.addressbookObjectWithName("1.vcf").component()
-        )
-
-
-    @featureUnimplemented
-    def test_removeAddressBookObjectWithUID_absent(self):
-        """
-        Attempt to remove an non-existing addressbook object should raise.
-        """
-        self.assertRaises(
-            NoSuchObjectResourceError,
-            self.addressbook1.removeAddressBookObjectWithUID, "xyzzy"
-        )
-
-
-    @testUnimplemented
-    def test_syncToken(self):
-        """
-        Sync token is correct.
-        """
-        raise NotImplementedError()
-
-
-    @testUnimplemented
-    def test_addressbookObjectsInTimeRange(self):
-        """
-        Find addressbook objects occuring in a given time range.
-        """
-        raise NotImplementedError()
-
-
-    @testUnimplemented
-    def test_addressbookObjectsSinceToken(self):
-        """
-        Find addressbook objects that have been modified since a given
-        sync token.
-        """
-        raise NotImplementedError()
-
-
-
-class AddressBookObjectTest(unittest.TestCase):
-    def setUp(self):
-        setUpAddressBook1(self)
-        self.object1 = self.addressbook1.addressbookObjectWithName("1.vcf")
-
-
-    def test_init(self):
-        """
-        L{AddressBookObject} has instance attributes, C{_path} and C{_addressbook},
-        which refer to its position in the filesystem and the addressbook in which
-        it is contained, respectively.
-        """ 
-        self.failUnless(
-            isinstance(self.object1._path, FilePath),
-            self.object1._path
-        )
-        self.failUnless(
-            isinstance(self.object1._addressbook, AddressBook),
-            self.object1._addressbook
-        )
-
-
-class FileStorageTests(unittest.TestCase, CommonTests):
-    """
-    File storage tests.
-    """
-
-    def storeUnderTest(self):
-        """
-        Create and return a L{AddressBookStore} for testing.
-        """
-        setUpAddressBookStore(self)
-        return self.addressbookStore
-
-
-    def test_init(self):
-        """
-        L{AddressBookStore} has a C{_path} attribute which refers to its
-        constructor argument.
-        """
-        self.assertEquals(self.storeUnderTest()._path,
-                          self.storeRootPath)
-
-
-    def test_addressbookObjectsWithDotFile(self):
-        """
-        Adding a dotfile to the addressbook home should not increase
-        """
-        self.homeUnderTest()._path.child(".foo").createDirectory()
-        self.test_addressbookObjects()
-

Copied: CalendarServer/trunk/txcarddav/addressbookstore/test/test_file.py (from rev 5919, CalendarServer/branches/new-store/txcarddav/addressbookstore/test/test_file.py)
===================================================================
--- CalendarServer/trunk/txcarddav/addressbookstore/test/test_file.py	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/addressbookstore/test/test_file.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,450 @@
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+File addressbook store tests.
+"""
+
+from twext.python.filepath import CachingFilePath as FilePath
+from twisted.trial import unittest
+
+from twistedcaldav.vcard import Component as VComponent
+
+from txdav.common.icommondatastore import HomeChildNameNotAllowedError
+from txdav.common.icommondatastore import ObjectResourceNameNotAllowedError
+from txdav.common.icommondatastore import ObjectResourceUIDAlreadyExistsError
+from txdav.common.icommondatastore import NoSuchHomeChildError
+from txdav.common.icommondatastore import NoSuchObjectResourceError
+
+from txcarddav.addressbookstore.file import AddressBookStore, AddressBookHome
+from txcarddav.addressbookstore.file import AddressBook, AddressBookObject
+
+from txcarddav.addressbookstore.test.common import (
+    CommonTests, vcard4_text, vcard1modified_text)
+
+storePath = FilePath(__file__).parent().child("addressbook_store")
+
+def _todo(f, why):
+    f.todo = why
+    return f
+
+
+
+featureUnimplemented = lambda f: _todo(f, "Feature unimplemented")
+testUnimplemented = lambda f: _todo(f, "Test unimplemented")
+todo = lambda why: lambda f: _todo(f, why)
+
+
+def setUpAddressBookStore(test):
+    test.root = FilePath(test.mktemp())
+    test.root.createDirectory()
+
+    storeRootPath = test.storeRootPath = test.root.child("store")
+    addressbookPath = storeRootPath.child("addressbooks").child("__uids__")
+    addressbookPath.parent().makedirs()
+    storePath.copyTo(addressbookPath)
+
+    test.addressbookStore = AddressBookStore(storeRootPath)
+    test.txn = test.addressbookStore.newTransaction()
+    assert test.addressbookStore is not None, "No addressbook store?"
+
+
+
+def setUpHome1(test):
+    setUpAddressBookStore(test)
+    test.home1 = test.txn.addressbookHomeWithUID("home1")
+    assert test.home1 is not None, "No addressbook home?"
+
+
+
+def setUpAddressBook1(test):
+    setUpHome1(test)
+    test.addressbook1 = test.home1.addressbookWithName("addressbook_1")
+    assert test.addressbook1 is not None, "No addressbook?"
+
+
+
+class AddressBookStoreTest(unittest.TestCase):
+    """
+    Test cases for L{AddressBookStore}.
+    """
+
+    def setUp(self):
+        setUpAddressBookStore(self)
+
+
+    def test_addressbookHomeWithUID_dot(self):
+        """
+        Filenames starting with "." are reserved by this
+        implementation, so no UIDs may start with ".".
+        """
+        self.assertEquals(
+            self.addressbookStore.newTransaction().addressbookHomeWithUID("xyzzy"),
+            None
+        )
+
+
+
+class AddressBookHomeTest(unittest.TestCase):
+
+    def setUp(self):
+        setUpHome1(self)
+
+
+    def test_init(self):
+        """
+        L{AddressBookHome} has C{_path} and L{_addressbookStore} attributes,
+        indicating its location on disk and parent store, respectively.
+        """
+        self.failUnless(
+            isinstance(self.home1._path, FilePath),
+            self.home1._path
+        )
+        self.assertEquals(
+            self.home1._addressbookStore,
+            self.addressbookStore
+        )
+
+
+    def test_addressbookWithName_dot(self):
+        """
+        Filenames starting with "." are reserved by this
+        implementation, so no addressbook names may start with ".".
+        """
+        name = ".foo"
+        self.home1._path.child(name).createDirectory()
+        self.assertEquals(self.home1.addressbookWithName(name), None)
+
+
+    def test_createAddressBookWithName_dot(self):
+        """
+        Filenames starting with "." are reserved by this
+        implementation, so no addressbook names may start with ".".
+        """
+        self.assertRaises(
+            HomeChildNameNotAllowedError,
+            self.home1.createAddressBookWithName, ".foo"
+        )
+
+
+    def test_removeAddressBookWithName_dot(self):
+        """
+        Filenames starting with "." are reserved by this
+        implementation, so no addressbook names may start with ".".
+        """
+        name = ".foo"
+        self.home1._path.child(name).createDirectory()
+        self.assertRaises(
+            NoSuchHomeChildError,
+            self.home1.removeAddressBookWithName, name
+        )
+
+
+
+class AddressBookTest(unittest.TestCase):
+
+    def setUp(self):
+        setUpAddressBook1(self)
+
+
+    def test_init(self):
+        """
+        L{AddressBook.__init__} sets private attributes to reflect its constructor
+        arguments.
+        """
+        self.failUnless(
+            isinstance(self.addressbook1._path, FilePath),
+            self.addressbook1
+        )
+        self.failUnless(
+            isinstance(self.addressbook1._addressbookHome, AddressBookHome),
+            self.addressbook1._addressbookHome
+        )
+
+
+    def test_useIndexImmediately(self):
+        """
+        L{AddressBook._index} is usable in the same transaction it is created, with
+        a temporary filename.
+        """
+        self.home1.createAddressBookWithName("addressbook2")
+        addressbook = self.home1.addressbookWithName("addressbook2")
+        index = addressbook._index
+        self.assertEquals(set(index.addressbookObjects()),
+                          set(addressbook.addressbookObjects()))
+        self.txn.commit()
+        self.txn = self.addressbookStore.newTransaction()
+        self.home1 = self.txn.addressbookHomeWithUID("home1")
+        addressbook = self.home1.addressbookWithName("addressbook2")
+        # FIXME: we should be curating our own index here, but in order to fix
+        # that the code in the old implicit scheduler needs to change.  This
+        # test would be more effective if there were actually some objects in
+        # this list.
+        index = addressbook._index
+        self.assertEquals(set(index.addressbookObjects()),
+                          set(addressbook.addressbookObjects()))
+
+
+    def test_addressbookObjectWithName_dot(self):
+        """
+        Filenames starting with "." are reserved by this
+        implementation, so no addressbook object names may start with
+        ".".
+        """
+        name = ".foo.vcf"
+        self.home1._path.child(name).touch()
+        self.assertEquals(self.addressbook1.addressbookObjectWithName(name), None)
+
+
+    @featureUnimplemented
+    def test_addressbookObjectWithUID_exists(self):
+        """
+        Find existing addressbook object by name.
+        """
+        addressbookObject = self.addressbook1.addressbookObjectWithUID("1")
+        self.failUnless(
+            isinstance(addressbookObject, AddressBookObject),
+            addressbookObject
+        )
+        self.assertEquals(
+            addressbookObject.component(),
+            self.addressbook1.addressbookObjectWithName("1.vcf").component()
+        )
+
+
+    def test_createAddressBookObjectWithName_dot(self):
+        """
+        Filenames starting with "." are reserved by this
+        implementation, so no addressbook object names may start with
+        ".".
+        """
+        self.assertRaises(
+            ObjectResourceNameNotAllowedError,
+            self.addressbook1.createAddressBookObjectWithName,
+            ".foo", VComponent.fromString(vcard4_text)
+        )
+
+
+    @featureUnimplemented
+    def test_createAddressBookObjectWithName_uidconflict(self):
+        """
+        Attempt to create a addressbook object with a conflicting UID
+        should raise.
+        """
+        name = "foo.vcf"
+        assert self.addressbook1.addressbookObjectWithName(name) is None
+        component = VComponent.fromString(vcard1modified_text)
+        self.assertRaises(
+            ObjectResourceUIDAlreadyExistsError,
+            self.addressbook1.createAddressBookObjectWithName,
+            name, component
+        )
+
+
+    def test_removeAddressBookObject_delayedEffect(self):
+        """
+        Removing a addressbook object should not immediately remove the underlying
+        file; it should only be removed upon commit() of the transaction.
+        """
+        self.addressbook1.removeAddressBookObjectWithName("2.vcf")
+        self.failUnless(self.addressbook1._path.child("2.vcf").exists())
+        self.txn.commit()
+        self.failIf(self.addressbook1._path.child("2.vcf").exists())
+
+
+    def test_removeAddressBookObjectWithName_dot(self):
+        """
+        Filenames starting with "." are reserved by this
+        implementation, so no addressbook object names may start with
+        ".".
+        """
+        name = ".foo"
+        self.addressbook1._path.child(name).touch()
+        self.assertRaises(
+            NoSuchObjectResourceError,
+            self.addressbook1.removeAddressBookObjectWithName, name
+        )
+
+
+    def _refresh(self):
+        """
+        Re-read the (committed) home1 and addressbook1 objects in a new
+        transaction.
+        """
+        self.txn = self.addressbookStore.newTransaction()
+        self.home1 = self.txn.addressbookHomeWithUID("home1")
+        self.addressbook1 = self.home1.addressbookWithName("addressbook_1")
+
+
+    def test_undoCreateAddressBookObject(self):
+        """
+        If a addressbook object is created as part of a transaction, it will be
+        removed if that transaction has to be aborted.
+        """
+        # Make sure that the addressbook home is actually committed; rolling back
+        # addressbook home creation will remove the whole directory.
+        self.txn.commit()
+        self._refresh()
+        self.addressbook1.createAddressBookObjectWithName(
+            "sample.vcf",
+            VComponent.fromString(vcard4_text)
+        )
+        self._refresh()
+        self.assertIdentical(
+            self.addressbook1.addressbookObjectWithName("sample.vcf"),
+            None
+        )
+
+
+    def doThenUndo(self):
+        """
+        Commit the current transaction, but add an operation that will cause it
+        to fail at the end.  Finally, refresh all attributes with a new
+        transaction so that further oparations can be performed in a valid
+        context.
+        """
+        def fail():
+            raise RuntimeError("oops")
+        self.txn.addOperation(fail, "dummy failing operation")
+        self.assertRaises(RuntimeError, self.txn.commit)
+        self._refresh()
+
+
+    def test_undoModifyAddressBookObject(self):
+        """
+        If an existing addressbook object is modified as part of a transaction, it
+        should be restored to its previous status if the transaction aborts.
+        """
+        originalComponent = self.addressbook1.addressbookObjectWithName(
+            "1.vcf").component()
+        self.addressbook1.addressbookObjectWithName("1.vcf").setComponent(
+            VComponent.fromString(vcard1modified_text)
+        )
+        # Sanity check.
+        self.assertEquals(
+            self.addressbook1.addressbookObjectWithName("1.vcf").component(),
+            VComponent.fromString(vcard1modified_text)
+        )
+        self.doThenUndo()
+        self.assertEquals(
+            self.addressbook1.addressbookObjectWithName("1.vcf").component(),
+            originalComponent
+        )
+
+
+    def test_modifyAddressBookObjectCaches(self):
+        """
+        Modifying a addressbook object should cache the modified component in
+        memory, to avoid unnecessary parsing round-trips.
+        """
+        modifiedComponent = VComponent.fromString(vcard1modified_text)
+        self.addressbook1.addressbookObjectWithName("1.vcf").setComponent(
+            modifiedComponent
+        )
+        self.assertIdentical(
+            modifiedComponent,
+            self.addressbook1.addressbookObjectWithName("1.vcf").component()
+        )
+
+
+    @featureUnimplemented
+    def test_removeAddressBookObjectWithUID_absent(self):
+        """
+        Attempt to remove an non-existing addressbook object should raise.
+        """
+        self.assertRaises(
+            NoSuchObjectResourceError,
+            self.addressbook1.removeAddressBookObjectWithUID, "xyzzy"
+        )
+
+
+    @testUnimplemented
+    def test_syncToken(self):
+        """
+        Sync token is correct.
+        """
+        raise NotImplementedError()
+
+
+    @testUnimplemented
+    def test_addressbookObjectsInTimeRange(self):
+        """
+        Find addressbook objects occuring in a given time range.
+        """
+        raise NotImplementedError()
+
+
+    @testUnimplemented
+    def test_addressbookObjectsSinceToken(self):
+        """
+        Find addressbook objects that have been modified since a given
+        sync token.
+        """
+        raise NotImplementedError()
+
+
+
+class AddressBookObjectTest(unittest.TestCase):
+    def setUp(self):
+        setUpAddressBook1(self)
+        self.object1 = self.addressbook1.addressbookObjectWithName("1.vcf")
+
+
+    def test_init(self):
+        """
+        L{AddressBookObject} has instance attributes, C{_path} and C{_addressbook},
+        which refer to its position in the filesystem and the addressbook in which
+        it is contained, respectively.
+        """ 
+        self.failUnless(
+            isinstance(self.object1._path, FilePath),
+            self.object1._path
+        )
+        self.failUnless(
+            isinstance(self.object1._addressbook, AddressBook),
+            self.object1._addressbook
+        )
+
+
+class FileStorageTests(unittest.TestCase, CommonTests):
+    """
+    File storage tests.
+    """
+
+    def storeUnderTest(self):
+        """
+        Create and return a L{AddressBookStore} for testing.
+        """
+        setUpAddressBookStore(self)
+        return self.addressbookStore
+
+
+    def test_init(self):
+        """
+        L{AddressBookStore} has a C{_path} attribute which refers to its
+        constructor argument.
+        """
+        self.assertEquals(self.storeUnderTest()._path,
+                          self.storeRootPath)
+
+
+    def test_addressbookObjectsWithDotFile(self):
+        """
+        Adding a dotfile to the addressbook home should not increase
+        """
+        self.homeUnderTest()._path.child(".foo").createDirectory()
+        self.test_addressbookObjects()
+

Modified: CalendarServer/trunk/txcarddav/iaddressbookstore.py
===================================================================
--- CalendarServer/trunk/txcarddav/iaddressbookstore.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txcarddav/iaddressbookstore.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -18,215 +18,268 @@
 Address book store interfaces
 """
 
+from zope.interface import Interface
+from txdav.common.icommondatastore import ICommonTransaction
+
 __all__ = [
+    # Classes
+    "IAddressBookTransaction",
+    "IAddressBookHome",
+    "IAddressBook",
+    "IAddressBookObject",
 ]
 
-from zope.interface import Interface #, Attribute
-
-from twext.icalendar import Component
-from txdav.idav import IPropertyStore
-
-#
-# Exceptions
-#
-
-class AddressBookStoreError(RuntimeError):
+class IAddressBookTransaction(ICommonTransaction):
     """
-    Address book store generic error.
+    Transaction interface that addressbook stores must provide.
     """
 
-class AlreadyExistsError(AddressBookStoreError):
-    """
-    Attempt to create an object that already exists.
-    """
+    def addressbookHomeWithUID(uid, create=False):
+        """
+        Retrieve the addressbook home for the principal with the given C{uid}.
 
-class AddressBookAlreadyExistsError(AlreadyExistsError):
-    """
-    Address book already exists.
-    """
+        If C{create} is C{True}, create the addressbook home if it doesn't
+        already exist.
 
-class ContactCardNameAlreadyExistsError(AlreadyExistsError):
-    """
-    A contact card with the requested name already exists.
-    """
+        @return: an L{IAddressBookHome} or C{None} if no such addressbook
+            home exists.
+        """
 
-class ContactCardUIDAlreadyExistsError(AlreadyExistsError):
-    """
-    A contact card with the requested UID already exists.
-    """
 
-class NotFoundError(AddressBookStoreError):
-    """
-    Requested data not found.
-    """
 
-class NoSuchAddressBookError(NotFoundError):
-    """
-    The requested address book does not exist.
-    """
-
-class NoSuchContactCardError(NotFoundError):
-    """
-    The requested contact card does not exist.
-    """
-
-class InvalidCardComponentError(AddressBookStoreError):
-    """
-    Invalid card component.
-    """
-
 #
 # Interfaces
 #
 
 class IAddressBookHome(Interface):
     """
-    Address book home
+    AddressBook home
+
+    An addressbook home belongs to a specific principal and contains the
+    addressbooks which that principal has direct access to.  This
+    includes both addressbooks owned by the principal as well as
+    addressbooks that have been shared with and accepts by the principal.
     """
-    def addressBooks(self):
+
+    def uid():
         """
-        Retrieve address books contained in this address book home.
+        Retrieve the unique identifier for this addressbook home.
 
+        @return: a string.
+        """
+
+
+    def addressbooks():
+        """
+        Retrieve addressbooks contained in this addressbook home.
+
         @return: an iterable of L{IAddressBook}s.
         """
 
-    def addressBookWithName(self, name):
+    def addressbookWithName(name):
         """
-        Retrieve the address book with the given C{name} contained in
-        this address book home.
+        Retrieve the addressbook with the given C{name} contained in this
+        addressbook home.
 
         @param name: a string.
-        @return: an L{IAddressBook} or C{None} if no such address book
+        @return: an L{IAddressBook} or C{None} if no such addressbook
             exists.
         """
 
-    def createAddressBookWithName(self, name):
+    def createAddressBookWithName(name):
         """
-        Create an address book with the given C{name} in this address
-        book home.
+        Create an addressbook with the given C{name} in this addressbook
+        home.
 
         @param name: a string.
-        @raise AddressBookAlreadyExistsError: if an address book
-            with the given C{name} already exists.
+        @raise AddressBookAlreadyExistsError: if an addressbook with the
+            given C{name} already exists.
         """
 
-    def properties(self):
+    def removeAddressBookWithName(name):
         """
-        Retrieve the property store for this address book home.
+        Remove the addressbook with the given C{name} from this addressbook
+        home.  If this addressbook home owns the addressbook, also remove
+        the addressbook from all addressbook homes.
 
+        @param name: a string.
+        @raise NoSuchAddressBookObjectError: if no such addressbook exists.
+        """
+
+    def properties():
+        """
+        Retrieve the property store for this addressbook home.
+
         @return: an L{IPropertyStore}.
         """
 
+
 class IAddressBook(Interface):
     """
-    Address book
+    AddressBook
+
+    An addressbook is a container for addressbook objects (contacts),
+    An addressbook belongs to a specific principal but may be
+    shared with other principals, granting them read-only or
+    read/write access.
     """
-    def contactCards(self):
+
+    def name():
         """
-        Retrieve the contact cards contains in this address book.
+        Identify this addressbook uniquely, as with
+        L{IAddressBookHome.addressbookWithName}.
 
-        @return: an iterable of L{IContactCard}s.
+        @return: the name of this addressbook.
+        @rtype: C{str}
         """
 
-    def contactCardWithName(self, name):
+    def rename(name):
         """
-        Retrieve the contact card with the given C{name} in this
-        address book.
+        Change the name of this addressbook.
+        """
 
+    def ownerAddressBookHome():
+        """
+        Retrieve the addressbook home for the owner of this addressbook.
+        AddressBooks may be shared from one (the owner's) addressbook home
+        to other (the sharee's) addressbook homes.
+
+        @return: an L{IAddressBookHome}.
+        """
+
+    def addressbookObjects():
+        """
+        Retrieve the addressbook objects contained in this addressbook.
+
+        @return: an iterable of L{IAddressBookObject}s.
+        """
+
+    def addressbookObjectWithName(name):
+        """
+        Retrieve the addressbook object with the given C{name} contained
+        in this addressbook.
+
         @param name: a string.
-        @return: an L{IContactCard} or C{None} is no such contact card
-            exists.
+        @return: an L{IAddressBookObject} or C{None} if no such addressbook
+            object exists.
         """
 
-    def contactCardWithUID(self, uid):
+    def addressbookObjectWithUID(uid):
         """
-        Retrieve the contact card with the given C{uid} in this
-        address book.
+        Retrieve the addressbook object with the given C{uid} contained
+        in this addressbook.
 
         @param uid: a string.
-        @return: an L{IContactCard} or C{None} is no such contact card
+        @return: an L{IAddressBookObject} or C{None} if no such addressbook
+            object exists.
+        """
+
+    def createAddressBookObjectWithName(name, component):
+        """
+        Create an addressbook component with the given C{name} in this
+        addressbook from the given C{component}.
+
+        @param name: a string.
+        @param component: a C{VCARD} L{Component}
+        @raise AddressBookObjectNameAlreadyExistsError: if an addressbook
+            object with the given C{name} already exists.
+        @raise AddressBookObjectUIDAlreadyExistsError: if an addressbook
+            object with the same UID as the given C{component} already
             exists.
+        @raise InvalidAddressBookComponentError: if the given
+            C{component} is not a valid C{VCARD} L{VComponent} for
+            an addressbook object.
         """
 
-    def createContactCardWithName(self, name):
+    def removeAddressBookObjectWithName(name):
         """
-        Create a contact card with the given C{name} in this address
-        book from the given C{component}.
+        Remove the addressbook object with the given C{name} from this
+        addressbook.
 
         @param name: a string.
-        @param component: a C{VCARD} L{Component}.
-        @raise ContactCardNameAlreadyExistsError: if a contact card
-            with the given C{name} already exists.
-        @raise ContactCardUIDAlreadyExistsError: if a contact card
-            with the same UID as the given C{component} already
+        @raise NoSuchAddressBookObjectError: if no such addressbook object
             exists.
-        @raise InvalidCardComponentError: if the given C{component} is
-            not a valid C{VCARD} L{Component} for a contact card.
         """
 
-    def syncToken(self):
+    def removeAddressBookObjectWithUID(uid):
         """
-        Retrieve the current sync token for this address book.
+        Remove the addressbook object with the given C{uid} from this
+        addressbook.
 
-        @return: a sync token.
+        @param uid: a string.
+        @raise NoSuchAddressBookObjectError: if the addressbook object does
+            not exist.
         """
 
-    def contactCardsSinceToken(self, token):
+    def syncToken():
         """
-        Retrieve all contact cards in this address book that have
+        Retrieve the current sync token for this addressbook.
+
+        @return: a string containing a sync token.
+        """
+
+    def addressbookObjectsSinceToken(token):
+        """
+        Retrieve all addressbook objects in this addressbook that have
         changed since the given C{token} was last valid.
 
-        @return: a 3-tuple containing an iterable of L{IContactCard}s
-            that have changed, an iterable of uids that have been
-            removed, and the current sync token.
+        @param token: a sync token.
+        @return: a 3-tuple containing an iterable of
+            L{IAddressBookObject}s that have changed, an iterable of uids
+            that have been removed, and the current sync token.
         """
 
-    def properties(self):
+    def properties():
         """
-        Retrieve the property store for this address book.
+        Retrieve the property store for this addressbook.
 
         @return: an L{IPropertyStore}.
         """
 
-class IContactCard(Interface):
+
+class IAddressBookObject(Interface):
     """
-    Contact card
+    AddressBook object
+
+    An addressbook object describes a contact (vCard).
     """
-    def setComponent(self):
+
+    def setComponent(component):
         """
-        Rewrite this contact card to match the given C{component}.
-        C{component} must have the same UID as this contact card.
+        Rewrite this addressbook object to match the given C{component}.
+        C{component} must have the same UID as this addressbook object.
 
-        @param component: a C{VCARD} L{Component}.
-        @raise InvalidCardComponentError: if the given C{component} is
-            not a valid C{VCARD} L{Component} for a contact card.
+        @param component: a C{VCARD} L{VComponent}.
+        @raise InvalidAddressBookComponentError: if the given
+            C{component} is not a valid C{VCARD} L{VComponent} for
+            an addressbook object.
         """
 
-    def component(self):
+    def component():
         """
-        Retrieve the contact component for this contact card.
+        Retrieve the addressbook component for this addressbook object.
 
-        @return: a C{VCARD} L{Component}.
+        @return: a C{VCARD} L{VComponent}.
         """
 
-    def vCardText(self):
+    def vCardText():
         """
-        Retrieve the vCard text data for this contact card.
+        Retrieve the vCard text data for this addressbook object.
 
-        @return: a string containing vCard data for a single vCard
-            contact.
+        @return: a string containing vCard data for a single
+            addressbook object.
         """
 
-    def uid(self):
+    def uid():
         """
-        Retrieve the UID for this contact card.
+        Retrieve the UID for this addressbook object.
 
         @return: a string containing a UID.
         """
 
-    def properties(self):
+    def properties():
         """
-        Retrieve the property store for this contact card.
+        Retrieve the property store for this addressbook object.
 
         @return: an L{IPropertyStore}.
         """

Copied: CalendarServer/trunk/txcarddav/resource.py (from rev 5919, CalendarServer/branches/new-store/txcarddav/resource.py)
===================================================================
--- CalendarServer/trunk/txcarddav/resource.py	                        (rev 0)
+++ CalendarServer/trunk/txcarddav/resource.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,83 @@
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+CardDAV resources.
+"""
+
+__all__ = [
+    "CardDAVResource",
+    "AddressBookHomeResource",
+    "AddressBookCollectionResource",
+    "AddressBookObjectResource",
+]
+
+from twext.python.log import LoggingMixIn
+from twext.web2.dav.element.base import dav_namespace
+
+from twistedcaldav.carddavxml import carddav_namespace
+from twistedcaldav.config import config
+from twistedcaldav.extensions import DAVResource
+
+class CardDAVResource(DAVResource, LoggingMixIn):
+    """
+    CardDAV resource.
+    """
+    def davComplianceClasses(self):
+        return (
+            tuple(super(CardDAVResource, self).davComplianceClasses())
+            + config.CardDAVComplianceClasses
+        )
+
+
+class AddressBookHomeResource(CardDAVResource):
+    """
+    AddressBook home resource.
+
+    This resource is backed by an L{IAddressBookHome} implementation.
+    """
+
+
+class AddressBookCollectionResource(CardDAVResource):
+    """
+    AddressBook collection resource.
+
+    This resource is backed by an L{IAddressBook} implementation.
+    """
+    #
+    # HTTP
+    #
+
+    #
+    # WebDAV
+    #
+
+    def liveProperties(self):
+        
+        return super(AddressBookCollectionResource, self).liveProperties() + (
+            (dav_namespace,     "owner"),
+            (carddav_namespace, "supported-addressbook-data"),
+        )
+
+
+
+
+class AddressBookObjectResource(CardDAVResource):
+    """
+    AddressBook object resource.
+
+    This resource is backed by an L{IAddressBookObject} implementation.
+    """

Deleted: CalendarServer/trunk/txdav/common/__init__.py
===================================================================
Copied: CalendarServer/trunk/txdav/common/__init__.py (from rev 5919, CalendarServer/branches/new-store/txdav/common/__init__.py)
===================================================================
Deleted: CalendarServer/trunk/txdav/common/datastore/__init__.py
===================================================================
Copied: CalendarServer/trunk/txdav/common/datastore/__init__.py (from rev 5919, CalendarServer/branches/new-store/txdav/common/datastore/__init__.py)
===================================================================
Deleted: CalendarServer/trunk/txdav/common/datastore/file.py
===================================================================
--- CalendarServer/branches/new-store/txdav/common/datastore/file.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txdav/common/datastore/file.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,890 +0,0 @@
-# -*- test-case-name: txcaldav.calendarstore.test.test_file -*-
-##
-# Copyright (c) 2010 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-"""
-Common utility functions for a file based datastore.
-"""
-
-from twext.python.log import LoggingMixIn
-from twext.web2.dav.element.rfc2518 import ResourceType, GETContentType
-from twext.web2.http_headers import generateContentType, MimeType
-
-from twisted.python.util import FancyEqMixin
-
-from twistedcaldav import customxml
-from twistedcaldav.customxml import GETCTag, NotificationType
-from twistedcaldav.notifications import NotificationRecord
-from twistedcaldav.notifications import NotificationsDatabase as OldNotificationIndex
-from twistedcaldav.sharing import SharedCollectionsDatabase
-
-from txdav.common.icommondatastore import HomeChildNameNotAllowedError, \
-    HomeChildNameAlreadyExistsError, NoSuchHomeChildError, \
-    InternalDataStoreError, ObjectResourceNameNotAllowedError, \
-    ObjectResourceNameAlreadyExistsError, NoSuchObjectResourceError
-from txdav.common.inotifications import INotificationCollection, \
-    INotificationObject
-from txdav.datastore.file import DataStoreTransaction, DataStore, writeOperation, \
-    hidden, isValidName, cached
-from txdav.idav import IDataStore
-from txdav.propertystore.base import PropertyName
-from txdav.propertystore.xattr import PropertyStore
-
-from errno import EEXIST, ENOENT
-from uuid import uuid4
-from zope.interface import implements, directlyProvides
-
-ECALENDARTYPE = 0
-EADDRESSBOOKTYPE = 1
-TOPPATHS = (
-    "calendars",
-    "addressbooks"
-)
-UIDPATH = "__uids__"
-
-class CommonDataStore(DataStore):
-    """
-    An implementation of data store.
-
-    @ivar _path: A L{CachingFilePath} referencing a directory on disk that
-        stores all calendar and addressbook data for a group of UIDs.
-    """
-    implements(IDataStore)
-
-    def __init__(self, path, enableCalendars=True, enableAddressBooks=True):
-        """
-        Create a store.
-
-        @param path: a L{FilePath} pointing at a directory on disk.
-        """
-        assert enableCalendars or enableAddressBooks
-
-        super(CommonDataStore, self).__init__(path)
-        self.enableCalendars = enableCalendars
-        self.enableAddressBooks = enableAddressBooks
-        self._transactionClass = CommonStoreTransaction
-
-    def newTransaction(self, name='no name'):
-        """
-        Create a new transaction.
-
-        @see Transaction
-        """
-        return self._transactionClass(self, name, self.enableCalendars, self.enableAddressBooks)
-
-class CommonStoreTransaction(DataStoreTransaction):
-    """
-    In-memory implementation of
-
-    Note that this provides basic 'undo' support, but not truly transactional
-    operations.
-    """
-
-    _homeClass = {}
-
-    def __init__(self, dataStore, name, enableCalendars, enableAddressBooks):
-        """
-        Initialize a transaction; do not call this directly, instead call
-        L{DataStore.newTransaction}.
-
-        @param dataStore: The store that created this transaction.
-
-        @type dataStore: L{CommonDataStore}
-        """
-        from txcaldav.icalendarstore import ICalendarTransaction
-        from txcarddav.iaddressbookstore import IAddressBookTransaction
-        from txcaldav.calendarstore.file import CalendarHome
-        from txcarddav.addressbookstore.file import AddressBookHome
-
-        super(CommonStoreTransaction, self).__init__(dataStore, name)
-        self._homes = {}
-        self._homes[ECALENDARTYPE] = {}
-        self._homes[EADDRESSBOOKTYPE] = {}
-        self._notifications = {}
-
-        extraInterfaces = []
-        if enableCalendars:
-            extraInterfaces.append(ICalendarTransaction)
-            self._notificationHomeType = ECALENDARTYPE
-        else:
-            self._notificationHomeType = EADDRESSBOOKTYPE
-        if enableAddressBooks:
-            extraInterfaces.append(IAddressBookTransaction)
-        directlyProvides(self, *extraInterfaces)
-
-        CommonStoreTransaction._homeClass[ECALENDARTYPE] = CalendarHome
-        CommonStoreTransaction._homeClass[EADDRESSBOOKTYPE] = AddressBookHome
-
-
-    def calendarHomeWithUID(self, uid, create=False):
-        return self.homeWithUID(ECALENDARTYPE, uid, create)
-
-    def addressbookHomeWithUID(self, uid, create=False):
-        return self.homeWithUID(EADDRESSBOOKTYPE, uid, create)
-
-    def homeWithUID(self, storeType, uid, create=False):
-        if (uid, self) in self._homes[storeType]:
-            return self._homes[storeType][(uid, self)]
-
-        if uid.startswith("."):
-            return None
-
-        assert len(uid) >= 4
-
-        childPathSegments = []
-        childPathSegments.append(self._dataStore._path.child(TOPPATHS[storeType]))
-        childPathSegments.append(childPathSegments[-1].child(UIDPATH))
-        childPathSegments.append(childPathSegments[-1].child(uid[0:2]))
-        childPathSegments.append(childPathSegments[-1].child(uid[2:4]))
-        childPath = childPathSegments[-1].child(uid)
-
-        def createDirectory(path):
-            try:
-                path.createDirectory()
-            except (IOError, OSError), e:
-                if e.errno != EEXIST:
-                    # Ignore, in case someone else created the
-                    # directory while we were trying to as well.
-                    raise
-
-        creating = False
-        if create:
-            # Create intermediate directories
-            for child in childPathSegments:
-                if not child.isdir():
-                    createDirectory(child)
-
-            if childPath.isdir():
-                homePath = childPath
-            else:
-                creating = True
-                homePath = childPath.temporarySibling()
-                createDirectory(homePath)
-                def do():
-                    def lastly():
-                        homePath.moveTo(childPath)
-                        # home._path = homePath
-                        # do this _after_ all other file operations
-                        home._path = childPath
-                        return lambda : None
-                    self.addOperation(lastly, "create home finalize")
-                    return lambda : None
-                self.addOperation(do, "create home UID %r" % (uid,))
-
-        elif not childPath.isdir():
-            return None
-        else:
-            homePath = childPath
-
-        home = self._homeClass[storeType](uid, homePath, self._dataStore, self)
-        self._homes[storeType][(uid, self)] = home
-        if creating:
-            home.created()
-
-            # Create notification collection
-            if storeType == ECALENDARTYPE:
-                self.notificationsWithUID(uid)
-        return home
-
-    def notificationsWithUID(self, uid):
-
-        if (uid, self) in self._notifications:
-            return self._notifications[(uid, self)]
-
-        home = self.homeWithUID(self._notificationHomeType, uid, create=True)
-        notificationPath = home._path.child("notification")
-        if not notificationPath.isdir():
-            notificationPath = self.createNotifcationCollection(home, notificationPath)
-
-        notifications = NotificationCollection(notificationPath.basename(), home)
-        self._notifications[(uid, self)] = notifications
-        return notifications
-
-    def createNotifcationCollection(self, home, notificationPath):
-
-        if notificationPath.isdir():
-            return notificationPath
-
-        name = notificationPath.basename()
-
-        temporary = hidden(notificationPath.temporarySibling())
-        temporary.createDirectory()
-        # In order for the index to work (which is doing real file ops on disk
-        # via SQLite) we need to create a real directory _immediately_.
-
-        # FIXME: some way to roll this back.
-
-        c = NotificationCollection(temporary.basename(), home)
-        def do():
-            try:
-                props = c.properties()
-                temporary.moveTo(notificationPath)
-                c._name = name
-                # FIXME: _lots_ of duplication of work here.
-                props.flush()
-            except (IOError, OSError), e:
-                if e.errno == EEXIST and notificationPath.isdir():
-                    raise HomeChildNameAlreadyExistsError(name)
-                raise
-            # FIXME: direct tests, undo for index creation
-            # Return undo
-            return lambda: notificationPath.remove()
-
-        self.addOperation(do, "create child %r" % (name,))
-        props = c.properties()
-        props[PropertyName(*ResourceType.qname())] = c.resourceType()
-        return temporary
-
-class StubResource(object):
-    """
-    Just enough resource to keep the shared sql DB classes going.
-    """
-    def __init__(self, stubit):
-        self.fp = stubit._path
-
-class CommonHome(LoggingMixIn):
-
-    _childClass = None
-
-    def __init__(self, uid, path, dataStore, transaction):
-        self._dataStore = dataStore
-        self._uid = self._peruser_uid = uid
-        self._path = path
-        self._transaction = transaction
-        self._shares = SharedCollectionsDatabase(StubResource(self))
-        self._newChildren = {}
-        self._removedChildren = set()
-        self._cachedChildren = {}
-
-
-    def __repr__(self):
-        return "<%s: %s>" % (self.__class__.__name__, self._path)
-
-
-    def uid(self):
-        return self._uid
-
-    def peruser_uid(self):
-        return self._peruser_uid
-
-    def _updateSyncToken(self, reset=False):
-        "Stub for updating sync token."
-        # FIXME: actually update something
-
-
-    def retrieveOldShares(self):
-        """
-        Retrieve the old Index object.
-        """
-        return self._shares
-
-    def children(self):
-        return set(self._newChildren.itervalues()) | set(
-            self.childWithName(name)
-            for name in self._path.listdir()
-            if not name.startswith(".")
-        )
-
-    def childWithName(self, name):
-        child = self._newChildren.get(name)
-        if child is not None:
-            return child
-        if name in self._removedChildren:
-            return None
-        if name in self._cachedChildren:
-            return self._cachedChildren[name]
-
-        if name.startswith("."):
-            return None
-
-        childPath = self._path.child(name)
-        if childPath.isdir():
-            existingChild = self._childClass(name, self)
-            self._cachedChildren[name] = existingChild
-            return existingChild
-        else:
-            return None
-
-
-    @writeOperation
-    def createChildWithName(self, name):
-        if name.startswith("."):
-            raise HomeChildNameNotAllowedError(name)
-
-        childPath = self._path.child(name)
-
-        if name not in self._removedChildren and childPath.isdir():
-            raise HomeChildNameAlreadyExistsError(name)
-
-        temporary = hidden(childPath.temporarySibling())
-        temporary.createDirectory()
-        # In order for the index to work (which is doing real file ops on disk
-        # via SQLite) we need to create a real directory _immediately_.
-
-        # FIXME: some way to roll this back.
-
-        c = self._newChildren[name] = self._childClass(temporary.basename(), self, name)
-        c.retrieveOldIndex().create()
-        def do():
-            try:
-                props = c.properties()
-                temporary.moveTo(childPath)
-                c._name = name
-                # FIXME: _lots_ of duplication of work here.
-                props.flush()
-            except (IOError, OSError), e:
-                if e.errno == EEXIST and childPath.isdir():
-                    raise HomeChildNameAlreadyExistsError(name)
-                raise
-            # FIXME: direct tests, undo for index creation
-            # Return undo
-            return lambda: childPath.remove()
-
-        self._transaction.addOperation(do, "create child %r" % (name,))
-        props = c.properties()
-        props[PropertyName(*ResourceType.qname())] = c.resourceType()
-        self.createdChild(c)
-
-    def createdChild(self, child):
-        pass
-
-    @writeOperation
-    def removeChildWithName(self, name):
-        if name.startswith(".") or name in self._removedChildren:
-            raise NoSuchHomeChildError(name)
-
-        self._removedChildren.add(name)
-        childPath = self._path.child(name)
-        if name not in self._newChildren and not childPath.isdir():
-            raise NoSuchHomeChildError(name)
-
-        def do(transaction=self._transaction):
-            for i in xrange(1000):
-                trash = childPath.sibling("._del_%s_%d" % (childPath.basename(), i))
-                if not trash.exists():
-                    break
-            else:
-                raise InternalDataStoreError("Unable to create trash target for child at %s" % (childPath,))
-
-            try:
-                childPath.moveTo(trash)
-            except (IOError, OSError), e:
-                if e.errno == ENOENT:
-                    raise NoSuchHomeChildError(name)
-                raise
-
-            def cleanup():
-                try:
-                    trash.remove()
-                except Exception, e:
-                    self.log_error("Unable to delete trashed child at %s: %s" % (trash.fp, e))
-
-            transaction.addOperation(cleanup, "remove child backup %r" % (name,))
-
-            def undo():
-                trash.moveTo(childPath)
-
-            return undo
-
-        # FIXME: direct tests
-        self._transaction.addOperation(
-            do, "prepare child remove %r" % (name,)
-        )
-
-    # @cached
-    def properties(self):
-        # FIXME: needs tests for actual functionality
-        # FIXME: needs to be cached
-        # FIXME: transaction tests
-        props = PropertyStore(self.peruser_uid(), self.uid(),
-                              lambda : self._path)
-        self._transaction.addOperation(props.flush, "flush home properties")
-        return props
-
-
-class CommonHomeChild(LoggingMixIn, FancyEqMixin):
-    """
-    """
-
-    compareAttributes = '_name _home _transaction'.split()
-
-    _objectResourceClass = None
-
-    def __init__(self, name, home, realName=None):
-        """
-        Initialize an home child pointing at a path on disk.
-
-        @param name: the subdirectory of home where this child
-            resides.
-        @type name: C{str}
-
-        @param home: the home containing this child.
-        @type home: L{CommonHome}
-
-        @param realName: If this child was just created, the name which it
-        will eventually have on disk.
-        @type realName: C{str}
-        """
-        self._name = name
-        self._home = home
-        self._peruser_uid = home._peruser_uid
-        self._transaction = home._transaction
-        self._newObjectResources = {}
-        self._cachedObjectResources = {}
-        self._removedObjectResources = set()
-        self._index = None  # Derived classes need to set this
-        self._invites = None # Derived classes need to set this
-        self._renamedName = realName
-
-
-    @property
-    def _path(self):
-        return self._home._path.child(self._name)
-
-
-    def resourceType(self):
-        return NotImplementedError
-
-    def retrieveOldIndex(self):
-        """
-        Retrieve the old Index object.
-        """
-        return self._index._oldIndex
-
-    def retrieveOldInvites(self):
-        """
-        Retrieve the old Invites DB object.
-        """
-        return self._invites._oldInvites
-
-
-    def __repr__(self):
-        return "<%s: %s>" % (self.__class__.__name__, self._path.path)
-
-
-    def name(self):
-        if self._renamedName is not None:
-            return self._renamedName
-        return self._path.basename()
-
-
-    _renamedName = None
-
-    @writeOperation
-    def rename(self, name):
-        self._updateSyncToken()
-        oldName = self.name()
-        self._renamedName = name
-        self._home._newChildren[name] = self
-        self._home._removedChildren.add(oldName)
-        def doIt():
-            self._path.moveTo(self._path.sibling(name))
-            return lambda : None # FIXME: revert
-        self._transaction.addOperation(doIt, "rename home child %r -> %r" %
-                                       (oldName, name))
-
-
-    def ownerHome(self):
-        return self._home
-
-    def setSharingUID(self, uid):
-        self._peruser_uid = uid
-        self.properties().setPerUserUID(uid)
-
-    def objectResources(self):
-        return sorted((
-            self.objectResourceWithName(name)
-            for name in (
-                set(self._newObjectResources.iterkeys()) |
-                set(name for name in self._path.listdir()
-                    if not name.startswith(".")) -
-                set(self._removedObjectResources)
-            )),
-            key=lambda calObj: calObj.name()
-        )
-
-
-    def objectResourceWithName(self, name):
-        if name in self._removedObjectResources:
-            return None
-        if name in self._newObjectResources:
-            return self._newObjectResources[name]
-        if name in self._cachedObjectResources:
-            return self._cachedObjectResources[name]
-
-        objectResourcePath = self._path.child(name)
-        if objectResourcePath.isfile():
-            obj = self._objectResourceClass(name, self)
-            self._cachedObjectResources[name] = obj
-            return obj
-        else:
-            return None
-
-
-    def objectResourceWithUID(self, uid):
-        # FIXME: This _really_ needs to be inspecting an index, not parsing
-        # every resource.
-        for objectResourcePath in self._path.children():
-            if not isValidName(objectResourcePath.basename()):
-                continue
-            obj = self._objectResourceClass(objectResourcePath.basename(), self)
-            if obj.component().resourceUID() == uid:
-                if obj.name() in self._removedObjectResources:
-                    return None
-                return obj
-
-
-    @writeOperation
-    def createObjectResourceWithName(self, name, component):
-        if name.startswith("."):
-            raise ObjectResourceNameNotAllowedError(name)
-
-        objectResourcePath = self._path.child(name)
-        if objectResourcePath.exists():
-            raise ObjectResourceNameAlreadyExistsError(name)
-
-        objectResource = self._objectResourceClass(name, self)
-        objectResource.setComponent(component)
-        self._cachedObjectResources[name] = objectResource
-
-
-    @writeOperation
-    def removeObjectResourceWithName(self, name):
-        if name.startswith("."):
-            raise NoSuchObjectResourceError(name)
-
-        newRevision = self._updateSyncToken() # FIXME: Test
-        self.retrieveOldIndex().deleteResource(name, newRevision)
-
-        objectResourcePath = self._path.child(name)
-        if objectResourcePath.isfile():
-            self._removedObjectResources.add(name)
-            # FIXME: test for undo
-            def do():
-                objectResourcePath.remove()
-                return lambda: None
-            self._transaction.addOperation(do, "remove object resource object %r" %
-                                           (name,))
-        else:
-            raise NoSuchObjectResourceError(name)
-
-
-    @writeOperation
-    def removeObjectResourceWithUID(self, uid):
-        self.removeObjectResourceWithName(
-            self.objectResourceWithUID(uid)._path.basename())
-
-
-    def syncToken(self):
-        raise NotImplementedError()
-
-
-    def _updateSyncToken(self, reset=False):
-        # FIXME: add locking a-la CalDAVFile.bumpSyncToken
-        # FIXME: tests for desired concurrency properties
-        ctag = PropertyName.fromString(GETCTag.sname())
-        props = self.properties()
-        token = props.get(ctag)
-        if token is None or reset:
-            tokenuuid = uuid4()
-            revision = 1
-        else:
-            # FIXME: no direct tests for update
-            token = str(token)
-            tokenuuid, revision = token.split("#", 1)
-            revision = int(revision) + 1
-        token = "%s#%d" % (tokenuuid, revision)
-        props[ctag] = GETCTag(token)
-        # FIXME: no direct tests for commit
-        return revision
-
-
-    def objectResourcesSinceToken(self, token):
-        raise NotImplementedError()
-
-
-    # FIXME: property writes should be a write operation
-    @cached
-    def properties(self):
-        # FIXME: needs direct tests - only covered by store tests
-        # FIXME: transactions
-        props = PropertyStore(
-            self._peruser_uid,
-            self._home.uid(),
-            lambda: self._path
-        )
-        self.initPropertyStore(props)
-
-        self._transaction.addOperation(props.flush, "flush object resource properties")
-        return props
-
-
-    def initPropertyStore(self, props):
-        pass
-
-    def _doValidate(self, component):
-        raise NotImplementedError
-
-
-class CommonObjectResource(LoggingMixIn, FancyEqMixin):
-    """
-    @ivar _path: The path of the file on disk
-
-    @type _path: L{FilePath}
-    """
-
-    compareAttributes = '_name _parentCollection'.split()
-
-    def __init__(self, name, parent):
-        self._name = name
-        self._parentCollection = parent
-        self._transaction = parent._transaction
-        self._component = None
-
-
-    @property
-    def _path(self):
-        return self._parentCollection._path.child(self._name)
-
-
-    def __repr__(self):
-        return "<%s: %s>" % (self.__class__.__name__, self._path.path)
-
-
-    def name(self):
-        return self._path.basename()
-
-
-    @writeOperation
-    def setComponent(self, component):
-        raise NotImplementedError
-
-
-    def component(self):
-        raise NotImplementedError
-
-
-    def text(self):
-        raise NotImplementedError
-
-
-    def uid(self):
-        raise NotImplementedError
-
-    @cached
-    def properties(self):
-        props = PropertyStore(
-            self._parentCollection._home.peruser_uid(),
-            self._parentCollection._home.uid(),
-            lambda : self._path
-        )
-        self._transaction.addOperation(props.flush, "object properties flush")
-        return props
-
-class CommonStubResource(object):
-    """
-    Just enough resource to keep the collection sql DB classes going.
-    """
-    def __init__(self, resource):
-        self.resource = resource
-        self.fp = self.resource._path
-
-    def bumpSyncToken(self, reset=False):
-        # FIXME: needs direct tests
-        return self.resource._updateSyncToken(reset)
-
-
-    def initSyncToken(self):
-        # FIXME: needs direct tests
-        self.bumpSyncToken(True)
-
-
-class NotificationCollection(CommonHomeChild):
-    """
-    File-based implementation of L{INotificationCollection}.
-    """
-    implements(INotificationCollection)
-
-    def __init__(self, name, parent, realName=None):
-        """
-        Initialize an notification collection pointing at a path on disk.
-
-        @param name: the subdirectory of parent where this notification collection
-            resides.
-        @type name: C{str}
-
-        @param parent: the home containing this notification collection.
-        @type parent: L{CommonHome}
-        """
-
-        super(NotificationCollection, self).__init__(name, parent, realName)
-
-        self._index = NotificationIndex(self)
-        self._invites = None
-        self._objectResourceClass = NotificationObject
-
-    def resourceType(self):
-        return ResourceType.notification
-
-    notificationObjects = CommonHomeChild.objectResources
-    notificationObjectWithName = CommonHomeChild.objectResourceWithName
-    removeNotificationObjectWithUID = CommonHomeChild.removeObjectResourceWithUID
-    notificationObjectsSinceToken = CommonHomeChild.objectResourcesSinceToken
-
-    def notificationObjectWithUID(self, uid):
-
-        record = self.retrieveOldIndex().recordForUID(uid)
-        return self.notificationObjectWithName(record.name) if record else None
-
-    def writeNotificationObject(self, uid, xmltype, xmldata):
-        name = uid + ".xml"
-        if name.startswith("."):
-            raise ObjectResourceNameNotAllowedError(name)
-
-        objectResource = NotificationObject(name, self)
-        objectResource.setData(uid, xmltype, xmldata)
-        self._cachedObjectResources[name] = objectResource
-
-        # Update database
-        self.retrieveOldIndex().addOrUpdateRecord(NotificationRecord(uid, name, xmltype.name))
-
-    @writeOperation
-    def removeNotificationObjectWithName(self, name):
-        if name.startswith("."):
-            raise NoSuchObjectResourceError(name)
-
-        self.retrieveOldIndex().removeRecordForName(name)
-
-        objectResourcePath = self._path.child(name)
-        if objectResourcePath.isfile():
-            self._removedObjectResources.add(name)
-            # FIXME: test for undo
-            def do():
-                objectResourcePath.remove()
-                return lambda: None
-            self._transaction.addOperation(do, "remove object resource object %r" %
-                                           (name,))
-        else:
-            raise NoSuchObjectResourceError(name)
-
-    def _doValidate(self, component):
-        # Nothing to do - notifications are always generated internally by the server
-        # so they better be valid all the time!
-        pass
-
-
-class NotificationObject(CommonObjectResource):
-    """
-    """
-    implements(INotificationObject)
-
-    def __init__(self, name, notifications):
-
-        super(NotificationObject, self).__init__(name, notifications)
-
-
-    @property
-    def _notificationCollection(self):
-        return self._parentCollection
-
-    @writeOperation
-    def setData(self, uid, xmltype, xmldata):
-
-        rname = uid + ".xml"
-        self._notificationCollection.retrieveOldIndex().addOrUpdateRecord(
-            NotificationRecord(uid, rname, xmltype.name)
-        )
-
-        def do():
-            backup = None
-            if self._path.exists():
-                backup = hidden(self._path.temporarySibling())
-                self._path.moveTo(backup)
-            fh = self._path.open("w")
-            try:
-                # FIXME: concurrency problem; if this write is interrupted
-                # halfway through, the underlying file will be corrupt.
-                fh.write(xmldata)
-            finally:
-                fh.close()
-            def undo():
-                if backup:
-                    backup.moveTo(self._path)
-                else:
-                    self._path.remove()
-            return undo
-        self._transaction.addOperation(do, "set notification data %r" % (self.name(),))
-
-        # Mark all properties as dirty, so they will be re-added to the
-        # temporary file when the main file is deleted. NOTE: if there were a
-        # temporary file and a rename() as there should be, this should really
-        # happen after the write but before the rename.
-        self.properties().update(self.properties())
-
-        props = self.properties()
-        props[PropertyName(*GETContentType.qname())] = GETContentType.fromString(generateContentType(MimeType("text", "xml", params={"charset":"utf-8"})))
-        props[PropertyName(*NotificationType.qname())] = NotificationType(xmltype)
-
-        # FIXME: the property store's flush() method may already have been
-        # added to the transaction, but we need to add it again to make sure it
-        # happens _after_ the new file has been written.  we may end up doing
-        # the work multiple times, and external callers to property-
-        # manipulation methods won't work.
-        self._transaction.addOperation(self.properties().flush, "post-update property flush")
-
-    def xmldata(self):
-        try:
-            fh = self._path.open()
-        except IOError, e:
-            if e[0] == ENOENT:
-                raise NoSuchObjectResourceError(self)
-            else:
-                raise
-
-        try:
-            text = fh.read()
-        finally:
-            fh.close()
-
-        return text
-
-
-    def uid(self):
-        if not hasattr(self, "_uid"):
-            self._uid = self.xmldata
-        return self._uid
-
-    def initPropertyStore(self, props):
-        # Setup peruser special properties
-        props.setSpecialProperties(
-            (
-            ),
-            (
-                PropertyName.fromElement(customxml.NotificationType),
-            ),
-        )
-
-
-class NotificationIndex(object):
-    #
-    # OK, here's where we get ugly.
-    # The index code needs to be rewritten also, but in the meantime...
-    #
-    def __init__(self, notificationCollection):
-        self.notificationCollection = notificationCollection
-        stubResource = CommonStubResource(notificationCollection)
-        self._oldIndex = OldNotificationIndex(stubResource)
-

Copied: CalendarServer/trunk/txdav/common/datastore/file.py (from rev 5919, CalendarServer/branches/new-store/txdav/common/datastore/file.py)
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/file.py	                        (rev 0)
+++ CalendarServer/trunk/txdav/common/datastore/file.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,890 @@
+# -*- test-case-name: txcaldav.calendarstore.test.test_file -*-
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+Common utility functions for a file based datastore.
+"""
+
+from twext.python.log import LoggingMixIn
+from twext.web2.dav.element.rfc2518 import ResourceType, GETContentType
+from twext.web2.http_headers import generateContentType, MimeType
+
+from twisted.python.util import FancyEqMixin
+
+from twistedcaldav import customxml
+from twistedcaldav.customxml import GETCTag, NotificationType
+from twistedcaldav.notifications import NotificationRecord
+from twistedcaldav.notifications import NotificationsDatabase as OldNotificationIndex
+from twistedcaldav.sharing import SharedCollectionsDatabase
+
+from txdav.common.icommondatastore import HomeChildNameNotAllowedError, \
+    HomeChildNameAlreadyExistsError, NoSuchHomeChildError, \
+    InternalDataStoreError, ObjectResourceNameNotAllowedError, \
+    ObjectResourceNameAlreadyExistsError, NoSuchObjectResourceError
+from txdav.common.inotifications import INotificationCollection, \
+    INotificationObject
+from txdav.datastore.file import DataStoreTransaction, DataStore, writeOperation, \
+    hidden, isValidName, cached
+from txdav.idav import IDataStore
+from txdav.propertystore.base import PropertyName
+from txdav.propertystore.xattr import PropertyStore
+
+from errno import EEXIST, ENOENT
+from uuid import uuid4
+from zope.interface import implements, directlyProvides
+
+ECALENDARTYPE = 0
+EADDRESSBOOKTYPE = 1
+TOPPATHS = (
+    "calendars",
+    "addressbooks"
+)
+UIDPATH = "__uids__"
+
+class CommonDataStore(DataStore):
+    """
+    An implementation of data store.
+
+    @ivar _path: A L{CachingFilePath} referencing a directory on disk that
+        stores all calendar and addressbook data for a group of UIDs.
+    """
+    implements(IDataStore)
+
+    def __init__(self, path, enableCalendars=True, enableAddressBooks=True):
+        """
+        Create a store.
+
+        @param path: a L{FilePath} pointing at a directory on disk.
+        """
+        assert enableCalendars or enableAddressBooks
+
+        super(CommonDataStore, self).__init__(path)
+        self.enableCalendars = enableCalendars
+        self.enableAddressBooks = enableAddressBooks
+        self._transactionClass = CommonStoreTransaction
+
+    def newTransaction(self, name='no name'):
+        """
+        Create a new transaction.
+
+        @see Transaction
+        """
+        return self._transactionClass(self, name, self.enableCalendars, self.enableAddressBooks)
+
+class CommonStoreTransaction(DataStoreTransaction):
+    """
+    In-memory implementation of
+
+    Note that this provides basic 'undo' support, but not truly transactional
+    operations.
+    """
+
+    _homeClass = {}
+
+    def __init__(self, dataStore, name, enableCalendars, enableAddressBooks):
+        """
+        Initialize a transaction; do not call this directly, instead call
+        L{DataStore.newTransaction}.
+
+        @param dataStore: The store that created this transaction.
+
+        @type dataStore: L{CommonDataStore}
+        """
+        from txcaldav.icalendarstore import ICalendarTransaction
+        from txcarddav.iaddressbookstore import IAddressBookTransaction
+        from txcaldav.calendarstore.file import CalendarHome
+        from txcarddav.addressbookstore.file import AddressBookHome
+
+        super(CommonStoreTransaction, self).__init__(dataStore, name)
+        self._homes = {}
+        self._homes[ECALENDARTYPE] = {}
+        self._homes[EADDRESSBOOKTYPE] = {}
+        self._notifications = {}
+
+        extraInterfaces = []
+        if enableCalendars:
+            extraInterfaces.append(ICalendarTransaction)
+            self._notificationHomeType = ECALENDARTYPE
+        else:
+            self._notificationHomeType = EADDRESSBOOKTYPE
+        if enableAddressBooks:
+            extraInterfaces.append(IAddressBookTransaction)
+        directlyProvides(self, *extraInterfaces)
+
+        CommonStoreTransaction._homeClass[ECALENDARTYPE] = CalendarHome
+        CommonStoreTransaction._homeClass[EADDRESSBOOKTYPE] = AddressBookHome
+
+
+    def calendarHomeWithUID(self, uid, create=False):
+        return self.homeWithUID(ECALENDARTYPE, uid, create)
+
+    def addressbookHomeWithUID(self, uid, create=False):
+        return self.homeWithUID(EADDRESSBOOKTYPE, uid, create)
+
+    def homeWithUID(self, storeType, uid, create=False):
+        if (uid, self) in self._homes[storeType]:
+            return self._homes[storeType][(uid, self)]
+
+        if uid.startswith("."):
+            return None
+
+        assert len(uid) >= 4
+
+        childPathSegments = []
+        childPathSegments.append(self._dataStore._path.child(TOPPATHS[storeType]))
+        childPathSegments.append(childPathSegments[-1].child(UIDPATH))
+        childPathSegments.append(childPathSegments[-1].child(uid[0:2]))
+        childPathSegments.append(childPathSegments[-1].child(uid[2:4]))
+        childPath = childPathSegments[-1].child(uid)
+
+        def createDirectory(path):
+            try:
+                path.createDirectory()
+            except (IOError, OSError), e:
+                if e.errno != EEXIST:
+                    # Ignore, in case someone else created the
+                    # directory while we were trying to as well.
+                    raise
+
+        creating = False
+        if create:
+            # Create intermediate directories
+            for child in childPathSegments:
+                if not child.isdir():
+                    createDirectory(child)
+
+            if childPath.isdir():
+                homePath = childPath
+            else:
+                creating = True
+                homePath = childPath.temporarySibling()
+                createDirectory(homePath)
+                def do():
+                    def lastly():
+                        homePath.moveTo(childPath)
+                        # home._path = homePath
+                        # do this _after_ all other file operations
+                        home._path = childPath
+                        return lambda : None
+                    self.addOperation(lastly, "create home finalize")
+                    return lambda : None
+                self.addOperation(do, "create home UID %r" % (uid,))
+
+        elif not childPath.isdir():
+            return None
+        else:
+            homePath = childPath
+
+        home = self._homeClass[storeType](uid, homePath, self._dataStore, self)
+        self._homes[storeType][(uid, self)] = home
+        if creating:
+            home.created()
+
+            # Create notification collection
+            if storeType == ECALENDARTYPE:
+                self.notificationsWithUID(uid)
+        return home
+
+    def notificationsWithUID(self, uid):
+
+        if (uid, self) in self._notifications:
+            return self._notifications[(uid, self)]
+
+        home = self.homeWithUID(self._notificationHomeType, uid, create=True)
+        notificationPath = home._path.child("notification")
+        if not notificationPath.isdir():
+            notificationPath = self.createNotifcationCollection(home, notificationPath)
+
+        notifications = NotificationCollection(notificationPath.basename(), home)
+        self._notifications[(uid, self)] = notifications
+        return notifications
+
+    def createNotifcationCollection(self, home, notificationPath):
+
+        if notificationPath.isdir():
+            return notificationPath
+
+        name = notificationPath.basename()
+
+        temporary = hidden(notificationPath.temporarySibling())
+        temporary.createDirectory()
+        # In order for the index to work (which is doing real file ops on disk
+        # via SQLite) we need to create a real directory _immediately_.
+
+        # FIXME: some way to roll this back.
+
+        c = NotificationCollection(temporary.basename(), home)
+        def do():
+            try:
+                props = c.properties()
+                temporary.moveTo(notificationPath)
+                c._name = name
+                # FIXME: _lots_ of duplication of work here.
+                props.flush()
+            except (IOError, OSError), e:
+                if e.errno == EEXIST and notificationPath.isdir():
+                    raise HomeChildNameAlreadyExistsError(name)
+                raise
+            # FIXME: direct tests, undo for index creation
+            # Return undo
+            return lambda: notificationPath.remove()
+
+        self.addOperation(do, "create child %r" % (name,))
+        props = c.properties()
+        props[PropertyName(*ResourceType.qname())] = c.resourceType()
+        return temporary
+
+class StubResource(object):
+    """
+    Just enough resource to keep the shared sql DB classes going.
+    """
+    def __init__(self, stubit):
+        self.fp = stubit._path
+
+class CommonHome(LoggingMixIn):
+
+    _childClass = None
+
+    def __init__(self, uid, path, dataStore, transaction):
+        self._dataStore = dataStore
+        self._uid = self._peruser_uid = uid
+        self._path = path
+        self._transaction = transaction
+        self._shares = SharedCollectionsDatabase(StubResource(self))
+        self._newChildren = {}
+        self._removedChildren = set()
+        self._cachedChildren = {}
+
+
+    def __repr__(self):
+        return "<%s: %s>" % (self.__class__.__name__, self._path)
+
+
+    def uid(self):
+        return self._uid
+
+    def peruser_uid(self):
+        return self._peruser_uid
+
+    def _updateSyncToken(self, reset=False):
+        "Stub for updating sync token."
+        # FIXME: actually update something
+
+
+    def retrieveOldShares(self):
+        """
+        Retrieve the old Index object.
+        """
+        return self._shares
+
+    def children(self):
+        return set(self._newChildren.itervalues()) | set(
+            self.childWithName(name)
+            for name in self._path.listdir()
+            if not name.startswith(".")
+        )
+
+    def childWithName(self, name):
+        child = self._newChildren.get(name)
+        if child is not None:
+            return child
+        if name in self._removedChildren:
+            return None
+        if name in self._cachedChildren:
+            return self._cachedChildren[name]
+
+        if name.startswith("."):
+            return None
+
+        childPath = self._path.child(name)
+        if childPath.isdir():
+            existingChild = self._childClass(name, self)
+            self._cachedChildren[name] = existingChild
+            return existingChild
+        else:
+            return None
+
+
+    @writeOperation
+    def createChildWithName(self, name):
+        if name.startswith("."):
+            raise HomeChildNameNotAllowedError(name)
+
+        childPath = self._path.child(name)
+
+        if name not in self._removedChildren and childPath.isdir():
+            raise HomeChildNameAlreadyExistsError(name)
+
+        temporary = hidden(childPath.temporarySibling())
+        temporary.createDirectory()
+        # In order for the index to work (which is doing real file ops on disk
+        # via SQLite) we need to create a real directory _immediately_.
+
+        # FIXME: some way to roll this back.
+
+        c = self._newChildren[name] = self._childClass(temporary.basename(), self, name)
+        c.retrieveOldIndex().create()
+        def do():
+            try:
+                props = c.properties()
+                temporary.moveTo(childPath)
+                c._name = name
+                # FIXME: _lots_ of duplication of work here.
+                props.flush()
+            except (IOError, OSError), e:
+                if e.errno == EEXIST and childPath.isdir():
+                    raise HomeChildNameAlreadyExistsError(name)
+                raise
+            # FIXME: direct tests, undo for index creation
+            # Return undo
+            return lambda: childPath.remove()
+
+        self._transaction.addOperation(do, "create child %r" % (name,))
+        props = c.properties()
+        props[PropertyName(*ResourceType.qname())] = c.resourceType()
+        self.createdChild(c)
+
+    def createdChild(self, child):
+        pass
+
+    @writeOperation
+    def removeChildWithName(self, name):
+        if name.startswith(".") or name in self._removedChildren:
+            raise NoSuchHomeChildError(name)
+
+        self._removedChildren.add(name)
+        childPath = self._path.child(name)
+        if name not in self._newChildren and not childPath.isdir():
+            raise NoSuchHomeChildError(name)
+
+        def do(transaction=self._transaction):
+            for i in xrange(1000):
+                trash = childPath.sibling("._del_%s_%d" % (childPath.basename(), i))
+                if not trash.exists():
+                    break
+            else:
+                raise InternalDataStoreError("Unable to create trash target for child at %s" % (childPath,))
+
+            try:
+                childPath.moveTo(trash)
+            except (IOError, OSError), e:
+                if e.errno == ENOENT:
+                    raise NoSuchHomeChildError(name)
+                raise
+
+            def cleanup():
+                try:
+                    trash.remove()
+                except Exception, e:
+                    self.log_error("Unable to delete trashed child at %s: %s" % (trash.fp, e))
+
+            transaction.addOperation(cleanup, "remove child backup %r" % (name,))
+
+            def undo():
+                trash.moveTo(childPath)
+
+            return undo
+
+        # FIXME: direct tests
+        self._transaction.addOperation(
+            do, "prepare child remove %r" % (name,)
+        )
+
+    # @cached
+    def properties(self):
+        # FIXME: needs tests for actual functionality
+        # FIXME: needs to be cached
+        # FIXME: transaction tests
+        props = PropertyStore(self.peruser_uid(), self.uid(),
+                              lambda : self._path)
+        self._transaction.addOperation(props.flush, "flush home properties")
+        return props
+
+
+class CommonHomeChild(LoggingMixIn, FancyEqMixin):
+    """
+    """
+
+    compareAttributes = '_name _home _transaction'.split()
+
+    _objectResourceClass = None
+
+    def __init__(self, name, home, realName=None):
+        """
+        Initialize an home child pointing at a path on disk.
+
+        @param name: the subdirectory of home where this child
+            resides.
+        @type name: C{str}
+
+        @param home: the home containing this child.
+        @type home: L{CommonHome}
+
+        @param realName: If this child was just created, the name which it
+        will eventually have on disk.
+        @type realName: C{str}
+        """
+        self._name = name
+        self._home = home
+        self._peruser_uid = home._peruser_uid
+        self._transaction = home._transaction
+        self._newObjectResources = {}
+        self._cachedObjectResources = {}
+        self._removedObjectResources = set()
+        self._index = None  # Derived classes need to set this
+        self._invites = None # Derived classes need to set this
+        self._renamedName = realName
+
+
+    @property
+    def _path(self):
+        return self._home._path.child(self._name)
+
+
+    def resourceType(self):
+        return NotImplementedError
+
+    def retrieveOldIndex(self):
+        """
+        Retrieve the old Index object.
+        """
+        return self._index._oldIndex
+
+    def retrieveOldInvites(self):
+        """
+        Retrieve the old Invites DB object.
+        """
+        return self._invites._oldInvites
+
+
+    def __repr__(self):
+        return "<%s: %s>" % (self.__class__.__name__, self._path.path)
+
+
+    def name(self):
+        if self._renamedName is not None:
+            return self._renamedName
+        return self._path.basename()
+
+
+    _renamedName = None
+
+    @writeOperation
+    def rename(self, name):
+        self._updateSyncToken()
+        oldName = self.name()
+        self._renamedName = name
+        self._home._newChildren[name] = self
+        self._home._removedChildren.add(oldName)
+        def doIt():
+            self._path.moveTo(self._path.sibling(name))
+            return lambda : None # FIXME: revert
+        self._transaction.addOperation(doIt, "rename home child %r -> %r" %
+                                       (oldName, name))
+
+
+    def ownerHome(self):
+        return self._home
+
+    def setSharingUID(self, uid):
+        self._peruser_uid = uid
+        self.properties().setPerUserUID(uid)
+
+    def objectResources(self):
+        return sorted((
+            self.objectResourceWithName(name)
+            for name in (
+                set(self._newObjectResources.iterkeys()) |
+                set(name for name in self._path.listdir()
+                    if not name.startswith(".")) -
+                set(self._removedObjectResources)
+            )),
+            key=lambda calObj: calObj.name()
+        )
+
+
+    def objectResourceWithName(self, name):
+        if name in self._removedObjectResources:
+            return None
+        if name in self._newObjectResources:
+            return self._newObjectResources[name]
+        if name in self._cachedObjectResources:
+            return self._cachedObjectResources[name]
+
+        objectResourcePath = self._path.child(name)
+        if objectResourcePath.isfile():
+            obj = self._objectResourceClass(name, self)
+            self._cachedObjectResources[name] = obj
+            return obj
+        else:
+            return None
+
+
+    def objectResourceWithUID(self, uid):
+        # FIXME: This _really_ needs to be inspecting an index, not parsing
+        # every resource.
+        for objectResourcePath in self._path.children():
+            if not isValidName(objectResourcePath.basename()):
+                continue
+            obj = self._objectResourceClass(objectResourcePath.basename(), self)
+            if obj.component().resourceUID() == uid:
+                if obj.name() in self._removedObjectResources:
+                    return None
+                return obj
+
+
+    @writeOperation
+    def createObjectResourceWithName(self, name, component):
+        if name.startswith("."):
+            raise ObjectResourceNameNotAllowedError(name)
+
+        objectResourcePath = self._path.child(name)
+        if objectResourcePath.exists():
+            raise ObjectResourceNameAlreadyExistsError(name)
+
+        objectResource = self._objectResourceClass(name, self)
+        objectResource.setComponent(component)
+        self._cachedObjectResources[name] = objectResource
+
+
+    @writeOperation
+    def removeObjectResourceWithName(self, name):
+        if name.startswith("."):
+            raise NoSuchObjectResourceError(name)
+
+        newRevision = self._updateSyncToken() # FIXME: Test
+        self.retrieveOldIndex().deleteResource(name, newRevision)
+
+        objectResourcePath = self._path.child(name)
+        if objectResourcePath.isfile():
+            self._removedObjectResources.add(name)
+            # FIXME: test for undo
+            def do():
+                objectResourcePath.remove()
+                return lambda: None
+            self._transaction.addOperation(do, "remove object resource object %r" %
+                                           (name,))
+        else:
+            raise NoSuchObjectResourceError(name)
+
+
+    @writeOperation
+    def removeObjectResourceWithUID(self, uid):
+        self.removeObjectResourceWithName(
+            self.objectResourceWithUID(uid)._path.basename())
+
+
+    def syncToken(self):
+        raise NotImplementedError()
+
+
+    def _updateSyncToken(self, reset=False):
+        # FIXME: add locking a-la CalDAVFile.bumpSyncToken
+        # FIXME: tests for desired concurrency properties
+        ctag = PropertyName.fromString(GETCTag.sname())
+        props = self.properties()
+        token = props.get(ctag)
+        if token is None or reset:
+            tokenuuid = uuid4()
+            revision = 1
+        else:
+            # FIXME: no direct tests for update
+            token = str(token)
+            tokenuuid, revision = token.split("#", 1)
+            revision = int(revision) + 1
+        token = "%s#%d" % (tokenuuid, revision)
+        props[ctag] = GETCTag(token)
+        # FIXME: no direct tests for commit
+        return revision
+
+
+    def objectResourcesSinceToken(self, token):
+        raise NotImplementedError()
+
+
+    # FIXME: property writes should be a write operation
+    @cached
+    def properties(self):
+        # FIXME: needs direct tests - only covered by store tests
+        # FIXME: transactions
+        props = PropertyStore(
+            self._peruser_uid,
+            self._home.uid(),
+            lambda: self._path
+        )
+        self.initPropertyStore(props)
+
+        self._transaction.addOperation(props.flush, "flush object resource properties")
+        return props
+
+
+    def initPropertyStore(self, props):
+        pass
+
+    def _doValidate(self, component):
+        raise NotImplementedError
+
+
+class CommonObjectResource(LoggingMixIn, FancyEqMixin):
+    """
+    @ivar _path: The path of the file on disk
+
+    @type _path: L{FilePath}
+    """
+
+    compareAttributes = '_name _parentCollection'.split()
+
+    def __init__(self, name, parent):
+        self._name = name
+        self._parentCollection = parent
+        self._transaction = parent._transaction
+        self._component = None
+
+
+    @property
+    def _path(self):
+        return self._parentCollection._path.child(self._name)
+
+
+    def __repr__(self):
+        return "<%s: %s>" % (self.__class__.__name__, self._path.path)
+
+
+    def name(self):
+        return self._path.basename()
+
+
+    @writeOperation
+    def setComponent(self, component):
+        raise NotImplementedError
+
+
+    def component(self):
+        raise NotImplementedError
+
+
+    def text(self):
+        raise NotImplementedError
+
+
+    def uid(self):
+        raise NotImplementedError
+
+    @cached
+    def properties(self):
+        props = PropertyStore(
+            self._parentCollection._home.peruser_uid(),
+            self._parentCollection._home.uid(),
+            lambda : self._path
+        )
+        self._transaction.addOperation(props.flush, "object properties flush")
+        return props
+
+class CommonStubResource(object):
+    """
+    Just enough resource to keep the collection sql DB classes going.
+    """
+    def __init__(self, resource):
+        self.resource = resource
+        self.fp = self.resource._path
+
+    def bumpSyncToken(self, reset=False):
+        # FIXME: needs direct tests
+        return self.resource._updateSyncToken(reset)
+
+
+    def initSyncToken(self):
+        # FIXME: needs direct tests
+        self.bumpSyncToken(True)
+
+
+class NotificationCollection(CommonHomeChild):
+    """
+    File-based implementation of L{INotificationCollection}.
+    """
+    implements(INotificationCollection)
+
+    def __init__(self, name, parent, realName=None):
+        """
+        Initialize an notification collection pointing at a path on disk.
+
+        @param name: the subdirectory of parent where this notification collection
+            resides.
+        @type name: C{str}
+
+        @param parent: the home containing this notification collection.
+        @type parent: L{CommonHome}
+        """
+
+        super(NotificationCollection, self).__init__(name, parent, realName)
+
+        self._index = NotificationIndex(self)
+        self._invites = None
+        self._objectResourceClass = NotificationObject
+
+    def resourceType(self):
+        return ResourceType.notification
+
+    notificationObjects = CommonHomeChild.objectResources
+    notificationObjectWithName = CommonHomeChild.objectResourceWithName
+    removeNotificationObjectWithUID = CommonHomeChild.removeObjectResourceWithUID
+    notificationObjectsSinceToken = CommonHomeChild.objectResourcesSinceToken
+
+    def notificationObjectWithUID(self, uid):
+
+        record = self.retrieveOldIndex().recordForUID(uid)
+        return self.notificationObjectWithName(record.name) if record else None
+
+    def writeNotificationObject(self, uid, xmltype, xmldata):
+        name = uid + ".xml"
+        if name.startswith("."):
+            raise ObjectResourceNameNotAllowedError(name)
+
+        objectResource = NotificationObject(name, self)
+        objectResource.setData(uid, xmltype, xmldata)
+        self._cachedObjectResources[name] = objectResource
+
+        # Update database
+        self.retrieveOldIndex().addOrUpdateRecord(NotificationRecord(uid, name, xmltype.name))
+
+    @writeOperation
+    def removeNotificationObjectWithName(self, name):
+        if name.startswith("."):
+            raise NoSuchObjectResourceError(name)
+
+        self.retrieveOldIndex().removeRecordForName(name)
+
+        objectResourcePath = self._path.child(name)
+        if objectResourcePath.isfile():
+            self._removedObjectResources.add(name)
+            # FIXME: test for undo
+            def do():
+                objectResourcePath.remove()
+                return lambda: None
+            self._transaction.addOperation(do, "remove object resource object %r" %
+                                           (name,))
+        else:
+            raise NoSuchObjectResourceError(name)
+
+    def _doValidate(self, component):
+        # Nothing to do - notifications are always generated internally by the server
+        # so they better be valid all the time!
+        pass
+
+
+class NotificationObject(CommonObjectResource):
+    """
+    """
+    implements(INotificationObject)
+
+    def __init__(self, name, notifications):
+
+        super(NotificationObject, self).__init__(name, notifications)
+
+
+    @property
+    def _notificationCollection(self):
+        return self._parentCollection
+
+    @writeOperation
+    def setData(self, uid, xmltype, xmldata):
+
+        rname = uid + ".xml"
+        self._notificationCollection.retrieveOldIndex().addOrUpdateRecord(
+            NotificationRecord(uid, rname, xmltype.name)
+        )
+
+        def do():
+            backup = None
+            if self._path.exists():
+                backup = hidden(self._path.temporarySibling())
+                self._path.moveTo(backup)
+            fh = self._path.open("w")
+            try:
+                # FIXME: concurrency problem; if this write is interrupted
+                # halfway through, the underlying file will be corrupt.
+                fh.write(xmldata)
+            finally:
+                fh.close()
+            def undo():
+                if backup:
+                    backup.moveTo(self._path)
+                else:
+                    self._path.remove()
+            return undo
+        self._transaction.addOperation(do, "set notification data %r" % (self.name(),))
+
+        # Mark all properties as dirty, so they will be re-added to the
+        # temporary file when the main file is deleted. NOTE: if there were a
+        # temporary file and a rename() as there should be, this should really
+        # happen after the write but before the rename.
+        self.properties().update(self.properties())
+
+        props = self.properties()
+        props[PropertyName(*GETContentType.qname())] = GETContentType.fromString(generateContentType(MimeType("text", "xml", params={"charset":"utf-8"})))
+        props[PropertyName(*NotificationType.qname())] = NotificationType(xmltype)
+
+        # FIXME: the property store's flush() method may already have been
+        # added to the transaction, but we need to add it again to make sure it
+        # happens _after_ the new file has been written.  we may end up doing
+        # the work multiple times, and external callers to property-
+        # manipulation methods won't work.
+        self._transaction.addOperation(self.properties().flush, "post-update property flush")
+
+    def xmldata(self):
+        try:
+            fh = self._path.open()
+        except IOError, e:
+            if e[0] == ENOENT:
+                raise NoSuchObjectResourceError(self)
+            else:
+                raise
+
+        try:
+            text = fh.read()
+        finally:
+            fh.close()
+
+        return text
+
+
+    def uid(self):
+        if not hasattr(self, "_uid"):
+            self._uid = self.xmldata
+        return self._uid
+
+    def initPropertyStore(self, props):
+        # Setup peruser special properties
+        props.setSpecialProperties(
+            (
+            ),
+            (
+                PropertyName.fromElement(customxml.NotificationType),
+            ),
+        )
+
+
+class NotificationIndex(object):
+    #
+    # OK, here's where we get ugly.
+    # The index code needs to be rewritten also, but in the meantime...
+    #
+    def __init__(self, notificationCollection):
+        self.notificationCollection = notificationCollection
+        stubResource = CommonStubResource(notificationCollection)
+        self._oldIndex = OldNotificationIndex(stubResource)
+

Deleted: CalendarServer/trunk/txdav/common/icommondatastore.py
===================================================================
--- CalendarServer/branches/new-store/txdav/common/icommondatastore.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txdav/common/icommondatastore.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,130 +0,0 @@
-##
-# Copyright (c) 2010 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-"""
-Storage interfaces that are not implied by DAV, but are shared between the
-requirements for both CalDAV and CardDAV extensions.
-"""
-
-from txdav.idav import ITransaction
-
-__all__ = [
-    # Exceptions
-    "CommonStoreError",
-    "NameNotAllowedError",
-    "HomeChildNameNotAllowedError",
-    "ObjectResourceNameNotAllowedError",
-    "AlreadyExistsError",
-    "HomeChildNameAlreadyExistsError",
-    "ObjectResourceNameAlreadyExistsError",
-    "ObjectResourceUIDAlreadyExistsError",
-    "NotFoundError",
-    "NoSuchHomeChildError",
-    "NoSuchObjectResourceError",
-    "InvalidObjectResourceError",
-    "InternalDataStoreError",
-]
-
-#
-# Exceptions
-#
-
-class CommonStoreError(RuntimeError):
-    """
-    Store generic error.
-    """
-
-class NameNotAllowedError(CommonStoreError):
-    """
-    Attempt to create an object with a name that is not allowed.
-    """
-
-class HomeChildNameNotAllowedError(NameNotAllowedError):
-    """
-    Home child name not allowed.
-    """
-
-class ObjectResourceNameNotAllowedError(NameNotAllowedError):
-    """
-    Object resource name not allowed.
-    """
-
-class AlreadyExistsError(CommonStoreError):
-    """
-    Attempt to create an object that already exists.
-    """
-
-class HomeChildNameAlreadyExistsError(AlreadyExistsError):
-    """
-    Home child already exists.
-    """
-
-class ObjectResourceNameAlreadyExistsError(AlreadyExistsError):
-    """
-    An object resource with the requested name already exists.
-    """
-
-class ObjectResourceUIDAlreadyExistsError(AlreadyExistsError):
-    """
-    An object resource with the requested UID already exists.
-    """
-
-class NotFoundError(CommonStoreError):
-    """
-    Requested data not found.
-    """
-
-class NoSuchHomeChildError(NotFoundError):
-    """
-    The requested home child does not exist.
-    """
-
-class NoSuchObjectResourceError(NotFoundError):
-    """
-    The requested object resource does not exist.
-    """
-
-class InvalidObjectResourceError(CommonStoreError):
-    """
-    Invalid object resource data.
-    """
-
-class InternalDataStoreError(CommonStoreError):
-    """
-    Uh, oh.
-    """
-
-#
-# Interfaces
-#
-
-class ICommonTransaction(ITransaction):
-    """
-    Transaction functionality shared in common by calendar and addressbook
-    stores.
-    """
-
-    def notificationsWithUID(uid):
-        """
-        Retrieve the notification collection for the principal with the given
-        C{uid}.
-
-        @return: an L{INotificationCollection} or C{None} if no such
-            notification collection exists.
-        """
-
-
-

Copied: CalendarServer/trunk/txdav/common/icommondatastore.py (from rev 5919, CalendarServer/branches/new-store/txdav/common/icommondatastore.py)
===================================================================
--- CalendarServer/trunk/txdav/common/icommondatastore.py	                        (rev 0)
+++ CalendarServer/trunk/txdav/common/icommondatastore.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,130 @@
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+Storage interfaces that are not implied by DAV, but are shared between the
+requirements for both CalDAV and CardDAV extensions.
+"""
+
+from txdav.idav import ITransaction
+
+__all__ = [
+    # Exceptions
+    "CommonStoreError",
+    "NameNotAllowedError",
+    "HomeChildNameNotAllowedError",
+    "ObjectResourceNameNotAllowedError",
+    "AlreadyExistsError",
+    "HomeChildNameAlreadyExistsError",
+    "ObjectResourceNameAlreadyExistsError",
+    "ObjectResourceUIDAlreadyExistsError",
+    "NotFoundError",
+    "NoSuchHomeChildError",
+    "NoSuchObjectResourceError",
+    "InvalidObjectResourceError",
+    "InternalDataStoreError",
+]
+
+#
+# Exceptions
+#
+
+class CommonStoreError(RuntimeError):
+    """
+    Store generic error.
+    """
+
+class NameNotAllowedError(CommonStoreError):
+    """
+    Attempt to create an object with a name that is not allowed.
+    """
+
+class HomeChildNameNotAllowedError(NameNotAllowedError):
+    """
+    Home child name not allowed.
+    """
+
+class ObjectResourceNameNotAllowedError(NameNotAllowedError):
+    """
+    Object resource name not allowed.
+    """
+
+class AlreadyExistsError(CommonStoreError):
+    """
+    Attempt to create an object that already exists.
+    """
+
+class HomeChildNameAlreadyExistsError(AlreadyExistsError):
+    """
+    Home child already exists.
+    """
+
+class ObjectResourceNameAlreadyExistsError(AlreadyExistsError):
+    """
+    An object resource with the requested name already exists.
+    """
+
+class ObjectResourceUIDAlreadyExistsError(AlreadyExistsError):
+    """
+    An object resource with the requested UID already exists.
+    """
+
+class NotFoundError(CommonStoreError):
+    """
+    Requested data not found.
+    """
+
+class NoSuchHomeChildError(NotFoundError):
+    """
+    The requested home child does not exist.
+    """
+
+class NoSuchObjectResourceError(NotFoundError):
+    """
+    The requested object resource does not exist.
+    """
+
+class InvalidObjectResourceError(CommonStoreError):
+    """
+    Invalid object resource data.
+    """
+
+class InternalDataStoreError(CommonStoreError):
+    """
+    Uh, oh.
+    """
+
+#
+# Interfaces
+#
+
+class ICommonTransaction(ITransaction):
+    """
+    Transaction functionality shared in common by calendar and addressbook
+    stores.
+    """
+
+    def notificationsWithUID(uid):
+        """
+        Retrieve the notification collection for the principal with the given
+        C{uid}.
+
+        @return: an L{INotificationCollection} or C{None} if no such
+            notification collection exists.
+        """
+
+
+

Deleted: CalendarServer/trunk/txdav/common/inotifications.py
===================================================================
--- CalendarServer/branches/new-store/txdav/common/inotifications.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txdav/common/inotifications.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,171 +0,0 @@
-##
-# Copyright (c) 2010 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-"""
-Common notification interfaces
-"""
-
-from zope.interface.interface import Interface
-
-
-__all__ = [
-    "INotificationCollection",
-    "INotification",
-]
-
-class INotificationCollection(Interface):
-    """
-    NotificationCollection
-
-    A notification collection is a container for notification objects.
-    A notification collection belongs to a specific principal.
-    """
-
-    def name():
-        """
-        Identify this notification collection.
-
-        @return: the name of this notification collection.
-        @rtype: C{str}
-        """
-
-    def notificationObjects():
-        """
-        Retrieve the notification objects contained in this notification
-        collection with the given C{componentType}.
-
-        @param componentType: a string.
-        @return: an iterable of L{INotificationObject}s.
-        """
-
-    def notificationObjectWithName(name):
-        """
-        Retrieve the notification object with the given C{name} contained
-        in this notification collection.
-
-        @param name: a string.
-        @return: an L{INotificationObject} or C{None} if no such notification
-            object exists.
-        """
-
-    def notificationObjectWithUID(uid):
-        """
-        Retrieve the notification object with the given C{uid} contained
-        in this notification collection.
-
-        @param uid: a string.
-        @return: an L{INotificationObject} or C{None} if no such notification
-            object exists.
-        """
-
-    def writeNotificationObject(uid, xmltype, xmldata):
-        """
-        Write a notification with the given C{uid} in this
-        notification collection from the given C{xmldata} with
-        given C{xmltype}. Create or overwrite are OK.
-
-        @param uid: a string.
-        @param xmltype: a string.
-        @param xmldata: a string.
-        @param component: a C{VCARD} L{Component}
-        """
-
-    def removeNotificationObjectWithName(name):
-        """
-        Remove the notification object with the given C{name} from this
-        notification collection. If C{deleteOnly} is C{True} then do not
-        
-
-        @param name: a string.
-        @raise NoSuchObjectResourceError: if no such NoSuchObjectResourceError object
-            exists.
-        """
-
-    def removeNotificationObjectWithUID(uid):
-        """
-        Remove the notification object with the given C{uid} from this
-        notification collection.
-
-        @param uid: a string.
-        @raise NoSuchObjectResourceError: if the notification object does
-            not exist.
-        """
-
-    def syncToken():
-        """
-        Retrieve the current sync token for this notification.
-
-        @return: a string containing a sync token.
-        """
-
-    def notificationObjectsSinceToken(token):
-        """
-        Retrieve all notification objects in this notification collection that have
-        changed since the given C{token} was last valid.
-
-        @param token: a sync token.
-        @return: a 3-tuple containing an iterable of
-            L{INotificationObject}s that have changed, an iterable of uids
-            that have been removed, and the current sync token.
-        """
-
-    def properties():
-        """
-        Retrieve the property store for this notification.
-
-        @return: an L{IPropertyStore}.
-        """
-
-
-class INotificationObject(Interface):
-    """
-    Notification object
-
-    An notification object describes an XML notification.
-    """
-
-    def setData(uid, xmltype, xmldata):
-        """
-        Rewrite this notification object to match the given C{xmltype} and
-        C{xmldata}. C{xmldata} must have the same UID as this notification object.
-
-        @param xmltype: a string.
-        @param xmldata: a string.
-        @raise InvalidObjectResourceError: if the given
-            C{xmltype} or C{xmldata} is not a valid for
-            an notification object.
-        """
-
-    def xmldata():
-        """
-        Retrieve the notification data for this notification object.
-
-        @return: a string.
-        """
-
-    def uid():
-        """
-        Retrieve the UID for this notification object.
-
-        @return: a string containing a UID.
-        """
-
-    def properties():
-        """
-        Retrieve the property store for this notification object.
-
-        @return: an L{IPropertyStore}.
-        """

Copied: CalendarServer/trunk/txdav/common/inotifications.py (from rev 5919, CalendarServer/branches/new-store/txdav/common/inotifications.py)
===================================================================
--- CalendarServer/trunk/txdav/common/inotifications.py	                        (rev 0)
+++ CalendarServer/trunk/txdav/common/inotifications.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,171 @@
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+Common notification interfaces
+"""
+
+from zope.interface.interface import Interface
+
+
+__all__ = [
+    "INotificationCollection",
+    "INotification",
+]
+
+class INotificationCollection(Interface):
+    """
+    NotificationCollection
+
+    A notification collection is a container for notification objects.
+    A notification collection belongs to a specific principal.
+    """
+
+    def name():
+        """
+        Identify this notification collection.
+
+        @return: the name of this notification collection.
+        @rtype: C{str}
+        """
+
+    def notificationObjects():
+        """
+        Retrieve the notification objects contained in this notification
+        collection with the given C{componentType}.
+
+        @param componentType: a string.
+        @return: an iterable of L{INotificationObject}s.
+        """
+
+    def notificationObjectWithName(name):
+        """
+        Retrieve the notification object with the given C{name} contained
+        in this notification collection.
+
+        @param name: a string.
+        @return: an L{INotificationObject} or C{None} if no such notification
+            object exists.
+        """
+
+    def notificationObjectWithUID(uid):
+        """
+        Retrieve the notification object with the given C{uid} contained
+        in this notification collection.
+
+        @param uid: a string.
+        @return: an L{INotificationObject} or C{None} if no such notification
+            object exists.
+        """
+
+    def writeNotificationObject(uid, xmltype, xmldata):
+        """
+        Write a notification with the given C{uid} in this
+        notification collection from the given C{xmldata} with
+        given C{xmltype}. Create or overwrite are OK.
+
+        @param uid: a string.
+        @param xmltype: a string.
+        @param xmldata: a string.
+        @param component: a C{VCARD} L{Component}
+        """
+
+    def removeNotificationObjectWithName(name):
+        """
+        Remove the notification object with the given C{name} from this
+        notification collection. If C{deleteOnly} is C{True} then do not
+        
+
+        @param name: a string.
+        @raise NoSuchObjectResourceError: if no such NoSuchObjectResourceError object
+            exists.
+        """
+
+    def removeNotificationObjectWithUID(uid):
+        """
+        Remove the notification object with the given C{uid} from this
+        notification collection.
+
+        @param uid: a string.
+        @raise NoSuchObjectResourceError: if the notification object does
+            not exist.
+        """
+
+    def syncToken():
+        """
+        Retrieve the current sync token for this notification.
+
+        @return: a string containing a sync token.
+        """
+
+    def notificationObjectsSinceToken(token):
+        """
+        Retrieve all notification objects in this notification collection that have
+        changed since the given C{token} was last valid.
+
+        @param token: a sync token.
+        @return: a 3-tuple containing an iterable of
+            L{INotificationObject}s that have changed, an iterable of uids
+            that have been removed, and the current sync token.
+        """
+
+    def properties():
+        """
+        Retrieve the property store for this notification.
+
+        @return: an L{IPropertyStore}.
+        """
+
+
+class INotificationObject(Interface):
+    """
+    Notification object
+
+    An notification object describes an XML notification.
+    """
+
+    def setData(uid, xmltype, xmldata):
+        """
+        Rewrite this notification object to match the given C{xmltype} and
+        C{xmldata}. C{xmldata} must have the same UID as this notification object.
+
+        @param xmltype: a string.
+        @param xmldata: a string.
+        @raise InvalidObjectResourceError: if the given
+            C{xmltype} or C{xmldata} is not a valid for
+            an notification object.
+        """
+
+    def xmldata():
+        """
+        Retrieve the notification data for this notification object.
+
+        @return: a string.
+        """
+
+    def uid():
+        """
+        Retrieve the UID for this notification object.
+
+        @return: a string containing a UID.
+        """
+
+    def properties():
+        """
+        Retrieve the property store for this notification object.
+
+        @return: an L{IPropertyStore}.
+        """

Deleted: CalendarServer/trunk/txdav/datastore/__init__.py
===================================================================
--- CalendarServer/branches/new-store/txdav/datastore/__init__.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txdav/datastore/__init__.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,19 +0,0 @@
-##
-# Copyright (c) 2010 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-"""
-WebDAV data store for Twisted.
-"""

Copied: CalendarServer/trunk/txdav/datastore/__init__.py (from rev 5919, CalendarServer/branches/new-store/txdav/datastore/__init__.py)
===================================================================
--- CalendarServer/trunk/txdav/datastore/__init__.py	                        (rev 0)
+++ CalendarServer/trunk/txdav/datastore/__init__.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,19 @@
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+WebDAV data store for Twisted.
+"""

Deleted: CalendarServer/trunk/txdav/datastore/file.py
===================================================================
--- CalendarServer/branches/new-store/txdav/datastore/file.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txdav/datastore/file.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,205 +0,0 @@
-# -*- test-case-name: txdav -*-
-##
-# Copyright (c) 2010 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-
-"""
-Common utility functions for a file based datastore.
-"""
-
-from twext.python.log import LoggingMixIn
-from txdav.idav import AlreadyFinishedError
-
-def isValidName(name):
-    """
-    Determine if the given string is a valid name.  i.e. does it conflict with
-    any of the other entities which may be on the filesystem?
-
-    @param name: a name which might be given to a calendar.
-    """
-    return not name.startswith(".")
-
-
-def hidden(path):
-    return path.sibling('.' + path.basename())
-
-
-_unset = object()
-
-class cached(object):
-    """
-    This object is a decorator for a 0-argument method which should be called
-    only once, and its result cached so that future invocations just return the
-    same result without calling the underlying method again.
-
-    @ivar thunk: the function to call to generate a cached value.
-    """
-
-    def __init__(self, thunk):
-        self.thunk = thunk
-
-
-    def __get__(self, oself, owner):
-        def inner():
-            cacheKey = "_" + self.thunk.__name__ + "_cached"
-            cached = getattr(oself, cacheKey, _unset)
-            if cached is _unset:
-                value = self.thunk(oself)
-                setattr(oself, cacheKey, value)
-                return value
-            else:
-                return cached
-        return inner
-
-
-
-def writeOperation(thunk):
-    # FIXME: tests
-    def inner(self, *a, **kw):
-        if self._transaction._termination is not None:
-            raise RuntimeError(
-                "%s.%s is a write operation, but transaction already %s"
-                % (self, thunk.__name__, self._transaction._termination))
-        return thunk(self, *a, **kw)
-    return inner
-
-
-
-class DataStore(LoggingMixIn):
-    """
-    Generic data store.
-    """
-
-    _transactionClass = None    # Derived class must set this
-
-    def __init__(self, path):
-        """
-        Create a calendar store.
-
-        @param path: a L{FilePath} pointing at a directory on disk.
-        """
-        self._path = path
-
-#        if not path.isdir():
-            # FIXME: Add DataStoreNotFoundError?
-#            raise NotFoundError("No such data store")
-
-    def __repr__(self):
-        return "<%s: %s>" % (self.__class__.__name__, self._path.path)
-
-    def newTransaction(self, name='no name'):
-        """
-        Create a new transaction.
-
-        @see Transaction
-        """
-        return self._transactionClass(self)
-
-
-
-class _CommitTracker(object):
-    """
-    Diagnostic tool to find transactions that were never committed.
-    """
-
-    def __init__(self, name):
-        self.name = name
-        self.done = False
-        self.info = []
-
-    def __del__(self):
-        if not self.done and self.info:
-            print '**** UNCOMMITTED TRANSACTION (%s) BEING GARBAGE COLLECTED ****' % (
-                self.name,
-            )
-            for info in self.info:
-                print '   ', info
-            print '---- END OF OPERATIONS'
-
-
-
-class DataStoreTransaction(LoggingMixIn):
-    """
-    In-memory implementation of a data store transaction.
-    """
-
-    def __init__(self, dataStore, name):
-        """
-        Initialize a transaction; do not call this directly, instead call
-        L{CalendarStore.newTransaction}.
-
-        @param calendarStore: The store that created this transaction.
-
-        @type calendarStore: L{CalendarStore}
-        """
-        self._dataStore = dataStore
-        self._termination = None
-        self._operations = []
-        self._tracker = _CommitTracker(name)
-
-
-    def store(self):
-        return self._dataStore
-
-    def addOperation(self, operation, name):
-        self._operations.append(operation)
-        self._tracker.info.append(name)
-
-
-    def _terminate(self, mode):
-        """
-        Check to see if this transaction has already been terminated somehow,
-        either via committing or aborting, and if not, note that it has been
-        terminated.
-
-        @param mode: The manner of the termination of this transaction.
-        
-        @type mode: C{str}
-
-        @raise AlreadyFinishedError: This transaction has already been
-            terminated.
-        """
-        if self._termination is not None:
-            raise AlreadyFinishedError("already %s" % (self._termination,))
-        self._termination = mode
-        self._tracker.done = True
-
-
-    def abort(self):
-        self._terminate("aborted")
-
-
-    def commit(self):
-        self._terminate("committed")
-
-        self.committed = True
-        undos = []
-
-        for operation in self._operations:
-            try:
-                undo = operation()
-                if undo is not None:
-                    undos.append(undo)
-            except:
-                self.log_debug("Undoing DataStoreTransaction")
-                for undo in undos:
-                    try:
-                        undo()
-                    except:
-                        self.log_error("Cannot undo DataStoreTransaction")
-                raise
-
-

Copied: CalendarServer/trunk/txdav/datastore/file.py (from rev 5919, CalendarServer/branches/new-store/txdav/datastore/file.py)
===================================================================
--- CalendarServer/trunk/txdav/datastore/file.py	                        (rev 0)
+++ CalendarServer/trunk/txdav/datastore/file.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -0,0 +1,205 @@
+# -*- test-case-name: txdav -*-
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+
+"""
+Common utility functions for a file based datastore.
+"""
+
+from twext.python.log import LoggingMixIn
+from txdav.idav import AlreadyFinishedError
+
+def isValidName(name):
+    """
+    Determine if the given string is a valid name.  i.e. does it conflict with
+    any of the other entities which may be on the filesystem?
+
+    @param name: a name which might be given to a calendar.
+    """
+    return not name.startswith(".")
+
+
+def hidden(path):
+    return path.sibling('.' + path.basename())
+
+
+_unset = object()
+
+class cached(object):
+    """
+    This object is a decorator for a 0-argument method which should be called
+    only once, and its result cached so that future invocations just return the
+    same result without calling the underlying method again.
+
+    @ivar thunk: the function to call to generate a cached value.
+    """
+
+    def __init__(self, thunk):
+        self.thunk = thunk
+
+
+    def __get__(self, oself, owner):
+        def inner():
+            cacheKey = "_" + self.thunk.__name__ + "_cached"
+            cached = getattr(oself, cacheKey, _unset)
+            if cached is _unset:
+                value = self.thunk(oself)
+                setattr(oself, cacheKey, value)
+                return value
+            else:
+                return cached
+        return inner
+
+
+
+def writeOperation(thunk):
+    # FIXME: tests
+    def inner(self, *a, **kw):
+        if self._transaction._termination is not None:
+            raise RuntimeError(
+                "%s.%s is a write operation, but transaction already %s"
+                % (self, thunk.__name__, self._transaction._termination))
+        return thunk(self, *a, **kw)
+    return inner
+
+
+
+class DataStore(LoggingMixIn):
+    """
+    Generic data store.
+    """
+
+    _transactionClass = None    # Derived class must set this
+
+    def __init__(self, path):
+        """
+        Create a calendar store.
+
+        @param path: a L{FilePath} pointing at a directory on disk.
+        """
+        self._path = path
+
+#        if not path.isdir():
+            # FIXME: Add DataStoreNotFoundError?
+#            raise NotFoundError("No such data store")
+
+    def __repr__(self):
+        return "<%s: %s>" % (self.__class__.__name__, self._path.path)
+
+    def newTransaction(self, name='no name'):
+        """
+        Create a new transaction.
+
+        @see Transaction
+        """
+        return self._transactionClass(self)
+
+
+
+class _CommitTracker(object):
+    """
+    Diagnostic tool to find transactions that were never committed.
+    """
+
+    def __init__(self, name):
+        self.name = name
+        self.done = False
+        self.info = []
+
+    def __del__(self):
+        if not self.done and self.info:
+            print '**** UNCOMMITTED TRANSACTION (%s) BEING GARBAGE COLLECTED ****' % (
+                self.name,
+            )
+            for info in self.info:
+                print '   ', info
+            print '---- END OF OPERATIONS'
+
+
+
+class DataStoreTransaction(LoggingMixIn):
+    """
+    In-memory implementation of a data store transaction.
+    """
+
+    def __init__(self, dataStore, name):
+        """
+        Initialize a transaction; do not call this directly, instead call
+        L{CalendarStore.newTransaction}.
+
+        @param calendarStore: The store that created this transaction.
+
+        @type calendarStore: L{CalendarStore}
+        """
+        self._dataStore = dataStore
+        self._termination = None
+        self._operations = []
+        self._tracker = _CommitTracker(name)
+
+
+    def store(self):
+        return self._dataStore
+
+    def addOperation(self, operation, name):
+        self._operations.append(operation)
+        self._tracker.info.append(name)
+
+
+    def _terminate(self, mode):
+        """
+        Check to see if this transaction has already been terminated somehow,
+        either via committing or aborting, and if not, note that it has been
+        terminated.
+
+        @param mode: The manner of the termination of this transaction.
+        
+        @type mode: C{str}
+
+        @raise AlreadyFinishedError: This transaction has already been
+            terminated.
+        """
+        if self._termination is not None:
+            raise AlreadyFinishedError("already %s" % (self._termination,))
+        self._termination = mode
+        self._tracker.done = True
+
+
+    def abort(self):
+        self._terminate("aborted")
+
+
+    def commit(self):
+        self._terminate("committed")
+
+        self.committed = True
+        undos = []
+
+        for operation in self._operations:
+            try:
+                undo = operation()
+                if undo is not None:
+                    undos.append(undo)
+            except:
+                self.log_debug("Undoing DataStoreTransaction")
+                for undo in undos:
+                    try:
+                        undo()
+                    except:
+                        self.log_error("Cannot undo DataStoreTransaction")
+                raise
+
+

Modified: CalendarServer/trunk/txdav/idav.py
===================================================================
--- CalendarServer/trunk/txdav/idav.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txdav/idav.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -21,15 +21,15 @@
 __all__ = [
     "PropertyStoreError",
     "PropertyChangeNotAllowedError",
+    "AlreadyFinishedError",
     "IPropertyName",
     "IPropertyStore",
+    "IDataStore",
 ]
 
 from zope.interface import Attribute, Interface
-
 from zope.interface.common.mapping import IMapping
 
-
 #
 # Exceptions
 #
@@ -39,6 +39,8 @@
     Property store error.
     """
 
+
+
 class PropertyChangeNotAllowedError(PropertyStoreError):
     """
     Property cannot be edited.
@@ -48,6 +50,14 @@
         self.keys = keys
 
 
+
+class AlreadyFinishedError(Exception):
+    """
+    The transaction was already completed via an C{abort} or C{commit} and
+    cannot be aborted or committed again.
+    """
+
+
 #
 # Interfaces
 #
@@ -74,7 +84,13 @@
     This interface is based on L{IMapping}, but any changed to data
     are not persisted until C{flush()} is called, and can be undone
     using C{abort()}.
+
+    Also, keys must be L{IPropertyName} providers and values must be
+    L{twext.web2.element.dav.base.WeDAVElement}s.
     """
+    # FIXME: the type for values isn't quite right, there should be some more
+    # specific interface for that.
+
     def flush():
         """
         Write out any pending changes.
@@ -84,3 +100,45 @@
         """
         Abort any pending changes.
         """
+
+
+
+class IDataStore(Interface):
+    """
+    An L{IDataStore} is a storage of some objects.
+    """
+
+    def newTransaction():
+        """
+        Create a new transaction.
+
+        @return: a new transaction which provides L{ITransaction}, as well as
+            sub-interfaces to request appropriate data objects.
+
+        @rtype: L{ITransaction}
+        """
+
+
+
+class ITransaction(Interface):
+    """
+    Transaction that can be aborted and either succeeds or fails in
+    its entirety.
+    """
+
+    def abort():
+        """
+        Abort this transaction.
+
+        @raise AlreadyFinishedError: The transaction was already finished with
+            an 'abort' or 'commit' and cannot be aborted again.
+        """
+
+
+    def commit():
+        """
+        Perform this transaction.
+
+        @raise AlreadyFinishedError: The transaction was already finished with
+            an 'abort' or 'commit' and cannot be committed again.
+        """

Modified: CalendarServer/trunk/txdav/propertystore/base.py
===================================================================
--- CalendarServer/trunk/txdav/propertystore/base.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txdav/propertystore/base.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -23,13 +23,17 @@
     "PropertyName",
 ]
 
-from zope.interface import implements
-
 from twext.python.log import LoggingMixIn
+from twext.web2.dav import davxml
+from twext.web2.dav.resource import TwistedGETContentMD5,\
+    TwistedQuotaRootProperty
 
 from txdav.idav import IPropertyStore, IPropertyName
 
+from UserDict import DictMixin
 
+from zope.interface import implements
+
 class PropertyName(LoggingMixIn):
     """
     Property name.
@@ -45,13 +49,39 @@
 
         return PropertyName(sname[1:index], sname[index+1:])
 
+    @staticmethod
+    def fromElement(element):
+        return PropertyName(element.namespace, element.name)
+
     def __init__(self, namespace, name):
         self.namespace = namespace
         self.name = name
 
+
+    def _cmpval(self):
+        """
+        Return a value to use for hashing and comparisons.
+        """
+        return (self.namespace, self.name)
+
+
+    # FIXME: need direct tests for presence-in-dictionary
     def __hash__(self):
-        return hash((self.namespace, self.name))
+        return hash(self._cmpval())
 
+
+    def __eq__(self, other):
+        if not isinstance(other, PropertyName):
+            return NotImplemented
+        return self._cmpval() == other._cmpval()
+
+
+    def __ne__(self, other):
+        if not isinstance(other, PropertyName):
+            return NotImplemented
+        return self._cmpval() != other._cmpval()
+
+
     def __repr__(self):
         return "<%s: %s>" % (
             self.__class__.__name__,
@@ -62,114 +92,118 @@
         return "{%s}%s" % (self.namespace, self.name)
 
 
-class AbstractPropertyStore(LoggingMixIn):
+class AbstractPropertyStore(LoggingMixIn, DictMixin):
     """
     Base property store.
     """
     implements(IPropertyStore)
 
-    #
-    # Subclasses must override these
-    #
+    _defaultShadowableKeys = set()
+    _defaultGlobalKeys = set((
+        PropertyName.fromElement(davxml.ACL),
+        PropertyName.fromElement(davxml.ResourceID),
+        PropertyName.fromElement(davxml.ResourceType),
+        PropertyName.fromElement(davxml.GETContentType),
+        PropertyName.fromElement(TwistedGETContentMD5),
+        PropertyName.fromElement(TwistedQuotaRootProperty),
+    ))
 
-    def __delitem__(self, key):
-        raise NotImplementedError()
+    def __init__(self, peruser, defaultuser):
+        """
+        Instantiate the property store for a user. The default is the default user
+        (owner) property to read in the case of global or shadowable properties.
 
-    def __getitem__(self, key):
-        raise NotImplementedError()
+        @param peruser: the user uid
+        @type peruser: C{str}
 
-    def __contains__(self, key):
-        raise NotImplementedError()
+        @param defaultuser: the default user uid
+        @type defaultuser: C{str}
+        """
+        
+        self._peruser = peruser
+        self._defaultuser = defaultuser
+        self._shadowableKeys = set(AbstractPropertyStore._defaultShadowableKeys)
+        self._globalKeys = set(AbstractPropertyStore._defaultGlobalKeys)
 
-    def __setitem__(key, value):
-        raise NotImplementedError()
+    def setPerUserUID(self, uid):
+        self._peruser = uid
 
-    def __iter__(self):
+    def setSpecialProperties(self, shadowableKeys, globalKeys):
+        self._shadowableKeys.update(shadowableKeys)
+        self._globalKeys.update(globalKeys)
+
+    #
+    # Subclasses must override these
+    #
+
+    def _getitem_uid(self, key, uid):
         raise NotImplementedError()
 
-    def __len__(self):
+    def _setitem_uid(self, key, value, uid):
         raise NotImplementedError()
 
-    def flush(self):
+    def _delitem_uid(self, key, uid):
         raise NotImplementedError()
 
-    def abort(self):
+    def _keys_uid(self, uid):
         raise NotImplementedError()
-
+        
     #
-    # Subclasses may override these
+    # Required UserDict implementations
     #
 
-    def len(self, key):
-        return self.__len__(key)
+    def __getitem__(self, key):
+        # Handle per-user behavior 
+        if self.isShadowableProperty(key):
+            try:
+                result = self._getitem_uid(key, self._peruser)
+            except KeyError:
+                result = self._getitem_uid(key, self._defaultuser)
+            return result
+        elif self.isGlobalProperty(key):
+            return self._getitem_uid(key, self._defaultuser)
+        else:
+            return self._getitem_uid(key, self._peruser)
 
-    def clear(self):
-        for key in self.__iter__():
-            self.__delitem__(key)
+    def __setitem__(self, key, value):
+        # Handle per-user behavior 
+        if self.isGlobalProperty(key):
+            return self._setitem_uid(key, value, self._defaultuser)
+        else:
+            return self._setitem_uid(key, value, self._peruser)
 
-    def get(self, key, default=None):
-        if self.__contains__(key):
-            return self.__getitem__(key)
+    def __delitem__(self, key):
+        # Handle per-user behavior 
+        if self.isGlobalProperty(key):
+            self._delitem_uid(key, self._defaultuser)
         else:
-            return default
+            self._delitem_uid(key, self._peruser)
 
-    def iter(self):
-        return self.__iter__()
-
-    def iteritems(self):
-        return (
-            (key, self.get(key))
-            for key in self.__iter__()
-        )
-
-    def items(self):
-        return list(self.iteritems())
-
-    iterkeys = iter
-    __iterkeys__ = iter
-
     def keys(self):
-        return tuple(self.__iter__())
+        
+        userkeys = self._keys_uid(self._peruser)
+        if self._defaultuser != self._peruser:
+            defaultkeys = self._keys_uid(self._defaultuser)
+            for key in defaultkeys:
+                if self.isShadowableProperty(key) and key not in userkeys:
+                    userkeys.append(key)
+        return tuple(userkeys)
 
-    def itervalues(self):
-        return (
-            self.get(key)
-            for key in self.__iter__()
-        )
+    def update(self, other):
+        # FIXME: direct tests.
+        # FIXME: support positional signature (although since strings aren't
+        # valid, it should just raise an error.
+        for key in other:
+            self[key] = other[key]
 
-    def values(self):
-        return list(self.itervalues())
 
-    def pop(self, key, default=None):
-        try:
-            value = self.__getitem__(key)
-        except KeyError:
-            if default is None:
-                raise
-            return default
+    # Per-user property handling
+    def isShadowableProperty(self, key):
+        return key in self._shadowableKeys
+    
+    def isGlobalProperty(self, key):
+        return key in self._globalKeys
 
-        self.__delitem__(key)
-
-        return value
-
-    def popitem(self):
-        for key in self.__iter__():
-            self.__delitem__(key)
-            break
-
-    def setdefault(self, key, default=None):
-        if self.__contains__(key):
-            return key
-
-        self.__setitem__(key, default)
-
-        return default
-
-    def update(other=None):
-        # FIXME
-        raise NotImplementedError()
-
-
 # FIXME: Actually, we should replace this with calls to IPropertyName()
 def validKey(key):
     # Used by implementations to verify that keys are valid

Modified: CalendarServer/trunk/txdav/propertystore/none.py
===================================================================
--- CalendarServer/trunk/txdav/propertystore/none.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txdav/propertystore/none.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -18,72 +18,99 @@
 Property store with no storage.
 """
 
-from __future__ import absolute_import
-
 __all__ = [
     "PropertyStore",
 ]
 
 from txdav.propertystore.base import AbstractPropertyStore, validKey
-from txdav.idav import PropertyChangeNotAllowedError
 
-
 class PropertyStore(AbstractPropertyStore):
     """
     Property store with no storage.
     """
-    def __init__(self):
+    
+    properties = {}
+
+    def __init__(self, peruser, defaultuser):
+        super(PropertyStore, self).__init__(peruser, defaultuser)
+
         self.modified = {}
+        self.removed = set()
 
     def __str__(self):
         return "<%s>" % (self.__class__.__name__,)
 
     #
-    # Accessors
+    # Required implementations
     #
 
-    def __delitem__(self, key):
+    def _getitem_uid(self, key, uid):
         validKey(key)
+        effectiveKey = (key, uid)
 
-        if key in self.modified:
-            del self.modified[key]
-        else:
+        if effectiveKey in self.modified:
+            return self.modified[effectiveKey]
+
+        if effectiveKey in self.removed:
             raise KeyError(key)
 
-    def __getitem__(self, key):
+        return self.properties[effectiveKey]
+
+    def _setitem_uid(self, key, value, uid):
         validKey(key)
+        effectiveKey = (key, uid)
 
-        if key in self.modified:
-            return self.modified[key]
-        else:
-            raise KeyError(key)
+        if effectiveKey in self.removed:
+            self.removed.remove(effectiveKey)
+        self.modified[effectiveKey] = value
 
-    def __contains__(self, key):
+    def _delitem_uid(self, key, uid):
         validKey(key)
+        effectiveKey = (key, uid)
 
-        return key in self.modified
+        if effectiveKey in self.modified:
+            del self.modified[effectiveKey]
+        elif effectiveKey not in self.properties:
+            raise KeyError(key)
 
-    def __setitem__(self, key, value):
-        validKey(key)
+        self.removed.add(effectiveKey)
 
-        self.modified[key] = value
+    def _keys_uid(self, uid):
+        seen = set()
 
-    def __iter__(self):
-        return (k for k in self.modified)
+        for effectivekey in self.properties:
+            if effectivekey[1] == uid and effectivekey not in self.removed:
+                seen.add(effectivekey)
+                yield effectivekey[0]
 
-    def __len__(self):
-        return len(self.modified)
+        for effectivekey in self.modified:
+            if effectivekey[1] == uid and effectivekey not in seen:
+                yield effectivekey[0]
 
     #
     # I/O
     #
 
     def flush(self):
-        if self.modified:
-            raise PropertyChangeNotAllowedError(
-                "None property store cannot flush changes.",
-                keys = self.modified.keys()
-            )
+        props    = self.properties
+        removed  = self.removed
+        modified = self.modified
 
+        for effectivekey in removed:
+            assert effectivekey not in modified
+            try:
+                del props[effectivekey]
+            except KeyError:
+                pass
+
+        for effectivekey in modified:
+            assert effectivekey not in removed
+            value = modified[effectivekey]
+            props[effectivekey] = value
+        
+        self.removed.clear()
+        self.modified.clear()        
+
     def abort(self):
+        self.removed.clear()
         self.modified.clear()

Modified: CalendarServer/trunk/txdav/propertystore/test/base.py
===================================================================
--- CalendarServer/trunk/txdav/propertystore/test/base.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txdav/propertystore/test/base.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -65,6 +65,117 @@
         self.assertEquals(store.get(name, None), None)
         self.failIf(name in store)
 
+    def test_peruser(self):
+        store1 = self.propertyStore1
+        store2 = self.propertyStore2
+
+        name = propertyName("test")
+        value1 = propertyValue("Hello, World1!")
+        value2 = propertyValue("Hello, World2!")
+
+        store1[name] = value1
+        store1.flush()
+        self.assertEquals(store1.get(name, None), value1)
+        self.assertEquals(store2.get(name, None), None)
+        self.failUnless(name in store1)
+        self.failIf(name in store2)
+        
+        store2[name] = value2
+        store2.flush()
+        self.assertEquals(store1.get(name, None), value1)
+        self.assertEquals(store2.get(name, None), value2)
+        self.failUnless(name in store1)
+        self.failUnless(name in store2)
+        
+        del store2[name]
+        store2.flush()
+        self.assertEquals(store1.get(name, None), value1)
+        self.assertEquals(store2.get(name, None), None)
+        self.failUnless(name in store1)
+        self.failIf(name in store2)
+        
+        del store1[name]
+        store1.flush()
+        self.assertEquals(store1.get(name, None), None)
+        self.assertEquals(store2.get(name, None), None)
+        self.failIf(name in store1)
+        self.failIf(name in store2)
+        
+    def test_peruser_shadow(self):
+        store1 = self.propertyStore1
+        store2 = self.propertyStore2
+
+        name = propertyName("shadow")
+
+        store1.setSpecialProperties((name,), ())
+        store2.setSpecialProperties((name,), ())
+
+        value1 = propertyValue("Hello, World1!")
+        value2 = propertyValue("Hello, World2!")
+
+        store1[name] = value1
+        store1.flush()
+        self.assertEquals(store1.get(name, None), value1)
+        self.assertEquals(store2.get(name, None), value1)
+        self.failUnless(name in store1)
+        self.failUnless(name in store2)
+        
+        store2[name] = value2
+        store2.flush()
+        self.assertEquals(store1.get(name, None), value1)
+        self.assertEquals(store2.get(name, None), value2)
+        self.failUnless(name in store1)
+        self.failUnless(name in store2)
+        
+        del store2[name]
+        store2.flush()
+        self.assertEquals(store1.get(name, None), value1)
+        self.assertEquals(store2.get(name, None), value1)
+        self.failUnless(name in store1)
+        self.failUnless(name in store2)
+        
+        del store1[name]
+        store1.flush()
+        self.assertEquals(store1.get(name, None), None)
+        self.assertEquals(store2.get(name, None), None)
+        self.failIf(name in store1)
+        self.failIf(name in store2)
+        
+
+    def test_peruser_global(self):
+        store1 = self.propertyStore1
+        store2 = self.propertyStore2
+
+        name = propertyName("global")
+
+        store1.setSpecialProperties((), (name,))
+        store2.setSpecialProperties((), (name,))
+
+        value1 = propertyValue("Hello, World1!")
+        value2 = propertyValue("Hello, World2!")
+
+        store1[name] = value1
+        store1.flush()
+        self.assertEquals(store1.get(name, None), value1)
+        self.assertEquals(store2.get(name, None), value1)
+        self.failUnless(name in store1)
+        self.failUnless(name in store2)
+        
+        store2[name] = value2
+        store2.flush()
+        self.assertEquals(store1.get(name, None), value2)
+        self.assertEquals(store2.get(name, None), value2)
+        self.failUnless(name in store1)
+        self.failUnless(name in store2)
+        
+        del store2[name]
+        store2.flush()
+        self.assertEquals(store1.get(name, None), None)
+        self.assertEquals(store2.get(name, None), None)
+        self.failIf(name in store1)
+        self.failIf(name in store2)
+        
+
     def test_iteration(self):
         store = self.propertyStore
 

Modified: CalendarServer/trunk/txdav/propertystore/test/test_none.py
===================================================================
--- CalendarServer/trunk/txdav/propertystore/test/test_none.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txdav/propertystore/test/test_none.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -18,40 +18,17 @@
 Property store tests.
 """
 
-from txdav.idav import PropertyChangeNotAllowedError
 from txdav.propertystore.none import PropertyStore
-from txdav.propertystore.test.base import propertyName, propertyValue
 
 from txdav.propertystore.test import base
 
-
 class PropertyStoreTest(base.PropertyStoreTest):
     def setUp(self):
-        self.propertyStore = PropertyStore()
+        self.propertyStore = self.propertyStore1 = PropertyStore("user01", "user01")
+        self.propertyStore2 = PropertyStore("user02", "user01")
 
-    def test_flush(self):
-        store = self.propertyStore
-
-        # Flushing no changes is ok
-        store.flush()
-
-        name = propertyName("test")
-        value = propertyValue("Hello, World!")
-
-        store[name] = value
-
-        # Flushing changes isn't allowed
-        self.assertRaises(PropertyChangeNotAllowedError, store.flush)
-
-        # Changes are still here
-        self.assertEquals(store.get(name, None), value)
-
-        # Flushing no changes is ok
-        del store[name]
-        store.flush()
-
-        self.assertEquals(store.get(name, None), None)
-
     def test_abort(self):
         super(PropertyStoreTest, self).test_abort()
-        self.assertEquals(self.propertyStore.modified, {})
+        store = self.propertyStore
+        self.assertEquals(store.removed, set())
+        self.assertEquals(store.modified, {})

Modified: CalendarServer/trunk/txdav/propertystore/test/test_xattr.py
===================================================================
--- CalendarServer/trunk/txdav/propertystore/test/test_xattr.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txdav/propertystore/test/test_xattr.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -13,15 +13,15 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
+from twext.web2.dav.element.base import WebDAVTextElement
 
 """
 Property store tests.
 """
 
-from twext.python.filepath import FilePath
+from twext.python.filepath import CachingFilePath as FilePath
 
 from txdav.propertystore.base import PropertyName
-from txdav.propertystore.test.base import propertyName
 
 from txdav.propertystore.test import base
 
@@ -39,7 +39,8 @@
         tempDir.makedirs()
         tempFile = tempDir.child("test")
         tempFile.touch()
-        self.propertyStore = PropertyStore(tempFile)
+        self.propertyStore = self.propertyStore1 = PropertyStore("user01", "user01", lambda : tempFile)
+        self.propertyStore2 = PropertyStore("user02", "user01", lambda : tempFile)
 
     def test_init(self):
         store = self.propertyStore
@@ -53,7 +54,34 @@
         self.assertEquals(store.removed, set())
         self.assertEquals(store.modified, {})
 
+    def test_compress(self):
 
+        class DummyProperty (WebDAVTextElement):
+            namespace = "http://calendarserver.org/ns/"
+            name = "dummy"
+
+        name = PropertyName.fromElement(DummyProperty)
+        compressedKey = self.propertyStore._encodeKey((name, self.propertyStore._defaultuser))
+        uncompressedKey = self.propertyStore._encodeKey((name, self.propertyStore._defaultuser), compressNamespace=False)
+
+        self.propertyStore[name] = DummyProperty.fromString("data")
+        self.propertyStore.flush()
+        self.assertEqual(self.propertyStore[name], DummyProperty.fromString("data"))
+        self.assertTrue(compressedKey in self.propertyStore.attrs)
+        self.assertFalse(uncompressedKey in self.propertyStore.attrs)
+
+    def test_compress_upgrade(self):
+
+        class DummyProperty (WebDAVTextElement):
+            namespace = "http://calendarserver.org/ns/"
+            name = "dummy"
+
+        name = PropertyName.fromElement(DummyProperty)
+        uncompressedKey = self.propertyStore._encodeKey((name, self.propertyStore._defaultuser), compressNamespace=False)
+        self.propertyStore.attrs[uncompressedKey] = DummyProperty.fromString("data").toxml()
+        self.assertEqual(self.propertyStore[name], DummyProperty.fromString("data"))
+        self.assertRaises(KeyError, lambda:self.propertyStore.attrs[uncompressedKey])
+
 if PropertyStore is None:
     PropertyStoreTest.skip = importErrorMessage
 

Modified: CalendarServer/trunk/txdav/propertystore/xattr.py
===================================================================
--- CalendarServer/trunk/txdav/propertystore/xattr.py	2010-07-20 00:45:43 UTC (rev 5919)
+++ CalendarServer/trunk/txdav/propertystore/xattr.py	2010-07-20 01:28:10 UTC (rev 5920)
@@ -1,3 +1,4 @@
+# -*- test-case-name: txdav.propertystore.test.test_xattr,txcaldav.calendarstore,txcarddav.addressbookstore -*-
 ##
 # Copyright (c) 2010 Apple Inc. All rights reserved.
 #
@@ -68,59 +69,117 @@
 
     # Linux seems to require that attribute names use a "user." prefix.
     if sys.platform == "linux2":
-        deadPropertyXattrPrefix = "user.%s" % (deadPropertyXattrPrefix,)
+        deadPropertyXattrPrefix = "user."
 
-    @classmethod
-    def _encodeKey(cls, name):
-        result = urllib.quote(name.toString(), safe="{}:")
-        r = cls.deadPropertyXattrPrefix + result
-        return r
+    # There is a 127 character limit for xattr keys so we need to compress/expand
+    # overly long namespaces to help stay under that limit now that GUIDs are also
+    # encoded in the keys.
+    _namespaceCompress = {
+        "urn:ietf:params:xml:ns:caldav"                       :"CALDAV:",
+        "urn:ietf:params:xml:ns:carddav"                      :"CARDDAV:",
+        "http://calendarserver.org/ns/"                       :"CS:",
+        "http://cal.me.com/_namespace/"                       :"ME:",
+        "http://twistedmatrix.com/xml_namespace/dav/"         :"TD:",
+        "http://twistedmatrix.com/xml_namespace/dav/private/" :"TDP:",
+    }
+    _namespaceExpand = dict([ (v, k) for k, v in _namespaceCompress.iteritems() ])
 
-    @classmethod
-    def _decodeKey(cls, name):
-        return PropertyName.fromString(
-            urllib.unquote(name[len(cls.deadPropertyXattrPrefix):])
-        )
+    def __init__(self, peruser, defaultuser, pathFactory):
+        """
+        Initialize a L{PropertyStore}.
 
-    def __init__(self, path):
-        self.path = path
-        self.attrs = xattr(path.path)
+        @param pathFactory: a 0-arg callable that returns the L{CachingFilePath} to set extended attributes on.
+        """
+        super(PropertyStore, self).__init__(peruser, defaultuser)
+
+        self._pathFactory = pathFactory
+        # self.attrs = xattr(path.path)
         self.removed = set()
         self.modified = {}
 
+
+    @property
+    def path(self):
+        return self._pathFactory()
+
+    @property
+    def attrs(self):
+        return xattr(self.path.path)
+
     def __str__(self):
         return "<%s %s>" % (self.__class__.__name__, self.path.path)
 
-    #
-    # Accessors
-    #
+    def _encodeKey(self, effective, compressNamespace=True):
 
-    def __delitem__(self, key):
-        validKey(key)
+        qname, uid = effective
+        namespace = self._namespaceCompress.get(qname.namespace, qname.namespace) if compressNamespace else qname.namespace
+        result = urllib.quote("{%s}%s" % (namespace, qname.name), safe="{}:")
+        if uid:
+            result = uid + result
+        r = self.deadPropertyXattrPrefix + result
+        return r
 
-        if key in self.modified:
-            del self.modified[key]
-        elif self._encodeKey(key) not in self.attrs:
-            raise KeyError(key)
+    def _decodeKey(self, name):
 
-        self.removed.add(key)
+        name = urllib.unquote(name[len(self.deadPropertyXattrPrefix):])
 
-    def __getitem__(self, key):
+        index1 = name.find("{")
+        index2 = name.find("}")
+
+        if (index1 is - 1 or index2 is - 1 or not len(name) > index2):
+            raise ValueError("Invalid encoded name: %r" % (name,))
+        if index1 == 0:
+            uid = None
+        else:
+            uid = name[:index1]
+        propnamespace = name[index1 + 1:index2]
+        propnamespace = self._namespaceExpand.get(propnamespace, propnamespace)
+        propname = name[index2 + 1:]
+
+        return PropertyName(propnamespace, propname), uid
+
+    #
+    # Required implementations
+    #
+
+    def _getitem_uid(self, key, uid):
         validKey(key)
+        effectiveKey = (key, uid)
 
-        if key in self.modified:
-            return self.modified[key]
+        if effectiveKey in self.modified:
+            return self.modified[effectiveKey]
 
-        if key in self.removed:
+        if effectiveKey in self.removed:
             raise KeyError(key)
 
         try:
-            data = self.attrs[self._encodeKey(key)]
-        except IOError, e:
-            if e.errno in _ERRNO_NO_ATTR:
-                raise KeyError(key)
-            raise PropertyStoreError(e)
+            try:
+                data = self.attrs[self._encodeKey(effectiveKey)]
+            except IOError, e:
+                if e.errno in [_ERRNO_NO_ATTR, errno.ENOENT]:
+                    raise KeyError(key)
+                raise PropertyStoreError(e)
+        except KeyError:
+            # Check for uncompressed namespace
+            if  effectiveKey[0].namespace in self._namespaceCompress:
+                try:
+                    data = self.attrs[self._encodeKey(effectiveKey, compressNamespace=False)]
+                except IOError, e:
+                    raise KeyError(key)
 
+                try:
+                    # Write it back using the compressed format
+                    self.attrs[self._encodeKey(effectiveKey)] = data
+                    del self.attrs[self._encodeKey(effectiveKey, compressNamespace=False)]
+                except IOError, e:
+                    msg = "Unable to upgrade property to compressed namespace: %s" % (
+                        key.toString()
+                    )
+                    self.log_error(msg)
+                    raise PropertyStoreError(msg)
+            else:
+                raise
+
         #
         # Unserialize XML data from an xattr.  The storage format has changed
         # over time:
@@ -155,64 +214,87 @@
                 legacy = True
 
         if legacy:
-            self.set(doc.root_element)
+            # XXX untested: CDT catches this though.
+            self._setitem_uid(key, doc.root_element, uid)
 
         return doc.root_element
 
-    def __contains__(self, key):
+    def _setitem_uid(self, key, value, uid):
         validKey(key)
+        effectiveKey = (key, uid)
 
-        if key in self.modified:
-            return True
-        if key in self.removed:
-            return False
-        return self._encodeKey(key) in self.attrs
+        if effectiveKey in self.removed:
+            self.removed.remove(effectiveKey)
+        self.modified[effectiveKey] = value
 
-    def __setitem__(self, key, value):
+    def _delitem_uid(self, key, uid):
         validKey(key)
+        effectiveKey = (key, uid)
 
-        if key in self.removed:
-            self.removed.remove(key)
-        self.modified[key] = value
+        if effectiveKey in self.modified:
+            del self.modified[effectiveKey]
+        elif self._encodeKey(effectiveKey) not in self.attrs:
+            raise KeyError(key)
 
-    def __iter__(self):
+        self.removed.add(effectiveKey)
+
+    def _keys_uid(self, uid):
         seen = set()
 
-        for key in self.attrs:
-            key = self._decodeKey(key)
-            if key not in self.removed:
-                seen.add(key)
-                yield key
+        try:
+            iterattr = iter(self.attrs)
+        except IOError, e:
+            if e.errno != errno.ENOENT:
+                raise
+            iterattr = iter(())
 
-        for key in self.modified:
-            if key not in seen:
-                yield key
+        for key in iterattr:
+            effectivekey = self._decodeKey(key)
+            if effectivekey[1] == uid and effectivekey not in self.removed:
+                seen.add(effectivekey)
+                yield effectivekey[0]
 
-    def __len__(self):
-        keys = (
-            set(self.attrs.keys()) |
-            set(self._encodeKey(key) for key in self.modified)
-        )
-        return len(keys)
+        for effectivekey in self.modified:
+            if effectivekey[1] == uid and effectivekey not in seen:
+                yield effectivekey[0]
 
     #
     # I/O
     #
 
     def flush(self):
-        attrs    = self.attrs
-        removed  = self.removed
+        # FIXME: The transaction may have deleted the file, and then obviously
+        # flushing would fail.  Let's try to detect that scenario.  The
+        # transaction should not attempt to flush properties if it is also
+        # deleting the resource, though, and there are other reasons we might
+        # want to know about that the file doesn't exist, so this should be
+        # fixed.
+        self.path.changed()
+        if not self.path.exists():
+            return
+
+        attrs = self.attrs
+        removed = self.removed
         modified = self.modified
 
         for key in removed:
             assert key not in modified
-            del attrs[self._encodeKey(key)]
+            try:
+                del attrs[self._encodeKey(key)]
+            except KeyError:
+                pass
+            except IOError, e:
+                if e.errno != _ERRNO_NO_ATTR:
+                    raise
 
         for key in modified:
             assert key not in removed
             value = modified[key]
             attrs[self._encodeKey(key)] = compress(value.toxml())
 
+        self.removed.clear()
+        self.modified.clear()
+
     def abort(self):
         self.removed.clear()
         self.modified.clear()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100719/a3b336dd/attachment-0001.html>


More information about the calendarserver-changes mailing list